diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2015-01-20 02:23:27 -0500 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2015-01-22 10:55:12 -0500 |
commit | d5234cb2f4d2bc15d088dac17d02260d2613be28 (patch) | |
tree | 091da929d43c132604bdac188067b67eb3854e7e | |
parent | bd1ba664147ae271e592aa90266cf9aba6efe116 (diff) | |
parent | 2cee4762c528a9bd2cdff793197bf591a2196c11 (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.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-8000.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-drv.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-fh.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-fw-file.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/scan.c | 57 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/tx.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/utils.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/drv.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 17 |
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 | */ |
251 | enum iwl_ucode_tlv_api { | 252 | enum 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 | */ |
679 | enum iwl_mvm_lmac_scan_flags { | 680 | enum 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 | ||
689 | enum iwl_scan_priority { | 691 | enum 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 | ||
3571 | const struct ieee80211_ops iwl_mvm_hw_ops = { | 3580 | const 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 | ||
1169 | out: | ||
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); |