[SCSI] qla2xxx: Handle failure cases during fabric_login
authorChad Dupuis <chad.dupuis@qlogic.com>
Thu, 9 Feb 2012 19:15:42 +0000 (11:15 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 14:18:52 +0000 (08:18 -0600)
Make sure that all calls to ha->isp_ops->fabric_login() check the
return value for failure.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c

index cd278a09bea0a881a504c202667cb6678d820236..b85ba1ea010642876bb09b7f77f9b005c52a06ed 100644 (file)
@@ -11,9 +11,9 @@
  * ----------------------------------------------------------------------
  * |             Level            |   Last Value Used  |     Holes     |
  * ----------------------------------------------------------------------
- * | Module Init and Probe        |       0x011f       | 0x4b,0xfa      |
+ * | Module Init and Probe        |       0x0120       | 0x4b,0xba,0xfa |
  * | Mailbox commands             |       0x1139       | 0x112c-0x112e  |
- * | Device Discovery             |       0x2084       |                |
+ * | Device Discovery             |       0x2085       | 0x2020-0x2022  |
  * | Queue Command and IO tracing |       0x302f       | 0x3006,0x3008  |
  * |                              |                    | 0x302d-0x302e  |
  * | DPC Thread                   |       0x401c       |               |
index dd8339928a5f845625054bfb218ce646cea0b927..69243036529749aa2545526547ba6b4f57a957e0 100644 (file)
@@ -1107,20 +1107,26 @@ qla2x00_sns_rnn_id(scsi_qla_host_t *vha)
 static int
 qla2x00_mgmt_svr_login(scsi_qla_host_t *vha)
 {
-       int ret;
+       int ret, rval;
        uint16_t mb[MAILBOX_REGISTER_COUNT];
        struct qla_hw_data *ha = vha->hw;
        ret = QLA_SUCCESS;
        if (vha->flags.management_server_logged_in)
                return ret;
 
-       ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff, 0xfa,
-           mb, BIT_1|BIT_0);
-       if (mb[0] != MBS_COMMAND_COMPLETE) {
-               ql_dbg(ql_dbg_disc, vha, 0x2024,
-                   "Failed management_server login: loopid=%x mb[0]=%x "
-                   "mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n",
-                   vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6], mb[7]);
+       rval = ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff,
+           0xfa, mb, BIT_1|BIT_0);
+       if (rval != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) {
+               if (rval == QLA_MEMORY_ALLOC_FAILED)
+                       ql_dbg(ql_dbg_disc, vha, 0x2085,
+                           "Failed management_server login: loopid=%x "
+                           "rval=%d\n", vha->mgmt_svr_loop_id, rval);
+               else
+                       ql_dbg(ql_dbg_disc, vha, 0x2024,
+                           "Failed management_server login: loopid=%x "
+                           "mb[0]=%x mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n",
+                           vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6],
+                           mb[7]);
                ret = QLA_FUNCTION_FAILED;
        } else
                vha->flags.management_server_logged_in = 1;
index ff841d7172f24f46edbd4f6e4845157416bac378..abd095c400d82d76c7d30a311e21611f646e86eb 100644 (file)
@@ -2949,8 +2949,12 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
                        loop_id = NPH_SNS;
                else
                        loop_id = SIMPLE_NAME_SERVER;
-               ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff,
-                   0xfc, mb, BIT_1 | BIT_0);
+               rval = ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff,
+                   0xfc, mb, BIT_1|BIT_0);
+               if (rval != QLA_SUCCESS) {
+                       set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
+                       return rval;
+               }
                if (mb[0] != MBS_COMMAND_COMPLETE) {
                        ql_dbg(ql_dbg_disc, vha, 0x2042,
                            "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x "
@@ -3487,6 +3491,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport,
                } else {
                        qla2x00_update_fcport(vha, fcport);
                }
+       } else {
+               /* Retry Login. */
+               qla2x00_mark_device_lost(vha, fcport, 1, 0);
        }
 
        return (rval);
@@ -3527,9 +3534,12 @@ qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport,
                    fcport->d_id.b.area, fcport->d_id.b.al_pa);
 
                /* Login fcport on switch. */
-               ha->isp_ops->fabric_login(vha, fcport->loop_id,
+               rval = ha->isp_ops->fabric_login(vha, fcport->loop_id,
                    fcport->d_id.b.domain, fcport->d_id.b.area,
                    fcport->d_id.b.al_pa, mb, BIT_0);
+               if (rval != QLA_SUCCESS) {
+                       return rval;
+               }
                if (mb[0] == MBS_PORT_ID_USED) {
                        /*
                         * Device has another loop ID.  The firmware team
@@ -4844,6 +4854,7 @@ int
 qla24xx_configure_vhba(scsi_qla_host_t *vha)
 {
        int rval = QLA_SUCCESS;
+       int rval2;
        uint16_t mb[MAILBOX_REGISTER_COUNT];
        struct qla_hw_data *ha = vha->hw;
        struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
@@ -4868,12 +4879,18 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha)
        vha->flags.management_server_logged_in = 0;
 
        /* Login to SNS first */
-       ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb, BIT_1);
-       if (mb[0] != MBS_COMMAND_COMPLETE) {
-               ql_dbg(ql_dbg_init, vha, 0x0103,
-                   "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x "
-                   "mb[6]=%x mb[7]=%x.\n",
-                   NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]);
+       rval2 = ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb,
+           BIT_1);
+       if (rval2 != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) {
+               if (rval2 == QLA_MEMORY_ALLOC_FAILED)
+                       ql_dbg(ql_dbg_init, vha, 0x0120,
+                           "Failed SNS login: loop_id=%x, rval2=%d\n",
+                           NPH_SNS, rval2);
+               else
+                       ql_dbg(ql_dbg_init, vha, 0x0103,
+                           "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x "
+                           "mb[2]=%x mb[6]=%x mb[7]=%x.\n",
+                           NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]);
                return (QLA_FUNCTION_FAILED);
        }