[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#940825: linux-source-5.2: Backport of wifi driver fixes to enable wifi on whiseylake based system in 5.2.9



Package: linux-source-5.2
Version: 5.2.9-2~bpo10+1
Severity: important
Tags: patch

Dear Maintainer,

   * What led up to the situation?
Wifi on the Lenovo X1 Carbon Gen7 is not functional.
Intel pointed us at the attached patch comprised of upstream fixes
   * What exactly did you do (or not do) that was effective (or
     ineffective)?
Applied the patch and wifi was then operational
   * What was the outcome of this action?
Wifi works correctly
   * What outcome did you expect instead?
NA

Please let me know any questions. I'm still new to the process.
Thanks in advance for the help - we have a customer who is waiting on these
fixes in Debian (this and the SOF driver backport).
Mark



-- System Information:
Debian Release: 10.1
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.2.9 (SMP w/8 CPU cores)
Kernel taint flags: TAINT_UNSIGNED_MODULE
Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8), LANGUAGE=en_CA:en (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages linux-source-5.2 depends on:
ii  binutils  2.31.1-16
ii  xz-utils  5.2.4-1

Versions of packages linux-source-5.2 recommends:
ii  bc                    1.07.1-2+b1
ii  bison                 2:3.3.2.dfsg-1
ii  flex                  2.6.4-6.2
ii  gcc                   4:8.3.0-1
ii  libc6-dev [libc-dev]  2.28-10
ii  linux-config-5.2      5.2.9-2~bpo10+1
ii  make                  4.2.1-1.2

Versions of packages linux-source-5.2 suggests:
ii  libncurses-dev [ncurses-dev]  6.1+20181013-2+deb10u1
pn  libqt4-dev                    <none>
pn  pkg-config                    <none>

-- no debconf information
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/cfg/22000.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/cfg/22000.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/cfg/22000.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/cfg/22000.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 80,87 ****
--- 80,90 ----
  #define IWL_22000_QU_B_HR_B_FW_PRE	"iwlwifi-Qu-b0-hr-b0-"
  #define IWL_22000_HR_B_FW_PRE		"iwlwifi-QuQnj-b0-hr-b0-"
  #define IWL_22000_HR_A0_FW_PRE		"iwlwifi-QuQnj-a0-hr-a0-"
+ #define IWL_QU_C_HR_B_FW_PRE		"iwlwifi-Qu-c0-hr-b0-"
  #define IWL_QU_B_JF_B_FW_PRE		"iwlwifi-Qu-b0-jf-b0-"
+ #define IWL_QU_C_JF_B_FW_PRE		"iwlwifi-Qu-c0-jf-b0-"
  #define IWL_QUZ_A_HR_B_FW_PRE		"iwlwifi-QuZ-a0-hr-b0-"
+ #define IWL_QUZ_A_JF_B_FW_PRE		"iwlwifi-QuZ-a0-jf-b0-"
  #define IWL_QNJ_B_JF_B_FW_PRE		"iwlwifi-QuQnj-b0-jf-b0-"
  #define IWL_CC_A_FW_PRE			"iwlwifi-cc-a0-"
  #define IWL_22000_SO_A_JF_B_FW_PRE	"iwlwifi-so-a0-jf-b0-"
***************
*** 106,111 ****
--- 109,118 ----
  	IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode"
  #define IWL_QUZ_A_HR_B_MODULE_FIRMWARE(api) \
  	IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode"
+ #define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \
+ 	IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode"
+ #define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \
+ 	IWL_QU_C_HR_B_FW_PRE __stringify(api) ".ucode"
  #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \
  	IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode"
  #define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api)		\
***************
*** 241,246 ****
--- 248,289 ----
  	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
  };
  
+ const struct iwl_cfg iwl_ax201_cfg_qu_hr = {
+ 	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
+ 	.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
+ const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = {
+ 	.name = "Intel(R) Wi-Fi 6 AX101",
+ 	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
+ const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = {
+ 	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
+ 	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
  const struct iwl_cfg iwl_ax101_cfg_quz_hr = {
  	.name = "Intel(R) Wi-Fi 6 AX101",
  	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
***************
*** 253,258 ****
--- 296,337 ----
  	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
  };
  
+ const struct iwl_cfg iwl_ax201_cfg_quz_hr = {
+ 		.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
+ 		.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
+ 		IWL_DEVICE_22500,
+ 		/*
+          * This device doesn't support receiving BlockAck with a large bitmap
+          * so we need to restrict the size of transmitted aggregation to the
+          * HT size; mac80211 would otherwise pick the HE max (256) by default.
+          */
+ 		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
+ const struct iwl_cfg iwl_ax1650s_cfg_quz_hr = {
+ 		.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
+ 		.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
+ 		IWL_DEVICE_22500,
+ 		/*
+          * This device doesn't support receiving BlockAck with a large bitmap
+          * so we need to restrict the size of transmitted aggregation to the
+          * HT size; mac80211 would otherwise pick the HE max (256) by default.
+          */
+ 		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
+ const struct iwl_cfg iwl_ax1650i_cfg_quz_hr = {
+ 		.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
+ 		.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
+ 		IWL_DEVICE_22500,
+ 		/*
+          * This device doesn't support receiving BlockAck with a large bitmap
+          * so we need to restrict the size of transmitted aggregation to the
+          * HT size; mac80211 would otherwise pick the HE max (256) by default.
+          */
+ 		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
  const struct iwl_cfg iwl_ax200_cfg_cc = {
  	.name = "Intel(R) Wi-Fi 6 AX200 160MHz",
  	.fw_name_pre = IWL_CC_A_FW_PRE,
***************
*** 321,326 ****
--- 400,429 ----
  	IWL_DEVICE_22500,
  };
  
+ const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0 = {
+ 	.name = "Intel(R) Wireless-AC 9461",
+ 	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ };
+ 
+ const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0 = {
+ 	.name = "Intel(R) Wireless-AC 9462",
+ 	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ };
+ 
+ const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0 = {
+ 	.name = "Intel(R) Wireless-AC 9560",
+ 	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ };
+ 
+ const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0 = {
+ 	.name = "Intel(R) Wireless-AC 9560 160MHz",
+ 	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ };
+ 
  const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = {
  	.name = "Intel(R) Wireless-AC 9560 160MHz",
  	.fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE,
***************
*** 333,338 ****
--- 436,525 ----
  	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
  };
  
+ const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Intel(R) Wireless-AC 9560 160MHz",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
+ const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Intel(R) Wireless-AC 9560 160MHz",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
+ const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Intel(R) Dual Band Wireless AC 9461",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
+ const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Intel(R) Dual Band Wireless AC 9462",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
+ const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
+ const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc = {
+ 	.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
+ 	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ 	.integrated = true,
+ 	.soc_latency = 5000,
+ };
+ 
  const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0 = {
  	.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
  	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
***************
*** 369,374 ****
--- 556,585 ----
  	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
  };
  
+ const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0 = {
+ 	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
+ 	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
+ const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {
+ 	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
+ 	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
+ 	IWL_DEVICE_22500,
+ 	/*
+ 	 * This device doesn't support receiving BlockAck with a large bitmap
+ 	 * so we need to restrict the size of transmitted aggregation to the
+ 	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
+ 	 */
+ 	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
+ };
+ 
  const struct iwl_cfg iwl22000_2ax_cfg_jf = {
  	.name = "Intel(R) Dual Band Wireless AX 22000",
  	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
***************
*** 424,435 ****
  };
  
  const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0 = {
! 	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_HR_B_FW_PRE,
  	IWL_DEVICE_AX210,
  };
  
! const struct iwl_cfg iwlax210_2ax_cfg_so_gf_a0 = {
  	.name = "Intel(R) Wi-Fi 7 AX211 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_GF_A_FW_PRE,
  	.uhb_supported = true,
--- 635,646 ----
  };
  
  const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0 = {
! 	.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_HR_B_FW_PRE,
  	IWL_DEVICE_AX210,
  };
  
! const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0 = {
  	.name = "Intel(R) Wi-Fi 7 AX211 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_GF_A_FW_PRE,
  	.uhb_supported = true,
***************
*** 443,450 ****
  	IWL_DEVICE_AX210,
  };
  
! const struct iwl_cfg iwlax210_2ax_cfg_so_gf4_a0 = {
! 	.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_GF4_A_FW_PRE,
  	IWL_DEVICE_AX210,
  };
--- 654,661 ----
  	IWL_DEVICE_AX210,
  };
  
! const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0 = {
! 	.name = "Intel(R) Wi-Fi 7 AX411 160MHz",
  	.fw_name_pre = IWL_22000_SO_A_GF4_A_FW_PRE,
  	IWL_DEVICE_AX210,
  };
***************
*** 455,462 ****
--- 666,675 ----
  MODULE_FIRMWARE(IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
+ MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
+ MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_QNJ_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
  MODULE_FIRMWARE(IWL_22000_SO_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/cfg/6000.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/cfg/6000.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/cfg/6000.c	2019-08-21 08:48:11.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/cfg/6000.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 17,23 ****
  #include "dvm/commands.h" /* needed for BT for now */
  
  /* Highest firmware API version supported */
! #define IWL6000_UCODE_API_MAX 4 /* v5-6 are supported but not released */
  #define IWL6050_UCODE_API_MAX 5
  #define IWL6000G2_UCODE_API_MAX 6
  #define IWL6035_UCODE_API_MAX 6
--- 17,23 ----
  #include "dvm/commands.h" /* needed for BT for now */
  
  /* Highest firmware API version supported */
! #define IWL6000_UCODE_API_MAX 6
  #define IWL6050_UCODE_API_MAX 5
  #define IWL6000G2_UCODE_API_MAX 6
  #define IWL6035_UCODE_API_MAX 6
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/acpi.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/acpi.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/acpi.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 97,103 ****
  
  union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  					 union acpi_object *data,
! 					 int data_size)
  {
  	int i;
  	union acpi_object *wifi_pkg;
--- 97,103 ----
  
  union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  					 union acpi_object *data,
! 					 int data_size, int *tbl_rev)
  {
  	int i;
  	union acpi_object *wifi_pkg;
***************
*** 113,128 ****
  	/*
  	 * We need at least two packages, one for the revision and one
  	 * for the data itself.  Also check that the revision is valid
! 	 * (i.e. it is an integer set to 0).
  	 */
  	if (data->type != ACPI_TYPE_PACKAGE ||
  	    data->package.count < 2 ||
  	    data->package.elements[0].type != ACPI_TYPE_INTEGER ||
! 	    data->package.elements[0].integer.value != 0) {
  		IWL_DEBUG_DEV_RADIO(dev, "Unsupported packages structure\n");
  		return ERR_PTR(-EINVAL);
  	}
  
  	/* loop through all the packages to find the one for WiFi */
  	for (i = 1; i < data->package.count; i++) {
  		union acpi_object *domain;
--- 113,131 ----
  	/*
  	 * We need at least two packages, one for the revision and one
  	 * for the data itself.  Also check that the revision is valid
! 	 * (i.e. it is an integer smaller than 2, as we currently support only
! 	 * 2 revisions).
  	 */
  	if (data->type != ACPI_TYPE_PACKAGE ||
  	    data->package.count < 2 ||
  	    data->package.elements[0].type != ACPI_TYPE_INTEGER ||
! 	    data->package.elements[0].integer.value > 1) {
  		IWL_DEBUG_DEV_RADIO(dev, "Unsupported packages structure\n");
  		return ERR_PTR(-EINVAL);
  	}
  
+ 	*tbl_rev = data->package.elements[0].integer.value;
+ 
  	/* loop through all the packages to find the one for WiFi */
  	for (i = 1; i < data->package.count; i++) {
  		union acpi_object *domain;
***************
*** 151,164 ****
  {
  	union acpi_object *wifi_pkg, *data;
  	u32 mcc_val;
! 	int ret;
  
  	data = iwl_acpi_get_object(dev, ACPI_WRDD_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
! 	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg)) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
--- 154,168 ----
  {
  	union acpi_object *wifi_pkg, *data;
  	u32 mcc_val;
! 	int ret, tbl_rev;
  
  	data = iwl_acpi_get_object(dev, ACPI_WRDD_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
! 	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE,
! 					 &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev != 0) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
***************
*** 185,190 ****
--- 189,195 ----
  {
  	union acpi_object *data, *wifi_pkg;
  	u64 dflt_pwr_limit;
+ 	int tbl_rev;
  
  	data = iwl_acpi_get_object(dev, ACPI_SPLC_METHOD);
  	if (IS_ERR(data)) {
***************
*** 193,200 ****
  	}
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data,
! 					 ACPI_SPLC_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg) ||
  	    wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) {
  		dflt_pwr_limit = 0;
  		goto out_free;
--- 198,205 ----
  	}
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data,
! 					 ACPI_SPLC_WIFI_DATA_SIZE, &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev != 0 ||
  	    wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) {
  		dflt_pwr_limit = 0;
  		goto out_free;
***************
*** 211,224 ****
  int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
  {
  	union acpi_object *wifi_pkg, *data;
! 	int ret;
  
  	data = iwl_acpi_get_object(dev, ACPI_ECKV_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
! 	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg)) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
--- 216,230 ----
  int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
  {
  	union acpi_object *wifi_pkg, *data;
! 	int ret, tbl_rev;
  
  	data = iwl_acpi_get_object(dev, ACPI_ECKV_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
! 	wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE,
! 					 &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev != 0) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/acpi.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/acpi.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/acpi.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 97,103 ****
  void *iwl_acpi_get_object(struct device *dev, acpi_string method);
  union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  					 union acpi_object *data,
! 					 int data_size);
  
  /**
   * iwl_acpi_get_mcc - read MCC from ACPI, if available
--- 97,103 ----
  void *iwl_acpi_get_object(struct device *dev, acpi_string method);
  union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  					 union acpi_object *data,
! 					 int data_size, int *tbl_rev);
  
  /**
   * iwl_acpi_get_mcc - read MCC from ACPI, if available
***************
*** 131,137 ****
  
  static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  						       union acpi_object *data,
! 						       int data_size)
  {
  	return ERR_PTR(-ENOENT);
  }
--- 131,138 ----
  
  static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
  						       union acpi_object *data,
! 						       int data_size,
! 						       int *tbl_rev)
  {
  	return ERR_PTR(-ENOENT);
  }
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/api/power.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/api/power.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/api/power.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/api/power.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 420,432 ****
--- 420,444 ----
  } __packed; /* PER_CHAIN_LIMIT_OFFSET_GROUP_S_VER_1 */
  
  /**
+  * struct iwl_geo_tx_power_profile_cmd_v1 - struct for GEO_TX_POWER_LIMIT cmd.
+  * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation
+  * @table: offset profile per band.
+  */
+ struct iwl_geo_tx_power_profiles_cmd_v1 {
+ 	__le32 ops;
+ 	struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES];
+ } __packed; /* GEO_TX_POWER_LIMIT_VER_1 */
+ 
+ /**
   * struct iwl_geo_tx_power_profile_cmd - struct for GEO_TX_POWER_LIMIT cmd.
   * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation
   * @table: offset profile per band.
+  * @table_revision: BIOS table revision.
   */
  struct iwl_geo_tx_power_profiles_cmd {
  	__le32 ops;
  	struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES];
+ 	__le32 table_revision;
  } __packed; /* GEO_TX_POWER_LIMIT */
  
  /**
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/file.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/file.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/fw/file.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/fw/file.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 286,291 ****
--- 286,293 ----
   *	SCAN_OFFLOAD_PROFILES_QUERY_RSP_S.
   * @IWL_UCODE_TLV_API_MBSSID_HE: This ucode supports v2 of
   *	STA_CONTEXT_DOT11AX_API_S
+  * @IWL_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar
+  *	version tables.
   *
   * @NUM_IWL_UCODE_TLV_API: number of bits used
   */
***************
*** 318,323 ****
--- 320,326 ----
  	IWL_UCODE_TLV_API_MBSSID_HE		= (__force iwl_ucode_tlv_api_t)52,
  	IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE	= (__force iwl_ucode_tlv_api_t)53,
  	IWL_UCODE_TLV_API_FTM_RTT_ACCURACY      = (__force iwl_ucode_tlv_api_t)54,
+ 	IWL_UCODE_TLV_API_SAR_TABLE_VER         = (__force iwl_ucode_tlv_api_t)55,
  
  	NUM_IWL_UCODE_TLV_API
  #ifdef __CHECKER__
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-config.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-config.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-config.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-config.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 540,553 ****
--- 540,559 ----
  extern const struct iwl_cfg iwl9270_2ac_cfg;
  extern const struct iwl_cfg iwl9460_2ac_cfg;
  extern const struct iwl_cfg iwl9560_2ac_cfg;
+ extern const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc;
  extern const struct iwl_cfg iwl9560_2ac_160_cfg;
+ extern const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc;
  extern const struct iwl_cfg iwl9460_2ac_cfg_soc;
  extern const struct iwl_cfg iwl9461_2ac_cfg_soc;
+ extern const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc;
  extern const struct iwl_cfg iwl9462_2ac_cfg_soc;
+ extern const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc;
  extern const struct iwl_cfg iwl9560_2ac_cfg_soc;
  extern const struct iwl_cfg iwl9560_2ac_160_cfg_soc;
  extern const struct iwl_cfg iwl9560_killer_2ac_cfg_soc;
  extern const struct iwl_cfg iwl9560_killer_s_2ac_cfg_soc;
+ extern const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc;
+ extern const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc;
  extern const struct iwl_cfg iwl9460_2ac_cfg_shared_clk;
  extern const struct iwl_cfg iwl9461_2ac_cfg_shared_clk;
  extern const struct iwl_cfg iwl9462_2ac_cfg_shared_clk;
***************
*** 559,575 ****
--- 565,594 ----
  extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb;
  extern const struct iwl_cfg iwl22000_2ac_cfg_jf;
  extern const struct iwl_cfg iwl_ax101_cfg_qu_hr;
+ extern const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0;
  extern const struct iwl_cfg iwl_ax101_cfg_quz_hr;
  extern const struct iwl_cfg iwl22000_2ax_cfg_hr;
  extern const struct iwl_cfg iwl_ax200_cfg_cc;
+ extern const struct iwl_cfg iwl_ax201_cfg_qu_hr;
+ extern const struct iwl_cfg iwl_ax201_cfg_qu_hr;
+ extern const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0;
+ extern const struct iwl_cfg iwl_ax201_cfg_quz_hr;
+ extern const struct iwl_cfg iwl_ax1650i_cfg_quz_hr;
+ extern const struct iwl_cfg iwl_ax1650s_cfg_quz_hr;
  extern const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0;
  extern const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0;
+ extern const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0;
+ extern const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0;
  extern const struct iwl_cfg killer1650x_2ax_cfg;
  extern const struct iwl_cfg killer1650w_2ax_cfg;
  extern const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0;
  extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0;
  extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0;
  extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0;
+ extern const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0;
+ extern const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0;
+ extern const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0;
+ extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0;
  extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0;
  extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0;
  extern const struct iwl_cfg iwl22000_2ax_cfg_jf;
***************
*** 580,588 ****
  extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0;
! extern const struct iwl_cfg iwlax210_2ax_cfg_so_gf_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0;
! extern const struct iwl_cfg iwlax210_2ax_cfg_so_gf4_a0;
  #endif /* CPTCFG_IWLMVM || CPTCFG_IWLFMAC */
  
  #endif /* __IWL_CONFIG_H__ */
--- 599,607 ----
  extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0;
! extern const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0;
  extern const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0;
! extern const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0;
  #endif /* CPTCFG_IWLMVM || CPTCFG_IWLFMAC */
  
  #endif /* __IWL_CONFIG_H__ */
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-csr.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-csr.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-csr.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 328,333 ****
--- 328,335 ----
  #define CSR_HW_REV_TYPE_NONE		(0x00001F0)
  #define CSR_HW_REV_TYPE_QNJ		(0x0000360)
  #define CSR_HW_REV_TYPE_QNJ_B0		(0x0000364)
+ #define CSR_HW_REV_TYPE_QU_B0		(0x0000334)
+ #define CSR_HW_REV_TYPE_QU_C0		(0x0000338)
  #define CSR_HW_REV_TYPE_QUZ		(0x0000354)
  #define CSR_HW_REV_TYPE_HR_CDB		(0x0000340)
  #define CSR_HW_REV_TYPE_SO		(0x0000370)
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-drv.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/iwl-drv.c	2019-08-21 08:48:11.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/iwl-drv.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 233,238 ****
--- 233,240 ----
  	}
  
  	if (drv->fw_index < cfg->ucode_api_min) {
+ 		IWL_ERR(drv, "no suitable firmware found!\n");
+ 
  		if (cfg->ucode_api_min == cfg->ucode_api_max) {
  			IWL_ERR(drv, "%s%d is required\n", cfg->fw_name_pre,
  				cfg->ucode_api_max);
***************
*** 1625,1630 ****
--- 1627,1634 ----
  	init_completion(&drv->request_firmware_complete);
  	INIT_LIST_HEAD(&drv->list);
  
+ 	iwl_load_fw_dbg_tlv(drv->trans->dev, drv->trans);
+ 
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  	/* Create the device debugfs entries. */
  	drv->dbgfs_drv = debugfs_create_dir(dev_name(trans->dev),
***************
*** 1645,1652 ****
  err_fw:
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  	debugfs_remove_recursive(drv->dbgfs_drv);
- 	iwl_fw_dbg_free(drv->trans);
  #endif
  	kfree(drv);
  err:
  	return ERR_PTR(ret);
--- 1649,1656 ----
  err_fw:
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  	debugfs_remove_recursive(drv->dbgfs_drv);
  #endif
+ 	iwl_fw_dbg_free(drv->trans);
  	kfree(drv);
  err:
  	return ERR_PTR(ret);
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/fw.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/fw.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/fw.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 682,696 ****
  {
  	union acpi_object *wifi_pkg, *table, *data;
  	bool enabled;
! 	int ret;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_WRDS_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg)) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
--- 682,696 ----
  {
  	union acpi_object *wifi_pkg, *table, *data;
  	bool enabled;
! 	int ret, tbl_rev;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev != 0) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
***************
*** 719,733 ****
  {
  	union acpi_object *wifi_pkg, *data;
  	bool enabled;
! 	int i, n_profiles, ret;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_EWRD_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg)) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
--- 719,733 ----
  {
  	union acpi_object *wifi_pkg, *data;
  	bool enabled;
! 	int i, n_profiles, ret, tbl_rev;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD);
  	if (IS_ERR(data))
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev != 0) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
***************
*** 778,784 ****
  static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
  {
  	union acpi_object *wifi_pkg, *data;
! 	int i, j, ret;
  	int idx = 1;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD);
--- 778,784 ----
  static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
  {
  	union acpi_object *wifi_pkg, *data;
! 	int i, j, ret, tbl_rev;
  	int idx = 1;
  
  	data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD);
***************
*** 786,797 ****
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_WGDS_WIFI_DATA_SIZE);
! 	if (IS_ERR(wifi_pkg)) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
  
  	for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
  		for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) {
  			union acpi_object *entry;
--- 786,798 ----
  		return PTR_ERR(data);
  
  	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
! 					 ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev);
! 	if (IS_ERR(wifi_pkg) || tbl_rev > 1) {
  		ret = PTR_ERR(wifi_pkg);
  		goto out_free;
  	}
  
+ 	mvm->geo_rev = tbl_rev;
  	for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
  		for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) {
  			union acpi_object *entry;
***************
*** 894,908 ****
  {
  	struct iwl_geo_tx_power_profiles_resp *resp;
  	int ret;
  
! 	struct iwl_geo_tx_power_profiles_cmd geo_cmd = {
! 		.ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE),
! 	};
! 	struct iwl_host_cmd cmd = {
  		.id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT),
! 		.len = { sizeof(geo_cmd), },
  		.flags = CMD_WANT_SKB,
! 		.data = { &geo_cmd },
  	};
  
  	if (!iwl_mvm_sar_geo_support(mvm))
--- 895,923 ----
  {
  	struct iwl_geo_tx_power_profiles_resp *resp;
  	int ret;
+ 	u16 len;
+ 	void *data;
+ 	struct iwl_geo_tx_power_profiles_cmd geo_cmd;
+ 	struct iwl_geo_tx_power_profiles_cmd_v1 geo_cmd_v1;
+ 	struct iwl_host_cmd cmd;
+ 
+ 	if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
+ 		geo_cmd.ops =
+ 			cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
+ 		len = sizeof(geo_cmd);
+ 		data = &geo_cmd;
+ 	} else {
+ 		geo_cmd_v1.ops =
+ 			cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
+ 		len = sizeof(geo_cmd_v1);
+ 		data = &geo_cmd_v1;
+ 	}
  
! 	cmd = (struct iwl_host_cmd){
  		.id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT),
! 		.len = { len, },
  		.flags = CMD_WANT_SKB,
! 		.data = { data },
  	};
  
  	if (!iwl_mvm_sar_geo_support(mvm))
***************
*** 969,974 ****
--- 984,999 ----
  					i, j, value[1], value[2], value[0]);
  		}
  	}
+ 
+ 	cmd.table_revision = cpu_to_le32(mvm->geo_rev);
+ 
+ 	if (!fw_has_api(&mvm->fw->ucode_capa,
+ 		       IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
+ 		return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0,
+ 				sizeof(struct iwl_geo_tx_power_profiles_cmd_v1),
+ 				&cmd);
+ 	}
+ 
  	return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd);
  }
  
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 207,217 ****
  	},
  };
  
! static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
! 			       enum set_key_cmd cmd,
! 			       struct ieee80211_vif *vif,
! 			       struct ieee80211_sta *sta,
! 			       struct ieee80211_key_conf *key);
  
  void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
  {
--- 207,217 ----
  	},
  };
  
! static int __iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
! 				 enum set_key_cmd cmd,
! 				 struct ieee80211_vif *vif,
! 				 struct ieee80211_sta *sta,
! 				 struct ieee80211_key_conf *key);
  
  void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
  {
***************
*** 474,480 ****
  	ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
  	ieee80211_hw_set(hw, BUFF_MMPDU_TXQ);
  	ieee80211_hw_set(hw, STA_MMPDU_TXQ);
! 	ieee80211_hw_set(hw, TX_AMSDU);
  	ieee80211_hw_set(hw, TX_FRAG_LIST);
  
  	if (iwl_mvm_has_tlc_offload(mvm)) {
--- 474,492 ----
  	ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
  	ieee80211_hw_set(hw, BUFF_MMPDU_TXQ);
  	ieee80211_hw_set(hw, STA_MMPDU_TXQ);
! 	/*
! 	 * On older devices, enabling TX A-MSDU occasionally leads to
! 	 * something getting messed up, the command read from the FIFO
! 	 * gets out of sync and isn't a TX command, so that we have an
! 	 * assert EDC.
! 	 *
! 	 * It's not clear where the bug is, but since we didn't used to
! 	 * support A-MSDU until moving the mac80211 iTXQs, just leave it
! 	 * for older devices. We also don't see this issue on any newer
! 	 * devices.
! 	 */
! 	if (mvm->cfg->device_family >= IWL_DEVICE_FAMILY_9000)
! 		ieee80211_hw_set(hw, TX_AMSDU);
  	ieee80211_hw_set(hw, TX_FRAG_LIST);
  
  	if (iwl_mvm_has_tlc_offload(mvm)) {
***************
*** 2725,2731 ****
  
  		mvmvif->ap_early_keys[i] = NULL;
  
! 		ret = iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key);
  		if (ret)
  			goto out_quota_failed;
  	}
--- 2737,2743 ----
  
  		mvmvif->ap_early_keys[i] = NULL;
  
! 		ret = __iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key);
  		if (ret)
  			goto out_quota_failed;
  	}
***************
*** 3493,3503 ****
  	return ret;
  }
  
! static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
! 			       enum set_key_cmd cmd,
! 			       struct ieee80211_vif *vif,
! 			       struct ieee80211_sta *sta,
! 			       struct ieee80211_key_conf *key)
  {
  	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
  	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
--- 3505,3515 ----
  	return ret;
  }
  
! static int __iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
! 				 enum set_key_cmd cmd,
! 				 struct ieee80211_vif *vif,
! 				 struct ieee80211_sta *sta,
! 				 struct ieee80211_key_conf *key)
  {
  	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
  	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
***************
*** 3552,3559 ****
  			return -EOPNOTSUPP;
  	}
  
- 	mutex_lock(&mvm->mutex);
- 
  	switch (cmd) {
  	case SET_KEY:
  		if ((vif->type == NL80211_IFTYPE_ADHOC ||
--- 3564,3569 ----
***************
*** 3699,3705 ****
--- 3709,3730 ----
  		ret = -EINVAL;
  	}
  
+ 	return ret;
+ }
+ 
+ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
+ 			       enum set_key_cmd cmd,
+ 			       struct ieee80211_vif *vif,
+ 			       struct ieee80211_sta *sta,
+ 			       struct ieee80211_key_conf *key)
+ {
+ 	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+ 	int ret;
+ 
+ 	mutex_lock(&mvm->mutex);
+ 	ret = __iwl_mvm_mac_set_key(hw, cmd, vif, sta, key);
  	mutex_unlock(&mvm->mutex);
+ 
  	return ret;
  }
  
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 1184,1189 ****
--- 1184,1190 ----
  #ifdef CONFIG_ACPI
  	struct iwl_mvm_sar_profile sar_profiles[ACPI_SAR_PROFILE_NUM];
  	struct iwl_mvm_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES];
+ 	u32 geo_rev;
  #endif
  };
  
***************
*** 1806,1812 ****
  #endif /* CONFIG_IWLWIFI_DEBUGFS */
  
  /* rate scaling */
! int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool sync);
  void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
  int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate);
  void rs_update_last_rssi(struct iwl_mvm *mvm,
--- 1807,1813 ----
  #endif /* CONFIG_IWLWIFI_DEBUGFS */
  
  /* rate scaling */
! int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq);
  void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
  int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate);
  void rs_update_last_rssi(struct iwl_mvm *mvm,
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/rs.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/rs.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/rs.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 1197,1202 ****
--- 1197,1223 ----
  	return tid;
  }
  
+ void iwl_mvm_rs_init_wk(struct work_struct *wk)
+ {
+ 	struct iwl_mvm_sta *mvmsta = container_of(wk, struct iwl_mvm_sta,
+ 						  rs_init_wk);
+ 	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif);
+ 	struct ieee80211_sta *sta;
+ 
+ 	rcu_read_lock();
+ 
+ 	sta = rcu_dereference(mvmvif->mvm->fw_id_to_mac_id[mvmsta->sta_id]);
+ 	if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
+ 		rcu_read_unlock();
+ 		return;
+ 	}
+ 
+ 	iwl_mvm_rs_rate_init(mvmvif->mvm, sta, mvmvif->phy_ctxt->channel->band,
+ 			     true);
+ 
+ 	rcu_read_unlock();
+ }
+ 
  void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
  			  int tid, struct ieee80211_tx_info *info, bool ndp)
  {
***************
*** 1269,1275 ****
  		       (unsigned long)(lq_sta->last_tx +
  				       (IWL_MVM_RS_IDLE_TIMEOUT * HZ)))) {
  		IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n");
! 		iwl_mvm_rs_rate_init(mvm, sta, info->band, true);
  		return;
  	}
  	lq_sta->last_tx = jiffies;
--- 1290,1296 ----
  		       (unsigned long)(lq_sta->last_tx +
  				       (IWL_MVM_RS_IDLE_TIMEOUT * HZ)))) {
  		IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n");
! 		schedule_work(&mvmsta->rs_init_wk);
  		return;
  	}
  	lq_sta->last_tx = jiffies;
***************
*** 1305,1311 ****
  			IWL_DEBUG_RATE(mvm,
  				       "Too many rates mismatch. Send sync LQ. rs_state %d\n",
  				       lq_sta->rs_state);
! 			iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
  		}
  		/* Regardless, ignore this status info for outdated rate */
  		return;
--- 1326,1332 ----
  			IWL_DEBUG_RATE(mvm,
  				       "Too many rates mismatch. Send sync LQ. rs_state %d\n",
  				       lq_sta->rs_state);
! 			iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq);
  		}
  		/* Regardless, ignore this status info for outdated rate */
  		return;
***************
*** 1367,1373 ****
  		if (info->status.ampdu_ack_len == 0)
  			info->status.ampdu_len = 1;
  
! 		rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl, tx_resp_rate.index,
  				    info->status.ampdu_len,
  				    info->status.ampdu_ack_len);
  
--- 1388,1395 ----
  		if (info->status.ampdu_ack_len == 0)
  			info->status.ampdu_len = 1;
  
! 		rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl,
! 				    tx_resp_rate.index,
  				    info->status.ampdu_len,
  				    info->status.ampdu_ack_len);
  
***************
*** 1442,1457 ****
  	struct iwl_op_mode *op_mode = mvm_r;
  	struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  
! 	if (!iwl_mvm_sta_from_mac80211(sta)->vif)
  		return;
  
  	if (!ieee80211_is_data(hdr->frame_control) ||
  	    info->flags & IEEE80211_TX_CTL_NO_ACK)
  		return;
  
  	iwl_mvm_rs_tx_status(mvm, sta, rs_get_tid(hdr), info,
  			     ieee80211_is_qos_nullfunc(hdr->frame_control));
  }
  
  /*
--- 1464,1487 ----
  	struct iwl_op_mode *op_mode = mvm_r;
  	struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ 	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
  
! 	if (!mvmsta->vif)
  		return;
  
  	if (!ieee80211_is_data(hdr->frame_control) ||
  	    info->flags & IEEE80211_TX_CTL_NO_ACK)
  		return;
  
+ 	/* If it's locked we are in middle of init flow
+ 	 * just wait for next tx status to update the lq_sta data
+ 	 */
+ 	if (!mutex_trylock(&mvmsta->lq_sta.rs_drv.mutex))
+ 		return;
+ 
  	iwl_mvm_rs_tx_status(mvm, sta, rs_get_tid(hdr), info,
  			     ieee80211_is_qos_nullfunc(hdr->frame_control));
+ 	mutex_unlock(&mvmsta->lq_sta.rs_drv.mutex);
  }
  
  /*
***************
*** 1794,1800 ****
  			       struct iwl_scale_tbl_info *tbl)
  {
  	rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate);
! 	iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
  }
  
  static bool rs_tweak_rate_tbl(struct iwl_mvm *mvm,
--- 1824,1830 ----
  			       struct iwl_scale_tbl_info *tbl)
  {
  	rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate);
! 	iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq);
  }
  
  static bool rs_tweak_rate_tbl(struct iwl_mvm *mvm,
***************
*** 2896,2902 ****
  static void rs_initialize_lq(struct iwl_mvm *mvm,
  			     struct ieee80211_sta *sta,
  			     struct iwl_lq_sta *lq_sta,
! 			     enum nl80211_band band, bool update)
  {
  	struct iwl_scale_tbl_info *tbl;
  	struct rs_rate *rate;
--- 2926,2932 ----
  static void rs_initialize_lq(struct iwl_mvm *mvm,
  			     struct ieee80211_sta *sta,
  			     struct iwl_lq_sta *lq_sta,
! 			     enum nl80211_band band)
  {
  	struct iwl_scale_tbl_info *tbl;
  	struct rs_rate *rate;
***************
*** 2926,2932 ****
  	rs_set_expected_tpt_table(lq_sta, tbl);
  	rs_fill_lq_cmd(mvm, sta, lq_sta, rate);
  	/* TODO restore station should remember the lq cmd */
! 	iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, !update);
  }
  
  static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
--- 2956,2962 ----
  	rs_set_expected_tpt_table(lq_sta, tbl);
  	rs_fill_lq_cmd(mvm, sta, lq_sta, rate);
  	/* TODO restore station should remember the lq cmd */
! 	iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq);
  }
  
  static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
***************
*** 3179,3185 ****
   * Called after adding a new station to initialize rate scaling
   */
  static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
! 			     enum nl80211_band band, bool update)
  {
  	int i, j;
  	struct ieee80211_hw *hw = mvm->hw;
--- 3209,3215 ----
   * Called after adding a new station to initialize rate scaling
   */
  static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
! 			     enum nl80211_band band)
  {
  	int i, j;
  	struct ieee80211_hw *hw = mvm->hw;
***************
*** 3259,3265 ****
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  	iwl_mvm_reset_frame_stats(mvm);
  #endif
! 	rs_initialize_lq(mvm, sta, lq_sta, band, update);
  }
  
  static void rs_drv_rate_update(void *mvm_r,
--- 3289,3295 ----
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  	iwl_mvm_reset_frame_stats(mvm);
  #endif
! 	rs_initialize_lq(mvm, sta, lq_sta, band);
  }
  
  static void rs_drv_rate_update(void *mvm_r,
***************
*** 3573,3579 ****
  
  		bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED;
  		bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params);
! 		iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd, false);
  
  		ss_params |= LQ_SS_BFER_ALLOWED;
  		IWL_DEBUG_RATE(mvm,
--- 3603,3609 ----
  
  		bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED;
  		bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params);
! 		iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd);
  
  		ss_params |= LQ_SS_BFER_ALLOWED;
  		IWL_DEBUG_RATE(mvm,
***************
*** 3739,3745 ****
  
  	if (lq_sta->pers.dbg_fixed_rate) {
  		rs_fill_lq_cmd(mvm, NULL, lq_sta, NULL);
! 		iwl_mvm_send_lq_cmd(lq_sta->pers.drv, &lq_sta->lq, false);
  	}
  }
  
--- 3769,3775 ----
  
  	if (lq_sta->pers.dbg_fixed_rate) {
  		rs_fill_lq_cmd(mvm, NULL, lq_sta, NULL);
! 		iwl_mvm_send_lq_cmd(lq_sta->pers.drv, &lq_sta->lq);
  	}
  }
  
***************
*** 4136,4145 ****
  void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
  			  enum nl80211_band band, bool update)
  {
! 	if (iwl_mvm_has_tlc_offload(mvm))
  		rs_fw_rate_init(mvm, sta, band, update);
! 	else
! 		rs_drv_rate_init(mvm, sta, band, update);
  }
  
  int iwl_mvm_rate_control_register(void)
--- 4166,4180 ----
  void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
  			  enum nl80211_band band, bool update)
  {
! 	if (iwl_mvm_has_tlc_offload(mvm)) {
  		rs_fw_rate_init(mvm, sta, band, update);
! 	} else {
! 		struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
! 
! 		mutex_lock(&mvmsta->lq_sta.rs_drv.mutex);
! 		rs_drv_rate_init(mvm, sta, band);
! 		mutex_unlock(&mvmsta->lq_sta.rs_drv.mutex);
! 	}
  }
  
  int iwl_mvm_rate_control_register(void)
***************
*** 4169,4175 ****
  			lq->flags &= ~LQ_FLAG_USE_RTS_MSK;
  	}
  
! 	return iwl_mvm_send_lq_cmd(mvm, lq, false);
  }
  
  /**
--- 4204,4210 ----
  			lq->flags &= ~LQ_FLAG_USE_RTS_MSK;
  	}
  
! 	return iwl_mvm_send_lq_cmd(mvm, lq);
  }
  
  /**
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/rs.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/rs.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/rs.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/rs.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 4,10 ****
   * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
   * Copyright(c) 2015 Intel Mobile Communications GmbH
   * Copyright(c) 2017 Intel Deutschland GmbH
!  * Copyright(c) 2018 Intel Corporation
   *
   * Contact Information:
   *  Intel Linux Wireless <linuxwifi@intel.com>
--- 4,10 ----
   * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
   * Copyright(c) 2015 Intel Mobile Communications GmbH
   * Copyright(c) 2017 Intel Deutschland GmbH
!  * Copyright(c) 2018 - 2019 Intel Corporation
   *
   * Contact Information:
   *  Intel Linux Wireless <linuxwifi@intel.com>
***************
*** 376,381 ****
--- 376,384 ----
  	/* tx power reduce for this sta */
  	int tpc_reduce;
  
+ 	/* avoid races of reinit and update table from rx_tx */
+ 	struct mutex mutex;
+ 
  	/* persistent fields - initialized only once - keep last! */
  	struct lq_sta_pers {
  #ifdef CONFIG_MAC80211_DEBUGFS
***************
*** 440,445 ****
--- 443,450 ----
  int iwl_mvm_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
  			  bool enable);
  
+ void iwl_mvm_rs_init_wk(struct work_struct *wk);
+ 
  #ifdef CONFIG_IWLWIFI_DEBUGFS
  void iwl_mvm_reset_frame_stats(struct iwl_mvm *mvm);
  #endif
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/sta.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/sta.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/sta.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 1684,1689 ****
--- 1684,1693 ----
  	 */
  	if (iwl_mvm_has_tlc_offload(mvm))
  		iwl_mvm_rs_add_sta(mvm, mvm_sta);
+ 	else
+ 		mutex_init(&mvm_sta->lq_sta.rs_drv.mutex);
+ 
+ 	INIT_WORK(&mvm_sta->rs_init_wk, iwl_mvm_rs_init_wk);
  
  	iwl_mvm_toggle_tx_ant(mvm, &mvm_sta->tx_ant);
  
***************
*** 1846,1851 ****
--- 1850,1857 ----
  	if (ret)
  		return ret;
  
+ 	cancel_work_sync(&mvm_sta->rs_init_wk);
+ 
  	/* flush its queues here since we are freeing mvm_sta */
  	ret = iwl_mvm_flush_sta(mvm, mvm_sta, false, 0);
  	if (ret)
***************
*** 2972,2978 ****
  	IWL_DEBUG_HT(mvm, "Tx aggregation enabled on ra = %pM tid = %d\n",
  		     sta->addr, tid);
  
! 	return iwl_mvm_send_lq_cmd(mvm, &mvmsta->lq_sta.rs_drv.lq, false);
  }
  
  static void iwl_mvm_unreserve_agg_queue(struct iwl_mvm *mvm,
--- 2978,2984 ----
  	IWL_DEBUG_HT(mvm, "Tx aggregation enabled on ra = %pM tid = %d\n",
  		     sta->addr, tid);
  
! 	return iwl_mvm_send_lq_cmd(mvm, &mvmsta->lq_sta.rs_drv.lq);
  }
  
  static void iwl_mvm_unreserve_agg_queue(struct iwl_mvm *mvm,
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/sta.h linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/sta.h	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/sta.h	2019-09-16 02:23:24.000000000 -0400
***************
*** 421,426 ****
--- 421,427 ----
  		struct iwl_lq_sta_rs_fw rs_fw;
  		struct iwl_lq_sta rs_drv;
  	} lq_sta;
+ 	struct work_struct rs_init_wk;
  	struct ieee80211_vif *vif;
  	struct iwl_mvm_key_pn __rcu *ptk_pn[4];
  	struct iwl_mvm_rxq_dup_data *dup_data;
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/utils.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/mvm/utils.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/mvm/utils.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 641,652 ****
   * this case to clear the state indicating that station creation is in
   * progress.
   */
! int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool sync)
  {
  	struct iwl_host_cmd cmd = {
  		.id = LQ_CMD,
  		.len = { sizeof(struct iwl_lq_cmd), },
! 		.flags = sync ? 0 : CMD_ASYNC,
  		.data = { lq, },
  	};
  
--- 641,652 ----
   * this case to clear the state indicating that station creation is in
   * progress.
   */
! int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq)
  {
  	struct iwl_host_cmd cmd = {
  		.id = LQ_CMD,
  		.len = { sizeof(struct iwl_lq_cmd), },
! 		.flags = CMD_ASYNC,
  		.data = { lq, },
  	};
  
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/pcie/drv.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 513,574 ****
  	{IWL_PCI_DEVICE(0x24FD, 0x9074, iwl8265_2ac_cfg)},
  
  /* 9000 Series */
! 	{IWL_PCI_DEVICE(0x02F0, 0x0030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0034, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0038, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x003C, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0060, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0064, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x00A0, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x00A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0230, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0234, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0238, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x023C, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0260, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0264, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x02A0, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x02A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1551, iwl9560_killer_s_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1552, iwl9560_killer_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x2030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x2034, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4034, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x40A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4234, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x42A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0034, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0038, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x003C, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0060, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0064, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x00A0, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x00A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0230, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0234, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0238, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x023C, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0260, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0264, iwl9461_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x02A0, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x02A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1551, iwl9560_killer_s_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1552, iwl9560_killer_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x2030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x2034, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4030, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4034, iwl9560_2ac_160_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x40A4, iwl9462_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4234, iwl9560_2ac_cfg_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x42A4, iwl9462_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x0018, iwl9260_2ac_160_cfg)},
--- 513,568 ----
  	{IWL_PCI_DEVICE(0x24FD, 0x9074, iwl8265_2ac_cfg)},
  
  /* 9000 Series */
! 	{IWL_PCI_DEVICE(0x02F0, 0x0030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0034, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0038, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x003C, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0060, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0064, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x00A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x00A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0230, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0238, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x023C, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0260, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0264, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x02A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x02A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1551, iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1552, iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x2030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x2034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x40A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x42A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0034, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0038, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x003C, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0060, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0064, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x00A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x00A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0230, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0238, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x023C, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0260, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0264, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x02A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x02A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1551, iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1552, iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x2030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x2034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x40A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x42A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
  	{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x0018, iwl9260_2ac_160_cfg)},
***************
*** 610,615 ****
--- 604,610 ----
  	{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)},
+ 	{IWL_PCI_DEVICE(0x2526, 0x6014, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x8014, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0x8010, iwl9260_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_160_cfg)},
***************
*** 621,627 ****
  	{IWL_PCI_DEVICE(0x2720, 0x0034, iwl9560_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2720, 0x0038, iwl9560_2ac_160_cfg)},
  	{IWL_PCI_DEVICE(0x2720, 0x003C, iwl9560_2ac_160_cfg)},
- 	{IWL_PCI_DEVICE(0x2720, 0x0044, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0060, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2720, 0x0064, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2720, 0x00A0, iwl9462_2ac_cfg_soc)},
--- 616,621 ----
***************
*** 630,636 ****
  	{IWL_PCI_DEVICE(0x2720, 0x0234, iwl9560_2ac_cfg)},
  	{IWL_PCI_DEVICE(0x2720, 0x0238, iwl9560_2ac_cfg)},
  	{IWL_PCI_DEVICE(0x2720, 0x023C, iwl9560_2ac_cfg)},
- 	{IWL_PCI_DEVICE(0x2720, 0x0244, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0260, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2720, 0x0264, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x2720, 0x02A0, iwl9462_2ac_cfg_soc)},
--- 624,629 ----
***************
*** 708,714 ****
  	{IWL_PCI_DEVICE(0x34F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
- 	{IWL_PCI_DEVICE(0x34F0, 0x0044, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
--- 701,706 ----
***************
*** 717,723 ****
  	{IWL_PCI_DEVICE(0x34F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
- 	{IWL_PCI_DEVICE(0x34F0, 0x0244, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
--- 709,714 ----
***************
*** 764,770 ****
  	{IWL_PCI_DEVICE(0x43F0, 0x0034, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0038, iwl9560_2ac_160_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x003C, iwl9560_2ac_160_cfg_soc)},
- 	{IWL_PCI_DEVICE(0x43F0, 0x0044, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0060, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0064, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x00A0, iwl9462_2ac_cfg_soc)},
--- 755,760 ----
***************
*** 773,779 ****
  	{IWL_PCI_DEVICE(0x43F0, 0x0234, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0238, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x023C, iwl9560_2ac_cfg_soc)},
- 	{IWL_PCI_DEVICE(0x43F0, 0x0244, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0260, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x0264, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0x43F0, 0x02A0, iwl9462_2ac_cfg_soc)},
--- 763,768 ----
***************
*** 833,839 ****
  	{IWL_PCI_DEVICE(0xA0F0, 0x0034, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0038, iwl9560_2ac_160_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x003C, iwl9560_2ac_160_cfg_soc)},
- 	{IWL_PCI_DEVICE(0xA0F0, 0x0044, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0060, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0064, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x00A0, iwl9462_2ac_cfg_soc)},
--- 822,827 ----
***************
*** 842,848 ****
  	{IWL_PCI_DEVICE(0xA0F0, 0x0234, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0238, iwl9560_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x023C, iwl9560_2ac_cfg_soc)},
- 	{IWL_PCI_DEVICE(0xA0F0, 0x0244, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0260, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x0264, iwl9461_2ac_cfg_soc)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x02A0, iwl9462_2ac_cfg_soc)},
--- 830,835 ----
***************
*** 890,952 ****
  	{IWL_PCI_DEVICE(0x2720, 0x0030, iwl9560_2ac_cfg_qnj_jf_b0)},
  
  /* 22000 Series */
! 	{IWL_PCI_DEVICE(0x02F0, 0x0070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x007C, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0310, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x007C, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0310, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4070, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0000, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0070, iwl22000_2ac_cfg_hr_cdb)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x007C, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0090, iwl22000_2ac_cfg_hr_cdb)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0310, iwl22000_2ac_cfg_hr_cdb)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0A10, iwl22000_2ac_cfg_hr_cdb)},
  	{IWL_PCI_DEVICE(0x2720, 0x1080, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x2720, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x2720, 0x4070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x007C, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x34F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x4070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x007C, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x43F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x43F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x4070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0000, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0070, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0074, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0078, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x007C, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x00B0, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0A10, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x4070, iwl_ax101_cfg_qu_hr)},
  
  	{IWL_PCI_DEVICE(0x2723, 0x0080, iwl_ax200_cfg_cc)},
  	{IWL_PCI_DEVICE(0x2723, 0x0084, iwl_ax200_cfg_cc)},
--- 877,956 ----
  	{IWL_PCI_DEVICE(0x2720, 0x0030, iwl9560_2ac_cfg_qnj_jf_b0)},
  
  /* 22000 Series */
! 	{IWL_PCI_DEVICE(0x02F0, 0x0070, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0074, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0078, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x007C, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0244, iwl_ax101_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x0310, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1651, iwl_ax1650s_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x1652, iwl_ax1650i_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x2074, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4070, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x02F0, 0x4244, iwl_ax101_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0070, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0074, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0078, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x007C, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0244, iwl_ax101_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x0310, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1651, iwl_ax1650s_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x1652, iwl_ax1650i_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x2074, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4070, iwl_ax201_cfg_quz_hr)},
! 	{IWL_PCI_DEVICE(0x06F0, 0x4244, iwl_ax101_cfg_quz_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0000, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0040, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0078, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x007C, iwl_ax201_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x0090, iwl22000_2ac_cfg_hr_cdb)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0310, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x0A10, iwl_ax201_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x1080, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x2720, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x2720, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x2720, 0x2074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x4070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x2720, 0x4244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0078, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x007C, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl_ax201_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x34F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x34F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x2074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x4070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x34F0, 0x4244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0078, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x007C, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x0244, iwl_ax101_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0x43F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0x43F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x2074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x4070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0x43F0, 0x4244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0044, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0078, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x007C, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0244, iwl_ax101_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x0A10, iwl_ax201_cfg_qu_hr)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
  	{IWL_PCI_DEVICE(0xA0F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x2074, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x4070, iwl_ax201_cfg_qu_hr)},
! 	{IWL_PCI_DEVICE(0xA0F0, 0x4244, iwl_ax101_cfg_qu_hr)},
  
  	{IWL_PCI_DEVICE(0x2723, 0x0080, iwl_ax200_cfg_cc)},
  	{IWL_PCI_DEVICE(0x2723, 0x0084, iwl_ax200_cfg_cc)},
***************
*** 958,970 ****
  	{IWL_PCI_DEVICE(0x2723, 0x4080, iwl_ax200_cfg_cc)},
  	{IWL_PCI_DEVICE(0x2723, 0x4088, iwl_ax200_cfg_cc)},
  
! 	{IWL_PCI_DEVICE(0x2725, 0x0090, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0090, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0020, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0A10, iwlax210_2ax_cfg_so_hr_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x00B0, iwlax210_2ax_cfg_so_hr_a0)},
  
  #endif /* CONFIG_IWLMVM */
  
--- 962,981 ----
  	{IWL_PCI_DEVICE(0x2723, 0x4080, iwl_ax200_cfg_cc)},
  	{IWL_PCI_DEVICE(0x2723, 0x4088, iwl_ax200_cfg_cc)},
  
! 	{IWL_PCI_DEVICE(0x2725, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0020, iwlax210_2ax_cfg_ty_gf_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_ty_gf_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0510, iwlax210_2ax_cfg_ty_gf_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x0A10, iwlax210_2ax_cfg_ty_gf_a0)},
! 	{IWL_PCI_DEVICE(0x2725, 0x00B0, iwlax411_2ax_cfg_so_gf4_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7AF0, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7AF0, 0x0310, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7AF0, 0x0510, iwlax211_2ax_cfg_so_gf_a0)},
! 	{IWL_PCI_DEVICE(0x7AF0, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)},
  
  #endif /* CONFIG_IWLMVM */
  
***************
*** 1028,1033 ****
--- 1039,1069 ----
  		}
  		iwl_trans->cfg = cfg;
  	}
+ 
+ 	/*
+ 	 * This is a hack to switch from Qu B0 to Qu C0.  We need to
+ 	 * do this for all cfgs that use Qu B0.  All this code is in
+ 	 * urgent need for a refactor, but for now this is the easiest
+ 	 * thing to do to support Qu C-step.
+ 	 */
+ 	if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QU_C0) {
+ 		if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr)
+ 			iwl_trans->cfg = &iwl_ax101_cfg_qu_c0_hr_b0;
+ 		else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr)
+ 			iwl_trans->cfg = &iwl_ax201_cfg_qu_c0_hr_b0;
+ 		else if (iwl_trans->cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
+ 			iwl_trans->cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0;
+ 		else if (iwl_trans->cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
+ 			iwl_trans->cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0;
+ 		else if (iwl_trans->cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
+ 			iwl_trans->cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0;
+ 		else if (iwl_trans->cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
+ 			iwl_trans->cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0;
+ 		else if (iwl_trans->cfg == &killer1650s_2ax_cfg_qu_b0_hr_b0)
+ 			iwl_trans->cfg = &killer1650s_2ax_cfg_qu_c0_hr_b0;
+ 		else if (iwl_trans->cfg == &killer1650i_2ax_cfg_qu_b0_hr_b0)
+ 			iwl_trans->cfg = &killer1650i_2ax_cfg_qu_c0_hr_b0;
+ 	}
  #endif
  
  	pci_set_drvdata(pdev, iwl_trans);
diff -cr linux-source-5.2/drivers/net/wireless/intel/iwlwifi/pcie/trans.c linux-5.2.15/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
*** linux-source-5.2/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2019-08-16 04:11:12.000000000 -0400
--- linux-5.2.15/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2019-09-16 02:23:24.000000000 -0400
***************
*** 3569,3578 ****
  			trans->cfg = &iwlax210_2ax_cfg_so_jf_a0;
  		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF)) {
! 			trans->cfg = &iwlax210_2ax_cfg_so_gf_a0;
  		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF4)) {
! 			trans->cfg = &iwlax210_2ax_cfg_so_gf4_a0;
  		}
  	} else if (cfg == &iwl_ax101_cfg_qu_hr) {
  		if ((CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
--- 3569,3578 ----
  			trans->cfg = &iwlax210_2ax_cfg_so_jf_a0;
  		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF)) {
! 			trans->cfg = &iwlax211_2ax_cfg_so_gf_a0;
  		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF4)) {
! 			trans->cfg = &iwlax411_2ax_cfg_so_gf4_a0;
  		}
  	} else if (cfg == &iwl_ax101_cfg_qu_hr) {
  		if ((CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
***************
*** 3600,3609 ****
  		}
  	} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  		   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) &&
! 		   ((trans->cfg != &iwl_ax200_cfg_cc &&
! 		    trans->cfg != &killer1650x_2ax_cfg &&
! 		    trans->cfg != &killer1650w_2ax_cfg) ||
! 		    trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0)) {
  		u32 hw_status;
  
  		hw_status = iwl_read_prph(trans, UMAG_GEN_HW_STATUS);
--- 3600,3606 ----
  		}
  	} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
  		   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) &&
! 		   trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) {
  		u32 hw_status;
  
  		hw_status = iwl_read_prph(trans, UMAG_GEN_HW_STATUS);

Reply to: