diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
| -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 | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 35 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/scan.c | 72 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/tx.c | 19 | ||||
| -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, 130 insertions, 49 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c index e5be2d21868f..a5f9198d5747 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 |
| @@ -105,7 +105,7 @@ | |||
| 105 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | 105 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" |
| 106 | 106 | ||
| 107 | #define IWL7265D_FW_PRE "iwlwifi-7265D-" | 107 | #define IWL7265D_FW_PRE "iwlwifi-7265D-" |
| 108 | #define IWL7265D_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | 108 | #define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode" |
| 109 | 109 | ||
| 110 | #define NVM_HW_SECTION_NUM_FAMILY_7000 0 | 110 | #define NVM_HW_SECTION_NUM_FAMILY_7000 0 |
| 111 | 111 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c index bf0a95cb7153..3668fc57e770 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 38de1513e4de..850b85a47806 100644 --- a/drivers/net/wireless/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c | |||
| @@ -1323,10 +1323,10 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) | |||
| 1323 | 1323 | ||
| 1324 | try_again: | 1324 | try_again: |
| 1325 | /* try next, if any */ | 1325 | /* try next, if any */ |
| 1326 | kfree(pieces); | ||
| 1327 | release_firmware(ucode_raw); | 1326 | release_firmware(ucode_raw); |
| 1328 | if (iwl_request_firmware(drv, false)) | 1327 | if (iwl_request_firmware(drv, false)) |
| 1329 | goto out_unbind; | 1328 | goto out_unbind; |
| 1329 | kfree(pieces); | ||
| 1330 | return; | 1330 | return; |
| 1331 | 1331 | ||
| 1332 | out_free_fw: | 1332 | 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 f2a047f6bb3e..660ddb1b7d8a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h +++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h | |||
| @@ -243,6 +243,10 @@ enum iwl_ucode_tlv_flag { | |||
| 243 | * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif. | 243 | * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif. |
| 244 | * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time | 244 | * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time |
| 245 | * longer than the passive one, which is essential for fragmented scan. | 245 | * longer than the passive one, which is essential for fragmented scan. |
| 246 | * @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command, | ||
| 247 | * regardless of the band or the number of the probes. FW will calculate | ||
| 248 | * the actual dwell time. | ||
| 249 | * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too. | ||
| 246 | */ | 250 | */ |
| 247 | enum iwl_ucode_tlv_api { | 251 | enum iwl_ucode_tlv_api { |
| 248 | IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0), | 252 | IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0), |
| @@ -253,6 +257,8 @@ enum iwl_ucode_tlv_api { | |||
| 253 | IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6), | 257 | IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6), |
| 254 | IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7), | 258 | IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7), |
| 255 | IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), | 259 | IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), |
| 260 | IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13), | ||
| 261 | IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16), | ||
| 256 | }; | 262 | }; |
| 257 | 263 | ||
| 258 | /** | 264 | /** |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h index 1f2acf47bfb2..cfc0e65b34a5 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | |||
| @@ -653,8 +653,11 @@ enum iwl_scan_channel_flags { | |||
| 653 | }; | 653 | }; |
| 654 | 654 | ||
| 655 | /* iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S | 655 | /* iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S |
| 656 | * @flags: enum iwl_scan_channel_flgs | 656 | * @flags: enum iwl_scan_channel_flags |
| 657 | * @non_ebs_ratio: how many regular scan iteration before EBS | 657 | * @non_ebs_ratio: defines the ratio of number of scan iterations where EBS is |
| 658 | * involved. | ||
| 659 | * 1 - EBS is disabled. | ||
| 660 | * 2 - every second scan will be full scan(and so on). | ||
| 658 | */ | 661 | */ |
| 659 | struct iwl_scan_channel_opt { | 662 | struct iwl_scan_channel_opt { |
| 660 | __le16 flags; | 663 | __le16 flags; |
| @@ -672,6 +675,7 @@ struct iwl_scan_channel_opt { | |||
| 672 | * @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 |
| 673 | * @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 |
| 674 | * 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 | ||
| 675 | */ | 679 | */ |
| 676 | enum iwl_mvm_lmac_scan_flags { | 680 | enum iwl_mvm_lmac_scan_flags { |
| 677 | IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), | 681 | IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), |
| @@ -681,6 +685,7 @@ enum iwl_mvm_lmac_scan_flags { | |||
| 681 | IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), | 685 | IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), |
| 682 | IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), | 686 | IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), |
| 683 | 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), | ||
| 684 | }; | 689 | }; |
| 685 | 690 | ||
| 686 | 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 31a5b3f4266c..20915587c820 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
| @@ -1004,8 +1004,13 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm) | |||
| 1004 | { | 1004 | { |
| 1005 | lockdep_assert_held(&mvm->mutex); | 1005 | lockdep_assert_held(&mvm->mutex); |
| 1006 | 1006 | ||
| 1007 | /* disallow low power states when the FW is down */ | 1007 | /* |
| 1008 | iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); | 1008 | * Disallow low power states when the FW is down by taking |
| 1009 | * the UCODE_DOWN ref. in case of ongoing hw restart the | ||
| 1010 | * ref is already taken, so don't take it again. | ||
| 1011 | */ | ||
| 1012 | if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) | ||
| 1013 | iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); | ||
| 1009 | 1014 | ||
| 1010 | /* async_handlers_wk is now blocked */ | 1015 | /* async_handlers_wk is now blocked */ |
| 1011 | 1016 | ||
| @@ -1023,6 +1028,12 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm) | |||
| 1023 | /* the fw is stopped, the aux sta is dead: clean up driver state */ | 1028 | /* the fw is stopped, the aux sta is dead: clean up driver state */ |
| 1024 | iwl_mvm_del_aux_sta(mvm); | 1029 | iwl_mvm_del_aux_sta(mvm); |
| 1025 | 1030 | ||
| 1031 | /* | ||
| 1032 | * Clear IN_HW_RESTART flag when stopping the hw (as restart_complete() | ||
| 1033 | * won't be called in this case). | ||
| 1034 | */ | ||
| 1035 | clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); | ||
| 1036 | |||
| 1026 | mvm->ucode_loaded = false; | 1037 | mvm->ucode_loaded = false; |
| 1027 | } | 1038 | } |
| 1028 | 1039 | ||
| @@ -3332,18 +3343,16 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw, | |||
| 3332 | msk |= mvmsta->tfd_queue_msk; | 3343 | msk |= mvmsta->tfd_queue_msk; |
| 3333 | } | 3344 | } |
| 3334 | 3345 | ||
| 3335 | if (drop) { | 3346 | msk &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]); |
| 3336 | if (iwl_mvm_flush_tx_path(mvm, msk, true)) | ||
| 3337 | IWL_ERR(mvm, "flush request fail\n"); | ||
| 3338 | mutex_unlock(&mvm->mutex); | ||
| 3339 | } else { | ||
| 3340 | mutex_unlock(&mvm->mutex); | ||
| 3341 | 3347 | ||
| 3342 | /* this can take a while, and we may need/want other operations | 3348 | if (iwl_mvm_flush_tx_path(mvm, msk, true)) |
| 3343 | * to succeed while doing this, so do it without the mutex held | 3349 | IWL_ERR(mvm, "flush request fail\n"); |
| 3344 | */ | 3350 | mutex_unlock(&mvm->mutex); |
| 3345 | iwl_trans_wait_tx_queue_empty(mvm->trans, msk); | 3351 | |
| 3346 | } | 3352 | /* this can take a while, and we may need/want other operations |
| 3353 | * to succeed while doing this, so do it without the mutex held | ||
| 3354 | */ | ||
| 3355 | iwl_trans_wait_tx_queue_empty(mvm->trans, msk); | ||
| 3347 | } | 3356 | } |
| 3348 | 3357 | ||
| 3349 | const struct ieee80211_ops iwl_mvm_hw_ops = { | 3358 | 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 e5294d01181e..844bf7c4c8de 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -72,6 +72,8 @@ | |||
| 72 | 72 | ||
| 73 | #define IWL_PLCP_QUIET_THRESH 1 | 73 | #define IWL_PLCP_QUIET_THRESH 1 |
| 74 | #define IWL_ACTIVE_QUIET_TIME 10 | 74 | #define IWL_ACTIVE_QUIET_TIME 10 |
| 75 | #define IWL_DENSE_EBS_SCAN_RATIO 5 | ||
| 76 | #define IWL_SPARSE_EBS_SCAN_RATIO 1 | ||
| 75 | 77 | ||
| 76 | struct iwl_mvm_scan_params { | 78 | struct iwl_mvm_scan_params { |
| 77 | u32 max_out_time; | 79 | u32 max_out_time; |
| @@ -171,15 +173,21 @@ static void iwl_mvm_scan_fill_ssids(struct iwl_ssid_ie *cmd_ssid, | |||
| 171 | * already included in the probe template, so we need to set only | 173 | * already included in the probe template, so we need to set only |
| 172 | * req->n_ssids - 1 bits in addition to the first bit. | 174 | * req->n_ssids - 1 bits in addition to the first bit. |
| 173 | */ | 175 | */ |
| 174 | static u16 iwl_mvm_get_active_dwell(enum ieee80211_band band, int n_ssids) | 176 | static u16 iwl_mvm_get_active_dwell(struct iwl_mvm *mvm, |
| 177 | enum ieee80211_band band, int n_ssids) | ||
| 175 | { | 178 | { |
| 179 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) | ||
| 180 | return 10; | ||
| 176 | if (band == IEEE80211_BAND_2GHZ) | 181 | if (band == IEEE80211_BAND_2GHZ) |
| 177 | return 20 + 3 * (n_ssids + 1); | 182 | return 20 + 3 * (n_ssids + 1); |
| 178 | return 10 + 2 * (n_ssids + 1); | 183 | return 10 + 2 * (n_ssids + 1); |
| 179 | } | 184 | } |
| 180 | 185 | ||
| 181 | static u16 iwl_mvm_get_passive_dwell(enum ieee80211_band band) | 186 | static u16 iwl_mvm_get_passive_dwell(struct iwl_mvm *mvm, |
| 187 | enum ieee80211_band band) | ||
| 182 | { | 188 | { |
| 189 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) | ||
| 190 | return 110; | ||
| 183 | return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10; | 191 | return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10; |
| 184 | } | 192 | } |
| 185 | 193 | ||
| @@ -331,7 +339,8 @@ static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm, | |||
| 331 | */ | 339 | */ |
| 332 | if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { | 340 | if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { |
| 333 | u32 passive_dwell = | 341 | u32 passive_dwell = |
| 334 | iwl_mvm_get_passive_dwell(IEEE80211_BAND_2GHZ); | 342 | iwl_mvm_get_passive_dwell(mvm, |
| 343 | IEEE80211_BAND_2GHZ); | ||
| 335 | params->max_out_time = passive_dwell; | 344 | params->max_out_time = passive_dwell; |
| 336 | } else { | 345 | } else { |
| 337 | params->passive_fragmented = true; | 346 | params->passive_fragmented = true; |
| @@ -348,8 +357,8 @@ not_bound: | |||
| 348 | params->dwell[band].passive = frag_passive_dwell; | 357 | params->dwell[band].passive = frag_passive_dwell; |
| 349 | else | 358 | else |
| 350 | params->dwell[band].passive = | 359 | params->dwell[band].passive = |
| 351 | iwl_mvm_get_passive_dwell(band); | 360 | iwl_mvm_get_passive_dwell(mvm, band); |
| 352 | params->dwell[band].active = iwl_mvm_get_active_dwell(band, | 361 | params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band, |
| 353 | n_ssids); | 362 | n_ssids); |
| 354 | } | 363 | } |
| 355 | } | 364 | } |
| @@ -1098,6 +1107,12 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1098 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, | 1107 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, |
| 1099 | notify); | 1108 | notify); |
| 1100 | 1109 | ||
| 1110 | if (mvm->scan_status == IWL_MVM_SCAN_NONE) | ||
| 1111 | return 0; | ||
| 1112 | |||
| 1113 | if (iwl_mvm_is_radio_killed(mvm)) | ||
| 1114 | goto out; | ||
| 1115 | |||
| 1101 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && | 1116 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && |
| 1102 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || | 1117 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || |
| 1103 | mvm->scan_status != IWL_MVM_SCAN_OS)) { | 1118 | mvm->scan_status != IWL_MVM_SCAN_OS)) { |
| @@ -1134,6 +1149,7 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1134 | if (mvm->scan_status == IWL_MVM_SCAN_OS) | 1149 | if (mvm->scan_status == IWL_MVM_SCAN_OS) |
| 1135 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); | 1150 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); |
| 1136 | 1151 | ||
| 1152 | out: | ||
| 1137 | mvm->scan_status = IWL_MVM_SCAN_NONE; | 1153 | mvm->scan_status = IWL_MVM_SCAN_NONE; |
| 1138 | 1154 | ||
| 1139 | if (notify) { | 1155 | if (notify) { |
| @@ -1290,18 +1306,6 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm, | |||
| 1290 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); | 1306 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); |
| 1291 | cmd->iter_num = cpu_to_le32(1); | 1307 | cmd->iter_num = cpu_to_le32(1); |
| 1292 | 1308 | ||
| 1293 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1294 | mvm->last_ebs_successful) { | ||
| 1295 | cmd->channel_opt[0].flags = | ||
| 1296 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1297 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1298 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1299 | cmd->channel_opt[1].flags = | ||
| 1300 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1301 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1302 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | if (iwl_mvm_rrm_scan_needed(mvm)) | 1309 | if (iwl_mvm_rrm_scan_needed(mvm)) |
| 1306 | cmd->scan_flags |= | 1310 | cmd->scan_flags |= |
| 1307 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); | 1311 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); |
| @@ -1376,6 +1380,22 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm, | |||
| 1376 | cmd->schedule[1].iterations = 0; | 1380 | cmd->schedule[1].iterations = 0; |
| 1377 | cmd->schedule[1].full_scan_mul = 0; | 1381 | cmd->schedule[1].full_scan_mul = 0; |
| 1378 | 1382 | ||
| 1383 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS && | ||
| 1384 | mvm->last_ebs_successful) { | ||
| 1385 | cmd->channel_opt[0].flags = | ||
| 1386 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1387 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1388 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1389 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1390 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1391 | cmd->channel_opt[1].flags = | ||
| 1392 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1393 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1394 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1395 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1396 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1397 | } | ||
| 1398 | |||
| 1379 | for (i = 1; i <= req->req.n_ssids; i++) | 1399 | for (i = 1; i <= req->req.n_ssids; i++) |
| 1380 | ssid_bitmap |= BIT(i); | 1400 | ssid_bitmap |= BIT(i); |
| 1381 | 1401 | ||
| @@ -1448,6 +1468,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, | |||
| 1448 | 1468 | ||
| 1449 | if (iwl_mvm_scan_pass_all(mvm, req)) | 1469 | if (iwl_mvm_scan_pass_all(mvm, req)) |
| 1450 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; | 1470 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; |
| 1471 | else | ||
| 1472 | flags |= IWL_MVM_LMAC_SCAN_FLAG_MATCH; | ||
| 1451 | 1473 | ||
| 1452 | if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0) | 1474 | if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0) |
| 1453 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION; | 1475 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION; |
| @@ -1474,6 +1496,22 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, | |||
| 1474 | cmd->schedule[1].iterations = 0xff; | 1496 | cmd->schedule[1].iterations = 0xff; |
| 1475 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; | 1497 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; |
| 1476 | 1498 | ||
| 1499 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1500 | mvm->last_ebs_successful) { | ||
| 1501 | cmd->channel_opt[0].flags = | ||
| 1502 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1503 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1504 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1505 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1506 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1507 | cmd->channel_opt[1].flags = | ||
| 1508 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1509 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1510 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1511 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1512 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1513 | } | ||
| 1514 | |||
| 1477 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, | 1515 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, |
| 1478 | ssid_bitmap, cmd); | 1516 | ssid_bitmap, cmd); |
| 1479 | 1517 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 4f15d9decc81..c59d07567d90 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 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c index e56e77ef5d2e..917431e30f74 100644 --- a/drivers/net/wireless/iwlwifi/mvm/utils.c +++ b/drivers/net/wireless/iwlwifi/mvm/utils.c | |||
| @@ -665,7 +665,7 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm) | |||
| 665 | if (num_of_ant(mvm->fw->valid_rx_ant) == 1) | 665 | if (num_of_ant(mvm->fw->valid_rx_ant) == 1) |
| 666 | return false; | 666 | return false; |
| 667 | 667 | ||
| 668 | if (!mvm->cfg->rx_with_siso_diversity) | 668 | if (mvm->cfg->rx_with_siso_diversity) |
| 669 | return false; | 669 | return false; |
| 670 | 670 | ||
| 671 | ieee80211_iterate_active_interfaces_atomic( | 671 | ieee80211_iterate_active_interfaces_atomic( |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index 3ee8e3848876..d5aadb00dd9e 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)}, |
| @@ -523,8 +527,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 523 | else if (cfg == &iwl7265_n_cfg) | 527 | else if (cfg == &iwl7265_n_cfg) |
| 524 | cfg_7265d = &iwl7265d_n_cfg; | 528 | cfg_7265d = &iwl7265d_n_cfg; |
| 525 | if (cfg_7265d && | 529 | if (cfg_7265d && |
| 526 | (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) | 530 | (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) { |
| 527 | cfg = cfg_7265d; | 531 | cfg = cfg_7265d; |
| 532 | iwl_trans->cfg = cfg_7265d; | ||
| 533 | } | ||
| 528 | #endif | 534 | #endif |
| 529 | 535 | ||
| 530 | pci_set_drvdata(pdev, iwl_trans); | 536 | 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 5d79a1f44b8e..523fe0c88dcb 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
| @@ -614,7 +614,7 @@ static int iwl_pcie_load_section(struct iwl_trans *trans, u8 section_num, | |||
| 614 | { | 614 | { |
| 615 | u8 *v_addr; | 615 | u8 *v_addr; |
| 616 | dma_addr_t p_addr; | 616 | dma_addr_t p_addr; |
| 617 | u32 offset, chunk_sz = section->len; | 617 | u32 offset, chunk_sz = min_t(u32, FH_MEM_TB_MAX_LENGTH, section->len); |
| 618 | int ret = 0; | 618 | int ret = 0; |
| 619 | 619 | ||
| 620 | IWL_DEBUG_FW(trans, "[%d] uCode section being loaded...\n", | 620 | IWL_DEBUG_FW(trans, "[%d] uCode section being loaded...\n", |
| @@ -1012,16 +1012,21 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) | |||
| 1012 | /* Stop the device, and put it in low power state */ | 1012 | /* Stop the device, and put it in low power state */ |
| 1013 | iwl_pcie_apm_stop(trans); | 1013 | iwl_pcie_apm_stop(trans); |
| 1014 | 1014 | ||
| 1015 | /* Upon stop, the APM issues an interrupt if HW RF kill is set. | 1015 | /* stop and reset the on-board processor */ |
| 1016 | * Clean again the interrupt here | 1016 | iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); |
| 1017 | udelay(20); | ||
| 1018 | |||
| 1019 | /* | ||
| 1020 | * Upon stop, the APM issues an interrupt if HW RF kill is set. | ||
| 1021 | * This is a bug in certain verions of the hardware. | ||
| 1022 | * Certain devices also keep sending HW RF kill interrupt all | ||
| 1023 | * the time, unless the interrupt is ACKed even if the interrupt | ||
| 1024 | * should be masked. Re-ACK all the interrupts here. | ||
| 1017 | */ | 1025 | */ |
| 1018 | spin_lock(&trans_pcie->irq_lock); | 1026 | spin_lock(&trans_pcie->irq_lock); |
| 1019 | iwl_disable_interrupts(trans); | 1027 | iwl_disable_interrupts(trans); |
| 1020 | spin_unlock(&trans_pcie->irq_lock); | 1028 | spin_unlock(&trans_pcie->irq_lock); |
| 1021 | 1029 | ||
| 1022 | /* stop and reset the on-board processor */ | ||
| 1023 | iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); | ||
| 1024 | udelay(20); | ||
| 1025 | 1030 | ||
| 1026 | /* clear all status bits */ | 1031 | /* clear all status bits */ |
| 1027 | clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); | 1032 | clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); |
