diff options
author | mbr <mbr@FreeBSD.org> | 2003-05-15 16:53:29 +0000 |
---|---|---|
committer | mbr <mbr@FreeBSD.org> | 2003-05-15 16:53:29 +0000 |
commit | 41e5d092651b429015475249c999edc248fddbc4 (patch) | |
tree | 64b63b3dd2f682dc6514250ea9395a9bc7e84392 /sys/dev/dc | |
parent | b252fa2abcc7eede5196cf9c9e57da6d849085d8 (diff) | |
download | FreeBSD-src-41e5d092651b429015475249c999edc248fddbc4.zip FreeBSD-src-41e5d092651b429015475249c999edc248fddbc4.tar.gz |
Only use a SIA/SYM media info block if no MII block is detected.
The submitter of PR 32118 told me that this patch also fixes autoselecting
for znyx 4 port cards (10baseT, 100baseTX did work already).
PR: 32118
Reviewed by: imp
Approved by: rwatson (re)
Diffstat (limited to 'sys/dev/dc')
-rw-r--r-- | sys/dev/dc/if_dc.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c index c083bc4..8c3dcea 100644 --- a/sys/dev/dc/if_dc.c +++ b/sys/dev/dc/if_dc.c @@ -1863,12 +1863,32 @@ dc_parse_21143_srom(sc) struct dc_eblock_hdr *hdr; int i, loff; char *ptr; + int have_mii; + have_mii = 0; loff = sc->dc_srom[27]; lhdr = (struct dc_leaf_hdr *)&(sc->dc_srom[loff]); ptr = (char *)lhdr; ptr += sizeof(struct dc_leaf_hdr) - 1; + /* + * Look if we got a MII media block. + */ + for (i = 0; i < lhdr->dc_mcnt; i++) { + hdr = (struct dc_eblock_hdr *)ptr; + if (hdr->dc_type == DC_EBLOCK_MII) + have_mii++; + + ptr += (hdr->dc_len & 0x7F); + ptr++; + } + + /* + * Do the same thing again. Only use SIA and SYM media + * blocks if no MII media block is available. + */ + ptr = (char *)lhdr; + ptr += sizeof(struct dc_leaf_hdr) - 1; for (i = 0; i < lhdr->dc_mcnt; i++) { hdr = (struct dc_eblock_hdr *)ptr; switch(hdr->dc_type) { @@ -1876,10 +1896,14 @@ dc_parse_21143_srom(sc) dc_decode_leaf_mii(sc, (struct dc_eblock_mii *)hdr); break; case DC_EBLOCK_SIA: - dc_decode_leaf_sia(sc, (struct dc_eblock_sia *)hdr); + if (! have_mii) + dc_decode_leaf_sia(sc, + (struct dc_eblock_sia *)hdr); break; case DC_EBLOCK_SYM: - dc_decode_leaf_sym(sc, (struct dc_eblock_sym *)hdr); + if (! have_mii) + dc_decode_leaf_sym(sc, + (struct dc_eblock_sym *)hdr); break; default: /* Don't care. Yet. */ |