svn commit: r329648 - stable/11/sys/arm/allwinner
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Tue Feb 20 18:12:08 UTC 2018
Author: gonzo
Date: Tue Feb 20 18:12:07 2018
New Revision: 329648
URL: https://svnweb.freebsd.org/changeset/base/329648
Log:
MFC r325410:
Increase TX_MAX_SEGS from 10 to 20 for the if_awg.c driver
Under certain traffic pattern awg driver does not recover from TX queue
full condition. The actual source of the problem is not identified yet
but jmcneill@ agreed that bumping TX_MAX_SEGS to 20 is OK as a workaround
for the problem (NetBSD has it set to 128).
Also add some diagnostic printfs to prevent silent failure of bus_dma
functions in the future
PR will be kept open until root cause of the issue is identified and fixed
PR: 219927
Submitted by: Tom Vijlbrief <tvijlbrief at gmail.com>
Approved by: jmcneill
Modified:
stable/11/sys/arm/allwinner/if_awg.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/arm/allwinner/if_awg.c
==============================================================================
--- stable/11/sys/arm/allwinner/if_awg.c Tue Feb 20 18:08:57 2018 (r329647)
+++ stable/11/sys/arm/allwinner/if_awg.c Tue Feb 20 18:12:07 2018 (r329648)
@@ -87,7 +87,7 @@ __FBSDID("$FreeBSD$");
#define TX_SKIP(n, o) (((n) + (o)) & (TX_DESC_COUNT - 1))
#define RX_NEXT(n) (((n) + 1) & (RX_DESC_COUNT - 1))
-#define TX_MAX_SEGS 10
+#define TX_MAX_SEGS 20
#define SOFT_RST_RETRY 1000
#define MII_BUSY_RETRY 1000
@@ -148,6 +148,7 @@ struct awg_softc {
struct resource *res[2];
struct mtx mtx;
if_t ifp;
+ device_t dev;
device_t miibus;
struct callout stat_ch;
struct task link_task;
@@ -375,14 +376,18 @@ awg_setup_txbuf(struct awg_softc *sc, int index, struc
sc->tx.buf_map[index].map, m, segs, &nsegs, BUS_DMA_NOWAIT);
if (error == EFBIG) {
m = m_collapse(m, M_NOWAIT, TX_MAX_SEGS);
- if (m == NULL)
+ if (m == NULL) {
+ device_printf(sc->dev, "awg_setup_txbuf: m_collapse failed\n");
return (0);
+ }
*mp = m;
error = bus_dmamap_load_mbuf_sg(sc->tx.buf_tag,
sc->tx.buf_map[index].map, m, segs, &nsegs, BUS_DMA_NOWAIT);
}
- if (error != 0)
+ if (error != 0) {
+ device_printf(sc->dev, "awg_setup_txbuf: bus_dmamap_load_mbuf_sg failed\n");
return (0);
+ }
bus_dmamap_sync(sc->tx.buf_tag, sc->tx.buf_map[index].map,
BUS_DMASYNC_PREWRITE);
@@ -1324,6 +1329,7 @@ awg_attach(device_t dev)
int error;
sc = device_get_softc(dev);
+ sc->dev = dev;
node = ofw_bus_get_node(dev);
if (bus_alloc_resources(dev, awg_spec, sc->res) != 0) {
More information about the svn-src-all
mailing list