]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Perform implicit logout during rport tear-down.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Fri, 4 Nov 2011 14:31:51 +0000 (09:31 -0500)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Wed, 9 May 2012 00:40:55 +0000 (17:40 -0700)
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.

JIRA Key: V2632FC-88

drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_mbx.c

index ca83e648eb49904fb3d8b719f0c41bcf62a32202..f888b67fb472a498428f48208040d1666032b7c2 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 a67312e47b0104fc33731af3d0319f01e00ab664..c65cb3ddf8a152801d52e1e3845d0345f8b4e39d 100644 (file)
@@ -664,6 +664,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 1e12816ed29ffddd6dcb8bac3e13b59d855d2d4e..bc9180f495f70f0b318c142907e7791e07f52933 100644 (file)
@@ -368,6 +368,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 3df015ef687c2f6ed57d2ca59cd225130256ca9d..25cf9ffe0dfaaf1557c108825ecd781eb9419ac0 100644 (file)
@@ -4574,3 +4574,39 @@ qla83xx_write_remote_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
 
        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;
+}
+