summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/pci/tsunami.c16
-rw-r--r--sys/alpha/pci/tsunami_pci.c15
-rw-r--r--sys/alpha/pci/tsunamivar.h1
-rw-r--r--sys/dev/pci/pci.c4
-rw-r--r--sys/pci/pci.c4
5 files changed, 31 insertions, 9 deletions
diff --git a/sys/alpha/pci/tsunami.c b/sys/alpha/pci/tsunami.c
index 48cdd45..5468a62 100644
--- a/sys/alpha/pci/tsunami.c
+++ b/sys/alpha/pci/tsunami.c
@@ -275,9 +275,13 @@ tsunami_check_abort(void)
KV(TSUNAMI_CONF(h) | ((b) << 16) | ((s) << 11) | ((f) << 8) | (r))
#define CFGREAD(h, b, s, f, r, op, width, type) \
- int bus = tsunami_bus_within_hose(h, b) ? b : 0; \
- vm_offset_t va = TSUNAMI_CFGADDR(bus, s, f, r, h); \
+ int bus; \
+ vm_offset_t va; \
type data; \
+ if (h == (u_int8_t)-1) \
+ h = tsunami_hose_from_bus(b); \
+ bus = tsunami_bus_within_hose(h, b) ? b : 0; \
+ va = TSUNAMI_CFGADDR(bus, s, f, r, h); \
tsunami_clear_abort(); \
if (badaddr((caddr_t)va, width)) { \
tsunami_check_abort(); \
@@ -289,8 +293,12 @@ tsunami_check_abort(void)
return data;
#define CFWRITE(h, b, s, f, r, data, op, width) \
- int bus = tsunami_bus_within_hose(h, b) ? b : 0; \
- vm_offset_t va = TSUNAMI_CFGADDR(bus, s, f, r, h); \
+ int bus; \
+ vm_offset_t va; \
+ if (h == (u_int8_t)-1) \
+ h = tsunami_hose_from_bus(b); \
+ bus = tsunami_bus_within_hose(h, b) ? b : 0; \
+ va = TSUNAMI_CFGADDR(bus, s, f, r, h); \
tsunami_clear_abort(); \
if (badaddr((caddr_t)va, width)) \
return; \
diff --git a/sys/alpha/pci/tsunami_pci.c b/sys/alpha/pci/tsunami_pci.c
index 6f7af88..634260c 100644
--- a/sys/alpha/pci/tsunami_pci.c
+++ b/sys/alpha/pci/tsunami_pci.c
@@ -41,7 +41,7 @@
static devclass_t pcib_devclass;
-int tsunami_hoses[TSUNAMI_MAXHOSES] = {0,0,0,0};
+int tsunami_hoses[TSUNAMI_MAXHOSES+1] = {0,-1,-1,-1,-1};
int
tsunami_bus_within_hose(int hose, int bus)
@@ -49,6 +49,19 @@ tsunami_bus_within_hose(int hose, int bus)
return(bus - tsunami_hoses[hose]);
}
+int
+tsunami_hose_from_bus(int bus)
+{
+ int i;
+ for(i = 1; i <= TSUNAMI_MAXHOSES && tsunami_hoses[i] != -1; i++){
+ if(tsunami_hoses[i] > bus)
+ return i-1;
+ }
+ return i-1;
+
+}
+
+
static int
tsunami_pcib_probe(device_t dev)
{
diff --git a/sys/alpha/pci/tsunamivar.h b/sys/alpha/pci/tsunamivar.h
index f82351f..89cb2ab 100644
--- a/sys/alpha/pci/tsunamivar.h
+++ b/sys/alpha/pci/tsunamivar.h
@@ -28,3 +28,4 @@
extern void tsunami_init(void);
extern int tsunami_bus_within_hose(int, int);
+extern int tsunami_hose_from_bus(int);
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 4305b6c..bfdf9d0 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -845,7 +845,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case 4:
case 2:
case 1:
- probe.hose = 0; /* XXXXX */
+ probe.hose = -1;
probe.bus = io->pi_sel.pc_bus;
probe.slot = io->pi_sel.pc_dev;
probe.func = io->pi_sel.pc_func;
@@ -866,7 +866,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case 4:
case 2:
case 1:
- probe.hose = 0; /* XXXXX */
+ probe.hose = -1;
probe.bus = io->pi_sel.pc_bus;
probe.slot = io->pi_sel.pc_dev;
probe.func = io->pi_sel.pc_func;
diff --git a/sys/pci/pci.c b/sys/pci/pci.c
index 4305b6c..bfdf9d0 100644
--- a/sys/pci/pci.c
+++ b/sys/pci/pci.c
@@ -845,7 +845,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case 4:
case 2:
case 1:
- probe.hose = 0; /* XXXXX */
+ probe.hose = -1;
probe.bus = io->pi_sel.pc_bus;
probe.slot = io->pi_sel.pc_dev;
probe.func = io->pi_sel.pc_func;
@@ -866,7 +866,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case 4:
case 2:
case 1:
- probe.hose = 0; /* XXXXX */
+ probe.hose = -1;
probe.bus = io->pi_sel.pc_bus;
probe.slot = io->pi_sel.pc_dev;
probe.func = io->pi_sel.pc_func;
OpenPOWER on IntegriCloud