[SCSI] qla2xxx: Perform implicit logout during rport tear-down.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Thu, 9 Feb 2012 19:15:43 +0000 (11:15 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 14:19:18 +0000 (08:19 -0600)
During rport tear-down, make sure we do an implicit LOGO of the fcport in our
firmware to try to clear any residual commands associated with that fcport.

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_attr.c
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_mbx.c

index 5433f95f3eddd223f56f623c106c5ecc7f3ac53a..e21db2f782240d6ddeef70118247de3ba0cb66ed 100644 (file)
@@ -1647,10 +1647,14 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
         * final cleanup of firmware resources (PCBs and XCBs).
         */
        if (fcport->loop_id != FC_NO_LOOP_ID &&
-           !test_bit(UNLOADING, &fcport->vha->dpc_flags))
-               fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
-                       fcport->loop_id, fcport->d_id.b.domain,
-                       fcport->d_id.b.area, fcport->d_id.b.al_pa);
+           !test_bit(UNLOADING, &fcport->vha->dpc_flags)) {
+               if (IS_FWI2_CAPABLE(fcport->vha->hw))
+                       fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
+                           fcport->loop_id, fcport->d_id.b.domain,
+                           fcport->d_id.b.area, fcport->d_id.b.al_pa);
+               else
+                       qla2x00_port_logout(fcport->vha, fcport);
+       }
 }
 
 static int
index b85ba1ea010642876bb09b7f77f9b005c52a06ed..4ba30b25f8677b3aa2a789b09167b7c05bbabc20 100644 (file)
@@ -12,7 +12,8 @@
  * |             Level            |   Last Value Used  |     Holes     |
  * ----------------------------------------------------------------------
  * | Module Init and Probe        |       0x0120       | 0x4b,0xba,0xfa |
- * | Mailbox commands             |       0x1139       | 0x112c-0x112e  |
+ * | Mailbox commands             |       0x113e       | 0x112c-0x112e  |
+ * |                              |                    | 0x113a         |
  * | Device Discovery             |       0x2085       | 0x2020-0x2022  |
  * | Queue Command and IO tracing |       0x302f       | 0x3006,0x3008  |
  * |                              |                    | 0x302d-0x302e  |
index 7a224b710ad40cae47a810f42c43f8d2aa378ba6..1281f5be67604a040662ee2a003de15bf4b325e3 100644 (file)
@@ -665,6 +665,7 @@ typedef struct {
 #define MBC_CONFIGURE_VF               0x4b    /* Configure VFs */
 #define MBC_RESET_LINK_STATUS          0x52    /* Reset Link Error Status */
 #define MBC_IOCB_COMMAND_A64           0x54    /* Execute IOCB command (64) */
+#define MBC_PORT_LOGOUT                        0x56    /* Port Logout request */
 #define MBC_SEND_RNID_ELS              0x57    /* Send RNID ELS request */
 #define MBC_SET_RNID_PARAMS            0x59    /* Set RNID parameters */
 #define MBC_GET_RNID_PARAMS            0x5a    /* Data Rate */
index 87fee23fd167aa29a97c6f6661b193401f85cfd1..9f065804bd12b830a458ab11b6a92c7936f0bc58 100644 (file)
@@ -367,6 +367,9 @@ qla81xx_get_port_config(scsi_qla_host_t *, uint16_t *);
 extern int
 qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *);
 
+extern int
+qla2x00_port_logout(scsi_qla_host_t *, struct fc_port *);
+
 /*
  * Global Function Prototypes in qla_isr.c source file.
  */
index 50ec272b61dbc4789645dfb10f65fc5a146f2952..61e2fb75fbf0cab10d1f976abe37f31372d08bff 100644 (file)
@@ -4502,5 +4502,42 @@ qla83xx_write_remote_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
                ql_dbg(ql_dbg_mbx, vha, 0x1132,
                    "Done %s.\n", __func__);
        }
+
        return rval;
 }
+
+int
+qla2x00_port_logout(scsi_qla_host_t *vha, struct fc_port *fcport)
+{
+       int rval;
+       struct qla_hw_data *ha = vha->hw;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
+               ql_dbg(ql_dbg_mbx, vha, 0x113b,
+                   "Implicit LOGO Unsupported.\n");
+               return QLA_FUNCTION_FAILED;
+       }
+
+
+       ql_dbg(ql_dbg_mbx, vha, 0x113c, "Done %s.\n",  __func__);
+
+       /* Perform Implicit LOGO. */
+       mcp->mb[0] = MBC_PORT_LOGOUT;
+       mcp->mb[1] = fcport->loop_id;
+       mcp->mb[10] = BIT_15;
+       mcp->out_mb = MBX_10|MBX_1|MBX_0;
+       mcp->in_mb = MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+       if (rval != QLA_SUCCESS)
+               ql_dbg(ql_dbg_mbx, vha, 0x113d,
+                   "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
+       else
+               ql_dbg(ql_dbg_mbx, vha, 0x113e, "Done %s.\n", __func__);
+
+       return rval;
+}
+