John W. Linville 2e7bab3
From 51e708c1049e721b9c5c48d026bc97ca8497d39a Mon Sep 17 00:00:00 2001
John W. Linville 2e7bab3
From: Yogesh Ashok Powar <yogeshp@marvell.com>
John W. Linville 2e7bab3
Date: Tue, 13 Dec 2011 20:43:16 -0800
John W. Linville 2e7bab3
Subject: [PATCH 04/10] mwifiex: avoid double list_del in command cancel path
John W. Linville 2e7bab3
John W. Linville 2e7bab3
Command cancel path cancels the current command and moves
John W. Linville 2e7bab3
it to free command queue. While doing that it deletes the
John W. Linville 2e7bab3
command entry from the pending list. This is not correct
John W. Linville 2e7bab3
as the entry has been already deleted from the pending
John W. Linville 2e7bab3
list at 'mwifiex_exec_next_cmd'. Fixing it.
John W. Linville 2e7bab3
John W. Linville 2e7bab3
Also making sure the stale command pointer is cleaned and
John W. Linville 2e7bab3
unaccessible for later use.
John W. Linville 2e7bab3
John W. Linville 2e7bab3
Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
John W. Linville 2e7bab3
Signed-off-by: Bing Zhao <bzhao@marvell.com>
John W. Linville 2e7bab3
Signed-off-by: John W. Linville <linville@tuxdriver.com>
John W. Linville 2e7bab3
---
John W. Linville 2e7bab3
 drivers/net/wireless/mwifiex/cmdevt.c |    9 ++-------
John W. Linville 2e7bab3
 1 files changed, 2 insertions(+), 7 deletions(-)
John W. Linville 2e7bab3
John W. Linville 2e7bab3
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c
John W. Linville 2e7bab3
index ac27815..6e0a3ea 100644
John W. Linville 2e7bab3
--- a/drivers/net/wireless/mwifiex/cmdevt.c
John W. Linville 2e7bab3
+++ b/drivers/net/wireless/mwifiex/cmdevt.c
John W. Linville 2e7bab3
@@ -939,7 +939,6 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter)
John W. Linville 2e7bab3
 {
John W. Linville 2e7bab3
 	struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL;
John W. Linville 2e7bab3
 	unsigned long cmd_flags;
John W. Linville 2e7bab3
-	unsigned long cmd_pending_q_flags;
John W. Linville 2e7bab3
 	unsigned long scan_pending_q_flags;
John W. Linville 2e7bab3
 	uint16_t cancel_scan_cmd = false;
John W. Linville 2e7bab3
 
John W. Linville 2e7bab3
@@ -949,12 +948,9 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter)
John W. Linville 2e7bab3
 		cmd_node = adapter->curr_cmd;
John W. Linville 2e7bab3
 		cmd_node->wait_q_enabled = false;
John W. Linville 2e7bab3
 		cmd_node->cmd_flag |= CMD_F_CANCELED;
John W. Linville 2e7bab3
-		spin_lock_irqsave(&adapter->cmd_pending_q_lock,
John W. Linville 2e7bab3
-				  cmd_pending_q_flags);
John W. Linville 2e7bab3
-		list_del(&cmd_node->list);
John W. Linville 2e7bab3
-		spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
John W. Linville 2e7bab3
-				       cmd_pending_q_flags);
John W. Linville 2e7bab3
 		mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
John W. Linville 2e7bab3
+		mwifiex_complete_cmd(adapter, adapter->curr_cmd);
John W. Linville 2e7bab3
+		adapter->curr_cmd = NULL;
John W. Linville 2e7bab3
 		spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
John W. Linville 2e7bab3
 	}
John W. Linville 2e7bab3
 
John W. Linville 2e7bab3
@@ -981,7 +977,6 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter)
John W. Linville 2e7bab3
 		spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
John W. Linville 2e7bab3
 	}
John W. Linville 2e7bab3
 	adapter->cmd_wait_q.status = -1;
John W. Linville 2e7bab3
-	mwifiex_complete_cmd(adapter, adapter->curr_cmd);
John W. Linville 2e7bab3
 }
John W. Linville 2e7bab3
 
John W. Linville 2e7bab3
 /*
John W. Linville 2e7bab3
-- 
John W. Linville 2e7bab3
1.7.4.4
John W. Linville 2e7bab3