net-smc-fix-data-error-when-recvmsg-with-msg_peek-fl.patch
landlock-handle-weird-files.patch
wifi-mt76-mt76u_vendor_request-do-not-print-error-me.patch
-wifi-mt76-connac-introduce-unified-event-table.patch
-wifi-mt76-connac-add-more-bss-info-command-tags.patch
-wifi-mt76-introduce-rxwi-and-rx-token-utility-routin.patch
-wifi-mt76-add-wed-rx-support-to-mt76_dma_-add-get-_b.patch
wifi-mt76-mt7921-fix-using-incorrect-group-cipher-af.patch
wifi-mt76-mt7915-fix-register-mapping.patch
cpufreq-acpi-fix-max-frequency-computation.patch
+++ /dev/null
-From 89dbd781ce984f8e1d2d4a09f56f12ed927f237b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 12 Nov 2022 16:40:35 +0100
-Subject: wifi: mt76: add WED RX support to mt76_dma_{add,get}_buf
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit cd372b8c99c5a5cf6a464acebb7e4a79af7ec8ae ]
-
-Introduce the capability to configure RX WED in mt76_dma_{add,get}_buf
-utility routines.
-
-Tested-by: Daniel Golle <daniel@makrotopia.org>
-Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
-Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Stable-dep-of: aa566ac6b727 ("wifi: mt76: mt7921: fix using incorrect group cipher after disconnection.")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/wireless/mediatek/mt76/dma.c | 125 +++++++++++++++-------
- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +
- 2 files changed, 88 insertions(+), 39 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
-index 25e110852e1f2..5c626249d4d90 100644
---- a/drivers/net/wireless/mediatek/mt76/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/dma.c
-@@ -215,11 +215,6 @@ mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
- u32 ctrl;
- int i, idx = -1;
-
-- if (txwi) {
-- q->entry[q->head].txwi = DMA_DUMMY_DATA;
-- q->entry[q->head].skip_buf0 = true;
-- }
--
- for (i = 0; i < nbufs; i += 2, buf += 2) {
- u32 buf0 = buf[0].addr, buf1 = 0;
-
-@@ -229,28 +224,48 @@ mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
- desc = &q->desc[idx];
- entry = &q->entry[idx];
-
-- if (buf[0].skip_unmap)
-- entry->skip_buf0 = true;
-- entry->skip_buf1 = i == nbufs - 1;
--
-- entry->dma_addr[0] = buf[0].addr;
-- entry->dma_len[0] = buf[0].len;
--
-- ctrl = FIELD_PREP(MT_DMA_CTL_SD_LEN0, buf[0].len);
-- if (i < nbufs - 1) {
-- entry->dma_addr[1] = buf[1].addr;
-- entry->dma_len[1] = buf[1].len;
-- buf1 = buf[1].addr;
-- ctrl |= FIELD_PREP(MT_DMA_CTL_SD_LEN1, buf[1].len);
-- if (buf[1].skip_unmap)
-- entry->skip_buf1 = true;
-+ if ((q->flags & MT_QFLAG_WED) &&
-+ FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_Q_RX) {
-+ struct mt76_txwi_cache *t = txwi;
-+ int rx_token;
-+
-+ if (!t)
-+ return -ENOMEM;
-+
-+ rx_token = mt76_rx_token_consume(dev, (void *)skb, t,
-+ buf[0].addr);
-+ buf1 |= FIELD_PREP(MT_DMA_CTL_TOKEN, rx_token);
-+ ctrl = FIELD_PREP(MT_DMA_CTL_SD_LEN0, buf[0].len) |
-+ MT_DMA_CTL_TO_HOST;
-+ } else {
-+ if (txwi) {
-+ q->entry[q->head].txwi = DMA_DUMMY_DATA;
-+ q->entry[q->head].skip_buf0 = true;
-+ }
-+
-+ if (buf[0].skip_unmap)
-+ entry->skip_buf0 = true;
-+ entry->skip_buf1 = i == nbufs - 1;
-+
-+ entry->dma_addr[0] = buf[0].addr;
-+ entry->dma_len[0] = buf[0].len;
-+
-+ ctrl = FIELD_PREP(MT_DMA_CTL_SD_LEN0, buf[0].len);
-+ if (i < nbufs - 1) {
-+ entry->dma_addr[1] = buf[1].addr;
-+ entry->dma_len[1] = buf[1].len;
-+ buf1 = buf[1].addr;
-+ ctrl |= FIELD_PREP(MT_DMA_CTL_SD_LEN1, buf[1].len);
-+ if (buf[1].skip_unmap)
-+ entry->skip_buf1 = true;
-+ }
-+
-+ if (i == nbufs - 1)
-+ ctrl |= MT_DMA_CTL_LAST_SEC0;
-+ else if (i == nbufs - 2)
-+ ctrl |= MT_DMA_CTL_LAST_SEC1;
- }
-
-- if (i == nbufs - 1)
-- ctrl |= MT_DMA_CTL_LAST_SEC0;
-- else if (i == nbufs - 2)
-- ctrl |= MT_DMA_CTL_LAST_SEC1;
--
- WRITE_ONCE(desc->buf0, cpu_to_le32(buf0));
- WRITE_ONCE(desc->buf1, cpu_to_le32(buf1));
- WRITE_ONCE(desc->info, cpu_to_le32(info));
-@@ -339,33 +354,60 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush)
-
- static void *
- mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
-- int *len, u32 *info, bool *more)
-+ int *len, u32 *info, bool *more, bool *drop)
- {
- struct mt76_queue_entry *e = &q->entry[idx];
- struct mt76_desc *desc = &q->desc[idx];
-- dma_addr_t buf_addr;
-- void *buf = e->buf;
-- int buf_len = SKB_WITH_OVERHEAD(q->buf_size);
-+ void *buf;
-
-- buf_addr = e->dma_addr[0];
- if (len) {
-- u32 ctl = le32_to_cpu(READ_ONCE(desc->ctrl));
-- *len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctl);
-- *more = !(ctl & MT_DMA_CTL_LAST_SEC0);
-+ u32 ctrl = le32_to_cpu(READ_ONCE(desc->ctrl));
-+ *len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctrl);
-+ *more = !(ctrl & MT_DMA_CTL_LAST_SEC0);
- }
-
- if (info)
- *info = le32_to_cpu(desc->info);
-
-- dma_unmap_single(dev->dma_dev, buf_addr, buf_len, DMA_FROM_DEVICE);
-- e->buf = NULL;
-+ if ((q->flags & MT_QFLAG_WED) &&
-+ FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_Q_RX) {
-+ u32 token = FIELD_GET(MT_DMA_CTL_TOKEN,
-+ le32_to_cpu(desc->buf1));
-+ struct mt76_txwi_cache *t = mt76_rx_token_release(dev, token);
-+
-+ if (!t)
-+ return NULL;
-+
-+ dma_unmap_single(dev->dma_dev, t->dma_addr,
-+ SKB_WITH_OVERHEAD(q->buf_size),
-+ DMA_FROM_DEVICE);
-+
-+ buf = t->ptr;
-+ t->dma_addr = 0;
-+ t->ptr = NULL;
-+
-+ mt76_put_rxwi(dev, t);
-+
-+ if (drop) {
-+ u32 ctrl = le32_to_cpu(READ_ONCE(desc->ctrl));
-+
-+ *drop = !!(ctrl & (MT_DMA_CTL_TO_HOST_A |
-+ MT_DMA_CTL_DROP));
-+ }
-+ } else {
-+ buf = e->buf;
-+ e->buf = NULL;
-+ dma_unmap_single(dev->dma_dev, e->dma_addr[0],
-+ SKB_WITH_OVERHEAD(q->buf_size),
-+ DMA_FROM_DEVICE);
-+ }
-
- return buf;
- }
-
- static void *
- mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
-- int *len, u32 *info, bool *more)
-+ int *len, u32 *info, bool *more, bool *drop)
- {
- int idx = q->tail;
-
-@@ -381,7 +423,7 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
- q->tail = (q->tail + 1) % q->ndesc;
- q->queued--;
-
-- return mt76_dma_get_buf(dev, q, idx, len, info, more);
-+ return mt76_dma_get_buf(dev, q, idx, len, info, more, drop);
- }
-
- static int
-@@ -644,7 +686,7 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
- spin_lock_bh(&q->lock);
-
- do {
-- buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
-+ buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more, NULL);
- if (!buf)
- break;
-
-@@ -726,6 +768,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- }
-
- while (done < budget) {
-+ bool drop = false;
- u32 info;
-
- if (check_ddone) {
-@@ -736,10 +779,14 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- break;
- }
-
-- data = mt76_dma_dequeue(dev, q, false, &len, &info, &more);
-+ data = mt76_dma_dequeue(dev, q, false, &len, &info, &more,
-+ &drop);
- if (!data)
- break;
-
-+ if (drop)
-+ goto free_frag;
-+
- if (q->rx_head)
- data_len = q->buf_size;
- else
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
-index a8c281a3951a4..3873c5ad75174 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
-@@ -35,6 +35,7 @@
- FIELD_PREP(MT_QFLAG_WED_TYPE, _type) | \
- FIELD_PREP(MT_QFLAG_WED_RING, _n))
- #define MT_WED_Q_TX(_n) __MT_WED_Q(MT76_WED_Q_TX, _n)
-+#define MT_WED_Q_RX(_n) __MT_WED_Q(MT76_WED_Q_RX, _n)
- #define MT_WED_Q_TXFREE __MT_WED_Q(MT76_WED_Q_TXFREE, 0)
-
- struct mt76_dev;
-@@ -56,6 +57,7 @@ enum mt76_bus_type {
- enum mt76_wed_type {
- MT76_WED_Q_TX,
- MT76_WED_Q_TXFREE,
-+ MT76_WED_Q_RX,
- };
-
- struct mt76_bus_ops {
---
-2.39.5
-
+++ /dev/null
-From c5205bb7fcb7102ec9f99b80530f6b05a3951450 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 10 Nov 2022 17:35:22 +0800
-Subject: wifi: mt76: connac: add more bss info command tags
-
-From: Shayne Chen <shayne.chen@mediatek.com>
-
-[ Upstream commit 9c402ac1c517907ae375d71dd2fee4703efc8bb4 ]
-
-Add bss info tags which will be used in new chipset.
-This is a preliminary patch to add mt7996 chipset support.
-
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Stable-dep-of: aa566ac6b727 ("wifi: mt76: mt7921: fix using incorrect group cipher after disconnection.")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-index e04f98d443261..a3162fbda14dc 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-@@ -1212,14 +1212,23 @@ enum {
-
- enum {
- UNI_BSS_INFO_BASIC = 0,
-+ UNI_BSS_INFO_RA = 1,
- UNI_BSS_INFO_RLM = 2,
- UNI_BSS_INFO_BSS_COLOR = 4,
- UNI_BSS_INFO_HE_BASIC = 5,
- UNI_BSS_INFO_BCN_CONTENT = 7,
-+ UNI_BSS_INFO_BCN_CSA = 8,
-+ UNI_BSS_INFO_BCN_BCC = 9,
-+ UNI_BSS_INFO_BCN_MBSSID = 10,
-+ UNI_BSS_INFO_RATE = 11,
- UNI_BSS_INFO_QBSS = 15,
-+ UNI_BSS_INFO_SEC = 16,
-+ UNI_BSS_INFO_TXCMD = 18,
- UNI_BSS_INFO_UAPSD = 19,
- UNI_BSS_INFO_PS = 21,
- UNI_BSS_INFO_BCNFT = 22,
-+ UNI_BSS_INFO_OFFLOAD = 25,
-+ UNI_BSS_INFO_MLD = 26,
- };
-
- enum {
---
-2.39.5
-
+++ /dev/null
-From d6097b6a5f269c626a56d42f10371fb1ab34e1fa Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 10 Nov 2022 17:35:21 +0800
-Subject: wifi: mt76: connac: introduce unified event table
-
-From: Shayne Chen <shayne.chen@mediatek.com>
-
-[ Upstream commit ec361f7e415297dc07254e93ac6af1dbce4af87b ]
-
-Add event IDs and related bit fields for unified event support.
-This is a preliminary patch to add mt7996 chipset support.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Stable-dep-of: aa566ac6b727 ("wifi: mt76: mt7921: fix using incorrect group cipher after disconnection.")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-index 718f427d8f6b2..e04f98d443261 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-@@ -981,6 +981,17 @@ enum {
- MCU_EXT_EVENT_MURU_CTRL = 0x9f,
- };
-
-+/* unified event table */
-+enum {
-+ MCU_UNI_EVENT_RESULT = 0x01,
-+ MCU_UNI_EVENT_FW_LOG_2_HOST = 0x04,
-+ MCU_UNI_EVENT_IE_COUNTDOWN = 0x09,
-+ MCU_UNI_EVENT_RDD_REPORT = 0x11,
-+};
-+
-+#define MCU_UNI_CMD_EVENT BIT(1)
-+#define MCU_UNI_CMD_UNSOLICITED_EVENT BIT(2)
-+
- enum {
- MCU_Q_QUERY,
- MCU_Q_SET,
---
-2.39.5
-
+++ /dev/null
-From 566d7640bf25b99ac90175adf8cc36d6ab087060 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 12 Nov 2022 16:40:34 +0100
-Subject: wifi: mt76: introduce rxwi and rx token utility routines
-
-From: Sujuan Chen <sujuan.chen@mediatek.com>
-
-[ Upstream commit 2666bece0905a3e8ccb792602dbc76a63aaafe4b ]
-
-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>
-Stable-dep-of: aa566ac6b727 ("wifi: mt76: mt7921: fix using incorrect group cipher after disconnection.")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/wireless/mediatek/mt76/dma.c | 68 +++++++++++++++++++
- drivers/net/wireless/mediatek/mt76/dma.h | 8 +++
- drivers/net/wireless/mediatek/mt76/mac80211.c | 5 ++
- drivers/net/wireless/mediatek/mt76/mt76.h | 16 ++++-
- drivers/net/wireless/mediatek/mt76/tx.c | 30 ++++++++
- 5 files changed, 126 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
-index c406cb1a102ff..25e110852e1f2 100644
---- a/drivers/net/wireless/mediatek/mt76/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/dma.c
-@@ -59,6 +59,19 @@ mt76_alloc_txwi(struct mt76_dev *dev)
- return t;
- }
-
-+static struct mt76_txwi_cache *
-+mt76_alloc_rxwi(struct mt76_dev *dev)
-+{
-+ struct mt76_txwi_cache *t;
-+
-+ t = kzalloc(L1_CACHE_ALIGN(sizeof(*t)), GFP_ATOMIC);
-+ if (!t)
-+ return NULL;
-+
-+ t->ptr = NULL;
-+ return t;
-+}
-+
- static struct mt76_txwi_cache *
- __mt76_get_txwi(struct mt76_dev *dev)
- {
-@@ -75,6 +88,22 @@ __mt76_get_txwi(struct mt76_dev *dev)
- return t;
- }
-
-+static struct mt76_txwi_cache *
-+__mt76_get_rxwi(struct mt76_dev *dev)
-+{
-+ struct mt76_txwi_cache *t = NULL;
-+
-+ spin_lock(&dev->wed_lock);
-+ if (!list_empty(&dev->rxwi_cache)) {
-+ t = list_first_entry(&dev->rxwi_cache, struct mt76_txwi_cache,
-+ list);
-+ list_del(&t->list);
-+ }
-+ spin_unlock(&dev->wed_lock);
-+
-+ return t;
-+}
-+
- static struct mt76_txwi_cache *
- mt76_get_txwi(struct mt76_dev *dev)
- {
-@@ -86,6 +115,18 @@ mt76_get_txwi(struct mt76_dev *dev)
- return mt76_alloc_txwi(dev);
- }
-
-+struct mt76_txwi_cache *
-+mt76_get_rxwi(struct mt76_dev *dev)
-+{
-+ struct mt76_txwi_cache *t = __mt76_get_rxwi(dev);
-+
-+ if (t)
-+ return t;
-+
-+ return mt76_alloc_rxwi(dev);
-+}
-+EXPORT_SYMBOL_GPL(mt76_get_rxwi);
-+
- void
- mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
- {
-@@ -98,6 +139,18 @@ mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
- }
- EXPORT_SYMBOL_GPL(mt76_put_txwi);
-
-+void
-+mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
-+{
-+ if (!t)
-+ return;
-+
-+ spin_lock(&dev->wed_lock);
-+ list_add(&t->list, &dev->rxwi_cache);
-+ spin_unlock(&dev->wed_lock);
-+}
-+EXPORT_SYMBOL_GPL(mt76_put_rxwi);
-+
- static void
- mt76_free_pending_txwi(struct mt76_dev *dev)
- {
-@@ -112,6 +165,20 @@ mt76_free_pending_txwi(struct mt76_dev *dev)
- local_bh_enable();
- }
-
-+static void
-+mt76_free_pending_rxwi(struct mt76_dev *dev)
-+{
-+ struct mt76_txwi_cache *t;
-+
-+ local_bh_disable();
-+ while ((t = __mt76_get_rxwi(dev)) != NULL) {
-+ if (t->ptr)
-+ skb_free_frag(t->ptr);
-+ kfree(t);
-+ }
-+ local_bh_enable();
-+}
-+
- static void
- mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
- {
-@@ -811,6 +878,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
- }
-
- mt76_free_pending_txwi(dev);
-+ mt76_free_pending_rxwi(dev);
-
- if (mtk_wed_device_active(&dev->mmio.wed))
- mtk_wed_device_detach(&dev->mmio.wed);
-diff --git a/drivers/net/wireless/mediatek/mt76/dma.h b/drivers/net/wireless/mediatek/mt76/dma.h
-index fdf786f975ea3..53c6ce2528b2f 100644
---- a/drivers/net/wireless/mediatek/mt76/dma.h
-+++ b/drivers/net/wireless/mediatek/mt76/dma.h
-@@ -15,6 +15,14 @@
- #define MT_DMA_CTL_SD_LEN0 GENMASK(29, 16)
- #define MT_DMA_CTL_LAST_SEC0 BIT(30)
- #define MT_DMA_CTL_DMA_DONE BIT(31)
-+#define MT_DMA_CTL_TO_HOST BIT(8)
-+#define MT_DMA_CTL_TO_HOST_A BIT(12)
-+#define MT_DMA_CTL_DROP BIT(14)
-+#define MT_DMA_CTL_TOKEN GENMASK(31, 16)
-+
-+#define MT_DMA_PPE_CPU_REASON GENMASK(15, 11)
-+#define MT_DMA_PPE_ENTRY GENMASK(30, 16)
-+#define MT_DMA_INFO_PPE_VLD BIT(31)
-
- #define MT_DMA_HDR_LEN 4
- #define MT_RX_INFO_LEN 4
-diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
-index 82fce4b1d581b..8eb02167ba2cb 100644
---- a/drivers/net/wireless/mediatek/mt76/mac80211.c
-+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
-@@ -572,6 +572,7 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
- spin_lock_init(&dev->lock);
- spin_lock_init(&dev->cc_lock);
- spin_lock_init(&dev->status_lock);
-+ spin_lock_init(&dev->wed_lock);
- mutex_init(&dev->mutex);
- init_waitqueue_head(&dev->tx_wait);
-
-@@ -594,9 +595,13 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
- spin_lock_init(&dev->token_lock);
- idr_init(&dev->token);
-
-+ spin_lock_init(&dev->rx_token_lock);
-+ idr_init(&dev->rx_token);
-+
- INIT_LIST_HEAD(&dev->wcid_list);
-
- INIT_LIST_HEAD(&dev->txwi_cache);
-+ INIT_LIST_HEAD(&dev->rxwi_cache);
- dev->token_size = dev->drv->token_size;
-
- for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
-index 5b03e3b33d546..a8c281a3951a4 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
-@@ -339,7 +339,10 @@ struct mt76_txwi_cache {
- struct list_head list;
- dma_addr_t dma_addr;
-
-- struct sk_buff *skb;
-+ union {
-+ struct sk_buff *skb;
-+ void *ptr;
-+ };
- };
-
- struct mt76_rx_tid {
-@@ -738,6 +741,7 @@ struct mt76_dev {
-
- struct ieee80211_hw *hw;
-
-+ spinlock_t wed_lock;
- spinlock_t lock;
- spinlock_t cc_lock;
-
-@@ -764,6 +768,7 @@ struct mt76_dev {
- struct sk_buff_head rx_skb[__MT_RXQ_MAX];
-
- struct list_head txwi_cache;
-+ struct list_head rxwi_cache;
- struct mt76_queue *q_mcu[__MT_MCUQ_MAX];
- struct mt76_queue q_rx[__MT_RXQ_MAX];
- const struct mt76_queue_ops *queue_ops;
-@@ -778,6 +783,10 @@ struct mt76_dev {
- u16 token_count;
- u16 token_size;
-
-+ spinlock_t rx_token_lock;
-+ struct idr rx_token;
-+ u16 rx_token_size;
-+
- wait_queue_head_t tx_wait;
- /* spinclock used to protect wcid pktid linked list */
- spinlock_t status_lock;
-@@ -1262,6 +1271,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
- }
-
- void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
-+void mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
-+struct mt76_txwi_cache *mt76_get_rxwi(struct mt76_dev *dev);
- void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
- struct napi_struct *napi);
- void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
-@@ -1406,6 +1417,9 @@ struct mt76_txwi_cache *
- mt76_token_release(struct mt76_dev *dev, int token, bool *wake);
- int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi);
- void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked);
-+struct mt76_txwi_cache *mt76_rx_token_release(struct mt76_dev *dev, int token);
-+int mt76_rx_token_consume(struct mt76_dev *dev, void *ptr,
-+ struct mt76_txwi_cache *r, dma_addr_t phys);
-
- static inline void mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked)
- {
-diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c
-index 4482e4ff78044..f265a5f80c50e 100644
---- a/drivers/net/wireless/mediatek/mt76/tx.c
-+++ b/drivers/net/wireless/mediatek/mt76/tx.c
-@@ -760,6 +760,23 @@ int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
- }
- EXPORT_SYMBOL_GPL(mt76_token_consume);
-
-+int mt76_rx_token_consume(struct mt76_dev *dev, void *ptr,
-+ struct mt76_txwi_cache *t, dma_addr_t phys)
-+{
-+ int token;
-+
-+ spin_lock_bh(&dev->rx_token_lock);
-+ token = idr_alloc(&dev->rx_token, t, 0, dev->rx_token_size,
-+ GFP_ATOMIC);
-+ spin_unlock_bh(&dev->rx_token_lock);
-+
-+ t->ptr = ptr;
-+ t->dma_addr = phys;
-+
-+ return token;
-+}
-+EXPORT_SYMBOL_GPL(mt76_rx_token_consume);
-+
- struct mt76_txwi_cache *
- mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
- {
-@@ -788,3 +805,16 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
- return txwi;
- }
- EXPORT_SYMBOL_GPL(mt76_token_release);
-+
-+struct mt76_txwi_cache *
-+mt76_rx_token_release(struct mt76_dev *dev, int token)
-+{
-+ struct mt76_txwi_cache *t;
-+
-+ spin_lock_bh(&dev->rx_token_lock);
-+ t = idr_remove(&dev->rx_token, token);
-+ spin_unlock_bh(&dev->rx_token_lock);
-+
-+ return t;
-+}
-+EXPORT_SYMBOL_GPL(mt76_rx_token_release);
---
-2.39.5
-
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- drivers/net/wireless/mediatek/mt76/mt7921/main.c | 8 +++++++-
+ drivers/net/wireless/mediatek/mt76/mt7921/main.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-index 172ba7199485d..5070cc23917bd 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-@@ -469,7 +469,13 @@ static int mt7921_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
+@@ -469,7 +469,13 @@ static int mt7921_set_key(struct ieee802
} else {
if (idx == *wcid_keyidx)
*wcid_keyidx = -1;
}
mt76_wcid_key_setup(&dev->mt76, wcid, key);
---
-2.39.5
-