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

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



Your message dated Sun, 18 Apr 2021 17:15:24 +0200
with message-id <[🔎] YHxNDAyF61jLWNeL@eldamar.lan>
and subject line Re: Bug#940825: linux-source-5.2: Backport of wifi driver fixes to enable wifi on whiseylake based system in 5.2.9
has caused the Debian Bug report #940825,
regarding linux-source-5.2: Backport of wifi driver fixes to enable wifi on whiseylake based system in 5.2.9
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
940825: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=940825
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
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);

--- End Message ---
--- Begin Message ---
Source: linux
Source-Version: 5.2.17-1

On Fri, Sep 20, 2019 at 08:29:12AM -0400, Mark Pearson wrote:
> 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

The changes seem to be included in 5.2.12 and so in the 5.2.17-1
upload to unstable.

Regards,
Salvatore

--- End Message ---

Reply to: