I have just taken a pass through the aha_isa driver to convert it to
newbus and to make it use the new pnp system. Unfortunately I don't own
the hardware so I need testers, preferably both with non-pnp and pnp
cards. The code does compile but I have not tested it at all. Here is the
patch:

Index: aha_isa.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/aha_isa.c,v
retrieving revision 1.11
diff -u -r1.11 aha_isa.c
--- aha_isa.c   1999/09/02 04:37:07     1.11
+++ aha_isa.c   1999/09/03 20:47:55
@@ -31,34 +31,28 @@
  * $FreeBSD: src/sys/i386/isa/aha_isa.c,v 1.11 1999/09/02 04:37:07 peter Exp $
  */
 
-/* #include "pnp.h" */
-#define NPNP 0
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
 
 #include <machine/bus_pio.h>
 #include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <isa/isareg.h>
+#include <isa/isavar.h>
 
-#include <i386/isa/isa_device.h>
 #include <dev/aha/ahareg.h>
 
 #include <cam/scsi/scsi_all.h>
-
-#if NPNP > 0
-#include <i386/isa/pnp.h>
-#endif
-
-static int aha_isa_probe(struct isa_device *dev);
-static int aha_isa_attach(struct isa_device *dev);
-static void aha_isa_intr(void *unit);
 
-struct isa_driver ahadriver =
-{
-    aha_isa_probe,
-    aha_isa_attach,
-    "aha"
+static struct isa_pnp_id aha_ids[] = {
+       {AHA1542_PNP,           NULL},          /* ADP1542 */
+       {AHA1542_PNPCOMPAT,     NULL},          /* PNP00A0 */
+       {0}
 };
 
 /*
@@ -68,26 +62,41 @@
  * autoconf.c
  */
 static int
-aha_isa_probe(dev)
-       struct isa_device *dev;
+aha_isa_probe(device_t dev)
 {
        /*
         * find unit and check we have that many defined
         */
+       struct  aha_softc **sc = device_get_softc(dev);
        struct  aha_softc *aha;
        int     port_index;
        int     max_port_index;
+       int     error;
+       u_long  port_start, port_count;
+       struct resource *port_res;
+       int     port_rid;
+       int     drq;
 
        aha = NULL;
 
+       /* Check isapnp ids */
+       if (ISA_PNP_PROBE(device_get_parent(dev), dev, aha_ids) == ENXIO)
+               return (ENXIO);
+
+       error = ISA_GET_RESOURCE(device_get_parent(dev), dev,
+                                SYS_RES_IOPORT, 0,
+                                &port_start, &port_count);
+       if (error != 0)
+               port_start = 0;
+
        /*
         * Bound our board search if the user has
         * specified an exact port.
         */
-       aha_find_probe_range(dev->id_iobase, &port_index, &max_port_index);
+       aha_find_probe_range(port_start, &port_index, &max_port_index);
 
        if (port_index < 0)
-               return 0;
+               return ENXIO;
 
        /* Attempt to find an adapter */
        for (;port_index <= max_port_index; port_index++) {
@@ -103,12 +112,21 @@
                 */
                if (aha_check_probed_iop(ioport) != 0)
                        continue;
-               dev->id_iobase = ioport;
-               if (haveseen_iobase(dev, AHA_NREGS))
+               error = ISA_SET_RESOURCE(device_get_parent(dev), dev,
+                                        SYS_RES_IOPORT, 0,
+                                        ioport, AHA_NREGS);
+               if (error)
+                       return error;
+               
+               port_rid = 0;
+               port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &port_rid,
+                                             0, ~0, AHA_NREGS, RF_ACTIVE);
+               if (!port_res)
                        continue;
 
                /* Allocate a softc for use during probing */
-               aha = aha_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
+               aha = aha_alloc(device_get_unit(dev),
+                               I386_BUS_SPACE_IO, ioport);
 
                if (aha == NULL)
                        break;
@@ -139,44 +157,90 @@
 
                switch (config_data.dma_chan) {
                case DMA_CHAN_5:
-                       dev->id_drq = 5;
+                       drq = 5;
                        break;
                case DMA_CHAN_6:
-                       dev->id_drq = 6;
+                       drq = 6;
                        break;
                case DMA_CHAN_7:
-                       dev->id_drq = 7;
+                       drq = 7;
                        break;
                default:
                        printf("aha_isa_probe: Invalid DMA setting "
                                "detected for adapter at 0x%x.  "
                                "Failing probe\n", ioport);
-                       return (0);
+                       return (ENXIO);
                }
-               dev->id_irq = (config_data.irq << 9);
-               dev->id_intr = aha_isa_intr;
+               error = ISA_SET_RESOURCE(device_get_parent(dev), dev,
+                                        SYS_RES_DRQ, 0, drq, 1);
+               if (error)
+                       return error;
+
+               error = ISA_SET_RESOURCE(device_get_parent(dev), dev,
+                                        SYS_RES_IRQ, 0, config_data.irq, 1);
+               if (error)
+                       return error;
+
+               *sc = aha;
                aha_unit++;
-               return (AHA_NREGS);
+
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+
+               return (0);
        }
 
-       return (0);
+       return (ENXIO);
 }
 
 /*
  * Attach all the sub-devices we can find
  */
 static int
-aha_isa_attach(dev)
-       struct isa_device *dev;
+aha_isa_attach(device_t dev)
 {
+       struct  aha_softc **sc = device_get_softc(dev);
        struct  aha_softc *aha;
        bus_dma_filter_t *filter;
        void             *filter_arg;
        bus_addr_t       lowaddr;
+       struct resource  *port_res;
+       int              port_rid;
+       struct resource  *irq_res;
+       int              irq_rid;
+       struct resource  *drq_res;
+       int              drq_rid;
+       void             *ih;
+       int              error;
+
+       port_rid = 0;
+       port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &port_rid,
+                                     0, ~0, AHA_NREGS, RF_ACTIVE);
+       if (!port_res)
+               return ENOMEM;
+
+       irq_rid = 0;
+       irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &irq_rid,
+                                     0, ~0, AHA_NREGS, RF_ACTIVE);
+       if (!irq_res) {
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               return ENOMEM;
+       }
+
+       drq_rid = 0;
+       drq_res = bus_alloc_resource(dev, SYS_RES_DRQ, &drq_rid,
+                                     0, ~0, AHA_NREGS, RF_ACTIVE);
+       if (!drq_res) {
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               bus_release_resource(dev, SYS_RES_IRQ, irq_rid, irq_res);
+               return ENOMEM;
+       }
 
-       aha = aha_softcs[dev->id_unit];
+       aha = *sc;
+#if 0                          /* is the drq ever unset? */
        if (dev->id_drq != -1)
                isa_dmacascade(dev->id_drq);
+#endif
+       isa_dmacascade(rman_get_start(drq_res));
 
        /* Allocate our parent dmatag */
        filter = NULL;
@@ -191,99 +255,57 @@
                                /*maxsegsz*/BUS_SPACE_MAXSIZE_24BIT,
                                /*flags*/0, &aha->parent_dmat) != 0) {
                 aha_free(aha);
-                return (-1);
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               bus_release_resource(dev, SYS_RES_IRQ, irq_rid, irq_res);
+               bus_release_resource(dev, SYS_RES_DRQ, drq_rid, drq_res);
+                return (ENOMEM);
         }                              
 
         if (aha_init(aha)) {
                printf("aha init failed\n");
                 aha_free(aha);
-                return (-1);
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               bus_release_resource(dev, SYS_RES_IRQ, irq_rid, irq_res);
+               bus_release_resource(dev, SYS_RES_DRQ, drq_rid, drq_res);
+                return (ENOMEM);
         }
-
-       return (aha_attach(aha));
-}
-
-/*
- * Handle an ISA interrupt.
- * XXX should go away as soon as ISA interrupt handlers
- * take a (void *) arg.
- */
-static void
-aha_isa_intr(void *unit)
-{
-       struct aha_softc* arg = aha_softcs[(int)unit];
-       aha_intr((void *)arg);
-}
 
-/*
- * support PnP cards if we are using 'em
- */
-
-#if NPNP > 0
-
-static char *ahapnp_probe(u_long csn, u_long vend_id);
-static void ahapnp_attach(u_long csn, u_long vend_id, char *name,
-       struct isa_device *dev);
-static u_long nahapnp = NAHA;
-
-static struct pnp_device ahapnp = {
-       "ahapnp",
-       ahapnp_probe,
-       ahapnp_attach,
-       &nahapnp,
-       &bio_imask
-};
-DATA_SET (pnpdevice_set, ahapnp);
-
-static char *
-ahapnp_probe(u_long csn, u_long vend_id)
-{
-       struct pnp_cinfo d;
-       char *s = NULL;
-
-       if (vend_id != AHA1542_PNP && vend_id != AHA1542_PNPCOMPAT)
-               return (NULL);
+       error = aha_attach(aha);
+       if (error) {
+                aha_free(aha);
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               bus_release_resource(dev, SYS_RES_IRQ, irq_rid, irq_res);
+               bus_release_resource(dev, SYS_RES_DRQ, drq_rid, drq_res);
+                return (error);
+       }
 
-       read_pnp_parms(&d, 0);
-       if (d.enable == 0 || d.flags & 1) {
-               printf("CSN %lu is disabled.\n", csn);
-               return (NULL);
+       error = bus_setup_intr(dev, irq_res, INTR_TYPE_CAM,
+                              aha_intr, aha, &ih);
+       if (error) {
+                aha_free(aha);
+               bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+               bus_release_resource(dev, SYS_RES_IRQ, irq_rid, irq_res);
+               bus_release_resource(dev, SYS_RES_DRQ, drq_rid, drq_res);
+                return (error);
        }
-       s = "Adaptec 1542CP";
 
-       return (s);
+       return (0);
 }
-
-static void
-ahapnp_attach(u_long csn, u_long vend_id, char *name, struct isa_device *dev)
-{
-       struct pnp_cinfo d;
 
-       if (dev->id_unit >= NAHATOT)
-               return;
-
-       if (read_pnp_parms(&d, 0) == 0) {
-               printf("failed to read pnp parms\n");
-               return;
-       }
+static device_method_t aha_isa_methods[] = {
+       /* Device interface */
+       DEVMETHOD(device_probe,         aha_isa_probe),
+       DEVMETHOD(device_attach,        aha_isa_attach),
 
-       write_pnp_parms(&d, 0);
+       { 0, 0 }
+};
 
-       enable_pnp_card();
+static driver_t aha_isa_driver = {
+       "aha",
+       aha_isa_methods,
+       sizeof(struct aha_softc*),
+};
 
-       dev->id_iobase = d.port[0];
-       dev->id_irq = (1 << d.irq[0]);
-       dev->id_intr = aha_intr;
-       dev->id_drq = d.drq[0];
-
-       if (dev->id_driver == NULL) {
-               dev->id_driver = &ahadriver;
-               dev->id_id = isa_compat_nextid();
-       }
+static devclass_t aha_devclass;
 
-       if ((dev->id_alive = aha_isa_probe(dev)) != 0)
-               aha_isa_attach(dev);
-       else
-               printf("aha%d: probe failed\n", dev->id_unit);
-}
-#endif
+DRIVER_MODULE(aha, isa, aha_isa_driver, aha_devclass, 0, 0);

--
Doug Rabson                             Mail:  [EMAIL PROTECTED]
Nonlinear Systems Ltd.                  Phone: +44 181 442 9037




To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to