Skip to content

Commit

Permalink
scsi: qla2xxx: Allow target mode to accept PRLI in dual mode
Browse files Browse the repository at this point in the history
For Dual Mode, Initiator side of the driver finish login,
target side receive PRLI, but driver terminates PRLI.
This patch allows target side to go ahead and accept PRLI.

Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Quinn Tran authored and Martin K. Petersen committed Jan 4, 2018
1 parent 045d6ea commit 82abdca
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
5 changes: 5 additions & 0 deletions drivers/scsi/qla2xxx/qla_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -1537,6 +1537,7 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
port_id_t cid; /* conflict Nport id */
u16 lid;
struct fc_port *conflict_fcport;
unsigned long flags;

switch (ea->data[0]) {
case MBS_COMMAND_COMPLETE:
Expand All @@ -1557,10 +1558,14 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
ea->fcport->loop_id, ea->fcport->d_id.b24);

set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
ea->fcport->loop_id = FC_NO_LOOP_ID;
ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
ea->fcport->logout_on_delete = 1;
ea->fcport->send_els_logo = 0;
ea->fcport->fw_login_state = DSC_LS_PRLI_COMP;
spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);

qla24xx_post_gpdb_work(vha, ea->fcport, 0);
}
break;
Expand Down
16 changes: 13 additions & 3 deletions drivers/scsi/qla2xxx/qla_target.c
Original file line number Diff line number Diff line change
Expand Up @@ -4682,7 +4682,7 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
uint16_t wd3_lo;
int res = 0;
struct qlt_plogi_ack_t *pla;
unsigned long flags;
unsigned long flags = 0;

wwn = wwn_to_u64(iocb->u.isp24.port_name);

Expand Down Expand Up @@ -4818,8 +4818,14 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
}

if (sess != NULL) {
if (sess->fw_login_state != DSC_LS_PLOGI_PEND &&
sess->fw_login_state != DSC_LS_PLOGI_COMP) {
spin_lock_irqsave(&tgt->ha->tgt.sess_lock, flags);
switch (sess->fw_login_state) {
case DSC_LS_PLOGI_COMP:
case DSC_LS_PRLI_COMP:
break;
default:
spin_unlock_irqrestore(&tgt->ha->tgt.sess_lock,
flags);
/*
* Impatient initiator sent PRLI before last
* PLOGI could finish. Will force him to re-try,
Expand All @@ -4830,6 +4836,8 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
sess);
qlt_send_term_imm_notif(vha, iocb, 1);
res = 0;
spin_lock_irqsave(&tgt->ha->tgt.sess_lock,
flags);
break;
}

Expand All @@ -4853,6 +4861,8 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
sess->port_type = FCT_INITIATOR;
else
sess->port_type = FCT_TARGET;

spin_unlock_irqrestore(&tgt->ha->tgt.sess_lock, flags);
}
res = 1; /* send notify ack */

Expand Down

0 comments on commit 82abdca

Please sign in to comment.