summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/mii/mii_physubr.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/dev/mii/mii_physubr.c')
-rw-r--r--freebsd/sys/dev/mii/mii_physubr.c144
1 files changed, 46 insertions, 98 deletions
diff --git a/freebsd/sys/dev/mii/mii_physubr.c b/freebsd/sys/dev/mii/mii_physubr.c
index 7fc4135c..e2725ba6 100644
--- a/freebsd/sys/dev/mii/mii_physubr.c
+++ b/freebsd/sys/dev/mii/mii_physubr.c
@@ -58,7 +58,7 @@ __FBSDID("$FreeBSD$");
/*
* Media to register setting conversion table. Order matters.
*/
-const struct mii_media mii_media_table[MII_NMEDIA] = {
+static const struct mii_media mii_media_table[MII_NMEDIA] = {
/* None */
{ BMCR_ISO, ANAR_CSMA,
0, },
@@ -152,9 +152,6 @@ mii_phy_setmedia(struct mii_softc *sc)
}
}
- if ((ife->ifm_media & IFM_LOOP) != 0)
- bmcr |= BMCR_LOOP;
-
PHY_WRITE(sc, MII_ANAR, anar);
PHY_WRITE(sc, MII_BMCR, bmcr);
if ((sc->mii_flags & MIIF_HAVE_GTCR) != 0)
@@ -253,7 +250,7 @@ mii_phy_tick(struct mii_softc *sc)
return (EJUSTRETURN);
sc->mii_ticks = 0;
- mii_phy_reset(sc);
+ PHY_RESET(sc);
mii_phy_auto(sc);
return (0);
}
@@ -311,99 +308,6 @@ mii_phy_update(struct mii_softc *sc, int cmd)
}
/*
- * Given an ifmedia word, return the corresponding ANAR value.
- */
-int
-mii_anar(int media)
-{
- int rv;
-
- switch (media & (IFM_TMASK|IFM_NMASK|IFM_FDX)) {
- case IFM_ETHER|IFM_10_T:
- rv = ANAR_10|ANAR_CSMA;
- break;
- case IFM_ETHER|IFM_10_T|IFM_FDX:
- rv = ANAR_10_FD|ANAR_CSMA;
- break;
- case IFM_ETHER|IFM_100_TX:
- rv = ANAR_TX|ANAR_CSMA;
- break;
- case IFM_ETHER|IFM_100_TX|IFM_FDX:
- rv = ANAR_TX_FD|ANAR_CSMA;
- break;
- case IFM_ETHER|IFM_100_T4:
- rv = ANAR_T4|ANAR_CSMA;
- break;
- default:
- rv = 0;
- break;
- }
-
- return (rv);
-}
-
-/*
- * Initialize generic PHY media based on BMSR, called when a PHY is
- * attached. We expect to be set up to print a comma-separated list
- * of media names. Does not print a newline.
- */
-void
-mii_add_media(struct mii_softc *sc)
-{
- struct mii_data *mii = sc->mii_pdata;
- const char *sep = "";
-
- if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) {
- printf("no media present");
- return;
- }
-
-#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
-#define PRINT(s) printf("%s%s", sep, s); sep = ", "
-
- if (sc->mii_capabilities & BMSR_10THDX) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst), 0);
- PRINT("10baseT");
- }
- if (sc->mii_capabilities & BMSR_10TFDX) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
- BMCR_FDX);
- PRINT("10baseT-FDX");
- }
- if (sc->mii_capabilities & BMSR_100TXHDX) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
- BMCR_S100);
- PRINT("100baseTX");
- }
- if (sc->mii_capabilities & BMSR_100TXFDX) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
- BMCR_S100|BMCR_FDX);
- PRINT("100baseTX-FDX");
- }
- if (sc->mii_capabilities & BMSR_100T4) {
- /*
- * XXX How do you enable 100baseT4? I assume we set
- * XXX BMCR_S100 and then assume the PHYs will take
- * XXX watever action is necessary to switch themselves
- * XXX into T4 mode.
- */
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst),
- BMCR_S100);
- PRINT("100baseT4");
- }
- if (sc->mii_capabilities & BMSR_ANEG) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
- BMCR_AUTOEN);
- PRINT("auto");
- }
-
-
-
-#undef ADD
-#undef PRINT
-}
-
-/*
* Initialize generic PHY media based on BMSR, called when a PHY is
* attached. We expect to be set up to print a comma-separated list
* of media names. Does not print a newline.
@@ -621,6 +525,50 @@ mii_phy_dev_probe(device_t dev, const struct mii_phydesc *mpd, int mrv)
return (ENXIO);
}
+void
+mii_phy_dev_attach(device_t dev, u_int flags, const struct mii_phy_funcs *mpf,
+ int add_media)
+{
+ struct mii_softc *sc;
+ struct mii_attach_args *ma;
+ struct mii_data *mii;
+
+ sc = device_get_softc(dev);
+ ma = device_get_ivars(dev);
+ sc->mii_dev = device_get_parent(dev);
+ mii = ma->mii_data;
+ LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
+
+ sc->mii_flags = flags | miibus_get_flags(dev);
+ sc->mii_mpd_oui = MII_OUI(ma->mii_id1, ma->mii_id2);
+ sc->mii_mpd_model = MII_MODEL(ma->mii_id2);
+ sc->mii_mpd_rev = MII_REV(ma->mii_id2);
+ sc->mii_capmask = ma->mii_capmask;
+ sc->mii_inst = mii->mii_instance++;
+ sc->mii_phy = ma->mii_phyno;
+ sc->mii_offset = ma->mii_offset;
+ sc->mii_funcs = mpf;
+ sc->mii_pdata = mii;
+
+ if (bootverbose)
+ device_printf(dev, "OUI 0x%06x, model 0x%04x, rev. %d\n",
+ sc->mii_mpd_oui, sc->mii_mpd_model, sc->mii_mpd_rev);
+
+ if (add_media == 0)
+ return;
+
+ PHY_RESET(sc);
+
+ sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask;
+ if (sc->mii_capabilities & BMSR_EXTSTAT)
+ sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
+ device_printf(dev, " ");
+ mii_phy_add_media(sc);
+ printf("\n");
+
+ MIIBUS_MEDIAINIT(sc->mii_dev);
+}
+
/*
* Return the flow control status flag from MII_ANAR & MII_ANLPAR.
*/