diff options
author | gibbs <gibbs@FreeBSD.org> | 1996-11-11 05:26:14 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 1996-11-11 05:26:14 +0000 |
commit | f2d4d5247b25a7e7cc85c2e16eccabdb0b451851 (patch) | |
tree | e8db48e4847d58761612ffc2b731c1fa48f02c89 | |
parent | 03be7529130c843c1c3e4bc1766f199f5b5ebfcb (diff) | |
download | FreeBSD-src-f2d4d5247b25a7e7cc85c2e16eccabdb0b451851.zip FreeBSD-src-f2d4d5247b25a7e7cc85c2e16eccabdb0b451851.tar.gz |
Clean up the memory mapped/Programmed I/O stuff so that the driver completely
uses one or the other. This required some changes to the ahc_reset()
function, and how early the probes had to allocate their softc.
Turn the AHC_IN/OUT* macros into inline functions and lowercase their names
to indicate this change. Geting AHC_OUTSB to work as a macro doing
conditional memory mapped I/O would have been too gross.
Be smart about the STPWEN control bit in SCFRCTL1. It should only be set
if the low byte of the bus is to be terminated. We figure this out either
by "caching" the value left over from the BIOS setup before we reset the card
or by using the values stored in the seeprom if it is availible.
-rw-r--r-- | sys/pci/aic7870.c | 142 |
1 files changed, 73 insertions, 69 deletions
diff --git a/sys/pci/aic7870.c b/sys/pci/aic7870.c index ca5f196..3dfd121 100644 --- a/sys/pci/aic7870.c +++ b/sys/pci/aic7870.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aic7870.c,v 1.41 1996/10/28 06:10:33 gibbs Exp $ + * $Id: aic7870.c,v 1.37.2.3 1996/11/05 08:56:59 gibbs Exp $ */ #if defined(__FreeBSD__) @@ -115,7 +115,6 @@ /* * Define the format of the aic78X0 SEEPROM registers (16 bits). - * */ struct seeprom_config { @@ -179,7 +178,7 @@ struct seeprom_config { u_int16_t checksum; /* word 31 */ }; -static void load_seeprom __P((struct ahc_softc *ahc)); +static void load_seeprom __P((struct ahc_softc *ahc, u_int8_t *sxfrctl1)); static int acquire_seeprom __P((struct seeprom_descriptor *sd)); static void release_seeprom __P((struct seeprom_descriptor *sd)); @@ -323,30 +322,32 @@ ahc_pci_attach(parent, self, aux) #endif u_int32_t id; struct scb_data *shared_scb_data; - int opri = 0; - ahc_type ahc_t = AHC_NONE; - ahc_flag ahc_f = AHC_FNONE; + int opri; + ahc_type ahc_t = AHC_NONE; + ahc_flag ahc_f = AHC_FNONE; vm_offset_t vaddr; vm_offset_t paddr; u_int8_t ultra_enb = 0; u_int8_t our_id = 0; + u_int8_t sxfrctl1; shared_scb_data = NULL; -#if defined(__FreeBSD__) - if (pci_map_port(config_id, PCI_BASEADR0, &io_port) == 0) - return; -#ifdef AHC_FORCE_PIO vaddr = NULL; paddr = NULL; -#else +#if defined(__FreeBSD__) + io_port = 0; +#ifndef AHC_FORCE_PIO if (pci_map_mem(config_id, PCI_BASEADR1, &vaddr, &paddr) == 0) - return; #endif + if (pci_map_port(config_id, PCI_BASEADR0, &io_port) == 0) + return; + #elif defined(__NetBSD__) - if (pci_io_find(pa->pa_pc, pa->pa_tag, PCI_BASEADR0, &iobase, &iosize)) - return; + /* XXX Memory mapped I/O?? */ if (bus_io_map(pa->pa_bc, iobase, iosize, &ioh)) - return; + if (pci_io_find(pa->pa_pc, pa->pa_tag, PCI_BASEADR0, &iobase, + &iosize)) + return; #endif #if defined(__FreeBSD__) @@ -435,38 +436,24 @@ ahc_pci_attach(parent, self, aux) /* On all PCI adapters, we allow SCB paging */ ahc_f |= AHC_PAGESCBS; - - /* Remeber how the card was setup in case there is no SEEPROM */ #if defined(__FreeBSD__) - our_id = inb(SCSIID + io_port) & OID; - if (ahc_t & AHC_ULTRA) - ultra_enb = inb(SXFRCTL0 + io_port) & ULTRAEN; + if ((ahc = ahc_alloc(unit, io_port, vaddr, ahc_t, ahc_f, + shared_scb_data)) == NULL) + return; /* XXX PCI code should take return status */ #else - our_id = bus_io_read_1(pa->pa_bc, ioh, SCSIID) & OID; - if (ahc_t & AHC_ULTRA) - ultra_enb = bus_io_read_1(pa->pa_bc, ioh, SXFRCTL0) & ULTRAEN; + ahc_construct(ahc, pa->pa_bc, ioh, ahc_t, ahc_f); #endif -#if AHC_DEBUG - { - u_int32_t config_info; - config_info = pci_conf_read(config_id, DEVCONFIG); - printf("DEVCONF == 0x%x\n", config_info); - - outb(io_port + HCNTRL, IRQMS|INTEN|PAUSE); - printf("SEECTL == 0x%x, BRDCTL == 0x%x\n" - "SXFRCTL0 == 0x%x, SXFRCTL1 == 0x%x\n", - inb(io_port + SEECTL), inb(io_port + 0x1D), - inb(io_port + SXFRCTL0), inb(io_port + SXFRCTL1)); - } -#endif + /* Remeber how the card was setup in case there is no SEEPROM */ + our_id = ahc_inb(ahc, SCSIID) & OID; + if (ahc_t & AHC_ULTRA) + ultra_enb = ahc_inb(ahc, SXFRCTL0) & ULTRAEN; + sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN; -#if defined(__FreeBSD__) - ahc_reset(io_port); -#elif defined(__NetBSD__) +#if defined(__NetBSD__) printf("\n"); - ahc_reset(ahc->sc_dev.dv_xname, pa->pa_bc, ioh); #endif + ahc_reset(ahc); #ifdef AHC_SHARE_SCBS if (ahc_t & AHC_AIC7870) { @@ -500,16 +487,11 @@ ahc_pci_attach(parent, self, aux) #endif #if defined(__FreeBSD__) - if ((ahc = ahc_alloc(unit, io_port, vaddr, ahc_t, ahc_f, - shared_scb_data)) == NULL) - return; /* XXX PCI code should take return status */ - if (!(pci_map_int(config_id, ahc_intr, (void *)ahc, &bio_imask))) { ahc_free(ahc); return; } #elif defined(__NetBSD__) - ahc_construct(ahc, pa->pa_bc, ioh, ahc_t, ahc_f); if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin, pa->pa_intrline, &ih)) { @@ -556,19 +538,19 @@ ahc_pci_attach(parent, self, aux) case AHC_294U: case AHC_AIC7880: id_string = "aic7880 "; - load_seeprom(ahc); + load_seeprom(ahc, &sxfrctl1); break; case AHC_398: case AHC_394: case AHC_294: case AHC_AIC7870: id_string = "aic7870 "; - load_seeprom(ahc); + load_seeprom(ahc, &sxfrctl1); break; case AHC_294AU: case AHC_AIC7860: id_string = "aic7860 "; - load_seeprom(ahc); + load_seeprom(ahc, &sxfrctl1); break; case AHC_AIC7850: id_string = "aic7850 "; @@ -588,14 +570,14 @@ ahc_pci_attach(parent, self, aux) /* * Take the LED out of diagnostic mode */ - sblkctl = AHC_INB(ahc, SBLKCTL); - AHC_OUTB(ahc, SBLKCTL, (sblkctl & ~(DIAGLEDEN|DIAGLEDON))); + sblkctl = ahc_inb(ahc, SBLKCTL); + ahc_outb(ahc, SBLKCTL, (sblkctl & ~(DIAGLEDEN|DIAGLEDON))); /* * I don't know where this is set in the SEEPROM or by the * BIOS, so we default to 100%. */ - AHC_OUTB(ahc, DSPCISTATUS, DFTHRSH_100); + ahc_outb(ahc, DSPCISTATUS, DFTHRSH_100); if (ahc->flags & AHC_USEDEFAULTS) { /* @@ -606,7 +588,7 @@ ahc_pci_attach(parent, self, aux) /* See if someone else set us up already */ u_int32_t i; for (i = TARG_SCRATCH; i < 0x60; i++) { - if (AHC_INB(ahc, i) != 0x00) + if (ahc_inb(ahc, i) != 0x00) break; } if (i == TARG_SCRATCH) { @@ -615,7 +597,7 @@ ahc_pci_attach(parent, self, aux) * either. */ for (i = TARG_SCRATCH; i < 0x60; i++) { - if (AHC_INB(ahc, i) != 0xff) + if (ahc_inb(ahc, i) != 0xff) break; } } @@ -623,12 +605,18 @@ ahc_pci_attach(parent, self, aux) printf("%s: Using left over BIOS settings\n", ahc_name(ahc)); ahc->flags &= ~AHC_USEDEFAULTS; - } else + } else { + /* + * Assume only one connector and always turn + * on termination. + */ our_id = 0x07; - AHC_OUTB(ahc, SCSICONF, + sxfrctl1 = STPWEN; + } + ahc_outb(ahc, SCSICONF, (our_id & 0x07)|ENSPCHK|RESET_SCSI); /* In case we are a wide card */ - AHC_OUTB(ahc, SCSICONF + 1, our_id); + ahc_outb(ahc, SCSICONF + 1, our_id); if (!ultra_enb || (ahc->flags & AHC_USEDEFAULTS)) { /* @@ -649,6 +637,13 @@ ahc_pci_attach(parent, self, aux) return; /* XXX PCI code should take return status */ } + /* + * Put our termination setting into sxfrctl1 now that the + * generic initialization is complete. + */ + sxfrctl1 |= ahc_inb(ahc, SXFRCTL1); + ahc_outb(ahc, SXFRCTL1, sxfrctl1); + if ((ahc->type & AHC_398) == AHC_398) { /* Only set this once we've successfully probed */ if (shared_scb_data == NULL) @@ -663,8 +658,9 @@ ahc_pci_attach(parent, self, aux) * Read the SEEPROM. Return 0 on failure */ void -load_seeprom(ahc) - struct ahc_softc *ahc; +load_seeprom(ahc, sxfrctl1) + struct ahc_softc *ahc; + u_int8_t *sxfrctl1; { struct seeprom_descriptor sd; struct seeprom_config sc; @@ -675,12 +671,12 @@ load_seeprom(ahc) int have_seeprom; #if defined(__FreeBSD__) -#ifdef AHC_FORCE_PIO - sd.sd_maddr = NULL; -#else - sd.sd_maddr = ahc->maddr + SEECTL; -#endif - sd.sd_iobase = ahc->baseport + SEECTL; + sd.sd_maddr = ahc->maddr; + if (sd.sd_maddr != NULL) + sd.sd_maddr += SEECTL; + sd.sd_iobase = ahc->baseport; + if (sd.sd_iobase != 0) + sd.sd_iobase += SEECTL; #elif defined(__NetBSD__) sd.sd_bc = ahc->sc_bc; sd.sd_ioh = ahc->sc_ioh; @@ -742,10 +738,10 @@ load_seeprom(ahc) target_settings |= WIDEXFER; if (sc.device_flags[i] & CFDISC) ahc->discenable |= (0x01 << i); - AHC_OUTB(ahc, TARG_SCRATCH+i, target_settings); + ahc_outb(ahc, TARG_SCRATCH+i, target_settings); } - AHC_OUTB(ahc, DISC_DSB, ~(ahc->discenable & 0xff)); - AHC_OUTB(ahc, DISC_DSB + 1, ~((ahc->discenable >> 8) & 0xff)); + ahc_outb(ahc, DISC_DSB, ~(ahc->discenable & 0xff)); + ahc_outb(ahc, DISC_DSB + 1, ~((ahc->discenable >> 8) & 0xff)); host_id = sc.brtime_id & CFSCSIID; @@ -755,6 +751,14 @@ load_seeprom(ahc) if (sc.adapter_control & CFRESETB) scsi_conf |= RESET_SCSI; + /* + * Update the settings in sxfrctl1 to match the + *termination settings + */ + *sxfrctl1 = 0; + if (sc.adapter_control & CFSTERM) + *sxfrctl1 |= STPWEN; + if (ahc->type & AHC_ULTRA) { /* Should we enable Ultra mode? */ if (!(sc.adapter_control & CFULTRAEN)) @@ -762,9 +766,9 @@ load_seeprom(ahc) ahc->type &= ~AHC_ULTRA; } /* Set the host ID */ - AHC_OUTB(ahc, SCSICONF, scsi_conf); + ahc_outb(ahc, SCSICONF, scsi_conf); /* In case we are a wide card */ - AHC_OUTB(ahc, SCSICONF + 1, host_id); + ahc_outb(ahc, SCSICONF + 1, host_id); } } |