void brcmf_txflowblock(struct device *dev, bool state) { struct brcmf_bus *bus_if = dev_get_drvdata(dev); struct brcmf_pub *drvr = bus_if->drvr; int i; brcmf_dbg(TRACE, "Enter\n"); for (i = 0; i < BRCMF_MAX_IFS; i++) brcmf_txflowblock_if(drvr->iflist[i], BRCMF_NETIF_STOP_REASON_BLOCK_BUS, state); }
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on) { struct net_device *ndev; brcmf_dbg(TRACE, "Enter, bsscfgidx=%d carrier=%d\n", ifp->bsscfgidx, on); ndev = ifp->ndev; brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on); if (on) { if (!netif_carrier_ok(ndev)) netif_carrier_on(ndev); } else { if (netif_carrier_ok(ndev)) netif_carrier_off(ndev); } }
static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid, bool blocked) { struct brcmf_flowring_ring *ring; struct brcmf_bus *bus_if; struct brcmf_pub *drvr; struct brcmf_if *ifp; bool currently_blocked; int i; u8 ifidx; unsigned long flags; spin_lock_irqsave(&flow->block_lock, flags); ring = flow->rings[flowid]; ifidx = brcmf_flowring_ifidx_get(flow, flowid); currently_blocked = false; for (i = 0; i < flow->nrofrings; i++) { if (flow->rings[i]) { ring = flow->rings[i]; if ((ring->status == RING_OPEN) && (brcmf_flowring_ifidx_get(flow, i) == ifidx)) { if (ring->blocked) { currently_blocked = true; break; } } } } ring->blocked = blocked; if (currently_blocked == blocked) { spin_unlock_irqrestore(&flow->block_lock, flags); return; } bus_if = dev_get_drvdata(flow->dev); drvr = bus_if->drvr; ifp = drvr->iflist[ifidx]; brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, blocked); spin_unlock_irqrestore(&flow->block_lock, flags); }