]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Handle failure cases during fabric_login
authorChad Dupuis <chad.dupuis@qlogic.com>
Tue, 10 Apr 2012 11:00:12 +0000 (16:30 +0530)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Wed, 9 May 2012 00:40:55 +0000 (17:40 -0700)
Make sure that all calls to ha->isp_ops->fabric_login() check the
return value for failure.

JIRA Key: V2632FC-84

Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c

index 33a137d3a296790e9f4932cf72c53647c4614b8a..11fbcf7448f92beef9338cd58a71ecef138551dd 100644 (file)
  * ----------------------------------------------------------------------
  * |             Level            |   Last Value Used  |     Holes     |
  * ----------------------------------------------------------------------
- * | Module Init and Probe        |       0x011f       | 0x4b, 0xfa     |
+ * | Module Init and Probe        |       0x0120       | 0x4b,0xba,0xfa |
  * | Mailbox commands             |       0x113a       |              |
- * | Device Discovery             |       0x2084       |              |
+ * | Device Discovery             |       0x2085       | 0x2020-0x2022  |
  * | Queue Command and IO tracing |       0x302f       | 0x3006,0x3008  |
  * |                              |                    | 0x302d,0x302e  |
  * | DPC Thread                   |       0x401c       |               |
  * | Async Events                 |       0x5057       | 0x502b-0x502f  |
  * |                            |                    | 0x5047,0x5052  |
- * | Timer Routines               |       0x6011       | 0x600e-600f    |
+ * | Timer Routines               |       0x6011       | 0x600e-0x600f  |
  * | User Space Interactions      |       0x709e       | 0x7018,0x702e |
  * |                              |                    | 0x7039,0x7045  |
  * | Task Management              |       0x803c       | 0x8025-0x8026  |
  * |                             |                    | 0x800b,0x8039 |
  * | AER/EEH                      |       0x900f       |              |
  * | Virtual Port                 |       0xa008       |              |
- * | ISP82XX Specific             |       0xb052       |              |
+ * | ISP82XX Specific             |       0xb053       |              |
  * | MultiQ                       |       0xc00c       |              |
  * | Misc                         |       0xd010       |              |
  * ----------------------------------------------------------------------
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 7c8f2dca666647ea05f0d36f4eff28c02c4d8a79..82b5239689fe899fd0c3799066cfec89bb93471b 100644 (file)
@@ -2979,8 +2979,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 "
@@ -3517,6 +3521,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);
@@ -3557,9 +3564,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
@@ -4874,6 +4884,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);
@@ -4898,12 +4909,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);
        }