mirror of
https://github.com/armbian/build.git
synced 2025-08-10 05:06:57 +02:00
* sunxi-6.0: initial state: add megous patches to series * sunxi-6.0: Switch to v6.0.1 * wifi: Limit the version 6.0 for Realtek 88x2cs chipsets * Adjust kernel configs * Remove not needed patches * Adjust broken patches Co-authored-by: Igor <igor@armbian.com>
125 lines
4.2 KiB
Diff
125 lines
4.2 KiB
Diff
From ed5f8c6d849af8d96d42d2d53c2d6d8f83347540 Mon Sep 17 00:00:00 2001
|
|
From: Ping-Ke Shih <pkshih@realtek.com>
|
|
Date: Thu, 8 Sep 2022 15:41:38 +0800
|
|
Subject: [PATCH 440/486] wifi: rtw89: configure TX path via H2C command
|
|
|
|
In order to support TX diversity, add a function to control TX path.
|
|
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
|
Link: https://lore.kernel.org/r/20220908074140.39776-4-pkshih@realtek.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw89/fw.c | 62 +++++++++++++++++++++----
|
|
drivers/net/wireless/realtek/rtw89/fw.h | 2 +
|
|
2 files changed, 56 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
|
index 6eece558b..7382ddcd2 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
|
@@ -917,15 +917,26 @@ int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
|
|
return -EBUSY;
|
|
}
|
|
|
|
+static void __rtw89_fw_h2c_set_tx_path(struct rtw89_dev *rtwdev,
|
|
+ struct sk_buff *skb)
|
|
+{
|
|
+ struct rtw89_hal *hal = &rtwdev->hal;
|
|
+ u8 ntx_path = hal->antenna_tx ? hal->antenna_tx : RF_B;
|
|
+ u8 map_b = hal->antenna_tx == RF_AB ? 1 : 0;
|
|
+
|
|
+ SET_CMC_TBL_NTX_PATH_EN(skb->data, ntx_path);
|
|
+ SET_CMC_TBL_PATH_MAP_A(skb->data, 0);
|
|
+ SET_CMC_TBL_PATH_MAP_B(skb->data, map_b);
|
|
+ SET_CMC_TBL_PATH_MAP_C(skb->data, 0);
|
|
+ SET_CMC_TBL_PATH_MAP_D(skb->data, 0);
|
|
+}
|
|
+
|
|
#define H2C_CMC_TBL_LEN 68
|
|
int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
struct rtw89_vif *rtwvif)
|
|
{
|
|
const struct rtw89_chip_info *chip = rtwdev->chip;
|
|
- struct rtw89_hal *hal = &rtwdev->hal;
|
|
struct sk_buff *skb;
|
|
- u8 ntx_path = hal->antenna_tx ? hal->antenna_tx : RF_B;
|
|
- u8 map_b = hal->antenna_tx == RF_AB ? 1 : 0;
|
|
u8 macid = rtwvif->mac_id;
|
|
|
|
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
|
|
@@ -938,11 +949,7 @@ int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
SET_CTRL_INFO_OPERATION(skb->data, 1);
|
|
if (chip->h2c_cctl_func_id == H2C_FUNC_MAC_CCTLINFO_UD) {
|
|
SET_CMC_TBL_TXPWR_MODE(skb->data, 0);
|
|
- SET_CMC_TBL_NTX_PATH_EN(skb->data, ntx_path);
|
|
- SET_CMC_TBL_PATH_MAP_A(skb->data, 0);
|
|
- SET_CMC_TBL_PATH_MAP_B(skb->data, map_b);
|
|
- SET_CMC_TBL_PATH_MAP_C(skb->data, 0);
|
|
- SET_CMC_TBL_PATH_MAP_D(skb->data, 0);
|
|
+ __rtw89_fw_h2c_set_tx_path(rtwdev, skb);
|
|
SET_CMC_TBL_ANTSEL_A(skb->data, 0);
|
|
SET_CMC_TBL_ANTSEL_B(skb->data, 0);
|
|
SET_CMC_TBL_ANTSEL_C(skb->data, 0);
|
|
@@ -1138,6 +1145,45 @@ int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
return -EBUSY;
|
|
}
|
|
|
|
+int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
+ struct rtw89_sta *rtwsta)
|
|
+{
|
|
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
|
+ struct sk_buff *skb;
|
|
+ int ret;
|
|
+
|
|
+ if (chip->h2c_cctl_func_id != H2C_FUNC_MAC_CCTLINFO_UD)
|
|
+ return 0;
|
|
+
|
|
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
|
|
+ if (!skb) {
|
|
+ rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ skb_put(skb, H2C_CMC_TBL_LEN);
|
|
+ SET_CTRL_INFO_MACID(skb->data, rtwsta->mac_id);
|
|
+ SET_CTRL_INFO_OPERATION(skb->data, 1);
|
|
+
|
|
+ __rtw89_fw_h2c_set_tx_path(rtwdev, skb);
|
|
+
|
|
+ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
|
+ H2C_CAT_MAC, H2C_CL_MAC_FR_EXCHG,
|
|
+ H2C_FUNC_MAC_CCTLINFO_UD, 0, 1,
|
|
+ H2C_CMC_TBL_LEN);
|
|
+
|
|
+ ret = rtw89_h2c_tx(rtwdev, skb, false);
|
|
+ if (ret) {
|
|
+ rtw89_err(rtwdev, "failed to send h2c\n");
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+fail:
|
|
+ dev_kfree_skb_any(skb);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
#define H2C_BCN_BASE_LEN 12
|
|
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
|
struct rtw89_vif *rtwvif)
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
|
|
index de70d012c..2746aacce 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/fw.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
|
|
@@ -2633,6 +2633,8 @@ int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
struct ieee80211_sta *sta);
|
|
int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
struct rtw89_sta *rtwsta);
|
|
+int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
|
|
+ struct rtw89_sta *rtwsta);
|
|
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
|
struct rtw89_vif *rtwvif);
|
|
int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *vif,
|
|
--
|
|
2.35.3
|
|
|