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 */
|
/* 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 {
|
||||||
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)
|
||||||
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 "
|
le16_to_cpu(cmdnode->cmdbuf->command));
|
||||||
"command 0x%04x\n",
|
lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
|
||||||
le16_to_cpu(cmdnode->cmdbuf->command));
|
if (priv->reset_card)
|
||||||
lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
|
priv->reset_card(priv);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
priv->cmd_timed_out = 0;
|
priv->cmd_timed_out = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!priv->fw_ready)
|
if (!priv->fw_ready)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -729,7 +712,7 @@ done:
|
||||||
* 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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Reference in a new issue