Commit 00700ee0 authored by Johannes Berg's avatar Johannes Berg Committed by Reinette Chatre

iwlwifi: remove scan_bands logic

Since mac80211 will now never request scanning
multiple bands, we can remove all the associated
logic and scan a single band only in each scan.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
parent 3a23d695
...@@ -1054,7 +1054,7 @@ struct iwl_priv { ...@@ -1054,7 +1054,7 @@ struct iwl_priv {
unsigned long scan_pass_start; unsigned long scan_pass_start;
unsigned long scan_start_tsf; unsigned long scan_start_tsf;
void *scan; void *scan;
int scan_bands; enum ieee80211_band scan_band;
struct cfg80211_scan_request *scan_request; struct cfg80211_scan_request *scan_request;
bool is_internal_short_scan; bool is_internal_short_scan;
u8 scan_tx_ant[IEEE80211_NUM_BANDS]; u8 scan_tx_ant[IEEE80211_NUM_BANDS];
......
...@@ -223,29 +223,16 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv, ...@@ -223,29 +223,16 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv,
clear_bit(STATUS_SCAN_HW, &priv->status); clear_bit(STATUS_SCAN_HW, &priv->status);
IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n", IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n",
(priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? (priv->scan_band == IEEE80211_BAND_2GHZ) ? "2.4" : "5.2",
"2.4" : "5.2",
jiffies_to_msecs(elapsed_jiffies jiffies_to_msecs(elapsed_jiffies
(priv->scan_pass_start, jiffies))); (priv->scan_pass_start, jiffies)));
/* Remove this scanned band from the list of pending
* bands to scan, band G precedes A in order of scanning
* as seen in iwl_bg_request_scan */
if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ))
priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ);
else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ))
priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ);
/* If a request to abort was given, or the scan did not succeed /* If a request to abort was given, or the scan did not succeed
* then we reset the scan state machine and terminate, * then we reset the scan state machine and terminate,
* re-queuing another scan if one has been requested */ * re-queuing another scan if one has been requested */
if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
IWL_DEBUG_INFO(priv, "Aborted scan completed.\n"); IWL_DEBUG_INFO(priv, "Aborted scan completed.\n");
clear_bit(STATUS_SCAN_ABORTING, &priv->status); clear_bit(STATUS_SCAN_ABORTING, &priv->status);
} else {
/* If there are more bands on this scan pass reschedule */
if (priv->scan_bands)
goto reschedule;
} }
if (!priv->is_internal_short_scan) if (!priv->is_internal_short_scan)
...@@ -259,12 +246,6 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv, ...@@ -259,12 +246,6 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv,
jiffies_to_msecs(elapsed_jiffies(priv->scan_start, jiffies))); jiffies_to_msecs(elapsed_jiffies(priv->scan_start, jiffies)));
queue_work(priv->workqueue, &priv->scan_completed); queue_work(priv->workqueue, &priv->scan_completed);
return;
reschedule:
priv->scan_pass_start = jiffies;
queue_work(priv->workqueue, &priv->request_scan);
} }
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv) void iwl_setup_rx_scan_handlers(struct iwl_priv *priv)
...@@ -489,10 +470,13 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw, ...@@ -489,10 +470,13 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
{ {
unsigned long flags; unsigned long flags;
struct iwl_priv *priv = hw->priv; struct iwl_priv *priv = hw->priv;
int ret, i; int ret;
IWL_DEBUG_MAC80211(priv, "enter\n"); IWL_DEBUG_MAC80211(priv, "enter\n");
if (req->n_channels == 0)
return -EINVAL;
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
...@@ -526,10 +510,8 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw, ...@@ -526,10 +510,8 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
goto out_unlock; goto out_unlock;
} }
priv->scan_bands = 0; /* mac80211 will only ask for one band at a time */
for (i = 0; i < req->n_channels; i++) priv->scan_band = req->channels[0]->band;
priv->scan_bands |= BIT(req->channels[i]->band);
priv->scan_request = req; priv->scan_request = req;
ret = iwl_scan_initiate(priv); ret = iwl_scan_initiate(priv);
...@@ -575,11 +557,7 @@ static void iwl_bg_start_internal_scan(struct work_struct *work) ...@@ -575,11 +557,7 @@ static void iwl_bg_start_internal_scan(struct work_struct *work)
goto unlock; goto unlock;
} }
priv->scan_bands = 0; priv->scan_band = priv->band;
if (priv->band == IEEE80211_BAND_5GHZ)
priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ);
else
priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ);
IWL_DEBUG_SCAN(priv, "Start internal short scan...\n"); IWL_DEBUG_SCAN(priv, "Start internal short scan...\n");
set_bit(STATUS_SCANNING, &priv->status); set_bit(STATUS_SCANNING, &priv->status);
...@@ -727,11 +705,6 @@ static void iwl_bg_request_scan(struct work_struct *data) ...@@ -727,11 +705,6 @@ static void iwl_bg_request_scan(struct work_struct *data)
goto done; goto done;
} }
if (!priv->scan_bands) {
IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n");
goto done;
}
if (!priv->scan) { if (!priv->scan) {
priv->scan = kmalloc(sizeof(struct iwl_scan_cmd) + priv->scan = kmalloc(sizeof(struct iwl_scan_cmd) +
IWL_MAX_SCAN_SIZE, GFP_KERNEL); IWL_MAX_SCAN_SIZE, GFP_KERNEL);
...@@ -798,9 +771,8 @@ static void iwl_bg_request_scan(struct work_struct *data) ...@@ -798,9 +771,8 @@ static void iwl_bg_request_scan(struct work_struct *data)
scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id; scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id;
scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
switch (priv->scan_band) {
if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { case IEEE80211_BAND_2GHZ:
band = IEEE80211_BAND_2GHZ;
scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK) chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK)
>> RXON_FLG_CHANNEL_MODE_POS; >> RXON_FLG_CHANNEL_MODE_POS;
...@@ -811,8 +783,8 @@ static void iwl_bg_request_scan(struct work_struct *data) ...@@ -811,8 +783,8 @@ static void iwl_bg_request_scan(struct work_struct *data)
rate_flags = RATE_MCS_CCK_MSK; rate_flags = RATE_MCS_CCK_MSK;
} }
scan->good_CRC_th = 0; scan->good_CRC_th = 0;
} else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { break;
band = IEEE80211_BAND_5GHZ; case IEEE80211_BAND_5GHZ:
rate = IWL_RATE_6M_PLCP; rate = IWL_RATE_6M_PLCP;
/* /*
* If active scaning is requested but a certain channel * If active scaning is requested but a certain channel
...@@ -827,11 +799,14 @@ static void iwl_bg_request_scan(struct work_struct *data) ...@@ -827,11 +799,14 @@ static void iwl_bg_request_scan(struct work_struct *data)
*/ */
if (priv->cfg->off_channel_workaround) if (priv->cfg->off_channel_workaround)
rx_ant = ANT_BC; rx_ant = ANT_BC;
} else { break;
default:
IWL_WARN(priv, "Invalid scan band count\n"); IWL_WARN(priv, "Invalid scan band count\n");
goto done; goto done;
} }
band = priv->scan_band;
priv->scan_tx_ant[band] = priv->scan_tx_ant[band] =
iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]); iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]);
rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]); rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
......
...@@ -2852,11 +2852,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) ...@@ -2852,11 +2852,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
goto done; goto done;
} }
if (!priv->scan_bands) {
IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n");
goto done;
}
if (!priv->scan) { if (!priv->scan) {
priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) + priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) +
IWL_MAX_SCAN_SIZE, GFP_KERNEL); IWL_MAX_SCAN_SIZE, GFP_KERNEL);
...@@ -2934,12 +2929,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data) ...@@ -2934,12 +2929,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
/* flags + rate selection */ /* flags + rate selection */
if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { switch (priv->scan_band) {
case IEEE80211_BAND_2GHZ:
scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
scan->tx_cmd.rate = IWL_RATE_1M_PLCP; scan->tx_cmd.rate = IWL_RATE_1M_PLCP;
scan->good_CRC_th = 0; scan->good_CRC_th = 0;
band = IEEE80211_BAND_2GHZ; band = IEEE80211_BAND_2GHZ;
} else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { break;
case IEEE80211_BAND_5GHZ:
scan->tx_cmd.rate = IWL_RATE_6M_PLCP; scan->tx_cmd.rate = IWL_RATE_6M_PLCP;
/* /*
* If active scaning is requested but a certain channel * If active scaning is requested but a certain channel
...@@ -2948,8 +2945,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data) ...@@ -2948,8 +2945,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
*/ */
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0;
band = IEEE80211_BAND_5GHZ; band = IEEE80211_BAND_5GHZ;
} else { break;
IWL_WARN(priv, "Invalid scan band count\n"); default:
IWL_WARN(priv, "Invalid scan band\n");
goto done; goto done;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment