Date: Tue, 26 Sep 1995 15:11:14 +0500 (GMT+0500) From: "Serge A. Babkin" <babkin@hq.icb.chel.su> To: jkh@time.cdrom.com (Jordan K. Hubbard) Cc: current@freebsd.org Subject: Patch for Digiboard Message-ID: <199509261011.PAA09998@hq.icb.chel.su> In-Reply-To: <8078.810180725@time.cdrom.com> from "Jordan K. Hubbard" at Sep 3, 95 07:12:05 pm
next in thread | previous in thread | raw e-mail | index | archive | help
I have found the Digiboard driver in -current! :-) 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"
-------------------------------- cut here --------------------------
*** dgb.c Thu Sep 7 09:14:40 1995
--- dgb.c Tue Sep 26 14:56:35 1995
***************
*** 3,8 ****
*
- * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su>
- *
* Digiboard driver.
*
* Stage 1. "Better than nothing".
--- 3,6 ----
***************
*** 12,21 ****
* 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)
--- 10,15 ----
***************
*** 26,31 ****
--- 20,31 ----
#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,133 ****
#define CONTROL_INIT_STATE 0x20
#define CONTROL_LOCK_STATE 0x40
#define UNIT_MASK 0x30000
! #define PORT_MASK 0xF
#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])
/* types. XXX - should be elsewhere */
typedef u_int Port_t; /* hardware port */
--- 75,85 ----
#define CONTROL_INIT_STATE 0x20
#define CONTROL_LOCK_STATE 0x40
#define UNIT_MASK 0x30000
! #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) & PORT_MASK)
/* types. XXX - should be elsewhere */
typedef u_int Port_t; /* hardware port */
***************
*** 187,194 ****
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;
--- 139,144 ----
***************
*** 223,228 ****
--- 173,180 ----
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,516 ****
--- 463,469 ----
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,850 ****
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);
}
! 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);
! MALLOC(sc->ttys, struct tty *, sizeof(struct tty)*sc->numports,
! M_TTYS, M_NOWAIT);
! 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;
}
- 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);
--- 761,787 ----
return 0;
}
! if(nports+sc->numports>NDGBPORTS) {
! printf("dgb%d: only %d ports are usable\n", unit, NDGBPORTS-nports);
! sc->numports=NDGBPORTS-nports;
}
! /* allocate port and tty structures */
! sc->ports=&dgb_ports[nports];
! sc->ttys=&dgb_tty[nports];
! nports+=sc->numports;
! addr=setwin(sc,PORTBASE);
! pstat=(ushort *)(mem+addr);
! 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);
}
/* We should now init per-port structures */
bc=(struct board_chan *)(mem + CHANSTRUCT);
sc->mailbox=(struct global_data *)(mem + FEP_GLOBAL);
***************
*** 854,865 ****
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;
--- 791,799 ----
***************
*** 2016,2024 ****
int rw;
struct proc *p;
{
! if (minor(dev) & CONTROL_MASK)
return (ENODEV);
! return (ttselect(dev & ~MINOR_MAGIC_MASK, rw, p));
}
static void
--- 1950,1974 ----
int rw;
struct proc *p;
{
! int mynor;
! int unit,port;
! struct dgb_softc *sc;
! int ti;
!
! mynor=minor(dev);
!
! if (mynor & CONTROL_MASK)
return (ENODEV);
!
! 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
*** dgreg.h Thu Sep 7 09:14:33 1995
--- dgreg.h Tue Sep 26 14:57:06 1995
***************
*** 3,8 ****
*
- * Copyright (C) 1995 by Serge Babkin <babkin@hq.icb.chel.su>
- *
* Digiboard driver.
*
* Stage 1. "Better than nothing".
--- 3,6 ----
***************
*** 11,20 ****
* De Jongh <troyd@digibd.com> or <troyd@skypoint.com>
* 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"
--- 9,14 ----
-------------------------------- cut here --------------------------
Serge Babkin
! (babkin@hq.icb.chel.su)
! Headquarter of Joint Stock Commercial Bank "Chelindbank"
! Chelyabinsk, Russia
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199509261011.PAA09998>
