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: Holger Schurig <holgerschurig@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
85359499ee
commit
40e6fa829a
3 changed files with 7 additions and 30 deletions
|
@ -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 */
|
||||
del_timer(&priv->command_timer);
|
||||
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. */
|
||||
priv->cur_cmd_retcode = result;
|
||||
|
|
|
@ -109,7 +109,6 @@ struct lbs_private {
|
|||
struct list_head cmdpendingq; /* pending command buffers */
|
||||
wait_queue_head_t cmd_pending;
|
||||
struct timer_list command_timer;
|
||||
int nr_retries;
|
||||
int cmd_timed_out;
|
||||
|
||||
/* Command responses sent from the hardware to the driver */
|
||||
|
|
|
@ -533,31 +533,14 @@ static int lbs_thread(void *data)
|
|||
if (priv->cmd_timed_out && priv->cur_cmd) {
|
||||
struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
|
||||
|
||||
if (++priv->nr_retries > 3) {
|
||||
lbs_pr_info("Excessive timeouts submitting "
|
||||
"command 0x%04x\n",
|
||||
le16_to_cpu(cmdnode->cmdbuf->command));
|
||||
lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
|
||||
priv->nr_retries = 0;
|
||||
if (priv->reset_card)
|
||||
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);
|
||||
}
|
||||
lbs_pr_info("Timeout submitting command 0x%04x\n",
|
||||
le16_to_cpu(cmdnode->cmdbuf->command));
|
||||
lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
|
||||
if (priv->reset_card)
|
||||
priv->reset_card(priv);
|
||||
}
|
||||
priv->cmd_timed_out = 0;
|
||||
|
||||
|
||||
|
||||
if (!priv->fw_ready)
|
||||
continue;
|
||||
|
||||
|
@ -729,7 +712,7 @@ done:
|
|||
* This function handles the timeout of command sending.
|
||||
* 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;
|
||||
unsigned long flags;
|
||||
|
@ -848,7 +831,7 @@ static int lbs_init_adapter(struct lbs_private *priv)
|
|||
|
||||
mutex_init(&priv->lock);
|
||||
|
||||
setup_timer(&priv->command_timer, command_timer_fn,
|
||||
setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
|
||||
(unsigned long)priv);
|
||||
setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
|
||||
(unsigned long)priv);
|
||||
|
|
Reference in a new issue