aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/msk
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2009-09-28 21:03:28 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2009-09-28 21:03:28 +0000
commitfcb62a8b01e857f1db61e54ed5caedd838f9764b (patch)
treedd58f27c1c39d788de3e84609f0ac3c360da8886 /sys/dev/msk
parent40d7192b1c9280e167296e85a00ea6eeea42abee (diff)
downloadsrc-fcb62a8b01e857f1db61e54ed5caedd838f9764b.tar.gz
src-fcb62a8b01e857f1db61e54ed5caedd838f9764b.zip
Add hack to pass controller specific information to phy driver.
Unlike most other PHYs there is no easy way to know which media type the PHY supports on Marvell PHYs. MIIF_HAVEFIBER flags is now passed via bus-specific instance variable of a device. While I'm here add 88E1112 specific work around to set SIGDET polarity low. Many thanks "Eugene Perevyazko <john <> dnepro dot net>" who kindly gave remote access to system with DGE-560SX.
Notes
Notes: svn path=/head/; revision=197590
Diffstat (limited to 'sys/dev/msk')
-rw-r--r--sys/dev/msk/if_msk.c33
-rw-r--r--sys/dev/msk/if_mskreg.h7
2 files changed, 25 insertions, 15 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c
index c6c5f200ee9f..6ce22c8322a3 100644
--- a/sys/dev/msk/if_msk.c
+++ b/sys/dev/msk/if_msk.c
@@ -1445,6 +1445,7 @@ msk_attach(device_t dev)
struct msk_softc *sc;
struct msk_if_softc *sc_if;
struct ifnet *ifp;
+ struct msk_mii_data *mmd;
int i, port, error;
uint8_t eaddr[6];
@@ -1454,7 +1455,8 @@ msk_attach(device_t dev)
error = 0;
sc_if = device_get_softc(dev);
sc = device_get_softc(device_get_parent(dev));
- port = *(int *)device_get_ivars(dev);
+ mmd = device_get_ivars(dev);
+ port = mmd->port;
sc_if->msk_if_dev = dev;
sc_if->msk_port = port;
@@ -1600,7 +1602,8 @@ static int
mskc_attach(device_t dev)
{
struct msk_softc *sc;
- int error, msic, msir, *port, reg;
+ struct msk_mii_data *mmd;
+ int error, msic, msir, reg;
sc = device_get_softc(dev);
sc->msk_dev = dev;
@@ -1669,10 +1672,6 @@ mskc_attach(device_t dev)
CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR);
sc->msk_pmd = CSR_READ_1(sc, B2_PMD_TYP);
- if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S')
- sc->msk_coppertype = 0;
- else
- sc->msk_coppertype = 1;
/* Check number of MACs. */
sc->msk_num_port = 1;
if ((CSR_READ_1(sc, B2_Y2_HW_RES) & CFG_DUAL_MAC_MSK) ==
@@ -1812,15 +1811,18 @@ mskc_attach(device_t dev)
error = ENXIO;
goto fail;
}
- port = malloc(sizeof(int), M_DEVBUF, M_WAITOK);
- if (port == NULL) {
+ mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO);
+ if (mmd == NULL) {
device_printf(dev, "failed to allocate memory for "
"ivars of PORT_A\n");
error = ENXIO;
goto fail;
}
- *port = MSK_PORT_A;
- device_set_ivars(sc->msk_devs[MSK_PORT_A], port);
+ mmd->port = MSK_PORT_A;
+ mmd->pmd = sc->msk_pmd;
+ if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P')
+ mmd->mii_flags |= MIIF_HAVEFIBER;
+ device_set_ivars(sc->msk_devs[MSK_PORT_A], mmd);
if (sc->msk_num_port > 1) {
sc->msk_devs[MSK_PORT_B] = device_add_child(dev, "msk", -1);
@@ -1829,15 +1831,18 @@ mskc_attach(device_t dev)
error = ENXIO;
goto fail;
}
- port = malloc(sizeof(int), M_DEVBUF, M_WAITOK);
- if (port == NULL) {
+ mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO);
+ if (mmd == NULL) {
device_printf(dev, "failed to allocate memory for "
"ivars of PORT_B\n");
error = ENXIO;
goto fail;
}
- *port = MSK_PORT_B;
- device_set_ivars(sc->msk_devs[MSK_PORT_B], port);
+ mmd->port = MSK_PORT_B;
+ mmd->pmd = sc->msk_pmd;
+ if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P')
+ mmd->mii_flags |= MIIF_HAVEFIBER;
+ device_set_ivars(sc->msk_devs[MSK_PORT_B], mmd);
}
error = bus_generic_attach(dev);
diff --git a/sys/dev/msk/if_mskreg.h b/sys/dev/msk/if_mskreg.h
index d345b60b9447..19b3bfba8b71 100644
--- a/sys/dev/msk/if_mskreg.h
+++ b/sys/dev/msk/if_mskreg.h
@@ -2403,6 +2403,12 @@ struct msk_ring_data {
#define MSK_TX_TIMEOUT 5
#define MSK_PUT_WM 10
+struct msk_mii_data {
+ int port;
+ uint32_t pmd;
+ int mii_flags;
+};
+
/* Forward decl. */
struct msk_if_softc;
@@ -2466,7 +2472,6 @@ struct msk_softc {
uint8_t msk_num_port;
int msk_ramsize; /* amount of SRAM on NIC */
uint32_t msk_pmd; /* physical media type */
- uint32_t msk_coppertype;
uint32_t msk_intrmask;
uint32_t msk_intrhwemask;
uint32_t msk_pflags;