Call for testers - dc ethernet driver patch

From: Don Lewis <truckman_at_FreeBSD.org>
Date: Wed, 7 Jan 2004 11:32:23 -0800 (PST)
The dc driver has been broken ever since it was converted to use busdma.
The symptoms are that it reports spurious output errors and collisions,
even when running in full-duplex mode.  I believe the patch below fixes
the problem, but I do not have the appropriate hardware to test it.  I
have had one gotten one report so far from someone who claims this patch
fixed the problems he was seeing.  I'd appreciate further testing of
this patch, especially with as many of the chipsets supported by the
driver as possible so that I can commit this patch.  Please mention the
type of hardware you are using (machine architecture and card probe
message) in your reports. This is somewhat time critical because I've
had users express interest in getting this into 5.2.


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
_at__at_ -2859,7 +2859,7 _at__at_
 		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
_at__at_ -3262,6 +3262,7 _at__at_
 	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);
_at__at_ -3311,13 +3312,13 _at__at_
 	 * 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,
_at__at_ -3768,7 +3769,7 _at__at_
 		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
_at__at_ -486,6 +486,7 _at__at_
 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;
Received on Wed Jan 07 2004 - 10:32:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:36 UTC