aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/util.c
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2011-10-12 23:28:06 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-10-14 14:48:20 -0400
commitefaaa8b8414e0ab4ba09aaaf79ab92a34b75797b (patch)
treefb5680389af8de71154859c468adc83c04b7c1e4 /drivers/net/wireless/mwifiex/util.c
parent207ae4a3733686df2aabd2dd6feefbde4e69cdd5 (diff)
mwifiex: use separate wait condition for each command node
Currently global wait condition (adapter->cmd_wait_q.condition) is used while sending synchronous commands to FW. When two threads enter in mwifiex_send_cmd_sync() routine at the same time, both the threads wait for their command responses. Since wait condition is same for both, they wake up simultaneously after getting response of 1st command. After this when a thread is waiting for command response of 3rd command, it wakes up after getting response of 2nd command and so on. Therefore we don't wait for the response of last command(0xaa) during unload. Hence while next time loading the driver command time out is seen for INIT command. This problem is resolved by having separate wait condition flag for each command(except scan command). Since scan command is treated differently (by maintaining scan pending q etc.), newly defined flag (scan_wait_q_woken) is used as a scan wait condition. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex/util.c')
-rw-r--r--drivers/net/wireless/mwifiex/util.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index d41291529bc0..06976f517f66 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -185,13 +185,14 @@ int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb)
185 * corresponding waiting function. Otherwise, it processes the 185 * corresponding waiting function. Otherwise, it processes the
186 * IOCTL response and frees the response buffer. 186 * IOCTL response and frees the response buffer.
187 */ 187 */
188int mwifiex_complete_cmd(struct mwifiex_adapter *adapter) 188int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,
189 struct cmd_ctrl_node *cmd_node)
189{ 190{
190 atomic_dec(&adapter->cmd_pending); 191 atomic_dec(&adapter->cmd_pending);
191 dev_dbg(adapter->dev, "cmd completed: status=%d\n", 192 dev_dbg(adapter->dev, "cmd completed: status=%d\n",
192 adapter->cmd_wait_q.status); 193 adapter->cmd_wait_q.status);
193 194
194 adapter->cmd_wait_q.condition = true; 195 *(cmd_node->condition) = true;
195 196
196 if (adapter->cmd_wait_q.status == -ETIMEDOUT) 197 if (adapter->cmd_wait_q.status == -ETIMEDOUT)
197 dev_err(adapter->dev, "cmd timeout\n"); 198 dev_err(adapter->dev, "cmd timeout\n");