PERFORCE change 109529 for review

Sam Leffler sam at FreeBSD.org
Wed Nov 8 17:17:26 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=109529

Change 109529 by sam at sam_ebb on 2006/11/08 17:15:37

	Rx fixups:
	o correct rx mac setup: must enable pause frame processing
	  when operating in full duplex
	o correctly handle failure to replenish a rx mbuf
	o eliminiate obfuscating defines used for default values
	  in mac setup
	o move tick callout startup below mac enable

Affected files ...

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

Differences ...

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

@@ -91,8 +91,8 @@
 	device_t	sc_mii;		/* child miibus */
 	bus_space_handle_t sc_miih;	/* MII register window */
 	struct ixpnpe_softc *sc_npe;	/* NPE support */
-	int		sc_portid;
-	int		debug;
+	int		sc_portid;	/* NPE port identification */
+	int		debug;		/* DPRINTF* control */
 	struct callout	tick_ch;	/* Tick callout */
 	struct npedma	txdma;
 	struct npebuf	*tx_free;	/* list of free tx buffers */
@@ -856,21 +856,16 @@
 
 			ifp->if_ipackets++;
 			ifp->if_input(ifp, mrx);
-
-			if (npe_rxbuf_init(sc, npe, m) != 0) {
-				/* XXX recover? */
-				continue;
-			}
 		} else {
+			/* discard frame and re-use mbuf */
 			m = npe->ix_m;
-			npe->ix_ne[0].len = htobe32(m->m_len << 16);
-			npe->ix_ne[0].next = 0;
-			/* XXX? sync? */
+		}
+		if (npe_rxbuf_init(sc, npe, m) == 0) {
+			/* return npe buf to rx free list */
+			ixpqmgr_qwrite(sc->rx_freeqid, npe->ix_neaddr);
+		} else {
+			/* XXX should not happen */
 		}
-		bus_dmamap_sync(dma->buf_tag, dma->buf_map,
-		    BUS_DMASYNC_PREWRITE);
-		/* return npe buf to rx free list */
-		ixpqmgr_qwrite(sc->rx_freeqid, npe->ix_neaddr);
 	}
 #undef P2V
 }
@@ -938,36 +933,32 @@
  	WR4(sc, NPE_MAC_TX_CNTRL1,
 	    RD4(sc, NPE_MAC_TX_CNTRL1) &~ NPE_TX_CNTRL1_TX_EN);
 
-	/* set clock for ixp4xx */
-	WR4(sc, NPE_MAC_INT_CLK_THRESH, NPE_MAC_INT_CLK_THRESH_DEFAULT);
-
 	/*
 	 * Set the MAC core registers.
 	 */
-	WR4(sc, NPE_MAC_TX_CNTRL2, NPE_TX_CNTRL2_RETRIES_MASK);
-	WR4(sc, NPE_MAC_RANDOM_SEED, NPE_RANDOM_SEED_DEFAULT);
-	WR4(sc, NPE_MAC_THRESH_P_EMPTY, NPE_MAC_THRESH_P_EMPTY_DEFAULT);
-	WR4(sc, NPE_MAC_THRESH_P_FULL, NPE_MAC_THRESH_P_FULL_DEFAULT);
-	WR4(sc, NPE_MAC_TX_DEFER, NPE_MAC_TX_DEFER_DEFAULT);
-	WR4(sc, NPE_MAC_TX_TWO_DEFER_1, NPE_MAC_TX_TWO_DEFER_1_DEFAULT);
-	WR4(sc, NPE_MAC_TX_TWO_DEFER_2, NPE_MAC_TX_TWO_DEFER_2_DEFAULT);
-	WR4(sc, NPE_MAC_SLOT_TIME, NPE_MAC_SLOT_TIME_DEFAULT);
-	WR4(sc, NPE_MAC_INT_CLK_THRESH, NPE_MAC_INT_CLK_THRESH_DEFAULT);
-	WR4(sc, NPE_MAC_BUF_SIZE_TX, NPE_MAC_BUF_SIZE_TX_DEFAULT);
-	/* NB: enables padding and FCS append */
-#if 0
-	WR4(sc, NPE_MAC_TX_CNTRL1, NPE_TX_CNTRL1_DEFAULT);
-	WR4(sc, NPE_MAC_RX_CNTRL1, NPE_RX_CNTRL1_DEFAULT);
-#else
-	/* XXX full duplex */
+	WR4(sc, NPE_MAC_INT_CLK_THRESH, 0x1);	/* clock ratio: for ipx4xx */
+	WR4(sc, NPE_MAC_TX_CNTRL2,	0xf);	/* max retries */
+	WR4(sc, NPE_MAC_RANDOM_SEED,	0x8);	/* LFSR back-off seed */
+	/* thresholds determined by NPE firmware FS */
+	WR4(sc, NPE_MAC_THRESH_P_EMPTY,	0x12);
+	WR4(sc, NPE_MAC_THRESH_P_FULL,	0x30);
+	WR4(sc, NPE_MAC_BUF_SIZE_TX,	0x8);	/* tx fifo threshold (bytes) */
+	WR4(sc, NPE_MAC_TX_DEFER,	0x15);	/* for single deferral */
+	WR4(sc, NPE_MAC_RX_DEFER,	0x16);	/* deferral on inter-frame gap*/
+	WR4(sc, NPE_MAC_TX_TWO_DEFER_1,	0x8);	/* for 2-part deferral */
+	WR4(sc, NPE_MAC_TX_TWO_DEFER_2,	0x7);	/* for 2-part deferral */
+	WR4(sc, NPE_MAC_SLOT_TIME,	0x80);	/* assumes MII mode */
+
 	WR4(sc, NPE_MAC_TX_CNTRL1,
-	     (NPE_TX_CNTRL1_DEFAULT &~ NPE_TX_CNTRL1_TX_EN)
-	    | NPE_TX_CNTRL1_DUPLEX);
+		  NPE_TX_CNTRL1_RETRY		/* retry failed xmits */
+		| NPE_TX_CNTRL1_FCS_EN		/* append FCS */
+		| NPE_TX_CNTRL1_2DEFER		/* 2-part deferal */
+		| NPE_TX_CNTRL1_PAD_EN);	/* pad runt frames */
+	/* XXX pad strip? */
 	WR4(sc, NPE_MAC_RX_CNTRL1,
-	     (NPE_RX_CNTRL1_DEFAULT &~ NPE_RX_CNTRL1_RX_EN)
-	    | NPE_RX_CNTRL1_PAUSE_EN);
-#endif
-	/* XXX RC_CNTRL2? */
+		  NPE_RX_CNTRL1_CRC_EN		/* include CRC/FCS */
+		| NPE_RX_CNTRL1_PAUSE_EN);	/* ena pause frame handling */
+	WR4(sc, NPE_MAC_RX_CNTRL2, 0);
 
 	npe_setmac(sc, IF_LLADDR(ifp));
 	npe_setmcast(sc);
@@ -975,21 +966,17 @@
 	npe_startxmit(sc);
 	npe_startrecv(sc);
 
-	/*
-	 * Set 'running' flag, and clear output active flag
-	 * and attempt to start the output
-	 */
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 	ifp->if_timer = 0;		/* just in case */
 
-	callout_reset(&sc->tick_ch, hz, npe_tick, sc);
-
 	/* enable transmitter and reciver in the MAC */
  	WR4(sc, NPE_MAC_RX_CNTRL1,
 	    RD4(sc, NPE_MAC_RX_CNTRL1) | NPE_RX_CNTRL1_RX_EN);
  	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);
 }
 
 static void


More information about the p4-projects mailing list