summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/e1000phy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mii/e1000phy.c')
-rw-r--r--sys/dev/mii/e1000phy.c121
1 files changed, 51 insertions, 70 deletions
diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c
index 25f3092..b0d7069 100644
--- a/sys/dev/mii/e1000phy.c
+++ b/sys/dev/mii/e1000phy.c
@@ -65,11 +65,6 @@ __FBSDID("$FreeBSD$");
static int e1000phy_probe(device_t);
static int e1000phy_attach(device_t);
-struct e1000phy_softc {
- struct mii_softc mii_sc;
- int mii_model;
-};
-
static device_method_t e1000phy_methods[] = {
/* device interface */
DEVMETHOD(device_probe, e1000phy_probe),
@@ -83,7 +78,7 @@ static devclass_t e1000phy_devclass;
static driver_t e1000phy_driver = {
"e1000phy",
e1000phy_methods,
- sizeof(struct e1000phy_softc)
+ sizeof(struct mii_softc)
};
DRIVER_MODULE(e1000phy, miibus, e1000phy_driver, e1000phy_devclass, 0, 0);
@@ -91,32 +86,38 @@ DRIVER_MODULE(e1000phy, miibus, e1000phy_driver, e1000phy_devclass, 0, 0);
static int e1000phy_service(struct mii_softc *, struct mii_data *, int);
static void e1000phy_status(struct mii_softc *);
static void e1000phy_reset(struct mii_softc *);
-static int e1000phy_mii_phy_auto(struct e1000phy_softc *, int);
+static int e1000phy_mii_phy_auto(struct mii_softc *, int);
static const struct mii_phydesc e1000phys[] = {
MII_PHY_DESC(MARVELL, E1000),
MII_PHY_DESC(MARVELL, E1011),
MII_PHY_DESC(MARVELL, E1000_3),
- MII_PHY_DESC(MARVELL, E1000S),
MII_PHY_DESC(MARVELL, E1000_5),
- MII_PHY_DESC(MARVELL, E1101),
- MII_PHY_DESC(MARVELL, E3082),
- MII_PHY_DESC(MARVELL, E1112),
- MII_PHY_DESC(MARVELL, E1149),
MII_PHY_DESC(MARVELL, E1111),
- MII_PHY_DESC(MARVELL, E1116),
- MII_PHY_DESC(MARVELL, E1116R),
- MII_PHY_DESC(MARVELL, E1118),
- MII_PHY_DESC(MARVELL, E3016),
- MII_PHY_DESC(MARVELL, PHYG65G),
MII_PHY_DESC(xxMARVELL, E1000),
MII_PHY_DESC(xxMARVELL, E1011),
MII_PHY_DESC(xxMARVELL, E1000_3),
+ MII_PHY_DESC(xxMARVELL, E1000S),
MII_PHY_DESC(xxMARVELL, E1000_5),
+ MII_PHY_DESC(xxMARVELL, E1101),
+ MII_PHY_DESC(xxMARVELL, E3082),
+ MII_PHY_DESC(xxMARVELL, E1112),
+ MII_PHY_DESC(xxMARVELL, E1149),
MII_PHY_DESC(xxMARVELL, E1111),
+ MII_PHY_DESC(xxMARVELL, E1116),
+ MII_PHY_DESC(xxMARVELL, E1116R),
+ MII_PHY_DESC(xxMARVELL, E1118),
+ MII_PHY_DESC(xxMARVELL, E3016),
+ MII_PHY_DESC(xxMARVELL, PHYG65G),
MII_PHY_END
};
+static const struct mii_phy_funcs e1000phy_funcs = {
+ e1000phy_service,
+ e1000phy_status,
+ e1000phy_reset
+};
+
static int
e1000phy_probe(device_t dev)
{
@@ -127,40 +128,25 @@ e1000phy_probe(device_t dev)
static int
e1000phy_attach(device_t dev)
{
- struct e1000phy_softc *esc;
struct mii_softc *sc;
- struct mii_attach_args *ma;
- struct mii_data *mii;
struct ifnet *ifp;
- esc = device_get_softc(dev);
- sc = &esc->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 = e1000phy_service;
- sc->mii_pdata = mii;
+ sc = device_get_softc(dev);
- sc->mii_flags |= MIIF_NOMANPAUSE;
+ mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &e1000phy_funcs, 0);
- esc->mii_model = MII_MODEL(ma->mii_id2);
ifp = sc->mii_pdata->mii_ifp;
if (strcmp(ifp->if_dname, "msk") == 0 &&
(sc->mii_flags & MIIF_MACPRIV0) != 0)
sc->mii_flags |= MIIF_PHYPRIV0;
- switch (esc->mii_model) {
- case MII_MODEL_MARVELL_E1011:
- case MII_MODEL_MARVELL_E1112:
+ switch (sc->mii_mpd_model) {
+ case MII_MODEL_xxMARVELL_E1011:
+ case MII_MODEL_xxMARVELL_E1112:
if (PHY_READ(sc, E1000_ESSR) & E1000_ESSR_FIBER_LINK)
sc->mii_flags |= MIIF_HAVEFIBER;
break;
- case MII_MODEL_MARVELL_E1149:
+ case MII_MODEL_xxMARVELL_E1149:
/*
* Some 88E1149 PHY's page select is initialized to
* point to other bank instead of copper/fiber bank
@@ -176,9 +162,9 @@ e1000phy_attach(device_t dev)
break;
}
- e1000phy_reset(sc);
+ PHY_RESET(sc);
- sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+ 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, " ");
@@ -192,15 +178,13 @@ e1000phy_attach(device_t dev)
static void
e1000phy_reset(struct mii_softc *sc)
{
- struct e1000phy_softc *esc;
uint16_t reg, page;
- esc = (struct e1000phy_softc *)sc;
reg = PHY_READ(sc, E1000_SCR);
if ((sc->mii_flags & MIIF_HAVEFIBER) != 0) {
reg &= ~E1000_SCR_AUTO_X_MODE;
PHY_WRITE(sc, E1000_SCR, reg);
- if (esc->mii_model == MII_MODEL_MARVELL_E1112) {
+ if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1112) {
/* Select 1000BASE-X only mode. */
page = PHY_READ(sc, E1000_EADR);
PHY_WRITE(sc, E1000_EADR, 2);
@@ -218,25 +202,25 @@ e1000phy_reset(struct mii_softc *sc)
PHY_WRITE(sc, E1000_EADR, page);
}
} else {
- switch (esc->mii_model) {
- case MII_MODEL_MARVELL_E1111:
- case MII_MODEL_MARVELL_E1112:
- case MII_MODEL_MARVELL_E1116:
- case MII_MODEL_MARVELL_E1118:
- case MII_MODEL_MARVELL_E1149:
- case MII_MODEL_MARVELL_PHYG65G:
+ switch (sc->mii_mpd_model) {
+ case MII_MODEL_xxMARVELL_E1111:
+ case MII_MODEL_xxMARVELL_E1112:
+ case MII_MODEL_xxMARVELL_E1116:
+ case MII_MODEL_xxMARVELL_E1118:
+ case MII_MODEL_xxMARVELL_E1149:
+ case MII_MODEL_xxMARVELL_PHYG65G:
/* Disable energy detect mode. */
reg &= ~E1000_SCR_EN_DETECT_MASK;
reg |= E1000_SCR_AUTO_X_MODE;
- if (esc->mii_model == MII_MODEL_MARVELL_E1116)
+ if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116)
reg &= ~E1000_SCR_POWER_DOWN;
reg |= E1000_SCR_ASSERT_CRS_ON_TX;
break;
- case MII_MODEL_MARVELL_E3082:
+ case MII_MODEL_xxMARVELL_E3082:
reg |= (E1000_SCR_AUTO_X_MODE >> 1);
reg |= E1000_SCR_ASSERT_CRS_ON_TX;
break;
- case MII_MODEL_MARVELL_E3016:
+ case MII_MODEL_xxMARVELL_E3016:
reg |= E1000_SCR_AUTO_MDIX;
reg &= ~(E1000_SCR_EN_DETECT |
E1000_SCR_SCRAMBLER_DISABLE);
@@ -249,14 +233,14 @@ e1000phy_reset(struct mii_softc *sc)
reg |= E1000_SCR_ASSERT_CRS_ON_TX;
break;
}
- if (esc->mii_model != MII_MODEL_MARVELL_E3016) {
+ if (sc->mii_mpd_model != MII_MODEL_xxMARVELL_E3016) {
/* Auto correction for reversed cable polarity. */
reg &= ~E1000_SCR_POLARITY_REVERSAL;
}
PHY_WRITE(sc, E1000_SCR, reg);
- if (esc->mii_model == MII_MODEL_MARVELL_E1116 ||
- esc->mii_model == MII_MODEL_MARVELL_E1149) {
+ if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116 ||
+ sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149) {
PHY_WRITE(sc, E1000_EADR, 2);
reg = PHY_READ(sc, E1000_SCR);
reg |= E1000_SCR_RGMII_POWER_UP;
@@ -265,12 +249,12 @@ e1000phy_reset(struct mii_softc *sc)
}
}
- switch (esc->mii_model) {
- case MII_MODEL_MARVELL_E3082:
- case MII_MODEL_MARVELL_E1112:
- case MII_MODEL_MARVELL_E1118:
+ switch (sc->mii_mpd_model) {
+ case MII_MODEL_xxMARVELL_E3082:
+ case MII_MODEL_xxMARVELL_E1112:
+ case MII_MODEL_xxMARVELL_E1118:
break;
- case MII_MODEL_MARVELL_E1116:
+ case MII_MODEL_xxMARVELL_E1116:
page = PHY_READ(sc, E1000_EADR);
/* Select page 3, LED control register. */
PHY_WRITE(sc, E1000_EADR, 3);
@@ -284,7 +268,7 @@ e1000phy_reset(struct mii_softc *sc)
E1000_BLINK_RATE(E1000_BLINK_84MS));
PHY_WRITE(sc, E1000_EADR, page);
break;
- case MII_MODEL_MARVELL_E3016:
+ case MII_MODEL_xxMARVELL_E3016:
/* LED2 -> ACT, LED1 -> LINK, LED0 -> SPEED. */
PHY_WRITE(sc, 0x16, 0x0B << 8 | 0x05 << 4 | 0x04);
/* Integrated register calibration workaround. */
@@ -309,7 +293,6 @@ static int
e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
{
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
- struct e1000phy_softc *esc = (struct e1000phy_softc *)sc;
uint16_t speed, gig;
int reg;
@@ -325,7 +308,7 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
break;
if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
- e1000phy_mii_phy_auto(esc, ife->ifm_media);
+ e1000phy_mii_phy_auto(sc, ife->ifm_media);
break;
}
@@ -412,13 +395,13 @@ done:
break;
sc->mii_ticks = 0;
- e1000phy_reset(sc);
- e1000phy_mii_phy_auto(esc, ife->ifm_media);
+ PHY_RESET(sc);
+ e1000phy_mii_phy_auto(sc, ife->ifm_media);
break;
}
/* Update the media status. */
- e1000phy_status(sc);
+ PHY_STATUS(sc);
/* Callback if something changed. */
mii_phy_update(sc, cmd);
@@ -489,12 +472,10 @@ e1000phy_status(struct mii_softc *sc)
}
static int
-e1000phy_mii_phy_auto(struct e1000phy_softc *esc, int media)
+e1000phy_mii_phy_auto(struct mii_softc *sc, int media)
{
- struct mii_softc *sc;
uint16_t reg;
- sc = &esc->mii_sc;
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
reg = PHY_READ(sc, E1000_AR);
reg &= ~(E1000_AR_PAUSE | E1000_AR_ASM_DIR);
OpenPOWER on IntegriCloud