diff options
author | Hante Meuleman <meuleman@broadcom.com> | 2012-09-11 15:18:46 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-09-12 14:19:14 -0400 |
commit | 90d03ff71b52ba1d9d53f18c07d89566ba0263b4 (patch) | |
tree | 14b40e240d4b393f5a67640543a862b0aaddaf9c /drivers | |
parent | 871fc09f1c8a9c0652afa7c673ae401fdb3f4aeb (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.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 8 |
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); | |||
103 | extern void brcmf_detach(struct device *dev); | 103 | extern 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 */ |
106 | extern void brcmf_txflowcontrol(struct device *dev, int ifidx, bool on); | 106 | extern void brcmf_txflowblock(struct device *dev, bool state); |
107 | 107 | ||
108 | /* Notify tx completion */ | 108 | /* Notify tx completion */ |
109 | extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, | 109 | extern 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 | ||
353 | void brcmf_txflowcontrol(struct device *dev, int ifidx, bool state) | 353 | void 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 | ||
368 | static int brcmf_host_event(struct brcmf_pub *drvr, int *ifidx, | 372 | static 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 |