summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>1999-08-29 15:42:04 +0000
committerwpaul <wpaul@FreeBSD.org>1999-08-29 15:42:04 +0000
commitc880bbe674ca198bf53958c6ebe7d79cfc36b1f7 (patch)
treed46d4d7bdda0eea175090600568da2c323261d92 /sys/dev/mii
parente343cf19611a68f1f961aaa5030fbc86e632d250 (diff)
downloadFreeBSD-src-c880bbe674ca198bf53958c6ebe7d79cfc36b1f7.zip
FreeBSD-src-c880bbe674ca198bf53958c6ebe7d79cfc36b1f7.tar.gz
The ASIC on the 3c905C appears to be manufactured by Broadcom (previous
ones were made by Lucent). The Broadcom chip also appears to use an internal PHY made by Broadcom which uses the Broadcom OUI. This is different from previous ASICs which always returned 0 in the PHY ID registers. To account for this, I added the necessary ID values for the Broadcom PHY so that it can be detected and attached using the 3Com PHY driver instead of defaulting to the generic one.
Diffstat (limited to 'sys/dev/mii')
-rw-r--r--sys/dev/mii/exphy.c13
-rw-r--r--sys/dev/mii/mii.c7
-rw-r--r--sys/dev/mii/miidevs6
3 files changed, 19 insertions, 7 deletions
diff --git a/sys/dev/mii/exphy.c b/sys/dev/mii/exphy.c
index 9284c7a..ddf7d82 100644
--- a/sys/dev/mii/exphy.c
+++ b/sys/dev/mii/exphy.c
@@ -89,7 +89,7 @@
#if !defined(lint)
static const char rcsid[] =
- "$FreeBSD$";
+ "$Id: exphy.c,v 1.1 1999/08/21 17:40:41 wpaul Exp $";
#endif
static int exphy_probe __P((device_t));
@@ -130,8 +130,10 @@ static int exphy_probe(dev)
/*
* Argh, 3Com PHY reports oui == 0 model == 0!
*/
- if (MII_OUI(ma->mii_id1, ma->mii_id2) != 0 ||
- MII_MODEL(ma->mii_id2) != 0)
+ if ((MII_OUI(ma->mii_id1, ma->mii_id2) != 0 ||
+ MII_MODEL(ma->mii_id2) != 0) &&
+ (MII_OUI(ma->mii_id1, ma->mii_id2) != MII_OUI_BROADCOM ||
+ MII_MODEL(ma->mii_id2) != MII_MODEL_BROADCOM_3c905Cphy))
return (ENXIO);
/*
@@ -140,7 +142,10 @@ static int exphy_probe(dev)
if (strcmp(device_get_name(parent), "xl") != 0)
return (ENXIO);
- device_set_desc(dev, "3Com internal media interface");
+ if (MII_OUI(ma->mii_id1, ma->mii_id2) == 0)
+ device_set_desc(dev, "3Com internal media interface");
+ else
+ device_set_desc(dev, MII_STR_BROADCOM_3c905Cphy);
return (0);
}
diff --git a/sys/dev/mii/mii.c b/sys/dev/mii/mii.c
index e64488f..b10e57a 100644
--- a/sys/dev/mii/mii.c
+++ b/sys/dev/mii/mii.c
@@ -60,7 +60,7 @@
#if !defined(lint)
static const char rcsid[] =
- "$FreeBSD$";
+ "$Id: mii.c,v 1.1 1999/08/21 17:40:41 wpaul Exp $";
#endif
static int miibus_readreg __P((device_t, int, int));
@@ -106,7 +106,7 @@ int miibus_probe(dev)
{
struct mii_attach_args ma, *args;
struct mii_data *mii;
- device_t child = 0, parent;
+ device_t child = NULL, parent;
int bmsr, capmask = 0xFFFFFFFF;
mii = device_get_softc(dev);
@@ -222,6 +222,9 @@ static void miibus_mediainit(dev)
struct ifmedia_entry *m;
int media = 0;
+ /* Poke the parent in case it has any media of its own to add. */
+ MIIBUS_MEDIAINIT(device_get_parent(dev));
+
mii = device_get_softc(dev);
for (m = LIST_FIRST(&mii->mii_media.ifm_list); m != NULL;
m = LIST_NEXT(m, ifm_list)) {
diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs
index ed86e43..22a912c 100644
--- a/sys/dev/mii/miidevs
+++ b/sys/dev/mii/miidevs
@@ -1,4 +1,4 @@
-$FreeBSD$
+$Id: miidevs,v 1.1 1999/08/21 17:40:43 wpaul Exp $
/*$NetBSD: miidevs,v 1.6 1999/05/14 11:37:30 drochner Exp $*/
/*-
@@ -50,6 +50,7 @@ $FreeBSD$
*/
oui AMD 0x00001a Advanced Micro Devices
+oui BROADCOM 0x001018 Broadcom Corporation
oui DAVICOM 0x00606e Davicom Semiconductor
oui ICS 0x00a0be Integrated Circuit Systems
oui INTEL 0x00aa00 Intel
@@ -87,6 +88,9 @@ oui xxDAVICOM 0x006040 Davicom Semiconductor
model xxAMD 79C873 0x0000 Am79C873 10/100 media interface
model AMD 79c973phy 0x0036 Am79c973 internal PHY
+/* Broadcom Corp. PHYs. */
+model BROADCOM 3c905Cphy 0x0017 3c905C 10/100 internal PHY
+
/* Davicom Semiconductor PHYs */
model xxDAVICOM DM9101 0x0000 DM9101 10/100 media interface
OpenPOWER on IntegriCloud