According to zxystd from OpenIntelWireless, the following change fixed fatal firmware errors seen during HT protection updates for them.
I have not seen the issue myself, but I don't think this change can hurt. If it fixes firmware errors in an edge case, all the better. This essentially aligns the flags we send to firmware with those used by Linux iwlwifi. Setting the FAT protection flag while we're using 20 MHz channels doesn't really make a lot of sense to me but apparently firmware expects it to be set regardless. And since Linux does not use the CTS_EN flag it might be better to avoid using that flag? ok? The corresponding change in OpenIntelWireless is this one: https://github.com/OpenIntelWireless/itlwm/commit/032a14185a434b7181c0e78a953dc2e1c21a0853 diff 97717a5af75b97bcfcce7ae087b98ea37fd88190 c1fe4cc52d46fbf399a26531f8e540ff96486f00 blob - e33fe39b9784c5bd4f8b28099af9f97c04e49c65 blob + a8629aa87c1373f86ae105bf84ae3c2ce8aca7b3 --- sys/dev/pci/if_iwm.c +++ sys/dev/pci/if_iwm.c @@ -7678,10 +7678,8 @@ iwm_mac_ctxt_cmd_common(struct iwm_softc *sc, struct i case IEEE80211_HTPROT_NONMEMBER: case IEEE80211_HTPROT_NONHT_MIXED: cmd->protection_flags |= - htole32(IWM_MAC_PROT_FLG_HT_PROT); - if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) - cmd->protection_flags |= - htole32(IWM_MAC_PROT_FLG_SELF_CTS_EN); + htole32(IWM_MAC_PROT_FLG_HT_PROT | + IWM_MAC_PROT_FLG_FAT_PROT); break; case IEEE80211_HTPROT_20MHZ: if (ic->ic_htcaps & IEEE80211_HTCAP_CBW20_40) { @@ -7689,9 +7687,6 @@ iwm_mac_ctxt_cmd_common(struct iwm_softc *sc, struct i cmd->protection_flags |= htole32(IWM_MAC_PROT_FLG_HT_PROT | IWM_MAC_PROT_FLG_FAT_PROT); - if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) - cmd->protection_flags |= htole32( - IWM_MAC_PROT_FLG_SELF_CTS_EN); } break; default: blob - 21bc8be34500730264ad206513951a32fcb2d702 blob + 95da2db085e4b8b03b21e67a26e4fee5e1dc75f5 --- sys/dev/pci/if_iwx.c +++ sys/dev/pci/if_iwx.c @@ -5891,10 +5891,8 @@ iwx_mac_ctxt_cmd_common(struct iwx_softc *sc, struct i case IEEE80211_HTPROT_NONMEMBER: case IEEE80211_HTPROT_NONHT_MIXED: cmd->protection_flags |= - htole32(IWX_MAC_PROT_FLG_HT_PROT); - if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) - cmd->protection_flags |= - htole32(IWX_MAC_PROT_FLG_SELF_CTS_EN); + htole32(IWX_MAC_PROT_FLG_HT_PROT | + IWX_MAC_PROT_FLG_FAT_PROT); break; case IEEE80211_HTPROT_20MHZ: if (ic->ic_htcaps & IEEE80211_HTCAP_CBW20_40) { @@ -5902,9 +5900,6 @@ iwx_mac_ctxt_cmd_common(struct iwx_softc *sc, struct i cmd->protection_flags |= htole32(IWX_MAC_PROT_FLG_HT_PROT | IWX_MAC_PROT_FLG_FAT_PROT); - if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) - cmd->protection_flags |= htole32( - IWX_MAC_PROT_FLG_SELF_CTS_EN); } break; default: