5.2-RC oerrs and collisions on dc0

Don Lewis truckman at FreeBSD.org
Mon Jan 5 13:39:48 PST 2004


On  5 Jan, Maxime Henrion wrote:
> Don Lewis wrote:

>> How about something like the following.  I can't test it because I don't
>> have the appropriate hardware, but at least it compiles ;-)

 [ snip ]
> Looks mostly good, but you missed some occurences of DC_TXCTL_FIRSTFRAG
> that need to be changed.

I only found one more, in dc_stop().

Index: sys/pci/if_dc.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_dc.c,v
retrieving revision 1.137
diff -u -r1.137 if_dc.c
--- sys/pci/if_dc.c	6 Dec 2003 02:29:31 -0000	1.137
+++ sys/pci/if_dc.c	5 Jan 2004 21:33:28 -0000
@@ -2859,7 +2859,7 @@
 		if (txstat & DC_TXSTAT_OWN)
 			break;
 
-		if (!(ctl & DC_TXCTL_FIRSTFRAG) || ctl & DC_TXCTL_SETUP) {
+		if (!(ctl & DC_TXCTL_LASTFRAG) || ctl & DC_TXCTL_SETUP) {
 			if (ctl & DC_TXCTL_SETUP) {
 				/*
 				 * Yes, the PNIC is so brain damaged
@@ -3262,6 +3262,7 @@
 	sc->dc_cdata.dc_tx_prod = frag;
 	sc->dc_cdata.dc_tx_cnt += nseg;
 	sc->dc_ldata->dc_tx_list[cur].dc_ctl |= htole32(DC_TXCTL_LASTFRAG);
+	sc->dc_cdata.dc_tx_chain[cur] = sc->dc_cdata.dc_tx_mapping;
 	if (sc->dc_flags & DC_TX_INTR_FIRSTFRAG)
 		sc->dc_ldata->dc_tx_list[first].dc_ctl |=
 		    htole32(DC_TXCTL_FINT);
@@ -3311,13 +3312,13 @@
 	 * of fragments or hit the end of the mbuf chain.
 	 */
 	idx = sc->dc_cdata.dc_tx_prod;
+	sc->dc_cdata.dc_tx_mapping = *m_head;
 	error = bus_dmamap_load_mbuf(sc->dc_mtag, sc->dc_cdata.dc_tx_map[idx],
 	    *m_head, dc_dma_map_txbuf, sc, 0);
 	if (error)
 		return (error);
 	if (sc->dc_cdata.dc_tx_err != 0)
 		return (sc->dc_cdata.dc_tx_err); 
-	sc->dc_cdata.dc_tx_chain[idx] = *m_head;
 	bus_dmamap_sync(sc->dc_mtag, sc->dc_cdata.dc_tx_map[idx],
 	    BUS_DMASYNC_PREWRITE);
 	bus_dmamap_sync(sc->dc_ltag, sc->dc_lmap,
@@ -3768,7 +3769,7 @@
 		if (cd->dc_tx_chain[i] != NULL) {
 			ctl = le32toh(ld->dc_tx_list[i].dc_ctl);
 			if ((ctl & DC_TXCTL_SETUP) ||
-			    !(ctl & DC_TXCTL_FIRSTFRAG)) {
+			    !(ctl & DC_TXCTL_LASTFRAG)) {
 				cd->dc_tx_chain[i] = NULL;
 				continue;
 			}
Index: sys/pci/if_dcreg.h
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_dcreg.h,v
retrieving revision 1.40
diff -u -r1.40 if_dcreg.h
--- sys/pci/if_dcreg.h	6 Dec 2003 02:29:31 -0000	1.40
+++ sys/pci/if_dcreg.h	5 Jan 2004 19:58:05 -0000
@@ -486,6 +486,7 @@
 struct dc_chain_data {
 	struct mbuf		*dc_rx_chain[DC_RX_LIST_CNT];
 	struct mbuf		*dc_tx_chain[DC_TX_LIST_CNT];
+	struct mbuf		*dc_tx_mapping;
 	bus_dmamap_t		dc_rx_map[DC_RX_LIST_CNT];
 	bus_dmamap_t		dc_tx_map[DC_TX_LIST_CNT];
 	u_int32_t		*dc_sbuf;



More information about the freebsd-current mailing list