These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / brcm80211 / brcmfmac / flowring.c
index eb13253..2ca783f 100644 (file)
@@ -194,11 +194,15 @@ static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid,
        spin_lock_irqsave(&flow->block_lock, flags);
 
        ring = flow->rings[flowid];
+       if (ring->blocked == blocked) {
+               spin_unlock_irqrestore(&flow->block_lock, flags);
+               return;
+       }
        ifidx = brcmf_flowring_ifidx_get(flow, flowid);
 
        currently_blocked = false;
        for (i = 0; i < flow->nrofrings; i++) {
-               if (flow->rings[i]) {
+               if ((flow->rings[i]) && (i != flowid)) {
                        ring = flow->rings[i];
                        if ((ring->status == RING_OPEN) &&
                            (brcmf_flowring_ifidx_get(flow, i) == ifidx)) {
@@ -209,15 +213,15 @@ static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid,
                        }
                }
        }
-       ring->blocked = blocked;
-       if (currently_blocked == blocked) {
+       flow->rings[flowid]->blocked = blocked;
+       if (currently_blocked) {
                spin_unlock_irqrestore(&flow->block_lock, flags);
                return;
        }
 
        bus_if = dev_get_drvdata(flow->dev);
        drvr = bus_if->drvr;
-       ifp = drvr->iflist[ifidx];
+       ifp = brcmf_get_ifp(drvr, ifidx);
        brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, blocked);
 
        spin_unlock_irqrestore(&flow->block_lock, flags);
@@ -249,8 +253,8 @@ void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid)
 }
 
 
-void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
-                           struct sk_buff *skb)
+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
+                          struct sk_buff *skb)
 {
        struct brcmf_flowring_ring *ring;
 
@@ -271,6 +275,7 @@ void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
                if (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)
                        brcmf_flowring_block(flow, flowid, false);
        }
+       return skb_queue_len(&ring->skblist);
 }