qlge: Improve handling for firmware init failure.
authorRon Mercer <ron.mercer@qlogic.com>
Tue, 3 Mar 2009 12:10:35 +0000 (12:10 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Mar 2009 07:50:48 +0000 (23:50 -0800)
This event will arrive at boot time or after an
MPI processor reset if the firmware failed to initialize.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge_mpi.c

index 3a660f9e9001728e98c6ccb243aabcd05c67c8ac..2c1d2205c653a5cdfd239357c9548e0afc1b7b92 100644 (file)
@@ -395,7 +395,25 @@ static int ql_mpi_handler(struct ql_adapter *qdev, struct mbox_params *mbcp)
                ql_sfp_out(qdev, mbcp);
                break;
 
+       /* This event can arrive at boot time or after an
+        * MPI reset if the firmware failed to initialize.
+        */
        case AEN_FW_INIT_FAIL:
+               /* If we're in process on executing the firmware,
+                * then convert the status to normal mailbox status.
+                */
+               if (mbcp->mbox_in[0] == MB_CMD_EX_FW) {
+                       mbcp->out_count = orig_count;
+                       status = ql_get_mb_sts(qdev, mbcp);
+                       mbcp->mbox_out[0] = MB_CMD_STS_ERR;
+                       return status;
+               }
+               QPRINTK(qdev, DRV, ERR,
+                       "Firmware initialization failed.\n");
+               status = -EIO;
+               ql_queue_fw_error(qdev);
+               break;
+
        case AEN_SYS_ERR:
                ql_queue_fw_error(qdev);
                break;