* @IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX: Hardware/driver handles transmitting
  *     multicast frames on all links, mac80211 should not do that.
  *
+ * @IEEE80211_HW_DISALLOW_PUNCTURING: HW requires disabling puncturing in EHT
+ *     and connecting with a lower bandwidth instead
+ *
  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
  */
 enum ieee80211_hw_flags {
        IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP,
        IEEE80211_HW_DETECTS_COLOR_COLLISION,
        IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX,
+       IEEE80211_HW_DISALLOW_PUNCTURING,
 
        /* keep last, obviously */
        NUM_IEEE80211_HW_FLAGS
 
        FLAG(SUPPORTS_CONC_MON_RX_DECAP),
        FLAG(DETECTS_COLOR_COLLISION),
        FLAG(MLO_MCAST_MULTI_LINK_TX),
+       FLAG(DISALLOW_PUNCTURING),
 #undef FLAG
 };
 
 
                                   u16 bitmap, u64 *changed)
 {
        struct cfg80211_chan_def *chandef = &link->conf->chandef;
+       struct ieee80211_local *local = link->sdata->local;
        u16 extracted;
        u64 _changed = 0;
 
                                                         bitmap);
 
                if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
-                                                            chandef))
+                                                            chandef) &&
+                   !(bitmap && ieee80211_hw_check(&local->hw,
+                                                  DISALLOW_PUNCTURING)))
                        break;
                link->u.mgd.conn_flags |=
                        ieee80211_chandef_downgrade(chandef);
                                        const struct ieee80211_eht_operation *eht_oper,
                                        u64 *changed)
 {
+       struct ieee80211_local *local = link->sdata->local;
        u16 bitmap = 0, extracted;
 
        if ((eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) &&
                return false;
        }
 
+       if (bitmap && ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING))
+               return false;
+
        ieee80211_handle_puncturing_bitmap(link, eht_oper, bitmap, changed);
        return true;
 }
 
                        bitmap = get_unaligned_le16(disable_subchannel_bitmap);
                        if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
-                                                                    &link->conf->chandef))
+                                                                    &link->conf->chandef) &&
+                           !(bitmap && ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING)))
                                ieee80211_handle_puncturing_bitmap(link,
                                                                   eht_oper,
                                                                   bitmap,