-/* $NetBSD: com.c,v 1.62 1995/10/15 19:43:04 mycroft Exp $ */
+/* $OpenBSD: com.c,v 1.7 1996/03/08 16:42:51 niklas Exp $ */
+/* $NetBSD: com.c,v 1.65 1996/02/10 20:23:18 christos Exp $ */
/*-
* Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved.
#include <dev/isa/isavar.h>
#include <dev/isa/comreg.h>
#include <dev/ic/ns16550reg.h>
-#include <dev/ic/espreg.h>
+#ifdef COM_HAYESP
+#include <dev/ic/hayespreg.h>
+#endif
#define com_lcr com_cfcr
-#define COM_IBUFSIZE (2 * 256)
+#define COM_IBUFSIZE (2 * 512)
#define COM_IHIGHWATER ((3 * COM_IBUFSIZE) / 4)
struct com_softc {
int sc_errors;
int sc_iobase;
- int sc_espbase;
+#ifdef COM_HAYESP
+ int sc_hayespbase;
+#endif
u_char sc_hwflags;
#define COM_HW_NOIEN 0x01
#define COM_HW_FIFO 0x02
-#define COM_HW_ESP 0x04
+#define COM_HW_HAYESP 0x04
#define COM_HW_CONSOLE 0x40
u_char sc_swflags;
#define COM_SW_SOFTCAR 0x01
return 1;
}
+#ifdef COM_HAYESP
int
-comprobe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
+comprobeHAYESP(iobase, sc)
+ int iobase;
+ struct com_softc *sc;
{
- struct isa_attach_args *ia = aux;
- int iobase = ia->ia_iobase;
+ char val, dips;
+ int combaselist[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
- if (!comprobe1(iobase))
- return 0;
+ /*
+ * Hayes ESP cards have two iobases. One is for compatibility with
+ * 16550 serial chips, and at the same ISA PC base addresses. The
+ * other is for ESP-specific enhanced features, and lies at a
+ * different addressing range entirely (0x140, 0x180, 0x280, or 0x300).
+ */
- ia->ia_iosize = COM_NPORTS;
- ia->ia_msize = 0;
- return 1;
-}
+ /* Test for ESP signature */
+ if ((inb(iobase) & 0xf3) == 0)
+ return 0;
-int
-comprobeESP(esp_port, sc)
- int esp_port;
- struct com_softc *sc;
-{
- char val, dips;
- int com_base_list[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
+ /*
+ * ESP is present at ESP enhanced base address; unknown com port
+ */
- /* Test for ESP signature at the ESP i/o port. */
- if ((inb(esp_port) & 0xf3) == 0)
- return(0);
+ /* Get the dip-switch configurations */
+ outb(iobase + HAYESP_CMD1, HAYESP_GETDIPS);
+ dips = inb(iobase + HAYESP_STATUS1);
- /* Check compatibility mode settings */
- outb(esp_port + ESP_CMD1, ESP_GETDIPS);
- dips = inb(esp_port + ESP_STATUS1);
+ /* Determine which com port this ESP card services: bits 0,1 of */
+ /* dips is the port # (0-3); combaselist[val] is the com_iobase */
+ if (sc->sc_iobase != combaselist[dips & 0x03])
+ return 0;
- /* Does this ESP board service this com port?: Bits 0,1 == COM0..3 */
- if (sc->sc_iobase != com_base_list[(dips & 0x03)]) {
- return(0);
- }
printf(": ESP");
- /* Check ESP Self Test bits. */
+ /* Check ESP Self Test bits. */
/* Check for ESP version 2.0: bits 4,5,6 == 010 */
- outb(esp_port + ESP_CMD1, ESP_GETTEST);
- val = inb(esp_port + ESP_STATUS1); /* Always 0x00 */
- val = inb(esp_port + ESP_STATUS2);
+ outb(iobase + HAYESP_CMD1, HAYESP_GETTEST);
+ val = inb(iobase + HAYESP_STATUS1); /* Clear reg 1 */
+ val = inb(iobase + HAYESP_STATUS2);
if ((val & 0x70) < 0x20) {
printf("-old (%o)", val & 0x70);
- return(0);
+ /* we do not support the necessary features */
+ return 0;
}
- /* Check for ability to emulate 16550: bit 7 set */
- if (ISSET(dips, 0x80) == 0) {
+ /* Check for ability to emulate 16550: bit 8 == 1 */
+ if ((dips & 0x80) == 0) {
printf(" slave");
- return(0);
+ /* XXX Does slave really mean no 16550 support?? */
+ return 0;
}
- /* We're a full featured ESP card at the right com port. */
- SET(sc->sc_hwflags, COM_HW_ESP);
- printf(", 1024 byte fifo\n");
- return(1);
+ /*
+ * If we made it this far, we are a full-featured ESP v2.0 (or
+ * better), at the correct com port address.
+ */
+
+ SET(sc->sc_hwflags, COM_HW_HAYESP);
+ printf(", 1024k fifo\n");
+ return 1;
+}
+#endif
+
+int
+comprobe(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ struct isa_attach_args *ia = aux;
+ int iobase = ia->ia_iobase;
+
+ if (!comprobe1(iobase))
+ return 0;
+
+ ia->ia_iosize = COM_NPORTS;
+ ia->ia_msize = 0;
+ return 1;
}
void
struct cfdata *cf = sc->sc_dev.dv_cfdata;
int iobase = ia->ia_iobase;
struct tty *tp;
- int esp_ports[] = { 0x140, 0x180, 0x280, 0 };
- int *espp;
+#ifdef COM_HAYESP
+ int hayesp_ports[] = { 0x140, 0x180, 0x280, 0x300, 0 };
+ int *hayespp;
+#endif
sc->sc_iobase = iobase;
sc->sc_hwflags = ISSET(cf->cf_flags, COM_HW_NOIEN);
if (sc->sc_dev.dv_unit == comconsole)
delay(1000);
+#ifdef COM_HAYESP
/* Look for a Hayes ESP board. */
- for (espp = esp_ports; *espp != 0; espp++)
- if (comprobeESP(*espp, sc)) {
- sc->sc_espbase = *espp;
+ for (hayespp = hayesp_ports; *hayespp != 0; hayespp++)
+ if (comprobeHAYESP(*hayespp, sc)) {
+ sc->sc_hayespbase = *hayespp;
break;
}
/* No ESP; look for other things. */
- if (*espp == 0) {
- /* look for a NS 16550AF UART with FIFOs */
- outb(iobase + com_fifo,
- FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER_14);
- delay(100);
- if (ISSET(inb(iobase + com_iir), IIR_FIFO_MASK) == IIR_FIFO_MASK)
- if (ISSET(inb(iobase + com_fifo), FIFO_TRIGGER_14) ==
- FIFO_TRIGGER_14) {
- SET(sc->sc_hwflags, COM_HW_FIFO);
- printf(": ns16550a, working fifo\n");
- } else
- printf(": ns16550, broken fifo\n");
- else
- printf(": ns8250 or ns16450, no fifo\n");
- outb(iobase + com_fifo, 0);
+ if (*hayespp == 0) {
+#endif
+
+ /* look for a NS 16550AF UART with FIFOs */
+ outb(iobase + com_fifo,
+ FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER_14);
+ delay(100);
+ if (ISSET(inb(iobase + com_iir), IIR_FIFO_MASK) == IIR_FIFO_MASK)
+ if (ISSET(inb(iobase + com_fifo), FIFO_TRIGGER_14) == FIFO_TRIGGER_14) {
+ SET(sc->sc_hwflags, COM_HW_FIFO);
+ printf(": ns16550a, working fifo\n");
+ } else
+ printf(": ns16550, broken fifo\n");
+ else
+ printf(": ns8250 or ns16450, no fifo\n");
+ outb(iobase + com_fifo, 0);
+#ifdef COM_HAYESP
}
+#endif
/* disable interrupts */
outb(iobase + com_ier, 0);
sc->sc_ibufend = sc->sc_ibuf + COM_IBUFSIZE;
iobase = sc->sc_iobase;
+#ifdef COM_HAYESP
+ /* Setup the ESP board */
+ if (ISSET(sc->sc_hwflags, COM_HW_HAYESP)) {
+ int hayespbase = sc->sc_hayespbase;
- /* Set up the ESP board */
- if (ISSET(sc->sc_hwflags, COM_HW_ESP)) {
outb(iobase + com_fifo,
- /* XXX - bug in ESP requires DMA flag set */
- FIFO_DMA_MODE |
- FIFO_ENABLE | FIFO_RCV_RST |
- FIFO_XMT_RST | FIFO_TRIGGER_8);
+ FIFO_DMA_MODE|FIFO_ENABLE|
+ FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_8);
/* Set 16550 compatibility mode */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETMODE);
- outb(sc->sc_espbase + ESP_CMD2,
- ESP_MODE_FIFO | ESP_MODE_RTS | ESP_MODE_SCALE);
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETMODE);
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_MODE_FIFO|HAYESP_MODE_RTS|
+ HAYESP_MODE_SCALE);
/* Set RTS/CTS flow control */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETFLOWTYPE);
- outb(sc->sc_espbase + ESP_CMD2, ESP_FLOW_RTS);
- outb(sc->sc_espbase + ESP_CMD2, ESP_FLOW_CTS);
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETFLOWTYPE);
+ outb(hayespbase + HAYESP_CMD2, HAYESP_FLOW_RTS);
+ outb(hayespbase + HAYESP_CMD2, HAYESP_FLOW_CTS);
/* Set flow control levels */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETRXFLOW);
- outb(sc->sc_espbase + ESP_CMD2, HIBYTE(RXHIGHWATER));
- outb(sc->sc_espbase + ESP_CMD2, LOBYTE(RXHIGHWATER));
- outb(sc->sc_espbase + ESP_CMD2, HIBYTE(RXLOWWATER));
- outb(sc->sc_espbase + ESP_CMD2, LOBYTE(RXLOWWATER));
- } else if (ISSET(sc->sc_hwflags, COM_HW_FIFO))
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETRXFLOW);
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_HIBYTE(HAYESP_RXHIWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_LOBYTE(HAYESP_RXHIWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_HIBYTE(HAYESP_RXLOWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_LOBYTE(HAYESP_RXLOWMARK));
+ } else
+#endif
+ if (ISSET(sc->sc_hwflags, COM_HW_FIFO))
/* Set the FIFO threshold based on the receive speed. */
outb(iobase + com_fifo,
FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST |
selwakeup(&tp->t_wsel);
}
SET(tp->t_state, TS_BUSY);
- if (ISSET(sc->sc_hwflags, COM_HW_ESP)) {
+
+#ifdef COM_HAYESP
+ if (ISSET(sc->sc_hwflags, COM_HW_HAYESP)) {
u_char buffer[1024], *cp = buffer;
int n = q_to_b(&tp->t_outq, cp, sizeof buffer);
- do {
+ do
outb(iobase + com_data, *cp++);
- } while (--n);
- } else if (ISSET(sc->sc_hwflags, COM_HW_FIFO)) {
+ while (--n);
+ }
+ else
+#endif
+ if (ISSET(sc->sc_hwflags, COM_HW_FIFO)) {
u_char buffer[16], *cp = buffer;
int n = q_to_b(&tp->t_outq, cp, sizeof buffer);
do {
-/* $NetBSD: comreg.h,v 1.7 1995/10/15 19:43:07 mycroft Exp $ */
+/* $OpenBSD: comreg.h,v 1.4 1996/03/08 16:42:52 niklas Exp $ */
+/* $NetBSD: comreg.h,v 1.8 1996/02/05 23:01:50 scottr Exp $ */
/*-
* Copyright (c) 1991 The Regents of the University of California.
#define COM_TOLERANCE 30 /* baud rate tolerance, in 0.1% units */
/* interrupt enable register */
-#define IER_ERXRDY 0x1 /* Character received */
-#define IER_ETXRDY 0x2 /* Transmitter empty */
-#define IER_ERLS 0x4 /* Error condition */
-#define IER_EMSC 0x8 /* RS-232 line state change */
+#define IER_ERXRDY 0x1 /* Enable receiver interrupt */
+#define IER_ETXRDY 0x2 /* Enable transmitter empty interrupt */
+#define IER_ERLS 0x4 /* Enable line status interrupt */
+#define IER_EMSC 0x8 /* Enable modem status interrupt */
/* interrupt identification register */
#define IIR_IMASK 0xf
#define IIR_RXTOUT 0xc
-#define IIR_RLS 0x6
-#define IIR_RXRDY 0x4
-#define IIR_TXRDY 0x2
+#define IIR_RLS 0x6 /* Line status change */
+#define IIR_RXRDY 0x4 /* Receiver ready */
+#define IIR_TXRDY 0x2 /* Transmitter ready */
+#define IIR_MLSC 0x0 /* Modem status */
#define IIR_NOPEND 0x1 /* No pending interrupts */
-#define IIR_MLSC 0x0
#define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */
/* fifo control register */
#define FIFO_ENABLE 0x01 /* Turn the FIFO on */
#define FIFO_RCV_RST 0x02 /* Reset RX FIFO */
#define FIFO_XMT_RST 0x04 /* Reset TX FIFO */
-#define FIFO_DMA_MODE 0x08 /* DMA mode? */
-#define FIFO_TRIGGER_1 0x00 /* Trigger RXRDY Interrupt on 1 character */
+#define FIFO_DMA_MODE 0x08
+#define FIFO_TRIGGER_1 0x00 /* Trigger RXRDY intr on 1 character */
#define FIFO_TRIGGER_4 0x40 /* ibid 4 */
#define FIFO_TRIGGER_8 0x80 /* ibid 8 */
#define FIFO_TRIGGER_14 0xc0 /* ibid 14 */
/* modem control register */
#define MCR_LOOPBACK 0x10 /* Loop test: echos from TX to RX */
-#define MCR_IENABLE 0x08 /* Output 2: enables UART interrupts */
-#define MCR_DRS 0x04 /* Output 1: resets some internal modems */
-#define MCR_RTS 0x02 /* RTS: ready to receive data */
+#define MCR_IENABLE 0x08 /* Out2: enables UART interrupts */
+#define MCR_DRS 0x04 /* Out1: resets some internal modems */
+#define MCR_RTS 0x02 /* Request To Send */
#define MCR_DTR 0x01 /* Data Terminal Ready */
/* line status register */
-/* $NetBSD: ad1848.c,v 1.7 1995/11/10 04:30:36 mycroft Exp $ */
+/* $OpenBSD: ad1848.c,v 1.3 1996/03/08 16:42:45 niklas Exp $ */
+/* $NetBSD: ad1848.c,v 1.8 1996/02/05 21:32:26 scottr Exp $ */
/*
* Copyright (c) 1994 John Brezak
sc->sc_lastcc = -1;
/* Higher speeds need bigger blocks to avoid popping and silence gaps. */
- if ((sc->sc_orate > 8000 || sc->sc_irate > 8000) &&
- (blk > NBPG/2 || blk < NBPG/4))
+ if ((sc->sc_orate > 8000 || sc->sc_irate > 8000) && blk < NBPG/2)
blk = NBPG/2;
/* don't try to DMA too much at once, though. */
if (blk > NBPG)
-/* $NetBSD: aha1542.c,v 1.53 1995/10/03 20:58:56 mycroft Exp $ */
+/* $OpenBSD: aha.c,v 1.11 1996/03/08 16:42:47 niklas Exp $ */
+/* $NetBSD: aha1542.c,v 1.55 1995/12/24 02:31:06 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
-/* $NetBSD: aha1542.c,v 1.53 1995/10/03 20:58:56 mycroft Exp $ */
+/* $OpenBSD: aha1542.c,v 1.11 1996/03/08 16:42:47 niklas Exp $ */
+/* $NetBSD: aha1542.c,v 1.55 1995/12/24 02:31:06 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
+/* $OpenBSD: ast.c,v 1.4 1996/03/08 16:42:48 niklas Exp $ */
/* $NetBSD: ast.c,v 1.18 1995/06/26 04:08:04 cgd Exp $ */
/*
-/* $NetBSD: boca.c,v 1.5 1995/06/26 04:08:06 cgd Exp $ */
+/* $OpenBSD: boca.c,v 1.4 1996/03/08 16:42:49 niklas Exp $ */
+/* $NetBSD: boca.c,v 1.6 1995/12/24 02:31:11 mycroft Exp $ */
/*
* Copyright (c) 1995 Charles Hannum. All rights reserved.
-/* $NetBSD: bt742a.c,v 1.49 1995/10/03 20:58:58 mycroft Exp $ */
+/* $OpenBSD: bt.c,v 1.4 1996/03/08 16:42:50 niklas Exp $ */
+/* $NetBSD: bt742a.c,v 1.50 1995/12/24 02:31:13 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
-/* $NetBSD: bt742a.c,v 1.49 1995/10/03 20:58:58 mycroft Exp $ */
+/* $OpenBSD: bt742a.c,v 1.4 1996/03/08 16:42:50 niklas Exp $ */
+/* $NetBSD: bt742a.c,v 1.50 1995/12/24 02:31:13 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
-/* $NetBSD: com.c,v 1.62 1995/10/15 19:43:04 mycroft Exp $ */
+/* $OpenBSD: com.c,v 1.7 1996/03/08 16:42:51 niklas Exp $ */
+/* $NetBSD: com.c,v 1.65 1996/02/10 20:23:18 christos Exp $ */
/*-
* Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved.
#include <dev/isa/isavar.h>
#include <dev/isa/comreg.h>
#include <dev/ic/ns16550reg.h>
-#include <dev/ic/espreg.h>
+#ifdef COM_HAYESP
+#include <dev/ic/hayespreg.h>
+#endif
#define com_lcr com_cfcr
-#define COM_IBUFSIZE (2 * 256)
+#define COM_IBUFSIZE (2 * 512)
#define COM_IHIGHWATER ((3 * COM_IBUFSIZE) / 4)
struct com_softc {
int sc_errors;
int sc_iobase;
- int sc_espbase;
+#ifdef COM_HAYESP
+ int sc_hayespbase;
+#endif
u_char sc_hwflags;
#define COM_HW_NOIEN 0x01
#define COM_HW_FIFO 0x02
-#define COM_HW_ESP 0x04
+#define COM_HW_HAYESP 0x04
#define COM_HW_CONSOLE 0x40
u_char sc_swflags;
#define COM_SW_SOFTCAR 0x01
return 1;
}
+#ifdef COM_HAYESP
int
-comprobe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
+comprobeHAYESP(iobase, sc)
+ int iobase;
+ struct com_softc *sc;
{
- struct isa_attach_args *ia = aux;
- int iobase = ia->ia_iobase;
+ char val, dips;
+ int combaselist[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
- if (!comprobe1(iobase))
- return 0;
+ /*
+ * Hayes ESP cards have two iobases. One is for compatibility with
+ * 16550 serial chips, and at the same ISA PC base addresses. The
+ * other is for ESP-specific enhanced features, and lies at a
+ * different addressing range entirely (0x140, 0x180, 0x280, or 0x300).
+ */
- ia->ia_iosize = COM_NPORTS;
- ia->ia_msize = 0;
- return 1;
-}
+ /* Test for ESP signature */
+ if ((inb(iobase) & 0xf3) == 0)
+ return 0;
-int
-comprobeESP(esp_port, sc)
- int esp_port;
- struct com_softc *sc;
-{
- char val, dips;
- int com_base_list[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
+ /*
+ * ESP is present at ESP enhanced base address; unknown com port
+ */
- /* Test for ESP signature at the ESP i/o port. */
- if ((inb(esp_port) & 0xf3) == 0)
- return(0);
+ /* Get the dip-switch configurations */
+ outb(iobase + HAYESP_CMD1, HAYESP_GETDIPS);
+ dips = inb(iobase + HAYESP_STATUS1);
- /* Check compatibility mode settings */
- outb(esp_port + ESP_CMD1, ESP_GETDIPS);
- dips = inb(esp_port + ESP_STATUS1);
+ /* Determine which com port this ESP card services: bits 0,1 of */
+ /* dips is the port # (0-3); combaselist[val] is the com_iobase */
+ if (sc->sc_iobase != combaselist[dips & 0x03])
+ return 0;
- /* Does this ESP board service this com port?: Bits 0,1 == COM0..3 */
- if (sc->sc_iobase != com_base_list[(dips & 0x03)]) {
- return(0);
- }
printf(": ESP");
- /* Check ESP Self Test bits. */
+ /* Check ESP Self Test bits. */
/* Check for ESP version 2.0: bits 4,5,6 == 010 */
- outb(esp_port + ESP_CMD1, ESP_GETTEST);
- val = inb(esp_port + ESP_STATUS1); /* Always 0x00 */
- val = inb(esp_port + ESP_STATUS2);
+ outb(iobase + HAYESP_CMD1, HAYESP_GETTEST);
+ val = inb(iobase + HAYESP_STATUS1); /* Clear reg 1 */
+ val = inb(iobase + HAYESP_STATUS2);
if ((val & 0x70) < 0x20) {
printf("-old (%o)", val & 0x70);
- return(0);
+ /* we do not support the necessary features */
+ return 0;
}
- /* Check for ability to emulate 16550: bit 7 set */
- if (ISSET(dips, 0x80) == 0) {
+ /* Check for ability to emulate 16550: bit 8 == 1 */
+ if ((dips & 0x80) == 0) {
printf(" slave");
- return(0);
+ /* XXX Does slave really mean no 16550 support?? */
+ return 0;
}
- /* We're a full featured ESP card at the right com port. */
- SET(sc->sc_hwflags, COM_HW_ESP);
- printf(", 1024 byte fifo\n");
- return(1);
+ /*
+ * If we made it this far, we are a full-featured ESP v2.0 (or
+ * better), at the correct com port address.
+ */
+
+ SET(sc->sc_hwflags, COM_HW_HAYESP);
+ printf(", 1024k fifo\n");
+ return 1;
+}
+#endif
+
+int
+comprobe(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ struct isa_attach_args *ia = aux;
+ int iobase = ia->ia_iobase;
+
+ if (!comprobe1(iobase))
+ return 0;
+
+ ia->ia_iosize = COM_NPORTS;
+ ia->ia_msize = 0;
+ return 1;
}
void
struct cfdata *cf = sc->sc_dev.dv_cfdata;
int iobase = ia->ia_iobase;
struct tty *tp;
- int esp_ports[] = { 0x140, 0x180, 0x280, 0 };
- int *espp;
+#ifdef COM_HAYESP
+ int hayesp_ports[] = { 0x140, 0x180, 0x280, 0x300, 0 };
+ int *hayespp;
+#endif
sc->sc_iobase = iobase;
sc->sc_hwflags = ISSET(cf->cf_flags, COM_HW_NOIEN);
if (sc->sc_dev.dv_unit == comconsole)
delay(1000);
+#ifdef COM_HAYESP
/* Look for a Hayes ESP board. */
- for (espp = esp_ports; *espp != 0; espp++)
- if (comprobeESP(*espp, sc)) {
- sc->sc_espbase = *espp;
+ for (hayespp = hayesp_ports; *hayespp != 0; hayespp++)
+ if (comprobeHAYESP(*hayespp, sc)) {
+ sc->sc_hayespbase = *hayespp;
break;
}
/* No ESP; look for other things. */
- if (*espp == 0) {
- /* look for a NS 16550AF UART with FIFOs */
- outb(iobase + com_fifo,
- FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER_14);
- delay(100);
- if (ISSET(inb(iobase + com_iir), IIR_FIFO_MASK) == IIR_FIFO_MASK)
- if (ISSET(inb(iobase + com_fifo), FIFO_TRIGGER_14) ==
- FIFO_TRIGGER_14) {
- SET(sc->sc_hwflags, COM_HW_FIFO);
- printf(": ns16550a, working fifo\n");
- } else
- printf(": ns16550, broken fifo\n");
- else
- printf(": ns8250 or ns16450, no fifo\n");
- outb(iobase + com_fifo, 0);
+ if (*hayespp == 0) {
+#endif
+
+ /* look for a NS 16550AF UART with FIFOs */
+ outb(iobase + com_fifo,
+ FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER_14);
+ delay(100);
+ if (ISSET(inb(iobase + com_iir), IIR_FIFO_MASK) == IIR_FIFO_MASK)
+ if (ISSET(inb(iobase + com_fifo), FIFO_TRIGGER_14) == FIFO_TRIGGER_14) {
+ SET(sc->sc_hwflags, COM_HW_FIFO);
+ printf(": ns16550a, working fifo\n");
+ } else
+ printf(": ns16550, broken fifo\n");
+ else
+ printf(": ns8250 or ns16450, no fifo\n");
+ outb(iobase + com_fifo, 0);
+#ifdef COM_HAYESP
}
+#endif
/* disable interrupts */
outb(iobase + com_ier, 0);
sc->sc_ibufend = sc->sc_ibuf + COM_IBUFSIZE;
iobase = sc->sc_iobase;
+#ifdef COM_HAYESP
+ /* Setup the ESP board */
+ if (ISSET(sc->sc_hwflags, COM_HW_HAYESP)) {
+ int hayespbase = sc->sc_hayespbase;
- /* Set up the ESP board */
- if (ISSET(sc->sc_hwflags, COM_HW_ESP)) {
outb(iobase + com_fifo,
- /* XXX - bug in ESP requires DMA flag set */
- FIFO_DMA_MODE |
- FIFO_ENABLE | FIFO_RCV_RST |
- FIFO_XMT_RST | FIFO_TRIGGER_8);
+ FIFO_DMA_MODE|FIFO_ENABLE|
+ FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_8);
/* Set 16550 compatibility mode */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETMODE);
- outb(sc->sc_espbase + ESP_CMD2,
- ESP_MODE_FIFO | ESP_MODE_RTS | ESP_MODE_SCALE);
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETMODE);
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_MODE_FIFO|HAYESP_MODE_RTS|
+ HAYESP_MODE_SCALE);
/* Set RTS/CTS flow control */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETFLOWTYPE);
- outb(sc->sc_espbase + ESP_CMD2, ESP_FLOW_RTS);
- outb(sc->sc_espbase + ESP_CMD2, ESP_FLOW_CTS);
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETFLOWTYPE);
+ outb(hayespbase + HAYESP_CMD2, HAYESP_FLOW_RTS);
+ outb(hayespbase + HAYESP_CMD2, HAYESP_FLOW_CTS);
/* Set flow control levels */
- outb(sc->sc_espbase + ESP_CMD1, ESP_SETRXFLOW);
- outb(sc->sc_espbase + ESP_CMD2, HIBYTE(RXHIGHWATER));
- outb(sc->sc_espbase + ESP_CMD2, LOBYTE(RXHIGHWATER));
- outb(sc->sc_espbase + ESP_CMD2, HIBYTE(RXLOWWATER));
- outb(sc->sc_espbase + ESP_CMD2, LOBYTE(RXLOWWATER));
- } else if (ISSET(sc->sc_hwflags, COM_HW_FIFO))
+ outb(hayespbase + HAYESP_CMD1, HAYESP_SETRXFLOW);
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_HIBYTE(HAYESP_RXHIWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_LOBYTE(HAYESP_RXHIWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_HIBYTE(HAYESP_RXLOWMARK));
+ outb(hayespbase + HAYESP_CMD2,
+ HAYESP_LOBYTE(HAYESP_RXLOWMARK));
+ } else
+#endif
+ if (ISSET(sc->sc_hwflags, COM_HW_FIFO))
/* Set the FIFO threshold based on the receive speed. */
outb(iobase + com_fifo,
FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST |
selwakeup(&tp->t_wsel);
}
SET(tp->t_state, TS_BUSY);
- if (ISSET(sc->sc_hwflags, COM_HW_ESP)) {
+
+#ifdef COM_HAYESP
+ if (ISSET(sc->sc_hwflags, COM_HW_HAYESP)) {
u_char buffer[1024], *cp = buffer;
int n = q_to_b(&tp->t_outq, cp, sizeof buffer);
- do {
+ do
outb(iobase + com_data, *cp++);
- } while (--n);
- } else if (ISSET(sc->sc_hwflags, COM_HW_FIFO)) {
+ while (--n);
+ }
+ else
+#endif
+ if (ISSET(sc->sc_hwflags, COM_HW_FIFO)) {
u_char buffer[16], *cp = buffer;
int n = q_to_b(&tp->t_outq, cp, sizeof buffer);
do {
-/* $NetBSD: comreg.h,v 1.7 1995/10/15 19:43:07 mycroft Exp $ */
+/* $OpenBSD: comreg.h,v 1.4 1996/03/08 16:42:52 niklas Exp $ */
+/* $NetBSD: comreg.h,v 1.8 1996/02/05 23:01:50 scottr Exp $ */
/*-
* Copyright (c) 1991 The Regents of the University of California.
#define COM_TOLERANCE 30 /* baud rate tolerance, in 0.1% units */
/* interrupt enable register */
-#define IER_ERXRDY 0x1 /* Character received */
-#define IER_ETXRDY 0x2 /* Transmitter empty */
-#define IER_ERLS 0x4 /* Error condition */
-#define IER_EMSC 0x8 /* RS-232 line state change */
+#define IER_ERXRDY 0x1 /* Enable receiver interrupt */
+#define IER_ETXRDY 0x2 /* Enable transmitter empty interrupt */
+#define IER_ERLS 0x4 /* Enable line status interrupt */
+#define IER_EMSC 0x8 /* Enable modem status interrupt */
/* interrupt identification register */
#define IIR_IMASK 0xf
#define IIR_RXTOUT 0xc
-#define IIR_RLS 0x6
-#define IIR_RXRDY 0x4
-#define IIR_TXRDY 0x2
+#define IIR_RLS 0x6 /* Line status change */
+#define IIR_RXRDY 0x4 /* Receiver ready */
+#define IIR_TXRDY 0x2 /* Transmitter ready */
+#define IIR_MLSC 0x0 /* Modem status */
#define IIR_NOPEND 0x1 /* No pending interrupts */
-#define IIR_MLSC 0x0
#define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */
/* fifo control register */
#define FIFO_ENABLE 0x01 /* Turn the FIFO on */
#define FIFO_RCV_RST 0x02 /* Reset RX FIFO */
#define FIFO_XMT_RST 0x04 /* Reset TX FIFO */
-#define FIFO_DMA_MODE 0x08 /* DMA mode? */
-#define FIFO_TRIGGER_1 0x00 /* Trigger RXRDY Interrupt on 1 character */
+#define FIFO_DMA_MODE 0x08
+#define FIFO_TRIGGER_1 0x00 /* Trigger RXRDY intr on 1 character */
#define FIFO_TRIGGER_4 0x40 /* ibid 4 */
#define FIFO_TRIGGER_8 0x80 /* ibid 8 */
#define FIFO_TRIGGER_14 0xc0 /* ibid 14 */
/* modem control register */
#define MCR_LOOPBACK 0x10 /* Loop test: echos from TX to RX */
-#define MCR_IENABLE 0x08 /* Output 2: enables UART interrupts */
-#define MCR_DRS 0x04 /* Output 1: resets some internal modems */
-#define MCR_RTS 0x02 /* RTS: ready to receive data */
+#define MCR_IENABLE 0x08 /* Out2: enables UART interrupts */
+#define MCR_DRS 0x04 /* Out1: resets some internal modems */
+#define MCR_RTS 0x02 /* Request To Send */
#define MCR_DTR 0x01 /* Data Terminal Ready */
/* line status register */
-/* $NetBSD: cs4231var.h,v 1.1 1995/07/07 02:11:57 brezak Exp $ */
-/*
- * Copyright (c) 1995 John T. Kohl
- * All rights reserved.
+/* $OpenBSD: cs4231var.h,v 1.2 1996/03/08 16:42:53 niklas Exp $ */
+/* $NetBSD: cs4231var.h,v 1.2 1996/02/05 02:21:51 jtc Exp $ */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ken Hornstein and John Kohl.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
/*
-/* $NetBSD: gus.c,v 1.3 1995/11/10 04:30:44 mycroft Exp $ */
+/* $OpenBSD: gus.c,v 1.5 1996/03/08 16:42:54 niklas Exp $ */
+/* $NetBSD: gus.c,v 1.7 1996/02/16 08:18:37 mycroft Exp $ */
-/*
- * Copyright (c) 1994, 1995 Ken Hornstein. All rights reserved.
- * Copyright (c) 1995 John T. Kohl. All rights reserved.
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ken Hornstein and John Kohl.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by Ken Hornstein.
- * 4. The name of the authors may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
/*
int gusopen __P((dev_t, int));
void gusclose __P((void *));
void gusmax_close __P((void *));
-int gusprobe ()/*__P((struct device *, struct device *, void *))*/;
-void gusattach __P((struct device *, struct device *, void *));
int gusintr __P((void *));
int gus_set_in_gain __P((caddr_t, u_int, u_char));
int gus_get_in_gain __P((caddr_t));
* ISA bus driver routines
*/
+int gusprobe __P((struct device *, void *, void *));
+void gusattach __P((struct device *, struct device *, void *));
+
struct cfdriver guscd = {
NULL, "gus", gusprobe, gusattach, DV_DULL, sizeof(struct gus_softc)
};
int
-gusprobe(parent, self, aux)
+gusprobe(parent, match, aux)
struct device *parent, *self;
- void *aux;
+ void *match, *aux;
{
- register struct gus_softc *sc = (void *) self;
+ register struct gus_softc *sc = match;
register struct isa_attach_args *ia = aux;
struct cfdata *cf = sc->sc_dev.dv_cfdata;
register int iobase = ia->ia_iobase;
-/* $NetBSD: gusreg.h,v 1.1 1995/07/19 19:58:47 brezak Exp $ */
+/* $OpenBSD: gusreg.h,v 1.2 1996/03/08 16:42:56 niklas Exp $ */
+/* $NetBSD: gusreg.h,v 1.3 1996/02/05 02:22:10 jtc Exp $ */
+
/*-
- * Copyright (c) 1995 John T. Kohl. All Rights Reserved.
- * Copyright (c) 1994 The Regents of the University of California.
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
* All rights reserved.
*
- * This code is derived from software contributed to Berkeley by
- * Ken Hornstein.
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ken Hornstein and John Kohl.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * $Id: gusreg.h,v 1.1.1.1 1995/10/18 08:52:34 deraadt Exp $
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
/*
-/* $NetBSD: ics2101.c,v 1.1 1995/07/19 19:58:49 brezak Exp $ */
+/* $OpenBSD: ics2101.c,v 1.2 1996/03/08 16:42:57 niklas Exp $ */
+/* $NetBSD: ics2101.c,v 1.3 1996/02/05 02:22:11 jtc Exp $ */
+
/*-
- * Copyright (c) 1995 John T. Kohl. All Rights Reserved.
- * Copyright (c) 1994 The Regents of the University of California.
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
* All rights reserved.
*
- * This code is derived from software contributed to Berkeley by
- * Ken Hornstein.
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ken Hornstein and John Kohl.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: ics2101.c,v 1.1.1.1 1995/10/18 08:52:34 deraadt Exp $
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
-/* $NetBSD: ics2101var.h,v 1.1 1995/07/19 19:58:50 brezak Exp $ */
-/*
- * Copyright (c) 1994, 1995 Ken Hornstein. All rights reserved.
- * Copyright (c) 1995 John T. Kohl. All rights reserved.
+/* $OpenBSD: ics2101var.h,v 1.2 1996/03/08 16:42:58 niklas Exp $ */
+/* $NetBSD: ics2101var.h,v 1.3 1996/02/05 02:22:12 jtc Exp $ */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ken Hornstein and John Kohl.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by Ken Hornstein.
- * 4. The name of the authors may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * $Id: ics2101var.h,v 1.1.1.1 1995/10/18 08:52:34 deraadt Exp $
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#define ICSMIX_LEFT 0 /* Value for left channel */
-/* $NetBSD: if_ed.c,v 1.85 1995/07/25 05:11:11 mycroft Exp $ */
+/* $OpenBSD: if_ed.c,v 1.6 1996/03/08 16:42:59 niklas Exp $ */
+/* $NetBSD: if_ed.c,v 1.87 1996/01/10 16:49:25 chuck Exp $ */
/*
* Device driver for National Semiconductor DS8390/WD83C690 based ethernet
#include <dev/isa/isareg.h>
#include <dev/isa/isavar.h>
#include <i386/isa/isa_machdep.h> /* XXX USES ISA HOLE DIRECTLY */
+#define ED_BYTE_ORDER LITTLE_ENDIAN
#include <dev/ic/dp8390reg.h>
#include <dev/isa/if_edreg.h>
-/* $NetBSD: if_edreg.h,v 1.14 1995/04/11 04:46:22 mycroft Exp $ */
+/* $OpenBSD: if_edreg.h,v 1.3 1996/03/08 16:43:00 niklas Exp $ */
+/* $NetBSD: if_edreg.h,v 1.15 1996/01/10 16:49:22 chuck Exp $ */
/*
* National Semiconductor DS8390 NIC register definitions.
-/* $NetBSD: if_el.c,v 1.33 1995/08/05 23:53:18 mycroft Exp $ */
+/* $OpenBSD: if_el.c,v 1.4 1996/03/08 16:43:01 niklas Exp $ */
+/* $NetBSD: if_el.c,v 1.34 1995/12/24 02:31:25 mycroft Exp $ */
/*
* Copyright (c) 1994, Matthew E. Kimmel. Permission is hereby granted
-/* $NetBSD: if_ep.c,v 1.85 1995/12/05 03:30:15 christos Exp $ */
+/* $OpenBSD: if_ep.c,v 1.7 1996/03/08 16:43:02 niklas Exp $ */
+/* $NetBSD: if_ep.c,v 1.86 1995/12/24 02:31:27 mycroft Exp $ */
/*
* Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca>
*/
for (i = 0; i < 3; i++) {
u_short x;
- if (epbusyeeprom(sc)) {
+ if (epbusyeeprom(sc))
return;
- }
outw(BASE + EP_W0_EEPROM_COMMAND, READ_EEPROM | i);
if (epbusyeeprom(sc))
return;
-/* $NetBSD: if_hp.c,v 1.20 1995/04/17 12:09:01 cgd Exp $ */
+/* $OpenBSD: if_hp.c,v 1.3 1996/03/08 16:43:03 niklas Exp $ */
+/* $NetBSD: if_hp.c,v 1.21 1995/12/24 02:31:31 mycroft Exp $ */
/* XXX THIS DRIVER IS BROKEN. IT WILL NOT EVEN COMPILE. */
-/* $NetBSD: if_ie.c,v 1.44 1995/09/26 13:24:48 hpeyerl Exp $ */
+/* $OpenBSD: if_ie.c,v 1.4 1996/03/08 16:43:04 niklas Exp $ */
+/* $NetBSD: if_ie.c,v 1.45 1995/12/24 02:31:33 mycroft Exp $ */
/*-
* Copyright (c) 1993, 1994, 1995 Charles Hannum.
-/* $NetBSD: if_le.c,v 1.37 1995/11/25 01:24:00 cgd Exp $ */
+/* $OpenBSD: if_le.c,v 1.5 1996/03/08 16:43:05 niklas Exp $ */
+/* $NetBSD: if_le.c,v 1.38 1995/12/24 02:31:35 mycroft Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
-/* $OpenBSD: isa.c,v 1.3 1996/02/27 10:31:32 niklas Exp $ */
-/* $NetBSD: isa.c,v 1.74 1995/06/07 06:46:04 cgd Exp $ */
+/* $OpenBSD: isa.c,v 1.4 1996/03/08 16:43:06 niklas Exp $ */
+/* $NetBSD: isa.c,v 1.76 1996/01/16 07:52:38 mycroft Exp $ */
/*-
* Copyright (c) 1993, 1994 Charles Hannum. All rights reserved.
struct isa_attach_args ia;
if (cf->cf_fstate == FSTATE_STAR)
- panic("not bloody likely");
+ panic("clone devices not supported on ISA bus");
ia.ia_iobase = cf->cf_loc[0];
ia.ia_iosize = 0x666;
-/* $NetBSD: isavar.h,v 1.16 1995/06/07 06:45:44 cgd Exp $ */
+/* $OpenBSD: isavar.h,v 1.4 1996/03/08 16:43:07 niklas Exp $ */
+/* $NetBSD: isavar.h,v 1.17 1995/12/24 02:31:38 mycroft Exp $ */
/*
* Copyright (c) 1995 Chris G. Demetriou
-/* $NetBSD: lpt.c,v 1.30 1995/04/17 12:09:17 cgd Exp $ */
+/* $OpenBSD: lpt.c,v 1.5 1996/03/08 16:43:08 niklas Exp $ */
+/* $NetBSD: lpt.c,v 1.31 1995/12/24 02:31:40 mycroft Exp $ */
/*
* Copyright (c) 1993, 1994 Charles Hannum.
-/* $NetBSD: mcd.c,v 1.44 1996/01/07 22:03:37 thorpej Exp $ */
+/* $OpenBSD: mcd.c,v 1.6 1996/03/08 16:43:09 niklas Exp $ */
+/* $NetBSD: mcd.c,v 1.45 1996/01/30 18:28:05 thorpej Exp $ */
/*
* Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved.
return EINVAL;
case CDIOCSTOP:
return mcd_stop(sc);
- case CDIOCEJECT:
+ case CDIOCEJECT: /* FALLTHROUGH */
+ case DIOCEJECT:
return mcd_eject(sc);
case CDIOCALLOW:
return mcd_setlock(sc, MCD_LK_UNLOCK);
case CDIOCPREVENT:
return mcd_setlock(sc, MCD_LK_LOCK);
+ case DIOCLOCK:
+ return mcd_setlock(sc,
+ (*(int *)addr) ? MCD_LK_LOCK : MCD_LK_UNLOCK);
case CDIOCSETDEBUG:
sc->debug = 1;
return 0;
-/* $NetBSD: pas.c,v 1.10 1995/11/10 05:05:18 mycroft Exp $ */
+/* $OpenBSD: pas.c,v 1.5 1996/03/08 16:43:10 niklas Exp $ */
+/* $NetBSD: pas.c,v 1.12 1996/02/16 08:18:34 mycroft Exp $ */
/*
* Copyright (c) 1991-1993 Regents of the University of California.
};
int pasopen __P((dev_t, int));
-
-int pasprobe();
-void pasattach();
-
int pas_getdev __P((void *, struct audio_device *));
paswrite(P_M_MV508_INPUTMIX | 30, PARALLEL_MIXER);
}
+int pasprobe __P((struct device *, void *, void *));
+void pasattach __P((struct device *, struct device *, void *));
+
struct cfdriver pascd = {
NULL, "pas", pasprobe, pasattach, DV_DULL, sizeof(struct pas_softc)
};
* Probe for the soundblaster hardware.
*/
int
-pasprobe(parent, self, aux)
- struct device *parent, *self;
- void *aux;
+pasprobe(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct pas_softc *sc = (void *)self;
+ register struct pas_softc *sc = match;
register struct isa_attach_args *ia = aux;
register int iobase;
u_char id, t;
-/* $NetBSD: pss.c,v 1.10 1995/11/10 04:30:49 mycroft Exp $ */
+/* $OpenBSD: pss.c,v 1.5 1996/03/08 16:43:11 niklas Exp $ */
+/* $NetBSD: pss.c,v 1.11 1995/12/24 02:31:45 mycroft Exp $ */
/*
* Copyright (c) 1994 John Brezak
-/* $NetBSD: rtfps.c,v 1.13 1995/06/26 04:12:01 cgd Exp $ */
+/* $OpenBSD: rtfps.c,v 1.4 1996/03/08 16:43:12 niklas Exp $ */
+/* $NetBSD: rtfps.c,v 1.14 1995/12/24 02:31:48 mycroft Exp $ */
/*
* Copyright (c) 1995 Charles Hannum. All rights reserved.
-/* $NetBSD: sb.c,v 1.28 1995/11/10 05:01:05 mycroft Exp $ */
+/* $OpenBSD: sb.c,v 1.5 1996/03/08 16:43:13 niklas Exp $ */
+/* $NetBSD: sb.c,v 1.30 1996/02/16 08:18:32 mycroft Exp $ */
/*
* Copyright (c) 1991-1993 Regents of the University of California.
struct sbdsp_softc sc_sbdsp;
};
-int sbprobe();
+int sbprobe __P((struct device *, void *, void *));
void sbattach __P((struct device *, struct device *, void *));
struct cfdriver sbcd = {
};
int sbopen __P((dev_t, int));
-
-int sbprobe();
-void sbattach();
-
int sb_getdev __P((void *, struct audio_device *));
/*
* Probe for the soundblaster hardware.
*/
int
-sbprobe(parent, self, aux)
- struct device *parent, *self;
- void *aux;
+sbprobe(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct sbdsp_softc *sc = (void *)self;
+ register struct sbdsp_softc *sc = match;
register struct isa_attach_args *ia = aux;
register int iobase = ia->ia_iobase;
static u_char drq_conf[4] = {
-/* $NetBSD: sbdsp.c,v 1.14 1995/11/10 05:01:06 mycroft Exp $ */
+/* $OpenBSD: sbdsp.c,v 1.3 1996/03/08 16:43:14 niklas Exp $ */
+/* $NetBSD: sbdsp.c,v 1.16 1996/02/16 10:10:21 mycroft Exp $ */
/*
* Copyright (c) 1991-1993 Regents of the University of California.
int wmidi;
} sberr;
+/*
+ * Time constant routines follow. See SBK, section 12.
+ * Although they don't come out and say it (in the docs),
+ * the card clearly uses a 1MHz countdown timer, as the
+ * low-speed formula (p. 12-4) is:
+ * tc = 256 - 10^6 / sr
+ * In high-speed mode, the constant is the upper byte of a 16-bit counter,
+ * and a 256MHz clock is used:
+ * tc = 65536 - 256 * 10^ 6 / sr
+ * Since we can only use the upper byte of the HS TC, the two formulae
+ * are equivalent. (Why didn't they say so?) E.g.,
+ * (65536 - 256 * 10 ^ 6 / x) >> 8 = 256 - 10^6 / x
+ *
+ * The crossover point (from low- to high-speed modes) is different
+ * for the SBPRO and SB20. The table on p. 12-5 gives the following data:
+ *
+ * SBPRO SB20
+ * ----- --------
+ * input ls min 4 KHz 4 KHz
+ * input ls max 23 KHz 13 KHz
+ * input hs max 44.1 KHz 15 KHz
+ * output ls min 4 KHz 4 KHz
+ * output ls max 23 KHz 23 KHz
+ * output hs max 44.1 KHz 44.1 KHz
+ */
+#define SB_LS_MIN 0x06 /* 4000 Hz */
+#define SB_8K 0x83 /* 8000 Hz */
+#define SBPRO_ADC_LS_MAX 0xd4 /* 22727 Hz */
+#define SBPRO_ADC_HS_MAX 0xea /* 45454 Hz */
+#define SBCLA_ADC_LS_MAX 0xb3 /* 12987 Hz */
+#define SBCLA_ADC_HS_MAX 0xbd /* 14925 Hz */
+#define SB_DAC_LS_MAX 0xd4 /* 22727 Hz */
+#define SB_DAC_HS_MAX 0xea /* 45454 Hz */
+
#ifdef AUDIO_DEBUG
void
sb_printsc(struct sbdsp_softc *sc)
{
int i;
- printf("open %d dmachan %d iobase %x locked %d\n", sc->sc_open, sc->sc_drq,
- sc->sc_iobase, sc->sc_locked);
- printf("hispeed %d irate %d orate %d encoding %x\n",
- sc->sc_adacmode, sc->sc_irate, sc->sc_orate, sc->encoding);
+ printf("open %d dmachan %d iobase %x\n",
+ sc->sc_open, sc->sc_drq, sc->sc_iobase);
+ printf("itc %d imode %d otc %d omode %d encoding %x\n",
+ sc->sc_itc, sc->sc_imode, sc->sc_otc, sc->sc_omode, sc->encoding);
printf("outport %d inport %d spkron %d nintr %d\n",
- sc->out_port, sc->in_port, sc->spkr_state, sc->sc_interrupts);
- printf("tc %x chans %x scintr %x arg %x\n", sc->sc_adactc, sc->sc_chans,
- sc->sc_intr, sc->sc_arg);
+ sc->out_port, sc->in_port, sc->spkr_state, sc->sc_interrupts);
+ printf("chans %x intr %x arg %x\n",
+ sc->sc_chans, sc->sc_intr, sc->sc_arg);
printf("gain: ");
for (i = 0; i < SB_NDEVS; i++)
- printf("%d ", sc->gain[i]);
+ printf("%d ", sc->gain[i]);
printf("\n");
}
#endif
{
register int iobase = sc->sc_iobase;
- sc->sc_locked = 0;
-
/* Set defaults */
if (ISSBPROCLASS(sc))
- sc->sc_irate = sc->sc_orate = 45454;
+ sc->sc_itc = sc->sc_otc = SBPRO_ADC_HS_MAX;
else
- sc->sc_irate = sc->sc_orate = 14925;
+ sc->sc_itc = sc->sc_otc = SBCLA_ADC_HS_MAX;
sc->sc_chans = 1;
sc->encoding = AUDIO_ENCODING_LINEAR;
- (void) sbdsp_set_in_sr_real(sc, sc->sc_irate);
- (void) sbdsp_set_out_sr_real(sc, sc->sc_orate);
-
(void) sbdsp_set_in_port(sc, SB_MIC_PORT);
(void) sbdsp_set_out_port(sc, SB_SPEAKER);
sbdsp_mix_write(sc, SBP_LINE_VOL,
sbdsp_stereo_vol(SBP_MAXVOL, SBP_MAXVOL));
for (i = 0; i < SB_NDEVS; i++)
- sc->gain[i] = sbdsp_stereo_vol(SBP_MAXVOL, SBP_MAXVOL);
+ sc->gain[i] = sbdsp_stereo_vol(SBP_MAXVOL, SBP_MAXVOL);
}
+
printf(": dsp v%d.%02d\n",
SBVER_MAJOR(sc->sc_model), SBVER_MINOR(sc->sc_model));
}
{
register struct sbdsp_softc *sc = addr;
- sc->sc_irate = sr;
-
- return 0;
-}
-
-int
-sbdsp_set_in_sr_real(addr, sr)
- void *addr;
- u_long sr;
-{
- register struct sbdsp_softc *sc = addr;
- int rval;
-
- if (rval = sbdsp_set_sr(sc, &sr, SB_INPUT_RATE))
- return rval;
- sc->sc_irate = sr;
- sc->sc_dmain_inprogress = 0; /* do it again on next DMA out */
- sc->sc_dmaout_inprogress = 0;
- return(0);
+ return (sbdsp_srtotc(sc, sr, SB_INPUT_RATE, &sc->sc_itc, &sc->sc_imode));
}
u_long
{
register struct sbdsp_softc *sc = addr;
- return(sc->sc_irate);
+ return (sbdsp_tctosr(sc, sc->sc_itc));
}
int
{
register struct sbdsp_softc *sc = addr;
- sc->sc_orate = sr;
- return(0);
-}
-
-int
-sbdsp_set_out_sr_real(addr, sr)
- void *addr;
- u_long sr;
-{
- register struct sbdsp_softc *sc = addr;
- int rval;
-
- if (rval = sbdsp_set_sr(sc, &sr, SB_OUTPUT_RATE))
- return rval;
- sc->sc_orate = sr;
- sc->sc_dmain_inprogress = 0; /* do it again on next DMA out */
- return(0);
+ return (sbdsp_srtotc(sc, sr, SB_OUTPUT_RATE, &sc->sc_otc, &sc->sc_omode));
}
u_long
{
register struct sbdsp_softc *sc = addr;
- return(sc->sc_orate);
+ return (sbdsp_tctosr(sc, sc->sc_otc));
}
int
sbdsp_query_encoding(addr, fp)
- void *addr;
- struct audio_encoding *fp;
+ void *addr;
+ struct audio_encoding *fp;
{
- register struct sbdsp_softc *sc = addr;
+ register struct sbdsp_softc *sc = addr;
- switch (fp->index) {
- case 0:
- strcpy(fp->name, AudioEmulaw);
- fp->format_id = AUDIO_ENCODING_ULAW;
- break;
- case 1:
- strcpy(fp->name, AudioEpcm16);
- fp->format_id = AUDIO_ENCODING_PCM16;
- break;
- default:
- return(EINVAL);
- /*NOTREACHED*/
- }
- return (0);
+ switch (fp->index) {
+ case 0:
+ strcpy(fp->name, AudioEmulaw);
+ fp->format_id = AUDIO_ENCODING_ULAW;
+ break;
+ case 1:
+ strcpy(fp->name, AudioEpcm16);
+ fp->format_id = AUDIO_ENCODING_PCM16;
+ break;
+ default:
+ return (EINVAL);
+ }
+ return (0);
}
int
{
register struct sbdsp_softc *sc = addr;
- return(sc->encoding);
+ return (sc->encoding);
}
int
{
if (prec != 8)
- return(EINVAL);
- return(0);
+ return (EINVAL);
+ return (0);
}
int
sbdsp_get_precision(addr)
void *addr;
{
- return(8);
+ return (8);
}
int
int chans;
{
register struct sbdsp_softc *sc = addr;
- int rval;
if (ISSBPROCLASS(sc)) {
if (chans != 1 && chans != 2)
- return(EINVAL);
-
+ return (EINVAL);
sc->sc_chans = chans;
+
+#if 0
if (rval = sbdsp_set_in_sr_real(addr, sc->sc_irate))
- return rval;
+ return rval;
+#endif
+
sbdsp_mix_write(sc, SBP_STEREO,
(sbdsp_mix_read(sc, SBP_STEREO) & ~SBP_PLAYMODE_MASK) |
(chans == 2 ? SBP_PLAYMODE_STEREO : SBP_PLAYMODE_MONO));
/* recording channels needs to be done right when we start
DMA recording. Just record number of channels for now
and set stereo when ready. */
- }
- else {
+ } else {
if (chans != 1)
- return(EINVAL);
- sc->sc_chans = 1;
+ return (EINVAL);
+ sc->sc_chans = chans;
}
- return(0);
+ return (0);
}
int
#if 0
/* recording stereo may frob the mixer output */
if (ISSBPROCLASS(sc)) {
- if ((sbdsp_mix_read(sc, SBP_STEREO) & SBP_PLAYMODE_MASK) == SBP_PLAYMODE_STEREO) {
+ if ((sbdsp_mix_read(sc, SBP_STEREO) & SBP_PLAYMODE_MASK) == SBP_PLAYMODE_STEREO)
sc->sc_chans = 2;
- }
- else {
+ else
sc->sc_chans = 1;
- }
- }
- else {
+ } else
sc->sc_chans = 1;
- }
#endif
- return(sc->sc_chans);
+ return (sc->sc_chans);
}
int
sc->out_port = port; /* Just record it */
- return(0);
+ return (0);
}
int
{
register struct sbdsp_softc *sc = addr;
- return(sc->out_port);
+ return (sc->out_port);
}
int mixport, sbport;
if (ISSBPROCLASS(sc)) {
- switch (port) {
- case SB_MIC_PORT:
- sbport = SBP_FROM_MIC;
- mixport = SBP_MIC_VOL;
- break;
- case SB_LINE_IN_PORT:
- sbport = SBP_FROM_LINE;
- mixport = SBP_LINE_VOL;
- break;
- case SB_CD_PORT:
- sbport = SBP_FROM_CD;
- mixport = SBP_CD_VOL;
- break;
- case SB_DAC_PORT:
- case SB_FM_PORT:
- default:
- return(EINVAL);
- /*NOTREACHED*/
- }
- }
- else {
- switch (port) {
- case SB_MIC_PORT:
- sbport = SBP_FROM_MIC;
- mixport = SBP_MIC_VOL;
- break;
- default:
- return(EINVAL);
- /*NOTREACHED*/
- }
+ switch (port) {
+ case SB_MIC_PORT:
+ sbport = SBP_FROM_MIC;
+ mixport = SBP_MIC_VOL;
+ break;
+ case SB_LINE_IN_PORT:
+ sbport = SBP_FROM_LINE;
+ mixport = SBP_LINE_VOL;
+ break;
+ case SB_CD_PORT:
+ sbport = SBP_FROM_CD;
+ mixport = SBP_CD_VOL;
+ break;
+ case SB_DAC_PORT:
+ case SB_FM_PORT:
+ default:
+ return (EINVAL);
+ }
+ } else {
+ switch (port) {
+ case SB_MIC_PORT:
+ sbport = SBP_FROM_MIC;
+ mixport = SBP_MIC_VOL;
+ break;
+ default:
+ return (EINVAL);
+ }
}
sc->in_port = port; /* Just record it */
sc->gain[port] = sbdsp_mix_read(sc, mixport);
}
- return(0);
+ return (0);
}
int
{
register struct sbdsp_softc *sc = addr;
- return(sc->in_port);
+ return (sc->in_port);
}
{
register struct sbdsp_softc *sc = addr;
- sc->sc_last_hsr_size = sc->sc_last_hsw_size = 0;
+ sc->sc_last_hs_size = 0;
/* Higher speeds need bigger blocks to avoid popping and silence gaps. */
- if ((sc->sc_orate > 8000 || sc->sc_irate > 8000) &&
+ if ((sc->sc_otc > SB_8K || sc->sc_itc > SB_8K) &&
(blk > NBPG/2 || blk < NBPG/4))
blk = NBPG/2;
/* don't try to DMA too much at once, though. */
- if (blk > NBPG) blk = NBPG;
+ if (blk > NBPG)
+ blk = NBPG;
if (sc->sc_chans == 2)
return (blk & ~1); /* must be even to preserve stereo separation */
else
- return(blk); /* Anything goes :-) */
+ return (blk); /* Anything goes :-) */
}
int
sbdsp_commit_settings(addr)
void *addr;
{
+ register struct sbdsp_softc *sc = addr;
+
/* due to potentially unfortunate ordering in the above layers,
re-do a few sets which may be important--input gains
(adjust the proper channels), number of input channels (hit the
record rate and set mode) */
- register struct sbdsp_softc *sc = addr;
-
- sbdsp_set_out_sr_real(addr, sc->sc_orate);
- sbdsp_set_in_sr_real(addr, sc->sc_irate);
+ /*
+ * XXX
+ * Should wait for chip to be idle.
+ */
+ sc->sc_dmadir = SB_DMA_NONE;
- sc->sc_last_hsw_size = sc->sc_last_hsr_size = 0;
- return(0);
+ return 0;
}
sc->sc_open = 1;
sc->sc_mintr = 0;
- sc->sc_intr = 0;
- sc->sc_arg = 0;
- sc->sc_locked = 0;
if (ISSBPROCLASS(sc) &&
sbdsp_wdsp(sc->sc_iobase, SB_DSP_RECORD_MONO) < 0) {
DPRINTF(("sbdsp_open: can't set mono mode\n"));
/* we'll readjust when it's time for DMA. */
}
- sc->sc_dmain_inprogress = 0;
- sc->sc_dmaout_inprogress = 0;
/*
* Leave most things as they were; users must change things if
sc->sc_open = 0;
sbdsp_spkroff(sc);
sc->spkr_state = SPKR_OFF;
- sc->sc_intr = 0;
sc->sc_mintr = 0;
- /* XXX this will turn off any dma */
- sbdsp_reset(sc);
+ sbdsp_haltdma(sc);
DPRINTF(("sbdsp_close: closed\n"));
}
{
register int iobase = sc->sc_iobase;
- /*
- * erase any memory of last transfer size.
- */
- sc->sc_last_hsr_size = sc->sc_last_hsw_size = 0;
+ sc->sc_intr = 0;
+ if (sc->sc_dmadir != SB_DMA_NONE) {
+ isa_dmaabort(sc->sc_drq);
+ sc->sc_dmadir = SB_DMA_NONE;
+ }
+ sc->sc_last_hs_size = 0;
+
/*
* See SBK, section 11.3.
* We pulse a reset signal into the card.
* Gee, what a brilliant hardware design.
*/
outb(iobase + SBP_DSP_RESET, 1);
- delay(3);
+ delay(10);
outb(iobase + SBP_DSP_RESET, 0);
+ delay(30);
if (sbdsp_rdsp(iobase) != SB_MAGIC)
return -1;
+
return 0;
}
register int i;
for (i = SBDSP_NPOLL; --i >= 0; ) {
- if ((inb(iobase + SBP_DSP_WSTAT) & SB_DSP_BUSY) != 0) {
- delay(10); continue;
- }
+ register u_char x;
+ x = inb(iobase + SBP_DSP_WSTAT);
+ delay(10);
+ if ((x & SB_DSP_BUSY) != 0)
+ continue;
outb(iobase + SBP_DSP_WRITE, v);
+ delay(10);
return 0;
}
++sberr.wdsp;
register int i;
for (i = SBDSP_NPOLL; --i >= 0; ) {
- if ((inb(iobase + SBP_DSP_RSTAT) & SB_DSP_READY) == 0)
+ register u_char x;
+ x = inb(iobase + SBP_DSP_RSTAT);
+ delay(10);
+ if ((x & SB_DSP_READY) == 0)
continue;
- return inb(iobase + SBP_DSP_READ);
+ x = inb(iobase + SBP_DSP_READ);
+ delay(10);
+ return x;
}
++sberr.rdsp;
return -1;
DPRINTF(("sbdsp_haltdma: sc=0x%x\n", sc));
- if (sc->sc_locked)
- sbdsp_reset(sc);
- else
- (void)sbdsp_wdsp(sc->sc_iobase, SB_DSP_HALT);
-
- isa_dmaabort(sc->sc_drq);
- sc->dmaaddr = 0;
- sc->dmacnt = 0;
- sc->sc_locked = 0;
- sc->dmaflags = 0;
- sc->sc_dmain_inprogress = sc->sc_dmaout_inprogress = 0;
- return(0);
+ sbdsp_reset(sc);
+ return 0;
}
int
return(0);
}
-/*
- * Time constant routines follow. See SBK, section 12.
- * Although they don't come out and say it (in the docs),
- * the card clearly uses a 1MHz countdown timer, as the
- * low-speed formula (p. 12-4) is:
- * tc = 256 - 10^6 / sr
- * In high-speed mode, the constant is the upper byte of a 16-bit counter,
- * and a 256MHz clock is used:
- * tc = 65536 - 256 * 10^ 6 / sr
- * Since we can only use the upper byte of the HS TC, the two formulae
- * are equivalent. (Why didn't they say so?) E.g.,
- * (65536 - 256 * 10 ^ 6 / x) >> 8 = 256 - 10^6 / x
- *
- * The crossover point (from low- to high-speed modes) is different
- * for the SBPRO and SB20. The table on p. 12-5 gives the following data:
- *
- * SBPRO SB20
- * ----- --------
- * input ls min 4 KHz 4 KHz
- * input ls max 23 KHz 13 KHz
- * input hs max 44.1 KHz 15 KHz
- * output ls min 4 KHz 4 KHz
- * output ls max 23 KHz 23 KHz
- * output hs max 44.1 KHz 44.1 KHz
- */
-#define SB_LS_MIN 0x06 /* 4000 Hz */
-#define SBPRO_ADC_LS_MAX 0xd4 /* 22727 Hz */
-#define SBPRO_ADC_HS_MAX 0xea /* 45454 Hz */
-#define SBCLA_ADC_LS_MAX 0xb3 /* 12987 Hz */
-#define SBCLA_ADC_HS_MAX 0xbd /* 14925 Hz */
-#define SB_DAC_LS_MAX 0xd4 /* 22727 Hz */
-#define SB_DAC_HS_MAX 0xea /* 45454 Hz */
-
/*
* Convert a linear sampling rate into the DAC time constant.
* Set *mode to indicate the high/low-speed DMA operation.
* so isdac indicates output, and !isdac indicates input.
*/
int
-sbdsp_srtotc(sc, sr, mode, isdac)
+sbdsp_srtotc(sc, sr, isdac, tcp, modep)
register struct sbdsp_softc *sc;
int sr;
- int *mode;
int isdac;
+ int *tcp, *modep;
{
- int adc_ls_max, adc_hs_max;
- register int tc;
+ int tc, mode;
if (sr == 0) {
- *mode = SB_ADAC_LS;
- return SB_LS_MIN;
+ tc = SB_LS_MIN;
+ mode = SB_ADAC_LS;
+ goto out;
}
- tc = 256 - 1000000 / sr;
+
+ tc = 256 - (1000000 / sr);
- /* XXX use better rounding--compare distance to nearest tc on both
- sides of requested speed */
- if (ISSBPROCLASS(sc)) {
- adc_ls_max = SBPRO_ADC_LS_MAX;
- adc_hs_max = SBPRO_ADC_HS_MAX;
- }
- else {
- adc_ls_max = SBCLA_ADC_LS_MAX;
- adc_hs_max = SBCLA_ADC_HS_MAX;
- }
-
if (tc < SB_LS_MIN) {
tc = SB_LS_MIN;
- *mode = SB_ADAC_LS;
+ mode = SB_ADAC_LS;
+ goto out;
} else if (isdac) {
if (tc <= SB_DAC_LS_MAX)
- *mode = SB_ADAC_LS;
+ mode = SB_ADAC_LS;
else {
- *mode = SB_ADAC_HS;
+ mode = SB_ADAC_HS;
if (tc > SB_DAC_HS_MAX)
tc = SB_DAC_HS_MAX;
}
} else {
+ int adc_ls_max, adc_hs_max;
+
+ /* XXX use better rounding--compare distance to nearest tc on both
+ sides of requested speed */
+ if (ISSBPROCLASS(sc)) {
+ adc_ls_max = SBPRO_ADC_LS_MAX;
+ adc_hs_max = SBPRO_ADC_HS_MAX;
+ } else {
+ adc_ls_max = SBCLA_ADC_LS_MAX;
+ adc_hs_max = SBCLA_ADC_HS_MAX;
+ }
+
if (tc <= adc_ls_max)
- *mode = SB_ADAC_LS;
+ mode = SB_ADAC_LS;
else {
- *mode = SB_ADAC_HS;
+ mode = SB_ADAC_HS;
if (tc > adc_hs_max)
tc = adc_hs_max;
}
}
- return tc;
+
+out:
+ *tcp = tc;
+ *modep = mode;
+ return (0);
}
/*
}
int
-sbdsp_set_sr(sc, srp, isdac)
+sbdsp_set_tc(sc, tc)
register struct sbdsp_softc *sc;
- u_long *srp;
- int isdac;
+ int tc;
{
- register int tc;
- int mode;
- int sr = *srp;
register int iobase;
/*
* A SBPro in stereo mode uses time constants at double the
* actual rate.
*/
- if (ISSBPRO(sc) && sc->sc_chans == 2) {
- if (sr > 22727)
- sr = 22727; /* Can't bounce it...order of
- operations may yield bogus
- sr here. */
- sr *= 2;
- }
- else if (!ISSBPROCLASS(sc) && sc->sc_chans != 1)
- return EINVAL;
+ if (ISSBPRO(sc) && sc->sc_chans == 2)
+ tc = 256 - ((256 - tc) / 2);
- tc = sbdsp_srtotc(sc, sr, &mode, isdac);
- DPRINTF(("sbdsp_set_sr: sc=0x%x sr=%d mode=0x%x\n", sc, sr, mode));
+ DPRINTF(("sbdsp_set_tc: sc=%p tc=%d\n", sc, tc));
iobase = sc->sc_iobase;
if (sbdsp_wdsp(iobase, SB_DSP_TIMECONST) < 0 ||
sbdsp_wdsp(iobase, tc) < 0)
- return EIO;
+ return (EIO);
- sr = sbdsp_tctosr(sc, tc);
- if (ISSBPRO(sc) && sc->sc_chans == 2)
- *srp = sr / 2;
- else
- *srp = sr;
-
- sc->sc_adacmode = mode;
- sc->sc_adactc = tc;
- return 0;
+ return (0);
}
int
DPRINTF(("sbdsp_dma_input: stereo input, odd bytecnt\n"));
return EIO;
}
+
iobase = sc->sc_iobase;
- if (ISSBPROCLASS(sc) && !sc->sc_dmain_inprogress) {
- if (sc->sc_chans == 2) {
- if (sbdsp_wdsp(iobase, SB_DSP_RECORD_STEREO) < 0)
- goto badmode;
- sbdsp_mix_write(sc, SBP_STEREO,
- sbdsp_mix_read(sc, SBP_STEREO) & ~SBP_PLAYMODE_MASK);
- sbdsp_mix_write(sc, SBP_INFILTER,
- sbdsp_mix_read(sc, SBP_INFILTER) | SBP_FILTER_OFF);
- }
- else {
- if (sbdsp_wdsp(iobase, SB_DSP_RECORD_MONO) < 0)
- goto badmode;
- sbdsp_mix_write(sc, SBP_STEREO,
- sbdsp_mix_read(sc, SBP_STEREO) & ~SBP_PLAYMODE_MASK);
- sbdsp_mix_write(sc, SBP_INFILTER,
- sc->sc_irate <= 8000 ?
- sbdsp_mix_read(sc, SBP_INFILTER) & ~SBP_FILTER_MASK :
- sbdsp_mix_read(sc, SBP_INFILTER) | SBP_FILTER_OFF);
+ if (sc->sc_dmadir != SB_DMA_IN) {
+ if (ISSBPROCLASS(sc)) {
+ if (sc->sc_chans == 2) {
+ if (sbdsp_wdsp(iobase, SB_DSP_RECORD_STEREO) < 0)
+ goto badmode;
+ sbdsp_mix_write(sc, SBP_INFILTER,
+ sbdsp_mix_read(sc, SBP_INFILTER) | SBP_FILTER_OFF);
+ } else {
+ if (sbdsp_wdsp(iobase, SB_DSP_RECORD_MONO) < 0)
+ goto badmode;
+ sbdsp_mix_write(sc, SBP_INFILTER, sc->sc_itc > SB_8K ?
+ sbdsp_mix_read(sc, SBP_INFILTER) | SBP_FILTER_OFF :
+ sbdsp_mix_read(sc, SBP_INFILTER) & ~SBP_FILTER_MASK);
+ }
}
- sc->sc_dmain_inprogress = 1;
- sc->sc_last_hsr_size = 0; /* restarting */
+
+ sbdsp_set_tc(sc, sc->sc_itc);
+ sc->sc_dmadir = SB_DMA_IN;
}
- sc->sc_dmaout_inprogress = 0;
isa_dmastart(B_READ, p, cc, sc->sc_drq);
sc->sc_intr = intr;
sc->dmaflags = B_READ;
sc->dmaaddr = p;
sc->dmacnt = --cc; /* DMA controller is strange...? */
- if (sc->sc_adacmode == SB_ADAC_LS) {
+
+ if (sc->sc_imode == SB_ADAC_LS) {
if (sbdsp_wdsp(iobase, SB_DSP_RDMA) < 0 ||
sbdsp_wdsp(iobase, cc) < 0 ||
sbdsp_wdsp(iobase, cc >> 8) < 0) {
+ DPRINTF(("sbdsp_dma_input: LS DMA start failed\n"));
goto giveup;
}
}
else {
- if (cc != sc->sc_last_hsr_size) {
+ if (cc != sc->sc_last_hs_size) {
if (sbdsp_wdsp(iobase, SB_DSP_BLOCKSIZE) < 0 ||
sbdsp_wdsp(iobase, cc) < 0 ||
- sbdsp_wdsp(iobase, cc >> 8) < 0)
+ sbdsp_wdsp(iobase, cc >> 8) < 0) {
+ DPRINTF(("sbdsp_dma_input: HS DMA start failed\n"));
goto giveup;
+ }
+ sc->sc_last_hs_size = cc;
}
- if (sbdsp_wdsp(iobase, SB_DSP_HS_INPUT) < 0)
+ if (sbdsp_wdsp(iobase, SB_DSP_HS_INPUT) < 0) {
+ DPRINTF(("sbdsp_dma_input: HS DMA restart failed\n"));
goto giveup;
- sc->sc_last_hsr_size = cc;
- sc->sc_locked = 1;
+ }
}
return 0;
giveup:
- isa_dmaabort(sc->sc_drq);
sbdsp_reset(sc);
- sc->sc_intr = 0;
- sc->sc_arg = 0;
return EIO;
+
badmode:
DPRINTF(("sbdsp_dma_input: can't set %s mode\n",
sc->sc_chans == 2 ? "stereo" : "mono"));
if (sbdspdebug > 1)
Dprintf("sbdsp_dma_output: cc=%d 0x%x (0x%x)\n", cc, intr, arg);
#endif
- if (sc->sc_chans == 2 && cc & 1) {
+ if (sc->sc_chans == 2 && (cc & 1)) {
DPRINTF(("stereo playback odd bytes (%d)\n", cc));
return EIO;
}
- if (ISSBPROCLASS(sc) && !sc->sc_dmaout_inprogress) {
- /* make sure we re-set stereo mixer bit when we start
- output. */
- sbdsp_mix_write(sc, SBP_STEREO,
- (sbdsp_mix_read(sc, SBP_STEREO) & ~SBP_PLAYMODE_MASK) |
- (sc->sc_chans == 2 ?
- SBP_PLAYMODE_STEREO : SBP_PLAYMODE_MONO));
- sc->sc_dmaout_inprogress = 1;
- sc->sc_last_hsw_size = 0; /* restarting */
+ iobase = sc->sc_iobase;
+ if (sc->sc_dmadir != SB_DMA_OUT) {
+ if (ISSBPROCLASS(sc)) {
+ /* make sure we re-set stereo mixer bit when we start
+ output. */
+ sbdsp_mix_write(sc, SBP_STEREO,
+ (sbdsp_mix_read(sc, SBP_STEREO) & ~SBP_PLAYMODE_MASK) |
+ (sc->sc_chans == 2 ? SBP_PLAYMODE_STEREO : SBP_PLAYMODE_MONO));
+ }
+
+ sbdsp_set_tc(sc, sc->sc_otc);
+ sc->sc_dmadir = SB_DMA_OUT;
}
- sc->sc_dmain_inprogress = 0;
+
isa_dmastart(B_WRITE, p, cc, sc->sc_drq);
sc->sc_intr = intr;
sc->sc_arg = arg;
sc->dmaaddr = p;
sc->dmacnt = --cc; /* a vagary of how DMA works, apparently. */
- iobase = sc->sc_iobase;
- if (sc->sc_adacmode == SB_ADAC_LS) {
+ if (sc->sc_omode == SB_ADAC_LS) {
if (sbdsp_wdsp(iobase, SB_DSP_WDMA) < 0 ||
sbdsp_wdsp(iobase, cc) < 0 ||
sbdsp_wdsp(iobase, cc >> 8) < 0) {
}
}
else {
- if (cc != sc->sc_last_hsw_size) {
- if (sbdsp_wdsp(iobase, SB_DSP_BLOCKSIZE) < 0) {
- /* sometimes fails initial startup?? */
- delay(100);
- if (sbdsp_wdsp(iobase, SB_DSP_BLOCKSIZE) < 0) {
- DPRINTF(("sbdsp_dma_output: BLOCKSIZE failed\n"));
- goto giveup;
- }
- }
- if (sbdsp_wdsp(iobase, cc) < 0 ||
+ if (cc != sc->sc_last_hs_size) {
+ if (sbdsp_wdsp(iobase, SB_DSP_BLOCKSIZE) < 0 ||
+ sbdsp_wdsp(iobase, cc) < 0 ||
sbdsp_wdsp(iobase, cc >> 8) < 0) {
DPRINTF(("sbdsp_dma_output: HS DMA start failed\n"));
goto giveup;
}
- sc->sc_last_hsw_size = cc;
+ sc->sc_last_hs_size = cc;
}
if (sbdsp_wdsp(iobase, SB_DSP_HS_OUTPUT) < 0) {
- delay(100);
- if (sbdsp_wdsp(iobase, SB_DSP_HS_OUTPUT) < 0) {
- DPRINTF(("sbdsp_dma_output: HS DMA restart failed\n"));
- goto giveup;
- }
+ DPRINTF(("sbdsp_dma_output: HS DMA restart failed\n"));
+ goto giveup;
}
- sc->sc_locked = 1;
}
-
return 0;
- giveup:
- isa_dmaabort(sc->sc_drq);
+giveup:
sbdsp_reset(sc);
- sc->sc_intr = 0;
- sc->sc_arg = 0;
return EIO;
}
void *arg;
{
register struct sbdsp_softc *sc = arg;
+ u_char x;
#ifdef AUDIO_DEBUG
if (sbdspdebug > 1)
Dprintf("sbdsp_intr: intr=0x%x\n", sc->sc_intr);
#endif
sc->sc_interrupts++;
- sc->sc_locked = 0;
/* clear interrupt */
- inb(sc->sc_iobase + SBP_DSP_RSTAT);
+ x = inb(sc->sc_iobase + SBP_DSP_RSTAT);
+ delay(10);
+#if 0
+ if ((x & SB_DSP_READY) == 0) {
+ printf("sbdsp_intr: still busy\n");
+ return 0;
+ }
+#endif
#if 0
if (sc->sc_mintr != 0) {
- int c = sbdsp_rdsp(sc->sc_iobase);
- (*sc->sc_mintr)(sc->sc_arg, c);
+ x = sbdsp_rdsp(sc->sc_iobase);
+ (*sc->sc_mintr)(sc->sc_arg, x);
} else
#endif
if (sc->sc_intr != 0) {
- /*
- * The SBPro used to develop and test this driver often
- * generated dma underruns--it interrupted to signal
- * completion of the DMA input recording block, but the
- * ISA DMA controller didn't think the channel was
- * finished. Maybe this is just a bus speed issue, I dunno,
- * but it seems strange and leads to channel-flipping with stereo
- * recording. Sigh.
- */
+ /*
+ * The SBPro used to develop and test this driver often
+ * generated dma underruns--it interrupted to signal
+ * completion of the DMA input recording block, but the
+ * ISA DMA controller didn't think the channel was
+ * finished. Maybe this is just a bus speed issue, I dunno,
+ * but it seems strange and leads to channel-flipping with
+ * stereo recording. Sigh.
+ */
isa_dmadone(sc->dmaflags, sc->dmaaddr, sc->dmacnt,
sc->sc_drq);
- sc->dmaflags = 0;
- sc->dmaaddr = 0;
- sc->dmacnt = 0;
(*sc->sc_intr)(sc->sc_arg);
}
else
-/* $NetBSD: sbdspvar.h,v 1.7 1995/11/10 05:01:08 mycroft Exp $ */
+/* $OpenBSD: sbdspvar.h,v 1.3 1996/03/08 16:43:15 niklas Exp $ */
+/* $NetBSD: sbdspvar.h,v 1.9 1996/02/16 10:10:23 mycroft Exp $ */
/*
* Copyright (c) 1991-1993 Regents of the University of California.
int sc_drq; /* DMA */
u_short sc_open; /* reference count of open calls */
- u_short sc_locked; /* true when doing HS DMA */
- u_short sc_adacmode; /* low/high speed mode indicator */
-
- u_long sc_irate; /* Sample rate for input */
- u_long sc_orate; /* ...and output */
u_int gain[SB_NDEVS]; /* kept in SB levels: right/left each
in a nibble */
u_int spkr_state; /* non-null is on */
+ int sc_itc; /* Sample rate for input */
+ int sc_otc; /* ...and output */
+
+ int sc_imode;
+ int sc_omode;
#define SB_ADAC_LS 0
#define SB_ADAC_HS 1
- u_short sc_adactc; /* current adac time constant */
+
u_long sc_interrupts; /* number of interrupts taken */
void (*sc_intr)(void*); /* dma completion intr handler */
void (*sc_mintr)(void*, int);/* midi input intr handler */
int dmaflags;
caddr_t dmaaddr;
vm_size_t dmacnt;
- int sc_last_hsw_size; /* last HS dma size */
- int sc_last_hsr_size; /* last HS dma size */
+ int sc_last_hs_size; /* last HS dma size */
int sc_chans; /* # of channels */
- char sc_dmain_inprogress; /* DMA input in progress? */
- char sc_dmaout_inprogress; /* DMA output in progress? */
+ int sc_dmadir; /* DMA direction */
+#define SB_DMA_NONE 0
+#define SB_DMA_IN 1
+#define SB_DMA_OUT 2
u_int sc_model; /* DSP model */
#define SBVER_MAJOR(v) ((v)>>8)
-/* $NetBSD: ultra14f.c,v 1.60 1995/12/26 17:16:55 mycroft Exp $ */
+/* $OpenBSD: ultra14f.c,v 1.9 1996/03/08 16:43:16 niklas Exp $ */
+/* $NetBSD: ultra14f.c,v 1.61 1996/02/09 17:38:09 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
if (ia->ia_iobase == IOBASEUNK)
return ENXIO;
- model = htons(inw(iobase + U14_ID));
+ model = inb(iobase + U14_ID) | (inb(iobase + U14_ID + 1) << 8);
if ((model & 0xfff0) != 0x5640)
return ENXIO;
- config = htons(inw(iobase + U14_CONFIG));
+ config = inb(iobase + U14_CONFIG) | (inb(iobase + U14_CONFIG + 1) << 8);
switch (model & 0x000f) {
case 0x0001:
- /* This is a 34f, and doens't need an ISA DMA channel. */
+ /* This is a 34f, and doesn't need an ISA DMA channel. */
uha->sc_drq = DRQUNK;
break;
default:
{
printf("mscp:%x op:%x cmdlen:%d senlen:%d\n",
- mscp, mscp->opcode, mscp->cdblen, mscp->senselen);
+ mscp, mscp->opcode, mscp->scsi_cmd_length, mscp->req_sense_length);
printf(" sg:%d sgnum:%x datlen:%d hstat:%x tstat:%x flags:%x\n",
- mscp->sgth, mscp->sg_num, mscp->datalen, mscp->host_stat,
- mscp->target_stat, mscp->flags);
+ mscp->sgth, mscp->sg_num, mscp->datalen, mscp->host_stat,
+ mscp->target_stat, mscp->flags);
show_scsi_cmd(mscp->xs);
}
-/* $NetBSD: wss.c,v 1.7 1995/11/10 04:30:52 mycroft Exp $ */
+/* $OpenBSD: wss.c,v 1.5 1996/03/08 16:43:17 niklas Exp $ */
+/* $NetBSD: wss.c,v 1.9 1996/02/16 08:18:36 mycroft Exp $ */
/*
* Copyright (c) 1994 John Brezak
"WSS"
};
-int wssprobe();
-void wssattach();
int wssopen __P((dev_t, int));
-
int wss_getdev __P((void *, struct audio_device *));
int wss_setfd __P((void *, int));
#define at_dma(flags, ptr, cc, chan) isa_dmastart(flags, ptr, cc, chan)
#endif
+int wssprobe __P((struct device *, void *, void *));
+void wssattach __P((struct device *, struct device *, void *));
+
struct cfdriver wsscd = {
NULL, "wss", wssprobe, wssattach, DV_DULL, sizeof(struct wss_softc)
};
* Probe for the Microsoft Sound System hardware.
*/
int
-wssprobe(parent, self, aux)
- struct device *parent, *self;
- void *aux;
+wssprobe(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct wss_softc *sc = (void *)self;
+ register struct wss_softc *sc = match;
register struct isa_attach_args *ia = aux;
register int iobase = ia->ia_iobase;
static u_char interrupt_bits[12] = {