xref: /freebsd/sys/dev/isci/scil/scic_io_request.h (revision 6829dae12bb055451fa467da4589c43bd03b1e64)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of version 2 of the GNU General Public License as
13  * published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  * The full GNU General Public License is included in this distribution
24  * in the file called LICENSE.GPL.
25  *
26  * BSD LICENSE
27  *
28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  *
35  *   * Redistributions of source code must retain the above copyright
36  *     notice, this list of conditions and the following disclaimer.
37  *   * Redistributions in binary form must reproduce the above copyright
38  *     notice, this list of conditions and the following disclaimer in
39  *     the documentation and/or other materials provided with the
40  *     distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54  * $FreeBSD$
55  */
56 #ifndef _SCIC_IO_REQUEST_H_
57 #define _SCIC_IO_REQUEST_H_
58 
59 /**
60  * @file
61  *
62  * @brief This file contains the structures and interface methods that
63  *        can be referenced and used by the SCI user for the SCI IO request
64  *        object.
65  *
66  * @todo Determine the failure situations and return values.
67  */
68 
69 #ifdef __cplusplus
70 extern "C" {
71 #endif // __cplusplus
72 
73 #include <dev/isci/scil/sci_types.h>
74 #include <dev/isci/scil/sci_status.h>
75 #include <dev/isci/scil/intel_sas.h>
76 
77 /**
78  * @struct SCIC_IO_SSP_PARAMETERS
79  * @brief  This structure contains additional optional parameters for SSP
80  *         IO requests.  These parameters are utilized with the
81  *         scic_io_request_construct_advanced_ssp() method.
82  *
83  * @todo Add Block-guard/DIF, TLR
84  */
85 typedef struct SCIC_IO_SSP_PARAMETERS
86 {
87    /**
88     * Data Integrity Format (DIF) is also known as protection information
89     * or block-guard.  This sub-structure contains DIF specific feature
90     * information for SSP IO requests.
91     */
92    struct
93    {
94       void * placeholder;
95    } dif;
96 
97    /**
98     * Transport Layer Retries (TLR) is an SSP protocol specific feature.
99     * This sub-structure contains Transport Layer Retries (TLR) specific
100     * feature information for SSP IO requests.
101     */
102    struct
103    {
104       void * placeholder;
105    } tlr;
106 
107 } SCIC_IO_SSP_PARAMETERS_T;
108 
109 /**
110  * @struct SCIC_IO_PARAMETERS
111  * @brief  This structure contains additional optional parameters for
112  *         STP/SATA IO requests.  These parameters are utilized with the
113  *         scic_io_request_construct_advanced_sata() method.
114  */
115 typedef struct SCIC_IO_SATA_PARAMETERS
116 {
117    /**
118     * This field indicates whether or not to construct the Scatter-Gather
119     * List elements for the SATA request.  This is used in scenarios
120     * where Scatter-gather-list processing/translation is done by the
121     * user.
122     */
123    BOOL do_translate_sgl;
124 
125 } SCIC_IO_SATA_PARAMETERS_T;
126 
127 /**
128  * @struct SCIC_PASSTHRU_REQUEST_CALLBACKS
129  * @brief  This structure contains the pointer to the callback functions
130  *         for constructing the passthrough request common to SSP, SMP and STP.
131  *         This structure must be set by the win sci layer before the passthrough
132  *         build is called
133  *
134  */
135 typedef struct SCIC_PASSTHRU_REQUEST_CALLBACKS
136 {
137    /**
138    * Function pointer to get the phy identifier for passthrough request.
139    */
140    U32 (*scic_cb_passthru_get_phy_identifier) ( void * , U8 *);
141    /**
142    * Function pointer to get the port identifier for passthrough request.
143    */
144    U32 (*scic_cb_passthru_get_port_identifier) ( void * , U8 *);
145    /**
146    * Function pointer to get the connection rate for passthrough request.
147    */
148    U32 (*scic_cb_passthru_get_connection_rate) ( void * , void *);
149    /**
150    * Function pointer to get the destination sas address for passthrough request.
151    */
152    void (*scic_cb_passthru_get_destination_sas_address) (void *, U8 **);
153    /**
154    * Function pointer to get the transfer length for passthrough request.
155    */
156    U32 (*scic_cb_passthru_get_transfer_length) (void *);
157    /**
158    * Function pointer to get the data direction for passthrough request.
159    */
160    U32 (*scic_cb_passthru_get_data_direction) (void *);
161 
162 } SCIC_PASSTHRU_REQUEST_CALLBACKS_T;
163 
164 /**
165  * @struct SCIC_SSP_PASSTHRU_REQUEST_CALLBACKS
166  * @brief  This structure contains the pointer to the callback functions
167  *         for constructing the passthrough request specific to SSP.
168  *         This structure must be set by the win sci layer before the passthrough
169  *         build is called
170  *
171  */
172 typedef struct SCIC_SSP_PASSTHRU_REQUEST_CALLBACKS
173 {
174    /**
175    * Common callbacks for all Passthru requests
176    */
177    SCIC_PASSTHRU_REQUEST_CALLBACKS_T common_callbacks;
178    /**
179    * Function pointer to get the lun for passthrough request.
180    */
181    void (* scic_cb_ssp_passthru_get_lun) (void *, U8 **);
182    /**
183    * Function pointer to get the cdb
184    */
185    void (* scic_cb_ssp_passthru_get_cdb) ( void *, U32 *, U8 **, U32 *, U8 ** );
186    /**
187    * Function pointer to get the task attribute for passthrough request.
188    */
189    U32 (*scic_cb_ssp_passthru_get_task_attribute) (void *);
190 } SCIC_SSP_PASSTHRU_REQUEST_CALLBACKS_T;
191 
192 /**
193  * @struct SCIC_STP_PASSTHRU_REQUEST_CALLBACKS
194  * @brief  This structure contains the pointer to the callback functions
195  *         for constructing the passthrough request specific to STP.
196  *         This structure must be set by the win sci layer before the passthrough
197  *         build is called
198  *
199  */
200 typedef struct SCIC_STP_PASSTHRU_REQUEST_CALLBACKS
201 {
202    /**
203    * Common callbacks for all Passthru requests
204    */
205    SCIC_PASSTHRU_REQUEST_CALLBACKS_T common_callbacks;
206    /**
207    * Function pointer to get the protocol for passthrough request.
208    */
209    U8 (* scic_cb_stp_passthru_get_protocol) (void *);
210    /**
211    * Function pointer to get the resgister fis
212    */
213    void (* scic_cb_stp_passthru_get_register_fis) ( void *, U8 ** );
214    /**
215    * Function pointer to get the MULTIPLE_COUNT (bits 5,6,7 in Byte 1 in the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
216    */
217    U8 (* scic_cb_stp_passthru_get_multiplecount) ( void *);
218    /**
219    * Function pointer to get the EXTEND (bit 0 in Byte 1 the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
220    */
221    U8 (* scic_cb_stp_passthru_get_extend) ( void *);
222    /**
223    * Function pointer to get the CK_COND (bit 5 in Byte 2 the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
224    */
225    U8 (* scic_cb_stp_passthru_get_ckcond) ( void *);
226    /**
227    * Function pointer to get the T_DIR (bit 3 in Byte 2 the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
228    */
229    U8 (* scic_cb_stp_passthru_get_tdir) ( void *);
230    /**
231    * Function pointer to get the BYTE_BLOCK (bit 2 in Byte 2 the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
232    */
233    U8 (* scic_cb_stp_passthru_get_byteblock) ( void *);
234    /**
235    * Function pointer to get the T_LENGTH (bits 0,1 in Byte 2 the SAT-specific SCSI extenstion in ATA Pass-through (0x85))
236    */
237    U8 (* scic_cb_stp_passthru_get_tlength) ( void *);
238 
239 } SCIC_STP_PASSTHRU_REQUEST_CALLBACKS_T;
240 
241 /**
242  * @struct SCIC_SMP_PASSTHRU_REQUEST_CALLBACKS
243  * @brief  This structure contains the pointer to the callback functions
244  *         for constructing the passthrough request specific to SMP.
245  *         This structure must be set by the win sci layer before the passthrough
246  *         build is called
247  *
248  */
249 typedef struct SCIC_SMP_PASSTHRU_REQUEST_CALLBACKS
250 {
251    /**
252    * Common callbacks for all Passthru requests
253    */
254    SCIC_PASSTHRU_REQUEST_CALLBACKS_T common_callbacks;
255 
256    /**
257    * Function pointer to get the length of the smp request and its length
258    */
259    U32 (* scic_cb_smp_passthru_get_request) ( void *, U8 ** );
260    /**
261    * Function pointer to get the frame type of the smp request
262    */
263    U8 (* scic_cb_smp_passthru_get_frame_type) ( void *);
264    /**
265    * Function pointer to get the function in the smp request
266    */
267    U8 (* scic_cb_smp_passthru_get_function) ( void * );
268 
269    /**
270    * Function pointer to get the "allocated response length" in the smp request
271    */
272    U8 (* scic_cb_smp_passthru_get_allocated_response_length) ( void * );
273 
274 } SCIC_SMP_PASSTHRU_REQUEST_CALLBACKS_T;
275 
276 /**
277  * @brief This enumeration specifies the transport protocol utilized
278  *        for the request.
279  */
280 typedef enum
281 {
282    /**
283     * This enumeration constant indicates that no protocol has yet been
284     * set.
285     */
286    SCIC_NO_PROTOCOL,
287 
288    /**
289     * This enumeration constant indicates that the protocol utilized
290     * is the Serial Management Protocol.
291     */
292    SCIC_SMP_PROTOCOL,
293 
294    /**
295     * This enumeration constant indicates that the protocol utilized
296     * is the Serial SCSI Protocol.
297     */
298    SCIC_SSP_PROTOCOL,
299 
300    /**
301     * This enumeration constant indicates that the protocol utilized
302     * is the Serial-ATA Tunneling Protocol.
303     */
304    SCIC_STP_PROTOCOL
305 
306 } SCIC_TRANSPORT_PROTOCOL;
307 
308 
309 /**
310  * @brief This method simply returns the size required to build an SCI
311  *        based IO request object.
312  *
313  * @return Return the size of the SCI IO request object.
314  */
315 U32 scic_io_request_get_object_size(
316    void
317 );
318 
319 /**
320  * @brief This method is called by the SCI user to construct all SCI Core
321  *        IO requests.  Memory initialization and functionality common to
322  *        all IO request types is performed in this method.
323  *
324  * @note  The SCI core implementation will create an association between
325  *        the user IO request object and the core IO request object.
326  *
327  * @param[in]  scic_controller the handle to the core controller object
328  *             for which to build an IO request.
329  * @param[in]  scic_remote_device the handle to the core remote device
330  *             object for which to build an IO request.
331  * @param[in]  io_tag This parameter specifies the IO tag to be associated
332  *             with this request.  If SCI_CONTROLLER_INVALID_IO_TAG is
333  *             passed, then a copy of the request is built internally.  The
334  *             request will be copied into the actual controller request
335  *             memory when the IO tag is allocated internally during the
336  *             scic_controller_start_io() method.
337  * @param[in]  user_io_request_object This parameter specifies the user
338  *             IO request to be utilized during IO construction.  This IO
339  *             pointer will become the associated object for the core
340  *             IO request object.
341  * @param[in]  scic_io_request_memory This parameter specifies the memory
342  *             location to be utilized when building the core request.
343  * @param[out] new_scic_io_request_handle This parameter specifies a
344  *             pointer to the handle the core will expect in further
345  *             interactions with the core IO request object.
346  *
347  * @return Indicate if the controller successfully built the IO request.
348  * @retval SCI_SUCCESS This value is returned if the IO request was
349  *         successfully built.
350  */
351 SCI_STATUS scic_io_request_construct(
352    SCI_CONTROLLER_HANDLE_T      scic_controller,
353    SCI_REMOTE_DEVICE_HANDLE_T   scic_remote_device,
354    U16                          io_tag,
355    void                       * user_io_request_object,
356    void                       * scic_io_request_memory,
357    SCI_IO_REQUEST_HANDLE_T    * new_scic_io_request_handle
358 );
359 
360 /**
361  * @brief This method is called by the SCI user to build an SSP
362  *        IO request.
363  *
364  * @pre
365  *        - The user must have previously called scic_io_request_construct()
366  *          on the supplied IO request.
367  *
368  * @param[in]  scic_io_request This parameter specifies the handle to the
369  *             io request object to be built.
370  *
371  * @return Indicate if the controller successfully built the IO request.
372  * @retval SCI_SUCCESS This value is returned if the IO request was
373  *         successfully built.
374  * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the
375  *         remote_device does not support the SSP protocol.
376  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
377  *         user did not properly set the association between the SCIC IO
378  *         request and the user's IO request.  Please refer to the
379  *         sci_object_set_association() routine for more
380  *         information.
381  */
382 SCI_STATUS scic_io_request_construct_basic_ssp(
383    SCI_IO_REQUEST_HANDLE_T  scic_io_request
384 );
385 
386 /**
387  * @brief This method is called by the SCI user to build an SSP
388  *        IO request with additional parameters that provide additional
389  *        flexibility from the standard scic_io_request_construct_basic_ssp()
390  *        method.
391  *
392  * @pre
393  *        - The user must have previously called scic_io_request_construct()
394  *          on the supplied IO request.
395  *
396  * @param[in]  scic_io_request This parameter specifies the handle to the
397  *             io request object to be built.
398  * @param[in]  io_parameters the additional parameter information to
399  *             be added to the outgoing IO request.
400  *
401  * @return Indicate if the controller successfully built the IO request.
402  * @retval SCI_SUCCESS This value is returned if the IO request was
403  *         successfully built.
404  * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the
405  *         remote_device does not support the SSP protocol.
406  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
407  *         user did not properly set the association between the SCIC IO
408  *         request and the user's IO request.  Please refer to the
409  *         sci_object_set_association() routine for more
410  *         information.
411  *
412  * @todo Determine the failure situations and return values.
413  */
414 SCI_STATUS scic_io_request_construct_advanced_ssp(
415    SCI_IO_REQUEST_HANDLE_T    scic_io_request,
416    SCIC_IO_SSP_PARAMETERS_T * io_parameters
417 );
418 
419 #if !defined(DISABLE_PASS_THROUGH)
420 
421 /**
422  * @brief This method will build an IO request based on the user information
423  *        supplied in the pass-through IO request object.
424  *
425  * @param[in]  scic_io_request This parameter specifies the handle to the
426  *             io request object to be built.
427  *
428  * @param[in]  ssp_passthru_cb This parameter specifies the pointer to
429  *             the structure containing the callback to the function
430  *             pointers to get the needed fields from the pass-through
431  *             reqiest instead of SRB
432  *
433  * @return Indicate if the controller successfully built the IO request.
434  * @retval SCI_SUCCESS This value is returned if the IO request was
435  *         successfully built.
436  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
437  *         user did not properly set the association between the SCIC IO
438  *         request and the user's IO request.  Please refer to the
439  *         sci_object_set_association() routine for more
440  *         information.
441  */
442 SCI_STATUS scic_io_request_construct_ssp_pass_through(
443    void                       * scic_io_request_memory,
444    SCIC_SSP_PASSTHRU_REQUEST_CALLBACKS_T *ssp_passthru_cb
445 );
446 
447 #else // !defined(DISABLE_PASS_THROUGH)
448 
449 #define scic_io_request_construct_ssp_pass_through(memory, cb) SCI_FAILURE
450 
451 #endif // !defined(DISABLE_PASS_THROUGH)
452 
453 /**
454  * @brief This method is called by the SCI Core user to build an STP
455  *        IO request.
456  *
457  * @pre
458  *        - The user must have previously called scic_io_request_construct()
459  *          on the supplied IO request.
460  *
461  * @param[in]  scic_io_request This parameter specifies the handle to the
462  *             io request object to be built.
463  *
464  * @return Indicate if the controller successfully built the IO request.
465  * @retval SCI_SUCCESS This value is returned if the IO request was
466  *         successfully built.
467  * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the
468  *         remote_device does not support the STP protocol.
469  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
470  *         user did not properly set the association between the SCIC IO
471  *         request and the user's IO request.  Please refer to the
472  *         sci_object_set_association() routine for more
473  *         information.
474  */
475 SCI_STATUS scic_io_request_construct_basic_sata(
476    SCI_IO_REQUEST_HANDLE_T  scic_io_request
477 );
478 
479 /**
480  * @brief This method is called by the SCI Core user to build an STP
481  *        IO request.
482  *
483  * @pre
484  *        - The user must have previously called scic_io_request_construct()
485  *          on the supplied IO request.
486  *
487  * @param[in]  scic_io_request This parameter specifies the handle to the
488  *             io request object to be built.
489  *
490  * @return Indicate if the controller successfully built the IO request.
491  * @retval SCI_SUCCESS This value is returned if the IO request was
492  *         successfully built.
493  * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the
494  *         remote_device does not support the STP protocol.
495  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
496  *         user did not properly set the association between the SCIC IO
497  *         request and the user's IO request.  Please refer to the
498  *         sci_object_set_association() routine for more
499  *         information.
500  */
501 SCI_STATUS scic_io_request_construct_advanced_sata(
502    SCI_IO_REQUEST_HANDLE_T     scic_io_request,
503    SCIC_IO_SATA_PARAMETERS_T * io_parameters
504 );
505 
506 #if !defined(DISABLE_PASS_THROUGH)
507 
508 /**
509  * @brief This method is called by the SCI user to build an STP pass-through
510  *        IO request.
511  *
512  * @pre
513  *        - The user must have previously called scic_io_request_construct()
514  *          on the supplied IO request.
515  *
516  * @param[in]  scic_io_request This parameter specifies the handle to the
517  *             io request object to be built.
518  *
519  * @param[in]  passthru_cb This parameter specifies the pointer to the callback
520  *             structure that contains the function pointers
521  *
522  * @return Indicate if the controller successfully built the IO request.
523  */
524 SCI_STATUS scic_io_request_construct_sata_pass_through(
525    SCI_IO_REQUEST_HANDLE_T  scic_io_request,
526    SCIC_STP_PASSTHRU_REQUEST_CALLBACKS_T *passthru_cb
527 
528 );
529 
530 #else // !defined(DISABLE_PASS_THROUGH)
531 
532 #define scic_io_request_construct_sata_pass_through(io, cb) SCI_FAILURE
533 
534 #endif // !defined(DISABLE_PASS_THROUGH)
535 
536 /**
537  * @brief This method is called by the SCI user to build an SMP
538  *        IO request.
539  *
540  * @pre
541  *        - The user must have previously called scic_io_request_construct()
542  *          on the supplied IO request.
543  *
544  * @param[in]  scic_io_request This parameter specifies the handle to the
545  *             io request object to be built.
546  *
547  * @return Indicate if the controller successfully built the IO request.
548  * @retval SCI_SUCCESS This value is returned if the IO request was
549  *         successfully built.
550  * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the
551  *         remote_device does not support the SMP protocol.
552  * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the
553  *         user did not properly set the association between the SCIC IO
554  *         request and the user's IO request.  Please refer to the
555  *         sci_object_set_association() routine for more
556  *         information.
557  */
558 SCI_STATUS scic_io_request_construct_smp(
559    SCI_IO_REQUEST_HANDLE_T  scic_io_request
560 );
561 
562 
563 /**
564  * @brief This method is called by the SCI user to build an SMP pass-through
565  *        IO request.
566  *
567  * @pre
568  *        - The user must have previously called scic_io_request_construct()
569  *          on the supplied IO request.
570  *
571  * @param[in]  scic_smp_request This parameter specifies the handle to the
572  *             io request object to be built.
573  *
574  * @param[in]  passthru_cb This parameter specifies the pointer to the callback
575  *             structure that contains the function pointers
576  *
577  * @return Indicate if the controller successfully built the IO request.
578  */
579 SCI_STATUS scic_io_request_construct_smp_pass_through(
580    SCI_IO_REQUEST_HANDLE_T  scic_smp_request,
581    SCIC_SMP_PASSTHRU_REQUEST_CALLBACKS_T *passthru_cb
582 );
583 
584 /**
585  * @brief This method returns the controller specific IO/Task request status.
586  *        These status values are unique to the specific controller being
587  *        managed by the SCIC.
588  *
589  * @param[in]  io_request the handle to the IO or task management request
590  *             object for which to retrieve the status.
591  *
592  * @return This method returns a value indicating the controller specific
593  *         request status.
594  */
595 U32 scic_request_get_controller_status(
596    SCI_IO_REQUEST_HANDLE_T  io_request
597 );
598 
599 /**
600  * @brief This method returns the user specific IO/Task request status.
601  *
602  * @param[in]  io_request the handle to the IO or task management request
603  *             object for which to retrieve the status.
604  *
605  * @return This method returns a value indicating the user specific
606  *         request status.
607  */
608 U32 scic_request_get_sci_status(
609    SCI_IO_REQUEST_HANDLE_T  io_request
610 );
611 
612 
613 /**
614  * @brief This method will return the address to the command information
615  *        unit.
616  *
617  * @param[in]  scic_io_request This parameter specifies the handle to the
618  *             io request object to be built.
619  *
620  * @return The address of the SSP/SMP command information unit.
621  */
622 void * scic_io_request_get_command_iu_address(
623    SCI_IO_REQUEST_HANDLE_T  scic_io_request
624 );
625 
626 /**
627  * @brief This method will return the address to the response information
628  *        unit.  For an SSP request this buffer is only valid if the IO
629  *        request is completed with the status SCI_FAILURE_IO_RESPONSE_VALID.
630  *
631  * @param[in]  scic_io_request This parameter specifies the handle to the
632  *             io request object to be built.
633  *
634  * @return The address of the SSP/SMP response information unit.
635  */
636 void * scic_io_request_get_response_iu_address(
637    SCI_IO_REQUEST_HANDLE_T  scic_io_request
638 );
639 
640 /**
641  * @brief This method will return the IO tag utilized by the IO request.
642  *
643  * @param[in]  scic_io_request This parameter specifies the handle to the
644  *             io request object for which to return the IO tag.
645  *
646  * @return An unsigned integer representing the IO tag being utilized.
647  * @retval SCI_CONTROLLER_INVALID_IO_TAG This value is returned if the IO
648  *         does not currently have an IO tag allocated to it.
649  * @retval All return other values indicate a legitimate tag.
650  */
651 U16 scic_io_request_get_io_tag(
652    SCI_IO_REQUEST_HANDLE_T  scic_io_request
653 );
654 
655 /**
656  * @brief This method will inform the user of the protocol with which
657  *        the supplied IO request was created.
658  *
659  * @param[in]  scic_io_request This parameter specifies the IO request
660  *             for which to retrieve the protocol.
661  *
662  * @return This method returns the transport protocol utilized for the
663  *         the supplied request.  Please refer to SCIC_TRANSPORT_PROTOCOL
664  *         for more information.
665  */
666 SCIC_TRANSPORT_PROTOCOL scic_io_request_get_protocol(
667    SCI_IO_REQUEST_HANDLE_T  scic_io_request
668 );
669 
670 /**
671  * @brief This method will assign an NCQ tag to the io request object.  The
672  *        caller of this function must make sure that only valid NCQ tags are
673  *        assigned to the io request object.
674  *
675  * @param[in]  scic_io_request This parameter specifies the handle to the
676  *             io request object to which to assign the ncq tag.
677  * @param[in]  ncq_tag This parameter specifies the NCQ tag to be utilized
678  *             for the supplied core IO request.  It is up to the user to make
679  *             sure that this is a valid NCQ tag.
680  *
681  * @return none
682  *
683  * @note This function is only valid for SATA NCQ requests.
684  */
685 void scic_stp_io_request_set_ncq_tag(
686    SCI_IO_REQUEST_HANDLE_T  scic_io_request,
687    U16                      ncq_tag
688 );
689 
690 /**
691  * @brief This method will return the address of the host to device register
692  *        fis region for the io request object.
693  *
694  * @param[in] scic_io_request This parameter specifies the handle to the io
695  *       request object from which to get the host to device register fis
696  *       buffer.
697  *
698  * @return The address of the host to device register fis buffer in the io
699  *         request object.
700  *
701  * @note This function is only valid for SATA requests.
702  */
703 void * scic_stp_io_request_get_h2d_reg_address(
704    SCI_IO_REQUEST_HANDLE_T  scic_io_request
705 );
706 
707 /**
708  * @brief This method will return the address of the device to host register
709  *        fis region for the io request object.
710  *
711  * @param[in] scic_io_request This parameter specifies the handle to the io
712  *       request object from which to get the device to host register fis
713  *       buffer.
714  *
715  * @return The address fo the device to host register fis ending the io
716  *         request.
717  *
718  * @note This function is only valid for SATA requests.
719  */
720 void * scic_stp_io_request_get_d2h_reg_address(
721    SCI_IO_REQUEST_HANDLE_T  scic_io_request
722 );
723 
724 /**
725  * @brief This method will return the rx frame for the io request object that
726  *        contains the given offset.
727  *
728  * @param[in] scic_io_request This parameter specifies the handle to the io
729  *       request object which has received the frame data.
730  * @param[in] offset This parameter specifies which frame is being requested.
731  *
732  * @return The return is a pointer to the frame buffer data.
733  *
734  * @note Frame buffers are only 1024 bytes in size.  Reading past the end of a
735  *       frame will have unexpected results.
736  */
737 void * scic_io_request_get_rx_frame(
738    SCI_IO_REQUEST_HANDLE_T  scic_io_request,
739    U32                      offset
740 );
741 
742 /**
743  * @brief This method will return the number of bytes transferred from the SCU
744  *
745  * @param[in] scic_io_request This parameter specifies the handle to the io request
746  *            whose data length was not eqaul to the data length specified in the request.
747  *            When the driver gets an early io completion status from the hardware,
748  *            this routine should be called to get the actual number of bytes transferred
749  *
750  * @return The return is the number of bytes transferred when the data legth is not equal to
751  *         the specified length in the io request
752  *
753  */
754 U32 scic_io_request_get_number_of_bytes_transferred (
755    SCI_IO_REQUEST_HANDLE_T  scic_io_request
756 );
757 
758 #ifdef __cplusplus
759 }
760 #endif // __cplusplus
761 
762 #endif // _SCIC_IO_REQUEST_H_
763 
764