37 lines
1.0 KiB
Diff
37 lines
1.0 KiB
Diff
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
|
|
index 4130802..8cbafa5 100644
|
|
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
|
|
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
|
|
@@ -2192,6 +2192,7 @@ static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
|
|
{
|
|
int rc = 0;
|
|
unsigned long flags;
|
|
+ unsigned long now, end;
|
|
|
|
spin_lock_irqsave(&priv->lock, flags);
|
|
if (priv->status & STATUS_HCMD_ACTIVE) {
|
|
@@ -2233,10 +2234,20 @@ static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
|
|
}
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
|
+ now = jiffies;
|
|
+ end = now + HOST_COMPLETE_TIMEOUT;
|
|
+again:
|
|
rc = wait_event_interruptible_timeout(priv->wait_command_queue,
|
|
!(priv->
|
|
status & STATUS_HCMD_ACTIVE),
|
|
- HOST_COMPLETE_TIMEOUT);
|
|
+ end - now);
|
|
+ if (rc < 0) {
|
|
+ now = jiffies;
|
|
+ if (time_before(now, end))
|
|
+ goto again;
|
|
+ rc = 0;
|
|
+ }
|
|
+
|
|
if (rc == 0) {
|
|
spin_lock_irqsave(&priv->lock, flags);
|
|
if (priv->status & STATUS_HCMD_ACTIVE) {
|
|
--
|
|
1.7.2.5
|