summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_nvme.h
blob: dfe56f207b28dc540e5549c8565ab36df9cc7d8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * QLogic Fibre Channel HBA Driver
 * Copyright (c)  2003-2017 QLogic Corporation
 *
 * See LICENSE.qla2xxx for copyright and licensing details.
 */
#ifndef __QLA_NVME_H
#define __QLA_NVME_H

#include <linux/blk-mq.h>
#include <uapi/scsi/fc/fc_fs.h>
#include <uapi/scsi/fc/fc_els.h>
#include <linux/nvme-fc-driver.h>

#define NVME_ATIO_CMD_OFF 32
#define NVME_FIRST_PACKET_CMDLEN (64 - NVME_ATIO_CMD_OFF)
#define Q2T_NVME_NUM_TAGS 2048
#define QLA_MAX_FC_SEGMENTS 64

struct srb;
struct nvme_private {
	struct srb	*sp;
	struct nvmefc_ls_req *fd;
	struct work_struct ls_work;
	int comp_status;
};

struct nvme_rport {
	struct nvme_fc_port_info req;
	struct list_head list;
	struct fc_port *fcport;
};

#define COMMAND_NVME    0x88            /* Command Type FC-NVMe IOCB */
struct cmd_nvme {
	uint8_t entry_type;             /* Entry type. */
	uint8_t entry_count;            /* Entry count. */
	uint8_t sys_define;             /* System defined. */
	uint8_t entry_status;           /* Entry Status. */

	uint32_t handle;                /* System handle. */
	uint16_t nport_handle;          /* N_PORT handle. */
	uint16_t timeout;               /* Command timeout. */

	uint16_t dseg_count;            /* Data segment count. */
	uint16_t nvme_rsp_dsd_len;      /* NVMe RSP DSD length */

	uint64_t rsvd;

	uint16_t control_flags;         /* Control Flags */
#define CF_NVME_ENABLE                  BIT_9
#define CF_DIF_SEG_DESCR_ENABLE         BIT_3
#define CF_DATA_SEG_DESCR_ENABLE        BIT_2
#define CF_READ_DATA                    BIT_1
#define CF_WRITE_DATA                   BIT_0

	uint16_t nvme_cmnd_dseg_len;             /* Data segment length. */
	uint32_t nvme_cmnd_dseg_address[2];      /* Data segment address. */
	uint32_t nvme_rsp_dseg_address[2];       /* Data segment address. */

	uint32_t byte_count;            /* Total byte count. */

	uint8_t port_id[3];             /* PortID of destination port. */
	uint8_t vp_index;

	uint32_t nvme_data_dseg_address[2];      /* Data segment address. */
	uint32_t nvme_data_dseg_len;             /* Data segment length. */
};

#define PT_LS4_REQUEST 0x89	/* Link Service pass-through IOCB (request) */
struct pt_ls4_request {
	uint8_t entry_type;
	uint8_t entry_count;
	uint8_t sys_define;
	uint8_t entry_status;
	uint32_t handle;
	uint16_t status;
	uint16_t nport_handle;
	uint16_t tx_dseg_count;
	uint8_t  vp_index;
	uint8_t  rsvd;
	uint16_t timeout;
	uint16_t control_flags;
#define CF_LS4_SHIFT		13
#define CF_LS4_ORIGINATOR	0
#define CF_LS4_RESPONDER	1
#define CF_LS4_RESPONDER_TERM	2

	uint16_t rx_dseg_count;
	uint16_t rsvd2;
	uint32_t exchange_address;
	uint32_t rsvd3;
	uint32_t rx_byte_count;
	uint32_t tx_byte_count;
	uint32_t dseg0_address[2];
	uint32_t dseg0_len;
	uint32_t dseg1_address[2];
	uint32_t dseg1_len;
};

#define PT_LS4_UNSOL 0x56	/* pass-up unsolicited rec FC-NVMe request */
struct pt_ls4_rx_unsol {
	uint8_t entry_type;
	uint8_t entry_count;
	uint16_t rsvd0;
	uint16_t rsvd1;
	uint8_t vp_index;
	uint8_t rsvd2;
	uint16_t rsvd3;
	uint16_t nport_handle;
	uint16_t frame_size;
	uint16_t rsvd4;
	uint32_t exchange_address;
	uint8_t d_id[3];
	uint8_t r_ctl;
	uint8_t s_id[3];
	uint8_t cs_ctl;
	uint8_t f_ctl[3];
	uint8_t type;
	uint16_t seq_cnt;
	uint8_t df_ctl;
	uint8_t seq_id;
	uint16_t rx_id;
	uint16_t ox_id;
	uint32_t param;
	uint32_t desc0;
#define PT_LS4_PAYLOAD_OFFSET 0x2c
#define PT_LS4_FIRST_PACKET_LEN 20
	uint32_t desc_len;
	uint32_t payload[3];
};
#endif