summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2001-12-19 18:23:45 +0000
committerwpaul <wpaul@FreeBSD.org>2001-12-19 18:23:45 +0000
commitc49f583088715d4df0cb4864049f636add630dee (patch)
tree91f1d968f1bd50dbaedca5db162c1c1115457b6b /sys
parente3ec4c1279fbad168e0125c86ec3fb1bd0ab699a (diff)
downloadFreeBSD-src-c49f583088715d4df0cb4864049f636add630dee.zip
FreeBSD-src-c49f583088715d4df0cb4864049f636add630dee.tar.gz
Fix the "conexant chips don't work in full duplexmode" problem. According
to Phil Kernick: "The problem is that in full duplex mode, the Conexant chip always reports a carrier lost error, even when the frame is successfully sent. So, if we have a Conexant chip, then ignore carrier lost when in full duplex mode." Since the Xircom chips seem to have the same issue and since we already have a workaround for this, just expand the workaround test to also check for DC_IS_CONEXANT().
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/dc/if_dc.c12
-rw-r--r--sys/pci/if_dc.c12
2 files changed, 16 insertions, 8 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c
index 3f73bcb..6ef8a98 100644
--- a/sys/dev/dc/if_dc.c
+++ b/sys/dev/dc/if_dc.c
@@ -2618,21 +2618,25 @@ static void dc_txeof(sc)
continue;
}
- if (DC_IS_XIRCOM(sc)) {
+ if (DC_IS_XIRCOM(sc) || DC_IS_CONEXANT(sc)) {
/*
* XXX: Why does my Xircom taunt me so?
* For some reason it likes setting the CARRLOST flag
- * even when the carrier is there. wtf?!? */
+ * even when the carrier is there. wtf?!?
+ * Who knows, but Conexant chips have the
+ * same problem. Maybe they took lessons
+ * from Xircom.
+ */
if (/*sc->dc_type == DC_TYPE_21143 &&*/
sc->dc_pmode == DC_PMODE_MII &&
((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
- DC_TXSTAT_NOCARRIER)))
+ DC_TXSTAT_NOCARRIER)))
txstat &= ~DC_TXSTAT_ERRSUM;
} else {
if (/*sc->dc_type == DC_TYPE_21143 &&*/
sc->dc_pmode == DC_PMODE_MII &&
((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
- DC_TXSTAT_NOCARRIER|DC_TXSTAT_CARRLOST)))
+ DC_TXSTAT_NOCARRIER|DC_TXSTAT_CARRLOST)))
txstat &= ~DC_TXSTAT_ERRSUM;
}
diff --git a/sys/pci/if_dc.c b/sys/pci/if_dc.c
index 3f73bcb..6ef8a98 100644
--- a/sys/pci/if_dc.c
+++ b/sys/pci/if_dc.c
@@ -2618,21 +2618,25 @@ static void dc_txeof(sc)
continue;
}
- if (DC_IS_XIRCOM(sc)) {
+ if (DC_IS_XIRCOM(sc) || DC_IS_CONEXANT(sc)) {
/*
* XXX: Why does my Xircom taunt me so?
* For some reason it likes setting the CARRLOST flag
- * even when the carrier is there. wtf?!? */
+ * even when the carrier is there. wtf?!?
+ * Who knows, but Conexant chips have the
+ * same problem. Maybe they took lessons
+ * from Xircom.
+ */
if (/*sc->dc_type == DC_TYPE_21143 &&*/
sc->dc_pmode == DC_PMODE_MII &&
((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
- DC_TXSTAT_NOCARRIER)))
+ DC_TXSTAT_NOCARRIER)))
txstat &= ~DC_TXSTAT_ERRSUM;
} else {
if (/*sc->dc_type == DC_TYPE_21143 &&*/
sc->dc_pmode == DC_PMODE_MII &&
((txstat & 0xFFFF) & ~(DC_TXSTAT_ERRSUM|
- DC_TXSTAT_NOCARRIER|DC_TXSTAT_CARRLOST)))
+ DC_TXSTAT_NOCARRIER|DC_TXSTAT_CARRLOST)))
txstat &= ~DC_TXSTAT_ERRSUM;
}
OpenPOWER on IntegriCloud