diff options
author | msmith <msmith@FreeBSD.org> | 1997-09-26 17:17:43 +0000 |
---|---|---|
committer | msmith <msmith@FreeBSD.org> | 1997-09-26 17:17:43 +0000 |
commit | 1b05a4262f08220c6b98bd978cdb56a0bfd3028f (patch) | |
tree | 3038f8068ae17d036cf3cde4212b8b70bf97ff96 /sys/dev | |
parent | fb193b1b607c3a919ee26e0794338cf1de24ca37 (diff) | |
download | FreeBSD-src-1b05a4262f08220c6b98bd978cdb56a0bfd3028f.zip FreeBSD-src-1b05a4262f08220c6b98bd978cdb56a0bfd3028f.tar.gz |
The previous commit broke support for the Pro/10; detect which sort of
card we are using and calculate the IRQ accordingly.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ex/if_ex.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/sys/dev/ex/if_ex.c b/sys/dev/ex/if_ex.c index 7635e0d..fd8714c 100644 --- a/sys/dev/ex/if_ex.c +++ b/sys/dev/ex/if_ex.c @@ -23,10 +23,12 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ /* - * Intel EtherExpress Pro/10 Ethernet driver + * Intel EtherExpress Pro/10, Pro/10+ Ethernet driver * * Revision history: * @@ -91,6 +93,8 @@ struct ex_softc { u_int iobase; /* I/O base address. */ u_short connector; /* Connector type. */ u_short irq_no; /* IRQ number. */ + char *irq2ee; /* irq <-> internal representation conversion */ + u_char *ee2irq; u_int mem_size; /* Total memory size, in bytes. */ u_int rx_mem_size; /* Rx memory size (by default, first 3/4 of total memory). */ u_int rx_lower_limit, rx_upper_limit; /* Lower and upper limits of receive buffer. */ @@ -103,8 +107,10 @@ struct ex_softc { static struct ex_softc ex_sc[NEX]; /* XXX would it be better to malloc(3) the memory? */ -static char irq2eemap[] = { -1, -1, -1, 0, 1, 2, -1, 3, -1, 4, 5, 6, 7, -1, -1, -1 }; -static u_char ee2irqmap[] = { 3, 4, 5, 7, 9, 10, 11, 12 }; +static char irq2eemap[] = { -1, -1, 0, 1, -1, 2, -1, -1, -1, 0, 3, 4, -1, -1, -1, -1 }; +static u_char ee2irqmap[] = { 9, 3, 5, 10, 11, 0, 0, 0 }; +static char plus_irq2eemap[] = { -1, -1, -1, 0, 1, 2, -1, 3, -1, 4, 5, 6, 7, -1, -1, -1 }; +static u_char plus_ee2irqmap[] = { 3, 4, 5, 7, 9, 10, 11, 12 }; static int ex_probe __P((struct isa_device *)); static int ex_attach __P((struct isa_device *)); @@ -196,13 +202,25 @@ int ex_probe(struct isa_device *dev) sc->arpcom.ac_enaddr[1] = eaddr_tmp & 0xff; sc->arpcom.ac_enaddr[0] = eaddr_tmp >> 8; tmp = eeprom_read(iobase, EE_IRQ_No) & IRQ_No_Mask; + + /* work out which set of irq <-> internal tables to use */ + if (sc->arpcom.ac_enaddr[0] == 0x00 && + sc->arpcom.ac_enaddr[1] == 0xA0 && + sc->arpcom.ac_enaddr[2] == 0xC9) { /* it's a 10+ */ + sc->irq2ee = plus_irq2eemap; + sc->ee2irq = plus_ee2irqmap; + } else { /* it's an ordinary 10 */ + sc->irq2ee = irq2eemap; + sc->ee2irq = ee2irqmap; + } + if (dev->id_irq > 0) { - if (ee2irqmap[tmp] != ffs(dev->id_irq) - 1) - printf("ex%d: WARNING: board's EEPROM is configured for IRQ %d, using %d\n", unit, ee2irqmap[tmp], ffs(dev->id_irq) - 1); + if (sc->ee2irq[tmp] != ffs(dev->id_irq) - 1) + printf("ex%d: WARNING: board's EEPROM is configured for IRQ %d, using %d\n", unit, sc->ee2irq[tmp], ffs(dev->id_irq) - 1); sc->irq_no = ffs(dev->id_irq) - 1; } else { - sc->irq_no = ee2irqmap[tmp]; + sc->irq_no = sc->ee2irq[tmp]; dev->id_irq = 1 << sc->irq_no; } if (sc->irq_no == 0) { @@ -316,7 +334,7 @@ void ex_init(void *xsc) outb(iobase + REG2, inb(iobase + REG2) | No_SA_Ins | RX_CRC_InMem); outb(iobase + REG3, inb(iobase + REG3) & 0x3f /* XXX constants. */ ); outb(iobase + CMD_REG, Bank1_Sel); - outb(iobase + INT_NO_REG, (inb(iobase + INT_NO_REG) & 0xf8) | irq2eemap[sc->irq_no]); + outb(iobase + INT_NO_REG, (inb(iobase + INT_NO_REG) & 0xf8) | sc->irq2ee[sc->irq_no]); /* * Divide the available memory in the card into rcv and xmt buffers. |