diff options
author | nyan <nyan@FreeBSD.org> | 2000-04-07 11:32:42 +0000 |
---|---|---|
committer | nyan <nyan@FreeBSD.org> | 2000-04-07 11:32:42 +0000 |
commit | 49f7c12b0ec7a42f74dad19b658777be715106fb (patch) | |
tree | df084f057f48689faa982f25c7cfeaeede07c271 /sys/dev/advansys/adv_pci.c | |
parent | 367c61d5d32a0a50edbaffa1dde5a2fc2de6f472 (diff) | |
download | FreeBSD-src-49f7c12b0ec7a42f74dad19b658777be715106fb.zip FreeBSD-src-49f7c12b0ec7a42f74dad19b658777be715106fb.tar.gz |
Newbusify adv driver.
Reviewed by: imp
Diffstat (limited to 'sys/dev/advansys/adv_pci.c')
-rw-r--r-- | sys/dev/advansys/adv_pci.c | 118 |
1 files changed, 70 insertions, 48 deletions
diff --git a/sys/dev/advansys/adv_pci.c b/sys/dev/advansys/adv_pci.c index 1dbd340..1a52f72 100644 --- a/sys/dev/advansys/adv_pci.c +++ b/sys/dev/advansys/adv_pci.c @@ -66,6 +66,9 @@ #include <machine/bus_pio.h> #include <machine/bus.h> +#include <machine/resource.h> +#include <sys/bus.h> +#include <sys/rman.h> #include <pci/pcireg.h> #include <pci/pcivar.h> @@ -84,8 +87,8 @@ #define ADV_PCI_MAX_DMA_ADDR (0xFFFFFFFFL) #define ADV_PCI_MAX_DMA_COUNT (0xFFFFFFFFL) -static const char* advpciprobe(pcici_t tag, pcidi_t type); -static void advpciattach(pcici_t config_id, int unit); +static int adv_pci_probe(device_t); +static int adv_pci_attach(device_t); /* * The overrun buffer shared amongst all PCI adapters. @@ -95,55 +98,54 @@ static bus_dma_tag_t overrun_dmat; static bus_dmamap_t overrun_dmamap; static bus_addr_t overrun_physbase; -static struct pci_device adv_pci_driver = { - "adv", - advpciprobe, - advpciattach, - &adv_unit, - NULL -}; - -COMPAT_PCI_DRIVER (adv_pci, adv_pci_driver); - -static const char* -advpciprobe(pcici_t tag, pcidi_t type) +static int +adv_pci_probe(device_t dev) { - int rev; + int rev = pci_get_revid(dev); - rev = pci_conf_read(tag, PCI_CLASS_REG) & PCI_REVISION_MASK; - switch (type) { + switch (pci_get_devid(dev)) { case PCI_DEVICE_ID_ADVANSYS_1200A: - return ("AdvanSys ASC1200A SCSI controller"); + device_set_desc(dev, "AdvanSys ASC1200A SCSI controller"); + return 0; case PCI_DEVICE_ID_ADVANSYS_1200B: - return ("AdvanSys ASC1200B SCSI controller"); + device_set_desc(dev, "AdvanSys ASC1200B SCSI controller"); + return 0; case PCI_DEVICE_ID_ADVANSYS_3000: - if (rev == PCI_DEVICE_REV_ADVANSYS_3150) - return ("AdvanSys ASC3150 SCSI controller"); - else if (rev == PCI_DEVICE_REV_ADVANSYS_3050) - return ("AdvanSys ASC3030/50 SCSI controller"); - else if (rev >= PCI_DEVICE_REV_ADVANSYS_3150) - return ("Unknown AdvanSys controller"); + if (rev == PCI_DEVICE_REV_ADVANSYS_3150) { + device_set_desc(dev, + "AdvanSys ASC3150 SCSI controller"); + return 0; + } else if (rev == PCI_DEVICE_REV_ADVANSYS_3050) { + device_set_desc(dev, + "AdvanSys ASC3030/50 SCSI controller"); + return 0; + } else if (rev >= PCI_DEVICE_REV_ADVANSYS_3150) { + device_set_desc(dev, "Unknown AdvanSys controller"); + return 0; + } break; default: break; } - return (NULL); + return ENXIO; } -static void -advpciattach(pcici_t config_id, int unit) +static int +adv_pci_attach(device_t dev) { - u_int16_t io_port; struct adv_softc *adv; u_int32_t id; u_int32_t command; int error; - + int rid = 0; + void *ih; + struct resource *iores, *irqres; + /* * Determine the chip version. */ - id = pci_cfgread(config_id, PCI_ID_REG, /*bytes*/4); - command = pci_cfgread(config_id, PCIR_COMMAND, /*bytes*/1); + id = pci_read_config(dev, PCI_ID_REG, /*bytes*/4); + command = pci_read_config(dev, PCIR_COMMAND, /*bytes*/1); /* * These cards do not allow memory mapped accesses, so we must @@ -153,7 +155,7 @@ advpciattach(pcici_t config_id, int unit) if ((command & (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN)) != (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN)) { command |= PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN; - pci_cfgwrite(config_id, PCIR_COMMAND, command, /*bytes*/1); + pci_write_config(dev, PCIR_COMMAND, command, /*bytes*/1); } /* @@ -161,19 +163,21 @@ advpciattach(pcici_t config_id, int unit) */ if (id == PCI_DEVICE_ID_ADVANSYS_1200A || id == PCI_DEVICE_ID_ADVANSYS_1200B) { - pci_cfgwrite(config_id, PCIR_LATTIMER, /*value*/0, /*bytes*/1); + pci_write_config(dev, PCIR_LATTIMER, /*value*/0, /*bytes*/1); } + iores = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1, + RF_ACTIVE); + if (iores == NULL) + return ENXIO; - if (pci_map_port(config_id, PCI_BASEADR0, &io_port) == 0) - return; - - if (adv_find_signature(I386_BUS_SPACE_IO, io_port) == 0) - return; + if (adv_find_signature(rman_get_bustag(iores), + rman_get_bushandle(iores)) == 0) + return ENXIO; - adv = adv_alloc(unit, I386_BUS_SPACE_IO, io_port); + adv = adv_alloc(dev, rman_get_bustag(iores), rman_get_bushandle(iores)); if (adv == NULL) - return; + return ENXIO; /* Allocate a dmatag for our transfer DMA maps */ /* XXX Should be a child of the PCI bus dma tag */ @@ -192,7 +196,7 @@ advpciattach(pcici_t config_id, int unit) printf("%s: Could not allocate DMA tag - error %d\n", adv_name(adv), error); adv_free(adv); - return; + return ENXIO; } adv->init_level++; @@ -208,7 +212,7 @@ advpciattach(pcici_t config_id, int unit) &overrun_dmat) != 0) { bus_dma_tag_destroy(adv->parent_dmat); adv_free(adv); - return; + return ENXIO; } if (bus_dmamem_alloc(overrun_dmat, (void **)&overrun_buf, @@ -217,7 +221,7 @@ advpciattach(pcici_t config_id, int unit) bus_dma_tag_destroy(overrun_dmat); bus_dma_tag_destroy(adv->parent_dmat); adv_free(adv); - return; + return ENXIO; } /* And permanently map it in */ bus_dmamap_load(overrun_dmat, overrun_dmamap, @@ -254,7 +258,7 @@ advpciattach(pcici_t config_id, int unit) if (adv_init(adv) != 0) { adv_free(adv); - return; + return ENXIO; } adv->max_dma_count = ADV_PCI_MAX_DMA_COUNT; @@ -277,10 +281,28 @@ advpciattach(pcici_t config_id, int unit) adv->fix_asyn_xfer = ~0; } - if ((pci_map_int(config_id, adv_intr, (void *)adv, &cam_imask)) == 0) { + irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, + RF_SHAREABLE | RF_ACTIVE); + if (irqres == NULL || + bus_setup_intr(dev, irqres, INTR_TYPE_CAM, adv_intr, adv, &ih)) { adv_free(adv); - return; + return ENXIO; } - + adv_attach(adv); + return 0; } + +static device_method_t adv_pci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, adv_pci_probe), + DEVMETHOD(device_attach, adv_pci_attach), + { 0, 0 } +}; + +static driver_t adv_pci_driver = { + "adv", adv_pci_methods, sizeof(struct adv_softc) +}; + +static devclass_t adv_pci_devclass; +DRIVER_MODULE(adv, pci, adv_pci_driver, adv_pci_devclass, 0, 0); |