Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA5550 ; Fri, 01 Jan 93 01:48:50 EST
Path: sserve!manuel.anu.edu.au!munnari.oz.au!uunet!pipex!bnr.co.uk!uknet!mcsun!fuug!kiae!demos!newsserv
From: ache@astral.msk.su (Andrew A. Chernov, Black Mage)
Newsgroups: comp.unix.bsd
Subject: [386bsd] patch for cgd's multiport com driver, select() bug fix
Message-ID: <lFjp1EhiA0@astral.msk.su>
Date: 23 Dec 92 08:01:49 GMT
Sender: news-service@newcom.kiae.su
Reply-To: ache@astral.msk.su
Organization: Ha-oh-lahm Yetzirah
Lines: 115
I just found this bug, maybe, it present in standard com driver too...
I don't use it and can't check.
BUG DESCRIPTION:
select() call don't work at all.
WHY:
ttselect() kernel routine used for coms too, its code say:
register struct tty *tp = &cdevsw[major(dev)].d_ttys[minor(dev)];
but for cgd's multiport com driver it must be:
register struct tty *tp = &com_tty[UNIT(dev)];
FIX:
Simple, duplicate ttselect() code into comselect() code
with replacing above. Modify conf.c ttselect()-->comselect()
*** /sys/i386/isa/com.c.cgd.was Thu Dec 10 01:07:29 1992
--- /sys/i386/isa/com.c Wed Dec 23 10:11:01 1992
***************
*** 932,934 ****
--- 932,973 ----
return 0;
}
#endif
+
+ int
+ comselect(dev, rw, p)
+ dev_t dev;
+ int rw;
+ struct proc *p;
+ {
+ register struct tty *tp = &com_tty[UNIT(dev)];
+ int nread;
+ int s = spltty();
+
+ switch (rw) {
+
+ case FREAD:
+ nread = ttnread(tp);
+ if (nread > 0 ||
+ ((tp->t_cflag&CLOCAL) == 0 && (tp->t_state&TS_CARR_ON) == 0))
+ goto win;
+ if (tp->t_rsel && tp->t_rsel->p_wchan == (caddr_t)&selwait)
+ tp->t_state |= TS_RCOLL;
+ else
+ tp->t_rsel = p;
+ break;
+
+ case FWRITE:
+ if (RB_LEN(&tp->t_out) <= tp->t_lowat)
+ goto win;
+ if (tp->t_wsel && tp->t_wsel->p_wchan == (caddr_t)&selwait)
+ tp->t_state |= TS_WCOLL;
+ else
+ tp->t_wsel = p;
+ break;
+ }
+ splx(s);
+ return (0);
+ win:
+ splx(s);
+ return (1);
+ }
*** /sys/i386/i386/conf.c.cgd.was Mon Nov 23 08:00:07 1992
--- /sys/i386/i386/conf.c Wed Dec 23 10:13:12 1992
***************
*** 152,158 ****
#include "com.h"
#if NCOM > 0
! int comopen(),comclose(),comread(),comwrite(),comioctl();
#define comreset enxio
extern struct tty com_tty[];
#else
--- 152,158 ----
#include "com.h"
#if NCOM > 0
! int comopen(),comclose(),comread(),comwrite(),comioctl(),comselect();
#define comreset enxio
extern struct tty com_tty[];
#else
***************
*** 162,167 ****
--- 162,168 ----
#define comwrite enxio
#define comioctl enxio
#define comreset enxio
+ #define comselect enxio
#define com_tty NULL
#endif
***************
*** 220,226 ****
logselect, enodev, NULL },
{ comopen, comclose, comread, comwrite, /*8*/
comioctl, enodev, comreset, com_tty,
! ttselect, enodev, NULL },
{ Fdopen, fdclose, rawread, rawwrite, /*9*/
fdioctl, enodev, nullop, NULL,
seltrue, enodev, fdstrategy },
--- 221,227 ----
logselect, enodev, NULL },
{ comopen, comclose, comread, comwrite, /*8*/
comioctl, enodev, comreset, com_tty,
! comselect, enodev, NULL },
{ Fdopen, fdclose, rawread, rawwrite, /*9*/
fdioctl, enodev, nullop, NULL,
seltrue, enodev, fdstrategy },
--
In-This-Life: Andrew A. Chernov | "Hay mas dicha, mas contento
Internet: ache@astral.msk.su | "Que adorar una hermosura
Organization: The RELCOM Corp., | "Brujuleada entre los lejos
Moscow, Russia | "De lo imposible?!" (Calderon)