diff options
| author | Martin Blapp <mbr@FreeBSD.org> | 2003-05-15 16:53:29 +0000 |
|---|---|---|
| committer | Martin Blapp <mbr@FreeBSD.org> | 2003-05-15 16:53:29 +0000 |
| commit | f956e0b3f0fe8f6922a7a58059e4fef91706f8d9 (patch) | |
| tree | 64b63b3dd2f682dc6514250ea9395a9bc7e84392 /sys/dev/dc | |
| parent | 0fbce30315a9e3cf8dc8d403c19a3b90ed28b9cf (diff) | |
Notes
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 c083bc40a4232..8c3dceae865c8 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. */ |
