blob: 12322c89306db1ef6fba5753a5857916ee77ad21 [file] [log] [blame]
From cea4cefe43864504c91e9c0e699237fb55b62208 Mon Sep 17 00:00:00 2001
From: "sujuan.chen" <sujuan.chen@mediatek.com>
Date: Mon, 11 Sep 2023 17:57:32 +0800
Subject: [PATCH 2011/2012] wifi: mt76: mt7915: wed: change wed token init size
to adapt wed version
Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
---
mt76.h | 2 ++
mt7915/mac.c | 10 ++++++++--
mt7915/mcu.c | 7 +++++--
mt7915/mmio.c | 9 ++++++---
mt7915/mt7915.h | 4 +++-
tx.c | 26 ++++++++------------------
wed.c | 4 ++--
7 files changed, 34 insertions(+), 28 deletions(-)
diff --git a/mt76.h b/mt76.h
index 3844e3b..2adfa94 100644
--- a/mt76.h
+++ b/mt76.h
@@ -29,6 +29,8 @@
#define MT76_BUILD_TIME_LEN 24
+#define MT76_WED_SW_TOKEN_SIZE 1024
+
#define MT_QFLAG_WED_RING GENMASK(1, 0)
#define MT_QFLAG_WED_TYPE GENMASK(4, 2)
#define MT_QFLAG_WED BIT(5)
diff --git a/mt7915/mac.c b/mt7915/mac.c
index 882d812..51e2f24 100644
--- a/mt7915/mac.c
+++ b/mt7915/mac.c
@@ -932,7 +932,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4);
for (cur_info = tx_info; count < total; cur_info++) {
- u32 msdu, info;
+ u32 msdu, info, max_token_size = MT7915_TOKEN_SIZE;
u8 i;
if (WARN_ON_ONCE((void *)cur_info >= end))
@@ -988,6 +988,12 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
wcid->stats.tx_failed += tx_failed;
}
+ if (mtk_wed_device_active(&mdev->mmio.wed))
+ max_token_size = (is_mt7915(&dev->mt76) ?
+ MT7915_WED_TOKEN_SIZE_V0 :
+ MT7915_WED_TOKEN_SIZE) +
+ MT7915_WED_SW_TOKEN_SIZE;
+
if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
continue;
@@ -1001,7 +1007,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
}
/* Todo: check if msdu is sw token */
- if (msdu > MT7915_TOKEN_SIZE)
+ if (msdu > max_token_size)
dev_err(mdev->dev, "Receive invalid token id(%d)\n",
msdu);
diff --git a/mt7915/mcu.c b/mt7915/mcu.c
index 3e0acc0..c052774 100644
--- a/mt7915/mcu.c
+++ b/mt7915/mcu.c
@@ -2408,6 +2408,9 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
static int mt7915_red_set_watermark(struct mt7915_dev *dev)
{
#define RED_GLOBAL_TOKEN_WATERMARK 2
+ u16 token_size = is_mt7915(&dev->mt76) ?
+ MT7915_WED_TOKEN_SIZE_V0 :
+ MT7915_WED_TOKEN_SIZE;
struct {
__le32 args[3];
u8 cmd;
@@ -2421,8 +2424,8 @@ static int mt7915_red_set_watermark(struct mt7915_dev *dev)
.args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING),
.cmd = RED_GLOBAL_TOKEN_WATERMARK,
.len = cpu_to_le16(sizeof(req) - sizeof(req.args)),
- .high_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256),
- .low_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256 - 1536),
+ .high_mark = cpu_to_le16(token_size - 256),
+ .low_mark = cpu_to_le16(token_size - 256 - 1536),
};
return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET), &req,
diff --git a/mt7915/mmio.c b/mt7915/mmio.c
index 3391a94..6309dd9 100644
--- a/mt7915/mmio.c
+++ b/mt7915/mmio.c
@@ -695,11 +695,14 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
wed->wlan.wpdma_rx_glo = res->start + MT_WPDMA_GLO_CFG;
wed->wlan.wpdma_rx = res->start + MT_RXQ_WED_DATA_RING_BASE;
}
- wed->wlan.nbuf = MT7915_HW_TOKEN_SIZE;
+
+ wed->wlan.nbuf = is_mt7915(&dev->mt76) ?
+ MT7915_WED_TOKEN_SIZE_V0 :
+ MT7915_WED_TOKEN_SIZE;
wed->wlan.tx_tbit[0] = is_mt7915(&dev->mt76) ? 4 : 30;
wed->wlan.tx_tbit[1] = is_mt7915(&dev->mt76) ? 5 : 31;
wed->wlan.txfree_tbit = is_mt798x(&dev->mt76) ? 2 : 1;
- wed->wlan.token_start = MT7915_TOKEN_SIZE - wed->wlan.nbuf;
+ wed->wlan.token_start = 0;
wed->wlan.wcid_512 = !is_mt7915(&dev->mt76);
wed->wlan.rx_nbuf = 65536;
@@ -732,7 +735,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
*irq = wed->irq;
dev->mt76.dma_dev = wed->dev;
- dev->mt76.token_size = wed->wlan.token_start;
+ dev->mt76.token_size = MT7915_WED_SW_TOKEN_SIZE;
ret = dma_set_mask(wed->dev, DMA_BIT_MASK(32));
if (ret)
diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
index 0c1ada2..f95ed89 100644
--- a/mt7915/mt7915.h
+++ b/mt7915/mt7915.h
@@ -62,7 +62,9 @@
#define MT7916_EEPROM_SIZE 4096
#define MT7915_EEPROM_BLOCK_SIZE 16
-#define MT7915_HW_TOKEN_SIZE 7168
+#define MT7915_WED_TOKEN_SIZE 8192
+#define MT7915_WED_TOKEN_SIZE_V0 7168
+#define MT7915_WED_SW_TOKEN_SIZE 1024
#define MT7915_TOKEN_SIZE 8192
#define MT7915_RX_TOKEN_SIZE 4096
diff --git a/tx.c b/tx.c
index ba7c13c..b1d8b32 100644
--- a/tx.c
+++ b/tx.c
@@ -826,20 +826,18 @@ EXPORT_SYMBOL_GPL(__mt76_set_tx_blocked);
int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
{
- int token;
+ int token, start = 0;
+
+ if (mtk_wed_device_active(&dev->mmio.wed))
+ start = dev->mmio.wed.wlan.nbuf;
spin_lock_bh(&dev->token_lock);
- token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
- if (token >= 0)
+ token = idr_alloc(&dev->token, *ptxwi, start, start + dev->token_size,
+ GFP_ATOMIC);
+ if (token >= start)
dev->token_count++;
-#ifdef CONFIG_NET_MEDIATEK_SOC_WED
- if (mtk_wed_device_active(&dev->mmio.wed) &&
- token >= dev->mmio.wed.wlan.token_start)
- dev->wed_token_count++;
-#endif
-
if (dev->token_count >= dev->token_size - MT76_TOKEN_FREE_THR)
__mt76_set_tx_blocked(dev, true);
@@ -875,17 +873,9 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
spin_lock_bh(&dev->token_lock);
txwi = idr_remove(&dev->token, token);
- if (txwi) {
+ if (txwi)
dev->token_count--;
-#ifdef CONFIG_NET_MEDIATEK_SOC_WED
- if (mtk_wed_device_active(&dev->mmio.wed) &&
- token >= dev->mmio.wed.wlan.token_start &&
- --dev->wed_token_count == 0)
- wake_up(&dev->tx_wait);
-#endif
- }
-
if (dev->token_count < dev->token_size - MT76_TOKEN_FREE_THR &&
dev->phy.q_tx[0]->blocked)
*wake = true;
diff --git a/wed.c b/wed.c
index 70e4057..5ed681e 100644
--- a/wed.c
+++ b/wed.c
@@ -118,7 +118,7 @@ int mt76_wed_offload_enable(struct mtk_wed_device *wed)
struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
spin_lock_bh(&dev->token_lock);
- dev->token_size = wed->wlan.token_start;
+ dev->token_size = MT76_WED_SW_TOKEN_SIZE;
spin_unlock_bh(&dev->token_lock);
return !wait_event_timeout(dev->tx_wait, !dev->wed_token_count, HZ);
@@ -202,7 +202,7 @@ void mt76_wed_offload_disable(struct mtk_wed_device *wed)
struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
spin_lock_bh(&dev->token_lock);
- dev->token_size = wed->wlan.token_start;
+ dev->token_size = MT76_WED_SW_TOKEN_SIZE;
spin_unlock_bh(&dev->token_lock);
}
EXPORT_SYMBOL_GPL(mt76_wed_offload_disable);
--
2.18.0