Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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];
+17 −42
Original line number Original line Diff line number Diff line
@@ -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,
		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,
{
{
	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,
		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)
		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)
		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)
	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)
			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)
		 */
		 */
		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]);
+7 −9
Original line number Original line Diff line number Diff line
@@ -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)


	/* 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)
		 */
		 */
		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;
	}
	}