diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index f104281136ab..7fbd610ae5bf 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,29 @@ # xargs -n1 | sort | uniq -d; # done +# 20141226: Remove gpib/ieee488 +OLD_FILES+=usr/include/dev/ieee488/ibfoo_int.h +OLD_FILES+=usr/include/dev/ieee488/tnt4882.h +OLD_FILES+=usr/include/dev/ieee488/ugpib.h +OLD_FILES+=usr/include/dev/ieee488/upd7210.h +OLD_DIRS+=usr/include/dev/ieee488 +OLD_FILES+=usr/include/gpib/gpib.h +OLD_DIRS+=usr/include/gpib +OLD_FILES+=usr/lib/libgpib.a +OLD_FILES+=usr/lib/libgpib_p.a +OLD_FILES+=usr/lib/libgpib.so +OLD_LIBS+=usr/lib/libgpib.so.3 +OLD_FILES+=usr/lib/libgpib_p.a +OLD_FILES+=share/man/man4/pcii.4.gz +OLD_FILES+=share/man/man4/gpib.4.gz +OLD_FILES+=share/man/man4/tnt4882.4.gz +.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64" +OLD_FILES+=usr/lib32/libgpib.a +OLD_FILES+=usr/lib32/libgpib_p.a +OLD_FILES+=usr/lib32/libgpib.so +OLD_LIBS+=usr/lib32/libgpib.so.3 +.endif + # 20141224: libxo moved to /lib OLD_LIBS+=usr/lib/libxo.so.0 # 20141223: remove in6_gif.h, in_gif.h and if_stf.h diff --git a/include/Makefile b/include/Makefile index fe62e5e26d49..fa815272c2b8 100644 --- a/include/Makefile +++ b/include/Makefile @@ -42,7 +42,7 @@ LDIRS= bsm cam geom net net80211 netgraph netinet netinet6 \ LSUBDIRS= cam/ata cam/scsi \ dev/acpica dev/agp dev/an dev/bktr dev/ciss dev/filemon dev/firewire \ dev/hwpmc \ - dev/ic dev/iicbus ${_dev_ieee488} dev/io dev/lmc dev/mfi dev/nvme \ + dev/ic dev/iicbus dev/io dev/lmc dev/mfi dev/nvme \ dev/ofw dev/pbio dev/pci ${_dev_powermac_nvram} dev/ppbus dev/smbus \ dev/speaker dev/usb dev/utopia dev/vkbd dev/wi \ fs/cuse \ @@ -63,10 +63,6 @@ LSUBSUBDIRS= dev/mpt/mpilib _dev_powermac_nvram= dev/powermac_nvram .endif -.if ${MK_GPIB} != "no" -_dev_ieee488= dev/ieee488 -.endif - .if ${MK_GSSAPI} != "no" SUBDIR+= gssapi INCS+= gssapi.h diff --git a/lib/Makefile b/lib/Makefile index 8bd565385ef0..4d30c5387605 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -52,7 +52,6 @@ SUBDIR= ${SUBDIR_ORDERED} \ libfetch \ libfigpar \ libgeom \ - ${_libgpib} \ libgpio \ ${_libgssapi} \ ${_librpcsec_gss} \ @@ -195,10 +194,6 @@ _cuse= libcuse _libelftc= libelftc .endif -.if ${MK_GPIB} != "no" -_libgpib= libgpib -.endif - .if ${MK_GSSAPI} != "no" _libgssapi= libgssapi _librpcsec_gss= librpcsec_gss diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 76b3d55c2c61..b20cda5dcffd 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -156,7 +156,6 @@ MAN= aac.4 \ geom_uncompress.4 \ geom_uzip.4 \ gif.4 \ - gpib.4 \ gpio.4 \ gpioiic.4 \ gpioled.4 \ @@ -372,7 +371,6 @@ MAN= aac.4 \ pci.4 \ pcib.4 \ pcic.4 \ - pcii.4 \ pcm.4 \ pcn.4 \ ${_pf.4} \ @@ -495,7 +493,6 @@ MAN= aac.4 \ ti.4 \ timecounters.4 \ tl.4 \ - tnt4882.4 \ ${_tpm.4} \ trm.4 \ tty.4 \ diff --git a/share/man/man4/gpib.4 b/share/man/man4/gpib.4 deleted file mode 100644 index b5f29cd60175..000000000000 --- a/share/man/man4/gpib.4 +++ /dev/null @@ -1,100 +0,0 @@ -.\" Copyright (c) 2010, Joerg Wunsch -.\" 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$ -.\" -.Dd January 24, 2010 -.Dt GPIB 4 -.Os -.Sh NAME -.Nm gpib -.Nd General-Purpose Instrument Bus (GPIB) driver -.Sh SYNOPSIS -Either of the -.Xr pcii 4 -or -.Xr tnt4882 4 -drivers use this driver as the backend. -.Sh DESCRIPTION -The -.Nm -driver provides support for driving an IEEE-488 bus, also called -IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument -Bus), or GPIB (General Purpose Instrument Bus). -The device can become either a listener, talker, controller, and -in particular a master controller on the bus. -.Ss Example -The following example code queries the device provided as -.Va argv[1] -for its identification response. -.Bd -literal -/* compile with: cc -O -o ibtest ibtest.c -lgpib */ - -#include -#include -#include -#include - -#include - -int -main(int argc, char **argv) -{ - int dmm; - unsigned char buf[100]; - char vbuf[sizeof(buf) * 4]; - - /* DVM */ - dmm = ibdev(0, (argc > 1? atoi(argv[1]): 7), 0, - T10s, 1, 0); - if (dmm < 0) - errx(1, "ibdev = %d\\n", dmm); - ibwrt(dmm, "*IDN?\\r\\n", 7); - ibrd(dmm, buf, sizeof(buf) - 1); - strvisx(vbuf, buf, ibcnt, VIS_WHITE | VIS_CSTYLE); - printf("%s\\n", vbuf); - return (0); -} -.Ed -.Sh FILES -.Bl -tag -width /dev/gpibNNib -.It Pa /dev/gpib Ns Em N Ns "ib" -Main device node to access the driver. -.It Pa /dev/gpib Ns Em N Ns "l" -Listen-only entry to the driver. -When opening, an instrument can send data to this device on the -bus in an unaddressed mode, for example hard-copy printer data. -.El -.Sh SEE ALSO -.Xr gpib 3 , -.Xr pcii 4 , -.Xr tnt4882 4 -.Sh HISTORY -The -.Nm -driver was written by Poul-Henning Kamp, and first appeared in -.Fx 5.4 . -.Sh AUTHORS -This manual page was written by -.An J\(:org Wunsch . diff --git a/share/man/man4/pcii.4 b/share/man/man4/pcii.4 deleted file mode 100644 index 3369d3ffc72f..000000000000 --- a/share/man/man4/pcii.4 +++ /dev/null @@ -1,97 +0,0 @@ -.\" Copyright (c) 2010, Joerg Wunsch -.\" 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$ -.\" -.Dd January 24, 2010 -.Dt PCII 4 -.Os -.Sh NAME -.Nm pcii -.Nd National Instruments PCIIA GPIB controller driver -.Sh SYNOPSIS -.Cd "device pcii" -.Pp -In -.Pa /boot/device.hints : -.Cd hint.pcii.0.at="isa" -.Cd hint.pcii.0.port="0x2e1" -.Cd hint.pcii.0.irq="7" -.Cd hint.pcii.0.drq="1" -.Sh DESCRIPTION -The -.Nm -driver provides support for driving an IEEE-488 bus, also called -IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument -Bus), or GPIB (General Purpose Instrument Bus). -The driver supports National Instruments PCIIA cards (sometimes -also referred to as PC2A) and compatibles. -These cards use a NEC \(mcPD7210 controller IC as the main -interface between the host computer and the instrument bus. -.Ss IO memory space layout -The PCIIA cards use a very specific IO memory space allocation layout. -The address bits A0 through A9 (which have traditionally been the only -address bits evaluated on IBM PC XT extension cards) are hardwired to -address 0x2e1. -Bits A10 through A12 are used by the \(mcPD7210 register select lines. -This makes the individual 7210 registers being 0x400 bytes apart in the -ISA bus address space. -Address bits A13 and A14 are compared to a DIP switch setting on the -card, allowing for up to 4 different cards being installed (at base -addresses 0x2e1, 0x22e1, 0x42e1, and 0x62e1, respectively). -A15 has been used to select an optional on-board time-of-day clock -chip (MM58167A) on the original PCIIA rather than the \(mcPD7210 -(which is not implemented on later boards and clones). -Finally, the IO addresses 0x2f0 ... 0x2f7 are used for a -.Em special interrupt handling feature -(re-enable interrupts so the IRQ can be shared), where actually only -address 0x2f0 plus the actual IRQ level is required for each card. -Some clones do not appear to require this special IRQ handling, and -are thus likely to not support the shared IRQ feature. -.Pp -Only the base address of the card needs to be specified in the ISA -device hints; the driver takes care to derive all other IO addresses -needed during the probe phase. -.Ss Supported cards -The following cards are known to be supported: -.Bl -bullet -offset indent -.It -B&C Microsystems PC488A-0 -.It -National Instruments GPIB-PCII/PCIIA (in PCIIa mode) -.It -Axiom AX5488 -.El -.Sh SEE ALSO -.Xr gpib 3 , -.Xr gpib 4 , -.Xr device.hints 5 -.Sh HISTORY -The -.Nm -driver was written by Poul-Henning Kamp, and first appeared in -.Fx 5.4 . -.Sh AUTHORS -This manual page was written by -.An J\(:org Wunsch . diff --git a/share/man/man4/tnt4882.4 b/share/man/man4/tnt4882.4 deleted file mode 100644 index e3eacbb3d49c..000000000000 --- a/share/man/man4/tnt4882.4 +++ /dev/null @@ -1,55 +0,0 @@ -.\" Copyright (c) 2010, Joerg Wunsch -.\" 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$ -.\" -.Dd January 24, 2010 -.Dt TNT4882 4 -.Os -.Sh NAME -.Nm tnt4882 -.Nd National Instruments TNT4882A GPIB controller driver -.Sh SYNOPSIS -.Cd "device tnt4882" -.Sh DESCRIPTION -The -.Nm -driver provides support for driving an IEEE-488 bus, also called -IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument -Bus), or GPIB (General Purpose Instrument Bus). -The driver supports National Instruments PCI GPIB cards using -the TNT4882 bus interface chip. -This chip emulates a NEC \(mcPD7210 controller IC as the main -interface between the host computer and the instrument bus. -.Sh SEE ALSO -.Xr gpib 3 , -.Xr gpib 4 -.Sh HISTORY -The -.Nm -driver was written by Poul-Henning Kamp, and first appeared in -.Fx 5.4 . -.Sh AUTHORS -This manual page was written by -.An J\(:org Wunsch . diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk index 80313da12d2d..f505f9822f66 100644 --- a/share/mk/src.opts.mk +++ b/share/mk/src.opts.mk @@ -85,7 +85,6 @@ __DEFAULT_YES_OPTIONS = \ GDB \ GNU \ GNU_GREP_COMPAT \ - GPIB \ GPIO \ GPL_DTC \ GROFF \ diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 3e644dd81331..66c1dbc1f22d 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -2353,19 +2353,6 @@ options SND_FEEDER_RATE_HP options SND_PCM_64 options SND_OLDSTEREO -# -# IEEE-488 hardware: -# pcii: PCIIA cards (uPD7210 based isa cards) -# tnt4882: National Instruments PCI-GPIB card. - -device pcii -hint.pcii.0.at="isa" -hint.pcii.0.port="0x2e1" -hint.pcii.0.irq="5" -hint.pcii.0.drq="1" - -device tnt4882 - # # Miscellaneous hardware: # diff --git a/sys/conf/files b/sys/conf/files index d419d4a64aef..237390fd8027 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1448,10 +1448,6 @@ dev/ida/ida_eisa.c optional ida eisa dev/ida/ida_pci.c optional ida pci dev/ie/if_ie.c optional ie isa nowerror dev/ie/if_ie_isa.c optional ie isa -dev/ieee488/ibfoo.c optional pcii | tnt4882 -dev/ieee488/pcii.c optional pcii -dev/ieee488/tnt4882.c optional tnt4882 -dev/ieee488/upd7210.c optional pcii | tnt4882 dev/iicbus/ad7418.c optional ad7418 dev/iicbus/ds133x.c optional ds133x dev/iicbus/ds1374.c optional ds1374 diff --git a/sys/dev/ieee488/ibfoo.c b/sys/dev/ieee488/ibfoo.c deleted file mode 100644 index 2fe72dcd5f01..000000000000 --- a/sys/dev/ieee488/ibfoo.c +++ /dev/null @@ -1,1127 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * Copyright (c) 2010 Joerg Wunsch - * 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. - * - * High-level driver for µPD7210 based GPIB cards. - * - */ - -#include -__FBSDID("$FreeBSD$"); - -# define IBDEBUG -# undef IBDEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define UPD7210_SW_DRIVER -#include -#include - -static MALLOC_DEFINE(M_IBFOO, "IBFOO", "IBFOO"); - - -/* ibfoo API */ - -#include - -/* XXX: This is really a bitmap */ -enum h_kind { - H_DEV = 1, - H_BOARD = 2, - H_EITHER = 3 -}; - -struct handle { - LIST_ENTRY(handle) list; - int handle; - enum h_kind kind; - int pad; - int sad; - struct timeval timeout; - int eot; - int eos; - int dma; -}; - -struct ibfoo { - struct upd7210 *u; - LIST_HEAD(,handle) handles; - struct unrhdr *unrhdr; - struct callout callout; - struct handle *h; - struct ibarg *ap; - - enum { - IDLE, - BUSY, - PIO_IDATA, - PIO_ODATA, - PIO_CMD, - DMA_IDATA, - FIFO_IDATA, - FIFO_ODATA, - FIFO_CMD - } mode; - - struct timeval deadline; - - struct handle *rdh; /* addressed for read */ - struct handle *wrh; /* addressed for write */ - - int doeoi; - - u_char *buf; - u_int buflen; -}; - -typedef int ibhandler_t(struct ibfoo *ib); - -static struct timeval timeouts[] = { - [TNONE] = { 0, 0}, - [T10us] = { 0, 10}, - [T30us] = { 0, 30}, - [T100us] = { 0, 100}, - [T300us] = { 0, 300}, - [T1ms] = { 0, 1000}, - [T3ms] = { 0, 3000}, - [T10ms] = { 0, 10000}, - [T30ms] = { 0, 30000}, - [T100ms] = { 0, 100000}, - [T300ms] = { 0, 300000}, - [T1s] = { 1, 0}, - [T3s] = { 3, 0}, - [T10s] = { 10, 0}, - [T30s] = { 30, 0}, - [T100s] = { 100, 0}, - [T300s] = { 300, 0}, - [T1000s] = { 1000, 0} -}; - -static const u_int max_timeouts = sizeof timeouts / sizeof timeouts[0]; - -static int ibdebug; - -static int -ib_set_error(struct ibarg *ap, int error) -{ - - if (ap->__iberr == 0) - ap->__iberr = error; - ap->__ibsta |= ERR; - ap->__retval = ap->__ibsta; - return (0); -} - -static int -ib_had_timeout(struct ibarg *ap) -{ - - ib_set_error(ap, EABO); - ap->__ibsta |= TIMO; - ap->__retval = ap->__ibsta; - return (0); -} - -static int -ib_set_errno(struct ibarg *ap, int errno) -{ - - if (ap->__iberr == 0) { - ap->__iberr = EDVR; - ap->__ibcnt = errno; - } - ap->__ibsta |= ERR; - ap->__retval = ap->__ibsta; - return (0); -} - -static int -gpib_ib_irq(struct upd7210 *u, int isr_3) -{ - struct ibfoo *ib; - - ib = u->ibfoo; - - mtx_assert(&u->mutex, MA_OWNED); - switch (ib->mode) { - case PIO_CMD: - if (!(u->rreg[ISR2] & IXR2_CO)) - return (0); - if (ib->buflen == 0) - break; - upd7210_wr(u, CDOR, *ib->buf); - ib->buf++; - ib->buflen--; - return (1); - case PIO_IDATA: - if (!(u->rreg[ISR1] & IXR1_DI)) - return (0); - *ib->buf = upd7210_rd(u, DIR); - ib->buf++; - ib->buflen--; - if (ib->buflen == 0 || (u->rreg[ISR1] & IXR1_ENDRX)) - break; - return (1); - case PIO_ODATA: - if (!(u->rreg[ISR1] & IXR1_DO)) - return (0); - if (ib->buflen == 0) - break; - if (ib->buflen == 1 && ib->doeoi) - upd7210_wr(u, AUXMR, AUXMR_SEOI); - upd7210_wr(u, CDOR, *ib->buf); - ib->buf++; - ib->buflen--; - return (1); - case DMA_IDATA: - if (!(u->rreg[ISR1] & IXR1_ENDRX)) - return (0); - break; - case FIFO_IDATA: - if (!(isr_3 & 0x15)) - return (0); - while (ib->buflen != 0 && (isr_3 & 0x04 /* NEF */) != 0) { - *ib->buf = bus_read_1(u->reg_res[0], fifob); - ib->buf++; - ib->buflen--; - isr_3 = bus_read_1(u->reg_res[0], isr3); - } - if ((isr_3 & 0x01) != 0 /* xfr done */ || - (u->rreg[ISR1] & IXR1_ENDRX) != 0 || - ib->buflen == 0) - break; - if (isr_3 & 0x10) - /* xfr stopped */ - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - upd7210_wr(u, AUXMR, AUXMR_RFD); - return (1); - case FIFO_CMD: - case FIFO_ODATA: - if (!(isr_3 & 0x19)) - return (0); - if (ib->buflen == 0) - /* xfr DONE */ - break; - while (ib->buflen != 0 && (isr_3 & 0x08 /* NFF */) != 0) { - bus_write_1(u->reg_res[0], fifob, *ib->buf); - ib->buf++; - ib->buflen--; - isr_3 = bus_read_1(u->reg_res[0], isr3); - } - if (isr_3 & 0x10) - /* xfr stopped */ - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - if (ib->buflen == 0) - /* no more NFF interrupts wanted */ - bus_write_1(u->reg_res[0], imr3, 0x11); /* STOP IE, DONE IE */ - return (1); - default: - return (0); - } - upd7210_wr(u, IMR1, 0); - upd7210_wr(u, IMR2, 0); - if (u->use_fifo) { - bus_write_1(u->reg_res[0], imr3, 0x00); - bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ - } - ib->mode = BUSY; - wakeup(&ib->buflen); - return (1); -} - -static void -gpib_ib_timeout(void *arg) -{ - struct upd7210 *u; - struct ibfoo *ib; - struct timeval tv; - u_int isr_3; - - u = arg; - ib = u->ibfoo; - mtx_lock(&u->mutex); - if (ib->mode == DMA_IDATA && isa_dmatc(u->dmachan)) { - KASSERT(u->dmachan >= 0, ("Bogus dmachan = %d", u->dmachan)); - upd7210_wr(u, IMR1, 0); - upd7210_wr(u, IMR2, 0); - ib->mode = BUSY; - wakeup(&ib->buflen); - } - if (ib->mode > BUSY) { - upd7210_rd(u, ISR1); - upd7210_rd(u, ISR2); - if (u->use_fifo) - isr_3 = bus_read_1(u->reg_res[0], isr3); - else - isr_3 = 0; - gpib_ib_irq(u, isr_3); - } - if (ib->mode != IDLE && timevalisset(&ib->deadline)) { - getmicrouptime(&tv); - if (timevalcmp(&ib->deadline, &tv, <)) { - ib_had_timeout(ib->ap); - upd7210_wr(u, IMR1, 0); - upd7210_wr(u, IMR2, 0); - if (u->use_fifo) { - bus_write_1(u->reg_res[0], imr3, 0x00); - bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ - } - ib->mode = BUSY; - wakeup(&ib->buflen); - } - } - if (ib->mode != IDLE) - callout_reset(&ib->callout, hz / 5, gpib_ib_timeout, arg); - mtx_unlock(&u->mutex); -} - -static void -gpib_ib_wait_xfer(struct upd7210 *u, struct ibfoo *ib) -{ - int i; - - mtx_assert(&u->mutex, MA_OWNED); - while (ib->mode > BUSY) { - i = msleep(&ib->buflen, &u->mutex, - PZERO | PCATCH, "ibwxfr", 0); - if (i == EINTR) { - ib_set_errno(ib->ap, i); - break; - } - if (u->rreg[ISR1] & IXR1_ERR) { - ib_set_error(ib->ap, EABO); /* XXX ? */ - break; - } - } - if ((u->rreg[ISR1] & IXR1_ENDRX) != 0) { - ib->ap->__retval |= END; - ib->ap->__ibsta |= END; - } - if ((u->rreg[ISR2] & IXR2_SRQI) != 0) { - ib->ap->__retval |= SRQI; - ib->ap->__ibsta |= SRQI; - } - ib->mode = BUSY; - ib->buf = NULL; - upd7210_wr(u, IMR1, 0); - upd7210_wr(u, IMR2, 0); - if (u->use_fifo) - bus_write_1(u->reg_res[0], imr3, 0x00); -} - -static void -config_eos(struct upd7210 *u, struct handle *h) -{ - int i; - - i = 0; - if (h->eos & REOS) { - upd7210_wr(u, EOSR, h->eos & 0xff); - i |= AUXA_REOS; - } - if (h->eos & XEOS) { - upd7210_wr(u, EOSR, h->eos & 0xff); - i |= AUXA_XEOS; - } - if (h->eos & BIN) - i |= AUXA_BIN; - upd7210_wr(u, AUXRA, C_AUXA | i); -} - -/* - * Look up the handle, and set the deadline if the handle has a timeout. - */ -static int -gethandle(struct upd7210 *u, struct ibarg *ap, struct handle **hp) -{ - struct ibfoo *ib; - struct handle *h; - - KASSERT(ap->__field & __F_HANDLE, ("gethandle without __F_HANDLE")); - ib = u->ibfoo; - LIST_FOREACH(h, &ib->handles, list) { - if (h->handle == ap->handle) { - *hp = h; - return (0); - } - } - ib_set_error(ap, EARG); - return (1); -} - -static int -pio_cmd(struct upd7210 *u, u_char *cmd, int len) -{ - struct ibfoo *ib; - - ib = u->ibfoo; - - if (ib->rdh != NULL || ib->wrh != NULL) { - upd7210_take_ctrl_async(u); - ib->rdh = NULL; - ib->wrh = NULL; - } - mtx_lock(&u->mutex); - ib->buf = cmd; - ib->buflen = len; - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - ib->mode = FIFO_CMD; - upd7210_wr(u, AUXMR, 0x51); /* holdoff immediately */ - bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ - bus_write_1(u->reg_res[0], cfg, 0x80); /* CMD, xfer OUT, 8-bit FIFO */ - bus_write_1(u->reg_res[0], imr3, 0x19); /* STOP IE, NFF IE, DONE IE */ - bus_write_1(u->reg_res[0], cnt0, -len); - bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); - bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); - bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - } else { - ib->mode = PIO_CMD; - upd7210_wr(u, IMR2, IXR2_CO); - gpib_ib_irq(u, 0); - } - - gpib_ib_wait_xfer(u, ib); - - if (u->use_fifo) - bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ - - mtx_unlock(&u->mutex); - return (len - ib->buflen); -} - -static int -pio_odata(struct upd7210 *u, u_char *data, int len) -{ - struct ibfoo *ib; - - ib = u->ibfoo; - - if (len == 0) - return (0); - mtx_lock(&u->mutex); - ib->buf = data; - ib->buflen = len; - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - ib->mode = FIFO_ODATA; - bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ - if (ib->doeoi) - bus_write_1(u->reg_res[0], cfg, 0x08); /* CCEN */ - else - bus_write_1(u->reg_res[0], cfg, 0x00); /* xfer OUT, 8-bit FIFO */ - bus_write_1(u->reg_res[0], imr3, 0x19); /* STOP IE, NFF IE, DONE IE */ - bus_write_1(u->reg_res[0], cnt0, -len); - bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); - bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); - bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - } else { - ib->mode = PIO_ODATA; - upd7210_wr(u, IMR1, IXR1_DO); - } - - gpib_ib_wait_xfer(u, ib); - - if (u->use_fifo) - bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ - - mtx_unlock(&u->mutex); - return (len - ib->buflen); -} - -static int -pio_idata(struct upd7210 *u, u_char *data, int len) -{ - struct ibfoo *ib; - - ib = u->ibfoo; - - mtx_lock(&u->mutex); - ib->buf = data; - ib->buflen = len; - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - ib->mode = FIFO_IDATA; - bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ - bus_write_1(u->reg_res[0], cfg, 0x20); /* xfer IN, 8-bit FIFO */ - bus_write_1(u->reg_res[0], cnt0, -len); - bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); - bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); - bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - upd7210_wr(u, AUXMR, AUXMR_RFD); - bus_write_1(u->reg_res[0], imr3, 0x15); /* STOP IE, NEF IE, DONE IE */ - } else { - ib->mode = PIO_IDATA; - upd7210_wr(u, IMR1, IXR1_DI); - } - - gpib_ib_wait_xfer(u, ib); - - if (u->use_fifo) - bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ - - mtx_unlock(&u->mutex); - return (len - ib->buflen); -} - -static int -dma_idata(struct upd7210 *u, u_char *data, int len) -{ - int j; - struct ibfoo *ib; - - KASSERT(u->dmachan >= 0, ("Bogus dmachan %d", u->dmachan)); - ib = u->ibfoo; - ib->mode = DMA_IDATA; - isa_dmastart(ISADMA_READ, data, len, u->dmachan); - mtx_lock(&u->mutex); - upd7210_wr(u, IMR1, IXR1_ENDRX); - upd7210_wr(u, IMR2, IMR2_DMAI); - gpib_ib_wait_xfer(u, ib); - mtx_unlock(&u->mutex); - j = isa_dmastatus(u->dmachan); - isa_dmadone(ISADMA_READ, data, len, u->dmachan); - return (len - j); -} - -static int -ib_send_msg(struct ibfoo *ib, int msg) -{ - u_char buf[10]; - int i, j; - - i = 0; - buf[i++] = UNT; - buf[i++] = UNL; - buf[i++] = LAD | ib->h->pad; - if (ib->h->sad) - buf[i++] = LAD | TAD | ib->h->sad; - buf[i++] = TAD | 0; - buf[i++] = msg; - j = pio_cmd(ib->u, buf, i); - if (i != j) - ib_set_error(ib->ap, EABO); /* XXX ? */ - return (0); -} - -static int -ibask(struct ibfoo *ib) -{ /* XXX */ - - ibdebug = ib->ap->option; - return (0); -} - -#define ibbna NULL -#define ibcac NULL - -static int -ibclr(struct ibfoo *ib) -{ - - return (ib_send_msg(ib, SDC)); -} - -#define ibcmd NULL -#define ibcmda NULL -#define ibconfig NULL - -static int -ibdev(struct ibfoo *ib) -{ /* TBD */ - struct handle *h; - - h = malloc(sizeof *h, M_IBFOO, M_ZERO | M_WAITOK); - h->handle = alloc_unr(ib->unrhdr); - h->kind = H_DEV; - h->pad = ib->ap->pad; - h->sad = ib->ap->sad; - h->timeout = timeouts[ib->ap->tmo]; - h->eot = ib->ap->eot; - h->eos = ib->ap->eos; - mtx_lock(&ib->u->mutex); - LIST_INSERT_HEAD(&ib->handles, h, list); - mtx_unlock(&ib->u->mutex); - ib->ap->__retval = h->handle; - return (0); -} - -#define ibdiag NULL - -static int -ibdma(struct ibfoo *ib) -{ - - if (ib->u->dmachan < 0 && ib->ap->v) - return (ib_set_error(ib->ap, EARG)); - ib->h->dma = ib->ap->v; - return (0); -} - -static int -ibeos(struct ibfoo *ib) -{ - - ib->ap->__iberr = ib->h->eos; - ib->h->eos = ib->ap->eos; - if (ib->rdh == ib->h) - config_eos(ib->u, ib->h); - return (0); -} - -static int -ibeot(struct ibfoo *ib) -{ - - ib->h->eot = ib->ap->eot; - return (0); -} - -#define ibevent NULL -#define ibfind NULL -#define ibgts NULL -#define ibist NULL -#define iblines NULL -#define ibllo NULL -#define ibln NULL - -static int -ibloc(struct ibfoo *ib) -{ /* XXX */ - - if (ib->h->kind == H_BOARD) - return (EOPNOTSUPP); /* XXX */ - return (ib_send_msg(ib, GTL)); -} - -static int -ibonl(struct ibfoo *ib) -{ /* XXX */ - - if (ib->ap->v) - return (EOPNOTSUPP); /* XXX */ - mtx_lock(&ib->u->mutex); - LIST_REMOVE(ib->h, list); - mtx_unlock(&ib->u->mutex); - free(ib->h, M_IBFOO); - ib->h = NULL; - return (0); -} - -static int -ibpad(struct ibfoo *ib) -{ - - ib->h->pad = ib->ap->pad; - return (0); -} - -#define ibpct NULL -#define ibpoke NULL -#define ibppc NULL - -static int -ibrd(struct ibfoo *ib) -{ /* TBD */ - u_char buf[10], *bp; - int i, j, error, bl, bc; - u_char *dp; - - if (ib->h->kind == H_BOARD) - return (EOPNOTSUPP); /* XXX */ - bl = ib->ap->cnt; - if (bl > PAGE_SIZE) - bl = PAGE_SIZE; - bp = malloc(bl, M_IBFOO, M_WAITOK); - - if (ib->rdh != ib->h) { - i = 0; - buf[i++] = UNT; - buf[i++] = UNL; - buf[i++] = LAD | 0; - buf[i++] = TAD | ib->h->pad; - if (ib->h->sad) - buf[i++] = ib->h->sad; - i = pio_cmd(ib->u, buf, i); - config_eos(ib->u, ib->h); - ib->rdh = ib->h; - ib->wrh = NULL; - } - upd7210_goto_standby(ib->u); - dp = ib->ap->buffer; - bc = ib->ap->cnt; - error = 0; - while (bc > 0 && ib->ap->__iberr == 0) { - j = imin(bc, PAGE_SIZE); - if (ib->h->dma) - i = dma_idata(ib->u, bp, j); - else - i = pio_idata(ib->u, bp, j); - error = copyout(bp, dp , i); - if (error) - break; - ib->ap->__ibcnt += i; - if (i != j) - break; - bc -= i; - dp += i; - } - upd7210_take_ctrl_async(ib->u); - free(bp, M_IBFOO); - return (error); -} - -#define ibrda NULL -#define ibrdf NULL -#define ibrdkey NULL -#define ibrpp NULL -#define ibrsc NULL -#define ibrsp NULL -#define ibrsv NULL - -static int -ibsad(struct ibfoo *ib) -{ - - ib->h->sad = ib->ap->sad; - return (0); -} - -#define ibsgnl NULL - -static int -ibsic(struct ibfoo *ib) -{ /* TBD */ - - upd7210_wr(ib->u, AUXMR, AUXMR_SIFC); - DELAY(100); - upd7210_wr(ib->u, AUXMR, AUXMR_CIFC); - return (0); -} - -#define ibsre NULL -#define ibsrq NULL -#define ibstop NULL - -static int -ibtmo(struct ibfoo *ib) -{ - - ib->h->timeout = timeouts[ib->ap->tmo]; - return (0); -} - -#define ibtrap NULL - -static int -ibtrg(struct ibfoo *ib) -{ - - return (ib_send_msg(ib, GET)); -} - -#define ibwait NULL - -static int -ibwrt(struct ibfoo *ib) -{ /* XXX */ - u_char buf[10], *bp; - int i; - - if (ib->h->kind == H_BOARD) - return (EOPNOTSUPP); - bp = malloc(ib->ap->cnt, M_IBFOO, M_WAITOK); - /* XXX: bigger than PAGE_SIZE handling */ - i = copyin(ib->ap->buffer, bp, ib->ap->cnt); - if (i) { - free(bp, M_IBFOO); - return (i); - } - if (ib->wrh != ib->h) { - i = 0; - buf[i++] = UNT; - buf[i++] = UNL; - buf[i++] = LAD | ib->h->pad; - if (ib->h->sad) - buf[i++] = LAD | TAD | ib->h->sad; - buf[i++] = TAD | 0; - i = pio_cmd(ib->u, buf, i); - ib->rdh = NULL; - ib->wrh = ib->h; - config_eos(ib->u, ib->h); - } - upd7210_goto_standby(ib->u); - ib->doeoi = ib->h->eot; - i = pio_odata(ib->u, bp, ib->ap->cnt); - upd7210_take_ctrl_async(ib->u); - ib->ap->__ibcnt = i; - free(bp, M_IBFOO); - return (0); -} - -#define ibwrta NULL -#define ibwrtf NULL -#define ibwrtkey NULL -#define ibxtrc NULL - -static struct ibhandler { - const char *name; - enum h_kind kind; - ibhandler_t *func; - u_int args; -} ibhandlers[] = { - [__ID_IBASK] = { "ibask", H_EITHER, ibask, __F_HANDLE | __F_OPTION | __F_RETVAL }, - [__ID_IBBNA] = { "ibbna", H_DEV, ibbna, __F_HANDLE | __F_BDNAME }, - [__ID_IBCAC] = { "ibcac", H_BOARD, ibcac, __F_HANDLE | __F_V }, - [__ID_IBCLR] = { "ibclr", H_DEV, ibclr, __F_HANDLE }, - [__ID_IBCMD] = { "ibcmd", H_BOARD, ibcmd, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBCMDA] = { "ibcmda", H_BOARD, ibcmda, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBCONFIG] = { "ibconfig", H_EITHER, ibconfig, __F_HANDLE | __F_OPTION | __F_VALUE }, - [__ID_IBDEV] = { "ibdev", 0, ibdev, __F_BOARDID | __F_PAD | __F_SAD | __F_TMO | __F_EOT | __F_EOS }, - [__ID_IBDIAG] = { "ibdiag", H_EITHER, ibdiag, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBDMA] = { "ibdma", H_EITHER, ibdma, __F_HANDLE | __F_V }, - [__ID_IBEOS] = { "ibeos", H_EITHER, ibeos, __F_HANDLE | __F_EOS }, - [__ID_IBEOT] = { "ibeot", H_EITHER, ibeot, __F_HANDLE | __F_EOT }, - [__ID_IBEVENT] = { "ibevent", H_BOARD, ibevent, __F_HANDLE | __F_EVENT }, - [__ID_IBFIND] = { "ibfind", 0, ibfind, __F_BDNAME }, - [__ID_IBGTS] = { "ibgts", H_BOARD, ibgts, __F_HANDLE | __F_V }, - [__ID_IBIST] = { "ibist", H_BOARD, ibist, __F_HANDLE | __F_V }, - [__ID_IBLINES] = { "iblines", H_BOARD, iblines, __F_HANDLE | __F_LINES }, - [__ID_IBLLO] = { "ibllo", H_EITHER, ibllo, __F_HANDLE }, - [__ID_IBLN] = { "ibln", H_BOARD, ibln, __F_HANDLE | __F_PADVAL | __F_SADVAL | __F_LISTENFLAG }, - [__ID_IBLOC] = { "ibloc", H_EITHER, ibloc, __F_HANDLE }, - [__ID_IBONL] = { "ibonl", H_EITHER, ibonl, __F_HANDLE | __F_V }, - [__ID_IBPAD] = { "ibpad", H_EITHER, ibpad, __F_HANDLE | __F_PAD }, - [__ID_IBPCT] = { "ibpct", H_DEV, ibpct, __F_HANDLE }, - [__ID_IBPOKE] = { "ibpoke", H_EITHER, ibpoke, __F_HANDLE | __F_OPTION | __F_VALUE }, - [__ID_IBPPC] = { "ibppc", H_EITHER, ibppc, __F_HANDLE | __F_V }, - [__ID_IBRD] = { "ibrd", H_EITHER, ibrd, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBRDA] = { "ibrda", H_EITHER, ibrda, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBRDF] = { "ibrdf", H_EITHER, ibrdf, __F_HANDLE | __F_FLNAME }, - [__ID_IBRDKEY] = { "ibrdkey", H_EITHER, ibrdkey, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBRPP] = { "ibrpp", H_EITHER, ibrpp, __F_HANDLE | __F_PPR }, - [__ID_IBRSC] = { "ibrsc", H_BOARD, ibrsc, __F_HANDLE | __F_V }, - [__ID_IBRSP] = { "ibrsp", H_DEV, ibrsp, __F_HANDLE | __F_SPR }, - [__ID_IBRSV] = { "ibrsv", H_EITHER, ibrsv, __F_HANDLE | __F_V }, - [__ID_IBSAD] = { "ibsad", H_EITHER, ibsad, __F_HANDLE | __F_SAD }, - [__ID_IBSGNL] = { "ibsgnl", H_EITHER, ibsgnl, __F_HANDLE | __F_V }, - [__ID_IBSIC] = { "ibsic", H_BOARD, ibsic, __F_HANDLE }, - [__ID_IBSRE] = { "ibsre", H_BOARD, ibsre, __F_HANDLE | __F_V }, - [__ID_IBSRQ] = { "ibsrq", H_EITHER, ibsrq, __F_FUNC }, - [__ID_IBSTOP] = { "ibstop", H_EITHER, ibstop, __F_HANDLE }, - [__ID_IBTMO] = { "ibtmo", H_EITHER, ibtmo, __F_HANDLE | __F_TMO }, - [__ID_IBTRAP] = { "ibtrap", H_EITHER, ibtrap, __F_MASK | __F_MODE }, - [__ID_IBTRG] = { "ibtrg", H_DEV, ibtrg, __F_HANDLE }, - [__ID_IBWAIT] = { "ibwait", H_EITHER, ibwait, __F_HANDLE | __F_MASK }, - [__ID_IBWRT] = { "ibwrt", H_EITHER, ibwrt, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBWRTA] = { "ibwrta", H_EITHER, ibwrta, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBWRTF] = { "ibwrtf", H_EITHER, ibwrtf, __F_HANDLE | __F_FLNAME }, - [__ID_IBWRTKEY] = { "ibwrtkey", H_EITHER, ibwrtkey, __F_HANDLE | __F_BUFFER | __F_CNT }, - [__ID_IBXTRC] = { "ibxtrc", H_EITHER, ibxtrc, __F_HANDLE | __F_BUFFER | __F_CNT }, -}; - -static const u_int max_ibhandler = sizeof ibhandlers / sizeof ibhandlers[0]; - -static void -ib_dump_args(struct ibhandler *ih, struct ibarg *ap) -{ - - if (ih->name != NULL) - printf("%s(", ih->name); - else - printf("ibinvalid("); - printf("[0x%x]", ap->__field); - if (ap->__field & __F_HANDLE) printf(" handle=%d", ap->handle); - if (ap->__field & __F_EOS) printf(" eos=0x%x", ap->eos); - if (ap->__field & __F_EOT) printf(" eot=%d", ap->eot); - if (ap->__field & __F_TMO) printf(" tmo=%d", ap->tmo); - if (ap->__field & __F_PAD) printf(" pad=0x%x", ap->pad); - if (ap->__field & __F_SAD) printf(" sad=0x%x", ap->sad); - if (ap->__field & __F_BUFFER) printf(" buffer=%p", ap->buffer); - if (ap->__field & __F_CNT) printf(" cnt=%ld", ap->cnt); - if (ap->__field & __F_V) printf(" v=%d/0x%x", ap->v, ap->v); - /* XXX more ... */ - printf(")\n"); -} - -static int -gpib_ib_open(struct cdev *dev, int oflags, int devtype, struct thread *td) -{ - struct upd7210 *u; - struct ibfoo *ib; - int error = 0; - - u = dev->si_drv1; - - mtx_lock(&u->mutex); - if (u->busy) { - mtx_unlock(&u->mutex); - return (EBUSY); - } - u->busy = 1; - mtx_unlock(&u->mutex); - - if (u->dmachan >= 0) { - error = isa_dma_acquire(u->dmachan); - if (!error) { - error = isa_dma_init(u->dmachan, PAGE_SIZE, M_WAITOK); - if (error) - isa_dma_release(u->dmachan); - } - } - - if (error) { - mtx_lock(&u->mutex); - u->busy = 0; - mtx_unlock(&u->mutex); - return (error); - } - - ib = malloc(sizeof *ib, M_IBFOO, M_WAITOK | M_ZERO); - LIST_INIT(&ib->handles); - callout_init(&ib->callout, CALLOUT_MPSAFE); - ib->unrhdr = new_unrhdr(0, INT_MAX, NULL); - dev->si_drv2 = ib; - ib->u = u; - u->ibfoo = ib; - u->irq = gpib_ib_irq; - - upd7210_wr(u, AUXMR, AUXMR_CRST); - DELAY(10000); - DELAY(1000); - upd7210_wr(u, IMR1, 0x00); - upd7210_wr(u, IMR2, 0x00); - upd7210_wr(u, SPMR, 0x00); - upd7210_wr(u, ADR, 0x00); - upd7210_wr(u, ADR, ADR_ARS | ADR_DL | ADR_DT); - upd7210_wr(u, ADMR, ADMR_ADM0 | ADMR_TRM0 | ADMR_TRM1); - upd7210_wr(u, EOSR, 0x00); - upd7210_wr(u, AUXMR, C_ICR | 8); - upd7210_wr(u, AUXMR, C_PPR | PPR_U); - upd7210_wr(u, AUXMR, C_AUXA); - upd7210_wr(u, AUXMR, C_AUXB + 3); - upd7210_wr(u, AUXMR, C_AUXE + 0); - upd7210_wr(u, AUXMR, AUXMR_PON); - if (u->use_fifo) { - bus_write_1(u->reg_res[0], imr3, 0x00); - bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft reset */ - bus_write_1(u->reg_res[0], cmdr, 0x03); /* set system - * controller bit */ - } - upd7210_wr(u, AUXMR, AUXMR_CIFC); - DELAY(100); - upd7210_wr(u, AUXMR, AUXMR_SIFC); - upd7210_wr(u, AUXMR, AUXMR_SREN); - return (0); -} - -static int -gpib_ib_close(struct cdev *dev, int oflags, int devtype, struct thread *td) -{ - struct upd7210 *u; - struct ibfoo *ib; - - u = dev->si_drv1; - ib = dev->si_drv2; - /* XXX: assert pointer consistency */ - - u->ibfoo = NULL; - /* XXX: free handles */ - dev->si_drv2 = NULL; - free(ib, M_IBFOO); - - if (u->dmachan >= 0) { - isa_dma_release(u->dmachan); - } - mtx_lock(&u->mutex); - u->busy = 0; - ibdebug = 0; - upd7210_wr(u, IMR1, 0x00); - upd7210_wr(u, IMR2, 0x00); - if (u->use_fifo) { - bus_write_1(u->reg_res[0], imr3, 0x00); - bus_write_1(u->reg_res[0], cmdr, 0x02); /* clear system - * controller bit */ - } - upd7210_wr(u, AUXMR, AUXMR_CRST); - DELAY(10000); - mtx_unlock(&u->mutex); - return (0); -} - -static int -gpib_ib_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td) -{ - struct ibarg *ap; - struct ibhandler *ih; - struct handle *h; - struct upd7210 *u; - struct ibfoo *ib; - int error; - struct timeval deadline, tv; - - u = dev->si_drv1; - ib = u->ibfoo; - - /* We only support a single ioctl, everything else is a mistake */ - if (cmd != GPIB_IBFOO) - return (ENOIOCTL); - - /* Check the identifier and field-bitmap in the arguments. */ - ap = (void *)data; - if (ap->__ident < 0 || ap->__ident >= max_ibhandler) - return (EINVAL); - ih = &ibhandlers[ap->__ident]; - if (ap->__field != ih->args) - return (EINVAL); - - if (ibdebug) - ib_dump_args(ih, ap); - - if (ih->func == NULL) - return (EOPNOTSUPP); - - ap->__iberr = 0; - ap->__ibsta = 0; - ap->__ibcnt = 0; - ap->__retval = 0; - - if (ap->__field & __F_TMO) { - if (ap->tmo < 0 || ap->tmo >= max_timeouts) - return (ib_set_error(ap, EARG)); - } - - if (ap->__field & __F_EOS) { - if ((ap->eos & ~(REOS | XEOS | BIN | 0xff)) || - ((ap->eos & (BIN | 0x80)) == 0x80)) - return (ib_set_error(ap, EARG)); - } - if (ap->__field & __F_PAD) { - if (ap->pad < 0 || ap->pad > 30) - return (ib_set_error(ap, EARG)); - } - if (ap->__field & __F_SAD) { - if (ap->sad != 0 && (ap->sad < 0x60 || ap->sad > 126)) - return (ib_set_error(ap, EARG)); - } - - - mtx_lock(&u->mutex); - - - /* Find the handle, if any */ - h = NULL; - if ((ap->__field & __F_HANDLE) && gethandle(u, ap, &h)) { - mtx_unlock(&u->mutex); - return (0); - } - - /* Check that the handle is the right kind */ - if (h != NULL && !(h->kind & ih->kind)) { - mtx_unlock(&u->mutex); - return (ib_set_error(ap, EARG)); - } - - /* Set up handle and deadline */ - if (h != NULL && timevalisset(&h->timeout)) { - getmicrouptime(&deadline); - timevaladd(&deadline, &h->timeout); - } else { - timevalclear(&deadline); - } - - /* Wait for the card to be(come) available, respect deadline */ - while(u->busy != 1) { - error = msleep(ib, &u->mutex, - PZERO | PCATCH, "gpib_ibioctl", hz / 10); - if (error == 0) - continue; - mtx_unlock(&u->mutex); - if (error == EINTR) - return(ib_set_error(ap, EABO)); - if (error == EWOULDBLOCK && timevalisset(&deadline)) { - getmicrouptime(&tv); - if (timevalcmp(&deadline, &tv, <)) - return(ib_had_timeout(ap)); - } - mtx_lock(&u->mutex); - } - u->busy = 2; - mtx_unlock(&u->mutex); - - /* Hand over deadline handling to the callout routine */ - ib->ap = ap; - ib->h = h; - ib->mode = BUSY; - ib->deadline = deadline; - callout_reset(&ib->callout, hz / 5, gpib_ib_timeout, u); - - error = ih->func(ib); - - /* Release card */ - ib->mode = IDLE; - ib->ap = NULL; - ib->h = NULL; - timevalclear(&deadline); - callout_stop(&ib->callout); - - mtx_lock(&u->mutex); - u->busy = 1; - wakeup(ib); - mtx_unlock(&u->mutex); - - if (error) - return(ib_set_errno(ap, error)); - return (0); -} - -struct cdevsw gpib_ib_cdevsw = { - .d_version = D_VERSION, - .d_name = "gpib_ib", - .d_open = gpib_ib_open, - .d_ioctl = gpib_ib_ioctl, - .d_close = gpib_ib_close, -}; diff --git a/sys/dev/ieee488/ibfoo_int.h b/sys/dev/ieee488/ibfoo_int.h deleted file mode 100644 index 28f72897a9df..000000000000 --- a/sys/dev/ieee488/ibfoo_int.h +++ /dev/null @@ -1,147 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * 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. - * - * This file defines the ABI between the userland gpib library and the - * kernel. This file should not be used anywhere else. - * - * $FreeBSD$ - */ - -#include - -typedef void ibsrq_t(void); -enum ibfoo_id { - __ID_INVALID = 0, - __ID_IBASK, - __ID_IBBNA, - __ID_IBCAC, - __ID_IBCLR, - __ID_IBCMD, - __ID_IBCMDA, - __ID_IBCONFIG, - __ID_IBDEV, - __ID_IBDIAG, - __ID_IBDMA, - __ID_IBEOS, - __ID_IBEOT, - __ID_IBEVENT, - __ID_IBFIND, - __ID_IBGTS, - __ID_IBIST, - __ID_IBLINES, - __ID_IBLLO, - __ID_IBLN, - __ID_IBLOC, - __ID_IBONL, - __ID_IBPAD, - __ID_IBPCT, - __ID_IBPOKE, - __ID_IBPPC, - __ID_IBRD, - __ID_IBRDA, - __ID_IBRDF, - __ID_IBRDKEY, - __ID_IBRPP, - __ID_IBRSC, - __ID_IBRSP, - __ID_IBRSV, - __ID_IBSAD, - __ID_IBSGNL, - __ID_IBSIC, - __ID_IBSRE, - __ID_IBSRQ, - __ID_IBSTOP, - __ID_IBTMO, - __ID_IBTRAP, - __ID_IBTRG, - __ID_IBWAIT, - __ID_IBWRT, - __ID_IBWRTA, - __ID_IBWRTF, - __ID_IBWRTKEY, - __ID_IBXTRC -}; - -#define __F_HANDLE (1 << 0) -#define __F_SPR (1 << 1) -#define __F_BUFFER (1 << 2) -#define __F_RETVAL (1 << 3) -#define __F_BDNAME (1 << 4) -#define __F_MASK (1 << 5) -#define __F_PADVAL (1 << 6) -#define __F_SADVAL (1 << 7) -#define __F_CNT (1 << 8) -#define __F_TMO (1 << 9) -#define __F_EOS (1 << 10) -#define __F_PPR (1 << 11) -#define __F_EOT (1 << 12) -#define __F_V (1 << 13) -#define __F_VALUE (1 << 14) -#define __F_SAD (1 << 15) -#define __F_BOARDID (1 << 16) -#define __F_OPTION (1 << 17) -#define __F_FLNAME (1 << 18) -#define __F_FUNC (1 << 19) -#define __F_LINES (1 << 20) -#define __F_PAD (1 << 21) -#define __F_MODE (1 << 22) -#define __F_LISTENFLAG (1 << 23) -#define __F_EVENT (1 << 24) - -struct ibarg { - enum ibfoo_id __ident; - unsigned int __field; - int __retval; - int __ibsta; - int __iberr; - int __ibcnt; - int handle; - char * spr; - void * buffer; - int * retval; - char * bdname; - int mask; - int padval; - int sadval; - long cnt; - int tmo; - int eos; - char * ppr; - int eot; - int v; - int value; - int sad; - int boardID; - int option; - char * flname; - ibsrq_t * func; - short * lines; - int pad; - int mode; - short * listenflag; - short * event; -}; - -#define GPIB_IBFOO _IOWR(4, 0, struct ibarg) diff --git a/sys/dev/ieee488/pcii.c b/sys/dev/ieee488/pcii.c deleted file mode 100644 index 833ec9194f68..000000000000 --- a/sys/dev/ieee488/pcii.c +++ /dev/null @@ -1,255 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * Copyright (c) 2010 Joerg Wunsch - * 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. - * - * Driver for GPIB cards based on NEC µPD7210 and compatibles. - * - * This driver just hooks up to the hardware and leaves all the interesting - * stuff to upd7210.c. - * - * Supported hardware: - * PCIIA compatible cards. - * - * Tested and known working: - * "B&C Microsystems PC488A-0" - * "National Instruments GPIB-PCII/PCIIA" (in PCIIa mode) - * "Axiom AX5488" - * - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define UPD7210_HW_DRIVER -#include - -struct pcii_softc { - int foo; - struct resource *res[11]; - void *intr_handler; - struct upd7210 upd7210; -}; - -static devclass_t pcii_devclass; - -static int pcii_probe(device_t dev); -static int pcii_attach(device_t dev); - -static device_method_t pcii_methods[] = { - DEVMETHOD(device_probe, pcii_probe), - DEVMETHOD(device_attach, pcii_attach), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - - { 0, 0 } -}; - -static struct resource_spec pcii_res_spec[] = { - { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, - { SYS_RES_DRQ, 0, RF_ACTIVE | RF_SHAREABLE | RF_OPTIONAL}, - { SYS_RES_IOPORT, 0, RF_ACTIVE}, - { SYS_RES_IOPORT, 1, RF_ACTIVE}, - { SYS_RES_IOPORT, 2, RF_ACTIVE}, - { SYS_RES_IOPORT, 3, RF_ACTIVE}, - { SYS_RES_IOPORT, 4, RF_ACTIVE}, - { SYS_RES_IOPORT, 5, RF_ACTIVE}, - { SYS_RES_IOPORT, 6, RF_ACTIVE}, - { SYS_RES_IOPORT, 7, RF_ACTIVE}, - { SYS_RES_IOPORT, 8, RF_ACTIVE | RF_SHAREABLE}, - { -1, 0, 0 } -}; - -static driver_t pcii_driver = { - "pcii", - pcii_methods, - sizeof(struct pcii_softc), -}; - -static int -pcii_probe(device_t dev) -{ - int rid, i, j; - u_long start, count, addr; - int error = 0; - struct pcii_softc *sc; - - device_set_desc(dev, "PCII IEEE-4888 controller"); - sc = device_get_softc(dev); - - rid = 0; - if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &start, &count) != 0) - return ENXIO; - /* - * The PCIIA decodes a fixed pattern of 0x2e1 for the lower 10 - * address bits A0 ... A9. Bits A10 through A12 are used by - * the µPD7210 register select lines. This makes the - * individual 7210 register being 0x400 bytes apart in the ISA - * bus address space. Address bits A13 and A14 are compared - * to a DIP switch setting on the card, allowing for up to 4 - * different cards being installed (at base addresses 0x2e1, - * 0x22e1, 0x42e1, and 0x62e1, respectively). A15 has been - * used to select an optional on-board time-of-day clock chip - * (MM58167A) on the original PCIIA rather than the µPD7210 - * (which is not implemented on later boards). The - * documentation states the respective addresses for that chip - * should be handled as reserved addresses, which we don't do - * (right now). Finally, the IO addresses 0x2f0 ... 0x2f7 for - * a "special interrupt handling feature" (re-enable - * interrupts so the IRQ can be shared). - * - * Usually, the user will only set the base address in the - * device hints, so we handle the rest here. - * - * (Source: GPIB-PCIIA Technical Reference Manual, September - * 1989 Edition, National Instruments.) - */ - if ((start & 0x3ff) != 0x2e1) { - if (bootverbose) - printf("pcii_probe: PCIIA base address 0x%lx not " - "0x2e1/0x22e1/0x42e1/0x62e1\n", - start); - return (ENXIO); - } - - for (rid = 0, addr = start; rid < 8; rid++, addr += 0x400) { - if (bus_set_resource(dev, SYS_RES_IOPORT, rid, addr, 1) != 0) { - printf("pcii_probe: could not set IO port 0x%lx\n", - addr); - return (ENXIO); - } - } - if (bus_get_resource(dev, SYS_RES_IRQ, 0, &start, &count) != 0) { - printf("pcii_probe: cannot obtain IRQ level\n"); - return ENXIO; - } - if (start > 7) { - printf("pcii_probe: IRQ level %lu too high\n", start); - return ENXIO; - } - - if (bus_set_resource(dev, SYS_RES_IOPORT, 8, 0x2f0 + start, 1) != 0) { - printf("pcii_probe: could not set IO port 0x%3lx\n", - 0x2f0 + start); - return (ENXIO); - } - - error = bus_alloc_resources(dev, pcii_res_spec, sc->res); - if (error) { - printf("pcii_probe: Could not allocate resources\n"); - return (error); - } - error = ENXIO; - /* - * Perform some basic tests on the µPD7210 registers. At - * least *some* register must read different from 0x00 or - * 0xff. - */ - for (i = 0; i < 8; i++) { - j = bus_read_1(sc->res[2 + i], 0); - if (j != 0x00 && j != 0xff) - error = 0; - } - /* SPSR/SPMR read/write test */ - if (!error) { - bus_write_1(sc->res[2 + 3], 0, 0x55); - if (bus_read_1(sc->res[2 + 3], 0) != 0x55) - error = ENXIO; - } - if (!error) { - bus_write_1(sc->res[2 + 3], 0, 0xaa); - if (bus_read_1(sc->res[2 + 3], 0) != 0xaa) - error = ENXIO; - } - if (error) - printf("pcii_probe: probe failure\n"); - - bus_release_resources(dev, pcii_res_spec, sc->res); - return (error); -} - -static int -pcii_attach(device_t dev) -{ - struct pcii_softc *sc; - u_long start, count; - int unit; - int rid; - int error = 0; - - unit = device_get_unit(dev); - sc = device_get_softc(dev); - memset(sc, 0, sizeof *sc); - - device_set_desc(dev, "PCII IEEE-4888 controller"); - - if (bus_get_resource(dev, SYS_RES_IRQ, 0, &start, &count) != 0) { - printf("pcii_attach: cannot obtain IRQ number\n"); - return ENXIO; - } - - error = bus_alloc_resources(dev, pcii_res_spec, sc->res); - if (error) - return (error); - - error = bus_setup_intr(dev, sc->res[0], - INTR_TYPE_MISC | INTR_MPSAFE, NULL, - upd7210intr, &sc->upd7210, &sc->intr_handler); - if (error) { - bus_release_resources(dev, pcii_res_spec, sc->res); - return (error); - } - - for (rid = 0; rid < 8; rid++) { - sc->upd7210.reg_res[rid] = sc->res[2 + rid]; - sc->upd7210.reg_offset[rid] = 0; - } - sc->upd7210.irq_clear_res = sc->res[10]; - sc->upd7210.use_fifo = 0; - - if (sc->res[1] == NULL) - sc->upd7210.dmachan = -1; - else - sc->upd7210.dmachan = rman_get_start(sc->res[1]); - - upd7210attach(&sc->upd7210); - device_printf(dev, "attached gpib%d\n", sc->upd7210.unit); - - return (0); -} - -DRIVER_MODULE(pcii, isa, pcii_driver, pcii_devclass, 0, 0); -DRIVER_MODULE(pcii, acpi, pcii_driver, pcii_devclass, 0, 0); diff --git a/sys/dev/ieee488/tnt4882.c b/sys/dev/ieee488/tnt4882.c deleted file mode 100644 index 4b69d0dbd005..000000000000 --- a/sys/dev/ieee488/tnt4882.c +++ /dev/null @@ -1,320 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * Copyright (c) 2010 Joerg Wunsch - * 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$ - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* vtophys */ -#include -#include -#include - -#define UPD7210_HW_DRIVER 1 -#include -#include - -struct tnt_softc { - int foo; - struct upd7210 upd7210; - - struct resource *res[3]; - void *intr_handler; -}; - -static struct resource_spec tnt_res_spec[] = { - { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE}, - { SYS_RES_MEMORY, PCIR_BAR(1), RF_ACTIVE}, - { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, - { -1, 0 } -}; - -struct tst { - enum {RD, WT, xDELAY, END} - action; - enum tnt4882reg reg; - uint8_t val; -}; - -/* - * From NI Application note 095: - * Writing Functional Self-Tests for the TNT4882 GPIB Interface Chip - * XXX: fill in the rest ? - */ -static struct tst tst_reset[] = { - {WT, tauxcr, 0x80}, /* chip reset if in 9914 mode */ - {WT, auxmr, 0x80}, /* swrst if swapped */ - {WT, tauxcr, 0x99}, /* switch to 7210 mode */ - {WT, auxmr, 0x99}, /* switch to 7210 mode if swapped */ - {WT, auxmr, 0x02}, /* execute chip reset */ - {WT, keyreg, 0x00}, /* important! clear the swap bit */ - {WT, eosr, 0x00}, /* clear EOS register */ - {WT, cdor, 0x00}, /* clear data lines */ - {WT, imr1, 0x00}, /* disable all interrupts */ - {WT, imr2, 0x00}, - {WT, imr0, 0x80}, - {WT, adr, 0x80}, - {WT, adr, 0x00}, - {WT, admr, 0x00}, /* clear addressing modes */ - {WT, auxmr, 0x00}, /* release from idle state with pon */ - {WT, auxmr, 0x60}, /* reset ppr */ - {WT, bcr, 0x00}, /* reset bcr */ - {WT, misc, 0x04}, /* set wrap plug bit */ - {WT, cmdr, 0xB2}, /* issue soft reset */ - {WT, hssel, 0x00}, /* select two-chip mode */ - {END, 0, 0} -}; - -static struct tst tst_read_reg[] = { - {RD, isr1, 0x00}, /* Verify mask registers are clear */ - {RD, isr2, 0x00}, - {RD, adsr, 0x40}, /* Verify ATN is not asserted */ - {RD, adr0, 0x00}, /* Verify Primary address not set */ - {RD, adr1, 0x00}, /* Verify Secondary address not set */ - {RD, sts1, 0x8B}, /* Verify DONE, STOP, HALT, and GSYNC set */ - {RD, isr3, 0x19}, /* Verify STOP, Not Full FIFO, & DONE set */ - {RD, sts2, 0x9A}, /* Verify FIFO A/B is empty */ - {RD, sasr, 0x00}, /* Verify clear */ - {RD, isr0, 0x01}, /* Verify SYNC bit is set */ - {END, 0, 0} -}; - -static struct tst tst_bsr_dcr[] = { - {WT, bcr, 0x55}, /* Set DAV, NRFD, SRQ, and REN */ - {WT, dcr, 0xAA}, /* Write pattern to GPIB data lines */ - {RD, bsr, 0x55}, /* Verify DAV, NRFD, SRQ, and REN are set */ - {RD, dsr, 0xAA}, /* Verify data pattern written previously */ - {WT, bcr, 0xAA}, /* Set ATN, NDAC, EOI, & IFC */ - {WT, dcr, 0x55}, /* Write pattern to GPIB data lines */ - {RD, bsr, 0xAA}, /* Verify ATN, NDAC, EOI, & IFC are set */ - {RD, dsr, 0x55}, /* Verify data pattern written previously */ - {WT, bcr, 0x00}, /* Clear control lines */ - {WT, dcr, 0x00}, /* Clear data lines */ - {RD, bsr, 0x00}, /* Verify control lines are clear */ - {RD, dsr, 0x00}, /* Verify data lines are clear */ - {END, 0, 0} -}; - -static struct tst tst_adr0_1[] = { - {WT, adr, 0x55}, /* Set Primary talk address */ - {WT, adr, 0xAA}, /* Set Secondary listen address */ - {RD, adr0, 0x55}, /* Read Primary address */ - {RD, adr1, 0x2A}, /* Read Secondary address */ - {WT, adr, 0x2A}, /* Set Primay listen address */ - {WT, adr, 0xD5}, /* Set Secondary talk address */ - {RD, adr0, 0x2A}, /* Read Primary address */ - {RD, adr1, 0x55}, /* Read Secondary address */ - {END, 0, 0} -}; - -static struct tst tst_cdor_dir[] = { - {WT, admr, 0xF0}, /* program AT-GPIB as talker only and - * listener only */ - {RD, isr1, 0x02}, /* check DO bit set */ - {RD, adsr, 0x46}, /* check AT-GPIB is both talker active - * and listener active */ - {WT, cdor, 0xAA}, /* write out data byte */ - {xDELAY, 0, 1}, /* One ISA I/O Cycle (500-ns) */ - {RD, isr1, 0x03}, /* check DO and DI bits set */ - {RD, dir, 0xAA}, /* verify data received */ - {WT, cdor, 0x55}, /* write out data byte */ - {xDELAY, 0, 1}, /* One ISA I/O Cycle (500-ns) */ - {RD, dir, 0x55}, /* verify data received */ - {END, 0, 0} -}; - -static struct tst tst_spmr_spsr[] = { - {WT, spsr, 0x00}, /* Write pattern to SPSR register */ - {RD, spmr, 0x00}, /* Read back previously written pattern */ - {WT, spsr, 0xBF}, /* Write pattern to SPSR register */ - {RD, spmr, 0xBF}, /* Read back previously written pattern */ - {END, 0, 0} -}; - -static struct tst tst_count0_1[] = { - {WT, cnt0, 0x55}, /* Verify every other bit can be set */ - {WT, cnt1, 0xAA}, - {RD, cnt0, 0x55}, /* Read back previously written pattern */ - {RD, cnt1, 0xAA}, - {WT, cnt0, 0xAA}, /* Verify every other bit can be set */ - {WT, cnt1, 0x55}, - {RD, cnt0, 0xAA}, /* Read back previously written pattern */ - {RD, cnt1, 0x55}, - {END, 0, 0} -}; - -static int -tst_exec(struct tnt_softc *sc, struct tst *tp, const char *name) -{ - uint8_t u; - int step; - - for (step = 0; tp->action != END; tp++, step++) { - switch (tp->action) { - case WT: - bus_write_1(sc->res[1], tp->reg, tp->val); - break; - case RD: - u = bus_read_1(sc->res[1], tp->reg); - if (u != tp->val) { - printf( - "Test %s, step %d: reg(%02x) = %02x", - name, step, tp->reg, u); - printf( "should have been %02x\n", tp->val); - return (1); - } - break; - case xDELAY: - DELAY(tp->val); - break; - default: - printf("Unknown action in test %s, step %d: %d\n", - name, step, tp->action); - return (1); - } - } - if (bootverbose) - printf("Test %s passed\n", name); - return (0); -} - -static int -tnt_probe(device_t dev) -{ - - if (pci_get_vendor(dev) == 0x1093 && pci_get_device(dev) == 0xc801) { - device_set_desc(dev, "NI PCI-GPIB"); - return (BUS_PROBE_DEFAULT); - } - return (ENXIO); -} - -static int -tnt_attach(device_t dev) -{ - struct tnt_softc *sc; - int error, i; - uint8_t version; - - sc = device_get_softc(dev); - - error = bus_alloc_resources(dev, tnt_res_spec, sc->res); - if (error) - return (error); - - error = bus_setup_intr(dev, sc->res[2], INTR_TYPE_MISC | INTR_MPSAFE, - NULL, upd7210intr, &sc->upd7210, &sc->intr_handler); - - /* IO Device Window Base Size Register (IODWBSR) */ - bus_write_4(sc->res[0], 0xc0, rman_get_start(sc->res[1]) | 0x80); - - tst_exec(sc, tst_reset, "Reset"); - tst_exec(sc, tst_read_reg, "Read registers"); - tst_exec(sc, tst_bsr_dcr, "BSR & DCR"); - tst_exec(sc, tst_adr0_1, "ADR0,1"); - tst_exec(sc, tst_cdor_dir, "CDOR/DIR"); - tst_exec(sc, tst_spmr_spsr, "CPMR/SPSR"); - tst_exec(sc, tst_count0_1, "COUNT0:1"); - tst_exec(sc, tst_reset, "Reset"); - - version = bus_read_1(sc->res[1], csr); - version = (version >> 4) & 0x0f; - device_printf(dev, "Chip version 0x%02x (TNT%s)\n", - version, - version >= 4? "5004 or above": "4882"); - if (version >= 4) { - device_printf(dev, "Forcing FIFO mode\n"); - sc->upd7210.use_fifo = 1; - } else { - sc->upd7210.use_fifo = 0; - } - - /* pass 7210 interrupts through */ - bus_write_1(sc->res[1], imr3, 0x02); - - for (i = 0; i < 8; i++) { - sc->upd7210.reg_res[i] = sc->res[1]; - sc->upd7210.reg_offset[i] = i * 2; - } - - /* No DMA help */ - sc->upd7210.dmachan = -1; - - /* No "special interrupt handling" needed here. */ - sc->upd7210.irq_clear_res = NULL; - - upd7210attach(&sc->upd7210); - device_printf(dev, "attached gpib%d\n", sc->upd7210.unit); - - if (sc->upd7210.use_fifo) - bus_write_1(sc->res[0], hssel, 0x01); /* one-chip mode */ - - - return (0); -} - -static int -tnt_detach(device_t dev) -{ - struct tnt_softc *sc; - - sc = device_get_softc(dev); - bus_teardown_intr(dev, sc->res[2], sc->intr_handler); - upd7210detach(&sc->upd7210); - - bus_release_resources(dev, tnt_res_spec, sc->res); - - return (0); -} - -static device_method_t tnt4882_methods[] = { - DEVMETHOD(device_probe, tnt_probe), - DEVMETHOD(device_attach, tnt_attach), - DEVMETHOD(device_detach, tnt_detach), - { 0, 0 } -}; - -static driver_t pci_gpib_driver = { - "tnt4882", - tnt4882_methods, - sizeof(struct tnt_softc) -}; - -static devclass_t pci_gpib_devclass; - -DRIVER_MODULE(pci_gpib, pci, pci_gpib_driver, pci_gpib_devclass, 0, 0); diff --git a/sys/dev/ieee488/tnt4882.h b/sys/dev/ieee488/tnt4882.h deleted file mode 100644 index 221cfd943ccd..000000000000 --- a/sys/dev/ieee488/tnt4882.h +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * Copyright (c) 2010 Joerg Wunsch - * 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$ - */ - -enum tnt4882reg { - dir = 0x00, - cdor = 0x00, - isr1 = 0x02, - imr1 = 0x02, - isr2 = 0x04, - imr2 = 0x04, - accwr = 0x05, - spsr = 0x06, - spmr = 0x06, - intr = 0x07, - adsr = 0x08, - admr = 0x08, - cnt2 = 0x09, - cptr = 0x0a, - auxmr = 0x0a, - tauxcr = 0x0a, /* 9914 mode register */ - cnt3 = 0x0b, - adr0 = 0x0c, - adr = 0x0c, - hssel = 0x0d, - adr1 = 0x0e, - eosr = 0x0e, - sts1 = 0x10, - cfg = 0x10, - dsr = 0x11, - sh_cnt = 0x11, - imr3 = 0x12, - hier = 0x13, - cnt0 = 0x14, - misc = 0x15, - cnt1 = 0x16, - csr = 0x17, - keyreg = 0x17, - fifob = 0x18, - fifoa = 0x19, - isr3 = 0x1a, - ccr = 0x1a, - sasr = 0x1b, - dcr = 0x1b, - sts2 = 0x1c, - cmdr = 0x1c, - isr0 = 0x1d, - imr0 = 0x1d, - timer = 0x1e, - bsr = 0x1f, - bcr = 0x1f -}; - diff --git a/sys/dev/ieee488/ugpib.h b/sys/dev/ieee488/ugpib.h deleted file mode 100644 index 726a70219dd8..000000000000 --- a/sys/dev/ieee488/ugpib.h +++ /dev/null @@ -1,155 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * 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$ - * - */ - -#ifndef _DEV_IEEE488_UGPIB_H_ -#define _DEV_IEEE488_UGPIB_H_ - -/* ibfoo() return values */ -#define EDVR 0 /* System error */ -#define ECIC 1 /* Not Active Controller */ -#define ENOL 2 /* Nobody listening */ -#define EADR 3 /* Controller not addressed */ -#define EARG 4 /* Invalid argument */ -#define ESAC 5 /* Not System Controller */ -#define EABO 6 /* I/O Aborted/Time out */ -#define ENEB 7 /* No such controller */ -#define EOIP 10 /* Async I/O in progress */ -#define ECAP 11 /* No such capability */ -#define EFSO 12 /* File system error */ -#define EBUS 14 /* Command byte xfer error */ -#define ESTB 15 /* Serial poll status byte lost */ -#define ESRQ 16 /* SRQ line stuck */ -#define ETAB 20 /* Table problem */ - -/* ibsta bits */ -#define ERR (1<<15) /* Error */ -#define TIMO (1<<14) /* Timeout */ -#define END (1<<13) /* EOI/EOS */ -#define SRQI (1<<12) /* SRQ */ -#define RQS (1<<11) /* Device requests service */ -#define SPOLL (1<<10) /* Serial Poll */ -#define EVENT (1<<9) /* Event occured */ -#define CMPL (1<<8) /* I/O complete */ -#define LOK (1<<7) /* Lockout */ -#define REM (1<<6) /* Remote */ -#define CIC (1<<5) /* CIC */ -#define ATN (1<<4) /* ATN */ -#define TACS (1<<3) /* Talker */ -#define LACS (1<<2) /* Listener */ -#define DTAS (1<<1) /* Device trigger status */ -#define DCAS (1<<0) /* Device clear state */ - -/* Timeouts */ -#define TNONE 0 -#define T10us 1 -#define T30us 2 -#define T100us 3 -#define T300us 4 -#define T1ms 5 -#define T3ms 6 -#define T10ms 7 -#define T30ms 8 -#define T100ms 9 -#define T300ms 10 -#define T1s 11 -#define T3s 12 -#define T10s 13 -#define T30s 14 -#define T100s 15 -#define T300s 16 -#define T1000s 17 - -/* EOS bits */ -#define REOS (1 << 10) -#define XEOS (1 << 11) -#define BIN (1 << 12) - -/* Bus commands */ -#define GTL 0x01 /* Go To Local */ -#define SDC 0x04 /* Selected Device Clear */ -#define GET 0x08 /* Group Execute Trigger */ -#define LAD 0x20 /* Listen address */ -#define UNL 0x3F /* Unlisten */ -#define TAD 0x40 /* Talk address */ -#define UNT 0x5F /* Untalk */ - -#ifndef _KERNEL - -extern int ibcnt, iberr, ibsta; - -int ibask(int handle, int option, int *retval); -int ibbna(int handle, char *bdname); -int ibcac(int handle, int v); -int ibclr(int handle); -int ibcmd(int handle, void *buffer, long cnt); -int ibcmda(int handle, void *buffer, long cnt); -int ibconfig(int handle, int option, int value); -int ibdev(int boardID, int pad, int sad, int tmo, int eot, int eos); -int ibdiag(int handle, void *buffer, long cnt); -int ibdma(int handle, int v); -int ibeos(int handle, int eos); -int ibeot(int handle, int eot); -int ibevent(int handle, short *event); -int ibfind(char *bdname); -int ibgts(int handle, int v); -int ibist(int handle, int v); -int iblines(int handle, short *lines); -int ibllo(int handle); -int ibln(int handle, int padval, int sadval, short *listenflag); -int ibloc(int handle); -int ibonl(int handle, int v); -int ibpad(int handle, int pad); -int ibpct(int handle); -int ibpoke(int handle, int option, int value); -int ibppc(int handle, int v); -int ibrd(int handle, void *buffer, long cnt); -int ibrda(int handle, void *buffer, long cnt); -int ibrdf(int handle, char *flname); -int ibrdkey(int handle, void *buffer, int cnt); -int ibrpp(int handle, char *ppr); -int ibrsc(int handle, int v); -int ibrsp(int handle, char *spr); -int ibrsv(int handle, int v); -int ibsad(int handle, int sad); -int ibsgnl(int handle, int v); -int ibsic(int handle); -int ibsre(int handle, int v); -int ibsrq(void (*func)(void)); -int ibstop(int handle); -int ibtmo(int handle, int tmo); -int ibtrap(int mask, int mode); -int ibtrg(int handle); -int ibwait(int handle, int mask); -int ibwrt(int handle, const void *buffer, long cnt); -int ibwrta(int handle, const void *buffer, long cnt); -int ibwrtf(int handle, const char *flname); -int ibwrtkey(int handle, const void *buffer, int cnt); -int ibxtrc(int handle, void *buffer, long cnt); -#endif /* _KERNEL */ -#endif /* _DEV_IEEE488_UGPIB_H_ */ diff --git a/sys/dev/ieee488/upd7210.c b/sys/dev/ieee488/upd7210.c deleted file mode 100644 index 0e76c83b1220..000000000000 --- a/sys/dev/ieee488/upd7210.c +++ /dev/null @@ -1,369 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * Copyright (c) 2010 Joerg Wunsch - * 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. - * - * High-level driver for µPD7210 based GPIB cards. - * - */ - -#include -__FBSDID("$FreeBSD$"); - -# define GPIB_DEBUG -# undef GPIB_DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define UPD7210_HW_DRIVER -#define UPD7210_SW_DRIVER -#include -#include - -static MALLOC_DEFINE(M_GPIB, "GPIB", "GPIB"); - -/* upd7210 generic stuff */ - -void -upd7210_print_isr(u_int isr1, u_int isr2) -{ - printf("isr1=0x%b isr2=0x%b", - isr1, "\20\10CPT\7APT\6DET\5ENDRX\4DEC\3ERR\2DO\1DI", - isr2, "\20\10INT\7SRQI\6LOK\5REM\4CO\3LOKC\2REMC\1ADSC"); -} - -u_int -upd7210_rd(struct upd7210 *u, enum upd7210_rreg reg) -{ - u_int r; - - r = bus_read_1(u->reg_res[reg], u->reg_offset[reg]); - u->rreg[reg] = r; - return (r); -} - -void -upd7210_wr(struct upd7210 *u, enum upd7210_wreg reg, u_int val) -{ - - bus_write_1(u->reg_res[reg], u->reg_offset[reg], val); - u->wreg[reg] = val; - if (reg == AUXMR) - u->wreg[8 + (val >> 5)] = val & 0x1f; -} - -void -upd7210intr(void *arg) -{ - u_int isr_1, isr_2, isr_3; - struct upd7210 *u; - - u = arg; - mtx_lock(&u->mutex); - isr_1 = upd7210_rd(u, ISR1); - isr_2 = upd7210_rd(u, ISR2); - if (u->use_fifo) { - isr_3 = bus_read_1(u->reg_res[0], isr3); - } else { - isr_3 = 0; - } - if (isr_1 != 0 || isr_2 != 0 || isr_3 != 0) { - if (u->busy == 0 || u->irq == NULL || !u->irq(u, isr_3)) { -#if 0 - printf("upd7210intr [%02x %02x %02x", - upd7210_rd(u, DIR), isr1, isr2); - printf(" %02x %02x %02x %02x %02x] ", - upd7210_rd(u, SPSR), - upd7210_rd(u, ADSR), - upd7210_rd(u, CPTR), - upd7210_rd(u, ADR0), - upd7210_rd(u, ADR1)); - upd7210_print_isr(isr1, isr2); - printf("\n"); -#endif - } - /* - * "special interrupt handling" - * - * In order to implement shared IRQs, the original - * PCIIa uses IO locations 0x2f0 + (IRQ#) as an output - * location. If an ISR for a particular card has - * detected this card triggered the IRQ, it must reset - * the card's IRQ by writing (anything) to that IO - * location. - * - * Some clones apparently don't implement this - * feature, but National Instrument cards do. - */ - if (u->irq_clear_res != NULL) - bus_write_1(u->irq_clear_res, 0, 42); - } - mtx_unlock(&u->mutex); -} - -int -upd7210_take_ctrl_async(struct upd7210 *u) -{ - int i; - - upd7210_wr(u, AUXMR, AUXMR_TCA); - - if (!(upd7210_rd(u, ADSR) & ADSR_ATN)) - return (0); - for (i = 0; i < 20; i++) { - DELAY(1); - if (!(upd7210_rd(u, ADSR) & ADSR_ATN)) - return (0); - } - return (1); -} - -int -upd7210_goto_standby(struct upd7210 *u) -{ - int i; - - upd7210_wr(u, AUXMR, AUXMR_GTS); - - if (upd7210_rd(u, ADSR) & ADSR_ATN) - return (0); - for (i = 0; i < 20; i++) { - DELAY(1); - if (upd7210_rd(u, ADSR) & ADSR_ATN) - return (0); - } - return (1); -} - -/* Unaddressed Listen Only mode */ - -static int -gpib_l_irq(struct upd7210 *u, int isr_3) -{ - int i; - int have_data = 0; - - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - if (isr_3 & 0x04) { - /* FIFO not empty */ - i = bus_read_1(u->reg_res[0], fifob); - have_data = 1; - bus_write_1(u->reg_res[0], cnt0, -1); - bus_write_1(u->reg_res[0], cnt1, (-1) >> 8); - bus_write_1(u->reg_res[0], cnt2, (-1) >> 16); - bus_write_1(u->reg_res[0], cnt3, (-1) >> 24); - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - } - } else if (u->rreg[ISR1] & 1) { - i = upd7210_rd(u, DIR); - have_data = 1; - } - - if (have_data) { - u->buf[u->buf_wp++] = i; - u->buf_wp &= (u->bufsize - 1); - i = (u->buf_rp + u->bufsize - u->buf_wp) & (u->bufsize - 1); - if (i < 8) { - if (u->use_fifo) - bus_write_1(u->reg_res[0], imr3, 0x00); - else - upd7210_wr(u, IMR1, 0); - } - wakeup(u->buf); - return (1); - } - return (0); -} - -static int -gpib_l_open(struct cdev *dev, int oflags, int devtype, struct thread *td) -{ - struct upd7210 *u; - - u = dev->si_drv1; - - mtx_lock(&u->mutex); - if (u->busy) { - mtx_unlock(&u->mutex); - return (EBUSY); - } - u->busy = 1; - u->irq = gpib_l_irq; - mtx_unlock(&u->mutex); - - u->buf = malloc(PAGE_SIZE, M_GPIB, M_WAITOK); - u->bufsize = PAGE_SIZE; - u->buf_wp = 0; - u->buf_rp = 0; - - upd7210_wr(u, AUXMR, AUXMR_CRST); /* chip reset */ - DELAY(10000); - upd7210_wr(u, AUXMR, C_ICR | 8); /* 8 MHz clock */ - DELAY(1000); - upd7210_wr(u, ADR, 0x60); /* ADR0: disable listener and talker 0 */ - upd7210_wr(u, ADR, 0xe0); /* ADR1: disable listener and talker 1 */ - upd7210_wr(u, ADMR, 0x70); /* listen-only (lon) */ - upd7210_wr(u, AUXMR, AUXMR_PON); /* immediate execute power-on (pon) */ - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ - bus_write_1(u->reg_res[0], cfg, 0x20); /* xfer IN, 8-bit FIFO */ - bus_write_1(u->reg_res[0], cnt0, -1); - bus_write_1(u->reg_res[0], cnt1, (-1) >> 8); - bus_write_1(u->reg_res[0], cnt2, (-1) >> 16); - bus_write_1(u->reg_res[0], cnt3, (-1) >> 24); - bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ - bus_write_1(u->reg_res[0], imr3, 0x04); /* NEF IE */ - } else { - /* µPD7210/NAT7210, or TNT4882 in non-FIFO mode */ - upd7210_wr(u, IMR1, 0x01); /* data in interrupt enable */ - } - return (0); -} - -static int -gpib_l_close(struct cdev *dev, int oflags, int devtype, struct thread *td) -{ - struct upd7210 *u; - - u = dev->si_drv1; - - mtx_lock(&u->mutex); - u->busy = 0; - if (u->use_fifo) { - /* TNT5004 or TNT4882 in FIFO mode */ - bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ - bus_write_1(u->reg_res[0], imr3, 0x00); - } - upd7210_wr(u, AUXMR, AUXMR_CRST); - DELAY(10000); - upd7210_wr(u, IMR1, 0x00); - upd7210_wr(u, IMR2, 0x00); - free(u->buf, M_GPIB); - u->buf = NULL; - mtx_unlock(&u->mutex); - return (0); -} - -static int -gpib_l_read(struct cdev *dev, struct uio *uio, int ioflag) -{ - struct upd7210 *u; - int error; - size_t z; - - u = dev->si_drv1; - error = 0; - - mtx_lock(&u->mutex); - while (u->buf_wp == u->buf_rp) { - error = msleep(u->buf, &u->mutex, PZERO | PCATCH, - "gpibrd", hz); - if (error && error != EWOULDBLOCK) { - mtx_unlock(&u->mutex); - return (error); - } - } - while (uio->uio_resid > 0 && u->buf_wp != u->buf_rp) { - if (u->buf_wp < u->buf_rp) - z = u->bufsize - u->buf_rp; - else - z = u->buf_wp - u->buf_rp; - if (z > uio->uio_resid) - z = uio->uio_resid; - mtx_unlock(&u->mutex); - error = uiomove(u->buf + u->buf_rp, z, uio); - mtx_lock(&u->mutex); - if (error) - break; - u->buf_rp += z; - u->buf_rp &= (u->bufsize - 1); - } - if (u->use_fifo) { - bus_write_1(u->reg_res[0], imr3, 0x04); /* NFF IE */ - } else { - if (u->wreg[IMR1] == 0) - upd7210_wr(u, IMR1, 0x01); - } - mtx_unlock(&u->mutex); - return (error); -} - -static struct cdevsw gpib_l_cdevsw = { - .d_version = D_VERSION, - .d_name = "gpib_l", - .d_open = gpib_l_open, - .d_close = gpib_l_close, - .d_read = gpib_l_read, -}; - -/* Housekeeping */ - -static struct unrhdr *units; - -void -upd7210attach(struct upd7210 *u) -{ - struct cdev *dev; - - if (units == NULL) - units = new_unrhdr(0, INT_MAX, NULL); - u->unit = alloc_unr(units); - mtx_init(&u->mutex, "gpib", NULL, MTX_DEF); - u->cdev = make_dev(&gpib_l_cdevsw, u->unit, - UID_ROOT, GID_WHEEL, 0444, - "gpib%ul", u->unit); - u->cdev->si_drv1 = u; - - dev = make_dev(&gpib_ib_cdevsw, u->unit, - UID_ROOT, GID_WHEEL, 0444, - "gpib%uib", u->unit); - dev->si_drv1 = u; - dev_depends(u->cdev, dev); -} - -void -upd7210detach(struct upd7210 *u) -{ - - destroy_dev(u->cdev); - mtx_destroy(&u->mutex); - free_unr(units, u->unit); -} diff --git a/sys/dev/ieee488/upd7210.h b/sys/dev/ieee488/upd7210.h deleted file mode 100644 index 27e3a7a65f73..000000000000 --- a/sys/dev/ieee488/upd7210.h +++ /dev/null @@ -1,237 +0,0 @@ -/*- - * Copyright (c) 2005 Poul-Henning Kamp - * Copyright (c) 2010 Joerg Wunsch - * 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$ - * - * Locating an actual µPD7210 data book has proven quite impossible for me. - * There are a fair number of newer chips which are supersets of the µPD7210 - * but they are particular eager to comprehensively mark what the extensions - * are and what is in the base set. Some even give the registers and their - * bits new names. - * - * The following information is based on a description of the µPD7210 found - * in an old manual for a VME board which used the chip. - */ - -#ifndef _DEV_IEEE488_UPD7210_H_ -#define _DEV_IEEE488_UPD7210_H_ -#ifdef _KERNEL - -struct upd7210; -struct ibfoo; - -/* upd7210 interface definitions for HW drivers */ - -typedef int upd7210_irq_t(struct upd7210 *, int); - -struct upd7210 { - struct resource *reg_res[8]; - struct resource *irq_clear_res; - u_int reg_offset[8]; - int dmachan; - int unit; - int use_fifo; - - /* private stuff */ - struct mtx mutex; - uint8_t rreg[8]; - uint8_t wreg[8 + 8]; - - upd7210_irq_t *irq; - - int busy; - u_char *buf; - size_t bufsize; - u_int buf_wp; - u_int buf_rp; - struct cdev *cdev; - - struct ibfoo *ibfoo; -}; - -#ifdef UPD7210_HW_DRIVER -void upd7210intr(void *); -void upd7210attach(struct upd7210 *); -void upd7210detach(struct upd7210 *); -#endif - -#ifdef UPD7210_SW_DRIVER - -/* upd7210 hardware definitions. */ - -/* Write registers */ -enum upd7210_wreg { - CDOR = 0, /* Command/Data Out Register */ - IMR1 = 1, /* Interrupt Mask Register 1 */ - IMR2 = 2, /* Interrupt Mask Register 2 */ - SPMR = 3, /* Serial Poll Mode Register */ - ADMR = 4, /* ADdress Mode Register */ - AUXMR = 5, /* AUXilliary Mode Register */ - ICR = 5, /* Internal Counter Register */ - PPR = 5, /* Parallel Poll Register */ - AUXRA = 5, /* AUXilliary Register A */ - AUXRB = 5, /* AUXilliary Register B */ - AUXRE = 5, /* AUXilliary Register E */ - ADR = 6, /* ADdress Register */ - EOSR = 7, /* End-Of-String Register */ -}; - -/* Read registers */ -enum upd7210_rreg { - DIR = 0, /* Data In Register */ - ISR1 = 1, /* Interrupt Status Register 1 */ - ISR2 = 2, /* Interrupt Status Register 2 */ - SPSR = 3, /* Serial Poll Status Register */ - ADSR = 4, /* ADdress Status Register */ - CPTR = 5, /* Command Pass Though Register */ - ADR0 = 6, /* ADdress Register 0 */ - ADR1 = 7, /* ADdress Register 1 */ -}; - -/* Bits for ISR1 and IMR1 */ -#define IXR1_DI (1 << 0) /* Data In */ -#define IXR1_DO (1 << 1) /* Data Out */ -#define IXR1_ERR (1 << 2) /* Error */ -#define IXR1_DEC (1 << 3) /* Device Clear */ -#define IXR1_ENDRX (1 << 4) /* End Received */ -#define IXR1_DET (1 << 5) /* Device Execute Trigger */ -#define IXR1_APT (1 << 6) /* Address Pass-Through */ -#define IXR1_CPT (1 << 7) /* Command Pass-Through */ - -/* Bits for ISR2 and IMR2 */ -#define IXR2_ADSC (1 << 0) /* Addressed Status Change */ -#define IXR2_REMC (1 << 1) /* Remote Change */ -#define IXR2_LOKC (1 << 2) /* Lockout Change */ -#define IXR2_CO (1 << 3) /* Command Out */ -#define ISR2_REM (1 << 4) /* Remove */ -#define IMR2_DMAI (1 << 4) /* DMA In Enable */ -#define ISR2_LOK (1 << 5) /* Lockout */ -#define IMR2_DMAO (1 << 5) /* DMA Out Enable */ -#define IXR2_SRQI (1 << 6) /* Service Request Input */ -#define ISR2_INT (1 << 7) /* Interrupt */ - -#define SPSR_PEND (1 << 6) /* Pending */ -#define SPMR_RSV (1 << 6) /* Request SerVice */ - -#define ADSR_MJMN (1 << 0) /* MaJor MiNor */ -#define ADSR_TA (1 << 1) /* Talker Active */ -#define ADSR_LA (1 << 2) /* Listener Active */ -#define ADSR_TPAS (1 << 3) /* Talker Primary Addr. State */ -#define ADSR_LPAS (1 << 4) /* Listener Primary Addr. State */ -#define ADSR_SPMS (1 << 5) /* Serial Poll Mode State */ -#define ADSR_ATN (1 << 6) /* Attention */ -#define ADSR_CIC (1 << 7) /* Controller In Charge */ - -#define ADMR_ADM0 (1 << 0) /* Address Mode 0 */ -#define ADMR_ADM1 (1 << 1) /* Address Mode 1 */ -#define ADMR_TRM0 (1 << 4) /* Transmit/Receive Mode 0 */ -#define ADMR_TRM1 (1 << 5) /* Transmit/Receive Mode 1 */ -#define ADMR_LON (1 << 6) /* Listen Only */ -#define ADMR_TON (1 << 7) /* Talk Only */ - -/* Constant part of overloaded write registers */ -#define C_ICR 0x20 -#define C_PPR 0x60 -#define C_AUXA 0x80 -#define C_AUXB 0xa0 -#define C_AUXE 0xc0 - -#define AUXMR_PON 0x00 /* Immediate Execute pon */ -#define AUXMR_CPP 0x01 /* Clear Parallel Poll */ -#define AUXMR_CRST 0x02 /* Chip Reset */ -#define AUXMR_RFD 0x03 /* Finish Handshake */ -#define AUXMR_TRIG 0x04 /* Trigger */ -#define AUXMR_RTL 0x05 /* Return to local */ -#define AUXMR_SEOI 0x06 /* Send EOI */ -#define AUXMR_NVSA 0x07 /* Non-Valid Secondary cmd/addr */ - /* 0x08 undefined/unknown */ -#define AUXMR_SPP 0x09 /* Set Parallel Poll */ - /* 0x0a undefined/unknown */ - /* 0x0b undefined/unknown */ - /* 0x0c undefined/unknown */ - /* 0x0d undefined/unknown */ - /* 0x0e undefined/unknown */ -#define AUXMR_VSA 0x0f /* Valid Secondary cmd/addr */ -#define AUXMR_GTS 0x10 /* Go to Standby */ -#define AUXMR_TCA 0x11 /* Take Control Async (pulsed) */ -#define AUXMR_TCS 0x12 /* Take Control Synchronously */ -#define AUXMR_LISTEN 0x13 /* Listen */ -#define AUXMR_DSC 0x14 /* Disable System Control */ - /* 0x15 undefined/unknown */ -#define AUXMR_SIFC 0x16 /* Set IFC */ -#define AUXMR_CREN 0x17 /* Clear REN */ - /* 0x18 undefined/unknown */ - /* 0x19 undefined/unknown */ -#define AUXMR_TCSE 0x1a /* Take Control Sync on End */ -#define AUXMR_LCM 0x1b /* Listen Continuously Mode */ -#define AUXMR_LUNL 0x1c /* Local Unlisten */ -#define AUXMR_EPP 0x1d /* Execute Parallel Poll */ -#define AUXMR_CIFC 0x1e /* Clear IFC */ -#define AUXMR_SREN 0x1f /* Set REN */ - -#define PPR_U (1 << 4) /* Unconfigure */ -#define PPR_S (1 << 3) /* Status Polarity */ - -#define AUXA_HLDA (1 << 0) /* Holdoff on All */ -#define AUXA_HLDE (1 << 1) /* Holdoff on END */ -#define AUXA_REOS (1 << 2) /* End on EOS received */ -#define AUXA_XEOS (1 << 3) /* Transmit END with EOS */ -#define AUXA_BIN (1 << 4) /* Binary */ - -#define AUXB_CPTE (1 << 0) /* Cmd Pass Through Enable */ -#define AUXB_SPEOI (1 << 1) /* Send Serial Poll EOI */ -#define AUXB_TRI (1 << 2) /* Three-State Timing */ -#define AUXB_INV (1 << 3) /* Invert */ -#define AUXB_ISS (1 << 4) /* Individual Status Select */ - -#define AUXE_DHDT (1 << 0) /* DAC Holdoff on DTAS */ -#define AUXE_DHDC (1 << 1) /* DAC Holdoff on DCAS */ - -#define ADR0_DL0 (1 << 5) /* Disable Listener 0 */ -#define ADR0_DT0 (1 << 6) /* Disable Talker 0 */ - -#define ADR_DL (1 << 5) /* Disable Listener */ -#define ADR_DT (1 << 6) /* Disable Talker */ -#define ADR_ARS (1 << 7) /* Address Register Select */ - -#define ADR1_DL1 (1 << 5) /* Disable Listener 1 */ -#define ADR1_DT1 (1 << 6) /* Disable Talker 1 */ -#define ADR1_EOI (1 << 7) /* End or Identify */ - -/* Stuff from software drivers */ -extern struct cdevsw gpib_ib_cdevsw; - -/* Stuff from upd7210.c */ -void upd7210_print_isr(u_int isr1, u_int isr2); -u_int upd7210_rd(struct upd7210 *u, enum upd7210_rreg reg); -void upd7210_wr(struct upd7210 *u, enum upd7210_wreg reg, u_int val); -int upd7210_take_ctrl_async(struct upd7210 *u); -int upd7210_goto_standby(struct upd7210 *u); - -#endif /* UPD7210_SW_DRIVER */ - -#endif /* _KERNEL */ -#endif /* _DEV_IEEE488_UPD7210_H_ */ diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index c3c7a2821100..cba7fcff4890 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -1331,26 +1331,6 @@ OLD_FILES+=usr/share/man/man1/gdbserver.1.gz OLD_FILES+=usr/share/man/man1/kgdb.1.gz .endif -.if ${MK_GPIB} == no -OLD_FILES+=usr/include/dev/ieee488/ibfoo_int.h -OLD_FILES+=usr/include/dev/ieee488/tnt4882.h -OLD_FILES+=usr/include/dev/ieee488/ugpib.h -OLD_FILES+=usr/include/dev/ieee488/upd7210.h -OLD_DIRS+=usr/include/dev/ieee488 -OLD_FILES+=usr/include/gpib/gpib.h -OLD_DIRS+=usr/include/gpib -OLD_FILES+=usr/lib/libgpib.a -OLD_FILES+=usr/lib/libgpib.so -OLD_LIBS+=usr/lib/libgpib.so.3 -OLD_FILES+=usr/lib/libgpib_p.a -.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64" -OLD_FILES+=usr/lib32/libgpib.a -OLD_FILES+=usr/lib32/libgpib.so -OLD_LIBS+=usr/lib32/libgpib.so.3 -OLD_FILES+=usr/lib32/libgpib_p.a -.endif -.endif - .if ${MK_GPIO} == no OLD_FILES+=usr/sbin/gpioctl OLD_FILES+=usr/share/man/man8/gpioctl.8.gz @@ -3703,7 +3683,6 @@ OLD_FILES+=usr/lib/libformw_p.a OLD_FILES+=usr/lib/libgcc_p.a OLD_FILES+=usr/lib/libgeom_p.a OLD_FILES+=usr/lib/libgnuregex_p.a -OLD_FILES+=usr/lib/libgpib_p.a OLD_FILES+=usr/lib/libgssapi_krb5_p.a OLD_FILES+=usr/lib/libgssapi_p.a OLD_FILES+=usr/lib/libhdb_p.a diff --git a/tools/build/options/WITHOUT_GPIB b/tools/build/options/WITHOUT_GPIB deleted file mode 100644 index 82cec15d57c5..000000000000 --- a/tools/build/options/WITHOUT_GPIB +++ /dev/null @@ -1,2 +0,0 @@ -.\" $FreeBSD$ -Set to not build GPIB bus support.