162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * QLogic Fibre Channel HBA Driver 462306a36Sopenharmony_ci * Copyright (c) 2003-2017 QLogic Corporation 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef __QLA_NVME_H 762306a36Sopenharmony_ci#define __QLA_NVME_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <uapi/scsi/fc/fc_fs.h> 1062306a36Sopenharmony_ci#include <uapi/scsi/fc/fc_els.h> 1162306a36Sopenharmony_ci#include <linux/nvme-fc-driver.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "qla_def.h" 1462306a36Sopenharmony_ci#include "qla_dsd.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define MIN_NVME_HW_QUEUES 1 1762306a36Sopenharmony_ci#define DEF_NVME_HW_QUEUES 8 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define NVME_ATIO_CMD_OFF 32 2062306a36Sopenharmony_ci#define NVME_FIRST_PACKET_CMDLEN (64 - NVME_ATIO_CMD_OFF) 2162306a36Sopenharmony_ci#define Q2T_NVME_NUM_TAGS 2048 2262306a36Sopenharmony_ci#define QLA_MAX_FC_SEGMENTS 64 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct qla_nvme_unsol_ctx; 2562306a36Sopenharmony_cistruct scsi_qla_host; 2662306a36Sopenharmony_cistruct qla_hw_data; 2762306a36Sopenharmony_cistruct req_que; 2862306a36Sopenharmony_cistruct srb; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct nvme_private { 3162306a36Sopenharmony_ci struct srb *sp; 3262306a36Sopenharmony_ci struct nvmefc_ls_req *fd; 3362306a36Sopenharmony_ci struct work_struct ls_work; 3462306a36Sopenharmony_ci struct work_struct abort_work; 3562306a36Sopenharmony_ci int comp_status; 3662306a36Sopenharmony_ci spinlock_t cmd_lock; 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct qla_nvme_rport { 4062306a36Sopenharmony_ci struct fc_port *fcport; 4162306a36Sopenharmony_ci struct qla_nvme_unsol_ctx *uctx; 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define COMMAND_NVME 0x88 /* Command Type FC-NVMe IOCB */ 4562306a36Sopenharmony_cistruct cmd_nvme { 4662306a36Sopenharmony_ci uint8_t entry_type; /* Entry type. */ 4762306a36Sopenharmony_ci uint8_t entry_count; /* Entry count. */ 4862306a36Sopenharmony_ci uint8_t sys_define; /* System defined. */ 4962306a36Sopenharmony_ci uint8_t entry_status; /* Entry Status. */ 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci uint32_t handle; /* System handle. */ 5262306a36Sopenharmony_ci __le16 nport_handle; /* N_PORT handle. */ 5362306a36Sopenharmony_ci __le16 timeout; /* Command timeout. */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci __le16 dseg_count; /* Data segment count. */ 5662306a36Sopenharmony_ci __le16 nvme_rsp_dsd_len; /* NVMe RSP DSD length */ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci uint64_t rsvd; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci __le16 control_flags; /* Control Flags */ 6162306a36Sopenharmony_ci#define CF_ADMIN_ASYNC_EVENT BIT_13 6262306a36Sopenharmony_ci#define CF_NVME_FIRST_BURST_ENABLE BIT_11 6362306a36Sopenharmony_ci#define CF_DIF_SEG_DESCR_ENABLE BIT_3 6462306a36Sopenharmony_ci#define CF_DATA_SEG_DESCR_ENABLE BIT_2 6562306a36Sopenharmony_ci#define CF_READ_DATA BIT_1 6662306a36Sopenharmony_ci#define CF_WRITE_DATA BIT_0 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci __le16 nvme_cmnd_dseg_len; /* Data segment length. */ 6962306a36Sopenharmony_ci __le64 nvme_cmnd_dseg_address __packed;/* Data segment address. */ 7062306a36Sopenharmony_ci __le64 nvme_rsp_dseg_address __packed; /* Data segment address. */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci __le32 byte_count; /* Total byte count. */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci uint8_t port_id[3]; /* PortID of destination port. */ 7562306a36Sopenharmony_ci uint8_t vp_index; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci struct dsd64 nvme_dsd; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define PURLS_MSLEEP_INTERVAL 1 8162306a36Sopenharmony_ci#define PURLS_RETRY_COUNT 5 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define PT_LS4_REQUEST 0x89 /* Link Service pass-through IOCB (request) */ 8462306a36Sopenharmony_cistruct pt_ls4_request { 8562306a36Sopenharmony_ci uint8_t entry_type; 8662306a36Sopenharmony_ci uint8_t entry_count; 8762306a36Sopenharmony_ci uint8_t sys_define; 8862306a36Sopenharmony_ci uint8_t entry_status; 8962306a36Sopenharmony_ci uint32_t handle; 9062306a36Sopenharmony_ci __le16 status; 9162306a36Sopenharmony_ci __le16 nport_handle; 9262306a36Sopenharmony_ci __le16 tx_dseg_count; 9362306a36Sopenharmony_ci uint8_t vp_index; 9462306a36Sopenharmony_ci uint8_t rsvd; 9562306a36Sopenharmony_ci __le16 timeout; 9662306a36Sopenharmony_ci __le16 control_flags; 9762306a36Sopenharmony_ci#define CF_LS4_SHIFT 13 9862306a36Sopenharmony_ci#define CF_LS4_ORIGINATOR 0 9962306a36Sopenharmony_ci#define CF_LS4_RESPONDER 1 10062306a36Sopenharmony_ci#define CF_LS4_RESPONDER_TERM 2 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci __le16 rx_dseg_count; 10362306a36Sopenharmony_ci __le16 rsvd2; 10462306a36Sopenharmony_ci __le32 exchange_address; 10562306a36Sopenharmony_ci __le32 rsvd3; 10662306a36Sopenharmony_ci __le32 rx_byte_count; 10762306a36Sopenharmony_ci __le32 tx_byte_count; 10862306a36Sopenharmony_ci struct dsd64 dsd[2]; 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define PT_LS4_UNSOL 0x56 /* pass-up unsolicited rec FC-NVMe request */ 11262306a36Sopenharmony_cistruct pt_ls4_rx_unsol { 11362306a36Sopenharmony_ci uint8_t entry_type; 11462306a36Sopenharmony_ci uint8_t entry_count; 11562306a36Sopenharmony_ci __le16 rsvd0; 11662306a36Sopenharmony_ci __le16 rsvd1; 11762306a36Sopenharmony_ci uint8_t vp_index; 11862306a36Sopenharmony_ci uint8_t rsvd2; 11962306a36Sopenharmony_ci __le16 rsvd3; 12062306a36Sopenharmony_ci __le16 nport_handle; 12162306a36Sopenharmony_ci __le16 frame_size; 12262306a36Sopenharmony_ci __le16 rsvd4; 12362306a36Sopenharmony_ci __le32 exchange_address; 12462306a36Sopenharmony_ci uint8_t d_id[3]; 12562306a36Sopenharmony_ci uint8_t r_ctl; 12662306a36Sopenharmony_ci le_id_t s_id; 12762306a36Sopenharmony_ci uint8_t cs_ctl; 12862306a36Sopenharmony_ci uint8_t f_ctl[3]; 12962306a36Sopenharmony_ci uint8_t type; 13062306a36Sopenharmony_ci __le16 seq_cnt; 13162306a36Sopenharmony_ci uint8_t df_ctl; 13262306a36Sopenharmony_ci uint8_t seq_id; 13362306a36Sopenharmony_ci __le16 rx_id; 13462306a36Sopenharmony_ci __le16 ox_id; 13562306a36Sopenharmony_ci __le32 desc0; 13662306a36Sopenharmony_ci#define PT_LS4_PAYLOAD_OFFSET 0x2c 13762306a36Sopenharmony_ci#define PT_LS4_FIRST_PACKET_LEN 20 13862306a36Sopenharmony_ci __le32 payload[5]; 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci/* 14262306a36Sopenharmony_ci * Global functions prototype in qla_nvme.c source file. 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_ciint qla_nvme_register_hba(struct scsi_qla_host *); 14562306a36Sopenharmony_ciint qla_nvme_register_remote(struct scsi_qla_host *, struct fc_port *); 14662306a36Sopenharmony_civoid qla_nvme_delete(struct scsi_qla_host *); 14762306a36Sopenharmony_civoid qla24xx_nvme_ls4_iocb(struct scsi_qla_host *, struct pt_ls4_request *, 14862306a36Sopenharmony_ci struct req_que *); 14962306a36Sopenharmony_civoid qla24xx_async_gffid_sp_done(struct srb *sp, int); 15062306a36Sopenharmony_ci#endif 151