提交 999d2568 编写于 作者: L Luciano Coelho 提交者: Emmanuel Grumbach

iwlwifi: mvm: combine scan size checks into a common function

Instead of repeating the same code in 4 different places, combine the
comparisons into a new function.  Additionally, this change fixes UMAC
scans where the RRM IEs were not taken into consideration when
calculating the IE length.
Signed-off-by: NLuciano Coelho <luciano.coelho@intel.com>
Reviewed-by: NJohannes Berg <johannes.berg@intel.com>
Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
上级 83c415fd
...@@ -505,7 +505,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) ...@@ -505,7 +505,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
iwl_mvm_reset_phy_ctxts(mvm); iwl_mvm_reset_phy_ctxts(mvm);
hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm, false); hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm);
hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
......
...@@ -1168,7 +1168,7 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -1168,7 +1168,7 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
struct ieee80211_scan_ies *ies); struct ieee80211_scan_ies *ies);
int iwl_mvm_scan_size(struct iwl_mvm *mvm); int iwl_mvm_scan_size(struct iwl_mvm *mvm);
int iwl_mvm_cancel_scan(struct iwl_mvm *mvm); int iwl_mvm_cancel_scan(struct iwl_mvm *mvm);
int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan); int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm);
void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm); void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
/* Scheduled scan */ /* Scheduled scan */
......
...@@ -296,8 +296,7 @@ static inline bool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm) ...@@ -296,8 +296,7 @@ static inline bool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm)
IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT; IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT;
} }
static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm, static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm)
bool is_sched_scan)
{ {
int max_probe_len; int max_probe_len;
...@@ -313,9 +312,9 @@ static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm, ...@@ -313,9 +312,9 @@ static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm,
return max_probe_len; return max_probe_len;
} }
int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan) int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm)
{ {
int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm, is_sched_scan); int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm);
/* TODO: [BUG] This function should return the maximum allowed size of /* TODO: [BUG] This function should return the maximum allowed size of
* scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs * scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs
...@@ -802,6 +801,18 @@ iwl_mvm_build_generic_scan_cmd(struct iwl_mvm *mvm, ...@@ -802,6 +801,18 @@ iwl_mvm_build_generic_scan_cmd(struct iwl_mvm *mvm,
cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED);
} }
static inline bool iwl_mvm_scan_fits(struct iwl_mvm *mvm, int n_ssids,
struct ieee80211_scan_ies *ies,
int n_channels)
{
return ((n_ssids <= PROBE_OPTION_MAX) &&
(n_channels <= mvm->fw->ucode_capa.n_scan_channels) &
(ies->common_ie_len +
ies->len[NL80211_BAND_2GHZ] +
ies->len[NL80211_BAND_5GHZ] <=
iwl_mvm_max_scan_ie_fw_cmd_room(mvm)));
}
static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
struct cfg80211_scan_request *req, struct cfg80211_scan_request *req,
struct ieee80211_scan_ies *ies) struct ieee80211_scan_ies *ies)
...@@ -825,11 +836,7 @@ static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -825,11 +836,7 @@ static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
if (WARN_ON(mvm->scan_cmd == NULL)) if (WARN_ON(mvm->scan_cmd == NULL))
return -ENOMEM; return -ENOMEM;
if (req->n_ssids > PROBE_OPTION_MAX || if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels))
ies->common_ie_len + ies->len[NL80211_BAND_2GHZ] +
ies->len[NL80211_BAND_5GHZ] >
iwl_mvm_max_scan_ie_fw_cmd_room(mvm, false) ||
req->n_channels > mvm->fw->ucode_capa.n_scan_channels)
return -ENOBUFS; return -ENOBUFS;
mvm->scan_status |= IWL_MVM_SCAN_REGULAR; mvm->scan_status |= IWL_MVM_SCAN_REGULAR;
...@@ -938,11 +945,7 @@ static int iwl_mvm_sched_scan_lmac(struct iwl_mvm *mvm, ...@@ -938,11 +945,7 @@ static int iwl_mvm_sched_scan_lmac(struct iwl_mvm *mvm,
if (WARN_ON(mvm->scan_cmd == NULL)) if (WARN_ON(mvm->scan_cmd == NULL))
return -ENOMEM; return -ENOMEM;
if (req->n_ssids > PROBE_OPTION_MAX || if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels))
ies->common_ie_len + ies->len[NL80211_BAND_2GHZ] +
ies->len[NL80211_BAND_5GHZ] >
iwl_mvm_max_scan_ie_fw_cmd_room(mvm, true) ||
req->n_channels > mvm->fw->ucode_capa.n_scan_channels)
return -ENOBUFS; return -ENOBUFS;
iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params); iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params);
...@@ -1316,12 +1319,7 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -1316,12 +1319,7 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
if (WARN_ON(mvm->scan_cmd == NULL)) if (WARN_ON(mvm->scan_cmd == NULL))
return -ENOMEM; return -ENOMEM;
if (WARN_ON(req->n_ssids > PROBE_OPTION_MAX || if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels))
ies->common_ie_len +
ies->len[NL80211_BAND_2GHZ] +
ies->len[NL80211_BAND_5GHZ] + 24 + 2 >
SCAN_OFFLOAD_PROBE_REQ_SIZE || req->n_channels >
mvm->fw->ucode_capa.n_scan_channels))
return -ENOBUFS; return -ENOBUFS;
iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags, iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags,
...@@ -1414,11 +1412,7 @@ static int iwl_mvm_sched_scan_umac(struct iwl_mvm *mvm, ...@@ -1414,11 +1412,7 @@ static int iwl_mvm_sched_scan_umac(struct iwl_mvm *mvm,
if (WARN_ON(mvm->scan_cmd == NULL)) if (WARN_ON(mvm->scan_cmd == NULL))
return -ENOMEM; return -ENOMEM;
if (WARN_ON(req->n_ssids > PROBE_OPTION_MAX || if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, req->n_channels))
ies->common_ie_len + ies->len[NL80211_BAND_2GHZ] +
ies->len[NL80211_BAND_5GHZ] + 24 + 2 >
SCAN_OFFLOAD_PROBE_REQ_SIZE || req->n_channels >
mvm->fw->ucode_capa.n_scan_channels))
return -ENOBUFS; return -ENOBUFS;
iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags, iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册