mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
wifi: rtw89: rename rtw89_vif to rtw89_vif_link ahead for MLO
This is an intermediate version that is separated from subsequent major MLO changes, so some functions' namings are not really determined here. e.g. struct rtw89_vif_link *vif_to_rtwvif_safe(struct ieee80211_vif *vif) No logic is changed. Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20240916053158.47350-2-pkshih@realtek.com
This commit is contained in:
parent
3e5e4a801a
commit
2f7dae17c4
30 changed files with 1197 additions and 1133 deletions
|
@ -218,7 +218,7 @@ static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
bool inform_fw)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_addr_cam_entry *addr_cam;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
@ -228,8 +228,8 @@ static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta);
|
||||
|
||||
for_each_set_bit(i, addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM) {
|
||||
if (addr_cam->sec_ent[i] != sec_cam->sec_cam_idx)
|
||||
|
@ -239,11 +239,11 @@ static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
if (inform_fw) {
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta);
|
||||
if (ret)
|
||||
rtw89_err(rtwdev,
|
||||
"failed to update dctl cam del key: %d\n", ret);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret)
|
||||
rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret);
|
||||
}
|
||||
|
@ -258,7 +258,7 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
struct rtw89_sec_cam_entry *sec_cam)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_addr_cam_entry *addr_cam;
|
||||
u8 key_idx = 0;
|
||||
int ret;
|
||||
|
@ -268,8 +268,8 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta);
|
||||
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_WEP104)
|
||||
|
@ -285,13 +285,13 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
|||
addr_cam->sec_ent_keyid[key_idx] = key->keyidx;
|
||||
addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx;
|
||||
set_bit(key_idx, addr_cam->sec_cam_map);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n",
|
||||
ret);
|
||||
|
@ -485,10 +485,10 @@ void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
|
|||
clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map);
|
||||
}
|
||||
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, addr_cam);
|
||||
rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam);
|
||||
|
@ -593,7 +593,7 @@ static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam,
|
||||
const u8 *bssid)
|
||||
{
|
||||
|
@ -613,7 +613,7 @@ int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
bssid_cam->bssid_cam_idx = bssid_cam_idx;
|
||||
bssid_cam->phy_idx = rtwvif->phy_idx;
|
||||
bssid_cam->phy_idx = rtwvif_link->phy_idx;
|
||||
bssid_cam->len = BSSID_CAM_ENT_SIZE;
|
||||
bssid_cam->offset = 0;
|
||||
bssid_cam->valid = true;
|
||||
|
@ -622,20 +622,21 @@ int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
ether_addr_copy(bssid_cam->bssid, rtwvif->bssid);
|
||||
ether_addr_copy(bssid_cam->bssid, rtwvif_link->bssid);
|
||||
}
|
||||
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, rtwvif->bssid);
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam,
|
||||
rtwvif_link->bssid);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to init bssid cam\n");
|
||||
return ret;
|
||||
|
@ -651,11 +652,12 @@ int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
|||
}
|
||||
|
||||
int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta, u8 *cmd)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link,
|
||||
rtwsta);
|
||||
u8 bss_color = vif->bss_conf.he_bss_color.color;
|
||||
u8 bss_mask;
|
||||
|
||||
|
@ -694,19 +696,20 @@ static u8 rtw89_cam_addr_hash(u8 start, const u8 *addr)
|
|||
}
|
||||
|
||||
void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
const u8 *scan_mac_addr,
|
||||
u8 *cmd)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta);
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta_safe(rtwsta);
|
||||
const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif->mac_addr;
|
||||
const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif_link->mac_addr;
|
||||
u8 sma_hash, tma_hash, addr_msk_start;
|
||||
u8 sma_start = 0;
|
||||
u8 tma_start = 0;
|
||||
u8 *tma = sta ? sta->addr : rtwvif->bssid;
|
||||
u8 *tma = sta ? sta->addr : rtwvif_link->bssid;
|
||||
|
||||
if (addr_cam->addr_mask != 0) {
|
||||
addr_msk_start = __ffs(addr_cam->addr_mask);
|
||||
|
@ -723,10 +726,10 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
|||
FWCMD_SET_ADDR_LEN(cmd, addr_cam->len);
|
||||
|
||||
FWCMD_SET_ADDR_VALID(cmd, addr_cam->valid);
|
||||
FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif->net_type);
|
||||
FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif->bcn_hit_cond);
|
||||
FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif->hit_rule);
|
||||
FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif->phy_idx);
|
||||
FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif_link->net_type);
|
||||
FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif_link->bcn_hit_cond);
|
||||
FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif_link->hit_rule);
|
||||
FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif_link->phy_idx);
|
||||
FWCMD_SET_ADDR_ADDR_MASK(cmd, addr_cam->addr_mask);
|
||||
FWCMD_SET_ADDR_MASK_SEL(cmd, addr_cam->mask_sel);
|
||||
FWCMD_SET_ADDR_SMA_HASH(cmd, sma_hash);
|
||||
|
@ -748,20 +751,20 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
|||
FWCMD_SET_ADDR_TMA4(cmd, tma[4]);
|
||||
FWCMD_SET_ADDR_TMA5(cmd, tma[5]);
|
||||
|
||||
FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif->port);
|
||||
FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif->port);
|
||||
FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif->trigger);
|
||||
FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif->lsig_txop);
|
||||
FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif->tgt_ind);
|
||||
FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif->frm_tgt_ind);
|
||||
FWCMD_SET_ADDR_MACID(cmd, rtwsta ? rtwsta->mac_id : rtwvif->mac_id);
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_INFRA)
|
||||
FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif_link->port);
|
||||
FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif_link->port);
|
||||
FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif_link->trigger);
|
||||
FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif_link->lsig_txop);
|
||||
FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif_link->tgt_ind);
|
||||
FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif_link->frm_tgt_ind);
|
||||
FWCMD_SET_ADDR_MACID(cmd, rtwsta ? rtwsta->mac_id : rtwvif_link->mac_id);
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA)
|
||||
FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff);
|
||||
else if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
|
||||
else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE)
|
||||
FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0);
|
||||
FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif->wowlan_pattern);
|
||||
FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif->wowlan_uc);
|
||||
FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif->wowlan_magic);
|
||||
FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif_link->wowlan_pattern);
|
||||
FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif_link->wowlan_uc);
|
||||
FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif_link->wowlan_magic);
|
||||
FWCMD_SET_ADDR_WAPI(cmd, addr_cam->wapi);
|
||||
FWCMD_SET_ADDR_SEC_ENT_MODE(cmd, addr_cam->sec_ent_mode);
|
||||
FWCMD_SET_ADDR_SEC_ENT0_KEYID(cmd, addr_cam->sec_ent_keyid[0]);
|
||||
|
@ -783,15 +786,16 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_h2c_dctlinfo_ud_v1 *h2c)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
|
||||
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif_link->mac_id,
|
||||
DCTLINFO_V1_C0_MACID) |
|
||||
le32_encode_bits(1, DCTLINFO_V1_C0_OP);
|
||||
|
||||
|
@ -862,15 +866,16 @@ void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_h2c_dctlinfo_ud_v2 *h2c)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
|
||||
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif_link->mac_id,
|
||||
DCTLINFO_V2_C0_MACID) |
|
||||
le32_encode_bits(1, DCTLINFO_V2_C0_OP);
|
||||
|
||||
|
|
|
@ -526,33 +526,33 @@ struct rtw89_h2c_dctlinfo_ud_v2 {
|
|||
#define DCTLINFO_V2_W12_MLD_TA_BSSID_H_V1 GENMASK(15, 0)
|
||||
#define DCTLINFO_V2_W12_ALL GENMASK(15, 0)
|
||||
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_addr_cam_entry *addr_cam,
|
||||
const struct rtw89_bssid_cam_entry *bssid_cam);
|
||||
void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_addr_cam_entry *addr_cam);
|
||||
int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam,
|
||||
const u8 *bssid);
|
||||
void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam);
|
||||
void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *vif,
|
||||
struct rtw89_vif_link *vif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
const u8 *scan_mac_addr, u8 *cmd);
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_h2c_dctlinfo_ud_v1 *h2c);
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_h2c_dctlinfo_ud_v2 *h2c);
|
||||
int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta, u8 *cmd);
|
||||
int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
|
@ -564,6 +564,6 @@ int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_key_conf *key,
|
||||
bool inform_fw);
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev);
|
||||
#endif
|
||||
|
|
|
@ -239,7 +239,7 @@ static void rtw89_entity_calculate_weight(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chanctx_cfg *cfg;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
int idx;
|
||||
|
||||
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) {
|
||||
|
@ -254,8 +254,8 @@ static void rtw89_entity_calculate_weight(struct rtw89_dev *rtwdev,
|
|||
w->active_chanctxs++;
|
||||
}
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
if (rtwvif->chanctx_assigned)
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
if (rtwvif_link->chanctx_assigned)
|
||||
w->active_roles++;
|
||||
}
|
||||
}
|
||||
|
@ -387,9 +387,9 @@ int rtw89_iterate_mcc_roles(struct rtw89_dev *rtwdev,
|
|||
static u32 rtw89_mcc_get_tbtt_ofst(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mcc_role *role, u64 tsf)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = role->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = role->rtwvif_link;
|
||||
u32 bcn_intvl_us = ieee80211_tu_to_usec(role->beacon_interval);
|
||||
u64 sync_tsf = READ_ONCE(rtwvif->sync_bcn_tsf);
|
||||
u64 sync_tsf = READ_ONCE(rtwvif_link->sync_bcn_tsf);
|
||||
u32 remainder;
|
||||
|
||||
if (tsf < sync_tsf) {
|
||||
|
@ -413,8 +413,8 @@ static int __mcc_fw_req_tsf(struct rtw89_dev *rtwdev, u64 *tsf_ref, u64 *tsf_aux
|
|||
int ret;
|
||||
|
||||
req.group = mcc->group;
|
||||
req.macid_x = ref->rtwvif->mac_id;
|
||||
req.macid_y = aux->rtwvif->mac_id;
|
||||
req.macid_x = ref->rtwvif_link->mac_id;
|
||||
req.macid_y = aux->rtwvif_link->mac_id;
|
||||
ret = rtw89_fw_h2c_mcc_req_tsf(rtwdev, &req, &rpt);
|
||||
if (ret) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
|
@ -440,10 +440,10 @@ static int __mrc_fw_req_tsf(struct rtw89_dev *rtwdev, u64 *tsf_ref, u64 *tsf_aux
|
|||
BUILD_BUG_ON(RTW89_MAC_MRC_MAX_REQ_TSF_NUM < NUM_OF_RTW89_MCC_ROLES);
|
||||
|
||||
arg.num = 2;
|
||||
arg.infos[0].band = ref->rtwvif->mac_idx;
|
||||
arg.infos[0].port = ref->rtwvif->port;
|
||||
arg.infos[1].band = aux->rtwvif->mac_idx;
|
||||
arg.infos[1].port = aux->rtwvif->port;
|
||||
arg.infos[0].band = ref->rtwvif_link->mac_idx;
|
||||
arg.infos[0].port = ref->rtwvif_link->port;
|
||||
arg.infos[1].band = aux->rtwvif_link->mac_idx;
|
||||
arg.infos[1].port = aux->rtwvif_link->port;
|
||||
|
||||
ret = rtw89_fw_h2c_mrc_req_tsf(rtwdev, &arg, &rpt);
|
||||
if (ret) {
|
||||
|
@ -523,11 +523,11 @@ out:
|
|||
static void rtw89_mcc_role_macid_sta_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_mcc_role *mcc_role = data;
|
||||
struct rtw89_vif *target = mcc_role->rtwvif;
|
||||
struct rtw89_vif_link *target = mcc_role->rtwvif_link;
|
||||
|
||||
if (rtwvif != target)
|
||||
if (rtwvif_link != target)
|
||||
return;
|
||||
|
||||
rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwsta->mac_id);
|
||||
|
@ -536,9 +536,9 @@ static void rtw89_mcc_role_macid_sta_iter(void *data, struct ieee80211_sta *sta)
|
|||
static void rtw89_mcc_fill_role_macid_bitmap(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mcc_role *mcc_role)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = mcc_role->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = mcc_role->rtwvif_link;
|
||||
|
||||
rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwvif->mac_id);
|
||||
rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwvif_link->mac_id);
|
||||
ieee80211_iterate_stations_atomic(rtwdev->hw,
|
||||
rtw89_mcc_role_macid_sta_iter,
|
||||
mcc_role);
|
||||
|
@ -564,7 +564,7 @@ static void rtw89_mcc_fill_role_policy(struct rtw89_dev *rtwdev,
|
|||
static void rtw89_mcc_fill_role_limit(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mcc_role *mcc_role)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(mcc_role->rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(mcc_role->rtwvif_link);
|
||||
struct ieee80211_p2p_noa_desc *noa_desc;
|
||||
u32 bcn_intvl_us = ieee80211_tu_to_usec(mcc_role->beacon_interval);
|
||||
u32 max_toa_us, max_tob_us, max_dur_us;
|
||||
|
@ -597,7 +597,7 @@ fill:
|
|||
return;
|
||||
}
|
||||
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, mcc_role->rtwvif, &tsf);
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, mcc_role->rtwvif_link, &tsf);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "MCC failed to get port tsf: %d\n", ret);
|
||||
return;
|
||||
|
@ -632,14 +632,14 @@ fill:
|
|||
}
|
||||
|
||||
static int rtw89_mcc_fill_role(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_mcc_role *role)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
const struct rtw89_chan *chan;
|
||||
|
||||
memset(role, 0, sizeof(*role));
|
||||
role->rtwvif = rtwvif;
|
||||
role->rtwvif_link = rtwvif_link;
|
||||
role->beacon_interval = vif->bss_conf.beacon_int;
|
||||
|
||||
if (!role->beacon_interval) {
|
||||
|
@ -650,10 +650,10 @@ static int rtw89_mcc_fill_role(struct rtw89_dev *rtwdev,
|
|||
|
||||
role->duration = role->beacon_interval / 2;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
role->is_2ghz = chan->band_type == RTW89_BAND_2G;
|
||||
role->is_go = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_GO;
|
||||
role->is_gc = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT;
|
||||
role->is_go = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_GO;
|
||||
role->is_gc = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT;
|
||||
|
||||
rtw89_mcc_fill_role_macid_bitmap(rtwdev, role);
|
||||
rtw89_mcc_fill_role_policy(rtwdev, role);
|
||||
|
@ -678,7 +678,7 @@ static void rtw89_mcc_fill_bt_role(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
struct rtw89_mcc_fill_role_selector {
|
||||
struct rtw89_vif *bind_vif[NUM_OF_RTW89_CHANCTX];
|
||||
struct rtw89_vif_link *bind_vif[NUM_OF_RTW89_CHANCTX];
|
||||
};
|
||||
|
||||
static_assert((u8)NUM_OF_RTW89_CHANCTX >= NUM_OF_RTW89_MCC_ROLES);
|
||||
|
@ -689,7 +689,7 @@ static int rtw89_mcc_fill_role_iterator(struct rtw89_dev *rtwdev,
|
|||
void *data)
|
||||
{
|
||||
struct rtw89_mcc_fill_role_selector *sel = data;
|
||||
struct rtw89_vif *role_vif = sel->bind_vif[ordered_idx];
|
||||
struct rtw89_vif_link *role_vif = sel->bind_vif[ordered_idx];
|
||||
int ret;
|
||||
|
||||
if (!role_vif) {
|
||||
|
@ -712,21 +712,21 @@ static int rtw89_mcc_fill_role_iterator(struct rtw89_dev *rtwdev,
|
|||
static int rtw89_mcc_fill_all_roles(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_mcc_fill_role_selector sel = {};
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
int ret;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
if (!rtwvif->chanctx_assigned)
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
if (!rtwvif_link->chanctx_assigned)
|
||||
continue;
|
||||
|
||||
if (sel.bind_vif[rtwvif->chanctx_idx]) {
|
||||
if (sel.bind_vif[rtwvif_link->chanctx_idx]) {
|
||||
rtw89_warn(rtwdev,
|
||||
"MCC skip extra vif <macid %d> on chanctx[%d]\n",
|
||||
rtwvif->mac_id, rtwvif->chanctx_idx);
|
||||
rtwvif_link->mac_id, rtwvif_link->chanctx_idx);
|
||||
continue;
|
||||
}
|
||||
|
||||
sel.bind_vif[rtwvif->chanctx_idx] = rtwvif;
|
||||
sel.bind_vif[rtwvif_link->chanctx_idx] = rtwvif_link;
|
||||
}
|
||||
|
||||
ret = rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_fill_role_iterator, &sel);
|
||||
|
@ -754,13 +754,13 @@ static void rtw89_mcc_assign_pattern(struct rtw89_dev *rtwdev,
|
|||
memset(&pattern->courtesy, 0, sizeof(pattern->courtesy));
|
||||
|
||||
if (pattern->tob_aux <= 0 || pattern->toa_aux <= 0) {
|
||||
pattern->courtesy.macid_tgt = aux->rtwvif->mac_id;
|
||||
pattern->courtesy.macid_src = ref->rtwvif->mac_id;
|
||||
pattern->courtesy.macid_tgt = aux->rtwvif_link->mac_id;
|
||||
pattern->courtesy.macid_src = ref->rtwvif_link->mac_id;
|
||||
pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
|
||||
pattern->courtesy.enable = true;
|
||||
} else if (pattern->tob_ref <= 0 || pattern->toa_ref <= 0) {
|
||||
pattern->courtesy.macid_tgt = ref->rtwvif->mac_id;
|
||||
pattern->courtesy.macid_src = aux->rtwvif->mac_id;
|
||||
pattern->courtesy.macid_tgt = ref->rtwvif_link->mac_id;
|
||||
pattern->courtesy.macid_src = aux->rtwvif_link->mac_id;
|
||||
pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
|
||||
pattern->courtesy.enable = true;
|
||||
}
|
||||
|
@ -1263,7 +1263,7 @@ static void rtw89_mcc_sync_tbtt(struct rtw89_dev *rtwdev,
|
|||
u64 tsf_src;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, src->rtwvif, &tsf_src);
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, src->rtwvif_link, &tsf_src);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "MCC failed to get port tsf: %d\n", ret);
|
||||
return;
|
||||
|
@ -1280,12 +1280,12 @@ static void rtw89_mcc_sync_tbtt(struct rtw89_dev *rtwdev,
|
|||
div_u64_rem(tbtt_tgt, bcn_intvl_src_us, &remainder);
|
||||
tsf_ofst_tgt = bcn_intvl_src_us - remainder;
|
||||
|
||||
config->sync.macid_tgt = tgt->rtwvif->mac_id;
|
||||
config->sync.band_tgt = tgt->rtwvif->mac_idx;
|
||||
config->sync.port_tgt = tgt->rtwvif->port;
|
||||
config->sync.macid_src = src->rtwvif->mac_id;
|
||||
config->sync.band_src = src->rtwvif->mac_idx;
|
||||
config->sync.port_src = src->rtwvif->port;
|
||||
config->sync.macid_tgt = tgt->rtwvif_link->mac_id;
|
||||
config->sync.band_tgt = tgt->rtwvif_link->mac_idx;
|
||||
config->sync.port_tgt = tgt->rtwvif_link->port;
|
||||
config->sync.macid_src = src->rtwvif_link->mac_id;
|
||||
config->sync.band_src = src->rtwvif_link->mac_idx;
|
||||
config->sync.port_src = src->rtwvif_link->port;
|
||||
config->sync.offset = tsf_ofst_tgt / 1024;
|
||||
config->sync.enable = true;
|
||||
|
||||
|
@ -1294,7 +1294,7 @@ static void rtw89_mcc_sync_tbtt(struct rtw89_dev *rtwdev,
|
|||
config->sync.macid_tgt, config->sync.macid_src,
|
||||
config->sync.offset);
|
||||
|
||||
rtw89_mac_port_tsf_sync(rtwdev, tgt->rtwvif, src->rtwvif,
|
||||
rtw89_mac_port_tsf_sync(rtwdev, tgt->rtwvif_link, src->rtwvif_link,
|
||||
config->sync.offset);
|
||||
}
|
||||
|
||||
|
@ -1305,13 +1305,13 @@ static int rtw89_mcc_fill_start_tsf(struct rtw89_dev *rtwdev)
|
|||
struct rtw89_mcc_config *config = &mcc->config;
|
||||
u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval);
|
||||
u32 tob_ref_us = ieee80211_tu_to_usec(config->pattern.tob_ref);
|
||||
struct rtw89_vif *rtwvif = ref->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = ref->rtwvif_link;
|
||||
u64 tsf, start_tsf;
|
||||
u32 cur_tbtt_ofst;
|
||||
u64 min_time;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, rtwvif, &tsf);
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, rtwvif_link, &tsf);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "MCC failed to get port tsf: %d\n", ret);
|
||||
return ret;
|
||||
|
@ -1390,13 +1390,13 @@ static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *ro
|
|||
const struct rtw89_chan *chan;
|
||||
int ret;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->chanctx_idx);
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx);
|
||||
req.central_ch_seg0 = chan->channel;
|
||||
req.primary_ch = chan->primary_channel;
|
||||
req.bandwidth = chan->band_width;
|
||||
req.ch_band_type = chan->band_type;
|
||||
|
||||
req.macid = role->rtwvif->mac_id;
|
||||
req.macid = role->rtwvif_link->mac_id;
|
||||
req.group = mcc->group;
|
||||
req.c2h_rpt = policy->c2h_rpt;
|
||||
req.tx_null_early = policy->tx_null_early;
|
||||
|
@ -1421,7 +1421,7 @@ static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *ro
|
|||
}
|
||||
|
||||
ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group,
|
||||
role->rtwvif->mac_id,
|
||||
role->rtwvif_link->mac_id,
|
||||
role->macid_bitmap);
|
||||
if (ret) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
|
@ -1448,7 +1448,7 @@ void __mrc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role,
|
|||
slot_arg->duration = role->duration;
|
||||
slot_arg->role_num = 1;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->chanctx_idx);
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx);
|
||||
|
||||
slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_WIFI;
|
||||
slot_arg->roles[0].is_master = role == ref;
|
||||
|
@ -1458,7 +1458,7 @@ void __mrc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role,
|
|||
slot_arg->roles[0].primary_ch = chan->primary_channel;
|
||||
slot_arg->roles[0].en_tx_null = !policy->dis_tx_null;
|
||||
slot_arg->roles[0].null_early = policy->tx_null_early;
|
||||
slot_arg->roles[0].macid = role->rtwvif->mac_id;
|
||||
slot_arg->roles[0].macid = role->rtwvif_link->mac_id;
|
||||
slot_arg->roles[0].macid_main_bitmap =
|
||||
rtw89_mcc_role_fw_macid_bitmap_to_u32(role);
|
||||
}
|
||||
|
@ -1569,7 +1569,7 @@ static int __mcc_fw_start(struct rtw89_dev *rtwdev, bool replace)
|
|||
}
|
||||
}
|
||||
|
||||
req.macid = ref->rtwvif->mac_id;
|
||||
req.macid = ref->rtwvif_link->mac_id;
|
||||
req.tsf_high = config->start_tsf >> 32;
|
||||
req.tsf_low = config->start_tsf;
|
||||
|
||||
|
@ -1598,7 +1598,7 @@ static void __mrc_fw_add_courtesy(struct rtw89_dev *rtwdev,
|
|||
if (!courtesy->enable)
|
||||
return;
|
||||
|
||||
if (courtesy->macid_src == ref->rtwvif->mac_id) {
|
||||
if (courtesy->macid_src == ref->rtwvif_link->mac_id) {
|
||||
slot_arg_src = &arg->slots[ref->slot_idx];
|
||||
slot_idx_tgt = aux->slot_idx;
|
||||
} else {
|
||||
|
@ -1717,9 +1717,9 @@ static int __mcc_fw_set_duration_no_bt(struct rtw89_dev *rtwdev, bool sync_chang
|
|||
struct rtw89_fw_mcc_duration req = {
|
||||
.group = mcc->group,
|
||||
.btc_in_group = false,
|
||||
.start_macid = ref->rtwvif->mac_id,
|
||||
.macid_x = ref->rtwvif->mac_id,
|
||||
.macid_y = aux->rtwvif->mac_id,
|
||||
.start_macid = ref->rtwvif_link->mac_id,
|
||||
.macid_x = ref->rtwvif_link->mac_id,
|
||||
.macid_y = aux->rtwvif_link->mac_id,
|
||||
.duration_x = ref->duration,
|
||||
.duration_y = aux->duration,
|
||||
.start_tsf_high = config->start_tsf >> 32,
|
||||
|
@ -1813,18 +1813,18 @@ static void rtw89_mcc_handle_beacon_noa(struct rtw89_dev *rtwdev, bool enable)
|
|||
struct ieee80211_p2p_noa_desc noa_desc = {};
|
||||
u64 start_time = config->start_tsf;
|
||||
u32 interval = config->mcc_interval;
|
||||
struct rtw89_vif *rtwvif_go;
|
||||
struct rtw89_vif_link *rtwvif_go;
|
||||
u32 duration;
|
||||
|
||||
if (mcc->mode != RTW89_MCC_MODE_GO_STA)
|
||||
return;
|
||||
|
||||
if (ref->is_go) {
|
||||
rtwvif_go = ref->rtwvif;
|
||||
rtwvif_go = ref->rtwvif_link;
|
||||
start_time += ieee80211_tu_to_usec(ref->duration);
|
||||
duration = config->mcc_interval - ref->duration;
|
||||
} else if (aux->is_go) {
|
||||
rtwvif_go = aux->rtwvif;
|
||||
rtwvif_go = aux->rtwvif_link;
|
||||
start_time += ieee80211_tu_to_usec(pattern->tob_ref) +
|
||||
ieee80211_tu_to_usec(config->beacon_offset) +
|
||||
ieee80211_tu_to_usec(pattern->toa_aux);
|
||||
|
@ -1865,9 +1865,9 @@ static void rtw89_mcc_start_beacon_noa(struct rtw89_dev *rtwdev)
|
|||
return;
|
||||
|
||||
if (ref->is_go)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif, true);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, true);
|
||||
else if (aux->is_go)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif, true);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, true);
|
||||
|
||||
rtw89_mcc_handle_beacon_noa(rtwdev, true);
|
||||
}
|
||||
|
@ -1882,9 +1882,9 @@ static void rtw89_mcc_stop_beacon_noa(struct rtw89_dev *rtwdev)
|
|||
return;
|
||||
|
||||
if (ref->is_go)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif, false);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, false);
|
||||
else if (aux->is_go)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif, false);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, false);
|
||||
|
||||
rtw89_mcc_handle_beacon_noa(rtwdev, false);
|
||||
}
|
||||
|
@ -1942,7 +1942,7 @@ struct rtw89_mcc_stop_sel {
|
|||
static void rtw89_mcc_stop_sel_fill(struct rtw89_mcc_stop_sel *sel,
|
||||
const struct rtw89_mcc_role *mcc_role)
|
||||
{
|
||||
sel->mac_id = mcc_role->rtwvif->mac_id;
|
||||
sel->mac_id = mcc_role->rtwvif_link->mac_id;
|
||||
sel->slot_idx = mcc_role->slot_idx;
|
||||
}
|
||||
|
||||
|
@ -1953,7 +1953,7 @@ static int rtw89_mcc_stop_sel_iterator(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
struct rtw89_mcc_stop_sel *sel = data;
|
||||
|
||||
if (!mcc_role->rtwvif->chanctx_assigned)
|
||||
if (!mcc_role->rtwvif_link->chanctx_assigned)
|
||||
return 0;
|
||||
|
||||
rtw89_mcc_stop_sel_fill(sel, mcc_role);
|
||||
|
@ -2081,7 +2081,7 @@ static int __mcc_fw_upd_macid_bitmap(struct rtw89_dev *rtwdev,
|
|||
int ret;
|
||||
|
||||
ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group,
|
||||
upd->rtwvif->mac_id,
|
||||
upd->rtwvif_link->mac_id,
|
||||
upd->macid_bitmap);
|
||||
if (ret) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
|
@ -2106,7 +2106,7 @@ static int __mrc_fw_upd_macid_bitmap(struct rtw89_dev *rtwdev,
|
|||
int i;
|
||||
|
||||
arg.sch_idx = mcc->group;
|
||||
arg.macid = upd->rtwvif->mac_id;
|
||||
arg.macid = upd->rtwvif_link->mac_id;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (add & BIT(i)) {
|
||||
|
@ -2144,7 +2144,7 @@ static int rtw89_mcc_upd_map_iterator(struct rtw89_dev *rtwdev,
|
|||
void *data)
|
||||
{
|
||||
struct rtw89_mcc_role upd = {
|
||||
.rtwvif = mcc_role->rtwvif,
|
||||
.rtwvif_link = mcc_role->rtwvif_link,
|
||||
};
|
||||
int ret;
|
||||
|
||||
|
@ -2375,7 +2375,7 @@ static void rtw89_swap_chanctx(struct rtw89_dev *rtwdev,
|
|||
enum rtw89_chanctx_idx idx2)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
u8 cur;
|
||||
|
||||
if (idx1 == idx2)
|
||||
|
@ -2386,13 +2386,13 @@ static void rtw89_swap_chanctx(struct rtw89_dev *rtwdev,
|
|||
|
||||
swap(hal->chanctx[idx1], hal->chanctx[idx2]);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
if (!rtwvif->chanctx_assigned)
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
if (!rtwvif_link->chanctx_assigned)
|
||||
continue;
|
||||
if (rtwvif->chanctx_idx == idx1)
|
||||
rtwvif->chanctx_idx = idx2;
|
||||
else if (rtwvif->chanctx_idx == idx2)
|
||||
rtwvif->chanctx_idx = idx1;
|
||||
if (rtwvif_link->chanctx_idx == idx1)
|
||||
rtwvif_link->chanctx_idx = idx2;
|
||||
else if (rtwvif_link->chanctx_idx == idx2)
|
||||
rtwvif_link->chanctx_idx = idx1;
|
||||
}
|
||||
|
||||
cur = atomic_read(&hal->roc_chanctx_idx);
|
||||
|
@ -2444,14 +2444,14 @@ void rtw89_chanctx_ops_change(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv;
|
||||
struct rtw89_entity_weight w = {};
|
||||
|
||||
rtwvif->chanctx_idx = cfg->idx;
|
||||
rtwvif->chanctx_assigned = true;
|
||||
rtwvif_link->chanctx_idx = cfg->idx;
|
||||
rtwvif_link->chanctx_assigned = true;
|
||||
cfg->ref_count++;
|
||||
|
||||
if (cfg->idx == RTW89_CHANCTX_0)
|
||||
|
@ -2469,7 +2469,7 @@ out:
|
|||
}
|
||||
|
||||
void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv;
|
||||
|
@ -2479,8 +2479,8 @@ void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
|
|||
enum rtw89_entity_mode new;
|
||||
int ret;
|
||||
|
||||
rtwvif->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif->chanctx_assigned = false;
|
||||
rtwvif_link->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif_link->chanctx_assigned = false;
|
||||
cfg->ref_count--;
|
||||
|
||||
if (cfg->ref_count != 0)
|
||||
|
|
|
@ -106,10 +106,10 @@ void rtw89_chanctx_ops_change(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_chanctx_conf *ctx,
|
||||
u32 changed);
|
||||
int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4995,12 +4995,12 @@ static void rtw89_tx_time_iter(void *data, struct ieee80211_sta *sta)
|
|||
struct rtw89_txtime_data *iter_data =
|
||||
(struct rtw89_txtime_data *)data;
|
||||
struct rtw89_dev *rtwdev = iter_data->rtwdev;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_btc *btc = &rtwdev->btc;
|
||||
struct rtw89_btc_cx *cx = &btc->cx;
|
||||
struct rtw89_btc_wl_info *wl = &cx->wl;
|
||||
struct rtw89_btc_wl_link_info *plink = NULL;
|
||||
u8 port = rtwvif->port;
|
||||
u8 port = rtwvif_link->port;
|
||||
u32 tx_time = iter_data->tx_time;
|
||||
u8 tx_retry = iter_data->tx_retry;
|
||||
u16 enable = iter_data->enable;
|
||||
|
@ -7479,12 +7479,13 @@ static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
|
|||
_run_coex(rtwdev, BTC_RSN_UPDATE_BT_INFO);
|
||||
}
|
||||
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta, enum btc_role_state state)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
rtwvif_link->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta);
|
||||
struct rtw89_btc *btc = &rtwdev->btc;
|
||||
const struct rtw89_btc_ver *ver = btc->ver;
|
||||
|
@ -7497,7 +7498,7 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
|||
rtw89_debug(rtwdev, RTW89_DBG_BTC,
|
||||
"[BTC], role is STA=%d\n",
|
||||
vif->type == NL80211_IFTYPE_STATION);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], port=%d\n", rtwvif->port);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], port=%d\n", rtwvif_link->port);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], band=%d ch=%d bw=%d\n",
|
||||
chan->band_type, chan->channel, chan->band_width);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], associated=%d\n",
|
||||
|
@ -7525,15 +7526,15 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
|||
r.mode = mode;
|
||||
}
|
||||
|
||||
if (rtwvif->wifi_role >= RTW89_WIFI_ROLE_MLME_MAX)
|
||||
if (rtwvif_link->wifi_role >= RTW89_WIFI_ROLE_MLME_MAX)
|
||||
return;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC,
|
||||
"[BTC], wifi_role=%d\n", rtwvif->wifi_role);
|
||||
"[BTC], wifi_role=%d\n", rtwvif_link->wifi_role);
|
||||
|
||||
r.role = rtwvif->wifi_role;
|
||||
r.phy = rtwvif->phy_idx;
|
||||
r.pid = rtwvif->port;
|
||||
r.role = rtwvif_link->wifi_role;
|
||||
r.phy = rtwvif_link->phy_idx;
|
||||
r.pid = rtwvif_link->port;
|
||||
r.active = true;
|
||||
r.connected = MLME_LINKED;
|
||||
r.bcn_period = vif->bss_conf.beacon_int;
|
||||
|
@ -7545,7 +7546,7 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
|||
r.chdef.center_ch = chan->channel;
|
||||
r.chdef.bw = chan->band_width;
|
||||
r.chdef.chan = chan->primary_channel;
|
||||
ether_addr_copy(r.mac_addr, rtwvif->mac_addr);
|
||||
ether_addr_copy(r.mac_addr, rtwvif_link->mac_addr);
|
||||
|
||||
if (rtwsta && vif->type == NL80211_IFTYPE_STATION)
|
||||
r.mac_id = rtwsta->mac_id;
|
||||
|
@ -7791,14 +7792,14 @@ static void rtw89_btc_ntfy_wl_sta_iter(void *data, struct ieee80211_sta *sta)
|
|||
struct rtw89_btc_wl_link_info *link_info = NULL;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_traffic_stats *link_info_t = NULL;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_traffic_stats *stats = &rtwvif->stats;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_traffic_stats *stats = &rtwvif_link->stats;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_btc_wl_role_info *r;
|
||||
struct rtw89_btc_wl_role_info_v1 *r1;
|
||||
u32 last_tx_rate, last_rx_rate;
|
||||
u16 last_tx_lvl, last_rx_lvl;
|
||||
u8 port = rtwvif->port;
|
||||
u8 port = rtwvif_link->port;
|
||||
u8 rssi;
|
||||
u8 busy = 0;
|
||||
u8 dir = 0;
|
||||
|
@ -7810,7 +7811,7 @@ static void rtw89_btc_ntfy_wl_sta_iter(void *data, struct ieee80211_sta *sta)
|
|||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], rssi=%d\n", rssi);
|
||||
|
||||
link_info = &wl->link_info[port];
|
||||
link_info->stat.traffic = rtwvif->stats;
|
||||
link_info->stat.traffic = rtwvif_link->stats;
|
||||
link_info_t = &link_info->stat.traffic;
|
||||
|
||||
if (link_info->connected == MLME_NO_LINK) {
|
||||
|
|
|
@ -271,7 +271,8 @@ void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
|
|||
void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta, enum btc_role_state state);
|
||||
void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state);
|
||||
void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
|
||||
|
|
|
@ -436,12 +436,12 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_chan *chan)
|
||||
{
|
||||
const struct cfg80211_chan_def *chandef;
|
||||
|
||||
chandef = rtw89_chandef_get(rtwdev, rtwvif->chanctx_idx);
|
||||
chandef = rtw89_chandef_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
rtw89_get_channel_params(chandef, chan);
|
||||
}
|
||||
|
||||
|
@ -591,12 +591,12 @@ static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev,
|
|||
struct rtw89_core_tx_request *tx_req)
|
||||
{
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct ieee80211_sta *sta = tx_req->sta;
|
||||
struct rtw89_sta *rtwsta;
|
||||
|
||||
if (!sta)
|
||||
return rtwvif->mac_id;
|
||||
return rtwvif_link->mac_id;
|
||||
|
||||
rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
return rtwsta->mac_id;
|
||||
|
@ -619,10 +619,10 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
struct sk_buff *skb = tx_req->skb;
|
||||
u8 qsel, ch_dma;
|
||||
|
||||
|
@ -631,7 +631,7 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
|||
|
||||
desc_info->qsel = qsel;
|
||||
desc_info->ch_dma = ch_dma;
|
||||
desc_info->port = desc_info->hiq ? rtwvif->port : 0;
|
||||
desc_info->port = desc_info->hiq ? rtwvif_link->port : 0;
|
||||
desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
|
||||
desc_info->hw_ssn_sel = RTW89_MGMT_HW_SSN_SEL;
|
||||
desc_info->hw_seq_mode = RTW89_MGMT_HW_SEQ_MODE;
|
||||
|
@ -762,7 +762,7 @@ rtw89_core_tx_update_he_qos_htc(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
if (!__rtw89_core_tx_check_he_qos_htc(rtwdev, tx_req, pkt_type))
|
||||
goto desc_bk;
|
||||
|
@ -773,10 +773,10 @@ rtw89_core_tx_update_he_qos_htc(struct rtw89_dev *rtwdev,
|
|||
desc_info->a_ctrl_bsr = true;
|
||||
|
||||
desc_bk:
|
||||
if (!rtwvif || rtwvif->last_a_ctrl == desc_info->a_ctrl_bsr)
|
||||
if (!rtwvif_link || rtwvif_link->last_a_ctrl == desc_info->a_ctrl_bsr)
|
||||
return;
|
||||
|
||||
rtwvif->last_a_ctrl = desc_info->a_ctrl_bsr;
|
||||
rtwvif_link->last_a_ctrl = desc_info->a_ctrl_bsr;
|
||||
desc_info->bk = true;
|
||||
}
|
||||
|
||||
|
@ -785,9 +785,9 @@ static u16 rtw89_core_get_data_rate(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct ieee80211_sta *sta = tx_req->sta;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern;
|
||||
enum rtw89_chanctx_idx idx = rtwvif->chanctx_idx;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif_link->rate_pattern;
|
||||
enum rtw89_chanctx_idx idx = rtwvif_link->chanctx_idx;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, idx);
|
||||
u16 lowest_rate;
|
||||
|
||||
|
@ -813,7 +813,7 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
|
|||
{
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct ieee80211_sta *sta = tx_req->sta;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
struct sk_buff *skb = tx_req->skb;
|
||||
|
@ -829,7 +829,7 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
|
|||
desc_info->tid_indicate = tid_indicate;
|
||||
desc_info->qsel = qsel;
|
||||
desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
|
||||
desc_info->port = desc_info->hiq ? rtwvif->port : 0;
|
||||
desc_info->port = desc_info->hiq ? rtwvif_link->port : 0;
|
||||
desc_info->er_cap = rtwsta ? rtwsta->er_cap : false;
|
||||
desc_info->stbc = rtwsta ? rtwsta->ra.stbc_cap : false;
|
||||
desc_info->ldpc = rtwsta ? rtwsta->ra.ldpc_cap : false;
|
||||
|
@ -1028,7 +1028,7 @@ int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
|||
struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel)
|
||||
{
|
||||
struct rtw89_core_tx_request tx_req = {0};
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
tx_req.skb = skb;
|
||||
|
@ -1036,7 +1036,7 @@ int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
|||
tx_req.vif = vif;
|
||||
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwdev->stats, skb, true);
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwvif->stats, skb, true);
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwvif_link->stats, skb, true);
|
||||
rtw89_core_tx_update_desc_info(rtwdev, &tx_req);
|
||||
rtw89_core_tx_wake(rtwdev, &tx_req);
|
||||
|
||||
|
@ -1879,14 +1879,14 @@ static void rtw89_stats_trigger_frame(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct ieee80211_trigger *tf = (struct ieee80211_trigger *)skb->data;
|
||||
u8 *pos, *end, type, tf_bw;
|
||||
u16 aid, tf_rua;
|
||||
|
||||
if (!ether_addr_equal(vif->bss_conf.bssid, tf->ta) ||
|
||||
rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION ||
|
||||
rtwvif->net_type == RTW89_NET_TYPE_NO_LINK)
|
||||
rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION ||
|
||||
rtwvif_link->net_type == RTW89_NET_TYPE_NO_LINK)
|
||||
return;
|
||||
|
||||
type = le64_get_bits(tf->common_info, IEEE80211_TRIGGER_TYPE_MASK);
|
||||
|
@ -1911,11 +1911,11 @@ static void rtw89_stats_trigger_frame(struct rtw89_dev *rtwdev,
|
|||
if (aid == vif->cfg.aid) {
|
||||
enum nl80211_he_ru_alloc rua = rtw89_he_rua_to_ru_alloc(tf_rua >> 1);
|
||||
|
||||
rtwvif->stats.rx_tf_acc++;
|
||||
rtwvif_link->stats.rx_tf_acc++;
|
||||
rtwdev->stats.rx_tf_acc++;
|
||||
if (tf_bw == IEEE80211_TRIGGER_ULBW_160_80P80MHZ &&
|
||||
rua <= NL80211_RATE_INFO_HE_RU_ALLOC_106)
|
||||
rtwvif->pwr_diff_en = true;
|
||||
rtwvif_link->pwr_diff_en = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1986,7 +1986,7 @@ static void rtw89_core_cancel_6ghz_probe_tx(struct rtw89_dev *rtwdev,
|
|||
ieee80211_queue_work(rtwdev->hw, &rtwdev->cancel_6ghz_probe_work);
|
||||
}
|
||||
|
||||
static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif *rtwvif,
|
||||
static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_hdr *hdr, size_t len)
|
||||
{
|
||||
struct ieee80211_mgmt *mgmt = (typeof(mgmt))hdr;
|
||||
|
@ -1994,13 +1994,13 @@ static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif *rtwvif,
|
|||
if (len < offsetof(typeof(*mgmt), u.beacon.variable))
|
||||
return;
|
||||
|
||||
WRITE_ONCE(rtwvif->sync_bcn_tsf, le64_to_cpu(mgmt->u.beacon.timestamp));
|
||||
WRITE_ONCE(rtwvif_link->sync_bcn_tsf, le64_to_cpu(mgmt->u.beacon.timestamp));
|
||||
}
|
||||
|
||||
static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_vif_rx_stats_iter_data *iter_data = data;
|
||||
struct rtw89_dev *rtwdev = iter_data->rtwdev;
|
||||
struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.cur_pkt_stat;
|
||||
|
@ -2029,7 +2029,7 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
|
|||
if (ieee80211_is_beacon(hdr->frame_control)) {
|
||||
if (vif->type == NL80211_IFTYPE_STATION &&
|
||||
!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) {
|
||||
rtw89_vif_sync_bcn_tsf(rtwvif, hdr, skb->len);
|
||||
rtw89_vif_sync_bcn_tsf(rtwvif_link, hdr, skb->len);
|
||||
rtw89_fw_h2c_rssi_offload(rtwdev, phy_ppdu);
|
||||
}
|
||||
pkt_stat->beacon_nr++;
|
||||
|
@ -2041,7 +2041,7 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
|
|||
if (desc_info->data_rate < RTW89_HW_RATE_NR)
|
||||
pkt_stat->rx_rate_cnt[desc_info->data_rate]++;
|
||||
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwvif->stats, skb, false);
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwvif_link->stats, skb, false);
|
||||
}
|
||||
|
||||
static void rtw89_core_rx_stats(struct rtw89_dev *rtwdev,
|
||||
|
@ -2869,7 +2869,7 @@ static void rtw89_core_txq_schedule(struct rtw89_dev *rtwdev, u8 ac, bool *reinv
|
|||
{
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct ieee80211_txq *txq;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_txq *rtwtxq;
|
||||
unsigned long frame_cnt;
|
||||
unsigned long byte_cnt;
|
||||
|
@ -2879,9 +2879,9 @@ static void rtw89_core_txq_schedule(struct rtw89_dev *rtwdev, u8 ac, bool *reinv
|
|||
ieee80211_txq_schedule_start(hw, ac);
|
||||
while ((txq = ieee80211_next_txq(hw, ac))) {
|
||||
rtwtxq = (struct rtw89_txq *)txq->drv_priv;
|
||||
rtwvif = (struct rtw89_vif *)txq->vif->drv_priv;
|
||||
rtwvif_link = (struct rtw89_vif_link *)txq->vif->drv_priv;
|
||||
|
||||
if (rtwvif->offchan) {
|
||||
if (rtwvif_link->offchan) {
|
||||
ieee80211_return_txq(hw, txq, true);
|
||||
continue;
|
||||
}
|
||||
|
@ -2956,13 +2956,14 @@ static void rtw89_core_sta_pending_tx_iter(void *data,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif_target = data, *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_target = data;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_dev *rtwdev = rtwvif_link->rtwdev;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct sk_buff *skb, *tmp;
|
||||
int qsel, ret;
|
||||
|
||||
if (rtwvif->chanctx_idx != rtwvif_target->chanctx_idx)
|
||||
if (rtwvif_link->chanctx_idx != rtwvif_target->chanctx_idx)
|
||||
return;
|
||||
|
||||
if (skb_queue_len(&rtwsta->roc_queue) == 0)
|
||||
|
@ -2982,17 +2983,17 @@ static void rtw89_core_sta_pending_tx_iter(void *data,
|
|||
}
|
||||
|
||||
static void rtw89_core_handle_sta_pending_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
ieee80211_iterate_stations_atomic(rtwdev->hw,
|
||||
rtw89_core_sta_pending_tx_iter,
|
||||
rtwvif);
|
||||
rtwvif_link);
|
||||
}
|
||||
|
||||
static int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool qos, bool ps)
|
||||
struct rtw89_vif_link *rtwvif_link, bool qos, bool ps)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct sk_buff *skb;
|
||||
|
@ -3035,13 +3036,13 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct rtw89_roc *roc = &rtwvif_link->roc;
|
||||
struct cfg80211_chan_def roc_chan;
|
||||
struct rtw89_vif *tmp;
|
||||
struct rtw89_vif_link *tmp;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
@ -3050,34 +3051,34 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
|||
rtw89_leave_lps(rtwdev);
|
||||
rtw89_chanctx_pause(rtwdev, RTW89_CHANCTX_PAUSE_REASON_ROC);
|
||||
|
||||
ret = rtw89_core_send_nullfunc(rtwdev, rtwvif, true, true);
|
||||
ret = rtw89_core_send_nullfunc(rtwdev, rtwvif_link, true, true);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"roc send null-1 failed: %d\n", ret);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, tmp)
|
||||
if (tmp->chanctx_idx == rtwvif->chanctx_idx)
|
||||
if (tmp->chanctx_idx == rtwvif_link->chanctx_idx)
|
||||
tmp->offchan = true;
|
||||
|
||||
cfg80211_chandef_create(&roc_chan, &roc->chan, NL80211_CHAN_NO_HT);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->chanctx_idx, &roc_chan);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif_link->chanctx_idx, &roc_chan);
|
||||
rtw89_set_channel(rtwdev);
|
||||
rtw89_write32_clr(rtwdev,
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_A_UC_CAM_MATCH | B_AX_A_BC_CAM_MATCH);
|
||||
|
||||
ieee80211_ready_on_channel(hw);
|
||||
cancel_delayed_work(&rtwvif->roc.roc_work);
|
||||
ieee80211_queue_delayed_work(hw, &rtwvif->roc.roc_work,
|
||||
msecs_to_jiffies(rtwvif->roc.duration));
|
||||
cancel_delayed_work(&rtwvif_link->roc.roc_work);
|
||||
ieee80211_queue_delayed_work(hw, &rtwvif_link->roc.roc_work,
|
||||
msecs_to_jiffies(rtwvif_link->roc.duration));
|
||||
}
|
||||
|
||||
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct rtw89_vif *tmp;
|
||||
struct rtw89_roc *roc = &rtwvif_link->roc;
|
||||
struct rtw89_vif_link *tmp;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
@ -3093,18 +3094,18 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
|||
rtwdev->hal.rx_fltr);
|
||||
|
||||
roc->state = RTW89_ROC_IDLE;
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->chanctx_idx, NULL);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif_link->chanctx_idx, NULL);
|
||||
rtw89_chanctx_proceed(rtwdev);
|
||||
ret = rtw89_core_send_nullfunc(rtwdev, rtwvif, true, false);
|
||||
ret = rtw89_core_send_nullfunc(rtwdev, rtwvif_link, true, false);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"roc send null-0 failed: %d\n", ret);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, tmp)
|
||||
if (tmp->chanctx_idx == rtwvif->chanctx_idx)
|
||||
if (tmp->chanctx_idx == rtwvif_link->chanctx_idx)
|
||||
tmp->offchan = false;
|
||||
|
||||
rtw89_core_handle_sta_pending_tx(rtwdev, rtwvif);
|
||||
rtw89_core_handle_sta_pending_tx(rtwdev, rtwvif_link);
|
||||
queue_work(rtwdev->txq_wq, &rtwdev->txq_work);
|
||||
|
||||
if (hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
|
@ -3114,10 +3115,10 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
|||
|
||||
void rtw89_roc_work(struct work_struct *work)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = container_of(work, struct rtw89_vif,
|
||||
roc.roc_work.work);
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct rtw89_vif_link *rtwvif_link = container_of(work, struct rtw89_vif_link,
|
||||
roc.roc_work.work);
|
||||
struct rtw89_dev *rtwdev = rtwvif_link->rtwdev;
|
||||
struct rtw89_roc *roc = &rtwvif_link->roc;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
|
@ -3127,7 +3128,7 @@ void rtw89_roc_work(struct work_struct *work)
|
|||
break;
|
||||
case RTW89_ROC_MGMT:
|
||||
case RTW89_ROC_NORMAL:
|
||||
rtw89_roc_end(rtwdev, rtwvif);
|
||||
rtw89_roc_end(rtwdev, rtwvif_link);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -3188,39 +3189,40 @@ static bool rtw89_traffic_stats_calc(struct rtw89_dev *rtwdev,
|
|||
|
||||
static bool rtw89_traffic_stats_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
bool tfc_changed;
|
||||
|
||||
tfc_changed = rtw89_traffic_stats_calc(rtwdev, &rtwdev->stats);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
rtw89_traffic_stats_calc(rtwdev, &rtwvif->stats);
|
||||
rtw89_fw_h2c_tp_offload(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
rtw89_traffic_stats_calc(rtwdev, &rtwvif_link->stats);
|
||||
rtw89_fw_h2c_tp_offload(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
return tfc_changed;
|
||||
}
|
||||
|
||||
static void rtw89_vif_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw89_vif_enter_lps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
if ((rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT) ||
|
||||
rtwvif->tdls_peer)
|
||||
if ((rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif_link->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT) ||
|
||||
rtwvif_link->tdls_peer)
|
||||
return;
|
||||
|
||||
if (rtwvif->offchan)
|
||||
if (rtwvif_link->offchan)
|
||||
return;
|
||||
|
||||
if (rtwvif->stats.tx_tfc_lv == RTW89_TFC_IDLE &&
|
||||
rtwvif->stats.rx_tfc_lv == RTW89_TFC_IDLE)
|
||||
rtw89_enter_lps(rtwdev, rtwvif, true);
|
||||
if (rtwvif_link->stats.tx_tfc_lv == RTW89_TFC_IDLE &&
|
||||
rtwvif_link->stats.rx_tfc_lv == RTW89_TFC_IDLE)
|
||||
rtw89_enter_lps(rtwdev, rtwvif_link, true);
|
||||
}
|
||||
|
||||
static void rtw89_enter_lps_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_vif_enter_lps(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_vif_enter_lps(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void rtw89_core_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
@ -3396,24 +3398,24 @@ int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
|
|||
|
||||
#define RTW89_TYPE_MAPPING(_type) \
|
||||
case NL80211_IFTYPE_ ## _type: \
|
||||
rtwvif->wifi_role = RTW89_WIFI_ROLE_ ## _type; \
|
||||
rtwvif_link->wifi_role = RTW89_WIFI_ROLE_ ## _type; \
|
||||
break
|
||||
void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (vif->p2p)
|
||||
rtwvif->wifi_role = RTW89_WIFI_ROLE_P2P_CLIENT;
|
||||
rtwvif_link->wifi_role = RTW89_WIFI_ROLE_P2P_CLIENT;
|
||||
else
|
||||
rtwvif->wifi_role = RTW89_WIFI_ROLE_STATION;
|
||||
rtwvif_link->wifi_role = RTW89_WIFI_ROLE_STATION;
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
if (vif->p2p)
|
||||
rtwvif->wifi_role = RTW89_WIFI_ROLE_P2P_GO;
|
||||
rtwvif_link->wifi_role = RTW89_WIFI_ROLE_P2P_GO;
|
||||
else
|
||||
rtwvif->wifi_role = RTW89_WIFI_ROLE_AP;
|
||||
rtwvif_link->wifi_role = RTW89_WIFI_ROLE_AP;
|
||||
break;
|
||||
RTW89_TYPE_MAPPING(ADHOC);
|
||||
RTW89_TYPE_MAPPING(MONITOR);
|
||||
|
@ -3426,23 +3428,23 @@ void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc)
|
|||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
rtwvif->net_type = RTW89_NET_TYPE_AP_MODE;
|
||||
rtwvif->self_role = RTW89_SELF_ROLE_AP;
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_AP_MODE;
|
||||
rtwvif_link->self_role = RTW89_SELF_ROLE_AP;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
rtwvif->net_type = RTW89_NET_TYPE_AD_HOC;
|
||||
rtwvif->self_role = RTW89_SELF_ROLE_CLIENT;
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_AD_HOC;
|
||||
rtwvif_link->self_role = RTW89_SELF_ROLE_CLIENT;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (assoc) {
|
||||
rtwvif->net_type = RTW89_NET_TYPE_INFRA;
|
||||
rtwvif->trigger = vif->bss_conf.he_support;
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_INFRA;
|
||||
rtwvif_link->trigger = vif->bss_conf.he_support;
|
||||
} else {
|
||||
rtwvif->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif->trigger = false;
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif_link->trigger = false;
|
||||
}
|
||||
rtwvif->self_role = RTW89_SELF_ROLE_CLIENT;
|
||||
rtwvif->addr_cam.sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL;
|
||||
rtwvif_link->self_role = RTW89_SELF_ROLE_CLIENT;
|
||||
rtwvif_link->addr_cam.sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL;
|
||||
break;
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
break;
|
||||
|
@ -3456,7 +3458,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num;
|
||||
|
@ -3464,7 +3466,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
|||
int ret;
|
||||
|
||||
rtwsta->rtwdev = rtwdev;
|
||||
rtwsta->rtwvif = rtwvif;
|
||||
rtwsta->rtwvif_link = rtwvif_link;
|
||||
rtwsta->prev_rssi = 0;
|
||||
INIT_LIST_HEAD(&rtwsta->ba_cam_list);
|
||||
skb_queue_head_init(&rtwsta->roc_queue);
|
||||
|
@ -3483,16 +3485,16 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
|||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
||||
/* for station mode, assign the mac_id from itself */
|
||||
rtwsta->mac_id = rtwvif->mac_id;
|
||||
rtwsta->mac_id = rtwvif_link->mac_id;
|
||||
|
||||
/* must do rtw89_reg_6ghz_recalc() before rfk channel */
|
||||
ret = rtw89_reg_6ghz_recalc(rtwdev, rtwvif, true);
|
||||
ret = rtw89_reg_6ghz_recalc(rtwdev, rtwvif_link, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif_link, rtwsta,
|
||||
BTC_ROLE_MSTS_STA_CONN_START);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif_link);
|
||||
} else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
rtwsta->mac_id = rtw89_acquire_mac_id(rtwdev);
|
||||
if (rtwsta->mac_id == RTW89_MAX_MAC_ID_NUM)
|
||||
|
@ -3505,7 +3507,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif_link, rtwsta,
|
||||
RTW89_ROLE_CREATE);
|
||||
if (ret) {
|
||||
rtw89_release_mac_id(rtwdev, rtwsta->mac_id);
|
||||
|
@ -3513,11 +3515,11 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_chip_h2c_default_cmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rtw89_chip_h2c_default_dmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -3531,7 +3533,7 @@ int rtw89_core_sta_disassoc(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
|
@ -3539,7 +3541,7 @@ int rtw89_core_sta_disassoc(struct rtw89_dev *rtwdev,
|
|||
|
||||
rtwdev->total_sta_assoc--;
|
||||
if (sta->tdls)
|
||||
rtwvif->tdls_peer--;
|
||||
rtwvif_link->tdls_peer--;
|
||||
rtwsta->disassoc = true;
|
||||
|
||||
return 0;
|
||||
|
@ -3549,7 +3551,7 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
int ret;
|
||||
|
||||
|
@ -3566,7 +3568,7 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev,
|
|||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
||||
rtw89_vif_type_mapping(vif, false);
|
||||
rtw89_fw_release_general_pkt_list_vif(rtwdev, rtwvif, true);
|
||||
rtw89_fw_release_general_pkt_list_vif(rtwdev, rtwvif_link, true);
|
||||
}
|
||||
|
||||
ret = rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, vif, sta);
|
||||
|
@ -3575,14 +3577,14 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, true);
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, rtwsta, true);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c join info\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* update cam aid mac_id net_type */
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
|
@ -3595,16 +3597,18 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta);
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link,
|
||||
rtwsta);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
int ret;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
if (sta->tdls) {
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, sta->addr);
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam,
|
||||
sta->addr);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c init bssid cam for TDLS\n");
|
||||
return ret;
|
||||
|
@ -3624,14 +3628,14 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, false);
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, rtwsta, false);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c join info\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* update cam aid mac_id net_type */
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
|
@ -3639,7 +3643,7 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
|||
|
||||
rtwdev->total_sta_assoc++;
|
||||
if (sta->tdls)
|
||||
rtwvif->tdls_peer++;
|
||||
rtwvif_link->tdls_peer++;
|
||||
rtw89_phy_ra_assoc(rtwdev, sta);
|
||||
rtw89_mac_bf_assoc(rtwdev, vif, sta);
|
||||
rtw89_mac_bf_monitor_calc(rtwdev, sta, false);
|
||||
|
@ -3651,12 +3655,12 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
|||
!(bss_conf->he_oper.params & IEEE80211_HE_OPERATION_ER_SU_DISABLE))
|
||||
rtwsta->er_cap = true;
|
||||
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif_link, rtwsta,
|
||||
BTC_ROLE_MSTS_STA_CONN_END);
|
||||
rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template, chan);
|
||||
rtw89_phy_ul_tb_assoc(rtwdev, rtwvif);
|
||||
rtw89_phy_ul_tb_assoc(rtwdev, rtwvif_link);
|
||||
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif_link, rtwsta->mac_id);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
|
||||
return ret;
|
||||
|
@ -3672,18 +3676,18 @@ int rtw89_core_sta_remove(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
int ret;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
||||
rtw89_reg_6ghz_recalc(rtwdev, rtwvif, false);
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
|
||||
rtw89_reg_6ghz_recalc(rtwdev, rtwvif_link, false);
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif_link, rtwsta,
|
||||
BTC_ROLE_MSTS_STA_DIS_CONN);
|
||||
} else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
rtw89_release_mac_id(rtwdev, rtwsta->mac_id);
|
||||
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif_link, rtwsta,
|
||||
RTW89_ROLE_REMOVE);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c role info\n");
|
||||
|
@ -4152,15 +4156,15 @@ static void rtw89_core_ppdu_sts_init(struct rtw89_dev *rtwdev)
|
|||
void rtw89_core_update_beacon_work(struct work_struct *work)
|
||||
{
|
||||
struct rtw89_dev *rtwdev;
|
||||
struct rtw89_vif *rtwvif = container_of(work, struct rtw89_vif,
|
||||
update_beacon_work);
|
||||
struct rtw89_vif_link *rtwvif_link = container_of(work, struct rtw89_vif_link,
|
||||
update_beacon_work);
|
||||
|
||||
if (rtwvif->net_type != RTW89_NET_TYPE_AP_MODE)
|
||||
if (rtwvif_link->net_type != RTW89_NET_TYPE_AP_MODE)
|
||||
return;
|
||||
|
||||
rtwdev = rtwvif->rtwdev;
|
||||
rtwdev = rtwvif_link->rtwdev;
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_chip_h2c_update_beacon(rtwdev, rtwvif);
|
||||
rtw89_chip_h2c_update_beacon(rtwdev, rtwvif_link);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
|
@ -4444,38 +4448,39 @@ void rtw89_core_deinit(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
EXPORT_SYMBOL(rtw89_core_deinit);
|
||||
|
||||
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
const u8 *mac_addr, bool hw_scan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
|
||||
rtwdev->scanning = true;
|
||||
rtw89_leave_lps(rtwdev);
|
||||
if (hw_scan)
|
||||
rtw89_leave_ips_by_hwflags(rtwdev);
|
||||
|
||||
ether_addr_copy(rtwvif->mac_addr, mac_addr);
|
||||
ether_addr_copy(rtwvif_link->mac_addr, mac_addr);
|
||||
rtw89_btc_ntfy_scan_start(rtwdev, RTW89_PHY_0, chan->band_type);
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif, true);
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif_link, true);
|
||||
rtw89_hci_recalc_int_mit(rtwdev);
|
||||
rtw89_phy_config_edcca(rtwdev, true);
|
||||
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, mac_addr);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif_link, NULL, mac_addr);
|
||||
}
|
||||
|
||||
void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif, bool hw_scan)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = vif ? (struct rtw89_vif *)vif->drv_priv : NULL;
|
||||
struct rtw89_vif_link *rtwvif_link =
|
||||
vif ? (struct rtw89_vif_link *)vif->drv_priv : NULL;
|
||||
|
||||
if (!rtwvif)
|
||||
if (!rtwvif_link)
|
||||
return;
|
||||
|
||||
ether_addr_copy(rtwvif->mac_addr, vif->addr);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
ether_addr_copy(rtwvif_link->mac_addr, vif->addr);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif_link, NULL, NULL);
|
||||
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif, false);
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif_link, false);
|
||||
rtw89_btc_ntfy_scan_finish(rtwdev, RTW89_PHY_0);
|
||||
rtw89_phy_config_edcca(rtwdev, false);
|
||||
|
||||
|
@ -4697,7 +4702,7 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
|
|||
int ret;
|
||||
int tx_headroom = IEEE80211_HT_CTL_LEN;
|
||||
|
||||
hw->vif_data_size = sizeof(struct rtw89_vif);
|
||||
hw->vif_data_size = sizeof(struct rtw89_vif_link);
|
||||
hw->sta_data_size = sizeof(struct rtw89_sta);
|
||||
hw->txq_data_size = sizeof(struct rtw89_txq);
|
||||
hw->chanctx_data_size = sizeof(struct rtw89_chanctx_cfg);
|
||||
|
|
|
@ -3359,7 +3359,7 @@ struct rtw89_sta {
|
|||
bool disassoc;
|
||||
bool er_cap;
|
||||
struct rtw89_dev *rtwdev;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_ra_info ra;
|
||||
struct rtw89_ra_report ra_report;
|
||||
int max_agg_wait;
|
||||
|
@ -3460,7 +3460,7 @@ struct rtw89_p2p_noa_setter {
|
|||
u8 noa_index;
|
||||
};
|
||||
|
||||
struct rtw89_vif {
|
||||
struct rtw89_vif_link {
|
||||
struct list_head list;
|
||||
struct rtw89_dev *rtwdev;
|
||||
struct rtw89_roc roc;
|
||||
|
@ -3599,11 +3599,11 @@ struct rtw89_chip_ops {
|
|||
void (*rfk_hw_init)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_init)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_init_late)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_channel)(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void (*rfk_channel)(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void (*rfk_band_changed)(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
void (*rfk_scan)(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void (*rfk_scan)(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool start);
|
||||
void (*rfk_track)(struct rtw89_dev *rtwdev);
|
||||
void (*power_trim)(struct rtw89_dev *rtwdev);
|
||||
|
@ -3646,10 +3646,10 @@ struct rtw89_chip_ops {
|
|||
u32 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
int (*resume_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
int (*h2c_dctl_sec_cam)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int (*h2c_default_cmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int (*h2c_assoc_cmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
|
@ -3658,10 +3658,10 @@ struct rtw89_chip_ops {
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
int (*h2c_default_dmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int (*h2c_update_beacon)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int (*h2c_ba_cam)(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
bool valid, struct ieee80211_ampdu_params *params);
|
||||
|
||||
|
@ -5409,7 +5409,7 @@ struct rtw89_mcc_policy {
|
|||
};
|
||||
|
||||
struct rtw89_mcc_role {
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_mcc_policy policy;
|
||||
struct rtw89_mcc_limit limit;
|
||||
|
||||
|
@ -5961,21 +5961,21 @@ static inline void rtw89_core_txq_init(struct rtw89_dev *rtwdev,
|
|||
INIT_LIST_HEAD(&rtwtxq->list);
|
||||
}
|
||||
|
||||
static inline struct ieee80211_vif *rtwvif_to_vif(struct rtw89_vif *rtwvif)
|
||||
static inline struct ieee80211_vif *rtwvif_to_vif(struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
void *p = rtwvif;
|
||||
void *p = rtwvif_link;
|
||||
|
||||
return container_of(p, struct ieee80211_vif, drv_priv);
|
||||
}
|
||||
|
||||
static inline struct ieee80211_vif *rtwvif_to_vif_safe(struct rtw89_vif *rtwvif)
|
||||
static inline struct ieee80211_vif *rtwvif_to_vif_safe(struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
return rtwvif ? rtwvif_to_vif(rtwvif) : NULL;
|
||||
return rtwvif_link ? rtwvif_to_vif(rtwvif_link) : NULL;
|
||||
}
|
||||
|
||||
static inline struct rtw89_vif *vif_to_rtwvif_safe(struct ieee80211_vif *vif)
|
||||
static inline struct rtw89_vif_link *vif_to_rtwvif_safe(struct ieee80211_vif *vif)
|
||||
{
|
||||
return vif ? (struct rtw89_vif *)vif->drv_priv : NULL;
|
||||
return vif ? (struct rtw89_vif_link *)vif->drv_priv : NULL;
|
||||
}
|
||||
|
||||
static inline struct ieee80211_sta *rtwsta_to_sta(struct rtw89_sta *rtwsta)
|
||||
|
@ -6079,20 +6079,20 @@ enum nl80211_he_ru_alloc rtw89_he_rua_to_ru_alloc(u16 rua)
|
|||
}
|
||||
|
||||
static inline
|
||||
struct rtw89_addr_cam_entry *rtw89_get_addr_cam_of(struct rtw89_vif *rtwvif,
|
||||
struct rtw89_addr_cam_entry *rtw89_get_addr_cam_of(struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
if (rtwsta) {
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta);
|
||||
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
return &rtwsta->addr_cam;
|
||||
}
|
||||
return &rtwvif->addr_cam;
|
||||
return &rtwvif_link->addr_cam;
|
||||
}
|
||||
|
||||
static inline
|
||||
struct rtw89_bssid_cam_entry *rtw89_get_bssid_cam_of(struct rtw89_vif *rtwvif,
|
||||
struct rtw89_bssid_cam_entry *rtw89_get_bssid_cam_of(struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
if (rtwsta) {
|
||||
|
@ -6101,7 +6101,7 @@ struct rtw89_bssid_cam_entry *rtw89_get_bssid_cam_of(struct rtw89_vif *rtwvif,
|
|||
if (sta->tdls)
|
||||
return &rtwsta->bssid_cam;
|
||||
}
|
||||
return &rtwvif->bssid_cam;
|
||||
return &rtwvif_link->bssid_cam;
|
||||
}
|
||||
|
||||
static inline
|
||||
|
@ -6161,10 +6161,10 @@ static inline
|
|||
const struct rtw89_chan *rtw89_scan_chan_get(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
struct rtw89_vif_link *rtwvif_link = vif_to_rtwvif_safe(vif);
|
||||
|
||||
if (rtwvif)
|
||||
return rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
if (rtwvif_link)
|
||||
return rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
else
|
||||
return rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
@ -6241,12 +6241,12 @@ static inline void rtw89_chip_rfk_init_late(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->rfk_channel)
|
||||
chip->ops->rfk_channel(rtwdev, rtwvif);
|
||||
chip->ops->rfk_channel(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
|
@ -6260,12 +6260,12 @@ static inline void rtw89_chip_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool start)
|
||||
struct rtw89_vif_link *rtwvif_link, bool start)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->rfk_scan)
|
||||
chip->ops->rfk_scan(rtwdev, rtwvif, start);
|
||||
chip->ops->rfk_scan(rtwdev, rtwvif_link, start);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
@ -6352,14 +6352,14 @@ static inline
|
|||
void rtw89_chip_cfg_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!vif->bss_conf.he_support || !vif->cfg.assoc)
|
||||
return;
|
||||
|
||||
if (chip->ops->set_txpwr_ul_tb_offset)
|
||||
chip->ops->set_txpwr_ul_tb_offset(rtwdev, 0, rtwvif->mac_idx);
|
||||
chip->ops->set_txpwr_ul_tb_offset(rtwdev, 0, rtwvif_link->mac_idx);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_digital_pwr_comp(struct rtw89_dev *rtwdev,
|
||||
|
@ -6458,14 +6458,14 @@ int rtw89_chip_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
|||
|
||||
static inline
|
||||
int rtw89_chip_h2c_dctl_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!chip->ops->h2c_dctl_sec_cam)
|
||||
return 0;
|
||||
return chip->ops->h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
return chip->ops->h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta);
|
||||
}
|
||||
|
||||
static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
|
@ -6641,7 +6641,7 @@ void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef);
|
|||
void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
||||
struct rtw89_chan *chan);
|
||||
int rtw89_set_channel(struct rtw89_dev *rtwdev);
|
||||
void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_chan *chan);
|
||||
u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size);
|
||||
void rtw89_core_release_bit_map(unsigned long *addr, u8 bit);
|
||||
|
@ -6666,13 +6666,13 @@ int rtw89_core_start(struct rtw89_dev *rtwdev);
|
|||
void rtw89_core_stop(struct rtw89_dev *rtwdev);
|
||||
void rtw89_core_update_beacon_work(struct work_struct *work);
|
||||
void rtw89_roc_work(struct work_struct *work);
|
||||
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
const u8 *mac_addr, bool hw_scan);
|
||||
void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif, bool hw_scan);
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool active);
|
||||
void rtw89_core_update_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
void rtw89_core_ntfy_btc_event(struct rtw89_dev *rtwdev, enum rtw89_btc_hmsg event);
|
||||
|
|
|
@ -3740,21 +3740,22 @@ static void rtw89_dump_pkt_offload(struct seq_file *m, struct list_head *pkt_lis
|
|||
static
|
||||
void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwvif_link->rtwdev;
|
||||
struct seq_file *m = (struct seq_file *)data;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
seq_printf(m, "VIF [%d] %pM\n", rtwvif->mac_id, rtwvif->mac_addr);
|
||||
seq_printf(m, "VIF [%d] %pM\n", rtwvif_link->mac_id, rtwvif_link->mac_addr);
|
||||
seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx);
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwvif->addr_cam);
|
||||
rtw89_dump_pkt_offload(m, &rtwvif->general_pkt_list, "\tpkt_ofld[GENERAL]: ");
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwvif_link->addr_cam);
|
||||
rtw89_dump_pkt_offload(m, &rtwvif_link->general_pkt_list,
|
||||
"\tpkt_ofld[GENERAL]: ");
|
||||
}
|
||||
|
||||
static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_sta *rtwsta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_dev *rtwdev = rtwvif_link->rtwdev;
|
||||
struct rtw89_ba_cam_entry *entry;
|
||||
bool first = true;
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -4459,13 +4459,13 @@ void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb,
|
|||
u8 type, u8 cat, u8 class, u8 func,
|
||||
bool rack, bool dack, u32 len);
|
||||
int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
|
@ -4481,29 +4481,29 @@ int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
|||
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);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *vif,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif,
|
||||
struct rtw89_sta *rtwsta, const u8 *scan_mac_addr);
|
||||
int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta);
|
||||
void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h);
|
||||
void rtw89_fw_c2h_work(struct work_struct *work);
|
||||
int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta,
|
||||
enum rtw89_upd_mode upd_mode);
|
||||
int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta, bool dis_conn);
|
||||
int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en);
|
||||
int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp,
|
||||
bool pause);
|
||||
int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u8 ac, u32 val);
|
||||
int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
|
||||
|
@ -4511,7 +4511,7 @@ int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
|
|||
bool connect);
|
||||
int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu);
|
||||
int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi);
|
||||
int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type);
|
||||
|
@ -4533,11 +4533,11 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
|
|||
struct list_head *chan_list);
|
||||
int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif,
|
||||
struct rtw89_vif_link *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif,
|
||||
struct rtw89_vif_link *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_fw_h2c_rf_reg_info *info,
|
||||
|
@ -4563,10 +4563,11 @@ int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
|
|||
int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len);
|
||||
void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev);
|
||||
void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u8 macid);
|
||||
void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool notify_fw);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool notify_fw);
|
||||
void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
|
||||
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
bool valid, struct ieee80211_ampdu_params *params);
|
||||
|
@ -4579,8 +4580,8 @@ int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
|
|||
int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_lps_parm *lps_param);
|
||||
int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
|
@ -4597,41 +4598,42 @@ int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
|||
bool enable);
|
||||
void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_pkt_drop_params *params);
|
||||
int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_p2p_noa_desc *desc,
|
||||
u8 act, u8 noa_id);
|
||||
int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool en);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_wow_cam_info *cam_info);
|
||||
int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev,
|
||||
|
@ -4676,32 +4678,32 @@ static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta);
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_default_dmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->h2c_default_dmac_tbl)
|
||||
return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_update_beacon(rtwdev, rtwvif);
|
||||
return chip->ops->h2c_update_beacon(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1004,12 +1004,12 @@ struct rtw89_mac_gen_def {
|
|||
bool (*is_txq_empty)(struct rtw89_dev *rtwdev);
|
||||
|
||||
int (*add_chan_list)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int (*add_chan_list_pno)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int (*scan_offload)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool wowlan);
|
||||
|
||||
int (*wow_config_mac)(struct rtw89_dev *rtwdev, bool enable_wow);
|
||||
|
@ -1033,81 +1033,89 @@ u32 rtw89_mac_reg_by_port(struct rtw89_dev *rtwdev, u32 base, u8 port, u8 mac_id
|
|||
}
|
||||
|
||||
static inline u32
|
||||
rtw89_read32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base)
|
||||
rtw89_read32_port(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, u32 base)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
return rtw89_read32(rtwdev, reg);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
rtw89_read32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_read32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
return rtw89_read32_mask(rtwdev, reg, mask);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base,
|
||||
rtw89_write32_port(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, u32 base,
|
||||
u32 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32(rtwdev, reg, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask, u32 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write16_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write16_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask, u16 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write16_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write16_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write16_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u16 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write16_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
|
@ -1139,21 +1147,21 @@ int rtw89_mac_dle_dfi_qempty_cfg(struct rtw89_dev *rtwdev,
|
|||
struct rtw89_mac_dle_dfi_qempty *qempty);
|
||||
void rtw89_mac_dump_l0_to_l1(struct rtw89_dev *rtwdev,
|
||||
enum mac_ax_err_info err);
|
||||
int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_mac_port_tsf_sync(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif *rtwvif_src,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_vif_link *rtwvif_src,
|
||||
u16 offset_tu);
|
||||
int rtw89_mac_port_get_tsf(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_mac_port_get_tsf(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u64 *tsf);
|
||||
void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool en);
|
||||
struct rtw89_vif_link *rtwvif_link, bool en);
|
||||
void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif);
|
||||
void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_mac_enable_beacon_for_ap_vifs(struct rtw89_dev *rtwdev, bool en);
|
||||
int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_mac_enable_bb_rf(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_disable_bb_rf(struct rtw89_dev *rtwdev);
|
||||
|
||||
|
@ -1268,10 +1276,10 @@ void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_sta *sta, bool disconnect);
|
||||
void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev);
|
||||
void rtw89_mac_bfee_ctrl(struct rtw89_dev *rtwdev, u8 mac_idx, bool en);
|
||||
int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_vif_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_mac_vif_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_mac_set_hw_muedca_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool en);
|
||||
struct rtw89_vif_link *rtwvif_link, bool en);
|
||||
int rtw89_mac_set_macid_pause(struct rtw89_dev *rtwdev, u8 macid, bool pause);
|
||||
|
||||
static inline void rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)
|
||||
|
@ -1454,7 +1462,7 @@ int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
|
|||
return mac->read_xtal_si(rtwdev, offset, val);
|
||||
}
|
||||
|
||||
void rtw89_mac_pkt_drop_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_mac_pkt_drop_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_mac_resize_ple_rx_quota(struct rtw89_dev *rtwdev, bool wow);
|
||||
int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_mac_idx band);
|
||||
|
|
|
@ -23,12 +23,12 @@ static void rtw89_ops_tx(struct ieee80211_hw *hw,
|
|||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct ieee80211_sta *sta = control->sta;
|
||||
u32 flags = IEEE80211_SKB_CB(skb)->flags;
|
||||
int ret, qsel;
|
||||
|
||||
if (rtwvif->offchan && !(flags & IEEE80211_TX_CTL_TX_OFFCHAN) && sta) {
|
||||
if (rtwvif_link->offchan && !(flags & IEEE80211_TX_CTL_TX_OFFCHAN) && sta) {
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX, "ops_tx during offchan\n");
|
||||
|
@ -109,7 +109,7 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
int ret = 0;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_STATE, "add vif %pM type %d, p2p %d\n",
|
||||
|
@ -123,46 +123,46 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
|
|||
vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
|
||||
IEEE80211_VIF_SUPPORTS_CQM_RSSI;
|
||||
|
||||
rtwvif->rtwdev = rtwdev;
|
||||
rtwvif->roc.state = RTW89_ROC_IDLE;
|
||||
rtwvif->offchan = false;
|
||||
if (!rtw89_rtwvif_in_list(rtwdev, rtwvif))
|
||||
list_add_tail(&rtwvif->list, &rtwdev->rtwvifs_list);
|
||||
rtwvif_link->rtwdev = rtwdev;
|
||||
rtwvif_link->roc.state = RTW89_ROC_IDLE;
|
||||
rtwvif_link->offchan = false;
|
||||
if (!rtw89_rtwvif_in_list(rtwdev, rtwvif_link))
|
||||
list_add_tail(&rtwvif_link->list, &rtwdev->rtwvifs_list);
|
||||
|
||||
INIT_WORK(&rtwvif->update_beacon_work, rtw89_core_update_beacon_work);
|
||||
INIT_DELAYED_WORK(&rtwvif->roc.roc_work, rtw89_roc_work);
|
||||
INIT_WORK(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work);
|
||||
INIT_DELAYED_WORK(&rtwvif_link->roc.roc_work, rtw89_roc_work);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
rtw89_traffic_stats_init(rtwdev, &rtwvif->stats);
|
||||
rtw89_traffic_stats_init(rtwdev, &rtwvif_link->stats);
|
||||
rtw89_vif_type_mapping(vif, false);
|
||||
rtwvif->port = rtw89_core_acquire_bit_map(rtwdev->hw_port,
|
||||
RTW89_PORT_NUM);
|
||||
if (rtwvif->port == RTW89_PORT_NUM) {
|
||||
rtwvif_link->port = rtw89_core_acquire_bit_map(rtwdev->hw_port,
|
||||
RTW89_PORT_NUM);
|
||||
if (rtwvif_link->port == RTW89_PORT_NUM) {
|
||||
ret = -ENOSPC;
|
||||
list_del_init(&rtwvif->list);
|
||||
list_del_init(&rtwvif_link->list);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtwvif->bcn_hit_cond = 0;
|
||||
rtwvif->mac_idx = RTW89_MAC_0;
|
||||
rtwvif->phy_idx = RTW89_PHY_0;
|
||||
rtwvif->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif->chanctx_assigned = false;
|
||||
rtwvif->hit_rule = 0;
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
ether_addr_copy(rtwvif->mac_addr, vif->addr);
|
||||
INIT_LIST_HEAD(&rtwvif->general_pkt_list);
|
||||
rtwvif_link->bcn_hit_cond = 0;
|
||||
rtwvif_link->mac_idx = RTW89_MAC_0;
|
||||
rtwvif_link->phy_idx = RTW89_PHY_0;
|
||||
rtwvif_link->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif_link->chanctx_assigned = false;
|
||||
rtwvif_link->hit_rule = 0;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
ether_addr_copy(rtwvif_link->mac_addr, vif->addr);
|
||||
INIT_LIST_HEAD(&rtwvif_link->general_pkt_list);
|
||||
|
||||
ret = rtw89_mac_add_vif(rtwdev, rtwvif);
|
||||
ret = rtw89_mac_add_vif(rtwdev, rtwvif_link);
|
||||
if (ret) {
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
|
||||
list_del_init(&rtwvif->list);
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif_link->port);
|
||||
list_del_init(&rtwvif_link->list);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtw89_core_txq_init(rtwdev, vif->txq);
|
||||
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, NULL, BTC_ROLE_START);
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif_link, NULL, BTC_ROLE_START);
|
||||
|
||||
rtw89_recalc_lps(rtwdev);
|
||||
out:
|
||||
|
@ -175,20 +175,20 @@ static void rtw89_ops_remove_interface(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_STATE, "remove vif %pM type %d p2p %d\n",
|
||||
vif->addr, vif->type, vif->p2p);
|
||||
|
||||
cancel_work_sync(&rtwvif->update_beacon_work);
|
||||
cancel_delayed_work_sync(&rtwvif->roc.roc_work);
|
||||
cancel_work_sync(&rtwvif_link->update_beacon_work);
|
||||
cancel_delayed_work_sync(&rtwvif_link->roc.roc_work);
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, NULL, BTC_ROLE_STOP);
|
||||
rtw89_mac_remove_vif(rtwdev, rtwvif);
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
|
||||
list_del_init(&rtwvif->list);
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif_link, NULL, BTC_ROLE_STOP);
|
||||
rtw89_mac_remove_vif(rtwdev, rtwvif_link);
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif_link->port);
|
||||
list_del_init(&rtwvif_link->list);
|
||||
rtw89_recalc_lps(rtwdev);
|
||||
rtw89_enter_ips_by_hwflags(rtwdev);
|
||||
|
||||
|
@ -311,11 +311,11 @@ static const u8 ac_to_fw_idx[IEEE80211_NUM_ACS] = {
|
|||
};
|
||||
|
||||
static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, u8 aifsn)
|
||||
struct rtw89_vif_link *rtwvif_link, u8 aifsn)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
u8 slot_time;
|
||||
u8 sifs;
|
||||
|
||||
|
@ -326,9 +326,9 @@ static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
static void ____rtw89_conf_tx_edca(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, u16 ac)
|
||||
struct rtw89_vif_link *rtwvif_link, u16 ac)
|
||||
{
|
||||
struct ieee80211_tx_queue_params *params = &rtwvif->tx_params[ac];
|
||||
struct ieee80211_tx_queue_params *params = &rtwvif_link->tx_params[ac];
|
||||
u32 val;
|
||||
u8 ecw_max, ecw_min;
|
||||
u8 aifs;
|
||||
|
@ -336,12 +336,12 @@ static void ____rtw89_conf_tx_edca(struct rtw89_dev *rtwdev,
|
|||
/* 2^ecw - 1 = cw; ecw = log2(cw + 1) */
|
||||
ecw_max = ilog2(params->cw_max + 1);
|
||||
ecw_min = ilog2(params->cw_min + 1);
|
||||
aifs = rtw89_aifsn_to_aifs(rtwdev, rtwvif, params->aifs);
|
||||
aifs = rtw89_aifsn_to_aifs(rtwdev, rtwvif_link, params->aifs);
|
||||
val = FIELD_PREP(FW_EDCA_PARAM_TXOPLMT_MSK, params->txop) |
|
||||
FIELD_PREP(FW_EDCA_PARAM_CWMAX_MSK, ecw_max) |
|
||||
FIELD_PREP(FW_EDCA_PARAM_CWMIN_MSK, ecw_min) |
|
||||
FIELD_PREP(FW_EDCA_PARAM_AIFS_MSK, aifs);
|
||||
rtw89_fw_h2c_set_edca(rtwdev, rtwvif, ac_to_fw_idx[ac], val);
|
||||
rtw89_fw_h2c_set_edca(rtwdev, rtwvif_link, ac_to_fw_idx[ac], val);
|
||||
}
|
||||
|
||||
#define R_MUEDCA_ACS_PARAM(acs) {R_AX_MUEDCA_ ## acs ## _PARAM_0, \
|
||||
|
@ -355,9 +355,9 @@ static const u32 ac_to_mu_edca_param[IEEE80211_NUM_ACS][RTW89_CHIP_GEN_NUM] = {
|
|||
};
|
||||
|
||||
static void ____rtw89_conf_tx_mu_edca(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, u16 ac)
|
||||
struct rtw89_vif_link *rtwvif_link, u16 ac)
|
||||
{
|
||||
struct ieee80211_tx_queue_params *params = &rtwvif->tx_params[ac];
|
||||
struct ieee80211_tx_queue_params *params = &rtwvif_link->tx_params[ac];
|
||||
struct ieee80211_he_mu_edca_param_ac_rec *mu_edca;
|
||||
int gen = rtwdev->chip->chip_gen;
|
||||
u8 aifs, aifsn;
|
||||
|
@ -370,32 +370,33 @@ static void ____rtw89_conf_tx_mu_edca(struct rtw89_dev *rtwdev,
|
|||
|
||||
mu_edca = ¶ms->mu_edca_param_rec;
|
||||
aifsn = FIELD_GET(GENMASK(3, 0), mu_edca->aifsn);
|
||||
aifs = aifsn ? rtw89_aifsn_to_aifs(rtwdev, rtwvif, aifsn) : 0;
|
||||
aifs = aifsn ? rtw89_aifsn_to_aifs(rtwdev, rtwvif_link, aifsn) : 0;
|
||||
timer_32us = mu_edca->mu_edca_timer << 8;
|
||||
|
||||
val = FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_TIMER_MASK, timer_32us) |
|
||||
FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_CW_MASK, mu_edca->ecw_min_max) |
|
||||
FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_AIFS_MASK, aifs);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, ac_to_mu_edca_param[ac][gen], rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, ac_to_mu_edca_param[ac][gen],
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32(rtwdev, reg, val);
|
||||
|
||||
rtw89_mac_set_hw_muedca_ctrl(rtwdev, rtwvif, true);
|
||||
rtw89_mac_set_hw_muedca_ctrl(rtwdev, rtwvif_link, true);
|
||||
}
|
||||
|
||||
static void __rtw89_conf_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, u16 ac)
|
||||
struct rtw89_vif_link *rtwvif_link, u16 ac)
|
||||
{
|
||||
____rtw89_conf_tx_edca(rtwdev, rtwvif, ac);
|
||||
____rtw89_conf_tx_mu_edca(rtwdev, rtwvif, ac);
|
||||
____rtw89_conf_tx_edca(rtwdev, rtwvif_link, ac);
|
||||
____rtw89_conf_tx_mu_edca(rtwdev, rtwvif_link, ac);
|
||||
}
|
||||
|
||||
static void rtw89_conf_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
u16 ac;
|
||||
|
||||
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
|
||||
__rtw89_conf_tx(rtwdev, rtwvif, ac);
|
||||
__rtw89_conf_tx(rtwdev, rtwvif_link, ac);
|
||||
}
|
||||
|
||||
static void rtw89_station_mode_sta_assoc(struct rtw89_dev *rtwdev,
|
||||
|
@ -421,7 +422,7 @@ static void rtw89_ops_vif_cfg_changed(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif, u64 changed)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
|
@ -431,7 +432,7 @@ static void rtw89_ops_vif_cfg_changed(struct ieee80211_hw *hw,
|
|||
rtw89_station_mode_sta_assoc(rtwdev, vif);
|
||||
rtw89_phy_set_bss_color(rtwdev, vif);
|
||||
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, vif);
|
||||
rtw89_mac_port_update(rtwdev, rtwvif);
|
||||
rtw89_mac_port_update(rtwdev, rtwvif_link);
|
||||
rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, vif);
|
||||
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
|
@ -448,7 +449,7 @@ static void rtw89_ops_vif_cfg_changed(struct ieee80211_hw *hw,
|
|||
rtw89_recalc_lps(rtwdev);
|
||||
|
||||
if (changed & BSS_CHANGED_ARP_FILTER)
|
||||
rtwvif->ip_addr = vif->cfg.arp_addr_list[0];
|
||||
rtwvif_link->ip_addr = vif->cfg.arp_addr_list[0];
|
||||
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
@ -459,23 +460,23 @@ static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
|
|||
u64 changed)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
ether_addr_copy(rtwvif->bssid, conf->bssid);
|
||||
rtw89_cam_bssid_changed(rtwdev, rtwvif);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
WRITE_ONCE(rtwvif->sync_bcn_tsf, 0);
|
||||
ether_addr_copy(rtwvif_link->bssid, conf->bssid);
|
||||
rtw89_cam_bssid_changed(rtwdev, rtwvif_link);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif_link, NULL, NULL);
|
||||
WRITE_ONCE(rtwvif_link->sync_bcn_tsf, 0);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON)
|
||||
rtw89_chip_h2c_update_beacon(rtwdev, rtwvif);
|
||||
rtw89_chip_h2c_update_beacon(rtwdev, rtwvif_link);
|
||||
|
||||
if (changed & BSS_CHANGED_ERP_SLOT)
|
||||
rtw89_conf_tx(rtwdev, rtwvif);
|
||||
rtw89_conf_tx(rtwdev, rtwvif_link);
|
||||
|
||||
if (changed & BSS_CHANGED_HE_BSS_COLOR)
|
||||
rtw89_phy_set_bss_color(rtwdev, vif);
|
||||
|
@ -490,7 +491,7 @@ static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
|
|||
rtw89_fw_h2c_set_bcn_fltr_cfg(rtwdev, vif, true);
|
||||
|
||||
if (changed & BSS_CHANGED_TPE)
|
||||
rtw89_reg_6ghz_recalc(rtwdev, rtwvif, true);
|
||||
rtw89_reg_6ghz_recalc(rtwdev, rtwvif_link, true);
|
||||
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
@ -500,12 +501,12 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
|
|||
struct ieee80211_bss_conf *link_conf)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
const struct rtw89_chan *chan;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
if (chan->band_type == RTW89_BAND_6G) {
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -514,14 +515,14 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
|
|||
if (rtwdev->scanning)
|
||||
rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif);
|
||||
|
||||
ether_addr_copy(rtwvif->bssid, vif->bss_conf.bssid);
|
||||
rtw89_cam_bssid_changed(rtwdev, rtwvif);
|
||||
rtw89_mac_port_update(rtwdev, rtwvif);
|
||||
ether_addr_copy(rtwvif_link->bssid, vif->bss_conf.bssid);
|
||||
rtw89_cam_bssid_changed(rtwdev, rtwvif_link);
|
||||
rtw89_mac_port_update(rtwdev, rtwvif_link);
|
||||
rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, vif, NULL);
|
||||
rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, NULL, RTW89_ROLE_TYPE_CHANGE);
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif);
|
||||
rtw89_fw_h2c_role_maintain(rtwdev, rtwvif_link, NULL, RTW89_ROLE_TYPE_CHANGE);
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, NULL, true);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif_link, NULL, NULL);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif_link);
|
||||
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
@ -534,12 +535,12 @@ void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
struct ieee80211_bss_conf *link_conf)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_mac_stop_ap(rtwdev, rtwvif);
|
||||
rtw89_mac_stop_ap(rtwdev, rtwvif_link);
|
||||
rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, vif, NULL);
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, NULL, true);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
|
@ -548,9 +549,9 @@ static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
|||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
|
||||
ieee80211_queue_work(rtwdev->hw, &rtwvif->update_beacon_work);
|
||||
ieee80211_queue_work(rtwdev->hw, &rtwvif_link->update_beacon_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -561,12 +562,12 @@ static int rtw89_ops_conf_tx(struct ieee80211_hw *hw,
|
|||
const struct ieee80211_tx_queue_params *params)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
rtwvif->tx_params[ac] = *params;
|
||||
__rtw89_conf_tx(rtwdev, rtwvif, ac);
|
||||
rtwvif_link->tx_params[ac] = *params;
|
||||
__rtw89_conf_tx(rtwdev, rtwvif_link, ac);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
|
@ -740,14 +741,14 @@ static void rtw89_ops_sta_statistics(struct ieee80211_hw *hw,
|
|||
static
|
||||
void __rtw89_drop_packets(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
if (vif) {
|
||||
rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
rtw89_mac_pkt_drop_vif(rtwdev, rtwvif);
|
||||
rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
rtw89_mac_pkt_drop_vif(rtwdev, rtwvif_link);
|
||||
} else {
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_mac_pkt_drop_vif(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_mac_pkt_drop_vif(rtwdev, rtwvif_link);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -778,7 +779,7 @@ static void rtw89_ra_mask_info_update_iter(void *data, struct ieee80211_sta *sta
|
|||
{
|
||||
struct rtw89_iter_bitrate_mask_data *br_data = data;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif_link);
|
||||
|
||||
if (vif != br_data->vif || vif->p2p)
|
||||
return;
|
||||
|
@ -854,10 +855,10 @@ static void rtw89_ops_sw_scan_start(struct ieee80211_hw *hw,
|
|||
const u8 *mac_addr)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_core_scan_start(rtwdev, rtwvif, mac_addr, false);
|
||||
rtw89_core_scan_start(rtwdev, rtwvif_link, mac_addr, false);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
|
@ -884,13 +885,13 @@ static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
struct ieee80211_scan_request *req)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
struct rtw89_vif_link *rtwvif_link = vif_to_rtwvif_safe(vif);
|
||||
int ret = 0;
|
||||
|
||||
if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw))
|
||||
return 1;
|
||||
|
||||
if (rtwdev->scanning || rtwvif->offchan)
|
||||
if (rtwdev->scanning || rtwvif_link->offchan)
|
||||
return -EBUSY;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
@ -970,11 +971,11 @@ static int rtw89_ops_assign_vif_chanctx(struct ieee80211_hw *hw,
|
|||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
ret = rtw89_chanctx_ops_assign_vif(rtwdev, rtwvif, ctx);
|
||||
ret = rtw89_chanctx_ops_assign_vif(rtwdev, rtwvif_link, ctx);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return ret;
|
||||
|
@ -986,10 +987,10 @@ static void rtw89_ops_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
|||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_chanctx_ops_unassign_vif(rtwdev, rtwvif, ctx);
|
||||
rtw89_chanctx_ops_unassign_vif(rtwdev, rtwvif_link, ctx);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
|
@ -1000,8 +1001,8 @@ static int rtw89_ops_remain_on_channel(struct ieee80211_hw *hw,
|
|||
enum ieee80211_roc_type type)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct rtw89_vif_link *rtwvif_link = vif_to_rtwvif_safe(vif);
|
||||
struct rtw89_roc *roc = &rtwvif_link->roc;
|
||||
|
||||
if (!vif)
|
||||
return -EINVAL;
|
||||
|
@ -1025,7 +1026,7 @@ static int rtw89_ops_remain_on_channel(struct ieee80211_hw *hw,
|
|||
roc->chan = *chan;
|
||||
roc->type = type;
|
||||
|
||||
rtw89_roc_start(rtwdev, rtwvif);
|
||||
rtw89_roc_start(rtwdev, rtwvif_link);
|
||||
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
|
@ -1036,15 +1037,15 @@ static int rtw89_ops_cancel_remain_on_channel(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
struct rtw89_vif_link *rtwvif_link = vif_to_rtwvif_safe(vif);
|
||||
|
||||
if (!rtwvif)
|
||||
if (!rtwvif_link)
|
||||
return -EINVAL;
|
||||
|
||||
cancel_delayed_work_sync(&rtwvif->roc.roc_work);
|
||||
cancel_delayed_work_sync(&rtwvif_link->roc.roc_work);
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_roc_end(rtwdev, rtwvif);
|
||||
rtw89_roc_end(rtwdev, rtwvif_link);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
|
@ -1054,7 +1055,7 @@ static void rtw89_set_tid_config_iter(void *data, struct ieee80211_sta *sta)
|
|||
{
|
||||
struct cfg80211_tid_config *tid_config = data;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwvif->rtwdev;
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwvif_link->rtwdev;
|
||||
|
||||
rtw89_core_set_tid_config(rtwdev, sta, tid_config);
|
||||
}
|
||||
|
|
|
@ -2094,10 +2094,10 @@ static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
u8 nc = 1, nr = 3, ng = 0, cb = 1, cs = 1, ldpc_en = 1, stbc_en = 1;
|
||||
u8 mac_idx = rtwvif->mac_idx;
|
||||
u8 port_sel = rtwvif->port;
|
||||
u8 mac_idx = rtwvif_link->mac_idx;
|
||||
u8 port_sel = rtwvif_link->port;
|
||||
u8 sound_dim = 3, t;
|
||||
u8 *phy_cap;
|
||||
u32 reg;
|
||||
|
@ -2158,9 +2158,9 @@ static int rtw89_mac_csi_rrsc_be(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
u32 rrsc = BIT(RTW89_MAC_BF_RRSC_6M) | BIT(RTW89_MAC_BF_RRSC_24M);
|
||||
u8 mac_idx = rtwvif->mac_idx;
|
||||
u8 mac_idx = rtwvif_link->mac_idx;
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
||||
|
@ -2198,12 +2198,12 @@ static void rtw89_mac_bf_assoc_be(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
|
||||
if (rtw89_sta_has_beamformer_cap(sta)) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BF,
|
||||
"initialize bfee for new association\n");
|
||||
rtw89_mac_init_bfee_be(rtwdev, rtwvif->mac_idx);
|
||||
rtw89_mac_init_bfee_be(rtwdev, rtwvif_link->mac_idx);
|
||||
rtw89_mac_set_csi_para_reg_be(rtwdev, vif, sta);
|
||||
rtw89_mac_csi_rrsc_be(rtwdev, vif, sta);
|
||||
}
|
||||
|
|
|
@ -298,12 +298,12 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
|||
struct ieee80211_sta *sta, bool csi)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif_link->rate_pattern;
|
||||
struct rtw89_ra_info *ra = &rtwsta->ra;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif);
|
||||
rtwvif_link->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif_link);
|
||||
const u64 *high_rate_masks = rtw89_ra_mask_ht_rates;
|
||||
u8 rssi = ewma_rssi_read(&rtwsta->avg_rssi);
|
||||
u64 ra_mask = 0;
|
||||
|
@ -458,7 +458,7 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
|||
ra->fixed_csi_rate_en = false;
|
||||
ra->ra_csi_rate_en = true;
|
||||
ra->cr_tbl_sel = false;
|
||||
ra->band_num = rtwvif->phy_idx;
|
||||
ra->band_num = rtwvif_link->phy_idx;
|
||||
ra->csi_bw = bw_mode;
|
||||
ra->csi_gi_ltf = RTW89_GILTF_LGI_4XHE32;
|
||||
ra->csi_mcs_ss_idx = 5;
|
||||
|
@ -528,10 +528,10 @@ void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
|||
const struct cfg80211_bitrate_mask *mask)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct rtw89_phy_rate_pattern next_pattern = {0};
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
static const u16 hw_rate_he[][RTW89_CHIP_GEN_NUM] = {
|
||||
RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS1_MCS0),
|
||||
RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS2_MCS0),
|
||||
|
@ -600,7 +600,7 @@ void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
|||
if (!next_pattern.enable)
|
||||
goto out;
|
||||
|
||||
rtwvif->rate_pattern = next_pattern;
|
||||
rtwvif_link->rate_pattern = next_pattern;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RA,
|
||||
"configure pattern: rate 0x%x, mask 0x%llx, mode 0x%x\n",
|
||||
next_pattern.rate,
|
||||
|
@ -609,7 +609,7 @@ void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
|||
return;
|
||||
|
||||
out:
|
||||
rtwvif->rate_pattern.enable = false;
|
||||
rtwvif_link->rate_pattern.enable = false;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RA, "unset rate pattern\n");
|
||||
}
|
||||
|
||||
|
@ -4429,33 +4429,33 @@ void rtw89_phy_cfo_parse(struct rtw89_dev *rtwdev, s16 cfo_val,
|
|||
cfo->packet_count++;
|
||||
}
|
||||
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->chanctx_idx);
|
||||
rtwvif_link->chanctx_idx);
|
||||
struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info;
|
||||
|
||||
if (!chip->ul_tb_waveform_ctrl)
|
||||
return;
|
||||
|
||||
rtwvif->def_tri_idx =
|
||||
rtwvif_link->def_tri_idx =
|
||||
rtw89_phy_read32_mask(rtwdev, R_DCFO_OPT, B_TXSHAPE_TRIANGULAR_CFG);
|
||||
|
||||
if (chip->chip_id == RTL8852B && rtwdev->hal.cv > CHIP_CBV)
|
||||
rtwvif->dyn_tb_bedge_en = false;
|
||||
rtwvif_link->dyn_tb_bedge_en = false;
|
||||
else if (chan->band_type >= RTW89_BAND_5G &&
|
||||
chan->band_width >= RTW89_CHANNEL_WIDTH_40)
|
||||
rtwvif->dyn_tb_bedge_en = true;
|
||||
rtwvif_link->dyn_tb_bedge_en = true;
|
||||
else
|
||||
rtwvif->dyn_tb_bedge_en = false;
|
||||
rtwvif_link->dyn_tb_bedge_en = false;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_UL_TB,
|
||||
"[ULTB] def_if_bandedge=%d, def_tri_idx=%d\n",
|
||||
ul_tb_info->def_if_bandedge, rtwvif->def_tri_idx);
|
||||
ul_tb_info->def_if_bandedge, rtwvif_link->def_tri_idx);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_UL_TB,
|
||||
"[ULTB] dyn_tb_begde_en=%d, dyn_tb_tri_en=%d\n",
|
||||
rtwvif->dyn_tb_bedge_en, ul_tb_info->dyn_tb_tri_en);
|
||||
rtwvif_link->dyn_tb_bedge_en, ul_tb_info->dyn_tb_tri_en);
|
||||
}
|
||||
|
||||
struct rtw89_phy_ul_tb_check_data {
|
||||
|
@ -4477,7 +4477,7 @@ struct rtw89_phy_power_diff {
|
|||
};
|
||||
|
||||
static void rtw89_phy_ofdma_power_diff(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
static const struct rtw89_phy_power_diff table[2] = {
|
||||
{0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x3},
|
||||
|
@ -4489,13 +4489,13 @@ static void rtw89_phy_ofdma_power_diff(struct rtw89_dev *rtwdev,
|
|||
if (!rtwdev->chip->ul_tb_pwr_diff)
|
||||
return;
|
||||
|
||||
if (rtwvif->pwr_diff_en == rtwvif->pre_pwr_diff_en) {
|
||||
rtwvif->pwr_diff_en = false;
|
||||
if (rtwvif_link->pwr_diff_en == rtwvif_link->pre_pwr_diff_en) {
|
||||
rtwvif_link->pwr_diff_en = false;
|
||||
return;
|
||||
}
|
||||
|
||||
rtwvif->pre_pwr_diff_en = rtwvif->pwr_diff_en;
|
||||
param = &table[rtwvif->pwr_diff_en];
|
||||
rtwvif_link->pre_pwr_diff_en = rtwvif_link->pwr_diff_en;
|
||||
param = &table[rtwvif_link->pwr_diff_en];
|
||||
|
||||
rtw89_phy_write32_mask(rtwdev, R_Q_MATRIX_00, B_Q_MATRIX_00_REAL,
|
||||
param->q_00);
|
||||
|
@ -4504,32 +4504,32 @@ static void rtw89_phy_ofdma_power_diff(struct rtw89_dev *rtwdev,
|
|||
rtw89_phy_write32_mask(rtwdev, R_CUSTOMIZE_Q_MATRIX,
|
||||
B_CUSTOMIZE_Q_MATRIX_EN, param->q_matrix_en);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_NORM_BW160,
|
||||
param->ultb_1t_norm_160);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_2T_NORM_BW160,
|
||||
param->ultb_2t_norm_160);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM1, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM1, rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_PATH_COM1_NORM_1STS,
|
||||
param->com1_norm_1sts);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM2, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM2, rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_PATH_COM2_RESP_1STS_PATH,
|
||||
param->com2_resp_1sts_path);
|
||||
}
|
||||
|
||||
static
|
||||
void rtw89_phy_ul_tb_ctrl_check(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_phy_ul_tb_check_data *ul_tb_data)
|
||||
{
|
||||
struct rtw89_traffic_stats *stats = &rtwdev->stats;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
|
||||
if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION)
|
||||
if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION)
|
||||
return;
|
||||
|
||||
if (!vif->cfg.assoc)
|
||||
|
@ -4542,11 +4542,11 @@ void rtw89_phy_ul_tb_ctrl_check(struct rtw89_dev *rtwdev,
|
|||
ul_tb_data->low_tf_client = true;
|
||||
|
||||
ul_tb_data->valid = true;
|
||||
ul_tb_data->def_tri_idx = rtwvif->def_tri_idx;
|
||||
ul_tb_data->dyn_tb_bedge_en = rtwvif->dyn_tb_bedge_en;
|
||||
ul_tb_data->def_tri_idx = rtwvif_link->def_tri_idx;
|
||||
ul_tb_data->dyn_tb_bedge_en = rtwvif_link->dyn_tb_bedge_en;
|
||||
}
|
||||
|
||||
rtw89_phy_ofdma_power_diff(rtwdev, rtwvif);
|
||||
rtw89_phy_ofdma_power_diff(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void rtw89_phy_ul_tb_waveform_ctrl(struct rtw89_dev *rtwdev,
|
||||
|
@ -4592,7 +4592,7 @@ void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev)
|
|||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_phy_ul_tb_check_data ul_tb_data = {};
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
if (!chip->ul_tb_waveform_ctrl && !chip->ul_tb_pwr_diff)
|
||||
return;
|
||||
|
@ -4600,8 +4600,8 @@ void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev)
|
|||
if (rtwdev->total_sta_assoc != 1)
|
||||
return;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_phy_ul_tb_ctrl_check(rtwdev, rtwvif, &ul_tb_data);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_phy_ul_tb_ctrl_check(rtwdev, rtwvif_link, &ul_tb_data);
|
||||
|
||||
if (!ul_tb_data.valid)
|
||||
return;
|
||||
|
@ -5896,13 +5896,13 @@ static void rtw89_phy_tx_path_div_sta_iter(void *data, struct ieee80211_sta *sta
|
|||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
bool *done = data;
|
||||
u8 rssi_a, rssi_b;
|
||||
u32 candidate;
|
||||
|
||||
if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION || sta->tdls)
|
||||
if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION || sta->tdls)
|
||||
return;
|
||||
|
||||
if (*done)
|
||||
|
|
|
@ -957,7 +957,7 @@ void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif
|
|||
void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_tssi_bandedge_cfg bandedge_cfg);
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev);
|
||||
u8 rtw89_encode_chan_idx(struct rtw89_dev *rtwdev, u8 central_ch, u8 band);
|
||||
void rtw89_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
|
||||
|
|
|
@ -62,9 +62,9 @@ static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
|
|||
rtw89_mac_power_mode_change(rtwdev, enter);
|
||||
}
|
||||
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
if (rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
if (rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
return;
|
||||
|
||||
if (!rtwdev->ps_mode)
|
||||
|
@ -85,23 +85,25 @@ void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
|||
rtw89_ps_power_mode_change(rtwdev, false);
|
||||
}
|
||||
|
||||
static void __rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void __rtw89_enter_lps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_lps_parm lps_param = {
|
||||
.macid = rtwvif->mac_id,
|
||||
.macid = rtwvif_link->mac_id,
|
||||
.psmode = RTW89_MAC_AX_PS_MODE_LEGACY,
|
||||
.lastrpwm = RTW89_LAST_RPWM_PS,
|
||||
};
|
||||
|
||||
rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_FW_CTRL);
|
||||
rtw89_fw_h2c_lps_parm(rtwdev, &lps_param);
|
||||
rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif);
|
||||
rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void __rtw89_leave_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void __rtw89_leave_lps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_lps_parm lps_param = {
|
||||
.macid = rtwvif->mac_id,
|
||||
.macid = rtwvif_link->mac_id,
|
||||
.psmode = RTW89_MAC_AX_PS_MODE_ACTIVE,
|
||||
.lastrpwm = RTW89_LAST_RPWM_ACTIVE,
|
||||
};
|
||||
|
@ -109,7 +111,7 @@ static void __rtw89_leave_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
|||
rtw89_fw_h2c_lps_parm(rtwdev, &lps_param);
|
||||
rtw89_fw_leave_lps_check(rtwdev, 0);
|
||||
rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON);
|
||||
rtw89_chip_digital_pwr_comp(rtwdev, rtwvif->phy_idx);
|
||||
rtw89_chip_digital_pwr_comp(rtwdev, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
||||
|
@ -119,7 +121,7 @@ void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
|||
__rtw89_leave_ps_mode(rtwdev);
|
||||
}
|
||||
|
||||
void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool ps_mode)
|
||||
{
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
@ -127,23 +129,24 @@ void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
|||
if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
|
||||
return;
|
||||
|
||||
__rtw89_enter_lps(rtwdev, rtwvif);
|
||||
__rtw89_enter_lps(rtwdev, rtwvif_link);
|
||||
if (ps_mode)
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif);
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif_link->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
return;
|
||||
|
||||
__rtw89_leave_lps(rtwdev, rtwvif);
|
||||
__rtw89_leave_lps(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
void rtw89_leave_lps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
|
@ -152,28 +155,28 @@ void rtw89_leave_lps(struct rtw89_dev *rtwdev)
|
|||
|
||||
__rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_leave_lps_vif(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_leave_lps_vif(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
void rtw89_enter_ips(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
set_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
|
||||
if (!test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
|
||||
return;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_mac_vif_deinit(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_mac_vif_deinit(rtwdev, rtwvif_link);
|
||||
|
||||
rtw89_core_stop(rtwdev);
|
||||
}
|
||||
|
||||
void rtw89_leave_ips(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
int ret;
|
||||
|
||||
if (test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
|
||||
|
@ -185,8 +188,8 @@ void rtw89_leave_ips(struct rtw89_dev *rtwdev)
|
|||
|
||||
rtw89_set_channel(rtwdev);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_mac_vif_init(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_mac_vif_init(rtwdev, rtwvif_link);
|
||||
|
||||
clear_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
}
|
||||
|
@ -197,34 +200,35 @@ void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl)
|
|||
rtw89_leave_lps(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_tsf32_toggle(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw89_tsf32_toggle(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
enum rtw89_p2pps_action act)
|
||||
{
|
||||
if (act == RTW89_P2P_ACT_UPDATE || act == RTW89_P2P_ACT_REMOVE)
|
||||
return;
|
||||
|
||||
if (act == RTW89_P2P_ACT_INIT)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif, true);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif_link, true);
|
||||
else if (act == RTW89_P2P_ACT_TERMINATE)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif, false);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif_link, false);
|
||||
}
|
||||
|
||||
static void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
enum rtw89_p2pps_action act;
|
||||
u8 noa_id;
|
||||
|
||||
if (rtwvif->last_noa_nr == 0)
|
||||
if (rtwvif_link->last_noa_nr == 0)
|
||||
return;
|
||||
|
||||
for (noa_id = 0; noa_id < rtwvif->last_noa_nr; noa_id++) {
|
||||
if (noa_id == rtwvif->last_noa_nr - 1)
|
||||
for (noa_id = 0; noa_id < rtwvif_link->last_noa_nr; noa_id++) {
|
||||
if (noa_id == rtwvif_link->last_noa_nr - 1)
|
||||
act = RTW89_P2P_ACT_TERMINATE;
|
||||
else
|
||||
act = RTW89_P2P_ACT_REMOVE;
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif, act);
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, vif, NULL, act, noa_id);
|
||||
}
|
||||
}
|
||||
|
@ -232,7 +236,7 @@ static void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
|
|||
static void rtw89_p2p_update_noa(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)vif->drv_priv;
|
||||
struct ieee80211_p2p_noa_desc *desc;
|
||||
enum rtw89_p2pps_action act;
|
||||
u8 noa_id;
|
||||
|
@ -246,10 +250,10 @@ static void rtw89_p2p_update_noa(struct rtw89_dev *rtwdev,
|
|||
act = RTW89_P2P_ACT_INIT;
|
||||
else
|
||||
act = RTW89_P2P_ACT_UPDATE;
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif, act);
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, vif, desc, act, noa_id);
|
||||
}
|
||||
rtwvif->last_noa_nr = noa_id;
|
||||
rtwvif_link->last_noa_nr = noa_id;
|
||||
}
|
||||
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
|
||||
|
@ -261,7 +265,7 @@ void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
|
|||
void rtw89_recalc_lps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *vif, *found_vif = NULL;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
enum rtw89_entity_mode mode;
|
||||
int count = 0;
|
||||
|
||||
|
@ -269,8 +273,8 @@ void rtw89_recalc_lps(struct rtw89_dev *rtwdev)
|
|||
if (mode == RTW89_ENTITY_MODE_MCC)
|
||||
goto disable_lps;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
vif = rtwvif_to_vif(rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
vif = rtwvif_to_vif(rtwvif_link);
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION) {
|
||||
count = 0;
|
||||
|
@ -291,9 +295,9 @@ disable_lps:
|
|||
rtwdev->lps_enabled = false;
|
||||
}
|
||||
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif)
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head;
|
||||
struct rtw89_noa_attr_head *noa_head = &ie->noa_head;
|
||||
|
@ -318,10 +322,10 @@ void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif)
|
|||
noa_head->oppps_ctwindow = 0;
|
||||
}
|
||||
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif_link *rtwvif_link,
|
||||
const struct ieee80211_p2p_noa_desc *desc)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head;
|
||||
struct rtw89_noa_attr_head *noa_head = &ie->noa_head;
|
||||
|
@ -338,9 +342,9 @@ void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
|||
ie->noa_desc[setter->noa_count++] = *desc;
|
||||
}
|
||||
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data)
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif_link *rtwvif_link, void **data)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
void *tail;
|
||||
|
||||
|
|
|
@ -5,21 +5,21 @@
|
|||
#ifndef __RTW89_PS_H_
|
||||
#define __RTW89_PS_H_
|
||||
|
||||
void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool ps_mode);
|
||||
void rtw89_leave_lps(struct rtw89_dev *rtwdev);
|
||||
void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
|
||||
void rtw89_enter_ips(struct rtw89_dev *rtwdev);
|
||||
void rtw89_leave_ips(struct rtw89_dev *rtwdev);
|
||||
void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl);
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
void rtw89_recalc_lps(struct rtw89_dev *rtwdev);
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif);
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif_link *rtwvif_link,
|
||||
const struct ieee80211_p2p_noa_desc *desc);
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data);
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif_link *rtwvif_link, void **data);
|
||||
|
||||
static inline void rtw89_leave_ips_by_hwflags(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
|
|
|
@ -793,18 +793,18 @@ static bool __rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev)
|
|||
{
|
||||
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
|
||||
struct rtw89_reg_6ghz_tpe new = {};
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
bool changed = false;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
const struct rtw89_reg_6ghz_tpe *tmp;
|
||||
const struct rtw89_chan *chan;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
tmp = &rtwvif->reg_6ghz_tpe;
|
||||
tmp = &rtwvif_link->reg_6ghz_tpe;
|
||||
if (!tmp->valid)
|
||||
continue;
|
||||
|
||||
|
@ -831,16 +831,16 @@ static bool __rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
static int rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool active,
|
||||
struct rtw89_vif_link *rtwvif_link, bool active,
|
||||
unsigned int *changed)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
||||
struct rtw89_reg_6ghz_tpe *tpe = &rtwvif->reg_6ghz_tpe;
|
||||
struct rtw89_reg_6ghz_tpe *tpe = &rtwvif_link->reg_6ghz_tpe;
|
||||
|
||||
memset(tpe, 0, sizeof(*tpe));
|
||||
|
||||
if (!active || rtwvif->reg_6ghz_power != RTW89_REG_6GHZ_POWER_STD)
|
||||
if (!active || rtwvif_link->reg_6ghz_power != RTW89_REG_6GHZ_POWER_STD)
|
||||
goto bottom;
|
||||
|
||||
rtw89_calculate_tpe(rtwdev, tpe, &bss_conf->tpe);
|
||||
|
@ -867,19 +867,19 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
|
|||
const struct rtw89_regd *regd = regulatory->regd;
|
||||
enum rtw89_reg_6ghz_power sel;
|
||||
const struct rtw89_chan *chan;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
int count = 0;
|
||||
u8 index;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
if (count != 0 && rtwvif->reg_6ghz_power == sel)
|
||||
if (count != 0 && rtwvif_link->reg_6ghz_power == sel)
|
||||
continue;
|
||||
|
||||
sel = rtwvif->reg_6ghz_power;
|
||||
sel = rtwvif_link->reg_6ghz_power;
|
||||
count++;
|
||||
}
|
||||
|
||||
|
@ -908,35 +908,35 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
static int rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool active,
|
||||
struct rtw89_vif_link *rtwvif_link, bool active,
|
||||
unsigned int *changed)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
|
||||
if (active) {
|
||||
switch (vif->bss_conf.power_type) {
|
||||
case IEEE80211_REG_VLP_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_VLP;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_VLP;
|
||||
break;
|
||||
case IEEE80211_REG_LPI_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_LPI;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_LPI;
|
||||
break;
|
||||
case IEEE80211_REG_SP_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_STD;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_STD;
|
||||
break;
|
||||
default:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
}
|
||||
|
||||
*changed += __rtw89_reg_6ghz_power_recalc(rtwdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool active)
|
||||
{
|
||||
unsigned int changed = 0;
|
||||
|
@ -948,11 +948,11 @@ int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
|||
* so must do reg_6ghz_tpe_recalc() after reg_6ghz_power_recalc().
|
||||
*/
|
||||
|
||||
ret = rtw89_reg_6ghz_power_recalc(rtwdev, rtwvif, active, &changed);
|
||||
ret = rtw89_reg_6ghz_power_recalc(rtwdev, rtwvif_link, active, &changed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rtw89_reg_6ghz_tpe_recalc(rtwdev, rtwvif, active, &changed);
|
||||
ret = rtw89_reg_6ghz_tpe_recalc(rtwdev, rtwvif_link, active, &changed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -1590,10 +1590,11 @@ static void rtw8851b_rfk_init(struct rtw89_dev *rtwdev)
|
|||
rtw8851b_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8851b_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8851b_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
|
@ -1608,10 +1609,12 @@ static void rtw8851b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw8851b_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx, rtwvif->chanctx_idx);
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
|
|
@ -1350,10 +1350,11 @@ static void rtw8852a_rfk_init(struct rtw89_dev *rtwdev)
|
|||
rtw8852a_rx_dck(rtwdev, RTW89_PHY_0, true, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852a_rx_dck(rtwdev, phy_idx, true, chanctx_idx);
|
||||
rtw8852a_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
|
@ -1368,10 +1369,11 @@ static void rtw8852a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw8852a_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
|
|
@ -562,10 +562,11 @@ static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev)
|
|||
rtw8852b_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852b_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852b_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
|
@ -580,10 +581,12 @@ static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw8852b_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx, rtwvif->chanctx_idx);
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
|
|
@ -535,10 +535,11 @@ static void rtw8852bt_rfk_init(struct rtw89_dev *rtwdev)
|
|||
rtw8852bt_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8852bt_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852bt_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852bt_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
|
@ -553,10 +554,12 @@ static void rtw8852bt_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw8852bt_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8852bt_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852bt_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx, rtwvif->chanctx_idx);
|
||||
rtw8852bt_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
|
|
@ -1846,10 +1846,11 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev)
|
|||
rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852c_mcc_get_ch_info(rtwdev, phy_idx);
|
||||
rtw8852c_rx_dck(rtwdev, phy_idx, false);
|
||||
|
@ -1866,10 +1867,11 @@ static void rtw8852c_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw8852c_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
|
||||
|
|
|
@ -2020,11 +2020,12 @@ static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
|
|||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif->chanctx_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
|
@ -2050,7 +2051,8 @@ static void rtw8922a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
|||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, chan, RTW89_TSSI_SCAN, 6);
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -298,25 +298,25 @@ static void drv_resume_rx(struct rtw89_ser *ser)
|
|||
clear_bit(RTW89_SER_DRV_STOP_RX, ser->flags);
|
||||
}
|
||||
|
||||
static void ser_reset_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void ser_reset_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
|
||||
rtwvif->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif->trigger = false;
|
||||
rtwvif->tdls_peer = 0;
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif_link->port);
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif_link->trigger = false;
|
||||
rtwvif_link->tdls_peer = 0;
|
||||
}
|
||||
|
||||
static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *target_rtwvif = (struct rtw89_vif *)data;
|
||||
struct rtw89_vif_link *target_rtwvif = (struct rtw89_vif_link *)data;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwsta->rtwvif_link;
|
||||
struct rtw89_dev *rtwdev = rtwvif_link->rtwdev;
|
||||
|
||||
if (rtwvif != target_rtwvif)
|
||||
if (rtwvif_link != target_rtwvif)
|
||||
return;
|
||||
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam);
|
||||
if (sta->tdls)
|
||||
rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta->bssid_cam);
|
||||
|
@ -324,28 +324,28 @@ static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
|
|||
INIT_LIST_HEAD(&rtwsta->ba_cam_list);
|
||||
}
|
||||
|
||||
static void ser_deinit_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void ser_deinit_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
ieee80211_iterate_stations_atomic(rtwdev->hw,
|
||||
ser_sta_deinit_cam_iter,
|
||||
rtwvif);
|
||||
rtwvif_link);
|
||||
|
||||
rtw89_cam_deinit(rtwdev, rtwvif);
|
||||
rtw89_cam_deinit(rtwdev, rtwvif_link);
|
||||
|
||||
bitmap_zero(rtwdev->cam_info.ba_cam_map, RTW89_MAX_BA_CAM_NUM);
|
||||
}
|
||||
|
||||
static void ser_reset_mac_binding(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
rtw89_cam_reset_keys(rtwdev);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
ser_deinit_cam(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
ser_deinit_cam(rtwdev, rtwvif_link);
|
||||
|
||||
rtw89_core_release_all_bits_map(rtwdev->mac_id_map, RTW89_MAX_MAC_ID_NUM);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
ser_reset_vif(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
ser_reset_vif(rtwdev, rtwvif_link);
|
||||
|
||||
rtwdev->total_sta_assoc = 0;
|
||||
}
|
||||
|
|
|
@ -21,14 +21,14 @@
|
|||
* twice cause the list to be added twice.
|
||||
*/
|
||||
static inline bool rtw89_rtwvif_in_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *new)
|
||||
struct rtw89_vif_link *new)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
if (rtwvif == new)
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
if (rtwvif_link == new)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
|
@ -682,26 +682,26 @@ static void rtw89_wow_leave_deep_ps(struct rtw89_dev *rtwdev)
|
|||
static void rtw89_wow_enter_deep_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif);
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void rtw89_wow_enter_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
|
||||
if (rtw89_wow_mgd_linked(rtwdev))
|
||||
rtw89_enter_lps(rtwdev, rtwvif, false);
|
||||
rtw89_enter_lps(rtwdev, rtwvif_link, false);
|
||||
else if (rtw89_wow_no_link(rtwdev))
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif, true);
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif_link, true);
|
||||
}
|
||||
|
||||
static void rtw89_wow_leave_ps(struct rtw89_dev *rtwdev, bool enable_wow)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
|
||||
if (rtw89_wow_mgd_linked(rtwdev)) {
|
||||
rtw89_leave_lps(rtwdev);
|
||||
|
@ -709,7 +709,7 @@ static void rtw89_wow_leave_ps(struct rtw89_dev *rtwdev, bool enable_wow)
|
|||
if (enable_wow)
|
||||
rtw89_leave_ips(rtwdev);
|
||||
else
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif, false);
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif_link, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -789,10 +789,11 @@ static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev)
|
|||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link);
|
||||
|
||||
/* Current WoWLAN function support setting of only vif in
|
||||
* infra mode or no link mode. When one suitable vif is found,
|
||||
|
@ -801,7 +802,7 @@ static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvi
|
|||
if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
switch (rtwvif->net_type) {
|
||||
switch (rtwvif_link->net_type) {
|
||||
case RTW89_NET_TYPE_INFRA:
|
||||
if (rtw_wow_has_mgd_features(rtwdev))
|
||||
rtw_wow->wow_vif = vif;
|
||||
|
@ -865,7 +866,7 @@ static u16 rtw89_calc_crc(u8 *pdata, int length)
|
|||
return ~crc;
|
||||
}
|
||||
|
||||
static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
||||
static int rtw89_wow_pattern_get_type(struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_wow_cam_info *rtw_pattern,
|
||||
const u8 *pattern, u8 da_mask)
|
||||
{
|
||||
|
@ -885,7 +886,7 @@ static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
|||
rtw_pattern->bc = true;
|
||||
else if (is_multicast_ether_addr(da))
|
||||
rtw_pattern->mc = true;
|
||||
else if (ether_addr_equal(da, rtwvif->mac_addr) &&
|
||||
else if (ether_addr_equal(da, rtwvif_link->mac_addr) &&
|
||||
da_mask == GENMASK(5, 0))
|
||||
rtw_pattern->uc = true;
|
||||
else if (!da_mask) /*da_mask == 0 mean wildcard*/
|
||||
|
@ -897,7 +898,7 @@ static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
|||
}
|
||||
|
||||
static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
const struct cfg80211_pkt_pattern *pkt_pattern,
|
||||
struct rtw89_wow_cam_info *rtw_pattern)
|
||||
{
|
||||
|
@ -916,7 +917,7 @@ static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
|||
mask_len = DIV_ROUND_UP(len, 8);
|
||||
memset(rtw_pattern, 0, sizeof(*rtw_pattern));
|
||||
|
||||
ret = rtw89_wow_pattern_get_type(rtwvif, rtw_pattern, pattern,
|
||||
ret = rtw89_wow_pattern_get_type(rtwvif_link, rtw_pattern, pattern,
|
||||
mask[0] & GENMASK(5, 0));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -970,7 +971,7 @@ static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct cfg80211_wowlan *wowlan)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
@ -983,7 +984,7 @@ static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev,
|
|||
|
||||
for (i = 0; i < wowlan->n_patterns; i++) {
|
||||
rtw_pattern = &rtw_wow->patterns[i];
|
||||
ret = rtw89_wow_pattern_generate(rtwdev, rtwvif,
|
||||
ret = rtw89_wow_pattern_generate(rtwdev, rtwvif_link,
|
||||
&wowlan->patterns[i],
|
||||
rtw_pattern);
|
||||
if (ret) {
|
||||
|
@ -1066,7 +1067,7 @@ static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
|||
struct cfg80211_wowlan *wowlan)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
|
||||
if (wowlan->disconnect)
|
||||
set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags);
|
||||
|
@ -1078,36 +1079,36 @@ static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
|||
if (wowlan->nd_config)
|
||||
rtw89_wow_init_pno(rtwdev, wowlan->nd_config);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_wow_vif_iter(rtwdev, rtwvif);
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif_link)
|
||||
rtw89_wow_vif_iter(rtwdev, rtwvif_link);
|
||||
|
||||
if (!rtw_wow->wow_vif)
|
||||
return -EPERM;
|
||||
|
||||
rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
return rtw89_wow_parse_patterns(rtwdev, rtwvif, wowlan);
|
||||
rtwvif_link = (struct rtw89_vif_link *)rtw_wow->wow_vif->drv_priv;
|
||||
return rtw89_wow_parse_patterns(rtwdev, rtwvif_link, wowlan);
|
||||
}
|
||||
|
||||
static int rtw89_wow_cfg_wake_pno(struct rtw89_dev *rtwdev, bool wow)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif, true);
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to config pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow global\n");
|
||||
return ret;
|
||||
|
@ -1120,33 +1121,33 @@ static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
|
|||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
struct ieee80211_sta *wow_sta;
|
||||
struct rtw89_sta *rtwsta = NULL;
|
||||
int ret;
|
||||
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid);
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif_link->bssid);
|
||||
if (wow_sta)
|
||||
rtwsta = (struct rtw89_sta *)wow_sta->drv_priv;
|
||||
|
||||
if (wow) {
|
||||
if (rtw_wow->pattern_cnt)
|
||||
rtwvif->wowlan_pattern = true;
|
||||
rtwvif_link->wowlan_pattern = true;
|
||||
if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags))
|
||||
rtwvif->wowlan_magic = true;
|
||||
rtwvif_link->wowlan_magic = true;
|
||||
} else {
|
||||
rtwvif->wowlan_pattern = false;
|
||||
rtwvif->wowlan_magic = false;
|
||||
rtwvif_link->wowlan_pattern = false;
|
||||
rtwvif_link->wowlan_magic = false;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (wow) {
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
|
||||
ret);
|
||||
|
@ -1154,13 +1155,13 @@ static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
|
|||
}
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow global\n");
|
||||
return ret;
|
||||
|
@ -1191,7 +1192,7 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
|||
enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen;
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
bool include_bb = !!chip->bbmcu_nr;
|
||||
|
@ -1204,7 +1205,7 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
|||
if (chip_id == RTL8852C || chip_id == RTL8922A)
|
||||
disable_intr_for_dlfw = true;
|
||||
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid);
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif_link->bssid);
|
||||
if (wow_sta)
|
||||
rtwsta = (struct rtw89_sta *)wow_sta->drv_priv;
|
||||
else
|
||||
|
@ -1224,7 +1225,7 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
|||
|
||||
rtw89_phy_init_rf_reg(rtwdev, true);
|
||||
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif_link, rtwsta,
|
||||
RTW89_ROLE_FW_RESTORE);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c role maintain\n");
|
||||
|
@ -1240,20 +1241,20 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
|||
if (!is_conn)
|
||||
rtw89_cam_reset_keys(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, !is_conn);
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, rtwsta, !is_conn);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c join info\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (is_conn) {
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif_link, rtwsta->mac_id);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
|
||||
return ret;
|
||||
|
@ -1377,7 +1378,7 @@ static int rtw89_wow_disable_trx_post(struct rtw89_dev *rtwdev)
|
|||
}
|
||||
|
||||
static void rtw89_fw_release_pno_pkt_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct list_head *pkt_list = &rtw_wow->pno_pkt_list;
|
||||
|
@ -1391,7 +1392,7 @@ static void rtw89_fw_release_pno_pkt_list(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
|
||||
static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
|
@ -1401,7 +1402,7 @@ static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
|||
int ret;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr,
|
||||
skb = ieee80211_probereq_get(rtwdev->hw, rtwvif_link->mac_addr,
|
||||
nd_config->match_sets[i].ssid.ssid,
|
||||
nd_config->match_sets[i].ssid.ssid_len,
|
||||
nd_config->ie_len);
|
||||
|
@ -1413,7 +1414,7 @@ static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
|||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
kfree_skb(skb);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -1421,7 +1422,7 @@ static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
|||
if (ret) {
|
||||
kfree_skb(skb);
|
||||
kfree(info);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1437,19 +1438,19 @@ static int rtw89_pno_scan_offload(struct rtw89_dev *rtwdev, bool enable)
|
|||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
int interval = rtw_wow->nd_config->scan_plans[0].interval;
|
||||
struct rtw89_scan_option opt = {};
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = rtw89_pno_scan_update_probe_req(rtwdev, rtwvif);
|
||||
ret = rtw89_pno_scan_update_probe_req(rtwdev, rtwvif_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update probe request failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mac->add_chan_list_pno(rtwdev, rtwvif);
|
||||
ret = mac->add_chan_list_pno(rtwdev, rtwvif_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update channel list failed\n");
|
||||
return ret;
|
||||
|
@ -1471,7 +1472,7 @@ static int rtw89_pno_scan_offload(struct rtw89_dev *rtwdev, bool enable)
|
|||
opt.opch_end = RTW89_CHAN_INVALID;
|
||||
}
|
||||
|
||||
mac->scan_offload(rtwdev, &opt, rtwvif, true);
|
||||
mac->scan_offload(rtwdev, &opt, rtwvif_link, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1480,7 +1481,7 @@ static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev)
|
|||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
|
@ -1499,25 +1500,25 @@ static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev)
|
|||
rtw89_wow_pattern_write(rtwdev);
|
||||
rtw89_wow_construct_key_info(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true);
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true);
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, true);
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, true);
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif_link, true);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to enable arp offload\n");
|
||||
}
|
||||
|
@ -1549,7 +1550,7 @@ static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
|
|||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
|
@ -1559,35 +1560,35 @@ static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif, false);
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
} else {
|
||||
rtw89_wow_pattern_clear(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false);
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, false);
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, false);
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif_link, false);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to disable arp offload\n");
|
||||
|
||||
|
|
|
@ -98,17 +98,17 @@ static inline int rtw89_wow_get_sec_hdr_len(struct rtw89_dev *rtwdev)
|
|||
static inline bool rtw89_wow_mgd_linked(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
|
||||
return rtwvif->net_type == RTW89_NET_TYPE_INFRA;
|
||||
return rtwvif_link->net_type == RTW89_NET_TYPE_INFRA;
|
||||
}
|
||||
|
||||
static inline bool rtw89_wow_no_link(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = (struct rtw89_vif_link *)wow_vif->drv_priv;
|
||||
|
||||
return rtwvif->net_type == RTW89_NET_TYPE_NO_LINK;
|
||||
return rtwvif_link->net_type == RTW89_NET_TYPE_NO_LINK;
|
||||
}
|
||||
|
||||
static inline bool rtw_wow_has_mgd_features(struct rtw89_dev *rtwdev)
|
||||
|
|
Loading…
Add table
Reference in a new issue