summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormbr <mbr@FreeBSD.org>2003-05-15 16:53:29 +0000
committermbr <mbr@FreeBSD.org>2003-05-15 16:53:29 +0000
commit41e5d092651b429015475249c999edc248fddbc4 (patch)
tree64b63b3dd2f682dc6514250ea9395a9bc7e84392 /sys
parentb252fa2abcc7eede5196cf9c9e57da6d849085d8 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/dev/dc/if_dc.c28
-rw-r--r--sys/pci/if_dc.c28
2 files changed, 52 insertions, 4 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. */
diff --git a/sys/pci/if_dc.c b/sys/pci/if_dc.c
index c083bc4..8c3dcea 100644
--- a/sys/pci/if_dc.c
+++ b/sys/pci/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. */
OpenPOWER on IntegriCloud