Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Nov 2009 19:11:03 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r199916 - in stable/8/sys/dev: mii msk
Message-ID:  <200911291911.nATJB3k4005260@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Sun Nov 29 19:11:03 2009
New Revision: 199916
URL: http://svn.freebsd.org/changeset/base/199916

Log:
  MFC 197590.
    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.

Modified:
  stable/8/sys/dev/mii/e1000phy.c
  stable/8/sys/dev/mii/e1000phyreg.h
  stable/8/sys/dev/msk/if_msk.c
  stable/8/sys/dev/msk/if_mskreg.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/mii/e1000phy.c
==============================================================================
--- stable/8/sys/dev/mii/e1000phy.c	Sun Nov 29 19:07:38 2009	(r199915)
+++ stable/8/sys/dev/mii/e1000phy.c	Sun Nov 29 19:11:03 2009	(r199916)
@@ -59,6 +59,9 @@ __FBSDID("$FreeBSD$");
 #include "miidevs.h"
 
 #include <dev/mii/e1000phyreg.h>
+/* XXX */
+#include <machine/bus.h>
+#include <dev/msk/if_mskreg.h>
 
 #include "miibus_if.h"
 
@@ -68,6 +71,7 @@ static int	e1000phy_attach(device_t);
 struct e1000phy_softc {
 	struct mii_softc mii_sc;
 	int mii_model;
+	struct msk_mii_data *mmd;
 };
 
 static device_method_t e1000phy_methods[] = {
@@ -130,6 +134,7 @@ e1000phy_attach(device_t dev)
 	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;
@@ -145,6 +150,16 @@ e1000phy_attach(device_t dev)
 	mii->mii_instance++;
 
 	esc->mii_model = MII_MODEL(ma->mii_id2);
+	ifp = sc->mii_pdata->mii_ifp;
+	if (strcmp(ifp->if_dname, "msk") == 0) {
+		/* XXX */
+		esc->mmd = device_get_ivars(
+		    device_get_parent(device_get_parent(dev)));
+		if (esc->mmd != NULL &&
+		    (esc->mmd->mii_flags & MIIF_HAVEFIBER) != 0)
+			sc->mii_flags |= MIIF_HAVEFIBER;
+	}
+
 	switch (esc->mii_model) {
 	case MII_MODEL_MARVELL_E1011:
 	case MII_MODEL_MARVELL_E1112:
@@ -199,6 +214,13 @@ e1000phy_reset(struct mii_softc *sc)
 			reg &= ~E1000_SCR_MODE_MASK;
 			reg |= E1000_SCR_MODE_1000BX;
 			PHY_WRITE(sc, E1000_SCR, reg);
+			if (esc->mmd != NULL && esc->mmd->pmd == 'P') {
+				/* Set SIGDET polarity low for SFP module. */
+				PHY_WRITE(sc, E1000_EADR, 1);
+				reg = PHY_READ(sc, E1000_SCR);
+				reg |= E1000_SCR_FIB_SIGDET_POLARITY;
+				PHY_WRITE(sc, E1000_SCR, reg);
+			}
 			PHY_WRITE(sc, E1000_EADR, page);
 		}
 	} else {

Modified: stable/8/sys/dev/mii/e1000phyreg.h
==============================================================================
--- stable/8/sys/dev/mii/e1000phyreg.h	Sun Nov 29 19:07:38 2009	(r199915)
+++ stable/8/sys/dev/mii/e1000phyreg.h	Sun Nov 29 19:11:03 2009	(r199916)
@@ -248,6 +248,11 @@
 
 #define E1000_SCR_EN_DETECT_MASK	0x0300
 
+/* 88E1112 page 1 fiber specific control */
+#define E1000_SCR_FIB_TX_DIS		0x0008
+#define E1000_SCR_FIB_SIGDET_POLARITY	0x0200
+#define E1000_SCR_FIB_FORCE_LINK	0x0400
+
 /* 88E1112 page 2 */
 #define E1000_SCR_MODE_MASK		0x0380
 #define E1000_SCR_MODE_AUTO		0x0180

Modified: stable/8/sys/dev/msk/if_msk.c
==============================================================================
--- stable/8/sys/dev/msk/if_msk.c	Sun Nov 29 19:07:38 2009	(r199915)
+++ stable/8/sys/dev/msk/if_msk.c	Sun Nov 29 19:11:03 2009	(r199916)
@@ -1447,6 +1447,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];
 
@@ -1456,7 +1457,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;
@@ -1602,7 +1604,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;
@@ -1671,10 +1674,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) ==
@@ -1814,15 +1813,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);
@@ -1831,15 +1833,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);

Modified: stable/8/sys/dev/msk/if_mskreg.h
==============================================================================
--- stable/8/sys/dev/msk/if_mskreg.h	Sun Nov 29 19:07:38 2009	(r199915)
+++ stable/8/sys/dev/msk/if_mskreg.h	Sun Nov 29 19:11:03 2009	(r199916)
@@ -2404,6 +2404,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;
 
@@ -2467,7 +2473,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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911291911.nATJB3k4005260>