Commit 9c66da3b authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

wifi: rtw89: rfk: add H2C command to trigger IQK

IQ signal calibration is a basic and important calibration to yield good RF
performance. Do this calibration on AP channel if we are going to connect.
During scanning phase, it transmits with low data rate, so without IQK
RF performance is still acceptable.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240202030642.108385-4-pkshih@realtek.com
parent 80f47f82
...@@ -4593,6 +4593,41 @@ int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev, ...@@ -4593,6 +4593,41 @@ int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
return ret; return ret;
} }
int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
{
struct rtw89_h2c_rf_iqk *h2c;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
int ret;
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for h2c RF IQK\n");
return -ENOMEM;
}
skb_put(skb, len);
h2c = (struct rtw89_h2c_rf_iqk *)skb->data;
h2c->phy_idx = cpu_to_le32(phy_idx);
h2c->dbcc = cpu_to_le32(rtwdev->dbcc_en);
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_OUTSRC, H2C_CL_OUTSRC_RF_FW_RFK,
H2C_FUNC_RFK_IQK_OFFLOAD, 0, 0, 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;
}
int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev, int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
u8 h2c_class, u8 h2c_func, u8 *buf, u16 len, u8 h2c_class, u8 h2c_func, u8 *buf, u16 len,
bool rack, bool dack) bool rack, bool dack)
......
...@@ -3935,6 +3935,7 @@ enum rtw89_mcc_h2c_func { ...@@ -3935,6 +3935,7 @@ enum rtw89_mcc_h2c_func {
#define H2C_CL_OUTSRC_RF_FW_RFK 0xb #define H2C_CL_OUTSRC_RF_FW_RFK 0xb
enum rtw89_rfk_offload_h2c_func { enum rtw89_rfk_offload_h2c_func {
H2C_FUNC_RFK_IQK_OFFLOAD = 0x1,
H2C_FUNC_RFK_PRE_NOTIFY = 0x8, H2C_FUNC_RFK_PRE_NOTIFY = 0x8,
}; };
...@@ -3982,6 +3983,11 @@ struct rtw89_fw_h2c_rfk_pre_info { ...@@ -3982,6 +3983,11 @@ struct rtw89_fw_h2c_rfk_pre_info {
} __packed mlo; } __packed mlo;
} __packed; } __packed;
struct rtw89_h2c_rf_iqk {
__le32 phy_idx;
__le32 dbcc;
} __packed;
enum rtw89_rf_log_type { enum rtw89_rf_log_type {
RTW89_RF_RUN_LOG = 0, RTW89_RF_RUN_LOG = 0,
RTW89_RF_RPT_LOG = 1, RTW89_RF_RPT_LOG = 1,
...@@ -4169,6 +4175,7 @@ int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev, ...@@ -4169,6 +4175,7 @@ int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev); int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev);
int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev, int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
enum rtw89_phy_idx phy_idx); enum rtw89_phy_idx phy_idx);
int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev, int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
u8 h2c_class, u8 h2c_func, u8 *buf, u16 len, u8 h2c_class, u8 h2c_func, u8 *buf, u16 len,
bool rack, bool dack); bool rack, bool dack);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment