Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sujuan Chen and committed by
Felix Fietkau
c3137942 52546e27

+53 -22
+4 -4
drivers/net/wireless/mediatek/mt76/dma.c
··· 750 750 751 751 static void 752 752 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) 754 754 { 755 755 struct sk_buff *skb = q->rx_head; 756 756 struct skb_shared_info *shinfo = skb_shinfo(skb); ··· 770 770 771 771 q->rx_head = NULL; 772 772 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); 774 774 else 775 775 dev_kfree_skb(skb); 776 776 } ··· 822 822 } 823 823 824 824 if (q->rx_head) { 825 - mt76_add_fragment(dev, q, data, len, more); 825 + mt76_add_fragment(dev, q, data, len, more, info); 826 826 continue; 827 827 } 828 828 ··· 846 846 continue; 847 847 } 848 848 849 - dev->drv->rx_skb(dev, q - dev->q_rx, skb); 849 + dev->drv->rx_skb(dev, q - dev->q_rx, skb, &info); 850 850 continue; 851 851 852 852 free_frag:
+1 -1
drivers/net/wireless/mediatek/mt76/mt76.h
··· 444 444 bool (*rx_check)(struct mt76_dev *dev, void *data, int len); 445 445 446 446 void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 447 - struct sk_buff *skb); 447 + struct sk_buff *skb, u32 *info); 448 448 449 449 void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 450 450
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/dma.c
··· 69 69 } 70 70 71 71 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) 73 73 { 74 74 struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); 75 75 __le32 *rxd = (__le32 *)skb->data;
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
··· 244 244 void mt7603_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 245 245 246 246 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); 248 248 void mt7603_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q); 249 249 void mt7603_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); 250 250 int mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
··· 1666 1666 EXPORT_SYMBOL_GPL(mt7615_rx_check); 1667 1667 1668 1668 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) 1670 1670 { 1671 1671 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); 1672 1672 __le32 *rxd = (__le32 *)skb->data;
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
··· 513 513 void mt7615_tx_token_put(struct mt7615_dev *dev); 514 514 bool mt7615_rx_check(struct mt76_dev *mdev, void *data, int len); 515 515 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); 517 517 void mt7615_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); 518 518 int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, 519 519 struct ieee80211_sta *sta);
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x02.h
··· 188 188 void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len); 189 189 bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update); 190 190 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); 192 192 void mt76x02_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q); 193 193 irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance); 194 194 void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c
··· 33 33 EXPORT_SYMBOL_GPL(mt76x02_tx); 34 34 35 35 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) 37 37 { 38 38 struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76); 39 39 void *rxwi = skb->data;
+37 -6
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
··· 165 165 sta = container_of((void *)msta, struct ieee80211_sta, 166 166 drv_priv); 167 167 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]; 171 171 u8 tid = ac_to_tid[i]; 172 172 173 173 if (!tx_cur && !rx_cur) ··· 245 245 mt76_clear(dev, addr, BIT(5)); 246 246 } 247 247 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 + 248 276 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) 250 279 { 251 280 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 252 281 struct mt76_phy *mphy = &dev->mt76.phy; ··· 542 513 } 543 514 } else { 544 515 status->flag |= RX_FLAG_8023; 516 + mt7915_wed_check_ppe(dev, &dev->mt76.q_rx[q], msta, skb, 517 + *info); 545 518 } 546 519 547 520 if (rxv && mode >= MT_PHY_TYPE_HE_SU && !(status->flag & RX_FLAG_8023)) ··· 1127 1096 } 1128 1097 1129 1098 void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 1130 - struct sk_buff *skb) 1099 + struct sk_buff *skb, u32 *info) 1131 1100 { 1132 1101 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76); 1133 1102 __le32 *rxd = (__le32 *)skb->data; ··· 1161 1130 dev_kfree_skb(skb); 1162 1131 break; 1163 1132 case PKT_TYPE_NORMAL: 1164 - if (!mt7915_mac_fill_rx(dev, skb)) { 1133 + if (!mt7915_mac_fill_rx(dev, skb, q, info)) { 1165 1134 mt76_rx(&dev->mt76, q, skb); 1166 1135 return; 1167 1136 }
+1 -1
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
··· 617 617 struct mt76_tx_info *tx_info); 618 618 void mt7915_tx_token_put(struct mt7915_dev *dev); 619 619 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); 621 621 bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len); 622 622 void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); 623 623 void mt7915_stats_work(struct work_struct *work);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
··· 684 684 EXPORT_SYMBOL_GPL(mt7921_rx_check); 685 685 686 686 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) 688 688 { 689 689 struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 690 690 __le32 *rxd = (__le32 *)skb->data;
+1 -1
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
··· 470 470 void mt7921_tx_token_put(struct mt7921_dev *dev); 471 471 bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len); 472 472 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); 474 474 void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); 475 475 void mt7921_stats_work(struct work_struct *work); 476 476 void mt7921_set_stream_he_caps(struct mt7921_phy *phy);
+1 -1
drivers/net/wireless/mediatek/mt76/sdio.c
··· 395 395 if (!e || !e->skb) 396 396 break; 397 397 398 - dev->drv->rx_skb(dev, MT_RXQ_MAIN, e->skb); 398 + dev->drv->rx_skb(dev, MT_RXQ_MAIN, e->skb, NULL); 399 399 e->skb = NULL; 400 400 nframes++; 401 401 }
+1 -1
drivers/net/wireless/mediatek/mt76/usb.c
··· 547 547 len -= data_len; 548 548 nsgs++; 549 549 } 550 - dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb); 550 + dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb, NULL); 551 551 552 552 return nsgs; 553 553 }