diff options
author | wpaul <wpaul@FreeBSD.org> | 2001-12-19 18:23:45 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2001-12-19 18:23:45 +0000 |
commit | c49f583088715d4df0cb4864049f636add630dee (patch) | |
tree | 91f1d968f1bd50dbaedca5db162c1c1115457b6b /sys | |
parent | e3ec4c1279fbad168e0125c86ec3fb1bd0ab699a (diff) | |
download | FreeBSD-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.c | 12 | ||||
-rw-r--r-- | sys/pci/if_dc.c | 12 |
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; } |