xref: /OK3568_Linux_fs/kernel/drivers/scsi/qla2xxx/qla_nvme.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * QLogic Fibre Channel HBA Driver
4*4882a593Smuzhiyun  * Copyright (c)  2003-2017 QLogic Corporation
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef __QLA_NVME_H
7*4882a593Smuzhiyun #define __QLA_NVME_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <uapi/scsi/fc/fc_fs.h>
10*4882a593Smuzhiyun #include <uapi/scsi/fc/fc_els.h>
11*4882a593Smuzhiyun #include <linux/nvme-fc-driver.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include "qla_def.h"
14*4882a593Smuzhiyun #include "qla_dsd.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define NVME_ATIO_CMD_OFF 32
17*4882a593Smuzhiyun #define NVME_FIRST_PACKET_CMDLEN (64 - NVME_ATIO_CMD_OFF)
18*4882a593Smuzhiyun #define Q2T_NVME_NUM_TAGS 2048
19*4882a593Smuzhiyun #define QLA_MAX_FC_SEGMENTS 64
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun struct scsi_qla_host;
22*4882a593Smuzhiyun struct qla_hw_data;
23*4882a593Smuzhiyun struct req_que;
24*4882a593Smuzhiyun struct srb;
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct nvme_private {
27*4882a593Smuzhiyun 	struct srb	*sp;
28*4882a593Smuzhiyun 	struct nvmefc_ls_req *fd;
29*4882a593Smuzhiyun 	struct work_struct ls_work;
30*4882a593Smuzhiyun 	struct work_struct abort_work;
31*4882a593Smuzhiyun 	int comp_status;
32*4882a593Smuzhiyun 	spinlock_t cmd_lock;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun struct qla_nvme_rport {
36*4882a593Smuzhiyun 	struct fc_port *fcport;
37*4882a593Smuzhiyun };
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define COMMAND_NVME    0x88            /* Command Type FC-NVMe IOCB */
40*4882a593Smuzhiyun struct cmd_nvme {
41*4882a593Smuzhiyun 	uint8_t entry_type;             /* Entry type. */
42*4882a593Smuzhiyun 	uint8_t entry_count;            /* Entry count. */
43*4882a593Smuzhiyun 	uint8_t sys_define;             /* System defined. */
44*4882a593Smuzhiyun 	uint8_t entry_status;           /* Entry Status. */
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	uint32_t handle;                /* System handle. */
47*4882a593Smuzhiyun 	__le16	nport_handle;		/* N_PORT handle. */
48*4882a593Smuzhiyun 	__le16	timeout;		/* Command timeout. */
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	__le16	dseg_count;		/* Data segment count. */
51*4882a593Smuzhiyun 	__le16	nvme_rsp_dsd_len;	/* NVMe RSP DSD length */
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	uint64_t rsvd;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	__le16	control_flags;		/* Control Flags */
56*4882a593Smuzhiyun #define CF_ADMIN_ASYNC_EVENT		BIT_13
57*4882a593Smuzhiyun #define CF_NVME_FIRST_BURST_ENABLE	BIT_11
58*4882a593Smuzhiyun #define CF_DIF_SEG_DESCR_ENABLE         BIT_3
59*4882a593Smuzhiyun #define CF_DATA_SEG_DESCR_ENABLE        BIT_2
60*4882a593Smuzhiyun #define CF_READ_DATA                    BIT_1
61*4882a593Smuzhiyun #define CF_WRITE_DATA                   BIT_0
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	__le16	nvme_cmnd_dseg_len;             /* Data segment length. */
64*4882a593Smuzhiyun 	__le64	 nvme_cmnd_dseg_address __packed;/* Data segment address. */
65*4882a593Smuzhiyun 	__le64	 nvme_rsp_dseg_address __packed; /* Data segment address. */
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	__le32	byte_count;		/* Total byte count. */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	uint8_t port_id[3];             /* PortID of destination port. */
70*4882a593Smuzhiyun 	uint8_t vp_index;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	struct dsd64 nvme_dsd;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define PT_LS4_REQUEST 0x89	/* Link Service pass-through IOCB (request) */
76*4882a593Smuzhiyun struct pt_ls4_request {
77*4882a593Smuzhiyun 	uint8_t entry_type;
78*4882a593Smuzhiyun 	uint8_t entry_count;
79*4882a593Smuzhiyun 	uint8_t sys_define;
80*4882a593Smuzhiyun 	uint8_t entry_status;
81*4882a593Smuzhiyun 	uint32_t handle;
82*4882a593Smuzhiyun 	__le16	status;
83*4882a593Smuzhiyun 	__le16	nport_handle;
84*4882a593Smuzhiyun 	__le16	tx_dseg_count;
85*4882a593Smuzhiyun 	uint8_t  vp_index;
86*4882a593Smuzhiyun 	uint8_t  rsvd;
87*4882a593Smuzhiyun 	__le16	timeout;
88*4882a593Smuzhiyun 	__le16	control_flags;
89*4882a593Smuzhiyun #define CF_LS4_SHIFT		13
90*4882a593Smuzhiyun #define CF_LS4_ORIGINATOR	0
91*4882a593Smuzhiyun #define CF_LS4_RESPONDER	1
92*4882a593Smuzhiyun #define CF_LS4_RESPONDER_TERM	2
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	__le16	rx_dseg_count;
95*4882a593Smuzhiyun 	__le16	rsvd2;
96*4882a593Smuzhiyun 	__le32	exchange_address;
97*4882a593Smuzhiyun 	__le32	rsvd3;
98*4882a593Smuzhiyun 	__le32	rx_byte_count;
99*4882a593Smuzhiyun 	__le32	tx_byte_count;
100*4882a593Smuzhiyun 	struct dsd64 dsd[2];
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define PT_LS4_UNSOL 0x56	/* pass-up unsolicited rec FC-NVMe request */
104*4882a593Smuzhiyun struct pt_ls4_rx_unsol {
105*4882a593Smuzhiyun 	uint8_t entry_type;
106*4882a593Smuzhiyun 	uint8_t entry_count;
107*4882a593Smuzhiyun 	__le16	rsvd0;
108*4882a593Smuzhiyun 	__le16	rsvd1;
109*4882a593Smuzhiyun 	uint8_t vp_index;
110*4882a593Smuzhiyun 	uint8_t rsvd2;
111*4882a593Smuzhiyun 	__le16	rsvd3;
112*4882a593Smuzhiyun 	__le16	nport_handle;
113*4882a593Smuzhiyun 	__le16	frame_size;
114*4882a593Smuzhiyun 	__le16	rsvd4;
115*4882a593Smuzhiyun 	__le32	exchange_address;
116*4882a593Smuzhiyun 	uint8_t d_id[3];
117*4882a593Smuzhiyun 	uint8_t r_ctl;
118*4882a593Smuzhiyun 	be_id_t s_id;
119*4882a593Smuzhiyun 	uint8_t cs_ctl;
120*4882a593Smuzhiyun 	uint8_t f_ctl[3];
121*4882a593Smuzhiyun 	uint8_t type;
122*4882a593Smuzhiyun 	__le16	seq_cnt;
123*4882a593Smuzhiyun 	uint8_t df_ctl;
124*4882a593Smuzhiyun 	uint8_t seq_id;
125*4882a593Smuzhiyun 	__le16	rx_id;
126*4882a593Smuzhiyun 	__le16	ox_id;
127*4882a593Smuzhiyun 	__le32	param;
128*4882a593Smuzhiyun 	__le32	desc0;
129*4882a593Smuzhiyun #define PT_LS4_PAYLOAD_OFFSET 0x2c
130*4882a593Smuzhiyun #define PT_LS4_FIRST_PACKET_LEN 20
131*4882a593Smuzhiyun 	__le32	desc_len;
132*4882a593Smuzhiyun 	__le32	payload[3];
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /*
136*4882a593Smuzhiyun  * Global functions prototype in qla_nvme.c source file.
137*4882a593Smuzhiyun  */
138*4882a593Smuzhiyun int qla_nvme_register_hba(struct scsi_qla_host *);
139*4882a593Smuzhiyun int  qla_nvme_register_remote(struct scsi_qla_host *, struct fc_port *);
140*4882a593Smuzhiyun void qla_nvme_delete(struct scsi_qla_host *);
141*4882a593Smuzhiyun void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *, struct pt_ls4_request *,
142*4882a593Smuzhiyun     struct req_que *);
143*4882a593Smuzhiyun void qla24xx_async_gffid_sp_done(struct srb *sp, int);
144*4882a593Smuzhiyun #endif
145