Commit | Line | Data |
---|---|---|
65c85c83 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2908d778 JB |
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> | |
2908d778 JB |
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 | */ | |
3b709df5 | 19 | #define ASD_MAX_DDBS 128 |
2908d778 JB |
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 scb_header { | |
267 | __le64 next_scb; | |
268 | __le16 index; /* transaction context */ | |
269 | u8 opcode; | |
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 | |
90b0c418 | 277 | #define SCB_ABORT_TASK 0x03 |
2908d778 JB |
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 | ||
c15d75be JG |
312 | #define EFB_MASK 0x80 |
313 | #define TASK_PRIO_MASK 0x78 | |
314 | #define TASK_ATTR_MASK 0x07 | |
2908d778 JB |
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; | |
c15d75be | 459 | struct ssp_tmf_iu ssp_task; |
2908d778 JB |
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]; | |
c15d75be | 497 | struct ssp_tmf_iu ssp_task; /* LUN and TAG */ |
2908d778 JB |
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; | |
c15d75be | 510 | struct ssp_tmf_iu ssp_task; |
2908d778 JB |
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 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; | |
3f048109 | 682 | struct asd_port *asd_port; |
2908d778 JB |
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 |