|
@@ -668,11 +668,9 @@ static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd)
|
|
|
{
|
|
|
struct qla_hw_data *ha = vha->hw;
|
|
|
struct qla_tgt_sess *sess = NULL;
|
|
|
- uint32_t unpacked_lun, lun = 0;
|
|
|
uint16_t loop_id;
|
|
|
int res = 0;
|
|
|
struct imm_ntfy_from_isp *n = (struct imm_ntfy_from_isp *)iocb;
|
|
|
- struct atio_from_isp *a = (struct atio_from_isp *)iocb;
|
|
|
unsigned long flags;
|
|
|
|
|
|
loop_id = le16_to_cpu(n->u.isp24.nport_handle);
|
|
@@ -725,11 +723,7 @@ static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd)
|
|
|
"loop_id %d)\n", vha->host_no, sess, sess->port_name,
|
|
|
mcmd, loop_id);
|
|
|
|
|
|
- lun = a->u.isp24.fcp_cmnd.lun;
|
|
|
- unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun);
|
|
|
-
|
|
|
- return qlt_issue_task_mgmt(sess, unpacked_lun, mcmd,
|
|
|
- iocb, QLA24XX_MGMT_SEND_NACK);
|
|
|
+ return qlt_issue_task_mgmt(sess, 0, mcmd, iocb, QLA24XX_MGMT_SEND_NACK);
|
|
|
}
|
|
|
|
|
|
/* ha->tgt.sess_lock supposed to be held on entry */
|
|
@@ -3067,7 +3061,7 @@ static int __qlt_send_term_imm_notif(struct scsi_qla_host *vha,
|
|
|
|
|
|
pkt->entry_type = NOTIFY_ACK_TYPE;
|
|
|
pkt->entry_count = 1;
|
|
|
- pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK;
|
|
|
+ pkt->handle = QLA_TGT_SKIP_HANDLE;
|
|
|
|
|
|
nack = (struct nack_to_isp *)pkt;
|
|
|
nack->ox_id = ntfy->ox_id;
|
|
@@ -3110,6 +3104,9 @@ static void qlt_send_term_imm_notif(struct scsi_qla_host *vha,
|
|
|
#if 0 /* Todo */
|
|
|
if (rc == -ENOMEM)
|
|
|
qlt_alloc_qfull_cmd(vha, imm, 0, 0);
|
|
|
+#else
|
|
|
+ if (rc) {
|
|
|
+ }
|
|
|
#endif
|
|
|
goto done;
|
|
|
}
|
|
@@ -6457,12 +6454,29 @@ qlt_24xx_process_atio_queue(struct scsi_qla_host *vha, uint8_t ha_locked)
|
|
|
if (!vha->flags.online)
|
|
|
return;
|
|
|
|
|
|
- while (ha->tgt.atio_ring_ptr->signature != ATIO_PROCESSED) {
|
|
|
+ while ((ha->tgt.atio_ring_ptr->signature != ATIO_PROCESSED) ||
|
|
|
+ fcpcmd_is_corrupted(ha->tgt.atio_ring_ptr)) {
|
|
|
pkt = (struct atio_from_isp *)ha->tgt.atio_ring_ptr;
|
|
|
cnt = pkt->u.raw.entry_count;
|
|
|
|
|
|
- qlt_24xx_atio_pkt_all_vps(vha, (struct atio_from_isp *)pkt,
|
|
|
- ha_locked);
|
|
|
+ if (unlikely(fcpcmd_is_corrupted(ha->tgt.atio_ring_ptr))) {
|
|
|
+ /*
|
|
|
+ * This packet is corrupted. The header + payload
|
|
|
+ * can not be trusted. There is no point in passing
|
|
|
+ * it further up.
|
|
|
+ */
|
|
|
+ ql_log(ql_log_warn, vha, 0xffff,
|
|
|
+ "corrupted fcp frame SID[%3phN] OXID[%04x] EXCG[%x] %64phN\n",
|
|
|
+ pkt->u.isp24.fcp_hdr.s_id,
|
|
|
+ be16_to_cpu(pkt->u.isp24.fcp_hdr.ox_id),
|
|
|
+ le32_to_cpu(pkt->u.isp24.exchange_addr), pkt);
|
|
|
+
|
|
|
+ adjust_corrupted_atio(pkt);
|
|
|
+ qlt_send_term_exchange(vha, NULL, pkt, ha_locked, 0);
|
|
|
+ } else {
|
|
|
+ qlt_24xx_atio_pkt_all_vps(vha,
|
|
|
+ (struct atio_from_isp *)pkt, ha_locked);
|
|
|
+ }
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
|
ha->tgt.atio_ring_index++;
|
|
@@ -6545,6 +6559,13 @@ qlt_24xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_24xx *nv)
|
|
|
|
|
|
/* Disable Full Login after LIP */
|
|
|
nv->host_p &= cpu_to_le32(~BIT_10);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * clear BIT 15 explicitly as we have seen at least
|
|
|
+ * a couple of instances where this was set and this
|
|
|
+ * was causing the firmware to not be initialized.
|
|
|
+ */
|
|
|
+ nv->firmware_options_1 &= cpu_to_le32(~BIT_15);
|
|
|
/* Enable target PRLI control */
|
|
|
nv->firmware_options_2 |= cpu_to_le32(BIT_14);
|
|
|
} else {
|
|
@@ -6560,9 +6581,6 @@ qlt_24xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_24xx *nv)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- /* out-of-order frames reassembly */
|
|
|
- nv->firmware_options_3 |= BIT_6|BIT_9;
|
|
|
-
|
|
|
if (ha->tgt.enable_class_2) {
|
|
|
if (vha->flags.init_done)
|
|
|
fc_host_supported_classes(vha->host) =
|
|
@@ -6629,11 +6647,17 @@ qlt_81xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_81xx *nv)
|
|
|
/* Disable ini mode, if requested */
|
|
|
if (!qla_ini_mode_enabled(vha))
|
|
|
nv->firmware_options_1 |= cpu_to_le32(BIT_5);
|
|
|
-
|
|
|
/* Disable Full Login after LIP */
|
|
|
nv->firmware_options_1 &= cpu_to_le32(~BIT_13);
|
|
|
/* Enable initial LIP */
|
|
|
nv->firmware_options_1 &= cpu_to_le32(~BIT_9);
|
|
|
+ /*
|
|
|
+ * clear BIT 15 explicitly as we have seen at
|
|
|
+ * least a couple of instances where this was set
|
|
|
+ * and this was causing the firmware to not be
|
|
|
+ * initialized.
|
|
|
+ */
|
|
|
+ nv->firmware_options_1 &= cpu_to_le32(~BIT_15);
|
|
|
if (ql2xtgt_tape_enable)
|
|
|
/* Enable FC tape support */
|
|
|
nv->firmware_options_2 |= cpu_to_le32(BIT_12);
|
|
@@ -6658,9 +6682,6 @@ qlt_81xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_81xx *nv)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- /* out-of-order frames reassembly */
|
|
|
- nv->firmware_options_3 |= BIT_6|BIT_9;
|
|
|
-
|
|
|
if (ha->tgt.enable_class_2) {
|
|
|
if (vha->flags.init_done)
|
|
|
fc_host_supported_classes(vha->host) =
|