summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>1996-11-11 05:26:14 +0000
committergibbs <gibbs@FreeBSD.org>1996-11-11 05:26:14 +0000
commitf2d4d5247b25a7e7cc85c2e16eccabdb0b451851 (patch)
treee8db48e4847d58761612ffc2b731c1fa48f02c89
parent03be7529130c843c1c3e4bc1766f199f5b5ebfcb (diff)
downloadFreeBSD-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.c142
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);
}
}
OpenPOWER on IntegriCloud