diff options
| author | Bill Paul <wpaul@FreeBSD.org> | 1999-05-04 20:54:48 +0000 |
|---|---|---|
| committer | Bill Paul <wpaul@FreeBSD.org> | 1999-05-04 20:54:48 +0000 |
| commit | b538a2a9c896d8eefbfa00572f412584d35e8faf (patch) | |
| tree | be46bd239aa04d850a4563fa8d853d1986a53ed8 /sys/pci | |
| parent | ecc07bc2486187cecbfcc68f9b4c0df8691db1b0 (diff) | |
Notes
Diffstat (limited to 'sys/pci')
| -rw-r--r-- | sys/pci/if_xl.c | 92 |
1 files changed, 48 insertions, 44 deletions
diff --git a/sys/pci/if_xl.c b/sys/pci/if_xl.c index eae0aa9372a4..b76634735689 100644 --- a/sys/pci/if_xl.c +++ b/sys/pci/if_xl.c @@ -29,7 +29,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: if_xl.c,v 1.95 1999/04/30 14:19:47 wpaul Exp $ + * $Id: if_xl.c,v 1.99 1999/05/04 20:29:58 wpaul Exp $ */ /* @@ -159,7 +159,7 @@ #if !defined(lint) static const char rcsid[] = - "$Id: if_xl.c,v 1.95 1999/04/30 14:19:47 wpaul Exp $"; + "$Id: if_xl.c,v 1.99 1999/05/04 20:29:58 wpaul Exp $"; #endif /* @@ -1130,7 +1130,7 @@ static void xl_setmode(sc, media) XL_SEL_WIN(3); icfg = CSR_READ_4(sc, XL_W3_INTERNAL_CFG); - if (sc->xl_media & (XL_MEDIAOPT_BT|XL_MEDIAOPT_10FL)) { + if (sc->xl_media & XL_MEDIAOPT_BT) { if (IFM_SUBTYPE(media) == IFM_10_T) { printf("10baseT transceiver, "); sc->xl_xcvr = XL_XCVR_10BT; @@ -1140,14 +1140,6 @@ static void xl_setmode(sc, media) XL_MEDIASTAT_JABGUARD; mediastat &= ~XL_MEDIASTAT_SQEENB; } - if (IFM_SUBTYPE(media) == IFM_10_FL) { - printf("10baseFL transceiver, "); - sc->xl_xcvr = XL_XCVR_10BT; - icfg &= ~XL_ICFG_CONNECTOR_MASK; - icfg |= (XL_XCVR_10BT << XL_ICFG_CONNECTOR_BITS); - mediastat |= XL_MEDIASTAT_LINKBEAT; - mediastat &= ~XL_MEDIASTAT_SQEENB; - } } if (sc->xl_media & XL_MEDIAOPT_BFX) { @@ -1161,7 +1153,7 @@ static void xl_setmode(sc, media) } } - if (sc->xl_media & XL_MEDIAOPT_AUI) { + if (sc->xl_media & (XL_MEDIAOPT_AUI|XL_MEDIAOPT_10FL)) { if (IFM_SUBTYPE(media) == IFM_10_5) { printf("AUI port, "); sc->xl_xcvr = XL_XCVR_AUI; @@ -1171,6 +1163,15 @@ static void xl_setmode(sc, media) XL_MEDIASTAT_JABGUARD); mediastat |= ~XL_MEDIASTAT_SQEENB; } + if (IFM_SUBTYPE(media) == IFM_10_FL) { + printf("10baseFL transceiver, "); + sc->xl_xcvr = XL_XCVR_AUI; + icfg &= ~XL_ICFG_CONNECTOR_MASK; + icfg |= (XL_XCVR_AUI << XL_ICFG_CONNECTOR_BITS); + mediastat &= ~(XL_MEDIASTAT_LINKBEAT| + XL_MEDIASTAT_JABGUARD); + mediastat |= ~XL_MEDIASTAT_SQEENB; + } } if (sc->xl_media & XL_MEDIAOPT_BNC) { @@ -1279,14 +1280,11 @@ static void xl_mediacheck(sc) * XXX I should check for 10baseFL, but I don't have an adapter * to test with. */ - if (sc->xl_media & XL_MEDIAOPT_MASK) { + if (sc->xl_media & (XL_MEDIAOPT_MASK & ~XL_MEDIAOPT_VCO)) { /* * Check the XCVR value. If it's not in the normal range * of values, we need to fake it up here. */ - if (sc->xl_type == XL_TYPE_905B && - sc->xl_media & XL_MEDIAOPT_10FL) - return; if (sc->xl_xcvr <= XL_XCVR_AUTO) return; else { @@ -1296,6 +1294,9 @@ static void xl_mediacheck(sc) "on card type\n", sc->xl_unit); } } else { + if (sc->xl_type == XL_TYPE_905B && + sc->xl_media & XL_MEDIAOPT_10FL) + return; printf("xl%d: WARNING: no media options bits set in " "the media options register!!\n", sc->xl_unit); printf("xl%d: this could be a manufacturing defect in " @@ -1313,8 +1314,8 @@ static void xl_mediacheck(sc) xl_read_eeprom(sc, (caddr_t)&devid, XL_EE_PRODID, 1, 0); switch(devid) { - case TC_DEVICEID_BOOMERANG_10BT: /* 3c900-TP */ - case TC_DEVICEID_KRAKATOA_10BT: /* 3c900B-TP */ + case TC_DEVICEID_BOOMERANG_10BT: /* 3c900-TPO */ + case TC_DEVICEID_KRAKATOA_10BT: /* 3c900B-TPO */ sc->xl_media = XL_MEDIAOPT_BT; sc->xl_xcvr = XL_XCVR_10BT; printf("xl%d: guessing 10BaseT transceiver\n", sc->xl_unit); @@ -1332,7 +1333,7 @@ static void xl_mediacheck(sc) break; case TC_DEVICEID_CYCLONE_10FL: /* 3c900B-FL */ sc->xl_media = XL_MEDIAOPT_10FL; - sc->xl_xcvr = XL_XCVR_10BT; + sc->xl_xcvr = XL_XCVR_AUI; printf("xl%d: guessing 10baseFL\n", sc->xl_unit); break; case TC_DEVICEID_BOOMERANG_10_100BT: /* 3c905-TX */ @@ -1653,7 +1654,17 @@ xl_attach(config_id, unit) */ ifmedia_init(&sc->ifmedia, 0, xl_ifmedia_upd, xl_ifmedia_sts); - if (sc->xl_media & (XL_MEDIAOPT_BT|XL_MEDIAOPT_10FL)) { + if (sc->xl_media & XL_MEDIAOPT_BT) { + if (bootverbose) + printf("xl%d: found 10baseT\n", sc->xl_unit); + ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T|IFM_HDX, 0, NULL); + if (sc->xl_caps & XL_CAPS_FULL_DUPLEX) + ifmedia_add(&sc->ifmedia, + IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL); + } + + if (sc->xl_media & (XL_MEDIAOPT_AUI|XL_MEDIAOPT_10FL)) { /* * Check for a 10baseFL board in disguise. */ @@ -1669,22 +1680,11 @@ xl_attach(config_id, unit) IFM_ETHER|IFM_10_FL|IFM_FDX, 0, NULL); } else { if (bootverbose) - printf("xl%d: found 10baseT\n", sc->xl_unit); - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL); - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T|IFM_HDX, - 0, NULL); - if (sc->xl_caps & XL_CAPS_FULL_DUPLEX) - ifmedia_add(&sc->ifmedia, - IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL); + printf("xl%d: found AUI\n", sc->xl_unit); + ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_5, 0, NULL); } } - if (sc->xl_media & XL_MEDIAOPT_AUI) { - if (bootverbose) - printf("xl%d: found AUI\n", sc->xl_unit); - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_5, 0, NULL); - } - if (sc->xl_media & XL_MEDIAOPT_BNC) { if (bootverbose) printf("xl%d: found BNC\n", sc->xl_unit); @@ -1731,19 +1731,19 @@ xl_attach(config_id, unit) /* Choose a default media. */ switch(sc->xl_xcvr) { case XL_XCVR_10BT: + media = IFM_ETHER|IFM_10_T; + xl_setmode(sc, media); + break; + case XL_XCVR_AUI: if (sc->xl_type == XL_TYPE_905B && sc->xl_media == XL_MEDIAOPT_10FL) { media = IFM_ETHER|IFM_10_FL; xl_setmode(sc, media); } else { - media = IFM_ETHER|IFM_10_T; + media = IFM_ETHER|IFM_10_5; xl_setmode(sc, media); } break; - case XL_XCVR_AUI: - media = IFM_ETHER|IFM_10_5; - xl_setmode(sc, media); - break; case XL_XCVR_COAX: media = IFM_ETHER|IFM_10_2; xl_setmode(sc, media); @@ -2689,18 +2689,22 @@ static void xl_ifmedia_sts(ifp, ifmr) switch(icfg) { case XL_XCVR_10BT: - if (sc->xl_type == XL_TYPE_905B && - sc->xl_media == XL_MEDIAOPT_10FL) - ifmr->ifm_active = IFM_ETHER|IFM_10_FL; - else - ifmr->ifm_active = IFM_ETHER|IFM_10_T; + ifmr->ifm_active = IFM_ETHER|IFM_10_T; if (CSR_READ_1(sc, XL_W3_MAC_CTRL) & XL_MACCTRL_DUPLEX) ifmr->ifm_active |= IFM_FDX; else ifmr->ifm_active |= IFM_HDX; break; case XL_XCVR_AUI: - ifmr->ifm_active = IFM_ETHER|IFM_10_5; + if (sc->xl_type == XL_TYPE_905B && + sc->xl_media == XL_MEDIAOPT_10FL) { + ifmr->ifm_active = IFM_ETHER|IFM_10_FL; + if (CSR_READ_1(sc, XL_W3_MAC_CTRL) & XL_MACCTRL_DUPLEX) + ifmr->ifm_active |= IFM_FDX; + else + ifmr->ifm_active |= IFM_HDX; + } else + ifmr->ifm_active = IFM_ETHER|IFM_10_5; break; case XL_XCVR_COAX: ifmr->ifm_active = IFM_ETHER|IFM_10_2; |
