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