summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/lxtphy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mii/lxtphy.c')
-rw-r--r--sys/dev/mii/lxtphy.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/sys/dev/mii/lxtphy.c b/sys/dev/mii/lxtphy.c
index 44b40ff..f223ec6 100644
--- a/sys/dev/mii/lxtphy.c
+++ b/sys/dev/mii/lxtphy.c
@@ -106,6 +106,7 @@ DRIVER_MODULE(lxtphy, miibus, lxtphy_driver, lxtphy_devclass, 0, 0);
static int lxtphy_service(struct mii_softc *, struct mii_data *, int);
static void lxtphy_status(struct mii_softc *);
+static void lxtphy_reset(struct mii_softc *);
static void lxtphy_set_tp(struct mii_softc *);
static void lxtphy_set_fx(struct mii_softc *);
@@ -114,6 +115,12 @@ static const struct mii_phydesc lxtphys[] = {
MII_PHY_END
};
+static const struct mii_phy_funcs lxtphy_funcs = {
+ lxtphy_service,
+ lxtphy_status,
+ lxtphy_reset
+};
+
static int
lxtphy_probe(device_t dev)
{
@@ -125,27 +132,17 @@ static int
lxtphy_attach(device_t dev)
{
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 = miibus_get_flags(dev);
- sc->mii_inst = mii->mii_instance++;
- sc->mii_phy = ma->mii_phyno;
- sc->mii_service = lxtphy_service;
- sc->mii_pdata = mii;
+ mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &lxtphy_funcs, 0);
- mii_phy_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;
device_printf(dev, " ");
-#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
+#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst),
MII_MEDIA_100_TX);
printf("100baseFX, ");
@@ -192,7 +189,7 @@ lxtphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
}
/* Update the media status. */
- lxtphy_status(sc);
+ PHY_STATUS(sc);
/* Callback if something changed. */
mii_phy_update(sc, cmd);
@@ -240,7 +237,8 @@ lxtphy_status(struct mii_softc *sc)
else
mii->mii_media_active |= IFM_10_T;
if (csr & CSR_DUPLEX)
- mii->mii_media_active |= IFM_FDX;
+ mii->mii_media_active |=
+ IFM_FDX | mii_phy_flowstatus(sc);
else
mii->mii_media_active |= IFM_HDX;
} else
@@ -248,6 +246,15 @@ lxtphy_status(struct mii_softc *sc)
}
static void
+lxtphy_reset(struct mii_softc *sc)
+{
+
+ mii_phy_reset(sc);
+ PHY_WRITE(sc, MII_LXTPHY_IER,
+ PHY_READ(sc, MII_LXTPHY_IER) & ~IER_INTEN);
+}
+
+static void
lxtphy_set_tp(struct mii_softc *sc)
{
int cfg;
OpenPOWER on IntegriCloud