wifi: mt76: sdio: add rx_check callback for sdio devices
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 22 Jul 2022 07:32:36 +0000 (09:32 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 15 Sep 2022 10:53:59 +0000 (12:53 +0200)
Introduce rx_check callback support for mt7921s driver.

Tested-by: Sean Wang <sean.wang@mediatek.com>
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
drivers/net/wireless/mediatek/mt76/sdio_txrx.c

index 2face849fb4fba15c864929c6b2e9a81cb06b07c..2dd7ce5e9d43b04eee453701b25ff457baf5d3c9 100644 (file)
@@ -96,6 +96,7 @@ static int mt7921s_probe(struct sdio_func *func,
                .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 a2601aa9e7b1ceb1352640219fa781dbf63659ec..bfc4de50a4d23226cc75166b6b06ad571ea94097 100644 (file)
@@ -85,7 +85,7 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
        struct mt76_sdio *sdio = &dev->sdio;
        int len = 0, err, i;
        struct page *page;
-       u8 *buf;
+       u8 *buf, *end;
 
        for (i = 0; i < intr->rx.num[qid]; i++)
                len += round_up(intr->rx.len[qid][i] + 4, 4);
@@ -112,20 +112,29 @@ mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid,
                return err;
        }
 
-       for (i = 0; i < intr->rx.num[qid]; i++) {
+       end = buf + len;
+       i = 0;
+
+       while (i < intr->rx.num[qid] && buf < end) {
                int index = (q->head + i) % q->ndesc;
                struct mt76_queue_entry *e = &q->entry[index];
                __le32 *rxd = (__le32 *)buf;
 
                /* parse rxd to get the actual packet length */
                len = le32_get_bits(rxd[0], GENMASK(15, 0));
-               e->skb = mt76s_build_rx_skb(buf, len, round_up(len + 4, 4));
-               if (!e->skb)
-                       break;
 
+               /* Optimized path for TXS */
+               if (!dev->drv->rx_check || dev->drv->rx_check(dev, buf, len)) {
+                       e->skb = mt76s_build_rx_skb(buf, len,
+                                                   round_up(len + 4, 4));
+                       if (!e->skb)
+                               break;
+
+                       if (q->queued + i + 1 == q->ndesc)
+                               break;
+                       i++;
+               }
                buf += round_up(len + 4, 4);
-               if (q->queued + i + 1 == q->ndesc)
-                       break;
        }
        put_page(page);