Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/isa Add an attachment for MOXA 168P isa multiport ca...



details:   https://anonhg.NetBSD.org/src/rev/a9cd5141c5d4
branches:  trunk
changeset: 499459:a9cd5141c5d4
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Mon Nov 20 19:24:39 2000 +0000

description:
Add an attachment for MOXA 168P isa multiport card. This code was
written by Christoph Badura.
This was reported to work by user of this code. It's not tested
by me, but it's probably more useful in tree anyway.

diffstat:

 sys/dev/isa/files.isa  |    9 +-
 sys/dev/isa/moxa_isa.c |  213 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 220 insertions(+), 2 deletions(-)

diffs (240 lines):

diff -r 0d566caf4d2c -r a9cd5141c5d4 sys/dev/isa/files.isa
--- a/sys/dev/isa/files.isa     Mon Nov 20 19:24:36 2000 +0000
+++ b/sys/dev/isa/files.isa     Mon Nov 20 19:24:39 2000 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.isa,v 1.105 2000/11/05 04:07:30 thorpej Exp $
+#      $NetBSD: files.isa,v 1.106 2000/11/20 19:24:39 jdolecek Exp $
 #
 # Config file and device description for machine-independent ISA code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -52,7 +52,12 @@
 # BOCA 6-port board (3x 16552)
 device  ioat: commulti
 attach  ioat at isa
-file    dev/isa/ioat66.c                ioat
+file    dev/isa/ioat66.c               ioat
+
+# MOXA 8-port board
+device  moxa: commulti
+attach moxa at isa with moxa_isa
+file   dev/isa/moxa_isa.c              moxa
 
 #
 # Serial and parallel drivers
diff -r 0d566caf4d2c -r a9cd5141c5d4 sys/dev/isa/moxa_isa.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/isa/moxa_isa.c    Mon Nov 20 19:24:39 2000 +0000
@@ -0,0 +1,213 @@
+/*     $NetBSD: moxa_isa.c,v 1.1 2000/11/20 19:24:39 jdolecek Exp $    */
+
+/*
+ * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
+ * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
+ *
+ * This code is derived from public-domain software written by
+ * Roland McGrath.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by Charles M. Hannum.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/termios.h>
+
+#include <machine/bus.h>
+#include <machine/intr.h>
+
+#include <dev/ic/comreg.h>
+#include <dev/ic/comvar.h>
+
+#include <dev/isa/isavar.h>
+#include <dev/isa/com_multi.h>
+
+#define        NSLAVES 8
+
+struct moxa_isa_softc {
+       struct device sc_dev;
+       void *sc_ih;
+
+       bus_space_tag_t sc_iot;
+       int sc_iobase;
+
+       int sc_alive;                   /* mask of slave units attached */
+       void *sc_slaves[NSLAVES];       /* com device unit numbers */
+       bus_space_handle_t sc_slaveioh[NSLAVES];
+};
+
+int moxa_isaprobe __P((struct device *, struct cfdata *, void *));
+void moxa_isaattach __P((struct device *, struct device *, void *));
+int moxa_isaintr __P((void *));
+int moxa_isaprint __P((void *, const char *));
+
+struct cfattach moxa_isa_ca = {
+       sizeof(struct moxa_isa_softc), moxa_isaprobe, moxa_isaattach
+};
+
+int
+moxa_isaprobe(parent, self, aux)
+       struct device *parent;
+       struct cfdata *self;
+       void *aux;
+{
+       struct isa_attach_args *ia = aux;
+       int iobase = ia->ia_iobase;
+       bus_space_tag_t iot = ia->ia_iot;
+       bus_space_handle_t ioh;
+       int i, rv = 1;
+
+       /*
+        * Do the normal com probe for the first UART and assume
+        * its presence, and the ability to map the other UARTS,
+        * means there is a multiport board there.
+        * XXX Needs more robustness.
+        */
+
+       /* Disallow wildcarded i/o address. */
+       if (ia->ia_iobase == ISACF_PORT_DEFAULT)
+               return (0);
+
+       /* if the first port is in use as console, then it. */
+       if (com_is_console(iot, iobase, 0))
+               goto checkmappings;
+
+       if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) {
+               rv = 0;
+               goto out;
+       }
+       rv = comprobe1(iot, ioh);
+       bus_space_unmap(iot, ioh, COM_NPORTS);
+       if (rv == 0)
+               goto out;
+
+checkmappings:
+       for (i = 1; i < NSLAVES; i++) {
+               iobase += COM_NPORTS;
+
+               if (com_is_console(iot, iobase, 0))
+                       continue;
+
+               if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) {
+                       rv = 0;
+                       goto out;
+               }
+               bus_space_unmap(iot, ioh, COM_NPORTS);
+       }
+
+out:
+       if (rv)
+               ia->ia_iosize = NSLAVES * COM_NPORTS;
+       return (rv);
+}
+
+int
+moxa_isaprint(aux, pnp)
+       void *aux;
+       const char *pnp;
+{
+       struct commulti_attach_args *ca = aux;
+
+       if (pnp)
+               printf("com at %s", pnp);
+       printf(" slave %d", ca->ca_slave);
+       return (UNCONF);
+}
+
+void
+moxa_isaattach(parent, self, aux)
+       struct device *parent, *self;
+       void *aux;
+{
+       struct moxa_isa_softc *sc = (void *)self;
+       struct isa_attach_args *ia = aux;
+       struct commulti_attach_args ca;
+       bus_space_tag_t iot = ia->ia_iot;
+       int i, iobase;
+
+       printf("\n");
+
+       sc->sc_iot = ia->ia_iot;
+       sc->sc_iobase = ia->ia_iobase;
+
+       for (i = 0; i < NSLAVES; i++) {
+               iobase = sc->sc_iobase + i * COM_NPORTS;
+               if (!com_is_console(iot, iobase, &sc->sc_slaveioh[i]) &&
+                   bus_space_map(iot, iobase, COM_NPORTS, 0,
+                       &sc->sc_slaveioh[i])) {
+                       printf("%s: can't map i/o space for slave %d\n",
+                           sc->sc_dev.dv_xname, i);
+                       return;
+               }
+       }
+
+       for (i = 0; i < NSLAVES; i++) {
+               ca.ca_slave = i;
+               ca.ca_iot = sc->sc_iot;
+               ca.ca_ioh = sc->sc_slaveioh[i];
+               ca.ca_iobase = sc->sc_iobase + i * COM_NPORTS;
+               ca.ca_noien = 1;
+
+               sc->sc_slaves[i] = config_found(self, &ca, moxa_isaprint);
+               if (sc->sc_slaves[i] != NULL)
+                       sc->sc_alive |= 1 << i;
+       }
+
+       sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
+           IPL_SERIAL, moxa_isaintr, sc);
+}
+
+int
+moxa_isaintr(arg)
+       void *arg;
+{
+       struct moxa_isa_softc *sc = arg;
+       int bits;
+       int rv;
+
+       bits = sc->sc_alive;
+       if (bits == 0)
+               return (0);
+
+       for (;;rv = 0) {
+#define        TRY(n) \
+               if (bits & (1 << (n))) \
+                       rv += comintr(sc->sc_slaves[n]);
+               TRY(0);
+               TRY(1);
+               TRY(2);
+               TRY(3);
+               TRY(4);
+               TRY(5);
+               TRY(6);
+               TRY(7);
+#undef TRY
+               if (rv == 0)
+                       return (1);
+       }
+}



Home | Main Index | Thread Index | Old Index