1/*-
2 * This file is provided under a dual BSD/GPLv2 license.  When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 * The full GNU General Public License is included in this distribution
22 * in the file called LICENSE.GPL.
23 *
24 * BSD LICENSE
25 *
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 *
33 *   * Redistributions of source code must retain the above copyright
34 *     notice, this list of conditions and the following disclaimer.
35 *   * Redistributions in binary form must reproduce the above copyright
36 *     notice, this list of conditions and the following disclaimer in
37 *     the documentation and/or other materials provided with the
38 *     distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 *
52 * $FreeBSD$
53 */
54#ifndef _SCU_TASK_CONTEXT_H_
55#define _SCU_TASK_CONTEXT_H_
56
57/**
58 * @file
59 *
60 * @brief This file contains the structures and constants for the SCU hardware
61 *        task context.
62 */
63
64#ifdef __cplusplus
65extern "C" {
66#endif // __cplusplus
67
68#include <dev/isci/scil/sci_types.h>
69
70/**
71 * @enum SCU_SSP_TASK_TYPE
72 *
73 * @brief This enumberation defines the various SSP task types the SCU
74 *        hardware will accept.
75 *
76 * The definition for the various task types the SCU hardware will accept can
77 * be found in the DS specification.
78 */
79typedef enum
80{
81    SCU_TASK_TYPE_IOREAD,        ///< IO READ direction or no direction
82    SCU_TASK_TYPE_IOWRITE,       ///< IO Write direction
83    SCU_TASK_TYPE_SMP_REQUEST,   ///< SMP Request type
84    SCU_TASK_TYPE_RESPONSE,      ///< Driver generated response frame (targt mode)
85    SCU_TASK_TYPE_RAW_FRAME,     ///< Raw frame request type
86    SCU_TASK_TYPE_PRIMITIVE      ///< Request for a primitive to be transmitted
87} SCU_SSP_TASK_TYPE;
88
89/**
90 * @enum SCU_SATA_TASK_TYPE
91 *
92 * @brief This enumeration defines the various SATA task types the SCU
93 *        hardware will accept.
94 *
95 * The definition for the various task types the SCU hardware will accept can
96 * be found in the DS specification.
97 */
98typedef enum
99{
100    SCU_TASK_TYPE_DMA_IN,           ///< Read request
101    SCU_TASK_TYPE_FPDMAQ_READ,      ///< NCQ read request
102    SCU_TASK_TYPE_PACKET_DMA_IN,    ///< Packet read request
103    SCU_TASK_TYPE_SATA_RAW_FRAME,   ///< Raw frame request
104    RESERVED_4,
105    RESERVED_5,
106    RESERVED_6,
107    RESERVED_7,
108    SCU_TASK_TYPE_DMA_OUT,          ///< Write request
109    SCU_TASK_TYPE_FPDMAQ_WRITE,     ///< NCQ write Request
110    SCU_TASK_TYPE_PACKET_DMA_OUT    ///< Packet write request
111} SCU_SATA_TASK_TYPE;
112
113
114/**
115 * @name SCU_CONTEXT_TYPE
116 */
117/*@{*/
118#define SCU_TASK_CONTEXT_TYPE  0
119#define SCU_RNC_CONTEXT_TYPE   1
120/*@}*/
121
122/**
123 * @name SCU_TASK_CONTEXT_VALIDITY
124 */
125/*@{*/
126#define SCU_TASK_CONTEXT_INVALID          0
127#define SCU_TASK_CONTEXT_VALID            1
128/*@}*/
129
130/**
131 * @name SCU_COMMAND_CODE
132 */
133/*@{*/
134#define SCU_COMMAND_CODE_INITIATOR_NEW_TASK   0
135#define SCU_COMMAND_CODE_ACTIVE_TASK          1
136#define SCU_COMMAND_CODE_PRIMITIVE_SEQ_TASK   2
137#define SCU_COMMAND_CODE_TARGET_RAW_FRAMES    3
138/*@}*/
139
140/**
141 * @name SCU_TASK_PRIORITY
142 */
143/*@{*/
144/**
145 * This priority is used when there is no priority request for this request.
146 */
147#define SCU_TASK_PRIORITY_NORMAL          0
148
149/**
150 * This priority indicates that the task should be scheduled to the head
151 * of the queue.  The task will NOT be executed if the TX is suspended for
152 * the remote node.
153 */
154#define SCU_TASK_PRIORITY_HEAD_OF_Q       1
155
156/**
157 * This priority indicates that the task will be executed before all
158 * SCU_TASK_PRIORITY_NORMAL and SCU_TASK_PRIORITY_HEAD_OF_Q tasks.
159 * The task WILL be executed if the TX is suspended for the remote node.
160 */
161#define SCU_TASK_PRIORITY_HIGH            2
162
163/**
164 * This task priority is reserved and should not be used.
165 */
166#define SCU_TASK_PRIORITY_RESERVED        3
167/*@}*/
168
169#define SCU_TASK_INITIATOR_MODE           1
170#define SCU_TASK_TARGET_MODE              0
171
172#define SCU_TASK_REGULAR                  0
173#define SCU_TASK_ABORTED                  1
174
175//direction bit defintion
176/**
177 * @name SATA_DIRECTION
178 */
179/*@{*/
180#define SCU_SATA_WRITE_DATA_DIRECTION     0
181#define SCU_SATA_READ_DATA_DIRECTION      1
182/*@}*/
183
184/**
185 * @name SCU_COMMAND_CONTEXT_MACROS
186 *
187 * These macros provide the mask and shift operations to construct the various
188 * SCU commands
189 */
190/*@{*/
191#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_SHIFT           21UL
192#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK            0x00E00000UL
193#define scu_get_command_request_type(x) \
194               ((x) & SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK)
195
196#define SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_SHIFT        18UL
197#define SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK         0x001C0000UL
198#define scu_get_command_request_subtype(x) \
199               ((x) & SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK)
200
201#define SCU_CONTEXT_COMMAND_REQUEST_FULLTYPE_MASK        \
202   (                                                     \
203       SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK             \
204     | SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK          \
205   )
206#define scu_get_command_request_full_type(x) \
207               ((x) & SCU_CONTEXT_COMMAND_REQUEST_FULLTYPE_MASK)
208
209#define SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT  16UL
210#define SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_MASK   0x00010000UL
211#define scu_get_command_protocl_engine_group(x) \
212               ((x) & SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_MASK)
213
214#define SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT           12UL
215#define SCU_CONTEXT_COMMAND_LOGICAL_PORT_MASK            0x00007000UL
216#define scu_get_command_reqeust_logical_port(x) \
217               ((x) & SCU_CONTEXT_COMMAND_LOGICAL_PORT_MASK)
218
219
220#define MAKE_SCU_CONTEXT_COMMAND_TYPE(type) \
221   ((U32)(type) << SCU_CONTEXT_COMMAND_REQUEST_TYPE_SHIFT)
222/*@}*/
223
224/**
225 * @name SCU_COMMAND_TYPES
226 *
227 * These constants provide the grouping of the different SCU command types.
228 */
229/*@{*/
230#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC    MAKE_SCU_CONTEXT_COMMAND_TYPE(0UL)
231#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC    MAKE_SCU_CONTEXT_COMMAND_TYPE(1UL)
232#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC   MAKE_SCU_CONTEXT_COMMAND_TYPE(2UL)
233#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC   MAKE_SCU_CONTEXT_COMMAND_TYPE(3UL)
234#define SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC  MAKE_SCU_CONTEXT_COMMAND_TYPE(6UL)
235/*@}*/
236
237#define MAKE_SCU_CONTEXT_COMMAND_REQUEST(type, command) \
238   ((type) | (((U32)(command)) << SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_SHIFT))
239
240/**
241 * @name SCU_REQUEST_TYPES
242 *
243 * These constants are the various request types that can be posted to the SCU
244 * hardware.
245 */
246/*@{*/
247#define SCU_CONTEXT_COMMAND_REQUST_POST_TC \
248   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC, 0))
249
250#define SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT \
251   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC, 1))
252
253#define SCU_CONTEXT_COMMAND_REQUST_DUMP_TC \
254   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC, 0))
255
256#define SCU_CONTEXT_COMMAND_POST_RNC_32 \
257   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 0))
258
259#define SCU_CONTEXT_COMMAND_POST_RNC_96 \
260   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 1))
261
262#define SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE \
263   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 2))
264
265#define SCU_CONTEXT_COMMAND_DUMP_RNC_32 \
266   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC, 0))
267
268#define SCU_CONTEXT_COMMAND_DUMP_RNC_96 \
269   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC, 1))
270
271#define SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX \
272   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 0))
273
274#define SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX_RX \
275   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 1))
276
277#define SCU_CONTEXT_COMMAND_POST_RNC_RESUME \
278   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 2))
279
280#define SCU_CONTEXT_IT_NEXUS_LOSS_TIMER_ENABLE \
281   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 3))
282
283#define SCU_CONTEXT_IT_NEXUS_LOSS_TIMER_DISABLE \
284   (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 4))
285/*@}*/
286
287/**
288 * @name SCU_TASK_CONTEXT_PROTOCOL
289 * SCU Task context protocol types this is uesd to program the SCU Task
290 * context protocol field in word 0x00.
291 */
292/*@{*/
293#define SCU_TASK_CONTEXT_PROTOCOL_SMP    0x00
294#define SCU_TASK_CONTEXT_PROTOCOL_SSP    0x01
295#define SCU_TASK_CONTEXT_PROTOCOL_STP    0x02
296#define SCU_TASK_CONTEXT_PROTOCOL_NONE   0x07
297/*@}*/
298
299/**
300 * @struct SSP_TASK_CONTEXT
301 *
302 * @brief This is the SCU hardware definition for an SSP request.
303 */
304struct SSP_TASK_CONTEXT
305{
306   // OFFSET 0x18
307   U32  reserved00              : 24;
308   U32  frame_type              : 8;
309
310   // OFFSET 0x1C
311   U32  reserved01;
312
313   // OFFSET 0x20
314   U32  fill_bytes              : 2;
315   U32  reserved02              : 6;
316   U32  changing_data_pointer   : 1;
317   U32  retransmit              : 1;
318   U32  retry_data_frame        : 1;
319   U32  tlr_control             : 2;
320   U32  reserved03              : 19;
321
322   // OFFSET 0x24
323   U32  uiRsvd4;
324
325   // OFFSET 0x28
326   U32 target_port_transfer_tag : 16;
327   U32 tag                      : 16;
328
329   // OFFSET 0x2C
330   U32 data_offset;
331};
332
333/**
334 * @struct STP_TASK_CONTEXT
335 *
336 * @brief This is the SCU hardware definition for an STP request.
337 */
338struct STP_TASK_CONTEXT
339{
340   // OFFSET 0x18
341   U32 fis_type    : 8;
342   U32 pm_port     : 4;
343   U32 reserved0   : 3;
344   U32 control     : 1;
345   U32 command     : 8;
346   U32 features    : 8;
347
348   // OFFSET 0x1C
349   U32 reserved1;
350
351   // OFFSET 0x20
352   U32 reserved2;
353
354   // OFFSET 0x24
355   U32 reserved3;
356
357   // OFFSET 0x28
358   U32 ncq_tag     : 5;
359   U32 reserved4   : 27;
360
361   // OFFSET 0x2C
362   U32 data_offset;    // TODO: What is this used for?
363};
364
365/**
366 * @struct SMP_TASK_CONTEXT
367 *
368 * @brief This is the SCU hardware definition for an SMP request.
369 */
370struct SMP_TASK_CONTEXT
371{
372   // OFFSET 0x18
373   U32 response_length    : 8;
374   U32 function_result    : 8;
375   U32 function           : 8;
376   U32 frame_type         : 8;
377
378   // OFFSET 0x1C
379   U32 smp_response_ufi   : 12;
380   U32 reserved1          : 20;
381
382   // OFFSET 0x20
383   U32 reserved2;
384
385   // OFFSET 0x24
386   U32 reserved3;
387
388   // OFFSET 0x28
389   U32 reserved4;
390
391   // OFFSET 0x2C
392   U32 reserved5;
393};
394
395/**
396 * @struct PRIMITIVE_TASK_CONTEXT
397 *
398 * @brief This is the SCU hardware definition used when the driver wants to
399 *        send a primitive on the link.
400 */
401struct PRIMITIVE_TASK_CONTEXT
402{
403   // OFFSET 0x18
404   /**
405    * This field is the control word and it must be 0.
406    */
407   U32 control;  ///< must be set to 0
408
409   // OFFSET 0x1C
410   /**
411    * This field specifies the primitive that is to be transmitted.
412    */
413   U32 sequence;
414
415   // OFFSET 0x20
416   U32 reserved0;
417
418   // OFFSET 0x24
419   U32 reserved1;
420
421   // OFFSET 0x28
422   U32 reserved2;
423
424   // OFFSET 0x2C
425   U32 reserved3;
426};
427
428/**
429 * @union PROTOCOL_CONTEXT
430 *
431 * @brief The union of the protocols that can be selected in the SCU task
432 *        context field.
433 */
434union PROTOCOL_CONTEXT
435{
436    struct SSP_TASK_CONTEXT         ssp;
437    struct STP_TASK_CONTEXT         stp;
438    struct SMP_TASK_CONTEXT         smp;
439    struct PRIMITIVE_TASK_CONTEXT   primitive;
440    U32                             words[6];
441};
442
443/**
444 * @struct SCU_SGL_ELEMENT
445 * @typedef SCU_SGL_ELEMENT_T
446 *
447 * @brief This structure represents a single SCU defined SGL element.
448 *
449 * SCU SGLs contain a 64 bit address with the maximum data transfer being 24
450 * bits in size.  The SGL can not cross a 4GB boundary.
451 */
452typedef struct SCU_SGL_ELEMENT
453{
454   /**
455    * This field is the upper 32 bits of the 64 bit physical address.
456    */
457   U32    address_upper;
458
459   /**
460    * This field is the lower 32 bits of the 64 bit physical address.
461    */
462   U32    address_lower;
463
464   /**
465    * This field is the number of bytes to transfer.
466    */
467   U32    length: 24;
468
469   /**
470    * This field is the address modifier to be used when a virtual function is
471    * requesting a data transfer.
472    */
473   U32    address_modifier: 8;
474
475} SCU_SGL_ELEMENT_T;
476
477#define SCU_SGL_ELEMENT_PAIR_A   0
478#define SCU_SGL_ELEMENT_PAIR_B   1
479
480/**
481 * @struct SCU_SGL_ELEMENT_PAIR
482 *
483 * @brief This structure is the SCU hardware definition of a pair of SGL
484 *        elements.
485 *
486 * The SCU hardware always works on SGL pairs.  They are refered to in the DS
487 * specification as SGL A and SGL B.  Each SGL pair is followed by the address
488 * of the next pair.
489 */
490typedef struct SCU_SGL_ELEMENT_PAIR
491{
492   // OFFSET 0x60-0x68
493   /**
494    * This field is the SGL element A of the SGL pair.
495    */
496   SCU_SGL_ELEMENT_T A;
497
498   // OFFSET 0x6C-0x74
499   /**
500    * This field is the SGL element B of the SGL pair.
501    */
502   SCU_SGL_ELEMENT_T B;
503
504   // OFFSET 0x78-0x7C
505   /**
506    * This field is the upper 32 bits of the 64 bit address to the next SGL
507    * element pair.
508    */
509   U32 next_pair_upper;
510
511   /**
512    * This field is the lower 32 bits of the 64 bit address to the next SGL
513    * element pair.
514    */
515   U32 next_pair_lower;
516
517} SCU_SGL_ELEMENT_PAIR_T;
518
519/**
520 * @struct TRANSPORT_SNAPSHOT
521 *
522 * @brief This structure is the SCU hardware scratch area for the task
523 *        context.
524 *
525 * This is set to 0 by the driver but can be read by issuing a dump TC request
526 * to the SCU.
527 */
528struct TRANSPORT_SNAPSHOT
529{
530   // OFFSET 0x48
531   U32  xfer_rdy_write_data_length;
532
533   // OFFSET 0x4C
534   U32  data_offset;
535
536   // OFFSET 0x50
537   U32  data_transfer_size   : 24;
538   U32  reserved_50_0        : 8;
539
540   // OFFSET 0x54
541   U32  next_initiator_write_data_offset;
542
543   // OFFSET 0x58
544   U32  next_initiator_write_data_xfer_size : 24;
545   U32  reserved_58_0                       : 8;
546};
547
548/**
549 * @struct SCU_TASK_CONTEXT
550 *
551 * @brief This structure defines the contents of the SCU silicon task context.
552 *        It lays out all of the fields according to the expected order and
553 *        location for the Storage Controller unit.
554 */
555typedef struct SCU_TASK_CONTEXT
556{
557   // OFFSET 0x00 ------
558   /**
559    * This field must be encoded to one of the valid SCU task priority values
560    *    - SCU_TASK_PRIORITY_NORMAL
561    *    - SCU_TASK_PRIORITY_HEAD_OF_Q
562    *    - SCU_TASK_PRIORITY_HIGH
563    */
564   U32    priority              : 2;
565
566   /**
567    * This field must be set to TRUE if this is an initiator generated request.
568    * Until target mode is supported all task requests are initiator requests.
569    */
570   U32    initiator_request     : 1;
571
572   /**
573    * This field must be set to one of the valid connection rates valid values
574    * are 0x8, 0x9, and 0xA.
575    */
576   U32    connection_rate       : 4;
577
578   /**
579    * This field muse be programed when generating an SMP response since the SMP
580    * connection remains open until the SMP response is generated.
581    */
582   U32    protocol_engine_index : 3;
583
584   /**
585    * This field must contain the logical port for the task request.
586    */
587   U32    logical_port_index    : 3;
588
589   /**
590    * This field must be set to one of the SCU_TASK_CONTEXT_PROTOCOL values
591    *    - SCU_TASK_CONTEXT_PROTOCOL_SMP
592    *    - SCU_TASK_CONTEXT_PROTOCOL_SSP
593    *    - SCU_TASK_CONTEXT_PROTOCOL_STP
594    *    - SCU_TASK_CONTEXT_PROTOCOL_NONE
595    */
596   U32    protocol_type         : 3;
597
598   /**
599    * This filed must be set to the TCi allocated for this task
600    */
601   U32    task_index            : 12;
602
603   /**
604    * This field is reserved and must be set to 0x00
605    */
606   U32    reserved_00_0         : 1;
607
608   /**
609    * For a normal task request this must be set to 0.  If this is an abort of
610    * this task request it must be set to 1.
611    */
612   U32    abort                 : 1;
613
614   /**
615    * This field must be set to TRUE for the SCU hardware to process the task.
616    */
617   U32    valid                 : 1;
618
619   /**
620    * This field must be set to SCU_TASK_CONTEXT_TYPE
621    */
622   U32    context_type          : 1;
623
624   // OFFSET 0x04
625   /**
626    * This field contains the RNi that is the target of this request.
627    */
628   U32    remote_node_index     : 12;
629
630   /**
631    * This field is programmed if this is a mirrored request, which we are not
632    * using, in which case it is the RNi for the mirrored target.
633    */
634   U32    mirrored_node_index   : 12;
635
636   /**
637    * This field is programmed with the direction of the SATA reqeust
638    *    - SCU_SATA_WRITE_DATA_DIRECTION
639    *    - SCU_SATA_READ_DATA_DIRECTION
640    */
641   U32    sata_direction        : 1;
642
643   /**
644    * This field is programmsed with one of the following SCU_COMMAND_CODE
645    *    - SCU_COMMAND_CODE_INITIATOR_NEW_TASK
646    *    - SCU_COMMAND_CODE_ACTIVE_TASK
647    *    - SCU_COMMAND_CODE_PRIMITIVE_SEQ_TASK
648    *    - SCU_COMMAND_CODE_TARGET_RAW_FRAMES
649    */
650   U32    command_code          : 2;
651
652   /**
653    * This field is set to TRUE if the remote node should be suspended.
654    * This bit is only valid for SSP & SMP target devices.
655    */
656   U32    suspend_node          : 1;
657
658   /**
659    * This field is programmed with one of the following command type codes
660    *
661    * For SAS requests use the SCU_SSP_TASK_TYPE
662    *    - SCU_TASK_TYPE_IOREAD
663    *    - SCU_TASK_TYPE_IOWRITE
664    *    - SCU_TASK_TYPE_SMP_REQUEST
665    *    - SCU_TASK_TYPE_RESPONSE
666    *    - SCU_TASK_TYPE_RAW_FRAME
667    *    - SCU_TASK_TYPE_PRIMITIVE
668    *
669    * For SATA requests use the SCU_SATA_TASK_TYPE
670    *    - SCU_TASK_TYPE_DMA_IN
671    *    - SCU_TASK_TYPE_FPDMAQ_READ
672    *    - SCU_TASK_TYPE_PACKET_DMA_IN
673    *    - SCU_TASK_TYPE_SATA_RAW_FRAME
674    *    - SCU_TASK_TYPE_DMA_OUT
675    *    - SCU_TASK_TYPE_FPDMAQ_WRITE
676    *    - SCU_TASK_TYPE_PACKET_DMA_OUT
677    */
678   U32    task_type             : 4;
679
680   // OFFSET 0x08
681   /**
682    * This field is reserved and the must be set to 0x00
683    */
684   U32    link_layer_control          : 8;  // presently all reserved
685
686   /**
687    * This field is set to TRUE when TLR is to be enabled
688    */
689   U32    ssp_tlr_enable              : 1;
690
691   /**
692    * This is field specifies if the SCU DMAs a response frame to host
693    * memory for good response frames when operating in target mode.
694    */
695   U32    dma_ssp_target_good_response : 1;
696
697   /**
698    * This field indicates if the SCU should DMA the response frame to
699    * host memory.
700    */
701   U32    do_not_dma_ssp_good_response : 1;
702
703   /**
704    * This field is set to TRUE when strict ordering is to be enabled
705    */
706   U32    strict_ordering              : 1;
707
708   /**
709    * This field indicates the type of endianess to be utilized for the
710    * frame.  command, task, and response frames utilized control_frame
711    * set to 1.
712    */
713   U32    control_frame               : 1;
714
715   /**
716    * This field is reserved and the driver should set to 0x00
717    */
718   U32    tl_control_reserved         : 3;
719
720   /**
721    * This field is set to TRUE when the SCU hardware task timeout control is to
722    * be enabled
723    */
724   U32    timeout_enable              : 1;
725
726   /**
727    * This field is reserved and the driver should set it to 0x00
728    */
729   U32    pts_control_reserved        : 7;
730
731   /**
732    * This field should be set to TRUE when block guard is to be enabled
733    */
734   U32    block_guard_enable          : 1;
735
736   /**
737    * This field is reserved and the driver should set to 0x00
738    */
739   U32    sdma_control_reserved       : 7;
740
741   // OFFSET 0x0C
742   /**
743    * This field is the address modifier for this io request it should be
744    * programmed with the virtual function that is making the request.
745    */
746   U32    address_modifier            : 16;
747
748   /**
749    * @todo What we support mirrored SMP response frame?
750    */
751   U32    mirrored_protocol_engine    : 3;    // mirrored protocol Engine Index
752
753   /**
754    * If this is a mirrored request the logical port index for the mirrored RNi
755    * must be programmed.
756    */
757   U32    mirrored_logical_port       : 4;    // mirrored local port index
758
759   /**
760    * This field is reserved and the driver must set it to 0x00
761    */
762   U32    reserved_0C_0               : 8;
763
764   /**
765    * This field must be set to TRUE if the mirrored request processing is to be
766    * enabled.
767    */
768   U32    mirror_request_enable       : 1;    // Mirrored request Enable
769
770   // OFFSET 0x10
771   /**
772    * This field is the command iu length in dwords
773    */
774   U32    ssp_command_iu_length       : 8;
775
776   /**
777    * This is the target TLR enable bit it must be set to 0 when creatning the
778    * task context.
779    */
780   U32    xfer_ready_tlr_enable       : 1;
781
782   /**
783    * This field is reserved and the driver must set it to 0x00
784    */
785   U32    reserved_10_0               : 7;
786
787   /**
788    * This is the maximum burst size that the SCU hardware will send in one
789    * connection its value is (N x 512) and N must be a multiple of 2.  If the
790    * value is 0x00 then maximum burst size is disabled.
791    */
792   U32    ssp_max_burst_size          : 16;
793
794   // OFFSET 0x14
795   /**
796    * This filed is set to the number of bytes to be transfered in the request.
797    */
798   U32    transfer_length_bytes       : 24;   // In terms of bytes
799
800   /**
801    * This field is reserved and the driver should set it to 0x00
802    */
803   U32    reserved_14_0               : 8;
804
805   // OFFSET 0x18-0x2C
806   /**
807    * This union provides for the protocol specif part of the SCU Task Context.
808    */
809   union PROTOCOL_CONTEXT  type;
810
811   // OFFSET 0x30-0x34
812   /**
813    * This field is the upper 32 bits of the 64 bit physical address of the
814    * command iu buffer
815    */
816   U32  command_iu_upper;
817
818   /**
819    * This field is the lower 32 bits of the 64 bit physical address of the
820    * command iu buffer
821    */
822   U32  command_iu_lower;
823
824   // OFFSET 0x38-0x3C
825   /**
826    * This field is the upper 32 bits of the 64 bit physical address of the
827    * response iu buffer
828    */
829   U32  response_iu_upper;
830
831   /**
832    * This field is the lower 32 bits of the 64 bit physical address of the
833    * response iu buffer
834    */
835   U32  response_iu_lower;
836
837   // OFFSET 0x40
838   /**
839    * This field is set to the task phase of the SCU hardware. The driver must
840    * set this to 0x01
841    */
842   U32  task_phase            : 8;
843
844   /**
845    * This field is set to the transport layer task status.  The driver must set
846    * this to 0x00
847    */
848   U32  task_status           : 8;
849
850   /**
851    * This field is used during initiator write TLR
852    */
853   U32  previous_extended_tag : 4;
854
855   /**
856    * This field is set the maximum number of retries for a STP non-data FIS
857    */
858   U32  stp_retry_count       : 2;
859
860   /**
861    * This field is reserved and the driver must set it to 0x00
862    */
863   U32  reserved_40_1         : 2;
864
865   /**
866    * This field is used by the SCU TL to determine when to take a snapshot when
867    * tranmitting read data frames.
868    *    - 0x00 The entire IO
869    *    - 0x01 32k
870    *    - 0x02 64k
871    *    - 0x04 128k
872    *    - 0x08 256k
873    */
874   U32  ssp_tlr_threshold     : 4;
875
876   /**
877    * This field is reserved and the driver must set it to 0x00
878    */
879   U32  reserved_40_2         : 4;
880
881   // OFFSET 0x44
882   U32  write_data_length;   // read only set to 0
883
884   // OFFSET 0x48-0x58
885   struct TRANSPORT_SNAPSHOT snapshot;  // read only set to 0
886
887   // OFFSET 0x5C
888   U32  block_protection_enable       : 1;
889   U32  block_size                    : 2;
890   U32  block_protection_function     : 2;
891   U32  reserved_5C_0                 : 9;
892   U32  active_sgl_element            : 2;   // read only set to 0
893   U32  sgl_exhausted                 : 1;   // read only set to 0
894   U32  payload_data_transfer_error   : 4;   // read only set to 0
895   U32  frame_buffer_offset           : 11;  // read only set to 0
896
897   // OFFSET 0x60-0x7C
898   /**
899    * This field is the first SGL element pair found in the TC data structure.
900    */
901   SCU_SGL_ELEMENT_PAIR_T sgl_pair_ab;
902   // OFFSET 0x80-0x9C
903   /**
904    * This field is the second SGL element pair found in the TC data structure.
905    */
906   SCU_SGL_ELEMENT_PAIR_T sgl_pair_cd;
907
908   // OFFSET 0xA0-BC
909   SCU_SGL_ELEMENT_PAIR_T sgl_snapshot_ac;
910
911   // OFFSET 0xC0
912   U32  active_sgl_element_pair; // read only set to 0
913
914   // OFFSET 0xC4-0xCC
915   U32 reserved_C4_CC[3];
916
917   // OFFSET 0xD0
918   U32  intermediate_crc_value : 16;
919   U32  initial_crc_seed       : 16;
920
921   // OFFSET 0xD4
922   U32  application_tag_for_verify    : 16;
923   U32  application_tag_for_generate  : 16;
924
925   // OFFSET 0xD8
926   U32  reference_tag_seed_for_verify_function;
927
928   // OFFSET 0xDC
929   U32  reserved_DC;
930
931   // OFFSET 0xE0
932   U32  reserved_E0_0                    : 16;
933   U32  application_tag_mask_for_generate: 16;
934
935   // OFFSET 0xE4
936   U32  block_protection_control         : 16;
937   U32  application_tag_mask_for_verify  : 16;
938
939   // OFFSET 0xE8
940   U32  block_protection_error  : 8;
941   U32  reserved_E8_0           :24;
942
943   // OFFSET 0xEC
944   U32  reference_tag_seed_for_verify;
945
946   // OFFSET 0xF0
947   U32  intermediate_crc_valid_snapshot  : 16;
948   U32  reserved_F0_0                    : 16;
949
950   // OFFSET 0xF4
951   U32  reference_tag_seed_for_verify_function_snapshot;
952
953   // OFFSET 0xF8
954   U32  snapshot_of_reserved_dword_DC_of_tc;
955
956   // OFFSET 0xFC
957   U32  reference_tag_seed_for_generate_function_snapshot;
958
959} SCU_TASK_CONTEXT_T;
960
961#ifdef __cplusplus
962}
963#endif // __cplusplus
964
965#endif // _SCU_TASK_CONTEXT_H_
966