summaryrefslogtreecommitdiffstats
path: root/sys/gnu/i386
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1995-10-04 21:51:26 +0000
committerjkh <jkh@FreeBSD.org>1995-10-04 21:51:26 +0000
commit1c1ef85e1307f05f0ae122e54088a9f8e7425ef7 (patch)
tree31e02cc79da6020e113e9a9762b9bc12f61eb678 /sys/gnu/i386
parent306caafb867695c44f1dfcaf62b175515cdbed20 (diff)
downloadFreeBSD-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>
Diffstat (limited to 'sys/gnu/i386')
-rw-r--r--sys/gnu/i386/isa/dgb.c140
-rw-r--r--sys/gnu/i386/isa/dgreg.h8
2 files changed, 46 insertions, 102 deletions
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)
OpenPOWER on IntegriCloud