Commit 40e6fa82 authored by Holger Schurig's avatar Holger Schurig Committed by John W. Linville

libertas: don't retry commands

Retrying commands seldomly works, most often the firmware is in a
weird state anyway and needs the device to reset. So it's better
to report the broken state back to user-space.

Also rename command_timer_fn() into lbs_cmd_timeout_handler(),
which better reflect it's usage.
Signed-off-by: default avatarHolger Schurig <holgerschurig@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 85359499
...@@ -240,11 +240,6 @@ int lbs_process_command_response(struct lbs_private *priv, u8 *data, u32 len) ...@@ -240,11 +240,6 @@ int lbs_process_command_response(struct lbs_private *priv, u8 *data, u32 len)
/* Now we got response from FW, cancel the command timer */ /* Now we got response from FW, cancel the command timer */
del_timer(&priv->command_timer); del_timer(&priv->command_timer);
priv->cmd_timed_out = 0; priv->cmd_timed_out = 0;
if (priv->nr_retries) {
lbs_pr_info("Received result %x to command %x after %d retries\n",
result, curcmd, priv->nr_retries);
priv->nr_retries = 0;
}
/* Store the response code to cur_cmd_retcode. */ /* Store the response code to cur_cmd_retcode. */
priv->cur_cmd_retcode = result; priv->cur_cmd_retcode = result;
......
...@@ -109,7 +109,6 @@ struct lbs_private { ...@@ -109,7 +109,6 @@ struct lbs_private {
struct list_head cmdpendingq; /* pending command buffers */ struct list_head cmdpendingq; /* pending command buffers */
wait_queue_head_t cmd_pending; wait_queue_head_t cmd_pending;
struct timer_list command_timer; struct timer_list command_timer;
int nr_retries;
int cmd_timed_out; int cmd_timed_out;
/* Command responses sent from the hardware to the driver */ /* Command responses sent from the hardware to the driver */
......
...@@ -533,31 +533,14 @@ static int lbs_thread(void *data) ...@@ -533,31 +533,14 @@ static int lbs_thread(void *data)
if (priv->cmd_timed_out && priv->cur_cmd) { if (priv->cmd_timed_out && priv->cur_cmd) {
struct cmd_ctrl_node *cmdnode = priv->cur_cmd; struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
if (++priv->nr_retries > 3) { lbs_pr_info("Timeout submitting command 0x%04x\n",
lbs_pr_info("Excessive timeouts submitting "
"command 0x%04x\n",
le16_to_cpu(cmdnode->cmdbuf->command)); le16_to_cpu(cmdnode->cmdbuf->command));
lbs_complete_command(priv, cmdnode, -ETIMEDOUT); lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
priv->nr_retries = 0;
if (priv->reset_card) if (priv->reset_card)
priv->reset_card(priv); priv->reset_card(priv);
} else {
priv->cur_cmd = NULL;
priv->dnld_sent = DNLD_RES_RECEIVED;
lbs_pr_info("requeueing command 0x%04x due "
"to timeout (#%d)\n",
le16_to_cpu(cmdnode->cmdbuf->command),
priv->nr_retries);
/* Stick it back at the _top_ of the pending queue
for immediate resubmission */
list_add(&cmdnode->list, &priv->cmdpendingq);
}
} }
priv->cmd_timed_out = 0; priv->cmd_timed_out = 0;
if (!priv->fw_ready) if (!priv->fw_ready)
continue; continue;
...@@ -729,7 +712,7 @@ static int lbs_setup_firmware(struct lbs_private *priv) ...@@ -729,7 +712,7 @@ static int lbs_setup_firmware(struct lbs_private *priv)
* This function handles the timeout of command sending. * This function handles the timeout of command sending.
* It will re-send the same command again. * It will re-send the same command again.
*/ */
static void command_timer_fn(unsigned long data) static void lbs_cmd_timeout_handler(unsigned long data)
{ {
struct lbs_private *priv = (struct lbs_private *)data; struct lbs_private *priv = (struct lbs_private *)data;
unsigned long flags; unsigned long flags;
...@@ -848,7 +831,7 @@ static int lbs_init_adapter(struct lbs_private *priv) ...@@ -848,7 +831,7 @@ static int lbs_init_adapter(struct lbs_private *priv)
mutex_init(&priv->lock); mutex_init(&priv->lock);
setup_timer(&priv->command_timer, command_timer_fn, setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
(unsigned long)priv); (unsigned long)priv);
setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn, setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
(unsigned long)priv); (unsigned long)priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment