libertas: proper pending command accounting

Marcelo Tosatti mtosatti at redhat.unroutablecom
Sun Dec 24 04:30:49 EST 2006


Commit:     0d760c97c2b283ae0e5cb774916ad4807b6ca941
Parent:     14d633bd54657f4818ccf1c5ed7cb639e19c3e27
commit 0d760c97c2b283ae0e5cb774916ad4807b6ca941
Author:     Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Thu Dec 21 19:07:48 2006 -0200
Commit:     Marcelo Tosatti <mtosatti at redhat.com>
CommitDate: Thu Dec 21 19:07:48 2006 -0200

    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>
---
 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 69d98d0..3ed4924 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 e838a2d..efe2ec8 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 4271275..0964396 100644
--- a/drivers/net/wireless/libertas/wlan_main.c
+++ b/drivers/net/wireless/libertas/wlan_main.c
@@ -882,16 +882,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);
 
@@ -986,7 +984,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