diff options
author | Felix Fietkau <nbd@nbd.name> | 2018-01-24 10:19:15 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2018-01-26 04:18:43 -0500 |
commit | 9d9d738b4b54c8b04928168663761fe934b43ad8 (patch) | |
tree | 19eeca8edb9f325b908de97a4592712be1a0b7ef | |
parent | aee5b8cf2477bbb293cb84a4f726f5c0f91f587e (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.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/dma.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mac80211.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt76.h | 5 |
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 | } |
385 | EXPORT_SYMBOL_GPL(mt76_get_survey); | 385 | EXPORT_SYMBOL_GPL(mt76_get_survey); |
386 | 386 | ||
387 | struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb) | 387 | static 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 | ||
413 | void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q) | 413 | void 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 | |||
429 | void 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 */ |
417 | void mt76_tx_free(struct mt76_dev *dev); | 417 | void mt76_tx_free(struct mt76_dev *dev); |
418 | void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); | 418 | void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); |
419 | void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q); | 419 | void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, |
420 | int queue); | ||
421 | void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q); | ||
420 | void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); | 422 | void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); |
421 | struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb); | ||
422 | 423 | ||
423 | #endif | 424 | #endif |