diff options
Diffstat (limited to 'drivers/scsi/bfa/include/protocol')
-rw-r--r-- | drivers/scsi/bfa/include/protocol/ct.h | 492 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/fc.h | 1105 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/fc_sp.h | 224 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/fcp.h | 186 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/fdmi.h | 163 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/pcifw.h | 75 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/scsi.h | 1648 | ||||
-rw-r--r-- | drivers/scsi/bfa/include/protocol/types.h | 42 |
8 files changed, 3935 insertions, 0 deletions
diff --git a/drivers/scsi/bfa/include/protocol/ct.h b/drivers/scsi/bfa/include/protocol/ct.h new file mode 100644 index 00000000000..c59d6630b07 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/ct.h | |||
@@ -0,0 +1,492 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __CT_H__ | ||
19 | #define __CT_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | |||
23 | #pragma pack(1) | ||
24 | |||
25 | struct ct_hdr_s{ | ||
26 | u32 rev_id:8; /* Revision of the CT */ | ||
27 | u32 in_id:24; /* Initiator Id */ | ||
28 | u32 gs_type:8; /* Generic service Type */ | ||
29 | u32 gs_sub_type:8; /* Generic service sub type */ | ||
30 | u32 options:8; /* options */ | ||
31 | u32 rsvrd:8; /* reserved */ | ||
32 | u32 cmd_rsp_code:16;/* ct command/response code */ | ||
33 | u32 max_res_size:16;/* maximum/residual size */ | ||
34 | u32 frag_id:8; /* fragment ID */ | ||
35 | u32 reason_code:8; /* reason code */ | ||
36 | u32 exp_code:8; /* explanation code */ | ||
37 | u32 vendor_unq:8; /* vendor unique */ | ||
38 | }; | ||
39 | |||
40 | /* | ||
41 | * defines for the Revision | ||
42 | */ | ||
43 | enum { | ||
44 | CT_GS3_REVISION = 0x01, | ||
45 | }; | ||
46 | |||
47 | /* | ||
48 | * defines for gs_type | ||
49 | */ | ||
50 | enum { | ||
51 | CT_GSTYPE_KEYSERVICE = 0xF7, | ||
52 | CT_GSTYPE_ALIASSERVICE = 0xF8, | ||
53 | CT_GSTYPE_MGMTSERVICE = 0xFA, | ||
54 | CT_GSTYPE_TIMESERVICE = 0xFB, | ||
55 | CT_GSTYPE_DIRSERVICE = 0xFC, | ||
56 | }; | ||
57 | |||
58 | /* | ||
59 | * defines for gs_sub_type for gs type directory service | ||
60 | */ | ||
61 | enum { | ||
62 | CT_GSSUBTYPE_NAMESERVER = 0x02, | ||
63 | }; | ||
64 | |||
65 | /* | ||
66 | * defines for gs_sub_type for gs type management service | ||
67 | */ | ||
68 | enum { | ||
69 | CT_GSSUBTYPE_CFGSERVER = 0x01, | ||
70 | CT_GSSUBTYPE_UNZONED_NS = 0x02, | ||
71 | CT_GSSUBTYPE_ZONESERVER = 0x03, | ||
72 | CT_GSSUBTYPE_LOCKSERVER = 0x04, | ||
73 | CT_GSSUBTYPE_HBA_MGMTSERVER = 0x10, /* for FDMI */ | ||
74 | }; | ||
75 | |||
76 | /* | ||
77 | * defines for CT response code field | ||
78 | */ | ||
79 | enum { | ||
80 | CT_RSP_REJECT = 0x8001, | ||
81 | CT_RSP_ACCEPT = 0x8002, | ||
82 | }; | ||
83 | |||
84 | /* | ||
85 | * defintions for CT reason code | ||
86 | */ | ||
87 | enum { | ||
88 | CT_RSN_INV_CMD = 0x01, | ||
89 | CT_RSN_INV_VER = 0x02, | ||
90 | CT_RSN_LOGIC_ERR = 0x03, | ||
91 | CT_RSN_INV_SIZE = 0x04, | ||
92 | CT_RSN_LOGICAL_BUSY = 0x05, | ||
93 | CT_RSN_PROTO_ERR = 0x07, | ||
94 | CT_RSN_UNABLE_TO_PERF = 0x09, | ||
95 | CT_RSN_NOT_SUPP = 0x0B, | ||
96 | CT_RSN_SERVER_NOT_AVBL = 0x0D, | ||
97 | CT_RSN_SESSION_COULD_NOT_BE_ESTBD = 0x0E, | ||
98 | CT_RSN_VENDOR_SPECIFIC = 0xFF, | ||
99 | |||
100 | }; | ||
101 | |||
102 | /* | ||
103 | * definitions for explanations code for Name server | ||
104 | */ | ||
105 | enum { | ||
106 | CT_NS_EXP_NOADDITIONAL = 0x00, | ||
107 | CT_NS_EXP_ID_NOT_REG = 0x01, | ||
108 | CT_NS_EXP_PN_NOT_REG = 0x02, | ||
109 | CT_NS_EXP_NN_NOT_REG = 0x03, | ||
110 | CT_NS_EXP_CS_NOT_REG = 0x04, | ||
111 | CT_NS_EXP_IPN_NOT_REG = 0x05, | ||
112 | CT_NS_EXP_IPA_NOT_REG = 0x06, | ||
113 | CT_NS_EXP_FT_NOT_REG = 0x07, | ||
114 | CT_NS_EXP_SPN_NOT_REG = 0x08, | ||
115 | CT_NS_EXP_SNN_NOT_REG = 0x09, | ||
116 | CT_NS_EXP_PT_NOT_REG = 0x0A, | ||
117 | CT_NS_EXP_IPP_NOT_REG = 0x0B, | ||
118 | CT_NS_EXP_FPN_NOT_REG = 0x0C, | ||
119 | CT_NS_EXP_HA_NOT_REG = 0x0D, | ||
120 | CT_NS_EXP_FD_NOT_REG = 0x0E, | ||
121 | CT_NS_EXP_FF_NOT_REG = 0x0F, | ||
122 | CT_NS_EXP_ACCESSDENIED = 0x10, | ||
123 | CT_NS_EXP_UNACCEPTABLE_ID = 0x11, | ||
124 | CT_NS_EXP_DATABASEEMPTY = 0x12, | ||
125 | CT_NS_EXP_NOT_REG_IN_SCOPE = 0x13, | ||
126 | CT_NS_EXP_DOM_ID_NOT_PRESENT = 0x14, | ||
127 | CT_NS_EXP_PORT_NUM_NOT_PRESENT = 0x15, | ||
128 | CT_NS_EXP_NO_DEVICE_ATTACHED = 0x16 | ||
129 | }; | ||
130 | |||
131 | /* | ||
132 | * defintions for the explanation code for all servers | ||
133 | */ | ||
134 | enum { | ||
135 | CT_EXP_AUTH_EXCEPTION = 0xF1, | ||
136 | CT_EXP_DB_FULL = 0xF2, | ||
137 | CT_EXP_DB_EMPTY = 0xF3, | ||
138 | CT_EXP_PROCESSING_REQ = 0xF4, | ||
139 | CT_EXP_UNABLE_TO_VERIFY_CONN = 0xF5, | ||
140 | CT_EXP_DEVICES_NOT_IN_CMN_ZONE = 0xF6 | ||
141 | }; | ||
142 | |||
143 | /* | ||
144 | * Command codes for Name server | ||
145 | */ | ||
146 | enum { | ||
147 | GS_GID_PN = 0x0121, /* Get Id on port name */ | ||
148 | GS_GPN_ID = 0x0112, /* Get port name on ID */ | ||
149 | GS_GNN_ID = 0x0113, /* Get node name on ID */ | ||
150 | GS_GID_FT = 0x0171, /* Get Id on FC4 type */ | ||
151 | GS_GSPN_ID = 0x0118, /* Get symbolic PN on ID */ | ||
152 | GS_RFT_ID = 0x0217, /* Register fc4type on ID */ | ||
153 | GS_RSPN_ID = 0x0218, /* Register symbolic PN on ID */ | ||
154 | GS_RPN_ID = 0x0212, /* Register port name */ | ||
155 | GS_RNN_ID = 0x0213, /* Register node name */ | ||
156 | GS_RCS_ID = 0x0214, /* Register class of service */ | ||
157 | GS_RPT_ID = 0x021A, /* Register port type */ | ||
158 | GS_GA_NXT = 0x0100, /* Get all next */ | ||
159 | GS_RFF_ID = 0x021F, /* Register FC4 Feature */ | ||
160 | }; | ||
161 | |||
162 | struct fcgs_id_req_s{ | ||
163 | u32 rsvd:8; | ||
164 | u32 dap:24; /* port identifier */ | ||
165 | }; | ||
166 | #define fcgs_gpnid_req_t struct fcgs_id_req_s | ||
167 | #define fcgs_gnnid_req_t struct fcgs_id_req_s | ||
168 | #define fcgs_gspnid_req_t struct fcgs_id_req_s | ||
169 | |||
170 | struct fcgs_gidpn_req_s{ | ||
171 | wwn_t port_name; /* port wwn */ | ||
172 | }; | ||
173 | |||
174 | struct fcgs_gidpn_resp_s{ | ||
175 | u32 rsvd:8; | ||
176 | u32 dap:24; /* port identifier */ | ||
177 | }; | ||
178 | |||
179 | /** | ||
180 | * RFT_ID | ||
181 | */ | ||
182 | struct fcgs_rftid_req_s { | ||
183 | u32 rsvd:8; | ||
184 | u32 dap:24; /* port identifier */ | ||
185 | u32 fc4_type[8]; /* fc4 types */ | ||
186 | }; | ||
187 | |||
188 | /** | ||
189 | * RFF_ID : Register FC4 features. | ||
190 | */ | ||
191 | |||
192 | #define FC_GS_FCP_FC4_FEATURE_INITIATOR 0x02 | ||
193 | #define FC_GS_FCP_FC4_FEATURE_TARGET 0x01 | ||
194 | |||
195 | struct fcgs_rffid_req_s{ | ||
196 | u32 rsvd :8; | ||
197 | u32 dap :24; /* port identifier */ | ||
198 | u32 rsvd1 :16; | ||
199 | u32 fc4ftr_bits :8; /* fc4 feature bits */ | ||
200 | u32 fc4_type :8; /* corresponding FC4 Type */ | ||
201 | }; | ||
202 | |||
203 | /** | ||
204 | * GID_FT Request | ||
205 | */ | ||
206 | struct fcgs_gidft_req_s{ | ||
207 | u8 reserved; | ||
208 | u8 domain_id; /* domain, 0 - all fabric */ | ||
209 | u8 area_id; /* area, 0 - whole domain */ | ||
210 | u8 fc4_type; /* FC_TYPE_FCP for SCSI devices */ | ||
211 | }; /* GID_FT Request */ | ||
212 | |||
213 | /** | ||
214 | * GID_FT Response | ||
215 | */ | ||
216 | struct fcgs_gidft_resp_s { | ||
217 | u8 last:1; /* last port identifier flag */ | ||
218 | u8 reserved:7; | ||
219 | u32 pid:24; /* port identifier */ | ||
220 | }; /* GID_FT Response */ | ||
221 | |||
222 | /** | ||
223 | * RSPN_ID | ||
224 | */ | ||
225 | struct fcgs_rspnid_req_s{ | ||
226 | u32 rsvd:8; | ||
227 | u32 dap:24; /* port identifier */ | ||
228 | u8 spn_len; /* symbolic port name length */ | ||
229 | u8 spn[256]; /* symbolic port name */ | ||
230 | }; | ||
231 | |||
232 | /** | ||
233 | * RPN_ID | ||
234 | */ | ||
235 | struct fcgs_rpnid_req_s{ | ||
236 | u32 rsvd:8; | ||
237 | u32 port_id:24; | ||
238 | wwn_t port_name; | ||
239 | }; | ||
240 | |||
241 | /** | ||
242 | * RNN_ID | ||
243 | */ | ||
244 | struct fcgs_rnnid_req_s{ | ||
245 | u32 rsvd:8; | ||
246 | u32 port_id:24; | ||
247 | wwn_t node_name; | ||
248 | }; | ||
249 | |||
250 | /** | ||
251 | * RCS_ID | ||
252 | */ | ||
253 | struct fcgs_rcsid_req_s{ | ||
254 | u32 rsvd:8; | ||
255 | u32 port_id:24; | ||
256 | u32 cos; | ||
257 | }; | ||
258 | |||
259 | /** | ||
260 | * RPT_ID | ||
261 | */ | ||
262 | struct fcgs_rptid_req_s{ | ||
263 | u32 rsvd:8; | ||
264 | u32 port_id:24; | ||
265 | u32 port_type:8; | ||
266 | u32 rsvd1:24; | ||
267 | }; | ||
268 | |||
269 | /** | ||
270 | * GA_NXT Request | ||
271 | */ | ||
272 | struct fcgs_ganxt_req_s{ | ||
273 | u32 rsvd:8; | ||
274 | u32 port_id:24; | ||
275 | }; | ||
276 | |||
277 | /** | ||
278 | * GA_NXT Response | ||
279 | */ | ||
280 | struct fcgs_ganxt_rsp_s{ | ||
281 | u32 port_type:8; /* Port Type */ | ||
282 | u32 port_id:24; /* Port Identifier */ | ||
283 | wwn_t port_name; /* Port Name */ | ||
284 | u8 spn_len; /* Length of Symbolic Port Name */ | ||
285 | char spn[255]; /* Symbolic Port Name */ | ||
286 | wwn_t node_name; /* Node Name */ | ||
287 | u8 snn_len; /* Length of Symbolic Node Name */ | ||
288 | char snn[255]; /* Symbolic Node Name */ | ||
289 | u8 ipa[8]; /* Initial Process Associator */ | ||
290 | u8 ip[16]; /* IP Address */ | ||
291 | u32 cos; /* Class of Service */ | ||
292 | u32 fc4types[8]; /* FC-4 TYPEs */ | ||
293 | wwn_t fabric_port_name; | ||
294 | /* Fabric Port Name */ | ||
295 | u32 rsvd:8; /* Reserved */ | ||
296 | u32 hard_addr:24; /* Hard Address */ | ||
297 | }; | ||
298 | |||
299 | /* | ||
300 | * Fabric Config Server | ||
301 | */ | ||
302 | |||
303 | /* | ||
304 | * Command codes for Fabric Configuration Server | ||
305 | */ | ||
306 | enum { | ||
307 | GS_FC_GFN_CMD = 0x0114, /* GS FC Get Fabric Name */ | ||
308 | GS_FC_GMAL_CMD = 0x0116, /* GS FC GMAL */ | ||
309 | GS_FC_TRACE_CMD = 0x0400, /* GS FC Trace Route */ | ||
310 | GS_FC_PING_CMD = 0x0401, /* GS FC Ping */ | ||
311 | }; | ||
312 | |||
313 | /* | ||
314 | * Source or Destination Port Tags. | ||
315 | */ | ||
316 | enum { | ||
317 | GS_FTRACE_TAG_NPORT_ID = 1, | ||
318 | GS_FTRACE_TAG_NPORT_NAME = 2, | ||
319 | }; | ||
320 | |||
321 | /* | ||
322 | * Port Value : Could be a Port id or wwn | ||
323 | */ | ||
324 | union fcgs_port_val_u{ | ||
325 | u32 nport_id; | ||
326 | wwn_t nport_wwn; | ||
327 | }; | ||
328 | |||
329 | #define GS_FTRACE_MAX_HOP_COUNT 20 | ||
330 | #define GS_FTRACE_REVISION 1 | ||
331 | |||
332 | /* | ||
333 | * Ftrace Related Structures. | ||
334 | */ | ||
335 | |||
336 | /* | ||
337 | * STR (Switch Trace) Reject Reason Codes. From FC-SW. | ||
338 | */ | ||
339 | enum { | ||
340 | GS_FTRACE_STR_CMD_COMPLETED_SUCC = 0, | ||
341 | GS_FTRACE_STR_CMD_NOT_SUPP_IN_NEXT_SWITCH, | ||
342 | GS_FTRACE_STR_NO_RESP_FROM_NEXT_SWITCH, | ||
343 | GS_FTRACE_STR_MAX_HOP_CNT_REACHED, | ||
344 | GS_FTRACE_STR_SRC_PORT_NOT_FOUND, | ||
345 | GS_FTRACE_STR_DST_PORT_NOT_FOUND, | ||
346 | GS_FTRACE_STR_DEVICES_NOT_IN_COMMON_ZONE, | ||
347 | GS_FTRACE_STR_NO_ROUTE_BW_PORTS, | ||
348 | GS_FTRACE_STR_NO_ADDL_EXPLN, | ||
349 | GS_FTRACE_STR_FABRIC_BUSY, | ||
350 | GS_FTRACE_STR_FABRIC_BUILD_IN_PROGRESS, | ||
351 | GS_FTRACE_STR_VENDOR_SPECIFIC_ERR_START = 0xf0, | ||
352 | GS_FTRACE_STR_VENDOR_SPECIFIC_ERR_END = 0xff, | ||
353 | }; | ||
354 | |||
355 | /* | ||
356 | * Ftrace Request | ||
357 | */ | ||
358 | struct fcgs_ftrace_req_s{ | ||
359 | u32 revision; | ||
360 | u16 src_port_tag; /* Source Port tag */ | ||
361 | u16 src_port_len; /* Source Port len */ | ||
362 | union fcgs_port_val_u src_port_val; /* Source Port value */ | ||
363 | u16 dst_port_tag; /* Destination Port tag */ | ||
364 | u16 dst_port_len; /* Destination Port len */ | ||
365 | union fcgs_port_val_u dst_port_val; /* Destination Port value */ | ||
366 | u32 token; | ||
367 | u8 vendor_id[8]; /* T10 Vendor Identifier */ | ||
368 | u8 vendor_info[8]; /* Vendor specific Info */ | ||
369 | u32 max_hop_cnt; /* Max Hop Count */ | ||
370 | }; | ||
371 | |||
372 | /* | ||
373 | * Path info structure | ||
374 | */ | ||
375 | struct fcgs_ftrace_path_info_s{ | ||
376 | wwn_t switch_name; /* Switch WWN */ | ||
377 | u32 domain_id; | ||
378 | wwn_t ingress_port_name; /* Ingress ports wwn */ | ||
379 | u32 ingress_phys_port_num; /* Ingress ports physical port | ||
380 | * number | ||
381 | */ | ||
382 | wwn_t egress_port_name; /* Ingress ports wwn */ | ||
383 | u32 egress_phys_port_num; /* Ingress ports physical port | ||
384 | * number | ||
385 | */ | ||
386 | }; | ||
387 | |||
388 | /* | ||
389 | * Ftrace Acc Response | ||
390 | */ | ||
391 | struct fcgs_ftrace_resp_s{ | ||
392 | u32 revision; | ||
393 | u32 token; | ||
394 | u8 vendor_id[8]; /* T10 Vendor Identifier */ | ||
395 | u8 vendor_info[8]; /* Vendor specific Info */ | ||
396 | u32 str_rej_reason_code; /* STR Reject Reason Code */ | ||
397 | u32 num_path_info_entries; /* No. of path info entries */ | ||
398 | /* | ||
399 | * path info entry/entries. | ||
400 | */ | ||
401 | struct fcgs_ftrace_path_info_s path_info[1]; | ||
402 | |||
403 | }; | ||
404 | |||
405 | /* | ||
406 | * Fabric Config Server : FCPing | ||
407 | */ | ||
408 | |||
409 | /* | ||
410 | * FC Ping Request | ||
411 | */ | ||
412 | struct fcgs_fcping_req_s{ | ||
413 | u32 revision; | ||
414 | u16 port_tag; | ||
415 | u16 port_len; /* Port len */ | ||
416 | union fcgs_port_val_u port_val; /* Port value */ | ||
417 | u32 token; | ||
418 | }; | ||
419 | |||
420 | /* | ||
421 | * FC Ping Response | ||
422 | */ | ||
423 | struct fcgs_fcping_resp_s{ | ||
424 | u32 token; | ||
425 | }; | ||
426 | |||
427 | /* | ||
428 | * Command codes for zone server query. | ||
429 | */ | ||
430 | enum { | ||
431 | ZS_GZME = 0x0124, /* Get zone member extended */ | ||
432 | }; | ||
433 | |||
434 | /* | ||
435 | * ZS GZME request | ||
436 | */ | ||
437 | #define ZS_GZME_ZNAMELEN 32 | ||
438 | struct zs_gzme_req_s{ | ||
439 | u8 znamelen; | ||
440 | u8 rsvd[3]; | ||
441 | u8 zname[ZS_GZME_ZNAMELEN]; | ||
442 | }; | ||
443 | |||
444 | enum zs_mbr_type{ | ||
445 | ZS_MBR_TYPE_PWWN = 1, | ||
446 | ZS_MBR_TYPE_DOMPORT = 2, | ||
447 | ZS_MBR_TYPE_PORTID = 3, | ||
448 | ZS_MBR_TYPE_NWWN = 4, | ||
449 | }; | ||
450 | |||
451 | struct zs_mbr_wwn_s{ | ||
452 | u8 mbr_type; | ||
453 | u8 rsvd[3]; | ||
454 | wwn_t wwn; | ||
455 | }; | ||
456 | |||
457 | struct zs_query_resp_s{ | ||
458 | u32 nmbrs; /* number of zone members */ | ||
459 | struct zs_mbr_wwn_s mbr[1]; | ||
460 | }; | ||
461 | |||
462 | /* | ||
463 | * GMAL Command ( Get ( interconnect Element) Management Address List) | ||
464 | * To retrieve the IP Address of a Switch. | ||
465 | */ | ||
466 | |||
467 | #define CT_GMAL_RESP_PREFIX_TELNET "telnet://" | ||
468 | #define CT_GMAL_RESP_PREFIX_HTTP "http://" | ||
469 | |||
470 | /* GMAL/GFN request */ | ||
471 | struct fcgs_req_s { | ||
472 | wwn_t wwn; /* PWWN/NWWN */ | ||
473 | }; | ||
474 | |||
475 | #define fcgs_gmal_req_t struct fcgs_req_s | ||
476 | #define fcgs_gfn_req_t struct fcgs_req_s | ||
477 | |||
478 | /* Accept Response to GMAL */ | ||
479 | struct fcgs_gmal_resp_s { | ||
480 | u32 ms_len; /* Num of entries */ | ||
481 | u8 ms_ma[256]; | ||
482 | }; | ||
483 | |||
484 | struct fc_gmal_entry_s { | ||
485 | u8 len; | ||
486 | u8 prefix[7]; /* like "http://" */ | ||
487 | u8 ip_addr[248]; | ||
488 | }; | ||
489 | |||
490 | #pragma pack() | ||
491 | |||
492 | #endif | ||
diff --git a/drivers/scsi/bfa/include/protocol/fc.h b/drivers/scsi/bfa/include/protocol/fc.h new file mode 100644 index 00000000000..3e39ba58cfb --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/fc.h | |||
@@ -0,0 +1,1105 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __FC_H__ | ||
19 | #define __FC_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | |||
23 | #pragma pack(1) | ||
24 | |||
25 | /* | ||
26 | * Fibre Channel Header Structure (FCHS) definition | ||
27 | */ | ||
28 | struct fchs_s { | ||
29 | #ifdef __BIGENDIAN | ||
30 | u32 routing:4; /* routing bits */ | ||
31 | u32 cat_info:4; /* category info */ | ||
32 | #else | ||
33 | u32 cat_info:4; /* category info */ | ||
34 | u32 routing:4; /* routing bits */ | ||
35 | #endif | ||
36 | u32 d_id:24; /* destination identifier */ | ||
37 | |||
38 | u32 cs_ctl:8; /* class specific control */ | ||
39 | u32 s_id:24; /* source identifier */ | ||
40 | |||
41 | u32 type:8; /* data structure type */ | ||
42 | u32 f_ctl:24; /* initial frame control */ | ||
43 | |||
44 | u8 seq_id; /* sequence identifier */ | ||
45 | u8 df_ctl; /* data field control */ | ||
46 | u16 seq_cnt; /* sequence count */ | ||
47 | |||
48 | u16 ox_id; /* originator exchange ID */ | ||
49 | u16 rx_id; /* responder exchange ID */ | ||
50 | |||
51 | u32 ro; /* relative offset */ | ||
52 | }; | ||
53 | /* | ||
54 | * Fibre Channel BB_E Header Structure | ||
55 | */ | ||
56 | struct fcbbehs_s { | ||
57 | u16 ver_rsvd; | ||
58 | u32 rsvd[2]; | ||
59 | u32 rsvd__sof; | ||
60 | }; | ||
61 | |||
62 | #define FC_SEQ_ID_MAX 256 | ||
63 | |||
64 | /* | ||
65 | * routing bit definitions | ||
66 | */ | ||
67 | enum { | ||
68 | FC_RTG_FC4_DEV_DATA = 0x0, /* FC-4 Device Data */ | ||
69 | FC_RTG_EXT_LINK = 0x2, /* Extended Link Data */ | ||
70 | FC_RTG_FC4_LINK_DATA = 0x3, /* FC-4 Link Data */ | ||
71 | FC_RTG_VIDEO_DATA = 0x4, /* Video Data */ | ||
72 | FC_RTG_EXT_HDR = 0x5, /* VFT, IFR or Encapsuled */ | ||
73 | FC_RTG_BASIC_LINK = 0x8, /* Basic Link data */ | ||
74 | FC_RTG_LINK_CTRL = 0xC, /* Link Control */ | ||
75 | }; | ||
76 | |||
77 | /* | ||
78 | * information category for extended link data and FC-4 Link Data | ||
79 | */ | ||
80 | enum { | ||
81 | FC_CAT_LD_REQUEST = 0x2, /* Request */ | ||
82 | FC_CAT_LD_REPLY = 0x3, /* Reply */ | ||
83 | FC_CAT_LD_DIAG = 0xF, /* for DIAG use only */ | ||
84 | }; | ||
85 | |||
86 | /* | ||
87 | * information category for extended headers (VFT, IFR or encapsulation) | ||
88 | */ | ||
89 | enum { | ||
90 | FC_CAT_VFT_HDR = 0x0, /* Virtual fabric tagging header */ | ||
91 | FC_CAT_IFR_HDR = 0x1, /* Inter-Fabric routing header */ | ||
92 | FC_CAT_ENC_HDR = 0x2, /* Encapsulation header */ | ||
93 | }; | ||
94 | |||
95 | /* | ||
96 | * information category for FC-4 device data | ||
97 | */ | ||
98 | enum { | ||
99 | FC_CAT_UNCATEG_INFO = 0x0, /* Uncategorized information */ | ||
100 | FC_CAT_SOLICIT_DATA = 0x1, /* Solicited Data */ | ||
101 | FC_CAT_UNSOLICIT_CTRL = 0x2, /* Unsolicited Control */ | ||
102 | FC_CAT_SOLICIT_CTRL = 0x3, /* Solicited Control */ | ||
103 | FC_CAT_UNSOLICIT_DATA = 0x4, /* Unsolicited Data */ | ||
104 | FC_CAT_DATA_DESC = 0x5, /* Data Descriptor */ | ||
105 | FC_CAT_UNSOLICIT_CMD = 0x6, /* Unsolicited Command */ | ||
106 | FC_CAT_CMD_STATUS = 0x7, /* Command Status */ | ||
107 | }; | ||
108 | |||
109 | /* | ||
110 | * information category for Link Control | ||
111 | */ | ||
112 | enum { | ||
113 | FC_CAT_ACK_1 = 0x00, | ||
114 | FC_CAT_ACK_0_N = 0x01, | ||
115 | FC_CAT_P_RJT = 0x02, | ||
116 | FC_CAT_F_RJT = 0x03, | ||
117 | FC_CAT_P_BSY = 0x04, | ||
118 | FC_CAT_F_BSY_DATA = 0x05, | ||
119 | FC_CAT_F_BSY_LINK_CTL = 0x06, | ||
120 | FC_CAT_F_LCR = 0x07, | ||
121 | FC_CAT_NTY = 0x08, | ||
122 | FC_CAT_END = 0x09, | ||
123 | }; | ||
124 | |||
125 | /* | ||
126 | * Type Field Definitions. FC-PH Section 18.5 pg. 165 | ||
127 | */ | ||
128 | enum { | ||
129 | FC_TYPE_BLS = 0x0, /* Basic Link Service */ | ||
130 | FC_TYPE_ELS = 0x1, /* Extended Link Service */ | ||
131 | FC_TYPE_IP = 0x5, /* IP */ | ||
132 | FC_TYPE_FCP = 0x8, /* SCSI-FCP */ | ||
133 | FC_TYPE_GPP = 0x9, /* SCSI_GPP */ | ||
134 | FC_TYPE_SERVICES = 0x20, /* Fibre Channel Services */ | ||
135 | FC_TYPE_FC_FSS = 0x22, /* Fabric Switch Services */ | ||
136 | FC_TYPE_FC_AL = 0x23, /* FC-AL */ | ||
137 | FC_TYPE_FC_SNMP = 0x24, /* FC-SNMP */ | ||
138 | FC_TYPE_MAX = 256, /* 256 FC-4 types */ | ||
139 | }; | ||
140 | |||
141 | struct fc_fc4types_s{ | ||
142 | u8 bits[FC_TYPE_MAX / 8]; | ||
143 | }; | ||
144 | |||
145 | /* | ||
146 | * Frame Control Definitions. FC-PH Table-45. pg. 168 | ||
147 | */ | ||
148 | enum { | ||
149 | FCTL_EC_ORIG = 0x000000, /* exchange originator */ | ||
150 | FCTL_EC_RESP = 0x800000, /* exchange responder */ | ||
151 | FCTL_SEQ_INI = 0x000000, /* sequence initiator */ | ||
152 | FCTL_SEQ_REC = 0x400000, /* sequence recipient */ | ||
153 | FCTL_FS_EXCH = 0x200000, /* first sequence of xchg */ | ||
154 | FCTL_LS_EXCH = 0x100000, /* last sequence of xchg */ | ||
155 | FCTL_END_SEQ = 0x080000, /* last frame of sequence */ | ||
156 | FCTL_SI_XFER = 0x010000, /* seq initiative transfer */ | ||
157 | FCTL_RO_PRESENT = 0x000008, /* relative offset present */ | ||
158 | FCTL_FILLBYTE_MASK = 0x000003 /* , fill byte mask */ | ||
159 | }; | ||
160 | |||
161 | /* | ||
162 | * Fabric Well Known Addresses | ||
163 | */ | ||
164 | enum { | ||
165 | FC_MIN_WELL_KNOWN_ADDR = 0xFFFFF0, | ||
166 | FC_DOMAIN_CONTROLLER_MASK = 0xFFFC00, | ||
167 | FC_ALIAS_SERVER = 0xFFFFF8, | ||
168 | FC_MGMT_SERVER = 0xFFFFFA, | ||
169 | FC_TIME_SERVER = 0xFFFFFB, | ||
170 | FC_NAME_SERVER = 0xFFFFFC, | ||
171 | FC_FABRIC_CONTROLLER = 0xFFFFFD, | ||
172 | FC_FABRIC_PORT = 0xFFFFFE, | ||
173 | FC_BROADCAST_SERVER = 0xFFFFFF | ||
174 | }; | ||
175 | |||
176 | /* | ||
177 | * domain/area/port defines | ||
178 | */ | ||
179 | #define FC_DOMAIN_MASK 0xFF0000 | ||
180 | #define FC_DOMAIN_SHIFT 16 | ||
181 | #define FC_AREA_MASK 0x00FF00 | ||
182 | #define FC_AREA_SHIFT 8 | ||
183 | #define FC_PORT_MASK 0x0000FF | ||
184 | #define FC_PORT_SHIFT 0 | ||
185 | |||
186 | #define FC_GET_DOMAIN(p) (((p) & FC_DOMAIN_MASK) >> FC_DOMAIN_SHIFT) | ||
187 | #define FC_GET_AREA(p) (((p) & FC_AREA_MASK) >> FC_AREA_SHIFT) | ||
188 | #define FC_GET_PORT(p) (((p) & FC_PORT_MASK) >> FC_PORT_SHIFT) | ||
189 | |||
190 | #define FC_DOMAIN_CTRLR(p) (FC_DOMAIN_CONTROLLER_MASK | (FC_GET_DOMAIN(p))) | ||
191 | |||
192 | enum { | ||
193 | FC_RXID_ANY = 0xFFFFU, | ||
194 | }; | ||
195 | |||
196 | /* | ||
197 | * generic ELS command | ||
198 | */ | ||
199 | struct fc_els_cmd_s{ | ||
200 | u32 els_code:8; /* ELS Command Code */ | ||
201 | u32 reserved:24; | ||
202 | }; | ||
203 | |||
204 | /* | ||
205 | * ELS Command Codes. FC-PH Table-75. pg. 223 | ||
206 | */ | ||
207 | enum { | ||
208 | FC_ELS_LS_RJT = 0x1, /* Link Service Reject. */ | ||
209 | FC_ELS_ACC = 0x02, /* Accept */ | ||
210 | FC_ELS_PLOGI = 0x03, /* N_Port Login. */ | ||
211 | FC_ELS_FLOGI = 0x04, /* F_Port Login. */ | ||
212 | FC_ELS_LOGO = 0x05, /* Logout. */ | ||
213 | FC_ELS_ABTX = 0x06, /* Abort Exchange */ | ||
214 | FC_ELS_RES = 0x08, /* Read Exchange status */ | ||
215 | FC_ELS_RSS = 0x09, /* Read sequence status block */ | ||
216 | FC_ELS_RSI = 0x0A, /* Request Sequence Initiative */ | ||
217 | FC_ELS_ESTC = 0x0C, /* Estimate Credit. */ | ||
218 | FC_ELS_RTV = 0x0E, /* Read Timeout Value. */ | ||
219 | FC_ELS_RLS = 0x0F, /* Read Link Status. */ | ||
220 | FC_ELS_ECHO = 0x10, /* Echo */ | ||
221 | FC_ELS_TEST = 0x11, /* Test */ | ||
222 | FC_ELS_RRQ = 0x12, /* Reinstate Recovery Qualifier. */ | ||
223 | FC_ELS_REC = 0x13, /* Add this for TAPE support in FCR */ | ||
224 | FC_ELS_PRLI = 0x20, /* Process Login */ | ||
225 | FC_ELS_PRLO = 0x21, /* Process Logout. */ | ||
226 | FC_ELS_SCN = 0x22, /* State Change Notification. */ | ||
227 | FC_ELS_TPRLO = 0x24, /* Third Party Process Logout. */ | ||
228 | FC_ELS_PDISC = 0x50, /* Discover N_Port Parameters. */ | ||
229 | FC_ELS_FDISC = 0x51, /* Discover F_Port Parameters. */ | ||
230 | FC_ELS_ADISC = 0x52, /* Discover Address. */ | ||
231 | FC_ELS_FAN = 0x60, /* Fabric Address Notification */ | ||
232 | FC_ELS_RSCN = 0x61, /* Reg State Change Notification */ | ||
233 | FC_ELS_SCR = 0x62, /* State Change Registration. */ | ||
234 | FC_ELS_RTIN = 0x77, /* Mangement server request */ | ||
235 | FC_ELS_RNID = 0x78, /* Mangement server request */ | ||
236 | FC_ELS_RLIR = 0x79, /* Registered Link Incident Record */ | ||
237 | |||
238 | FC_ELS_RPSC = 0x7D, /* Report Port Speed Capabilities */ | ||
239 | FC_ELS_QSA = 0x7E, /* Query Security Attributes. Ref FC-SP */ | ||
240 | FC_ELS_E2E_LBEACON = 0x81, | ||
241 | /* End-to-End Link Beacon */ | ||
242 | FC_ELS_AUTH = 0x90, /* Authentication. Ref FC-SP */ | ||
243 | FC_ELS_RFCN = 0x97, /* Request Fabric Change Notification. Ref | ||
244 | *FC-SP */ | ||
245 | |||
246 | }; | ||
247 | |||
248 | /* | ||
249 | * Version numbers for FC-PH standards, | ||
250 | * used in login to indicate what port | ||
251 | * supports. See FC-PH-X table 158. | ||
252 | */ | ||
253 | enum { | ||
254 | FC_PH_VER_4_3 = 0x09, | ||
255 | FC_PH_VER_PH_3 = 0x20, | ||
256 | }; | ||
257 | |||
258 | /* | ||
259 | * PDU size defines | ||
260 | */ | ||
261 | enum { | ||
262 | FC_MIN_PDUSZ = 512, | ||
263 | FC_MAX_PDUSZ = 2112, | ||
264 | }; | ||
265 | |||
266 | /* | ||
267 | * N_Port PLOGI Common Service Parameters. | ||
268 | * FC-PH-x. Figure-76. pg. 308. | ||
269 | */ | ||
270 | struct fc_plogi_csp_s{ | ||
271 | u8 verhi; /* FC-PH high version */ | ||
272 | u8 verlo; /* FC-PH low version */ | ||
273 | u16 bbcred; /* BB_Credit */ | ||
274 | |||
275 | #ifdef __BIGENDIAN | ||
276 | u8 ciro:1, /* continuously increasing RO */ | ||
277 | rro:1, /* random relative offset */ | ||
278 | npiv_supp:1, /* NPIV supported */ | ||
279 | port_type:1, /* N_Port/F_port */ | ||
280 | altbbcred:1, /* alternate BB_Credit */ | ||
281 | resolution:1, /* ms/ns ED_TOV resolution */ | ||
282 | vvl_info:1, /* VVL Info included */ | ||
283 | reserved1:1; | ||
284 | |||
285 | u8 hg_supp:1, | ||
286 | query_dbc:1, | ||
287 | security:1, | ||
288 | sync_cap:1, | ||
289 | r_t_tov:1, | ||
290 | dh_dup_supp:1, | ||
291 | cisc:1, /* continuously increasing seq count */ | ||
292 | payload:1; | ||
293 | #else | ||
294 | u8 reserved2:2, | ||
295 | resolution:1, /* ms/ns ED_TOV resolution */ | ||
296 | altbbcred:1, /* alternate BB_Credit */ | ||
297 | port_type:1, /* N_Port/F_port */ | ||
298 | npiv_supp:1, /* NPIV supported */ | ||
299 | rro:1, /* random relative offset */ | ||
300 | ciro:1; /* continuously increasing RO */ | ||
301 | |||
302 | u8 payload:1, | ||
303 | cisc:1, /* continuously increasing seq count */ | ||
304 | dh_dup_supp:1, | ||
305 | r_t_tov:1, | ||
306 | sync_cap:1, | ||
307 | security:1, | ||
308 | query_dbc:1, | ||
309 | hg_supp:1; | ||
310 | #endif | ||
311 | |||
312 | u16 rxsz; /* recieve data_field size */ | ||
313 | |||
314 | u16 conseq; | ||
315 | u16 ro_bitmap; | ||
316 | |||
317 | u32 e_d_tov; | ||
318 | }; | ||
319 | |||
320 | /* | ||
321 | * N_Port PLOGI Class Specific Parameters. | ||
322 | * FC-PH-x. Figure 78. pg. 318. | ||
323 | */ | ||
324 | struct fc_plogi_clp_s{ | ||
325 | #ifdef __BIGENDIAN | ||
326 | u32 class_valid:1; | ||
327 | u32 intermix:1; /* class intermix supported if set =1. | ||
328 | * valid only for class1. Reserved for | ||
329 | * class2 & class3 | ||
330 | */ | ||
331 | u32 reserved1:2; | ||
332 | u32 sequential:1; | ||
333 | u32 reserved2:3; | ||
334 | #else | ||
335 | u32 reserved2:3; | ||
336 | u32 sequential:1; | ||
337 | u32 reserved1:2; | ||
338 | u32 intermix:1; /* class intermix supported if set =1. | ||
339 | * valid only for class1. Reserved for | ||
340 | * class2 & class3 | ||
341 | */ | ||
342 | u32 class_valid:1; | ||
343 | #endif | ||
344 | |||
345 | u32 reserved3:24; | ||
346 | |||
347 | u32 reserved4:16; | ||
348 | u32 rxsz:16; /* Receive data_field size */ | ||
349 | |||
350 | u32 reserved5:8; | ||
351 | u32 conseq:8; | ||
352 | u32 e2e_credit:16; /* end to end credit */ | ||
353 | |||
354 | u32 reserved7:8; | ||
355 | u32 ospx:8; | ||
356 | u32 reserved8:16; | ||
357 | }; | ||
358 | |||
359 | #define FLOGI_VVL_BRCD 0x42524344 /* ASCII value for each character in | ||
360 | * string "BRCD" */ | ||
361 | |||
362 | /* | ||
363 | * PLOGI els command and reply payload | ||
364 | */ | ||
365 | struct fc_logi_s{ | ||
366 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
367 | struct fc_plogi_csp_s csp; /* common service params */ | ||
368 | wwn_t port_name; | ||
369 | wwn_t node_name; | ||
370 | struct fc_plogi_clp_s class1; /* class 1 service parameters */ | ||
371 | struct fc_plogi_clp_s class2; /* class 2 service parameters */ | ||
372 | struct fc_plogi_clp_s class3; /* class 3 service parameters */ | ||
373 | struct fc_plogi_clp_s class4; /* class 4 service parameters */ | ||
374 | u8 vvl[16]; /* vendor version level */ | ||
375 | }; | ||
376 | |||
377 | /* | ||
378 | * LOGO els command payload | ||
379 | */ | ||
380 | struct fc_logo_s{ | ||
381 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
382 | u32 res1:8; | ||
383 | u32 nport_id:24; /* N_Port identifier of source */ | ||
384 | wwn_t orig_port_name; /* Port name of the LOGO originator */ | ||
385 | }; | ||
386 | |||
387 | /* | ||
388 | * ADISC els command payload | ||
389 | */ | ||
390 | struct fc_adisc_s { | ||
391 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
392 | u32 res1:8; | ||
393 | u32 orig_HA:24; /* originator hard address */ | ||
394 | wwn_t orig_port_name; /* originator port name */ | ||
395 | wwn_t orig_node_name; /* originator node name */ | ||
396 | u32 res2:8; | ||
397 | u32 nport_id:24; /* originator NPortID */ | ||
398 | }; | ||
399 | |||
400 | /* | ||
401 | * Exchange status block | ||
402 | */ | ||
403 | struct fc_exch_status_blk_s{ | ||
404 | u32 oxid:16; | ||
405 | u32 rxid:16; | ||
406 | u32 res1:8; | ||
407 | u32 orig_np:24; /* originator NPortID */ | ||
408 | u32 res2:8; | ||
409 | u32 resp_np:24; /* responder NPortID */ | ||
410 | u32 es_bits; | ||
411 | u32 res3; | ||
412 | /* | ||
413 | * un modified section of the fields | ||
414 | */ | ||
415 | }; | ||
416 | |||
417 | /* | ||
418 | * RES els command payload | ||
419 | */ | ||
420 | struct fc_res_s { | ||
421 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
422 | u32 res1:8; | ||
423 | u32 nport_id:24; /* N_Port identifier of source */ | ||
424 | u32 oxid:16; | ||
425 | u32 rxid:16; | ||
426 | u8 assoc_hdr[32]; | ||
427 | }; | ||
428 | |||
429 | /* | ||
430 | * RES els accept payload | ||
431 | */ | ||
432 | struct fc_res_acc_s{ | ||
433 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
434 | struct fc_exch_status_blk_s fc_exch_blk; /* Exchange status block */ | ||
435 | }; | ||
436 | |||
437 | /* | ||
438 | * REC els command payload | ||
439 | */ | ||
440 | struct fc_rec_s { | ||
441 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
442 | u32 res1:8; | ||
443 | u32 nport_id:24; /* N_Port identifier of source */ | ||
444 | u32 oxid:16; | ||
445 | u32 rxid:16; | ||
446 | }; | ||
447 | |||
448 | #define FC_REC_ESB_OWN_RSP 0x80000000 /* responder owns */ | ||
449 | #define FC_REC_ESB_SI 0x40000000 /* SI is owned */ | ||
450 | #define FC_REC_ESB_COMP 0x20000000 /* exchange is complete */ | ||
451 | #define FC_REC_ESB_ENDCOND_ABN 0x10000000 /* abnormal ending */ | ||
452 | #define FC_REC_ESB_RQACT 0x04000000 /* recovery qual active */ | ||
453 | #define FC_REC_ESB_ERRP_MSK 0x03000000 | ||
454 | #define FC_REC_ESB_OXID_INV 0x00800000 /* invalid OXID */ | ||
455 | #define FC_REC_ESB_RXID_INV 0x00400000 /* invalid RXID */ | ||
456 | #define FC_REC_ESB_PRIO_INUSE 0x00200000 | ||
457 | |||
458 | /* | ||
459 | * REC els accept payload | ||
460 | */ | ||
461 | struct fc_rec_acc_s { | ||
462 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
463 | u32 oxid:16; | ||
464 | u32 rxid:16; | ||
465 | u32 res1:8; | ||
466 | u32 orig_id:24; /* N_Port id of exchange originator */ | ||
467 | u32 res2:8; | ||
468 | u32 resp_id:24; /* N_Port id of exchange responder */ | ||
469 | u32 count; /* data transfer count */ | ||
470 | u32 e_stat; /* exchange status */ | ||
471 | }; | ||
472 | |||
473 | /* | ||
474 | * RSI els payload | ||
475 | */ | ||
476 | struct fc_rsi_s { | ||
477 | struct fc_els_cmd_s els_cmd; | ||
478 | u32 res1:8; | ||
479 | u32 orig_sid:24; | ||
480 | u32 oxid:16; | ||
481 | u32 rxid:16; | ||
482 | }; | ||
483 | |||
484 | /* | ||
485 | * structure for PRLI paramater pages, both request & response | ||
486 | * see FC-PH-X table 113 & 115 for explanation also FCP table 8 | ||
487 | */ | ||
488 | struct fc_prli_params_s{ | ||
489 | u32 reserved: 16; | ||
490 | #ifdef __BIGENDIAN | ||
491 | u32 reserved1: 5; | ||
492 | u32 rec_support : 1; | ||
493 | u32 task_retry_id : 1; | ||
494 | u32 retry : 1; | ||
495 | |||
496 | u32 confirm : 1; | ||
497 | u32 doverlay:1; | ||
498 | u32 initiator:1; | ||
499 | u32 target:1; | ||
500 | u32 cdmix:1; | ||
501 | u32 drmix:1; | ||
502 | u32 rxrdisab:1; | ||
503 | u32 wxrdisab:1; | ||
504 | #else | ||
505 | u32 retry : 1; | ||
506 | u32 task_retry_id : 1; | ||
507 | u32 rec_support : 1; | ||
508 | u32 reserved1: 5; | ||
509 | |||
510 | u32 wxrdisab:1; | ||
511 | u32 rxrdisab:1; | ||
512 | u32 drmix:1; | ||
513 | u32 cdmix:1; | ||
514 | u32 target:1; | ||
515 | u32 initiator:1; | ||
516 | u32 doverlay:1; | ||
517 | u32 confirm : 1; | ||
518 | #endif | ||
519 | }; | ||
520 | |||
521 | /* | ||
522 | * valid values for rspcode in PRLI ACC payload | ||
523 | */ | ||
524 | enum { | ||
525 | FC_PRLI_ACC_XQTD = 0x1, /* request executed */ | ||
526 | FC_PRLI_ACC_PREDEF_IMG = 0x5, /* predefined image - no prli needed */ | ||
527 | }; | ||
528 | |||
529 | struct fc_prli_params_page_s{ | ||
530 | u32 type:8; | ||
531 | u32 codext:8; | ||
532 | #ifdef __BIGENDIAN | ||
533 | u32 origprocasv:1; | ||
534 | u32 rsppav:1; | ||
535 | u32 imagepair:1; | ||
536 | u32 reserved1:1; | ||
537 | u32 rspcode:4; | ||
538 | #else | ||
539 | u32 rspcode:4; | ||
540 | u32 reserved1:1; | ||
541 | u32 imagepair:1; | ||
542 | u32 rsppav:1; | ||
543 | u32 origprocasv:1; | ||
544 | #endif | ||
545 | u32 reserved2:8; | ||
546 | |||
547 | u32 origprocas; | ||
548 | u32 rspprocas; | ||
549 | struct fc_prli_params_s servparams; | ||
550 | }; | ||
551 | |||
552 | /* | ||
553 | * PRLI request and accept payload, FC-PH-X tables 112 & 114 | ||
554 | */ | ||
555 | struct fc_prli_s{ | ||
556 | u32 command:8; | ||
557 | u32 pglen:8; | ||
558 | u32 pagebytes:16; | ||
559 | struct fc_prli_params_page_s parampage; | ||
560 | }; | ||
561 | |||
562 | /* | ||
563 | * PRLO logout params page | ||
564 | */ | ||
565 | struct fc_prlo_params_page_s{ | ||
566 | u32 type:8; | ||
567 | u32 type_ext:8; | ||
568 | #ifdef __BIGENDIAN | ||
569 | u32 opa_valid:1; /* originator process associator | ||
570 | * valid | ||
571 | */ | ||
572 | u32 rpa_valid:1; /* responder process associator valid */ | ||
573 | u32 res1:14; | ||
574 | #else | ||
575 | u32 res1:14; | ||
576 | u32 rpa_valid:1; /* responder process associator valid */ | ||
577 | u32 opa_valid:1; /* originator process associator | ||
578 | * valid | ||
579 | */ | ||
580 | #endif | ||
581 | u32 orig_process_assc; | ||
582 | u32 resp_process_assc; | ||
583 | |||
584 | u32 res2; | ||
585 | }; | ||
586 | |||
587 | /* | ||
588 | * PRLO els command payload | ||
589 | */ | ||
590 | struct fc_prlo_s{ | ||
591 | u32 command:8; | ||
592 | u32 page_len:8; | ||
593 | u32 payload_len:16; | ||
594 | struct fc_prlo_params_page_s prlo_params[1]; | ||
595 | }; | ||
596 | |||
597 | /* | ||
598 | * PRLO Logout response parameter page | ||
599 | */ | ||
600 | struct fc_prlo_acc_params_page_s{ | ||
601 | u32 type:8; | ||
602 | u32 type_ext:8; | ||
603 | |||
604 | #ifdef __BIGENDIAN | ||
605 | u32 opa_valid:1; /* originator process associator | ||
606 | * valid | ||
607 | */ | ||
608 | u32 rpa_valid:1; /* responder process associator valid */ | ||
609 | u32 res1:14; | ||
610 | #else | ||
611 | u32 res1:14; | ||
612 | u32 rpa_valid:1; /* responder process associator valid */ | ||
613 | u32 opa_valid:1; /* originator process associator | ||
614 | * valid | ||
615 | */ | ||
616 | #endif | ||
617 | u32 orig_process_assc; | ||
618 | u32 resp_process_assc; | ||
619 | |||
620 | u32 fc4type_csp; | ||
621 | }; | ||
622 | |||
623 | /* | ||
624 | * PRLO els command ACC payload | ||
625 | */ | ||
626 | struct fc_prlo_acc_s{ | ||
627 | u32 command:8; | ||
628 | u32 page_len:8; | ||
629 | u32 payload_len:16; | ||
630 | struct fc_prlo_acc_params_page_s prlo_acc_params[1]; | ||
631 | }; | ||
632 | |||
633 | /* | ||
634 | * SCR els command payload | ||
635 | */ | ||
636 | enum { | ||
637 | FC_SCR_REG_FUNC_FABRIC_DETECTED = 0x01, | ||
638 | FC_SCR_REG_FUNC_N_PORT_DETECTED = 0x02, | ||
639 | FC_SCR_REG_FUNC_FULL = 0x03, | ||
640 | FC_SCR_REG_FUNC_CLEAR_REG = 0xFF, | ||
641 | }; | ||
642 | |||
643 | /* SCR VU registrations */ | ||
644 | enum { | ||
645 | FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE = 0x01 | ||
646 | }; | ||
647 | |||
648 | struct fc_scr_s{ | ||
649 | u32 command:8; | ||
650 | u32 res:24; | ||
651 | u32 vu_reg_func:8; /* Vendor Unique Registrations */ | ||
652 | u32 res1:16; | ||
653 | u32 reg_func:8; | ||
654 | }; | ||
655 | |||
656 | /* | ||
657 | * Information category for Basic link data | ||
658 | */ | ||
659 | enum { | ||
660 | FC_CAT_NOP = 0x0, | ||
661 | FC_CAT_ABTS = 0x1, | ||
662 | FC_CAT_RMC = 0x2, | ||
663 | FC_CAT_BA_ACC = 0x4, | ||
664 | FC_CAT_BA_RJT = 0x5, | ||
665 | FC_CAT_PRMT = 0x6, | ||
666 | }; | ||
667 | |||
668 | /* | ||
669 | * LS_RJT els reply payload | ||
670 | */ | ||
671 | struct fc_ls_rjt_s { | ||
672 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
673 | u32 res1:8; | ||
674 | u32 reason_code:8; /* Reason code for reject */ | ||
675 | u32 reason_code_expl:8; /* Reason code explanation */ | ||
676 | u32 vendor_unique:8; /* Vendor specific */ | ||
677 | }; | ||
678 | |||
679 | /* | ||
680 | * LS_RJT reason codes | ||
681 | */ | ||
682 | enum { | ||
683 | FC_LS_RJT_RSN_INV_CMD_CODE = 0x01, | ||
684 | FC_LS_RJT_RSN_LOGICAL_ERROR = 0x03, | ||
685 | FC_LS_RJT_RSN_LOGICAL_BUSY = 0x05, | ||
686 | FC_LS_RJT_RSN_PROTOCOL_ERROR = 0x07, | ||
687 | FC_LS_RJT_RSN_UNABLE_TO_PERF_CMD = 0x09, | ||
688 | FC_LS_RJT_RSN_CMD_NOT_SUPP = 0x0B, | ||
689 | }; | ||
690 | |||
691 | /* | ||
692 | * LS_RJT reason code explanation | ||
693 | */ | ||
694 | enum { | ||
695 | FC_LS_RJT_EXP_NO_ADDL_INFO = 0x00, | ||
696 | FC_LS_RJT_EXP_SPARMS_ERR_OPTIONS = 0x01, | ||
697 | FC_LS_RJT_EXP_SPARMS_ERR_INI_CTL = 0x03, | ||
698 | FC_LS_RJT_EXP_SPARMS_ERR_REC_CTL = 0x05, | ||
699 | FC_LS_RJT_EXP_SPARMS_ERR_RXSZ = 0x07, | ||
700 | FC_LS_RJT_EXP_SPARMS_ERR_CONSEQ = 0x09, | ||
701 | FC_LS_RJT_EXP_SPARMS_ERR_CREDIT = 0x0B, | ||
702 | FC_LS_RJT_EXP_INV_PORT_NAME = 0x0D, | ||
703 | FC_LS_RJT_EXP_INV_NODE_FABRIC_NAME = 0x0E, | ||
704 | FC_LS_RJT_EXP_INV_CSP = 0x0F, | ||
705 | FC_LS_RJT_EXP_INV_ASSOC_HDR = 0x11, | ||
706 | FC_LS_RJT_EXP_ASSOC_HDR_REQD = 0x13, | ||
707 | FC_LS_RJT_EXP_INV_ORIG_S_ID = 0x15, | ||
708 | FC_LS_RJT_EXP_INV_OXID_RXID_COMB = 0x17, | ||
709 | FC_LS_RJT_EXP_CMD_ALREADY_IN_PROG = 0x19, | ||
710 | FC_LS_RJT_EXP_LOGIN_REQUIRED = 0x1E, | ||
711 | FC_LS_RJT_EXP_INVALID_NPORT_ID = 0x1F, | ||
712 | FC_LS_RJT_EXP_INSUFF_RES = 0x29, | ||
713 | FC_LS_RJT_EXP_CMD_NOT_SUPP = 0x2C, | ||
714 | FC_LS_RJT_EXP_INV_PAYLOAD_LEN = 0x2D, | ||
715 | }; | ||
716 | |||
717 | /* | ||
718 | * RRQ els command payload | ||
719 | */ | ||
720 | struct fc_rrq_s{ | ||
721 | struct fc_els_cmd_s els_cmd; /* ELS command code */ | ||
722 | u32 res1:8; | ||
723 | u32 s_id:24; /* exchange originator S_ID */ | ||
724 | |||
725 | u32 ox_id:16; /* originator exchange ID */ | ||
726 | u32 rx_id:16; /* responder exchange ID */ | ||
727 | |||
728 | u32 res2[8]; /* optional association header */ | ||
729 | }; | ||
730 | |||
731 | /* | ||
732 | * ABTS BA_ACC reply payload | ||
733 | */ | ||
734 | struct fc_ba_acc_s{ | ||
735 | u32 seq_id_valid:8; /* set to 0x00 for Abort Exchange */ | ||
736 | u32 seq_id:8; /* invalid for Abort Exchange */ | ||
737 | u32 res2:16; | ||
738 | u32 ox_id:16; /* OX_ID from ABTS frame */ | ||
739 | u32 rx_id:16; /* RX_ID from ABTS frame */ | ||
740 | u32 low_seq_cnt:16; /* set to 0x0000 for Abort Exchange */ | ||
741 | u32 high_seq_cnt:16;/* set to 0xFFFF for Abort Exchange */ | ||
742 | }; | ||
743 | |||
744 | /* | ||
745 | * ABTS BA_RJT reject payload | ||
746 | */ | ||
747 | struct fc_ba_rjt_s{ | ||
748 | u32 res1:8; /* Reserved */ | ||
749 | u32 reason_code:8; /* reason code for reject */ | ||
750 | u32 reason_expl:8; /* reason code explanation */ | ||
751 | u32 vendor_unique:8;/* vendor unique reason code,set to 0 */ | ||
752 | }; | ||
753 | |||
754 | /* | ||
755 | * TPRLO logout parameter page | ||
756 | */ | ||
757 | struct fc_tprlo_params_page_s{ | ||
758 | u32 type:8; | ||
759 | u32 type_ext:8; | ||
760 | |||
761 | #ifdef __BIGENDIAN | ||
762 | u32 opa_valid:1; | ||
763 | u32 rpa_valid:1; | ||
764 | u32 tpo_nport_valid:1; | ||
765 | u32 global_process_logout:1; | ||
766 | u32 res1:12; | ||
767 | #else | ||
768 | u32 res1:12; | ||
769 | u32 global_process_logout:1; | ||
770 | u32 tpo_nport_valid:1; | ||
771 | u32 rpa_valid:1; | ||
772 | u32 opa_valid:1; | ||
773 | #endif | ||
774 | |||
775 | u32 orig_process_assc; | ||
776 | u32 resp_process_assc; | ||
777 | |||
778 | u32 res2:8; | ||
779 | u32 tpo_nport_id; | ||
780 | }; | ||
781 | |||
782 | /* | ||
783 | * TPRLO ELS command payload | ||
784 | */ | ||
785 | struct fc_tprlo_s{ | ||
786 | u32 command:8; | ||
787 | u32 page_len:8; | ||
788 | u32 payload_len:16; | ||
789 | |||
790 | struct fc_tprlo_params_page_s tprlo_params[1]; | ||
791 | }; | ||
792 | |||
793 | enum fc_tprlo_type{ | ||
794 | FC_GLOBAL_LOGO = 1, | ||
795 | FC_TPR_LOGO | ||
796 | }; | ||
797 | |||
798 | /* | ||
799 | * TPRLO els command ACC payload | ||
800 | */ | ||
801 | struct fc_tprlo_acc_s{ | ||
802 | u32 command:8; | ||
803 | u32 page_len:8; | ||
804 | u32 payload_len:16; | ||
805 | struct fc_prlo_acc_params_page_s tprlo_acc_params[1]; | ||
806 | }; | ||
807 | |||
808 | /* | ||
809 | * RSCN els command req payload | ||
810 | */ | ||
811 | #define FC_RSCN_PGLEN 0x4 | ||
812 | |||
813 | enum fc_rscn_format{ | ||
814 | FC_RSCN_FORMAT_PORTID = 0x0, | ||
815 | FC_RSCN_FORMAT_AREA = 0x1, | ||
816 | FC_RSCN_FORMAT_DOMAIN = 0x2, | ||
817 | FC_RSCN_FORMAT_FABRIC = 0x3, | ||
818 | }; | ||
819 | |||
820 | struct fc_rscn_event_s{ | ||
821 | u32 format:2; | ||
822 | u32 qualifier:4; | ||
823 | u32 resvd:2; | ||
824 | u32 portid:24; | ||
825 | }; | ||
826 | |||
827 | struct fc_rscn_pl_s{ | ||
828 | u8 command; | ||
829 | u8 pagelen; | ||
830 | u16 payldlen; | ||
831 | struct fc_rscn_event_s event[1]; | ||
832 | }; | ||
833 | |||
834 | /* | ||
835 | * ECHO els command req payload | ||
836 | */ | ||
837 | struct fc_echo_s { | ||
838 | struct fc_els_cmd_s els_cmd; | ||
839 | }; | ||
840 | |||
841 | /* | ||
842 | * RNID els command | ||
843 | */ | ||
844 | |||
845 | #define RNID_NODEID_DATA_FORMAT_COMMON 0x00 | ||
846 | #define RNID_NODEID_DATA_FORMAT_FCP3 0x08 | ||
847 | #define RNID_NODEID_DATA_FORMAT_DISCOVERY 0xDF | ||
848 | |||
849 | #define RNID_ASSOCIATED_TYPE_UNKNOWN 0x00000001 | ||
850 | #define RNID_ASSOCIATED_TYPE_OTHER 0x00000002 | ||
851 | #define RNID_ASSOCIATED_TYPE_HUB 0x00000003 | ||
852 | #define RNID_ASSOCIATED_TYPE_SWITCH 0x00000004 | ||
853 | #define RNID_ASSOCIATED_TYPE_GATEWAY 0x00000005 | ||
854 | #define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE 0x00000009 | ||
855 | #define RNID_ASSOCIATED_TYPE_HOST 0x0000000A | ||
856 | #define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM 0x0000000B | ||
857 | #define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE 0x0000000E | ||
858 | #define RNID_ASSOCIATED_TYPE_NAS_SERVER 0x00000011 | ||
859 | #define RNID_ASSOCIATED_TYPE_BRIDGE 0x00000002 | ||
860 | #define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE 0x00000003 | ||
861 | #define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE 0x000000FF | ||
862 | |||
863 | /* | ||
864 | * RNID els command payload | ||
865 | */ | ||
866 | struct fc_rnid_cmd_s{ | ||
867 | struct fc_els_cmd_s els_cmd; | ||
868 | u32 node_id_data_format:8; | ||
869 | u32 reserved:24; | ||
870 | }; | ||
871 | |||
872 | /* | ||
873 | * RNID els response payload | ||
874 | */ | ||
875 | |||
876 | struct fc_rnid_common_id_data_s{ | ||
877 | wwn_t port_name; | ||
878 | wwn_t node_name; | ||
879 | }; | ||
880 | |||
881 | struct fc_rnid_general_topology_data_s{ | ||
882 | u32 vendor_unique[4]; | ||
883 | u32 asso_type; | ||
884 | u32 phy_port_num; | ||
885 | u32 num_attached_nodes; | ||
886 | u32 node_mgmt:8; | ||
887 | u32 ip_version:8; | ||
888 | u32 udp_tcp_port_num:16; | ||
889 | u32 ip_address[4]; | ||
890 | u32 reserved:16; | ||
891 | u32 vendor_specific:16; | ||
892 | }; | ||
893 | |||
894 | struct fc_rnid_acc_s{ | ||
895 | struct fc_els_cmd_s els_cmd; | ||
896 | u32 node_id_data_format:8; | ||
897 | u32 common_id_data_length:8; | ||
898 | u32 reserved:8; | ||
899 | u32 specific_id_data_length:8; | ||
900 | struct fc_rnid_common_id_data_s common_id_data; | ||
901 | struct fc_rnid_general_topology_data_s gen_topology_data; | ||
902 | }; | ||
903 | |||
904 | #define RNID_ASSOCIATED_TYPE_UNKNOWN 0x00000001 | ||
905 | #define RNID_ASSOCIATED_TYPE_OTHER 0x00000002 | ||
906 | #define RNID_ASSOCIATED_TYPE_HUB 0x00000003 | ||
907 | #define RNID_ASSOCIATED_TYPE_SWITCH 0x00000004 | ||
908 | #define RNID_ASSOCIATED_TYPE_GATEWAY 0x00000005 | ||
909 | #define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE 0x00000009 | ||
910 | #define RNID_ASSOCIATED_TYPE_HOST 0x0000000A | ||
911 | #define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM 0x0000000B | ||
912 | #define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE 0x0000000E | ||
913 | #define RNID_ASSOCIATED_TYPE_NAS_SERVER 0x00000011 | ||
914 | #define RNID_ASSOCIATED_TYPE_BRIDGE 0x00000002 | ||
915 | #define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE 0x00000003 | ||
916 | #define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE 0x000000FF | ||
917 | |||
918 | enum fc_rpsc_speed_cap{ | ||
919 | RPSC_SPEED_CAP_1G = 0x8000, | ||
920 | RPSC_SPEED_CAP_2G = 0x4000, | ||
921 | RPSC_SPEED_CAP_4G = 0x2000, | ||
922 | RPSC_SPEED_CAP_10G = 0x1000, | ||
923 | RPSC_SPEED_CAP_8G = 0x0800, | ||
924 | RPSC_SPEED_CAP_16G = 0x0400, | ||
925 | |||
926 | RPSC_SPEED_CAP_UNKNOWN = 0x0001, | ||
927 | }; | ||
928 | |||
929 | enum fc_rpsc_op_speed_s{ | ||
930 | RPSC_OP_SPEED_1G = 0x8000, | ||
931 | RPSC_OP_SPEED_2G = 0x4000, | ||
932 | RPSC_OP_SPEED_4G = 0x2000, | ||
933 | RPSC_OP_SPEED_10G = 0x1000, | ||
934 | RPSC_OP_SPEED_8G = 0x0800, | ||
935 | RPSC_OP_SPEED_16G = 0x0400, | ||
936 | |||
937 | RPSC_OP_SPEED_NOT_EST = 0x0001, /*! speed not established */ | ||
938 | }; | ||
939 | |||
940 | struct fc_rpsc_speed_info_s{ | ||
941 | u16 port_speed_cap; /*! see fc_rpsc_speed_cap_t */ | ||
942 | u16 port_op_speed; /*! see fc_rpsc_op_speed_t */ | ||
943 | }; | ||
944 | |||
945 | enum link_e2e_beacon_subcmd{ | ||
946 | LINK_E2E_BEACON_ON = 1, | ||
947 | LINK_E2E_BEACON_OFF = 2 | ||
948 | }; | ||
949 | |||
950 | enum beacon_type{ | ||
951 | BEACON_TYPE_NORMAL = 1, /*! Normal Beaconing. Green */ | ||
952 | BEACON_TYPE_WARN = 2, /*! Warning Beaconing. Yellow/Amber */ | ||
953 | BEACON_TYPE_CRITICAL = 3 /*! Critical Beaconing. Red */ | ||
954 | }; | ||
955 | |||
956 | struct link_e2e_beacon_param_s { | ||
957 | u8 beacon_type; /* Beacon Type. See beacon_type_t */ | ||
958 | u8 beacon_frequency; | ||
959 | /* Beacon frequency. Number of blinks | ||
960 | * per 10 seconds | ||
961 | */ | ||
962 | u16 beacon_duration;/* Beacon duration (in Seconds). The | ||
963 | * command operation should be | ||
964 | * terminated at the end of this | ||
965 | * timeout value. | ||
966 | * | ||
967 | * Ignored if diag_sub_cmd is | ||
968 | * LINK_E2E_BEACON_OFF. | ||
969 | * | ||
970 | * If 0, beaconing will continue till a | ||
971 | * BEACON OFF request is received | ||
972 | */ | ||
973 | }; | ||
974 | |||
975 | /* | ||
976 | * Link E2E beacon request/good response format. For LS_RJTs use fc_ls_rjt_t | ||
977 | */ | ||
978 | struct link_e2e_beacon_req_s{ | ||
979 | u32 ls_code; /*! FC_ELS_E2E_LBEACON in requests * | ||
980 | *or FC_ELS_ACC in good replies */ | ||
981 | u32 ls_sub_cmd; /*! See link_e2e_beacon_subcmd_t */ | ||
982 | struct link_e2e_beacon_param_s beacon_parm; | ||
983 | }; | ||
984 | |||
985 | /** | ||
986 | * If RPSC request is sent to the Domain Controller, the request is for | ||
987 | * all the ports within that domain (TODO - I don't think FOS implements | ||
988 | * this...). | ||
989 | */ | ||
990 | struct fc_rpsc_cmd_s{ | ||
991 | struct fc_els_cmd_s els_cmd; | ||
992 | }; | ||
993 | |||
994 | /* | ||
995 | * RPSC Acc | ||
996 | */ | ||
997 | struct fc_rpsc_acc_s{ | ||
998 | u32 command:8; | ||
999 | u32 rsvd:8; | ||
1000 | u32 num_entries:16; | ||
1001 | |||
1002 | struct fc_rpsc_speed_info_s speed_info[1]; | ||
1003 | }; | ||
1004 | |||
1005 | /** | ||
1006 | * If RPSC2 request is sent to the Domain Controller, | ||
1007 | */ | ||
1008 | #define FC_BRCD_TOKEN 0x42524344 | ||
1009 | |||
1010 | struct fc_rpsc2_cmd_s{ | ||
1011 | struct fc_els_cmd_s els_cmd; | ||
1012 | u32 token; | ||
1013 | u16 resvd; | ||
1014 | u16 num_pids; /* Number of pids in the request */ | ||
1015 | struct { | ||
1016 | u32 rsvd1:8; | ||
1017 | u32 pid:24; /* port identifier */ | ||
1018 | } pid_list[1]; | ||
1019 | }; | ||
1020 | |||
1021 | enum fc_rpsc2_port_type{ | ||
1022 | RPSC2_PORT_TYPE_UNKNOWN = 0, | ||
1023 | RPSC2_PORT_TYPE_NPORT = 1, | ||
1024 | RPSC2_PORT_TYPE_NLPORT = 2, | ||
1025 | RPSC2_PORT_TYPE_NPIV_PORT = 0x5f, | ||
1026 | RPSC2_PORT_TYPE_NPORT_TRUNK = 0x6f, | ||
1027 | }; | ||
1028 | |||
1029 | /* | ||
1030 | * RPSC2 portInfo entry structure | ||
1031 | */ | ||
1032 | struct fc_rpsc2_port_info_s{ | ||
1033 | u32 pid; /* PID */ | ||
1034 | u16 resvd1; | ||
1035 | u16 index; /* port number / index */ | ||
1036 | u8 resvd2; | ||
1037 | u8 type; /* port type N/NL/... */ | ||
1038 | u16 speed; /* port Operating Speed */ | ||
1039 | }; | ||
1040 | |||
1041 | /* | ||
1042 | * RPSC2 Accept payload | ||
1043 | */ | ||
1044 | struct fc_rpsc2_acc_s{ | ||
1045 | u8 els_cmd; | ||
1046 | u8 resvd; | ||
1047 | u16 num_pids; /* Number of pids in the request */ | ||
1048 | struct fc_rpsc2_port_info_s port_info[1]; /* port information */ | ||
1049 | }; | ||
1050 | |||
1051 | /** | ||
1052 | * bit fields so that multiple classes can be specified | ||
1053 | */ | ||
1054 | enum fc_cos{ | ||
1055 | FC_CLASS_2 = 0x04, | ||
1056 | FC_CLASS_3 = 0x08, | ||
1057 | FC_CLASS_2_3 = 0x0C, | ||
1058 | }; | ||
1059 | |||
1060 | /* | ||
1061 | * symbolic name | ||
1062 | */ | ||
1063 | struct fc_symname_s{ | ||
1064 | u8 symname[FC_SYMNAME_MAX]; | ||
1065 | }; | ||
1066 | |||
1067 | struct fc_alpabm_s{ | ||
1068 | u8 alpa_bm[FC_ALPA_MAX / 8]; | ||
1069 | }; | ||
1070 | |||
1071 | /* | ||
1072 | * protocol default timeout values | ||
1073 | */ | ||
1074 | #define FC_ED_TOV 2 | ||
1075 | #define FC_REC_TOV (FC_ED_TOV + 1) | ||
1076 | #define FC_RA_TOV 10 | ||
1077 | #define FC_ELS_TOV (2 * FC_RA_TOV) | ||
1078 | |||
1079 | /* | ||
1080 | * virtual fabric related defines | ||
1081 | */ | ||
1082 | #define FC_VF_ID_NULL 0 /* must not be used as VF_ID */ | ||
1083 | #define FC_VF_ID_MIN 1 | ||
1084 | #define FC_VF_ID_MAX 0xEFF | ||
1085 | #define FC_VF_ID_CTL 0xFEF /* control VF_ID */ | ||
1086 | |||
1087 | /** | ||
1088 | * Virtual Fabric Tagging header format | ||
1089 | * @caution This is defined only in BIG ENDIAN format. | ||
1090 | */ | ||
1091 | struct fc_vft_s{ | ||
1092 | u32 r_ctl:8; | ||
1093 | u32 ver:2; | ||
1094 | u32 type:4; | ||
1095 | u32 res_a:2; | ||
1096 | u32 priority:3; | ||
1097 | u32 vf_id:12; | ||
1098 | u32 res_b:1; | ||
1099 | u32 hopct:8; | ||
1100 | u32 res_c:24; | ||
1101 | }; | ||
1102 | |||
1103 | #pragma pack() | ||
1104 | |||
1105 | #endif | ||
diff --git a/drivers/scsi/bfa/include/protocol/fc_sp.h b/drivers/scsi/bfa/include/protocol/fc_sp.h new file mode 100644 index 00000000000..55bb0b31d04 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/fc_sp.h | |||
@@ -0,0 +1,224 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __FC_SP_H__ | ||
19 | #define __FC_SP_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | |||
23 | #pragma pack(1) | ||
24 | |||
25 | enum auth_els_flags{ | ||
26 | FC_AUTH_ELS_MORE_FRAGS_FLAG = 0x80, /*! bit-7. More Fragments | ||
27 | * Follow | ||
28 | */ | ||
29 | FC_AUTH_ELS_CONCAT_FLAG = 0x40, /*! bit-6. Concatenation Flag */ | ||
30 | FC_AUTH_ELS_SEQ_NUM_FLAG = 0x01 /*! bit-0. Sequence Number */ | ||
31 | }; | ||
32 | |||
33 | enum auth_msg_codes{ | ||
34 | FC_AUTH_MC_AUTH_RJT = 0x0A, /*! Auth Reject */ | ||
35 | FC_AUTH_MC_AUTH_NEG = 0x0B, /*! Auth Negotiate */ | ||
36 | FC_AUTH_MC_AUTH_DONE = 0x0C, /*! Auth Done */ | ||
37 | |||
38 | FC_AUTH_MC_DHCHAP_CHAL = 0x10, /*! DHCHAP Challenge */ | ||
39 | FC_AUTH_MC_DHCHAP_REPLY = 0x11, /*! DHCHAP Reply */ | ||
40 | FC_AUTH_MC_DHCHAP_SUCC = 0x12, /*! DHCHAP Success */ | ||
41 | |||
42 | FC_AUTH_MC_FCAP_REQ = 0x13, /*! FCAP Request */ | ||
43 | FC_AUTH_MC_FCAP_ACK = 0x14, /*! FCAP Acknowledge */ | ||
44 | FC_AUTH_MC_FCAP_CONF = 0x15, /*! FCAP Confirm */ | ||
45 | |||
46 | FC_AUTH_MC_FCPAP_INIT = 0x16, /*! FCPAP Init */ | ||
47 | FC_AUTH_MC_FCPAP_ACC = 0x17, /*! FCPAP Accept */ | ||
48 | FC_AUTH_MC_FCPAP_COMP = 0x18, /*! FCPAP Complete */ | ||
49 | |||
50 | FC_AUTH_MC_IKE_SA_INIT = 0x22, /*! IKE SA INIT */ | ||
51 | FC_AUTH_MC_IKE_SA_AUTH = 0x23, /*! IKE SA Auth */ | ||
52 | FC_AUTH_MC_IKE_CREATE_CHILD_SA = 0x24, /*! IKE Create Child SA */ | ||
53 | FC_AUTH_MC_IKE_INFO = 0x25, /*! IKE informational */ | ||
54 | }; | ||
55 | |||
56 | enum auth_proto_version{ | ||
57 | FC_AUTH_PROTO_VER_1 = 1, /*! Protocol Version 1 */ | ||
58 | }; | ||
59 | |||
60 | enum { | ||
61 | FC_AUTH_ELS_COMMAND_CODE = 0x90,/*! Authentication ELS Command code */ | ||
62 | FC_AUTH_PROTO_PARAM_LEN_SZ = 4, /*! Size of Proto Parameter Len Field */ | ||
63 | FC_AUTH_PROTO_PARAM_VAL_SZ = 4, /*! Size of Proto Parameter Val Field */ | ||
64 | FC_MAX_AUTH_SECRET_LEN = 256, | ||
65 | /*! Maximum secret string length */ | ||
66 | FC_AUTH_NUM_USABLE_PROTO_LEN_SZ = 4, | ||
67 | /*! Size of usable protocols field */ | ||
68 | FC_AUTH_RESP_VALUE_LEN_SZ = 4, | ||
69 | /*! Size of response value length */ | ||
70 | FC_MAX_CHAP_KEY_LEN = 256, /*! Maximum md5 digest length */ | ||
71 | FC_MAX_AUTH_RETRIES = 3, /*! Maximum number of retries */ | ||
72 | FC_MD5_DIGEST_LEN = 16, /*! MD5 digest length */ | ||
73 | FC_SHA1_DIGEST_LEN = 20, /*! SHA1 digest length */ | ||
74 | FC_MAX_DHG_SUPPORTED = 1, /*! Maximum DH Groups supported */ | ||
75 | FC_MAX_ALG_SUPPORTED = 1, /*! Maximum algorithms supported */ | ||
76 | FC_MAX_PROTO_SUPPORTED = 1, /*! Maximum protocols supported */ | ||
77 | FC_START_TXN_ID = 2, /*! Starting transaction ID */ | ||
78 | }; | ||
79 | |||
80 | enum auth_proto_id{ | ||
81 | FC_AUTH_PROTO_DHCHAP = 0x00000001, | ||
82 | FC_AUTH_PROTO_FCAP = 0x00000002, | ||
83 | FC_AUTH_PROTO_FCPAP = 0x00000003, | ||
84 | FC_AUTH_PROTO_IKEv2 = 0x00000004, | ||
85 | FC_AUTH_PROTO_IKEv2_AUTH = 0x00000005, | ||
86 | }; | ||
87 | |||
88 | struct auth_name_s{ | ||
89 | u16 name_tag; /*! Name Tag = 1 for Authentication */ | ||
90 | u16 name_len; /*! Name Length = 8 for Authentication | ||
91 | */ | ||
92 | wwn_t name; /*! Name. TODO - is this PWWN */ | ||
93 | }; | ||
94 | |||
95 | |||
96 | enum auth_hash_func{ | ||
97 | FC_AUTH_HASH_FUNC_MD5 = 0x00000005, | ||
98 | FC_AUTH_HASH_FUNC_SHA_1 = 0x00000006, | ||
99 | }; | ||
100 | |||
101 | enum auth_dh_gid{ | ||
102 | FC_AUTH_DH_GID_0_DHG_NULL = 0x00000000, | ||
103 | FC_AUTH_DH_GID_1_DHG_1024 = 0x00000001, | ||
104 | FC_AUTH_DH_GID_2_DHG_1280 = 0x00000002, | ||
105 | FC_AUTH_DH_GID_3_DHG_1536 = 0x00000003, | ||
106 | FC_AUTH_DH_GID_4_DHG_2048 = 0x00000004, | ||
107 | FC_AUTH_DH_GID_6_DHG_3072 = 0x00000006, | ||
108 | FC_AUTH_DH_GID_7_DHG_4096 = 0x00000007, | ||
109 | FC_AUTH_DH_GID_8_DHG_6144 = 0x00000008, | ||
110 | FC_AUTH_DH_GID_9_DHG_8192 = 0x00000009, | ||
111 | }; | ||
112 | |||
113 | struct auth_els_msg_s { | ||
114 | u8 auth_els_code; /* Authentication ELS Code (0x90) */ | ||
115 | u8 auth_els_flag; /* Authentication ELS Flags */ | ||
116 | u8 auth_msg_code; /* Authentication Message Code */ | ||
117 | u8 proto_version; /* Protocol Version */ | ||
118 | u32 msg_len; /* Message Length */ | ||
119 | u32 trans_id; /* Transaction Identifier (T_ID) */ | ||
120 | |||
121 | /* Msg payload follows... */ | ||
122 | }; | ||
123 | |||
124 | |||
125 | enum auth_neg_param_tags { | ||
126 | FC_AUTH_NEG_DHCHAP_HASHLIST = 0x0001, | ||
127 | FC_AUTH_NEG_DHCHAP_DHG_ID_LIST = 0x0002, | ||
128 | }; | ||
129 | |||
130 | |||
131 | struct dhchap_param_format_s { | ||
132 | u16 tag; /*! Parameter Tag. See | ||
133 | * auth_neg_param_tags_t | ||
134 | */ | ||
135 | u16 word_cnt; | ||
136 | |||
137 | /* followed by variable length parameter value... */ | ||
138 | }; | ||
139 | |||
140 | struct auth_proto_params_s { | ||
141 | u32 proto_param_len; | ||
142 | u32 proto_id; | ||
143 | |||
144 | /* | ||
145 | * Followed by variable length Protocol specific parameters. DH-CHAP | ||
146 | * uses dhchap_param_format_t | ||
147 | */ | ||
148 | }; | ||
149 | |||
150 | struct auth_neg_msg_s { | ||
151 | struct auth_name_s auth_ini_name; | ||
152 | u32 usable_auth_protos; | ||
153 | struct auth_proto_params_s proto_params[1]; /*! (1..usable_auth_proto) | ||
154 | * protocol params | ||
155 | */ | ||
156 | }; | ||
157 | |||
158 | struct auth_dh_val_s { | ||
159 | u32 dh_val_len; | ||
160 | u32 dh_val[1]; | ||
161 | }; | ||
162 | |||
163 | struct auth_dhchap_chal_msg_s { | ||
164 | struct auth_els_msg_s hdr; | ||
165 | struct auth_name_s auth_responder_name; /* TODO VRK - is auth_name_t | ||
166 | * type OK? | ||
167 | */ | ||
168 | u32 hash_id; | ||
169 | u32 dh_grp_id; | ||
170 | u32 chal_val_len; | ||
171 | char chal_val[1]; | ||
172 | |||
173 | /* ...followed by variable Challenge length/value and DH length/value */ | ||
174 | }; | ||
175 | |||
176 | |||
177 | enum auth_rjt_codes { | ||
178 | FC_AUTH_RJT_CODE_AUTH_FAILURE = 0x01, | ||
179 | FC_AUTH_RJT_CODE_LOGICAL_ERR = 0x02, | ||
180 | }; | ||
181 | |||
182 | enum auth_rjt_code_exps { | ||
183 | FC_AUTH_CEXP_AUTH_MECH_NOT_USABLE = 0x01, | ||
184 | FC_AUTH_CEXP_DH_GROUP_NOT_USABLE = 0x02, | ||
185 | FC_AUTH_CEXP_HASH_FUNC_NOT_USABLE = 0x03, | ||
186 | FC_AUTH_CEXP_AUTH_XACT_STARTED = 0x04, | ||
187 | FC_AUTH_CEXP_AUTH_FAILED = 0x05, | ||
188 | FC_AUTH_CEXP_INCORRECT_PLD = 0x06, | ||
189 | FC_AUTH_CEXP_INCORRECT_PROTO_MSG = 0x07, | ||
190 | FC_AUTH_CEXP_RESTART_AUTH_PROTO = 0x08, | ||
191 | FC_AUTH_CEXP_AUTH_CONCAT_NOT_SUPP = 0x09, | ||
192 | FC_AUTH_CEXP_PROTO_VER_NOT_SUPP = 0x0A, | ||
193 | }; | ||
194 | |||
195 | enum auth_status { | ||
196 | FC_AUTH_STATE_INPROGRESS = 0, /*! authentication in progress */ | ||
197 | FC_AUTH_STATE_FAILED = 1, /*! authentication failed */ | ||
198 | FC_AUTH_STATE_SUCCESS = 2 /*! authentication successful */ | ||
199 | }; | ||
200 | |||
201 | struct auth_rjt_msg_s { | ||
202 | struct auth_els_msg_s hdr; | ||
203 | u8 reason_code; | ||
204 | u8 reason_code_exp; | ||
205 | u8 rsvd[2]; | ||
206 | }; | ||
207 | |||
208 | |||
209 | struct auth_dhchap_neg_msg_s { | ||
210 | struct auth_els_msg_s hdr; | ||
211 | struct auth_neg_msg_s nego; | ||
212 | }; | ||
213 | |||
214 | struct auth_dhchap_reply_msg_s { | ||
215 | struct auth_els_msg_s hdr; | ||
216 | |||
217 | /* | ||
218 | * followed by response value length & Value + DH Value Length & Value | ||
219 | */ | ||
220 | }; | ||
221 | |||
222 | #pragma pack() | ||
223 | |||
224 | #endif /* __FC_SP_H__ */ | ||
diff --git a/drivers/scsi/bfa/include/protocol/fcp.h b/drivers/scsi/bfa/include/protocol/fcp.h new file mode 100644 index 00000000000..9ade68ad285 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/fcp.h | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __FCPPROTO_H__ | ||
19 | #define __FCPPROTO_H__ | ||
20 | |||
21 | #include <protocol/scsi.h> | ||
22 | |||
23 | #pragma pack(1) | ||
24 | |||
25 | enum { | ||
26 | FCP_RJT = 0x01000000, /* SRR reject */ | ||
27 | FCP_SRR_ACCEPT = 0x02000000, /* SRR accept */ | ||
28 | FCP_SRR = 0x14000000, /* Sequence Retransmission Request */ | ||
29 | }; | ||
30 | |||
31 | /* | ||
32 | * SRR FC-4 LS payload | ||
33 | */ | ||
34 | struct fc_srr_s{ | ||
35 | u32 ls_cmd; | ||
36 | u32 ox_id:16; /* ox-id */ | ||
37 | u32 rx_id:16; /* rx-id */ | ||
38 | u32 ro; /* relative offset */ | ||
39 | u32 r_ctl:8; /* R_CTL for I.U. */ | ||
40 | u32 res:24; | ||
41 | }; | ||
42 | |||
43 | |||
44 | /* | ||
45 | * FCP_CMND definitions | ||
46 | */ | ||
47 | #define FCP_CMND_CDB_LEN 16 | ||
48 | #define FCP_CMND_LUN_LEN 8 | ||
49 | |||
50 | struct fcp_cmnd_s{ | ||
51 | lun_t lun; /* 64-bit LU number */ | ||
52 | u8 crn; /* command reference number */ | ||
53 | #ifdef __BIGENDIAN | ||
54 | u8 resvd:1, | ||
55 | priority:4, /* FCP-3: SAM-3 priority */ | ||
56 | taskattr:3; /* scsi task attribute */ | ||
57 | #else | ||
58 | u8 taskattr:3, /* scsi task attribute */ | ||
59 | priority:4, /* FCP-3: SAM-3 priority */ | ||
60 | resvd:1; | ||
61 | #endif | ||
62 | u8 tm_flags; /* task management flags */ | ||
63 | #ifdef __BIGENDIAN | ||
64 | u8 addl_cdb_len:6, /* additional CDB length words */ | ||
65 | iodir:2; /* read/write FCP_DATA IUs */ | ||
66 | #else | ||
67 | u8 iodir:2, /* read/write FCP_DATA IUs */ | ||
68 | addl_cdb_len:6; /* additional CDB length */ | ||
69 | #endif | ||
70 | struct scsi_cdb_s cdb; | ||
71 | |||
72 | /* | ||
73 | * !!! additional cdb bytes follows here!!! | ||
74 | */ | ||
75 | u32 fcp_dl; /* bytes to be transferred */ | ||
76 | }; | ||
77 | |||
78 | #define fcp_cmnd_cdb_len(_cmnd) ((_cmnd)->addl_cdb_len * 4 + FCP_CMND_CDB_LEN) | ||
79 | #define fcp_cmnd_fcpdl(_cmnd) ((&(_cmnd)->fcp_dl)[(_cmnd)->addl_cdb_len]) | ||
80 | |||
81 | /* | ||
82 | * fcp_cmnd_t.iodir field values | ||
83 | */ | ||
84 | enum fcp_iodir{ | ||
85 | FCP_IODIR_NONE = 0, | ||
86 | FCP_IODIR_WRITE = 1, | ||
87 | FCP_IODIR_READ = 2, | ||
88 | FCP_IODIR_RW = 3, | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * Task attribute field | ||
93 | */ | ||
94 | enum { | ||
95 | FCP_TASK_ATTR_SIMPLE = 0, | ||
96 | FCP_TASK_ATTR_HOQ = 1, | ||
97 | FCP_TASK_ATTR_ORDERED = 2, | ||
98 | FCP_TASK_ATTR_ACA = 4, | ||
99 | FCP_TASK_ATTR_UNTAGGED = 5, /* obsolete in FCP-3 */ | ||
100 | }; | ||
101 | |||
102 | /* | ||
103 | * Task management flags field - only one bit shall be set | ||
104 | */ | ||
105 | #ifndef BIT | ||
106 | #define BIT(_x) (1 << (_x)) | ||
107 | #endif | ||
108 | enum fcp_tm_cmnd{ | ||
109 | FCP_TM_ABORT_TASK_SET = BIT(1), | ||
110 | FCP_TM_CLEAR_TASK_SET = BIT(2), | ||
111 | FCP_TM_LUN_RESET = BIT(4), | ||
112 | FCP_TM_TARGET_RESET = BIT(5), /* obsolete in FCP-3 */ | ||
113 | FCP_TM_CLEAR_ACA = BIT(6), | ||
114 | }; | ||
115 | |||
116 | /* | ||
117 | * FCP_XFER_RDY IU defines | ||
118 | */ | ||
119 | struct fcp_xfer_rdy_s{ | ||
120 | u32 data_ro; | ||
121 | u32 burst_len; | ||
122 | u32 reserved; | ||
123 | }; | ||
124 | |||
125 | /* | ||
126 | * FCP_RSP residue flags | ||
127 | */ | ||
128 | enum fcp_residue{ | ||
129 | FCP_NO_RESIDUE = 0, /* no residue */ | ||
130 | FCP_RESID_OVER = 1, /* more data left that was not sent */ | ||
131 | FCP_RESID_UNDER = 2, /* less data than requested */ | ||
132 | }; | ||
133 | |||
134 | enum { | ||
135 | FCP_RSPINFO_GOOD = 0, | ||
136 | FCP_RSPINFO_DATALEN_MISMATCH = 1, | ||
137 | FCP_RSPINFO_CMND_INVALID = 2, | ||
138 | FCP_RSPINFO_ROLEN_MISMATCH = 3, | ||
139 | FCP_RSPINFO_TM_NOT_SUPP = 4, | ||
140 | FCP_RSPINFO_TM_FAILED = 5, | ||
141 | }; | ||
142 | |||
143 | struct fcp_rspinfo_s{ | ||
144 | u32 res0:24; | ||
145 | u32 rsp_code:8; /* response code (as above) */ | ||
146 | u32 res1; | ||
147 | }; | ||
148 | |||
149 | struct fcp_resp_s{ | ||
150 | u32 reserved[2]; /* 2 words reserved */ | ||
151 | u16 reserved2; | ||
152 | #ifdef __BIGENDIAN | ||
153 | u8 reserved3:3; | ||
154 | u8 fcp_conf_req:1; /* FCP_CONF is requested */ | ||
155 | u8 resid_flags:2; /* underflow/overflow */ | ||
156 | u8 sns_len_valid:1;/* sense len is valid */ | ||
157 | u8 rsp_len_valid:1;/* response len is valid */ | ||
158 | #else | ||
159 | u8 rsp_len_valid:1;/* response len is valid */ | ||
160 | u8 sns_len_valid:1;/* sense len is valid */ | ||
161 | u8 resid_flags:2; /* underflow/overflow */ | ||
162 | u8 fcp_conf_req:1; /* FCP_CONF is requested */ | ||
163 | u8 reserved3:3; | ||
164 | #endif | ||
165 | u8 scsi_status; /* one byte SCSI status */ | ||
166 | u32 residue; /* residual data bytes */ | ||
167 | u32 sns_len; /* length od sense info */ | ||
168 | u32 rsp_len; /* length of response info */ | ||
169 | }; | ||
170 | |||
171 | #define fcp_snslen(__fcprsp) ((__fcprsp)->sns_len_valid ? \ | ||
172 | (__fcprsp)->sns_len : 0) | ||
173 | #define fcp_rsplen(__fcprsp) ((__fcprsp)->rsp_len_valid ? \ | ||
174 | (__fcprsp)->rsp_len : 0) | ||
175 | #define fcp_rspinfo(__fcprsp) ((struct fcp_rspinfo_s *)((__fcprsp) + 1)) | ||
176 | #define fcp_snsinfo(__fcprsp) (((u8 *)fcp_rspinfo(__fcprsp)) + \ | ||
177 | fcp_rsplen(__fcprsp)) | ||
178 | |||
179 | struct fcp_cmnd_fr_s{ | ||
180 | struct fchs_s fchs; | ||
181 | struct fcp_cmnd_s fcp; | ||
182 | }; | ||
183 | |||
184 | #pragma pack() | ||
185 | |||
186 | #endif | ||
diff --git a/drivers/scsi/bfa/include/protocol/fdmi.h b/drivers/scsi/bfa/include/protocol/fdmi.h new file mode 100644 index 00000000000..6c05c268c71 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/fdmi.h | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __FDMI_H__ | ||
19 | #define __FDMI_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | #include <protocol/fc.h> | ||
23 | #include <protocol/ct.h> | ||
24 | |||
25 | #pragma pack(1) | ||
26 | |||
27 | /* | ||
28 | * FDMI Command Codes | ||
29 | */ | ||
30 | #define FDMI_GRHL 0x0100 | ||
31 | #define FDMI_GHAT 0x0101 | ||
32 | #define FDMI_GRPL 0x0102 | ||
33 | #define FDMI_GPAT 0x0110 | ||
34 | #define FDMI_RHBA 0x0200 | ||
35 | #define FDMI_RHAT 0x0201 | ||
36 | #define FDMI_RPRT 0x0210 | ||
37 | #define FDMI_RPA 0x0211 | ||
38 | #define FDMI_DHBA 0x0300 | ||
39 | #define FDMI_DPRT 0x0310 | ||
40 | |||
41 | /* | ||
42 | * FDMI reason codes | ||
43 | */ | ||
44 | #define FDMI_NO_ADDITIONAL_EXP 0x00 | ||
45 | #define FDMI_HBA_ALREADY_REG 0x10 | ||
46 | #define FDMI_HBA_ATTRIB_NOT_REG 0x11 | ||
47 | #define FDMI_HBA_ATTRIB_MULTIPLE 0x12 | ||
48 | #define FDMI_HBA_ATTRIB_LENGTH_INVALID 0x13 | ||
49 | #define FDMI_HBA_ATTRIB_NOT_PRESENT 0x14 | ||
50 | #define FDMI_PORT_ORIG_NOT_IN_LIST 0x15 | ||
51 | #define FDMI_PORT_HBA_NOT_IN_LIST 0x16 | ||
52 | #define FDMI_PORT_ATTRIB_NOT_REG 0x20 | ||
53 | #define FDMI_PORT_NOT_REG 0x21 | ||
54 | #define FDMI_PORT_ATTRIB_MULTIPLE 0x22 | ||
55 | #define FDMI_PORT_ATTRIB_LENGTH_INVALID 0x23 | ||
56 | #define FDMI_PORT_ALREADY_REGISTEREED 0x24 | ||
57 | |||
58 | /* | ||
59 | * FDMI Transmission Speed Mask values | ||
60 | */ | ||
61 | #define FDMI_TRANS_SPEED_1G 0x00000001 | ||
62 | #define FDMI_TRANS_SPEED_2G 0x00000002 | ||
63 | #define FDMI_TRANS_SPEED_10G 0x00000004 | ||
64 | #define FDMI_TRANS_SPEED_4G 0x00000008 | ||
65 | #define FDMI_TRANS_SPEED_8G 0x00000010 | ||
66 | #define FDMI_TRANS_SPEED_16G 0x00000020 | ||
67 | #define FDMI_TRANS_SPEED_UNKNOWN 0x00008000 | ||
68 | |||
69 | /* | ||
70 | * FDMI HBA attribute types | ||
71 | */ | ||
72 | enum fdmi_hba_attribute_type { | ||
73 | FDMI_HBA_ATTRIB_NODENAME = 1, /* 0x0001 */ | ||
74 | FDMI_HBA_ATTRIB_MANUFACTURER, /* 0x0002 */ | ||
75 | FDMI_HBA_ATTRIB_SERIALNUM, /* 0x0003 */ | ||
76 | FDMI_HBA_ATTRIB_MODEL, /* 0x0004 */ | ||
77 | FDMI_HBA_ATTRIB_MODEL_DESC, /* 0x0005 */ | ||
78 | FDMI_HBA_ATTRIB_HW_VERSION, /* 0x0006 */ | ||
79 | FDMI_HBA_ATTRIB_DRIVER_VERSION, /* 0x0007 */ | ||
80 | FDMI_HBA_ATTRIB_ROM_VERSION, /* 0x0008 */ | ||
81 | FDMI_HBA_ATTRIB_FW_VERSION, /* 0x0009 */ | ||
82 | FDMI_HBA_ATTRIB_OS_NAME, /* 0x000A */ | ||
83 | FDMI_HBA_ATTRIB_MAX_CT, /* 0x000B */ | ||
84 | |||
85 | FDMI_HBA_ATTRIB_MAX_TYPE | ||
86 | }; | ||
87 | |||
88 | /* | ||
89 | * FDMI Port attribute types | ||
90 | */ | ||
91 | enum fdmi_port_attribute_type { | ||
92 | FDMI_PORT_ATTRIB_FC4_TYPES = 1, /* 0x0001 */ | ||
93 | FDMI_PORT_ATTRIB_SUPP_SPEED, /* 0x0002 */ | ||
94 | FDMI_PORT_ATTRIB_PORT_SPEED, /* 0x0003 */ | ||
95 | FDMI_PORT_ATTRIB_FRAME_SIZE, /* 0x0004 */ | ||
96 | FDMI_PORT_ATTRIB_DEV_NAME, /* 0x0005 */ | ||
97 | FDMI_PORT_ATTRIB_HOST_NAME, /* 0x0006 */ | ||
98 | |||
99 | FDMI_PORT_ATTR_MAX_TYPE | ||
100 | }; | ||
101 | |||
102 | /* | ||
103 | * FDMI attribute | ||
104 | */ | ||
105 | struct fdmi_attr_s { | ||
106 | u16 type; | ||
107 | u16 len; | ||
108 | u8 value[1]; | ||
109 | }; | ||
110 | |||
111 | /* | ||
112 | * HBA Attribute Block | ||
113 | */ | ||
114 | struct fdmi_hba_attr_s { | ||
115 | u32 attr_count; /* # of attributes */ | ||
116 | struct fdmi_attr_s hba_attr; /* n attributes */ | ||
117 | }; | ||
118 | |||
119 | /* | ||
120 | * Registered Port List | ||
121 | */ | ||
122 | struct fdmi_port_list_s { | ||
123 | u32 num_ports; /* number Of Port Entries */ | ||
124 | wwn_t port_entry; /* one or more */ | ||
125 | }; | ||
126 | |||
127 | /* | ||
128 | * Port Attribute Block | ||
129 | */ | ||
130 | struct fdmi_port_attr_s { | ||
131 | u32 attr_count; /* # of attributes */ | ||
132 | struct fdmi_attr_s port_attr; /* n attributes */ | ||
133 | }; | ||
134 | |||
135 | /* | ||
136 | * FDMI Register HBA Attributes | ||
137 | */ | ||
138 | struct fdmi_rhba_s { | ||
139 | wwn_t hba_id; /* HBA Identifier */ | ||
140 | struct fdmi_port_list_s port_list; /* Registered Port List */ | ||
141 | struct fdmi_hba_attr_s hba_attr_blk; /* HBA attribute block */ | ||
142 | }; | ||
143 | |||
144 | /* | ||
145 | * FDMI Register Port | ||
146 | */ | ||
147 | struct fdmi_rprt_s { | ||
148 | wwn_t hba_id; /* HBA Identifier */ | ||
149 | wwn_t port_name; /* Port wwn */ | ||
150 | struct fdmi_port_attr_s port_attr_blk; /* Port Attr Block */ | ||
151 | }; | ||
152 | |||
153 | /* | ||
154 | * FDMI Register Port Attributes | ||
155 | */ | ||
156 | struct fdmi_rpa_s { | ||
157 | wwn_t port_name; /* port wwn */ | ||
158 | struct fdmi_port_attr_s port_attr_blk; /* Port Attr Block */ | ||
159 | }; | ||
160 | |||
161 | #pragma pack() | ||
162 | |||
163 | #endif | ||
diff --git a/drivers/scsi/bfa/include/protocol/pcifw.h b/drivers/scsi/bfa/include/protocol/pcifw.h new file mode 100644 index 00000000000..6830dc3ee58 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/pcifw.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | /** | ||
19 | * pcifw.h PCI FW related headers | ||
20 | */ | ||
21 | |||
22 | #ifndef __PCIFW_H__ | ||
23 | #define __PCIFW_H__ | ||
24 | |||
25 | #pragma pack(1) | ||
26 | |||
27 | struct pnp_hdr_s{ | ||
28 | u32 signature; /* "$PnP" */ | ||
29 | u8 rev; /* Struct revision */ | ||
30 | u8 len; /* Header structure len in multiples | ||
31 | * of 16 bytes */ | ||
32 | u16 off; /* Offset to next header 00 if none */ | ||
33 | u8 rsvd; /* Reserved byte */ | ||
34 | u8 cksum; /* 8-bit checksum for this header */ | ||
35 | u32 pnp_dev_id; /* PnP Device Id */ | ||
36 | u16 mfstr; /* Pointer to manufacturer string */ | ||
37 | u16 prstr; /* Pointer to product string */ | ||
38 | u8 devtype[3]; /* Device Type Code */ | ||
39 | u8 devind; /* Device Indicator */ | ||
40 | u16 bcventr; /* Bootstrap entry vector */ | ||
41 | u16 rsvd2; /* Reserved */ | ||
42 | u16 sriv; /* Static resource information vector */ | ||
43 | }; | ||
44 | |||
45 | struct pci_3_0_ds_s{ | ||
46 | u32 sig; /* Signature "PCIR" */ | ||
47 | u16 vendid; /* Vendor ID */ | ||
48 | u16 devid; /* Device ID */ | ||
49 | u16 devlistoff; /* Device List Offset */ | ||
50 | u16 len; /* PCI Data Structure Length */ | ||
51 | u8 rev; /* PCI Data Structure Revision */ | ||
52 | u8 clcode[3]; /* Class Code */ | ||
53 | u16 imglen; /* Code image length in multiples of | ||
54 | * 512 bytes */ | ||
55 | u16 coderev; /* Revision level of code/data */ | ||
56 | u8 codetype; /* Code type 0x00 - BIOS */ | ||
57 | u8 indr; /* Last image indicator */ | ||
58 | u16 mrtimglen; /* Max Run Time Image Length */ | ||
59 | u16 cuoff; /* Config Utility Code Header Offset */ | ||
60 | u16 dmtfclp; /* DMTF CLP entry point offset */ | ||
61 | }; | ||
62 | |||
63 | struct pci_optrom_hdr_s{ | ||
64 | u16 sig; /* Signature 0x55AA */ | ||
65 | u8 len; /* Option ROM length in units of 512 bytes */ | ||
66 | u8 inivec[3]; /* Initialization vector */ | ||
67 | u8 rsvd[16]; /* Reserved field */ | ||
68 | u16 verptr; /* Pointer to version string - private */ | ||
69 | u16 pcids; /* Pointer to PCI data structure */ | ||
70 | u16 pnphdr; /* Pointer to PnP expansion header */ | ||
71 | }; | ||
72 | |||
73 | #pragma pack() | ||
74 | |||
75 | #endif | ||
diff --git a/drivers/scsi/bfa/include/protocol/scsi.h b/drivers/scsi/bfa/include/protocol/scsi.h new file mode 100644 index 00000000000..b220e6b4f6e --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/scsi.h | |||
@@ -0,0 +1,1648 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __SCSI_H__ | ||
19 | #define __SCSI_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | |||
23 | #pragma pack(1) | ||
24 | |||
25 | /* | ||
26 | * generic SCSI cdb definition | ||
27 | */ | ||
28 | #define SCSI_MAX_CDBLEN 16 | ||
29 | struct scsi_cdb_s{ | ||
30 | u8 scsi_cdb[SCSI_MAX_CDBLEN]; | ||
31 | }; | ||
32 | |||
33 | /* | ||
34 | * scsi lun serial number definition | ||
35 | */ | ||
36 | #define SCSI_LUN_SN_LEN 32 | ||
37 | struct scsi_lun_sn_s{ | ||
38 | u8 lun_sn[SCSI_LUN_SN_LEN]; | ||
39 | }; | ||
40 | |||
41 | /* | ||
42 | * SCSI Direct Access Commands | ||
43 | */ | ||
44 | enum { | ||
45 | SCSI_OP_TEST_UNIT_READY = 0x00, | ||
46 | SCSI_OP_REQUEST_SENSE = 0x03, | ||
47 | SCSI_OP_FORMAT_UNIT = 0x04, | ||
48 | SCSI_OP_READ6 = 0x08, | ||
49 | SCSI_OP_WRITE6 = 0x0A, | ||
50 | SCSI_OP_WRITE_FILEMARKS = 0x10, | ||
51 | SCSI_OP_INQUIRY = 0x12, | ||
52 | SCSI_OP_MODE_SELECT6 = 0x15, | ||
53 | SCSI_OP_RESERVE6 = 0x16, | ||
54 | SCSI_OP_RELEASE6 = 0x17, | ||
55 | SCSI_OP_MODE_SENSE6 = 0x1A, | ||
56 | SCSI_OP_START_STOP_UNIT = 0x1B, | ||
57 | SCSI_OP_SEND_DIAGNOSTIC = 0x1D, | ||
58 | SCSI_OP_READ_CAPACITY = 0x25, | ||
59 | SCSI_OP_READ10 = 0x28, | ||
60 | SCSI_OP_WRITE10 = 0x2A, | ||
61 | SCSI_OP_VERIFY10 = 0x2F, | ||
62 | SCSI_OP_READ_DEFECT_DATA = 0x37, | ||
63 | SCSI_OP_LOG_SELECT = 0x4C, | ||
64 | SCSI_OP_LOG_SENSE = 0x4D, | ||
65 | SCSI_OP_MODE_SELECT10 = 0x55, | ||
66 | SCSI_OP_RESERVE10 = 0x56, | ||
67 | SCSI_OP_RELEASE10 = 0x57, | ||
68 | SCSI_OP_MODE_SENSE10 = 0x5A, | ||
69 | SCSI_OP_PER_RESERVE_IN = 0x5E, | ||
70 | SCSI_OP_PER_RESERVE_OUR = 0x5E, | ||
71 | SCSI_OP_READ16 = 0x88, | ||
72 | SCSI_OP_WRITE16 = 0x8A, | ||
73 | SCSI_OP_VERIFY16 = 0x8F, | ||
74 | SCSI_OP_READ_CAPACITY16 = 0x9E, | ||
75 | SCSI_OP_REPORT_LUNS = 0xA0, | ||
76 | SCSI_OP_READ12 = 0xA8, | ||
77 | SCSI_OP_WRITE12 = 0xAA, | ||
78 | SCSI_OP_UNDEF = 0xFF, | ||
79 | }; | ||
80 | |||
81 | /* | ||
82 | * SCSI START_STOP_UNIT command | ||
83 | */ | ||
84 | struct scsi_start_stop_unit_s{ | ||
85 | u8 opcode; | ||
86 | #ifdef __BIGENDIAN | ||
87 | u8 lun:3; | ||
88 | u8 reserved1:4; | ||
89 | u8 immed:1; | ||
90 | #else | ||
91 | u8 immed:1; | ||
92 | u8 reserved1:4; | ||
93 | u8 lun:3; | ||
94 | #endif | ||
95 | u8 reserved2; | ||
96 | u8 reserved3; | ||
97 | #ifdef __BIGENDIAN | ||
98 | u8 power_conditions:4; | ||
99 | u8 reserved4:2; | ||
100 | u8 loEj:1; | ||
101 | u8 start:1; | ||
102 | #else | ||
103 | u8 start:1; | ||
104 | u8 loEj:1; | ||
105 | u8 reserved4:2; | ||
106 | u8 power_conditions:4; | ||
107 | #endif | ||
108 | u8 control; | ||
109 | }; | ||
110 | |||
111 | /* | ||
112 | * SCSI SEND_DIAGNOSTIC command | ||
113 | */ | ||
114 | struct scsi_send_diagnostic_s{ | ||
115 | u8 opcode; | ||
116 | #ifdef __BIGENDIAN | ||
117 | u8 self_test_code:3; | ||
118 | u8 pf:1; | ||
119 | u8 reserved1:1; | ||
120 | u8 self_test:1; | ||
121 | u8 dev_offl:1; | ||
122 | u8 unit_offl:1; | ||
123 | #else | ||
124 | u8 unit_offl:1; | ||
125 | u8 dev_offl:1; | ||
126 | u8 self_test:1; | ||
127 | u8 reserved1:1; | ||
128 | u8 pf:1; | ||
129 | u8 self_test_code:3; | ||
130 | #endif | ||
131 | u8 reserved2; | ||
132 | |||
133 | u8 param_list_length[2]; /* MSB first */ | ||
134 | u8 control; | ||
135 | |||
136 | }; | ||
137 | |||
138 | /* | ||
139 | * SCSI READ10/WRITE10 commands | ||
140 | */ | ||
141 | struct scsi_rw10_s{ | ||
142 | u8 opcode; | ||
143 | #ifdef __BIGENDIAN | ||
144 | u8 lun:3; | ||
145 | u8 dpo:1; /* Disable Page Out */ | ||
146 | u8 fua:1; /* Force Unit Access */ | ||
147 | u8 reserved1:2; | ||
148 | u8 rel_adr:1; /* relative address */ | ||
149 | #else | ||
150 | u8 rel_adr:1; | ||
151 | u8 reserved1:2; | ||
152 | u8 fua:1; | ||
153 | u8 dpo:1; | ||
154 | u8 lun:3; | ||
155 | #endif | ||
156 | u8 lba0; /* logical block address - MSB */ | ||
157 | u8 lba1; | ||
158 | u8 lba2; | ||
159 | u8 lba3; /* LSB */ | ||
160 | u8 reserved3; | ||
161 | u8 xfer_length0; /* transfer length in blocks - MSB */ | ||
162 | u8 xfer_length1; /* LSB */ | ||
163 | u8 control; | ||
164 | }; | ||
165 | |||
166 | #define SCSI_CDB10_GET_LBA(cdb) \ | ||
167 | (((cdb)->lba0 << 24) | ((cdb)->lba1 << 16) | \ | ||
168 | ((cdb)->lba2 << 8) | (cdb)->lba3) | ||
169 | |||
170 | #define SCSI_CDB10_SET_LBA(cdb, lba) { \ | ||
171 | (cdb)->lba0 = lba >> 24; \ | ||
172 | (cdb)->lba1 = (lba >> 16) & 0xFF; \ | ||
173 | (cdb)->lba2 = (lba >> 8) & 0xFF; \ | ||
174 | (cdb)->lba3 = lba & 0xFF; \ | ||
175 | } | ||
176 | |||
177 | #define SCSI_CDB10_GET_TL(cdb) \ | ||
178 | ((cdb)->xfer_length0 << 8 | (cdb)->xfer_length1) | ||
179 | #define SCSI_CDB10_SET_TL(cdb, tl) { \ | ||
180 | (cdb)->xfer_length0 = tl >> 8; \ | ||
181 | (cdb)->xfer_length1 = tl & 0xFF; \ | ||
182 | } | ||
183 | |||
184 | /* | ||
185 | * SCSI READ6/WRITE6 commands | ||
186 | */ | ||
187 | struct scsi_rw6_s{ | ||
188 | u8 opcode; | ||
189 | #ifdef __BIGENDIAN | ||
190 | u8 lun:3; | ||
191 | u8 lba0:5; /* MSb */ | ||
192 | #else | ||
193 | u8 lba0:5; /* MSb */ | ||
194 | u8 lun:3; | ||
195 | #endif | ||
196 | u8 lba1; | ||
197 | u8 lba2; /* LSB */ | ||
198 | u8 xfer_length; | ||
199 | u8 control; | ||
200 | }; | ||
201 | |||
202 | #define SCSI_TAPE_CDB6_GET_TL(cdb) \ | ||
203 | (((cdb)->tl0 << 16) | ((cdb)->tl1 << 8) | (cdb)->tl2) | ||
204 | |||
205 | #define SCSI_TAPE_CDB6_SET_TL(cdb, tl) { \ | ||
206 | (cdb)->tl0 = tl >> 16; \ | ||
207 | (cdb)->tl1 = (tl >> 8) & 0xFF; \ | ||
208 | (cdb)->tl2 = tl & 0xFF; \ | ||
209 | } | ||
210 | |||
211 | /* | ||
212 | * SCSI sequential (TAPE) wrtie command | ||
213 | */ | ||
214 | struct scsi_tape_wr_s{ | ||
215 | u8 opcode; | ||
216 | #ifdef __BIGENDIAN | ||
217 | u8 rsvd:7; | ||
218 | u8 fixed:1; /* MSb */ | ||
219 | #else | ||
220 | u8 fixed:1; /* MSb */ | ||
221 | u8 rsvd:7; | ||
222 | #endif | ||
223 | u8 tl0; /* Msb */ | ||
224 | u8 tl1; | ||
225 | u8 tl2; /* Lsb */ | ||
226 | |||
227 | u8 control; | ||
228 | }; | ||
229 | |||
230 | #define SCSI_CDB6_GET_LBA(cdb) \ | ||
231 | (((cdb)->lba0 << 16) | ((cdb)->lba1 << 8) | (cdb)->lba2) | ||
232 | |||
233 | #define SCSI_CDB6_SET_LBA(cdb, lba) { \ | ||
234 | (cdb)->lba0 = lba >> 16; \ | ||
235 | (cdb)->lba1 = (lba >> 8) & 0xFF; \ | ||
236 | (cdb)->lba2 = lba & 0xFF; \ | ||
237 | } | ||
238 | |||
239 | #define SCSI_CDB6_GET_TL(cdb) ((cdb)->xfer_length) | ||
240 | #define SCSI_CDB6_SET_TL(cdb, tl) { \ | ||
241 | (cdb)->xfer_length = tl; \ | ||
242 | } | ||
243 | |||
244 | /* | ||
245 | * SCSI sense data format | ||
246 | */ | ||
247 | struct scsi_sense_s{ | ||
248 | #ifdef __BIGENDIAN | ||
249 | u8 valid:1; | ||
250 | u8 rsp_code:7; | ||
251 | #else | ||
252 | u8 rsp_code:7; | ||
253 | u8 valid:1; | ||
254 | #endif | ||
255 | u8 seg_num; | ||
256 | #ifdef __BIGENDIAN | ||
257 | u8 file_mark:1; | ||
258 | u8 eom:1; /* end of media */ | ||
259 | u8 ili:1; /* incorrect length indicator */ | ||
260 | u8 reserved:1; | ||
261 | u8 sense_key:4; | ||
262 | #else | ||
263 | u8 sense_key:4; | ||
264 | u8 reserved:1; | ||
265 | u8 ili:1; /* incorrect length indicator */ | ||
266 | u8 eom:1; /* end of media */ | ||
267 | u8 file_mark:1; | ||
268 | #endif | ||
269 | u8 information[4]; /* device-type or command specific info | ||
270 | */ | ||
271 | u8 add_sense_length; | ||
272 | /* additional sense length */ | ||
273 | u8 command_info[4];/* command specific information | ||
274 | */ | ||
275 | u8 asc; /* additional sense code */ | ||
276 | u8 ascq; /* additional sense code qualifier */ | ||
277 | u8 fru_code; /* field replaceable unit code */ | ||
278 | #ifdef __BIGENDIAN | ||
279 | u8 sksv:1; /* sense key specific valid */ | ||
280 | u8 c_d:1; /* command/data bit */ | ||
281 | u8 res1:2; | ||
282 | u8 bpv:1; /* bit pointer valid */ | ||
283 | u8 bpointer:3; /* bit pointer */ | ||
284 | #else | ||
285 | u8 bpointer:3; /* bit pointer */ | ||
286 | u8 bpv:1; /* bit pointer valid */ | ||
287 | u8 res1:2; | ||
288 | u8 c_d:1; /* command/data bit */ | ||
289 | u8 sksv:1; /* sense key specific valid */ | ||
290 | #endif | ||
291 | u8 fpointer[2]; /* field pointer */ | ||
292 | }; | ||
293 | |||
294 | #define SCSI_SENSE_CUR_ERR 0x70 | ||
295 | #define SCSI_SENSE_DEF_ERR 0x71 | ||
296 | |||
297 | /* | ||
298 | * SCSI sense key values | ||
299 | */ | ||
300 | #define SCSI_SK_NO_SENSE 0x0 | ||
301 | #define SCSI_SK_REC_ERR 0x1 /* recovered error */ | ||
302 | #define SCSI_SK_NOT_READY 0x2 | ||
303 | #define SCSI_SK_MED_ERR 0x3 /* medium error */ | ||
304 | #define SCSI_SK_HW_ERR 0x4 /* hardware error */ | ||
305 | #define SCSI_SK_ILLEGAL_REQ 0x5 | ||
306 | #define SCSI_SK_UNIT_ATT 0x6 /* unit attention */ | ||
307 | #define SCSI_SK_DATA_PROTECT 0x7 | ||
308 | #define SCSI_SK_BLANK_CHECK 0x8 | ||
309 | #define SCSI_SK_VENDOR_SPEC 0x9 | ||
310 | #define SCSI_SK_COPY_ABORTED 0xA | ||
311 | #define SCSI_SK_ABORTED_CMND 0xB | ||
312 | #define SCSI_SK_VOL_OVERFLOW 0xD | ||
313 | #define SCSI_SK_MISCOMPARE 0xE | ||
314 | |||
315 | /* | ||
316 | * SCSI additional sense codes | ||
317 | */ | ||
318 | #define SCSI_ASC_NO_ADD_SENSE 0x00 | ||
319 | #define SCSI_ASC_LUN_NOT_READY 0x04 | ||
320 | #define SCSI_ASC_LUN_COMMUNICATION 0x08 | ||
321 | #define SCSI_ASC_WRITE_ERROR 0x0C | ||
322 | #define SCSI_ASC_INVALID_CMND_CODE 0x20 | ||
323 | #define SCSI_ASC_BAD_LBA 0x21 | ||
324 | #define SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 | ||
325 | #define SCSI_ASC_LUN_NOT_SUPPORTED 0x25 | ||
326 | #define SCSI_ASC_LUN_WRITE_PROTECT 0x27 | ||
327 | #define SCSI_ASC_POWERON_BDR 0x29 /* power on reset, bus reset, | ||
328 | * bus device reset | ||
329 | */ | ||
330 | #define SCSI_ASC_PARAMS_CHANGED 0x2A | ||
331 | #define SCSI_ASC_CMND_CLEARED_BY_A_I 0x2F | ||
332 | #define SCSI_ASC_SAVING_PARAM_NOTSUPP 0x39 | ||
333 | #define SCSI_ASC_TOCC 0x3F /* target operating condtions | ||
334 | * changed | ||
335 | */ | ||
336 | #define SCSI_ASC_PARITY_ERROR 0x47 | ||
337 | #define SCSI_ASC_CMND_PHASE_ERROR 0x4A | ||
338 | #define SCSI_ASC_DATA_PHASE_ERROR 0x4B | ||
339 | #define SCSI_ASC_VENDOR_SPEC 0x7F | ||
340 | |||
341 | /* | ||
342 | * SCSI additional sense code qualifiers | ||
343 | */ | ||
344 | #define SCSI_ASCQ_CAUSE_NOT_REPORT 0x00 | ||
345 | #define SCSI_ASCQ_BECOMING_READY 0x01 | ||
346 | #define SCSI_ASCQ_INIT_CMD_REQ 0x02 | ||
347 | #define SCSI_ASCQ_FORMAT_IN_PROGRESS 0x04 | ||
348 | #define SCSI_ASCQ_OPERATION_IN_PROGRESS 0x07 | ||
349 | #define SCSI_ASCQ_SELF_TEST_IN_PROGRESS 0x09 | ||
350 | #define SCSI_ASCQ_WR_UNEXP_UNSOL_DATA 0x0C | ||
351 | #define SCSI_ASCQ_WR_NOTENG_UNSOL_DATA 0x0D | ||
352 | |||
353 | #define SCSI_ASCQ_LBA_OUT_OF_RANGE 0x00 | ||
354 | #define SCSI_ASCQ_INVALID_ELEMENT_ADDR 0x01 | ||
355 | |||
356 | #define SCSI_ASCQ_LUN_WRITE_PROTECTED 0x00 | ||
357 | #define SCSI_ASCQ_LUN_HW_WRITE_PROTECTED 0x01 | ||
358 | #define SCSI_ASCQ_LUN_SW_WRITE_PROTECTED 0x02 | ||
359 | |||
360 | #define SCSI_ASCQ_POR 0x01 /* power on reset */ | ||
361 | #define SCSI_ASCQ_SBR 0x02 /* scsi bus reset */ | ||
362 | #define SCSI_ASCQ_BDR 0x03 /* bus device reset */ | ||
363 | #define SCSI_ASCQ_DIR 0x04 /* device internal reset */ | ||
364 | |||
365 | #define SCSI_ASCQ_MODE_PARAMS_CHANGED 0x01 | ||
366 | #define SCSI_ASCQ_LOG_PARAMS_CHANGED 0x02 | ||
367 | #define SCSI_ASCQ_RESERVATIONS_PREEMPTED 0x03 | ||
368 | #define SCSI_ASCQ_RESERVATIONS_RELEASED 0x04 | ||
369 | #define SCSI_ASCQ_REGISTRATIONS_PREEMPTED 0x05 | ||
370 | |||
371 | #define SCSI_ASCQ_MICROCODE_CHANGED 0x01 | ||
372 | #define SCSI_ASCQ_CHANGED_OPER_COND 0x02 | ||
373 | #define SCSI_ASCQ_INQ_CHANGED 0x03 /* inquiry data changed */ | ||
374 | #define SCSI_ASCQ_DI_CHANGED 0x05 /* device id changed */ | ||
375 | #define SCSI_ASCQ_RL_DATA_CHANGED 0x0E /* report luns data changed */ | ||
376 | |||
377 | #define SCSI_ASCQ_DP_CRC_ERR 0x01 /* data phase crc error */ | ||
378 | #define SCSI_ASCQ_DP_SCSI_PARITY_ERR 0x02 /* data phase scsi parity error | ||
379 | */ | ||
380 | #define SCSI_ASCQ_IU_CRC_ERR 0x03 /* information unit crc error */ | ||
381 | #define SCSI_ASCQ_PROTO_SERV_CRC_ERR 0x05 | ||
382 | |||
383 | #define SCSI_ASCQ_LUN_TIME_OUT 0x01 | ||
384 | |||
385 | /* ------------------------------------------------------------ | ||
386 | * SCSI INQUIRY | ||
387 | * ------------------------------------------------------------*/ | ||
388 | |||
389 | struct scsi_inquiry_s{ | ||
390 | u8 opcode; | ||
391 | #ifdef __BIGENDIAN | ||
392 | u8 lun:3; | ||
393 | u8 reserved1:3; | ||
394 | u8 cmd_dt:1; | ||
395 | u8 evpd:1; | ||
396 | #else | ||
397 | u8 evpd:1; | ||
398 | u8 cmd_dt:1; | ||
399 | u8 reserved1:3; | ||
400 | u8 lun:3; | ||
401 | #endif | ||
402 | u8 page_code; | ||
403 | u8 reserved2; | ||
404 | u8 alloc_length; | ||
405 | u8 control; | ||
406 | }; | ||
407 | |||
408 | struct scsi_inquiry_vendor_s{ | ||
409 | u8 vendor_id[8]; | ||
410 | }; | ||
411 | |||
412 | struct scsi_inquiry_prodid_s{ | ||
413 | u8 product_id[16]; | ||
414 | }; | ||
415 | |||
416 | struct scsi_inquiry_prodrev_s{ | ||
417 | u8 product_rev[4]; | ||
418 | }; | ||
419 | |||
420 | struct scsi_inquiry_data_s{ | ||
421 | #ifdef __BIGENDIAN | ||
422 | u8 peripheral_qual:3; /* peripheral qualifier */ | ||
423 | u8 device_type:5; /* peripheral device type */ | ||
424 | |||
425 | u8 rmb:1; /* removable medium bit */ | ||
426 | u8 device_type_mod:7; /* device type modifier */ | ||
427 | |||
428 | u8 version; | ||
429 | |||
430 | u8 aenc:1; /* async event notification capability | ||
431 | */ | ||
432 | u8 trm_iop:1; /* terminate I/O process */ | ||
433 | u8 norm_aca:1; /* normal ACA supported */ | ||
434 | u8 hi_support:1; /* SCSI-3: supports REPORT LUNS */ | ||
435 | u8 rsp_data_format:4; | ||
436 | |||
437 | u8 additional_len; | ||
438 | u8 sccs:1; | ||
439 | u8 reserved1:7; | ||
440 | |||
441 | u8 reserved2:1; | ||
442 | u8 enc_serv:1; /* enclosure service component */ | ||
443 | u8 reserved3:1; | ||
444 | u8 multi_port:1; /* multi-port device */ | ||
445 | u8 m_chngr:1; /* device in medium transport element */ | ||
446 | u8 ack_req_q:1; /* SIP specific bit */ | ||
447 | u8 addr32:1; /* SIP specific bit */ | ||
448 | u8 addr16:1; /* SIP specific bit */ | ||
449 | |||
450 | u8 rel_adr:1; /* relative address */ | ||
451 | u8 w_bus32:1; | ||
452 | u8 w_bus16:1; | ||
453 | u8 synchronous:1; | ||
454 | u8 linked_commands:1; | ||
455 | u8 trans_dis:1; | ||
456 | u8 cmd_queue:1; /* command queueing supported */ | ||
457 | u8 soft_reset:1; /* soft reset alternative (VS) */ | ||
458 | #else | ||
459 | u8 device_type:5; /* peripheral device type */ | ||
460 | u8 peripheral_qual:3; | ||
461 | /* peripheral qualifier */ | ||
462 | |||
463 | u8 device_type_mod:7; | ||
464 | /* device type modifier */ | ||
465 | u8 rmb:1; /* removable medium bit */ | ||
466 | |||
467 | u8 version; | ||
468 | |||
469 | u8 rsp_data_format:4; | ||
470 | u8 hi_support:1; /* SCSI-3: supports REPORT LUNS */ | ||
471 | u8 norm_aca:1; /* normal ACA supported */ | ||
472 | u8 terminate_iop:1;/* terminate I/O process */ | ||
473 | u8 aenc:1; /* async event notification capability | ||
474 | */ | ||
475 | |||
476 | u8 additional_len; | ||
477 | u8 reserved1:7; | ||
478 | u8 sccs:1; | ||
479 | |||
480 | u8 addr16:1; /* SIP specific bit */ | ||
481 | u8 addr32:1; /* SIP specific bit */ | ||
482 | u8 ack_req_q:1; /* SIP specific bit */ | ||
483 | u8 m_chngr:1; /* device in medium transport element */ | ||
484 | u8 multi_port:1; /* multi-port device */ | ||
485 | u8 reserved3:1; /* TBD - Vendor Specific */ | ||
486 | u8 enc_serv:1; /* enclosure service component */ | ||
487 | u8 reserved2:1; | ||
488 | |||
489 | u8 soft_seset:1; /* soft reset alternative (VS) */ | ||
490 | u8 cmd_queue:1; /* command queueing supported */ | ||
491 | u8 trans_dis:1; | ||
492 | u8 linked_commands:1; | ||
493 | u8 synchronous:1; | ||
494 | u8 w_bus16:1; | ||
495 | u8 w_bus32:1; | ||
496 | u8 rel_adr:1; /* relative address */ | ||
497 | #endif | ||
498 | struct scsi_inquiry_vendor_s vendor_id; | ||
499 | struct scsi_inquiry_prodid_s product_id; | ||
500 | struct scsi_inquiry_prodrev_s product_rev; | ||
501 | u8 vendor_specific[20]; | ||
502 | u8 reserved4[40]; | ||
503 | }; | ||
504 | |||
505 | /* | ||
506 | * inquiry.peripheral_qual field values | ||
507 | */ | ||
508 | #define SCSI_DEVQUAL_DEFAULT 0 | ||
509 | #define SCSI_DEVQUAL_NOT_CONNECTED 1 | ||
510 | #define SCSI_DEVQUAL_NOT_SUPPORTED 3 | ||
511 | |||
512 | /* | ||
513 | * inquiry.device_type field values | ||
514 | */ | ||
515 | #define SCSI_DEVICE_DIRECT_ACCESS 0x00 | ||
516 | #define SCSI_DEVICE_SEQ_ACCESS 0x01 | ||
517 | #define SCSI_DEVICE_ARRAY_CONTROLLER 0x0C | ||
518 | #define SCSI_DEVICE_UNKNOWN 0x1F | ||
519 | |||
520 | /* | ||
521 | * inquiry.version | ||
522 | */ | ||
523 | #define SCSI_VERSION_ANSI_X3131 2 /* ANSI X3.131 SCSI-2 */ | ||
524 | #define SCSI_VERSION_SPC 3 /* SPC (SCSI-3), ANSI X3.301:1997 */ | ||
525 | #define SCSI_VERSION_SPC_2 4 /* SPC-2 */ | ||
526 | |||
527 | /* | ||
528 | * response data format | ||
529 | */ | ||
530 | #define SCSI_RSP_DATA_FORMAT 2 /* SCSI-2 & SPC */ | ||
531 | |||
532 | /* | ||
533 | * SCSI inquiry page codes | ||
534 | */ | ||
535 | #define SCSI_INQ_PAGE_VPD_PAGES 0x00 /* supported vpd pages */ | ||
536 | #define SCSI_INQ_PAGE_USN_PAGE 0x80 /* unit serial number page */ | ||
537 | #define SCSI_INQ_PAGE_DEV_IDENT 0x83 /* device indentification page | ||
538 | */ | ||
539 | #define SCSI_INQ_PAGES_MAX 3 | ||
540 | |||
541 | /* | ||
542 | * supported vital product data pages | ||
543 | */ | ||
544 | struct scsi_inq_page_vpd_pages_s{ | ||
545 | #ifdef __BIGENDIAN | ||
546 | u8 peripheral_qual:3; | ||
547 | u8 device_type:5; | ||
548 | #else | ||
549 | u8 device_type:5; | ||
550 | u8 peripheral_qual:3; | ||
551 | #endif | ||
552 | u8 page_code; | ||
553 | u8 reserved; | ||
554 | u8 page_length; | ||
555 | u8 pages[SCSI_INQ_PAGES_MAX]; | ||
556 | }; | ||
557 | |||
558 | /* | ||
559 | * Unit serial number page | ||
560 | */ | ||
561 | #define SCSI_INQ_USN_LEN 32 | ||
562 | |||
563 | struct scsi_inq_usn_s{ | ||
564 | char usn[SCSI_INQ_USN_LEN]; | ||
565 | }; | ||
566 | |||
567 | struct scsi_inq_page_usn_s{ | ||
568 | #ifdef __BIGENDIAN | ||
569 | u8 peripheral_qual:3; | ||
570 | u8 device_type:5; | ||
571 | #else | ||
572 | u8 device_type:5; | ||
573 | u8 peripheral_qual:3; | ||
574 | #endif | ||
575 | u8 page_code; | ||
576 | u8 reserved1; | ||
577 | u8 page_length; | ||
578 | struct scsi_inq_usn_s usn; | ||
579 | }; | ||
580 | |||
581 | enum { | ||
582 | SCSI_INQ_DIP_CODE_BINARY = 1, /* identifier has binary value */ | ||
583 | SCSI_INQ_DIP_CODE_ASCII = 2, /* identifier has ascii value */ | ||
584 | }; | ||
585 | |||
586 | enum { | ||
587 | SCSI_INQ_DIP_ASSOC_LUN = 0, /* id is associated with device */ | ||
588 | SCSI_INQ_DIP_ASSOC_PORT = 1, /* id is associated with port that | ||
589 | * received the request | ||
590 | */ | ||
591 | }; | ||
592 | |||
593 | enum { | ||
594 | SCSI_INQ_ID_TYPE_VENDOR = 1, | ||
595 | SCSI_INQ_ID_TYPE_IEEE = 2, | ||
596 | SCSI_INQ_ID_TYPE_FC_FS = 3, | ||
597 | SCSI_INQ_ID_TYPE_OTHER = 4, | ||
598 | }; | ||
599 | |||
600 | struct scsi_inq_dip_desc_s{ | ||
601 | #ifdef __BIGENDIAN | ||
602 | u8 res0:4; | ||
603 | u8 code_set:4; | ||
604 | u8 res1:2; | ||
605 | u8 association:2; | ||
606 | u8 id_type:4; | ||
607 | #else | ||
608 | u8 code_set:4; | ||
609 | u8 res0:4; | ||
610 | u8 id_type:4; | ||
611 | u8 association:2; | ||
612 | u8 res1:2; | ||
613 | #endif | ||
614 | u8 res2; | ||
615 | u8 id_len; | ||
616 | struct scsi_lun_sn_s id; | ||
617 | }; | ||
618 | |||
619 | /* | ||
620 | * Device indentification page | ||
621 | */ | ||
622 | struct scsi_inq_page_dev_ident_s{ | ||
623 | #ifdef __BIGENDIAN | ||
624 | u8 peripheral_qual:3; | ||
625 | u8 device_type:5; | ||
626 | #else | ||
627 | u8 device_type:5; | ||
628 | u8 peripheral_qual:3; | ||
629 | #endif | ||
630 | u8 page_code; | ||
631 | u8 reserved1; | ||
632 | u8 page_length; | ||
633 | struct scsi_inq_dip_desc_s desc; | ||
634 | }; | ||
635 | |||
636 | /* ------------------------------------------------------------ | ||
637 | * READ CAPACITY | ||
638 | * ------------------------------------------------------------ | ||
639 | */ | ||
640 | |||
641 | struct scsi_read_capacity_s{ | ||
642 | u8 opcode; | ||
643 | #ifdef __BIGENDIAN | ||
644 | u8 lun:3; | ||
645 | u8 reserved1:4; | ||
646 | u8 rel_adr:1; | ||
647 | #else | ||
648 | u8 rel_adr:1; | ||
649 | u8 reserved1:4; | ||
650 | u8 lun:3; | ||
651 | #endif | ||
652 | u8 lba0; /* MSB */ | ||
653 | u8 lba1; | ||
654 | u8 lba2; | ||
655 | u8 lba3; /* LSB */ | ||
656 | u8 reserved2; | ||
657 | u8 reserved3; | ||
658 | #ifdef __BIGENDIAN | ||
659 | u8 reserved4:7; | ||
660 | u8 pmi:1; /* partial medium indicator */ | ||
661 | #else | ||
662 | u8 pmi:1; /* partial medium indicator */ | ||
663 | u8 reserved4:7; | ||
664 | #endif | ||
665 | u8 control; | ||
666 | }; | ||
667 | |||
668 | struct scsi_read_capacity_data_s{ | ||
669 | u32 max_lba; /* maximum LBA available */ | ||
670 | u32 block_length; /* in bytes */ | ||
671 | }; | ||
672 | |||
673 | struct scsi_read_capacity16_data_s{ | ||
674 | u64 lba; /* maximum LBA available */ | ||
675 | u32 block_length; /* in bytes */ | ||
676 | #ifdef __BIGENDIAN | ||
677 | u8 reserved1:4, | ||
678 | p_type:3, | ||
679 | prot_en:1; | ||
680 | u8 reserved2:4, | ||
681 | lb_pbe:4; /* logical blocks per physical block | ||
682 | * exponent */ | ||
683 | u16 reserved3:2, | ||
684 | lba_align:14; /* lowest aligned logical block | ||
685 | * address */ | ||
686 | #else | ||
687 | u16 lba_align:14, /* lowest aligned logical block | ||
688 | * address */ | ||
689 | reserved3:2; | ||
690 | u8 lb_pbe:4, /* logical blocks per physical block | ||
691 | * exponent */ | ||
692 | reserved2:4; | ||
693 | u8 prot_en:1, | ||
694 | p_type:3, | ||
695 | reserved1:4; | ||
696 | #endif | ||
697 | u64 reserved4; | ||
698 | u64 reserved5; | ||
699 | }; | ||
700 | |||
701 | /* ------------------------------------------------------------ | ||
702 | * REPORT LUNS command | ||
703 | * ------------------------------------------------------------ | ||
704 | */ | ||
705 | |||
706 | struct scsi_report_luns_s{ | ||
707 | u8 opcode; /* A0h - REPORT LUNS opCode */ | ||
708 | u8 reserved1[5]; | ||
709 | u8 alloc_length[4];/* allocation length MSB first */ | ||
710 | u8 reserved2; | ||
711 | u8 control; | ||
712 | }; | ||
713 | |||
714 | #define SCSI_REPORT_LUN_ALLOC_LENGTH(rl) \ | ||
715 | ((rl->alloc_length[0] << 24) | (rl->alloc_length[1] << 16) | \ | ||
716 | (rl->alloc_length[2] << 8) | (rl->alloc_length[3])) | ||
717 | |||
718 | #define SCSI_REPORT_LUNS_SET_ALLOCLEN(rl, alloc_len) { \ | ||
719 | (rl)->alloc_length[0] = (alloc_len) >> 24; \ | ||
720 | (rl)->alloc_length[1] = ((alloc_len) >> 16) & 0xFF; \ | ||
721 | (rl)->alloc_length[2] = ((alloc_len) >> 8) & 0xFF; \ | ||
722 | (rl)->alloc_length[3] = (alloc_len) & 0xFF; \ | ||
723 | } | ||
724 | |||
725 | struct scsi_report_luns_data_s{ | ||
726 | u32 lun_list_length; /* length of LUN list length */ | ||
727 | u32 reserved; | ||
728 | lun_t lun[1]; /* first LUN in lun list */ | ||
729 | }; | ||
730 | |||
731 | /* ------------------------------------------------------------- | ||
732 | * SCSI mode parameters | ||
733 | * ----------------------------------------------------------- | ||
734 | */ | ||
735 | enum { | ||
736 | SCSI_DA_MEDIUM_DEF = 0, /* direct access default medium type */ | ||
737 | SCSI_DA_MEDIUM_SS = 1, /* direct access single sided */ | ||
738 | SCSI_DA_MEDIUM_DS = 2, /* direct access double sided */ | ||
739 | }; | ||
740 | |||
741 | /* | ||
742 | * SCSI Mode Select(6) cdb | ||
743 | */ | ||
744 | struct scsi_mode_select6_s{ | ||
745 | u8 opcode; | ||
746 | #ifdef __BIGENDIAN | ||
747 | u8 reserved1:3; | ||
748 | u8 pf:1; /* page format */ | ||
749 | u8 reserved2:3; | ||
750 | u8 sp:1; /* save pages if set to 1 */ | ||
751 | #else | ||
752 | u8 sp:1; /* save pages if set to 1 */ | ||
753 | u8 reserved2:3; | ||
754 | u8 pf:1; /* page format */ | ||
755 | u8 reserved1:3; | ||
756 | #endif | ||
757 | u8 reserved3[2]; | ||
758 | u8 alloc_len; | ||
759 | u8 control; | ||
760 | }; | ||
761 | |||
762 | /* | ||
763 | * SCSI Mode Select(10) cdb | ||
764 | */ | ||
765 | struct scsi_mode_select10_s{ | ||
766 | u8 opcode; | ||
767 | #ifdef __BIGENDIAN | ||
768 | u8 reserved1:3; | ||
769 | u8 pf:1; /* page format */ | ||
770 | u8 reserved2:3; | ||
771 | u8 sp:1; /* save pages if set to 1 */ | ||
772 | #else | ||
773 | u8 sp:1; /* save pages if set to 1 */ | ||
774 | u8 reserved2:3; | ||
775 | u8 pf:1; /* page format */ | ||
776 | u8 reserved1:3; | ||
777 | #endif | ||
778 | u8 reserved3[5]; | ||
779 | u8 alloc_len_msb; | ||
780 | u8 alloc_len_lsb; | ||
781 | u8 control; | ||
782 | }; | ||
783 | |||
784 | /* | ||
785 | * SCSI Mode Sense(6) cdb | ||
786 | */ | ||
787 | struct scsi_mode_sense6_s{ | ||
788 | u8 opcode; | ||
789 | #ifdef __BIGENDIAN | ||
790 | u8 reserved1:4; | ||
791 | u8 dbd:1; /* disable block discriptors if set to 1 */ | ||
792 | u8 reserved2:3; | ||
793 | |||
794 | u8 pc:2; /* page control */ | ||
795 | u8 page_code:6; | ||
796 | #else | ||
797 | u8 reserved2:3; | ||
798 | u8 dbd:1; /* disable block descriptors if set to 1 */ | ||
799 | u8 reserved1:4; | ||
800 | |||
801 | u8 page_code:6; | ||
802 | u8 pc:2; /* page control */ | ||
803 | #endif | ||
804 | u8 reserved3; | ||
805 | u8 alloc_len; | ||
806 | u8 control; | ||
807 | }; | ||
808 | |||
809 | /* | ||
810 | * SCSI Mode Sense(10) cdb | ||
811 | */ | ||
812 | struct scsi_mode_sense10_s{ | ||
813 | u8 opcode; | ||
814 | #ifdef __BIGENDIAN | ||
815 | u8 reserved1:3; | ||
816 | u8 LLBAA:1; /* long LBA accepted if set to 1 */ | ||
817 | u8 dbd:1; /* disable block descriptors if set | ||
818 | * to 1 | ||
819 | */ | ||
820 | u8 reserved2:3; | ||
821 | |||
822 | u8 pc:2; /* page control */ | ||
823 | u8 page_code:6; | ||
824 | #else | ||
825 | u8 reserved2:3; | ||
826 | u8 dbd:1; /* disable block descriptors if set to | ||
827 | * 1 | ||
828 | */ | ||
829 | u8 LLBAA:1; /* long LBA accepted if set to 1 */ | ||
830 | u8 reserved1:3; | ||
831 | |||
832 | u8 page_code:6; | ||
833 | u8 pc:2; /* page control */ | ||
834 | #endif | ||
835 | u8 reserved3[4]; | ||
836 | u8 alloc_len_msb; | ||
837 | u8 alloc_len_lsb; | ||
838 | u8 control; | ||
839 | }; | ||
840 | |||
841 | #define SCSI_CDB10_GET_AL(cdb) \ | ||
842 | ((cdb)->alloc_len_msb << 8 | (cdb)->alloc_len_lsb) | ||
843 | |||
844 | #define SCSI_CDB10_SET_AL(cdb, al) { \ | ||
845 | (cdb)->alloc_len_msb = al >> 8; \ | ||
846 | (cdb)->alloc_len_lsb = al & 0xFF; \ | ||
847 | } | ||
848 | |||
849 | #define SCSI_CDB6_GET_AL(cdb) ((cdb)->alloc_len) | ||
850 | |||
851 | #define SCSI_CDB6_SET_AL(cdb, al) { \ | ||
852 | (cdb)->alloc_len = al; \ | ||
853 | } | ||
854 | |||
855 | /* | ||
856 | * page control field values | ||
857 | */ | ||
858 | #define SCSI_PC_CURRENT_VALUES 0x0 | ||
859 | #define SCSI_PC_CHANGEABLE_VALUES 0x1 | ||
860 | #define SCSI_PC_DEFAULT_VALUES 0x2 | ||
861 | #define SCSI_PC_SAVED_VALUES 0x3 | ||
862 | |||
863 | /* | ||
864 | * SCSI mode page codes | ||
865 | */ | ||
866 | #define SCSI_MP_VENDOR_SPEC 0x00 | ||
867 | #define SCSI_MP_DISC_RECN 0x02 /* disconnect-reconnect page */ | ||
868 | #define SCSI_MP_FORMAT_DEVICE 0x03 | ||
869 | #define SCSI_MP_RDG 0x04 /* rigid disk geometry page */ | ||
870 | #define SCSI_MP_FDP 0x05 /* flexible disk page */ | ||
871 | #define SCSI_MP_CACHING 0x08 /* caching page */ | ||
872 | #define SCSI_MP_CONTROL 0x0A /* control mode page */ | ||
873 | #define SCSI_MP_MED_TYPES_SUP 0x0B /* medium types supported page */ | ||
874 | #define SCSI_MP_INFO_EXCP_CNTL 0x1C /* informational exception control */ | ||
875 | #define SCSI_MP_ALL 0x3F /* return all pages - mode sense only */ | ||
876 | |||
877 | /* | ||
878 | * mode parameter header | ||
879 | */ | ||
880 | struct scsi_mode_param_header6_s{ | ||
881 | u8 mode_datalen; | ||
882 | u8 medium_type; | ||
883 | |||
884 | /* | ||
885 | * device specific parameters expanded for direct access devices | ||
886 | */ | ||
887 | #ifdef __BIGENDIAN | ||
888 | u32 wp:1; /* write protected */ | ||
889 | u32 reserved1:2; | ||
890 | u32 dpofua:1; /* disable page out + force unit access | ||
891 | */ | ||
892 | u32 reserved2:4; | ||
893 | #else | ||
894 | u32 reserved2:4; | ||
895 | u32 dpofua:1; /* disable page out + force unit access | ||
896 | */ | ||
897 | u32 reserved1:2; | ||
898 | u32 wp:1; /* write protected */ | ||
899 | #endif | ||
900 | |||
901 | u8 block_desclen; | ||
902 | }; | ||
903 | |||
904 | struct scsi_mode_param_header10_s{ | ||
905 | u32 mode_datalen:16; | ||
906 | u32 medium_type:8; | ||
907 | |||
908 | /* | ||
909 | * device specific parameters expanded for direct access devices | ||
910 | */ | ||
911 | #ifdef __BIGENDIAN | ||
912 | u32 wp:1; /* write protected */ | ||
913 | u32 reserved1:2; | ||
914 | u32 dpofua:1; /* disable page out + force unit access | ||
915 | */ | ||
916 | u32 reserved2:4; | ||
917 | #else | ||
918 | u32 reserved2:4; | ||
919 | u32 dpofua:1; /* disable page out + force unit access | ||
920 | */ | ||
921 | u32 reserved1:2; | ||
922 | u32 wp:1; /* write protected */ | ||
923 | #endif | ||
924 | |||
925 | #ifdef __BIGENDIAN | ||
926 | u32 reserved3:7; | ||
927 | u32 longlba:1; | ||
928 | #else | ||
929 | u32 longlba:1; | ||
930 | u32 reserved3:7; | ||
931 | #endif | ||
932 | u32 reserved4:8; | ||
933 | u32 block_desclen:16; | ||
934 | }; | ||
935 | |||
936 | /* | ||
937 | * mode parameter block descriptor | ||
938 | */ | ||
939 | struct scsi_mode_param_desc_s{ | ||
940 | u32 nblks; | ||
941 | u32 density_code:8; | ||
942 | u32 block_length:24; | ||
943 | }; | ||
944 | |||
945 | /* | ||
946 | * Disconnect-reconnect mode page format | ||
947 | */ | ||
948 | struct scsi_mp_disc_recn_s{ | ||
949 | #ifdef __BIGENDIAN | ||
950 | u8 ps:1; | ||
951 | u8 reserved1:1; | ||
952 | u8 page_code:6; | ||
953 | #else | ||
954 | u8 page_code:6; | ||
955 | u8 reserved1:1; | ||
956 | u8 ps:1; | ||
957 | #endif | ||
958 | u8 page_len; | ||
959 | u8 buf_full_ratio; | ||
960 | u8 buf_empty_ratio; | ||
961 | |||
962 | u8 bil_msb; /* bus inactivity limit -MSB */ | ||
963 | u8 bil_lsb; /* bus inactivity limit -LSB */ | ||
964 | |||
965 | u8 dtl_msb; /* disconnect time limit - MSB */ | ||
966 | u8 dtl_lsb; /* disconnect time limit - LSB */ | ||
967 | |||
968 | u8 ctl_msb; /* connect time limit - MSB */ | ||
969 | u8 ctl_lsb; /* connect time limit - LSB */ | ||
970 | |||
971 | u8 max_burst_len_msb; | ||
972 | u8 max_burst_len_lsb; | ||
973 | #ifdef __BIGENDIAN | ||
974 | u8 emdp:1; /* enable modify data pointers */ | ||
975 | u8 fa:3; /* fair arbitration */ | ||
976 | u8 dimm:1; /* disconnect immediate */ | ||
977 | u8 dtdc:3; /* data transfer disconnect control */ | ||
978 | #else | ||
979 | u8 dtdc:3; /* data transfer disconnect control */ | ||
980 | u8 dimm:1; /* disconnect immediate */ | ||
981 | u8 fa:3; /* fair arbitration */ | ||
982 | u8 emdp:1; /* enable modify data pointers */ | ||
983 | #endif | ||
984 | |||
985 | u8 reserved3; | ||
986 | |||
987 | u8 first_burst_len_msb; | ||
988 | u8 first_burst_len_lsb; | ||
989 | }; | ||
990 | |||
991 | /* | ||
992 | * SCSI format device mode page | ||
993 | */ | ||
994 | struct scsi_mp_format_device_s{ | ||
995 | #ifdef __BIGENDIAN | ||
996 | u32 ps:1; | ||
997 | u32 reserved1:1; | ||
998 | u32 page_code:6; | ||
999 | #else | ||
1000 | u32 page_code:6; | ||
1001 | u32 reserved1:1; | ||
1002 | u32 ps:1; | ||
1003 | #endif | ||
1004 | u32 page_len:8; | ||
1005 | u32 tracks_per_zone:16; | ||
1006 | |||
1007 | u32 a_sec_per_zone:16; | ||
1008 | u32 a_tracks_per_zone:16; | ||
1009 | |||
1010 | u32 a_tracks_per_lun:16; /* alternate tracks/lun-MSB */ | ||
1011 | u32 sec_per_track:16; /* sectors/track-MSB */ | ||
1012 | |||
1013 | u32 bytes_per_sector:16; | ||
1014 | u32 interleave:16; | ||
1015 | |||
1016 | u32 tsf:16; /* track skew factor-MSB */ | ||
1017 | u32 csf:16; /* cylinder skew factor-MSB */ | ||
1018 | |||
1019 | #ifdef __BIGENDIAN | ||
1020 | u32 ssec:1; /* soft sector formatting */ | ||
1021 | u32 hsec:1; /* hard sector formatting */ | ||
1022 | u32 rmb:1; /* removable media */ | ||
1023 | u32 surf:1; /* surface */ | ||
1024 | u32 reserved2:4; | ||
1025 | #else | ||
1026 | u32 reserved2:4; | ||
1027 | u32 surf:1; /* surface */ | ||
1028 | u32 rmb:1; /* removable media */ | ||
1029 | u32 hsec:1; /* hard sector formatting */ | ||
1030 | u32 ssec:1; /* soft sector formatting */ | ||
1031 | #endif | ||
1032 | u32 reserved3:24; | ||
1033 | }; | ||
1034 | |||
1035 | /* | ||
1036 | * SCSI rigid disk device geometry page | ||
1037 | */ | ||
1038 | struct scsi_mp_rigid_device_geometry_s{ | ||
1039 | #ifdef __BIGENDIAN | ||
1040 | u32 ps:1; | ||
1041 | u32 reserved1:1; | ||
1042 | u32 page_code:6; | ||
1043 | #else | ||
1044 | u32 page_code:6; | ||
1045 | u32 reserved1:1; | ||
1046 | u32 ps:1; | ||
1047 | #endif | ||
1048 | u32 page_len:8; | ||
1049 | u32 num_cylinders0:8; | ||
1050 | u32 num_cylinders1:8; | ||
1051 | |||
1052 | u32 num_cylinders2:8; | ||
1053 | u32 num_heads:8; | ||
1054 | u32 scwp0:8; | ||
1055 | u32 scwp1:8; | ||
1056 | |||
1057 | u32 scwp2:8; | ||
1058 | u32 scrwc0:8; | ||
1059 | u32 scrwc1:8; | ||
1060 | u32 scrwc2:8; | ||
1061 | |||
1062 | u32 dsr:16; | ||
1063 | u32 lscyl0:8; | ||
1064 | u32 lscyl1:8; | ||
1065 | |||
1066 | u32 lscyl2:8; | ||
1067 | #ifdef __BIGENDIAN | ||
1068 | u32 reserved2:6; | ||
1069 | u32 rpl:2; /* rotational position locking */ | ||
1070 | #else | ||
1071 | u32 rpl:2; /* rotational position locking */ | ||
1072 | u32 reserved2:6; | ||
1073 | #endif | ||
1074 | u32 rot_off:8; | ||
1075 | u32 reserved3:8; | ||
1076 | |||
1077 | u32 med_rot_rate:16; | ||
1078 | u32 reserved4:16; | ||
1079 | }; | ||
1080 | |||
1081 | /* | ||
1082 | * SCSI caching mode page | ||
1083 | */ | ||
1084 | struct scsi_mp_caching_s{ | ||
1085 | #ifdef __BIGENDIAN | ||
1086 | u8 ps:1; | ||
1087 | u8 res1:1; | ||
1088 | u8 page_code:6; | ||
1089 | #else | ||
1090 | u8 page_code:6; | ||
1091 | u8 res1:1; | ||
1092 | u8 ps:1; | ||
1093 | #endif | ||
1094 | u8 page_len; | ||
1095 | #ifdef __BIGENDIAN | ||
1096 | u8 ic:1; /* initiator control */ | ||
1097 | u8 abpf:1; /* abort pre-fetch */ | ||
1098 | u8 cap:1; /* caching analysis permitted */ | ||
1099 | u8 disc:1; /* discontinuity */ | ||
1100 | u8 size:1; /* size enable */ | ||
1101 | u8 wce:1; /* write cache enable */ | ||
1102 | u8 mf:1; /* multiplication factor */ | ||
1103 | u8 rcd:1; /* read cache disable */ | ||
1104 | |||
1105 | u8 drrp:4; /* demand read retention priority */ | ||
1106 | u8 wrp:4; /* write retention priority */ | ||
1107 | #else | ||
1108 | u8 rcd:1; /* read cache disable */ | ||
1109 | u8 mf:1; /* multiplication factor */ | ||
1110 | u8 wce:1; /* write cache enable */ | ||
1111 | u8 size:1; /* size enable */ | ||
1112 | u8 disc:1; /* discontinuity */ | ||
1113 | u8 cap:1; /* caching analysis permitted */ | ||
1114 | u8 abpf:1; /* abort pre-fetch */ | ||
1115 | u8 ic:1; /* initiator control */ | ||
1116 | |||
1117 | u8 wrp:4; /* write retention priority */ | ||
1118 | u8 drrp:4; /* demand read retention priority */ | ||
1119 | #endif | ||
1120 | u8 dptl[2];/* disable pre-fetch transfer length */ | ||
1121 | u8 min_prefetch[2]; | ||
1122 | u8 max_prefetch[2]; | ||
1123 | u8 max_prefetch_limit[2]; | ||
1124 | #ifdef __BIGENDIAN | ||
1125 | u8 fsw:1; /* force sequential write */ | ||
1126 | u8 lbcss:1;/* logical block cache segment size */ | ||
1127 | u8 dra:1; /* disable read ahead */ | ||
1128 | u8 vs:2; /* vendor specific */ | ||
1129 | u8 res2:3; | ||
1130 | #else | ||
1131 | u8 res2:3; | ||
1132 | u8 vs:2; /* vendor specific */ | ||
1133 | u8 dra:1; /* disable read ahead */ | ||
1134 | u8 lbcss:1;/* logical block cache segment size */ | ||
1135 | u8 fsw:1; /* force sequential write */ | ||
1136 | #endif | ||
1137 | u8 num_cache_segs; | ||
1138 | |||
1139 | u8 cache_seg_size[2]; | ||
1140 | u8 res3; | ||
1141 | u8 non_cache_seg_size[3]; | ||
1142 | }; | ||
1143 | |||
1144 | /* | ||
1145 | * SCSI control mode page | ||
1146 | */ | ||
1147 | struct scsi_mp_control_page_s{ | ||
1148 | #ifdef __BIGENDIAN | ||
1149 | u8 ps:1; | ||
1150 | u8 reserved1:1; | ||
1151 | u8 page_code:6; | ||
1152 | #else | ||
1153 | u8 page_code:6; | ||
1154 | u8 reserved1:1; | ||
1155 | u8 ps:1; | ||
1156 | #endif | ||
1157 | u8 page_len; | ||
1158 | #ifdef __BIGENDIAN | ||
1159 | u8 tst:3; /* task set type */ | ||
1160 | u8 reserved3:3; | ||
1161 | u8 gltsd:1; /* global logging target save disable */ | ||
1162 | u8 rlec:1; /* report log exception condition */ | ||
1163 | |||
1164 | u8 qalgo_mod:4; /* queue alogorithm modifier */ | ||
1165 | u8 reserved4:1; | ||
1166 | u8 qerr:2; /* queue error management */ | ||
1167 | u8 dque:1; /* disable queuing */ | ||
1168 | |||
1169 | u8 reserved5:1; | ||
1170 | u8 rac:1; /* report a check */ | ||
1171 | u8 reserved6:2; | ||
1172 | u8 swp:1; /* software write protect */ | ||
1173 | u8 raerp:1; /* ready AER permission */ | ||
1174 | u8 uaaerp:1; /* unit attenstion AER permission */ | ||
1175 | u8 eaerp:1; /* error AER permission */ | ||
1176 | |||
1177 | u8 reserved7:5; | ||
1178 | u8 autoload_mod:3; | ||
1179 | #else | ||
1180 | u8 rlec:1; /* report log exception condition */ | ||
1181 | u8 gltsd:1; /* global logging target save disable */ | ||
1182 | u8 reserved3:3; | ||
1183 | u8 tst:3; /* task set type */ | ||
1184 | |||
1185 | u8 dque:1; /* disable queuing */ | ||
1186 | u8 qerr:2; /* queue error management */ | ||
1187 | u8 reserved4:1; | ||
1188 | u8 qalgo_mod:4; /* queue alogorithm modifier */ | ||
1189 | |||
1190 | u8 eaerp:1; /* error AER permission */ | ||
1191 | u8 uaaerp:1; /* unit attenstion AER permission */ | ||
1192 | u8 raerp:1; /* ready AER permission */ | ||
1193 | u8 swp:1; /* software write protect */ | ||
1194 | u8 reserved6:2; | ||
1195 | u8 rac:1; /* report a check */ | ||
1196 | u8 reserved5:1; | ||
1197 | |||
1198 | u8 autoload_mod:3; | ||
1199 | u8 reserved7:5; | ||
1200 | #endif | ||
1201 | u8 rahp_msb; /* ready AER holdoff period - MSB */ | ||
1202 | u8 rahp_lsb; /* ready AER holdoff period - LSB */ | ||
1203 | |||
1204 | u8 busy_timeout_period_msb; | ||
1205 | u8 busy_timeout_period_lsb; | ||
1206 | |||
1207 | u8 ext_selftest_compl_time_msb; | ||
1208 | u8 ext_selftest_compl_time_lsb; | ||
1209 | }; | ||
1210 | |||
1211 | /* | ||
1212 | * SCSI medium types supported mode page | ||
1213 | */ | ||
1214 | struct scsi_mp_medium_types_sup_s{ | ||
1215 | #ifdef __BIGENDIAN | ||
1216 | u8 ps:1; | ||
1217 | u8 reserved1:1; | ||
1218 | u8 page_code:6; | ||
1219 | #else | ||
1220 | u8 page_code:6; | ||
1221 | u8 reserved1:1; | ||
1222 | u8 ps:1; | ||
1223 | #endif | ||
1224 | u8 page_len; | ||
1225 | |||
1226 | u8 reserved3[2]; | ||
1227 | u8 med_type1_sup; /* medium type one supported */ | ||
1228 | u8 med_type2_sup; /* medium type two supported */ | ||
1229 | u8 med_type3_sup; /* medium type three supported */ | ||
1230 | u8 med_type4_sup; /* medium type four supported */ | ||
1231 | }; | ||
1232 | |||
1233 | /* | ||
1234 | * SCSI informational exception control mode page | ||
1235 | */ | ||
1236 | struct scsi_mp_info_excpt_cntl_s{ | ||
1237 | #ifdef __BIGENDIAN | ||
1238 | u8 ps:1; | ||
1239 | u8 reserved1:1; | ||
1240 | u8 page_code:6; | ||
1241 | #else | ||
1242 | u8 page_code:6; | ||
1243 | u8 reserved1:1; | ||
1244 | u8 ps:1; | ||
1245 | #endif | ||
1246 | u8 page_len; | ||
1247 | #ifdef __BIGENDIAN | ||
1248 | u8 perf:1; /* performance */ | ||
1249 | u8 reserved3:1; | ||
1250 | u8 ebf:1; /* enable background fucntion */ | ||
1251 | u8 ewasc:1; /* enable warning */ | ||
1252 | u8 dexcpt:1; /* disable exception control */ | ||
1253 | u8 test:1; /* enable test device failure | ||
1254 | * notification | ||
1255 | */ | ||
1256 | u8 reserved4:1; | ||
1257 | u8 log_error:1; | ||
1258 | |||
1259 | u8 reserved5:4; | ||
1260 | u8 mrie:4; /* method of reporting info | ||
1261 | * exceptions | ||
1262 | */ | ||
1263 | #else | ||
1264 | u8 log_error:1; | ||
1265 | u8 reserved4:1; | ||
1266 | u8 test:1; /* enable test device failure | ||
1267 | * notification | ||
1268 | */ | ||
1269 | u8 dexcpt:1; /* disable exception control */ | ||
1270 | u8 ewasc:1; /* enable warning */ | ||
1271 | u8 ebf:1; /* enable background fucntion */ | ||
1272 | u8 reserved3:1; | ||
1273 | u8 perf:1; /* performance */ | ||
1274 | |||
1275 | u8 mrie:4; /* method of reporting info | ||
1276 | * exceptions | ||
1277 | */ | ||
1278 | u8 reserved5:4; | ||
1279 | #endif | ||
1280 | u8 interval_timer_msb; | ||
1281 | u8 interval_timer_lsb; | ||
1282 | |||
1283 | u8 report_count_msb; | ||
1284 | u8 report_count_lsb; | ||
1285 | }; | ||
1286 | |||
1287 | /* | ||
1288 | * Methods of reporting informational exceptions | ||
1289 | */ | ||
1290 | #define SCSI_MP_IEC_NO_REPORT 0x0 /* no reporting of exceptions */ | ||
1291 | #define SCSI_MP_IEC_AER 0x1 /* async event reporting */ | ||
1292 | #define SCSI_MP_IEC_UNIT_ATTN 0x2 /* generate unit attenstion */ | ||
1293 | #define SCSI_MO_IEC_COND_REC_ERR 0x3 /* conditionally generate recovered | ||
1294 | * error | ||
1295 | */ | ||
1296 | #define SCSI_MP_IEC_UNCOND_REC_ERR 0x4 /* unconditionally generate recovered | ||
1297 | * error | ||
1298 | */ | ||
1299 | #define SCSI_MP_IEC_NO_SENSE 0x5 /* generate no sense */ | ||
1300 | #define SCSI_MP_IEC_ON_REQUEST 0x6 /* only report exceptions on request */ | ||
1301 | |||
1302 | /* | ||
1303 | * SCSI flexible disk page | ||
1304 | */ | ||
1305 | struct scsi_mp_flexible_disk_s{ | ||
1306 | #ifdef __BIGENDIAN | ||
1307 | u8 ps:1; | ||
1308 | u8 reserved1:1; | ||
1309 | u8 page_code:6; | ||
1310 | #else | ||
1311 | u8 page_code:6; | ||
1312 | u8 reserved1:1; | ||
1313 | u8 ps:1; | ||
1314 | #endif | ||
1315 | u8 page_len; | ||
1316 | |||
1317 | u8 transfer_rate_msb; | ||
1318 | u8 transfer_rate_lsb; | ||
1319 | |||
1320 | u8 num_heads; | ||
1321 | u8 num_sectors; | ||
1322 | |||
1323 | u8 bytes_per_sector_msb; | ||
1324 | u8 bytes_per_sector_lsb; | ||
1325 | |||
1326 | u8 num_cylinders_msb; | ||
1327 | u8 num_cylinders_lsb; | ||
1328 | |||
1329 | u8 sc_wpc_msb; /* starting cylinder-write | ||
1330 | * precompensation msb | ||
1331 | */ | ||
1332 | u8 sc_wpc_lsb; /* starting cylinder-write | ||
1333 | * precompensation lsb | ||
1334 | */ | ||
1335 | u8 sc_rwc_msb; /* starting cylinder-reduced write | ||
1336 | * current msb | ||
1337 | */ | ||
1338 | u8 sc_rwc_lsb; /* starting cylinder-reduced write | ||
1339 | * current lsb | ||
1340 | */ | ||
1341 | |||
1342 | u8 dev_step_rate_msb; | ||
1343 | u8 dev_step_rate_lsb; | ||
1344 | |||
1345 | u8 dev_step_pulse_width; | ||
1346 | |||
1347 | u8 head_sd_msb; /* head settle delay msb */ | ||
1348 | u8 head_sd_lsb; /* head settle delay lsb */ | ||
1349 | |||
1350 | u8 motor_on_delay; | ||
1351 | u8 motor_off_delay; | ||
1352 | #ifdef __BIGENDIAN | ||
1353 | u8 trdy:1; /* true ready bit */ | ||
1354 | u8 ssn:1; /* start sector number bit */ | ||
1355 | u8 mo:1; /* motor on bit */ | ||
1356 | u8 reserved3:5; | ||
1357 | |||
1358 | u8 reserved4:4; | ||
1359 | u8 spc:4; /* step pulse per cylinder */ | ||
1360 | #else | ||
1361 | u8 reserved3:5; | ||
1362 | u8 mo:1; /* motor on bit */ | ||
1363 | u8 ssn:1; /* start sector number bit */ | ||
1364 | u8 trdy:1; /* true ready bit */ | ||
1365 | |||
1366 | u8 spc:4; /* step pulse per cylinder */ | ||
1367 | u8 reserved4:4; | ||
1368 | #endif | ||
1369 | u8 write_comp; | ||
1370 | u8 head_load_delay; | ||
1371 | u8 head_unload_delay; | ||
1372 | #ifdef __BIGENDIAN | ||
1373 | u8 pin34:4; /* pin34 usage */ | ||
1374 | u8 pin2:4; /* pin2 usage */ | ||
1375 | |||
1376 | u8 pin4:4; /* pin4 usage */ | ||
1377 | u8 pin1:4; /* pin1 usage */ | ||
1378 | #else | ||
1379 | u8 pin2:4; /* pin2 usage */ | ||
1380 | u8 pin34:4; /* pin34 usage */ | ||
1381 | |||
1382 | u8 pin1:4; /* pin1 usage */ | ||
1383 | u8 pin4:4; /* pin4 usage */ | ||
1384 | #endif | ||
1385 | u8 med_rot_rate_msb; | ||
1386 | u8 med_rot_rate_lsb; | ||
1387 | |||
1388 | u8 reserved5[2]; | ||
1389 | }; | ||
1390 | |||
1391 | struct scsi_mode_page_format_data6_s{ | ||
1392 | struct scsi_mode_param_header6_s mph; /* mode page header */ | ||
1393 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1394 | struct scsi_mp_format_device_s format; /* format device data */ | ||
1395 | }; | ||
1396 | |||
1397 | struct scsi_mode_page_format_data10_s{ | ||
1398 | struct scsi_mode_param_header10_s mph; /* mode page header */ | ||
1399 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1400 | struct scsi_mp_format_device_s format; /* format device data */ | ||
1401 | }; | ||
1402 | |||
1403 | struct scsi_mode_page_rdg_data6_s{ | ||
1404 | struct scsi_mode_param_header6_s mph; /* mode page header */ | ||
1405 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1406 | struct scsi_mp_rigid_device_geometry_s rdg; | ||
1407 | /* rigid geometry data */ | ||
1408 | }; | ||
1409 | |||
1410 | struct scsi_mode_page_rdg_data10_s{ | ||
1411 | struct scsi_mode_param_header10_s mph; /* mode page header */ | ||
1412 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1413 | struct scsi_mp_rigid_device_geometry_s rdg; | ||
1414 | /* rigid geometry data */ | ||
1415 | }; | ||
1416 | |||
1417 | struct scsi_mode_page_cache6_s{ | ||
1418 | struct scsi_mode_param_header6_s mph; /* mode page header */ | ||
1419 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1420 | struct scsi_mp_caching_s cache; /* cache page data */ | ||
1421 | }; | ||
1422 | |||
1423 | struct scsi_mode_page_cache10_s{ | ||
1424 | struct scsi_mode_param_header10_s mph; /* mode page header */ | ||
1425 | struct scsi_mode_param_desc_s desc; /* block descriptor */ | ||
1426 | struct scsi_mp_caching_s cache; /* cache page data */ | ||
1427 | }; | ||
1428 | |||
1429 | /* -------------------------------------------------------------- | ||
1430 | * Format Unit command | ||
1431 | * ------------------------------------------------------------ | ||
1432 | */ | ||
1433 | |||
1434 | /* | ||
1435 | * Format Unit CDB | ||
1436 | */ | ||
1437 | struct scsi_format_unit_s{ | ||
1438 | u8 opcode; | ||
1439 | #ifdef __BIGENDIAN | ||
1440 | u8 res1:3; | ||
1441 | u8 fmtdata:1; /* if set, data out phase has format | ||
1442 | * data | ||
1443 | */ | ||
1444 | u8 cmplst:1; /* if set, defect list is complete */ | ||
1445 | u8 def_list:3; /* format of defect descriptor is | ||
1446 | * fmtdata =1 | ||
1447 | */ | ||
1448 | #else | ||
1449 | u8 def_list:3; /* format of defect descriptor is | ||
1450 | * fmtdata = 1 | ||
1451 | */ | ||
1452 | u8 cmplst:1; /* if set, defect list is complete */ | ||
1453 | u8 fmtdata:1; /* if set, data out phase has format | ||
1454 | * data | ||
1455 | */ | ||
1456 | u8 res1:3; | ||
1457 | #endif | ||
1458 | u8 interleave_msb; | ||
1459 | u8 interleave_lsb; | ||
1460 | u8 vendor_spec; | ||
1461 | u8 control; | ||
1462 | }; | ||
1463 | |||
1464 | /* | ||
1465 | * h | ||
1466 | */ | ||
1467 | struct scsi_reserve6_s{ | ||
1468 | u8 opcode; | ||
1469 | #ifdef __BIGENDIAN | ||
1470 | u8 reserved:3; | ||
1471 | u8 obsolete:4; | ||
1472 | u8 extent:1; | ||
1473 | #else | ||
1474 | u8 extent:1; | ||
1475 | u8 obsolete:4; | ||
1476 | u8 reserved:3; | ||
1477 | #endif | ||
1478 | u8 reservation_id; | ||
1479 | u16 param_list_len; | ||
1480 | u8 control; | ||
1481 | }; | ||
1482 | |||
1483 | /* | ||
1484 | * h | ||
1485 | */ | ||
1486 | struct scsi_release6_s{ | ||
1487 | u8 opcode; | ||
1488 | #ifdef __BIGENDIAN | ||
1489 | u8 reserved1:3; | ||
1490 | u8 obsolete:4; | ||
1491 | u8 extent:1; | ||
1492 | #else | ||
1493 | u8 extent:1; | ||
1494 | u8 obsolete:4; | ||
1495 | u8 reserved1:3; | ||
1496 | #endif | ||
1497 | u8 reservation_id; | ||
1498 | u16 reserved2; | ||
1499 | u8 control; | ||
1500 | }; | ||
1501 | |||
1502 | /* | ||
1503 | * h | ||
1504 | */ | ||
1505 | struct scsi_reserve10_s{ | ||
1506 | u8 opcode; | ||
1507 | #ifdef __BIGENDIAN | ||
1508 | u8 reserved1:3; | ||
1509 | u8 third_party:1; | ||
1510 | u8 reserved2:2; | ||
1511 | u8 long_id:1; | ||
1512 | u8 extent:1; | ||
1513 | #else | ||
1514 | u8 extent:1; | ||
1515 | u8 long_id:1; | ||
1516 | u8 reserved2:2; | ||
1517 | u8 third_party:1; | ||
1518 | u8 reserved1:3; | ||
1519 | #endif | ||
1520 | u8 reservation_id; | ||
1521 | u8 third_pty_dev_id; | ||
1522 | u8 reserved3; | ||
1523 | u8 reserved4; | ||
1524 | u8 reserved5; | ||
1525 | u16 param_list_len; | ||
1526 | u8 control; | ||
1527 | }; | ||
1528 | |||
1529 | struct scsi_release10_s{ | ||
1530 | u8 opcode; | ||
1531 | #ifdef __BIGENDIAN | ||
1532 | u8 reserved1:3; | ||
1533 | u8 third_party:1; | ||
1534 | u8 reserved2:2; | ||
1535 | u8 long_id:1; | ||
1536 | u8 extent:1; | ||
1537 | #else | ||
1538 | u8 extent:1; | ||
1539 | u8 long_id:1; | ||
1540 | u8 reserved2:2; | ||
1541 | u8 third_party:1; | ||
1542 | u8 reserved1:3; | ||
1543 | #endif | ||
1544 | u8 reservation_id; | ||
1545 | u8 third_pty_dev_id; | ||
1546 | u8 reserved3; | ||
1547 | u8 reserved4; | ||
1548 | u8 reserved5; | ||
1549 | u16 param_list_len; | ||
1550 | u8 control; | ||
1551 | }; | ||
1552 | |||
1553 | struct scsi_verify10_s{ | ||
1554 | u8 opcode; | ||
1555 | #ifdef __BIGENDIAN | ||
1556 | u8 lun:3; | ||
1557 | u8 dpo:1; | ||
1558 | u8 reserved:2; | ||
1559 | u8 bytchk:1; | ||
1560 | u8 reladdr:1; | ||
1561 | #else | ||
1562 | u8 reladdr:1; | ||
1563 | u8 bytchk:1; | ||
1564 | u8 reserved:2; | ||
1565 | u8 dpo:1; | ||
1566 | u8 lun:3; | ||
1567 | #endif | ||
1568 | u8 lba0; | ||
1569 | u8 lba1; | ||
1570 | u8 lba2; | ||
1571 | u8 lba3; | ||
1572 | u8 reserved1; | ||
1573 | u8 verification_len0; | ||
1574 | u8 verification_len1; | ||
1575 | u8 control_byte; | ||
1576 | }; | ||
1577 | |||
1578 | struct scsi_request_sense_s{ | ||
1579 | u8 opcode; | ||
1580 | #ifdef __BIGENDIAN | ||
1581 | u8 lun:3; | ||
1582 | u8 reserved:5; | ||
1583 | #else | ||
1584 | u8 reserved:5; | ||
1585 | u8 lun:3; | ||
1586 | #endif | ||
1587 | u8 reserved0; | ||
1588 | u8 reserved1; | ||
1589 | u8 alloc_len; | ||
1590 | u8 control_byte; | ||
1591 | }; | ||
1592 | |||
1593 | /* ------------------------------------------------------------ | ||
1594 | * SCSI status byte values | ||
1595 | * ------------------------------------------------------------ | ||
1596 | */ | ||
1597 | #define SCSI_STATUS_GOOD 0x00 | ||
1598 | #define SCSI_STATUS_CHECK_CONDITION 0x02 | ||
1599 | #define SCSI_STATUS_CONDITION_MET 0x04 | ||
1600 | #define SCSI_STATUS_BUSY 0x08 | ||
1601 | #define SCSI_STATUS_INTERMEDIATE 0x10 | ||
1602 | #define SCSI_STATUS_ICM 0x14 /* intermediate condition met */ | ||
1603 | #define SCSI_STATUS_RESERVATION_CONFLICT 0x18 | ||
1604 | #define SCSI_STATUS_COMMAND_TERMINATED 0x22 | ||
1605 | #define SCSI_STATUS_QUEUE_FULL 0x28 | ||
1606 | #define SCSI_STATUS_ACA_ACTIVE 0x30 | ||
1607 | |||
1608 | #define SCSI_MAX_ALLOC_LEN 0xFF /* maximum allocarion length | ||
1609 | * in CDBs | ||
1610 | */ | ||
1611 | |||
1612 | #define SCSI_OP_WRITE_VERIFY10 0x2E | ||
1613 | #define SCSI_OP_WRITE_VERIFY12 0xAE | ||
1614 | #define SCSI_OP_UNDEF 0xFF | ||
1615 | |||
1616 | /* | ||
1617 | * SCSI WRITE-VERIFY(10) command | ||
1618 | */ | ||
1619 | struct scsi_write_verify10_s{ | ||
1620 | u8 opcode; | ||
1621 | #ifdef __BIGENDIAN | ||
1622 | u8 reserved1:3; | ||
1623 | u8 dpo:1; /* Disable Page Out */ | ||
1624 | u8 reserved2:1; | ||
1625 | u8 ebp:1; /* erse by-pass */ | ||
1626 | u8 bytchk:1; /* byte check */ | ||
1627 | u8 rel_adr:1; /* relative address */ | ||
1628 | #else | ||
1629 | u8 rel_adr:1; /* relative address */ | ||
1630 | u8 bytchk:1; /* byte check */ | ||
1631 | u8 ebp:1; /* erse by-pass */ | ||
1632 | u8 reserved2:1; | ||
1633 | u8 dpo:1; /* Disable Page Out */ | ||
1634 | u8 reserved1:3; | ||
1635 | #endif | ||
1636 | u8 lba0; /* logical block address - MSB */ | ||
1637 | u8 lba1; | ||
1638 | u8 lba2; | ||
1639 | u8 lba3; /* LSB */ | ||
1640 | u8 reserved3; | ||
1641 | u8 xfer_length0; /* transfer length in blocks - MSB */ | ||
1642 | u8 xfer_length1; /* LSB */ | ||
1643 | u8 control; | ||
1644 | }; | ||
1645 | |||
1646 | #pragma pack() | ||
1647 | |||
1648 | #endif /* __SCSI_H__ */ | ||
diff --git a/drivers/scsi/bfa/include/protocol/types.h b/drivers/scsi/bfa/include/protocol/types.h new file mode 100644 index 00000000000..2875a6cced3 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/types.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | /** | ||
19 | * types.h Protocol defined base types | ||
20 | */ | ||
21 | |||
22 | #ifndef __TYPES_H__ | ||
23 | #define __TYPES_H__ | ||
24 | |||
25 | #include <bfa_os_inc.h> | ||
26 | |||
27 | #define wwn_t u64 | ||
28 | #define lun_t u64 | ||
29 | |||
30 | #define WWN_NULL (0) | ||
31 | #define FC_SYMNAME_MAX 256 /* max name server symbolic name size */ | ||
32 | #define FC_ALPA_MAX 128 | ||
33 | |||
34 | #pragma pack(1) | ||
35 | |||
36 | #define MAC_ADDRLEN (6) | ||
37 | struct mac_s { u8 mac[MAC_ADDRLEN]; }; | ||
38 | #define mac_t struct mac_s | ||
39 | |||
40 | #pragma pack() | ||
41 | |||
42 | #endif | ||