STAGING: brcm80211 fix TX Queue overflow
authorGrant Grundler <grundler@google.com>
Wed, 9 Mar 2011 18:41:25 +0000 (10:41 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 9 Mar 2011 23:55:42 +0000 (15:55 -0800)
Increase QLEN to avoid TX Queue overflow.
iperf testing results in poor throughput and massive reporting of:
dhd_bus_txdata: out of bus->txq !!!

Also renamed QLEN/et al to reflect usage as TX queue parameters.
Tested with "dhd_doflow = true".

Signed-off-by: Venkat Rao <vrao@broadcom.com>
Signed-off-by: Grant Grundler <grundler@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmfmac/dhd_sdio.c

index b74b3c6..f25e5b3 100644 (file)
@@ -57,9 +57,9 @@
 #define DHDSDIO_MEM_DUMP_FNAME         "mem_dump"
 #endif
 
-#define QLEN           256     /* bulk rx and tx queue lengths */
-#define FCHI           (QLEN - 10)
-#define FCLOW          (FCHI / 2)
+#define TXQLEN         2048    /* bulk tx queue length */
+#define TXHI           (TXQLEN - 256)  /* turn on flow control above TXHI */
+#define TXLOW          (TXHI - 256)    /* turn off flow control below TXLOW */
 #define PRIOMASK       7
 
 #define TXRETRIES      2       /* # of retries for tx frames */
@@ -1119,7 +1119,7 @@ int dhd_bus_txdata(struct dhd_bus *bus, struct sk_buff *pkt)
                }
                dhd_os_sdunlock_txq(bus->dhd);
 
-               if ((pktq_len(&bus->txq) >= FCHI) && dhd_doflow)
+               if ((pktq_len(&bus->txq) >= TXHI) && dhd_doflow)
                        dhd_txflowcontrol(bus->dhd, 0, ON);
 
 #ifdef DHD_DEBUG
@@ -1218,7 +1218,7 @@ static uint dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes)
 
        /* Deflow-control stack if needed */
        if (dhd_doflow && dhd->up && (dhd->busstate == DHD_BUS_DATA) &&
-           dhd->txoff && (pktq_len(&bus->txq) < FCLOW))
+           dhd->txoff && (pktq_len(&bus->txq) < TXLOW))
                dhd_txflowcontrol(dhd, 0, OFF);
 
        return cnt;
@@ -5343,7 +5343,7 @@ dhdsdio_probe_attach(struct dhd_bus *bus, void *sdh, void *regsva, u16 devid)
        /* Set core control so an SDIO reset does a backplane reset */
        OR_REG(&bus->regs->corecontrol, CC_BPRESEN);
 
-       pktq_init(&bus->txq, (PRIOMASK + 1), QLEN);
+       pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
 
        /* Locate an appropriately-aligned portion of hdrbuf */
        bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0], DHD_SDALIGN);