Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 2/6/85; site rocksvax.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!princeton!rocksvax!z From: z@rocksvax.UUCP (Jim Ziobro) Newsgroups: net.bugs.4bsd Subject: dh/dm hangup problem Message-ID: <1642@rocksvax.UUCP> Date: Wed, 4-Dec-85 23:00:19 EST Article-I.D.: rocksvax.1642 Posted: Wed Dec 4 23:00:19 1985 Date-Received: Fri, 6-Dec-85 06:25:34 EST Organization: Xerox: Henrietta, NY Lines: 73 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