@@ -67,6 +67,7 @@
* | Target Mode Management | 0xf09b | 0xf002 |
* | | | 0xf046-0xf049 |
* | Target Mode Task Management | 0x1000d | |
+ * | NVME | 0x11000 | |
* ----------------------------------------------------------------------
*/
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char *fmt, ...);
#define ql_dbg_tgt_tmr 0x00001000 /* Target mode task management */
#define ql_dbg_tgt_dif 0x00000800 /* Target mode dif */
+#define ql_dbg_nvme 0x00000400 /* NVME Target */
+
extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
- if (sp && (sp->type != SRB_SCSI_CMD)) {
+ if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3433,6 +3433,40 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx *logio)
logio->vp_index = sp->fcport->vha->vp_idx;
}
+/*
+ * Build NVMET LS response
+ */
+static int
+qla_nvmet_ls(srb_t *sp, struct pt_ls4_request *rsp_pkt)
+{
+ struct srb_iocb *nvme;
+ int rval = QLA_SUCCESS;
+
+ nvme = &sp->u.iocb_cmd;
+
+ rsp_pkt->entry_type = PT_LS4_REQUEST;
+ rsp_pkt->entry_count = 1;
+ rsp_pkt->control_flags = cpu_to_le16(CF_LS4_RESPONDER << CF_LS4_SHIFT);
+ rsp_pkt->handle = sp->handle;
+
+ rsp_pkt->nport_handle = sp->fcport->loop_id;
+ rsp_pkt->vp_index = nvme->u.nvme.vp_index;
+ rsp_pkt->exchange_address = cpu_to_le32(nvme->u.nvme.exchange_address);
+
+ rsp_pkt->tx_dseg_count = 1;
+ rsp_pkt->tx_byte_count = cpu_to_le16(nvme->u.nvme.rsp_len);
+ rsp_pkt->dseg0_len = cpu_to_le16(nvme->u.nvme.rsp_len);
+ rsp_pkt->dseg0_address[0] = cpu_to_le32(LSD(nvme->u.nvme.rsp_dma));
+ rsp_pkt->dseg0_address[1] = cpu_to_le32(MSD(nvme->u.nvme.rsp_dma));
+
+ ql_log(ql_log_info, sp->vha, 0xffff,
+ "Dumping the NVME-LS response IOCB\n");
+ ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, sp->vha, 0x2075,
+ (uint8_t *)rsp_pkt, sizeof(*rsp_pkt));
+
+ return rval;
+}
+
int
qla2x00_start_sp(srb_t *sp)
{
@@ -3493,6 +3527,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+ case SRB_NVMET_LS:
+ qla_nvmet_ls(sp, pkt);
+ break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3518,6 +3555,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+ case SRB_NVME_ELS_RSP:
+ qlt_send_els_resp(sp, pkt);
+ break;
default:
break;
}