Date: Wed, 7 Jan 2004 11:32:23 -0800 (PST) From: Don Lewis <truckman@FreeBSD.org> To: current@FreeBSD.org Cc: re@FreeBSD.org Subject: Call for testers - dc ethernet driver patch Message-ID: <200401071932.i07JWN7E017376@gw.catspoiler.org>
next in thread | raw e-mail | index | archive | help
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 @@ -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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200401071932.i07JWN7E017376>