1 /* QLogic qed NIC Driver
2  * Copyright (c) 2015-2017  QLogic Corporation
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and /or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32 
33 #ifndef __STORAGE_COMMON__
34 #define __STORAGE_COMMON__
35 
36 /*********************/
37 /* SCSI CONSTANTS */
38 /*********************/
39 
40 #define SCSI_MAX_NUM_OF_CMDQS		(NUM_OF_GLOBAL_QUEUES / 2)
41 #define BDQ_NUM_RESOURCES		(4)
42 
43 #define BDQ_ID_RQ			(0)
44 #define BDQ_ID_IMM_DATA			(1)
45 #define BDQ_ID_TQ			(2)
46 #define BDQ_NUM_IDS			(3)
47 
48 #define SCSI_NUM_SGES_SLOW_SGL_THR	8
49 
50 #define BDQ_MAX_EXTERNAL_RING_SIZE	BIT(15)
51 
52 /* SCSI op codes */
53 #define SCSI_OPCODE_COMPARE_AND_WRITE	(0x89)
54 #define SCSI_OPCODE_READ_10		(0x28)
55 #define SCSI_OPCODE_WRITE_6		(0x0A)
56 #define SCSI_OPCODE_WRITE_10		(0x2A)
57 #define SCSI_OPCODE_WRITE_12		(0xAA)
58 #define SCSI_OPCODE_WRITE_16		(0x8A)
59 #define SCSI_OPCODE_WRITE_AND_VERIFY_10	(0x2E)
60 #define SCSI_OPCODE_WRITE_AND_VERIFY_12	(0xAE)
61 #define SCSI_OPCODE_WRITE_AND_VERIFY_16	(0x8E)
62 
63 /* iSCSI Drv opaque */
64 struct iscsi_drv_opaque {
65 	__le16 reserved_zero[3];
66 	__le16 opaque;
67 };
68 
69 /* Scsi 2B/8B opaque union */
70 union scsi_opaque {
71 	struct regpair fcoe_opaque;
72 	struct iscsi_drv_opaque iscsi_opaque;
73 };
74 
75 /* SCSI buffer descriptor */
76 struct scsi_bd {
77 	struct regpair address;
78 	union scsi_opaque opaque;
79 };
80 
81 /* Scsi Drv BDQ struct */
82 struct scsi_bdq_ram_drv_data {
83 	__le16 external_producer;
84 	__le16 reserved0[3];
85 };
86 
87 /* SCSI SGE entry */
88 struct scsi_sge {
89 	struct regpair sge_addr;
90 	__le32 sge_len;
91 	__le32 reserved;
92 };
93 
94 /* Cached SGEs section */
95 struct scsi_cached_sges {
96 	struct scsi_sge sge[4];
97 };
98 
99 /* Scsi Drv CMDQ struct */
100 struct scsi_drv_cmdq {
101 	__le16 cmdq_cons;
102 	__le16 reserved0;
103 	__le32 reserved1;
104 };
105 
106 /* Common SCSI init params passed by driver to FW in function init ramrod */
107 struct scsi_init_func_params {
108 	__le16 num_tasks;
109 	u8 log_page_size;
110 	u8 debug_mode;
111 	u8 reserved2[12];
112 };
113 
114 /* SCSI RQ/CQ/CMDQ firmware function init parameters */
115 struct scsi_init_func_queues {
116 	struct regpair glbl_q_params_addr;
117 	__le16 rq_buffer_size;
118 	__le16 cq_num_entries;
119 	__le16 cmdq_num_entries;
120 	u8 bdq_resource_id;
121 	u8 q_validity;
122 #define SCSI_INIT_FUNC_QUEUES_RQ_VALID_MASK			0x1
123 #define SCSI_INIT_FUNC_QUEUES_RQ_VALID_SHIFT			0
124 #define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_MASK		0x1
125 #define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_SHIFT		1
126 #define SCSI_INIT_FUNC_QUEUES_CMD_VALID_MASK			0x1
127 #define SCSI_INIT_FUNC_QUEUES_CMD_VALID_SHIFT			2
128 #define SCSI_INIT_FUNC_QUEUES_TQ_VALID_MASK			0x1
129 #define SCSI_INIT_FUNC_QUEUES_TQ_VALID_SHIFT			3
130 #define SCSI_INIT_FUNC_QUEUES_SOC_EN_MASK			0x1
131 #define SCSI_INIT_FUNC_QUEUES_SOC_EN_SHIFT			4
132 #define SCSI_INIT_FUNC_QUEUES_SOC_NUM_OF_BLOCKS_LOG_MASK	0x7
133 #define SCSI_INIT_FUNC_QUEUES_SOC_NUM_OF_BLOCKS_LOG_SHIFT	5
134 	__le16 cq_cmdq_sb_num_arr[SCSI_MAX_NUM_OF_CMDQS];
135 	u8 num_queues;
136 	u8 queue_relative_offset;
137 	u8 cq_sb_pi;
138 	u8 cmdq_sb_pi;
139 	u8 bdq_pbl_num_entries[BDQ_NUM_IDS];
140 	u8 reserved1;
141 	struct regpair bdq_pbl_base_address[BDQ_NUM_IDS];
142 	__le16 bdq_xoff_threshold[BDQ_NUM_IDS];
143 	__le16 cmdq_xoff_threshold;
144 	__le16 bdq_xon_threshold[BDQ_NUM_IDS];
145 	__le16 cmdq_xon_threshold;
146 };
147 
148 /* Scsi Drv BDQ Data struct (2 BDQ IDs: 0 - RQ, 1 - Immediate Data) */
149 struct scsi_ram_per_bdq_resource_drv_data {
150 	struct scsi_bdq_ram_drv_data drv_data_per_bdq_id[BDQ_NUM_IDS];
151 };
152 
153 /* SCSI SGL types */
154 enum scsi_sgl_mode {
155 	SCSI_TX_SLOW_SGL,
156 	SCSI_FAST_SGL,
157 	MAX_SCSI_SGL_MODE
158 };
159 
160 /* SCSI SGL parameters */
161 struct scsi_sgl_params {
162 	struct regpair sgl_addr;
163 	__le32 sgl_total_length;
164 	__le32 sge_offset;
165 	__le16 sgl_num_sges;
166 	u8 sgl_index;
167 	u8 reserved;
168 };
169 
170 /* SCSI terminate connection params */
171 struct scsi_terminate_extra_params {
172 	__le16 unsolicited_cq_count;
173 	__le16 cmdq_count;
174 	u8 reserved[4];
175 };
176 
177 /* SCSI Task Queue Element */
178 struct scsi_tqe {
179 	__le16 itid;
180 };
181 
182 #endif /* __STORAGE_COMMON__ */
183