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
70extern "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 */
85typedef 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 */
115typedef 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 */
135typedef 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 */
172typedef 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 */
200typedef 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 */
249typedef 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 */
280typedef 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 */
315U32 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 */
351SCI_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 */
382SCI_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 */
414SCI_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 */
442SCI_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 */
475SCI_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 */
501SCI_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 */
524SCI_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 */
558SCI_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 */
579SCI_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 */
595U32 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 */
608U32 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 */
622void * 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 */
636void * 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 */
651U16 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 */
666SCIC_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 */
685void 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 */
703void * 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 */
720void * 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 */
737void * 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 */
754U32 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