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 /**
57f11c7f63SJim Harris * @file
58f11c7f63SJim Harris *
59f11c7f63SJim Harris * @brief This file contains the methods and state machines for SATA/STP
60f11c7f63SJim Harris * remote devices.
61f11c7f63SJim Harris */
62f11c7f63SJim Harris
63f11c7f63SJim Harris #include <dev/isci/scil/intel_sat.h>
64f11c7f63SJim Harris #include <dev/isci/scil/intel_ata.h>
65f11c7f63SJim Harris #include <dev/isci/scil/intel_sata.h>
66f11c7f63SJim Harris #include <dev/isci/scil/scic_remote_device.h>
67f11c7f63SJim Harris #include <dev/isci/scil/scic_user_callback.h>
68f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_logger.h>
69f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_controller.h>
70f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_port.h>
71f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_remote_device.h>
72f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_request.h>
73f11c7f63SJim Harris #include <dev/isci/scil/scu_event_codes.h>
74f11c7f63SJim Harris #include <dev/isci/scil/scu_completion_codes.h>
75f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state.h>
76f11c7f63SJim Harris
77f11c7f63SJim Harris /**
78f11c7f63SJim Harris * This method will perform the STP request completion processing common
79f11c7f63SJim Harris * to IO requests and task requests of all types
80f11c7f63SJim Harris *
81f11c7f63SJim Harris * @param[in] device This parameter specifies the device for which the
82f11c7f63SJim Harris * request is being completed.
83f11c7f63SJim Harris * @param[in] request This parameter specifies the request being completed.
84f11c7f63SJim Harris *
85f11c7f63SJim Harris * @return This method returns an indication as to whether the request
86f11c7f63SJim Harris * processing completed successfully.
87f11c7f63SJim Harris */
88f11c7f63SJim Harris static
scic_sds_stp_remote_device_complete_request(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)89f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_complete_request(
90f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
91f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
92f11c7f63SJim Harris )
93f11c7f63SJim Harris {
94f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
95f11c7f63SJim Harris SCIC_SDS_REQUEST_T * the_request = (SCIC_SDS_REQUEST_T *)request;
96f11c7f63SJim Harris SCI_STATUS status;
97f11c7f63SJim Harris
98f11c7f63SJim Harris status = scic_sds_io_request_complete(the_request);
99f11c7f63SJim Harris
100f11c7f63SJim Harris if (status == SCI_SUCCESS)
101f11c7f63SJim Harris {
102f11c7f63SJim Harris status = scic_sds_port_complete_io(
103f11c7f63SJim Harris this_device->owning_port, this_device, the_request
104f11c7f63SJim Harris );
105f11c7f63SJim Harris
106f11c7f63SJim Harris if (status == SCI_SUCCESS)
107f11c7f63SJim Harris {
108f11c7f63SJim Harris scic_sds_remote_device_decrement_request_count(this_device);
109f11c7f63SJim Harris if (the_request->sci_status == SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED)
110f11c7f63SJim Harris {
111f11c7f63SJim Harris //This request causes hardware error, device needs to be Lun Reset.
112f11c7f63SJim Harris //So here we force the state machine to IDLE state so the rest IOs
113f11c7f63SJim Harris //can reach RNC state handler, these IOs will be completed by RNC with
114f11c7f63SJim Harris //status of "DEVICE_RESET_REQUIRED", instead of "INVALID STATE".
115f11c7f63SJim Harris sci_base_state_machine_change_state(
116f11c7f63SJim Harris &this_device->ready_substate_machine,
117f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET
118f11c7f63SJim Harris );
119f11c7f63SJim Harris }
120f11c7f63SJim Harris else if (scic_sds_remote_device_get_request_count(this_device) == 0)
121f11c7f63SJim Harris {
122f11c7f63SJim Harris sci_base_state_machine_change_state(
123f11c7f63SJim Harris &this_device->ready_substate_machine,
124f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE
125f11c7f63SJim Harris );
126f11c7f63SJim Harris }
127f11c7f63SJim Harris }
128f11c7f63SJim Harris }
129f11c7f63SJim Harris
130f11c7f63SJim Harris if (status != SCI_SUCCESS)
131f11c7f63SJim Harris {
132f11c7f63SJim Harris SCIC_LOG_ERROR((
133f11c7f63SJim Harris sci_base_object_get_logger(this_device),
134f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_REMOTE_TARGET,
135f11c7f63SJim Harris "Port:0x%x Device:0x%x Request:0x%x Status:0x%x could not complete\n",
136f11c7f63SJim Harris this_device->owning_port, this_device, the_request, status
137f11c7f63SJim Harris ));
138f11c7f63SJim Harris }
139f11c7f63SJim Harris
140f11c7f63SJim Harris return status;
141f11c7f63SJim Harris }
142f11c7f63SJim Harris
143f11c7f63SJim Harris //*****************************************************************************
144f11c7f63SJim Harris //* STP REMOTE DEVICE READY COMMON SUBSTATE HANDLERS
145f11c7f63SJim Harris //*****************************************************************************
146f11c7f63SJim Harris
147f11c7f63SJim Harris /**
148f11c7f63SJim Harris * This is the READY NCQ substate handler to start task management request. In this
149f11c7f63SJim Harris * routine, we suspend and resume the RNC.
150f11c7f63SJim Harris *
151f11c7f63SJim Harris * @param[in] device The target device a task management request towards to.
152f11c7f63SJim Harris * @param[in] request The task request.
153f11c7f63SJim Harris *
154f11c7f63SJim Harris * @return SCI_STATUS Always return SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS status
155f11c7f63SJim Harris * to let controller_start_task_handler know that the controller can't post TC for
156f11c7f63SJim Harris * task request yet, instead, when RNC gets resumed, a controller_continue_task
157f11c7f63SJim Harris * callback will be called.
158f11c7f63SJim Harris */
159f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_substate_start_request_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)160f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_substate_start_request_handler(
161f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
162f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
163f11c7f63SJim Harris )
164f11c7f63SJim Harris {
165f11c7f63SJim Harris SCI_STATUS status;
166f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
167f11c7f63SJim Harris SCIC_SDS_REQUEST_T * this_request = (SCIC_SDS_REQUEST_T *)request;
168f11c7f63SJim Harris
169f11c7f63SJim Harris // Will the port allow the io request to start?
170f11c7f63SJim Harris status = this_device->owning_port->state_handlers->start_io_handler(
171f11c7f63SJim Harris this_device->owning_port,
172f11c7f63SJim Harris this_device,
173f11c7f63SJim Harris this_request
174f11c7f63SJim Harris );
175f11c7f63SJim Harris
176f11c7f63SJim Harris if (SCI_SUCCESS == status)
177f11c7f63SJim Harris {
178f11c7f63SJim Harris status =
179f11c7f63SJim Harris scic_sds_remote_node_context_start_task(this_device->rnc, this_request);
180f11c7f63SJim Harris
181f11c7f63SJim Harris if (SCI_SUCCESS == status)
182f11c7f63SJim Harris {
183f11c7f63SJim Harris status = this_request->state_handlers->parent.start_handler(request);
184f11c7f63SJim Harris }
185f11c7f63SJim Harris
186f11c7f63SJim Harris if (status == SCI_SUCCESS)
187f11c7f63SJim Harris {
188f11c7f63SJim Harris /// @note If the remote device state is not IDLE this will replace
189f11c7f63SJim Harris /// the request that probably resulted in the task management
190f11c7f63SJim Harris /// request.
191f11c7f63SJim Harris this_device->working_request = this_request;
192f11c7f63SJim Harris
193f11c7f63SJim Harris sci_base_state_machine_change_state(
194f11c7f63SJim Harris &this_device->ready_substate_machine,
195f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD
196f11c7f63SJim Harris );
197f11c7f63SJim Harris
198f11c7f63SJim Harris //The remote node context must cleanup the TCi to NCQ mapping table.
199f11c7f63SJim Harris //The only way to do this correctly is to either write to the TLCR
200f11c7f63SJim Harris //register or to invalidate and repost the RNC. In either case the
201f11c7f63SJim Harris //remote node context state machine will take the correct action when
202f11c7f63SJim Harris //the remote node context is suspended and later resumed.
203f11c7f63SJim Harris scic_sds_remote_node_context_suspend(
204f11c7f63SJim Harris this_device->rnc, SCI_SOFTWARE_SUSPENSION, NULL, NULL);
205f11c7f63SJim Harris
206f11c7f63SJim Harris scic_sds_remote_node_context_resume(
207f11c7f63SJim Harris this_device->rnc,
208f11c7f63SJim Harris (SCIC_SDS_REMOTE_NODE_CONTEXT_CALLBACK)
209f11c7f63SJim Harris scic_sds_remote_device_continue_request,
210f11c7f63SJim Harris this_device);
211f11c7f63SJim Harris }
212f11c7f63SJim Harris
213f11c7f63SJim Harris scic_sds_remote_device_start_request(this_device,this_request,status);
214f11c7f63SJim Harris
215f11c7f63SJim Harris //We need to let the controller start request handler know that it can't
216f11c7f63SJim Harris //post TC yet. We will provide a callback function to post TC when RNC gets
217f11c7f63SJim Harris //resumed.
218f11c7f63SJim Harris return SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS;
219f11c7f63SJim Harris }
220f11c7f63SJim Harris
221f11c7f63SJim Harris return status;
222f11c7f63SJim Harris }
223f11c7f63SJim Harris
224f11c7f63SJim Harris //*****************************************************************************
225f11c7f63SJim Harris //* STP REMOTE DEVICE READY IDLE SUBSTATE HANDLERS
226f11c7f63SJim Harris //*****************************************************************************
227f11c7f63SJim Harris
228f11c7f63SJim Harris /**
229f11c7f63SJim Harris * This method will handle the start io operation for a sata device that is in
230f11c7f63SJim Harris * the command idle state.
231f11c7f63SJim Harris * - Evalute the type of IO request to be started
232f11c7f63SJim Harris * - If its an NCQ request change to NCQ substate
233f11c7f63SJim Harris * - If its any other command change to the CMD substate
234f11c7f63SJim Harris *
235f11c7f63SJim Harris * @note If this is a softreset we may want to have a different substate.
236f11c7f63SJim Harris *
237f11c7f63SJim Harris * @param [in] device
238f11c7f63SJim Harris * @param [in] request
239f11c7f63SJim Harris *
240f11c7f63SJim Harris * @return SCI_STATUS
241f11c7f63SJim Harris */
242f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_idle_substate_start_io_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)243f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_idle_substate_start_io_handler(
244f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
245f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
246f11c7f63SJim Harris )
247f11c7f63SJim Harris {
248f11c7f63SJim Harris SCI_STATUS status;
249f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
250f11c7f63SJim Harris SCIC_SDS_REQUEST_T * io_request = (SCIC_SDS_REQUEST_T *)request;
251f11c7f63SJim Harris
252f11c7f63SJim Harris
253f11c7f63SJim Harris // Will the port allow the io request to start?
254f11c7f63SJim Harris status = this_device->owning_port->state_handlers->start_io_handler(
255f11c7f63SJim Harris this_device->owning_port,
256f11c7f63SJim Harris this_device,
257f11c7f63SJim Harris io_request
258f11c7f63SJim Harris );
259f11c7f63SJim Harris
260f11c7f63SJim Harris if (status == SCI_SUCCESS)
261f11c7f63SJim Harris {
262f11c7f63SJim Harris status =
263f11c7f63SJim Harris scic_sds_remote_node_context_start_io(this_device->rnc, io_request);
264f11c7f63SJim Harris
265f11c7f63SJim Harris if (status == SCI_SUCCESS)
266f11c7f63SJim Harris {
267f11c7f63SJim Harris status = io_request->state_handlers->parent.start_handler(request);
268f11c7f63SJim Harris }
269f11c7f63SJim Harris
270f11c7f63SJim Harris if (status == SCI_SUCCESS)
271f11c7f63SJim Harris {
272f11c7f63SJim Harris if (io_request->sat_protocol == SAT_PROTOCOL_FPDMA)
273f11c7f63SJim Harris {
274f11c7f63SJim Harris sci_base_state_machine_change_state(
275f11c7f63SJim Harris &this_device->ready_substate_machine,
276f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ
277f11c7f63SJim Harris );
278f11c7f63SJim Harris }
279f11c7f63SJim Harris else
280f11c7f63SJim Harris {
281f11c7f63SJim Harris this_device->working_request = io_request;
282f11c7f63SJim Harris
283f11c7f63SJim Harris sci_base_state_machine_change_state(
284f11c7f63SJim Harris &this_device->ready_substate_machine,
285f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD
286f11c7f63SJim Harris );
287f11c7f63SJim Harris }
288f11c7f63SJim Harris }
289f11c7f63SJim Harris
290f11c7f63SJim Harris scic_sds_remote_device_start_request(this_device, io_request, status);
291f11c7f63SJim Harris }
292f11c7f63SJim Harris
293f11c7f63SJim Harris return status;
294f11c7f63SJim Harris }
295f11c7f63SJim Harris
296f11c7f63SJim Harris
297f11c7f63SJim Harris /**
298f11c7f63SJim Harris * This method will handle the event for a sata device that is in
299f11c7f63SJim Harris * the idle state. We pick up suspension events to handle specifically
300f11c7f63SJim Harris * to this state. We resume the RNC right away.
301f11c7f63SJim Harris *
302f11c7f63SJim Harris * @param [in] device The device received event.
303f11c7f63SJim Harris * @param [in] event_code The event code.
304f11c7f63SJim Harris *
305f11c7f63SJim Harris * @return SCI_STATUS
306f11c7f63SJim Harris */
307f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_idle_substate_event_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 event_code)308f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_idle_substate_event_handler(
309f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
310f11c7f63SJim Harris U32 event_code
311f11c7f63SJim Harris )
312f11c7f63SJim Harris {
313f11c7f63SJim Harris SCI_STATUS status;
314f11c7f63SJim Harris
315f11c7f63SJim Harris status = scic_sds_remote_device_general_event_handler(this_device, event_code);
316f11c7f63SJim Harris
317f11c7f63SJim Harris if (status == SCI_SUCCESS)
318f11c7f63SJim Harris {
319f11c7f63SJim Harris if ((scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX
320f11c7f63SJim Harris || scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX)
321f11c7f63SJim Harris && (this_device->rnc->destination_state != SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_READY))
322f11c7f63SJim Harris {
323f11c7f63SJim Harris status = scic_sds_remote_node_context_resume(
324f11c7f63SJim Harris this_device->rnc, NULL, NULL);
325f11c7f63SJim Harris }
326f11c7f63SJim Harris }
327f11c7f63SJim Harris
328f11c7f63SJim Harris return status;
329f11c7f63SJim Harris }
330f11c7f63SJim Harris
331f11c7f63SJim Harris
332f11c7f63SJim Harris //*****************************************************************************
333f11c7f63SJim Harris //* STP REMOTE DEVICE READY NCQ SUBSTATE HANDLERS
334f11c7f63SJim Harris //*****************************************************************************
335f11c7f63SJim Harris
336f11c7f63SJim Harris /**
337f11c7f63SJim Harris *
338f11c7f63SJim Harris */
339f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_ncq_substate_start_io_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)340f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_ncq_substate_start_io_handler(
341f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
342f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
343f11c7f63SJim Harris )
344f11c7f63SJim Harris {
345f11c7f63SJim Harris SCI_STATUS status;
346f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
347f11c7f63SJim Harris SCIC_SDS_REQUEST_T * io_request = (SCIC_SDS_REQUEST_T *)request;
348f11c7f63SJim Harris
349f11c7f63SJim Harris if (io_request->sat_protocol == SAT_PROTOCOL_FPDMA)
350f11c7f63SJim Harris {
351f11c7f63SJim Harris status = this_device->owning_port->state_handlers->start_io_handler(
352f11c7f63SJim Harris this_device->owning_port,
353f11c7f63SJim Harris this_device,
354f11c7f63SJim Harris io_request
355f11c7f63SJim Harris );
356f11c7f63SJim Harris
357f11c7f63SJim Harris if (status == SCI_SUCCESS)
358f11c7f63SJim Harris {
359f11c7f63SJim Harris status = scic_sds_remote_node_context_start_io(this_device->rnc, io_request);
360f11c7f63SJim Harris
361f11c7f63SJim Harris if (status == SCI_SUCCESS)
362f11c7f63SJim Harris {
363f11c7f63SJim Harris status = io_request->state_handlers->parent.start_handler(request);
364f11c7f63SJim Harris }
365f11c7f63SJim Harris
366f11c7f63SJim Harris scic_sds_remote_device_start_request(this_device, io_request, status);
367f11c7f63SJim Harris }
368f11c7f63SJim Harris }
369f11c7f63SJim Harris else
370f11c7f63SJim Harris {
371f11c7f63SJim Harris status = SCI_FAILURE_INVALID_STATE;
372f11c7f63SJim Harris }
373f11c7f63SJim Harris
374f11c7f63SJim Harris return status;
375f11c7f63SJim Harris }
376f11c7f63SJim Harris
377f11c7f63SJim Harris /**
378f11c7f63SJim Harris * This method will handle events received while the STP device is in the
379f11c7f63SJim Harris * ready command substate.
380f11c7f63SJim Harris *
381f11c7f63SJim Harris * @param [in] this_device This is the device object that is receiving the
382f11c7f63SJim Harris * event.
383f11c7f63SJim Harris * @param [in] event_code The event code to process.
384f11c7f63SJim Harris *
385f11c7f63SJim Harris * @return SCI_STATUS
386f11c7f63SJim Harris */
387f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_ncq_substate_event_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 event_code)388f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_ncq_substate_event_handler(
389f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
390f11c7f63SJim Harris U32 event_code
391f11c7f63SJim Harris )
392f11c7f63SJim Harris {
393f11c7f63SJim Harris SCI_STATUS status;
394f11c7f63SJim Harris
395f11c7f63SJim Harris status = scic_sds_remote_device_general_event_handler(this_device, event_code);
396f11c7f63SJim Harris
397f11c7f63SJim Harris switch (scu_get_event_code(event_code))
398f11c7f63SJim Harris {
399f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX:
400f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_RX:
401f11c7f63SJim Harris /// @todo We need to decode and understand why the hardware suspended the device.
402f11c7f63SJim Harris /// The suspension reason was probably due to an SDB error FIS received.
403f11c7f63SJim Harris break;
404f11c7f63SJim Harris
405f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_DONE_DATA_LEN_ERR:
406f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_DONE_OFFSET_ERR:
407f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_DONE_DMASETUP_DIERR:
408f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_DONE_XFERCNT_ERR:
409f11c7f63SJim Harris case SCU_EVENT_TL_RNC_SUSPEND_TX_RX_DONE_PLD_LEN_ERR:
410f11c7f63SJim Harris this_device->not_ready_reason =
411f11c7f63SJim Harris SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
412f11c7f63SJim Harris
413f11c7f63SJim Harris sci_base_state_machine_change_state(
414f11c7f63SJim Harris &this_device->ready_substate_machine,
415f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
416f11c7f63SJim Harris );
417f11c7f63SJim Harris
418f11c7f63SJim Harris // We have a notification that the driver requested a suspend operation
419f11c7f63SJim Harris // this should not happen.
420f11c7f63SJim Harris SCIC_LOG_WARNING((
421f11c7f63SJim Harris sci_base_object_get_logger(this_device),
422f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_REMOTE_TARGET,
423f11c7f63SJim Harris "SCIC Remote device 0x%x received driver suspend event %x while in ncq ready substate %d\n",
424f11c7f63SJim Harris this_device, event_code, sci_base_state_machine_get_state(&this_device->ready_substate_machine)
425f11c7f63SJim Harris ));
426f11c7f63SJim Harris
427453130d9SPedro F. Giffuni // Since we didn't expect to get here start the device again.
428f11c7f63SJim Harris status = scic_sds_remote_device_resume(this_device);
429f11c7f63SJim Harris break;
430f11c7f63SJim Harris
431f11c7f63SJim Harris case SCU_EVENT_POST_RCN_RELEASE:
432f11c7f63SJim Harris /// @todo Do we need to store the suspend state on the device?
433f11c7f63SJim Harris SCIC_LOG_INFO((
434f11c7f63SJim Harris sci_base_object_get_logger(this_device),
435f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_REMOTE_TARGET,
436f11c7f63SJim Harris "SCIC Remote device 0x%x received driver release event %x while in the ready substate %d\n",
437f11c7f63SJim Harris this_device, event_code, sci_base_state_machine_get_state(&this_device->ready_substate_machine)
438f11c7f63SJim Harris ));
439f11c7f63SJim Harris break;
440f11c7f63SJim Harris
441f11c7f63SJim Harris default:
442f11c7f63SJim Harris // Some other event just log it and continue
443f11c7f63SJim Harris SCIC_LOG_WARNING((
444f11c7f63SJim Harris sci_base_object_get_logger(this_device),
445f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_REMOTE_TARGET,
446f11c7f63SJim Harris "SCIC Remote device 0x%x received driver unexpected event %x while in the ready substate %d\n",
447f11c7f63SJim Harris this_device, event_code, sci_base_state_machine_get_state(&this_device->ready_substate_machine)
448f11c7f63SJim Harris ));
449f11c7f63SJim Harris
450f11c7f63SJim Harris status = SCI_FAILURE_INVALID_STATE;
451f11c7f63SJim Harris break;
452f11c7f63SJim Harris }
453f11c7f63SJim Harris
454f11c7f63SJim Harris return status;
455f11c7f63SJim Harris }
456f11c7f63SJim Harris
457f11c7f63SJim Harris /**
458f11c7f63SJim Harris *
459f11c7f63SJim Harris *
460f11c7f63SJim Harris * @param[in] this_device
461f11c7f63SJim Harris * @param[in] frame_index
462f11c7f63SJim Harris *
463f11c7f63SJim Harris * @return SCI_STATUS
464f11c7f63SJim Harris */
465f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_ncq_substate_frame_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 frame_index)466f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_ncq_substate_frame_handler(
467f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
468f11c7f63SJim Harris U32 frame_index
469f11c7f63SJim Harris )
470f11c7f63SJim Harris {
471f11c7f63SJim Harris SCI_STATUS status;
472f11c7f63SJim Harris SATA_FIS_HEADER_T * frame_header;
473f11c7f63SJim Harris
474f11c7f63SJim Harris status = scic_sds_unsolicited_frame_control_get_header(
475f11c7f63SJim Harris &(scic_sds_remote_device_get_controller(this_device)->uf_control),
476f11c7f63SJim Harris frame_index,
477f11c7f63SJim Harris (void **)&frame_header
478f11c7f63SJim Harris );
479f11c7f63SJim Harris
480f11c7f63SJim Harris if (status == SCI_SUCCESS)
481f11c7f63SJim Harris {
482f11c7f63SJim Harris if (
483f11c7f63SJim Harris (frame_header->fis_type == SATA_FIS_TYPE_SETDEVBITS)
484f11c7f63SJim Harris && (frame_header->status & ATA_STATUS_REG_ERROR_BIT)
485f11c7f63SJim Harris )
486f11c7f63SJim Harris {
487f11c7f63SJim Harris this_device->not_ready_reason =
488f11c7f63SJim Harris SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
489f11c7f63SJim Harris
490f11c7f63SJim Harris /** @todo Check sactive and complete associated IO if any. */
491f11c7f63SJim Harris
492f11c7f63SJim Harris sci_base_state_machine_change_state(
493f11c7f63SJim Harris &this_device->ready_substate_machine,
494f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
495f11c7f63SJim Harris );
496f11c7f63SJim Harris }
497f11c7f63SJim Harris else if (
498f11c7f63SJim Harris (frame_header->fis_type == SATA_FIS_TYPE_REGD2H)
499f11c7f63SJim Harris && (frame_header->status & ATA_STATUS_REG_ERROR_BIT)
500f11c7f63SJim Harris )
501f11c7f63SJim Harris {
502f11c7f63SJim Harris // Some devices return D2H FIS when an NCQ error is detected.
503f11c7f63SJim Harris // Treat this like an SDB error FIS ready reason.
504f11c7f63SJim Harris this_device->not_ready_reason =
505f11c7f63SJim Harris SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
506f11c7f63SJim Harris
507f11c7f63SJim Harris sci_base_state_machine_change_state(
508f11c7f63SJim Harris &this_device->ready_substate_machine,
509f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
510f11c7f63SJim Harris );
511f11c7f63SJim Harris }
512f11c7f63SJim Harris else
513f11c7f63SJim Harris {
514f11c7f63SJim Harris status = SCI_FAILURE;
515f11c7f63SJim Harris }
516f11c7f63SJim Harris
517f11c7f63SJim Harris scic_sds_controller_release_frame(
518f11c7f63SJim Harris scic_sds_remote_device_get_controller(this_device), frame_index
519f11c7f63SJim Harris );
520f11c7f63SJim Harris }
521f11c7f63SJim Harris
522f11c7f63SJim Harris return status;
523f11c7f63SJim Harris }
524f11c7f63SJim Harris
525f11c7f63SJim Harris //*****************************************************************************
526f11c7f63SJim Harris //* STP REMOTE DEVICE READY CMD SUBSTATE HANDLERS
527f11c7f63SJim Harris //*****************************************************************************
528f11c7f63SJim Harris
529f11c7f63SJim Harris /**
530f11c7f63SJim Harris * This device is already handling a command it can not accept new commands
531f11c7f63SJim Harris * until this one is complete.
532f11c7f63SJim Harris *
533f11c7f63SJim Harris * @param[in] device
534f11c7f63SJim Harris * @param[in] request
535f11c7f63SJim Harris *
536f11c7f63SJim Harris * @return SCI_STATUS
537f11c7f63SJim Harris */
538f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_cmd_substate_start_io_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)539f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_cmd_substate_start_io_handler(
540f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
541f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
542f11c7f63SJim Harris )
543f11c7f63SJim Harris {
544f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
545f11c7f63SJim Harris }
546f11c7f63SJim Harris
547f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_cmd_substate_suspend_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 suspend_type)548f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_cmd_substate_suspend_handler(
549f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
550f11c7f63SJim Harris U32 suspend_type
551f11c7f63SJim Harris )
552f11c7f63SJim Harris {
553f11c7f63SJim Harris SCI_STATUS status;
554f11c7f63SJim Harris
555f11c7f63SJim Harris status = scic_sds_remote_node_context_suspend(
556f11c7f63SJim Harris this_device->rnc, suspend_type, NULL, NULL
557f11c7f63SJim Harris );
558f11c7f63SJim Harris
559f11c7f63SJim Harris return status;
560f11c7f63SJim Harris }
561f11c7f63SJim Harris
562f11c7f63SJim Harris /**
563f11c7f63SJim Harris *
564f11c7f63SJim Harris *
565f11c7f63SJim Harris * @param[in] this_device
566f11c7f63SJim Harris * @param[in] frame_index
567f11c7f63SJim Harris *
568f11c7f63SJim Harris * @return SCI_STATUS
569f11c7f63SJim Harris */
570f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_cmd_substate_frame_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 frame_index)571f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_cmd_substate_frame_handler(
572f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
573f11c7f63SJim Harris U32 frame_index
574f11c7f63SJim Harris )
575f11c7f63SJim Harris {
576f11c7f63SJim Harris SCI_STATUS status;
577f11c7f63SJim Harris
578f11c7f63SJim Harris /// The device doe not process any UF received from the hardware while
579f11c7f63SJim Harris /// in this state. All unsolicited frames are forwarded to the io request
580f11c7f63SJim Harris /// object.
581f11c7f63SJim Harris status = scic_sds_io_request_frame_handler(
582f11c7f63SJim Harris this_device->working_request,
583f11c7f63SJim Harris frame_index
584f11c7f63SJim Harris );
585f11c7f63SJim Harris
586f11c7f63SJim Harris return status;
587f11c7f63SJim Harris }
588f11c7f63SJim Harris
589f11c7f63SJim Harris
590f11c7f63SJim Harris //*****************************************************************************
591f11c7f63SJim Harris //* STP REMOTE DEVICE READY NCQ SUBSTATE HANDLERS
592f11c7f63SJim Harris //*****************************************************************************
593f11c7f63SJim Harris
594f11c7f63SJim Harris
595f11c7f63SJim Harris //*****************************************************************************
596f11c7f63SJim Harris //* STP REMOTE DEVICE READY AWAIT RESET SUBSTATE HANDLERS
597f11c7f63SJim Harris //*****************************************************************************
598f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_await_reset_substate_start_io_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)599f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_await_reset_substate_start_io_handler(
600f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
601f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
602f11c7f63SJim Harris )
603f11c7f63SJim Harris {
604f11c7f63SJim Harris return SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED;
605f11c7f63SJim Harris }
606f11c7f63SJim Harris
607f11c7f63SJim Harris
608f11c7f63SJim Harris
609f11c7f63SJim Harris /**
610f11c7f63SJim Harris * This method will perform the STP request (both io or task) completion
611f11c7f63SJim Harris * processing for await reset state.
612f11c7f63SJim Harris *
613f11c7f63SJim Harris * @param[in] device This parameter specifies the device for which the
614f11c7f63SJim Harris * request is being completed.
615f11c7f63SJim Harris * @param[in] request This parameter specifies the request being completed.
616f11c7f63SJim Harris *
617f11c7f63SJim Harris * @return This method returns an indication as to whether the request
618f11c7f63SJim Harris * processing completed successfully.
619f11c7f63SJim Harris */
620f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_await_reset_substate_complete_request_handler(SCI_BASE_REMOTE_DEVICE_T * device,SCI_BASE_REQUEST_T * request)621f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_await_reset_substate_complete_request_handler(
622f11c7f63SJim Harris SCI_BASE_REMOTE_DEVICE_T * device,
623f11c7f63SJim Harris SCI_BASE_REQUEST_T * request
624f11c7f63SJim Harris )
625f11c7f63SJim Harris {
626f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
627f11c7f63SJim Harris SCIC_SDS_REQUEST_T * the_request = (SCIC_SDS_REQUEST_T *)request;
628f11c7f63SJim Harris SCI_STATUS status;
629f11c7f63SJim Harris
630f11c7f63SJim Harris status = scic_sds_io_request_complete(the_request);
631f11c7f63SJim Harris
632f11c7f63SJim Harris if (status == SCI_SUCCESS)
633f11c7f63SJim Harris {
634f11c7f63SJim Harris status = scic_sds_port_complete_io(
635f11c7f63SJim Harris this_device->owning_port, this_device, the_request
636f11c7f63SJim Harris );
637f11c7f63SJim Harris
638f11c7f63SJim Harris if (status == SCI_SUCCESS)
639f11c7f63SJim Harris scic_sds_remote_device_decrement_request_count(this_device);
640f11c7f63SJim Harris }
641f11c7f63SJim Harris
642f11c7f63SJim Harris if (status != SCI_SUCCESS)
643f11c7f63SJim Harris {
644f11c7f63SJim Harris SCIC_LOG_ERROR((
645f11c7f63SJim Harris sci_base_object_get_logger(this_device),
646f11c7f63SJim Harris SCIC_LOG_OBJECT_STP_REMOTE_TARGET,
647f11c7f63SJim Harris "Port:0x%x Device:0x%x Request:0x%x Status:0x%x could not complete\n",
648f11c7f63SJim Harris this_device->owning_port, this_device, the_request, status
649f11c7f63SJim Harris ));
650f11c7f63SJim Harris }
651f11c7f63SJim Harris
652f11c7f63SJim Harris return status;
653f11c7f63SJim Harris }
654f11c7f63SJim Harris
655f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
656f11c7f63SJim Harris //*****************************************************************************
657f11c7f63SJim Harris //* STP REMOTE DEVICE READY ATAPI ERROR SUBSTATE HANDLERS
658f11c7f63SJim Harris //*****************************************************************************
659f11c7f63SJim Harris
660f11c7f63SJim Harris /**
661f11c7f63SJim Harris * This method will handle the event for a ATAPI device that is in
662f11c7f63SJim Harris * the ATAPI ERROR state. We pick up suspension events to handle specifically
663f11c7f63SJim Harris * to this state. We resume the RNC right away. We then complete the outstanding
664f11c7f63SJim Harris * IO to this device.
665f11c7f63SJim Harris *
666f11c7f63SJim Harris * @param [in] device The device received event.
667f11c7f63SJim Harris * @param [in] event_code The event code.
668f11c7f63SJim Harris *
669f11c7f63SJim Harris * @return SCI_STATUS
670f11c7f63SJim Harris */
671f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_atapi_error_substate_event_handler(SCIC_SDS_REMOTE_DEVICE_T * this_device,U32 event_code)672f11c7f63SJim Harris SCI_STATUS scic_sds_stp_remote_device_ready_atapi_error_substate_event_handler(
673f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device,
674f11c7f63SJim Harris U32 event_code
675f11c7f63SJim Harris )
676f11c7f63SJim Harris {
677f11c7f63SJim Harris SCI_STATUS status;
678f11c7f63SJim Harris
679f11c7f63SJim Harris status = scic_sds_remote_device_general_event_handler(this_device, event_code);
680f11c7f63SJim Harris
681f11c7f63SJim Harris if (status == SCI_SUCCESS)
682f11c7f63SJim Harris {
683f11c7f63SJim Harris if (scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX
684f11c7f63SJim Harris || scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX)
685f11c7f63SJim Harris {
686f11c7f63SJim Harris status = scic_sds_remote_node_context_resume(
687f11c7f63SJim Harris this_device->rnc,
688f11c7f63SJim Harris (SCIC_SDS_REMOTE_NODE_CONTEXT_CALLBACK)
689f11c7f63SJim Harris this_device->working_request->state_handlers->parent.complete_handler,
690f11c7f63SJim Harris (void *)this_device->working_request
691f11c7f63SJim Harris );
692f11c7f63SJim Harris }
693f11c7f63SJim Harris }
694f11c7f63SJim Harris
695f11c7f63SJim Harris return status;
696f11c7f63SJim Harris }
697f11c7f63SJim Harris #endif // !defined(DISABLE_ATAPI)
698f11c7f63SJim Harris
699f11c7f63SJim Harris // ---------------------------------------------------------------------------
700f11c7f63SJim Harris
701f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T
702f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table[
703f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_MAX_SUBSTATES] =
704f11c7f63SJim Harris {
705f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE
706f11c7f63SJim Harris {
707f11c7f63SJim Harris {
708f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
709f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
710f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
711f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
712f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
713f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
714f11c7f63SJim Harris scic_sds_stp_remote_device_ready_idle_substate_start_io_handler,
715f11c7f63SJim Harris scic_sds_remote_device_default_complete_request_handler,
716f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
717f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
718f11c7f63SJim Harris scic_sds_remote_device_default_complete_request_handler
719f11c7f63SJim Harris },
720f11c7f63SJim Harris scic_sds_remote_device_default_suspend_handler,
721f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
722f11c7f63SJim Harris scic_sds_stp_remote_device_ready_idle_substate_event_handler,
723f11c7f63SJim Harris scic_sds_remote_device_default_frame_handler
724f11c7f63SJim Harris },
725f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD
726f11c7f63SJim Harris {
727f11c7f63SJim Harris {
728f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
729f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
730f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
731f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
732f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
733f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
734f11c7f63SJim Harris scic_sds_stp_remote_device_ready_cmd_substate_start_io_handler,
735f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request,
736f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
737f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
738f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request,
739f11c7f63SJim Harris },
740f11c7f63SJim Harris scic_sds_stp_remote_device_ready_cmd_substate_suspend_handler,
741f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
742f11c7f63SJim Harris scic_sds_remote_device_general_event_handler,
743f11c7f63SJim Harris scic_sds_stp_remote_device_ready_cmd_substate_frame_handler
744f11c7f63SJim Harris },
745f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ
746f11c7f63SJim Harris {
747f11c7f63SJim Harris {
748f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
749f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
750f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
751f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
752f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
753f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
754f11c7f63SJim Harris scic_sds_stp_remote_device_ready_ncq_substate_start_io_handler,
755f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request,
756f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
757f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
758f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request
759f11c7f63SJim Harris },
760f11c7f63SJim Harris scic_sds_remote_device_default_suspend_handler,
761f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
762f11c7f63SJim Harris scic_sds_stp_remote_device_ready_ncq_substate_event_handler,
763f11c7f63SJim Harris scic_sds_stp_remote_device_ready_ncq_substate_frame_handler
764f11c7f63SJim Harris },
765f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
766f11c7f63SJim Harris {
767f11c7f63SJim Harris {
768f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
769f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
770f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
771f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
772f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
773f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
774f11c7f63SJim Harris scic_sds_remote_device_default_start_request_handler,
775f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request,
776f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
777f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
778f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request
779f11c7f63SJim Harris },
780f11c7f63SJim Harris scic_sds_remote_device_default_suspend_handler,
781f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
782f11c7f63SJim Harris scic_sds_remote_device_general_event_handler,
783f11c7f63SJim Harris scic_sds_remote_device_general_frame_handler
784f11c7f63SJim Harris },
785f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
786f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_ATAPI_ERROR
787f11c7f63SJim Harris {
788f11c7f63SJim Harris {
789f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
790f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
791f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
792f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
793f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
794f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
795f11c7f63SJim Harris scic_sds_remote_device_default_start_request_handler,
796f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request,
797f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
798f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
799f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request
800f11c7f63SJim Harris },
801f11c7f63SJim Harris scic_sds_remote_device_default_suspend_handler,
802f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
803f11c7f63SJim Harris scic_sds_stp_remote_device_ready_atapi_error_substate_event_handler,
804f11c7f63SJim Harris scic_sds_remote_device_general_frame_handler
805f11c7f63SJim Harris },
806f11c7f63SJim Harris #endif
807f11c7f63SJim Harris // SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET
808f11c7f63SJim Harris {
809f11c7f63SJim Harris {
810f11c7f63SJim Harris scic_sds_remote_device_default_start_handler,
811f11c7f63SJim Harris scic_sds_remote_device_ready_state_stop_handler,
812f11c7f63SJim Harris scic_sds_remote_device_default_fail_handler,
813f11c7f63SJim Harris scic_sds_remote_device_default_destruct_handler,
814f11c7f63SJim Harris scic_sds_remote_device_ready_state_reset_handler,
815f11c7f63SJim Harris scic_sds_remote_device_default_reset_complete_handler,
816f11c7f63SJim Harris scic_sds_stp_remote_device_ready_await_reset_substate_start_io_handler,
817f11c7f63SJim Harris scic_sds_stp_remote_device_ready_await_reset_substate_complete_request_handler,
818f11c7f63SJim Harris scic_sds_remote_device_default_continue_request_handler,
819f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_start_request_handler,
820f11c7f63SJim Harris scic_sds_stp_remote_device_complete_request
821f11c7f63SJim Harris },
822f11c7f63SJim Harris scic_sds_remote_device_default_suspend_handler,
823f11c7f63SJim Harris scic_sds_remote_device_default_resume_handler,
824f11c7f63SJim Harris scic_sds_remote_device_general_event_handler,
825f11c7f63SJim Harris scic_sds_remote_device_general_frame_handler
826f11c7f63SJim Harris }
827f11c7f63SJim Harris };
828f11c7f63SJim Harris
829f11c7f63SJim Harris //*****************************************************************************
830f11c7f63SJim Harris //* STP REMOTE DEVICE READY SUBSTATE PRIVATE METHODS
831f11c7f63SJim Harris //*****************************************************************************
832f11c7f63SJim Harris
833f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void * user_cookie)834f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(
835f11c7f63SJim Harris void * user_cookie
836f11c7f63SJim Harris )
837f11c7f63SJim Harris {
838f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
839f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)user_cookie;
840f11c7f63SJim Harris
841f11c7f63SJim Harris // For NCQ operation we do not issue a
842f11c7f63SJim Harris // scic_cb_remote_device_not_ready(). As a result, avoid sending
843f11c7f63SJim Harris // the ready notification.
844f11c7f63SJim Harris if (this_device->ready_substate_machine.previous_state_id
845f11c7f63SJim Harris != SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ)
846f11c7f63SJim Harris {
847f11c7f63SJim Harris scic_cb_remote_device_ready(
848f11c7f63SJim Harris scic_sds_remote_device_get_controller(this_device), this_device
849f11c7f63SJim Harris );
850f11c7f63SJim Harris }
851f11c7f63SJim Harris }
852f11c7f63SJim Harris
853f11c7f63SJim Harris //*****************************************************************************
854f11c7f63SJim Harris //* STP REMOTE DEVICE READY IDLE SUBSTATE
855f11c7f63SJim Harris //*****************************************************************************
856f11c7f63SJim Harris
857f11c7f63SJim Harris /**
858f11c7f63SJim Harris *
859f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
860f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
861f11c7f63SJim Harris *
862f11c7f63SJim Harris * @return none
863f11c7f63SJim Harris */
864f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_idle_substate_enter(SCI_BASE_OBJECT_T * device)865f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_idle_substate_enter(
866f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
867f11c7f63SJim Harris )
868f11c7f63SJim Harris {
869f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
870f11c7f63SJim Harris
871f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
872f11c7f63SJim Harris
873f11c7f63SJim Harris SET_STATE_HANDLER(
874f11c7f63SJim Harris this_device,
875f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
876f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE
877f11c7f63SJim Harris );
878f11c7f63SJim Harris
879f11c7f63SJim Harris this_device->working_request = NULL;
880f11c7f63SJim Harris
881f11c7f63SJim Harris if (scic_sds_remote_node_context_is_ready(this_device->rnc))
882f11c7f63SJim Harris {
883f11c7f63SJim Harris // Since the RNC is ready, it's alright to finish completion
884f11c7f63SJim Harris // processing (e.g. signal the remote device is ready).
885f11c7f63SJim Harris scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(
886f11c7f63SJim Harris this_device
887f11c7f63SJim Harris );
888f11c7f63SJim Harris }
889f11c7f63SJim Harris else
890f11c7f63SJim Harris {
891f11c7f63SJim Harris scic_sds_remote_node_context_resume(
892f11c7f63SJim Harris this_device->rnc,
893f11c7f63SJim Harris scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler,
894f11c7f63SJim Harris this_device
895f11c7f63SJim Harris );
896f11c7f63SJim Harris }
897f11c7f63SJim Harris }
898f11c7f63SJim Harris
899f11c7f63SJim Harris //*****************************************************************************
900f11c7f63SJim Harris //* STP REMOTE DEVICE READY CMD SUBSTATE
901f11c7f63SJim Harris //*****************************************************************************
902f11c7f63SJim Harris
903f11c7f63SJim Harris /**
904f11c7f63SJim Harris *
905f11c7f63SJim Harris *
906f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
907f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
908f11c7f63SJim Harris *
909f11c7f63SJim Harris * @return none
910f11c7f63SJim Harris */
911f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_cmd_substate_enter(SCI_BASE_OBJECT_T * device)912f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_cmd_substate_enter(
913f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
914f11c7f63SJim Harris )
915f11c7f63SJim Harris {
916f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
917f11c7f63SJim Harris
918f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
919f11c7f63SJim Harris
920f11c7f63SJim Harris ASSERT(this_device->working_request != NULL);
921f11c7f63SJim Harris
922f11c7f63SJim Harris SET_STATE_HANDLER(
923f11c7f63SJim Harris this_device,
924f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
925f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD
926f11c7f63SJim Harris );
927f11c7f63SJim Harris
928f11c7f63SJim Harris scic_cb_remote_device_not_ready(
929f11c7f63SJim Harris scic_sds_remote_device_get_controller(this_device),
930f11c7f63SJim Harris this_device,
931f11c7f63SJim Harris SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED
932f11c7f63SJim Harris );
933f11c7f63SJim Harris }
934f11c7f63SJim Harris
935f11c7f63SJim Harris //*****************************************************************************
936f11c7f63SJim Harris //* STP REMOTE DEVICE READY NCQ SUBSTATE
937f11c7f63SJim Harris //*****************************************************************************
938f11c7f63SJim Harris
939f11c7f63SJim Harris /**
940f11c7f63SJim Harris *
941f11c7f63SJim Harris *
942f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
943f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
944f11c7f63SJim Harris *
945f11c7f63SJim Harris * @return none
946f11c7f63SJim Harris */
947f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_ncq_substate_enter(SCI_BASE_OBJECT_T * device)948f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_ncq_substate_enter(
949f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
950f11c7f63SJim Harris )
951f11c7f63SJim Harris {
952f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
953f11c7f63SJim Harris
954f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
955f11c7f63SJim Harris
956f11c7f63SJim Harris SET_STATE_HANDLER(
957f11c7f63SJim Harris this_device,
958f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
959f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ
960f11c7f63SJim Harris );
961f11c7f63SJim Harris }
962f11c7f63SJim Harris
963f11c7f63SJim Harris //*****************************************************************************
964f11c7f63SJim Harris //* STP REMOTE DEVICE READY NCQ ERROR SUBSTATE
965f11c7f63SJim Harris //*****************************************************************************
966f11c7f63SJim Harris
967f11c7f63SJim Harris /**
968f11c7f63SJim Harris *
969f11c7f63SJim Harris *
970f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
971f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
972f11c7f63SJim Harris *
973f11c7f63SJim Harris * @return none
974f11c7f63SJim Harris */
975f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_ncq_error_substate_enter(SCI_BASE_OBJECT_T * device)976f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_ncq_error_substate_enter(
977f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
978f11c7f63SJim Harris )
979f11c7f63SJim Harris {
980f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
981f11c7f63SJim Harris
982f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
983f11c7f63SJim Harris
984f11c7f63SJim Harris SET_STATE_HANDLER(
985f11c7f63SJim Harris this_device,
986f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
987f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
988f11c7f63SJim Harris );
989f11c7f63SJim Harris
990f11c7f63SJim Harris if(this_device->not_ready_reason ==
991f11c7f63SJim Harris SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED)
992f11c7f63SJim Harris {
993f11c7f63SJim Harris scic_cb_remote_device_not_ready(
994f11c7f63SJim Harris scic_sds_remote_device_get_controller(this_device),
995f11c7f63SJim Harris this_device,
996f11c7f63SJim Harris this_device->not_ready_reason
997f11c7f63SJim Harris );
998f11c7f63SJim Harris }
999f11c7f63SJim Harris }
1000f11c7f63SJim Harris
1001f11c7f63SJim Harris //*****************************************************************************
1002f11c7f63SJim Harris //* STP REMOTE DEVICE READY AWAIT RESET SUBSTATE
1003f11c7f63SJim Harris //*****************************************************************************
1004f11c7f63SJim Harris
1005f11c7f63SJim Harris /**
1006f11c7f63SJim Harris * @brief The enter routine to READY AWAIT RESET substate.
1007f11c7f63SJim Harris *
1008f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
1009f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
1010f11c7f63SJim Harris *
1011f11c7f63SJim Harris * @return none
1012f11c7f63SJim Harris */
1013f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_await_reset_substate_enter(SCI_BASE_OBJECT_T * device)1014f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_await_reset_substate_enter(
1015f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
1016f11c7f63SJim Harris )
1017f11c7f63SJim Harris {
1018f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
1019f11c7f63SJim Harris
1020f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
1021f11c7f63SJim Harris
1022f11c7f63SJim Harris SET_STATE_HANDLER(
1023f11c7f63SJim Harris this_device,
1024f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
1025f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET
1026f11c7f63SJim Harris );
1027f11c7f63SJim Harris }
1028f11c7f63SJim Harris
1029f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
1030f11c7f63SJim Harris //*****************************************************************************
1031f11c7f63SJim Harris //* STP REMOTE DEVICE READY ATAPI ERROR SUBSTATE
1032f11c7f63SJim Harris //*****************************************************************************
1033f11c7f63SJim Harris
1034f11c7f63SJim Harris /**
1035f11c7f63SJim Harris * @brief The enter routine to READY ATAPI ERROR substate.
1036f11c7f63SJim Harris *
1037f11c7f63SJim Harris * @param[in] device This is the SCI base object which is cast into a
1038f11c7f63SJim Harris * SCIC_SDS_REMOTE_DEVICE object.
1039f11c7f63SJim Harris *
1040f11c7f63SJim Harris * @return none
1041f11c7f63SJim Harris */
1042f11c7f63SJim Harris static
scic_sds_stp_remote_device_ready_atapi_error_substate_enter(SCI_BASE_OBJECT_T * device)1043f11c7f63SJim Harris void scic_sds_stp_remote_device_ready_atapi_error_substate_enter(
1044f11c7f63SJim Harris SCI_BASE_OBJECT_T * device
1045f11c7f63SJim Harris )
1046f11c7f63SJim Harris {
1047f11c7f63SJim Harris SCIC_SDS_REMOTE_DEVICE_T * this_device;
1048f11c7f63SJim Harris
1049f11c7f63SJim Harris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device;
1050f11c7f63SJim Harris
1051f11c7f63SJim Harris SET_STATE_HANDLER(
1052f11c7f63SJim Harris this_device,
1053f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_handler_table,
1054f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_ATAPI_ERROR
1055f11c7f63SJim Harris );
1056f11c7f63SJim Harris }
1057f11c7f63SJim Harris #endif // !defined(DISABLE_ATAPI)
1058f11c7f63SJim Harris
1059f11c7f63SJim Harris // ---------------------------------------------------------------------------
1060f11c7f63SJim Harris
1061f11c7f63SJim Harris SCI_BASE_STATE_T
1062f11c7f63SJim Harris scic_sds_stp_remote_device_ready_substate_table[
1063f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_MAX_SUBSTATES] =
1064f11c7f63SJim Harris {
1065f11c7f63SJim Harris {
1066f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE,
1067f11c7f63SJim Harris scic_sds_stp_remote_device_ready_idle_substate_enter,
1068f11c7f63SJim Harris NULL
1069f11c7f63SJim Harris },
1070f11c7f63SJim Harris {
1071f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD,
1072f11c7f63SJim Harris scic_sds_stp_remote_device_ready_cmd_substate_enter,
1073f11c7f63SJim Harris NULL
1074f11c7f63SJim Harris },
1075f11c7f63SJim Harris {
1076f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ,
1077f11c7f63SJim Harris scic_sds_stp_remote_device_ready_ncq_substate_enter,
1078f11c7f63SJim Harris NULL
1079f11c7f63SJim Harris },
1080f11c7f63SJim Harris {
1081f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR,
1082f11c7f63SJim Harris scic_sds_stp_remote_device_ready_ncq_error_substate_enter,
1083f11c7f63SJim Harris NULL
1084f11c7f63SJim Harris },
1085f11c7f63SJim Harris #if !defined(DISABLE_ATAPI)
1086f11c7f63SJim Harris {
1087f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_ATAPI_ERROR,
1088f11c7f63SJim Harris scic_sds_stp_remote_device_ready_atapi_error_substate_enter,
1089f11c7f63SJim Harris NULL
1090f11c7f63SJim Harris },
1091f11c7f63SJim Harris #endif
1092f11c7f63SJim Harris {
1093f11c7f63SJim Harris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET,
1094f11c7f63SJim Harris scic_sds_stp_remote_device_ready_await_reset_substate_enter,
1095f11c7f63SJim Harris NULL
1096f11c7f63SJim Harris }
1097f11c7f63SJim Harris };
1098f11c7f63SJim Harris
1099