ath10k: simplify HTC credits calculation
authorMichal Kazior <michal.kazior@tieto.com>
Fri, 13 Sep 2013 12:16:52 +0000 (14:16 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 16 Sep 2013 16:47:45 +0000 (19:47 +0300)
Credit calculation was overly complex
unnecessarily. Now skb dequeing is more unified.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/htc.c

index f03fd8d282dd750325165bc75f5b646b733e691d..1da0f828f458815e60f74b3c2688253d45597377 100644 (file)
@@ -167,49 +167,6 @@ err:
        return ret;
 }
 
-static struct sk_buff *ath10k_htc_get_skb_credit_based(struct ath10k_htc *htc,
-                                                      struct ath10k_htc_ep *ep,
-                                                      u8 *credits)
-{
-       struct sk_buff *skb;
-       struct ath10k_skb_cb *skb_cb;
-       int credits_required;
-       int remainder;
-       unsigned int transfer_len;
-
-       lockdep_assert_held(&htc->tx_lock);
-
-       skb = __skb_dequeue(&ep->tx_queue);
-       if (!skb)
-               return NULL;
-
-       skb_cb = ATH10K_SKB_CB(skb);
-       transfer_len = skb->len;
-
-       if (likely(transfer_len <= htc->target_credit_size)) {
-               credits_required = 1;
-       } else {
-               /* figure out how many credits this message requires */
-               credits_required = transfer_len / htc->target_credit_size;
-               remainder = transfer_len % htc->target_credit_size;
-
-               if (remainder)
-                       credits_required++;
-       }
-
-       ath10k_dbg(ATH10K_DBG_HTC, "Credits required %d got %d\n",
-                  credits_required, ep->tx_credits);
-
-       if (ep->tx_credits < credits_required) {
-               __skb_queue_head(&ep->tx_queue, skb);
-               return NULL;
-       }
-
-       ep->tx_credits -= credits_required;
-       *credits = credits_required;
-       return skb;
-}
-
 static void ath10k_htc_send_work(struct work_struct *work)
 {
        struct ath10k_htc_ep *ep = container_of(work,
@@ -224,11 +181,16 @@ static void ath10k_htc_send_work(struct work_struct *work)
                        ath10k_htc_send_complete_check(ep, 0);
 
                spin_lock_bh(&htc->tx_lock);
-               if (ep->tx_credit_flow_enabled)
-                       skb = ath10k_htc_get_skb_credit_based(htc, ep,
-                                                             &credits);
-               else
-                       skb = __skb_dequeue(&ep->tx_queue);
+               skb = __skb_dequeue(&ep->tx_queue);
+
+               if (ep->tx_credit_flow_enabled) {
+                       credits = DIV_ROUND_UP(skb->len,
+                                              htc->target_credit_size);
+                       if (ep->tx_credits < credits) {
+                               __skb_queue_head(&ep->tx_queue, skb);
+                               skb = NULL;
+                       }
+               }
                spin_unlock_bh(&htc->tx_lock);
 
                if (!skb)