xref: /illumos-gate/usr/src/uts/sun/sys/socal_cq_defs.h (revision 2aeafac3612e19716bf8164f89c3c9196342979c)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 1998 Sun Microsystems, Inc. All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_SOCAL_CQ_DEFS_H
27 #define	_SYS_SOCAL_CQ_DEFS_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #define	SOC_CQE_PAYLOAD 60
36 
37 /*
38  * define the CQ_HEADER for the soc command queue.
39  */
40 
41 typedef struct	cq_hdr {
42 	uchar_t	cq_hdr_count;
43 	uchar_t	cq_hdr_type;
44 	uchar_t	cq_hdr_flags;
45 	uchar_t	cq_hdr_seqno;
46 } cq_hdr_t;
47 
48 /*
49  * Command Queue entry description.
50  */
51 
52 typedef struct cqe {
53 	uchar_t		cqe_payload[SOC_CQE_PAYLOAD];
54 	cq_hdr_t	cqe_hdr;
55 } cqe_t;
56 
57 /*
58  * CQ Entry types.
59  */
60 
61 #define	CQ_TYPE_NOP		0x00
62 #define	CQ_TYPE_OUTBOUND	0x01
63 #define	CQ_TYPE_INBOUND		0x02
64 #define	CQ_TYPE_SIMPLE		0x03
65 #define	CQ_TYPE_IO_WRITE	0x04
66 #define	CQ_TYPE_IO_READ		0x05
67 #define	CQ_TYPE_UNSOLICITED	0x06
68 #define	CQ_TYPE_BYPASS_DEV	0x06	/* supercedes unsolicited in SOC+ */
69 #define	CQ_TYPE_DIAGNOSTIC	0x07
70 #define	CQ_TYPE_OFFLINE		0x08
71 #define	CQ_TYPE_ADD_POOL	0x09	/* SOC+ enhancement */
72 #define	CQ_TYPE_DELETE_POOL	0x0a	/* SOC+ enhancement */
73 #define	CQ_TYPE_ADD_BUFFER	0x0b	/* SOC+ enhancement */
74 #define	CQ_TYPE_ADD_POOL_BUFFER	0x0c	/* SOC+ enhancement */
75 #define	CQ_TYPE_REQUEST_ABORT	0x0d	/* SOC+ enhnacement */
76 #define	CQ_TYPE_REQUEST_LIP	0x0e	/* SOC+ enhancement */
77 #define	CQ_TYPE_REPORT_MAP	0x0f	/* SOC+ enhancement */
78 #define	CQ_TYPE_RESPONSE	0x10
79 #define	CQ_TYPE_INLINE		0x20
80 
81 /*
82  * CQ Entry Flags
83  */
84 
85 #define	CQ_FLAG_CONTINUATION	0x01
86 #define	CQ_FLAG_FULL		0x02
87 #define	CQ_FLAG_BADHEADER	0x04
88 #define	CQ_FLAG_BADPACKET	0x08
89 
90 /*
91  * CQ Descriptor Definition.
92  */
93 
94 typedef	struct cq {
95 	uint32_t	cq_address;
96 	uchar_t		cq_in;
97 	uchar_t		cq_out;
98 	uchar_t		cq_last_index;
99 	uchar_t		cq_seqno;
100 } soc_cq_t;
101 
102 /*
103  * SOC header definition.
104  */
105 
106 typedef struct soc_hdr {
107 	uint_t		sh_request_token;
108 	ushort_t	sh_flags;
109 	uchar_t		sh_class;
110 	uchar_t		sh_seg_cnt;
111 	uint_t		sh_byte_cnt;
112 } soc_header_t;
113 
114 /*
115  * SOC header request packet definition.
116  */
117 
118 typedef struct soc_request {
119 	soc_header_t		sr_soc_hdr;
120 	fc_dataseg_t		sr_dataseg[3];
121 	fc_frame_header_t	sr_fc_frame_hdr;
122 	cq_hdr_t		sr_cqhdr;
123 } soc_request_t;
124 
125 typedef	soc_request_t soc_header_request_t;
126 
127 /*
128  * SOC header response packet definition.
129  */
130 
131 typedef struct soc_response {
132 	soc_header_t		sr_soc_hdr;
133 	uint_t			sr_soc_status;
134 	fc_dataseg_t		sr_dataseg;
135 	uchar_t			sr_reserved[10];
136 	ushort_t 		sr_ncmds;
137 	fc_frame_header_t	sr_fc_frame_hdr;
138 	cq_hdr_t		sr_cqhdr;
139 } soc_response_t;
140 
141 /*
142  * SOC data request packet definition.
143  */
144 
145 typedef struct soc_data_request {
146 	soc_header_t		sdr_soc_hdr;
147 	fc_dataseg_t		sdr_dataseg[6];
148 	cq_hdr_t		sdr_cqhdr;
149 } soc_data_request_t;
150 
151 /*
152  * SOC+ (only) command-only packet definitiion
153  */
154 
155 typedef	struct soc_cmdonly_request {
156 	soc_header_t	scr_soc_hdr;
157 	uchar_t		reserved[48];
158 	cq_hdr_t	scr_cqhdr;
159 } soc_cmdonly_request_t;
160 
161 /*
162  * SOC+ (only) diagnostic request packet definition
163  */
164 
165 typedef	struct soc_diag_request {
166 	soc_header_t	sdr_soc_hdr;
167 	uint_t		sdr_diag_cmd;
168 	uchar_t		reserved[44];
169 	cq_hdr_t	sdr_cqhdr;
170 } soc_diag_request_t;
171 
172 #define	SOC_DIAG_NOP		0x00
173 #define	SOC_DIAG_INT_LOOP	0x01
174 #define	SOC_DIAG_EXT_LOOP	0x02
175 #define	SOC_DIAG_REM_LOOP	0x03
176 #define	SOC_DIAG_XRAM_TEST	0x04
177 #define	SOC_DIAG_SOC_TEST	0x05
178 #define	SOC_DIAG_HCB_TEST	0x06
179 #define	SOC_DIAG_SOCLB_TEST	0x07
180 #define	SOC_DIAG_SRDSLB_TEST	0x08
181 #define	SOC_DIAG_EXTOE_TEST	0x09
182 
183 /*
184  * SOC+ (only) pool request packet definition
185  */
186 
187 typedef	struct soc_pool_request {
188 	soc_header_t		spr_soc_hdr;
189 	uint_t		spr_pool_id;
190 	uint_t		spr_header_mask;
191 	uint_t		spr_buf_size;
192 	uint_t		spr_n_entries;
193 	uchar_t			reserved[8];
194 	fc_frame_header_t	spr_fc_frame_hdr;
195 	cq_hdr_t		spr_cqhdr;
196 } soc_pool_request_t;
197 
198 #define	SOCPR_MASK_RCTL		0x800000
199 #define	SOCPR_MASK_DID		0x700000
200 #define	SOCPR_MASK_SID		0x070000
201 #define	SOCPR_MASK_TYPE		0x008000
202 #define	SOCPR_MASK_F_CTL	0x007000
203 #define	SOCPR_MASK_SEQ_ID	0x000800
204 #define	SOCPR_MASK_D_CTL	0x000400
205 #define	SOCPR_MASK_SEQ_CNT	0x000300
206 #define	SOCPR_MASK_OX_ID	0x0000f0
207 #define	SOCPR_MASK_PARAMETER	0x0000f0
208 
209 
210 /*
211  * Macros for flags field
212  *
213  * values used in both RSP's and REQ's
214  */
215 #define	SOC_PORT_B	0x0001	/* entry to/from SOC Port B */
216 #define	SOC_FC_HEADER	0x0002	/* this entry contains an FC_HEADER */
217 /*
218  *	REQ: this request is supplying buffers
219  *	RSP: this pkt is unsolicited
220  */
221 #define	SOC_UNSOLICITED	0x0080
222 
223 /*
224  * values used only for REQ's
225  */
226 #define	SOC_NO_RESPONSE	0x0004 /* generate niether RSP nor INT */
227 #define	SOC_NO_INTR	0x0008 /* generate RSP only */
228 #define	SOC_XFER_RDY	0x0010 /* issue a XFRRDY packet for this cmd */
229 #define	SOC_IGNORE_RO	0x0020 /* ignore FC_HEADER relative offset */
230 #define	SOC_RESP_HEADER	0x0200	/* return frame header regardless of status */
231 
232 /*
233  * values used only for RSP's
234  */
235 #define	SOC_COMPLETE	0x0040 /* previous CMD completed. */
236 #define	SOC_STATUS	0x0100 /* a SOC status change has occurred */
237 
238 #define	CQ_SUCCESS	0x0
239 #define	CQ_FAILURE	0x1
240 #define	CQ_FULL		0x2
241 
242 #define	CQ_REQUEST_0	0
243 #define	CQ_REQUEST_1	1
244 #define	CQ_REQUEST_2	2
245 #define	CQ_REQUEST_3	3
246 
247 #define	CQ_RESPONSE_0	0
248 #define	CQ_RESPONSE_1	1
249 #define	CQ_RESPONSE_2	2
250 #define	CQ_RESPONSE_3	3
251 
252 #define	CQ_SOLICITED_OK		CQ_RESPONSE_0
253 #define	CQ_SOLICITED_BAD	CQ_RESPONSE_1
254 #define	CQ_UNSOLICITED		CQ_RESPONSE_2
255 
256 
257 typedef struct soc_request_descriptor {
258 	soc_request_t	*srd_sp;
259 	uint_t		srd_sp_count;
260 
261 	caddr_t		srd_cmd;
262 	uint_t		srd_cmd_count;
263 
264 	caddr_t		srd_data;
265 	uint_t		srd_data_count;
266 } soc_request_desc_t;
267 
268 
269 #ifdef __cplusplus
270 }
271 #endif
272 
273 #endif /* !_SYS_SOCAL_CQ_DEFS_H */
274