All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions
@ 2023-06-05  8:19 Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download Shayne Chen
                   ` (8 more replies)
  0 siblings, 9 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Shayne Chen

Move radio enable/disable commands into functions for configuring
per-phy radio.

Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/main.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/main.c b/drivers/net/wireless/mediatek/mt76/mt7996/main.c
index 0975774fe244..8a1edc5c1288 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/main.c
@@ -43,6 +43,10 @@ int mt7996_run(struct ieee80211_hw *hw)
 	if (ret)
 		goto out;
 
+	ret = mt7996_mcu_set_radio_en(phy, true);
+	if (ret)
+		goto out;
+
 	ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_RX_PATH);
 	if (ret)
 		goto out;
@@ -82,6 +86,8 @@ static void mt7996_stop(struct ieee80211_hw *hw)
 
 	mutex_lock(&dev->mt76.mutex);
 
+	mt7996_mcu_set_radio_en(phy, false);
+
 	clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
 
 	mutex_unlock(&dev->mt76.mutex);
@@ -190,10 +196,6 @@ static int mt7996_add_interface(struct ieee80211_hw *hw,
 	if (ret)
 		goto out;
 
-	ret = mt7996_mcu_set_radio_en(phy, true);
-	if (ret)
-		goto out;
-
 	dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx);
 	phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
 
@@ -253,7 +255,6 @@ static void mt7996_remove_interface(struct ieee80211_hw *hw,
 		phy->monitor_vif = NULL;
 
 	mt7996_mcu_add_dev_info(phy, vif, false);
-	mt7996_mcu_set_radio_en(phy, false);
 
 	rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
 
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:38   ` Lorenzo Bianconi
  2023-06-05  8:19 ` [PATCH v2 03/10] wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command Shayne Chen
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu, Shayne Chen

From: Peter Chiu <chui-hao.chiu@mediatek.com>

Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
firmware download, which is for phy-related control.
The firmware is transparent to the driver, but it's necessary for the
firmware download process.

Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
v2:
  - merge two commits:
    - wifi: mt76: connac: add a setting bit for dsp firmware
    - wifi: mt76: mt7996: add dsp firmware download
  - move main code for loading ram to a regular function
---
 .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
 .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----------
 .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
 .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
 4 files changed, 43 insertions(+), 36 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index ca1ce97a6d2f..4a21c237ea6e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -22,6 +22,7 @@
 
 #define FW_START_OVERRIDE		BIT(0)
 #define FW_START_WORKING_PDA_CR4	BIT(2)
+#define FW_START_WORKING_PDA_DSP	BIT(3)
 
 #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
 #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 88e2f9d0e513..28930693a75a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct mt7996_dev *dev)
 static int
 mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
 			     const struct mt7996_fw_trailer *hdr,
-			     const u8 *data, bool is_wa)
+			     const u8 *data, enum mt7996_ram_type type)
 {
 	int i, offset = 0;
 	u32 override = 0, option = 0;
@@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
 
 		region = (const struct mt7996_fw_region *)((const u8 *)hdr -
 			 (hdr->n_region - i) * sizeof(*region));
+		/* DSP and WA use same mode */
 		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
-						   region->feature_set, is_wa);
+						   region->feature_set,
+						   type != MT7996_RAM_TYPE_WM);
 		len = le32_to_cpu(region->len);
 		addr = le32_to_cpu(region->addr);
 
@@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
 	if (override)
 		option |= FW_START_OVERRIDE;
 
-	if (is_wa)
+	if (type == MT7996_RAM_TYPE_WA)
 		option |= FW_START_WORKING_PDA_CR4;
+	else if (type == MT7996_RAM_TYPE_DSP)
+		option |= FW_START_WORKING_PDA_DSP;
 
 	return mt76_connac_mcu_start_firmware(&dev->mt76, override, option);
 }
 
-static int mt7996_load_ram(struct mt7996_dev *dev)
+static int __mt7996_load_ram(struct mt7996_dev *dev, const char *fw_type,
+			     const char *fw_file, enum mt7996_ram_type ram_type)
 {
 	const struct mt7996_fw_trailer *hdr;
 	const struct firmware *fw;
 	int ret;
 
-	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
+	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
 	if (ret)
 		return ret;
 
@@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
 		goto out;
 	}
 
-	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size - sizeof(*hdr));
-
-	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
-		 hdr->fw_ver, hdr->build_date);
+	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
+	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build Time: %.15s\n",
+		 fw_type, hdr->fw_ver, hdr->build_date);
 
-	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
+	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, ram_type);
 	if (ret) {
-		dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
+		dev_err(dev->mt76.dev, "Failed to start %s firmware\n", fw_type);
 		goto out;
 	}
 
+out:
 	release_firmware(fw);
 
-	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
-	if (ret)
-		return ret;
-
-	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
-		dev_err(dev->mt76.dev, "Invalid firmware\n");
-		ret = -EINVAL;
-		goto out;
-	}
-
-	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size - sizeof(*hdr));
-
-	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
-		 hdr->fw_ver, hdr->build_date);
+	return ret;
+}
 
-	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
-	if (ret) {
-		dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
-		goto out;
-	}
+static int mt7996_load_ram(struct mt7996_dev *dev)
+{
+	int ret;
 
-	snprintf(dev->mt76.hw->wiphy->fw_version,
-		 sizeof(dev->mt76.hw->wiphy->fw_version),
-		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
+#define LOAD_RAM(_type) \
+	do {								\
+		ret = __mt7996_load_ram(dev, #_type,			\
+					MT7996_FIRMWARE_##_type,	\
+					MT7996_RAM_TYPE_##_type);	\
+		if (ret)						\
+			return ret;					\
+	} while (0)
 
-out:
-	release_firmware(fw);
+	LOAD_RAM(WM);
+	LOAD_RAM(DSP);
+	LOAD_RAM(WA);
+#undef LOAD_RAM
 
-	return ret;
+	return 0;
 }
 
 static int
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 4d7dcb95a620..7dfdc7384056 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -29,6 +29,7 @@
 
 #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
 #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
+#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996_dsp.bin"
 #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
 
 #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
@@ -52,6 +53,12 @@ struct mt7996_sta;
 struct mt7996_dfs_pulse;
 struct mt7996_dfs_pattern;
 
+enum mt7996_ram_type {
+	MT7996_RAM_TYPE_WM,
+	MT7996_RAM_TYPE_WA,
+	MT7996_RAM_TYPE_DSP,
+};
+
 enum mt7996_txq_id {
 	MT7996_TXQ_FWDL = 16,
 	MT7996_TXQ_MCU_WM,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
index 64aee3fb5445..c5301050ff8b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
@@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci, mt7996_pci_device_table);
 MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
 MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
 MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
+MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
 MODULE_FIRMWARE(MT7996_ROM_PATCH);
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 03/10] wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 04/10] wifi: mt76: mt7996: init he and eht cap for AP_VLAN Shayne Chen
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu, Shayne Chen

From: Peter Chiu <chui-hao.chiu@mediatek.com>

The bmc_tx_wlan_idx should be the wlan_idx of the current bss rather
than peer AP's wlan_idx, otherwise there will appear some frame
decryption problems on station mode.

Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 28930693a75a..64b99fd16f51 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -712,6 +712,7 @@ mt7996_mcu_bss_basic_tlv(struct sk_buff *skb,
 	struct cfg80211_chan_def *chandef = &phy->chandef;
 	struct mt76_connac_bss_basic_tlv *bss;
 	u32 type = CONNECTION_INFRA_AP;
+	u16 sta_wlan_idx = wlan_idx;
 	struct tlv *tlv;
 	int idx;
 
@@ -731,7 +732,7 @@ mt7996_mcu_bss_basic_tlv(struct sk_buff *skb,
 				struct mt76_wcid *wcid;
 
 				wcid = (struct mt76_wcid *)sta->drv_priv;
-				wlan_idx = wcid->idx;
+				sta_wlan_idx = wcid->idx;
 			}
 			rcu_read_unlock();
 		}
@@ -751,7 +752,7 @@ mt7996_mcu_bss_basic_tlv(struct sk_buff *skb,
 	bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
 	bss->dtim_period = vif->bss_conf.dtim_period;
 	bss->bmc_tx_wlan_idx = cpu_to_le16(wlan_idx);
-	bss->sta_idx = cpu_to_le16(wlan_idx);
+	bss->sta_idx = cpu_to_le16(sta_wlan_idx);
 	bss->conn_type = cpu_to_le32(type);
 	bss->omac_idx = mvif->omac_idx;
 	bss->band_idx = mvif->band_idx;
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 04/10] wifi: mt76: mt7996: init he and eht cap for AP_VLAN
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 03/10] wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 05/10] wifi: mt76: mt7996: enable VHT extended NSS BW feature Shayne Chen
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu, Shayne Chen

From: Peter Chiu <chui-hao.chiu@mediatek.com>

Init he and eht capabilities for AP_VLAN type. Without this patch, the
BA response from AP_VLAN will not include the ADDBA extension tag.

Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/init.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index f1b48cdda58f..004575a0479b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -808,6 +808,7 @@ __mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy,
 		switch (i) {
 		case NL80211_IFTYPE_STATION:
 		case NL80211_IFTYPE_AP:
+		case NL80211_IFTYPE_AP_VLAN:
 #ifdef CONFIG_MAC80211_MESH
 		case NL80211_IFTYPE_MESH_POINT:
 #endif
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 05/10] wifi: mt76: mt7996: enable VHT extended NSS BW feature
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (2 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 04/10] wifi: mt76: mt7996: init he and eht cap for AP_VLAN Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 06/10] wifi: mt76: connac: add support to set ifs time by mcu command Shayne Chen
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu, Shayne Chen

From: Peter Chiu <chui-hao.chiu@mediatek.com>

Set SUPPORTS_VHT_EXT_NSS_BW to let the max BW capability correctly be
parsed by different devices.

Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/init.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index 004575a0479b..8247153d082d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -217,6 +217,8 @@ mt7996_init_wiphy(struct ieee80211_hw *hw)
 			IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
 		phy->mt76->sband_5g.sband.ht_cap.ampdu_density =
 			IEEE80211_HT_MPDU_DENSITY_1;
+
+		ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
 	}
 
 	mt76_set_stream_caps(phy->mt76, true);
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 06/10] wifi: mt76: connac: add support to set ifs time by mcu command
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (3 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 05/10] wifi: mt76: mt7996: enable VHT extended NSS BW feature Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 07/10] wifi: mt76: mt7996: use correct phy for background radar event Shayne Chen
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu, Shayne Chen

From: Peter Chiu <chui-hao.chiu@mediatek.com>

There's a race between driver and fw on some tx/rx control registers
when setting ifs, which will cause accidental hw queue pause problems.
Avoid this by setting ifs time with bss_info mcu command.

Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
v2:
  - merge two commits
    - wifi: mt76: connac: add a new bss_info tag for setting ifs time
    - wifi: mt76: mt7996: set ifs time by mcu command
  - change bool a_band to use is_2ghz
---
 .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
 .../net/wireless/mediatek/mt76/mt7996/mac.c   | 27 +----------
 .../net/wireless/mediatek/mt76/mt7996/main.c  |  5 +-
 .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 46 +++++++++++++++++++
 .../net/wireless/mediatek/mt76/mt7996/mcu.h   | 17 +++++++
 .../wireless/mediatek/mt76/mt7996/mt7996.h    |  3 +-
 6 files changed, 70 insertions(+), 29 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index 4a21c237ea6e..3790d68525e5 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -1288,6 +1288,7 @@ enum {
 	UNI_BSS_INFO_UAPSD = 19,
 	UNI_BSS_INFO_PS = 21,
 	UNI_BSS_INFO_BCNFT = 22,
+	UNI_BSS_INFO_IFS_TIME = 23,
 	UNI_BSS_INFO_OFFLOAD = 25,
 	UNI_BSS_INFO_MLD = 26,
 };
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index 130eb7b4fd91..78d9127e63ab 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -1604,20 +1604,19 @@ void mt7996_mac_reset_counters(struct mt7996_phy *phy)
 	mt7996_mcu_get_chan_mib_info(phy, true);
 }
 
-void mt7996_mac_set_timing(struct mt7996_phy *phy)
+void mt7996_mac_set_coverage_class(struct mt7996_phy *phy)
 {
 	s16 coverage_class = phy->coverage_class;
 	struct mt7996_dev *dev = phy->dev;
 	struct mt7996_phy *phy2 = mt7996_phy2(dev);
 	struct mt7996_phy *phy3 = mt7996_phy3(dev);
-	u32 val, reg_offset;
+	u32 reg_offset;
 	u32 cck = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 231) |
 		  FIELD_PREP(MT_TIMEOUT_VAL_CCA, 48);
 	u32 ofdm = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 60) |
 		   FIELD_PREP(MT_TIMEOUT_VAL_CCA, 28);
 	u8 band_idx = phy->mt76->band_idx;
 	int offset;
-	bool a_band = !(phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ);
 
 	if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state))
 		return;
@@ -1630,34 +1629,12 @@ void mt7996_mac_set_timing(struct mt7996_phy *phy)
 		coverage_class = max_t(s16, coverage_class,
 				       phy3->coverage_class);
 
-	mt76_set(dev, MT_ARB_SCR(band_idx),
-		 MT_ARB_SCR_TX_DISABLE | MT_ARB_SCR_RX_DISABLE);
-	udelay(1);
-
 	offset = 3 * coverage_class;
 	reg_offset = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, offset) |
 		     FIELD_PREP(MT_TIMEOUT_VAL_CCA, offset);
 
 	mt76_wr(dev, MT_TMAC_CDTR(band_idx), cck + reg_offset);
 	mt76_wr(dev, MT_TMAC_ODTR(band_idx), ofdm + reg_offset);
-	mt76_wr(dev, MT_TMAC_ICR0(band_idx),
-		FIELD_PREP(MT_IFS_EIFS_OFDM, a_band ? 84 : 78) |
-		FIELD_PREP(MT_IFS_RIFS, 2) |
-		FIELD_PREP(MT_IFS_SIFS, 10) |
-		FIELD_PREP(MT_IFS_SLOT, phy->slottime));
-
-	if (!a_band)
-		mt76_wr(dev, MT_TMAC_ICR1(band_idx),
-			FIELD_PREP(MT_IFS_EIFS_CCK, 314));
-
-	if (phy->slottime < 20 || a_band)
-		val = MT7996_CFEND_RATE_DEFAULT;
-	else
-		val = MT7996_CFEND_RATE_11B;
-
-	mt76_rmw_field(dev, MT_RATE_HRCR0(band_idx), MT_RATE_HRCR0_CFEND_RATE, val);
-	mt76_clear(dev, MT_ARB_SCR(band_idx),
-		   MT_ARB_SCR_TX_DISABLE | MT_ARB_SCR_RX_DISABLE);
 }
 
 void mt7996_mac_enable_nf(struct mt7996_dev *dev, u8 band)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/main.c b/drivers/net/wireless/mediatek/mt76/mt7996/main.c
index 8a1edc5c1288..6001b534b657 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/main.c
@@ -287,7 +287,6 @@ int mt7996_set_channel(struct mt7996_phy *phy)
 	if (ret)
 		goto out;
 
-	mt7996_mac_set_timing(phy);
 	ret = mt7996_dfs_init_radar_detector(phy);
 	mt7996_mac_cca_stats_reset(phy);
 
@@ -565,7 +564,7 @@ static void mt7996_bss_info_changed(struct ieee80211_hw *hw,
 
 		if (slottime != phy->slottime) {
 			phy->slottime = slottime;
-			mt7996_mac_set_timing(phy);
+			mt7996_mcu_set_timing(phy, vif);
 		}
 	}
 
@@ -905,7 +904,7 @@ mt7996_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class)
 
 	mutex_lock(&dev->mt76.mutex);
 	phy->coverage_class = max_t(s16, coverage_class, 0);
-	mt7996_mac_set_timing(phy);
+	mt7996_mac_set_coverage_class(phy);
 	mutex_unlock(&dev->mt76.mutex);
 }
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 64b99fd16f51..7eafb5c44a7f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -701,6 +701,34 @@ mt7996_mcu_muar_config(struct mt7996_phy *phy, struct ieee80211_vif *vif,
 				 sizeof(req), true);
 }
 
+static void
+mt7996_mcu_bss_ifs_timing_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
+{
+	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
+	struct mt7996_phy *phy = mvif->phy;
+	struct bss_ifs_time_tlv *ifs_time;
+	struct tlv *tlv;
+	bool is_2ghz = phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ;
+
+	tlv = mt7996_mcu_add_uni_tlv(skb, UNI_BSS_INFO_IFS_TIME, sizeof(*ifs_time));
+
+	ifs_time = (struct bss_ifs_time_tlv *)tlv;
+	ifs_time->slot_valid = true;
+	ifs_time->sifs_valid = true;
+	ifs_time->rifs_valid = true;
+	ifs_time->eifs_valid = true;
+
+	ifs_time->slot_time = cpu_to_le16(phy->slottime);
+	ifs_time->sifs_time = cpu_to_le16(10);
+	ifs_time->rifs_time = cpu_to_le16(2);
+	ifs_time->eifs_time = cpu_to_le16(is_2ghz ? 78 : 84);
+
+	if (is_2ghz) {
+		ifs_time->eifs_cck_valid = true;
+		ifs_time->eifs_cck_time = cpu_to_le16(314);
+	}
+}
+
 static int
 mt7996_mcu_bss_basic_tlv(struct sk_buff *skb,
 			 struct ieee80211_vif *vif,
@@ -826,6 +854,7 @@ int mt7996_mcu_add_bss_info(struct mt7996_phy *phy,
 		mt7996_mcu_bss_bmc_tlv(skb, vif, phy);
 		mt7996_mcu_bss_ra_tlv(skb, vif, phy);
 		mt7996_mcu_bss_txcmd_tlv(skb, true);
+		mt7996_mcu_bss_ifs_timing_tlv(skb, vif);
 
 		if (vif->bss_conf.he_support)
 			mt7996_mcu_bss_he_tlv(skb, vif, phy);
@@ -838,6 +867,23 @@ int mt7996_mcu_add_bss_info(struct mt7996_phy *phy,
 				     MCU_WMWA_UNI_CMD(BSS_INFO_UPDATE), true);
 }
 
+int mt7996_mcu_set_timing(struct mt7996_phy *phy, struct ieee80211_vif *vif)
+{
+	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
+	struct mt7996_dev *dev = phy->dev;
+	struct sk_buff *skb;
+
+	skb = __mt7996_mcu_alloc_bss_req(&dev->mt76, &mvif->mt76,
+					 MT7996_BSS_UPDATE_MAX_SIZE);
+	if (IS_ERR(skb))
+		return PTR_ERR(skb);
+
+	mt7996_mcu_bss_ifs_timing_tlv(skb, vif);
+
+	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
+				     MCU_WMWA_UNI_CMD(BSS_INFO_UPDATE), true);
+}
+
 static int
 mt7996_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
 		  struct ieee80211_ampdu_params *params,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h
index d7075a4d0667..078f82858621 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h
@@ -317,6 +317,22 @@ struct bss_sec_tlv {
 	u8 __rsv2[1];
 } __packed;
 
+struct bss_ifs_time_tlv {
+	__le16 tag;
+	__le16 len;
+	u8 slot_valid;
+	u8 sifs_valid;
+	u8 rifs_valid;
+	u8 eifs_valid;
+	__le16 slot_time;
+	__le16 sifs_time;
+	__le16 rifs_time;
+	__le16 eifs_time;
+	u8 eifs_cck_valid;
+	u8 rsv;
+	__le16 eifs_cck_time;
+} __packed;
+
 struct bss_power_save {
 	__le16 tag;
 	__le16 len;
@@ -552,6 +568,7 @@ enum {
 					 sizeof(struct bss_txcmd_tlv) +		\
 					 sizeof(struct bss_power_save) +	\
 					 sizeof(struct bss_sec_tlv) +		\
+					 sizeof(struct bss_ifs_time_tlv) +	\
 					 sizeof(struct bss_mld_tlv))
 
 #define MT7996_STA_UPDATE_MAX_SIZE	(sizeof(struct sta_req_hdr) +		\
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 7dfdc7384056..42892f06faa7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -463,6 +463,7 @@ int mt7996_mcu_set_radar_th(struct mt7996_dev *dev, int index,
 			    const struct mt7996_dfs_pattern *pattern);
 int mt7996_mcu_set_radio_en(struct mt7996_phy *phy, bool enable);
 int mt7996_mcu_set_rts_thresh(struct mt7996_phy *phy, u32 val);
+int mt7996_mcu_set_timing(struct mt7996_phy *phy, struct ieee80211_vif *vif);
 int mt7996_mcu_get_chan_mib_info(struct mt7996_phy *phy, bool chan_switch);
 int mt7996_mcu_rdd_cmd(struct mt7996_dev *dev, int cmd, u8 index,
 		       u8 rx_sel, u8 val);
@@ -526,7 +527,7 @@ void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
 			   struct sk_buff *skb, struct mt76_wcid *wcid,
 			   struct ieee80211_key_conf *key, int pid,
 			   enum mt76_txq_id qid, u32 changed);
-void mt7996_mac_set_timing(struct mt7996_phy *phy);
+void mt7996_mac_set_coverage_class(struct mt7996_phy *phy);
 int mt7996_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 		       struct ieee80211_sta *sta);
 void mt7996_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 07/10] wifi: mt76: mt7996: use correct phy for background radar event
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (4 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 06/10] wifi: mt76: connac: add support to set ifs time by mcu command Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 08/10] wifi: mt76: mt7996: fix WA event ring size Shayne Chen
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, StanleyYP Wang, Shayne Chen

From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>

If driver directly uses the band_idx reported from the radar event to
access mt76_phy array, it will get the wrong phy for background radar.
Fix this by adjusting the statement.

Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 7eafb5c44a7f..398d27d522ef 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -339,7 +339,11 @@ mt7996_mcu_rx_radar_detected(struct mt7996_dev *dev, struct sk_buff *skb)
 	if (r->band_idx >= ARRAY_SIZE(dev->mt76.phys))
 		return;
 
-	mphy = dev->mt76.phys[r->band_idx];
+	if (dev->rdd2_phy && r->band_idx == MT_RX_SEL2)
+		mphy = dev->rdd2_phy->mt76;
+	else
+		mphy = dev->mt76.phys[r->band_idx];
+
 	if (!mphy)
 		return;
 
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 08/10] wifi: mt76: mt7996: fix WA event ring size
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (5 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 07/10] wifi: mt76: mt7996: use correct phy for background radar event Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 09/10] wifi: mt76: mt7996: add muru support Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 10/10] wifi: mt76: mt7996: increase tx token size Shayne Chen
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, StanleyYP Wang, Shayne Chen

From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>

Fix rx ring size of WA event to get rid of event loss and queue overflow
problems.

Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/dma.c    | 2 +-
 drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
index 534143465d9b..fbedaacffbba 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
@@ -293,7 +293,7 @@ int mt7996_dma_init(struct mt7996_dev *dev)
 	/* event from WA */
 	ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
 			       MT_RXQ_ID(MT_RXQ_MCU_WA),
-			       MT7996_RX_MCU_RING_SIZE,
+			       MT7996_RX_MCU_RING_SIZE_WA,
 			       MT_RX_BUF_SIZE,
 			       MT_RXQ_RING_BASE(MT_RXQ_MCU_WA));
 	if (ret)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 42892f06faa7..a3bd85d3df25 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -26,6 +26,7 @@
 
 #define MT7996_RX_RING_SIZE		1536
 #define MT7996_RX_MCU_RING_SIZE		512
+#define MT7996_RX_MCU_RING_SIZE_WA	1024
 
 #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
 #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 09/10] wifi: mt76: mt7996: add muru support
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (6 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 08/10] wifi: mt76: mt7996: fix WA event ring size Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  2023-06-05  8:19 ` [PATCH v2 10/10] wifi: mt76: mt7996: increase tx token size Shayne Chen
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, MeiChia Chiu, MeiChia Chiu, Shayne Chen

From: MeiChia Chiu <MeiChia.Chiu@mediatek.com>

Add sta_rec_muru() fw command to support MU-MIMO and OFDMA features.

Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  3 +-
 .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 56 ++++++++++++++++++-
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index 3790d68525e5..48bced4e2e5d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -519,7 +519,8 @@ struct sta_rec_muru {
 		u8 uo_ra;
 		u8 he_2x996_tone;
 		u8 rx_t_frame_11ac;
-		u8 rsv[3];
+		u8 rx_ctrl_frame_to_mbss;
+		u8 rsv[2];
 	} ofdma_ul;
 
 	struct {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 398d27d522ef..1c5220741ae7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -1101,6 +1101,59 @@ mt7996_mcu_sta_amsdu_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
 	}
 }
 
+static void
+mt7996_mcu_sta_muru_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
+			struct ieee80211_vif *vif, struct ieee80211_sta *sta)
+{
+	struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
+	struct sta_rec_muru *muru;
+	struct tlv *tlv;
+
+	if (vif->type != NL80211_IFTYPE_STATION &&
+	    vif->type != NL80211_IFTYPE_AP)
+		return;
+
+	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
+
+	muru = (struct sta_rec_muru *)tlv;
+	muru->cfg.mimo_dl_en = vif->bss_conf.eht_mu_beamformer ||
+			       vif->bss_conf.he_mu_beamformer ||
+			       vif->bss_conf.vht_mu_beamformer ||
+			       vif->bss_conf.vht_mu_beamformee;
+	muru->cfg.ofdma_dl_en = true;
+
+	if (sta->deflink.vht_cap.vht_supported)
+		muru->mimo_dl.vht_mu_bfee =
+			!!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
+
+	if (!sta->deflink.he_cap.has_he)
+		return;
+
+	muru->mimo_dl.partial_bw_dl_mimo =
+		HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
+
+	muru->mimo_ul.full_ul_mimo =
+		HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
+	muru->mimo_ul.partial_ul_mimo =
+		HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
+
+	muru->ofdma_dl.punc_pream_rx =
+		HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
+	muru->ofdma_dl.he_20m_in_40m_2g =
+		HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
+	muru->ofdma_dl.he_20m_in_160m =
+		HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
+	muru->ofdma_dl.he_80m_in_160m =
+		HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
+
+	muru->ofdma_ul.t_frame_dur =
+		HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
+	muru->ofdma_ul.mu_cascading =
+		HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
+	muru->ofdma_ul.uo_ra =
+		HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
+}
+
 static inline bool
 mt7996_is_ebf_supported(struct mt7996_phy *phy, struct ieee80211_vif *vif,
 			struct ieee80211_sta *sta, bool bfee)
@@ -1778,7 +1831,8 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
 		mt7996_mcu_sta_he_6g_tlv(skb, sta);
 		/* starec eht */
 		mt7996_mcu_sta_eht_tlv(skb, sta);
-		/* TODO: starec muru */
+		/* starec muru */
+		mt7996_mcu_sta_muru_tlv(dev, skb, vif, sta);
 		/* starec bfee */
 		mt7996_mcu_sta_bfee_tlv(dev, skb, vif, sta);
 		/* starec hdr trans */
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 10/10] wifi: mt76: mt7996: increase tx token size
  2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
                   ` (7 preceding siblings ...)
  2023-06-05  8:19 ` [PATCH v2 09/10] wifi: mt76: mt7996: add muru support Shayne Chen
@ 2023-06-05  8:19 ` Shayne Chen
  8 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen @ 2023-06-05  8:19 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Howard Hsu, Shayne Chen

From: Howard Hsu <howard-yh.hsu@mediatek.com>

Align tx token size to proprietary driver, which can improve peak
throughput under MU performance tests.

Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index a3bd85d3df25..651f53aa0cca 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -36,7 +36,7 @@
 #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
 #define MT7996_EEPROM_SIZE		7680
 #define MT7996_EEPROM_BLOCK_SIZE	16
-#define MT7996_TOKEN_SIZE		8192
+#define MT7996_TOKEN_SIZE		16384
 
 #define MT7996_CFEND_RATE_DEFAULT	0x49	/* OFDM 24M */
 #define MT7996_CFEND_RATE_11B		0x03	/* 11B LP, 11M */
-- 
2.39.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
  2023-06-05  8:19 ` [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download Shayne Chen
@ 2023-06-05  8:38   ` Lorenzo Bianconi
  2023-06-05  9:33       ` shayne.chen
  0 siblings, 1 reply; 15+ messages in thread
From: Lorenzo Bianconi @ 2023-06-05  8:38 UTC (permalink / raw)
  To: Shayne Chen
  Cc: Felix Fietkau, linux-wireless, Ryder Lee, Evelyn Tsai, Bo Jiao,
	linux-mediatek, Peter Chiu

[-- Attachment #1: Type: text/plain, Size: 7388 bytes --]

> From: Peter Chiu <chui-hao.chiu@mediatek.com>
> 
> Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
> firmware download, which is for phy-related control.
> The firmware is transparent to the driver, but it's necessary for the
> firmware download process.
> 
> Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
> Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> ---
> v2:
>   - merge two commits:
>     - wifi: mt76: connac: add a setting bit for dsp firmware
>     - wifi: mt76: mt7996: add dsp firmware download
>   - move main code for loading ram to a regular function
> ---
>  .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
>  .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----------
>  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
>  .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
>  4 files changed, 43 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> index ca1ce97a6d2f..4a21c237ea6e 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> @@ -22,6 +22,7 @@
>  
>  #define FW_START_OVERRIDE		BIT(0)
>  #define FW_START_WORKING_PDA_CR4	BIT(2)
> +#define FW_START_WORKING_PDA_DSP	BIT(3)
>  
>  #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
>  #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> index 88e2f9d0e513..28930693a75a 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> @@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct mt7996_dev *dev)
>  static int
>  mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
>  			     const struct mt7996_fw_trailer *hdr,
> -			     const u8 *data, bool is_wa)
> +			     const u8 *data, enum mt7996_ram_type type)
>  {
>  	int i, offset = 0;
>  	u32 override = 0, option = 0;
> @@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
>  
>  		region = (const struct mt7996_fw_region *)((const u8 *)hdr -
>  			 (hdr->n_region - i) * sizeof(*region));
> +		/* DSP and WA use same mode */
>  		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
> -						   region->feature_set, is_wa);
> +						   region->feature_set,
> +						   type != MT7996_RAM_TYPE_WM);
>  		len = le32_to_cpu(region->len);
>  		addr = le32_to_cpu(region->addr);
>  
> @@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
>  	if (override)
>  		option |= FW_START_OVERRIDE;
>  
> -	if (is_wa)
> +	if (type == MT7996_RAM_TYPE_WA)
>  		option |= FW_START_WORKING_PDA_CR4;
> +	else if (type == MT7996_RAM_TYPE_DSP)
> +		option |= FW_START_WORKING_PDA_DSP;
>  
>  	return mt76_connac_mcu_start_firmware(&dev->mt76, override, option);
>  }
>  
> -static int mt7996_load_ram(struct mt7996_dev *dev)
> +static int __mt7996_load_ram(struct mt7996_dev *dev, const char *fw_type,
> +			     const char *fw_file, enum mt7996_ram_type ram_type)
>  {
>  	const struct mt7996_fw_trailer *hdr;
>  	const struct firmware *fw;
>  	int ret;
>  
> -	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
> +	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
>  	if (ret)
>  		return ret;
>  
> @@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
>  		goto out;
>  	}
>  
> -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size - sizeof(*hdr));
> -
> -	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
> -		 hdr->fw_ver, hdr->build_date);
> +	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
> +	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build Time: %.15s\n",
> +		 fw_type, hdr->fw_ver, hdr->build_date);
>  
> -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
> +	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, ram_type);
>  	if (ret) {
> -		dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
> +		dev_err(dev->mt76.dev, "Failed to start %s firmware\n", fw_type);
>  		goto out;
>  	}
>  
> +out:
>  	release_firmware(fw);
>  
> -	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
> -	if (ret)
> -		return ret;
> -
> -	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
> -		dev_err(dev->mt76.dev, "Invalid firmware\n");
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
> -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size - sizeof(*hdr));
> -
> -	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
> -		 hdr->fw_ver, hdr->build_date);
> +	return ret;
> +}
>  
> -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
> -	if (ret) {
> -		dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
> -		goto out;
> -	}
> +static int mt7996_load_ram(struct mt7996_dev *dev)
> +{
> +	int ret;
>  
> -	snprintf(dev->mt76.hw->wiphy->fw_version,
> -		 sizeof(dev->mt76.hw->wiphy->fw_version),
> -		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);

doing so we do not advertise fw version through ethtool as before.

> +#define LOAD_RAM(_type) \
> +	do {								\
> +		ret = __mt7996_load_ram(dev, #_type,			\
> +					MT7996_FIRMWARE_##_type,	\
> +					MT7996_RAM_TYPE_##_type);	\
> +		if (ret)						\
> +			return ret;					\
> +	} while (0)
>  
> -out:
> -	release_firmware(fw);
> +	LOAD_RAM(WM);
> +	LOAD_RAM(DSP);
> +	LOAD_RAM(WA);

can you please run the function directly instead of using macros?

Regards,
Lorenzo

> +#undef LOAD_RAM
>  
> -	return ret;
> +	return 0;
>  }
>  
>  static int
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> index 4d7dcb95a620..7dfdc7384056 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> @@ -29,6 +29,7 @@
>  
>  #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
>  #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
> +#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996_dsp.bin"
>  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
>  
>  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
> @@ -52,6 +53,12 @@ struct mt7996_sta;
>  struct mt7996_dfs_pulse;
>  struct mt7996_dfs_pattern;
>  
> +enum mt7996_ram_type {
> +	MT7996_RAM_TYPE_WM,
> +	MT7996_RAM_TYPE_WA,
> +	MT7996_RAM_TYPE_DSP,
> +};
> +
>  enum mt7996_txq_id {
>  	MT7996_TXQ_FWDL = 16,
>  	MT7996_TXQ_MCU_WM,
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> index 64aee3fb5445..c5301050ff8b 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> @@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci, mt7996_pci_device_table);
>  MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
>  MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
>  MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
> +MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
>  MODULE_FIRMWARE(MT7996_ROM_PATCH);
> -- 
> 2.39.2
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
  2023-06-05  8:38   ` Lorenzo Bianconi
@ 2023-06-05  9:33       ` shayne.chen
  0 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen (陳軒丞) @ 2023-06-05  9:33 UTC (permalink / raw)
  To: lorenzo@kernel.org
  Cc: linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org, nbd@nbd.name,
	Evelyn Tsai (蔡珊鈺), Ryder Lee,
	Bo Jiao (焦波),
	Chui-hao Chiu (邱垂浩)

On Mon, 2023-06-05 at 10:38 +0200, Lorenzo Bianconi wrote:
> > From: Peter Chiu <chui-hao.chiu@mediatek.com>
> > 
> > Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
> > firmware download, which is for phy-related control.
> > The firmware is transparent to the driver, but it's necessary for
> > the
> > firmware download process.
> > 
> > Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
> > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> > Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> > ---
> > v2:
> >   - merge two commits:
> >     - wifi: mt76: connac: add a setting bit for dsp firmware
> >     - wifi: mt76: mt7996: add dsp firmware download
> >   - move main code for loading ram to a regular function
> > ---
> >  .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
> >  .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----
> > ------
> >  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
> >  .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
> >  4 files changed, 43 insertions(+), 36 deletions(-)
> > 
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > index ca1ce97a6d2f..4a21c237ea6e 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > @@ -22,6 +22,7 @@
> >  
> >  #define FW_START_OVERRIDE		BIT(0)
> >  #define FW_START_WORKING_PDA_CR4	BIT(2)
> > +#define FW_START_WORKING_PDA_DSP	BIT(3)
> >  
> >  #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
> >  #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > index 88e2f9d0e513..28930693a75a 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > @@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct
> > mt7996_dev *dev)
> >  static int
> >  mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
> >  			     const struct mt7996_fw_trailer *hdr,
> > -			     const u8 *data, bool is_wa)
> > +			     const u8 *data, enum mt7996_ram_type type)
> >  {
> >  	int i, offset = 0;
> >  	u32 override = 0, option = 0;
> > @@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct
> > mt7996_dev *dev,
> >  
> >  		region = (const struct mt7996_fw_region *)((const u8
> > *)hdr -
> >  			 (hdr->n_region - i) * sizeof(*region));
> > +		/* DSP and WA use same mode */
> >  		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
> > -						   region->feature_set, 
> > is_wa);
> > +						   region->feature_set,
> > +						   type !=
> > MT7996_RAM_TYPE_WM);
> >  		len = le32_to_cpu(region->len);
> >  		addr = le32_to_cpu(region->addr);
> >  
> > @@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct
> > mt7996_dev *dev,
> >  	if (override)
> >  		option |= FW_START_OVERRIDE;
> >  
> > -	if (is_wa)
> > +	if (type == MT7996_RAM_TYPE_WA)
> >  		option |= FW_START_WORKING_PDA_CR4;
> > +	else if (type == MT7996_RAM_TYPE_DSP)
> > +		option |= FW_START_WORKING_PDA_DSP;
> >  
> >  	return mt76_connac_mcu_start_firmware(&dev->mt76, override,
> > option);
> >  }
> >  
> > -static int mt7996_load_ram(struct mt7996_dev *dev)
> > +static int __mt7996_load_ram(struct mt7996_dev *dev, const char
> > *fw_type,
> > +			     const char *fw_file, enum mt7996_ram_type
> > ram_type)
> >  {
> >  	const struct mt7996_fw_trailer *hdr;
> >  	const struct firmware *fw;
> >  	int ret;
> >  
> > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
> > +	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct
> > mt7996_dev *dev)
> >  		goto out;
> >  	}
> >  
> > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > sizeof(*hdr));
> > -
> > -	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > -		 hdr->fw_ver, hdr->build_date);
> > +	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
> > +	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > +		 fw_type, hdr->fw_ver, hdr->build_date);
> >  
> > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
> > +	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data,
> > ram_type);
> >  	if (ret) {
> > -		dev_err(dev->mt76.dev, "Failed to start WM
> > firmware\n");
> > +		dev_err(dev->mt76.dev, "Failed to start %s firmware\n",
> > fw_type);
> >  		goto out;
> >  	}
> >  
> > +out:
> >  	release_firmware(fw);
> >  
> > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
> > -	if (ret)
> > -		return ret;
> > -
> > -	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
> > -		dev_err(dev->mt76.dev, "Invalid firmware\n");
> > -		ret = -EINVAL;
> > -		goto out;
> > -	}
> > -
> > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > sizeof(*hdr));
> > -
> > -	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > -		 hdr->fw_ver, hdr->build_date);
> > +	return ret;
> > +}
> >  
> > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
> > -	if (ret) {
> > -		dev_err(dev->mt76.dev, "Failed to start WA
> > firmware\n");
> > -		goto out;
> > -	}
> > +static int mt7996_load_ram(struct mt7996_dev *dev)
> > +{
> > +	int ret;
> >  
> > -	snprintf(dev->mt76.hw->wiphy->fw_version,
> > -		 sizeof(dev->mt76.hw->wiphy->fw_version),
> > -		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
> 
> doing so we do not advertise fw version through ethtool as before.
> 
> > +#define LOAD_RAM(_type) \
> > +	do {								
> > \
> > +		ret = __mt7996_load_ram(dev, #_type,			
> > \
> > +					MT7996_FIRMWARE_##_type,	\
> > +					MT7996_RAM_TYPE_##_type);	\
> > +		if (ret)						\
> > +			return ret;					\
> > +	} while (0)
> >  
> > -out:
> > -	release_firmware(fw);
> > +	LOAD_RAM(WM);
> > +	LOAD_RAM(DSP);
> > +	LOAD_RAM(WA);
> 
> can you please run the function directly instead of using macros?
> 
> Regards,
> Lorenzo

Hi Lorenzo,

Will add 
> 
> > +#undef LOAD_RAM
> >  
> > -	return ret;
> > +	return 0;
> >  }
> >  
> >  static int
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > index 4d7dcb95a620..7dfdc7384056 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > @@ -29,6 +29,7 @@
> >  
> >  #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
> >  #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
> > +#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996
> > _dsp.bin"
> >  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_pat
> > ch.bin"
> >  
> >  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996
> > _eeprom.bin"
> > @@ -52,6 +53,12 @@ struct mt7996_sta;
> >  struct mt7996_dfs_pulse;
> >  struct mt7996_dfs_pattern;
> >  
> > +enum mt7996_ram_type {
> > +	MT7996_RAM_TYPE_WM,
> > +	MT7996_RAM_TYPE_WA,
> > +	MT7996_RAM_TYPE_DSP,
> > +};
> > +
> >  enum mt7996_txq_id {
> >  	MT7996_TXQ_FWDL = 16,
> >  	MT7996_TXQ_MCU_WM,
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > index 64aee3fb5445..c5301050ff8b 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > @@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci,
> > mt7996_pci_device_table);
> >  MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
> >  MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
> >  MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
> > +MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
> >  MODULE_FIRMWARE(MT7996_ROM_PATCH);
> > -- 
> > 2.39.2
> > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
@ 2023-06-05  9:33       ` shayne.chen
  0 siblings, 0 replies; 15+ messages in thread
From: shayne.chen @ 2023-06-05  9:33 UTC (permalink / raw)
  To: lorenzo@kernel.org
  Cc: linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org, nbd@nbd.name,
	Evelyn Tsai (蔡珊鈺), Ryder Lee,
	Bo Jiao (焦波),
	Chui-hao Chiu (邱垂浩)

On Mon, 2023-06-05 at 10:38 +0200, Lorenzo Bianconi wrote:
> > From: Peter Chiu <chui-hao.chiu@mediatek.com>
> > 
> > Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
> > firmware download, which is for phy-related control.
> > The firmware is transparent to the driver, but it's necessary for
> > the
> > firmware download process.
> > 
> > Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
> > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> > Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> > ---
> > v2:
> >   - merge two commits:
> >     - wifi: mt76: connac: add a setting bit for dsp firmware
> >     - wifi: mt76: mt7996: add dsp firmware download
> >   - move main code for loading ram to a regular function
> > ---
> >  .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
> >  .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----
> > ------
> >  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
> >  .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
> >  4 files changed, 43 insertions(+), 36 deletions(-)
> > 
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > index ca1ce97a6d2f..4a21c237ea6e 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > @@ -22,6 +22,7 @@
> >  
> >  #define FW_START_OVERRIDE		BIT(0)
> >  #define FW_START_WORKING_PDA_CR4	BIT(2)
> > +#define FW_START_WORKING_PDA_DSP	BIT(3)
> >  
> >  #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
> >  #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > index 88e2f9d0e513..28930693a75a 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > @@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct
> > mt7996_dev *dev)
> >  static int
> >  mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
> >  			     const struct mt7996_fw_trailer *hdr,
> > -			     const u8 *data, bool is_wa)
> > +			     const u8 *data, enum mt7996_ram_type type)
> >  {
> >  	int i, offset = 0;
> >  	u32 override = 0, option = 0;
> > @@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct
> > mt7996_dev *dev,
> >  
> >  		region = (const struct mt7996_fw_region *)((const u8
> > *)hdr -
> >  			 (hdr->n_region - i) * sizeof(*region));
> > +		/* DSP and WA use same mode */
> >  		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
> > -						   region->feature_set, 
> > is_wa);
> > +						   region->feature_set,
> > +						   type !=
> > MT7996_RAM_TYPE_WM);
> >  		len = le32_to_cpu(region->len);
> >  		addr = le32_to_cpu(region->addr);
> >  
> > @@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct
> > mt7996_dev *dev,
> >  	if (override)
> >  		option |= FW_START_OVERRIDE;
> >  
> > -	if (is_wa)
> > +	if (type == MT7996_RAM_TYPE_WA)
> >  		option |= FW_START_WORKING_PDA_CR4;
> > +	else if (type == MT7996_RAM_TYPE_DSP)
> > +		option |= FW_START_WORKING_PDA_DSP;
> >  
> >  	return mt76_connac_mcu_start_firmware(&dev->mt76, override,
> > option);
> >  }
> >  
> > -static int mt7996_load_ram(struct mt7996_dev *dev)
> > +static int __mt7996_load_ram(struct mt7996_dev *dev, const char
> > *fw_type,
> > +			     const char *fw_file, enum mt7996_ram_type
> > ram_type)
> >  {
> >  	const struct mt7996_fw_trailer *hdr;
> >  	const struct firmware *fw;
> >  	int ret;
> >  
> > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
> > +	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct
> > mt7996_dev *dev)
> >  		goto out;
> >  	}
> >  
> > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > sizeof(*hdr));
> > -
> > -	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > -		 hdr->fw_ver, hdr->build_date);
> > +	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
> > +	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > +		 fw_type, hdr->fw_ver, hdr->build_date);
> >  
> > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
> > +	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data,
> > ram_type);
> >  	if (ret) {
> > -		dev_err(dev->mt76.dev, "Failed to start WM
> > firmware\n");
> > +		dev_err(dev->mt76.dev, "Failed to start %s firmware\n",
> > fw_type);
> >  		goto out;
> >  	}
> >  
> > +out:
> >  	release_firmware(fw);
> >  
> > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
> > -	if (ret)
> > -		return ret;
> > -
> > -	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
> > -		dev_err(dev->mt76.dev, "Invalid firmware\n");
> > -		ret = -EINVAL;
> > -		goto out;
> > -	}
> > -
> > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > sizeof(*hdr));
> > -
> > -	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build
> > Time: %.15s\n",
> > -		 hdr->fw_ver, hdr->build_date);
> > +	return ret;
> > +}
> >  
> > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
> > -	if (ret) {
> > -		dev_err(dev->mt76.dev, "Failed to start WA
> > firmware\n");
> > -		goto out;
> > -	}
> > +static int mt7996_load_ram(struct mt7996_dev *dev)
> > +{
> > +	int ret;
> >  
> > -	snprintf(dev->mt76.hw->wiphy->fw_version,
> > -		 sizeof(dev->mt76.hw->wiphy->fw_version),
> > -		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
> 
> doing so we do not advertise fw version through ethtool as before.
> 
> > +#define LOAD_RAM(_type) \
> > +	do {								
> > \
> > +		ret = __mt7996_load_ram(dev, #_type,			
> > \
> > +					MT7996_FIRMWARE_##_type,	\
> > +					MT7996_RAM_TYPE_##_type);	\
> > +		if (ret)						\
> > +			return ret;					\
> > +	} while (0)
> >  
> > -out:
> > -	release_firmware(fw);
> > +	LOAD_RAM(WM);
> > +	LOAD_RAM(DSP);
> > +	LOAD_RAM(WA);
> 
> can you please run the function directly instead of using macros?
> 
> Regards,
> Lorenzo

Hi Lorenzo,

Will add 
> 
> > +#undef LOAD_RAM
> >  
> > -	return ret;
> > +	return 0;
> >  }
> >  
> >  static int
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > index 4d7dcb95a620..7dfdc7384056 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > @@ -29,6 +29,7 @@
> >  
> >  #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
> >  #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
> > +#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996
> > _dsp.bin"
> >  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_pat
> > ch.bin"
> >  
> >  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996
> > _eeprom.bin"
> > @@ -52,6 +53,12 @@ struct mt7996_sta;
> >  struct mt7996_dfs_pulse;
> >  struct mt7996_dfs_pattern;
> >  
> > +enum mt7996_ram_type {
> > +	MT7996_RAM_TYPE_WM,
> > +	MT7996_RAM_TYPE_WA,
> > +	MT7996_RAM_TYPE_DSP,
> > +};
> > +
> >  enum mt7996_txq_id {
> >  	MT7996_TXQ_FWDL = 16,
> >  	MT7996_TXQ_MCU_WM,
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > index 64aee3fb5445..c5301050ff8b 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > @@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci,
> > mt7996_pci_device_table);
> >  MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
> >  MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
> >  MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
> > +MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
> >  MODULE_FIRMWARE(MT7996_ROM_PATCH);
> > -- 
> > 2.39.2
> > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
  2023-06-05  9:33       ` shayne.chen
@ 2023-06-05  9:36         ` shayne.chen
  -1 siblings, 0 replies; 15+ messages in thread
From: Shayne Chen (陳軒丞) @ 2023-06-05  9:36 UTC (permalink / raw)
  To: lorenzo@kernel.org
  Cc: linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org, nbd@nbd.name,
	Evelyn Tsai (蔡珊鈺), Ryder Lee,
	Bo Jiao (焦波),
	Chui-hao Chiu (邱垂浩)

On Mon, 2023-06-05 at 17:33 +0800, Shayne Chen wrote:
> On Mon, 2023-06-05 at 10:38 +0200, Lorenzo Bianconi wrote:
> > > From: Peter Chiu <chui-hao.chiu@mediatek.com>
> > > 
> > > Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
> > > firmware download, which is for phy-related control.
> > > The firmware is transparent to the driver, but it's necessary for
> > > the
> > > firmware download process.
> > > 
> > > Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
> > > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> > > Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> > > ---
> > > v2:
> > >   - merge two commits:
> > >     - wifi: mt76: connac: add a setting bit for dsp firmware
> > >     - wifi: mt76: mt7996: add dsp firmware download
> > >   - move main code for loading ram to a regular function
> > > ---
> > >  .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
> > >  .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----
> > > ------
> > >  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
> > >  .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
> > >  4 files changed, 43 insertions(+), 36 deletions(-)
> > > 
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > index ca1ce97a6d2f..4a21c237ea6e 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > @@ -22,6 +22,7 @@
> > >  
> > >  #define FW_START_OVERRIDE		BIT(0)
> > >  #define FW_START_WORKING_PDA_CR4	BIT(2)
> > > +#define FW_START_WORKING_PDA_DSP	BIT(3)
> > >  
> > >  #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
> > >  #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > index 88e2f9d0e513..28930693a75a 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > @@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct
> > > mt7996_dev *dev)
> > >  static int
> > >  mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
> > >  			     const struct mt7996_fw_trailer *hdr,
> > > -			     const u8 *data, bool is_wa)
> > > +			     const u8 *data, enum mt7996_ram_type type)
> > >  {
> > >  	int i, offset = 0;
> > >  	u32 override = 0, option = 0;
> > > @@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct
> > > mt7996_dev *dev,
> > >  
> > >  		region = (const struct mt7996_fw_region *)((const u8
> > > *)hdr -
> > >  			 (hdr->n_region - i) * sizeof(*region));
> > > +		/* DSP and WA use same mode */
> > >  		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
> > > -						   region-
> > > >feature_set, 
> > > is_wa);
> > > +						   region->feature_set,
> > > +						   type !=
> > > MT7996_RAM_TYPE_WM);
> > >  		len = le32_to_cpu(region->len);
> > >  		addr = le32_to_cpu(region->addr);
> > >  
> > > @@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct
> > > mt7996_dev *dev,
> > >  	if (override)
> > >  		option |= FW_START_OVERRIDE;
> > >  
> > > -	if (is_wa)
> > > +	if (type == MT7996_RAM_TYPE_WA)
> > >  		option |= FW_START_WORKING_PDA_CR4;
> > > +	else if (type == MT7996_RAM_TYPE_DSP)
> > > +		option |= FW_START_WORKING_PDA_DSP;
> > >  
> > >  	return mt76_connac_mcu_start_firmware(&dev->mt76, override,
> > > option);
> > >  }
> > >  
> > > -static int mt7996_load_ram(struct mt7996_dev *dev)
> > > +static int __mt7996_load_ram(struct mt7996_dev *dev, const char
> > > *fw_type,
> > > +			     const char *fw_file, enum mt7996_ram_type
> > > ram_type)
> > >  {
> > >  	const struct mt7996_fw_trailer *hdr;
> > >  	const struct firmware *fw;
> > >  	int ret;
> > >  
> > > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
> > > +	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
> > >  	if (ret)
> > >  		return ret;
> > >  
> > > @@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct
> > > mt7996_dev *dev)
> > >  		goto out;
> > >  	}
> > >  
> > > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > > sizeof(*hdr));
> > > -
> > > -	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > -		 hdr->fw_ver, hdr->build_date);
> > > +	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
> > > +	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > +		 fw_type, hdr->fw_ver, hdr->build_date);
> > >  
> > > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
> > > +	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data,
> > > ram_type);
> > >  	if (ret) {
> > > -		dev_err(dev->mt76.dev, "Failed to start WM
> > > firmware\n");
> > > +		dev_err(dev->mt76.dev, "Failed to start %s firmware\n",
> > > fw_type);
> > >  		goto out;
> > >  	}
> > >  
> > > +out:
> > >  	release_firmware(fw);
> > >  
> > > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
> > > -		dev_err(dev->mt76.dev, "Invalid firmware\n");
> > > -		ret = -EINVAL;
> > > -		goto out;
> > > -	}
> > > -
> > > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > > sizeof(*hdr));
> > > -
> > > -	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > -		 hdr->fw_ver, hdr->build_date);
> > > +	return ret;
> > > +}
> > >  
> > > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
> > > -	if (ret) {
> > > -		dev_err(dev->mt76.dev, "Failed to start WA
> > > firmware\n");
> > > -		goto out;
> > > -	}
> > > +static int mt7996_load_ram(struct mt7996_dev *dev)
> > > +{
> > > +	int ret;
> > >  
> > > -	snprintf(dev->mt76.hw->wiphy->fw_version,
> > > -		 sizeof(dev->mt76.hw->wiphy->fw_version),
> > > -		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
> > 
> > doing so we do not advertise fw version through ethtool as before.
> > 
> > > +#define LOAD_RAM(_type) \
> > > +	do {								
> > > \
> > > +		ret = __mt7996_load_ram(dev, #_type,			
> > > \
> > > +					MT7996_FIRMWARE_##_type,	\
> > > +					MT7996_RAM_TYPE_##_type);	\
> > > +		if (ret)						\
> > > +			return ret;					\
> > > +	} while (0)
> > >  
> > > -out:
> > > -	release_firmware(fw);
> > > +	LOAD_RAM(WM);
> > > +	LOAD_RAM(DSP);
> > > +	LOAD_RAM(WA);
> > 
> > can you please run the function directly instead of using macros?
> > 
> > Regards,
> > Lorenzo
> 
> Hi Lorenzo,
> 
> Will add

(Sorry for accidentally pressing send)

Hi Lorenzo,

Will add back missing code for recording fw_version, and expand macros
to directly call load ram function.

Thanks,
Shayne
> > 
> > > +#undef LOAD_RAM
> > >  
> > > -	return ret;
> > > +	return 0;
> > >  }
> > >  
> > >  static int
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > index 4d7dcb95a620..7dfdc7384056 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > @@ -29,6 +29,7 @@
> > >  
> > >  #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996
> > > _wa.bin"
> > >  #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996
> > > _wm.bin"
> > > +#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996
> > > _dsp.bin"
> > >  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_pat
> > > ch.bin"
> > >  
> > >  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996
> > > _eeprom.bin"
> > > @@ -52,6 +53,12 @@ struct mt7996_sta;
> > >  struct mt7996_dfs_pulse;
> > >  struct mt7996_dfs_pattern;
> > >  
> > > +enum mt7996_ram_type {
> > > +	MT7996_RAM_TYPE_WM,
> > > +	MT7996_RAM_TYPE_WA,
> > > +	MT7996_RAM_TYPE_DSP,
> > > +};
> > > +
> > >  enum mt7996_txq_id {
> > >  	MT7996_TXQ_FWDL = 16,
> > >  	MT7996_TXQ_MCU_WM,
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > index 64aee3fb5445..c5301050ff8b 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > @@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci,
> > > mt7996_pci_device_table);
> > >  MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
> > >  MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
> > >  MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
> > > +MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
> > >  MODULE_FIRMWARE(MT7996_ROM_PATCH);
> > > -- 
> > > 2.39.2
> > > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download
@ 2023-06-05  9:36         ` shayne.chen
  0 siblings, 0 replies; 15+ messages in thread
From: shayne.chen @ 2023-06-05  9:36 UTC (permalink / raw)
  To: lorenzo@kernel.org
  Cc: linux-wireless@vger.kernel.org,
	linux-mediatek@lists.infradead.org, nbd@nbd.name,
	Evelyn Tsai (蔡珊鈺), Ryder Lee,
	Bo Jiao (焦波),
	Chui-hao Chiu (邱垂浩)

On Mon, 2023-06-05 at 17:33 +0800, Shayne Chen wrote:
> On Mon, 2023-06-05 at 10:38 +0200, Lorenzo Bianconi wrote:
> > > From: Peter Chiu <chui-hao.chiu@mediatek.com>
> > > 
> > > Add FW_START_WORKING_PDA_DSP for the indication of starting DSP
> > > firmware download, which is for phy-related control.
> > > The firmware is transparent to the driver, but it's necessary for
> > > the
> > > firmware download process.
> > > 
> > > Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
> > > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> > > Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> > > ---
> > > v2:
> > >   - merge two commits:
> > >     - wifi: mt76: connac: add a setting bit for dsp firmware
> > >     - wifi: mt76: mt7996: add dsp firmware download
> > >   - move main code for loading ram to a regular function
> > > ---
> > >  .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  1 +
> > >  .../net/wireless/mediatek/mt76/mt7996/mcu.c   | 70 +++++++++----
> > > ------
> > >  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  7 ++
> > >  .../net/wireless/mediatek/mt76/mt7996/pci.c   |  1 +
> > >  4 files changed, 43 insertions(+), 36 deletions(-)
> > > 
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > index ca1ce97a6d2f..4a21c237ea6e 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > > @@ -22,6 +22,7 @@
> > >  
> > >  #define FW_START_OVERRIDE		BIT(0)
> > >  #define FW_START_WORKING_PDA_CR4	BIT(2)
> > > +#define FW_START_WORKING_PDA_DSP	BIT(3)
> > >  
> > >  #define PATCH_SEC_NOT_SUPPORT		GENMASK(31, 0)
> > >  #define PATCH_SEC_TYPE_MASK		GENMASK(15, 0)
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > index 88e2f9d0e513..28930693a75a 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> > > @@ -2155,7 +2155,7 @@ static int mt7996_load_patch(struct
> > > mt7996_dev *dev)
> > >  static int
> > >  mt7996_mcu_send_ram_firmware(struct mt7996_dev *dev,
> > >  			     const struct mt7996_fw_trailer *hdr,
> > > -			     const u8 *data, bool is_wa)
> > > +			     const u8 *data, enum mt7996_ram_type type)
> > >  {
> > >  	int i, offset = 0;
> > >  	u32 override = 0, option = 0;
> > > @@ -2167,8 +2167,10 @@ mt7996_mcu_send_ram_firmware(struct
> > > mt7996_dev *dev,
> > >  
> > >  		region = (const struct mt7996_fw_region *)((const u8
> > > *)hdr -
> > >  			 (hdr->n_region - i) * sizeof(*region));
> > > +		/* DSP and WA use same mode */
> > >  		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
> > > -						   region-
> > > >feature_set, 
> > > is_wa);
> > > +						   region->feature_set,
> > > +						   type !=
> > > MT7996_RAM_TYPE_WM);
> > >  		len = le32_to_cpu(region->len);
> > >  		addr = le32_to_cpu(region->addr);
> > >  
> > > @@ -2195,19 +2197,22 @@ mt7996_mcu_send_ram_firmware(struct
> > > mt7996_dev *dev,
> > >  	if (override)
> > >  		option |= FW_START_OVERRIDE;
> > >  
> > > -	if (is_wa)
> > > +	if (type == MT7996_RAM_TYPE_WA)
> > >  		option |= FW_START_WORKING_PDA_CR4;
> > > +	else if (type == MT7996_RAM_TYPE_DSP)
> > > +		option |= FW_START_WORKING_PDA_DSP;
> > >  
> > >  	return mt76_connac_mcu_start_firmware(&dev->mt76, override,
> > > option);
> > >  }
> > >  
> > > -static int mt7996_load_ram(struct mt7996_dev *dev)
> > > +static int __mt7996_load_ram(struct mt7996_dev *dev, const char
> > > *fw_type,
> > > +			     const char *fw_file, enum mt7996_ram_type
> > > ram_type)
> > >  {
> > >  	const struct mt7996_fw_trailer *hdr;
> > >  	const struct firmware *fw;
> > >  	int ret;
> > >  
> > > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WM, dev->mt76.dev);
> > > +	ret = request_firmware(&fw, fw_file, dev->mt76.dev);
> > >  	if (ret)
> > >  		return ret;
> > >  
> > > @@ -2217,48 +2222,41 @@ static int mt7996_load_ram(struct
> > > mt7996_dev *dev)
> > >  		goto out;
> > >  	}
> > >  
> > > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > > sizeof(*hdr));
> > > -
> > > -	dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > -		 hdr->fw_ver, hdr->build_date);
> > > +	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
> > > +	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > +		 fw_type, hdr->fw_ver, hdr->build_date);
> > >  
> > > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, false);
> > > +	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data,
> > > ram_type);
> > >  	if (ret) {
> > > -		dev_err(dev->mt76.dev, "Failed to start WM
> > > firmware\n");
> > > +		dev_err(dev->mt76.dev, "Failed to start %s firmware\n",
> > > fw_type);
> > >  		goto out;
> > >  	}
> > >  
> > > +out:
> > >  	release_firmware(fw);
> > >  
> > > -	ret = request_firmware(&fw, MT7996_FIRMWARE_WA, dev->mt76.dev);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
> > > -		dev_err(dev->mt76.dev, "Invalid firmware\n");
> > > -		ret = -EINVAL;
> > > -		goto out;
> > > -	}
> > > -
> > > -	hdr = (const struct mt7996_fw_trailer *)(fw->data + fw->size -
> > > sizeof(*hdr));
> > > -
> > > -	dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build
> > > Time: %.15s\n",
> > > -		 hdr->fw_ver, hdr->build_date);
> > > +	return ret;
> > > +}
> > >  
> > > -	ret = mt7996_mcu_send_ram_firmware(dev, hdr, fw->data, true);
> > > -	if (ret) {
> > > -		dev_err(dev->mt76.dev, "Failed to start WA
> > > firmware\n");
> > > -		goto out;
> > > -	}
> > > +static int mt7996_load_ram(struct mt7996_dev *dev)
> > > +{
> > > +	int ret;
> > >  
> > > -	snprintf(dev->mt76.hw->wiphy->fw_version,
> > > -		 sizeof(dev->mt76.hw->wiphy->fw_version),
> > > -		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
> > 
> > doing so we do not advertise fw version through ethtool as before.
> > 
> > > +#define LOAD_RAM(_type) \
> > > +	do {								
> > > \
> > > +		ret = __mt7996_load_ram(dev, #_type,			
> > > \
> > > +					MT7996_FIRMWARE_##_type,	\
> > > +					MT7996_RAM_TYPE_##_type);	\
> > > +		if (ret)						\
> > > +			return ret;					\
> > > +	} while (0)
> > >  
> > > -out:
> > > -	release_firmware(fw);
> > > +	LOAD_RAM(WM);
> > > +	LOAD_RAM(DSP);
> > > +	LOAD_RAM(WA);
> > 
> > can you please run the function directly instead of using macros?
> > 
> > Regards,
> > Lorenzo
> 
> Hi Lorenzo,
> 
> Will add

(Sorry for accidentally pressing send)

Hi Lorenzo,

Will add back missing code for recording fw_version, and expand macros
to directly call load ram function.

Thanks,
Shayne
> > 
> > > +#undef LOAD_RAM
> > >  
> > > -	return ret;
> > > +	return 0;
> > >  }
> > >  
> > >  static int
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > index 4d7dcb95a620..7dfdc7384056 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> > > @@ -29,6 +29,7 @@
> > >  
> > >  #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996
> > > _wa.bin"
> > >  #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996
> > > _wm.bin"
> > > +#define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996
> > > _dsp.bin"
> > >  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_pat
> > > ch.bin"
> > >  
> > >  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996
> > > _eeprom.bin"
> > > @@ -52,6 +53,12 @@ struct mt7996_sta;
> > >  struct mt7996_dfs_pulse;
> > >  struct mt7996_dfs_pattern;
> > >  
> > > +enum mt7996_ram_type {
> > > +	MT7996_RAM_TYPE_WM,
> > > +	MT7996_RAM_TYPE_WA,
> > > +	MT7996_RAM_TYPE_DSP,
> > > +};
> > > +
> > >  enum mt7996_txq_id {
> > >  	MT7996_TXQ_FWDL = 16,
> > >  	MT7996_TXQ_MCU_WM,
> > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > index 64aee3fb5445..c5301050ff8b 100644
> > > --- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
> > > @@ -219,4 +219,5 @@ MODULE_DEVICE_TABLE(pci,
> > > mt7996_pci_device_table);
> > >  MODULE_DEVICE_TABLE(pci, mt7996_hif_device_table);
> > >  MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
> > >  MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
> > > +MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
> > >  MODULE_FIRMWARE(MT7996_ROM_PATCH);
> > > -- 
> > > 2.39.2
> > > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2023-06-05  9:36 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-05  8:19 [PATCH v2 01/10] wifi: mt76: mt7996: move radio ctrl commands to proper functions Shayne Chen
2023-06-05  8:19 ` [PATCH v2 02/10] wifi: mt76: connac: add support for dsp firmware download Shayne Chen
2023-06-05  8:38   ` Lorenzo Bianconi
2023-06-05  9:33     ` Shayne Chen (陳軒丞)
2023-06-05  9:33       ` shayne.chen
2023-06-05  9:36       ` Shayne Chen (陳軒丞)
2023-06-05  9:36         ` shayne.chen
2023-06-05  8:19 ` [PATCH v2 03/10] wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command Shayne Chen
2023-06-05  8:19 ` [PATCH v2 04/10] wifi: mt76: mt7996: init he and eht cap for AP_VLAN Shayne Chen
2023-06-05  8:19 ` [PATCH v2 05/10] wifi: mt76: mt7996: enable VHT extended NSS BW feature Shayne Chen
2023-06-05  8:19 ` [PATCH v2 06/10] wifi: mt76: connac: add support to set ifs time by mcu command Shayne Chen
2023-06-05  8:19 ` [PATCH v2 07/10] wifi: mt76: mt7996: use correct phy for background radar event Shayne Chen
2023-06-05  8:19 ` [PATCH v2 08/10] wifi: mt76: mt7996: fix WA event ring size Shayne Chen
2023-06-05  8:19 ` [PATCH v2 09/10] wifi: mt76: mt7996: add muru support Shayne Chen
2023-06-05  8:19 ` [PATCH v2 10/10] wifi: mt76: mt7996: increase tx token size Shayne Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.