aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2018-01-24 10:19:15 -0500
committerKalle Valo <kvalo@codeaurora.org>2018-01-26 04:18:43 -0500
commit9d9d738b4b54c8b04928168663761fe934b43ad8 (patch)
tree19eeca8edb9f325b908de97a4592712be1a0b7ef
parentaee5b8cf2477bbb293cb84a4f726f5c0f91f587e (diff)
mt76: split mt76_rx_complete
Add a separate function for processing frames after A-MPDU reordering, reduce code duplication Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r--drivers/net/wireless/mediatek/mt76/agg-rx.c8
-rw-r--r--drivers/net/wireless/mediatek/mt76/dma.c2
-rw-r--r--drivers/net/wireless/mediatek/mt76/mac80211.c24
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt76.h5
4 files changed, 23 insertions, 16 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/agg-rx.c b/drivers/net/wireless/mediatek/mt76/agg-rx.c
index ecd0bcd149e5..8027bb7c03c2 100644
--- a/drivers/net/wireless/mediatek/mt76/agg-rx.c
+++ b/drivers/net/wireless/mediatek/mt76/agg-rx.c
@@ -97,9 +97,7 @@ mt76_rx_aggr_reorder_work(struct work_struct *work)
97 struct mt76_rx_tid *tid = container_of(work, struct mt76_rx_tid, 97 struct mt76_rx_tid *tid = container_of(work, struct mt76_rx_tid,
98 reorder_work.work); 98 reorder_work.work);
99 struct mt76_dev *dev = tid->dev; 99 struct mt76_dev *dev = tid->dev;
100 struct ieee80211_sta *sta;
101 struct sk_buff_head frames; 100 struct sk_buff_head frames;
102 struct sk_buff *skb;
103 101
104 __skb_queue_head_init(&frames); 102 __skb_queue_head_init(&frames);
105 103
@@ -110,11 +108,7 @@ mt76_rx_aggr_reorder_work(struct work_struct *work)
110 spin_unlock(&tid->lock); 108 spin_unlock(&tid->lock);
111 109
112 ieee80211_queue_delayed_work(tid->dev->hw, &tid->reorder_work, REORDER_TIMEOUT); 110 ieee80211_queue_delayed_work(tid->dev->hw, &tid->reorder_work, REORDER_TIMEOUT);
113 111 mt76_rx_complete(dev, &frames, -1);
114 while ((skb = __skb_dequeue(&frames)) != NULL) {
115 sta = mt76_rx_convert(skb);
116 ieee80211_rx_napi(dev->hw, sta, skb, NULL);
117 }
118 112
119 local_bh_enable(); 113 local_bh_enable();
120} 114}
diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
index fd8bea144973..3518703524e7 100644
--- a/drivers/net/wireless/mediatek/mt76/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/dma.c
@@ -396,7 +396,7 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget)
396 396
397 do { 397 do {
398 cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done); 398 cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
399 mt76_rx_complete(dev, qid); 399 mt76_rx_poll_complete(dev, qid);
400 done += cur; 400 done += cur;
401 } while (cur && done < budget); 401 } while (cur && done < budget);
402 402
diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
index 5978e5b0a2fe..77f1be161009 100644
--- a/drivers/net/wireless/mediatek/mt76/mac80211.c
+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
@@ -384,7 +384,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx,
384} 384}
385EXPORT_SYMBOL_GPL(mt76_get_survey); 385EXPORT_SYMBOL_GPL(mt76_get_survey);
386 386
387struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb) 387static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
388{ 388{
389 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 389 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
390 struct mt76_rx_status mstat; 390 struct mt76_rx_status mstat;
@@ -410,9 +410,24 @@ struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
410 return wcid_to_sta(mstat.wcid); 410 return wcid_to_sta(mstat.wcid);
411} 411}
412 412
413void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q) 413void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
414 int queue)
414{ 415{
416 struct napi_struct *napi = NULL;
415 struct ieee80211_sta *sta; 417 struct ieee80211_sta *sta;
418 struct sk_buff *skb;
419
420 if (queue >= 0)
421 napi = &dev->napi[queue];
422
423 while ((skb = __skb_dequeue(frames)) != NULL) {
424 sta = mt76_rx_convert(skb);
425 ieee80211_rx_napi(dev->hw, sta, skb, napi);
426 }
427}
428
429void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q)
430{
416 struct sk_buff_head frames; 431 struct sk_buff_head frames;
417 struct sk_buff *skb; 432 struct sk_buff *skb;
418 433
@@ -421,8 +436,5 @@ void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q)
421 while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) 436 while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL)
422 mt76_rx_aggr_reorder(skb, &frames); 437 mt76_rx_aggr_reorder(skb, &frames);
423 438
424 while ((skb = __skb_dequeue(&frames)) != NULL) { 439 mt76_rx_complete(dev, &frames, q);
425 sta = mt76_rx_convert(skb);
426 ieee80211_rx_napi(dev->hw, sta, skb, &dev->napi[q]);
427 }
428} 440}
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index cde199ed3f57..af98bc65c2e1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -416,8 +416,9 @@ void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid);
416/* internal */ 416/* internal */
417void mt76_tx_free(struct mt76_dev *dev); 417void mt76_tx_free(struct mt76_dev *dev);
418void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 418void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
419void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q); 419void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
420 int queue);
421void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q);
420void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 422void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames);
421struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb);
422 423
423#endif 424#endif