Blame SOURCES/0043-Revert-iwlwifi-mvm-change-PHY-data-RX-for-HE-radiota.patch

deb259
From 31fdae686b7a84c5e47e9ab298dfdbaec1ccaeb9 Mon Sep 17 00:00:00 2001
deb259
From: Eugene Syromiatnikov <esyr@redhat.com>
deb259
Date: Thu, 5 Sep 2019 18:45:30 +0200
deb259
Subject: [PATCH 14/43] Revert "iwlwifi: mvm: change PHY data RX for HE
deb259
 radiotap"
deb259
deb259
This reverts commit bdf180c8d375ee75493d79ae384dd1f9686fc974.
deb259
---
deb259
 drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | 190 +++++--------
deb259
 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c  | 367 +++++++++++++------------
deb259
 2 files changed, 261 insertions(+), 296 deletions(-)
deb259
deb259
Index: src/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h
deb259
===================================================================
deb259
--- src.orig/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h	2019-06-27 14:54:04.122678470 +0200
deb259
+++ src/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h	2019-09-06 01:25:42.865325621 +0200
deb259
@@ -343,98 +343,66 @@
deb259
 	IWL_RX_MPDU_PHY_PHY_INDEX_MASK		= 0xf0,
deb259
 };
deb259
 
deb259
-/* TSF overload low dword */
deb259
-enum iwl_rx_phy_data0 {
deb259
-	/* info type: HE any */
deb259
-	IWL_RX_PHY_DATA0_HE_BEAM_CHNG				= 0x00000001,
deb259
-	IWL_RX_PHY_DATA0_HE_UPLINK				= 0x00000002,
deb259
-	IWL_RX_PHY_DATA0_HE_BSS_COLOR_MASK			= 0x000000fc,
deb259
-	IWL_RX_PHY_DATA0_HE_SPATIAL_REUSE_MASK			= 0x00000f00,
deb259
-	/* 1 bit reserved */
deb259
-	IWL_RX_PHY_DATA0_HE_TXOP_DUR_MASK			= 0x000fe000,
deb259
-	IWL_RX_PHY_DATA0_HE_LDPC_EXT_SYM			= 0x00100000,
deb259
-	IWL_RX_PHY_DATA0_HE_PRE_FEC_PAD_MASK			= 0x00600000,
deb259
-	IWL_RX_PHY_DATA0_HE_PE_DISAMBIG				= 0x00800000,
deb259
-	IWL_RX_PHY_DATA0_HE_DOPPLER				= 0x01000000,
deb259
+/*
deb259
+ * enum iwl_rx_he_phy - HE PHY data
deb259
+ */
deb259
+enum iwl_rx_he_phy {
deb259
+	IWL_RX_HE_PHY_BEAM_CHNG			= BIT(0),
deb259
+	IWL_RX_HE_PHY_UPLINK			= BIT(1),
deb259
+	IWL_RX_HE_PHY_BSS_COLOR_MASK		= 0xfc,
deb259
+	IWL_RX_HE_PHY_SPATIAL_REUSE_MASK	= 0xf00,
deb259
+	IWL_RX_HE_PHY_SU_EXT_BW10		= BIT(12),
deb259
+	IWL_RX_HE_PHY_TXOP_DUR_MASK		= 0xfe000,
deb259
+	IWL_RX_HE_PHY_LDPC_EXT_SYM		= BIT(20),
deb259
+	IWL_RX_HE_PHY_PRE_FEC_PAD_MASK		= 0x600000,
deb259
+	IWL_RX_HE_PHY_PE_DISAMBIG		= BIT(23),
deb259
+	IWL_RX_HE_PHY_DOPPLER			= BIT(24),
deb259
 	/* 6 bits reserved */
deb259
-	IWL_RX_PHY_DATA0_HE_DELIM_EOF				= 0x80000000,
deb259
-};
deb259
-
deb259
-enum iwl_rx_phy_info_type {
deb259
-	IWL_RX_PHY_INFO_TYPE_NONE				= 0,
deb259
-	IWL_RX_PHY_INFO_TYPE_CCK				= 1,
deb259
-	IWL_RX_PHY_INFO_TYPE_OFDM_LGCY				= 2,
deb259
-	IWL_RX_PHY_INFO_TYPE_HT					= 3,
deb259
-	IWL_RX_PHY_INFO_TYPE_VHT_SU				= 4,
deb259
-	IWL_RX_PHY_INFO_TYPE_VHT_MU				= 5,
deb259
-	IWL_RX_PHY_INFO_TYPE_HE_SU				= 6,
deb259
-	IWL_RX_PHY_INFO_TYPE_HE_MU				= 7,
deb259
-	IWL_RX_PHY_INFO_TYPE_HE_TB				= 8,
deb259
-	IWL_RX_PHY_INFO_TYPE_HE_MU_EXT				= 9,
deb259
-	IWL_RX_PHY_INFO_TYPE_HE_TB_EXT				= 10,
deb259
-};
deb259
+	IWL_RX_HE_PHY_DELIM_EOF			= BIT(31),
deb259
 
deb259
-/* TSF overload high dword */
deb259
-enum iwl_rx_phy_data1 {
deb259
-	/*
deb259
-	 * check this first - if TSF overload is set,
deb259
-	 * see &enum iwl_rx_phy_info_type
deb259
-	 */
deb259
-	IWL_RX_PHY_DATA1_INFO_TYPE_MASK				= 0xf0000000,
deb259
-
deb259
-	/* info type: HT/VHT/HE any */
deb259
-	IWL_RX_PHY_DATA1_LSIG_LEN_MASK				= 0x0fff0000,
deb259
-
deb259
-	/* info type: HE MU/MU-EXT */
deb259
-	IWL_RX_PHY_DATA1_HE_MU_SIGB_COMPRESSION			= 0x00000001,
deb259
-	IWL_RX_PHY_DATA1_HE_MU_SIBG_SYM_OR_USER_NUM_MASK	= 0x0000001e,
deb259
-
deb259
-	/* info type: HE any */
deb259
-	IWL_RX_PHY_DATA1_HE_LTF_NUM_MASK			= 0x000000e0,
deb259
-	IWL_RX_PHY_DATA1_HE_RU_ALLOC_SEC80			= 0x00000100,
deb259
+	/* second dword - common data */
deb259
+	IWL_RX_HE_PHY_HE_LTF_NUM_MASK		= 0xe000000000ULL,
deb259
+	IWL_RX_HE_PHY_RU_ALLOC_SEC80		= BIT_ULL(32 + 8),
deb259
 	/* trigger encoded */
deb259
-	IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK			= 0x0000fe00,
deb259
-
deb259
-	/* info type: HE TB/TX-EXT */
deb259
-	IWL_RX_PHY_DATA1_HE_TB_PILOT_TYPE			= 0x00000001,
deb259
-	IWL_RX_PHY_DATA1_HE_TB_LOW_SS_MASK			= 0x0000000e,
deb259
+	IWL_RX_HE_PHY_RU_ALLOC_MASK		= 0xfe0000000000ULL,
deb259
+	IWL_RX_HE_PHY_INFO_TYPE_MASK		= 0xf000000000000000ULL,
deb259
+	IWL_RX_HE_PHY_INFO_TYPE_SU		= 0x0, /* TSF low valid (first DW) */
deb259
+	IWL_RX_HE_PHY_INFO_TYPE_MU		= 0x1, /* TSF low/high valid (both DWs) */
deb259
+	IWL_RX_HE_PHY_INFO_TYPE_MU_EXT_INFO	= 0x2, /* same + SIGB-common0/1/2 valid */
deb259
+	IWL_RX_HE_PHY_INFO_TYPE_TB		= 0x3, /* TSF low/high valid (both DWs) */
deb259
+
deb259
+	/* second dword - MU data */
deb259
+	IWL_RX_HE_PHY_MU_SIGB_COMPRESSION		= BIT_ULL(32 + 0),
deb259
+	IWL_RX_HE_PHY_MU_SIBG_SYM_OR_USER_NUM_MASK	= 0x1e00000000ULL,
deb259
+	IWL_RX_HE_PHY_MU_SIGB_MCS_MASK			= 0xf000000000000ULL,
deb259
+	IWL_RX_HE_PHY_MU_SIGB_DCM			= BIT_ULL(32 + 21),
deb259
+	IWL_RX_HE_PHY_MU_PREAMBLE_PUNC_TYPE_MASK	= 0xc0000000000000ULL,
deb259
+
deb259
+	/* second dword - TB data */
deb259
+	IWL_RX_HE_PHY_TB_PILOT_TYPE			= BIT_ULL(32 + 0),
deb259
+	IWL_RX_HE_PHY_TB_LOW_SS_MASK			= 0xe00000000ULL
deb259
 };
deb259
 
deb259
-/* goes into Metadata DW 7 */
deb259
-enum iwl_rx_phy_data2 {
deb259
-	/* info type: HE MU-EXT */
deb259
+enum iwl_rx_he_sigb_common0 {
deb259
 	/* the a1/a2/... is what the PHY/firmware calls the values */
deb259
-	IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU0		= 0x000000ff, /* a1 */
deb259
-	IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU2		= 0x0000ff00, /* a2 */
deb259
-	IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU0		= 0x00ff0000, /* b1 */
deb259
-	IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU2		= 0xff000000, /* b2 */
deb259
-
deb259
-	/* info type: HE TB-EXT */
deb259
-	IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE1		= 0x0000000f,
deb259
-	IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE2		= 0x000000f0,
deb259
-	IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE3		= 0x00000f00,
deb259
-	IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE4		= 0x0000f000,
deb259
+	IWL_RX_HE_SIGB_COMMON0_CH1_RU0		= 0x000000ff, /* a1 */
deb259
+	IWL_RX_HE_SIGB_COMMON0_CH1_RU2		= 0x0000ff00, /* a2 */
deb259
+	IWL_RX_HE_SIGB_COMMON0_CH2_RU0		= 0x00ff0000, /* b1 */
deb259
+	IWL_RX_HE_SIGB_COMMON0_CH2_RU2		= 0xff000000, /* b2 */
deb259
 };
deb259
 
deb259
-/* goes into Metadata DW 8 */
deb259
-enum iwl_rx_phy_data3 {
deb259
-	/* info type: HE MU-EXT */
deb259
-	IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU1		= 0x000000ff, /* c1 */
deb259
-	IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU3		= 0x0000ff00, /* c2 */
deb259
-	IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU1		= 0x00ff0000, /* d1 */
deb259
-	IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU3		= 0xff000000, /* d2 */
deb259
+enum iwl_rx_he_sigb_common1 {
deb259
+	IWL_RX_HE_SIGB_COMMON1_CH1_RU1		= 0x000000ff, /* c1 */
deb259
+	IWL_RX_HE_SIGB_COMMON1_CH1_RU3		= 0x0000ff00, /* c2 */
deb259
+	IWL_RX_HE_SIGB_COMMON1_CH2_RU1		= 0x00ff0000, /* d1 */
deb259
+	IWL_RX_HE_SIGB_COMMON1_CH2_RU3		= 0xff000000, /* d2 */
deb259
 };
deb259
 
deb259
-/* goes into Metadata DW 4 high 16 bits */
deb259
-enum iwl_rx_phy_data4 {
deb259
-	/* info type: HE MU-EXT */
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CTR_RU			= 0x0001,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CTR_RU			= 0x0002,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CRC_OK			= 0x0004,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CRC_OK			= 0x0008,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_MCS_MASK		= 0x00f0,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_DCM			= 0x0100,
deb259
-	IWL_RX_PHY_DATA4_HE_MU_EXT_PREAMBLE_PUNC_TYPE_MASK	= 0x0600,
deb259
+enum iwl_rx_he_sigb_common2 {
deb259
+	IWL_RX_HE_SIGB_COMMON2_CH1_CTR_RU	= 0x0001,
deb259
+	IWL_RX_HE_SIGB_COMMON2_CH2_CTR_RU	= 0x0002,
deb259
+	IWL_RX_HE_SIGB_COMMON2_CH1_CRC_OK	= 0x0004,
deb259
+	IWL_RX_HE_SIGB_COMMON2_CH2_CRC_OK	= 0x0008,
deb259
 };
deb259
 
deb259
 /**
deb259
@@ -449,9 +417,9 @@
deb259
 		__le32 rss_hash;
deb259
 
deb259
 		/**
deb259
-		 * @phy_data2: depends on info type (see @phy_data1)
deb259
+		 * @sigb_common0: for HE sniffer, HE-SIG-B common part 0
deb259
 		 */
deb259
-		__le32 phy_data2;
deb259
+		__le32 sigb_common0;
deb259
 	};
deb259
 
deb259
 	/* DW8 - carries filter_match only when rpa_en == 1 */
deb259
@@ -462,9 +430,9 @@
deb259
 		__le32 filter_match;
deb259
 
deb259
 		/**
deb259
-		 * @phy_data3: depends on info type (see @phy_data1)
deb259
+		 * @sigb_common1: for HE sniffer, HE-SIG-B common part 1
deb259
 		 */
deb259
-		__le32 phy_data3;
deb259
+		__le32 sigb_common1;
deb259
 	};
deb259
 
deb259
 	/* DW9 */
deb259
@@ -502,19 +470,12 @@
deb259
 		 * %IWL_RX_MPDU_PHY_TSF_OVERLOAD isn't set
deb259
 		 */
deb259
 		__le64 tsf_on_air_rise;
deb259
-
deb259
-		struct {
deb259
-			/**
deb259
-			 * @phy_data0: depends on info_type, see @phy_data1
deb259
-			 */
deb259
-			__le32 phy_data0;
deb259
-			/**
deb259
-			 * @phy_data1: valid only if
deb259
-			 * %IWL_RX_MPDU_PHY_TSF_OVERLOAD is set,
deb259
-			 * see &enum iwl_rx_phy_data1.
deb259
-			 */
deb259
-			__le32 phy_data1;
deb259
-		};
deb259
+		/**
deb259
+		 * @he_phy_data:
deb259
+		 * HE PHY data, see &enum iwl_rx_he_phy, valid
deb259
+		 * only if %IWL_RX_MPDU_PHY_TSF_OVERLOAD is set
deb259
+		 */
deb259
+		__le64 he_phy_data;
deb259
 	};
deb259
 } __packed;
deb259
 
deb259
@@ -530,9 +491,9 @@
deb259
 		__le32 filter_match;
deb259
 
deb259
 		/**
deb259
-		 * @phy_data2: depends on info type (see @phy_data1)
deb259
+		 * @sigb_common0: for HE sniffer, HE-SIG-B common part 0
deb259
 		 */
deb259
-		__le32 phy_data2;
deb259
+		__le32 sigb_common0;
deb259
 	};
deb259
 
deb259
 	/* DW8 - carries rss_hash only when rpa_en == 1 */
deb259
@@ -543,9 +504,9 @@
deb259
 		__le32 rss_hash;
deb259
 
deb259
 		/**
deb259
-		 * @phy_data3: depends on info type (see @phy_data1)
deb259
+		 * @sigb_common1: for HE sniffer, HE-SIG-B common part 1
deb259
 		 */
deb259
-		__le32 phy_data3;
deb259
+		__le32 sigb_common1;
deb259
 	};
deb259
 	/* DW9 */
deb259
 	/**
deb259
@@ -593,19 +554,12 @@
deb259
 		 * %IWL_RX_MPDU_PHY_TSF_OVERLOAD isn't set
deb259
 		 */
deb259
 		__le64 tsf_on_air_rise;
deb259
-
deb259
-		struct {
deb259
-			/**
deb259
-			 * @phy_data0: depends on info_type, see @phy_data1
deb259
-			 */
deb259
-			__le32 phy_data0;
deb259
-			/**
deb259
-			 * @phy_data1: valid only if
deb259
-			 * %IWL_RX_MPDU_PHY_TSF_OVERLOAD is set,
deb259
-			 * see &enum iwl_rx_phy_data1.
deb259
-			 */
deb259
-			__le32 phy_data1;
deb259
-		};
deb259
+		/**
deb259
+		 * @he_phy_data:
deb259
+		 * HE PHY data, see &enum iwl_rx_he_phy, valid
deb259
+		 * only if %IWL_RX_MPDU_PHY_TSF_OVERLOAD is set
deb259
+		 */
deb259
+		__le64 he_phy_data;
deb259
 	};
deb259
 	/* DW16 & DW17 */
deb259
 	/**
deb259
@@ -657,9 +611,9 @@
deb259
 		__le16 l3l4_flags;
deb259
 
deb259
 		/**
deb259
-		 * @phy_data4: depends on info type, see phy_data1
deb259
+		 * @sigb_common2: for HE sniffer, HE-SIG-B common part 2
deb259
 		 */
deb259
-		__le16 phy_data4;
deb259
+		__le16 sigb_common2;
deb259
 	};
deb259
 	/* DW5 */
deb259
 	/**
deb259
Index: src/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
deb259
===================================================================
deb259
--- src.orig/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c	2019-09-06 01:25:42.700327726 +0200
deb259
+++ src/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c	2019-09-06 01:25:42.865325621 +0200
deb259
@@ -903,65 +903,68 @@
deb259
 	ether_addr_copy(addr, mac_addr);
deb259
 }
deb259
 
deb259
-struct iwl_mvm_rx_phy_data {
deb259
-	__le32 d0, d1, d2, d3;
deb259
-	__le16 d4;
deb259
-};
deb259
-
deb259
-static void iwl_mvm_decode_he_mu_ext(struct iwl_mvm *mvm,
deb259
-				     struct iwl_mvm_rx_phy_data *phy_data,
deb259
-				     u32 rate_n_flags,
deb259
-				     struct ieee80211_radiotap_he_mu *he_mu)
deb259
+static void iwl_mvm_decode_he_sigb(struct iwl_mvm *mvm,
deb259
+				   struct iwl_rx_mpdu_desc *desc,
deb259
+				   u32 rate_n_flags,
deb259
+				   struct ieee80211_radiotap_he_mu *he_mu)
deb259
 {
deb259
-	u32 phy_data2 = le32_to_cpu(phy_data->d2);
deb259
-	u32 phy_data3 = le32_to_cpu(phy_data->d3);
deb259
-	u16 phy_data4 = le16_to_cpu(phy_data->d4);
deb259
+	u32 sigb0, sigb1;
deb259
+	u16 sigb2;
deb259
 
deb259
-	if (FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CRC_OK, phy_data4)) {
deb259
+	if (mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
deb259
+		sigb0 = le32_to_cpu(desc->v3.sigb_common0);
deb259
+		sigb1 = le32_to_cpu(desc->v3.sigb_common1);
deb259
+	} else {
deb259
+		sigb0 = le32_to_cpu(desc->v1.sigb_common0);
deb259
+		sigb1 = le32_to_cpu(desc->v1.sigb_common1);
deb259
+	}
deb259
+
deb259
+	sigb2 = le16_to_cpu(desc->sigb_common2);
deb259
+
deb259
+	if (FIELD_GET(IWL_RX_HE_SIGB_COMMON2_CH1_CRC_OK, sigb2)) {
deb259
 		he_mu->flags1 |=
deb259
 			cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN |
deb259
 				    IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN);
deb259
 
deb259
 		he_mu->flags1 |=
deb259
-			le16_encode_bits(FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CTR_RU,
deb259
-						   phy_data4),
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_SIGB_COMMON2_CH1_CTR_RU,
deb259
+						   sigb2),
deb259
 					 IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU);
deb259
 
deb259
-		he_mu->ru_ch1[0] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU0,
deb259
-					     phy_data2);
deb259
-		he_mu->ru_ch1[1] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU1,
deb259
-					     phy_data3);
deb259
-		he_mu->ru_ch1[2] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU2,
deb259
-					     phy_data2);
deb259
-		he_mu->ru_ch1[3] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU3,
deb259
-					     phy_data3);
deb259
+		he_mu->ru_ch1[0] = FIELD_GET(IWL_RX_HE_SIGB_COMMON0_CH1_RU0,
deb259
+					     sigb0);
deb259
+		he_mu->ru_ch1[1] = FIELD_GET(IWL_RX_HE_SIGB_COMMON1_CH1_RU1,
deb259
+					     sigb1);
deb259
+		he_mu->ru_ch1[2] = FIELD_GET(IWL_RX_HE_SIGB_COMMON0_CH1_RU2,
deb259
+					     sigb0);
deb259
+		he_mu->ru_ch1[3] = FIELD_GET(IWL_RX_HE_SIGB_COMMON1_CH1_RU3,
deb259
+					     sigb1);
deb259
 	}
deb259
 
deb259
-	if (FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CRC_OK, phy_data4) &&
deb259
+	if (FIELD_GET(IWL_RX_HE_SIGB_COMMON2_CH2_CRC_OK, sigb2) &&
deb259
 	    (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) != RATE_MCS_CHAN_WIDTH_20) {
deb259
 		he_mu->flags1 |=
deb259
 			cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN |
deb259
 				    IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN);
deb259
 
deb259
 		he_mu->flags2 |=
deb259
-			le16_encode_bits(FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CTR_RU,
deb259
-						   phy_data4),
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_SIGB_COMMON2_CH2_CTR_RU,
deb259
+						   sigb2),
deb259
 					 IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU);
deb259
 
deb259
-		he_mu->ru_ch2[0] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU0,
deb259
-					     phy_data2);
deb259
-		he_mu->ru_ch2[1] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU1,
deb259
-					     phy_data3);
deb259
-		he_mu->ru_ch2[2] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU2,
deb259
-					     phy_data2);
deb259
-		he_mu->ru_ch2[3] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU3,
deb259
-					     phy_data3);
deb259
+		he_mu->ru_ch2[0] = FIELD_GET(IWL_RX_HE_SIGB_COMMON0_CH2_RU0,
deb259
+					     sigb0);
deb259
+		he_mu->ru_ch2[1] = FIELD_GET(IWL_RX_HE_SIGB_COMMON1_CH2_RU1,
deb259
+					     sigb1);
deb259
+		he_mu->ru_ch2[2] = FIELD_GET(IWL_RX_HE_SIGB_COMMON0_CH2_RU2,
deb259
+					     sigb0);
deb259
+		he_mu->ru_ch2[3] = FIELD_GET(IWL_RX_HE_SIGB_COMMON1_CH2_RU3,
deb259
+					     sigb1);
deb259
 	}
deb259
 }
deb259
 
deb259
 static void
deb259
-iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
deb259
-			       u32 rate_n_flags,
deb259
+iwl_mvm_decode_he_phy_ru_alloc(u64 he_phy_data, u32 rate_n_flags,
deb259
 			       struct ieee80211_radiotap_he *he,
deb259
 			       struct ieee80211_radiotap_he_mu *he_mu,
deb259
 			       struct ieee80211_rx_status *rx_status)
deb259
@@ -974,7 +977,7 @@
deb259
 	 * happen though as management frames where we need
deb259
 	 * the TSF/timers are not be transmitted in HE-MU.
deb259
 	 */
deb259
-	u8 ru = le32_get_bits(phy_data->d1, IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK);
deb259
+	u8 ru = FIELD_GET(IWL_RX_HE_PHY_RU_ALLOC_MASK, he_phy_data);
deb259
 	u8 offs = 0;
deb259
 
deb259
 	rx_status->bw = RATE_INFO_BW_HE_RU;
deb259
@@ -1013,7 +1016,7 @@
deb259
 				      IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET);
deb259
 	he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN |
deb259
 				 IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN);
deb259
-	if (phy_data->d1 & cpu_to_le32(IWL_RX_PHY_DATA1_HE_RU_ALLOC_SEC80))
deb259
+	if (he_phy_data & IWL_RX_HE_PHY_RU_ALLOC_SEC80)
deb259
 		he->data2 |=
deb259
 			cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC);
deb259
 
deb259
@@ -1033,124 +1036,105 @@
deb259
 }
deb259
 
deb259
 static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
deb259
-				       struct iwl_mvm_rx_phy_data *phy_data,
deb259
+				       struct iwl_rx_mpdu_desc *desc,
deb259
 				       struct ieee80211_radiotap_he *he,
deb259
 				       struct ieee80211_radiotap_he_mu *he_mu,
deb259
 				       struct ieee80211_rx_status *rx_status,
deb259
-				       u32 rate_n_flags, int queue)
deb259
+				       u64 he_phy_data, u32 rate_n_flags,
deb259
+				       int queue)
deb259
 {
deb259
-	enum iwl_rx_phy_info_type info_type;
deb259
-
deb259
-	info_type = le32_get_bits(phy_data->d1, IWL_RX_PHY_DATA1_INFO_TYPE_MASK);
deb259
-
deb259
-	switch (info_type) {
deb259
-	case IWL_RX_PHY_INFO_TYPE_NONE:
deb259
-	case IWL_RX_PHY_INFO_TYPE_CCK:
deb259
-	case IWL_RX_PHY_INFO_TYPE_OFDM_LGCY:
deb259
-		return;
deb259
-	case IWL_RX_PHY_INFO_TYPE_HT:
deb259
-	case IWL_RX_PHY_INFO_TYPE_VHT_SU:
deb259
-	case IWL_RX_PHY_INFO_TYPE_VHT_MU:
deb259
-		/* TODO: we have LSIG-LEN, where do we put it? */
deb259
-		return;
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_TB_EXT:
deb259
-		he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN);
deb259
-		he->data4 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE1),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1);
deb259
-		he->data4 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE2),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2);
deb259
-		he->data4 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE3),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3);
deb259
-		he->data4 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE4),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4);
deb259
-		/* fall through */
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_SU:
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_MU:
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT:
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_TB:
deb259
-		/* HE common */
deb259
-		he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN);
deb259
-		he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN |
deb259
-					 IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN);
deb259
-		he->data3 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_BSS_COLOR_MASK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR);
deb259
-		he->data3 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_UPLINK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA3_UL_DL);
deb259
-		he->data3 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_LDPC_EXT_SYM),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG);
deb259
-		he->data4 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_SPATIAL_REUSE_MASK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE);
deb259
-		he->data5 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_PRE_FEC_PAD_MASK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD);
deb259
-		he->data5 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_PE_DISAMBIG),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG);
deb259
-		he->data5 |= le16_encode_bits(le32_get_bits(phy_data->d1,
deb259
-							    IWL_RX_PHY_DATA1_HE_LTF_NUM_MASK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS);
deb259
-		he->data6 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_TXOP_DUR_MASK),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA6_TXOP);
deb259
-		he->data6 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_DOPPLER),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA6_DOPPLER);
deb259
-		break;
deb259
-	}
deb259
+	u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
deb259
+	bool sigb_data;
deb259
+	u16 d1known = IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN;
deb259
+	u16 d2known = IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN |
deb259
+		      IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN;
deb259
+
deb259
+	he->data1 |= cpu_to_le16(d1known);
deb259
+	he->data2 |= cpu_to_le16(d2known);
deb259
+	he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BSS_COLOR_MASK,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR);
deb259
+	he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_UPLINK,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA3_UL_DL);
deb259
+	he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_LDPC_EXT_SYM,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG);
deb259
+	he->data4 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_SPATIAL_REUSE_MASK,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE);
deb259
+	he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PRE_FEC_PAD_MASK,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD);
deb259
+	he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PE_DISAMBIG,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG);
deb259
+	he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_TXOP_DUR_MASK,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA6_TXOP);
deb259
+	he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_DOPPLER,
deb259
+						he_phy_data),
deb259
+				      IEEE80211_RADIOTAP_HE_DATA6_DOPPLER);
deb259
 
deb259
-	switch (info_type) {
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT:
deb259
+	switch (he_type) {
deb259
+	case RATE_MCS_HE_TYPE_MU:
deb259
 		he_mu->flags1 |=
deb259
-			le16_encode_bits(le16_get_bits(phy_data->d4,
deb259
-						       IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_DCM),
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIGB_DCM,
deb259
+						   he_phy_data),
deb259
 					 IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM);
deb259
 		he_mu->flags1 |=
deb259
-			le16_encode_bits(le16_get_bits(phy_data->d4,
deb259
-						       IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_MCS_MASK),
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIGB_MCS_MASK,
deb259
+						   he_phy_data),
deb259
 					 IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS);
deb259
 		he_mu->flags2 |=
deb259
-			le16_encode_bits(le16_get_bits(phy_data->d4,
deb259
-						       IWL_RX_PHY_DATA4_HE_MU_EXT_PREAMBLE_PUNC_TYPE_MASK),
deb259
-					 IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW);
deb259
-		iwl_mvm_decode_he_mu_ext(mvm, phy_data, rate_n_flags, he_mu);
deb259
-		/* fall through */
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_MU:
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIBG_SYM_OR_USER_NUM_MASK,
deb259
+						  he_phy_data),
deb259
+					IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS);
deb259
 		he_mu->flags2 |=
deb259
-			le16_encode_bits(le32_get_bits(phy_data->d1,
deb259
-						       IWL_RX_PHY_DATA1_HE_MU_SIBG_SYM_OR_USER_NUM_MASK),
deb259
-					 IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS);
deb259
-		he_mu->flags2 |=
deb259
-			le16_encode_bits(le32_get_bits(phy_data->d1,
deb259
-						       IWL_RX_PHY_DATA1_HE_MU_SIGB_COMPRESSION),
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIGB_COMPRESSION,
deb259
+						   he_phy_data),
deb259
 					 IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP);
deb259
+		he_mu->flags2 |=
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_PREAMBLE_PUNC_TYPE_MASK,
deb259
+						   he_phy_data),
deb259
+					 IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW);
deb259
+
deb259
+		sigb_data = FIELD_GET(IWL_RX_HE_PHY_INFO_TYPE_MASK,
deb259
+				      he_phy_data) ==
deb259
+				IWL_RX_HE_PHY_INFO_TYPE_MU_EXT_INFO;
deb259
+		if (sigb_data)
deb259
+			iwl_mvm_decode_he_sigb(mvm, desc, rate_n_flags, he_mu);
deb259
 		/* fall through */
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_TB:
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_TB_EXT:
deb259
-		iwl_mvm_decode_he_phy_ru_alloc(phy_data, rate_n_flags,
deb259
-					       he, he_mu, rx_status);
deb259
+	case RATE_MCS_HE_TYPE_TRIG:
deb259
+		he->data2 |=
deb259
+			cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN);
deb259
+		he->data5 |=
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_HE_LTF_NUM_MASK,
deb259
+						   he_phy_data),
deb259
+					 IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS);
deb259
+		break;
deb259
+	case RATE_MCS_HE_TYPE_SU:
deb259
+	case RATE_MCS_HE_TYPE_EXT_SU:
deb259
+		he->data1 |=
deb259
+			cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN);
deb259
+		he->data3 |=
deb259
+			le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BEAM_CHNG,
deb259
+						   he_phy_data),
deb259
+					 IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE);
deb259
 		break;
deb259
-	case IWL_RX_PHY_INFO_TYPE_HE_SU:
deb259
-		he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN);
deb259
-		he->data3 |= le16_encode_bits(le32_get_bits(phy_data->d0,
deb259
-							    IWL_RX_PHY_DATA0_HE_BEAM_CHNG),
deb259
-					      IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE);
deb259
+	}
deb259
+
deb259
+	switch (FIELD_GET(IWL_RX_HE_PHY_INFO_TYPE_MASK, he_phy_data)) {
deb259
+	case IWL_RX_HE_PHY_INFO_TYPE_MU:
deb259
+	case IWL_RX_HE_PHY_INFO_TYPE_MU_EXT_INFO:
deb259
+	case IWL_RX_HE_PHY_INFO_TYPE_TB:
deb259
+		iwl_mvm_decode_he_phy_ru_alloc(he_phy_data, rate_n_flags,
deb259
+					       he, he_mu, rx_status);
deb259
 		break;
deb259
 	default:
deb259
 		/* nothing */
deb259
@@ -1163,6 +1147,9 @@
deb259
 			  u32 rate_n_flags, u16 phy_info, int queue)
deb259
 {
deb259
 	struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
deb259
+	/* this is invalid e.g. because puncture type doesn't allow 0b11 */
deb259
+#define HE_PHY_DATA_INVAL ((u64)-1)
deb259
+	u64 he_phy_data = HE_PHY_DATA_INVAL;
deb259
 	struct ieee80211_radiotap_he *he = NULL;
deb259
 	struct ieee80211_radiotap_he_mu *he_mu = NULL;
deb259
 	u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
deb259
@@ -1184,66 +1171,54 @@
deb259
 				      IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN),
deb259
 	};
deb259
 	unsigned int radiotap_len = 0;
deb259
-	struct iwl_mvm_rx_phy_data phy_data = {
deb259
-		.d4 = desc->phy_data4,
deb259
-	};
deb259
-	enum iwl_rx_phy_info_type info_type = IWL_RX_PHY_INFO_TYPE_NONE;
deb259
-
deb259
-	if (mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
deb259
-		phy_data.d0 = desc->v3.phy_data0;
deb259
-		phy_data.d1 = desc->v3.phy_data1;
deb259
-		phy_data.d2 = desc->v3.phy_data2;
deb259
-		phy_data.d3 = desc->v3.phy_data3;
deb259
-	} else {
deb259
-		phy_data.d0 = desc->v1.phy_data0;
deb259
-		phy_data.d1 = desc->v1.phy_data1;
deb259
-		phy_data.d2 = desc->v1.phy_data2;
deb259
-		phy_data.d3 = desc->v1.phy_data3;
deb259
-	}
deb259
-
deb259
-	if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD)
deb259
-		info_type = le32_get_bits(phy_data.d1,
deb259
-					  IWL_RX_PHY_DATA1_INFO_TYPE_MASK);
deb259
 
deb259
 	he = skb_put_data(skb, &known, sizeof(known));
deb259
 	radiotap_len += sizeof(known);
deb259
 	rx_status->flag |= RX_FLAG_RADIOTAP_HE;
deb259
 
deb259
-	if (info_type == IWL_RX_PHY_INFO_TYPE_HE_MU ||
deb259
-	    info_type == IWL_RX_PHY_INFO_TYPE_HE_MU_EXT) {
deb259
-		he_mu = skb_put_data(skb, &mu_known, sizeof(mu_known));
deb259
-		radiotap_len += sizeof(mu_known);
deb259
-		rx_status->flag |= RX_FLAG_RADIOTAP_HE_MU;
deb259
+	if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) {
deb259
+		if (mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560)
deb259
+			he_phy_data = le64_to_cpu(desc->v3.he_phy_data);
deb259
+		else
deb259
+			he_phy_data = le64_to_cpu(desc->v1.he_phy_data);
deb259
+
deb259
+		if (he_type == RATE_MCS_HE_TYPE_MU) {
deb259
+			he_mu = skb_put_data(skb, &mu_known, sizeof(mu_known));
deb259
+			radiotap_len += sizeof(mu_known);
deb259
+			rx_status->flag |= RX_FLAG_RADIOTAP_HE_MU;
deb259
+		}
deb259
 	}
deb259
 
deb259
 	/* temporarily hide the radiotap data */
deb259
 	__skb_pull(skb, radiotap_len);
deb259
 
deb259
-	if (info_type == IWL_RX_PHY_INFO_TYPE_HE_SU) {
deb259
+	if (he_phy_data != HE_PHY_DATA_INVAL &&
deb259
+	    he_type == RATE_MCS_HE_TYPE_SU) {
deb259
 		/* report the AMPDU-EOF bit on single frames */
deb259
 		if (!queue && !(phy_info & IWL_RX_MPDU_PHY_AMPDU)) {
deb259
 			rx_status->flag |= RX_FLAG_AMPDU_DETAILS;
deb259
 			rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN;
deb259
-			if (phy_data.d0 & cpu_to_le32(IWL_RX_PHY_DATA0_HE_DELIM_EOF))
deb259
+			if (FIELD_GET(IWL_RX_HE_PHY_DELIM_EOF, he_phy_data))
deb259
 				rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT;
deb259
 		}
deb259
 	}
deb259
 
deb259
-	if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD)
deb259
-		iwl_mvm_decode_he_phy_data(mvm, &phy_data, he, he_mu, rx_status,
deb259
-					   rate_n_flags, queue);
deb259
+	if (he_phy_data != HE_PHY_DATA_INVAL)
deb259
+		iwl_mvm_decode_he_phy_data(mvm, desc, he, he_mu, rx_status,
deb259
+					   he_phy_data, rate_n_flags, queue);
deb259
 
deb259
 	/* update aggregation data for monitor sake on default queue */
deb259
-	if (!queue && (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) &&
deb259
-	    (phy_info & IWL_RX_MPDU_PHY_AMPDU)) {
deb259
+	if (!queue && (phy_info & IWL_RX_MPDU_PHY_AMPDU)) {
deb259
 		bool toggle_bit = phy_info & IWL_RX_MPDU_PHY_AMPDU_TOGGLE;
deb259
 
deb259
 		/* toggle is switched whenever new aggregation starts */
deb259
 		if (toggle_bit != mvm->ampdu_toggle &&
deb259
+		    he_phy_data != HE_PHY_DATA_INVAL &&
deb259
 		    (he_type == RATE_MCS_HE_TYPE_MU ||
deb259
 		     he_type == RATE_MCS_HE_TYPE_SU)) {
deb259
 			rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN;
deb259
-			if (phy_data.d0 & cpu_to_le32(IWL_RX_PHY_DATA0_HE_DELIM_EOF))
deb259
+			if (FIELD_GET(IWL_RX_HE_PHY_DELIM_EOF,
deb259
+				      he_phy_data))
deb259
 				rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT;
deb259
 		}
deb259
 	}
deb259
@@ -1326,8 +1301,44 @@
deb259
 		break;
deb259
 	}
deb259
 
deb259
-	he->data5 |= le16_encode_bits(ltf,
deb259
-				      IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE);
deb259
+	he->data5 |= le16_encode_bits(ltf, IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE);
deb259
+
deb259
+	if (he_type == RATE_MCS_HE_TYPE_SU ||
deb259
+	    he_type == RATE_MCS_HE_TYPE_EXT_SU) {
deb259
+		u16 val;
deb259
+
deb259
+		/* LTF syms correspond to streams */
deb259
+		he->data2 |=
deb259
+			cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN);
deb259
+		switch (rx_status->nss) {
deb259
+		case 1:
deb259
+			val = 0;
deb259
+			break;
deb259
+		case 2:
deb259
+			val = 1;
deb259
+			break;
deb259
+		case 3:
deb259
+		case 4:
deb259
+			val = 2;
deb259
+			break;
deb259
+		case 5:
deb259
+		case 6:
deb259
+			val = 3;
deb259
+			break;
deb259
+		case 7:
deb259
+		case 8:
deb259
+			val = 4;
deb259
+			break;
deb259
+		default:
deb259
+			WARN_ONCE(1, "invalid nss: %d\n",
deb259
+				  rx_status->nss);
deb259
+			val = 0;
deb259
+		}
deb259
+
deb259
+		he->data5 |=
deb259
+			le16_encode_bits(val,
deb259
+					 IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS);
deb259
+	}
deb259
 }
deb259
 
deb259
 void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,