[net.bugs.4bsd] dh/dm hangup problem

z@rocksvax.UUCP (Jim Ziobro) (12/05/85)

Revisions: 4.2BSD and 4.3BSD (Beta)

Index: /sys/vaxuba/dh.c

Problem: dm handler fails to lock out interrupts.

Repeat by: Toggle the carrier on one of the multiplexors lines.  Then
	watch random login processes get hangup signals.  This problem
	was discovered on an Emulex CS-11 with 32 lines.

Fix: Add an spl5/splx to the dm interrupt handler.

This is a fix for 4.2:

*** dh.c.ucb	Fri Jul 29 10:33:35 1983
--- dh.c	Wed Dec  4 22:40:35 1985
***************
*** 699,704
  	register struct uba_device *ui;
  	register struct tty *tp;
  	register struct dmdevice *addr;
  
  	ui = dminfo[dm];
  	if (ui == 0)

--- 699,705 -----
  	register struct uba_device *ui;
  	register struct tty *tp;
  	register struct dmdevice *addr;
+ 	int s;
  
  	ui = dminfo[dm];
  	if (ui == 0)
***************
*** 703,708
  	ui = dminfo[dm];
  	if (ui == 0)
  		return;
  	addr = (struct dmdevice *)ui->ui_addr;
  	if (addr->dmcsr&DM_DONE) {
  		if (addr->dmcsr&DM_CF) {

--- 704,713 -----
  	ui = dminfo[dm];
  	if (ui == 0)
  		return;
+ 	/*
+ 	If you have two dm's the second may interrupt so block it.
+ 	*/
+ 	s = spl5();
  	addr = (struct dmdevice *)ui->ui_addr;
  	if (addr->dmcsr&DM_DONE) {
  		if (addr->dmcsr&DM_CF) {
***************
*** 731,735
  		}
  		addr->dmcsr = DM_IE|DM_SE;
  	}
  }
  #endif

--- 736,741 -----
  		}
  		addr->dmcsr = DM_IE|DM_SE;
  	}
+ splx(s);
  }
  #endif
-- 
//Z\\
James M. Ziobro
Ziobro.Henr@Xerox.ARPA
{rochester,amd,sunybcs,ihnp4}!rocksvax!z