wifi: iwlwifi: mvm: adjust to MLO assign/unassign/switch_vif_chanctx()
authorGregory Greenman <gregory.greenman@intel.com>
Tue, 28 Mar 2023 07:59:07 +0000 (10:59 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 30 Mar 2023 10:07:56 +0000 (12:07 +0200)
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>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index b90b0a973cecbdd2b4c3044c196e8ea9a81e2ee7..82e7a66c5828b0e0ecd18bfe0934cc49f584fd13 100644 (file)
@@ -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;
        }
index b861b5478e0832e1838b538ab20f306978c9604f..0c233d151231230731aeaf687f129cb3f334497e 100644 (file)
@@ -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);
 }
 
index ad67a9b718078e500a0c1efbb870610b2bba2059..811647c8aa717ec315162c2767e9ca5265489549 100644 (file)
@@ -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)
 {