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_SDS_STP_REQUEST_T_ 57#define _SCIC_SDS_STP_REQUEST_T_ 58 59#ifdef __cplusplus 60extern "C" { 61#endif // __cplusplus 62 63#include <dev/isci/scil/intel_sata.h> 64#include <dev/isci/scil/sci_types.h> 65#include <dev/isci/scil/scic_sds_request.h> 66 67/** 68 * @struct 69 * 70 * @brief This structure represents the additional information that is 71 * required to handle SATA PIO requests. 72 */ 73typedef struct SCIC_SDS_STP_REQUEST 74{ 75 SCIC_SDS_REQUEST_T parent; 76 77 SATA_FIS_REG_D2H_T d2h_reg_fis; 78 79 union 80 { 81 U32 ncq; 82 83 U32 udma; 84 85 struct 86 { 87 /** 88 * Total transfer for the entire PIO request recorded at request construction 89 * time. 90 * 91 * @todo Should we just decrement this value for each byte of data transitted 92 * or received to elemenate the current_transfer_bytes field? 93 */ 94 U32 total_transfer_bytes; 95 96 /** 97 * Total number of bytes received/transmitted in data frames since the start 98 * of the IO request. At the end of the IO request this should equal the 99 * total_transfer_bytes. 100 */ 101 U32 current_transfer_bytes; 102 103 /** 104 * The number of bytes requested in the in the PIO setup. 105 */ 106 U32 pio_transfer_bytes; 107 108 /** 109 * PIO Setup ending status value to tell us if we need to wait for another FIS 110 * or if the transfer is complete. On the receipt of a D2H FIS this will be 111 * the status field of that FIS. 112 */ 113 U8 ending_status; 114 115 /** 116 * On receipt of a D2H FIS this will be the ending error field if the 117 * ending_status has the SATA_STATUS_ERR bit set. 118 */ 119 U8 ending_error; 120 121 /** 122 * Protocol Type. This is filled in by core during IO Request construction type. 123 */ 124 U8 sat_protocol; 125 126 /** 127 * This field keeps track of sgl pair to be retrieved from OS memory for processing. 128 */ 129 U8 sgl_pair_index; 130 131 struct 132 { 133 SCU_SGL_ELEMENT_PAIR_T * sgl_pair; 134 U8 sgl_set; 135 U32 sgl_offset; 136 } request_current; 137 } pio; 138 139 struct 140 { 141 /** 142 * The number of bytes requested in the PIO setup before CDB data frame. 143 */ 144 U32 device_preferred_cdb_length; 145 } packet; 146 } type; 147 148} SCIC_SDS_STP_REQUEST_T; 149 150/** 151 * @enum SCIC_SDS_STP_REQUEST_STARTED_UDMA_SUBSTATES 152 * 153 * @brief This enumeration depicts the various sub-states associated with 154 * a SATA/STP UDMA protocol operation. 155 */ 156enum SCIC_SDS_STP_REQUEST_STARTED_UDMA_SUBSTATES 157{ 158 SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE, 159 SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE, 160 161 SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES 162}; 163 164/** 165 * @enum SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_SUBSTATES 166 * 167 * @brief This enumeration depicts the various sub-states associated with 168 * a SATA/STP non-data protocol operation. 169 */ 170enum SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_SUBSTATES 171{ 172 SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE, 173 SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE, 174 SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES 175}; 176 177/** 178 * @enum SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_SUBSTATES 179 * 180 * @brief THis enumeration depicts the various sub-states associated with a 181 * SATA/STP soft reset operation. 182 */ 183enum SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_SUBSTATES 184{ 185 SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE, 186 SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE, 187 SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE, 188 189 SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES 190}; 191 192extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 193 scic_sds_stp_request_started_udma_substate_handler_table 194 [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES]; 195 196extern SCI_BASE_STATE_T 197 scic_sds_stp_request_started_udma_substate_table 198 [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES]; 199 200extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 201 scic_sds_stp_request_started_non_data_substate_handler_table 202 [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES]; 203 204extern SCI_BASE_STATE_T 205 scic_sds_stp_request_started_non_data_substate_table 206 [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES]; 207 208 209extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 210 scic_sds_stp_request_started_soft_reset_substate_handler_table 211 [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES]; 212 213extern SCI_BASE_STATE_T 214 scic_sds_stp_request_started_soft_reset_substate_table 215 [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES]; 216 217// --------------------------------------------------------------------------- 218 219U32 scic_sds_stp_request_get_object_size(void); 220 221U32 scic_sds_stp_task_request_get_object_size(void); 222 223void scu_sata_reqeust_construct_task_context( 224 SCIC_SDS_REQUEST_T * this_request, 225 SCU_TASK_CONTEXT_T * task_context 226); 227 228void scic_sds_stp_non_ncq_request_construct( 229 SCIC_SDS_REQUEST_T *this_request 230); 231 232SCI_STATUS scic_sds_stp_pio_request_construct( 233 SCIC_SDS_REQUEST_T * scic_io_request, 234 U8 sat_protocol, 235 BOOL copy_rx_frame 236); 237 238SCI_STATUS scic_sds_stp_pio_request_construct_pass_through ( 239 SCIC_SDS_REQUEST_T * scic_io_request, 240 SCIC_STP_PASSTHRU_REQUEST_CALLBACKS_T *passthru_cb 241); 242 243SCI_STATUS scic_sds_stp_udma_request_construct( 244 SCIC_SDS_REQUEST_T * this_request, 245 U32 transfer_length, 246 SCI_IO_REQUEST_DATA_DIRECTION data_direction 247); 248 249SCI_STATUS scic_sds_stp_non_data_request_construct( 250 SCIC_SDS_REQUEST_T * this_request 251); 252 253SCI_STATUS scic_sds_stp_soft_reset_request_construct( 254 SCIC_SDS_REQUEST_T * this_request 255); 256 257SCI_STATUS scic_sds_stp_ncq_request_construct( 258 SCIC_SDS_REQUEST_T * this_request, 259 U32 transfer_length, 260 SCI_IO_REQUEST_DATA_DIRECTION data_direction 261); 262 263void scu_stp_raw_request_construct_task_context( 264 SCIC_SDS_STP_REQUEST_T * this_request, 265 SCU_TASK_CONTEXT_T * task_context 266 267); 268 269SCI_STATUS scic_sds_io_request_construct_sata( 270 SCIC_SDS_REQUEST_T * this_request, 271 U8 sat_protocol, 272 U32 transfer_length, 273 SCI_IO_REQUEST_DATA_DIRECTION data_direction, 274 BOOL copy_rx_frame, 275 BOOL do_translate_sgl 276); 277 278#ifdef __cplusplus 279} 280#endif // __cplusplus 281 282#endif // _SCIC_SDS_STP_REQUEST_T_ 283