diff options
author | Michal Kazior | 2013-09-13 14:16:52 +0200 |
---|---|---|
committer | Kalle Valo | 2013-09-16 18:47:45 +0200 |
commit | eeed3765f327755b499c81eaf453e9d52a27c01c (patch) | |
tree | 651fb5cb7d9c3f41c641b7282ccf512537e04ac2 /drivers/net/wireless/ath | |
parent | wireless: ath10k: remove unnecessary pci_set_drvdata() (diff) | |
download | kernel-qcow2-linux-eeed3765f327755b499c81eaf453e9d52a27c01c.tar.gz kernel-qcow2-linux-eeed3765f327755b499c81eaf453e9d52a27c01c.tar.xz kernel-qcow2-linux-eeed3765f327755b499c81eaf453e9d52a27c01c.zip |
ath10k: simplify HTC credits calculation
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>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ath10k/htc.c | 58 |
1 files changed, 10 insertions, 48 deletions
diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c index f03fd8d282dd..1da0f828f458 100644 --- a/drivers/net/wireless/ath/ath10k/htc.c +++ b/drivers/net/wireless/ath/ath10k/htc.c @@ -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) |