mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
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
This commit is contained in:
parent
dc229d944e
commit
5a8e06e49a
2 changed files with 56 additions and 8 deletions
|
@ -912,15 +912,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);
|
||||
|
@ -933,11 +944,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);
|
||||
|
@ -1133,6 +1140,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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue