Skip to content

Commit

Permalink
qlge: Fix firmware mailbox command timeout.
Browse files Browse the repository at this point in the history
The mailbox command process would only process a maximum of 5 unrelated
firmware events while waiting for it's command completion status.
It should process an unlimited number of events while waiting for a maximum of 5 seconds.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ron Mercer authored and David S. Miller committed Oct 29, 2009
1 parent 6d190c6 commit da03945
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
1 change: 1 addition & 0 deletions drivers/net/qlge/qlge.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ enum {

/* Misc. stuff */
MAILBOX_COUNT = 16,
MAILBOX_TIMEOUT = 5,

PROC_ADDR_RDY = (1 << 31),
PROC_ADDR_R = (1 << 30),
Expand Down
23 changes: 12 additions & 11 deletions drivers/net/qlge/qlge_mpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,8 @@ static int ql_mpi_handler(struct ql_adapter *qdev, struct mbox_params *mbcp)
*/
static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
{
int status, count;
int status;
unsigned long count;


/* Begin polled mode for MPI */
Expand All @@ -491,9 +492,9 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
/* Wait for the command to complete. We loop
* here because some AEN might arrive while
* we're waiting for the mailbox command to
* complete. If more than 5 arrive then we can
* complete. If more than 5 seconds expire we can
* assume something is wrong. */
count = 5;
count = jiffies + HZ * MAILBOX_TIMEOUT;
do {
/* Wait for the interrupt to come in. */
status = ql_wait_mbx_cmd_cmplt(qdev);
Expand All @@ -517,15 +518,15 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
MB_CMD_STS_GOOD) ||
((mbcp->mbox_out[0] & 0x0000f000) ==
MB_CMD_STS_INTRMDT))
break;
} while (--count);
goto done;
} while (time_before(jiffies, count));

if (!count) {
QPRINTK(qdev, DRV, ERR,
"Timed out waiting for mailbox complete.\n");
status = -ETIMEDOUT;
goto end;
}
QPRINTK(qdev, DRV, ERR,
"Timed out waiting for mailbox complete.\n");
status = -ETIMEDOUT;
goto end;

done:

/* Now we can clear the interrupt condition
* and look at our status.
Expand Down

0 comments on commit da03945

Please sign in to comment.