|
@@ -1726,6 +1726,76 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void mwifiex_check_next_scan_command(struct mwifiex_private *priv)
|
|
|
+{
|
|
|
+ struct mwifiex_adapter *adapter = priv->adapter;
|
|
|
+ struct cmd_ctrl_node *cmd_node;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
|
|
|
+ if (list_empty(&adapter->scan_pending_q)) {
|
|
|
+ spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
|
|
|
+ spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
|
|
|
+ adapter->scan_processing = false;
|
|
|
+ spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
|
|
|
+
|
|
|
+ /* Need to indicate IOCTL complete */
|
|
|
+ if (adapter->curr_cmd->wait_q_enabled) {
|
|
|
+ adapter->cmd_wait_q.status = 0;
|
|
|
+ if (!priv->scan_request) {
|
|
|
+ dev_dbg(adapter->dev,
|
|
|
+ "complete internal scan\n");
|
|
|
+ mwifiex_complete_cmd(adapter,
|
|
|
+ adapter->curr_cmd);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (priv->report_scan_result)
|
|
|
+ priv->report_scan_result = false;
|
|
|
+
|
|
|
+ if (priv->scan_request) {
|
|
|
+ dev_dbg(adapter->dev, "info: notifying scan done\n");
|
|
|
+ cfg80211_scan_done(priv->scan_request, 0);
|
|
|
+ priv->scan_request = NULL;
|
|
|
+ } else {
|
|
|
+ priv->scan_aborting = false;
|
|
|
+ dev_dbg(adapter->dev, "info: scan already aborted\n");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ((priv->scan_aborting && !priv->scan_request) ||
|
|
|
+ priv->scan_block) {
|
|
|
+ spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
+ flags);
|
|
|
+ adapter->scan_delay_cnt = MWIFIEX_MAX_SCAN_DELAY_CNT;
|
|
|
+ mod_timer(&priv->scan_delay_timer, jiffies);
|
|
|
+ dev_dbg(priv->adapter->dev,
|
|
|
+ "info: %s: triggerring scan abort\n", __func__);
|
|
|
+ } else if (!mwifiex_wmm_lists_empty(adapter) &&
|
|
|
+ (priv->scan_request && (priv->scan_request->flags &
|
|
|
+ NL80211_SCAN_FLAG_LOW_PRIORITY))) {
|
|
|
+ spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
+ flags);
|
|
|
+ adapter->scan_delay_cnt = 1;
|
|
|
+ mod_timer(&priv->scan_delay_timer, jiffies +
|
|
|
+ msecs_to_jiffies(MWIFIEX_SCAN_DELAY_MSEC));
|
|
|
+ dev_dbg(priv->adapter->dev,
|
|
|
+ "info: %s: deferring scan\n", __func__);
|
|
|
+ } else {
|
|
|
+ /* Get scan command from scan_pending_q and put to
|
|
|
+ * cmd_pending_q
|
|
|
+ */
|
|
|
+ cmd_node = list_first_entry(&adapter->scan_pending_q,
|
|
|
+ struct cmd_ctrl_node, list);
|
|
|
+ list_del(&cmd_node->list);
|
|
|
+ spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
+ flags);
|
|
|
+ mwifiex_insert_cmd_to_pending_q(adapter, cmd_node,
|
|
|
+ true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This function handles the command response of scan.
|
|
|
*
|
|
@@ -1750,7 +1820,6 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct mwifiex_adapter *adapter = priv->adapter;
|
|
|
- struct cmd_ctrl_node *cmd_node;
|
|
|
struct host_cmd_ds_802_11_scan_rsp *scan_rsp;
|
|
|
struct mwifiex_ie_types_data *tlv_data;
|
|
|
struct mwifiex_ie_types_tsf_timestamp *tsf_tlv;
|
|
@@ -1762,7 +1831,6 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|
|
struct mwifiex_ie_types_chan_band_list_param_set *chan_band_tlv;
|
|
|
struct chan_band_param_set *chan_band;
|
|
|
u8 is_bgscan_resp;
|
|
|
- unsigned long flags;
|
|
|
__le64 fw_tsf = 0;
|
|
|
u8 *radio_type;
|
|
|
|
|
@@ -1852,66 +1920,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|
|
}
|
|
|
|
|
|
check_next_scan:
|
|
|
- spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
|
|
|
- if (list_empty(&adapter->scan_pending_q)) {
|
|
|
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
|
|
|
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
|
|
|
- adapter->scan_processing = false;
|
|
|
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
|
|
|
-
|
|
|
- /* Need to indicate IOCTL complete */
|
|
|
- if (adapter->curr_cmd->wait_q_enabled) {
|
|
|
- adapter->cmd_wait_q.status = 0;
|
|
|
- if (!priv->scan_request) {
|
|
|
- dev_dbg(adapter->dev,
|
|
|
- "complete internal scan\n");
|
|
|
- mwifiex_complete_cmd(adapter,
|
|
|
- adapter->curr_cmd);
|
|
|
- }
|
|
|
- }
|
|
|
- if (priv->report_scan_result)
|
|
|
- priv->report_scan_result = false;
|
|
|
-
|
|
|
- if (priv->scan_request) {
|
|
|
- dev_dbg(adapter->dev, "info: notifying scan done\n");
|
|
|
- cfg80211_scan_done(priv->scan_request, 0);
|
|
|
- priv->scan_request = NULL;
|
|
|
- } else {
|
|
|
- priv->scan_aborting = false;
|
|
|
- dev_dbg(adapter->dev, "info: scan already aborted\n");
|
|
|
- }
|
|
|
- } else {
|
|
|
- if ((priv->scan_aborting && !priv->scan_request) ||
|
|
|
- priv->scan_block) {
|
|
|
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
- flags);
|
|
|
- adapter->scan_delay_cnt = MWIFIEX_MAX_SCAN_DELAY_CNT;
|
|
|
- mod_timer(&priv->scan_delay_timer, jiffies);
|
|
|
- dev_dbg(priv->adapter->dev,
|
|
|
- "info: %s: triggerring scan abort\n", __func__);
|
|
|
- } else if (!mwifiex_wmm_lists_empty(adapter) &&
|
|
|
- (priv->scan_request && (priv->scan_request->flags &
|
|
|
- NL80211_SCAN_FLAG_LOW_PRIORITY))) {
|
|
|
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
- flags);
|
|
|
- adapter->scan_delay_cnt = 1;
|
|
|
- mod_timer(&priv->scan_delay_timer, jiffies +
|
|
|
- msecs_to_jiffies(MWIFIEX_SCAN_DELAY_MSEC));
|
|
|
- dev_dbg(priv->adapter->dev,
|
|
|
- "info: %s: deferring scan\n", __func__);
|
|
|
- } else {
|
|
|
- /* Get scan command from scan_pending_q and put to
|
|
|
- cmd_pending_q */
|
|
|
- cmd_node = list_first_entry(&adapter->scan_pending_q,
|
|
|
- struct cmd_ctrl_node, list);
|
|
|
- list_del(&cmd_node->list);
|
|
|
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
|
|
|
- flags);
|
|
|
- mwifiex_insert_cmd_to_pending_q(adapter, cmd_node,
|
|
|
- true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ mwifiex_check_next_scan_command(priv);
|
|
|
return ret;
|
|
|
}
|
|
|
|