u8 grp = macid >> 5;
        int ret;
 
+       /* If this is called by change_interface() in the case of P2P, it could
+        * be power-off, so ignore this operation.
+        */
+       if (test_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags) &&
+           !test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
+               return 0;
+
        ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_CMAC_SEL);
        if (ret)
                return ret;
 
                                      enum nl80211_iftype type, bool p2p)
 {
        struct rtw89_dev *rtwdev = hw->priv;
+       int ret;
+
+       set_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags);
 
        rtw89_debug(rtwdev, RTW89_DBG_STATE, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n",
                    vif->addr, vif->type, type, vif->p2p, p2p);
        vif->type = type;
        vif->p2p = p2p;
 
-       return rtw89_ops_add_interface(hw, vif);
+       ret = rtw89_ops_add_interface(hw, vif);
+       if (ret)
+               rtw89_warn(rtwdev, "failed to change interface %d\n", ret);
+
+       clear_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags);
+
+       return ret;
 }
 
 static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,