aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-01-20 02:23:27 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-01-22 10:55:12 -0500
commitd5234cb2f4d2bc15d088dac17d02260d2613be28 (patch)
tree091da929d43c132604bdac188067b67eb3854e7e
parentbd1ba664147ae271e592aa90266cf9aba6efe116 (diff)
parent2cee4762c528a9bd2cdff793197bf591a2196c11 (diff)
Merge remote-tracking branch 'iwlwifi-fixes/master' into iwlwifi-next
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Conflicts: drivers/net/wireless/iwlwifi/iwl-fw-file.h drivers/net/wireless/iwlwifi/mvm/scan.c
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-7000.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-8000.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fh.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw-file.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c35
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c57
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tx.c24
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c2
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/drv.c8
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c17
12 files changed, 112 insertions, 46 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c
index 9e76799c4750..97e38d2e2983 100644
--- a/drivers/net/wireless/iwlwifi/iwl-7000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-7000.c
@@ -69,8 +69,8 @@
69#include "iwl-agn-hw.h" 69#include "iwl-agn-hw.h"
70 70
71/* Highest firmware API version supported */ 71/* Highest firmware API version supported */
72#define IWL7260_UCODE_API_MAX 10 72#define IWL7260_UCODE_API_MAX 12
73#define IWL3160_UCODE_API_MAX 10 73#define IWL3160_UCODE_API_MAX 12
74 74
75/* Oldest version we won't warn about */ 75/* Oldest version we won't warn about */
76#define IWL7260_UCODE_API_OK 10 76#define IWL7260_UCODE_API_OK 10
@@ -111,7 +111,7 @@
111#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" 111#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
112 112
113#define IWL7265D_FW_PRE "iwlwifi-7265D-" 113#define IWL7265D_FW_PRE "iwlwifi-7265D-"
114#define IWL7265D_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" 114#define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode"
115 115
116#define NVM_HW_SECTION_NUM_FAMILY_7000 0 116#define NVM_HW_SECTION_NUM_FAMILY_7000 0
117 117
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c
index d6c05eabb16f..2f7fe8167dc9 100644
--- a/drivers/net/wireless/iwlwifi/iwl-8000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-8000.c
@@ -69,7 +69,7 @@
69#include "iwl-agn-hw.h" 69#include "iwl-agn-hw.h"
70 70
71/* Highest firmware API version supported */ 71/* Highest firmware API version supported */
72#define IWL8000_UCODE_API_MAX 10 72#define IWL8000_UCODE_API_MAX 12
73 73
74/* Oldest version we won't warn about */ 74/* Oldest version we won't warn about */
75#define IWL8000_UCODE_API_OK 10 75#define IWL8000_UCODE_API_OK 10
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
index e3af724e0e0a..e7c0df6db6ee 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
@@ -1261,10 +1261,10 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
1261 1261
1262 try_again: 1262 try_again:
1263 /* try next, if any */ 1263 /* try next, if any */
1264 kfree(pieces);
1265 release_firmware(ucode_raw); 1264 release_firmware(ucode_raw);
1266 if (iwl_request_firmware(drv, false)) 1265 if (iwl_request_firmware(drv, false))
1267 goto out_unbind; 1266 goto out_unbind;
1267 kfree(pieces);
1268 return; 1268 return;
1269 1269
1270 out_free_fw: 1270 out_free_fw:
diff --git a/drivers/net/wireless/iwlwifi/iwl-fh.h b/drivers/net/wireless/iwlwifi/iwl-fh.h
index 9564ae173d06..1f7f15eb86da 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fh.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fh.h
@@ -310,6 +310,7 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(unsigned int chnl)
310#define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000) 310#define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000)
311 311
312#define FH_MEM_TFDIB_REG1_ADDR_BITSHIFT 28 312#define FH_MEM_TFDIB_REG1_ADDR_BITSHIFT 28
313#define FH_MEM_TB_MAX_LENGTH (0x00020000)
313 314
314/* TFDB Area - TFDs buffer table */ 315/* TFDB Area - TFDs buffer table */
315#define FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK (0xFFFFFFFF) 316#define FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK (0xFFFFFFFF)
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
index 115e604e1ac9..4aa26b2e2e23 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
@@ -246,6 +246,7 @@ enum iwl_ucode_tlv_flag {
246 * the actual dwell time. 246 * the actual dwell time.
247 * @IWL_UCODE_TLV_API_SCD_CFG: This firmware can configure the scheduler 247 * @IWL_UCODE_TLV_API_SCD_CFG: This firmware can configure the scheduler
248 * through the dedicated host command. 248 * through the dedicated host command.
249 * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too.
249 * @IWL_UCODE_TLV_API_ASYNC_DTM: Async temperature notifications are supported. 250 * @IWL_UCODE_TLV_API_ASYNC_DTM: Async temperature notifications are supported.
250 */ 251 */
251enum iwl_ucode_tlv_api { 252enum iwl_ucode_tlv_api {
@@ -256,6 +257,7 @@ enum iwl_ucode_tlv_api {
256 IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), 257 IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8),
257 IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13), 258 IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13),
258 IWL_UCODE_TLV_API_SCD_CFG = BIT(15), 259 IWL_UCODE_TLV_API_SCD_CFG = BIT(15),
260 IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16),
259 IWL_UCODE_TLV_API_ASYNC_DTM = BIT(17), 261 IWL_UCODE_TLV_API_ASYNC_DTM = BIT(17),
260}; 262};
261 263
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index 2d1a81c493f1..cfc0e65b34a5 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -675,6 +675,7 @@ struct iwl_scan_channel_opt {
675 * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented 675 * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
676 * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report 676 * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
677 * and DS parameter set IEs into probe requests. 677 * and DS parameter set IEs into probe requests.
678 * @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
678 */ 679 */
679enum iwl_mvm_lmac_scan_flags { 680enum iwl_mvm_lmac_scan_flags {
680 IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), 681 IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0),
@@ -684,6 +685,7 @@ enum iwl_mvm_lmac_scan_flags {
684 IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), 685 IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4),
685 IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), 686 IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5),
686 IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6), 687 IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6),
688 IWL_MVM_LMAC_SCAN_FLAG_MATCH = BIT(9),
687}; 689};
688 690
689enum iwl_scan_priority { 691enum iwl_scan_priority {
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index d13903eff2ec..2c79ad360cd9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1211,8 +1211,13 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1211{ 1211{
1212 lockdep_assert_held(&mvm->mutex); 1212 lockdep_assert_held(&mvm->mutex);
1213 1213
1214 /* disallow low power states when the FW is down */ 1214 /*
1215 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); 1215 * Disallow low power states when the FW is down by taking
1216 * the UCODE_DOWN ref. in case of ongoing hw restart the
1217 * ref is already taken, so don't take it again.
1218 */
1219 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1220 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
1216 1221
1217 /* async_handlers_wk is now blocked */ 1222 /* async_handlers_wk is now blocked */
1218 1223
@@ -1230,6 +1235,12 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1230 /* the fw is stopped, the aux sta is dead: clean up driver state */ 1235 /* the fw is stopped, the aux sta is dead: clean up driver state */
1231 iwl_mvm_del_aux_sta(mvm); 1236 iwl_mvm_del_aux_sta(mvm);
1232 1237
1238 /*
1239 * Clear IN_HW_RESTART flag when stopping the hw (as restart_complete()
1240 * won't be called in this case).
1241 */
1242 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1243
1233 mvm->ucode_loaded = false; 1244 mvm->ucode_loaded = false;
1234} 1245}
1235 1246
@@ -3554,18 +3565,16 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
3554 msk |= mvmsta->tfd_queue_msk; 3565 msk |= mvmsta->tfd_queue_msk;
3555 } 3566 }
3556 3567
3557 if (drop) { 3568 msk &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]);
3558 if (iwl_mvm_flush_tx_path(mvm, msk, true))
3559 IWL_ERR(mvm, "flush request fail\n");
3560 mutex_unlock(&mvm->mutex);
3561 } else {
3562 mutex_unlock(&mvm->mutex);
3563 3569
3564 /* this can take a while, and we may need/want other operations 3570 if (iwl_mvm_flush_tx_path(mvm, msk, true))
3565 * to succeed while doing this, so do it without the mutex held 3571 IWL_ERR(mvm, "flush request fail\n");
3566 */ 3572 mutex_unlock(&mvm->mutex);
3567 iwl_trans_wait_tx_queue_empty(mvm->trans, msk); 3573
3568 } 3574 /* this can take a while, and we may need/want other operations
3575 * to succeed while doing this, so do it without the mutex held
3576 */
3577 iwl_trans_wait_tx_queue_empty(mvm->trans, msk);
3569} 3578}
3570 3579
3571const struct ieee80211_ops iwl_mvm_hw_ops = { 3580const struct ieee80211_ops iwl_mvm_hw_ops = {
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index 33e42841c9a2..3bd5f34d3285 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -1124,6 +1124,12 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify)
1124 return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, 1124 return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN,
1125 notify); 1125 notify);
1126 1126
1127 if (mvm->scan_status == IWL_MVM_SCAN_NONE)
1128 return 0;
1129
1130 if (iwl_mvm_is_radio_killed(mvm))
1131 goto out;
1132
1127 if (mvm->scan_status != IWL_MVM_SCAN_SCHED && 1133 if (mvm->scan_status != IWL_MVM_SCAN_SCHED &&
1128 (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || 1134 (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) ||
1129 mvm->scan_status != IWL_MVM_SCAN_OS)) { 1135 mvm->scan_status != IWL_MVM_SCAN_OS)) {
@@ -1160,6 +1166,7 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify)
1160 if (mvm->scan_status == IWL_MVM_SCAN_OS) 1166 if (mvm->scan_status == IWL_MVM_SCAN_OS)
1161 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); 1167 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
1162 1168
1169out:
1163 mvm->scan_status = IWL_MVM_SCAN_NONE; 1170 mvm->scan_status = IWL_MVM_SCAN_NONE;
1164 1171
1165 if (notify) { 1172 if (notify) {
@@ -1316,22 +1323,6 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm,
1316 cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); 1323 cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH);
1317 cmd->iter_num = cpu_to_le32(1); 1324 cmd->iter_num = cpu_to_le32(1);
1318 1325
1319 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT &&
1320 mvm->last_ebs_successful) {
1321 cmd->channel_opt[0].flags =
1322 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1323 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1324 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1325 cmd->channel_opt[0].non_ebs_ratio =
1326 cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
1327 cmd->channel_opt[1].flags =
1328 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1329 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1330 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1331 cmd->channel_opt[1].non_ebs_ratio =
1332 cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
1333 }
1334
1335 if (iwl_mvm_rrm_scan_needed(mvm)) 1326 if (iwl_mvm_rrm_scan_needed(mvm))
1336 cmd->scan_flags |= 1327 cmd->scan_flags |=
1337 cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); 1328 cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED);
@@ -1406,6 +1397,22 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm,
1406 cmd->schedule[1].iterations = 0; 1397 cmd->schedule[1].iterations = 0;
1407 cmd->schedule[1].full_scan_mul = 0; 1398 cmd->schedule[1].full_scan_mul = 0;
1408 1399
1400 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS &&
1401 mvm->last_ebs_successful) {
1402 cmd->channel_opt[0].flags =
1403 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1404 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1405 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1406 cmd->channel_opt[0].non_ebs_ratio =
1407 cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
1408 cmd->channel_opt[1].flags =
1409 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1410 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1411 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1412 cmd->channel_opt[1].non_ebs_ratio =
1413 cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
1414 }
1415
1409 for (i = 1; i <= req->req.n_ssids; i++) 1416 for (i = 1; i <= req->req.n_ssids; i++)
1410 ssid_bitmap |= BIT(i); 1417 ssid_bitmap |= BIT(i);
1411 1418
@@ -1478,6 +1485,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
1478 1485
1479 if (iwl_mvm_scan_pass_all(mvm, req)) 1486 if (iwl_mvm_scan_pass_all(mvm, req))
1480 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; 1487 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL;
1488 else
1489 flags |= IWL_MVM_LMAC_SCAN_FLAG_MATCH;
1481 1490
1482 if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0) 1491 if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0)
1483 flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION; 1492 flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION;
@@ -1509,6 +1518,22 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
1509 cmd->schedule[1].iterations = 0xff; 1518 cmd->schedule[1].iterations = 0xff;
1510 cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; 1519 cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER;
1511 1520
1521 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT &&
1522 mvm->last_ebs_successful) {
1523 cmd->channel_opt[0].flags =
1524 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1525 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1526 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1527 cmd->channel_opt[0].non_ebs_ratio =
1528 cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO);
1529 cmd->channel_opt[1].flags =
1530 cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS |
1531 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1532 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1533 cmd->channel_opt[1].non_ebs_ratio =
1534 cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO);
1535 }
1536
1512 iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, 1537 iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels,
1513 ssid_bitmap, cmd); 1538 ssid_bitmap, cmd);
1514 1539
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index 8ed55d628e93..07304e1fd64a 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -90,8 +90,6 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
90 90
91 if (ieee80211_is_probe_resp(fc)) 91 if (ieee80211_is_probe_resp(fc))
92 tx_flags |= TX_CMD_FLG_TSF; 92 tx_flags |= TX_CMD_FLG_TSF;
93 else if (ieee80211_is_back_req(fc))
94 tx_flags |= TX_CMD_FLG_ACK | TX_CMD_FLG_BAR;
95 93
96 if (ieee80211_has_morefrags(fc)) 94 if (ieee80211_has_morefrags(fc))
97 tx_flags |= TX_CMD_FLG_MORE_FRAG; 95 tx_flags |= TX_CMD_FLG_MORE_FRAG;
@@ -100,6 +98,15 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
100 u8 *qc = ieee80211_get_qos_ctl(hdr); 98 u8 *qc = ieee80211_get_qos_ctl(hdr);
101 tx_cmd->tid_tspec = qc[0] & 0xf; 99 tx_cmd->tid_tspec = qc[0] & 0xf;
102 tx_flags &= ~TX_CMD_FLG_SEQ_CTL; 100 tx_flags &= ~TX_CMD_FLG_SEQ_CTL;
101 } else if (ieee80211_is_back_req(fc)) {
102 struct ieee80211_bar *bar = (void *)skb->data;
103 u16 control = le16_to_cpu(bar->control);
104
105 tx_flags |= TX_CMD_FLG_ACK | TX_CMD_FLG_BAR;
106 tx_cmd->tid_tspec = (control &
107 IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
108 IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
109 WARN_ON_ONCE(tx_cmd->tid_tspec >= IWL_MAX_TID_COUNT);
103 } else { 110 } else {
104 tx_cmd->tid_tspec = IWL_TID_NON_QOS; 111 tx_cmd->tid_tspec = IWL_TID_NON_QOS;
105 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) 112 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
@@ -108,8 +115,12 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
108 tx_flags &= ~TX_CMD_FLG_SEQ_CTL; 115 tx_flags &= ~TX_CMD_FLG_SEQ_CTL;
109 } 116 }
110 117
111 /* tid_tspec will default to 0 = BE when QOS isn't enabled */ 118 /* Default to 0 (BE) when tid_spec is set to IWL_TID_NON_QOS */
112 ac = tid_to_mac80211_ac[tx_cmd->tid_tspec]; 119 if (tx_cmd->tid_tspec < IWL_MAX_TID_COUNT)
120 ac = tid_to_mac80211_ac[tx_cmd->tid_tspec];
121 else
122 ac = tid_to_mac80211_ac[0];
123
113 tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) << 124 tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) <<
114 TX_CMD_FLG_BT_PRIO_POS; 125 TX_CMD_FLG_BT_PRIO_POS;
115 126
@@ -920,6 +931,11 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
920 sta_id = ba_notif->sta_id; 931 sta_id = ba_notif->sta_id;
921 tid = ba_notif->tid; 932 tid = ba_notif->tid;
922 933
934 if (WARN_ONCE(sta_id >= IWL_MVM_STATION_COUNT ||
935 tid >= IWL_MAX_TID_COUNT,
936 "sta_id %d tid %d", sta_id, tid))
937 return 0;
938
923 rcu_read_lock(); 939 rcu_read_lock();
924 940
925 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]); 941 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 85effe269a2a..4eb3cad31aa9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -664,7 +664,7 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
664 if (num_of_ant(iwl_mvm_get_valid_rx_ant(mvm)) == 1) 664 if (num_of_ant(iwl_mvm_get_valid_rx_ant(mvm)) == 1)
665 return false; 665 return false;
666 666
667 if (!mvm->cfg->rx_with_siso_diversity) 667 if (mvm->cfg->rx_with_siso_diversity)
668 return false; 668 return false;
669 669
670 ieee80211_iterate_active_interfaces_atomic( 670 ieee80211_iterate_active_interfaces_atomic(
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
index c7820aa6aaea..dbd6bcf52205 100644
--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
@@ -367,7 +367,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
367 367
368/* 3165 Series */ 368/* 3165 Series */
369 {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, 369 {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)},
370 {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)},
371 {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)},
370 {IWL_PCI_DEVICE(0x3165, 0x4210, iwl3165_2ac_cfg)}, 372 {IWL_PCI_DEVICE(0x3165, 0x4210, iwl3165_2ac_cfg)},
373 {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)},
374 {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)},
371 375
372/* 7265 Series */ 376/* 7265 Series */
373 {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, 377 {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)},
@@ -525,8 +529,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
525 else if (cfg == &iwl7265_n_cfg) 529 else if (cfg == &iwl7265_n_cfg)
526 cfg_7265d = &iwl7265d_n_cfg; 530 cfg_7265d = &iwl7265d_n_cfg;
527 if (cfg_7265d && 531 if (cfg_7265d &&
528 (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) 532 (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) {
529 cfg = cfg_7265d; 533 cfg = cfg_7265d;
534 iwl_trans->cfg = cfg_7265d;
535 }
530#endif 536#endif
531 537
532 pci_set_drvdata(pdev, iwl_trans); 538 pci_set_drvdata(pdev, iwl_trans);
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 09696ca2a654..9ee4ca0ba8d3 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -629,7 +629,7 @@ static int iwl_pcie_load_section(struct iwl_trans *trans, u8 section_num,
629{ 629{
630 u8 *v_addr; 630 u8 *v_addr;
631 dma_addr_t p_addr; 631 dma_addr_t p_addr;
632 u32 offset, chunk_sz = section->len; 632 u32 offset, chunk_sz = min_t(u32, FH_MEM_TB_MAX_LENGTH, section->len);
633 int ret = 0; 633 int ret = 0;
634 634
635 IWL_DEBUG_FW(trans, "[%d] uCode section being loaded...\n", 635 IWL_DEBUG_FW(trans, "[%d] uCode section being loaded...\n",
@@ -1034,16 +1034,21 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
1034 /* Stop the device, and put it in low power state */ 1034 /* Stop the device, and put it in low power state */
1035 iwl_pcie_apm_stop(trans, false); 1035 iwl_pcie_apm_stop(trans, false);
1036 1036
1037 /* Upon stop, the APM issues an interrupt if HW RF kill is set. 1037 /* stop and reset the on-board processor */
1038 * Clean again the interrupt here 1038 iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
1039 udelay(20);
1040
1041 /*
1042 * Upon stop, the APM issues an interrupt if HW RF kill is set.
1043 * This is a bug in certain verions of the hardware.
1044 * Certain devices also keep sending HW RF kill interrupt all
1045 * the time, unless the interrupt is ACKed even if the interrupt
1046 * should be masked. Re-ACK all the interrupts here.
1039 */ 1047 */
1040 spin_lock(&trans_pcie->irq_lock); 1048 spin_lock(&trans_pcie->irq_lock);
1041 iwl_disable_interrupts(trans); 1049 iwl_disable_interrupts(trans);
1042 spin_unlock(&trans_pcie->irq_lock); 1050 spin_unlock(&trans_pcie->irq_lock);
1043 1051
1044 /* stop and reset the on-board processor */
1045 iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
1046 udelay(20);
1047 1052
1048 /* clear all status bits */ 1053 /* clear all status bits */
1049 clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); 1054 clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);