libertas: make lbs_submit_command always 'succeed' and set command timer
authorDavid Woodhouse <dwmw2@infradead.org>
Mon, 17 Dec 2007 21:03:58 +0000 (16:03 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 23:07:46 +0000 (15:07 -0800)
Even if it fails, we want to wait a while and try again, with an
ultimate timeout if it the condition persists. So again, just use the
standard command timeout behaviour.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/cmd.c

index 10c60bab41f608964e49e6fbc816f767573e6d30..0ae98513ba88060a5260aa3f74a55b33da2dbb5c 100644 (file)
@@ -1199,14 +1199,15 @@ done:
        lbs_deb_leave(LBS_DEB_HOST);
 }
 
-static int lbs_submit_command(struct lbs_private *priv,
-                             struct cmd_ctrl_node *cmdnode)
+static void lbs_submit_command(struct lbs_private *priv,
+                              struct cmd_ctrl_node *cmdnode)
 {
        unsigned long flags;
        struct cmd_header *cmd;
-       int ret = -1;
-       u16 cmdsize;
-       u16 command;
+       uint16_t cmdsize;
+       uint16_t command;
+       int timeo = 5 * HZ;
+       int ret;
 
        lbs_deb_enter(LBS_DEB_HOST);
 
@@ -1220,33 +1221,30 @@ static int lbs_submit_command(struct lbs_private *priv,
        cmdsize = le16_to_cpu(cmd->size);
        command = le16_to_cpu(cmd->command);
 
+       /* These commands take longer */
+       if (command == CMD_802_11_SCAN || command == CMD_802_11_ASSOCIATE ||
+           command == CMD_802_11_AUTHENTICATE)
+               timeo = 10 * HZ;
+
        lbs_deb_host("DNLD_CMD: command 0x%04x, seq %d, size %d, jiffies %lu\n",
                     command, le16_to_cpu(cmd->seqnum), cmdsize, jiffies);
        lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
 
        ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
+
        if (ret) {
                lbs_pr_info("DNLD_CMD: hw_host_to_card failed: %d\n", ret);
-               spin_lock_irqsave(&priv->driver_lock, flags);
-               lbs_complete_command(priv, priv->cur_cmd, ret);
-               spin_unlock_irqrestore(&priv->driver_lock, flags);
-               goto done;
-       }
-
-       lbs_deb_cmd("DNLD_CMD: sent command 0x%04x, jiffies %lu\n", command, jiffies);
+               /* Let the timer kick in and retry, and potentially reset
+                  the whole thing if the condition persists */
+               timeo = HZ;
+       } else
+               lbs_deb_cmd("DNLD_CMD: sent command 0x%04x, jiffies %lu\n",
+                           command, jiffies);
 
        /* Setup the timer after transmit command */
-       if (command == CMD_802_11_SCAN || command == CMD_802_11_AUTHENTICATE
-           || command == CMD_802_11_ASSOCIATE)
-               mod_timer(&priv->command_timer, jiffies + (10*HZ));
-       else
-               mod_timer(&priv->command_timer, jiffies + (5*HZ));
-
-       ret = 0;
+       mod_timer(&priv->command_timer, jiffies + timeo);
 
-done:
-       lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
-       return ret;
+       lbs_deb_leave(LBS_DEB_HOST);
 }
 
 static int lbs_cmd_mac_control(struct lbs_private *priv,