Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Nov 2006 18:44:25 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 109539 for review
Message-ID:  <200611081844.kA8IiPqF042524@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=109539

Change 109539 by sam@sam_ebb on 2006/11/08 18:44:03

	Misc cleanups:
	o add mii statchng method so we can force full/half duplex
	  mac state on mii change
	o call mii_tick from npe_tick to poll for mii state changes
	o add hw.npe mib tree
	o add hw.npe.tickinterval knob for controlling the frequency
	  of npe_tick; change the default from 1 sec to 3 secs
	o move debug mib knobs from debug to hw.npe
	o parameterize the # tx/rx buffers; knobs are under hw.npe
	o add carrier sense errors back into oerrors now that we have
	  full duplex done right
	o remove miscounting of carrier sense errors as
	  mibdata.dot3StatsSQETestErrors

Affected files ...

.. //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#17 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#17 (text+ko) ====

@@ -68,9 +68,6 @@
 
 #include "miibus_if.h"
 
-#define NPE_MAX_TX_BUFFERS 64
-#define NPE_MAX_RX_BUFFERS 128
-
 struct npedma {
 	const char*	name;
 	int		nbuf;		/* # npebuf's allocated */
@@ -92,7 +89,8 @@
 	bus_space_handle_t sc_miih;	/* MII register window */
 	struct ixpnpe_softc *sc_npe;	/* NPE support */
 	int		sc_portid;	/* NPE port identification */
-	int		debug;		/* DPRINTF* control */
+	int		sc_debug;	/* DPRINTF* control */
+	int		sc_tickinterval;
 	struct callout	tick_ch;	/* Tick callout */
 	struct npedma	txdma;
 	struct npebuf	*tx_free;	/* list of free tx buffers */
@@ -204,17 +202,32 @@
 static int tx_doneqid = -1;
 static int rx_qid = -1;
 
+SYSCTL_NODE(_hw, OID_AUTO, npe, CTLFLAG_RD, 0, "IXP425 NPE driver parameters");
+
 static int npe_debug = 0;
-SYSCTL_INT(_debug, OID_AUTO, npe, CTLFLAG_RW, &npe_debug,
+SYSCTL_INT(_hw_npe, OID_AUTO, debug, CTLFLAG_RW, &npe_debug,
 	   0, "IXP425 NPE network interface debug msgs");
-TUNABLE_INT("debug.npe", &npe_debug);
+TUNABLE_INT("hw.npe.npe", &npe_debug);
 #define	DPRINTF(sc, fmt, ...) do {					\
-	if (sc->debug) device_printf(sc->sc_dev, fmt, __VA_ARGS__);	\
+	if (sc->sc_debug) device_printf(sc->sc_dev, fmt, __VA_ARGS__);	\
 } while (0)
 #define	DPRINTFn(n, sc, fmt, ...) do {					\
-	if (sc->debug >= n) device_printf(sc->sc_dev, fmt, __VA_ARGS__);\
+	if (sc->sc_debug >= n) device_printf(sc->sc_dev, fmt, __VA_ARGS__);\
 } while (0)
+static int npe_tickinterval = 3;		/* npe_tick frequency (secs) */
+SYSCTL_INT(_hw_npe, OID_AUTO, tickinterval, CTLFLAG_RD, &npe_tickinterval,
+	    0, "periodic work interval (secs)");
+TUNABLE_INT("hw.npe.tickinterval", &npe_tickinterval);
 
+static	int npe_rxbuf = 64;		/* # rx buffers to allocate */
+SYSCTL_INT(_hw_npe, OID_AUTO, rxbuf, CTLFLAG_RD, &npe_rxbuf,
+	    0, "rx buffers allocated");
+TUNABLE_INT("hw.npe.rxbuf", &npe_rxbuf);
+static	int npe_txbuf = 128;		/* # tx buffers to allocate */
+SYSCTL_INT(_hw_npe, OID_AUTO, txbuf, CTLFLAG_RD, &npe_txbuf,
+	    0, "tx buffers allocated");
+TUNABLE_INT("hw.npe.txbuf", &npe_txbuf);
+
 static int
 npe_probe(device_t dev)
 {
@@ -236,6 +249,8 @@
 {
 	struct npe_softc *sc = device_get_softc(dev);
 	struct ixp425_softc *sa = device_get_softc(device_get_parent(dev));
+	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
+	struct sysctl_oid *tree = device_get_sysctl_tree(dev);
 	struct ifnet *ifp = NULL;
 	int error;
 	u_char eaddr[6];
@@ -244,7 +259,8 @@
 	sc->sc_iot = sa->sc_iot;
 	NPE_LOCK_INIT(sc);
 	callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0);
-	sc->debug = npe_debug;
+	sc->sc_debug = npe_debug;
+	sc->sc_tickinterval = npe_tickinterval;
 
 	sc->sc_npe = ixpnpe_attach(dev);
 	if (sc->sc_npe == NULL) {
@@ -274,7 +290,6 @@
 	ifp->if_ioctl = npeioctl;
 	ifp->if_watchdog = npewatchdog;
 	ifp->if_init = npeinit;
-	ifp->if_baudrate = 100*1000*1000;	/* XXX */
 	IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
 	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
 	IFQ_SET_READY(&ifp->if_snd);
@@ -283,9 +298,10 @@
 	ifp->if_linkmiblen = sizeof(sc->mibdata);
 	sc->mibdata.dot3Compliance = DOT3COMPLIANCE_STATS;
 
-	SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->sc_dev),
-	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)), OID_AUTO,
-	    "debug", CTLFLAG_RW, &sc->debug, 0, "control debugging printfs");
+	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "debug",
+	    CTLFLAG_RW, &sc->sc_debug, 0, "control debugging printfs");
+	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tickinterval",
+	    CTLFLAG_RW, &sc->sc_tickinterval, 0, "periodic work frequency");
 
 	ether_ifattach(ifp, eaddr);
 	return 0;
@@ -508,11 +524,10 @@
 		}
 	} else
 		sc->sc_miih = sc->sc_ioh;
-	error = npe_dma_setup(sc, &sc->txdma, "tx", NPE_MAX_TX_BUFFERS,
-			NPE_MAXSEG);
+	error = npe_dma_setup(sc, &sc->txdma, "tx", npe_txbuf, NPE_MAXSEG);
 	if (error != 0)
 		return error;
-	error = npe_dma_setup(sc, &sc->rxdma, "rx", NPE_MAX_RX_BUFFERS, 1);
+	error = npe_dma_setup(sc, &sc->rxdma, "rx", npe_rxbuf, 1);
 	if (error != 0)
 		return error;
 
@@ -563,22 +578,20 @@
 	sc->rx_qid = npeconfig[unit].rx_qid;
 	sc->rx_freeqid = npeconfig[unit].rx_freeqid;
 	if (rx_qid == -1) {
-		ixpqmgr_qconfig(sc->rx_qid, NPE_MAX_RX_BUFFERS, 0,  1,
+		ixpqmgr_qconfig(sc->rx_qid, npe_rxbuf, 0,  1,
 			IX_QMGR_Q_SOURCE_ID_NOT_E, npe_rxdone, sc);
 		rx_qid = sc->rx_qid;
 	}
-	ixpqmgr_qconfig(sc->rx_freeqid,	NPE_MAX_RX_BUFFERS, 0,
-		NPE_MAX_RX_BUFFERS/2, 0, NULL, sc);
+	ixpqmgr_qconfig(sc->rx_freeqid,	npe_rxbuf, 0, npe_rxbuf/2, 0, NULL, sc);
 	/* tell the NPE to direct all traffic to rx_qid */
 	for (i = 0; i < 8; i++)
 		npe_setrxqosentry(sc, i, 0, sc->rx_qid);
 
 	sc->tx_qid = npeconfig[unit].tx_qid;
 	sc->tx_doneqid = npeconfig[unit].tx_doneqid;
-	ixpqmgr_qconfig(sc->tx_qid, NPE_MAX_TX_BUFFERS, 0,
-		NPE_MAX_TX_BUFFERS, 0, NULL, sc);
+	ixpqmgr_qconfig(sc->tx_qid, npe_txbuf, 0, npe_txbuf, 0, NULL, sc);
 	if (tx_doneqid == -1) {
-		ixpqmgr_qconfig(sc->tx_doneqid,	NPE_MAX_TX_BUFFERS, 0,  2,
+		ixpqmgr_qconfig(sc->tx_doneqid,	npe_txbuf, 0,  2,
 			IX_QMGR_Q_SOURCE_ID_NOT_E, npe_txdone, sc);
 		tx_doneqid = sc->tx_doneqid;
 	}
@@ -661,9 +674,6 @@
 	MIBADD(dot3StatsFCSErrors);
 	MIBADD(dot3StatsSingleCollisionFrames);
 	MIBADD(dot3StatsMultipleCollisionFrames);
-	/* XXX? */
-	sc->mibdata.dot3StatsSQETestErrors +=
-	    be32toh(ns->dot3StatsCarrierSenseErrors);
 	MIBADD(dot3StatsDeferredTransmissions);
 	MIBADD(dot3StatsLateCollisions);
 	MIBADD(dot3StatsExcessiveCollisions);
@@ -679,6 +689,7 @@
 
 	ifp->if_oerrors +=
 		  be32toh(ns->dot3StatsInternalMacTransmitErrors)
+		+ be32toh(ns->dot3StatsCarrierSenseErrors)
 		+ be32toh(ns->TxVLANIdFilterDiscards)
 		;
 	ifp->if_ierrors += be32toh(ns->dot3StatsFCSErrors)
@@ -698,6 +709,7 @@
 {
 #define	ACK	(NPE_RESETSTATS << NPE_MAC_MSGID_SHL)
 	struct npe_softc *sc = xsc;
+	struct mii_data *mii = device_get_softc(sc->sc_mii);
 	uint32_t msg[2];
 
 	NPE_ASSERT_LOCKED(sc);
@@ -708,8 +720,10 @@
 		npe_addstats(sc);
 	}
 	npe_updatestats(sc);
+	mii_tick(mii);
+
 	/* schedule next poll */
-	callout_reset(&sc->tick_ch, hz, npe_tick, sc);
+	callout_reset(&sc->tick_ch, sc->sc_tickinterval * hz, npe_tick, sc);
 #undef ACK
 }
 
@@ -976,7 +990,7 @@
  	WR4(sc, NPE_MAC_TX_CNTRL1,
 	    RD4(sc, NPE_MAC_TX_CNTRL1) | NPE_TX_CNTRL1_TX_EN);
 
-	callout_reset(&sc->tick_ch, hz, npe_tick, sc);
+	callout_reset(&sc->tick_ch, sc->sc_tickinterval * hz, npe_tick, sc);
 }
 
 static void
@@ -1456,6 +1470,27 @@
 	(void) npe_mii_mdio_wait(sc);
 }
 
+static void
+npe_miibus_statchg(device_t dev)
+{
+	struct npe_softc *sc = device_get_softc(dev);
+	struct mii_data *mii = device_get_softc(sc->sc_mii);
+	uint32_t tx1, rx1;
+
+	/* sync MAC duplex state */
+	tx1 = RD4(sc, NPE_MAC_TX_CNTRL1);
+	rx1 = RD4(sc, NPE_MAC_RX_CNTRL1);
+	if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
+		tx1 &= ~NPE_TX_CNTRL1_DUPLEX;
+		rx1 |= NPE_RX_CNTRL1_PAUSE_EN;
+	} else {
+		tx1 |= NPE_TX_CNTRL1_DUPLEX;
+		rx1 &= ~NPE_RX_CNTRL1_PAUSE_EN;
+	}
+	WR4(sc, NPE_MAC_RX_CNTRL1, rx1);
+	WR4(sc, NPE_MAC_TX_CNTRL1, tx1);
+}
+
 static device_method_t npe_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		npe_probe),
@@ -1468,6 +1503,7 @@
 	/* MII interface */
 	DEVMETHOD(miibus_readreg,	npe_miibus_readreg),
 	DEVMETHOD(miibus_writereg,	npe_miibus_writereg),
+	DEVMETHOD(miibus_statchg,	npe_miibus_statchg),
 
 	{ 0, 0 }
 };



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