aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/dc
diff options
context:
space:
mode:
authorMartin Blapp <mbr@FreeBSD.org>2003-05-15 16:53:29 +0000
committerMartin Blapp <mbr@FreeBSD.org>2003-05-15 16:53:29 +0000
commitf956e0b3f0fe8f6922a7a58059e4fef91706f8d9 (patch)
tree64b63b3dd2f682dc6514250ea9395a9bc7e84392 /sys/dev/dc
parent0fbce30315a9e3cf8dc8d403c19a3b90ed28b9cf (diff)
Notes
Diffstat (limited to 'sys/dev/dc')
-rw-r--r--sys/dev/dc/if_dc.c28
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. */