--- Net2/arch/hp300/dev/dcm.c 2018/04/24 18:04:00 1.1.1.1 +++ Net2/arch/hp300/dev/dcm.c 2018/04/24 18:19:07 1.1.1.2 @@ -37,7 +37,8 @@ * * from: $Hdr: dcm.c 1.26 91/01/21$ * - * @(#)dcm.c 7.14 (Berkeley) 6/27/91 + * from: @(#)dcm.c 7.14 (Berkeley) 6/27/91 + * dcm.c,v 1.7 1993/07/12 11:38:07 mycroft Exp */ /* @@ -81,7 +82,7 @@ struct driver dcmdriver = { #define NDCMLINE (NDCM*4) -struct tty dcm_tty[NDCMLINE]; +struct tty *dcm_tty[NDCMLINE]; struct modemreg *dcm_modem[NDCMLINE]; char mcndlast[NDCMLINE]; /* XXX last modem status for line */ int ndcm = NDCMLINE; @@ -351,7 +352,10 @@ dcmopen(dev, flag, mode, p) brd = BOARD(unit); if (unit >= NDCMLINE || (dcm_active & (1 << brd)) == 0) return (ENXIO); - tp = &dcm_tty[unit]; + if(!dcm_tty[unit]) + tp = dcm_tty[unit] = ttymalloc(); + else + tp = dcm_tty[unit]; tp->t_oproc = dcmstart; tp->t_param = dcmparam; tp->t_dev = dev; @@ -411,7 +415,7 @@ dcmclose(dev, flag, mode, p) int unit; unit = UNIT(dev); - tp = &dcm_tty[unit]; + tp = dcm_tty[unit]; (*linesw[tp->t_line].l_close)(tp, flag); if (tp->t_cflag&HUPCL || tp->t_state&TS_WOPEN || (tp->t_state&TS_ISOPEN) == 0) @@ -422,6 +426,8 @@ dcmclose(dev, flag, mode, p) unit, tp->t_state, tp->t_flags); #endif ttyclose(tp); + ttyfree(tp); + dcm_tty[unit] = (struct tty *)NULL; return (0); } @@ -431,7 +437,7 @@ dcmread(dev, uio, flag) { register struct tty *tp; - tp = &dcm_tty[UNIT(dev)]; + tp = dcm_tty[UNIT(dev)]; return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); } @@ -442,7 +448,7 @@ dcmwrite(dev, uio, flag) int unit = UNIT(dev); register struct tty *tp; - tp = &dcm_tty[unit]; + tp = dcm_tty[unit]; /* * XXX we disallow virtual consoles if the physical console is * a serial port. This is in case there is a display attached that @@ -565,7 +571,7 @@ dcmpint(unit, code, dcm) int unit, code; struct dcmdevice *dcm; { - struct tty *tp = &dcm_tty[unit]; + struct tty *tp = dcm_tty[unit]; if (code & IT_SPEC) dcmreadbuf(unit, dcm, tp); @@ -581,7 +587,7 @@ dcmrint(brd, dcm) register struct tty *tp; unit = MKUNIT(brd, 0); - tp = &dcm_tty[unit]; + tp = dcm_tty[unit]; for (i = 0; i < 4; i++, tp++, unit++) dcmreadbuf(unit, dcm, tp); } @@ -695,7 +701,7 @@ dcmmint(unit, mcnd, dcm) printf("dcmmint: port %d mcnd %x mcndlast %x\n", unit, mcnd, mcndlast[unit]); #endif - tp = &dcm_tty[unit]; + tp = dcm_tty[unit]; delta = mcnd ^ mcndlast[unit]; mcndlast[unit] = mcnd; if ((delta & MI_CTS) && (tp->t_state & TS_ISOPEN) && @@ -736,7 +742,7 @@ dcmioctl(dev, cmd, data, flag) printf("dcmioctl: unit %d cmd %x data %x flag %x\n", unit, cmd, *data, flag); #endif - tp = &dcm_tty[unit]; + tp = dcm_tty[unit]; error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag); if (error >= 0) return (error); @@ -904,11 +910,7 @@ dcmstart(tp) tp->t_state &= ~TS_ASLEEP; wakeup((caddr_t)&tp->t_outq); } - if (tp->t_wsel) { - selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); - tp->t_wsel = 0; - tp->t_state &= ~TS_WCOLL; - } + selwakeup(&tp->t_wsel); } if (tp->t_outq.c_cc == 0) { #ifdef IOSTATS @@ -1103,7 +1105,7 @@ dcmsetischeme(brd, flags) * chars for any port on the board. */ if (!perchar) { - register struct tty *tp = &dcm_tty[MKUNIT(brd, 0)]; + register struct tty *tp = dcm_tty[MKUNIT(brd, 0)]; int c; for (i = 0; i < 4; i++, tp++) { @@ -1163,7 +1165,6 @@ dcmcnprobe(cp) /* initialize required fields */ cp->cn_dev = makedev(dcmmajor, unit); - cp->cn_tp = &dcm_tty[unit]; switch (dcm_addr[BOARD(unit)]->dcm_rsid) { case DCMID: cp->cn_pri = CN_NORMAL;