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>
This commit is contained in:
Hante Meuleman 2012-09-11 21:18:46 +02:00 committed by John W. Linville
parent 871fc09f1c
commit 90d03ff71b
3 changed files with 15 additions and 11 deletions

View File

@ -103,7 +103,7 @@ extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
extern void brcmf_detach(struct device *dev); extern void brcmf_detach(struct device *dev);
/* Indication from bus module to change flow-control state */ /* Indication from bus module to change flow-control state */
extern void brcmf_txflowcontrol(struct device *dev, int ifidx, bool on); extern void brcmf_txflowblock(struct device *dev, bool state);
/* Notify tx completion */ /* Notify tx completion */
extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,

View File

@ -350,19 +350,23 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
return 0; return 0;
} }
void brcmf_txflowcontrol(struct device *dev, int ifidx, bool state) void brcmf_txflowblock(struct device *dev, bool state)
{ {
struct net_device *ndev; struct net_device *ndev;
struct brcmf_bus *bus_if = dev_get_drvdata(dev); struct brcmf_bus *bus_if = dev_get_drvdata(dev);
struct brcmf_pub *drvr = bus_if->drvr; struct brcmf_pub *drvr = bus_if->drvr;
int i;
brcmf_dbg(TRACE, "Enter\n"); brcmf_dbg(TRACE, "Enter\n");
ndev = drvr->iflist[ifidx]->ndev; for (i = 0; i < BRCMF_MAX_IFS; i++)
if (state == ON) if (drvr->iflist[i]) {
netif_stop_queue(ndev); ndev = drvr->iflist[i]->ndev;
else if (state)
netif_wake_queue(ndev); netif_stop_queue(ndev);
else
netif_wake_queue(ndev);
}
} }
static int brcmf_host_event(struct brcmf_pub *drvr, int *ifidx, static int brcmf_host_event(struct brcmf_pub *drvr, int *ifidx,

View File

@ -2235,8 +2235,8 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes)
if (bus->sdiodev->bus_if->drvr_up && if (bus->sdiodev->bus_if->drvr_up &&
(bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) && (bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) &&
bus->txoff && (pktq_len(&bus->txq) < TXLOW)) { bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
bus->txoff = OFF; bus->txoff = false;
brcmf_txflowcontrol(bus->sdiodev->dev, 0, OFF); brcmf_txflowblock(bus->sdiodev->dev, false);
} }
return cnt; return cnt;
@ -2672,8 +2672,8 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
spin_unlock_bh(&bus->txqlock); spin_unlock_bh(&bus->txqlock);
if (pktq_len(&bus->txq) >= TXHI) { if (pktq_len(&bus->txq) >= TXHI) {
bus->txoff = ON; bus->txoff = true;
brcmf_txflowcontrol(bus->sdiodev->dev, 0, ON); brcmf_txflowblock(bus->sdiodev->dev, true);
} }
#ifdef DEBUG #ifdef DEBUG