1f11c7f63SJim Harris /*-
2*718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3*718cf2ccSPedro F. Giffuni *
4f11c7f63SJim Harris * This file is provided under a dual BSD/GPLv2 license. When using or
5f11c7f63SJim Harris * redistributing this file, you may do so under either license.
6f11c7f63SJim Harris *
7f11c7f63SJim Harris * GPL LICENSE SUMMARY
8f11c7f63SJim Harris *
9f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10f11c7f63SJim Harris *
11f11c7f63SJim Harris * This program is free software; you can redistribute it and/or modify
12f11c7f63SJim Harris * it under the terms of version 2 of the GNU General Public License as
13f11c7f63SJim Harris * published by the Free Software Foundation.
14f11c7f63SJim Harris *
15f11c7f63SJim Harris * This program is distributed in the hope that it will be useful, but
16f11c7f63SJim Harris * WITHOUT ANY WARRANTY; without even the implied warranty of
17f11c7f63SJim Harris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18f11c7f63SJim Harris * General Public License for more details.
19f11c7f63SJim Harris *
20f11c7f63SJim Harris * You should have received a copy of the GNU General Public License
21f11c7f63SJim Harris * along with this program; if not, write to the Free Software
22f11c7f63SJim Harris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23f11c7f63SJim Harris * The full GNU General Public License is included in this distribution
24f11c7f63SJim Harris * in the file called LICENSE.GPL.
25f11c7f63SJim Harris *
26f11c7f63SJim Harris * BSD LICENSE
27f11c7f63SJim Harris *
28f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29f11c7f63SJim Harris * All rights reserved.
30f11c7f63SJim Harris *
31f11c7f63SJim Harris * Redistribution and use in source and binary forms, with or without
32f11c7f63SJim Harris * modification, are permitted provided that the following conditions
33f11c7f63SJim Harris * are met:
34f11c7f63SJim Harris *
35f11c7f63SJim Harris * * Redistributions of source code must retain the above copyright
36f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer.
37f11c7f63SJim Harris * * Redistributions in binary form must reproduce the above copyright
38f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer in
39f11c7f63SJim Harris * the documentation and/or other materials provided with the
40f11c7f63SJim Harris * distribution.
41f11c7f63SJim Harris *
42f11c7f63SJim Harris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43f11c7f63SJim Harris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44f11c7f63SJim Harris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45f11c7f63SJim Harris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46f11c7f63SJim Harris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47f11c7f63SJim Harris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48f11c7f63SJim Harris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49f11c7f63SJim Harris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50f11c7f63SJim Harris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51f11c7f63SJim Harris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52f11c7f63SJim Harris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53f11c7f63SJim Harris */
54f11c7f63SJim Harris
55f11c7f63SJim Harris #include <sys/cdefs.h>
56f11c7f63SJim Harris #include <dev/isci/scil/intel_sat.h>
57f11c7f63SJim Harris #include <dev/isci/scil/intel_sata.h>
58f11c7f63SJim Harris #include <dev/isci/scil/sci_types.h>
59f11c7f63SJim Harris #include <dev/isci/scil/scic_remote_device.h>
60f11c7f63SJim Harris #include <dev/isci/scil/scic_user_callback.h>
61f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_controller.h>
62f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_remote_device.h>
63f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_stp_request.h>
64f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_stp_pio_request.h>
65f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_logger.h>
66f11c7f63SJim Harris #include <dev/isci/sci_environment.h>
67f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state_machine.h>
68f11c7f63SJim Harris #include <dev/isci/scil/scu_task_context.h>
69f11c7f63SJim Harris #include <dev/isci/scil/intel_ata.h>
70f11c7f63SJim Harris #include <dev/isci/scil/sci_util.h>
71f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_logger.h>
72f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_request.h>
73f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_stp_request.h>
74f11c7f63SJim Harris #include <dev/isci/scil/scu_completion_codes.h>
75f11c7f63SJim Harris #include <dev/isci/scil/scu_event_codes.h>
76f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state.h>
77f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_unsolicited_frame_control.h>
78f11c7f63SJim Harris #include <dev/isci/scil/scic_io_request.h>
79f11c7f63SJim Harris
80f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
81f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_stp_packet_request.h>
82f11c7f63SJim Harris #endif
83f11c7f63SJim Harris
84f11c7f63SJim Harris /**
85f11c7f63SJim Harris * This macro returns the address of the stp h2d reg fis buffer in the io
86f11c7f63SJim Harris * request memory
87f11c7f63SJim Harris */
88f11c7f63SJim Harris #define scic_sds_stp_request_get_h2d_reg_buffer_unaligned(memory) \
89f11c7f63SJim Harris ((SATA_FIS_REG_H2D_T *)( \
90f11c7f63SJim Harris ((char *)(memory)) + sizeof(SCIC_SDS_STP_REQUEST_T) \
91f11c7f63SJim Harris ))
92f11c7f63SJim Harris
93f11c7f63SJim Harris /**
94f11c7f63SJim Harris * This macro aligns the stp command buffer in DWORD alignment
95f11c7f63SJim Harris */
96f11c7f63SJim Harris #define scic_sds_stp_request_align_h2d_reg_buffer(address) \
97f11c7f63SJim Harris ((SATA_FIS_REG_H2D_T *)( \
98f11c7f63SJim Harris (((POINTER_UINT)(address)) + (sizeof(U32) - 1)) \
99f11c7f63SJim Harris & ~(sizeof(U32)- 1) \
100f11c7f63SJim Harris ))
101f11c7f63SJim Harris
102f11c7f63SJim Harris /**
103f11c7f63SJim Harris * This macro returns the DWORD-aligned stp command buffer
104f11c7f63SJim Harris */
105f11c7f63SJim Harris #define scic_sds_stp_request_get_h2d_reg_buffer(memory) \
106f11c7f63SJim Harris ((SATA_FIS_REG_H2D_T *) \
107f11c7f63SJim Harris ((char *)scic_sds_stp_request_align_h2d_reg_buffer( \
108f11c7f63SJim Harris (char *) scic_sds_stp_request_get_h2d_reg_buffer_unaligned(memory) \
109f11c7f63SJim Harris )))
110f11c7f63SJim Harris
111f11c7f63SJim Harris /**
112f11c7f63SJim Harris * This macro returns the address of the stp response buffer in the io
113f11c7f63SJim Harris * request memory
114f11c7f63SJim Harris */
115f11c7f63SJim Harris #define scic_sds_stp_request_get_response_buffer_unaligned(memory) \
116f11c7f63SJim Harris ((SATA_FIS_REG_D2H_T *)( \
117f11c7f63SJim Harris ((char *)(scic_sds_stp_request_get_h2d_reg_buffer(memory))) \
118f11c7f63SJim Harris + sizeof(SATA_FIS_REG_H2D_T) \
119f11c7f63SJim Harris ))
120f11c7f63SJim Harris
121f11c7f63SJim Harris
122f11c7f63SJim Harris /**
123f11c7f63SJim Harris * This macro aligns the stp response buffer in DWORD alignment
124f11c7f63SJim Harris */
125f11c7f63SJim Harris #define scic_sds_stp_request_align_response_buffer(address) \
126f11c7f63SJim Harris ((SATA_FIS_REG_D2H_T *)( \
127f11c7f63SJim Harris (((POINTER_UINT)(address)) + (sizeof(U32) - 1)) \
128f11c7f63SJim Harris & ~(sizeof(U32)- 1) \
129f11c7f63SJim Harris ))
130f11c7f63SJim Harris
131f11c7f63SJim Harris /**
132f11c7f63SJim Harris * This macro returns the DWORD-aligned stp response buffer
133f11c7f63SJim Harris */
134f11c7f63SJim Harris #define scic_sds_stp_request_get_response_buffer(memory) \
135f11c7f63SJim Harris ((SATA_FIS_REG_D2H_T *) \
136f11c7f63SJim Harris ((char *)scic_sds_stp_request_align_response_buffer( \
137f11c7f63SJim Harris (char *)scic_sds_stp_request_get_response_buffer_unaligned(memory) \
138f11c7f63SJim Harris )))
139f11c7f63SJim Harris
140f11c7f63SJim Harris
141f11c7f63SJim Harris /**
142f11c7f63SJim Harris * This macro returns the address of the task context buffer in the io
143f11c7f63SJim Harris * request memory
144f11c7f63SJim Harris */
145f11c7f63SJim Harris #define scic_sds_stp_request_get_task_context_buffer_unaligned(memory) \
146f11c7f63SJim Harris ((SCU_TASK_CONTEXT_T *)( \
147f11c7f63SJim Harris ((char *)(scic_sds_stp_request_get_response_buffer(memory))) \
148f11c7f63SJim Harris + sizeof(SCI_SSP_RESPONSE_IU_T) \
149f11c7f63SJim Harris ))
150f11c7f63SJim Harris
151f11c7f63SJim Harris /**
152f11c7f63SJim Harris * This macro returns the aligned task context buffer
153f11c7f63SJim Harris */
154f11c7f63SJim Harris #define scic_sds_stp_request_get_task_context_buffer(memory) \
155f11c7f63SJim Harris ((SCU_TASK_CONTEXT_T *)( \
156f11c7f63SJim Harris ((char *)scic_sds_request_align_task_context_buffer( \
157f11c7f63SJim Harris (char *)scic_sds_stp_request_get_task_context_buffer_unaligned(memory)) \
158f11c7f63SJim Harris )))
159f11c7f63SJim Harris
160f11c7f63SJim Harris /**
161f11c7f63SJim Harris * This macro returns the address of the sgl elment pairs in the io request
162f11c7f63SJim Harris * memory buffer
163f11c7f63SJim Harris */
164f11c7f63SJim Harris #define scic_sds_stp_request_get_sgl_element_buffer(memory) \
165f11c7f63SJim Harris ((SCU_SGL_ELEMENT_PAIR_T *)( \
166f11c7f63SJim Harris ((char *)(scic_sds_stp_request_get_task_context_buffer(memory))) \
167f11c7f63SJim Harris + sizeof(SCU_TASK_CONTEXT_T) \
168f11c7f63SJim Harris ))
169f11c7f63SJim Harris
170f11c7f63SJim Harris
171f11c7f63SJim Harris /**
172f11c7f63SJim Harris * This method return the memory space commonly required for STP IO and
173f11c7f63SJim Harris * task requests.
174f11c7f63SJim Harris *
175f11c7f63SJim Harris * @return U32
176f11c7f63SJim Harris */
177f11c7f63SJim Harris static
scic_sds_stp_common_request_get_object_size(void)178f11c7f63SJim Harris U32 scic_sds_stp_common_request_get_object_size(void)
179f11c7f63SJim Harris {
180f11c7f63SJim Harris return sizeof(SCIC_SDS_STP_REQUEST_T)
181f11c7f63SJim Harris + sizeof(SATA_FIS_REG_H2D_T)
182f11c7f63SJim Harris + sizeof(U32)
183f11c7f63SJim Harris + sizeof(SATA_FIS_REG_D2H_T)
184f11c7f63SJim Harris + sizeof(U32)
185f11c7f63SJim Harris + sizeof(SCU_TASK_CONTEXT_T)
186f11c7f63SJim Harris + CACHE_LINE_SIZE;
187f11c7f63SJim Harris }
188f11c7f63SJim Harris
189f11c7f63SJim Harris
190f11c7f63SJim Harris /**
191f11c7f63SJim Harris * This method return the memory space required for STP PIO requests.
192f11c7f63SJim Harris *
193f11c7f63SJim Harris * @return U32
194f11c7f63SJim Harris */
scic_sds_stp_request_get_object_size(void)195f11c7f63SJim Harris U32 scic_sds_stp_request_get_object_size(void)
196f11c7f63SJim Harris {
197f11c7f63SJim Harris return scic_sds_stp_common_request_get_object_size()
198f11c7f63SJim Harris + sizeof(SCU_SGL_ELEMENT_PAIR_T) * SCU_MAX_SGL_ELEMENT_PAIRS;
199f11c7f63SJim Harris }
200f11c7f63SJim Harris
201f11c7f63SJim Harris
202f11c7f63SJim Harris /**
203f11c7f63SJim Harris * This method return the memory space required for STP task requests.
204f11c7f63SJim Harris *
205f11c7f63SJim Harris * @return U32
206f11c7f63SJim Harris */
scic_sds_stp_task_request_get_object_size(void)207f11c7f63SJim Harris U32 scic_sds_stp_task_request_get_object_size(void)
208f11c7f63SJim Harris {
209f11c7f63SJim Harris return scic_sds_stp_common_request_get_object_size();
210f11c7f63SJim Harris }
211f11c7f63SJim Harris
212f11c7f63SJim Harris
213f11c7f63SJim Harris /**
214f11c7f63SJim Harris *
215f11c7f63SJim Harris *
216f11c7f63SJim Harris * @param[in] this_request
217f11c7f63SJim Harris */
scic_sds_stp_request_assign_buffers(SCIC_SDS_REQUEST_T * request)218f11c7f63SJim Harris void scic_sds_stp_request_assign_buffers(
219f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request
220f11c7f63SJim Harris )
221f11c7f63SJim Harris {
222f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request = (SCIC_SDS_STP_REQUEST_T *)request;
223f11c7f63SJim Harris
224f11c7f63SJim Harris this_request->parent.command_buffer =
225f11c7f63SJim Harris scic_sds_stp_request_get_h2d_reg_buffer(this_request);
226f11c7f63SJim Harris this_request->parent.response_buffer =
227f11c7f63SJim Harris scic_sds_stp_request_get_response_buffer(this_request);
228f11c7f63SJim Harris this_request->parent.sgl_element_pair_buffer =
229f11c7f63SJim Harris scic_sds_stp_request_get_sgl_element_buffer(this_request);
230f11c7f63SJim Harris this_request->parent.sgl_element_pair_buffer =
231f11c7f63SJim Harris scic_sds_request_align_sgl_element_buffer(this_request->parent.sgl_element_pair_buffer);
232f11c7f63SJim Harris
233f11c7f63SJim Harris if (this_request->parent.was_tag_assigned_by_user == FALSE)
234f11c7f63SJim Harris {
235f11c7f63SJim Harris this_request->parent.task_context_buffer =
236f11c7f63SJim Harris scic_sds_stp_request_get_task_context_buffer(this_request);
237f11c7f63SJim Harris }
238f11c7f63SJim Harris }
239f11c7f63SJim Harris
240f11c7f63SJim Harris /**
241f11c7f63SJim Harris * @brief This method is will fill in the SCU Task Context for any type of
242f11c7f63SJim Harris * SATA request. This is called from the various SATA constructors.
243f11c7f63SJim Harris *
244f11c7f63SJim Harris * @pre The general io request construction is complete.
245f11c7f63SJim Harris * @pre The buffer assignment for the command buffer is complete.
246f11c7f63SJim Harris *
247f11c7f63SJim Harris * @param[in] this_request The general IO request object which is to be used
248f11c7f63SJim Harris * in constructing the SCU task context.
249f11c7f63SJim Harris * @param[in] task_context The buffer pointer for the SCU task context which
250f11c7f63SJim Harris * is being constructed.
251f11c7f63SJim Harris *
252f11c7f63SJim Harris * @return none
253f11c7f63SJim Harris *
254f11c7f63SJim Harris * @todo Revisit task context construction to determine what is common for
255f11c7f63SJim Harris * SSP/SMP/STP task context structures.
256f11c7f63SJim Harris */
scu_sata_reqeust_construct_task_context(SCIC_SDS_REQUEST_T * this_request,SCU_TASK_CONTEXT_T * task_context)257f11c7f63SJim Harris void scu_sata_reqeust_construct_task_context(
258f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
259f11c7f63SJim Harris SCU_TASK_CONTEXT_T * task_context
260f11c7f63SJim Harris )
261f11c7f63SJim Harris {
262f11c7f63SJim Harris SCI_PHYSICAL_ADDRESS physical_address;
263f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T *owning_controller;
264f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T *target_device;
265f11c7f63SJim Harris SCIC_SDS_PORT_T *target_port;
266f11c7f63SJim Harris
267f11c7f63SJim Harris owning_controller = scic_sds_request_get_controller(this_request);
268f11c7f63SJim Harris target_device = scic_sds_request_get_device(this_request);
269f11c7f63SJim Harris target_port = scic_sds_request_get_port(this_request);
270f11c7f63SJim Harris
271f11c7f63SJim Harris // Fill in the TC with the its required data
272f11c7f63SJim Harris task_context->abort = 0;
273f11c7f63SJim Harris task_context->priority = SCU_TASK_PRIORITY_NORMAL;
274f11c7f63SJim Harris task_context->initiator_request = 1;
275f11c7f63SJim Harris task_context->connection_rate =
276f11c7f63SJim Harris scic_remote_device_get_connection_rate(target_device);
277f11c7f63SJim Harris task_context->protocol_engine_index =
278f11c7f63SJim Harris scic_sds_controller_get_protocol_engine_group(owning_controller);
279f11c7f63SJim Harris task_context->logical_port_index =
280f11c7f63SJim Harris scic_sds_port_get_index(target_port);
281f11c7f63SJim Harris task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_STP;
282f11c7f63SJim Harris task_context->valid = SCU_TASK_CONTEXT_VALID;
283f11c7f63SJim Harris task_context->context_type = SCU_TASK_CONTEXT_TYPE;
284f11c7f63SJim Harris
285f11c7f63SJim Harris task_context->remote_node_index =
286f11c7f63SJim Harris scic_sds_remote_device_get_index(this_request->target_device);
287f11c7f63SJim Harris task_context->command_code = 0;
288f11c7f63SJim Harris
289f11c7f63SJim Harris task_context->link_layer_control = 0;
290f11c7f63SJim Harris task_context->do_not_dma_ssp_good_response = 1;
291f11c7f63SJim Harris task_context->strict_ordering = 0;
292f11c7f63SJim Harris task_context->control_frame = 0;
293f11c7f63SJim Harris task_context->timeout_enable = 0;
294f11c7f63SJim Harris task_context->block_guard_enable = 0;
295f11c7f63SJim Harris
296f11c7f63SJim Harris task_context->address_modifier = 0;
297f11c7f63SJim Harris task_context->task_phase = 0x01;
298f11c7f63SJim Harris
299f11c7f63SJim Harris task_context->ssp_command_iu_length =
300f11c7f63SJim Harris (sizeof(SATA_FIS_REG_H2D_T) - sizeof(U32)) / sizeof(U32);
301f11c7f63SJim Harris
302f11c7f63SJim Harris // Set the first word of the H2D REG FIS
303f11c7f63SJim Harris task_context->type.words[0] = *(U32 *)this_request->command_buffer;
304f11c7f63SJim Harris
305f11c7f63SJim Harris if (this_request->was_tag_assigned_by_user)
306f11c7f63SJim Harris {
307f11c7f63SJim Harris // Build the task context now since we have already read the data
308f11c7f63SJim Harris this_request->post_context = (
309f11c7f63SJim Harris SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC
310f11c7f63SJim Harris | (
311f11c7f63SJim Harris scic_sds_controller_get_protocol_engine_group(owning_controller)
312f11c7f63SJim Harris << SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT
313f11c7f63SJim Harris )
314f11c7f63SJim Harris | (
315f11c7f63SJim Harris scic_sds_port_get_index(target_port)
316f11c7f63SJim Harris << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT
317f11c7f63SJim Harris )
318f11c7f63SJim Harris | scic_sds_io_tag_get_index(this_request->io_tag)
319f11c7f63SJim Harris );
320f11c7f63SJim Harris }
321f11c7f63SJim Harris else
322f11c7f63SJim Harris {
323f11c7f63SJim Harris // Build the task context now since we have already read the data
324f11c7f63SJim Harris this_request->post_context = (
325f11c7f63SJim Harris SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC
326f11c7f63SJim Harris | (
327f11c7f63SJim Harris scic_sds_controller_get_protocol_engine_group(owning_controller)
328f11c7f63SJim Harris << SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT
329f11c7f63SJim Harris )
330f11c7f63SJim Harris | (
331f11c7f63SJim Harris scic_sds_port_get_index(target_port)
332f11c7f63SJim Harris << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT
333f11c7f63SJim Harris )
334f11c7f63SJim Harris // This is not assigned because we have to wait until we get a TCi
335f11c7f63SJim Harris );
336f11c7f63SJim Harris }
337f11c7f63SJim Harris
338f11c7f63SJim Harris // Copy the physical address for the command buffer to the SCU Task Context
339f11c7f63SJim Harris // We must offset the command buffer by 4 bytes because the first 4 bytes are
340453130d9SPedro F. Giffuni // transferred in the body of the TC
341f11c7f63SJim Harris scic_cb_io_request_get_physical_address(
342f11c7f63SJim Harris scic_sds_request_get_controller(this_request),
343f11c7f63SJim Harris this_request,
344f11c7f63SJim Harris ((char *)this_request->command_buffer) + sizeof(U32),
345f11c7f63SJim Harris &physical_address
346f11c7f63SJim Harris );
347f11c7f63SJim Harris
348f11c7f63SJim Harris task_context->command_iu_upper =
349f11c7f63SJim Harris sci_cb_physical_address_upper(physical_address);
350f11c7f63SJim Harris task_context->command_iu_lower =
351f11c7f63SJim Harris sci_cb_physical_address_lower(physical_address);
352f11c7f63SJim Harris
353f11c7f63SJim Harris // SATA Requests do not have a response buffer
354f11c7f63SJim Harris task_context->response_iu_upper = 0;
355f11c7f63SJim Harris task_context->response_iu_lower = 0;
356f11c7f63SJim Harris }
357f11c7f63SJim Harris
358f11c7f63SJim Harris /**
359f11c7f63SJim Harris * This method will perform any general sata request construction.
360f11c7f63SJim Harris *
361f11c7f63SJim Harris * @todo What part of SATA IO request construction is general?
362f11c7f63SJim Harris *
363f11c7f63SJim Harris * @param[in] this_request
364f11c7f63SJim Harris *
365f11c7f63SJim Harris * @return none
366f11c7f63SJim Harris */
scic_sds_stp_non_ncq_request_construct(SCIC_SDS_REQUEST_T * this_request)367f11c7f63SJim Harris void scic_sds_stp_non_ncq_request_construct(
368f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request
369f11c7f63SJim Harris )
370f11c7f63SJim Harris {
371f11c7f63SJim Harris this_request->has_started_substate_machine = TRUE;
372f11c7f63SJim Harris }
373f11c7f63SJim Harris
374f11c7f63SJim Harris /**
375f11c7f63SJim Harris * This method will perform request construction common to all types of
376f11c7f63SJim Harris * STP requests that are optimized by the silicon (i.e. UDMA, NCQ).
377f11c7f63SJim Harris *
378f11c7f63SJim Harris * @param[in,out] this_request This parameter specifies the request to be
379f11c7f63SJim Harris * constructed as an optimized request.
380f11c7f63SJim Harris * @param[in] optimized_task_type This parameter specifies whether the
381f11c7f63SJim Harris * request is to be an UDMA request or a NCQ request.
382f11c7f63SJim Harris * - A value of 0 indicates UDMA.
383f11c7f63SJim Harris * - A value of 1 indicates NCQ.
384f11c7f63SJim Harris *
385f11c7f63SJim Harris * @return This method returns an indication as to whether the construction
386f11c7f63SJim Harris * was successful.
387f11c7f63SJim Harris */
388f11c7f63SJim Harris static
scic_sds_stp_optimized_request_construct(SCIC_SDS_REQUEST_T * this_request,U8 optimized_task_type,U32 transfer_length,SCI_IO_REQUEST_DATA_DIRECTION data_direction)389f11c7f63SJim Harris void scic_sds_stp_optimized_request_construct(
390f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
391f11c7f63SJim Harris U8 optimized_task_type,
392f11c7f63SJim Harris U32 transfer_length,
393f11c7f63SJim Harris SCI_IO_REQUEST_DATA_DIRECTION data_direction
394f11c7f63SJim Harris )
395f11c7f63SJim Harris {
396f11c7f63SJim Harris SCU_TASK_CONTEXT_T * task_context = this_request->task_context_buffer;
397f11c7f63SJim Harris
398f11c7f63SJim Harris // Build the STP task context structure
399f11c7f63SJim Harris scu_sata_reqeust_construct_task_context(this_request, task_context);
400f11c7f63SJim Harris
401453130d9SPedro F. Giffuni // Copy over the number of bytes to be transferred
402f11c7f63SJim Harris task_context->transfer_length_bytes = transfer_length;
403f11c7f63SJim Harris
404f11c7f63SJim Harris if ( data_direction == SCI_IO_REQUEST_DATA_OUT )
405f11c7f63SJim Harris {
406f11c7f63SJim Harris // The difference between the DMA IN and DMA OUT request task type
407f11c7f63SJim Harris // values are consistent with the difference between FPDMA READ
408f11c7f63SJim Harris // and FPDMA WRITE values. Add the supplied task type parameter
409f11c7f63SJim Harris // to this difference to set the task type properly for this
410f11c7f63SJim Harris // DATA OUT (WRITE) case.
411f11c7f63SJim Harris task_context->task_type = optimized_task_type + (SCU_TASK_TYPE_DMA_OUT
412f11c7f63SJim Harris - SCU_TASK_TYPE_DMA_IN);
413f11c7f63SJim Harris }
414f11c7f63SJim Harris else
415f11c7f63SJim Harris {
416f11c7f63SJim Harris // For the DATA IN (READ) case, simply save the supplied
417f11c7f63SJim Harris // optimized task type.
418f11c7f63SJim Harris task_context->task_type = optimized_task_type;
419f11c7f63SJim Harris }
420f11c7f63SJim Harris }
421f11c7f63SJim Harris
422f11c7f63SJim Harris /**
423f11c7f63SJim Harris * This method performs the operations common to all SATA/STP requests
424f11c7f63SJim Harris * utilizing the raw frame method.
425f11c7f63SJim Harris *
426f11c7f63SJim Harris * @param[in] this_request This parameter specifies the STP request object
427f11c7f63SJim Harris * for which to construct a RAW command frame task context.
428f11c7f63SJim Harris * @param[in] task_context This parameter specifies the SCU specific
429f11c7f63SJim Harris * task context buffer to construct.
430f11c7f63SJim Harris *
431f11c7f63SJim Harris * @return none
432f11c7f63SJim Harris */
scu_stp_raw_request_construct_task_context(SCIC_SDS_STP_REQUEST_T * this_request,SCU_TASK_CONTEXT_T * task_context)433f11c7f63SJim Harris void scu_stp_raw_request_construct_task_context(
434f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request,
435f11c7f63SJim Harris SCU_TASK_CONTEXT_T * task_context
436f11c7f63SJim Harris )
437f11c7f63SJim Harris {
438f11c7f63SJim Harris scu_sata_reqeust_construct_task_context(&this_request->parent, task_context);
439f11c7f63SJim Harris
440f11c7f63SJim Harris task_context->control_frame = 0;
441f11c7f63SJim Harris task_context->priority = SCU_TASK_PRIORITY_NORMAL;
442f11c7f63SJim Harris task_context->task_type = SCU_TASK_TYPE_SATA_RAW_FRAME;
443f11c7f63SJim Harris task_context->type.stp.fis_type = SATA_FIS_TYPE_REGH2D;
444f11c7f63SJim Harris task_context->transfer_length_bytes = sizeof(SATA_FIS_REG_H2D_T) - sizeof(U32);
445f11c7f63SJim Harris }
446f11c7f63SJim Harris
447f11c7f63SJim Harris /**
448f11c7f63SJim Harris * This method will construct the STP Non-data request and its associated
449f11c7f63SJim Harris * TC data. A non-data request essentially behaves like a 0 length read
450f11c7f63SJim Harris * request in the SCU.
451f11c7f63SJim Harris *
452f11c7f63SJim Harris * @param[in] this_request This parameter specifies the core request
453f11c7f63SJim Harris * object to construction into an STP/SATA non-data request.
454f11c7f63SJim Harris *
455f11c7f63SJim Harris * @return This method currently always returns SCI_SUCCESS
456f11c7f63SJim Harris */
scic_sds_stp_non_data_request_construct(SCIC_SDS_REQUEST_T * this_request)457f11c7f63SJim Harris SCI_STATUS scic_sds_stp_non_data_request_construct(
458f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request
459f11c7f63SJim Harris )
460f11c7f63SJim Harris {
461f11c7f63SJim Harris scic_sds_stp_non_ncq_request_construct(this_request);
462f11c7f63SJim Harris
463f11c7f63SJim Harris // Build the STP task context structure
464f11c7f63SJim Harris scu_stp_raw_request_construct_task_context(
465f11c7f63SJim Harris (SCIC_SDS_STP_REQUEST_T*) this_request,
466f11c7f63SJim Harris this_request->task_context_buffer
467f11c7f63SJim Harris );
468f11c7f63SJim Harris
469f11c7f63SJim Harris sci_base_state_machine_construct(
470f11c7f63SJim Harris &this_request->started_substate_machine,
471f11c7f63SJim Harris &this_request->parent.parent,
472f11c7f63SJim Harris scic_sds_stp_request_started_non_data_substate_table,
473f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE
474f11c7f63SJim Harris );
475f11c7f63SJim Harris
476f11c7f63SJim Harris return SCI_SUCCESS;
477f11c7f63SJim Harris }
478f11c7f63SJim Harris
479f11c7f63SJim Harris
scic_sds_stp_soft_reset_request_construct(SCIC_SDS_REQUEST_T * this_request)480f11c7f63SJim Harris SCI_STATUS scic_sds_stp_soft_reset_request_construct(
481f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request
482f11c7f63SJim Harris )
483f11c7f63SJim Harris {
484f11c7f63SJim Harris scic_sds_stp_non_ncq_request_construct(this_request);
485f11c7f63SJim Harris
486f11c7f63SJim Harris // Build the STP task context structure
487f11c7f63SJim Harris scu_stp_raw_request_construct_task_context(
488f11c7f63SJim Harris (SCIC_SDS_STP_REQUEST_T*) this_request,
489f11c7f63SJim Harris this_request->task_context_buffer
490f11c7f63SJim Harris );
491f11c7f63SJim Harris
492f11c7f63SJim Harris sci_base_state_machine_construct(
493f11c7f63SJim Harris &this_request->started_substate_machine,
494f11c7f63SJim Harris &this_request->parent.parent,
495f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_table,
496f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE
497f11c7f63SJim Harris );
498f11c7f63SJim Harris
499f11c7f63SJim Harris return SCI_SUCCESS;
500f11c7f63SJim Harris }
501f11c7f63SJim Harris
502f11c7f63SJim Harris /**
503f11c7f63SJim Harris * @brief This method constructs the SATA request object.
504f11c7f63SJim Harris *
505f11c7f63SJim Harris * @param[in] this_request
506f11c7f63SJim Harris * @param[in] sat_protocol
507f11c7f63SJim Harris * @param[in] transfer_length
508f11c7f63SJim Harris * @param[in] data_direction
509f11c7f63SJim Harris * @param[in] copy_rx_frame
510f11c7f63SJim Harris * @param[in] do_translate_sgl This parameter specifies whether SGL
511f11c7f63SJim Harris * translation should be performed or if the user is handling
512f11c7f63SJim Harris * it.
513f11c7f63SJim Harris *
514f11c7f63SJim Harris * @return SCI_STATUS
515f11c7f63SJim Harris */
scic_sds_io_request_construct_sata(SCIC_SDS_REQUEST_T * this_request,U8 sat_protocol,U32 transfer_length,SCI_IO_REQUEST_DATA_DIRECTION data_direction,BOOL copy_rx_frame,BOOL do_translate_sgl)516f11c7f63SJim Harris SCI_STATUS scic_sds_io_request_construct_sata(
517f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
518f11c7f63SJim Harris U8 sat_protocol,
519f11c7f63SJim Harris U32 transfer_length,
520f11c7f63SJim Harris SCI_IO_REQUEST_DATA_DIRECTION data_direction,
521f11c7f63SJim Harris BOOL copy_rx_frame,
522f11c7f63SJim Harris BOOL do_translate_sgl
523f11c7f63SJim Harris )
524f11c7f63SJim Harris {
525f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
526f11c7f63SJim Harris
527f11c7f63SJim Harris this_request->protocol = SCIC_STP_PROTOCOL;
528f11c7f63SJim Harris
529f11c7f63SJim Harris this_request->sat_protocol = sat_protocol;
530f11c7f63SJim Harris
531f11c7f63SJim Harris switch (sat_protocol)
532f11c7f63SJim Harris {
533f11c7f63SJim Harris case SAT_PROTOCOL_FPDMA:
534f11c7f63SJim Harris scic_sds_stp_optimized_request_construct(
535f11c7f63SJim Harris this_request,
536f11c7f63SJim Harris SCU_TASK_TYPE_FPDMAQ_READ,
537f11c7f63SJim Harris transfer_length,
538f11c7f63SJim Harris data_direction
539f11c7f63SJim Harris );
540f11c7f63SJim Harris
541f11c7f63SJim Harris // Copy over the SGL elements
542f11c7f63SJim Harris if (do_translate_sgl == TRUE)
543f11c7f63SJim Harris scic_sds_request_build_sgl(this_request);
544f11c7f63SJim Harris break;
545f11c7f63SJim Harris
546f11c7f63SJim Harris case SAT_PROTOCOL_UDMA_DATA_IN:
547f11c7f63SJim Harris case SAT_PROTOCOL_UDMA_DATA_OUT:
548f11c7f63SJim Harris scic_sds_stp_non_ncq_request_construct(this_request);
549f11c7f63SJim Harris
550f11c7f63SJim Harris scic_sds_stp_optimized_request_construct(
551f11c7f63SJim Harris this_request, SCU_TASK_TYPE_DMA_IN, transfer_length, data_direction
552f11c7f63SJim Harris );
553f11c7f63SJim Harris
554f11c7f63SJim Harris // Copy over the SGL elements
555f11c7f63SJim Harris if (do_translate_sgl == TRUE)
556f11c7f63SJim Harris scic_sds_request_build_sgl(this_request);
557f11c7f63SJim Harris
558f11c7f63SJim Harris sci_base_state_machine_construct(
559f11c7f63SJim Harris &this_request->started_substate_machine,
560f11c7f63SJim Harris &this_request->parent.parent,
561f11c7f63SJim Harris scic_sds_stp_request_started_udma_substate_table,
562f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE
563f11c7f63SJim Harris );
564f11c7f63SJim Harris break;
565f11c7f63SJim Harris
566f11c7f63SJim Harris case SAT_PROTOCOL_PIO_DATA_IN:
567f11c7f63SJim Harris case SAT_PROTOCOL_PIO_DATA_OUT:
568f11c7f63SJim Harris status = scic_sds_stp_pio_request_construct(
569f11c7f63SJim Harris this_request, sat_protocol, copy_rx_frame);
570f11c7f63SJim Harris break;
571f11c7f63SJim Harris
572f11c7f63SJim Harris case SAT_PROTOCOL_ATA_HARD_RESET:
573f11c7f63SJim Harris case SAT_PROTOCOL_SOFT_RESET:
574f11c7f63SJim Harris status = scic_sds_stp_soft_reset_request_construct(this_request);
575f11c7f63SJim Harris break;
576f11c7f63SJim Harris
577f11c7f63SJim Harris case SAT_PROTOCOL_NON_DATA:
578f11c7f63SJim Harris status = scic_sds_stp_non_data_request_construct(this_request);
579f11c7f63SJim Harris break;
580f11c7f63SJim Harris
581f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
582f11c7f63SJim Harris case SAT_PROTOCOL_PACKET_NON_DATA:
583f11c7f63SJim Harris case SAT_PROTOCOL_PACKET_DMA_DATA_IN:
584f11c7f63SJim Harris case SAT_PROTOCOL_PACKET_DMA_DATA_OUT:
585f11c7f63SJim Harris case SAT_PROTOCOL_PACKET_PIO_DATA_IN:
586f11c7f63SJim Harris case SAT_PROTOCOL_PACKET_PIO_DATA_OUT:
587f11c7f63SJim Harris status = scic_sds_stp_packet_request_construct(this_request);
588f11c7f63SJim Harris if (do_translate_sgl == TRUE)
589f11c7f63SJim Harris scic_sds_request_build_sgl(this_request);
590f11c7f63SJim Harris break;
591f11c7f63SJim Harris #endif
592f11c7f63SJim Harris
593f11c7f63SJim Harris case SAT_PROTOCOL_DMA_QUEUED:
594f11c7f63SJim Harris case SAT_PROTOCOL_DMA:
595f11c7f63SJim Harris case SAT_PROTOCOL_DEVICE_DIAGNOSTIC:
596f11c7f63SJim Harris case SAT_PROTOCOL_DEVICE_RESET:
597f11c7f63SJim Harris case SAT_PROTOCOL_RETURN_RESPONSE_INFO:
598f11c7f63SJim Harris default:
599f11c7f63SJim Harris SCIC_LOG_ERROR((
600f11c7f63SJim Harris sci_base_object_get_logger(this_request),
601f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
602f11c7f63SJim Harris "SCIC IO Request 0x%x received un-handled SAT Protocol %d.\n",
603f11c7f63SJim Harris this_request, sat_protocol
604f11c7f63SJim Harris ));
605f11c7f63SJim Harris
606f11c7f63SJim Harris status = SCI_FAILURE;
607f11c7f63SJim Harris break;
608f11c7f63SJim Harris }
609f11c7f63SJim Harris
610f11c7f63SJim Harris if (status == SCI_SUCCESS)
611f11c7f63SJim Harris {
612f11c7f63SJim Harris scic_sds_request_initialize_state_logging(this_request);
613f11c7f63SJim Harris
614f11c7f63SJim Harris sci_base_state_machine_change_state(
615f11c7f63SJim Harris &this_request->parent.state_machine,
616f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_CONSTRUCTED
617f11c7f63SJim Harris );
618f11c7f63SJim Harris }
619f11c7f63SJim Harris
620f11c7f63SJim Harris return status;
621f11c7f63SJim Harris }
622f11c7f63SJim Harris
623f11c7f63SJim Harris //****************************************************************************
624f11c7f63SJim Harris //* SCIC Interface Implementation
625f11c7f63SJim Harris //****************************************************************************
626f11c7f63SJim Harris
scic_stp_io_request_set_ncq_tag(SCI_IO_REQUEST_HANDLE_T scic_io_request,U16 ncq_tag)627f11c7f63SJim Harris void scic_stp_io_request_set_ncq_tag(
628f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T scic_io_request,
629f11c7f63SJim Harris U16 ncq_tag
630f11c7f63SJim Harris )
631f11c7f63SJim Harris {
632f11c7f63SJim Harris /**
633f11c7f63SJim Harris * @note This could be made to return an error to the user if the user
634f11c7f63SJim Harris * attempts to set the NCQ tag in the wrong state.
635f11c7f63SJim Harris */
636f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request = (SCIC_SDS_REQUEST_T *)scic_io_request;
637f11c7f63SJim Harris this_request->task_context_buffer->type.stp.ncq_tag = ncq_tag;
638f11c7f63SJim Harris }
639f11c7f63SJim Harris
640f11c7f63SJim Harris // ---------------------------------------------------------------------------
641f11c7f63SJim Harris
scic_stp_io_request_get_h2d_reg_address(SCI_IO_REQUEST_HANDLE_T scic_io_request)642f11c7f63SJim Harris void * scic_stp_io_request_get_h2d_reg_address(
643f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T scic_io_request
644f11c7f63SJim Harris )
645f11c7f63SJim Harris {
646f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request = (SCIC_SDS_REQUEST_T *)scic_io_request;
647f11c7f63SJim Harris
648f11c7f63SJim Harris return this_request->command_buffer;
649f11c7f63SJim Harris }
650f11c7f63SJim Harris
651f11c7f63SJim Harris // ---------------------------------------------------------------------------
652f11c7f63SJim Harris
scic_stp_io_request_get_d2h_reg_address(SCI_IO_REQUEST_HANDLE_T scic_io_request)653f11c7f63SJim Harris void * scic_stp_io_request_get_d2h_reg_address(
654f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T scic_io_request
655f11c7f63SJim Harris )
656f11c7f63SJim Harris {
657f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request = (SCIC_SDS_STP_REQUEST_T *)scic_io_request;
658f11c7f63SJim Harris
659f11c7f63SJim Harris return &this_request->d2h_reg_fis;
660f11c7f63SJim Harris }
661f11c7f63SJim Harris
662f11c7f63SJim Harris /**
663f11c7f63SJim Harris * Get the next SGL element from the request.
664f11c7f63SJim Harris * - Check on which SGL element pair we are working
665f11c7f63SJim Harris * - if working on SLG pair element A
666f11c7f63SJim Harris * - advance to element B
667f11c7f63SJim Harris * - else
668f11c7f63SJim Harris * - check to see if there are more SGL element pairs
669f11c7f63SJim Harris * for this IO request
670f11c7f63SJim Harris * - if there are more SGL element pairs
671f11c7f63SJim Harris * - advance to the next pair and return element A
672f11c7f63SJim Harris *
673f11c7f63SJim Harris * @param[in] this_request
674f11c7f63SJim Harris *
675f11c7f63SJim Harris * @return SCU_SGL_ELEMENT_T*
676f11c7f63SJim Harris */
scic_sds_stp_request_pio_get_next_sgl(SCIC_SDS_STP_REQUEST_T * this_request)677f11c7f63SJim Harris SCU_SGL_ELEMENT_T * scic_sds_stp_request_pio_get_next_sgl(
678f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request
679f11c7f63SJim Harris )
680f11c7f63SJim Harris {
681f11c7f63SJim Harris SCU_SGL_ELEMENT_T * current_sgl;
682f11c7f63SJim Harris
683f11c7f63SJim Harris if (this_request->type.pio.request_current.sgl_set == SCU_SGL_ELEMENT_PAIR_A)
684f11c7f63SJim Harris {
685f11c7f63SJim Harris if (
686f11c7f63SJim Harris (this_request->type.pio.request_current.sgl_pair->B.address_lower == 0)
687f11c7f63SJim Harris && (this_request->type.pio.request_current.sgl_pair->B.address_upper == 0)
688f11c7f63SJim Harris )
689f11c7f63SJim Harris {
690f11c7f63SJim Harris current_sgl = NULL;
691f11c7f63SJim Harris }
692f11c7f63SJim Harris else
693f11c7f63SJim Harris {
694f11c7f63SJim Harris this_request->type.pio.request_current.sgl_set = SCU_SGL_ELEMENT_PAIR_B;
695f11c7f63SJim Harris current_sgl = &(this_request->type.pio.request_current.sgl_pair->B);
696f11c7f63SJim Harris }
697f11c7f63SJim Harris }
698f11c7f63SJim Harris else
699f11c7f63SJim Harris {
700f11c7f63SJim Harris if (
701f11c7f63SJim Harris (this_request->type.pio.request_current.sgl_pair->next_pair_lower == 0)
702f11c7f63SJim Harris && (this_request->type.pio.request_current.sgl_pair->next_pair_upper == 0)
703f11c7f63SJim Harris )
704f11c7f63SJim Harris {
705f11c7f63SJim Harris current_sgl = NULL;
706f11c7f63SJim Harris }
707f11c7f63SJim Harris else
708f11c7f63SJim Harris {
709f11c7f63SJim Harris this_request->type.pio.request_current.sgl_pair =
710f11c7f63SJim Harris scic_sds_request_get_sgl_element_pair(
711f11c7f63SJim Harris &(this_request->parent),
712f11c7f63SJim Harris ++this_request->type.pio.sgl_pair_index
713f11c7f63SJim Harris );
714f11c7f63SJim Harris
715f11c7f63SJim Harris this_request->type.pio.request_current.sgl_set = SCU_SGL_ELEMENT_PAIR_A;
716f11c7f63SJim Harris
717f11c7f63SJim Harris current_sgl = &(this_request->type.pio.request_current.sgl_pair->A);
718f11c7f63SJim Harris }
719f11c7f63SJim Harris }
720f11c7f63SJim Harris
721f11c7f63SJim Harris return current_sgl;
722f11c7f63SJim Harris }
723f11c7f63SJim Harris
724f11c7f63SJim Harris /**
725f11c7f63SJim Harris * This method will construct the SATA PIO request.
726f11c7f63SJim Harris *
727f11c7f63SJim Harris * @param[in] scic_io_request The core request object which is cast to a SATA
728f11c7f63SJim Harris * PIO request object.
729f11c7f63SJim Harris *
730f11c7f63SJim Harris * @return This method returns an indication as to whether the construction
731f11c7f63SJim Harris * was successful.
732f11c7f63SJim Harris * @retval SCI_SUCCESS Currently this method always returns this value.
733f11c7f63SJim Harris */
scic_sds_stp_pio_request_construct(SCIC_SDS_REQUEST_T * scic_io_request,U8 sat_protocol,BOOL copy_rx_frame)734f11c7f63SJim Harris SCI_STATUS scic_sds_stp_pio_request_construct(
735f11c7f63SJim Harris SCIC_SDS_REQUEST_T * scic_io_request,
736f11c7f63SJim Harris U8 sat_protocol,
737f11c7f63SJim Harris BOOL copy_rx_frame
738f11c7f63SJim Harris )
739f11c7f63SJim Harris {
740f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request;
741f11c7f63SJim Harris
742f11c7f63SJim Harris this_request = (SCIC_SDS_STP_REQUEST_T *)scic_io_request;
743f11c7f63SJim Harris
744f11c7f63SJim Harris scic_sds_stp_non_ncq_request_construct(&this_request->parent);
745f11c7f63SJim Harris
746f11c7f63SJim Harris scu_stp_raw_request_construct_task_context(
747f11c7f63SJim Harris this_request, this_request->parent.task_context_buffer
748f11c7f63SJim Harris );
749f11c7f63SJim Harris
750f11c7f63SJim Harris this_request->type.pio.current_transfer_bytes = 0;
751f11c7f63SJim Harris this_request->type.pio.ending_error = 0;
752f11c7f63SJim Harris this_request->type.pio.ending_status = 0;
753f11c7f63SJim Harris
754f11c7f63SJim Harris this_request->type.pio.request_current.sgl_offset = 0;
755f11c7f63SJim Harris this_request->type.pio.request_current.sgl_set = SCU_SGL_ELEMENT_PAIR_A;
756f11c7f63SJim Harris this_request->type.pio.sat_protocol = sat_protocol;
757f11c7f63SJim Harris this_request->type.pio.sgl_pair_index = 0;
758f11c7f63SJim Harris
759f11c7f63SJim Harris if ((copy_rx_frame) || (sat_protocol == SAT_PROTOCOL_PIO_DATA_OUT))
760f11c7f63SJim Harris {
761f11c7f63SJim Harris scic_sds_request_build_sgl(&this_request->parent);
762f11c7f63SJim Harris // Since the IO request copy of the TC contains the same data as
763f11c7f63SJim Harris // the actual TC this pointer is vaild for either.
764f11c7f63SJim Harris this_request->type.pio.request_current.sgl_pair =
765f11c7f63SJim Harris &this_request->parent.task_context_buffer->sgl_pair_ab;
766f11c7f63SJim Harris }
767f11c7f63SJim Harris else
768f11c7f63SJim Harris {
769f11c7f63SJim Harris // The user does not want the data copied to the SGL buffer location
770f11c7f63SJim Harris this_request->type.pio.request_current.sgl_pair = NULL;
771f11c7f63SJim Harris }
772f11c7f63SJim Harris
773f11c7f63SJim Harris sci_base_state_machine_construct(
774f11c7f63SJim Harris &this_request->parent.started_substate_machine,
775f11c7f63SJim Harris &this_request->parent.parent.parent,
776f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_table,
777f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_H2D_COMPLETION_SUBSTATE
778f11c7f63SJim Harris );
779f11c7f63SJim Harris
780f11c7f63SJim Harris return SCI_SUCCESS;
781f11c7f63SJim Harris }
782f11c7f63SJim Harris
783f11c7f63SJim Harris //******************************************************************************
784f11c7f63SJim Harris //* STP NON-DATA STATE MACHINE
785f11c7f63SJim Harris //******************************************************************************
786f11c7f63SJim Harris
787f11c7f63SJim Harris /**
788f11c7f63SJim Harris * This method processes a TC completion. The expected TC completion is
789f11c7f63SJim Harris * for the transmission of the H2D register FIS containing the SATA/STP
790f11c7f63SJim Harris * non-data request.
791f11c7f63SJim Harris *
792f11c7f63SJim Harris * @param[in] this_request
793f11c7f63SJim Harris * @param[in] completion_code
794f11c7f63SJim Harris *
795f11c7f63SJim Harris * @return This method always successfully processes the TC completion.
796f11c7f63SJim Harris * @retval SCI_SUCCESS This value is always returned.
797f11c7f63SJim Harris */
798f11c7f63SJim Harris static
scic_sds_stp_request_non_data_await_h2d_tc_completion_handler(SCIC_SDS_REQUEST_T * this_request,U32 completion_code)799f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_non_data_await_h2d_tc_completion_handler(
800f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
801f11c7f63SJim Harris U32 completion_code
802f11c7f63SJim Harris )
803f11c7f63SJim Harris {
804f11c7f63SJim Harris SCIC_LOG_TRACE((
805f11c7f63SJim Harris sci_base_object_get_logger(this_request),
806f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
807f11c7f63SJim Harris "scic_sds_stp_request_non_data_await_h2d_tc_completion_handler(0x%x, 0x%x) enter\n",
808f11c7f63SJim Harris this_request, completion_code
809f11c7f63SJim Harris ));
810f11c7f63SJim Harris
811f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
812f11c7f63SJim Harris {
813f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
814f11c7f63SJim Harris scic_sds_request_set_status(
815f11c7f63SJim Harris this_request, SCU_TASK_DONE_GOOD, SCI_SUCCESS
816f11c7f63SJim Harris );
817f11c7f63SJim Harris
818f11c7f63SJim Harris sci_base_state_machine_change_state(
819f11c7f63SJim Harris &this_request->started_substate_machine,
820f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE
821f11c7f63SJim Harris );
822f11c7f63SJim Harris break;
823f11c7f63SJim Harris
824f11c7f63SJim Harris default:
825f11c7f63SJim Harris // All other completion status cause the IO to be complete. If a NAK
826f11c7f63SJim Harris // was received, then it is up to the user to retry the request.
827f11c7f63SJim Harris scic_sds_request_set_status(
828f11c7f63SJim Harris this_request,
829f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
830f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
831f11c7f63SJim Harris );
832f11c7f63SJim Harris
833f11c7f63SJim Harris sci_base_state_machine_change_state(
834f11c7f63SJim Harris &this_request->parent.state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
835f11c7f63SJim Harris );
836f11c7f63SJim Harris break;
837f11c7f63SJim Harris }
838f11c7f63SJim Harris
839f11c7f63SJim Harris return SCI_SUCCESS;
840f11c7f63SJim Harris }
841f11c7f63SJim Harris
842f11c7f63SJim Harris /**
843f11c7f63SJim Harris * This method processes frames received from the target while waiting
844f11c7f63SJim Harris * for a device to host register FIS. If a non-register FIS is received
845f11c7f63SJim Harris * during this time, it is treated as a protocol violation from an
846f11c7f63SJim Harris * IO perspective.
847f11c7f63SJim Harris *
848f11c7f63SJim Harris * @param[in] request This parameter specifies the request for which a
849f11c7f63SJim Harris * frame has been received.
850f11c7f63SJim Harris * @param[in] frame_index This parameter specifies the index of the frame
851f11c7f63SJim Harris * that has been received.
852f11c7f63SJim Harris *
853f11c7f63SJim Harris * @return Indicate if the received frame was processed successfully.
854f11c7f63SJim Harris */
855f11c7f63SJim Harris static
scic_sds_stp_request_non_data_await_d2h_frame_handler(SCIC_SDS_REQUEST_T * request,U32 frame_index)856f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_non_data_await_d2h_frame_handler(
857f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
858f11c7f63SJim Harris U32 frame_index
859f11c7f63SJim Harris )
860f11c7f63SJim Harris {
861f11c7f63SJim Harris SCI_STATUS status;
862f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
863f11c7f63SJim Harris U32 * frame_buffer;
864f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request = (SCIC_SDS_STP_REQUEST_T *)request;
865f11c7f63SJim Harris
866f11c7f63SJim Harris // Save off the controller, so that we do not touch the request after it
867f11c7f63SJim Harris // is completed.
868f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T * owning_controller = this_request->parent.owning_controller;
869f11c7f63SJim Harris
870f11c7f63SJim Harris SCIC_LOG_TRACE((
871f11c7f63SJim Harris sci_base_object_get_logger(this_request),
872f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
873f11c7f63SJim Harris "scic_sds_stp_request_non_data_await_d2h_frame_handler(0x%x, 0x%x) enter\n",
874f11c7f63SJim Harris this_request, frame_index
875f11c7f63SJim Harris ));
876f11c7f63SJim Harris
877f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
878f11c7f63SJim Harris &(owning_controller->uf_control),
879f11c7f63SJim Harris frame_index,
880f11c7f63SJim Harris (void**) &frame_header
881f11c7f63SJim Harris );
882f11c7f63SJim Harris
883f11c7f63SJim Harris if (status == SCI_SUCCESS)
884f11c7f63SJim Harris {
885f11c7f63SJim Harris switch (frame_header->fis_type)
886f11c7f63SJim Harris {
887f11c7f63SJim Harris case SATA_FIS_TYPE_REGD2H:
888f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
889f11c7f63SJim Harris &(owning_controller->uf_control),
890f11c7f63SJim Harris frame_index,
891f11c7f63SJim Harris (void**) &frame_buffer
892f11c7f63SJim Harris );
893f11c7f63SJim Harris
894f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
895f11c7f63SJim Harris &this_request->d2h_reg_fis, (U32 *)frame_header, frame_buffer
896f11c7f63SJim Harris );
897f11c7f63SJim Harris
898f11c7f63SJim Harris // The command has completed with error
899f11c7f63SJim Harris scic_sds_request_set_status(
900f11c7f63SJim Harris &this_request->parent,
901f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
902f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
903f11c7f63SJim Harris );
904f11c7f63SJim Harris break;
905f11c7f63SJim Harris
906f11c7f63SJim Harris default:
907f11c7f63SJim Harris SCIC_LOG_WARNING((
908f11c7f63SJim Harris sci_base_object_get_logger(this_request),
909f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
910f11c7f63SJim Harris "IO Request:0x%x Frame Id:%d protocol violation occurred\n",
911f11c7f63SJim Harris this_request, frame_index
912f11c7f63SJim Harris ));
913f11c7f63SJim Harris
914f11c7f63SJim Harris scic_sds_request_set_status(
915f11c7f63SJim Harris &this_request->parent,
916f11c7f63SJim Harris SCU_TASK_DONE_UNEXP_FIS,
917f11c7f63SJim Harris SCI_FAILURE_PROTOCOL_VIOLATION
918f11c7f63SJim Harris );
919f11c7f63SJim Harris break;
920f11c7f63SJim Harris }
921f11c7f63SJim Harris
922f11c7f63SJim Harris sci_base_state_machine_change_state(
923f11c7f63SJim Harris &this_request->parent.parent.state_machine,
924f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
925f11c7f63SJim Harris );
926f11c7f63SJim Harris
927f11c7f63SJim Harris // Frame has been decoded return it to the controller
928f11c7f63SJim Harris scic_sds_controller_release_frame(
929f11c7f63SJim Harris owning_controller, frame_index
930f11c7f63SJim Harris );
931f11c7f63SJim Harris }
932f11c7f63SJim Harris else
933f11c7f63SJim Harris {
934f11c7f63SJim Harris SCIC_LOG_ERROR((
935f11c7f63SJim Harris sci_base_object_get_logger(this_request),
936f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
937f11c7f63SJim Harris "SCIC IO Request 0x%x could not get frame header for frame index %d, status %x\n",
938f11c7f63SJim Harris this_request, frame_index, status
939f11c7f63SJim Harris ));
940f11c7f63SJim Harris }
941f11c7f63SJim Harris
942f11c7f63SJim Harris return status;
943f11c7f63SJim Harris }
944f11c7f63SJim Harris
945f11c7f63SJim Harris // ---------------------------------------------------------------------------
946f11c7f63SJim Harris
947f11c7f63SJim Harris SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
948f11c7f63SJim Harris scic_sds_stp_request_started_non_data_substate_handler_table
949f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES] =
950f11c7f63SJim Harris {
951f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE
952f11c7f63SJim Harris {
953f11c7f63SJim Harris {
954f11c7f63SJim Harris scic_sds_request_default_start_handler,
955f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
956f11c7f63SJim Harris scic_sds_request_default_complete_handler,
957f11c7f63SJim Harris scic_sds_request_default_destruct_handler
958f11c7f63SJim Harris },
959f11c7f63SJim Harris scic_sds_stp_request_non_data_await_h2d_tc_completion_handler,
960f11c7f63SJim Harris scic_sds_request_default_event_handler,
961f11c7f63SJim Harris scic_sds_request_default_frame_handler
962f11c7f63SJim Harris },
963f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE
964f11c7f63SJim Harris {
965f11c7f63SJim Harris {
966f11c7f63SJim Harris scic_sds_request_default_start_handler,
967f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
968f11c7f63SJim Harris scic_sds_request_default_complete_handler,
969f11c7f63SJim Harris scic_sds_request_default_destruct_handler
970f11c7f63SJim Harris },
971f11c7f63SJim Harris scic_sds_request_default_tc_completion_handler,
972f11c7f63SJim Harris scic_sds_request_default_event_handler,
973f11c7f63SJim Harris scic_sds_stp_request_non_data_await_d2h_frame_handler
974f11c7f63SJim Harris }
975f11c7f63SJim Harris };
976f11c7f63SJim Harris
977f11c7f63SJim Harris static
scic_sds_stp_request_started_non_data_await_h2d_completion_enter(SCI_BASE_OBJECT_T * object)978f11c7f63SJim Harris void scic_sds_stp_request_started_non_data_await_h2d_completion_enter(
979f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
980f11c7f63SJim Harris )
981f11c7f63SJim Harris {
982f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
983f11c7f63SJim Harris
984f11c7f63SJim Harris SET_STATE_HANDLER(
985f11c7f63SJim Harris this_request,
986f11c7f63SJim Harris scic_sds_stp_request_started_non_data_substate_handler_table,
987f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE
988f11c7f63SJim Harris );
989f11c7f63SJim Harris
990f11c7f63SJim Harris scic_sds_remote_device_set_working_request(
991f11c7f63SJim Harris this_request->target_device, this_request
992f11c7f63SJim Harris );
993f11c7f63SJim Harris }
994f11c7f63SJim Harris
995f11c7f63SJim Harris static
scic_sds_stp_request_started_non_data_await_d2h_enter(SCI_BASE_OBJECT_T * object)996f11c7f63SJim Harris void scic_sds_stp_request_started_non_data_await_d2h_enter(
997f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
998f11c7f63SJim Harris )
999f11c7f63SJim Harris {
1000f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
1001f11c7f63SJim Harris
1002f11c7f63SJim Harris SET_STATE_HANDLER(
1003f11c7f63SJim Harris this_request,
1004f11c7f63SJim Harris scic_sds_stp_request_started_non_data_substate_handler_table,
1005f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE
1006f11c7f63SJim Harris );
1007f11c7f63SJim Harris }
1008f11c7f63SJim Harris
1009f11c7f63SJim Harris // ---------------------------------------------------------------------------
1010f11c7f63SJim Harris
1011f11c7f63SJim Harris SCI_BASE_STATE_T scic_sds_stp_request_started_non_data_substate_table
1012f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES] =
1013f11c7f63SJim Harris {
1014f11c7f63SJim Harris {
1015f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE,
1016f11c7f63SJim Harris scic_sds_stp_request_started_non_data_await_h2d_completion_enter,
1017f11c7f63SJim Harris NULL
1018f11c7f63SJim Harris },
1019f11c7f63SJim Harris {
1020f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE,
1021f11c7f63SJim Harris scic_sds_stp_request_started_non_data_await_d2h_enter,
1022f11c7f63SJim Harris NULL
1023f11c7f63SJim Harris }
1024f11c7f63SJim Harris };
1025f11c7f63SJim Harris
1026f11c7f63SJim Harris //******************************************************************************
1027f11c7f63SJim Harris //* STP PIO STATE MACHINE
1028f11c7f63SJim Harris //******************************************************************************
1029f11c7f63SJim Harris
1030f11c7f63SJim Harris #define SCU_MAX_FRAME_BUFFER_SIZE 0x400 // 1K is the maximum SCU frame data payload
1031f11c7f63SJim Harris
1032f11c7f63SJim Harris /**
1033f11c7f63SJim Harris * This function will transmit DATA_FIS from (current sgl + offset) for input parameter length.
1034f11c7f63SJim Harris * current sgl and offset is alreay stored in the IO request
1035f11c7f63SJim Harris *
1036f11c7f63SJim Harris * @param[in] this_request
1037f11c7f63SJim Harris * @param[in] length
1038f11c7f63SJim Harris *
1039f11c7f63SJim Harris * @return SCI_STATUS
1040f11c7f63SJim Harris */
1041f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_out_trasmit_data_frame(SCIC_SDS_REQUEST_T * this_request,U32 length)1042f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_out_trasmit_data_frame (
1043f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
1044f11c7f63SJim Harris U32 length
1045f11c7f63SJim Harris )
1046f11c7f63SJim Harris {
1047f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1048f11c7f63SJim Harris SCU_SGL_ELEMENT_T * current_sgl;
1049f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_sds_stp_request = (SCIC_SDS_STP_REQUEST_T *)this_request;
1050f11c7f63SJim Harris
1051f11c7f63SJim Harris // Recycle the TC and reconstruct it for sending out DATA FIS containing
1052f11c7f63SJim Harris // for the data from current_sgl+offset for the input length
1053f11c7f63SJim Harris SCU_TASK_CONTEXT_T * task_context = scic_sds_controller_get_task_context_buffer(
1054f11c7f63SJim Harris this_request->owning_controller,
1055f11c7f63SJim Harris this_request->io_tag
1056f11c7f63SJim Harris );
1057f11c7f63SJim Harris
1058f11c7f63SJim Harris if (this_sds_stp_request->type.pio.request_current.sgl_set == SCU_SGL_ELEMENT_PAIR_A)
1059f11c7f63SJim Harris {
1060f11c7f63SJim Harris current_sgl = &(this_sds_stp_request->type.pio.request_current.sgl_pair->A);
1061f11c7f63SJim Harris }
1062f11c7f63SJim Harris else
1063f11c7f63SJim Harris {
1064f11c7f63SJim Harris current_sgl = &(this_sds_stp_request->type.pio.request_current.sgl_pair->B);
1065f11c7f63SJim Harris }
1066f11c7f63SJim Harris
1067f11c7f63SJim Harris //update the TC
1068f11c7f63SJim Harris task_context->command_iu_upper = current_sgl->address_upper;
1069f11c7f63SJim Harris task_context->command_iu_lower = current_sgl->address_lower;
1070f11c7f63SJim Harris task_context->transfer_length_bytes = length;
1071f11c7f63SJim Harris task_context->type.stp.fis_type = SATA_FIS_TYPE_DATA;
1072f11c7f63SJim Harris
1073f11c7f63SJim Harris // send the new TC out.
1074f11c7f63SJim Harris status = this_request->owning_controller->state_handlers->parent.continue_io_handler(
1075f11c7f63SJim Harris &this_request->owning_controller->parent,
1076f11c7f63SJim Harris &this_request->target_device->parent,
1077f11c7f63SJim Harris &this_request->parent
1078f11c7f63SJim Harris );
1079f11c7f63SJim Harris
1080f11c7f63SJim Harris return status;
1081f11c7f63SJim Harris
1082f11c7f63SJim Harris }
1083f11c7f63SJim Harris
1084f11c7f63SJim Harris /**
1085f11c7f63SJim Harris *
1086f11c7f63SJim Harris *
1087f11c7f63SJim Harris * @param[in] this_request
1088f11c7f63SJim Harris *
1089f11c7f63SJim Harris * @return SCI_STATUS
1090f11c7f63SJim Harris */
1091f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_out_transmit_data(SCIC_SDS_REQUEST_T * this_sds_request)1092f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_out_transmit_data(
1093f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_sds_request
1094f11c7f63SJim Harris )
1095f11c7f63SJim Harris {
1096f11c7f63SJim Harris
1097f11c7f63SJim Harris SCU_SGL_ELEMENT_T * current_sgl;
1098f11c7f63SJim Harris U32 sgl_offset;
1099f11c7f63SJim Harris U32 remaining_bytes_in_current_sgl = 0;
1100f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1101f11c7f63SJim Harris
1102f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_sds_stp_request = (SCIC_SDS_STP_REQUEST_T *)this_sds_request;
1103f11c7f63SJim Harris
1104f11c7f63SJim Harris sgl_offset = this_sds_stp_request->type.pio.request_current.sgl_offset;
1105f11c7f63SJim Harris
1106f11c7f63SJim Harris if (this_sds_stp_request->type.pio.request_current.sgl_set == SCU_SGL_ELEMENT_PAIR_A)
1107f11c7f63SJim Harris {
1108f11c7f63SJim Harris current_sgl = &(this_sds_stp_request->type.pio.request_current.sgl_pair->A);
1109f11c7f63SJim Harris remaining_bytes_in_current_sgl = this_sds_stp_request->type.pio.request_current.sgl_pair->A.length - sgl_offset;
1110f11c7f63SJim Harris }
1111f11c7f63SJim Harris else
1112f11c7f63SJim Harris {
1113f11c7f63SJim Harris current_sgl = &(this_sds_stp_request->type.pio.request_current.sgl_pair->B);
1114f11c7f63SJim Harris remaining_bytes_in_current_sgl = this_sds_stp_request->type.pio.request_current.sgl_pair->B.length - sgl_offset;
1115f11c7f63SJim Harris }
1116f11c7f63SJim Harris
1117f11c7f63SJim Harris
1118f11c7f63SJim Harris if (this_sds_stp_request->type.pio.pio_transfer_bytes > 0)
1119f11c7f63SJim Harris {
1120f11c7f63SJim Harris if (this_sds_stp_request->type.pio.pio_transfer_bytes >= remaining_bytes_in_current_sgl )
1121f11c7f63SJim Harris {
1122f11c7f63SJim Harris //recycle the TC and send the H2D Data FIS from (current sgl + sgl_offset) and length = remaining_bytes_in_current_sgl
1123f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_out_trasmit_data_frame (this_sds_request, remaining_bytes_in_current_sgl);
1124f11c7f63SJim Harris if (status == SCI_SUCCESS)
1125f11c7f63SJim Harris {
1126f11c7f63SJim Harris this_sds_stp_request->type.pio.pio_transfer_bytes -= remaining_bytes_in_current_sgl;
1127f11c7f63SJim Harris sgl_offset = 0;
1128f11c7f63SJim Harris }
1129f11c7f63SJim Harris }
1130f11c7f63SJim Harris else if (this_sds_stp_request->type.pio.pio_transfer_bytes < remaining_bytes_in_current_sgl )
1131f11c7f63SJim Harris {
1132f11c7f63SJim Harris //recycle the TC and send the H2D Data FIS from (current sgl + sgl_offset) and length = type.pio.pio_transfer_bytes
1133f11c7f63SJim Harris scic_sds_stp_request_pio_data_out_trasmit_data_frame (this_sds_request, this_sds_stp_request->type.pio.pio_transfer_bytes);
1134f11c7f63SJim Harris
1135f11c7f63SJim Harris if (status == SCI_SUCCESS)
1136f11c7f63SJim Harris {
1137f11c7f63SJim Harris //Sgl offset will be adjusted and saved for future
1138f11c7f63SJim Harris sgl_offset += this_sds_stp_request->type.pio.pio_transfer_bytes;
1139f11c7f63SJim Harris current_sgl->address_lower += this_sds_stp_request->type.pio.pio_transfer_bytes;
1140f11c7f63SJim Harris this_sds_stp_request->type.pio.pio_transfer_bytes = 0;
1141f11c7f63SJim Harris }
1142f11c7f63SJim Harris }
1143f11c7f63SJim Harris }
1144f11c7f63SJim Harris
1145f11c7f63SJim Harris if (status == SCI_SUCCESS)
1146f11c7f63SJim Harris {
1147f11c7f63SJim Harris this_sds_stp_request->type.pio.request_current.sgl_offset = sgl_offset;
1148f11c7f63SJim Harris }
1149f11c7f63SJim Harris
1150f11c7f63SJim Harris return status;
1151f11c7f63SJim Harris }
1152f11c7f63SJim Harris
1153f11c7f63SJim Harris /**
1154f11c7f63SJim Harris * Copy the data from the buffer for the length specified to the IO reqeust
1155f11c7f63SJim Harris * SGL specified data region.
1156f11c7f63SJim Harris *
1157f11c7f63SJim Harris * @param[in] this_request The request that is used for the SGL processing.
1158f11c7f63SJim Harris * @param[in] data_buffer The buffer of data to be copied.
1159f11c7f63SJim Harris * @param[in] length The length of the data transfer.
1160f11c7f63SJim Harris *
1161f11c7f63SJim Harris * @return SCI_STATUS
1162f11c7f63SJim Harris */
1163f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_in_copy_data_buffer(SCIC_SDS_STP_REQUEST_T * this_request,U8 * data_buffer,U32 length)1164f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_in_copy_data_buffer(
1165f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request,
1166f11c7f63SJim Harris U8 * data_buffer,
1167f11c7f63SJim Harris U32 length
1168f11c7f63SJim Harris )
1169f11c7f63SJim Harris {
1170f11c7f63SJim Harris SCI_STATUS status;
1171f11c7f63SJim Harris SCU_SGL_ELEMENT_T * current_sgl;
1172f11c7f63SJim Harris U32 sgl_offset;
1173f11c7f63SJim Harris U32 data_offset;
1174f11c7f63SJim Harris U8 * source_address;
1175f11c7f63SJim Harris
1176f11c7f63SJim Harris // Initial setup to get the current working SGL and the offset within the buffer
1177f11c7f63SJim Harris current_sgl =
1178f11c7f63SJim Harris (this_request->type.pio.request_current.sgl_set == SCU_SGL_ELEMENT_PAIR_A) ?
1179f11c7f63SJim Harris &(this_request->type.pio.request_current.sgl_pair->A) :
1180f11c7f63SJim Harris &(this_request->type.pio.request_current.sgl_pair->B) ;
1181f11c7f63SJim Harris
1182f11c7f63SJim Harris sgl_offset = this_request->type.pio.request_current.sgl_offset;
1183f11c7f63SJim Harris
1184f11c7f63SJim Harris source_address = data_buffer;
1185f11c7f63SJim Harris data_offset = this_request->type.pio.current_transfer_bytes;
1186f11c7f63SJim Harris status = SCI_SUCCESS;
1187f11c7f63SJim Harris
1188f11c7f63SJim Harris // While we are still doing Ok and there is more data to transfer
1189f11c7f63SJim Harris while (
1190f11c7f63SJim Harris (length > 0)
1191f11c7f63SJim Harris && (status == SCI_SUCCESS)
1192f11c7f63SJim Harris )
1193f11c7f63SJim Harris {
1194f11c7f63SJim Harris if (current_sgl->length == sgl_offset)
1195f11c7f63SJim Harris {
1196f11c7f63SJim Harris // This SGL has been exauhasted so we need to get the next SGL
1197f11c7f63SJim Harris current_sgl = scic_sds_stp_request_pio_get_next_sgl(this_request);
1198f11c7f63SJim Harris
1199f11c7f63SJim Harris if (current_sgl == NULL)
1200f11c7f63SJim Harris status = SCI_FAILURE;
1201f11c7f63SJim Harris else
1202f11c7f63SJim Harris sgl_offset = 0;
1203f11c7f63SJim Harris }
1204f11c7f63SJim Harris else
1205f11c7f63SJim Harris {
1206f11c7f63SJim Harris #ifdef ENABLE_OSSL_COPY_BUFFER
1207f11c7f63SJim Harris scic_cb_io_request_copy_buffer(this_request, data_buffer, data_offset, length);
1208f11c7f63SJim Harris length = 0;
1209f11c7f63SJim Harris #else
1210f11c7f63SJim Harris U8 * destination_address;
1211f11c7f63SJim Harris U32 copy_length;
1212f11c7f63SJim Harris
1213f11c7f63SJim Harris destination_address = (U8 *)scic_cb_io_request_get_virtual_address_from_sgl(
1214f11c7f63SJim Harris this_request,
1215f11c7f63SJim Harris data_offset
1216f11c7f63SJim Harris );
1217f11c7f63SJim Harris
1218f11c7f63SJim Harris copy_length = MIN(length, current_sgl->length - sgl_offset);
1219f11c7f63SJim Harris
1220f11c7f63SJim Harris memcpy(destination_address, source_address, copy_length);
1221f11c7f63SJim Harris
1222f11c7f63SJim Harris length -= copy_length;
1223f11c7f63SJim Harris sgl_offset += copy_length;
1224f11c7f63SJim Harris data_offset += copy_length;
122558cf99d2SScott Long source_address += copy_length;
1226f11c7f63SJim Harris #endif
1227f11c7f63SJim Harris }
1228f11c7f63SJim Harris }
1229f11c7f63SJim Harris
1230f11c7f63SJim Harris this_request->type.pio.request_current.sgl_offset = sgl_offset;
1231f11c7f63SJim Harris
1232f11c7f63SJim Harris return status;
1233f11c7f63SJim Harris }
1234f11c7f63SJim Harris
1235f11c7f63SJim Harris /**
1236f11c7f63SJim Harris * Copy the data buffer to the io request data region.
1237f11c7f63SJim Harris *
1238f11c7f63SJim Harris * @param[in] this_request The PIO DATA IN request that is to receive the
1239f11c7f63SJim Harris * data.
1240f11c7f63SJim Harris * @param[in] data_buffer The buffer to copy from.
1241f11c7f63SJim Harris *
1242f11c7f63SJim Harris * @return SCI_STATUS
1243f11c7f63SJim Harris */
1244f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_in_copy_data(SCIC_SDS_STP_REQUEST_T * this_request,U8 * data_buffer)1245f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_in_copy_data(
1246f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request,
1247f11c7f63SJim Harris U8 * data_buffer
1248f11c7f63SJim Harris )
1249f11c7f63SJim Harris {
1250f11c7f63SJim Harris SCI_STATUS status;
1251f11c7f63SJim Harris
1252f11c7f63SJim Harris // If there is less than 1K remaining in the transfer request
1253f11c7f63SJim Harris // copy just the data for the transfer
1254f11c7f63SJim Harris if (this_request->type.pio.pio_transfer_bytes < SCU_MAX_FRAME_BUFFER_SIZE)
1255f11c7f63SJim Harris {
1256f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_in_copy_data_buffer(
1257f11c7f63SJim Harris this_request,data_buffer,this_request->type.pio.pio_transfer_bytes);
1258f11c7f63SJim Harris
1259f11c7f63SJim Harris if (status == SCI_SUCCESS)
1260f11c7f63SJim Harris {
1261f11c7f63SJim Harris // All data for this PIO request has now been copied, so we don't
1262f11c7f63SJim Harris // technically need to update current_transfer_bytes here - just
1263f11c7f63SJim Harris // doing it for completeness.
1264f11c7f63SJim Harris this_request->type.pio.current_transfer_bytes += this_request->type.pio.pio_transfer_bytes;
1265f11c7f63SJim Harris this_request->type.pio.pio_transfer_bytes = 0;
1266f11c7f63SJim Harris }
1267f11c7f63SJim Harris }
1268f11c7f63SJim Harris else
1269f11c7f63SJim Harris {
1270453130d9SPedro F. Giffuni // We are transferring the whole frame so copy
1271f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_in_copy_data_buffer(
1272f11c7f63SJim Harris this_request, data_buffer, SCU_MAX_FRAME_BUFFER_SIZE);
1273f11c7f63SJim Harris
1274f11c7f63SJim Harris if (status == SCI_SUCCESS)
1275f11c7f63SJim Harris {
1276f11c7f63SJim Harris this_request->type.pio.pio_transfer_bytes -= SCU_MAX_FRAME_BUFFER_SIZE;
1277f11c7f63SJim Harris this_request->type.pio.current_transfer_bytes += SCU_MAX_FRAME_BUFFER_SIZE;
1278f11c7f63SJim Harris }
1279f11c7f63SJim Harris }
1280f11c7f63SJim Harris
1281f11c7f63SJim Harris return status;
1282f11c7f63SJim Harris }
1283f11c7f63SJim Harris
1284f11c7f63SJim Harris /**
1285f11c7f63SJim Harris *
1286f11c7f63SJim Harris *
1287f11c7f63SJim Harris * @param[in] this_request
1288f11c7f63SJim Harris * @param[in] completion_code
1289f11c7f63SJim Harris *
1290f11c7f63SJim Harris * @return SCI_STATUS
1291f11c7f63SJim Harris */
1292f11c7f63SJim Harris static
scic_sds_stp_request_pio_await_h2d_completion_tc_completion_handler(SCIC_SDS_REQUEST_T * this_request,U32 completion_code)1293f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_await_h2d_completion_tc_completion_handler(
1294f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
1295f11c7f63SJim Harris U32 completion_code
1296f11c7f63SJim Harris )
1297f11c7f63SJim Harris {
1298f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1299f11c7f63SJim Harris
1300f11c7f63SJim Harris SCIC_LOG_TRACE((
1301f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1302f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1303f11c7f63SJim Harris "scic_sds_stp_request_pio_data_in_await_h2d_completion_tc_completion_handler(0x%x, 0x%x) enter\n",
1304f11c7f63SJim Harris this_request, completion_code
1305f11c7f63SJim Harris ));
1306f11c7f63SJim Harris
1307f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
1308f11c7f63SJim Harris {
1309f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
1310f11c7f63SJim Harris scic_sds_request_set_status(
1311f11c7f63SJim Harris this_request, SCU_TASK_DONE_GOOD, SCI_SUCCESS
1312f11c7f63SJim Harris );
1313f11c7f63SJim Harris
1314f11c7f63SJim Harris sci_base_state_machine_change_state(
1315f11c7f63SJim Harris &this_request->started_substate_machine,
1316f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1317f11c7f63SJim Harris );
1318f11c7f63SJim Harris break;
1319f11c7f63SJim Harris
1320f11c7f63SJim Harris default:
1321f11c7f63SJim Harris // All other completion status cause the IO to be complete. If a NAK
1322f11c7f63SJim Harris // was received, then it is up to the user to retry the request.
1323f11c7f63SJim Harris scic_sds_request_set_status(
1324f11c7f63SJim Harris this_request,
1325f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
1326f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
1327f11c7f63SJim Harris );
1328f11c7f63SJim Harris
1329f11c7f63SJim Harris sci_base_state_machine_change_state(
1330f11c7f63SJim Harris &this_request->parent.state_machine,
1331f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1332f11c7f63SJim Harris );
1333f11c7f63SJim Harris break;
1334f11c7f63SJim Harris }
1335f11c7f63SJim Harris
1336f11c7f63SJim Harris return status;
1337f11c7f63SJim Harris }
1338f11c7f63SJim Harris
1339f11c7f63SJim Harris /**
1340f11c7f63SJim Harris *
1341f11c7f63SJim Harris *
1342f11c7f63SJim Harris * @param[in] this_request
1343f11c7f63SJim Harris * @param[in] frame_index
1344f11c7f63SJim Harris *
1345f11c7f63SJim Harris * @return SCI_STATUS
1346f11c7f63SJim Harris */
1347f11c7f63SJim Harris static
scic_sds_stp_request_pio_await_frame_frame_handler(SCIC_SDS_REQUEST_T * request,U32 frame_index)1348f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_await_frame_frame_handler(
1349f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
1350f11c7f63SJim Harris U32 frame_index
1351f11c7f63SJim Harris )
1352f11c7f63SJim Harris {
1353f11c7f63SJim Harris SCI_STATUS status;
1354f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
1355f11c7f63SJim Harris U32 * frame_buffer;
1356f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request;
1357f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T * owning_controller;
1358f11c7f63SJim Harris
1359f11c7f63SJim Harris this_request = (SCIC_SDS_STP_REQUEST_T *)request;
1360f11c7f63SJim Harris
1361f11c7f63SJim Harris // Save off the controller, so that we do not touch the request after it
1362f11c7f63SJim Harris // is completed.
1363f11c7f63SJim Harris owning_controller = this_request->parent.owning_controller;
1364f11c7f63SJim Harris
1365f11c7f63SJim Harris SCIC_LOG_TRACE((
1366f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1367f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1368f11c7f63SJim Harris "scic_sds_stp_request_pio_data_in_await_frame_frame_handler(0x%x, 0x%x) enter\n",
1369f11c7f63SJim Harris this_request, frame_index
1370f11c7f63SJim Harris ));
1371f11c7f63SJim Harris
1372f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
1373f11c7f63SJim Harris &(owning_controller->uf_control),
1374f11c7f63SJim Harris frame_index,
1375f11c7f63SJim Harris (void**) &frame_header
1376f11c7f63SJim Harris );
1377f11c7f63SJim Harris
1378f11c7f63SJim Harris if (status == SCI_SUCCESS)
1379f11c7f63SJim Harris {
1380f11c7f63SJim Harris switch (frame_header->fis_type)
1381f11c7f63SJim Harris {
1382f11c7f63SJim Harris case SATA_FIS_TYPE_PIO_SETUP:
1383f11c7f63SJim Harris // Get from the frame buffer the PIO Setup Data
1384f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
1385f11c7f63SJim Harris &(owning_controller->uf_control),
1386f11c7f63SJim Harris frame_index,
1387f11c7f63SJim Harris (void**) &frame_buffer
1388f11c7f63SJim Harris );
1389f11c7f63SJim Harris
1390f11c7f63SJim Harris // Get the data from the PIO Setup
1391f11c7f63SJim Harris // The SCU Hardware returns first word in the frame_header and the rest
1392f11c7f63SJim Harris // of the data is in the frame buffer so we need to back up one dword
1393f11c7f63SJim Harris this_request->type.pio.pio_transfer_bytes =
1394f11c7f63SJim Harris (U16)((SATA_FIS_PIO_SETUP_T *)(&frame_buffer[-1]))->transfter_count;
1395f11c7f63SJim Harris this_request->type.pio.ending_status =
1396f11c7f63SJim Harris (U8)((SATA_FIS_PIO_SETUP_T *)(&frame_buffer[-1]))->ending_status;
1397f11c7f63SJim Harris
1398f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
1399f11c7f63SJim Harris &this_request->d2h_reg_fis, (U32 *)frame_header, frame_buffer
1400f11c7f63SJim Harris );
1401f11c7f63SJim Harris
1402f11c7f63SJim Harris this_request->d2h_reg_fis.status =
1403f11c7f63SJim Harris this_request->type.pio.ending_status;
1404f11c7f63SJim Harris
1405f11c7f63SJim Harris //The next state is dependent on whether the request was PIO Data-in or Data out
1406f11c7f63SJim Harris if (this_request->type.pio.sat_protocol == SAT_PROTOCOL_PIO_DATA_IN)
1407f11c7f63SJim Harris {
1408f11c7f63SJim Harris sci_base_state_machine_change_state(
1409f11c7f63SJim Harris &this_request->parent.started_substate_machine,
1410f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_IN_AWAIT_DATA_SUBSTATE
1411f11c7f63SJim Harris );
1412f11c7f63SJim Harris }
1413f11c7f63SJim Harris else if (this_request->type.pio.sat_protocol == SAT_PROTOCOL_PIO_DATA_OUT)
1414f11c7f63SJim Harris {
1415f11c7f63SJim Harris //Transmit data
1416f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_out_transmit_data ( request);
1417f11c7f63SJim Harris if (status == SCI_SUCCESS)
1418f11c7f63SJim Harris {
1419f11c7f63SJim Harris sci_base_state_machine_change_state(
1420f11c7f63SJim Harris &this_request->parent.started_substate_machine,
1421f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_OUT_TRANSMIT_DATA_SUBSTATE
1422f11c7f63SJim Harris );
1423f11c7f63SJim Harris }
1424f11c7f63SJim Harris }
1425f11c7f63SJim Harris break;
1426f11c7f63SJim Harris
1427f11c7f63SJim Harris case SATA_FIS_TYPE_SETDEVBITS:
1428f11c7f63SJim Harris sci_base_state_machine_change_state(
1429f11c7f63SJim Harris &this_request->parent.started_substate_machine,
1430f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1431f11c7f63SJim Harris );
1432f11c7f63SJim Harris break;
1433f11c7f63SJim Harris
1434f11c7f63SJim Harris case SATA_FIS_TYPE_REGD2H:
1435f11c7f63SJim Harris if ( (frame_header->status & ATA_STATUS_REG_BSY_BIT) == 0)
1436f11c7f63SJim Harris {
1437f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
1438f11c7f63SJim Harris &(owning_controller->uf_control),
1439f11c7f63SJim Harris frame_index,
1440f11c7f63SJim Harris (void**) &frame_buffer
1441f11c7f63SJim Harris );
1442f11c7f63SJim Harris
1443f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
1444f11c7f63SJim Harris &this_request->d2h_reg_fis, (U32 *)frame_header, frame_buffer);
1445f11c7f63SJim Harris
1446f11c7f63SJim Harris scic_sds_request_set_status(
1447f11c7f63SJim Harris &this_request->parent,
1448f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
1449f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
1450f11c7f63SJim Harris );
1451f11c7f63SJim Harris
1452f11c7f63SJim Harris sci_base_state_machine_change_state(
1453f11c7f63SJim Harris &this_request->parent.parent.state_machine,
1454f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1455f11c7f63SJim Harris );
1456f11c7f63SJim Harris }
1457f11c7f63SJim Harris else
1458f11c7f63SJim Harris {
1459f11c7f63SJim Harris // Now why is the drive sending a D2H Register FIS when it is still busy?
1460f11c7f63SJim Harris // Do nothing since we are still in the right state.
1461f11c7f63SJim Harris SCIC_LOG_INFO((
1462f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1463f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1464f11c7f63SJim Harris "SCIC PIO Request 0x%x received D2H Register FIS with BSY status 0x%x\n",
1465f11c7f63SJim Harris this_request, frame_header->status
1466f11c7f63SJim Harris ));
1467f11c7f63SJim Harris }
1468f11c7f63SJim Harris break;
1469f11c7f63SJim Harris
1470f11c7f63SJim Harris default:
1471f11c7f63SJim Harris break;
1472f11c7f63SJim Harris }
1473f11c7f63SJim Harris
1474f11c7f63SJim Harris // Frame is decoded return it to the controller
1475f11c7f63SJim Harris scic_sds_controller_release_frame(
1476f11c7f63SJim Harris owning_controller,
1477f11c7f63SJim Harris frame_index
1478f11c7f63SJim Harris );
1479f11c7f63SJim Harris }
1480f11c7f63SJim Harris else
1481f11c7f63SJim Harris {
1482f11c7f63SJim Harris SCIC_LOG_ERROR((
1483f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1484f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1485f11c7f63SJim Harris "SCIC IO Request 0x%x could not get frame header for frame index %d, status %x\n",
1486f11c7f63SJim Harris this_request, frame_index, status
1487f11c7f63SJim Harris ));
1488f11c7f63SJim Harris }
1489f11c7f63SJim Harris
1490f11c7f63SJim Harris return status;
1491f11c7f63SJim Harris }
1492f11c7f63SJim Harris
1493f11c7f63SJim Harris /**
1494f11c7f63SJim Harris *
1495f11c7f63SJim Harris *
1496f11c7f63SJim Harris * @param[in] this_request
1497f11c7f63SJim Harris * @param[in] frame_index
1498f11c7f63SJim Harris *
1499f11c7f63SJim Harris * @return SCI_STATUS
1500f11c7f63SJim Harris */
1501f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_in_await_data_frame_handler(SCIC_SDS_REQUEST_T * request,U32 frame_index)1502f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_in_await_data_frame_handler(
1503f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
1504f11c7f63SJim Harris U32 frame_index
1505f11c7f63SJim Harris )
1506f11c7f63SJim Harris {
1507f11c7f63SJim Harris SCI_STATUS status;
1508f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
1509f11c7f63SJim Harris SATA_FIS_DATA_T * frame_buffer;
1510f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request;
1511f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T * owning_controller;
1512f11c7f63SJim Harris
1513f11c7f63SJim Harris this_request = (SCIC_SDS_STP_REQUEST_T *)request;
1514f11c7f63SJim Harris
1515f11c7f63SJim Harris // Save off the controller, so that we do not touch the request after it
1516f11c7f63SJim Harris // is completed.
1517f11c7f63SJim Harris owning_controller = this_request->parent.owning_controller;
1518f11c7f63SJim Harris
1519f11c7f63SJim Harris SCIC_LOG_TRACE((
1520f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1521f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1522f11c7f63SJim Harris "scic_sds_stp_request_pio_data_in_await_data_frame_handler(0x%x, 0x%x) enter\n",
1523f11c7f63SJim Harris this_request, frame_index
1524f11c7f63SJim Harris ));
1525f11c7f63SJim Harris
1526f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
1527f11c7f63SJim Harris &(owning_controller->uf_control),
1528f11c7f63SJim Harris frame_index,
1529f11c7f63SJim Harris (void**) &frame_header
1530f11c7f63SJim Harris );
1531f11c7f63SJim Harris
1532f11c7f63SJim Harris if (status == SCI_SUCCESS)
1533f11c7f63SJim Harris {
1534f11c7f63SJim Harris if (frame_header->fis_type == SATA_FIS_TYPE_DATA)
1535f11c7f63SJim Harris {
1536f11c7f63SJim Harris if (this_request->type.pio.request_current.sgl_pair == NULL)
1537f11c7f63SJim Harris {
1538f11c7f63SJim Harris this_request->parent.saved_rx_frame_index = frame_index;
1539f11c7f63SJim Harris this_request->type.pio.pio_transfer_bytes = 0;
1540f11c7f63SJim Harris }
1541f11c7f63SJim Harris else
1542f11c7f63SJim Harris {
1543f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_buffer(
1544f11c7f63SJim Harris &(owning_controller->uf_control),
1545f11c7f63SJim Harris frame_index,
1546f11c7f63SJim Harris (void**) &frame_buffer
1547f11c7f63SJim Harris );
1548f11c7f63SJim Harris
1549f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_in_copy_data(this_request, (U8 *)frame_buffer);
1550f11c7f63SJim Harris
1551f11c7f63SJim Harris // Frame is decoded return it to the controller
1552f11c7f63SJim Harris scic_sds_controller_release_frame(
1553f11c7f63SJim Harris owning_controller,
1554f11c7f63SJim Harris frame_index
1555f11c7f63SJim Harris );
1556f11c7f63SJim Harris }
1557f11c7f63SJim Harris
1558f11c7f63SJim Harris // Check for the end of the transfer, are there more bytes remaining
1559f11c7f63SJim Harris // for this data transfer
1560f11c7f63SJim Harris if (
1561f11c7f63SJim Harris (status == SCI_SUCCESS)
1562f11c7f63SJim Harris && (this_request->type.pio.pio_transfer_bytes == 0)
1563f11c7f63SJim Harris )
1564f11c7f63SJim Harris {
1565f11c7f63SJim Harris if ((this_request->type.pio.ending_status & ATA_STATUS_REG_BSY_BIT) == 0)
1566f11c7f63SJim Harris {
1567f11c7f63SJim Harris scic_sds_request_set_status(
1568f11c7f63SJim Harris &this_request->parent,
1569f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
1570f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
1571f11c7f63SJim Harris );
1572f11c7f63SJim Harris
1573f11c7f63SJim Harris sci_base_state_machine_change_state(
1574f11c7f63SJim Harris &this_request->parent.parent.state_machine,
1575f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1576f11c7f63SJim Harris );
1577f11c7f63SJim Harris }
1578f11c7f63SJim Harris else
1579f11c7f63SJim Harris {
1580f11c7f63SJim Harris sci_base_state_machine_change_state(
1581f11c7f63SJim Harris &this_request->parent.started_substate_machine,
1582f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1583f11c7f63SJim Harris );
1584f11c7f63SJim Harris }
1585f11c7f63SJim Harris }
1586f11c7f63SJim Harris }
1587f11c7f63SJim Harris else
1588f11c7f63SJim Harris {
1589f11c7f63SJim Harris SCIC_LOG_ERROR((
1590f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1591f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1592f11c7f63SJim Harris "SCIC PIO Request 0x%x received frame %d with fis type 0x%02x when expecting a data fis.\n",
1593f11c7f63SJim Harris this_request, frame_index, frame_header->fis_type
1594f11c7f63SJim Harris ));
1595f11c7f63SJim Harris
1596f11c7f63SJim Harris scic_sds_request_set_status(
1597f11c7f63SJim Harris &this_request->parent,
1598f11c7f63SJim Harris SCU_TASK_DONE_GOOD,
1599f11c7f63SJim Harris SCI_FAILURE_IO_REQUIRES_SCSI_ABORT
1600f11c7f63SJim Harris );
1601f11c7f63SJim Harris
1602f11c7f63SJim Harris sci_base_state_machine_change_state(
1603f11c7f63SJim Harris &this_request->parent.parent.state_machine,
1604f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1605f11c7f63SJim Harris );
1606f11c7f63SJim Harris
1607f11c7f63SJim Harris // Frame is decoded return it to the controller
1608f11c7f63SJim Harris scic_sds_controller_release_frame(
1609f11c7f63SJim Harris owning_controller,
1610f11c7f63SJim Harris frame_index
1611f11c7f63SJim Harris );
1612f11c7f63SJim Harris }
1613f11c7f63SJim Harris }
1614f11c7f63SJim Harris else
1615f11c7f63SJim Harris {
1616f11c7f63SJim Harris SCIC_LOG_ERROR((
1617f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1618f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1619f11c7f63SJim Harris "SCIC IO Request 0x%x could not get frame header for frame index %d, status %x\n",
1620f11c7f63SJim Harris this_request, frame_index, status
1621f11c7f63SJim Harris ));
1622f11c7f63SJim Harris }
1623f11c7f63SJim Harris
1624f11c7f63SJim Harris return status;
1625f11c7f63SJim Harris }
1626f11c7f63SJim Harris
1627f11c7f63SJim Harris
1628f11c7f63SJim Harris /**
1629f11c7f63SJim Harris *
1630f11c7f63SJim Harris *
1631f11c7f63SJim Harris * @param[in] this_request
1632f11c7f63SJim Harris * @param[in] completion_code
1633f11c7f63SJim Harris *
1634f11c7f63SJim Harris * @return SCI_STATUS
1635f11c7f63SJim Harris */
1636f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_out_await_data_transmit_completion_tc_completion_handler(SCIC_SDS_REQUEST_T * this_request,U32 completion_code)1637f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_out_await_data_transmit_completion_tc_completion_handler(
1638f11c7f63SJim Harris
1639f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
1640f11c7f63SJim Harris U32 completion_code
1641f11c7f63SJim Harris )
1642f11c7f63SJim Harris {
1643f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1644f11c7f63SJim Harris BOOL all_frames_transferred = FALSE;
1645f11c7f63SJim Harris
1646f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T *this_scic_sds_stp_request = (SCIC_SDS_STP_REQUEST_T *) this_request;
1647f11c7f63SJim Harris
1648f11c7f63SJim Harris SCIC_LOG_TRACE((
1649f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1650f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1651f11c7f63SJim Harris "scic_sds_stp_request_pio_data_in_await_h2d_completion_tc_completion_handler(0x%x, 0x%x) enter\n",
1652f11c7f63SJim Harris this_request, completion_code
1653f11c7f63SJim Harris ));
1654f11c7f63SJim Harris
1655f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
1656f11c7f63SJim Harris {
1657f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
1658f11c7f63SJim Harris //Transmit data
1659f11c7f63SJim Harris if (this_scic_sds_stp_request->type.pio.pio_transfer_bytes != 0)
1660f11c7f63SJim Harris {
1661f11c7f63SJim Harris status = scic_sds_stp_request_pio_data_out_transmit_data ( this_request);
1662f11c7f63SJim Harris if (status == SCI_SUCCESS)
1663f11c7f63SJim Harris {
1664f11c7f63SJim Harris if (this_scic_sds_stp_request->type.pio.pio_transfer_bytes == 0)
1665f11c7f63SJim Harris all_frames_transferred = TRUE;
1666f11c7f63SJim Harris }
1667f11c7f63SJim Harris }
1668f11c7f63SJim Harris else if (this_scic_sds_stp_request->type.pio.pio_transfer_bytes == 0)
1669f11c7f63SJim Harris {
1670453130d9SPedro F. Giffuni //this will happen if the all data is written at the first time after the pio setup fis is received
1671f11c7f63SJim Harris all_frames_transferred = TRUE;
1672f11c7f63SJim Harris }
1673f11c7f63SJim Harris
1674f11c7f63SJim Harris //all data transferred.
1675f11c7f63SJim Harris if (all_frames_transferred)
1676f11c7f63SJim Harris {
1677f11c7f63SJim Harris //Change the state to SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_IN_AWAIT_FRAME_SUBSTATE
1678f11c7f63SJim Harris //and wait for PIO_SETUP fis / or D2H REg fis.
1679f11c7f63SJim Harris sci_base_state_machine_change_state(
1680f11c7f63SJim Harris &this_request->started_substate_machine,
1681f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1682f11c7f63SJim Harris );
1683f11c7f63SJim Harris }
1684f11c7f63SJim Harris break;
1685f11c7f63SJim Harris
1686f11c7f63SJim Harris default:
1687f11c7f63SJim Harris // All other completion status cause the IO to be complete. If a NAK
1688f11c7f63SJim Harris // was received, then it is up to the user to retry the request.
1689f11c7f63SJim Harris scic_sds_request_set_status(
1690f11c7f63SJim Harris this_request,
1691f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
1692f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
1693f11c7f63SJim Harris );
1694f11c7f63SJim Harris
1695f11c7f63SJim Harris sci_base_state_machine_change_state(
1696f11c7f63SJim Harris &this_request->parent.state_machine,
1697f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1698f11c7f63SJim Harris );
1699f11c7f63SJim Harris break;
1700f11c7f63SJim Harris }
1701f11c7f63SJim Harris
1702f11c7f63SJim Harris return status;
1703f11c7f63SJim Harris }
1704f11c7f63SJim Harris
1705f11c7f63SJim Harris /**
1706f11c7f63SJim Harris * This method will handle any link layer events while waiting for the data
1707f11c7f63SJim Harris * frame.
1708f11c7f63SJim Harris *
1709f11c7f63SJim Harris * @param[in] request This is the request which is receiving the event.
1710f11c7f63SJim Harris * @param[in] event_code This is the event code that the request on which the
1711f11c7f63SJim Harris * request is expected to take action.
1712f11c7f63SJim Harris *
1713f11c7f63SJim Harris * @return SCI_STATUS
1714f11c7f63SJim Harris * @retval SCI_SUCCESS
1715f11c7f63SJim Harris * @retval SCI_FAILURE
1716f11c7f63SJim Harris */
1717f11c7f63SJim Harris static
scic_sds_stp_request_pio_data_in_await_data_event_handler(SCIC_SDS_REQUEST_T * request,U32 event_code)1718f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_pio_data_in_await_data_event_handler(
1719f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
1720f11c7f63SJim Harris U32 event_code
1721f11c7f63SJim Harris )
1722f11c7f63SJim Harris {
1723f11c7f63SJim Harris SCI_STATUS status;
1724f11c7f63SJim Harris
1725f11c7f63SJim Harris switch (scu_get_event_specifier(event_code))
1726f11c7f63SJim Harris {
1727f11c7f63SJim Harris case SCU_TASK_DONE_CRC_ERR << SCU_EVENT_SPECIFIC_CODE_SHIFT:
1728f11c7f63SJim Harris // We are waiting for data and the SCU has R_ERR the data frame.
1729f11c7f63SJim Harris // Go back to waiting for the D2H Register FIS
1730f11c7f63SJim Harris sci_base_state_machine_change_state(
1731f11c7f63SJim Harris &request->started_substate_machine,
1732f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1733f11c7f63SJim Harris );
1734f11c7f63SJim Harris
1735f11c7f63SJim Harris status = SCI_SUCCESS;
1736f11c7f63SJim Harris break;
1737f11c7f63SJim Harris
1738f11c7f63SJim Harris default:
1739f11c7f63SJim Harris SCIC_LOG_ERROR((
1740f11c7f63SJim Harris sci_base_object_get_logger(request),
1741f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1742f11c7f63SJim Harris "SCIC PIO Request 0x%x received unexpected event 0x%08x\n",
1743f11c7f63SJim Harris request, event_code
1744f11c7f63SJim Harris ));
1745f11c7f63SJim Harris
1746f11c7f63SJim Harris /// @todo Should we fail the PIO request when we get an unexpected event?
1747f11c7f63SJim Harris status = SCI_FAILURE;
1748f11c7f63SJim Harris break;
1749f11c7f63SJim Harris }
1750f11c7f63SJim Harris
1751f11c7f63SJim Harris return status;
1752f11c7f63SJim Harris }
1753f11c7f63SJim Harris
1754f11c7f63SJim Harris // ---------------------------------------------------------------------------
1755f11c7f63SJim Harris
1756f11c7f63SJim Harris SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
1757f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_handler_table
1758f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_PIO_MAX_SUBSTATES] =
1759f11c7f63SJim Harris {
1760f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_H2D_COMPLETION_SUBSTATE
1761f11c7f63SJim Harris {
1762f11c7f63SJim Harris {
1763f11c7f63SJim Harris scic_sds_request_default_start_handler,
1764f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
1765f11c7f63SJim Harris scic_sds_request_default_complete_handler,
1766f11c7f63SJim Harris scic_sds_request_default_destruct_handler
1767f11c7f63SJim Harris },
1768f11c7f63SJim Harris scic_sds_stp_request_pio_await_h2d_completion_tc_completion_handler,
1769f11c7f63SJim Harris scic_sds_request_default_event_handler,
1770f11c7f63SJim Harris scic_sds_request_default_frame_handler
1771f11c7f63SJim Harris },
1772f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1773f11c7f63SJim Harris {
1774f11c7f63SJim Harris {
1775f11c7f63SJim Harris scic_sds_request_default_start_handler,
1776f11c7f63SJim Harris //scic_sds_stp_pio_request_data_in_await_frame_abort_handler,
1777f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
1778f11c7f63SJim Harris scic_sds_request_default_complete_handler,
1779f11c7f63SJim Harris scic_sds_request_default_destruct_handler
1780f11c7f63SJim Harris },
1781f11c7f63SJim Harris scic_sds_request_default_tc_completion_handler,
1782f11c7f63SJim Harris scic_sds_request_default_event_handler,
1783f11c7f63SJim Harris scic_sds_stp_request_pio_await_frame_frame_handler
1784f11c7f63SJim Harris },
1785f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_IN_AWAIT_DATA_SUBSTATE
1786f11c7f63SJim Harris {
1787f11c7f63SJim Harris {
1788f11c7f63SJim Harris scic_sds_request_default_start_handler,
1789f11c7f63SJim Harris //scic_sds_stp_pio_request_data_in_await_data_abort_handler,
1790f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
1791f11c7f63SJim Harris scic_sds_request_default_complete_handler,
1792f11c7f63SJim Harris scic_sds_request_default_destruct_handler
1793f11c7f63SJim Harris },
1794f11c7f63SJim Harris scic_sds_request_default_tc_completion_handler,
1795f11c7f63SJim Harris scic_sds_stp_request_pio_data_in_await_data_event_handler,
1796f11c7f63SJim Harris scic_sds_stp_request_pio_data_in_await_data_frame_handler
1797f11c7f63SJim Harris },
1798f11c7f63SJim Harris //SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_OUT_TRANSMIT_DATA_SUBSTATE
1799f11c7f63SJim Harris {
1800f11c7f63SJim Harris {
1801f11c7f63SJim Harris scic_sds_request_default_start_handler,
1802f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
1803f11c7f63SJim Harris scic_sds_request_default_complete_handler,
1804f11c7f63SJim Harris scic_sds_request_default_destruct_handler
1805f11c7f63SJim Harris },
1806f11c7f63SJim Harris scic_sds_stp_request_pio_data_out_await_data_transmit_completion_tc_completion_handler,
1807f11c7f63SJim Harris scic_sds_request_default_event_handler,
1808f11c7f63SJim Harris scic_sds_request_default_frame_handler
1809f11c7f63SJim Harris }
1810f11c7f63SJim Harris };
1811f11c7f63SJim Harris
1812f11c7f63SJim Harris static
scic_sds_stp_request_started_pio_await_h2d_completion_enter(SCI_BASE_OBJECT_T * object)1813f11c7f63SJim Harris void scic_sds_stp_request_started_pio_await_h2d_completion_enter(
1814f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
1815f11c7f63SJim Harris )
1816f11c7f63SJim Harris {
1817f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
1818f11c7f63SJim Harris
1819f11c7f63SJim Harris SET_STATE_HANDLER(
1820f11c7f63SJim Harris this_request,
1821f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_handler_table,
1822f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_H2D_COMPLETION_SUBSTATE
1823f11c7f63SJim Harris );
1824f11c7f63SJim Harris
1825f11c7f63SJim Harris scic_sds_remote_device_set_working_request(
1826f11c7f63SJim Harris this_request->target_device, this_request);
1827f11c7f63SJim Harris }
1828f11c7f63SJim Harris
1829f11c7f63SJim Harris static
scic_sds_stp_request_started_pio_await_frame_enter(SCI_BASE_OBJECT_T * object)1830f11c7f63SJim Harris void scic_sds_stp_request_started_pio_await_frame_enter(
1831f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
1832f11c7f63SJim Harris )
1833f11c7f63SJim Harris {
1834f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
1835f11c7f63SJim Harris
1836f11c7f63SJim Harris SET_STATE_HANDLER(
1837f11c7f63SJim Harris this_request,
1838f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_handler_table,
1839f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE
1840f11c7f63SJim Harris );
1841f11c7f63SJim Harris }
1842f11c7f63SJim Harris
1843f11c7f63SJim Harris static
scic_sds_stp_request_started_pio_data_in_await_data_enter(SCI_BASE_OBJECT_T * object)1844f11c7f63SJim Harris void scic_sds_stp_request_started_pio_data_in_await_data_enter(
1845f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
1846f11c7f63SJim Harris )
1847f11c7f63SJim Harris {
1848f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
1849f11c7f63SJim Harris
1850f11c7f63SJim Harris SET_STATE_HANDLER(
1851f11c7f63SJim Harris this_request,
1852f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_handler_table,
1853f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_IN_AWAIT_DATA_SUBSTATE
1854f11c7f63SJim Harris );
1855f11c7f63SJim Harris }
1856f11c7f63SJim Harris
1857f11c7f63SJim Harris static
scic_sds_stp_request_started_pio_data_out_transmit_data_enter(SCI_BASE_OBJECT_T * object)1858f11c7f63SJim Harris void scic_sds_stp_request_started_pio_data_out_transmit_data_enter(
1859f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
1860f11c7f63SJim Harris )
1861f11c7f63SJim Harris {
1862f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
1863f11c7f63SJim Harris
1864f11c7f63SJim Harris SET_STATE_HANDLER(
1865f11c7f63SJim Harris this_request,
1866f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_handler_table,
1867f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_OUT_TRANSMIT_DATA_SUBSTATE
1868f11c7f63SJim Harris );
1869f11c7f63SJim Harris }
1870f11c7f63SJim Harris
1871f11c7f63SJim Harris // ---------------------------------------------------------------------------
1872f11c7f63SJim Harris
1873f11c7f63SJim Harris SCI_BASE_STATE_T
1874f11c7f63SJim Harris scic_sds_stp_request_started_pio_substate_table
1875f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_PIO_MAX_SUBSTATES] =
1876f11c7f63SJim Harris {
1877f11c7f63SJim Harris {
1878f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_H2D_COMPLETION_SUBSTATE,
1879f11c7f63SJim Harris scic_sds_stp_request_started_pio_await_h2d_completion_enter,
1880f11c7f63SJim Harris NULL
1881f11c7f63SJim Harris },
1882f11c7f63SJim Harris {
1883f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_AWAIT_FRAME_SUBSTATE,
1884f11c7f63SJim Harris scic_sds_stp_request_started_pio_await_frame_enter,
1885f11c7f63SJim Harris NULL
1886f11c7f63SJim Harris },
1887f11c7f63SJim Harris {
1888f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_IN_AWAIT_DATA_SUBSTATE,
1889f11c7f63SJim Harris scic_sds_stp_request_started_pio_data_in_await_data_enter,
1890f11c7f63SJim Harris NULL
1891f11c7f63SJim Harris },
1892f11c7f63SJim Harris {
1893f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_PIO_DATA_OUT_TRANSMIT_DATA_SUBSTATE,
1894f11c7f63SJim Harris scic_sds_stp_request_started_pio_data_out_transmit_data_enter,
1895f11c7f63SJim Harris NULL
1896f11c7f63SJim Harris }
1897f11c7f63SJim Harris };
1898f11c7f63SJim Harris
1899f11c7f63SJim Harris //******************************************************************************
1900f11c7f63SJim Harris //* UDMA REQUEST STATE MACHINE
1901f11c7f63SJim Harris //******************************************************************************
1902f11c7f63SJim Harris
1903f11c7f63SJim Harris static
scic_sds_stp_request_udma_complete_request(SCIC_SDS_REQUEST_T * this_request,U32 scu_status,SCI_STATUS sci_status)1904f11c7f63SJim Harris void scic_sds_stp_request_udma_complete_request(
1905f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
1906f11c7f63SJim Harris U32 scu_status,
1907f11c7f63SJim Harris SCI_STATUS sci_status
1908f11c7f63SJim Harris )
1909f11c7f63SJim Harris {
1910f11c7f63SJim Harris scic_sds_request_set_status(
1911f11c7f63SJim Harris this_request, scu_status, sci_status
1912f11c7f63SJim Harris );
1913f11c7f63SJim Harris
1914f11c7f63SJim Harris sci_base_state_machine_change_state(
1915f11c7f63SJim Harris &this_request->parent.state_machine,
1916f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
1917f11c7f63SJim Harris );
1918f11c7f63SJim Harris }
1919f11c7f63SJim Harris
1920f11c7f63SJim Harris /**
1921f11c7f63SJim Harris *
1922f11c7f63SJim Harris *
1923f11c7f63SJim Harris * @param[in] this_request
1924f11c7f63SJim Harris * @param[in] frame_index
1925f11c7f63SJim Harris *
1926f11c7f63SJim Harris * @return SCI_STATUS
1927f11c7f63SJim Harris */
1928f11c7f63SJim Harris static
scic_sds_stp_request_udma_general_frame_handler(SCIC_SDS_REQUEST_T * this_request,U32 frame_index)1929f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_udma_general_frame_handler(
1930f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
1931f11c7f63SJim Harris U32 frame_index
1932f11c7f63SJim Harris )
1933f11c7f63SJim Harris {
1934f11c7f63SJim Harris SCI_STATUS status;
1935f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
1936f11c7f63SJim Harris U32 * frame_buffer;
1937f11c7f63SJim Harris
1938f11c7f63SJim Harris SCIC_LOG_TRACE((
1939f11c7f63SJim Harris sci_base_object_get_logger(this_request),
1940f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
1941f11c7f63SJim Harris "scic_sds_stp_pio_request_data_in_await_frame_frame_handler(0x%x, 0x%x) enter\n",
1942f11c7f63SJim Harris this_request, frame_index
1943f11c7f63SJim Harris ));
1944f11c7f63SJim Harris
1945f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
1946f11c7f63SJim Harris &this_request->owning_controller->uf_control,
1947f11c7f63SJim Harris frame_index,
1948f11c7f63SJim Harris (void**) &frame_header
1949f11c7f63SJim Harris );
1950f11c7f63SJim Harris
1951f11c7f63SJim Harris if (
1952f11c7f63SJim Harris (status == SCI_SUCCESS)
1953f11c7f63SJim Harris && (frame_header->fis_type == SATA_FIS_TYPE_REGD2H)
1954f11c7f63SJim Harris )
1955f11c7f63SJim Harris {
1956f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
1957f11c7f63SJim Harris &this_request->owning_controller->uf_control,
1958f11c7f63SJim Harris frame_index,
1959f11c7f63SJim Harris (void**) &frame_buffer
1960f11c7f63SJim Harris );
1961f11c7f63SJim Harris
1962f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
1963f11c7f63SJim Harris &((SCIC_SDS_STP_REQUEST_T *)this_request)->d2h_reg_fis,
1964f11c7f63SJim Harris (U32 *)frame_header,
1965f11c7f63SJim Harris frame_buffer
1966f11c7f63SJim Harris );
1967f11c7f63SJim Harris }
1968f11c7f63SJim Harris
1969f11c7f63SJim Harris scic_sds_controller_release_frame(
1970f11c7f63SJim Harris this_request->owning_controller, frame_index);
1971f11c7f63SJim Harris
1972f11c7f63SJim Harris return status;
1973f11c7f63SJim Harris }
1974f11c7f63SJim Harris
1975f11c7f63SJim Harris /**
1976f11c7f63SJim Harris * @brief This method process TC completions while in the state where
1977f11c7f63SJim Harris * we are waiting for TC completions.
1978f11c7f63SJim Harris *
1979f11c7f63SJim Harris * @param[in] this_request
1980f11c7f63SJim Harris * @param[in] completion_code
1981f11c7f63SJim Harris *
1982f11c7f63SJim Harris * @return SCI_STATUS
1983f11c7f63SJim Harris */
1984f11c7f63SJim Harris static
scic_sds_stp_request_udma_await_tc_completion_tc_completion_handler(SCIC_SDS_REQUEST_T * request,U32 completion_code)1985f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_udma_await_tc_completion_tc_completion_handler(
1986f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
1987f11c7f63SJim Harris U32 completion_code
1988f11c7f63SJim Harris )
1989f11c7f63SJim Harris {
1990f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1991f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request = (SCIC_SDS_STP_REQUEST_T *)request;
1992f11c7f63SJim Harris
1993f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
1994f11c7f63SJim Harris {
1995f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
1996f11c7f63SJim Harris scic_sds_stp_request_udma_complete_request(
1997f11c7f63SJim Harris &this_request->parent, SCU_TASK_DONE_GOOD, SCI_SUCCESS
1998f11c7f63SJim Harris );
1999f11c7f63SJim Harris break;
2000f11c7f63SJim Harris
2001f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_UNEXP_FIS):
2002f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_REG_ERR):
2003f11c7f63SJim Harris // We must check ther response buffer to see if the D2H Register FIS was
2004f11c7f63SJim Harris // received before we got the TC completion.
2005f11c7f63SJim Harris if (this_request->d2h_reg_fis.fis_type == SATA_FIS_TYPE_REGD2H)
2006f11c7f63SJim Harris {
2007f11c7f63SJim Harris scic_sds_remote_device_suspend(
2008f11c7f63SJim Harris this_request->parent.target_device,
2009f11c7f63SJim Harris SCU_EVENT_SPECIFIC(SCU_NORMALIZE_COMPLETION_STATUS(completion_code))
2010f11c7f63SJim Harris );
2011f11c7f63SJim Harris
2012f11c7f63SJim Harris scic_sds_stp_request_udma_complete_request(
2013f11c7f63SJim Harris &this_request->parent,
2014f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
2015f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
2016f11c7f63SJim Harris );
2017f11c7f63SJim Harris }
2018f11c7f63SJim Harris else
2019f11c7f63SJim Harris {
2020f11c7f63SJim Harris // If we have an error completion status for the TC then we can expect a
2021f11c7f63SJim Harris // D2H register FIS from the device so we must change state to wait for it
2022f11c7f63SJim Harris sci_base_state_machine_change_state(
2023f11c7f63SJim Harris &this_request->parent.started_substate_machine,
2024f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE
2025f11c7f63SJim Harris );
2026f11c7f63SJim Harris }
2027f11c7f63SJim Harris break;
2028f11c7f63SJim Harris
2029f11c7f63SJim Harris /// @todo Check to see if any of these completion status need to wait for
2030f11c7f63SJim Harris /// the device to host register fis.
2031f11c7f63SJim Harris /// @todo We can retry the command for SCU_TASK_DONE_CMD_LL_R_ERR - this comes only for B0
2032f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_INV_FIS_LEN):
2033f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_MAX_PLD_ERR):
2034f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_LL_R_ERR):
2035f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_CMD_LL_R_ERR):
2036f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_CRC_ERR):
2037f11c7f63SJim Harris scic_sds_remote_device_suspend(
2038f11c7f63SJim Harris this_request->parent.target_device,
2039f11c7f63SJim Harris SCU_EVENT_SPECIFIC(SCU_NORMALIZE_COMPLETION_STATUS(completion_code))
2040f11c7f63SJim Harris );
2041f11c7f63SJim Harris // Fall through to the default case
2042f11c7f63SJim Harris default:
2043f11c7f63SJim Harris // All other completion status cause the IO to be complete.
2044f11c7f63SJim Harris SCIC_LOG_ERROR((
2045f11c7f63SJim Harris sci_base_object_get_logger(&this_request->parent),
2046f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2047f11c7f63SJim Harris "SCIC IO Request 0x%x returning CONTROLLER_SPECIFIC_IO_ERR for completion code 0x%x\n",
2048f11c7f63SJim Harris &this_request->parent, completion_code
2049f11c7f63SJim Harris ));
2050f11c7f63SJim Harris scic_sds_stp_request_udma_complete_request(
2051f11c7f63SJim Harris &this_request->parent,
2052f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
2053f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
2054f11c7f63SJim Harris );
2055f11c7f63SJim Harris break;
2056f11c7f63SJim Harris }
2057f11c7f63SJim Harris
2058f11c7f63SJim Harris return status;
2059f11c7f63SJim Harris }
2060f11c7f63SJim Harris
2061f11c7f63SJim Harris static
scic_sds_stp_request_udma_await_d2h_reg_fis_frame_handler(SCIC_SDS_REQUEST_T * this_request,U32 frame_index)2062f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_udma_await_d2h_reg_fis_frame_handler(
2063f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
2064f11c7f63SJim Harris U32 frame_index
2065f11c7f63SJim Harris )
2066f11c7f63SJim Harris {
2067f11c7f63SJim Harris SCI_STATUS status;
2068f11c7f63SJim Harris
2069f11c7f63SJim Harris // Use the general frame handler to copy the resposne data
2070f11c7f63SJim Harris status = scic_sds_stp_request_udma_general_frame_handler(this_request, frame_index);
2071f11c7f63SJim Harris
2072f11c7f63SJim Harris if (status == SCI_SUCCESS)
2073f11c7f63SJim Harris {
2074f11c7f63SJim Harris scic_sds_stp_request_udma_complete_request(
2075f11c7f63SJim Harris this_request,
2076f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
2077f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
2078f11c7f63SJim Harris );
2079f11c7f63SJim Harris }
2080f11c7f63SJim Harris
2081f11c7f63SJim Harris return status;
2082f11c7f63SJim Harris }
2083f11c7f63SJim Harris
2084f11c7f63SJim Harris // ---------------------------------------------------------------------------
2085f11c7f63SJim Harris
2086f11c7f63SJim Harris SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
2087f11c7f63SJim Harris scic_sds_stp_request_started_udma_substate_handler_table
2088f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES] =
2089f11c7f63SJim Harris {
2090f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE
2091f11c7f63SJim Harris {
2092f11c7f63SJim Harris {
2093f11c7f63SJim Harris scic_sds_request_default_start_handler,
2094f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
2095f11c7f63SJim Harris scic_sds_request_default_complete_handler,
2096f11c7f63SJim Harris scic_sds_request_default_destruct_handler
2097f11c7f63SJim Harris },
2098f11c7f63SJim Harris scic_sds_stp_request_udma_await_tc_completion_tc_completion_handler,
2099f11c7f63SJim Harris scic_sds_request_default_event_handler,
2100f11c7f63SJim Harris scic_sds_stp_request_udma_general_frame_handler
2101f11c7f63SJim Harris },
2102f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE
2103f11c7f63SJim Harris {
2104f11c7f63SJim Harris {
2105f11c7f63SJim Harris scic_sds_request_default_start_handler,
2106f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
2107f11c7f63SJim Harris scic_sds_request_default_complete_handler,
2108f11c7f63SJim Harris scic_sds_request_default_destruct_handler
2109f11c7f63SJim Harris },
2110f11c7f63SJim Harris scic_sds_request_default_tc_completion_handler,
2111f11c7f63SJim Harris scic_sds_request_default_event_handler,
2112f11c7f63SJim Harris scic_sds_stp_request_udma_await_d2h_reg_fis_frame_handler
2113f11c7f63SJim Harris }
2114f11c7f63SJim Harris };
2115f11c7f63SJim Harris
2116f11c7f63SJim Harris /**
2117f11c7f63SJim Harris *
2118f11c7f63SJim Harris *
2119f11c7f63SJim Harris * @param[in] object
2120f11c7f63SJim Harris */
2121f11c7f63SJim Harris static
scic_sds_stp_request_started_udma_await_tc_completion_enter(SCI_BASE_OBJECT_T * object)2122f11c7f63SJim Harris void scic_sds_stp_request_started_udma_await_tc_completion_enter(
2123f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2124f11c7f63SJim Harris )
2125f11c7f63SJim Harris {
2126f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
2127f11c7f63SJim Harris
2128f11c7f63SJim Harris SET_STATE_HANDLER(
2129f11c7f63SJim Harris this_request,
2130f11c7f63SJim Harris scic_sds_stp_request_started_udma_substate_handler_table,
2131f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE
2132f11c7f63SJim Harris );
2133f11c7f63SJim Harris }
2134f11c7f63SJim Harris
2135f11c7f63SJim Harris /**
2136f11c7f63SJim Harris * This state is entered when there is an TC completion failure. The hardware
2137f11c7f63SJim Harris * received an unexpected condition while processing the IO request and now
2138f11c7f63SJim Harris * will UF the D2H register FIS to complete the IO.
2139f11c7f63SJim Harris *
2140f11c7f63SJim Harris * @param[in] object
2141f11c7f63SJim Harris */
2142f11c7f63SJim Harris static
scic_sds_stp_request_started_udma_await_d2h_reg_fis_enter(SCI_BASE_OBJECT_T * object)2143f11c7f63SJim Harris void scic_sds_stp_request_started_udma_await_d2h_reg_fis_enter(
2144f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2145f11c7f63SJim Harris )
2146f11c7f63SJim Harris {
2147f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
2148f11c7f63SJim Harris
2149f11c7f63SJim Harris SET_STATE_HANDLER(
2150f11c7f63SJim Harris this_request,
2151f11c7f63SJim Harris scic_sds_stp_request_started_udma_substate_handler_table,
2152f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE
2153f11c7f63SJim Harris );
2154f11c7f63SJim Harris }
2155f11c7f63SJim Harris
2156f11c7f63SJim Harris // ---------------------------------------------------------------------------
2157f11c7f63SJim Harris
2158f11c7f63SJim Harris SCI_BASE_STATE_T
2159f11c7f63SJim Harris scic_sds_stp_request_started_udma_substate_table
2160f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES] =
2161f11c7f63SJim Harris {
2162f11c7f63SJim Harris {
2163f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE,
2164f11c7f63SJim Harris scic_sds_stp_request_started_udma_await_tc_completion_enter,
2165f11c7f63SJim Harris NULL
2166f11c7f63SJim Harris },
2167f11c7f63SJim Harris {
2168f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE,
2169f11c7f63SJim Harris scic_sds_stp_request_started_udma_await_d2h_reg_fis_enter,
2170f11c7f63SJim Harris NULL
2171f11c7f63SJim Harris }
2172f11c7f63SJim Harris };
2173f11c7f63SJim Harris
2174f11c7f63SJim Harris //******************************************************************************
2175f11c7f63SJim Harris //* STP SOFT RESET STATE MACHINE
2176f11c7f63SJim Harris //******************************************************************************
2177f11c7f63SJim Harris
2178f11c7f63SJim Harris /**
2179f11c7f63SJim Harris * This method processes a TC completion. The expected TC completion is
2180f11c7f63SJim Harris * for the transmission of the H2D register FIS containing the SATA/STP
2181f11c7f63SJim Harris * non-data request.
2182f11c7f63SJim Harris *
2183f11c7f63SJim Harris * @param[in] this_request
2184f11c7f63SJim Harris * @param[in] completion_code
2185f11c7f63SJim Harris *
2186f11c7f63SJim Harris * @return This method always successfully processes the TC completion.
2187f11c7f63SJim Harris * @retval SCI_SUCCESS This value is always returned.
2188f11c7f63SJim Harris */
2189f11c7f63SJim Harris static
scic_sds_stp_request_soft_reset_await_h2d_asserted_tc_completion_handler(SCIC_SDS_REQUEST_T * this_request,U32 completion_code)2190f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_soft_reset_await_h2d_asserted_tc_completion_handler(
2191f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
2192f11c7f63SJim Harris U32 completion_code
2193f11c7f63SJim Harris )
2194f11c7f63SJim Harris {
2195f11c7f63SJim Harris SCIC_LOG_TRACE((
2196f11c7f63SJim Harris sci_base_object_get_logger(this_request),
2197f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2198f11c7f63SJim Harris "scic_sds_stp_request_soft_reset_await_h2d_tc_completion_handler(0x%x, 0x%x) enter\n",
2199f11c7f63SJim Harris this_request, completion_code
2200f11c7f63SJim Harris ));
2201f11c7f63SJim Harris
2202f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
2203f11c7f63SJim Harris {
2204f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
2205f11c7f63SJim Harris scic_sds_request_set_status(
2206f11c7f63SJim Harris this_request, SCU_TASK_DONE_GOOD, SCI_SUCCESS
2207f11c7f63SJim Harris );
2208f11c7f63SJim Harris
2209f11c7f63SJim Harris sci_base_state_machine_change_state(
2210f11c7f63SJim Harris &this_request->started_substate_machine,
2211f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE
2212f11c7f63SJim Harris );
2213f11c7f63SJim Harris break;
2214f11c7f63SJim Harris
2215f11c7f63SJim Harris default:
2216f11c7f63SJim Harris // All other completion status cause the IO to be complete. If a NAK
2217f11c7f63SJim Harris // was received, then it is up to the user to retry the request.
2218f11c7f63SJim Harris scic_sds_request_set_status(
2219f11c7f63SJim Harris this_request,
2220f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
2221f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
2222f11c7f63SJim Harris );
2223f11c7f63SJim Harris
2224f11c7f63SJim Harris sci_base_state_machine_change_state(
2225f11c7f63SJim Harris &this_request->parent.state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
2226f11c7f63SJim Harris );
2227f11c7f63SJim Harris break;
2228f11c7f63SJim Harris }
2229f11c7f63SJim Harris
2230f11c7f63SJim Harris return SCI_SUCCESS;
2231f11c7f63SJim Harris }
2232f11c7f63SJim Harris
2233f11c7f63SJim Harris /**
2234f11c7f63SJim Harris * This method processes a TC completion. The expected TC completion is
2235f11c7f63SJim Harris * for the transmission of the H2D register FIS containing the SATA/STP
2236f11c7f63SJim Harris * non-data request.
2237f11c7f63SJim Harris *
2238f11c7f63SJim Harris * @param[in] this_request
2239f11c7f63SJim Harris * @param[in] completion_code
2240f11c7f63SJim Harris *
2241f11c7f63SJim Harris * @return This method always successfully processes the TC completion.
2242f11c7f63SJim Harris * @retval SCI_SUCCESS This value is always returned.
2243f11c7f63SJim Harris */
2244f11c7f63SJim Harris static
scic_sds_stp_request_soft_reset_await_h2d_diagnostic_tc_completion_handler(SCIC_SDS_REQUEST_T * this_request,U32 completion_code)2245f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_soft_reset_await_h2d_diagnostic_tc_completion_handler(
2246f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request,
2247f11c7f63SJim Harris U32 completion_code
2248f11c7f63SJim Harris )
2249f11c7f63SJim Harris {
2250f11c7f63SJim Harris SCIC_LOG_TRACE((
2251f11c7f63SJim Harris sci_base_object_get_logger(this_request),
2252f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2253f11c7f63SJim Harris "scic_sds_stp_request_soft_reset_await_h2d_tc_completion_handler(0x%x, 0x%x) enter\n",
2254f11c7f63SJim Harris this_request, completion_code
2255f11c7f63SJim Harris ));
2256f11c7f63SJim Harris
2257f11c7f63SJim Harris switch (SCU_GET_COMPLETION_TL_STATUS(completion_code))
2258f11c7f63SJim Harris {
2259f11c7f63SJim Harris case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
2260f11c7f63SJim Harris scic_sds_request_set_status(
2261f11c7f63SJim Harris this_request, SCU_TASK_DONE_GOOD, SCI_SUCCESS
2262f11c7f63SJim Harris );
2263f11c7f63SJim Harris
2264f11c7f63SJim Harris sci_base_state_machine_change_state(
2265f11c7f63SJim Harris &this_request->started_substate_machine,
2266f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE
2267f11c7f63SJim Harris );
2268f11c7f63SJim Harris break;
2269f11c7f63SJim Harris
2270f11c7f63SJim Harris default:
2271f11c7f63SJim Harris // All other completion status cause the IO to be complete. If a NAK
2272f11c7f63SJim Harris // was received, then it is up to the user to retry the request.
2273f11c7f63SJim Harris scic_sds_request_set_status(
2274f11c7f63SJim Harris this_request,
2275f11c7f63SJim Harris SCU_NORMALIZE_COMPLETION_STATUS(completion_code),
2276f11c7f63SJim Harris SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
2277f11c7f63SJim Harris );
2278f11c7f63SJim Harris
2279f11c7f63SJim Harris sci_base_state_machine_change_state(
2280f11c7f63SJim Harris &this_request->parent.state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
2281f11c7f63SJim Harris );
2282f11c7f63SJim Harris break;
2283f11c7f63SJim Harris }
2284f11c7f63SJim Harris
2285f11c7f63SJim Harris return SCI_SUCCESS;
2286f11c7f63SJim Harris }
2287f11c7f63SJim Harris
2288f11c7f63SJim Harris /**
2289f11c7f63SJim Harris * This method processes frames received from the target while waiting
2290f11c7f63SJim Harris * for a device to host register FIS. If a non-register FIS is received
2291f11c7f63SJim Harris * during this time, it is treated as a protocol violation from an
2292f11c7f63SJim Harris * IO perspective.
2293f11c7f63SJim Harris *
2294f11c7f63SJim Harris * @param[in] request This parameter specifies the request for which a
2295f11c7f63SJim Harris * frame has been received.
2296f11c7f63SJim Harris * @param[in] frame_index This parameter specifies the index of the frame
2297f11c7f63SJim Harris * that has been received.
2298f11c7f63SJim Harris *
2299f11c7f63SJim Harris * @return Indicate if the received frame was processed successfully.
2300f11c7f63SJim Harris */
2301f11c7f63SJim Harris static
scic_sds_stp_request_soft_reset_await_d2h_frame_handler(SCIC_SDS_REQUEST_T * request,U32 frame_index)2302f11c7f63SJim Harris SCI_STATUS scic_sds_stp_request_soft_reset_await_d2h_frame_handler(
2303f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request,
2304f11c7f63SJim Harris U32 frame_index
2305f11c7f63SJim Harris )
2306f11c7f63SJim Harris {
2307f11c7f63SJim Harris SCI_STATUS status;
2308f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
2309f11c7f63SJim Harris U32 * frame_buffer;
2310f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_T * this_request = (SCIC_SDS_STP_REQUEST_T *)request;
2311f11c7f63SJim Harris
2312f11c7f63SJim Harris // Save off the controller, so that we do not touch the request after it
2313f11c7f63SJim Harris // is completed.
2314f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T * owning_controller = this_request->parent.owning_controller;
2315f11c7f63SJim Harris
2316f11c7f63SJim Harris SCIC_LOG_TRACE((
2317f11c7f63SJim Harris sci_base_object_get_logger(this_request),
2318f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2319f11c7f63SJim Harris "scic_sds_stp_request_soft_reset_await_d2h_frame_handler(0x%x, 0x%x) enter\n",
2320f11c7f63SJim Harris this_request, frame_index
2321f11c7f63SJim Harris ));
2322f11c7f63SJim Harris
2323f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
2324f11c7f63SJim Harris &(owning_controller->uf_control),
2325f11c7f63SJim Harris frame_index,
2326f11c7f63SJim Harris (void**) &frame_header
2327f11c7f63SJim Harris );
2328f11c7f63SJim Harris
2329f11c7f63SJim Harris if (status == SCI_SUCCESS)
2330f11c7f63SJim Harris {
2331f11c7f63SJim Harris switch (frame_header->fis_type)
2332f11c7f63SJim Harris {
2333f11c7f63SJim Harris case SATA_FIS_TYPE_REGD2H:
2334f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
2335f11c7f63SJim Harris &(owning_controller->uf_control),
2336f11c7f63SJim Harris frame_index,
2337f11c7f63SJim Harris (void**) &frame_buffer
2338f11c7f63SJim Harris );
2339f11c7f63SJim Harris
2340f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
2341f11c7f63SJim Harris &this_request->d2h_reg_fis, (U32 *)frame_header, frame_buffer
2342f11c7f63SJim Harris );
2343f11c7f63SJim Harris
2344f11c7f63SJim Harris // The command has completed with error
2345f11c7f63SJim Harris scic_sds_request_set_status(
2346f11c7f63SJim Harris &this_request->parent,
2347f11c7f63SJim Harris SCU_TASK_DONE_CHECK_RESPONSE,
2348f11c7f63SJim Harris SCI_FAILURE_IO_RESPONSE_VALID
2349f11c7f63SJim Harris );
2350f11c7f63SJim Harris break;
2351f11c7f63SJim Harris
2352f11c7f63SJim Harris default:
2353f11c7f63SJim Harris SCIC_LOG_WARNING((
2354f11c7f63SJim Harris sci_base_object_get_logger(this_request),
2355f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2356f11c7f63SJim Harris "IO Request:0x%x Frame Id:%d protocol violation occurred\n",
2357f11c7f63SJim Harris this_request, frame_index
2358f11c7f63SJim Harris ));
2359f11c7f63SJim Harris
2360f11c7f63SJim Harris scic_sds_request_set_status(
2361f11c7f63SJim Harris &this_request->parent,
2362f11c7f63SJim Harris SCU_TASK_DONE_UNEXP_FIS,
2363f11c7f63SJim Harris SCI_FAILURE_PROTOCOL_VIOLATION
2364f11c7f63SJim Harris );
2365f11c7f63SJim Harris break;
2366f11c7f63SJim Harris }
2367f11c7f63SJim Harris
2368f11c7f63SJim Harris sci_base_state_machine_change_state(
2369f11c7f63SJim Harris &this_request->parent.parent.state_machine,
2370f11c7f63SJim Harris SCI_BASE_REQUEST_STATE_COMPLETED
2371f11c7f63SJim Harris );
2372f11c7f63SJim Harris
2373f11c7f63SJim Harris // Frame has been decoded return it to the controller
2374f11c7f63SJim Harris scic_sds_controller_release_frame(
2375f11c7f63SJim Harris owning_controller, frame_index
2376f11c7f63SJim Harris );
2377f11c7f63SJim Harris }
2378f11c7f63SJim Harris else
2379f11c7f63SJim Harris {
2380f11c7f63SJim Harris SCIC_LOG_ERROR((
2381f11c7f63SJim Harris sci_base_object_get_logger(this_request),
2382f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2383f11c7f63SJim Harris "SCIC IO Request 0x%x could not get frame header for frame index %d, status %x\n",
2384f11c7f63SJim Harris this_request, frame_index, status
2385f11c7f63SJim Harris ));
2386f11c7f63SJim Harris }
2387f11c7f63SJim Harris
2388f11c7f63SJim Harris return status;
2389f11c7f63SJim Harris }
2390f11c7f63SJim Harris
2391f11c7f63SJim Harris // ---------------------------------------------------------------------------
2392f11c7f63SJim Harris
2393f11c7f63SJim Harris SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
2394f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_handler_table
2395f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES] =
2396f11c7f63SJim Harris {
2397f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE
2398f11c7f63SJim Harris {
2399f11c7f63SJim Harris {
2400f11c7f63SJim Harris scic_sds_request_default_start_handler,
2401f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
2402f11c7f63SJim Harris scic_sds_request_default_complete_handler,
2403f11c7f63SJim Harris scic_sds_request_default_destruct_handler
2404f11c7f63SJim Harris },
2405f11c7f63SJim Harris scic_sds_stp_request_soft_reset_await_h2d_asserted_tc_completion_handler,
2406f11c7f63SJim Harris scic_sds_request_default_event_handler,
2407f11c7f63SJim Harris scic_sds_request_default_frame_handler
2408f11c7f63SJim Harris },
2409f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE
2410f11c7f63SJim Harris {
2411f11c7f63SJim Harris {
2412f11c7f63SJim Harris scic_sds_request_default_start_handler,
2413f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
2414f11c7f63SJim Harris scic_sds_request_default_complete_handler,
2415f11c7f63SJim Harris scic_sds_request_default_destruct_handler
2416f11c7f63SJim Harris },
2417f11c7f63SJim Harris scic_sds_stp_request_soft_reset_await_h2d_diagnostic_tc_completion_handler,
2418f11c7f63SJim Harris scic_sds_request_default_event_handler,
2419f11c7f63SJim Harris scic_sds_request_default_frame_handler
2420f11c7f63SJim Harris },
2421f11c7f63SJim Harris // SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE
2422f11c7f63SJim Harris {
2423f11c7f63SJim Harris {
2424f11c7f63SJim Harris scic_sds_request_default_start_handler,
2425f11c7f63SJim Harris scic_sds_request_started_state_abort_handler,
2426f11c7f63SJim Harris scic_sds_request_default_complete_handler,
2427f11c7f63SJim Harris scic_sds_request_default_destruct_handler
2428f11c7f63SJim Harris },
2429f11c7f63SJim Harris scic_sds_request_default_tc_completion_handler,
2430f11c7f63SJim Harris scic_sds_request_default_event_handler,
2431f11c7f63SJim Harris scic_sds_stp_request_soft_reset_await_d2h_frame_handler
2432f11c7f63SJim Harris }
2433f11c7f63SJim Harris };
2434f11c7f63SJim Harris
2435f11c7f63SJim Harris static
scic_sds_stp_request_started_soft_reset_await_h2d_asserted_completion_enter(SCI_BASE_OBJECT_T * object)2436f11c7f63SJim Harris void scic_sds_stp_request_started_soft_reset_await_h2d_asserted_completion_enter(
2437f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2438f11c7f63SJim Harris )
2439f11c7f63SJim Harris {
2440f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
2441f11c7f63SJim Harris
2442f11c7f63SJim Harris SET_STATE_HANDLER(
2443f11c7f63SJim Harris this_request,
2444f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_handler_table,
2445f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE
2446f11c7f63SJim Harris );
2447f11c7f63SJim Harris
2448f11c7f63SJim Harris scic_sds_remote_device_set_working_request(
2449f11c7f63SJim Harris this_request->target_device, this_request
2450f11c7f63SJim Harris );
2451f11c7f63SJim Harris }
2452f11c7f63SJim Harris
2453f11c7f63SJim Harris static
scic_sds_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter(SCI_BASE_OBJECT_T * object)2454f11c7f63SJim Harris void scic_sds_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter(
2455f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2456f11c7f63SJim Harris )
2457f11c7f63SJim Harris {
2458f11c7f63SJim Harris SCI_STATUS status;
2459f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
2460f11c7f63SJim Harris SATA_FIS_REG_H2D_T *h2d_fis;
2461f11c7f63SJim Harris SCU_TASK_CONTEXT_T *task_context;
2462f11c7f63SJim Harris
2463f11c7f63SJim Harris // Clear the SRST bit
2464f11c7f63SJim Harris h2d_fis = scic_stp_io_request_get_h2d_reg_address(this_request);
2465f11c7f63SJim Harris h2d_fis->control = 0;
2466f11c7f63SJim Harris
2467f11c7f63SJim Harris // Clear the TC control bit
2468f11c7f63SJim Harris task_context = scic_sds_controller_get_task_context_buffer(
2469f11c7f63SJim Harris this_request->owning_controller, this_request->io_tag);
2470f11c7f63SJim Harris task_context->control_frame = 0;
2471f11c7f63SJim Harris
2472f11c7f63SJim Harris status = this_request->owning_controller->state_handlers->parent.continue_io_handler(
2473f11c7f63SJim Harris &this_request->owning_controller->parent,
2474f11c7f63SJim Harris &this_request->target_device->parent,
2475f11c7f63SJim Harris &this_request->parent
2476f11c7f63SJim Harris );
2477f11c7f63SJim Harris
2478f11c7f63SJim Harris if (status == SCI_SUCCESS)
2479f11c7f63SJim Harris {
2480f11c7f63SJim Harris SET_STATE_HANDLER(
2481f11c7f63SJim Harris this_request,
2482f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_handler_table,
2483f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE
2484f11c7f63SJim Harris );
2485f11c7f63SJim Harris }
2486f11c7f63SJim Harris }
2487f11c7f63SJim Harris
2488f11c7f63SJim Harris static
scic_sds_stp_request_started_soft_reset_await_d2h_response_enter(SCI_BASE_OBJECT_T * object)2489f11c7f63SJim Harris void scic_sds_stp_request_started_soft_reset_await_d2h_response_enter(
2490f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2491f11c7f63SJim Harris )
2492f11c7f63SJim Harris {
2493f11c7f63SJim Harris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)object;
2494f11c7f63SJim Harris
2495f11c7f63SJim Harris SET_STATE_HANDLER(
2496f11c7f63SJim Harris this_request,
2497f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_handler_table,
2498f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE
2499f11c7f63SJim Harris );
2500f11c7f63SJim Harris }
2501f11c7f63SJim Harris
2502f11c7f63SJim Harris // ---------------------------------------------------------------------------
2503f11c7f63SJim Harris
2504f11c7f63SJim Harris SCI_BASE_STATE_T
2505f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_substate_table
2506f11c7f63SJim Harris [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES] =
2507f11c7f63SJim Harris {
2508f11c7f63SJim Harris {
2509f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE,
2510f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_await_h2d_asserted_completion_enter,
2511f11c7f63SJim Harris NULL
2512f11c7f63SJim Harris },
2513f11c7f63SJim Harris {
2514f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE,
2515f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter,
2516f11c7f63SJim Harris NULL
2517f11c7f63SJim Harris },
2518f11c7f63SJim Harris {
2519f11c7f63SJim Harris SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE,
2520f11c7f63SJim Harris scic_sds_stp_request_started_soft_reset_await_d2h_response_enter,
2521f11c7f63SJim Harris NULL
2522f11c7f63SJim Harris }
2523f11c7f63SJim Harris };
2524f11c7f63SJim Harris
2525f11c7f63SJim Harris // ---------------------------------------------------------------------------
2526f11c7f63SJim Harris
scic_io_request_construct_basic_sata(SCI_IO_REQUEST_HANDLE_T scic_io_request)2527f11c7f63SJim Harris SCI_STATUS scic_io_request_construct_basic_sata(
2528f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T scic_io_request
2529f11c7f63SJim Harris )
2530f11c7f63SJim Harris {
2531f11c7f63SJim Harris SCI_STATUS status;
2532f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request = (SCIC_SDS_REQUEST_T *)scic_io_request;
2533f11c7f63SJim Harris
2534f11c7f63SJim Harris SCIC_LOG_TRACE((
2535f11c7f63SJim Harris sci_base_object_get_logger(scic_io_request),
2536f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2537f11c7f63SJim Harris "scic_io_request_construct_basic_sata(0x%x) enter\n",
2538f11c7f63SJim Harris scic_io_request
2539f11c7f63SJim Harris ));
2540f11c7f63SJim Harris
2541f11c7f63SJim Harris status = scic_sds_io_request_construct_sata(
2542f11c7f63SJim Harris request,
2543f11c7f63SJim Harris scic_cb_request_get_sat_protocol(request->user_request),
2544f11c7f63SJim Harris scic_cb_io_request_get_transfer_length(request->user_request),
2545f11c7f63SJim Harris scic_cb_io_request_get_data_direction(request->user_request),
2546f11c7f63SJim Harris scic_cb_io_request_do_copy_rx_frames(request->user_request),
2547f11c7f63SJim Harris TRUE
2548f11c7f63SJim Harris );
2549f11c7f63SJim Harris
2550f11c7f63SJim Harris return status;
2551f11c7f63SJim Harris }
2552f11c7f63SJim Harris
2553f11c7f63SJim Harris // ---------------------------------------------------------------------------
2554f11c7f63SJim Harris
scic_io_request_construct_advanced_sata(SCI_IO_REQUEST_HANDLE_T scic_io_request,SCIC_IO_SATA_PARAMETERS_T * io_parameters)2555f11c7f63SJim Harris SCI_STATUS scic_io_request_construct_advanced_sata(
2556f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T scic_io_request,
2557f11c7f63SJim Harris SCIC_IO_SATA_PARAMETERS_T * io_parameters
2558f11c7f63SJim Harris )
2559f11c7f63SJim Harris {
2560f11c7f63SJim Harris SCI_STATUS status;
2561f11c7f63SJim Harris SCIC_SDS_REQUEST_T * request = (SCIC_SDS_REQUEST_T *)scic_io_request;
2562f11c7f63SJim Harris
2563f11c7f63SJim Harris SCIC_LOG_TRACE((
2564f11c7f63SJim Harris sci_base_object_get_logger(scic_io_request),
2565f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_IO_REQUEST,
2566f11c7f63SJim Harris "scic_io_request_construct_basic_sata(0x%x) enter\n",
2567f11c7f63SJim Harris scic_io_request
2568f11c7f63SJim Harris ));
2569f11c7f63SJim Harris
2570f11c7f63SJim Harris status = scic_sds_io_request_construct_sata(
2571f11c7f63SJim Harris request,
2572f11c7f63SJim Harris scic_cb_request_get_sat_protocol(request->user_request),
2573f11c7f63SJim Harris scic_sds_request_get_sgl_element_pair(request, 0)->A.length,
2574f11c7f63SJim Harris scic_cb_io_request_get_data_direction(request->user_request),
2575f11c7f63SJim Harris scic_cb_io_request_do_copy_rx_frames(request->user_request),
2576f11c7f63SJim Harris io_parameters->do_translate_sgl
2577f11c7f63SJim Harris );
2578f11c7f63SJim Harris
2579f11c7f63SJim Harris return status;
2580f11c7f63SJim Harris }
2581f11c7f63SJim Harris
2582