Skip to content

Commit c313794

Browse files
Sujuan Chennbd168
Sujuan Chen
authored andcommitted
wifi: mt76: add info parameter to rx_skb signature
This is a preliminary patch to introduce WED RX support for mt7915. Tested-by: Daniel Golle <daniel@makrotopia.org> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 52546e2 commit c313794

File tree

14 files changed

+53
-22
lines changed

14 files changed

+53
-22
lines changed

drivers/net/wireless/mediatek/mt76/dma.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
750750

751751
static void
752752
mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
753-
int len, bool more)
753+
int len, bool more, u32 info)
754754
{
755755
struct sk_buff *skb = q->rx_head;
756756
struct skb_shared_info *shinfo = skb_shinfo(skb);
@@ -770,7 +770,7 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
770770

771771
q->rx_head = NULL;
772772
if (nr_frags < ARRAY_SIZE(shinfo->frags))
773-
dev->drv->rx_skb(dev, q - dev->q_rx, skb);
773+
dev->drv->rx_skb(dev, q - dev->q_rx, skb, &info);
774774
else
775775
dev_kfree_skb(skb);
776776
}
@@ -822,7 +822,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
822822
}
823823

824824
if (q->rx_head) {
825-
mt76_add_fragment(dev, q, data, len, more);
825+
mt76_add_fragment(dev, q, data, len, more, info);
826826
continue;
827827
}
828828

@@ -846,7 +846,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
846846
continue;
847847
}
848848

849-
dev->drv->rx_skb(dev, q - dev->q_rx, skb);
849+
dev->drv->rx_skb(dev, q - dev->q_rx, skb, &info);
850850
continue;
851851

852852
free_frag:

drivers/net/wireless/mediatek/mt76/mt76.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ struct mt76_driver_ops {
444444
bool (*rx_check)(struct mt76_dev *dev, void *data, int len);
445445

446446
void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q,
447-
struct sk_buff *skb);
447+
struct sk_buff *skb, u32 *info);
448448

449449
void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q);
450450

drivers/net/wireless/mediatek/mt76/mt7603/dma.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
6969
}
7070

7171
void mt7603_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
72-
struct sk_buff *skb)
72+
struct sk_buff *skb, u32 *info)
7373
{
7474
struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
7575
__le32 *rxd = (__le32 *)skb->data;

drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
244244
void mt7603_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e);
245245

246246
void mt7603_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
247-
struct sk_buff *skb);
247+
struct sk_buff *skb, u32 *info);
248248
void mt7603_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q);
249249
void mt7603_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
250250
int mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,

drivers/net/wireless/mediatek/mt76/mt7615/mac.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,7 @@ bool mt7615_rx_check(struct mt76_dev *mdev, void *data, int len)
16661666
EXPORT_SYMBOL_GPL(mt7615_rx_check);
16671667

16681668
void mt7615_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
1669-
struct sk_buff *skb)
1669+
struct sk_buff *skb, u32 *info)
16701670
{
16711671
struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
16721672
__le32 *rxd = (__le32 *)skb->data;

drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ void mt7615_tx_worker(struct mt76_worker *w);
513513
void mt7615_tx_token_put(struct mt7615_dev *dev);
514514
bool mt7615_rx_check(struct mt76_dev *mdev, void *data, int len);
515515
void mt7615_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
516-
struct sk_buff *skb);
516+
struct sk_buff *skb, u32 *info);
517517
void mt7615_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
518518
int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
519519
struct ieee80211_sta *sta);

drivers/net/wireless/mediatek/mt76/mt76x02.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val);
188188
void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len);
189189
bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update);
190190
void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
191-
struct sk_buff *skb);
191+
struct sk_buff *skb, u32 *info);
192192
void mt76x02_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q);
193193
irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance);
194194
void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,

drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
3333
EXPORT_SYMBOL_GPL(mt76x02_tx);
3434

3535
void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
36-
struct sk_buff *skb)
36+
struct sk_buff *skb, u32 *info)
3737
{
3838
struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
3939
void *rxwi = skb->data;

drivers/net/wireless/mediatek/mt76/mt7915/mac.c

+37-6
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ static void mt7915_mac_sta_poll(struct mt7915_dev *dev)
165165
sta = container_of((void *)msta, struct ieee80211_sta,
166166
drv_priv);
167167
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
168-
u8 q = mt76_connac_lmac_mapping(i);
169-
u32 tx_cur = tx_time[q];
170-
u32 rx_cur = rx_time[q];
168+
u8 queue = mt76_connac_lmac_mapping(i);
169+
u32 tx_cur = tx_time[queue];
170+
u32 rx_cur = rx_time[queue];
171171
u8 tid = ac_to_tid[i];
172172

173173
if (!tx_cur && !rx_cur)
@@ -245,8 +245,37 @@ void mt7915_mac_enable_rtscts(struct mt7915_dev *dev,
245245
mt76_clear(dev, addr, BIT(5));
246246
}
247247

248+
static void
249+
mt7915_wed_check_ppe(struct mt7915_dev *dev, struct mt76_queue *q,
250+
struct mt7915_sta *msta, struct sk_buff *skb,
251+
u32 info)
252+
{
253+
struct ieee80211_vif *vif;
254+
struct wireless_dev *wdev;
255+
256+
if (!msta || !msta->vif)
257+
return;
258+
259+
if (!(q->flags & MT_QFLAG_WED) ||
260+
FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) != MT76_WED_Q_RX)
261+
return;
262+
263+
if (!(info & MT_DMA_INFO_PPE_VLD))
264+
return;
265+
266+
vif = container_of((void *)msta->vif, struct ieee80211_vif,
267+
drv_priv);
268+
wdev = ieee80211_vif_to_wdev(vif);
269+
skb->dev = wdev->netdev;
270+
271+
mtk_wed_device_ppe_check(&dev->mt76.mmio.wed, skb,
272+
FIELD_GET(MT_DMA_PPE_CPU_REASON, info),
273+
FIELD_GET(MT_DMA_PPE_ENTRY, info));
274+
}
275+
248276
static int
249-
mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
277+
mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb,
278+
enum mt76_rxq_id q, u32 *info)
250279
{
251280
struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
252281
struct mt76_phy *mphy = &dev->mt76.phy;
@@ -513,6 +542,8 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
513542
}
514543
} else {
515544
status->flag |= RX_FLAG_8023;
545+
mt7915_wed_check_ppe(dev, &dev->mt76.q_rx[q], msta, skb,
546+
*info);
516547
}
517548

518549
if (rxv && mode >= MT_PHY_TYPE_HE_SU && !(status->flag & RX_FLAG_8023))
@@ -1096,7 +1127,7 @@ bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len)
10961127
}
10971128

10981129
void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
1099-
struct sk_buff *skb)
1130+
struct sk_buff *skb, u32 *info)
11001131
{
11011132
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
11021133
__le32 *rxd = (__le32 *)skb->data;
@@ -1130,7 +1161,7 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
11301161
dev_kfree_skb(skb);
11311162
break;
11321163
case PKT_TYPE_NORMAL:
1133-
if (!mt7915_mac_fill_rx(dev, skb)) {
1164+
if (!mt7915_mac_fill_rx(dev, skb, q, info)) {
11341165
mt76_rx(&dev->mt76, q, skb);
11351166
return;
11361167
}

drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
617617
struct mt76_tx_info *tx_info);
618618
void mt7915_tx_token_put(struct mt7915_dev *dev);
619619
void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
620-
struct sk_buff *skb);
620+
struct sk_buff *skb, u32 *info);
621621
bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len);
622622
void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
623623
void mt7915_stats_work(struct work_struct *work);

drivers/net/wireless/mediatek/mt76/mt7921/mac.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len)
684684
EXPORT_SYMBOL_GPL(mt7921_rx_check);
685685

686686
void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
687-
struct sk_buff *skb)
687+
struct sk_buff *skb, u32 *info)
688688
{
689689
struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
690690
__le32 *rxd = (__le32 *)skb->data;

drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ void mt7921_tx_worker(struct mt76_worker *w);
470470
void mt7921_tx_token_put(struct mt7921_dev *dev);
471471
bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len);
472472
void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
473-
struct sk_buff *skb);
473+
struct sk_buff *skb, u32 *info);
474474
void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
475475
void mt7921_stats_work(struct work_struct *work);
476476
void mt7921_set_stream_he_caps(struct mt7921_phy *phy);

drivers/net/wireless/mediatek/mt76/sdio.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ mt76s_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
395395
if (!e || !e->skb)
396396
break;
397397

398-
dev->drv->rx_skb(dev, MT_RXQ_MAIN, e->skb);
398+
dev->drv->rx_skb(dev, MT_RXQ_MAIN, e->skb, NULL);
399399
e->skb = NULL;
400400
nframes++;
401401
}

drivers/net/wireless/mediatek/mt76/usb.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ mt76u_process_rx_entry(struct mt76_dev *dev, struct urb *urb,
547547
len -= data_len;
548548
nsgs++;
549549
}
550-
dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb);
550+
dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb, NULL);
551551

552552
return nsgs;
553553
}

0 commit comments

Comments
 (0)