[comp.os.minix] ST fix rs232 in kernel with rs232

hcj@lzaz.ATT.COM (HC Johnson) (03/13/89)

Here are fixes for rs232 in my recently posted kernel with rs232.
I think these will address these problems:

1. typing cu a second time screws up.  Crash, panic, or worse.
	this is due to rs232init() when it should be rs232init(tp);
2. bad things happen if cat file > /dev/tty1
	There is a problem in trying to do initial open and final close.
	A. I have reworked the strategy.
	B. The default mode for rs232 was ECHO.  sending a char to an echoing
		device, (hayse modem), causes oscillation.  I have removed 
		ECHO.  It shouldn't hurt login, as it sets echo.
3. If you want to log in thru rs232, at  a speed other than 2400 baud you need
	to add a line to set the speed in login.c.  This will be posted later.
4. I also changed the length of BREAK to conform with the UNIX(r) manual.


Howard C. Johnson
ATT Bell Labs
att!lzaz!hcj
hcj@lzaz.att.com

=======================cut here cdiff follows========================
*** ../../xminix/kernel/rstty.c	Thu Feb 22 09:46:00 1989
--- rstty.c	Thu Mar 12 18:10:07 1989
***************
*** 81,86 ****
--- 81,87 ----
  #define DBG(x) printf(x);
  
  extern int dbg_flag;
+ extern int rs232_o_flag;
  
  /*===========================================================================*
   *				rs232_task				     *
***************
*** 98,103 ****
--- 99,107 ----
  	receive(ANY, &rstty_mess);
  /* we would rather be general here, but not enough info is avail USE 0 */
  	tp = &rstty_struct[0];
+ 	if(rs232_o_flag ==0 && rstty_mess.m_type != RS232_CLOSE)
+ 		rs232init(tp);
+ 		
  if(dbg_flag)
  printf("rstty:m_type=%d,incount=%d blocked=%d wempty=%d\n\r",
   rstty_mess.m_type, tp->tty_incount , Rs_blocked, Rs232_wempty);
***************
*** 148,153 ****
--- 152,158 ----
  message *m_ptr;			/* message containing pointer to char(s) */
  {
  	int minor;
+ 	(*tp->tty_open)(tp, m_ptr);
  	return; /* we do not know how to handle this and set pgrp also */
  }
  
*** ../../xminix/kernel/rs232.c	Thu Mar 12 10:19:32 1989
--- rs232.c	Thu Mar 12 18:46:50 1989
***************
*** 20,26 ****
  
  #define lbolt (realtime + lost_ticks)
  #define RS232_DRAIN (1*HZ)	/* time in ticks to drain */
! #define RS232_BREAK 5		/* ticks */
  PUBLIC int dbg_flag = 0;
  PRIVATE message	commes;		/* message used for console input chars */
  
--- 20,26 ----
  
  #define lbolt (realtime + lost_ticks)
  #define RS232_DRAIN (1*HZ)	/* time in ticks to drain */
! #define RS232_BREAK 12		/* ticks */
  PUBLIC int dbg_flag = 0;
  PRIVATE message	commes;		/* message used for console input chars */
  
***************
*** 31,37 ****
  #define COM_IN_SIZE 512
  PRIVATE  char	com_in_buffer[COM_IN_SIZE];
  
! PRIVATE int rs232_o_flag = 0;
  PRIVATE int Xmit_on = 0;
  
  extern struct tty_struct rstty_struct[];
--- 31,37 ----
  #define COM_IN_SIZE 512
  PRIVATE  char	com_in_buffer[COM_IN_SIZE];
  
! PUBLIC int rs232_o_flag = 0;
  PRIVATE int Xmit_on = 0;
  
  extern struct tty_struct rstty_struct[];
***************
*** 233,239 ****
  	if(rs232_o_flag == 0) {
  		rs232_o_flag++;
  		r = lock();
! 		rs232init();
  		restore(r);
  	}
  	if (tp->tty_outleft == 0)
--- 233,239 ----
  	if(rs232_o_flag == 0) {
  		rs232_o_flag++;
  		r = lock();
! 		rs232init(tp);
  		restore(r);
  	}
  	if (tp->tty_outleft == 0)
***************
*** 266,271 ****
--- 266,274 ----
  PUBLIC siaint(which)
  int which;	/* 0=rrdy, 1=rerr, 2=trdy, 3=terr */
  {
+ if( dbg_flag != 0) {
+   printf("SIAINT(%d)\n",which);
+ }
  	switch(which) {
  		case 1:	/* rerr */
  			printf("sia_rerr\n\r");
***************
*** 349,355 ****
  	MFP->mf_tsr = 0;
  		tp->tty_inhead = tp->tty_inqueue;
  		tp->tty_intail = tp->tty_inqueue;
! 		tp->tty_mode = CRMOD | XTABS | ECHO ;
  		tp->tty_erase = ERASE_CHAR;
  		tp->tty_kill  = KILL_CHAR;
  		tp->tty_intr  = INTR_CHAR;
--- 352,358 ----
  	MFP->mf_tsr = 0;
  		tp->tty_inhead = tp->tty_inqueue;
  		tp->tty_intail = tp->tty_inqueue;
! 		tp->tty_mode = CRMOD | XTABS /* | ECHO */;
  		tp->tty_erase = ERASE_CHAR;
  		tp->tty_kill  = KILL_CHAR;
  		tp->tty_intr  = INTR_CHAR;
***************
*** 407,412 ****
--- 410,418 ----
  	int clock;
  	int clocka;
  
+ if( dbg_flag != 0) {
+   printf("SET_TIMER(%d)\n",index);
+ }
  	clock = MFP->mf_tcdcr & 0x70;
  	for(;;) {
  		clocka = MFP->mf_tcdcr & 0x70;