mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
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:
parent
871fc09f1c
commit
90d03ff71b
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user