|
@@ -638,6 +638,7 @@ int qla24xx_async_notify_ack(scsi_qla_host_t *vha, fc_port_t *fcport,
|
|
|
break;
|
|
|
case SRB_NACK_PRLI:
|
|
|
fcport->fw_login_state = DSC_LS_PRLI_PEND;
|
|
|
+ fcport->deleted = 0;
|
|
|
c = "PRLI";
|
|
|
break;
|
|
|
case SRB_NACK_LOGO:
|
|
@@ -1576,6 +1577,9 @@ static void qlt_send_notify_ack(struct scsi_qla_host *vha,
|
|
|
request_t *pkt;
|
|
|
struct nack_to_isp *nack;
|
|
|
|
|
|
+ if (!ha->flags.fw_started)
|
|
|
+ return;
|
|
|
+
|
|
|
ql_dbg(ql_dbg_tgt, vha, 0xe004, "Sending NOTIFY_ACK (ha=%p)\n", ha);
|
|
|
|
|
|
/* Send marker if required */
|
|
@@ -3053,7 +3057,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
|
|
|
else
|
|
|
vha->tgt_counters.core_qla_que_buf++;
|
|
|
|
|
|
- if (!vha->flags.online || cmd->reset_count != ha->chip_reset) {
|
|
|
+ if (!ha->flags.fw_started || cmd->reset_count != ha->chip_reset) {
|
|
|
/*
|
|
|
* Either the port is not online or this request was from
|
|
|
* previous life, just abort the processing.
|
|
@@ -3194,7 +3198,7 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
|
|
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
|
|
|
|
- if (!vha->flags.online || (cmd->reset_count != ha->chip_reset) ||
|
|
|
+ if (!ha->flags.fw_started || (cmd->reset_count != ha->chip_reset) ||
|
|
|
(cmd->sess && cmd->sess->deleted)) {
|
|
|
/*
|
|
|
* Either the port is not online or this request was from
|
|
@@ -3372,7 +3376,7 @@ static int __qlt_send_term_imm_notif(struct scsi_qla_host *vha,
|
|
|
ql_dbg(ql_dbg_tgt_tmr, vha, 0xe01c,
|
|
|
"Sending TERM ELS CTIO (ha=%p)\n", ha);
|
|
|
|
|
|
- pkt = (request_t *)qla2x00_alloc_iocbs_ready(vha, NULL);
|
|
|
+ pkt = (request_t *)qla2x00_alloc_iocbs(vha, NULL);
|
|
|
if (pkt == NULL) {
|
|
|
ql_dbg(ql_dbg_tgt, vha, 0xe080,
|
|
|
"qla_target(%d): %s failed: unable to allocate "
|
|
@@ -4697,7 +4701,8 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
|
|
|
}
|
|
|
|
|
|
if (sess != NULL) {
|
|
|
- if (sess->fw_login_state == DSC_LS_PLOGI_PEND) {
|
|
|
+ if (sess->fw_login_state != DSC_LS_PLOGI_PEND &&
|
|
|
+ sess->fw_login_state != DSC_LS_PLOGI_COMP) {
|
|
|
/*
|
|
|
* Impatient initiator sent PRLI before last
|
|
|
* PLOGI could finish. Will force him to re-try,
|
|
@@ -4736,15 +4741,23 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
|
|
|
|
|
|
/* Make session global (not used in fabric mode) */
|
|
|
if (ha->current_topology != ISP_CFG_F) {
|
|
|
- set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
|
|
- set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
|
|
- qla2xxx_wake_dpc(vha);
|
|
|
+ if (sess) {
|
|
|
+ ql_dbg(ql_dbg_disc, vha, 0xffff,
|
|
|
+ "%s %d %8phC post nack\n",
|
|
|
+ __func__, __LINE__, sess->port_name);
|
|
|
+ qla24xx_post_nack_work(vha, sess, iocb,
|
|
|
+ SRB_NACK_PRLI);
|
|
|
+ res = 0;
|
|
|
+ } else {
|
|
|
+ set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
|
|
+ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
|
|
+ qla2xxx_wake_dpc(vha);
|
|
|
+ }
|
|
|
} else {
|
|
|
if (sess) {
|
|
|
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
|
|
- "%s %d %8phC post nack\n",
|
|
|
- __func__, __LINE__, sess->port_name);
|
|
|
-
|
|
|
+ "%s %d %8phC post nack\n",
|
|
|
+ __func__, __LINE__, sess->port_name);
|
|
|
qla24xx_post_nack_work(vha, sess, iocb,
|
|
|
SRB_NACK_PRLI);
|
|
|
res = 0;
|
|
@@ -4752,7 +4765,6 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
-
|
|
|
case ELS_TPRLO:
|
|
|
if (le16_to_cpu(iocb->u.isp24.flags) &
|
|
|
NOTIFY24XX_FLAGS_GLOBAL_TPRLO) {
|
|
@@ -5222,7 +5234,7 @@ static void qlt_24xx_atio_pkt(struct scsi_qla_host *vha,
|
|
|
unsigned long flags;
|
|
|
|
|
|
if (unlikely(tgt == NULL)) {
|
|
|
- ql_dbg(ql_dbg_io, vha, 0x3064,
|
|
|
+ ql_dbg(ql_dbg_tgt, vha, 0x3064,
|
|
|
"ATIO pkt, but no tgt (ha %p)", ha);
|
|
|
return;
|
|
|
}
|
|
@@ -6359,7 +6371,7 @@ qlt_24xx_process_atio_queue(struct scsi_qla_host *vha, uint8_t ha_locked)
|
|
|
struct atio_from_isp *pkt;
|
|
|
int cnt, i;
|
|
|
|
|
|
- if (!vha->flags.online)
|
|
|
+ if (!ha->flags.fw_started)
|
|
|
return;
|
|
|
|
|
|
while ((ha->tgt.atio_ring_ptr->signature != ATIO_PROCESSED) ||
|