summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-04-29 14:09:10 +0000
committerphk <phk@FreeBSD.org>2002-04-29 14:09:10 +0000
commitcb257785b2a32f6e52693af129eaf0adb5921d40 (patch)
tree7c7882efabdcfc55f525359c8bb0d069ecf84930 /sys/dev
parent623b9c8449c71dee51ac80bd8c451872724d4f4e (diff)
downloadFreeBSD-src-cb257785b2a32f6e52693af129eaf0adb5921d40.zip
FreeBSD-src-cb257785b2a32f6e52693af129eaf0adb5921d40.tar.gz
Introduce NetBSD's mii_phy_match() API and use it in the nsgphy to
get a description printed.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/mii/mii_physubr.c12
-rw-r--r--sys/dev/mii/miivar.h11
-rw-r--r--sys/dev/mii/nsgphy.c32
3 files changed, 45 insertions, 10 deletions
diff --git a/sys/dev/mii/mii_physubr.c b/sys/dev/mii/mii_physubr.c
index 34f50dd..07ea088 100644
--- a/sys/dev/mii/mii_physubr.c
+++ b/sys/dev/mii/mii_physubr.c
@@ -593,3 +593,15 @@ mii_phy_detach(device_t dev)
return(0);
}
+
+const struct mii_phydesc *
+mii_phy_match(const struct mii_attach_args *ma, const struct mii_phydesc *mpd)
+{
+
+ for (; mpd->mpd_name != NULL; mpd++) {
+ if (MII_OUI(ma->mii_id1, ma->mii_id2) == mpd->mpd_oui &&
+ MII_MODEL(ma->mii_id2) == mpd->mpd_model)
+ return (mpd);
+ }
+ return (NULL);
+}
diff --git a/sys/dev/mii/miivar.h b/sys/dev/mii/miivar.h
index 73a57eb..cb56fd5 100644
--- a/sys/dev/mii/miivar.h
+++ b/sys/dev/mii/miivar.h
@@ -156,6 +156,15 @@ struct mii_attach_args {
typedef struct mii_attach_args mii_attach_args_t;
/*
+ * Used to match a PHY.
+ */
+struct mii_phydesc {
+ u_int32_t mpd_oui; /* the PHY's OUI */
+ u_int32_t mpd_model; /* the PHY's model */
+ const char *mpd_name; /* the PHY's name */
+};
+
+/*
* An array of these structures map MII media types to BMCR/ANAR settings.
*/
struct mii_media {
@@ -210,6 +219,8 @@ void mii_phy_setmedia(struct mii_softc *sc);
void mii_phy_update(struct mii_softc *, int);
int mii_phy_tick(struct mii_softc *);
+const struct mii_phydesc * mii_phy_match(const struct mii_attach_args *ma, const struct mii_phydesc *mpd);
+
void ukphy_status(struct mii_softc *);
#endif /* _KERNEL */
diff --git a/sys/dev/mii/nsgphy.c b/sys/dev/mii/nsgphy.c
index 16072a5..f4fa53f 100644
--- a/sys/dev/mii/nsgphy.c
+++ b/sys/dev/mii/nsgphy.c
@@ -98,28 +98,35 @@ static driver_t nsgphy_driver = {
sizeof(struct mii_softc)
};
+
DRIVER_MODULE(nsgphy, miibus, nsgphy_driver, nsgphy_devclass, 0, 0);
static int nsgphy_service(struct mii_softc *, struct mii_data *,int);
static void nsgphy_status(struct mii_softc *);
extern void mii_phy_auto_timeout(void *);
+const struct mii_phydesc gphyters[] = {
+ { MII_OUI_NATSEMI, MII_MODEL_NATSEMI_DP83861,
+ MII_STR_NATSEMI_DP83861 },
+
+ { MII_OUI_NATSEMI, MII_MODEL_NATSEMI_DP83891,
+ MII_STR_NATSEMI_DP83891 },
+
+ { 0, 0,
+ NULL },
+};
+
static int
nsgphy_probe(device_t dev)
{
struct mii_attach_args *ma;
+ const struct mii_phydesc *mpd;
ma = device_get_ivars(dev);
-
- if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_NATSEMI) {
- if (MII_MODEL(ma->mii_id2) == MII_MODEL_NATSEMI_DP83891) {
- device_set_desc(dev, MII_STR_NATSEMI_DP83891);
- return(0);
- }
- if (MII_MODEL(ma->mii_id2) == MII_MODEL_NATSEMI_DP83861) {
- device_set_desc(dev, MII_STR_NATSEMI_DP83861);
- return(0);
- }
+ mpd = mii_phy_match(ma, gphyters);
+ if (mpd != NULL) {
+ device_set_desc(dev, mpd->mpd_name);
+ return(0);
}
return(ENXIO);
@@ -131,9 +138,14 @@ nsgphy_attach(device_t dev)
struct mii_softc *sc;
struct mii_attach_args *ma;
struct mii_data *mii;
+ const struct mii_phydesc *mpd;
sc = device_get_softc(dev);
ma = device_get_ivars(dev);
+ mpd = mii_phy_match(ma, gphyters);
+ if (bootverbose)
+ device_printf(dev, "<rev. %d>\n", MII_REV(ma->mii_id2));
+ device_printf(dev, " ");
sc->mii_dev = device_get_parent(dev);
mii = device_get_softc(sc->mii_dev);
LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
OpenPOWER on IntegriCloud