summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/ip1000phy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mii/ip1000phy.c')
-rw-r--r--sys/dev/mii/ip1000phy.c70
1 files changed, 19 insertions, 51 deletions
diff --git a/sys/dev/mii/ip1000phy.c b/sys/dev/mii/ip1000phy.c
index d8a5242..3d90e7e 100644
--- a/sys/dev/mii/ip1000phy.c
+++ b/sys/dev/mii/ip1000phy.c
@@ -57,12 +57,6 @@ __FBSDID("$FreeBSD$");
static int ip1000phy_probe(device_t);
static int ip1000phy_attach(device_t);
-struct ip1000phy_softc {
- struct mii_softc mii_sc;
- int model;
- int revision;
-};
-
static device_method_t ip1000phy_methods[] = {
/* device interface */
DEVMETHOD(device_probe, ip1000phy_probe),
@@ -87,11 +81,17 @@ static void ip1000phy_reset(struct mii_softc *);
static int ip1000phy_mii_phy_auto(struct mii_softc *, int);
static const struct mii_phydesc ip1000phys[] = {
- MII_PHY_DESC(ICPLUS, IP1000A),
- MII_PHY_DESC(ICPLUS, IP1001),
+ MII_PHY_DESC(xxICPLUS, IP1000A),
+ MII_PHY_DESC(xxICPLUS, IP1001),
MII_PHY_END
};
+static const struct mii_phy_funcs ip1000phy_funcs = {
+ ip1000phy_service,
+ ip1000phy_status,
+ ip1000phy_reset
+};
+
static int
ip1000phy_probe(device_t dev)
{
@@ -102,43 +102,16 @@ ip1000phy_probe(device_t dev)
static int
ip1000phy_attach(device_t dev)
{
- struct ip1000phy_softc *isc;
- struct mii_softc *sc;
struct mii_attach_args *ma;
- struct mii_data *mii;
+ u_int flags;
- isc = device_get_softc(dev);
- sc = &isc->mii_sc;
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 = miibus_get_flags(dev);
- sc->mii_inst = mii->mii_instance++;
- sc->mii_phy = ma->mii_phyno;
- sc->mii_service = ip1000phy_service;
- sc->mii_pdata = mii;
-
- sc->mii_flags |= MIIF_NOISOLATE | MIIF_NOMANPAUSE;
-
- isc->model = MII_MODEL(ma->mii_id2);
- isc->revision = MII_REV(ma->mii_id2);
- if (isc->model == MII_MODEL_ICPLUS_IP1000A &&
- strcmp(mii->mii_ifp->if_dname, "stge") == 0 &&
- (sc->mii_flags & MIIF_MACPRIV0) != 0)
- sc->mii_flags |= MIIF_PHYPRIV0;
-
- sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
- if (sc->mii_capabilities & BMSR_EXTSTAT)
- sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
- device_printf(dev, " ");
-
- ip1000phy_reset(sc);
- mii_phy_add_media(sc);
- printf("\n");
-
- MIIBUS_MEDIAINIT(sc->mii_dev);
+ flags = MIIF_NOISOLATE | MIIF_NOMANPAUSE;
+ if (MII_MODEL(ma->mii_id2) == MII_MODEL_xxICPLUS_IP1000A &&
+ strcmp(ma->mii_data->mii_ifp->if_dname, "stge") == 0 &&
+ (miibus_get_flags(dev) & MIIF_MACPRIV0) != 0)
+ flags |= MIIF_PHYPRIV0;
+ mii_phy_dev_attach(dev, flags, &ip1000phy_funcs, 0);
return (0);
}
@@ -160,7 +133,7 @@ ip1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
break;
}
- ip1000phy_reset(sc);
+ PHY_RESET(sc);
switch (IFM_SUBTYPE(ife->ifm_media)) {
case IFM_AUTO:
(void)ip1000phy_mii_phy_auto(sc, ife->ifm_media);
@@ -245,7 +218,7 @@ done:
}
/* Update the media status. */
- ip1000phy_status(sc);
+ PHY_STATUS(sc);
/* Callback if something changed. */
mii_phy_update(sc, cmd);
@@ -255,12 +228,9 @@ done:
static void
ip1000phy_status(struct mii_softc *sc)
{
- struct ip1000phy_softc *isc;
struct mii_data *mii = sc->mii_pdata;
uint32_t bmsr, bmcr, stat;
- isc = (struct ip1000phy_softc *)sc;
-
mii->mii_media_status = IFM_AVALID;
mii->mii_media_active = IFM_ETHER;
@@ -281,7 +251,7 @@ ip1000phy_status(struct mii_softc *sc)
}
}
- if (isc->model == MII_MODEL_ICPLUS_IP1001) {
+ if (sc->mii_mpd_model == MII_MODEL_xxICPLUS_IP1001) {
stat = PHY_READ(sc, IP1000PHY_LSR);
switch (stat & IP1000PHY_LSR_SPEED_MASK) {
case IP1000PHY_LSR_SPEED_10:
@@ -339,12 +309,10 @@ ip1000phy_status(struct mii_softc *sc)
static int
ip1000phy_mii_phy_auto(struct mii_softc *sc, int media)
{
- struct ip1000phy_softc *isc;
uint32_t reg;
- isc = (struct ip1000phy_softc *)sc;
reg = 0;
- if (isc->model == MII_MODEL_ICPLUS_IP1001) {
+ if (sc->mii_mpd_model == MII_MODEL_xxICPLUS_IP1001) {
reg = PHY_READ(sc, IP1000PHY_MII_ANAR);
reg &= ~(IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE);
reg |= IP1000PHY_ANAR_NP;
OpenPOWER on IntegriCloud