brcmfmac: rework credit pickup to assure consistent handling
authorArend van Spriel <arend@broadcom.com>
Thu, 6 Jun 2013 11:17:49 +0000 (13:17 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 12 Jun 2013 19:02:17 +0000 (15:02 -0400)
Reworked brcmf_skb_pick_up_credit() so it can be used for both
fcmode flavours in the same way.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c

index c1930ef5c55f8435efb7195fda19a60fb5185023..a7a02473e7e991f172ceaa5c40e5158b593efa56 100644 (file)
@@ -1040,24 +1040,21 @@ static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws)
                queue_work(fws->fws_wq, &fws->fws_dequeue_work);
 }
 
-static void brcmf_skb_pick_up_credit(struct brcmf_fws_info *fws, int fifo,
+static void brcmf_fws_skb_pickup_credit(struct brcmf_fws_info *fws, int fifo,
                                     struct sk_buff *p)
 {
        struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(p)->mac;
 
-       if (brcmf_skbcb(p)->if_flags & BRCMF_SKB_IF_FLAGS_CREDITCHECK_MASK) {
-               if (fws->fcmode != BRCMF_FWS_FCMODE_IMPLIED_CREDIT)
-                       return;
+       if (brcmf_skbcb(p)->if_flags & BRCMF_SKB_IF_FLAGS_CREDITCHECK_MASK)
                brcmf_fws_return_credits(fws, fifo, 1);
-       } else {
+       else if (!brcmf_skb_if_flags_get_field(p, REQUESTED))
                /*
                 * if this packet did not count against FIFO credit, it
                 * must have taken a requested_credit from the destination
                 * entry (for pspoll etc.)
                 */
-               if (!brcmf_skb_if_flags_get_field(p, REQUESTED))
-                       entry->requested_credit++;
-       }
+               entry->requested_credit++;
+
        brcmf_fws_schedule_deq(fws);
 }
 
@@ -1272,7 +1269,9 @@ brcmf_fws_txstatus_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot,
 
        /* pick up the implicit credit from this packet */
        fifo = brcmf_skb_htod_tag_get_field(skb, FIFO);
-       brcmf_skb_pick_up_credit(fws, fifo, skb);
+       if (fws->fcmode == BRCMF_FWS_FCMODE_IMPLIED_CREDIT ||
+           !(brcmf_skbcb(skb)->if_flags & BRCMF_SKB_IF_FLAGS_CREDITCHECK_MASK))
+               brcmf_fws_skb_pickup_credit(fws, fifo, skb);
 
        if (!remove_from_hanger)
                ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, genbit);
@@ -1845,7 +1844,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
        } else {
                if (brcmf_fws_commit_skb(fws, fifo, skb))
                        if (!multicast)
-                               brcmf_skb_pick_up_credit(fws, fifo, skb);
+                               brcmf_fws_skb_pickup_credit(fws, fifo, skb);
        }
        brcmf_fws_unlock(drvr, flags);
        return 0;
@@ -2053,18 +2052,15 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
 void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
 {
        ulong flags;
+       int fifo;
 
        brcmf_fws_lock(fws->drvr, flags);
        brcmf_fws_txstatus_process(fws, BRCMF_FWS_TXSTATUS_FW_TOSSED,
                                   brcmf_skb_htod_tag_get_field(skb, HSLOT), 0);
        /* the packet never reached firmware so reclaim credit */
-       if (fws->fcmode == BRCMF_FWS_FCMODE_EXPLICIT_CREDIT &&
-           brcmf_skbcb(skb)->if_flags & BRCMF_SKB_IF_FLAGS_CREDITCHECK_MASK) {
-               brcmf_fws_return_credits(fws,
-                                        brcmf_skb_htod_tag_get_field(skb,
-                                                                     FIFO),
-                                        1);
-               brcmf_fws_schedule_deq(fws);
+       if (fws->fcmode == BRCMF_FWS_FCMODE_EXPLICIT_CREDIT) {
+               fifo = brcmf_skb_htod_tag_get_field(skb, FIFO);
+               brcmf_fws_skb_pickup_credit(fws, fifo, skb);
        }
        brcmf_fws_unlock(fws->drvr, flags);
 }