diff options
author | jkh <jkh@FreeBSD.org> | 1995-10-04 21:51:26 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1995-10-04 21:51:26 +0000 |
commit | 1c1ef85e1307f05f0ae122e54088a9f8e7425ef7 (patch) | |
tree | 31e02cc79da6020e113e9a9762b9bc12f61eb678 | |
parent | 306caafb867695c44f1dfcaf62b175515cdbed20 (diff) | |
download | FreeBSD-src-1c1ef85e1307f05f0ae122e54088a9f8e7425ef7.zip FreeBSD-src-1c1ef85e1307f05f0ae122e54088a9f8e7425ef7.tar.gz |
I have applied my last changes correcting the bug in dgbselect() to it
and here is the patch. Submit it please. Thank you!
BTW, there is a new option "NDGBPORTS". By default it is equal to
NDGB*16 and means the number of ports of all Digiboards for which the
tty structures are reserved. It can be set to the real value in config-file
like:
options "NDGBPORTS=8"
Submitted by: Serge A. Babkin <babkin@hq.icb.chel.su>
-rw-r--r-- | sys/dev/dgb/dgb.c | 140 | ||||
-rw-r--r-- | sys/dev/dgb/dgreg.h | 8 | ||||
-rw-r--r-- | sys/gnu/i386/isa/dgb.c | 140 | ||||
-rw-r--r-- | sys/gnu/i386/isa/dgreg.h | 8 |
4 files changed, 92 insertions, 204 deletions
diff --git a/sys/dev/dgb/dgb.c b/sys/dev/dgb/dgb.c index 3d22735..e4ecfc0 100644 --- a/sys/dev/dgb/dgb.c +++ b/sys/dev/dgb/dgb.c @@ -1,7 +1,5 @@ /*- - * dgb.c $Id: dgb.c,v 1.1 1995/09/03 19:52:52 jkh Exp $ - * - * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su> + * dgb.c $Id: dgb.c,v 1.2 1995/09/04 01:58:41 jkh Exp $ * * Digiboard driver. * @@ -12,10 +10,6 @@ * which is under GNU General Public License version 2 so this driver * is forced to be under GPL 2 too. * - * Serge Babkin does not guarantee that this file is totally correct - * for any given task and users of this file must accept responsibility - * for any damage that occurs from the application of this file. - * * Written by Serge Babkin, * Joint Stock Commercial Bank "Chelindbank" * (Chelyabinsk, Russia) @@ -26,6 +20,12 @@ #if NDGB > 0 +/* the overall number of ports controlled by this driver */ + +#ifndef NDGBPORTS +# define NDGBPORTS (NDGB*16) +#endif + #include <sys/param.h> #include <sys/systm.h> #include <sys/reboot.h> @@ -75,59 +75,11 @@ #define CONTROL_INIT_STATE 0x20 #define CONTROL_LOCK_STATE 0x40 #define UNIT_MASK 0x30000 -#define PORT_MASK 0xF +#define PORT_MASK 0x1F #define DEV_TO_UNIT(dev) (MINOR_TO_UNIT(minor(dev))) #define MINOR_MAGIC_MASK (CALLOUT_MASK | CONTROL_MASK) #define MINOR_TO_UNIT(mynor) (((mynor) & UNIT_MASK)>>16) -#define MINOR_TO_PORT(mynor) ((mynor) & 0xF) - -/* - * Input buffer watermarks. - * The external device is asked to stop sending when the buffer exactly reaches - * high water, or when the high level requests it. - * The high level is notified immediately (rather than at a later clock tick) - * when this watermark is reached. - * The buffer size is chosen so the watermark should almost never be reached. - * The low watermark is invisibly 0 since the buffer is always emptied all at - * once. - */ -#define RS_IHIGHWATER (3 * RS_IBUFSIZE / 4) - -/* - * com state bits. - * (CS_BUSY | CS_TTGO) and (CS_BUSY | CS_TTGO | CS_ODEVREADY) must be higher - * than the other bits so that they can be tested as a group without masking - * off the low bits. - * - * The following com and tty flags correspond closely: - * CS_BUSY = TS_BUSY (maintained by comstart() and comflush()) - * CS_TTGO = ~TS_TTSTOP (maintained by comstart() and siostop()) - * CS_CTS_OFLOW = CCTS_OFLOW (maintained by comparam()) - * CS_RTS_IFLOW = CRTS_IFLOW (maintained by comparam()) - * TS_FLUSH is not used. - * XXX I think TIOCSETA doesn't clear TS_TTSTOP when it clears IXON. - * XXX CS_*FLOW should be CF_*FLOW in com->flags (control flags not state). - */ -#define CS_BUSY 0x80 /* output in progress */ -#define CS_TTGO 0x40 /* output not stopped by XOFF */ -#define CS_ODEVREADY 0x20 /* external device h/w ready (CTS) */ -#define CS_CHECKMSR 1 /* check of MSR scheduled */ -#define CS_CTS_OFLOW 2 /* use CTS output flow control */ -#define CS_DTR_OFF 0x10 /* DTR held off */ -#define CS_ODONE 4 /* output completed */ -#define CS_RTS_IFLOW 8 /* use RTS input flow control */ - -static char const * const error_desc[] = { -#define CE_OVERRUN 0 - "silo overflow", -#define CE_INTERRUPT_BUF_OVERFLOW 1 - "interrupt-level buffer overflow", -#define CE_TTY_BUF_OVERFLOW 2 - "tty-level buffer overflow", -}; - -#define CE_NTYPES 3 -#define CE_RECORD(com, errnum) (++(com)->delta_error_counts[errnum]) +#define MINOR_TO_PORT(mynor) ((mynor) & PORT_MASK) /* types. XXX - should be elsewhere */ typedef u_int Port_t; /* hardware port */ @@ -187,8 +139,6 @@ struct dgb_p { u_char last_modem_status; /* last MSR read by intr handler */ u_char prev_modem_status; /* last MSR handled by high level */ - struct tty *tp; /* cross reference */ - /* Initial state. */ struct termios it_in; /* should be in struct tty */ struct termios it_out; @@ -223,6 +173,8 @@ struct dgb_softc { struct dgb_softc dgb_softc[NDGB]; +struct dgb_p dgb_ports[NDGBPORTS]; +struct tty dgb_tty[NDGBPORTS]; /* * The public functions in the com module ought to be declared in a com-driver @@ -511,6 +463,7 @@ dgbattach(dev) int nfails; ushort *pstat; int lowwater; + int nports=0; if(sc->status!=ENABLED) { DPRINT2("dbg%d: try to attach a disabled card\n",unit); @@ -808,43 +761,27 @@ load_fep: return 0; } - addr=setwin(sc,PORTBASE); - pstat=(ushort *)(mem+addr); - - for(i=0; i<32 && pstat[i]; i++); - - if(i!=sc->numports) { - printf("dgb%d: %d ports are shown as valid ones\n",unit,i); - if(i<sc->numports) - sc->numports=i; - printf("dgb%d: %d ports will be used\n",unit,sc->numports); + if(nports+sc->numports>NDGBPORTS) { + printf("dgb%d: only %d ports are usable\n", unit, NDGBPORTS-nports); + sc->numports=NDGBPORTS-nports; } - MALLOC(sc->ports, struct dgb_p *, sizeof(struct dgb_p)*sc->numports, - M_TTYS, M_NOWAIT); - - if(sc->ports==0) { - printf("dgb%d: unable to malloc the per port structures\n",unit); - sc->status=DISABLED; - hidewin(sc); - return 0; - } - - bzero(sc->ports, sizeof(struct dgb_p)*sc->numports); + /* allocate port and tty structures */ + sc->ports=&dgb_ports[nports]; + sc->ttys=&dgb_tty[nports]; + nports+=sc->numports; - MALLOC(sc->ttys, struct tty *, sizeof(struct tty)*sc->numports, - M_TTYS, M_NOWAIT); + addr=setwin(sc,PORTBASE); + pstat=(ushort *)(mem+addr); - if(sc->ttys==0) { - printf("dgb%d: unable to malloc the tty structures\n",unit); - FREE(sc->ttys, M_TTYS); - sc->status=DISABLED; - hidewin(sc); - return 0; + for(i=0; i<sc->numports && pstat[i]; i++) + if(pstat[i]) + sc->ports[i].status=ENABLED; + else { + sc->ports[i].status=DISABLED; + printf("dgb%d: port %d is broken\n", unit, i); } - bzero(sc->ttys, sizeof(struct tty)*sc->numports); - /* We should now init per-port structures */ bc=(struct board_chan *)(mem + CHANSTRUCT); sc->mailbox=(struct global_data *)(mem + FEP_GLOBAL); @@ -854,12 +791,9 @@ load_fep: else shrinkmem=0; - for(i=0; i<sc->numports; i++, bc++) { port= &sc->ports[i]; - port->status=ENABLED; - port->tty=&sc->ttys[i]; port->unit=unit; @@ -2016,9 +1950,25 @@ dgbselect(dev, rw, p) int rw; struct proc *p; { - if (minor(dev) & CONTROL_MASK) + int mynor; + int unit,port; + struct dgb_softc *sc; + int ti; + + mynor=minor(dev); + + if (mynor & CONTROL_MASK) return (ENODEV); - return (ttselect(dev & ~MINOR_MAGIC_MASK, rw, p)); + + unit=MINOR_TO_UNIT(mynor); + port=MINOR_TO_PORT(mynor); + + sc=&dgb_softc[unit]; + + /* get index in the tty table */ + ti= &sc->ttys[port]-dgb_tty; + + return (ttselect(ti, rw, p)); } static void diff --git a/sys/dev/dgb/dgreg.h b/sys/dev/dgb/dgreg.h index 3c32213..8bf90f0 100644 --- a/sys/dev/dgb/dgreg.h +++ b/sys/dev/dgb/dgreg.h @@ -1,7 +1,5 @@ /*- - * dgreg.h $Id: dgreg.h,v 1.4 1995/07/13 08:07:46 root Exp root $ - * - * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su> + * dgreg.h $Id: dgreg.h,v 1.1 1995/09/03 19:52:55 jkh Exp $ * * Digiboard driver. * @@ -12,10 +10,6 @@ * which is under GNU General Public License version 2 so this driver * is forced to be under GPL 2 too. * - * Serge Babkin does not guarantee that this file is totally correct - * for any given task and users of this file must accept responsibility - * for any damage that occurs from the application of this file. - * * Written by Serge Babkin, * Joint Stock Commercial Bank "Chelindbank" * (Chelyabinsk, Russia) diff --git a/sys/gnu/i386/isa/dgb.c b/sys/gnu/i386/isa/dgb.c index 3d22735..e4ecfc0 100644 --- a/sys/gnu/i386/isa/dgb.c +++ b/sys/gnu/i386/isa/dgb.c @@ -1,7 +1,5 @@ /*- - * dgb.c $Id: dgb.c,v 1.1 1995/09/03 19:52:52 jkh Exp $ - * - * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su> + * dgb.c $Id: dgb.c,v 1.2 1995/09/04 01:58:41 jkh Exp $ * * Digiboard driver. * @@ -12,10 +10,6 @@ * which is under GNU General Public License version 2 so this driver * is forced to be under GPL 2 too. * - * Serge Babkin does not guarantee that this file is totally correct - * for any given task and users of this file must accept responsibility - * for any damage that occurs from the application of this file. - * * Written by Serge Babkin, * Joint Stock Commercial Bank "Chelindbank" * (Chelyabinsk, Russia) @@ -26,6 +20,12 @@ #if NDGB > 0 +/* the overall number of ports controlled by this driver */ + +#ifndef NDGBPORTS +# define NDGBPORTS (NDGB*16) +#endif + #include <sys/param.h> #include <sys/systm.h> #include <sys/reboot.h> @@ -75,59 +75,11 @@ #define CONTROL_INIT_STATE 0x20 #define CONTROL_LOCK_STATE 0x40 #define UNIT_MASK 0x30000 -#define PORT_MASK 0xF +#define PORT_MASK 0x1F #define DEV_TO_UNIT(dev) (MINOR_TO_UNIT(minor(dev))) #define MINOR_MAGIC_MASK (CALLOUT_MASK | CONTROL_MASK) #define MINOR_TO_UNIT(mynor) (((mynor) & UNIT_MASK)>>16) -#define MINOR_TO_PORT(mynor) ((mynor) & 0xF) - -/* - * Input buffer watermarks. - * The external device is asked to stop sending when the buffer exactly reaches - * high water, or when the high level requests it. - * The high level is notified immediately (rather than at a later clock tick) - * when this watermark is reached. - * The buffer size is chosen so the watermark should almost never be reached. - * The low watermark is invisibly 0 since the buffer is always emptied all at - * once. - */ -#define RS_IHIGHWATER (3 * RS_IBUFSIZE / 4) - -/* - * com state bits. - * (CS_BUSY | CS_TTGO) and (CS_BUSY | CS_TTGO | CS_ODEVREADY) must be higher - * than the other bits so that they can be tested as a group without masking - * off the low bits. - * - * The following com and tty flags correspond closely: - * CS_BUSY = TS_BUSY (maintained by comstart() and comflush()) - * CS_TTGO = ~TS_TTSTOP (maintained by comstart() and siostop()) - * CS_CTS_OFLOW = CCTS_OFLOW (maintained by comparam()) - * CS_RTS_IFLOW = CRTS_IFLOW (maintained by comparam()) - * TS_FLUSH is not used. - * XXX I think TIOCSETA doesn't clear TS_TTSTOP when it clears IXON. - * XXX CS_*FLOW should be CF_*FLOW in com->flags (control flags not state). - */ -#define CS_BUSY 0x80 /* output in progress */ -#define CS_TTGO 0x40 /* output not stopped by XOFF */ -#define CS_ODEVREADY 0x20 /* external device h/w ready (CTS) */ -#define CS_CHECKMSR 1 /* check of MSR scheduled */ -#define CS_CTS_OFLOW 2 /* use CTS output flow control */ -#define CS_DTR_OFF 0x10 /* DTR held off */ -#define CS_ODONE 4 /* output completed */ -#define CS_RTS_IFLOW 8 /* use RTS input flow control */ - -static char const * const error_desc[] = { -#define CE_OVERRUN 0 - "silo overflow", -#define CE_INTERRUPT_BUF_OVERFLOW 1 - "interrupt-level buffer overflow", -#define CE_TTY_BUF_OVERFLOW 2 - "tty-level buffer overflow", -}; - -#define CE_NTYPES 3 -#define CE_RECORD(com, errnum) (++(com)->delta_error_counts[errnum]) +#define MINOR_TO_PORT(mynor) ((mynor) & PORT_MASK) /* types. XXX - should be elsewhere */ typedef u_int Port_t; /* hardware port */ @@ -187,8 +139,6 @@ struct dgb_p { u_char last_modem_status; /* last MSR read by intr handler */ u_char prev_modem_status; /* last MSR handled by high level */ - struct tty *tp; /* cross reference */ - /* Initial state. */ struct termios it_in; /* should be in struct tty */ struct termios it_out; @@ -223,6 +173,8 @@ struct dgb_softc { struct dgb_softc dgb_softc[NDGB]; +struct dgb_p dgb_ports[NDGBPORTS]; +struct tty dgb_tty[NDGBPORTS]; /* * The public functions in the com module ought to be declared in a com-driver @@ -511,6 +463,7 @@ dgbattach(dev) int nfails; ushort *pstat; int lowwater; + int nports=0; if(sc->status!=ENABLED) { DPRINT2("dbg%d: try to attach a disabled card\n",unit); @@ -808,43 +761,27 @@ load_fep: return 0; } - addr=setwin(sc,PORTBASE); - pstat=(ushort *)(mem+addr); - - for(i=0; i<32 && pstat[i]; i++); - - if(i!=sc->numports) { - printf("dgb%d: %d ports are shown as valid ones\n",unit,i); - if(i<sc->numports) - sc->numports=i; - printf("dgb%d: %d ports will be used\n",unit,sc->numports); + if(nports+sc->numports>NDGBPORTS) { + printf("dgb%d: only %d ports are usable\n", unit, NDGBPORTS-nports); + sc->numports=NDGBPORTS-nports; } - MALLOC(sc->ports, struct dgb_p *, sizeof(struct dgb_p)*sc->numports, - M_TTYS, M_NOWAIT); - - if(sc->ports==0) { - printf("dgb%d: unable to malloc the per port structures\n",unit); - sc->status=DISABLED; - hidewin(sc); - return 0; - } - - bzero(sc->ports, sizeof(struct dgb_p)*sc->numports); + /* allocate port and tty structures */ + sc->ports=&dgb_ports[nports]; + sc->ttys=&dgb_tty[nports]; + nports+=sc->numports; - MALLOC(sc->ttys, struct tty *, sizeof(struct tty)*sc->numports, - M_TTYS, M_NOWAIT); + addr=setwin(sc,PORTBASE); + pstat=(ushort *)(mem+addr); - if(sc->ttys==0) { - printf("dgb%d: unable to malloc the tty structures\n",unit); - FREE(sc->ttys, M_TTYS); - sc->status=DISABLED; - hidewin(sc); - return 0; + for(i=0; i<sc->numports && pstat[i]; i++) + if(pstat[i]) + sc->ports[i].status=ENABLED; + else { + sc->ports[i].status=DISABLED; + printf("dgb%d: port %d is broken\n", unit, i); } - bzero(sc->ttys, sizeof(struct tty)*sc->numports); - /* We should now init per-port structures */ bc=(struct board_chan *)(mem + CHANSTRUCT); sc->mailbox=(struct global_data *)(mem + FEP_GLOBAL); @@ -854,12 +791,9 @@ load_fep: else shrinkmem=0; - for(i=0; i<sc->numports; i++, bc++) { port= &sc->ports[i]; - port->status=ENABLED; - port->tty=&sc->ttys[i]; port->unit=unit; @@ -2016,9 +1950,25 @@ dgbselect(dev, rw, p) int rw; struct proc *p; { - if (minor(dev) & CONTROL_MASK) + int mynor; + int unit,port; + struct dgb_softc *sc; + int ti; + + mynor=minor(dev); + + if (mynor & CONTROL_MASK) return (ENODEV); - return (ttselect(dev & ~MINOR_MAGIC_MASK, rw, p)); + + unit=MINOR_TO_UNIT(mynor); + port=MINOR_TO_PORT(mynor); + + sc=&dgb_softc[unit]; + + /* get index in the tty table */ + ti= &sc->ttys[port]-dgb_tty; + + return (ttselect(ti, rw, p)); } static void diff --git a/sys/gnu/i386/isa/dgreg.h b/sys/gnu/i386/isa/dgreg.h index 3c32213..8bf90f0 100644 --- a/sys/gnu/i386/isa/dgreg.h +++ b/sys/gnu/i386/isa/dgreg.h @@ -1,7 +1,5 @@ /*- - * dgreg.h $Id: dgreg.h,v 1.4 1995/07/13 08:07:46 root Exp root $ - * - * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su> + * dgreg.h $Id: dgreg.h,v 1.1 1995/09/03 19:52:55 jkh Exp $ * * Digiboard driver. * @@ -12,10 +10,6 @@ * which is under GNU General Public License version 2 so this driver * is forced to be under GPL 2 too. * - * Serge Babkin does not guarantee that this file is totally correct - * for any given task and users of this file must accept responsibility - * for any damage that occurs from the application of this file. - * * Written by Serge Babkin, * Joint Stock Commercial Bank "Chelindbank" * (Chelyabinsk, Russia) |