int iwl_mvm_up(struct iwl_mvm *mvm)
 {
        int ret, i;
+       struct ieee80211_channel *chan;
+       struct cfg80211_chan_def chandef;
 
        lockdep_assert_held(&mvm->mutex);
 
        if (ret)
                goto error;
 
-       IWL_DEBUG_INFO(mvm, "RT uCode started.\n");
+       /* Add all the PHY contexts */
+       chan = &mvm->hw->wiphy->bands[IEEE80211_BAND_2GHZ]->channels[0];
+       cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
+       for (i = 0; i < NUM_PHY_CTX; i++) {
+               /*
+                * The channel used here isn't relevant as it's
+                * going to be overwritten in the other flows.
+                * For now use the first channel we have.
+                */
+               ret = iwl_mvm_phy_ctxt_add(mvm, &mvm->phy_ctxts[i],
+                                          &chandef, 1, 1);
+               if (ret)
+                       goto error;
+       }
 
+       IWL_DEBUG_INFO(mvm, "RT uCode started.\n");
        return 0;
  error:
        iwl_trans_stop_device(mvm->trans);
 
         * MAC context is bound to it at this stage.
         */
        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
-               struct ieee80211_channel *chan;
-               struct cfg80211_chan_def chandef;
 
                mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
                if (!mvmvif->phy_ctxt) {
                        goto out_remove_mac;
                }
 
-               /*
-                * The channel used here isn't relevant as it's
-                * going to be overwritten as part of the ROC flow.
-                * For now use the first channel we have.
-                */
-               chan = &mvm->hw->wiphy->bands[IEEE80211_BAND_2GHZ]->channels[0];
-               cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
-               ret = iwl_mvm_phy_ctxt_add(mvm, mvmvif->phy_ctxt,
-                                          &chandef, 1, 1);
-               if (ret)
-                       goto out_remove_mac;
-
+               iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
                ret = iwl_mvm_binding_add_vif(mvm, vif);
                if (ret)
-                       goto out_remove_phy;
+                       goto out_unref_phy;
 
                ret = iwl_mvm_add_bcast_sta(mvm, vif, &mvmvif->bcast_sta);
                if (ret)
 
  out_unbind:
        iwl_mvm_binding_remove_vif(mvm, vif);
- out_remove_phy:
+ out_unref_phy:
        iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
  out_remove_mac:
        mvmvif->phy_ctxt = NULL;
        struct iwl_mvm_phy_ctxt *phy_ctxt;
        int ret;
 
-       IWL_DEBUG_MAC80211(mvm, "Add PHY context\n");
+       IWL_DEBUG_MAC80211(mvm, "Add channel context\n");
 
        mutex_lock(&mvm->mutex);
        phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
                goto out;
        }
 
-       ret = iwl_mvm_phy_ctxt_add(mvm, phy_ctxt, &ctx->def,
-                                  ctx->rx_chains_static,
-                                  ctx->rx_chains_dynamic);
+       ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->def,
+                                      ctx->rx_chains_static,
+                                      ctx->rx_chains_dynamic);
        if (ret) {
                IWL_ERR(mvm, "Failed to add PHY context\n");
                goto out;
        }
 
+       iwl_mvm_phy_ctxt_ref(mvm, phy_ctxt);
        *phy_ctxt_id = phy_ctxt->id;
 out:
        mutex_unlock(&mvm->mutex);
 
                                     chains_static, chains_dynamic,
                                     FW_CTXT_ACTION_ADD, 0);
 
-       if (!ret)
-               ctxt->ref = 1;
        return ret;
 }
 
  */
 void iwl_mvm_phy_ctxt_ref(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt)
 {
-       WARN_ON(!ctxt->ref);
        lockdep_assert_held(&mvm->mutex);
-
        ctxt->ref++;
 }
 
                                      FW_CTXT_ACTION_MODIFY, 0);
 }
 
-/*
- * Send a command to the FW to remove the given phy context.
- * Once the command is sent, regardless of success or failure, the context is
- * marked as invalid
- */
-static void iwl_mvm_phy_ctxt_remove(struct iwl_mvm *mvm,
-                                   struct iwl_mvm_phy_ctxt *ctxt)
-{
-       struct iwl_phy_context_cmd cmd;
-       int ret;
-
-       lockdep_assert_held(&mvm->mutex);
-
-       iwl_mvm_phy_ctxt_cmd_hdr(ctxt, &cmd, FW_CTXT_ACTION_REMOVE, 0);
-       ret = iwl_mvm_send_cmd_pdu(mvm, PHY_CONTEXT_CMD, CMD_SYNC,
-                                  sizeof(struct iwl_phy_context_cmd),
-                                  &cmd);
-       ctxt->channel = NULL;
-       if (ret)
-               IWL_ERR(mvm, "Failed to send PHY remove: ctxt id=%d\n",
-                       ctxt->id);
-}
-
 void iwl_mvm_phy_ctxt_unref(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt)
 {
        lockdep_assert_held(&mvm->mutex);
-
        ctxt->ref--;
-       if (ctxt->ref != 0)
-               return;
-
-       return iwl_mvm_phy_ctxt_remove(mvm, ctxt);
 }