wifi: mt76: add rx_check callback for usb devices
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 20 Jul 2022 16:56:37 +0000 (18:56 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 15 Sep 2022 10:53:57 +0000 (12:53 +0200)
Introduce rx_check callback support for mt7663u and mt7921u drivers.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
drivers/net/wireless/mediatek/mt76/mt7921/usb.c
drivers/net/wireless/mediatek/mt76/usb.c

index 967641aebf5f00b23effcffd2e46760a2d5db1a5..f2d651d7adff46d8b6c4031b39d957a8ca52d1a7 100644 (file)
@@ -119,6 +119,7 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
                .tx_complete_skb = mt7663_usb_sdio_tx_complete_skb,
                .tx_status_data = mt7663_usb_sdio_tx_status_data,
                .rx_skb = mt7615_queue_rx_skb,
+               .rx_check = mt7615_rx_check,
                .sta_ps = mt7615_sta_ps,
                .sta_add = mt7615_mac_sta_add,
                .sta_remove = mt7615_mac_sta_remove,
index 47f0aa81ab0280d323a84ec773e210ecde8f2b79..b00fb463b4f1c6a1afcfcdec9debfbc7ed404495 100644 (file)
@@ -554,6 +554,26 @@ out:
 }
 EXPORT_SYMBOL_GPL(mt7921_mac_add_txs);
 
+bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len)
+{
+       struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
+       __le32 *rxd = (__le32 *)data;
+       __le32 *end = (__le32 *)&rxd[len / 4];
+       enum rx_pkt_type type;
+
+       type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
+
+       switch (type) {
+       case PKT_TYPE_TXS:
+               for (rxd += 2; rxd + 8 <= end; rxd += 8)
+                       mt7921_mac_add_txs(dev, rxd);
+               return false;
+       default:
+               return true;
+       }
+}
+EXPORT_SYMBOL_GPL(mt7921_rx_check);
+
 void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
                         struct sk_buff *skb)
 {
index c161031ac62aac89887aa5930b87d7536a10d3fb..12c145a30c60733b904889cd570e26b5370341d7 100644 (file)
@@ -380,6 +380,7 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 
 void mt7921_tx_worker(struct mt76_worker *w);
 void mt7921_tx_token_put(struct mt7921_dev *dev);
+bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len);
 void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
                         struct sk_buff *skb);
 void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
index dd3b8884e162037834bf2da2af1d7c8c9490cc95..29fc7698f75d4926e447c62a9518752c6c0bc093 100644 (file)
@@ -183,6 +183,7 @@ static int mt7921u_probe(struct usb_interface *usb_intf,
                .tx_complete_skb = mt7921_usb_sdio_tx_complete_skb,
                .tx_status_data = mt7921_usb_sdio_tx_status_data,
                .rx_skb = mt7921_queue_rx_skb,
+               .rx_check = mt7921_rx_check,
                .sta_ps = mt7921_sta_ps,
                .sta_add = mt7921_mac_sta_add,
                .sta_assoc = mt7921_mac_sta_assoc,
index 6b8964c19f50d4294ee86211edf722bd53fab612..4c4033bb1bb35ef5c95842d5281a642df0920398 100644 (file)
@@ -528,6 +528,11 @@ mt76u_process_rx_entry(struct mt76_dev *dev, struct urb *urb,
 
        head_room = drv_flags & MT_DRV_RX_DMA_HDR ? 0 : MT_DMA_HDR_LEN;
        data_len = min_t(int, len, data_len - head_room);
+
+       if (len == data_len &&
+           dev->drv->rx_check && !dev->drv->rx_check(dev, data, data_len))
+               return 0;
+
        skb = mt76u_build_rx_skb(dev, data, data_len, buf_size);
        if (!skb)
                return 0;