diff options
author | imp <imp@FreeBSD.org> | 2005-09-06 22:55:32 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2005-09-06 22:55:32 +0000 |
commit | a9d0faae5cdf50cd86447af0098bd588c866611e (patch) | |
tree | 5eb6ef15f5cb70ef80824c4c3fb3df97e43df22f /sys | |
parent | 7cd18dbbe8d0fa354c1d4b0bffce6181daef5707 (diff) | |
download | FreeBSD-src-a9d0faae5cdf50cd86447af0098bd588c866611e.zip FreeBSD-src-a9d0faae5cdf50cd86447af0098bd588c866611e.tar.gz |
Work around a bug I've seen on Linksys EC2T cards. For some reason,
as yet unknown, those cards report their MAC address a byte at a time.
However, other AX88x90 cards report the MAC address a word at a time.
Add a heuristic which looks at the high order bytes of the first 6
words. If they are all '0', assume the card is behaving like the
Linksys EC2T card. Since the default prefix for these cards appears
to be 00:e0:98, this appears to be a safe heuristic. While some cards
have been observed with different prefixes, they all work with this
heuristic.
I'm unsure if this is a bug in the EC2T card, or if it is a bug in the
initialization of the card. No other OS has this heuristic (although
w/o it, the MAC address that is used works).
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ed/if_ed_pccard.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c index 9afa700..a39e161 100644 --- a/sys/dev/ed/if_ed_pccard.c +++ b/sys/dev/ed/if_ed_pccard.c @@ -431,9 +431,32 @@ ax88x90_geteprom(struct ed_softc *sc) /* Get Data */ for (i = 0; i < 16; i++) - prom[i] = ed_asic_inb(sc, 0); + prom[i] = ed_asic_inw(sc, 0); + + /* + * Work around a bug I've seen on Linksys EC2T cards. On + * these cards, the node address is contained in the low order + * bytes of the prom, with the upper byte being 0. On other + * cards, the bytes are packed two per word. I'm unsure why + * this is the case, and why no other open source OS has a + * similar workaround. The Linksys EC2T card is still extremely + * popular on E-Bay, fetching way more than any other 10Mbps + * only card. I might be able to test to see if prom[7] and + * prom[15] == 0x5757, since that appears to be a reliable + * test. On the EC2T cards, I get 0x0057 in prom[14,15] instead. + */ for (i = 0; i < ETHER_ADDR_LEN; i++) - sc->enaddr[i] = prom[i]; + if (prom[i] & 0xff00) + break; + if (i == ETHER_ADDR_LEN) { + for (i = 0; i < ETHER_ADDR_LEN; i++) + sc->enaddr[i] = prom[i] & 0xff; + } else { + for (i = 0; i < ETHER_ADDR_LEN; i += 2) { + sc->enaddr[i] = prom[i / 2] & 0xff; + sc->enaddr[i + 1] = (prom[i / 2] >> 8) & 0xff; + } + } } static int |