summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-11-01 13:36:46 -0400
committerDavid S. Miller <davem@davemloft.net>2019-11-01 13:36:46 -0400
commit33e4980532fd0b6727bdb15efe1b73adf741f36a (patch)
treef7359d312c21ebeed421ec97a5e8dd5f5a714e19
parent4202e219edd6cc164c042e16fa327525410705ae (diff)
parent3d206e6899a07fe853f703f7e68f84b48b919129 (diff)
Merge tag 'wireless-drivers-2019-11-01' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
Kalle Valo says: ==================== wireless-drivers fixes for 5.4 Third set of fixes for 5.4. Most of them are for iwlwifi but important fixes also for rtlwifi and mt76, the overflow fix for rtlwifi being most important. iwlwifi * fix merge damage on earlier patch * various fixes to device id handling * fix scan config command handling which caused firmware asserts rtlwifi * fix overflow on P2P IE handling * don't deliver too small frames to mac80211 mt76 * disable PCIE_ASPM * fix buffer DMA unmap on certain cases ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/fw/api/scan.h22
-rw-r--r--drivers/net/wireless/intel/iwlwifi/fw/file.h3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-csr.h1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-prph.h5
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mvm.h6
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/scan.c40
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/sta.c140
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/drv.c131
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c25
-rw-r--r--drivers/net/wireless/mediatek/mt76/Makefile2
-rw-r--r--drivers/net/wireless/mediatek/mt76/dma.c6
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt76.h6
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt76x2/pci.c2
-rw-r--r--drivers/net/wireless/mediatek/mt76/pci.c46
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/pci.c3
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/ps.c6
16 files changed, 305 insertions, 139 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h b/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
index 39c64850cb6f..c0750ced5ac2 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
@@ -520,7 +520,7 @@ struct iwl_scan_dwell {
520} __packed; 520} __packed;
521 521
522/** 522/**
523 * struct iwl_scan_config 523 * struct iwl_scan_config_v1
524 * @flags: enum scan_config_flags 524 * @flags: enum scan_config_flags
525 * @tx_chains: valid_tx antenna - ANT_* definitions 525 * @tx_chains: valid_tx antenna - ANT_* definitions
526 * @rx_chains: valid_rx antenna - ANT_* definitions 526 * @rx_chains: valid_rx antenna - ANT_* definitions
@@ -552,7 +552,7 @@ struct iwl_scan_config_v1 {
552#define SCAN_LB_LMAC_IDX 0 552#define SCAN_LB_LMAC_IDX 0
553#define SCAN_HB_LMAC_IDX 1 553#define SCAN_HB_LMAC_IDX 1
554 554
555struct iwl_scan_config { 555struct iwl_scan_config_v2 {
556 __le32 flags; 556 __le32 flags;
557 __le32 tx_chains; 557 __le32 tx_chains;
558 __le32 rx_chains; 558 __le32 rx_chains;
@@ -564,6 +564,24 @@ struct iwl_scan_config {
564 u8 bcast_sta_id; 564 u8 bcast_sta_id;
565 u8 channel_flags; 565 u8 channel_flags;
566 u8 channel_array[]; 566 u8 channel_array[];
567} __packed; /* SCAN_CONFIG_DB_CMD_API_S_2 */
568
569/**
570 * struct iwl_scan_config
571 * @enable_cam_mode: whether to enable CAM mode.
572 * @enable_promiscouos_mode: whether to enable promiscouos mode
573 * @bcast_sta_id: the index of the station in the fw
574 * @reserved: reserved
575 * @tx_chains: valid_tx antenna - ANT_* definitions
576 * @rx_chains: valid_rx antenna - ANT_* definitions
577 */
578struct iwl_scan_config {
579 u8 enable_cam_mode;
580 u8 enable_promiscouos_mode;
581 u8 bcast_sta_id;
582 u8 reserved;
583 __le32 tx_chains;
584 __le32 rx_chains;
567} __packed; /* SCAN_CONFIG_DB_CMD_API_S_3 */ 585} __packed; /* SCAN_CONFIG_DB_CMD_API_S_3 */
568 586
569/** 587/**
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h
index 423cc0cf8e78..0d5bc4ce5c07 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/file.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h
@@ -288,6 +288,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
288 * STA_CONTEXT_DOT11AX_API_S 288 * STA_CONTEXT_DOT11AX_API_S
289 * @IWL_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar 289 * @IWL_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar
290 * version tables. 290 * version tables.
291 * @IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG: This ucode supports v3 of
292 * SCAN_CONFIG_DB_CMD_API_S.
291 * 293 *
292 * @NUM_IWL_UCODE_TLV_API: number of bits used 294 * @NUM_IWL_UCODE_TLV_API: number of bits used
293 */ 295 */
@@ -321,6 +323,7 @@ enum iwl_ucode_tlv_api {
321 IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = (__force iwl_ucode_tlv_api_t)53, 323 IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = (__force iwl_ucode_tlv_api_t)53,
322 IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = (__force iwl_ucode_tlv_api_t)54, 324 IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = (__force iwl_ucode_tlv_api_t)54,
323 IWL_UCODE_TLV_API_SAR_TABLE_VER = (__force iwl_ucode_tlv_api_t)55, 325 IWL_UCODE_TLV_API_SAR_TABLE_VER = (__force iwl_ucode_tlv_api_t)55,
326 IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG = (__force iwl_ucode_tlv_api_t)56,
324 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP = (__force iwl_ucode_tlv_api_t)57, 327 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP = (__force iwl_ucode_tlv_api_t)57,
325 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER = (__force iwl_ucode_tlv_api_t)58, 328 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER = (__force iwl_ucode_tlv_api_t)58,
326 329
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
index cb4c5514a556..695bbaa86273 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
@@ -279,6 +279,7 @@
279 * Indicates MAC is entering a power-saving sleep power-down. 279 * Indicates MAC is entering a power-saving sleep power-down.
280 * Not a good time to access device-internal resources. 280 * Not a good time to access device-internal resources.
281 */ 281 */
282#define CSR_GP_CNTRL_REG_FLAG_INIT_DONE (0x00000004)
282#define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010) 283#define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010)
283#define CSR_GP_CNTRL_REG_FLAG_XTAL_ON (0x00000400) 284#define CSR_GP_CNTRL_REG_FLAG_XTAL_ON (0x00000400)
284 285
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
index f47e0f97acf8..23c25a7665f2 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
@@ -449,6 +449,11 @@ enum {
449#define PERSISTENCE_BIT BIT(12) 449#define PERSISTENCE_BIT BIT(12)
450#define PREG_WFPM_ACCESS BIT(12) 450#define PREG_WFPM_ACCESS BIT(12)
451 451
452#define HPM_HIPM_GEN_CFG 0xA03458
453#define HPM_HIPM_GEN_CFG_CR_PG_EN BIT(0)
454#define HPM_HIPM_GEN_CFG_CR_SLP_EN BIT(1)
455#define HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE BIT(10)
456
452#define UREG_DOORBELL_TO_ISR6 0xA05C04 457#define UREG_DOORBELL_TO_ISR6 0xA05C04
453#define UREG_DOORBELL_TO_ISR6_NMI_BIT BIT(0) 458#define UREG_DOORBELL_TO_ISR6_NMI_BIT BIT(0)
454#define UREG_DOORBELL_TO_ISR6_SUSPEND BIT(18) 459#define UREG_DOORBELL_TO_ISR6_SUSPEND BIT(18)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 843d00bf2bd5..5ca50f39a023 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -1405,6 +1405,12 @@ static inline bool iwl_mvm_is_scan_ext_chan_supported(struct iwl_mvm *mvm)
1405 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER); 1405 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER);
1406} 1406}
1407 1407
1408static inline bool iwl_mvm_is_reduced_config_scan_supported(struct iwl_mvm *mvm)
1409{
1410 return fw_has_api(&mvm->fw->ucode_capa,
1411 IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG);
1412}
1413
1408static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm) 1414static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
1409{ 1415{
1410 return fw_has_api(&mvm->fw->ucode_capa, 1416 return fw_has_api(&mvm->fw->ucode_capa,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index f6b3045badbd..fcafa22ec6ce 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -1137,11 +1137,11 @@ static void iwl_mvm_fill_scan_config_v1(struct iwl_mvm *mvm, void *config,
1137 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); 1137 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels);
1138} 1138}
1139 1139
1140static void iwl_mvm_fill_scan_config(struct iwl_mvm *mvm, void *config, 1140static void iwl_mvm_fill_scan_config_v2(struct iwl_mvm *mvm, void *config,
1141 u32 flags, u8 channel_flags, 1141 u32 flags, u8 channel_flags,
1142 u32 max_channels) 1142 u32 max_channels)
1143{ 1143{
1144 struct iwl_scan_config *cfg = config; 1144 struct iwl_scan_config_v2 *cfg = config;
1145 1145
1146 cfg->flags = cpu_to_le32(flags); 1146 cfg->flags = cpu_to_le32(flags);
1147 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); 1147 cfg->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
@@ -1185,7 +1185,7 @@ static void iwl_mvm_fill_scan_config(struct iwl_mvm *mvm, void *config,
1185 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels); 1185 iwl_mvm_fill_channels(mvm, cfg->channel_array, max_channels);
1186} 1186}
1187 1187
1188int iwl_mvm_config_scan(struct iwl_mvm *mvm) 1188static int iwl_mvm_legacy_config_scan(struct iwl_mvm *mvm)
1189{ 1189{
1190 void *cfg; 1190 void *cfg;
1191 int ret, cmd_size; 1191 int ret, cmd_size;
@@ -1217,7 +1217,7 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
1217 } 1217 }
1218 1218
1219 if (iwl_mvm_cdb_scan_api(mvm)) 1219 if (iwl_mvm_cdb_scan_api(mvm))
1220 cmd_size = sizeof(struct iwl_scan_config); 1220 cmd_size = sizeof(struct iwl_scan_config_v2);
1221 else 1221 else
1222 cmd_size = sizeof(struct iwl_scan_config_v1); 1222 cmd_size = sizeof(struct iwl_scan_config_v1);
1223 cmd_size += num_channels; 1223 cmd_size += num_channels;
@@ -1254,8 +1254,8 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
1254 flags |= (iwl_mvm_is_scan_fragmented(hb_type)) ? 1254 flags |= (iwl_mvm_is_scan_fragmented(hb_type)) ?
1255 SCAN_CONFIG_FLAG_SET_LMAC2_FRAGMENTED : 1255 SCAN_CONFIG_FLAG_SET_LMAC2_FRAGMENTED :
1256 SCAN_CONFIG_FLAG_CLEAR_LMAC2_FRAGMENTED; 1256 SCAN_CONFIG_FLAG_CLEAR_LMAC2_FRAGMENTED;
1257 iwl_mvm_fill_scan_config(mvm, cfg, flags, channel_flags, 1257 iwl_mvm_fill_scan_config_v2(mvm, cfg, flags, channel_flags,
1258 num_channels); 1258 num_channels);
1259 } else { 1259 } else {
1260 iwl_mvm_fill_scan_config_v1(mvm, cfg, flags, channel_flags, 1260 iwl_mvm_fill_scan_config_v1(mvm, cfg, flags, channel_flags,
1261 num_channels); 1261 num_channels);
@@ -1277,6 +1277,30 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
1277 return ret; 1277 return ret;
1278} 1278}
1279 1279
1280int iwl_mvm_config_scan(struct iwl_mvm *mvm)
1281{
1282 struct iwl_scan_config cfg;
1283 struct iwl_host_cmd cmd = {
1284 .id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0),
1285 .len[0] = sizeof(cfg),
1286 .data[0] = &cfg,
1287 .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
1288 };
1289
1290 if (!iwl_mvm_is_reduced_config_scan_supported(mvm))
1291 return iwl_mvm_legacy_config_scan(mvm);
1292
1293 memset(&cfg, 0, sizeof(cfg));
1294
1295 cfg.bcast_sta_id = mvm->aux_sta.sta_id;
1296 cfg.tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
1297 cfg.rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm));
1298
1299 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n");
1300
1301 return iwl_mvm_send_cmd(mvm, &cmd);
1302}
1303
1280static int iwl_mvm_scan_uid_by_status(struct iwl_mvm *mvm, int status) 1304static int iwl_mvm_scan_uid_by_status(struct iwl_mvm *mvm, int status)
1281{ 1305{
1282 int i; 1306 int i;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 0bedba4c61f2..b3768d5d852a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1482,6 +1482,13 @@ static void iwl_mvm_realloc_queues_after_restart(struct iwl_mvm *mvm,
1482 mvm_sta->sta_id, i); 1482 mvm_sta->sta_id, i);
1483 txq_id = iwl_mvm_tvqm_enable_txq(mvm, mvm_sta->sta_id, 1483 txq_id = iwl_mvm_tvqm_enable_txq(mvm, mvm_sta->sta_id,
1484 i, wdg); 1484 i, wdg);
1485 /*
1486 * on failures, just set it to IWL_MVM_INVALID_QUEUE
1487 * to try again later, we have no other good way of
1488 * failing here
1489 */
1490 if (txq_id < 0)
1491 txq_id = IWL_MVM_INVALID_QUEUE;
1485 tid_data->txq_id = txq_id; 1492 tid_data->txq_id = txq_id;
1486 1493
1487 /* 1494 /*
@@ -1950,30 +1957,73 @@ void iwl_mvm_dealloc_int_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *sta)
1950 sta->sta_id = IWL_MVM_INVALID_STA; 1957 sta->sta_id = IWL_MVM_INVALID_STA;
1951} 1958}
1952 1959
1953static void iwl_mvm_enable_aux_snif_queue(struct iwl_mvm *mvm, u16 *queue, 1960static void iwl_mvm_enable_aux_snif_queue(struct iwl_mvm *mvm, u16 queue,
1954 u8 sta_id, u8 fifo) 1961 u8 sta_id, u8 fifo)
1955{ 1962{
1956 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ? 1963 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ?
1957 mvm->trans->trans_cfg->base_params->wd_timeout : 1964 mvm->trans->trans_cfg->base_params->wd_timeout :
1958 IWL_WATCHDOG_DISABLED; 1965 IWL_WATCHDOG_DISABLED;
1966 struct iwl_trans_txq_scd_cfg cfg = {
1967 .fifo = fifo,
1968 .sta_id = sta_id,
1969 .tid = IWL_MAX_TID_COUNT,
1970 .aggregate = false,
1971 .frame_limit = IWL_FRAME_LIMIT,
1972 };
1973
1974 WARN_ON(iwl_mvm_has_new_tx_api(mvm));
1975
1976 iwl_mvm_enable_txq(mvm, NULL, queue, 0, &cfg, wdg_timeout);
1977}
1978
1979static int iwl_mvm_enable_aux_snif_queue_tvqm(struct iwl_mvm *mvm, u8 sta_id)
1980{
1981 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ?
1982 mvm->trans->trans_cfg->base_params->wd_timeout :
1983 IWL_WATCHDOG_DISABLED;
1984
1985 WARN_ON(!iwl_mvm_has_new_tx_api(mvm));
1986
1987 return iwl_mvm_tvqm_enable_txq(mvm, sta_id, IWL_MAX_TID_COUNT,
1988 wdg_timeout);
1989}
1959 1990
1991static int iwl_mvm_add_int_sta_with_queue(struct iwl_mvm *mvm, int macidx,
1992 int maccolor,
1993 struct iwl_mvm_int_sta *sta,
1994 u16 *queue, int fifo)
1995{
1996 int ret;
1997
1998 /* Map queue to fifo - needs to happen before adding station */
1999 if (!iwl_mvm_has_new_tx_api(mvm))
2000 iwl_mvm_enable_aux_snif_queue(mvm, *queue, sta->sta_id, fifo);
2001
2002 ret = iwl_mvm_add_int_sta_common(mvm, sta, NULL, macidx, maccolor);
2003 if (ret) {
2004 if (!iwl_mvm_has_new_tx_api(mvm))
2005 iwl_mvm_disable_txq(mvm, NULL, *queue,
2006 IWL_MAX_TID_COUNT, 0);
2007 return ret;
2008 }
2009
2010 /*
2011 * For 22000 firmware and on we cannot add queue to a station unknown
2012 * to firmware so enable queue here - after the station was added
2013 */
1960 if (iwl_mvm_has_new_tx_api(mvm)) { 2014 if (iwl_mvm_has_new_tx_api(mvm)) {
1961 int tvqm_queue = 2015 int txq;
1962 iwl_mvm_tvqm_enable_txq(mvm, sta_id,
1963 IWL_MAX_TID_COUNT,
1964 wdg_timeout);
1965 *queue = tvqm_queue;
1966 } else {
1967 struct iwl_trans_txq_scd_cfg cfg = {
1968 .fifo = fifo,
1969 .sta_id = sta_id,
1970 .tid = IWL_MAX_TID_COUNT,
1971 .aggregate = false,
1972 .frame_limit = IWL_FRAME_LIMIT,
1973 };
1974 2016
1975 iwl_mvm_enable_txq(mvm, NULL, *queue, 0, &cfg, wdg_timeout); 2017 txq = iwl_mvm_enable_aux_snif_queue_tvqm(mvm, sta->sta_id);
2018 if (txq < 0) {
2019 iwl_mvm_rm_sta_common(mvm, sta->sta_id);
2020 return txq;
2021 }
2022
2023 *queue = txq;
1976 } 2024 }
2025
2026 return 0;
1977} 2027}
1978 2028
1979int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm) 2029int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
@@ -1989,59 +2039,26 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
1989 if (ret) 2039 if (ret)
1990 return ret; 2040 return ret;
1991 2041
1992 /* Map Aux queue to fifo - needs to happen before adding Aux station */ 2042 ret = iwl_mvm_add_int_sta_with_queue(mvm, MAC_INDEX_AUX, 0,
1993 if (!iwl_mvm_has_new_tx_api(mvm)) 2043 &mvm->aux_sta, &mvm->aux_queue,
1994 iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue, 2044 IWL_MVM_TX_FIFO_MCAST);
1995 mvm->aux_sta.sta_id,
1996 IWL_MVM_TX_FIFO_MCAST);
1997
1998 ret = iwl_mvm_add_int_sta_common(mvm, &mvm->aux_sta, NULL,
1999 MAC_INDEX_AUX, 0);
2000 if (ret) { 2045 if (ret) {
2001 iwl_mvm_dealloc_int_sta(mvm, &mvm->aux_sta); 2046 iwl_mvm_dealloc_int_sta(mvm, &mvm->aux_sta);
2002 return ret; 2047 return ret;
2003 } 2048 }
2004 2049
2005 /*
2006 * For 22000 firmware and on we cannot add queue to a station unknown
2007 * to firmware so enable queue here - after the station was added
2008 */
2009 if (iwl_mvm_has_new_tx_api(mvm))
2010 iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue,
2011 mvm->aux_sta.sta_id,
2012 IWL_MVM_TX_FIFO_MCAST);
2013
2014 return 0; 2050 return 0;
2015} 2051}
2016 2052
2017int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif) 2053int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
2018{ 2054{
2019 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2055 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2020 int ret;
2021 2056
2022 lockdep_assert_held(&mvm->mutex); 2057 lockdep_assert_held(&mvm->mutex);
2023 2058
2024 /* Map snif queue to fifo - must happen before adding snif station */ 2059 return iwl_mvm_add_int_sta_with_queue(mvm, mvmvif->id, mvmvif->color,
2025 if (!iwl_mvm_has_new_tx_api(mvm)) 2060 &mvm->snif_sta, &mvm->snif_queue,
2026 iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
2027 mvm->snif_sta.sta_id,
2028 IWL_MVM_TX_FIFO_BE); 2061 IWL_MVM_TX_FIFO_BE);
2029
2030 ret = iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
2031 mvmvif->id, 0);
2032 if (ret)
2033 return ret;
2034
2035 /*
2036 * For 22000 firmware and on we cannot add queue to a station unknown
2037 * to firmware so enable queue here - after the station was added
2038 */
2039 if (iwl_mvm_has_new_tx_api(mvm))
2040 iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
2041 mvm->snif_sta.sta_id,
2042 IWL_MVM_TX_FIFO_BE);
2043
2044 return 0;
2045} 2062}
2046 2063
2047int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif) 2064int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
@@ -2133,6 +2150,10 @@ int iwl_mvm_send_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
2133 queue = iwl_mvm_tvqm_enable_txq(mvm, bsta->sta_id, 2150 queue = iwl_mvm_tvqm_enable_txq(mvm, bsta->sta_id,
2134 IWL_MAX_TID_COUNT, 2151 IWL_MAX_TID_COUNT,
2135 wdg_timeout); 2152 wdg_timeout);
2153 if (queue < 0) {
2154 iwl_mvm_rm_sta_common(mvm, bsta->sta_id);
2155 return queue;
2156 }
2136 2157
2137 if (vif->type == NL80211_IFTYPE_AP || 2158 if (vif->type == NL80211_IFTYPE_AP ||
2138 vif->type == NL80211_IFTYPE_ADHOC) 2159 vif->type == NL80211_IFTYPE_ADHOC)
@@ -2307,10 +2328,8 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
2307 } 2328 }
2308 ret = iwl_mvm_add_int_sta_common(mvm, msta, maddr, 2329 ret = iwl_mvm_add_int_sta_common(mvm, msta, maddr,
2309 mvmvif->id, mvmvif->color); 2330 mvmvif->id, mvmvif->color);
2310 if (ret) { 2331 if (ret)
2311 iwl_mvm_dealloc_int_sta(mvm, msta); 2332 goto err;
2312 return ret;
2313 }
2314 2333
2315 /* 2334 /*
2316 * Enable cab queue after the ADD_STA command is sent. 2335 * Enable cab queue after the ADD_STA command is sent.
@@ -2323,6 +2342,10 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
2323 int queue = iwl_mvm_tvqm_enable_txq(mvm, msta->sta_id, 2342 int queue = iwl_mvm_tvqm_enable_txq(mvm, msta->sta_id,
2324 0, 2343 0,
2325 timeout); 2344 timeout);
2345 if (queue < 0) {
2346 ret = queue;
2347 goto err;
2348 }
2326 mvmvif->cab_queue = queue; 2349 mvmvif->cab_queue = queue;
2327 } else if (!fw_has_api(&mvm->fw->ucode_capa, 2350 } else if (!fw_has_api(&mvm->fw->ucode_capa,
2328 IWL_UCODE_TLV_API_STA_TYPE)) 2351 IWL_UCODE_TLV_API_STA_TYPE))
@@ -2330,6 +2353,9 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
2330 timeout); 2353 timeout);
2331 2354
2332 return 0; 2355 return 0;
2356err:
2357 iwl_mvm_dealloc_int_sta(mvm, msta);
2358 return ret;
2333} 2359}
2334 2360
2335static int __iwl_mvm_remove_sta_key(struct iwl_mvm *mvm, u8 sta_id, 2361static int __iwl_mvm_remove_sta_key(struct iwl_mvm *mvm, u8 sta_id,
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 6f4bb7ce71a5..040cec17d3ad 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -573,20 +573,20 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
573 {IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)}, 573 {IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)},
574 {IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_160_cfg)}, 574 {IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_160_cfg)},
575 {IWL_PCI_DEVICE(0x2526, 0x003C, iwl9560_2ac_160_cfg)}, 575 {IWL_PCI_DEVICE(0x2526, 0x003C, iwl9560_2ac_160_cfg)},
576 {IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)}, 576 {IWL_PCI_DEVICE(0x2526, 0x0060, iwl9461_2ac_cfg_soc)},
577 {IWL_PCI_DEVICE(0x2526, 0x0064, iwl9460_2ac_cfg)}, 577 {IWL_PCI_DEVICE(0x2526, 0x0064, iwl9461_2ac_cfg_soc)},
578 {IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9460_2ac_cfg)}, 578 {IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9462_2ac_cfg_soc)},
579 {IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9460_2ac_cfg)}, 579 {IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9462_2ac_cfg_soc)},
580 {IWL_PCI_DEVICE(0x2526, 0x0210, iwl9260_2ac_cfg)}, 580 {IWL_PCI_DEVICE(0x2526, 0x0210, iwl9260_2ac_cfg)},
581 {IWL_PCI_DEVICE(0x2526, 0x0214, iwl9260_2ac_cfg)}, 581 {IWL_PCI_DEVICE(0x2526, 0x0214, iwl9260_2ac_cfg)},
582 {IWL_PCI_DEVICE(0x2526, 0x0230, iwl9560_2ac_cfg)}, 582 {IWL_PCI_DEVICE(0x2526, 0x0230, iwl9560_2ac_cfg)},
583 {IWL_PCI_DEVICE(0x2526, 0x0234, iwl9560_2ac_cfg)}, 583 {IWL_PCI_DEVICE(0x2526, 0x0234, iwl9560_2ac_cfg)},
584 {IWL_PCI_DEVICE(0x2526, 0x0238, iwl9560_2ac_cfg)}, 584 {IWL_PCI_DEVICE(0x2526, 0x0238, iwl9560_2ac_cfg)},
585 {IWL_PCI_DEVICE(0x2526, 0x023C, iwl9560_2ac_cfg)}, 585 {IWL_PCI_DEVICE(0x2526, 0x023C, iwl9560_2ac_cfg)},
586 {IWL_PCI_DEVICE(0x2526, 0x0260, iwl9460_2ac_cfg)}, 586 {IWL_PCI_DEVICE(0x2526, 0x0260, iwl9461_2ac_cfg_soc)},
587 {IWL_PCI_DEVICE(0x2526, 0x0264, iwl9461_2ac_cfg_soc)}, 587 {IWL_PCI_DEVICE(0x2526, 0x0264, iwl9461_2ac_cfg_soc)},
588 {IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9460_2ac_cfg)}, 588 {IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9462_2ac_cfg_soc)},
589 {IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9460_2ac_cfg)}, 589 {IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9462_2ac_cfg_soc)},
590 {IWL_PCI_DEVICE(0x2526, 0x1010, iwl9260_2ac_cfg)}, 590 {IWL_PCI_DEVICE(0x2526, 0x1010, iwl9260_2ac_cfg)},
591 {IWL_PCI_DEVICE(0x2526, 0x1030, iwl9560_2ac_cfg)}, 591 {IWL_PCI_DEVICE(0x2526, 0x1030, iwl9560_2ac_cfg)},
592 {IWL_PCI_DEVICE(0x2526, 0x1210, iwl9260_2ac_cfg)}, 592 {IWL_PCI_DEVICE(0x2526, 0x1210, iwl9260_2ac_cfg)},
@@ -603,7 +603,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
603 {IWL_PCI_DEVICE(0x2526, 0x401C, iwl9260_2ac_160_cfg)}, 603 {IWL_PCI_DEVICE(0x2526, 0x401C, iwl9260_2ac_160_cfg)},
604 {IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_160_cfg)}, 604 {IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_160_cfg)},
605 {IWL_PCI_DEVICE(0x2526, 0x4034, iwl9560_2ac_160_cfg_soc)}, 605 {IWL_PCI_DEVICE(0x2526, 0x4034, iwl9560_2ac_160_cfg_soc)},
606 {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, 606 {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9462_2ac_cfg_soc)},
607 {IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)}, 607 {IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)},
608 {IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)}, 608 {IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)},
609 {IWL_PCI_DEVICE(0x2526, 0x6010, iwl9260_2ac_160_cfg)}, 609 {IWL_PCI_DEVICE(0x2526, 0x6010, iwl9260_2ac_160_cfg)},
@@ -618,60 +618,61 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
618 {IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)}, 618 {IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
619 {IWL_PCI_DEVICE(0x271B, 0x0214, iwl9260_2ac_cfg)}, 619 {IWL_PCI_DEVICE(0x271B, 0x0214, iwl9260_2ac_cfg)},
620 {IWL_PCI_DEVICE(0x271C, 0x0214, iwl9260_2ac_cfg)}, 620 {IWL_PCI_DEVICE(0x271C, 0x0214, iwl9260_2ac_cfg)},
621 {IWL_PCI_DEVICE(0x2720, 0x0034, iwl9560_2ac_160_cfg)}, 621
622 {IWL_PCI_DEVICE(0x2720, 0x0038, iwl9560_2ac_160_cfg)}, 622 {IWL_PCI_DEVICE(0x2720, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
623 {IWL_PCI_DEVICE(0x2720, 0x003C, iwl9560_2ac_160_cfg)}, 623 {IWL_PCI_DEVICE(0x2720, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
624 {IWL_PCI_DEVICE(0x2720, 0x0060, iwl9461_2ac_cfg_soc)}, 624 {IWL_PCI_DEVICE(0x2720, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
625 {IWL_PCI_DEVICE(0x2720, 0x0064, iwl9461_2ac_cfg_soc)}, 625 {IWL_PCI_DEVICE(0x2720, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
626 {IWL_PCI_DEVICE(0x2720, 0x00A0, iwl9462_2ac_cfg_soc)}, 626 {IWL_PCI_DEVICE(0x2720, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
627 {IWL_PCI_DEVICE(0x2720, 0x00A4, iwl9462_2ac_cfg_soc)}, 627 {IWL_PCI_DEVICE(0x2720, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
628 {IWL_PCI_DEVICE(0x2720, 0x0230, iwl9560_2ac_cfg)}, 628 {IWL_PCI_DEVICE(0x2720, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
629 {IWL_PCI_DEVICE(0x2720, 0x0234, iwl9560_2ac_cfg)}, 629 {IWL_PCI_DEVICE(0x2720, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
630 {IWL_PCI_DEVICE(0x2720, 0x0238, iwl9560_2ac_cfg)}, 630 {IWL_PCI_DEVICE(0x2720, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
631 {IWL_PCI_DEVICE(0x2720, 0x023C, iwl9560_2ac_cfg)}, 631 {IWL_PCI_DEVICE(0x2720, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
632 {IWL_PCI_DEVICE(0x2720, 0x0260, iwl9461_2ac_cfg_soc)}, 632 {IWL_PCI_DEVICE(0x2720, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
633 {IWL_PCI_DEVICE(0x2720, 0x0264, iwl9461_2ac_cfg_soc)}, 633 {IWL_PCI_DEVICE(0x2720, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
634 {IWL_PCI_DEVICE(0x2720, 0x02A0, iwl9462_2ac_cfg_soc)}, 634 {IWL_PCI_DEVICE(0x2720, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
635 {IWL_PCI_DEVICE(0x2720, 0x02A4, iwl9462_2ac_cfg_soc)}, 635 {IWL_PCI_DEVICE(0x2720, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
636 {IWL_PCI_DEVICE(0x2720, 0x1010, iwl9260_2ac_cfg)}, 636 {IWL_PCI_DEVICE(0x2720, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
637 {IWL_PCI_DEVICE(0x2720, 0x1030, iwl9560_2ac_cfg_soc)}, 637 {IWL_PCI_DEVICE(0x2720, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
638 {IWL_PCI_DEVICE(0x2720, 0x1210, iwl9260_2ac_cfg)}, 638 {IWL_PCI_DEVICE(0x2720, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
639 {IWL_PCI_DEVICE(0x2720, 0x1551, iwl9560_killer_s_2ac_cfg_soc)}, 639 {IWL_PCI_DEVICE(0x2720, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
640 {IWL_PCI_DEVICE(0x2720, 0x1552, iwl9560_killer_2ac_cfg_soc)}, 640 {IWL_PCI_DEVICE(0x2720, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
641 {IWL_PCI_DEVICE(0x2720, 0x2030, iwl9560_2ac_160_cfg_soc)}, 641 {IWL_PCI_DEVICE(0x2720, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
642 {IWL_PCI_DEVICE(0x2720, 0x2034, iwl9560_2ac_160_cfg_soc)}, 642 {IWL_PCI_DEVICE(0x2720, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
643 {IWL_PCI_DEVICE(0x2720, 0x4030, iwl9560_2ac_160_cfg)}, 643 {IWL_PCI_DEVICE(0x2720, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
644 {IWL_PCI_DEVICE(0x2720, 0x4034, iwl9560_2ac_160_cfg_soc)}, 644 {IWL_PCI_DEVICE(0x2720, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
645 {IWL_PCI_DEVICE(0x2720, 0x40A4, iwl9462_2ac_cfg_soc)}, 645 {IWL_PCI_DEVICE(0x2720, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
646 {IWL_PCI_DEVICE(0x2720, 0x4234, iwl9560_2ac_cfg_soc)}, 646 {IWL_PCI_DEVICE(0x2720, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
647 {IWL_PCI_DEVICE(0x2720, 0x42A4, iwl9462_2ac_cfg_soc)}, 647
648 648 {IWL_PCI_DEVICE(0x30DC, 0x0030, iwl9560_2ac_160_cfg_soc)},
649 {IWL_PCI_DEVICE(0x30DC, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 649 {IWL_PCI_DEVICE(0x30DC, 0x0034, iwl9560_2ac_cfg_soc)},
650 {IWL_PCI_DEVICE(0x30DC, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 650 {IWL_PCI_DEVICE(0x30DC, 0x0038, iwl9560_2ac_160_cfg_soc)},
651 {IWL_PCI_DEVICE(0x30DC, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 651 {IWL_PCI_DEVICE(0x30DC, 0x003C, iwl9560_2ac_160_cfg_soc)},
652 {IWL_PCI_DEVICE(0x30DC, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 652 {IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg_soc)},
653 {IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)}, 653 {IWL_PCI_DEVICE(0x30DC, 0x0064, iwl9461_2ac_cfg_soc)},
654 {IWL_PCI_DEVICE(0x30DC, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)}, 654 {IWL_PCI_DEVICE(0x30DC, 0x00A0, iwl9462_2ac_cfg_soc)},
655 {IWL_PCI_DEVICE(0x30DC, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 655 {IWL_PCI_DEVICE(0x30DC, 0x00A4, iwl9462_2ac_cfg_soc)},
656 {IWL_PCI_DEVICE(0x30DC, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 656 {IWL_PCI_DEVICE(0x30DC, 0x0230, iwl9560_2ac_cfg_soc)},
657 {IWL_PCI_DEVICE(0x30DC, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 657 {IWL_PCI_DEVICE(0x30DC, 0x0234, iwl9560_2ac_cfg_soc)},
658 {IWL_PCI_DEVICE(0x30DC, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 658 {IWL_PCI_DEVICE(0x30DC, 0x0238, iwl9560_2ac_cfg_soc)},
659 {IWL_PCI_DEVICE(0x30DC, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 659 {IWL_PCI_DEVICE(0x30DC, 0x023C, iwl9560_2ac_cfg_soc)},
660 {IWL_PCI_DEVICE(0x30DC, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 660 {IWL_PCI_DEVICE(0x30DC, 0x0260, iwl9461_2ac_cfg_soc)},
661 {IWL_PCI_DEVICE(0x30DC, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)}, 661 {IWL_PCI_DEVICE(0x30DC, 0x0264, iwl9461_2ac_cfg_soc)},
662 {IWL_PCI_DEVICE(0x30DC, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)}, 662 {IWL_PCI_DEVICE(0x30DC, 0x02A0, iwl9462_2ac_cfg_soc)},
663 {IWL_PCI_DEVICE(0x30DC, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 663 {IWL_PCI_DEVICE(0x30DC, 0x02A4, iwl9462_2ac_cfg_soc)},
664 {IWL_PCI_DEVICE(0x30DC, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 664 {IWL_PCI_DEVICE(0x30DC, 0x1010, iwl9260_2ac_cfg)},
665 {IWL_PCI_DEVICE(0x30DC, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 665 {IWL_PCI_DEVICE(0x30DC, 0x1030, iwl9560_2ac_cfg_soc)},
666 {IWL_PCI_DEVICE(0x30DC, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)}, 666 {IWL_PCI_DEVICE(0x30DC, 0x1210, iwl9260_2ac_cfg)},
667 {IWL_PCI_DEVICE(0x30DC, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)}, 667 {IWL_PCI_DEVICE(0x30DC, 0x1551, iwl9560_killer_s_2ac_cfg_soc)},
668 {IWL_PCI_DEVICE(0x30DC, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 668 {IWL_PCI_DEVICE(0x30DC, 0x1552, iwl9560_killer_2ac_cfg_soc)},
669 {IWL_PCI_DEVICE(0x30DC, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 669 {IWL_PCI_DEVICE(0x30DC, 0x2030, iwl9560_2ac_160_cfg_soc)},
670 {IWL_PCI_DEVICE(0x30DC, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 670 {IWL_PCI_DEVICE(0x30DC, 0x2034, iwl9560_2ac_160_cfg_soc)},
671 {IWL_PCI_DEVICE(0x30DC, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)}, 671 {IWL_PCI_DEVICE(0x30DC, 0x4030, iwl9560_2ac_160_cfg_soc)},
672 {IWL_PCI_DEVICE(0x30DC, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 672 {IWL_PCI_DEVICE(0x30DC, 0x4034, iwl9560_2ac_160_cfg_soc)},
673 {IWL_PCI_DEVICE(0x30DC, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)}, 673 {IWL_PCI_DEVICE(0x30DC, 0x40A4, iwl9462_2ac_cfg_soc)},
674 {IWL_PCI_DEVICE(0x30DC, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, 674 {IWL_PCI_DEVICE(0x30DC, 0x4234, iwl9560_2ac_cfg_soc)},
675 {IWL_PCI_DEVICE(0x30DC, 0x42A4, iwl9462_2ac_cfg_soc)},
675 676
676 {IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_160_cfg_shared_clk)}, 677 {IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_160_cfg_shared_clk)},
677 {IWL_PCI_DEVICE(0x31DC, 0x0034, iwl9560_2ac_cfg_shared_clk)}, 678 {IWL_PCI_DEVICE(0x31DC, 0x0034, iwl9560_2ac_cfg_shared_clk)},
@@ -1067,11 +1068,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1067 } 1068 }
1068 } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) == 1069 } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
1069 CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && 1070 CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) &&
1070 ((cfg != &iwl_ax200_cfg_cc && 1071 iwl_trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) {
1071 cfg != &killer1650x_2ax_cfg &&
1072 cfg != &killer1650w_2ax_cfg &&
1073 cfg != &iwl_ax201_cfg_quz_hr) ||
1074 iwl_trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0)) {
1075 u32 hw_status; 1072 u32 hw_status;
1076 1073
1077 hw_status = iwl_read_prph(iwl_trans, UMAG_GEN_HW_STATUS); 1074 hw_status = iwl_read_prph(iwl_trans, UMAG_GEN_HW_STATUS);
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
index df8455f14e4d..ca3bb4d65b00 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
@@ -57,6 +57,24 @@
57#include "internal.h" 57#include "internal.h"
58#include "fw/dbg.h" 58#include "fw/dbg.h"
59 59
60static int iwl_pcie_gen2_force_power_gating(struct iwl_trans *trans)
61{
62 iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG,
63 HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE);
64 udelay(20);
65 iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG,
66 HPM_HIPM_GEN_CFG_CR_PG_EN |
67 HPM_HIPM_GEN_CFG_CR_SLP_EN);
68 udelay(20);
69 iwl_clear_bits_prph(trans, HPM_HIPM_GEN_CFG,
70 HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE);
71
72 iwl_trans_sw_reset(trans);
73 iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
74
75 return 0;
76}
77
60/* 78/*
61 * Start up NIC's basic functionality after it has been reset 79 * Start up NIC's basic functionality after it has been reset
62 * (e.g. after platform boot, or shutdown via iwl_pcie_apm_stop()) 80 * (e.g. after platform boot, or shutdown via iwl_pcie_apm_stop())
@@ -92,6 +110,13 @@ int iwl_pcie_gen2_apm_init(struct iwl_trans *trans)
92 110
93 iwl_pcie_apm_config(trans); 111 iwl_pcie_apm_config(trans);
94 112
113 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
114 trans->cfg->integrated) {
115 ret = iwl_pcie_gen2_force_power_gating(trans);
116 if (ret)
117 return ret;
118 }
119
95 ret = iwl_finish_nic_init(trans, trans->trans_cfg); 120 ret = iwl_finish_nic_init(trans, trans->trans_cfg);
96 if (ret) 121 if (ret)
97 return ret; 122 return ret;
diff --git a/drivers/net/wireless/mediatek/mt76/Makefile b/drivers/net/wireless/mediatek/mt76/Makefile
index 4d03596e891f..d7a1ddc9e407 100644
--- a/drivers/net/wireless/mediatek/mt76/Makefile
+++ b/drivers/net/wireless/mediatek/mt76/Makefile
@@ -8,6 +8,8 @@ mt76-y := \
8 mmio.o util.o trace.o dma.o mac80211.o debugfs.o eeprom.o \ 8 mmio.o util.o trace.o dma.o mac80211.o debugfs.o eeprom.o \
9 tx.o agg-rx.o mcu.o 9 tx.o agg-rx.o mcu.o
10 10
11mt76-$(CONFIG_PCI) += pci.o
12
11mt76-usb-y := usb.o usb_trace.o 13mt76-usb-y := usb.o usb_trace.o
12 14
13CFLAGS_trace.o := -I$(src) 15CFLAGS_trace.o := -I$(src)
diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
index c747eb24581c..8f69d00bd940 100644
--- a/drivers/net/wireless/mediatek/mt76/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/dma.c
@@ -53,8 +53,10 @@ mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
53 u32 ctrl; 53 u32 ctrl;
54 int i, idx = -1; 54 int i, idx = -1;
55 55
56 if (txwi) 56 if (txwi) {
57 q->entry[q->head].txwi = DMA_DUMMY_DATA; 57 q->entry[q->head].txwi = DMA_DUMMY_DATA;
58 q->entry[q->head].skip_buf0 = true;
59 }
58 60
59 for (i = 0; i < nbufs; i += 2, buf += 2) { 61 for (i = 0; i < nbufs; i += 2, buf += 2) {
60 u32 buf0 = buf[0].addr, buf1 = 0; 62 u32 buf0 = buf[0].addr, buf1 = 0;
@@ -97,7 +99,7 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,
97 __le32 __ctrl = READ_ONCE(q->desc[idx].ctrl); 99 __le32 __ctrl = READ_ONCE(q->desc[idx].ctrl);
98 u32 ctrl = le32_to_cpu(__ctrl); 100 u32 ctrl = le32_to_cpu(__ctrl);
99 101
100 if (!e->txwi || !e->skb) { 102 if (!e->skip_buf0) {
101 __le32 addr = READ_ONCE(q->desc[idx].buf0); 103 __le32 addr = READ_ONCE(q->desc[idx].buf0);
102 u32 len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctrl); 104 u32 len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctrl);
103 105
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 570c159515a0..8aec7ccf2d79 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -93,8 +93,9 @@ struct mt76_queue_entry {
93 struct urb *urb; 93 struct urb *urb;
94 }; 94 };
95 enum mt76_txq_id qid; 95 enum mt76_txq_id qid;
96 bool schedule; 96 bool skip_buf0:1;
97 bool done; 97 bool schedule:1;
98 bool done:1;
98}; 99};
99 100
100struct mt76_queue_regs { 101struct mt76_queue_regs {
@@ -578,6 +579,7 @@ bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
578#define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 579#define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__)
579 580
580void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 581void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs);
582void mt76_pci_disable_aspm(struct pci_dev *pdev);
581 583
582static inline u16 mt76_chip(struct mt76_dev *dev) 584static inline u16 mt76_chip(struct mt76_dev *dev)
583{ 585{
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
index 73c3104f8858..cf611d1b817c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
@@ -81,6 +81,8 @@ mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
81 /* RG_SSUSB_CDR_BR_PE1D = 0x3 */ 81 /* RG_SSUSB_CDR_BR_PE1D = 0x3 */
82 mt76_rmw_field(dev, 0x15c58, 0x3 << 6, 0x3); 82 mt76_rmw_field(dev, 0x15c58, 0x3 << 6, 0x3);
83 83
84 mt76_pci_disable_aspm(pdev);
85
84 return 0; 86 return 0;
85 87
86error: 88error:
diff --git a/drivers/net/wireless/mediatek/mt76/pci.c b/drivers/net/wireless/mediatek/mt76/pci.c
new file mode 100644
index 000000000000..04c5a692bc85
--- /dev/null
+++ b/drivers/net/wireless/mediatek/mt76/pci.c
@@ -0,0 +1,46 @@
1// SPDX-License-Identifier: ISC
2/*
3 * Copyright (C) 2019 Lorenzo Bianconi <lorenzo@kernel.org>
4 */
5
6#include <linux/pci.h>
7
8void mt76_pci_disable_aspm(struct pci_dev *pdev)
9{
10 struct pci_dev *parent = pdev->bus->self;
11 u16 aspm_conf, parent_aspm_conf = 0;
12
13 pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
14 aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
15 if (parent) {
16 pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
17 &parent_aspm_conf);
18 parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
19 }
20
21 if (!aspm_conf && (!parent || !parent_aspm_conf)) {
22 /* aspm already disabled */
23 return;
24 }
25
26 dev_info(&pdev->dev, "disabling ASPM %s %s\n",
27 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L0S) ? "L0s" : "",
28 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L1) ? "L1" : "");
29
30 if (IS_ENABLED(CONFIG_PCIEASPM)) {
31 int err;
32
33 err = pci_disable_link_state(pdev, aspm_conf);
34 if (!err)
35 return;
36 }
37
38 /* both device and parent should have the same ASPM setting.
39 * disable ASPM in downstream component first and then upstream.
40 */
41 pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
42 if (parent)
43 pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
44 aspm_conf);
45}
46EXPORT_SYMBOL_GPL(mt76_pci_disable_aspm);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index 6087ec7a90a6..f88d26535978 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -822,7 +822,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
822 hdr = rtl_get_hdr(skb); 822 hdr = rtl_get_hdr(skb);
823 fc = rtl_get_fc(skb); 823 fc = rtl_get_fc(skb);
824 824
825 if (!stats.crc && !stats.hwerror) { 825 if (!stats.crc && !stats.hwerror && (skb->len > FCS_LEN)) {
826 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, 826 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status,
827 sizeof(rx_status)); 827 sizeof(rx_status));
828 828
@@ -859,6 +859,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
859 _rtl_pci_rx_to_mac80211(hw, skb, rx_status); 859 _rtl_pci_rx_to_mac80211(hw, skb, rx_status);
860 } 860 }
861 } else { 861 } else {
862 /* drop packets with errors or those too short */
862 dev_kfree_skb_any(skb); 863 dev_kfree_skb_any(skb);
863 } 864 }
864new_trx_end: 865new_trx_end:
diff --git a/drivers/net/wireless/realtek/rtlwifi/ps.c b/drivers/net/wireless/realtek/rtlwifi/ps.c
index 70f04c2f5b17..fff8dda14023 100644
--- a/drivers/net/wireless/realtek/rtlwifi/ps.c
+++ b/drivers/net/wireless/realtek/rtlwifi/ps.c
@@ -754,6 +754,9 @@ static void rtl_p2p_noa_ie(struct ieee80211_hw *hw, void *data,
754 return; 754 return;
755 } else { 755 } else {
756 noa_num = (noa_len - 2) / 13; 756 noa_num = (noa_len - 2) / 13;
757 if (noa_num > P2P_MAX_NOA_NUM)
758 noa_num = P2P_MAX_NOA_NUM;
759
757 } 760 }
758 noa_index = ie[3]; 761 noa_index = ie[3];
759 if (rtlpriv->psc.p2p_ps_info.p2p_ps_mode == 762 if (rtlpriv->psc.p2p_ps_info.p2p_ps_mode ==
@@ -848,6 +851,9 @@ static void rtl_p2p_action_ie(struct ieee80211_hw *hw, void *data,
848 return; 851 return;
849 } else { 852 } else {
850 noa_num = (noa_len - 2) / 13; 853 noa_num = (noa_len - 2) / 13;
854 if (noa_num > P2P_MAX_NOA_NUM)
855 noa_num = P2P_MAX_NOA_NUM;
856
851 } 857 }
852 noa_index = ie[3]; 858 noa_index = ie[3];
853 if (rtlpriv->psc.p2p_ps_info.p2p_ps_mode == 859 if (rtlpriv->psc.p2p_ps_info.p2p_ps_mode ==