wifi: iwlwifi: mvm: adjust to MLO assign/unassign/switch_vif_chanctx()
Pass link_conf when it's necessary and change the code accordingly. Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230328104949.dc1074239c5b.I30db722af9009f1b274fa929f276fd2b78520dea@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
d6f6b0d804
commit
4263ac7fe5
@ -4608,10 +4608,11 @@ out_unlock:
|
||||
* Returns true if we're done assigning the chanctx
|
||||
* (either on failure or success)
|
||||
*/
|
||||
bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx, int *ret)
|
||||
static bool
|
||||
__iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx, int *ret)
|
||||
{
|
||||
u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
|
||||
struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
|
||||
@ -4651,12 +4652,16 @@ bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
|
||||
static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(!link_conf))
|
||||
return -EINVAL;
|
||||
|
||||
if (__iwl_mvm_assign_vif_chanctx_common(mvm, vif, ctx,
|
||||
switching_chanctx, &ret))
|
||||
goto out;
|
||||
@ -4736,7 +4741,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, ctx, false);
|
||||
ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, link_conf, ctx, false);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return ret;
|
||||
@ -4748,9 +4753,9 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
* Returns if chanctx unassign chanctx is done
|
||||
* (either on failure or success)
|
||||
*/
|
||||
bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
bool switching_chanctx)
|
||||
static bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
bool switching_chanctx)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
|
||||
@ -4788,6 +4793,7 @@ bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
|
||||
static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
{
|
||||
@ -4827,7 +4833,7 @@ static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
__iwl_mvm_unassign_vif_chanctx(mvm, vif, ctx, false);
|
||||
__iwl_mvm_unassign_vif_chanctx(mvm, vif, link_conf, ctx, false);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
@ -4839,7 +4845,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
|
||||
ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].old_ctx, true);
|
||||
__iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx);
|
||||
|
||||
ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_ctx);
|
||||
@ -4848,8 +4855,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
|
||||
goto out_reassign;
|
||||
}
|
||||
|
||||
ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
|
||||
true);
|
||||
ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].new_ctx, true);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm,
|
||||
"failed to assign new_ctx during channel switch\n");
|
||||
@ -4871,8 +4878,8 @@ out_reassign:
|
||||
goto out_restart;
|
||||
}
|
||||
|
||||
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
|
||||
true)) {
|
||||
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].old_ctx, true)) {
|
||||
IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
|
||||
goto out_restart;
|
||||
}
|
||||
@ -4897,10 +4904,11 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
|
||||
ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].old_ctx, true);
|
||||
|
||||
ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
|
||||
true);
|
||||
ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].new_ctx, true);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm,
|
||||
"failed to assign new_ctx during channel switch\n");
|
||||
@ -4910,8 +4918,8 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
|
||||
goto out;
|
||||
|
||||
out_reassign:
|
||||
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
|
||||
true)) {
|
||||
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
|
||||
vifs[0].old_ctx, true)) {
|
||||
IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
|
||||
goto out_restart;
|
||||
}
|
||||
|
@ -220,17 +220,23 @@ static void iwl_mvm_mld_mac_remove_interface(struct ieee80211_hw *hw,
|
||||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
static int
|
||||
__iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
{
|
||||
u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
|
||||
struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
unsigned int link_id = link_conf->link_id;
|
||||
int ret;
|
||||
|
||||
mvmvif->deflink.phy_ctxt = phy_ctxt;
|
||||
if (WARN_ON_ONCE(!mvmvif->link[link_id]))
|
||||
return -EINVAL;
|
||||
|
||||
mvmvif->link[link_id]->phy_ctxt = phy_ctxt;
|
||||
|
||||
if (switching_chanctx) {
|
||||
/* reactivate if we turned this off during channel switch */
|
||||
@ -239,12 +245,12 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
/* send it first with phy context ID */
|
||||
ret = iwl_mvm_link_changed(mvm, vif, &vif->bss_conf, 0, false);
|
||||
ret = iwl_mvm_link_changed(mvm, vif, link_conf, 0, false);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* then activate */
|
||||
ret = iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
|
||||
ret = iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE |
|
||||
LINK_CONTEXT_MODIFY_RATES_INFO,
|
||||
true);
|
||||
@ -258,8 +264,7 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
iwl_mvm_power_update_mac(mvm);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR) {
|
||||
ret = iwl_mvm_mld_add_snif_sta(mvm, vif,
|
||||
&vif->bss_conf);
|
||||
ret = iwl_mvm_mld_add_snif_sta(mvm, vif, link_conf);
|
||||
if (ret)
|
||||
goto deactivate;
|
||||
}
|
||||
@ -267,10 +272,10 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
return 0;
|
||||
|
||||
deactivate:
|
||||
iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf, LINK_CONTEXT_MODIFY_ACTIVE,
|
||||
false);
|
||||
out:
|
||||
mvmvif->deflink.phy_ctxt = NULL;
|
||||
mvmvif->link[link_id]->phy_ctxt = NULL;
|
||||
iwl_mvm_power_update_mac(mvm);
|
||||
return ret;
|
||||
}
|
||||
@ -284,18 +289,25 @@ static int iwl_mvm_mld_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ret = __iwl_mvm_mld_assign_vif_chanctx(mvm, vif, ctx, false);
|
||||
ret = __iwl_mvm_mld_assign_vif_chanctx(mvm, vif, link_conf, ctx, false);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
static void
|
||||
__iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
unsigned int link_id = link_conf->link_id;
|
||||
|
||||
/* shouldn't happen, but verify link_id is valid before accessing */
|
||||
if (WARN_ON_ONCE(!mvmvif->link[link_id]))
|
||||
return;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP && switching_chanctx) {
|
||||
mvmvif->csa_countdown = false;
|
||||
@ -312,12 +324,12 @@ static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
iwl_mvm_mld_rm_snif_sta(mvm, vif);
|
||||
|
||||
iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
|
||||
if (switching_chanctx)
|
||||
return;
|
||||
mvmvif->deflink.phy_ctxt = NULL;
|
||||
mvmvif->link[link_id]->phy_ctxt = NULL;
|
||||
iwl_mvm_power_update_mac(mvm);
|
||||
}
|
||||
|
||||
@ -329,7 +341,7 @@ static void iwl_mvm_mld_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
__iwl_mvm_mld_unassign_vif_chanctx(mvm, vif, ctx, false);
|
||||
__iwl_mvm_mld_unassign_vif_chanctx(mvm, vif, link_conf, ctx, false);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
|
@ -2365,10 +2365,12 @@ int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
|
||||
struct iwl_mvm_switch_vif_chanctx_ops {
|
||||
int (*__assign_vif_chanctx)(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx);
|
||||
void (*__unassign_vif_chanctx)(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx);
|
||||
};
|
||||
@ -2380,14 +2382,6 @@ iwl_mvm_switch_vif_chanctx_common(struct ieee80211_hw *hw,
|
||||
enum ieee80211_chanctx_switch_mode mode,
|
||||
struct iwl_mvm_switch_vif_chanctx_ops *ops);
|
||||
|
||||
bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
bool switching_chanctx, int *ret);
|
||||
bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
bool switching_chanctx);
|
||||
|
||||
/* Channel info utils */
|
||||
static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user