aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2012-09-11 15:18:46 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-09-12 14:19:14 -0400
commit90d03ff71b52ba1d9d53f18c07d89566ba0263b4 (patch)
tree14b40e240d4b393f5a67640543a862b0aaddaf9c /drivers
parent871fc09f1c8a9c0652afa7c673ae401fdb3f4aeb (diff)
brcmfmac: Stop all net if queues on tx flow halt.
When tx flow is to be blocked due to host interface throttle then all net if queues should be stopped. Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c16
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c8
3 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index 537f499cc5d2..9b8ee19ea55d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -103,7 +103,7 @@ extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
103extern void brcmf_detach(struct device *dev); 103extern void brcmf_detach(struct device *dev);
104 104
105/* Indication from bus module to change flow-control state */ 105/* Indication from bus module to change flow-control state */
106extern void brcmf_txflowcontrol(struct device *dev, int ifidx, bool on); 106extern void brcmf_txflowblock(struct device *dev, bool state);
107 107
108/* Notify tx completion */ 108/* Notify tx completion */
109extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, 109extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index 7f9ba82a586a..b08f3474d8e7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -350,19 +350,23 @@ done:
350 return 0; 350 return 0;
351} 351}
352 352
353void brcmf_txflowcontrol(struct device *dev, int ifidx, bool state) 353void brcmf_txflowblock(struct device *dev, bool state)
354{ 354{
355 struct net_device *ndev; 355 struct net_device *ndev;
356 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 356 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
357 struct brcmf_pub *drvr = bus_if->drvr; 357 struct brcmf_pub *drvr = bus_if->drvr;
358 int i;
358 359
359 brcmf_dbg(TRACE, "Enter\n"); 360 brcmf_dbg(TRACE, "Enter\n");
360 361
361 ndev = drvr->iflist[ifidx]->ndev; 362 for (i = 0; i < BRCMF_MAX_IFS; i++)
362 if (state == ON) 363 if (drvr->iflist[i]) {
363 netif_stop_queue(ndev); 364 ndev = drvr->iflist[i]->ndev;
364 else 365 if (state)
365 netif_wake_queue(ndev); 366 netif_stop_queue(ndev);
367 else
368 netif_wake_queue(ndev);
369 }
366} 370}
367 371
368static int brcmf_host_event(struct brcmf_pub *drvr, int *ifidx, 372static int brcmf_host_event(struct brcmf_pub *drvr, int *ifidx,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 2dd6b48b8825..4580ff34c2d0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -2235,8 +2235,8 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes)
2235 if (bus->sdiodev->bus_if->drvr_up && 2235 if (bus->sdiodev->bus_if->drvr_up &&
2236 (bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) && 2236 (bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) &&
2237 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) { 2237 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
2238 bus->txoff = OFF; 2238 bus->txoff = false;
2239 brcmf_txflowcontrol(bus->sdiodev->dev, 0, OFF); 2239 brcmf_txflowblock(bus->sdiodev->dev, false);
2240 } 2240 }
2241 2241
2242 return cnt; 2242 return cnt;
@@ -2672,8 +2672,8 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
2672 spin_unlock_bh(&bus->txqlock); 2672 spin_unlock_bh(&bus->txqlock);
2673 2673
2674 if (pktq_len(&bus->txq) >= TXHI) { 2674 if (pktq_len(&bus->txq) >= TXHI) {
2675 bus->txoff = ON; 2675 bus->txoff = true;
2676 brcmf_txflowcontrol(bus->sdiodev->dev, 0, ON); 2676 brcmf_txflowblock(bus->sdiodev->dev, true);
2677 } 2677 }
2678 2678
2679#ifdef DEBUG 2679#ifdef DEBUG