Commit 4263ac7f authored by Gregory Greenman's avatar Gregory Greenman Committed by Johannes Berg

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: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230328104949.dc1074239c5b.I30db722af9009f1b274fa929f276fd2b78520dea@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent d6f6b0d8
...@@ -4608,7 +4608,8 @@ void iwl_mvm_change_chanctx(struct ieee80211_hw *hw, ...@@ -4608,7 +4608,8 @@ void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
* Returns true if we're done assigning the chanctx * Returns true if we're done assigning the chanctx
* (either on failure or success) * (either on failure or success)
*/ */
bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm, static bool
__iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx, int *ret) bool switching_chanctx, int *ret)
...@@ -4651,12 +4652,16 @@ bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm, ...@@ -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, static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx) bool switching_chanctx)
{ {
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
int ret; int ret;
if (WARN_ON(!link_conf))
return -EINVAL;
if (__iwl_mvm_assign_vif_chanctx_common(mvm, vif, ctx, if (__iwl_mvm_assign_vif_chanctx_common(mvm, vif, ctx,
switching_chanctx, &ret)) switching_chanctx, &ret))
goto out; goto out;
...@@ -4736,7 +4741,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -4736,7 +4741,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
int ret; int ret;
mutex_lock(&mvm->mutex); 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); mutex_unlock(&mvm->mutex);
return ret; return ret;
...@@ -4748,7 +4753,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -4748,7 +4753,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
* Returns if chanctx unassign chanctx is done * Returns if chanctx unassign chanctx is done
* (either on failure or success) * (either on failure or success)
*/ */
bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm, static bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
bool switching_chanctx) bool switching_chanctx)
{ {
...@@ -4788,6 +4793,7 @@ bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm, ...@@ -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, static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx) bool switching_chanctx)
{ {
...@@ -4827,7 +4833,7 @@ static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -4827,7 +4833,7 @@ static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
mutex_lock(&mvm->mutex); 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); mutex_unlock(&mvm->mutex);
} }
...@@ -4839,7 +4845,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm, ...@@ -4839,7 +4845,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
int ret; int ret;
mutex_lock(&mvm->mutex); 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); __iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx);
ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_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, ...@@ -4848,8 +4855,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
goto out_reassign; goto out_reassign;
} }
ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx, ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
true); vifs[0].new_ctx, true);
if (ret) { if (ret) {
IWL_ERR(mvm, IWL_ERR(mvm,
"failed to assign new_ctx during channel switch\n"); "failed to assign new_ctx during channel switch\n");
...@@ -4871,8 +4878,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm, ...@@ -4871,8 +4878,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
goto out_restart; goto out_restart;
} }
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
true)) { vifs[0].old_ctx, true)) {
IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n"); IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
goto out_restart; goto out_restart;
} }
...@@ -4897,10 +4904,11 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm, ...@@ -4897,10 +4904,11 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
int ret; int ret;
mutex_lock(&mvm->mutex); 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, ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
true); vifs[0].new_ctx, true);
if (ret) { if (ret) {
IWL_ERR(mvm, IWL_ERR(mvm,
"failed to assign new_ctx during channel switch\n"); "failed to assign new_ctx during channel switch\n");
...@@ -4910,8 +4918,8 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm, ...@@ -4910,8 +4918,8 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
goto out; goto out;
out_reassign: out_reassign:
if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
true)) { vifs[0].old_ctx, true)) {
IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n"); IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
goto out_restart; goto out_restart;
} }
......
...@@ -220,17 +220,23 @@ static void iwl_mvm_mld_mac_remove_interface(struct ieee80211_hw *hw, ...@@ -220,17 +220,23 @@ static void iwl_mvm_mld_mac_remove_interface(struct ieee80211_hw *hw,
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
} }
static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm, static int
__iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx) bool switching_chanctx)
{ {
u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
unsigned int link_id = link_conf->link_id;
int ret; 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) { if (switching_chanctx) {
/* reactivate if we turned this off during channel switch */ /* 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, ...@@ -239,12 +245,12 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
} }
/* send it first with phy context ID */ /* 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) if (ret)
goto out; goto out;
/* then activate */ /* 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_ACTIVE |
LINK_CONTEXT_MODIFY_RATES_INFO, LINK_CONTEXT_MODIFY_RATES_INFO,
true); true);
...@@ -258,8 +264,7 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm, ...@@ -258,8 +264,7 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
iwl_mvm_power_update_mac(mvm); iwl_mvm_power_update_mac(mvm);
if (vif->type == NL80211_IFTYPE_MONITOR) { if (vif->type == NL80211_IFTYPE_MONITOR) {
ret = iwl_mvm_mld_add_snif_sta(mvm, vif, ret = iwl_mvm_mld_add_snif_sta(mvm, vif, link_conf);
&vif->bss_conf);
if (ret) if (ret)
goto deactivate; goto deactivate;
} }
...@@ -267,10 +272,10 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm, ...@@ -267,10 +272,10 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
return 0; return 0;
deactivate: deactivate:
iwl_mvm_link_changed(mvm, vif, &vif->bss_conf, iwl_mvm_link_changed(mvm, vif, link_conf, LINK_CONTEXT_MODIFY_ACTIVE,
LINK_CONTEXT_MODIFY_ACTIVE, false); false);
out: out:
mvmvif->deflink.phy_ctxt = NULL; mvmvif->link[link_id]->phy_ctxt = NULL;
iwl_mvm_power_update_mac(mvm); iwl_mvm_power_update_mac(mvm);
return ret; return ret;
} }
...@@ -284,18 +289,25 @@ static int iwl_mvm_mld_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -284,18 +289,25 @@ static int iwl_mvm_mld_assign_vif_chanctx(struct ieee80211_hw *hw,
int ret; int ret;
mutex_lock(&mvm->mutex); 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); mutex_unlock(&mvm->mutex);
return ret; return ret;
} }
static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm, static void
__iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx) bool switching_chanctx)
{ {
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 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) { if (vif->type == NL80211_IFTYPE_AP && switching_chanctx) {
mvmvif->csa_countdown = false; mvmvif->csa_countdown = false;
...@@ -312,12 +324,12 @@ static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm, ...@@ -312,12 +324,12 @@ static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
if (vif->type == NL80211_IFTYPE_MONITOR) if (vif->type == NL80211_IFTYPE_MONITOR)
iwl_mvm_mld_rm_snif_sta(mvm, vif); 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); LINK_CONTEXT_MODIFY_ACTIVE, false);
if (switching_chanctx) if (switching_chanctx)
return; return;
mvmvif->deflink.phy_ctxt = NULL; mvmvif->link[link_id]->phy_ctxt = NULL;
iwl_mvm_power_update_mac(mvm); iwl_mvm_power_update_mac(mvm);
} }
...@@ -329,7 +341,7 @@ static void iwl_mvm_mld_unassign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -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); struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
mutex_lock(&mvm->mutex); 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); mutex_unlock(&mvm->mutex);
} }
......
...@@ -2365,10 +2365,12 @@ int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw, ...@@ -2365,10 +2365,12 @@ int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
struct iwl_mvm_switch_vif_chanctx_ops { struct iwl_mvm_switch_vif_chanctx_ops {
int (*__assign_vif_chanctx)(struct iwl_mvm *mvm, int (*__assign_vif_chanctx)(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx); bool switching_chanctx);
void (*__unassign_vif_chanctx)(struct iwl_mvm *mvm, void (*__unassign_vif_chanctx)(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
bool switching_chanctx); bool switching_chanctx);
}; };
...@@ -2380,14 +2382,6 @@ iwl_mvm_switch_vif_chanctx_common(struct ieee80211_hw *hw, ...@@ -2380,14 +2382,6 @@ iwl_mvm_switch_vif_chanctx_common(struct ieee80211_hw *hw,
enum ieee80211_chanctx_switch_mode mode, enum ieee80211_chanctx_switch_mode mode,
struct iwl_mvm_switch_vif_chanctx_ops *ops); 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 */ /* Channel info utils */
static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm) static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment