xref: /freebsd/sys/dev/isci/scil/scic_sds_stp_remote_device.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
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