summaryrefslogtreecommitdiffstats
path: root/sys/dev/digi/digi.h
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>2001-05-02 01:08:09 +0000
committerbrian <brian@FreeBSD.org>2001-05-02 01:08:09 +0000
commitd56c2badd609cf617b87e58be1d05bd9271b0819 (patch)
tree9433437f22d179a0c82daf644278ab5db7c011ad /sys/dev/digi/digi.h
parent66031e93ec86375e32e73aa5b08ce1414a0347d6 (diff)
downloadFreeBSD-src-d56c2badd609cf617b87e58be1d05bd9271b0819.zip
FreeBSD-src-d56c2badd609cf617b87e58be1d05bd9271b0819.tar.gz
Add a ``digi'' driver.
This driver supports PCI Xr-based and ISA Xem Digiboard cards. dgm will go away soon if there are no problems reported. For now, configuring dgm into your kernel warns that you should be using digi. This driver is probably close to supporting Xi, Xe and Xeve cards, but I wouldn't expect them to work properly (hardware donations welcome). The digi_* pseudo-drivers are not drivers themselves but contain the BIOS and FEP/OS binaries for various digiboard cards and are auto-loaded and auto-unloaded by the digi driver at initialisation time. They *may* be configured into the kernel, but waste a lot of space if they are. They're intended to be left as modules. The digictl program is (mainly) used to re-initialise cards that have external port modules attached such as the PC/Xem.
Diffstat (limited to 'sys/dev/digi/digi.h')
-rw-r--r--sys/dev/digi/digi.h204
1 files changed, 204 insertions, 0 deletions
diff --git a/sys/dev/digi/digi.h b/sys/dev/digi/digi.h
new file mode 100644
index 0000000..94e66b6
--- /dev/null
+++ b/sys/dev/digi/digi.h
@@ -0,0 +1,204 @@
+/*-
+ * Copyright (c) 2001 Brian Somers <brian@Awfulhak.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#define W(p) (*(u_int16_t *)(p))
+#define vW(p) (*(u_int16_t volatile *)(p))
+#define D(p) (*(u_int32_t *)(p))
+#define vD(p) (*(u_int32_t volatile *)(p))
+
+#define CE_OVERRUN 0
+#define CE_INTERRUPT_BUF_OVERFLOW 1
+#define CE_TTY_BUF_OVERFLOW 2
+#define CE_NTYPES 3
+#define CE_RECORD(com, errnum) (++(com)->delta_error_counts[errnum])
+
+#define DEBUG
+
+#ifdef DEBUG
+extern unsigned digi_debug;
+#define DLOG(level, args) if (digi_debug & (level)) device_printf args
+#else
+#define DLOG(level, args)
+#endif
+
+
+struct digi_softc;
+
+/* digiboard port structure */
+struct digi_p {
+ struct digi_softc *sc;
+
+ int status;
+#define ENABLED 1
+#define DIGI_DTR_OFF 2
+#define PAUSE_TX 8
+#define PAUSE_RX 16
+
+ int opencnt;
+ ushort txbufsize;
+ ushort rxbufsize;
+ volatile struct board_chan *bc;
+ struct tty *tp;
+
+ dev_t dev[6];
+
+ u_char *txbuf;
+ u_char *rxbuf;
+ u_char txwin;
+ u_char rxwin;
+
+ u_char pnum; /* port number */
+
+ u_char modemfake; /* Modem values to be forced */
+ u_char mstat;
+ u_char modem; /* Force values */
+
+ int active_out; /* nonzero if the callout device is open */
+ int dtr_wait; /* time to hold DTR down on close (* 1/hz) */
+ u_int wopeners; /* # processes waiting for DCD in open() */
+
+ /*
+ * The high level of the driver never reads status registers directly
+ * because there would be too many side effects to handle conveniently.
+ * Instead, it reads copies of the registers stored here by the
+ * interrupt handler.
+ */
+ u_char last_modem_status; /* last MSR read by intr handler */
+ u_char prev_modem_status; /* last MSR handled by high level */
+
+
+ /* Initial state. */
+ struct termios it_in; /* should be in struct tty */
+ struct termios it_out;
+
+ /* Lock state. */
+ struct termios lt_in; /* should be in struct tty */
+ struct termios lt_out;
+
+ u_int do_timestamp;
+ u_int do_dcd_timestamp;
+ struct timeval dcd_timestamp;
+
+ u_long bytes_in, bytes_out;
+ u_int delta_error_counts[CE_NTYPES];
+ u_long error_counts;
+
+ tcflag_t c_iflag; /* hold true IXON/IXOFF/IXANY */
+ int lcc, lostcc, lbuf;
+ u_char send_ring;
+};
+
+/*
+ * Map TIOCM_* values to digiboard values
+ */
+struct digi_control_signals {
+ int rts;
+ int cd;
+ int dsr;
+ int cts;
+ int ri;
+ int dtr;
+};
+
+enum digi_board_status {
+ DIGI_STATUS_NOTINIT,
+ DIGI_STATUS_ENABLED,
+ DIGI_STATUS_DISABLED
+};
+
+/* Digiboard per-board structure */
+struct digi_softc {
+ /* struct board_info */
+ device_t dev;
+
+ const char *name;
+ enum digi_board_status status;
+ ushort numports; /* number of ports on card */
+ ushort port; /* I/O port */
+ ushort wport; /* window select I/O port */
+
+ struct {
+ struct resource *mem;
+ int mrid;
+ struct resource *irq;
+ int irqrid;
+ struct resource *io;
+ int iorid;
+ void *irqHandler;
+ int unit;
+ dev_t ctldev;
+ } res;
+
+ u_char *vmem; /* virtual memory address */
+ u_char *memcmd;
+ volatile u_char *memevent;
+ long pmem; /* physical memory address */
+
+ struct {
+ u_char *data;
+ size_t size;
+ } bios, fep, link;
+
+#ifdef DIGI_INTERRUPT
+ struct timeval intr_timestamp;
+#endif
+
+ struct digi_p *ports; /* pointer to array of port descriptors */
+ struct tty *ttys; /* pointer to array of TTY structures */
+ volatile struct global_data *gdata;
+ u_char window; /* saved window */
+ int win_size;
+ int win_bits;
+ int mem_size;
+ int mem_seg;
+ digiModel_t model;
+ const struct digi_control_signals *csigs;
+ int opencnt;
+ unsigned pcibus : 1; /* On a PCI bus ? */
+
+ struct callout_handle callout; /* poll timeout handle */
+ struct callout_handle inttest; /* int test timeout handle */
+ const char *module;
+
+ u_char *(*setwin)(struct digi_softc *_sc, unsigned _addr);
+ void (*hidewin)(struct digi_softc *_sc);
+ void (*towin)(struct digi_softc *_sc, int _win);
+#ifdef DEBUG
+ int intr_count;
+#endif
+};
+
+extern devclass_t digi_devclass;
+extern const struct digi_control_signals digi_xixe_signals;
+extern const struct digi_control_signals digi_normal_signals;
+
+const char *digi_errortxt(int _id);
+int digi_modhandler(module_t _mod, int _event, void *_arg);
+int digi_attach(struct digi_softc *);
+int digi_detach(device_t _dev);
+int digi_shutdown(device_t _dev);
OpenPOWER on IntegriCloud