Commit 3b67a20b authored by Haim Dreyfuss's avatar Haim Dreyfuss Committed by Johannes Berg
Browse files

wifi: iwlwifi: mvm: offload BTM response during D3



There are mainly two types of BTM (BSS Transition Management)
requests, recommendations and notifications. For the first type,
a response is needed otherwise, most probably the STA will be
disconnected.
Since we don't want to wake up the host on it, set the BTM to reject
offload flag (if the device supports it) and rely on the FW to take
care of it. The FW will reject the BTM request and in case the AP
sends DEAUTH the FW can wake up the host to let it decide on the
next steps.

Signed-off-by: default avatarHaim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230531194629.d95ae6f2804c.I9457acc55bc23ce715c714b5088058f52540c224@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3278c42b
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -47,12 +47,14 @@ struct iwl_d3_manager_config {
 * @IWL_D3_PROTO_OFFLOAD_NS: NS (Neighbor Solicitation) is enabled
 * @IWL_D3_PROTO_IPV4_VALID: IPv4 data is valid
 * @IWL_D3_PROTO_IPV6_VALID: IPv6 data is valid
 * @IWL_D3_PROTO_REJECT_BTM: reject BTM request
 */
enum iwl_proto_offloads {
	IWL_D3_PROTO_OFFLOAD_ARP = BIT(0),
	IWL_D3_PROTO_OFFLOAD_NS = BIT(1),
	IWL_D3_PROTO_IPV4_VALID = BIT(2),
	IWL_D3_PROTO_IPV6_VALID = BIT(3),
	IWL_D3_PROTO_REJECT_BTM = BIT(4),
};

#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1	2
+1 −0
Original line number Diff line number Diff line
@@ -463,6 +463,7 @@ enum iwl_ucode_tlv_capa {
	IWL_UCODE_TLV_CAPA_MLD_API_SUPPORT		= (__force iwl_ucode_tlv_capa_t)110,
	IWL_UCODE_TLV_CAPA_SCAN_DONT_TOGGLE_ANT         = (__force iwl_ucode_tlv_capa_t)111,
	IWL_UCODE_TLV_CAPA_PPAG_CHINA_BIOS_SUPPORT	= (__force iwl_ucode_tlv_capa_t)112,
	IWL_UCODE_TLV_CAPA_OFFLOAD_REJ_BTM_SUPPORT	= (__force iwl_ucode_tlv_capa_t)113,

#ifdef __CHECKER__
	/* sparse says it cannot increment the previous enum member */
+4 −0
Original line number Diff line number Diff line
@@ -198,6 +198,10 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
		memcpy(common->arp_mac_addr, vif->addr, ETH_ALEN);
	}

	if (fw_has_capa(&mvm->fw->ucode_capa,
			IWL_UCODE_TLV_CAPA_OFFLOAD_REJ_BTM_SUPPORT))
		enabled |= IWL_D3_PROTO_REJECT_BTM;

	if (!disable_offloading)
		common->enabled = cpu_to_le32(enabled);