Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[sfrench/cifs-2.6.git] / drivers / scsi / qla2xxx / tcm_qla2xxx.c
index 3084983c128720588390a1d6e618ce1c774f8bc5..c2f8c35808801808517911620c48a2285b7c4daa 100644 (file)
@@ -282,10 +282,10 @@ static void tcm_qla2xxx_complete_free(struct work_struct *work)
 
        cmd->cmd_in_wq = 0;
 
-       WARN_ON(cmd->cmd_flags &  BIT_16);
+       WARN_ON(cmd->trc_flags & TRC_CMD_FREE);
 
        cmd->vha->tgt_counters.qla_core_ret_sta_ctio++;
-       cmd->cmd_flags |= BIT_16;
+       cmd->trc_flags |= TRC_CMD_FREE;
        transport_generic_free_cmd(&cmd->se_cmd, 0);
 }
 
@@ -299,8 +299,8 @@ static void tcm_qla2xxx_free_cmd(struct qla_tgt_cmd *cmd)
        cmd->vha->tgt_counters.core_qla_free_cmd++;
        cmd->cmd_in_wq = 1;
 
-       BUG_ON(cmd->cmd_flags & BIT_20);
-       cmd->cmd_flags |= BIT_20;
+       WARN_ON(cmd->trc_flags & TRC_CMD_DONE);
+       cmd->trc_flags |= TRC_CMD_DONE;
 
        INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free);
        queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
@@ -315,7 +315,7 @@ static int tcm_qla2xxx_check_stop_free(struct se_cmd *se_cmd)
 
        if ((se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) == 0) {
                cmd = container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
-               cmd->cmd_flags |= BIT_14;
+               cmd->trc_flags |= TRC_CMD_CHK_STOP;
        }
 
        return target_put_sess_cmd(se_cmd);
@@ -339,9 +339,26 @@ static void tcm_qla2xxx_release_cmd(struct se_cmd *se_cmd)
        qlt_free_cmd(cmd);
 }
 
+static void tcm_qla2xxx_release_session(struct kref *kref)
+{
+       struct fc_port  *sess = container_of(kref,
+           struct fc_port, sess_kref);
+
+       qlt_unreg_sess(sess);
+}
+
+static void tcm_qla2xxx_put_sess(struct fc_port *sess)
+{
+       if (!sess)
+               return;
+
+       assert_spin_locked(&sess->vha->hw->tgt.sess_lock);
+       kref_put(&sess->sess_kref, tcm_qla2xxx_release_session);
+}
+
 static void tcm_qla2xxx_close_session(struct se_session *se_sess)
 {
-       struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr;
+       struct fc_port *sess = se_sess->fabric_sess_ptr;
        struct scsi_qla_host *vha;
        unsigned long flags;
 
@@ -350,7 +367,7 @@ static void tcm_qla2xxx_close_session(struct se_session *se_sess)
 
        spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
        target_sess_cmd_list_set_waiting(se_sess);
-       qlt_put_sess(sess);
+       tcm_qla2xxx_put_sess(sess);
        spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 }
 
@@ -377,7 +394,7 @@ static int tcm_qla2xxx_write_pending(struct se_cmd *se_cmd)
                        cmd->se_cmd.se_cmd_flags);
                return 0;
        }
-       cmd->cmd_flags |= BIT_3;
+       cmd->trc_flags |= TRC_XFR_RDY;
        cmd->bufflen = se_cmd->data_length;
        cmd->dma_data_direction = target_reverse_dma_direction(se_cmd);
 
@@ -441,7 +458,7 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
 {
        struct se_cmd *se_cmd = &cmd->se_cmd;
        struct se_session *se_sess;
-       struct qla_tgt_sess *sess;
+       struct fc_port *sess;
 #ifdef CONFIG_TCM_QLA2XXX_DEBUG
        struct se_portal_group *se_tpg;
        struct tcm_qla2xxx_tpg *tpg;
@@ -456,7 +473,7 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
 
        sess = cmd->sess;
        if (!sess) {
-               pr_err("Unable to locate struct qla_tgt_sess from qla_tgt_cmd\n");
+               pr_err("Unable to locate struct fc_port from qla_tgt_cmd\n");
                return -EINVAL;
        }
 
@@ -493,9 +510,9 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
        cmd->cmd_in_wq = 0;
 
        spin_lock_irqsave(&cmd->cmd_lock, flags);
-       cmd->cmd_flags |= CMD_FLAG_DATA_WORK;
+       cmd->data_work = 1;
        if (cmd->aborted) {
-               cmd->cmd_flags |= CMD_FLAG_DATA_WORK_FREE;
+               cmd->data_work_free = 1;
                spin_unlock_irqrestore(&cmd->cmd_lock, flags);
 
                tcm_qla2xxx_free_cmd(cmd);
@@ -532,7 +549,7 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
  */
 static void tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd)
 {
-       cmd->cmd_flags |= BIT_10;
+       cmd->trc_flags |= TRC_DATA_IN;
        cmd->cmd_in_wq = 1;
        INIT_WORK(&cmd->work, tcm_qla2xxx_handle_data_work);
        queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
@@ -563,13 +580,49 @@ static void tcm_qla2xxx_handle_dif_err(struct qla_tgt_cmd *cmd)
  * Called from qla_target.c:qlt_issue_task_mgmt()
  */
 static int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun,
-       uint8_t tmr_func, uint32_t tag)
+       uint16_t tmr_func, uint32_t tag)
 {
-       struct qla_tgt_sess *sess = mcmd->sess;
+       struct fc_port *sess = mcmd->sess;
        struct se_cmd *se_cmd = &mcmd->se_cmd;
+       int transl_tmr_func = 0;
+
+       switch (tmr_func) {
+       case QLA_TGT_ABTS:
+               pr_debug("%ld: ABTS received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_ABORT_TASK;
+               break;
+       case QLA_TGT_2G_ABORT_TASK:
+               pr_debug("%ld: 2G Abort Task received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_ABORT_TASK;
+               break;
+       case QLA_TGT_CLEAR_ACA:
+               pr_debug("%ld: CLEAR_ACA received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_CLEAR_ACA;
+               break;
+       case QLA_TGT_TARGET_RESET:
+               pr_debug("%ld: TARGET_RESET received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_TARGET_WARM_RESET;
+               break;
+       case QLA_TGT_LUN_RESET:
+               pr_debug("%ld: LUN_RESET received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_LUN_RESET;
+               break;
+       case QLA_TGT_CLEAR_TS:
+               pr_debug("%ld: CLEAR_TS received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_CLEAR_TASK_SET;
+               break;
+       case QLA_TGT_ABORT_TS:
+               pr_debug("%ld: ABORT_TS received\n", sess->vha->host_no);
+               transl_tmr_func = TMR_ABORT_TASK_SET;
+               break;
+       default:
+               pr_debug("%ld: Unknown task mgmt fn 0x%x\n",
+                   sess->vha->host_no, tmr_func);
+               return -ENOSYS;
+       }
 
        return target_submit_tmr(se_cmd, sess->se_sess, NULL, lun, mcmd,
-                       tmr_func, GFP_ATOMIC, tag, TARGET_SCF_ACK_KREF);
+           transl_tmr_func, GFP_ATOMIC, tag, TARGET_SCF_ACK_KREF);
 }
 
 static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)
@@ -591,7 +644,7 @@ static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)
                return 0;
        }
 
-       cmd->cmd_flags |= BIT_4;
+       cmd->trc_flags |= TRC_XMIT_DATA;
        cmd->bufflen = se_cmd->data_length;
        cmd->dma_data_direction = target_reverse_dma_direction(se_cmd);
 
@@ -622,11 +675,11 @@ static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd)
        cmd->sg_cnt = 0;
        cmd->offset = 0;
        cmd->dma_data_direction = target_reverse_dma_direction(se_cmd);
-       if (cmd->cmd_flags &  BIT_5) {
-               pr_crit("Bit_5 already set for cmd = %p.\n", cmd);
+       if (cmd->trc_flags & TRC_XMIT_STATUS) {
+               pr_crit("Multiple calls for status = %p.\n", cmd);
                dump_stack();
        }
-       cmd->cmd_flags |= BIT_5;
+       cmd->trc_flags |= TRC_XMIT_STATUS;
 
        if (se_cmd->data_direction == DMA_FROM_DEVICE) {
                /*
@@ -682,10 +735,7 @@ static void tcm_qla2xxx_queue_tm_rsp(struct se_cmd *se_cmd)
        qlt_xmit_tm_rsp(mcmd);
 }
 
-
-#define DATA_WORK_NOT_FREE(_flags) \
-       (( _flags & (CMD_FLAG_DATA_WORK|CMD_FLAG_DATA_WORK_FREE)) == \
-        CMD_FLAG_DATA_WORK)
+#define DATA_WORK_NOT_FREE(_cmd) (_cmd->data_work && !_cmd->data_work_free)
 static void tcm_qla2xxx_aborted_task(struct se_cmd *se_cmd)
 {
        struct qla_tgt_cmd *cmd = container_of(se_cmd,
@@ -697,13 +747,13 @@ static void tcm_qla2xxx_aborted_task(struct se_cmd *se_cmd)
 
        spin_lock_irqsave(&cmd->cmd_lock, flags);
        if ((cmd->state == QLA_TGT_STATE_NEW)||
-               ((cmd->state == QLA_TGT_STATE_DATA_IN) &&
-                DATA_WORK_NOT_FREE(cmd->cmd_flags)) ) {
-
-               cmd->cmd_flags |= CMD_FLAG_DATA_WORK_FREE;
+           ((cmd->state == QLA_TGT_STATE_DATA_IN) &&
+               DATA_WORK_NOT_FREE(cmd))) {
+               cmd->data_work_free = 1;
                spin_unlock_irqrestore(&cmd->cmd_lock, flags);
-               /* Cmd have not reached firmware.
-                * Use this trigger to free it. */
+               /*
+                * cmd has not reached fw, Use this trigger to free it.
+                */
                tcm_qla2xxx_free_cmd(cmd);
                return;
        }
@@ -713,11 +763,11 @@ static void tcm_qla2xxx_aborted_task(struct se_cmd *se_cmd)
 }
 
 static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *,
-                       struct tcm_qla2xxx_nacl *, struct qla_tgt_sess *);
+                       struct tcm_qla2xxx_nacl *, struct fc_port *);
 /*
  * Expected to be called with struct qla_hw_data->tgt.sess_lock held
  */
-static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess)
+static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct fc_port *sess)
 {
        struct se_node_acl *se_nacl = sess->se_sess->se_node_acl;
        struct se_portal_group *se_tpg = se_nacl->se_tpg;
@@ -756,7 +806,7 @@ static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess)
        tcm_qla2xxx_clear_sess_lookup(lport, nacl, sess);
 }
 
-static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess)
+static void tcm_qla2xxx_shutdown_sess(struct fc_port *sess)
 {
        assert_spin_locked(&sess->vha->hw->tgt.sess_lock);
        target_sess_cmd_list_set_waiting(sess->se_sess);
@@ -1141,7 +1191,7 @@ static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg(
 /*
  * Expected to be called with struct qla_hw_data->tgt.sess_lock held
  */
-static struct qla_tgt_sess *tcm_qla2xxx_find_sess_by_s_id(
+static struct fc_port *tcm_qla2xxx_find_sess_by_s_id(
        scsi_qla_host_t *vha,
        const uint8_t *s_id)
 {
@@ -1169,12 +1219,12 @@ static struct qla_tgt_sess *tcm_qla2xxx_find_sess_by_s_id(
            se_nacl, se_nacl->initiatorname);
 
        nacl = container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl);
-       if (!nacl->qla_tgt_sess) {
-               pr_err("Unable to locate struct qla_tgt_sess\n");
+       if (!nacl->fc_port) {
+               pr_err("Unable to locate struct fc_port\n");
                return NULL;
        }
 
-       return nacl->qla_tgt_sess;
+       return nacl->fc_port;
 }
 
 /*
@@ -1185,7 +1235,7 @@ static void tcm_qla2xxx_set_sess_by_s_id(
        struct se_node_acl *new_se_nacl,
        struct tcm_qla2xxx_nacl *nacl,
        struct se_session *se_sess,
-       struct qla_tgt_sess *qla_tgt_sess,
+       struct fc_port *fc_port,
        uint8_t *s_id)
 {
        u32 key;
@@ -1209,22 +1259,22 @@ static void tcm_qla2xxx_set_sess_by_s_id(
                        pr_debug("Wiping nonexisting fc_port entry\n");
                }
 
-               qla_tgt_sess->se_sess = se_sess;
-               nacl->qla_tgt_sess = qla_tgt_sess;
+               fc_port->se_sess = se_sess;
+               nacl->fc_port = fc_port;
                return;
        }
 
-       if (nacl->qla_tgt_sess) {
+       if (nacl->fc_port) {
                if (new_se_nacl == NULL) {
-                       pr_debug("Clearing existing nacl->qla_tgt_sess and fc_port entry\n");
+                       pr_debug("Clearing existing nacl->fc_port and fc_port entry\n");
                        btree_remove32(&lport->lport_fcport_map, key);
-                       nacl->qla_tgt_sess = NULL;
+                       nacl->fc_port = NULL;
                        return;
                }
-               pr_debug("Replacing existing nacl->qla_tgt_sess and fc_port entry\n");
+               pr_debug("Replacing existing nacl->fc_port and fc_port entry\n");
                btree_update32(&lport->lport_fcport_map, key, new_se_nacl);
-               qla_tgt_sess->se_sess = se_sess;
-               nacl->qla_tgt_sess = qla_tgt_sess;
+               fc_port->se_sess = se_sess;
+               nacl->fc_port = fc_port;
                return;
        }
 
@@ -1234,19 +1284,19 @@ static void tcm_qla2xxx_set_sess_by_s_id(
                return;
        }
 
-       pr_debug("Replacing existing fc_port entry w/o active nacl->qla_tgt_sess\n");
+       pr_debug("Replacing existing fc_port entry w/o active nacl->fc_port\n");
        btree_update32(&lport->lport_fcport_map, key, new_se_nacl);
-       qla_tgt_sess->se_sess = se_sess;
-       nacl->qla_tgt_sess = qla_tgt_sess;
+       fc_port->se_sess = se_sess;
+       nacl->fc_port = fc_port;
 
-       pr_debug("Setup nacl->qla_tgt_sess %p by s_id for se_nacl: %p, initiatorname: %s\n",
-           nacl->qla_tgt_sess, new_se_nacl, new_se_nacl->initiatorname);
+       pr_debug("Setup nacl->fc_port %p by s_id for se_nacl: %p, initiatorname: %s\n",
+           nacl->fc_port, new_se_nacl, new_se_nacl->initiatorname);
 }
 
 /*
  * Expected to be called with struct qla_hw_data->tgt.sess_lock held
  */
-static struct qla_tgt_sess *tcm_qla2xxx_find_sess_by_loop_id(
+static struct fc_port *tcm_qla2xxx_find_sess_by_loop_id(
        scsi_qla_host_t *vha,
        const uint16_t loop_id)
 {
@@ -1274,12 +1324,12 @@ static struct qla_tgt_sess *tcm_qla2xxx_find_sess_by_loop_id(
 
        nacl = container_of(se_nacl, struct tcm_qla2xxx_nacl, se_node_acl);
 
-       if (!nacl->qla_tgt_sess) {
-               pr_err("Unable to locate struct qla_tgt_sess\n");
+       if (!nacl->fc_port) {
+               pr_err("Unable to locate struct fc_port\n");
                return NULL;
        }
 
-       return nacl->qla_tgt_sess;
+       return nacl->fc_port;
 }
 
 /*
@@ -1290,7 +1340,7 @@ static void tcm_qla2xxx_set_sess_by_loop_id(
        struct se_node_acl *new_se_nacl,
        struct tcm_qla2xxx_nacl *nacl,
        struct se_session *se_sess,
-       struct qla_tgt_sess *qla_tgt_sess,
+       struct fc_port *fc_port,
        uint16_t loop_id)
 {
        struct se_node_acl *saved_nacl;
@@ -1305,27 +1355,27 @@ static void tcm_qla2xxx_set_sess_by_loop_id(
        if (!saved_nacl) {
                pr_debug("Setting up new fc_loopid->se_nacl to new_se_nacl\n");
                fc_loopid->se_nacl = new_se_nacl;
-               if (qla_tgt_sess->se_sess != se_sess)
-                       qla_tgt_sess->se_sess = se_sess;
-               if (nacl->qla_tgt_sess != qla_tgt_sess)
-                       nacl->qla_tgt_sess = qla_tgt_sess;
+               if (fc_port->se_sess != se_sess)
+                       fc_port->se_sess = se_sess;
+               if (nacl->fc_port != fc_port)
+                       nacl->fc_port = fc_port;
                return;
        }
 
-       if (nacl->qla_tgt_sess) {
+       if (nacl->fc_port) {
                if (new_se_nacl == NULL) {
-                       pr_debug("Clearing nacl->qla_tgt_sess and fc_loopid->se_nacl\n");
+                       pr_debug("Clearing nacl->fc_port and fc_loopid->se_nacl\n");
                        fc_loopid->se_nacl = NULL;
-                       nacl->qla_tgt_sess = NULL;
+                       nacl->fc_port = NULL;
                        return;
                }
 
-               pr_debug("Replacing existing nacl->qla_tgt_sess and fc_loopid->se_nacl\n");
+               pr_debug("Replacing existing nacl->fc_port and fc_loopid->se_nacl\n");
                fc_loopid->se_nacl = new_se_nacl;
-               if (qla_tgt_sess->se_sess != se_sess)
-                       qla_tgt_sess->se_sess = se_sess;
-               if (nacl->qla_tgt_sess != qla_tgt_sess)
-                       nacl->qla_tgt_sess = qla_tgt_sess;
+               if (fc_port->se_sess != se_sess)
+                       fc_port->se_sess = se_sess;
+               if (nacl->fc_port != fc_port)
+                       nacl->fc_port = fc_port;
                return;
        }
 
@@ -1335,29 +1385,29 @@ static void tcm_qla2xxx_set_sess_by_loop_id(
                return;
        }
 
-       pr_debug("Replacing existing fc_loopid->se_nacl w/o active nacl->qla_tgt_sess\n");
+       pr_debug("Replacing existing fc_loopid->se_nacl w/o active nacl->fc_port\n");
        fc_loopid->se_nacl = new_se_nacl;
-       if (qla_tgt_sess->se_sess != se_sess)
-               qla_tgt_sess->se_sess = se_sess;
-       if (nacl->qla_tgt_sess != qla_tgt_sess)
-               nacl->qla_tgt_sess = qla_tgt_sess;
+       if (fc_port->se_sess != se_sess)
+               fc_port->se_sess = se_sess;
+       if (nacl->fc_port != fc_port)
+               nacl->fc_port = fc_port;
 
-       pr_debug("Setup nacl->qla_tgt_sess %p by loop_id for se_nacl: %p, initiatorname: %s\n",
-           nacl->qla_tgt_sess, new_se_nacl, new_se_nacl->initiatorname);
+       pr_debug("Setup nacl->fc_port %p by loop_id for se_nacl: %p, initiatorname: %s\n",
+           nacl->fc_port, new_se_nacl, new_se_nacl->initiatorname);
 }
 
 /*
  * Should always be called with qla_hw_data->tgt.sess_lock held.
  */
 static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *lport,
-               struct tcm_qla2xxx_nacl *nacl, struct qla_tgt_sess *sess)
+               struct tcm_qla2xxx_nacl *nacl, struct fc_port *sess)
 {
        struct se_session *se_sess = sess->se_sess;
        unsigned char be_sid[3];
 
-       be_sid[0] = sess->s_id.b.domain;
-       be_sid[1] = sess->s_id.b.area;
-       be_sid[2] = sess->s_id.b.al_pa;
+       be_sid[0] = sess->d_id.b.domain;
+       be_sid[1] = sess->d_id.b.area;
+       be_sid[2] = sess->d_id.b.al_pa;
 
        tcm_qla2xxx_set_sess_by_s_id(lport, NULL, nacl, se_sess,
                                sess, be_sid);
@@ -1365,7 +1415,7 @@ static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *lport,
                                sess, sess->loop_id);
 }
 
-static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess)
+static void tcm_qla2xxx_free_session(struct fc_port *sess)
 {
        struct qla_tgt *tgt = sess->tgt;
        struct qla_hw_data *ha = tgt->ha;
@@ -1377,7 +1427,7 @@ static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess)
 
        se_sess = sess->se_sess;
        if (!se_sess) {
-               pr_err("struct qla_tgt_sess->se_sess is NULL\n");
+               pr_err("struct fc_port->se_sess is NULL\n");
                dump_stack();
                return;
        }
@@ -1404,14 +1454,14 @@ static int tcm_qla2xxx_session_cb(struct se_portal_group *se_tpg,
        struct se_node_acl *se_nacl = se_sess->se_node_acl;
        struct tcm_qla2xxx_nacl *nacl = container_of(se_nacl,
                                struct tcm_qla2xxx_nacl, se_node_acl);
-       struct qla_tgt_sess *qlat_sess = p;
+       struct fc_port *qlat_sess = p;
        uint16_t loop_id = qlat_sess->loop_id;
        unsigned long flags;
        unsigned char be_sid[3];
 
-       be_sid[0] = qlat_sess->s_id.b.domain;
-       be_sid[1] = qlat_sess->s_id.b.area;
-       be_sid[2] = qlat_sess->s_id.b.al_pa;
+       be_sid[0] = qlat_sess->d_id.b.domain;
+       be_sid[1] = qlat_sess->d_id.b.area;
+       be_sid[2] = qlat_sess->d_id.b.al_pa;
 
        /*
         * And now setup se_nacl and session pointers into HW lport internal
@@ -1434,7 +1484,7 @@ static int tcm_qla2xxx_session_cb(struct se_portal_group *se_tpg,
 static int tcm_qla2xxx_check_initiator_node_acl(
        scsi_qla_host_t *vha,
        unsigned char *fc_wwpn,
-       struct qla_tgt_sess *qlat_sess)
+       struct fc_port *qlat_sess)
 {
        struct qla_hw_data *ha = vha->hw;
        struct tcm_qla2xxx_lport *lport;
@@ -1478,7 +1528,7 @@ static int tcm_qla2xxx_check_initiator_node_acl(
        return 0;
 }
 
-static void tcm_qla2xxx_update_sess(struct qla_tgt_sess *sess, port_id_t s_id,
+static void tcm_qla2xxx_update_sess(struct fc_port *sess, port_id_t s_id,
                                    uint16_t loop_id, bool conf_compl_supported)
 {
        struct qla_tgt *tgt = sess->tgt;
@@ -1491,11 +1541,11 @@ static void tcm_qla2xxx_update_sess(struct qla_tgt_sess *sess, port_id_t s_id,
        u32 key;
 
 
-       if (sess->loop_id != loop_id || sess->s_id.b24 != s_id.b24)
+       if (sess->loop_id != loop_id || sess->d_id.b24 != s_id.b24)
                pr_info("Updating session %p from port %8phC loop_id %d -> %d s_id %x:%x:%x -> %x:%x:%x\n",
                    sess, sess->port_name,
-                   sess->loop_id, loop_id, sess->s_id.b.domain,
-                   sess->s_id.b.area, sess->s_id.b.al_pa, s_id.b.domain,
+                   sess->loop_id, loop_id, sess->d_id.b.domain,
+                   sess->d_id.b.area, sess->d_id.b.al_pa, s_id.b.domain,
                    s_id.b.area, s_id.b.al_pa);
 
        if (sess->loop_id != loop_id) {
@@ -1515,18 +1565,20 @@ static void tcm_qla2xxx_update_sess(struct qla_tgt_sess *sess, port_id_t s_id,
                sess->loop_id = loop_id;
        }
 
-       if (sess->s_id.b24 != s_id.b24) {
-               key = (((u32) sess->s_id.b.domain << 16) |
-                      ((u32) sess->s_id.b.area   <<  8) |
-                      ((u32) sess->s_id.b.al_pa));
+       if (sess->d_id.b24 != s_id.b24) {
+               key = (((u32) sess->d_id.b.domain << 16) |
+                      ((u32) sess->d_id.b.area   <<  8) |
+                      ((u32) sess->d_id.b.al_pa));
 
                if (btree_lookup32(&lport->lport_fcport_map, key))
-                       WARN(btree_remove32(&lport->lport_fcport_map, key) != se_nacl,
-                            "Found wrong se_nacl when updating s_id %x:%x:%x\n",
-                            sess->s_id.b.domain, sess->s_id.b.area, sess->s_id.b.al_pa);
+                       WARN(btree_remove32(&lport->lport_fcport_map, key) !=
+                           se_nacl, "Found wrong se_nacl when updating s_id %x:%x:%x\n",
+                           sess->d_id.b.domain, sess->d_id.b.area,
+                           sess->d_id.b.al_pa);
                else
                        WARN(1, "No lport_fcport_map entry for s_id %x:%x:%x\n",
-                            sess->s_id.b.domain, sess->s_id.b.area, sess->s_id.b.al_pa);
+                            sess->d_id.b.domain, sess->d_id.b.area,
+                            sess->d_id.b.al_pa);
 
                key = (((u32) s_id.b.domain << 16) |
                       ((u32) s_id.b.area   <<  8) |
@@ -1537,10 +1589,11 @@ static void tcm_qla2xxx_update_sess(struct qla_tgt_sess *sess, port_id_t s_id,
                             s_id.b.domain, s_id.b.area, s_id.b.al_pa);
                        btree_update32(&lport->lport_fcport_map, key, se_nacl);
                } else {
-                       btree_insert32(&lport->lport_fcport_map, key, se_nacl, GFP_ATOMIC);
+                       btree_insert32(&lport->lport_fcport_map, key, se_nacl,
+                           GFP_ATOMIC);
                }
 
-               sess->s_id = s_id;
+               sess->d_id = s_id;
                nacl->nport_id = key;
        }
 
@@ -1567,6 +1620,7 @@ static struct qla_tgt_func_tmpl tcm_qla2xxx_template = {
        .find_sess_by_s_id      = tcm_qla2xxx_find_sess_by_s_id,
        .find_sess_by_loop_id   = tcm_qla2xxx_find_sess_by_loop_id,
        .clear_nacl_from_fcport_map = tcm_qla2xxx_clear_nacl_from_fcport_map,
+       .put_sess               = tcm_qla2xxx_put_sess,
        .shutdown_sess          = tcm_qla2xxx_shutdown_sess,
 };
 
@@ -1690,7 +1744,7 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha,
                        (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr;
        struct fc_vport_identifiers vport_id;
 
-       if (!qla_tgt_mode_enabled(base_vha)) {
+       if (qla_ini_mode_enabled(base_vha)) {
                pr_err("qla2xxx base_vha not enabled for target mode\n");
                return -EPERM;
        }