libertas: proper pending command accounting
Marcelo Tosatti
mtosatti at redhat.unroutablecom
Sun Dec 24 04:24:34 EST 2006
Commit: 867b22e508ebe58856184f1990943e94b2134730
Parent: 30b15a2f81a561f8f296ee1222e18faceb82fb13
commit 867b22e508ebe58856184f1990943e94b2134730
Author: Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Thu Dec 21 19:07:48 2006 -0200
Commit: Andres Salomon <dilinger at debian.org>
CommitDate: Sun Dec 24 04:29:30 2006 -0500
libertas: proper pending command accounting
The test for pending commands should not be for queued commands,
but for finished (ie returned) ones.
Otherwise get_scan can return success _before_ all scan requests
have been completed, resulting in false empty results.
Signed-off-by: Marcelo Tosatti <mtosatti at redhat.com>
(cherry picked from 0d760c97c2b283ae0e5cb774916ad4807b6ca941 commit)
---
drivers/net/wireless/libertas/wlan_cmd.c | 2 +-
drivers/net/wireless/libertas/wlan_cmdresp.c | 5 +++++
drivers/net/wireless/libertas/wlan_debugfs.c | 2 +-
drivers/net/wireless/libertas/wlan_dev.h | 2 +-
drivers/net/wireless/libertas/wlan_main.c | 8 +++-----
drivers/net/wireless/libertas/wlan_scan.c | 8 ++++----
6 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/libertas/wlan_cmd.c b/drivers/net/wireless/libertas/wlan_cmd.c
index 979ce75..88ecca3 100644
--- a/drivers/net/wireless/libertas/wlan_cmd.c
+++ b/drivers/net/wireless/libertas/wlan_cmd.c
@@ -1751,7 +1751,7 @@ #define ACTION_NUMLED_TLVTYPE_LEN_FIELDS
CmdNode->CmdWaitQWoken = 0;
libertas_queue_cmd(Adapter, CmdNode, 1);
- Adapter->is_cmd_pending = 1;
+ Adapter->nr_cmd_pending++;
wake_up_interruptible(&priv->MainThread.waitQ);
if (wait_option & HostCmd_OPTION_WAITFORRSP) {
diff --git a/drivers/net/wireless/libertas/wlan_cmdresp.c b/drivers/net/wireless/libertas/wlan_cmdresp.c
index 4f695f4..9fe1858 100644
--- a/drivers/net/wireless/libertas/wlan_cmdresp.c
+++ b/drivers/net/wireless/libertas/wlan_cmdresp.c
@@ -879,6 +879,7 @@ int libertas_process_rx_command(wlan_pri
dprintk(1, "Invalid response to command!");
Adapter->CurCmdRetCode = WLAN_STATUS_FAILURE;
__libertas_cleanup_and_insert_cmd(priv, Adapter->CurCmd);
+ Adapter->nr_cmd_pending--;
Adapter->CurCmd = NULL;
spin_unlock_irqrestore(&Adapter->driver_lock, flags);
ret = WLAN_STATUS_FAILURE;
@@ -940,6 +941,7 @@ int libertas_process_rx_command(wlan_pri
}
__libertas_cleanup_and_insert_cmd(priv, Adapter->CurCmd);
+ Adapter->nr_cmd_pending--;
Adapter->CurCmd = NULL;
spin_unlock_irqrestore(&Adapter->driver_lock, flags);
@@ -971,6 +973,7 @@ int libertas_process_rx_command(wlan_pri
}
__libertas_cleanup_and_insert_cmd(priv, Adapter->CurCmd);
+ Adapter->nr_cmd_pending--;
Adapter->CurCmd = NULL;
spin_unlock_irqrestore(&Adapter->driver_lock, flags);
@@ -1180,6 +1183,8 @@ int libertas_process_rx_command(wlan_pri
if (Adapter->CurCmd) {
/* Clean up and Put current command back to CmdFreeQ */
__libertas_cleanup_and_insert_cmd(priv, Adapter->CurCmd);
+ Adapter->nr_cmd_pending--;
+ WARN_ON(Adapter->nr_cmd_pending > 32);
Adapter->CurCmd = NULL;
}
spin_unlock_irqrestore(&Adapter->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/wlan_debugfs.c b/drivers/net/wireless/libertas/wlan_debugfs.c
index 47f2a82..0463106 100644
--- a/drivers/net/wireless/libertas/wlan_debugfs.c
+++ b/drivers/net/wireless/libertas/wlan_debugfs.c
@@ -399,7 +399,7 @@ static ssize_t libertas_setuserscan(stru
wlan_scan_networks(priv, scan_cfg);
wait_event_interruptible(priv->adapter->cmd_pending,
- !priv->adapter->is_cmd_pending);
+ !priv->adapter->nr_cmd_pending);
memset(&wrqu, 0x00, sizeof(union iwreq_data));
wireless_send_event(priv->wlan_dev.netdev, SIOCGIWSCAN, &wrqu, NULL);
diff --git a/drivers/net/wireless/libertas/wlan_dev.h b/drivers/net/wireless/libertas/wlan_dev.h
index 67c6f23..eee3b86 100644
--- a/drivers/net/wireless/libertas/wlan_dev.h
+++ b/drivers/net/wireless/libertas/wlan_dev.h
@@ -282,7 +282,7 @@ struct _wlan_adapter {
struct list_head CmdPendingQ;
wait_queue_head_t cmd_pending;
- u8 is_cmd_pending;
+ u8 nr_cmd_pending;
/* command related variables protected by adapter->driver_lock */
/** Async and Sync Event variables */
diff --git a/drivers/net/wireless/libertas/wlan_main.c b/drivers/net/wireless/libertas/wlan_main.c
index 9f7b8fd..c3ecba9 100644
--- a/drivers/net/wireless/libertas/wlan_main.c
+++ b/drivers/net/wireless/libertas/wlan_main.c
@@ -925,16 +925,14 @@ static int wlan_service_main_thread(void
/* Wake-up command waiters which can't sleep in
* libertas_prepare_and_send_command
*/
- if (!Adapter->CurCmd && list_empty(&Adapter->CmdPendingQ)) {
- Adapter->is_cmd_pending = 0;
+ if (!Adapter->nr_cmd_pending)
wake_up_all(&Adapter->cmd_pending);
- }
libertas_tx_runqueue(priv);
}
del_timer(&Adapter->command_timer);
- Adapter->is_cmd_pending = 0;
+ Adapter->nr_cmd_pending = 0;
wake_up_all(&Adapter->cmd_pending);
wlan_deactivate_thread(thread);
@@ -1029,7 +1027,7 @@ #define NETIF_F_DYNALLOC 16
spin_lock_init(&priv->adapter->driver_lock);
init_waitqueue_head(&priv->adapter->cmd_pending);
- priv->adapter->is_cmd_pending = 0;
+ priv->adapter->nr_cmd_pending = 0;
dprintk(1, "Starting kthread...\n");
priv->MainThread.priv = priv;
diff --git a/drivers/net/wireless/libertas/wlan_scan.c b/drivers/net/wireless/libertas/wlan_scan.c
index 6ffe7c4..2a9a3c0 100644
--- a/drivers/net/wireless/libertas/wlan_scan.c
+++ b/drivers/net/wireless/libertas/wlan_scan.c
@@ -1433,7 +1433,7 @@ int libertas_find_best_network_SSID(wlan
wlan_scan_networks(priv, NULL);
if (Adapter->SurpriseRemoved)
return WLAN_STATUS_FAILURE;
- wait_event_interruptible(Adapter->cmd_pending, !Adapter->is_cmd_pending);
+ wait_event_interruptible(Adapter->cmd_pending, !Adapter->nr_cmd_pending);
i = libertas_find_best_SSID_in_list(Adapter, preferred_mode);
if (i < 0) {
@@ -1528,7 +1528,7 @@ int libertas_send_specific_SSID_scan(wla
wlan_scan_networks(priv, &scanCfg);
if (Adapter->SurpriseRemoved)
return WLAN_STATUS_FAILURE;
- wait_event_interruptible(Adapter->cmd_pending, !Adapter->is_cmd_pending);
+ wait_event_interruptible(Adapter->cmd_pending, !Adapter->nr_cmd_pending);
LEAVE();
return WLAN_STATUS_SUCCESS;
@@ -1561,7 +1561,7 @@ int libertas_send_specific_BSSID_scan(wl
if (priv->adapter->SurpriseRemoved)
return WLAN_STATUS_FAILURE;
wait_event_interruptible(priv->adapter->cmd_pending,
- !priv->adapter->is_cmd_pending);
+ !priv->adapter->nr_cmd_pending);
LEAVE();
return WLAN_STATUS_SUCCESS;
@@ -1606,7 +1606,7 @@ #define RSSI_DIFF ((u8)(PERFECT_RSSI
* if there's either commands in the queue or one being
* processed return -EAGAIN for iwlist to retry later.
*/
- if (!Adapter->CurCmd && list_empty(&Adapter->CmdPendingQ))
+ if (Adapter->nr_cmd_pending)
return -EAGAIN;
if (Adapter->MediaConnectStatus == WlanMediaStateConnected)
More information about the Commits-kernel
mailing list