diff options
author | bde <bde@FreeBSD.org> | 1995-12-22 14:58:55 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1995-12-22 14:58:55 +0000 |
commit | 2aec697e08fb6b30c75d015d4bbe4f146d37dd3a (patch) | |
tree | 34460223dabb3207e4b5161d8d9cf71ff44b64e2 /sys/dev/sio | |
parent | 4cb3683164b0edc80fbdf7afb160f5483c7c57c0 (diff) | |
download | FreeBSD-src-2aec697e08fb6b30c75d015d4bbe4f146d37dd3a.zip FreeBSD-src-2aec697e08fb6b30c75d015d4bbe4f146d37dd3a.tar.gz |
Fixed bugs introduced in rev. 1.127 (some broken 16650 support was
unintentionally committed):
- the fifo was completely disabled for low speeds. Apart from being
unnecessarily inefficient, this invalidated com->tx_fifo_size.
- `ftl' became a bogus name.
- the 16650 probe breaks the COM_NOFIFO() case and has other bugs
(disabled, not fixed).
Fixed bogus change of the fifo settings for the non-speed of 0. This
bug made the above fifo bug occur even at non-low speeds.
Fixed the modes of the cua devices. It isn't possible to set the uid
and gid correctly since the kernel can't know who uucp.dialer is.
Register the devswitch at device attach time. SYSINIT() is not
the right way to initialize devswitches (if anything :->).
Eventually, the devswitch should be deregistered at device detach
and/or unload time and reregistered at device attach time ... Then
some com->gone tests could be removed.
Cleaned up some other recent changes.
Diffstat (limited to 'sys/dev/sio')
-rw-r--r-- | sys/dev/sio/sio.c | 124 |
1 files changed, 54 insertions, 70 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index 375521a..7829045 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)com.c 7.5 (Berkeley) 5/16/91 - * $Id: sio.c,v 1.128 1995/12/10 15:54:50 bde Exp $ + * $Id: sio.c,v 1.129 1995/12/10 20:54:38 bde Exp $ */ #include "sio.h" @@ -60,7 +60,7 @@ #include <sys/devconf.h> #ifdef DEVFS #include <sys/devfsext.h> -#endif /*DEVFS*/ +#endif #include <machine/clock.h> @@ -70,6 +70,13 @@ #include <i386/isa/sioreg.h> #include <i386/isa/ic/ns16550.h> +#include "crd.h" +#if NCRD > 0 +#include <pccard/card.h> +#include <pccard/driver.h> +#include <pccard/slot.h> +#endif /* NCRD > 0 */ + #define LOTS_OF_EVENTS 64 /* helps separate urgent events from input */ #define RB_I_HIGH_WATER (TTYHOG - 2 * RS_IBUFSIZE) #define RS_IBUFSIZE 256 @@ -97,15 +104,6 @@ #define com_scr 7 /* scratch register for 16450-16550 (R/W) */ - - -#include "crd.h" -#if NCRD > 0 -#include <pccard/card.h> -#include <pccard/driver.h> -#include <pccard/slot.h> -#endif /* NCRD > 0 */ - /* * Input buffer watermarks. * The external device is asked to stop sending when the buffer exactly reaches @@ -172,7 +170,7 @@ struct com_s { u_char state; /* miscellaneous flag bits */ bool_t active_out; /* nonzero if the callout device is open */ u_char cfcr_image; /* copy of value written to CFCR */ - u_char ftl; /* current rx fifo trigger level */ + u_char fifo_image; /* copy of value written to FIFO */ bool_t hasfifo; /* nonzero for 16550 UARTs */ bool_t loses_outints; /* nonzero if device loses output interrupts */ u_char mcr_image; /* copy of value written to MCR */ @@ -308,11 +306,12 @@ static d_stop_t siostop; static d_devtotty_t siodevtotty; #define CDEV_MAJOR 28 -static struct cdevsw sio_cdevsw = - { sioopen, sioclose, sioread, siowrite, /*28*/ - sioioctl, siostop, noreset, siodevtotty,/* sio */ - ttselect, nommap, NULL, driver_name, NULL, -1 }; - +static struct cdevsw sio_cdevsw = { + sioopen, sioclose, sioread, siowrite, + sioioctl, siostop, noreset, siodevtotty, + ttselect, nommap, NULL, driver_name, + NULL, -1, +}; static int comconsole = -1; static speed_t comdefaultrate = TTYDEF_SPEED; @@ -710,10 +709,11 @@ sioattach(isdp) struct isa_device *isdp; { struct com_s *com; + dev_t dev; Port_t iobase; + char name[32]; int s; int unit; - char name[32]; isdp->id_ri_flags |= RI_FAST; iobase = isdp->id_iobase; @@ -828,6 +828,7 @@ sioattach(isdp) "Serial port: maybe National 16550"; break; case FIFO_RX_HIGH: + printf(" 16550A"); if (COM_NOFIFO(isdp)) { printf(" fifo disabled"); kdc_sio[unit].kdc_description = @@ -838,6 +839,7 @@ sioattach(isdp) kdc_sio[unit].kdc_description = "Serial port: National 16550A or compatible"; } +#if 0 /* * Check for the Startech ST16C650 chip. * it has a shadow register under the com_iir, @@ -863,6 +865,7 @@ sioattach(isdp) if (!com->tx_fifo_size) printf(" fifo disabled"); } +#endif break; } outb(iobase + com_fifo, 0); @@ -921,37 +924,33 @@ determined_type: ; com_addr(unit) = com; splx(s); + dev = makedev(CDEV_MAJOR, 0); + cdevsw_add(&dev, &sio_cdevsw, NULL); #ifdef DEVFS -/* path name devsw minor type uid gid perm*/ - sprintf(name,"ttyd%c",chardev[unit]); - com->devfs_token_ttyd = devfs_add_devsw( - "/", name, &sio_cdevsw, unit, - DV_CHR, 0, 0, 0600); - sprintf(name,"ttyid%c",chardev[unit]); - com->devfs_token_ttyi = devfs_add_devsw( - "/", name, &sio_cdevsw, unit+32, - DV_CHR, 0, 0, 0600); - sprintf(name,"ttyld%c",chardev[unit]); - com->devfs_token_ttyl = devfs_add_devsw( - "/", name, &sio_cdevsw, unit+64, - DV_CHR, 0, 0, 0600); - sprintf(name,"cuaa%c",chardev[unit]); - com->devfs_token_cuaa = devfs_add_devsw( - "/", name, &sio_cdevsw, unit+128, - DV_CHR, 0, 0, 0600); - sprintf(name,"cuaia%c",chardev[unit]); - com->devfs_token_cuai = devfs_add_devsw( - "/", name, &sio_cdevsw, unit+160, - DV_CHR, 0, 0, 0600); - sprintf(name,"cuala%c",chardev[unit]); - com->devfs_token_cual = devfs_add_devsw( - "/", name, &sio_cdevsw, unit+192, - DV_CHR, 0, 0, 0600); + /* path, name, devsw, minor, type, uid, gid, perm */ + sprintf(name, "ttyd%c", chardev[unit]); + com->devfs_token_ttyd = devfs_add_devsw("/", name, &sio_cdevsw, + unit, DV_CHR, 0, 0, 0600); + sprintf(name, "ttyid%c", chardev[unit]); + com->devfs_token_ttyi = devfs_add_devsw("/", name, &sio_cdevsw, + unit | CONTROL_INIT_STATE, DV_CHR, 0, 0, 0600); + sprintf(name, "ttyld%c", chardev[unit]); + com->devfs_token_ttyl = devfs_add_devsw("/", name, &sio_cdevsw, + unit | CONTROL_LOCK_STATE, DV_CHR, 0, 0, 0600); + sprintf(name, "cuaa%c", chardev[unit]); + com->devfs_token_cuaa = devfs_add_devsw("/", name, &sio_cdevsw, + unit | CALLOUT_MASK, DV_CHR, 0, 0, 0660); + sprintf(name, "cuaia%c", chardev[unit]); + com->devfs_token_cuai = devfs_add_devsw("/", name, &sio_cdevsw, + unit | CALLOUT_MASK | CONTROL_INIT_STATE, DV_CHR, 0, 0, 0660); + sprintf(name, "cuala%c", chardev[unit]); + com->devfs_token_cual = devfs_add_devsw("/", name, &sio_cdevsw, + unit | CALLOUT_MASK | CONTROL_LOCK_STATE, DV_CHR, 0, 0, 0660); #endif return (1); } -static int +static int sioopen(dev, flag, mode, p) dev_t dev; int flag; @@ -1061,7 +1060,8 @@ open_top: */ while (TRUE) { outb(iobase + com_fifo, - FIFO_RCV_RST | FIFO_XMT_RST | com->ftl); + FIFO_RCV_RST | FIFO_XMT_RST + | com->fifo_image); DELAY(100); if (!(inb(com->line_status_port) & LSR_RXRDY)) break; @@ -1121,7 +1121,7 @@ out: return (error); } -static int +static int sioclose(dev, flag, mode, p) dev_t dev; int flag; @@ -1216,7 +1216,7 @@ comhardclose(com) splx(s); } -static int +static int sioread(dev, uio, flag) dev_t dev; struct uio *uio; @@ -1236,7 +1236,7 @@ sioread(dev, uio, flag) return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); } -static int +static int siowrite(dev, uio, flag) dev_t dev; struct uio *uio; @@ -1495,7 +1495,7 @@ cont: } } -static int +static int sioioctl(dev, cmd, data, flag, p) dev_t dev; int cmd; @@ -1896,9 +1896,9 @@ comparam(tp, t) * protocols shouldn't expect anything better since modem * latencies are larger. */ - com->ftl = t->c_ospeed <= 4800 - ? 0 : FIFO_ENABLE | FIFO_RX_HIGH; - outb(iobase + com_fifo, com->ftl); + com->fifo_image = t->c_ospeed != 0 && t->c_ospeed <= 4800 + ? FIFO_ENABLE : FIFO_ENABLE | FIFO_RX_HIGH; + outb(iobase + com_fifo, com->fifo_image); } /* @@ -2076,7 +2076,7 @@ comstart(tp) splx(s); } -static void +static void siostop(tp, rw) struct tty *tp; int rw; @@ -2105,7 +2105,7 @@ siostop(tp, rw) /* XXX should clear h/w fifos too. */ } -static struct tty * +static struct tty * siodevtotty(dev) dev_t dev; { @@ -2592,19 +2592,3 @@ error: return EIO; } #endif /* DSI_SOFT_MODEM */ - -static sio_devsw_installed = 0; - -static void sio_drvinit(void *unused) -{ - dev_t dev; - - if( ! sio_devsw_installed ) { - dev = makedev(CDEV_MAJOR, 0); - cdevsw_add(&dev,&sio_cdevsw, NULL); - sio_devsw_installed = 1; - } -} - -SYSINIT(siodev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,sio_drvinit,NULL) - |