Merge tag 'mac80211-next-for-net-next-2021-06-25' of git://git.kernel.org/pub/scm...
[linux-2.6-microblaze.git] / drivers / net / wireless / intel / iwlwifi / mvm / mac80211.c
index cc78f30..70ebecb 100644 (file)
@@ -3800,6 +3800,7 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct cfg80211_chan_def chandef;
        struct iwl_mvm_phy_ctxt *phy_ctxt;
+       bool band_change_removal;
        int ret, i;
 
        IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
@@ -3880,19 +3881,30 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
        cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
 
        /*
-        * Change the PHY context configuration as it is currently referenced
-        * only by the P2P Device MAC
+        * Check if the remain-on-channel is on a different band and that
+        * requires context removal, see iwl_mvm_phy_ctxt_changed(). If
+        * so, we'll need to release and then re-configure here, since we
+        * must not remove a PHY context that's part of a binding.
         */
-       if (mvmvif->phy_ctxt->ref == 1) {
+       band_change_removal =
+               fw_has_capa(&mvm->fw->ucode_capa,
+                           IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT) &&
+               mvmvif->phy_ctxt->channel->band != chandef.chan->band;
+
+       if (mvmvif->phy_ctxt->ref == 1 && !band_change_removal) {
+               /*
+                * Change the PHY context configuration as it is currently
+                * referenced only by the P2P Device MAC (and we can modify it)
+                */
                ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt,
                                               &chandef, 1, 1);
                if (ret)
                        goto out_unlock;
        } else {
                /*
-                * The PHY context is shared with other MACs. Need to remove the
-                * P2P Device from the binding, allocate an new PHY context and
-                * create a new binding
+                * The PHY context is shared with other MACs (or we're trying to
+                * switch bands), so remove the P2P Device from the binding,
+                * allocate an new PHY context and create a new binding.
                 */
                phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
                if (!phy_ctxt) {
@@ -4211,7 +4223,6 @@ static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
        struct ieee80211_vif *disabled_vif = NULL;
 
        lockdep_assert_held(&mvm->mutex);
-
        iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data);
 
        switch (vif->type) {