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