diff options
Diffstat (limited to 'sys/dev/mii/brgphy.c')
-rw-r--r-- | sys/dev/mii/brgphy.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c index 9f6ed9c..ed86ca8a 100644 --- a/sys/dev/mii/brgphy.c +++ b/sys/dev/mii/brgphy.c @@ -58,6 +58,9 @@ __FBSDID("$FreeBSD$"); #include <machine/bus.h> #include <dev/bge/if_bgereg.h> +#include <pci/pcireg.h> +#include <pci/pcivar.h> + #include "miibus_if.h" static int brgphy_probe(device_t); @@ -153,6 +156,8 @@ brgphy_attach(dev) struct mii_attach_args *ma; struct mii_data *mii; const char *sep = ""; + struct bge_softc *bge_sc; + int fast_ether_only = FALSE; sc = device_get_softc(dev); ma = device_get_ivars(dev); @@ -186,11 +191,26 @@ brgphy_attach(dev) sc->mii_capabilities &= ~BMSR_ANEG; device_printf(dev, " "); mii_add_media(sc); - ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst), - BRGPHY_BMCR_FDX); - PRINT(", 1000baseTX"); - ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX, sc->mii_inst), 0); - PRINT("1000baseTX-FDX"); + + /* The 590x chips are 10/100 only. */ + + bge_sc = mii->mii_ifp->if_softc; + + if (strcmp(mii->mii_ifp->if_name, "bge") == 0 && + pci_get_vendor(bge_sc->bge_dev) == BCOM_VENDORID && + (pci_get_device(bge_sc->bge_dev) == BCOM_DEVICEID_BCM5901 || + pci_get_device(bge_sc->bge_dev) == BCOM_DEVICEID_BCM5901A2)) + fast_ether_only = TRUE; + + if (fast_ether_only == FALSE) { + ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, + sc->mii_inst), BRGPHY_BMCR_FDX); + PRINT(", 1000baseTX"); + ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, + IFM_FDX, sc->mii_inst), 0); + PRINT("1000baseTX-FDX"); + } + ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0); PRINT("auto"); |