arg->next_vif++;
 }
 
+static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
+{
+       switch (width) {
+       case NL80211_CHAN_WIDTH_20:
+               return WMI_CHAN_WIDTH_20;
+       case NL80211_CHAN_WIDTH_40:
+               return WMI_CHAN_WIDTH_40;
+       case NL80211_CHAN_WIDTH_80:
+               return WMI_CHAN_WIDTH_80;
+       case NL80211_CHAN_WIDTH_160:
+               return WMI_CHAN_WIDTH_160;
+       case NL80211_CHAN_WIDTH_80P80:
+               return WMI_CHAN_WIDTH_80P80;
+       case NL80211_CHAN_WIDTH_5:
+               return WMI_CHAN_WIDTH_5;
+       case NL80211_CHAN_WIDTH_10:
+               return WMI_CHAN_WIDTH_10;
+       case NL80211_CHAN_WIDTH_320:
+               return WMI_CHAN_WIDTH_320;
+       default:
+               WARN_ON(1);
+               return WMI_CHAN_WIDTH_20;
+       }
+}
+
+static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
+                                                  struct ath12k_vif *arvif,
+                                                  struct cfg80211_chan_def def)
+{
+       u32 param_id, param_value;
+       int ret;
+
+       if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
+               return 0;
+
+       param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
+       param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
+               u32_encode_bits((~def.punctured),
+                               WMI_PEER_PUNCTURE_BITMAP);
+
+       ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
+                  "punctured bitmap %02x width %d vdev %d\n",
+                  def.punctured, def.width, arvif->vdev_id);
+
+       ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
+                                       arvif->vdev_id, param_id,
+                                       param_value);
+
+       return ret;
+}
+
 static void
 ath12k_mac_update_vif_chan(struct ath12k *ar,
                           struct ieee80211_vif_chanctx_switch *vifs,
                                    arvif->vdev_id, ret);
                        continue;
                }
+
+               ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
+                                                             vifs[i].new_ctx->def);
+               if (ret) {
+                       ath12k_warn(ar->ab,
+                                   "failed to update puncturing bitmap %02x and width %d: %d\n",
+                                   vifs[i].new_ctx->def.punctured,
+                                   vifs[i].new_ctx->def.width, ret);
+                       continue;
+               }
        }
 
        /* Restart the internal monitor vdev on new channel */
 
        WMI_PEER_SET_MAX_TX_RATE = 17,
        WMI_PEER_SET_MIN_TX_RATE = 18,
        WMI_PEER_SET_DEFAULT_ROUTING = 19,
+       WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP = 39,
 };
 
+#define WMI_PEER_PUNCTURE_BITMAP               GENMASK(23, 8)
+
 enum wmi_slot_time {
        WMI_VDEV_SLOT_TIME_LONG = 1,
        WMI_VDEV_SLOT_TIME_SHORT = 2,
        __le32 num_phy;
 } __packed;
 
+enum wmi_channel_width {
+       WMI_CHAN_WIDTH_20 = 0,
+       WMI_CHAN_WIDTH_40 = 1,
+       WMI_CHAN_WIDTH_80 = 2,
+       WMI_CHAN_WIDTH_160 = 3,
+       WMI_CHAN_WIDTH_80P80 = 4,
+       WMI_CHAN_WIDTH_5 = 5,
+       WMI_CHAN_WIDTH_10 = 6,
+       WMI_CHAN_WIDTH_165 = 7,
+       WMI_CHAN_WIDTH_160P160 = 8,
+       WMI_CHAN_WIDTH_320 = 9,
+};
+
 #define WMI_MAX_EHTCAP_MAC_SIZE  2
 #define WMI_MAX_EHTCAP_PHY_SIZE  3
 #define WMI_MAX_EHTCAP_RATE_SET  3