1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Aic94xx SAS/SATA driver SAS definitions and hardware interface header file. |
4 | * |
5 | * Copyright (C) 2005 Adaptec, Inc. All rights reserved. |
6 | * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com> |
7 | */ |
8 | |
9 | #ifndef _AIC94XX_SAS_H_ |
10 | #define _AIC94XX_SAS_H_ |
11 | |
12 | #include <scsi/libsas.h> |
13 | |
14 | /* ---------- DDBs ---------- */ |
15 | /* DDBs are device descriptor blocks which describe a device in the |
16 | * domain that this sequencer can maintain low-level connections for |
17 | * us. They are be 64 bytes. |
18 | */ |
19 | #define ASD_MAX_DDBS 128 |
20 | |
21 | struct asd_ddb_ssp_smp_target_port { |
22 | u8 conn_type; /* byte 0 */ |
23 | #define DDB_TP_CONN_TYPE 0x81 /* Initiator port and addr frame type 0x01 */ |
24 | |
25 | u8 conn_rate; |
26 | __be16 init_conn_tag; |
27 | u8 dest_sas_addr[8]; /* bytes 4-11 */ |
28 | |
29 | __le16 send_queue_head; |
30 | u8 sq_suspended; |
31 | u8 ddb_type; /* DDB_TYPE_TARGET */ |
32 | #define DDB_TYPE_UNUSED 0xFF |
33 | #define DDB_TYPE_TARGET 0xFE |
34 | #define DDB_TYPE_INITIATOR 0xFD |
35 | #define DDB_TYPE_PM_PORT 0xFC |
36 | |
37 | __le16 _r_a; |
38 | __be16 awt_def; |
39 | |
40 | u8 compat_features; /* byte 20 */ |
41 | u8 pathway_blocked_count; |
42 | __be16 arb_wait_time; |
43 | __be32 more_compat_features; /* byte 24 */ |
44 | |
45 | u8 conn_mask; |
46 | u8 flags; /* concurrent conn:2,2 and open:0(1) */ |
47 | #define CONCURRENT_CONN_SUPP 0x04 |
48 | #define OPEN_REQUIRED 0x01 |
49 | |
50 | u16 _r_b; |
51 | __le16 exec_queue_tail; |
52 | __le16 send_queue_tail; |
53 | __le16 sister_ddb; |
54 | |
55 | __le16 _r_c; |
56 | |
57 | u8 max_concurrent_conn; |
58 | u8 num_concurrent_conn; |
59 | u8 num_contexts; |
60 | |
61 | u8 _r_d; |
62 | |
63 | __le16 active_task_count; |
64 | |
65 | u8 _r_e[9]; |
66 | |
67 | u8 itnl_reason; /* I_T nexus loss reason */ |
68 | |
69 | __le16 _r_f; |
70 | |
71 | __le16 itnl_timeout; |
72 | #define ITNL_TIMEOUT_CONST 0x7D0 /* 2 seconds */ |
73 | |
74 | __le32 itnl_timestamp; |
75 | } __attribute__ ((packed)); |
76 | |
77 | struct asd_ddb_stp_sata_target_port { |
78 | u8 conn_type; /* byte 0 */ |
79 | u8 conn_rate; |
80 | __be16 init_conn_tag; |
81 | u8 dest_sas_addr[8]; /* bytes 4-11 */ |
82 | |
83 | __le16 send_queue_head; |
84 | u8 sq_suspended; |
85 | u8 ddb_type; /* DDB_TYPE_TARGET */ |
86 | |
87 | __le16 _r_a; |
88 | |
89 | __be16 awt_def; |
90 | u8 compat_features; /* byte 20 */ |
91 | u8 pathway_blocked_count; |
92 | __be16 arb_wait_time; |
93 | __be32 more_compat_features; /* byte 24 */ |
94 | |
95 | u8 conn_mask; |
96 | u8 flags; /* concurrent conn:2,2 and open:0(1) */ |
97 | #define SATA_MULTIPORT 0x80 |
98 | #define SUPPORTS_AFFIL 0x40 |
99 | #define STP_AFFIL_POL 0x20 |
100 | |
101 | u8 _r_b; |
102 | u8 flags2; /* STP close policy:0 */ |
103 | #define STP_CL_POL_NO_TX 0x00 |
104 | #define STP_CL_POL_BTW_CMDS 0x01 |
105 | |
106 | __le16 exec_queue_tail; |
107 | __le16 send_queue_tail; |
108 | __le16 sister_ddb; |
109 | __le16 ata_cmd_scbptr; |
110 | __le32 sata_tag_alloc_mask; |
111 | __le16 active_task_count; |
112 | __le16 _r_c; |
113 | __le32 sata_sactive; |
114 | u8 num_sata_tags; |
115 | u8 sata_status; |
116 | u8 sata_ending_status; |
117 | u8 itnl_reason; /* I_T nexus loss reason */ |
118 | __le16 ncq_data_scb_ptr; |
119 | __le16 itnl_timeout; |
120 | __le32 itnl_timestamp; |
121 | } __attribute__ ((packed)); |
122 | |
123 | /* This struct asd_ddb_init_port, describes the device descriptor block |
124 | * of an initiator port (when the sequencer is operating in target mode). |
125 | * Bytes [0,11] and [20,27] are from the OPEN address frame. |
126 | * The sequencer allocates an initiator port DDB entry. |
127 | */ |
128 | struct asd_ddb_init_port { |
129 | u8 conn_type; /* byte 0 */ |
130 | u8 conn_rate; |
131 | __be16 init_conn_tag; /* BE */ |
132 | u8 dest_sas_addr[8]; |
133 | __le16 send_queue_head; /* LE, byte 12 */ |
134 | u8 sq_suspended; |
135 | u8 ddb_type; /* DDB_TYPE_INITIATOR */ |
136 | __le16 _r_a; |
137 | __be16 awt_def; /* BE */ |
138 | u8 compat_features; |
139 | u8 pathway_blocked_count; |
140 | __be16 arb_wait_time; /* BE */ |
141 | __be32 more_compat_features; /* BE */ |
142 | u8 conn_mask; |
143 | u8 flags; /* == 5 */ |
144 | u16 _r_b; |
145 | __le16 exec_queue_tail; /* execution queue tail */ |
146 | __le16 send_queue_tail; |
147 | __le16 sister_ddb; |
148 | __le16 init_resp_timeout; /* initiator response timeout */ |
149 | __le32 _r_c; |
150 | __le16 active_tasks; /* active task count */ |
151 | __le16 init_list; /* initiator list link pointer */ |
152 | __le32 _r_d; |
153 | u8 max_conn_to[3]; /* from Conn-Disc mode page, in us, LE */ |
154 | u8 itnl_reason; /* I_T nexus loss reason */ |
155 | __le16 bus_inact_to; /* from Conn-Disc mode page, in 100 us, LE */ |
156 | __le16 itnl_to; /* from the Protocol Specific Port Ctrl MP */ |
157 | __le32 itnl_timestamp; |
158 | } __attribute__ ((packed)); |
159 | |
160 | /* This struct asd_ddb_sata_tag, describes a look-up table to be used |
161 | * by the sequencers. SATA II, IDENTIFY DEVICE data, word 76, bit 8: |
162 | * NCQ support. This table is used by the sequencers to find the |
163 | * corresponding SCB, given a SATA II tag value. |
164 | */ |
165 | struct asd_ddb_sata_tag { |
166 | __le16 scb_pointer[32]; |
167 | } __attribute__ ((packed)); |
168 | |
169 | /* This struct asd_ddb_sata_pm_table, describes a port number to |
170 | * connection handle look-up table. SATA targets attached to a port |
171 | * multiplier require a 4-bit port number value. There is one DDB |
172 | * entry of this type for each SATA port multiplier (sister DDB). |
173 | * Given a SATA PM port number, this table gives us the SATA PM Port |
174 | * DDB of the SATA port multiplier port (i.e. the SATA target |
175 | * discovered on the port). |
176 | */ |
177 | struct asd_ddb_sata_pm_table { |
178 | __le16 ddb_pointer[16]; |
179 | __le16 _r_a[16]; |
180 | } __attribute__ ((packed)); |
181 | |
182 | /* This struct asd_ddb_sata_pm_port, describes the SATA port multiplier |
183 | * port format DDB. |
184 | */ |
185 | struct asd_ddb_sata_pm_port { |
186 | u8 _r_a[15]; |
187 | u8 ddb_type; |
188 | u8 _r_b[13]; |
189 | u8 pm_port_flags; |
190 | #define PM_PORT_MASK 0xF0 |
191 | #define PM_PORT_SET 0x02 |
192 | u8 _r_c[6]; |
193 | __le16 sister_ddb; |
194 | __le16 ata_cmd_scbptr; |
195 | __le32 sata_tag_alloc_mask; |
196 | __le16 active_task_count; |
197 | __le16 parent_ddb; |
198 | __le32 sata_sactive; |
199 | u8 num_sata_tags; |
200 | u8 sata_status; |
201 | u8 sata_ending_status; |
202 | u8 _r_d[9]; |
203 | } __attribute__ ((packed)); |
204 | |
205 | /* This struct asd_ddb_seq_shared, describes a DDB shared by the |
206 | * central and link sequencers. port_map_by_links is indexed phy |
207 | * number [0,7]; each byte is a bit mask of all the phys that are in |
208 | * the same port as the indexed phy. |
209 | */ |
210 | struct asd_ddb_seq_shared { |
211 | __le16 q_free_ddb_head; |
212 | __le16 q_free_ddb_tail; |
213 | __le16 q_free_ddb_cnt; |
214 | __le16 q_used_ddb_head; |
215 | __le16 q_used_ddb_tail; |
216 | __le16 shared_mem_lock; |
217 | __le16 smp_conn_tag; |
218 | __le16 est_nexus_buf_cnt; |
219 | __le16 est_nexus_buf_thresh; |
220 | u32 _r_a; |
221 | u8 settable_max_contexts; |
222 | u8 _r_b[23]; |
223 | u8 conn_not_active; |
224 | u8 phy_is_up; |
225 | u8 _r_c[8]; |
226 | u8 port_map_by_links[8]; |
227 | } __attribute__ ((packed)); |
228 | |
229 | /* ---------- SG Element ---------- */ |
230 | |
231 | /* This struct sg_el, describes the hardware scatter gather buffer |
232 | * element. All entries are little endian. In an SCB, there are 2 of |
233 | * this, plus one more, called a link element of this indicating a |
234 | * sublist if needed. |
235 | * |
236 | * A link element has only the bus address set and the flags (DS) bit |
237 | * valid. The bus address points to the start of the sublist. |
238 | * |
239 | * If a sublist is needed, then that sublist should also include the 2 |
240 | * sg_el embedded in the SCB, in which case next_sg_offset is 32, |
241 | * since sizeof(sg_el) = 16; EOS should be 1 and EOL 0 in this case. |
242 | */ |
243 | struct sg_el { |
244 | __le64 bus_addr; |
245 | __le32 size; |
246 | __le16 _r; |
247 | u8 next_sg_offs; |
248 | u8 flags; |
249 | #define ASD_SG_EL_DS_MASK 0x30 |
250 | #define ASD_SG_EL_DS_OCM 0x10 |
251 | #define ASD_SG_EL_DS_HM 0x00 |
252 | #define ASD_SG_EL_LIST_MASK 0xC0 |
253 | #define ASD_SG_EL_LIST_EOL 0x40 |
254 | #define ASD_SG_EL_LIST_EOS 0x80 |
255 | } __attribute__ ((packed)); |
256 | |
257 | /* ---------- SCBs ---------- */ |
258 | |
259 | /* An SCB (sequencer control block) is comprised of a common header |
260 | * and a task part, for a total of 128 bytes. All fields are in LE |
261 | * order, unless otherwise noted. |
262 | */ |
263 | |
264 | /* This struct scb_header, defines the SCB header format. |
265 | */ |
266 | struct { |
267 | __le64 ; |
268 | __le16 ; /* transaction context */ |
269 | u8 ; |
270 | } __attribute__ ((packed)); |
271 | |
272 | /* SCB opcodes: Execution queue |
273 | */ |
274 | #define INITIATE_SSP_TASK 0x00 |
275 | #define INITIATE_LONG_SSP_TASK 0x01 |
276 | #define INITIATE_BIDIR_SSP_TASK 0x02 |
277 | #define SCB_ABORT_TASK 0x03 |
278 | #define INITIATE_SSP_TMF 0x04 |
279 | #define SSP_TARG_GET_DATA 0x05 |
280 | #define SSP_TARG_GET_DATA_GOOD 0x06 |
281 | #define SSP_TARG_SEND_RESP 0x07 |
282 | #define QUERY_SSP_TASK 0x08 |
283 | #define INITIATE_ATA_TASK 0x09 |
284 | #define INITIATE_ATAPI_TASK 0x0a |
285 | #define CONTROL_ATA_DEV 0x0b |
286 | #define INITIATE_SMP_TASK 0x0c |
287 | #define SMP_TARG_SEND_RESP 0x0f |
288 | |
289 | /* SCB opcodes: Send Queue |
290 | */ |
291 | #define SSP_TARG_SEND_DATA 0x40 |
292 | #define SSP_TARG_SEND_DATA_GOOD 0x41 |
293 | |
294 | /* SCB opcodes: Link Queue |
295 | */ |
296 | #define CONTROL_PHY 0x80 |
297 | #define SEND_PRIMITIVE 0x81 |
298 | #define INITIATE_LINK_ADM_TASK 0x82 |
299 | |
300 | /* SCB opcodes: other |
301 | */ |
302 | #define EMPTY_SCB 0xc0 |
303 | #define INITIATE_SEQ_ADM_TASK 0xc1 |
304 | #define EST_ICL_TARG_WINDOW 0xc2 |
305 | #define COPY_MEM 0xc3 |
306 | #define CLEAR_NEXUS 0xc4 |
307 | #define INITIATE_DDB_ADM_TASK 0xc6 |
308 | #define ESTABLISH_NEXUS_ESCB 0xd0 |
309 | |
310 | #define LUN_SIZE 8 |
311 | |
312 | #define EFB_MASK 0x80 |
313 | #define TASK_PRIO_MASK 0x78 |
314 | #define TASK_ATTR_MASK 0x07 |
315 | /* ---------- SCB tasks ---------- */ |
316 | |
317 | /* This is both ssp_task and long_ssp_task |
318 | */ |
319 | struct initiate_ssp_task { |
320 | u8 proto_conn_rate; /* proto:6,4, conn_rate:3,0 */ |
321 | __le32 total_xfer_len; |
322 | struct ssp_frame_hdr ssp_frame; |
323 | struct ssp_command_iu ssp_cmd; |
324 | __le16 sister_scb; /* 0xFFFF */ |
325 | __le16 conn_handle; /* index to DDB for the intended target */ |
326 | u8 data_dir; /* :1,0 */ |
327 | #define DATA_DIR_NONE 0x00 |
328 | #define DATA_DIR_IN 0x01 |
329 | #define DATA_DIR_OUT 0x02 |
330 | #define DATA_DIR_BYRECIPIENT 0x03 |
331 | |
332 | u8 _r_a; |
333 | u8 retry_count; |
334 | u8 _r_b[5]; |
335 | struct sg_el sg_element[3]; /* 2 real and 1 link */ |
336 | } __attribute__ ((packed)); |
337 | |
338 | /* This defines both ata_task and atapi_task. |
339 | * ata: C bit of FIS should be 1, |
340 | * atapi: C bit of FIS should be 1, and command register should be 0xA0, |
341 | * to indicate a packet command. |
342 | */ |
343 | struct initiate_ata_task { |
344 | u8 proto_conn_rate; |
345 | __le32 total_xfer_len; |
346 | struct host_to_dev_fis fis; |
347 | __le32 data_offs; |
348 | u8 atapi_packet[16]; |
349 | u8 _r_a[12]; |
350 | __le16 sister_scb; |
351 | __le16 conn_handle; |
352 | u8 ata_flags; /* CSMI:6,6, DTM:4,4, QT:3,3, data dir:1,0 */ |
353 | #define CSMI_TASK 0x40 |
354 | #define DATA_XFER_MODE_DMA 0x10 |
355 | #define ATA_Q_TYPE_MASK 0x08 |
356 | #define ATA_Q_TYPE_UNTAGGED 0x00 |
357 | #define ATA_Q_TYPE_NCQ 0x08 |
358 | |
359 | u8 _r_b; |
360 | u8 retry_count; |
361 | u8 _r_c; |
362 | u8 flags; |
363 | #define STP_AFFIL_POLICY 0x20 |
364 | #define SET_AFFIL_POLICY 0x10 |
365 | #define RET_PARTIAL_SGLIST 0x02 |
366 | |
367 | u8 _r_d[3]; |
368 | struct sg_el sg_element[3]; |
369 | } __attribute__ ((packed)); |
370 | |
371 | struct initiate_smp_task { |
372 | u8 proto_conn_rate; |
373 | u8 _r_a[40]; |
374 | struct sg_el smp_req; |
375 | __le16 sister_scb; |
376 | __le16 conn_handle; |
377 | u8 _r_c[8]; |
378 | struct sg_el smp_resp; |
379 | u8 _r_d[32]; |
380 | } __attribute__ ((packed)); |
381 | |
382 | struct control_phy { |
383 | u8 phy_id; |
384 | u8 sub_func; |
385 | #define DISABLE_PHY 0x00 |
386 | #define ENABLE_PHY 0x01 |
387 | #define RELEASE_SPINUP_HOLD 0x02 |
388 | #define ENABLE_PHY_NO_SAS_OOB 0x03 |
389 | #define ENABLE_PHY_NO_SATA_OOB 0x04 |
390 | #define PHY_NO_OP 0x05 |
391 | #define EXECUTE_HARD_RESET 0x81 |
392 | |
393 | u8 func_mask; |
394 | u8 speed_mask; |
395 | u8 hot_plug_delay; |
396 | u8 port_type; |
397 | u8 flags; |
398 | #define DEV_PRES_TIMER_OVERRIDE_ENABLE 0x01 |
399 | #define DISABLE_PHY_IF_OOB_FAILS 0x02 |
400 | |
401 | __le32 timeout_override; |
402 | u8 link_reset_retries; |
403 | u8 _r_a[47]; |
404 | __le16 conn_handle; |
405 | u8 _r_b[56]; |
406 | } __attribute__ ((packed)); |
407 | |
408 | struct control_ata_dev { |
409 | u8 proto_conn_rate; |
410 | __le32 _r_a; |
411 | struct host_to_dev_fis fis; |
412 | u8 _r_b[32]; |
413 | __le16 sister_scb; |
414 | __le16 conn_handle; |
415 | u8 ata_flags; /* 0 */ |
416 | u8 _r_c[55]; |
417 | } __attribute__ ((packed)); |
418 | |
419 | struct empty_scb { |
420 | u8 num_valid; |
421 | __le32 _r_a; |
422 | #define ASD_EDBS_PER_SCB 7 |
423 | /* header+data+CRC+DMA suffix data */ |
424 | #define ASD_EDB_SIZE (24+1024+4+16) |
425 | struct sg_el eb[ASD_EDBS_PER_SCB]; |
426 | #define ELEMENT_NOT_VALID 0xC0 |
427 | } __attribute__ ((packed)); |
428 | |
429 | struct initiate_link_adm { |
430 | u8 phy_id; |
431 | u8 sub_func; |
432 | #define GET_LINK_ERROR_COUNT 0x00 |
433 | #define RESET_LINK_ERROR_COUNT 0x01 |
434 | #define ENABLE_NOTIFY_SPINUP_INTS 0x02 |
435 | |
436 | u8 _r_a[57]; |
437 | __le16 conn_handle; |
438 | u8 _r_b[56]; |
439 | } __attribute__ ((packed)); |
440 | |
441 | struct copy_memory { |
442 | u8 _r_a; |
443 | __le16 xfer_len; |
444 | __le16 _r_b; |
445 | __le64 src_busaddr; |
446 | u8 src_ds; /* See definition of sg_el */ |
447 | u8 _r_c[45]; |
448 | __le16 conn_handle; |
449 | __le64 _r_d; |
450 | __le64 dest_busaddr; |
451 | u8 dest_ds; /* See definition of sg_el */ |
452 | u8 _r_e[39]; |
453 | } __attribute__ ((packed)); |
454 | |
455 | struct abort_task { |
456 | u8 proto_conn_rate; |
457 | __le32 _r_a; |
458 | struct ssp_frame_hdr ssp_frame; |
459 | struct ssp_tmf_iu ssp_task; |
460 | __le16 sister_scb; |
461 | __le16 conn_handle; |
462 | u8 flags; /* ovrd_itnl_timer:3,3, suspend_data_trans:2,2 */ |
463 | #define SUSPEND_DATA_TRANS 0x04 |
464 | |
465 | u8 _r_b; |
466 | u8 retry_count; |
467 | u8 _r_c[5]; |
468 | __le16 index; /* Transaction context of task to be queried */ |
469 | __le16 itnl_to; |
470 | u8 _r_d[44]; |
471 | } __attribute__ ((packed)); |
472 | |
473 | struct clear_nexus { |
474 | u8 nexus; |
475 | #define NEXUS_ADAPTER 0x00 |
476 | #define NEXUS_PORT 0x01 |
477 | #define NEXUS_I_T 0x02 |
478 | #define NEXUS_I_T_L 0x03 |
479 | #define NEXUS_TAG 0x04 |
480 | #define NEXUS_TRANS_CX 0x05 |
481 | #define NEXUS_SATA_TAG 0x06 |
482 | #define NEXUS_T_L 0x07 |
483 | #define NEXUS_L 0x08 |
484 | #define NEXUS_T_TAG 0x09 |
485 | |
486 | __le32 _r_a; |
487 | u8 flags; |
488 | #define SUSPEND_TX 0x80 |
489 | #define RESUME_TX 0x40 |
490 | #define SEND_Q 0x04 |
491 | #define EXEC_Q 0x02 |
492 | #define NOTINQ 0x01 |
493 | |
494 | u8 _r_b[3]; |
495 | u8 conn_mask; |
496 | u8 _r_c[19]; |
497 | struct ssp_tmf_iu ssp_task; /* LUN and TAG */ |
498 | __le16 _r_d; |
499 | __le16 conn_handle; |
500 | __le64 _r_e; |
501 | __le16 index; /* Transaction context of task to be cleared */ |
502 | __le16 context; /* Clear nexus context */ |
503 | u8 _r_f[44]; |
504 | } __attribute__ ((packed)); |
505 | |
506 | struct initiate_ssp_tmf { |
507 | u8 proto_conn_rate; |
508 | __le32 _r_a; |
509 | struct ssp_frame_hdr ssp_frame; |
510 | struct ssp_tmf_iu ssp_task; |
511 | __le16 sister_scb; |
512 | __le16 conn_handle; |
513 | u8 flags; /* itnl override and suspend data tx */ |
514 | #define OVERRIDE_ITNL_TIMER 8 |
515 | |
516 | u8 _r_b; |
517 | u8 retry_count; |
518 | u8 _r_c[5]; |
519 | __le16 index; /* Transaction context of task to be queried */ |
520 | __le16 itnl_to; |
521 | u8 _r_d[44]; |
522 | } __attribute__ ((packed)); |
523 | |
524 | /* Transmits an arbitrary primitive on the link. |
525 | * Used for NOTIFY and BROADCAST. |
526 | */ |
527 | struct send_prim { |
528 | u8 phy_id; |
529 | u8 wait_transmit; /* :0,0 */ |
530 | u8 xmit_flags; |
531 | #define XMTPSIZE_MASK 0xF0 |
532 | #define XMTPSIZE_SINGLE 0x10 |
533 | #define XMTPSIZE_REPEATED 0x20 |
534 | #define XMTPSIZE_CONT 0x20 |
535 | #define XMTPSIZE_TRIPLE 0x30 |
536 | #define XMTPSIZE_REDUNDANT 0x60 |
537 | #define XMTPSIZE_INF 0 |
538 | |
539 | #define XMTCONTEN 0x04 |
540 | #define XMTPFRM 0x02 /* Transmit at the next frame boundary */ |
541 | #define XMTPIMM 0x01 /* Transmit immediately */ |
542 | |
543 | __le16 _r_a; |
544 | u8 prim[4]; /* K, D0, D1, D2 */ |
545 | u8 _r_b[50]; |
546 | __le16 conn_handle; |
547 | u8 _r_c[56]; |
548 | } __attribute__ ((packed)); |
549 | |
550 | /* This describes both SSP Target Get Data and SSP Target Get Data And |
551 | * Send Good Response SCBs. Used when the sequencer is operating in |
552 | * target mode... |
553 | */ |
554 | struct ssp_targ_get_data { |
555 | u8 proto_conn_rate; |
556 | __le32 total_xfer_len; |
557 | struct ssp_frame_hdr ssp_frame; |
558 | struct xfer_rdy_iu xfer_rdy; |
559 | u8 lun[LUN_SIZE]; |
560 | __le64 _r_a; |
561 | __le16 sister_scb; |
562 | __le16 conn_handle; |
563 | u8 data_dir; /* 01b */ |
564 | u8 _r_b; |
565 | u8 retry_count; |
566 | u8 _r_c[5]; |
567 | struct sg_el sg_element[3]; |
568 | } __attribute__ ((packed)); |
569 | |
570 | /* ---------- The actual SCB struct ---------- */ |
571 | |
572 | struct scb { |
573 | struct scb_header ; |
574 | union { |
575 | struct initiate_ssp_task ssp_task; |
576 | struct initiate_ata_task ata_task; |
577 | struct initiate_smp_task smp_task; |
578 | struct control_phy control_phy; |
579 | struct control_ata_dev control_ata_dev; |
580 | struct empty_scb escb; |
581 | struct initiate_link_adm link_adm; |
582 | struct copy_memory cp_mem; |
583 | struct abort_task abort_task; |
584 | struct clear_nexus clear_nexus; |
585 | struct initiate_ssp_tmf ssp_tmf; |
586 | }; |
587 | } __attribute__ ((packed)); |
588 | |
589 | /* ---------- Done List ---------- */ |
590 | /* The done list entry opcode field is defined below. |
591 | * The mnemonic encoding and meaning is as follows: |
592 | * TC - Task Complete, status was received and acknowledged |
593 | * TF - Task Failed, indicates an error prior to receiving acknowledgment |
594 | * for the command: |
595 | * - no conn, |
596 | * - NACK or R_ERR received in response to this command, |
597 | * - credit blocked or not available, or in the case of SMP request, |
598 | * - no SMP response was received. |
599 | * In these four cases it is known that the target didn't receive the |
600 | * command. |
601 | * TI - Task Interrupted, error after the command was acknowledged. It is |
602 | * known that the command was received by the target. |
603 | * TU - Task Unacked, command was transmitted but neither ACK (R_OK) nor NAK |
604 | * (R_ERR) was received due to loss of signal, broken connection, loss of |
605 | * dword sync or other reason. The application client should send the |
606 | * appropriate task query. |
607 | * TA - Task Aborted, see TF. |
608 | * _RESP - The completion includes an empty buffer containing status. |
609 | * TO - Timeout. |
610 | */ |
611 | #define TC_NO_ERROR 0x00 |
612 | #define TC_UNDERRUN 0x01 |
613 | #define TC_OVERRUN 0x02 |
614 | #define TF_OPEN_TO 0x03 |
615 | #define TF_OPEN_REJECT 0x04 |
616 | #define TI_BREAK 0x05 |
617 | #define TI_PROTO_ERR 0x06 |
618 | #define TC_SSP_RESP 0x07 |
619 | #define TI_PHY_DOWN 0x08 |
620 | #define TF_PHY_DOWN 0x09 |
621 | #define TC_LINK_ADM_RESP 0x0a |
622 | #define TC_CSMI 0x0b |
623 | #define TC_ATA_RESP 0x0c |
624 | #define TU_PHY_DOWN 0x0d |
625 | #define TU_BREAK 0x0e |
626 | #define TI_SATA_TO 0x0f |
627 | #define TI_NAK 0x10 |
628 | #define TC_CONTROL_PHY 0x11 |
629 | #define TF_BREAK 0x12 |
630 | #define TC_RESUME 0x13 |
631 | #define TI_ACK_NAK_TO 0x14 |
632 | #define TF_SMPRSP_TO 0x15 |
633 | #define TF_SMP_XMIT_RCV_ERR 0x16 |
634 | #define TC_PARTIAL_SG_LIST 0x17 |
635 | #define TU_ACK_NAK_TO 0x18 |
636 | #define TU_SATA_TO 0x19 |
637 | #define TF_NAK_RECV 0x1a |
638 | #define TA_I_T_NEXUS_LOSS 0x1b |
639 | #define TC_ATA_R_ERR_RECV 0x1c |
640 | #define TF_TMF_NO_CTX 0x1d |
641 | #define TA_ON_REQ 0x1e |
642 | #define TF_TMF_NO_TAG 0x1f |
643 | #define TF_TMF_TAG_FREE 0x20 |
644 | #define TF_TMF_TASK_DONE 0x21 |
645 | #define TF_TMF_NO_CONN_HANDLE 0x22 |
646 | #define TC_TASK_CLEARED 0x23 |
647 | #define TI_SYNCS_RECV 0x24 |
648 | #define TU_SYNCS_RECV 0x25 |
649 | #define TF_IRTT_TO 0x26 |
650 | #define TF_NO_SMP_CONN 0x27 |
651 | #define TF_IU_SHORT 0x28 |
652 | #define TF_DATA_OFFS_ERR 0x29 |
653 | #define TF_INV_CONN_HANDLE 0x2a |
654 | #define TF_REQUESTED_N_PENDING 0x2b |
655 | |
656 | /* 0xc1 - 0xc7: empty buffer received, |
657 | 0xd1 - 0xd7: establish nexus empty buffer received |
658 | */ |
659 | /* This is the ESCB mask */ |
660 | #define ESCB_RECVD 0xC0 |
661 | |
662 | |
663 | /* This struct done_list_struct defines the done list entry. |
664 | * All fields are LE. |
665 | */ |
666 | struct done_list_struct { |
667 | __le16 index; /* aka transaction context */ |
668 | u8 opcode; |
669 | u8 status_block[4]; |
670 | u8 toggle; /* bit 0 */ |
671 | #define DL_TOGGLE_MASK 0x01 |
672 | } __attribute__ ((packed)); |
673 | |
674 | /* ---------- PHYS ---------- */ |
675 | |
676 | struct asd_phy { |
677 | struct asd_sas_phy sas_phy; |
678 | struct asd_phy_desc *phy_desc; /* hw profile */ |
679 | |
680 | struct sas_identify_frame *identify_frame; |
681 | struct asd_dma_tok *id_frm_tok; |
682 | struct asd_port *asd_port; |
683 | |
684 | u8 frame_rcvd[ASD_EDB_SIZE]; |
685 | }; |
686 | |
687 | |
688 | #define ASD_SCB_SIZE sizeof(struct scb) |
689 | #define ASD_DDB_SIZE sizeof(struct asd_ddb_ssp_smp_target_port) |
690 | |
691 | /* Define this to 0 if you do not want NOTIFY (ENABLE SPINIP) sent. |
692 | * Default: 0x10 (it's a mask) |
693 | */ |
694 | #define ASD_NOTIFY_ENABLE_SPINUP 0x10 |
695 | |
696 | /* If enabled, set this to the interval between transmission |
697 | * of NOTIFY (ENABLE SPINUP). In units of 200 us. |
698 | */ |
699 | #define ASD_NOTIFY_TIMEOUT 2500 |
700 | |
701 | /* Initial delay after OOB, before we transmit NOTIFY (ENABLE SPINUP). |
702 | * If 0, transmit immediately. In milliseconds. |
703 | */ |
704 | #define ASD_NOTIFY_DOWN_COUNT 0 |
705 | |
706 | /* Device present timer timeout constant, 10 ms. */ |
707 | #define ASD_DEV_PRESENT_TIMEOUT 0x2710 |
708 | |
709 | #define ASD_SATA_INTERLOCK_TIMEOUT 0 |
710 | |
711 | /* How long to wait before shutting down an STP connection, unless |
712 | * an STP target sent frame(s). 50 usec. |
713 | * IGNORED by the sequencer (i.e. value 0 always). |
714 | */ |
715 | #define ASD_STP_SHUTDOWN_TIMEOUT 0x0 |
716 | |
717 | /* ATA soft reset timer timeout. 5 usec. */ |
718 | #define ASD_SRST_ASSERT_TIMEOUT 0x05 |
719 | |
720 | /* 31 sec */ |
721 | #define ASD_RCV_FIS_TIMEOUT 0x01D905C0 |
722 | |
723 | #define ASD_ONE_MILLISEC_TIMEOUT 0x03e8 |
724 | |
725 | /* COMINIT timer */ |
726 | #define ASD_TEN_MILLISEC_TIMEOUT 0x2710 |
727 | #define ASD_COMINIT_TIMEOUT ASD_TEN_MILLISEC_TIMEOUT |
728 | |
729 | /* 1 sec */ |
730 | #define ASD_SMP_RCV_TIMEOUT 0x000F4240 |
731 | |
732 | #endif |
733 | |