summaryrefslogtreecommitdiffstats
path: root/sys/dev/ex
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ex')
-rw-r--r--sys/dev/ex/if_ex.c18
-rw-r--r--sys/dev/ex/if_ex_isa.c8
-rw-r--r--sys/dev/ex/if_exvar.h2
3 files changed, 18 insertions, 10 deletions
diff --git a/sys/dev/ex/if_ex.c b/sys/dev/ex/if_ex.c
index 16553c0..3e6c90c 100644
--- a/sys/dev/ex/if_ex.c
+++ b/sys/dev/ex/if_ex.c
@@ -325,24 +325,30 @@ ex_init_locked(struct ex_softc *sc)
*/
CSR_WRITE_1(sc, CMD_REG, Bank2_Sel);
temp_reg = CSR_READ_1(sc, EEPROM_REG);
- if (temp_reg & Trnoff_Enable) {
+ if (temp_reg & Trnoff_Enable)
CSR_WRITE_1(sc, EEPROM_REG, temp_reg & ~Trnoff_Enable);
- }
- for (i = 0; i < ETHER_ADDR_LEN; i++) {
+ for (i = 0; i < ETHER_ADDR_LEN; i++)
CSR_WRITE_1(sc, I_ADDR_REG0 + i, IF_LLADDR(sc->ifp)[i]);
- }
+
/*
* - Setup transmit chaining and discard bad received frames.
* - Match broadcast.
* - Clear test mode.
* - Set receiving mode.
- * - Set IRQ number.
*/
CSR_WRITE_1(sc, REG1, CSR_READ_1(sc, REG1) | Tx_Chn_Int_Md | Tx_Chn_ErStp | Disc_Bad_Fr);
CSR_WRITE_1(sc, REG2, CSR_READ_1(sc, REG2) | No_SA_Ins | RX_CRC_InMem);
CSR_WRITE_1(sc, REG3, CSR_READ_1(sc, REG3) & 0x3f /* XXX constants. */ );
+ /*
+ * - Set IRQ number, if this part has it. ISA devices have this,
+ * while PC Card devices don't seem to. Either way, we have to
+ * switch to Bank1 as the rest of this code relies on that.
+ */
CSR_WRITE_1(sc, CMD_REG, Bank1_Sel);
- CSR_WRITE_1(sc, INT_NO_REG, (CSR_READ_1(sc, INT_NO_REG) & 0xf8) | sc->irq2ee[sc->irq_no]);
+ if (sc->flags & HAS_INT_NO_REG)
+ CSR_WRITE_1(sc, INT_NO_REG,
+ (CSR_READ_1(sc, INT_NO_REG) & 0xf8) |
+ sc->irq2ee[sc->irq_no]);
/*
* Divide the available memory in the card into rcv and xmt buffers.
diff --git a/sys/dev/ex/if_ex_isa.c b/sys/dev/ex/if_ex_isa.c
index 31b00a3..02d4a75 100644
--- a/sys/dev/ex/if_ex_isa.c
+++ b/sys/dev/ex/if_ex_isa.c
@@ -247,12 +247,11 @@ ex_isa_probe(device_t dev)
tmp = ex_eeprom_read(sc, EE_W1) & EE_W1_INT_SEL;
irq = bus_get_resource_start(dev, SYS_RES_IRQ, 0);
-
if (irq > 0) {
/* This will happen if board is in PnP mode. */
if (ee2irq[tmp] != irq) {
- printf("ex: WARNING: board's EEPROM is configured"
- " for IRQ %d, using %d\n",
+ device_printf(dev,
+ "WARNING: IRQ mismatch: EEPROM %d, using %d\n",
ee2irq[tmp], irq);
}
} else {
@@ -267,7 +266,7 @@ ex_isa_probe(device_t dev)
bad:;
ex_release_resources(dev);
- return(error);
+ return (error);
}
static int
@@ -280,6 +279,7 @@ ex_isa_attach(device_t dev)
sc->dev = dev;
sc->ioport_rid = 0;
sc->irq_rid = 0;
+ sc->flags |= HAS_INT_NO_REG;
if ((error = ex_alloc_resources(dev)) != 0) {
device_printf(dev, "ex_alloc_resources() failed!\n");
diff --git a/sys/dev/ex/if_exvar.h b/sys/dev/ex/if_exvar.h
index 9278f6d..44576a3 100644
--- a/sys/dev/ex/if_exvar.h
+++ b/sys/dev/ex/if_exvar.h
@@ -68,6 +68,8 @@ struct ex_softc {
struct mtx lock;
struct callout timer;
int tx_timeout;
+ int flags;
+#define HAS_INT_NO_REG 1
};
extern devclass_t ex_devclass;
OpenPOWER on IntegriCloud