xref: /freebsd/sys/dev/isci/scil/scif_sas_controller_state_handlers.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 all of the state handler routines for each
60f11c7f63SJim Harris  *        of the controller states defined by the SCI_BASE_CONTROLLER state
61f11c7f63SJim Harris  *        machine.
62f11c7f63SJim Harris  */
63f11c7f63SJim Harris 
64f11c7f63SJim Harris #include <dev/isci/scil/sci_util.h>
65f11c7f63SJim Harris #include <dev/isci/scil/scic_controller.h>
66f11c7f63SJim Harris #include <dev/isci/scil/scic_port.h>
67f11c7f63SJim Harris #include <dev/isci/scil/scic_remote_device.h>
68f11c7f63SJim Harris #include <dev/isci/scil/scic_io_request.h>
69f11c7f63SJim Harris 
70f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_controller.h>
71f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_remote_device.h>
72f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_logger.h>
73f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_smp_remote_device.h>
74f11c7f63SJim Harris 
75f11c7f63SJim Harris //******************************************************************************
76f11c7f63SJim Harris //* P R I V A T E   M E T H O D S
77f11c7f63SJim Harris //******************************************************************************
78f11c7f63SJim Harris 
79f11c7f63SJim Harris /**
80f11c7f63SJim Harris  * @brief This method simply executes the reset operation by entering
81f11c7f63SJim Harris  *        the reset state and allowing the state to perform it's work.
82f11c7f63SJim Harris  *
83f11c7f63SJim Harris  * @param[in]  fw_controller This parameter specifies the SAS framework
84f11c7f63SJim Harris  *             controller for execute the reset.
85f11c7f63SJim Harris  *
86f11c7f63SJim Harris  * @return Indicate the status of the reset operation.  Was it successful?
87f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned if it was successfully reset.
88f11c7f63SJim Harris  */
89f11c7f63SJim Harris static
scif_sas_controller_execute_reset(SCIF_SAS_CONTROLLER_T * fw_controller)90f11c7f63SJim Harris SCI_STATUS scif_sas_controller_execute_reset(
91f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller
92f11c7f63SJim Harris )
93f11c7f63SJim Harris {
94f11c7f63SJim Harris    SCI_STATUS  status;
95f11c7f63SJim Harris 
96f11c7f63SJim Harris    SCIF_LOG_TRACE((
97f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
98f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_CONTROLLER_RESET,
99f11c7f63SJim Harris       "scif_sas_controller_execute_reset(0x%x) enter\n",
100f11c7f63SJim Harris       fw_controller
101f11c7f63SJim Harris    ));
102f11c7f63SJim Harris 
103f11c7f63SJim Harris    //clean the timer to avoid timer leak.
104f11c7f63SJim Harris    scif_sas_controller_release_resource(fw_controller);
105f11c7f63SJim Harris 
106f11c7f63SJim Harris    sci_base_state_machine_change_state(
107f11c7f63SJim Harris       &fw_controller->parent.state_machine,
108f11c7f63SJim Harris       SCI_BASE_CONTROLLER_STATE_RESETTING
109f11c7f63SJim Harris    );
110f11c7f63SJim Harris 
111f11c7f63SJim Harris    // Retrieve the status for the operations performed during the entrance
112f11c7f63SJim Harris    // to the resetting state were executing successfully.
113f11c7f63SJim Harris    status = fw_controller->operation_status;
114f11c7f63SJim Harris    fw_controller->operation_status = SCI_SUCCESS;
115f11c7f63SJim Harris 
116f11c7f63SJim Harris    return status;
117f11c7f63SJim Harris }
118f11c7f63SJim Harris 
119f11c7f63SJim Harris /**
120f11c7f63SJim Harris  * @brief This method checks that the memory descriptor list is valid
121f11c7f63SJim Harris  *        and hasn't been corrupted in some way by the user.
122f11c7f63SJim Harris  *
123f11c7f63SJim Harris  * @param[in] fw_controller This parameter specifies the framework
124f11c7f63SJim Harris  *            controller object for which to validation the MDL.
125f11c7f63SJim Harris  *
126f11c7f63SJim Harris  * @return This method returns a value indicating if the operation succeeded.
127f11c7f63SJim Harris  * @retval SCI_SUCCESS This value indicates that MDL is valid.
128f11c7f63SJim Harris  * @retval SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD This value indicates
129f11c7f63SJim Harris  *         that some portion of the memory descriptor list is invalid.
130f11c7f63SJim Harris  */
131f11c7f63SJim Harris static
scif_sas_controller_validate_mdl(SCIF_SAS_CONTROLLER_T * fw_controller)132f11c7f63SJim Harris SCI_STATUS scif_sas_controller_validate_mdl(
133f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller
134f11c7f63SJim Harris )
135f11c7f63SJim Harris {
136f11c7f63SJim Harris    BOOL is_mde_list_valid;
137f11c7f63SJim Harris 
138f11c7f63SJim Harris    // Currently there is only a single MDE in the list.
139f11c7f63SJim Harris    is_mde_list_valid = sci_base_mde_is_valid(
140f11c7f63SJim Harris                           &fw_controller->mdes[SCIF_SAS_MDE_INTERNAL_IO],
141f11c7f63SJim Harris                           4,
142f11c7f63SJim Harris                           fw_controller->internal_request_entries *
143f11c7f63SJim Harris                              scif_sas_internal_request_get_object_size(),
144f11c7f63SJim Harris                           SCI_MDE_ATTRIBUTE_PHYSICALLY_CONTIGUOUS
145f11c7f63SJim Harris                        );
146f11c7f63SJim Harris 
147f11c7f63SJim Harris    if (is_mde_list_valid == FALSE)
148f11c7f63SJim Harris       return SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD;
149f11c7f63SJim Harris 
150f11c7f63SJim Harris    return SCI_SUCCESS;
151f11c7f63SJim Harris }
152f11c7f63SJim Harris 
153f11c7f63SJim Harris 
154f11c7f63SJim Harris /**
155f11c7f63SJim Harris  * @brief This method stops all the domains associated to this
156f11c7f63SJim Harris  *           controller.
157f11c7f63SJim Harris  *
158f11c7f63SJim Harris  * @param[in] fw_controller This parameter specifies the framework
159f11c7f63SJim Harris  *            controller object for whose remote devices are to be stopped.
160f11c7f63SJim Harris  *
161f11c7f63SJim Harris  * @return This method returns a value indicating if the operation succeeded.
162f11c7f63SJim Harris  * @retval SCI_SUCCESS This value indicates that all the devices are stopped.
163f11c7f63SJim Harris  * @retval SCI_FAILURE This value indicates certain failure during the process
164f11c7f63SJim Harris  *            of stopping remote devices.
165f11c7f63SJim Harris  */
166f11c7f63SJim Harris static
scif_sas_controller_stop_domains(SCIF_SAS_CONTROLLER_T * fw_controller)167f11c7f63SJim Harris SCI_STATUS scif_sas_controller_stop_domains(
168f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller
169f11c7f63SJim Harris )
170f11c7f63SJim Harris {
171f11c7f63SJim Harris    U8 index;
172f11c7f63SJim Harris    SCI_STATUS status = SCI_SUCCESS;
173f11c7f63SJim Harris    SCIF_SAS_DOMAIN_T * fw_domain;
174f11c7f63SJim Harris 
175f11c7f63SJim Harris    SCIF_LOG_TRACE((
176f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
177f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
178f11c7f63SJim Harris       "scif_sas_controller_stop_domains(0x%x) enter\n",
179f11c7f63SJim Harris       fw_controller
180f11c7f63SJim Harris    ));
181f11c7f63SJim Harris 
182f11c7f63SJim Harris    for (index = 0; index < SCI_MAX_DOMAINS && status == SCI_SUCCESS; index++)
183f11c7f63SJim Harris    {
184f11c7f63SJim Harris       fw_domain = &fw_controller->domains[index];
185f11c7f63SJim Harris 
186f11c7f63SJim Harris       //Change this domain to STOPPING state. All the remote devices will be
187f11c7f63SJim Harris       //stopped subsquentially.
188f11c7f63SJim Harris       if (fw_domain->parent.state_machine.current_state_id ==
189f11c7f63SJim Harris              SCI_BASE_DOMAIN_STATE_READY
190f11c7f63SJim Harris           || fw_domain->parent.state_machine.current_state_id ==
191f11c7f63SJim Harris              SCI_BASE_DOMAIN_STATE_DISCOVERING)
192f11c7f63SJim Harris       {
193f11c7f63SJim Harris          sci_base_state_machine_change_state(
194f11c7f63SJim Harris             &fw_domain->parent.state_machine, SCI_BASE_DOMAIN_STATE_STOPPING
195f11c7f63SJim Harris          );
196f11c7f63SJim Harris       }
197f11c7f63SJim Harris    }
198f11c7f63SJim Harris 
199f11c7f63SJim Harris    return status;
200f11c7f63SJim Harris }
201f11c7f63SJim Harris 
202f11c7f63SJim Harris 
203f11c7f63SJim Harris /**
204f11c7f63SJim Harris  * @brief This method continue to stop the controller after clear affiliation
205f11c7f63SJim Harris  *        is done.
206f11c7f63SJim Harris  *
207f11c7f63SJim Harris  * @param[in] fw_controller This parameter specifies the framework
208f11c7f63SJim Harris  *            controller object to be stopped.
209f11c7f63SJim Harris  *
210f11c7f63SJim Harris  * @return This method returns a value indicating if the operation succeeded.
211f11c7f63SJim Harris  * @retval SCI_SUCCESS This value indicates the controller_stop succeeds.
212f11c7f63SJim Harris  * @retval SCI_FAILURE This value indicates certain failure during the process
213f11c7f63SJim Harris  *            of stopping controller.
214f11c7f63SJim Harris  */
scif_sas_controller_continue_to_stop(SCIF_SAS_CONTROLLER_T * fw_controller)215f11c7f63SJim Harris SCI_STATUS scif_sas_controller_continue_to_stop(
216f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller
217f11c7f63SJim Harris )
218f11c7f63SJim Harris {
219f11c7f63SJim Harris    SCI_STATUS status;
220f11c7f63SJim Harris 
221f11c7f63SJim Harris    SCIF_LOG_TRACE((
222f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
223f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
224f11c7f63SJim Harris       "scif_sas_controller_continue_to_stop (0x%x).\n",
225f11c7f63SJim Harris       fw_controller
226f11c7f63SJim Harris    ));
227f11c7f63SJim Harris 
228f11c7f63SJim Harris    //stop all the domains and their remote devices.
229f11c7f63SJim Harris    status = scif_sas_controller_stop_domains(fw_controller);
230f11c7f63SJim Harris 
231f11c7f63SJim Harris    if (status == SCI_SUCCESS)
232f11c7f63SJim Harris    {
233f11c7f63SJim Harris       // Attempt to stop the core controller.
234f11c7f63SJim Harris       status = scic_controller_stop(fw_controller->core_object, 0);
235f11c7f63SJim Harris 
236f11c7f63SJim Harris       if (status != SCI_SUCCESS)
237f11c7f63SJim Harris       {
238f11c7f63SJim Harris          SCIF_LOG_ERROR((
239f11c7f63SJim Harris             sci_base_object_get_logger(fw_controller),
240f11c7f63SJim Harris             SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
241f11c7f63SJim Harris             "Controller:0x%x Status:0x%x unable to stop controller.\n",
242f11c7f63SJim Harris             fw_controller, status
243f11c7f63SJim Harris          ));
244f11c7f63SJim Harris 
245f11c7f63SJim Harris          sci_base_state_machine_change_state(
246f11c7f63SJim Harris             &fw_controller->parent.state_machine,
247f11c7f63SJim Harris             SCI_BASE_CONTROLLER_STATE_FAILED
248f11c7f63SJim Harris          );
249f11c7f63SJim Harris       }
250f11c7f63SJim Harris    }
251f11c7f63SJim Harris    else
252f11c7f63SJim Harris    {
253f11c7f63SJim Harris       SCIF_LOG_ERROR((
254f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
255f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
256f11c7f63SJim Harris          "Controller:0x%x Status:0x%x unable to stop domains.\n",
257f11c7f63SJim Harris          fw_controller, status
258f11c7f63SJim Harris       ));
259f11c7f63SJim Harris 
260f11c7f63SJim Harris       sci_base_state_machine_change_state(
261f11c7f63SJim Harris          &fw_controller->parent.state_machine,
262f11c7f63SJim Harris          SCI_BASE_CONTROLLER_STATE_FAILED
263f11c7f63SJim Harris       );
264f11c7f63SJim Harris    }
265f11c7f63SJim Harris 
266f11c7f63SJim Harris    return status;
267f11c7f63SJim Harris }
268f11c7f63SJim Harris 
269f11c7f63SJim Harris 
270f11c7f63SJim Harris //******************************************************************************
271f11c7f63SJim Harris //* R E S E T   H A N D L E R S
272f11c7f63SJim Harris //******************************************************************************
273f11c7f63SJim Harris 
274f11c7f63SJim Harris /**
275f11c7f63SJim Harris  * @brief This method provides RESET state specific handling for
276f11c7f63SJim Harris  *        when a user attempts to initialize a controller.  This is a legal
277f11c7f63SJim Harris  *        state in which to attempt an initialize call.
278f11c7f63SJim Harris  *
279f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
280f11c7f63SJim Harris  *             on which the user is attempting to perform an initialize
281f11c7f63SJim Harris  *             operation.
282f11c7f63SJim Harris  *
283f11c7f63SJim Harris  * @return This method returns an indication of whether the initialize
284f11c7f63SJim Harris  *         operation succeeded.
285f11c7f63SJim Harris  * @retval SCI_SUCCESS This value when the initialization completes
286f11c7f63SJim Harris  *         successfully.
287f11c7f63SJim Harris  */
288f11c7f63SJim Harris static
scif_sas_controller_reset_initialize_handler(SCI_BASE_CONTROLLER_T * controller)289f11c7f63SJim Harris SCI_STATUS scif_sas_controller_reset_initialize_handler(
290f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller
291f11c7f63SJim Harris )
292f11c7f63SJim Harris {
293f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
294f11c7f63SJim Harris    SCI_STATUS              status;
295f11c7f63SJim Harris    U32                     index;
296f11c7f63SJim Harris 
297f11c7f63SJim Harris    SCIF_LOG_TRACE((
298f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
299f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
300f11c7f63SJim Harris       "scif_sas_controller_reset_initialize_handler(0x%x) enter\n",
301f11c7f63SJim Harris       controller
302f11c7f63SJim Harris    ));
303f11c7f63SJim Harris 
304f11c7f63SJim Harris    sci_base_state_machine_change_state(
305f11c7f63SJim Harris       &fw_controller->parent.state_machine,
306f11c7f63SJim Harris       SCI_BASE_CONTROLLER_STATE_INITIALIZING
307f11c7f63SJim Harris    );
308f11c7f63SJim Harris 
309f11c7f63SJim Harris    scif_sas_controller_build_mdl(fw_controller);
310f11c7f63SJim Harris 
311f11c7f63SJim Harris    // Perform any domain object initialization that is necessary.
312f11c7f63SJim Harris    for (index = 0; index < SCI_MAX_DOMAINS; index++)
313f11c7f63SJim Harris       scif_sas_domain_initialize(&fw_controller->domains[index]);
314f11c7f63SJim Harris 
315f11c7f63SJim Harris    scif_cb_lock_associate(fw_controller, &fw_controller->hprq.lock);
316f11c7f63SJim Harris 
317f11c7f63SJim Harris    // Attempt to initialize the core controller.
318f11c7f63SJim Harris    status = scic_controller_initialize(fw_controller->core_object);
319f11c7f63SJim Harris    if (status == SCI_SUCCESS)
320f11c7f63SJim Harris    {
321f11c7f63SJim Harris       sci_base_state_machine_change_state(
322f11c7f63SJim Harris          &fw_controller->parent.state_machine,
323f11c7f63SJim Harris          SCI_BASE_CONTROLLER_STATE_INITIALIZED
324f11c7f63SJim Harris       );
325f11c7f63SJim Harris    }
326f11c7f63SJim Harris 
327f11c7f63SJim Harris    if (status != SCI_SUCCESS)
328f11c7f63SJim Harris    {
329f11c7f63SJim Harris       // Initialization failed, Release resources and do not change state
330f11c7f63SJim Harris       scif_sas_controller_release_resource(fw_controller);
331f11c7f63SJim Harris 
332f11c7f63SJim Harris       SCIF_LOG_ERROR((
333f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
334f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
335f11c7f63SJim Harris          "Controller:0x%x Status:0x%x unable to successfully initialize.\n",
336f11c7f63SJim Harris          fw_controller, status
337f11c7f63SJim Harris       ));
338f11c7f63SJim Harris    }
339f11c7f63SJim Harris 
340f11c7f63SJim Harris    return status;
341f11c7f63SJim Harris }
342f11c7f63SJim Harris 
343f11c7f63SJim Harris //******************************************************************************
344f11c7f63SJim Harris //* I N I T I A L I Z E D   H A N D L E R S
345f11c7f63SJim Harris //******************************************************************************
346f11c7f63SJim Harris 
347f11c7f63SJim Harris /**
348f11c7f63SJim Harris  * @brief This method provides INITIALIZED state specific handling for
349f11c7f63SJim Harris  *        when a user attempts to start a controller.
350f11c7f63SJim Harris  *
351f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
352f11c7f63SJim Harris  *             on which the user is attempting to perform a start
353f11c7f63SJim Harris  *             operation.
354f11c7f63SJim Harris  * @param[in]  timeout This parameter specifies the timeout value (in
355f11c7f63SJim Harris  *             milliseconds) to be utilized for this operation.
356f11c7f63SJim Harris  *
357f11c7f63SJim Harris  * @return This method returns an indication of whether the start operation
358f11c7f63SJim Harris  *         succeeded.
359f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start operation
360f11c7f63SJim Harris  *         begins successfully.
361f11c7f63SJim Harris  */
362f11c7f63SJim Harris static
scif_sas_controller_initialized_start_handler(SCI_BASE_CONTROLLER_T * controller,U32 timeout)363f11c7f63SJim Harris SCI_STATUS scif_sas_controller_initialized_start_handler(
364f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller,
365f11c7f63SJim Harris    U32                     timeout
366f11c7f63SJim Harris )
367f11c7f63SJim Harris {
368f11c7f63SJim Harris    SCI_STATUS              status        = SCI_SUCCESS;
369f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
370f11c7f63SJim Harris    U16                     index         = 0;
371f11c7f63SJim Harris 
372f11c7f63SJim Harris    SCI_PHYSICAL_MEMORY_DESCRIPTOR_T internal_reqeust_mde =
373f11c7f63SJim Harris       fw_controller->mdes[SCIF_SAS_MDE_INTERNAL_IO];
374f11c7f63SJim Harris 
375f11c7f63SJim Harris    void * internal_request_virtual_address =  internal_reqeust_mde.virtual_address;
376f11c7f63SJim Harris    POINTER_UINT address = (POINTER_UINT)internal_request_virtual_address;
377f11c7f63SJim Harris 
378f11c7f63SJim Harris    SCIF_LOG_TRACE((
379f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
380f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
381f11c7f63SJim Harris       "scif_sas_controller_initialized_start_handler(0x%x, 0x%x) enter\n",
382f11c7f63SJim Harris       controller, timeout
383f11c7f63SJim Harris    ));
384f11c7f63SJim Harris 
385f11c7f63SJim Harris    sci_base_state_machine_change_state(
386f11c7f63SJim Harris       &fw_controller->parent.state_machine,
387f11c7f63SJim Harris       SCI_BASE_CONTROLLER_STATE_STARTING
388f11c7f63SJim Harris    );
389f11c7f63SJim Harris 
390f11c7f63SJim Harris    status = scif_sas_controller_validate_mdl(fw_controller);
391f11c7f63SJim Harris 
392f11c7f63SJim Harris    // initialization work for internal request path. It must be done before
393f11c7f63SJim Harris    // starting domain.
394f11c7f63SJim Harris    if (status == SCI_SUCCESS)
395f11c7f63SJim Harris    {
396f11c7f63SJim Harris       // fill in the sci_pool for internal requests.
397f11c7f63SJim Harris       sci_pool_initialize(fw_controller->internal_request_memory_pool);
398f11c7f63SJim Harris 
399f11c7f63SJim Harris       for (index = 0; index < fw_controller->internal_request_entries; index++)
400f11c7f63SJim Harris       {
401f11c7f63SJim Harris          sci_pool_put(fw_controller->internal_request_memory_pool, address);
402f11c7f63SJim Harris 
403f11c7f63SJim Harris          address += scif_sas_internal_request_get_object_size();
404f11c7f63SJim Harris       }
405f11c7f63SJim Harris 
406f11c7f63SJim Harris       // Using DPC for starting internal IOs, if yes, we need to intialize
407f11c7f63SJim Harris       // DPC here.
408f11c7f63SJim Harris       scif_cb_start_internal_io_task_create(fw_controller);
409f11c7f63SJim Harris    }
410f11c7f63SJim Harris 
411f11c7f63SJim Harris    if (status == SCI_SUCCESS)
412f11c7f63SJim Harris    {
413f11c7f63SJim Harris       // Kick-start the domain state machines and, by association, the
414f11c7f63SJim Harris       // core port's.
415f11c7f63SJim Harris 
416f11c7f63SJim Harris       // This will ensure we get valid port objects supplied with link up
417f11c7f63SJim Harris       // messages.
418f11c7f63SJim Harris       for (index = 0;
419f11c7f63SJim Harris            (index < SCI_MAX_DOMAINS) && (status == SCI_SUCCESS);
420f11c7f63SJim Harris            index++)
421f11c7f63SJim Harris       {
422f11c7f63SJim Harris          sci_base_state_machine_change_state(
423f11c7f63SJim Harris             &fw_controller->domains[index].parent.state_machine,
424f11c7f63SJim Harris             SCI_BASE_DOMAIN_STATE_STARTING
425f11c7f63SJim Harris          );
426f11c7f63SJim Harris          status = fw_controller->domains[index].operation.status;
427f11c7f63SJim Harris       }
428f11c7f63SJim Harris    }
429f11c7f63SJim Harris 
430f11c7f63SJim Harris    // Validate that all the domain state machines began successfully.
431f11c7f63SJim Harris    if (status != SCI_SUCCESS)
432f11c7f63SJim Harris    {
433f11c7f63SJim Harris       SCIF_LOG_ERROR((
434f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
435f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
436f11c7f63SJim Harris          "Controller:0x%x Domain:0x%x Status:0x%x unable to start\n",
437f11c7f63SJim Harris          fw_controller, index, status
438f11c7f63SJim Harris       ));
439f11c7f63SJim Harris 
440f11c7f63SJim Harris       return status;
441f11c7f63SJim Harris    }
442f11c7f63SJim Harris 
443f11c7f63SJim Harris    // Attempt to start the core controller.
444f11c7f63SJim Harris    status = scic_controller_start(fw_controller->core_object, timeout);
445f11c7f63SJim Harris    if (status != SCI_SUCCESS)
446f11c7f63SJim Harris    {
447f11c7f63SJim Harris       SCIF_LOG_ERROR((
448f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
449f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
450f11c7f63SJim Harris          "Controller:0x%x Status:0x%x unable to start controller.\n",
451f11c7f63SJim Harris          fw_controller, status
452f11c7f63SJim Harris       ));
453f11c7f63SJim Harris 
454f11c7f63SJim Harris       sci_base_state_machine_change_state(
455f11c7f63SJim Harris          &fw_controller->parent.state_machine,
456f11c7f63SJim Harris          SCI_BASE_CONTROLLER_STATE_FAILED
457f11c7f63SJim Harris       );
458f11c7f63SJim Harris    }
459f11c7f63SJim Harris 
460f11c7f63SJim Harris    return status;
461f11c7f63SJim Harris }
462f11c7f63SJim Harris 
463f11c7f63SJim Harris //******************************************************************************
464f11c7f63SJim Harris //* R E A D Y   H A N D L E R S
465f11c7f63SJim Harris //******************************************************************************
466f11c7f63SJim Harris 
467f11c7f63SJim Harris /**
468f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
469f11c7f63SJim Harris  *        when a user attempts to stop a controller.
470f11c7f63SJim Harris  *
471f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
472f11c7f63SJim Harris  *             on which the user is attempting to perform a stop
473f11c7f63SJim Harris  *             operation.
474f11c7f63SJim Harris  * @param[in]  timeout This parameter specifies the timeout value (in
475f11c7f63SJim Harris  *             milliseconds) to be utilized for this operation.
476f11c7f63SJim Harris  *
477f11c7f63SJim Harris  * @return This method returns an indication of whether the stop operation
478f11c7f63SJim Harris  *         succeeded.
479f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the stop operation
480f11c7f63SJim Harris  *         begins successfully.
481f11c7f63SJim Harris  */
482f11c7f63SJim Harris static
scif_sas_controller_ready_stop_handler(SCI_BASE_CONTROLLER_T * controller,U32 timeout)483f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_stop_handler(
484f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller,
485f11c7f63SJim Harris    U32                     timeout
486f11c7f63SJim Harris )
487f11c7f63SJim Harris {
488f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
489f11c7f63SJim Harris 
490f11c7f63SJim Harris    SCIF_LOG_TRACE((
491f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
492f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
493f11c7f63SJim Harris       "scif_sas_controller_ready_stop_handler(0x%x, 0x%x) enter\n",
494f11c7f63SJim Harris       controller, timeout
495f11c7f63SJim Harris    ));
496f11c7f63SJim Harris 
497f11c7f63SJim Harris    sci_base_state_machine_change_state(
498f11c7f63SJim Harris       &fw_controller->parent.state_machine,
499f11c7f63SJim Harris       SCI_BASE_CONTROLLER_STATE_STOPPING
500f11c7f63SJim Harris    );
501f11c7f63SJim Harris 
502f11c7f63SJim Harris    if (fw_controller->user_parameters.sas.clear_affiliation_during_controller_stop)
503f11c7f63SJim Harris    {
504f11c7f63SJim Harris       fw_controller->current_domain_to_clear_affiliation = 0;
505f11c7f63SJim Harris 
506f11c7f63SJim Harris       //clear affiliation first. After the last domain finishes clearing
507f11c7f63SJim Harris       //affiliation, it will call back to controller to continue to stop.
508f11c7f63SJim Harris       scif_sas_controller_clear_affiliation(fw_controller);
509f11c7f63SJim Harris    }
510f11c7f63SJim Harris    else
511f11c7f63SJim Harris       scif_sas_controller_continue_to_stop(fw_controller);
512f11c7f63SJim Harris 
513f11c7f63SJim Harris    //Must return SUCCESS at this point.
514f11c7f63SJim Harris    return SCI_SUCCESS;
515f11c7f63SJim Harris }
516f11c7f63SJim Harris 
517f11c7f63SJim Harris /**
518f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
519f11c7f63SJim Harris  *        when a user attempts to reset a controller.
520f11c7f63SJim Harris  *
521f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
522f11c7f63SJim Harris  *             on which the user is attempting to perform a reset
523f11c7f63SJim Harris  *             operation.
524f11c7f63SJim Harris  *
525f11c7f63SJim Harris  * @return This method returns an indication of whether the reset operation
526f11c7f63SJim Harris  *         succeeded.
527f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the reset operation
528f11c7f63SJim Harris  *         completes successfully.
529f11c7f63SJim Harris  */
530f11c7f63SJim Harris static
scif_sas_controller_ready_reset_handler(SCI_BASE_CONTROLLER_T * controller)531f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_reset_handler(
532f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller
533f11c7f63SJim Harris )
534f11c7f63SJim Harris {
535f11c7f63SJim Harris    return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
536f11c7f63SJim Harris }
537f11c7f63SJim Harris 
538f11c7f63SJim Harris /**
539f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
540f11c7f63SJim Harris  *        when a user attempts to start an IO request.
541f11c7f63SJim Harris  *
542f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
543f11c7f63SJim Harris  *             on which the user is attempting to perform a start IO
544f11c7f63SJim Harris  *             operation.
545f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
546f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
547f11c7f63SJim Harris  *             operation.
548f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
549f11c7f63SJim Harris  *             started.
550f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
551f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_io() for
552f11c7f63SJim Harris  *             more information.
553f11c7f63SJim Harris  *
554f11c7f63SJim Harris  * @return This method returns an indication of whether the start IO
555f11c7f63SJim Harris  *         operation succeeded.
556f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start IO operation
557f11c7f63SJim Harris  *         begins successfully.
558f11c7f63SJim Harris  */
559f11c7f63SJim Harris static
scif_sas_controller_ready_start_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)560f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_start_io_handler(
561f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
562f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
563f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
564f11c7f63SJim Harris    U16                        io_tag
565f11c7f63SJim Harris )
566f11c7f63SJim Harris {
567f11c7f63SJim Harris    SCI_STATUS                status;
568f11c7f63SJim Harris    SCIF_SAS_IO_REQUEST_T    *fw_io         = (SCIF_SAS_IO_REQUEST_T*)io_request;
569f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
570f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T *fw_device     = (SCIF_SAS_REMOTE_DEVICE_T*)
571f11c7f63SJim Harris                                              remote_device;
572f11c7f63SJim Harris 
573f11c7f63SJim Harris    SCIF_LOG_TRACE((
574f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
575f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
576f11c7f63SJim Harris       "scif_sas_controller_ready_start_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
577f11c7f63SJim Harris       controller, remote_device, io_request, io_tag
578f11c7f63SJim Harris    ));
579f11c7f63SJim Harris 
580f11c7f63SJim Harris    status = fw_device->domain->state_handlers->start_io_handler(
581f11c7f63SJim Harris                &fw_device->domain->parent, remote_device, io_request
582f11c7f63SJim Harris             );
583f11c7f63SJim Harris 
584f11c7f63SJim Harris    // Check to see that the other objects in the framework allowed
585f11c7f63SJim Harris    // this IO to be started.
586f11c7f63SJim Harris    if (status == SCI_SUCCESS)
587f11c7f63SJim Harris    {
588f11c7f63SJim Harris       // Ask the core to start processing for this IO request.
5890f2a8452SJim Harris       status = (SCI_STATUS)scic_controller_start_io(
590f11c7f63SJim Harris                   fw_controller->core_object,
591f11c7f63SJim Harris                   fw_device->core_object,
592f11c7f63SJim Harris                   fw_io->parent.core_object,
593f11c7f63SJim Harris                   io_tag
594f11c7f63SJim Harris                );
595f11c7f63SJim Harris 
596f11c7f63SJim Harris       if (status == SCI_SUCCESS)
597f11c7f63SJim Harris       {
598f11c7f63SJim Harris          // We were able to start the core request. As a result,
599f11c7f63SJim Harris          // commit to starting the request for the framework by changing
600f11c7f63SJim Harris          // the state of the IO request.
601f11c7f63SJim Harris          sci_base_state_machine_change_state(
602f11c7f63SJim Harris             &io_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED
603f11c7f63SJim Harris          );
604f11c7f63SJim Harris       }
605f11c7f63SJim Harris       else
606f11c7f63SJim Harris       {
607f11c7f63SJim Harris          // We were unable to start the core IO request. As a result,
608f11c7f63SJim Harris          // back out the start operation for the framework.  It's easier to
609f11c7f63SJim Harris          // back out the framework start operation then to backout the core
610f11c7f63SJim Harris          // start IO operation.
611f11c7f63SJim Harris          fw_device->domain->state_handlers->complete_io_handler(
612f11c7f63SJim Harris             &fw_device->domain->parent, remote_device, io_request
613f11c7f63SJim Harris          );
614f11c7f63SJim Harris 
615f11c7f63SJim Harris          // Invoke the IO completion handler.  For most IOs, this does nothing
616f11c7f63SJim Harris          // since we are still in the constructed state.  For NCQ, this will
617f11c7f63SJim Harris          // the return of the NCQ tag back to the remote device free pool.
618f11c7f63SJim Harris          fw_io->parent.state_handlers->complete_handler(io_request);
619f11c7f63SJim Harris 
620f11c7f63SJim Harris          SCIF_LOG_WARNING((
621f11c7f63SJim Harris             sci_base_object_get_logger(fw_controller),
622f11c7f63SJim Harris             SCIF_LOG_OBJECT_CONTROLLER,
623f11c7f63SJim Harris             "Controller:0x%x IORequest:0x%x Status:0x%x core IO start failed\n",
624f11c7f63SJim Harris             fw_controller, fw_io, status
625f11c7f63SJim Harris          ));
626f11c7f63SJim Harris       }
627f11c7f63SJim Harris    }
628f11c7f63SJim Harris    else
629f11c7f63SJim Harris    {
630f11c7f63SJim Harris       SCIF_LOG_WARNING((
631f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
632f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
633f11c7f63SJim Harris          "Controller:0x%x IORequest:0x%x Status:0x%x IO start failed\n",
634f11c7f63SJim Harris          fw_controller, fw_io, status
635f11c7f63SJim Harris       ));
636f11c7f63SJim Harris    }
637f11c7f63SJim Harris 
638f11c7f63SJim Harris    return status;
639f11c7f63SJim Harris }
640f11c7f63SJim Harris 
641f11c7f63SJim Harris /**
642f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
643f11c7f63SJim Harris  *        when a user attempts to complete an IO request.
644f11c7f63SJim Harris  *
645f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
646f11c7f63SJim Harris  *             on which the user is attempting to perform a complete IO
647f11c7f63SJim Harris  *             operation.
648f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
649f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
650f11c7f63SJim Harris  *             operation.
651f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
652f11c7f63SJim Harris  *             started.
653f11c7f63SJim Harris  *
654f11c7f63SJim Harris  * @return This method returns an indication of whether the complete IO
655f11c7f63SJim Harris  *         operation succeeded.
656f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the complete IO operation
657f11c7f63SJim Harris  *         begins successfully.
658f11c7f63SJim Harris  */
659f11c7f63SJim Harris static
scif_sas_controller_ready_complete_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request)660f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_complete_io_handler(
661f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
662f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
663f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request
664f11c7f63SJim Harris )
665f11c7f63SJim Harris {
666f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    * fw_controller = (SCIF_SAS_CONTROLLER_T*)
667f11c7f63SJim Harris                                               controller;
668f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T * fw_device     = (SCIF_SAS_REMOTE_DEVICE_T*)
669f11c7f63SJim Harris                                               remote_device;
670f11c7f63SJim Harris    SCIF_SAS_IO_REQUEST_T    * fw_io         = (SCIF_SAS_IO_REQUEST_T*)
671f11c7f63SJim Harris                                               io_request;
672f11c7f63SJim Harris    SCI_STATUS                 status;
673f11c7f63SJim Harris    SCI_STATUS                 core_status;
674f11c7f63SJim Harris 
675f11c7f63SJim Harris    SCIF_LOG_TRACE((
676f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
677f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
678f11c7f63SJim Harris       "scif_sas_controller_ready_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
679f11c7f63SJim Harris       controller, remote_device, io_request
680f11c7f63SJim Harris    ));
681f11c7f63SJim Harris 
682f11c7f63SJim Harris    fw_io->parent.state_handlers->destruct_handler(&fw_io->parent.parent);
683f11c7f63SJim Harris    status = fw_device->domain->state_handlers->complete_io_handler(
684f11c7f63SJim Harris                &fw_device->domain->parent, remote_device, io_request
685f11c7f63SJim Harris             );
686f11c7f63SJim Harris 
687f11c7f63SJim Harris    // Ask the core to finish processing for this IO request.
688f11c7f63SJim Harris    core_status = scic_controller_complete_io(
689f11c7f63SJim Harris                     fw_controller->core_object,
690f11c7f63SJim Harris                     fw_device->core_object,
691f11c7f63SJim Harris                     fw_io->parent.core_object
692f11c7f63SJim Harris                  );
693f11c7f63SJim Harris 
694f11c7f63SJim Harris    if (status == SCI_SUCCESS)
695f11c7f63SJim Harris       status = core_status;
696f11c7f63SJim Harris 
697f11c7f63SJim Harris    if (status != SCI_SUCCESS)
698f11c7f63SJim Harris    {
699f11c7f63SJim Harris       SCIF_LOG_WARNING((
700f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
701f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
702f11c7f63SJim Harris          "Controller:0x%x IORequest:0x%x Status:0x%x CoreStatus:0x%x "
703f11c7f63SJim Harris          "failure to complete IO\n",
704f11c7f63SJim Harris          fw_controller, fw_io, status, core_status
705f11c7f63SJim Harris       ));
706f11c7f63SJim Harris    }
707f11c7f63SJim Harris 
708f11c7f63SJim Harris    return status;
709f11c7f63SJim Harris }
710f11c7f63SJim Harris 
711f11c7f63SJim Harris 
712f11c7f63SJim Harris /**
713f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
714f11c7f63SJim Harris  *        when a user attempts to complete a high priority IO request.
715f11c7f63SJim Harris  *
716f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
717f11c7f63SJim Harris  *             on which the user is attempting to perform a complete IO
718f11c7f63SJim Harris  *             operation.
719f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
720f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
721f11c7f63SJim Harris  *             operation.
722f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
723f11c7f63SJim Harris  *             started.
724f11c7f63SJim Harris  *
725f11c7f63SJim Harris  * @return This method returns an indication of whether the complete IO
726f11c7f63SJim Harris  *         operation succeeded.
727f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the complete IO operation
728f11c7f63SJim Harris  *         begins successfully.
729f11c7f63SJim Harris  */
730f11c7f63SJim Harris static
scif_sas_controller_ready_complete_high_priority_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request)731f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_complete_high_priority_io_handler(
732f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
733f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
734f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request
735f11c7f63SJim Harris )
736f11c7f63SJim Harris {
737f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    * fw_controller = (SCIF_SAS_CONTROLLER_T*)
738f11c7f63SJim Harris                                               controller;
739f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T * fw_device     = (SCIF_SAS_REMOTE_DEVICE_T*)
740f11c7f63SJim Harris                                               remote_device;
741f11c7f63SJim Harris    SCIF_SAS_IO_REQUEST_T    * fw_io         = (SCIF_SAS_IO_REQUEST_T*)
742f11c7f63SJim Harris                                               io_request;
743f11c7f63SJim Harris    SCI_IO_STATUS core_completion_status =
744f11c7f63SJim Harris                     scic_request_get_sci_status(fw_io->parent.core_object);
745f11c7f63SJim Harris 
746f11c7f63SJim Harris    U8 response_data[SCIF_SAS_RESPONSE_DATA_LENGTH];
747f11c7f63SJim Harris 
748f11c7f63SJim Harris    SCI_STATUS                 status;
749f11c7f63SJim Harris    SCI_STATUS                 core_status;
750f11c7f63SJim Harris 
751f11c7f63SJim Harris    SCIF_LOG_TRACE((
752f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
753f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
754f11c7f63SJim Harris       "scif_sas_controller_ready_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x) enter\n",
755f11c7f63SJim Harris       controller, remote_device, io_request
756f11c7f63SJim Harris    ));
757f11c7f63SJim Harris 
758f11c7f63SJim Harris    // In high priority path, we ask the core to finish IO request before framework.
759f11c7f63SJim Harris 
760f11c7f63SJim Harris    // retrieve and save io response from core now.
761f11c7f63SJim Harris    memcpy(response_data,
762f11c7f63SJim Harris           scic_io_request_get_response_iu_address(fw_io->parent.core_object),
763f11c7f63SJim Harris           SCIF_SAS_RESPONSE_DATA_LENGTH
764f11c7f63SJim Harris          );
765f11c7f63SJim Harris 
766f11c7f63SJim Harris    core_status = scic_controller_complete_io(
767f11c7f63SJim Harris                     fw_controller->core_object,
768f11c7f63SJim Harris                     fw_device->core_object,
769f11c7f63SJim Harris                     fw_io->parent.core_object
770f11c7f63SJim Harris                  );
771f11c7f63SJim Harris 
772f11c7f63SJim Harris    fw_io->parent.state_handlers->destruct_handler(&fw_io->parent.parent);
773f11c7f63SJim Harris    status = fw_device->domain->state_handlers->complete_high_priority_io_handler(
774f11c7f63SJim Harris                &fw_device->domain->parent,
775f11c7f63SJim Harris                remote_device,
776f11c7f63SJim Harris                io_request,
777f11c7f63SJim Harris                (void *)response_data,
778f11c7f63SJim Harris                core_completion_status
779f11c7f63SJim Harris             );
780f11c7f63SJim Harris 
781f11c7f63SJim Harris    if (status == SCI_SUCCESS)
782f11c7f63SJim Harris       status = core_status;
783f11c7f63SJim Harris 
784f11c7f63SJim Harris    if (status == SCI_SUCCESS)
785f11c7f63SJim Harris    {
786f11c7f63SJim Harris        //issue DPC to start next internal io in high prioriy queue.
787f11c7f63SJim Harris       if( !sci_pool_empty(fw_controller->hprq.pool) )
788f11c7f63SJim Harris          scif_cb_start_internal_io_task_schedule(
789f11c7f63SJim Harris             fw_controller,
790f11c7f63SJim Harris             scif_sas_controller_start_high_priority_io,
791f11c7f63SJim Harris             fw_controller
792f11c7f63SJim Harris          );
793f11c7f63SJim Harris    }
794f11c7f63SJim Harris    else
795f11c7f63SJim Harris    {
796f11c7f63SJim Harris       SCIF_LOG_WARNING((
797f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
798f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
799f11c7f63SJim Harris          "Controller:0x%x IORequest:0x%x Status:0x%x CoreStatus:0x%x "
800f11c7f63SJim Harris          "failure to complete IO\n",
801f11c7f63SJim Harris          fw_controller, fw_io, status, core_status
802f11c7f63SJim Harris       ));
803f11c7f63SJim Harris    }
804f11c7f63SJim Harris 
805f11c7f63SJim Harris    return status;
806f11c7f63SJim Harris }
807f11c7f63SJim Harris 
808f11c7f63SJim Harris /**
809f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
810f11c7f63SJim Harris  *        when a user attempts to continue an IO request.
811f11c7f63SJim Harris  *
812f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
813f11c7f63SJim Harris  *             on which the user is attempting to perform a continue IO
814f11c7f63SJim Harris  *             operation.
815f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
816f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
817f11c7f63SJim Harris  *             operation.
818f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
819f11c7f63SJim Harris  *             started.
820f11c7f63SJim Harris  *
821f11c7f63SJim Harris  * @return This method returns an indication of whether the continue IO
822f11c7f63SJim Harris  *         operation succeeded.
823f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the continue IO operation
824f11c7f63SJim Harris  *         begins successfully.
825f11c7f63SJim Harris  */
826f11c7f63SJim Harris static
scif_sas_controller_ready_continue_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request)827f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_continue_io_handler(
828f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
829f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
830f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request
831f11c7f63SJim Harris )
832f11c7f63SJim Harris {
833f11c7f63SJim Harris    SCIF_LOG_TRACE((
834f11c7f63SJim Harris       sci_base_object_get_logger(controller),
835f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
836f11c7f63SJim Harris       "scif_sas_controller_ready_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n",
837f11c7f63SJim Harris       controller, remote_device, io_request
838f11c7f63SJim Harris    ));
839f11c7f63SJim Harris 
840f11c7f63SJim Harris    /// @todo Function unimplemented.  fix return code handling.
841f11c7f63SJim Harris    return SCI_FAILURE;
842f11c7f63SJim Harris }
843f11c7f63SJim Harris 
844f11c7f63SJim Harris /**
845f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
846f11c7f63SJim Harris  *        when a user attempts to start a task request.
847f11c7f63SJim Harris  *
848f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
849f11c7f63SJim Harris  *             on which the user is attempting to perform a start task
850f11c7f63SJim Harris  *             operation.
851f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
852f11c7f63SJim Harris  *             object on which the user is attempting to perform a start
853f11c7f63SJim Harris  *             task operation.
854f11c7f63SJim Harris  * @param[in]  task_request This parameter specifies the task management
855f11c7f63SJim Harris  *             request to be started.
856f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
857f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_task() for
858f11c7f63SJim Harris  *             more information.
859f11c7f63SJim Harris  *
860f11c7f63SJim Harris  * @return This method returns an indication of whether the start task
861f11c7f63SJim Harris  *         operation succeeded.
862f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start task operation
863f11c7f63SJim Harris  *         begins successfully.
864f11c7f63SJim Harris  */
865f11c7f63SJim Harris static
scif_sas_controller_ready_start_task_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * task_request,U16 io_tag)866f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_start_task_handler(
867f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
868f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
869f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * task_request,
870f11c7f63SJim Harris    U16                        io_tag
871f11c7f63SJim Harris )
872f11c7f63SJim Harris {
873f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    * fw_controller = (SCIF_SAS_CONTROLLER_T*)
874f11c7f63SJim Harris                                               controller;
875f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
876f11c7f63SJim Harris                                           remote_device;
877f11c7f63SJim Harris    SCIF_SAS_TASK_REQUEST_T  * fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request;
878f11c7f63SJim Harris    SCI_STATUS                 status;
879f11c7f63SJim Harris 
880f11c7f63SJim Harris    SCIF_LOG_TRACE((
881f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
882f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
883f11c7f63SJim Harris       "scif_sas_controller_ready_start_task_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
884f11c7f63SJim Harris       controller, remote_device, task_request, io_tag
885f11c7f63SJim Harris    ));
886f11c7f63SJim Harris 
887f11c7f63SJim Harris    status = fw_device->domain->state_handlers->start_task_handler(
888f11c7f63SJim Harris                &fw_device->domain->parent, remote_device, task_request
889f11c7f63SJim Harris             );
890f11c7f63SJim Harris 
891f11c7f63SJim Harris    if (status == SCI_SUCCESS)
892f11c7f63SJim Harris    {
893f11c7f63SJim Harris       if (scif_sas_task_request_get_function(fw_task)
894f11c7f63SJim Harris              == SCI_SAS_HARD_RESET)
895f11c7f63SJim Harris       {
896f11c7f63SJim Harris          // Go off to special target reset path. Don't start task to core.
897f11c7f63SJim Harris          scif_sas_remote_device_target_reset(
898f11c7f63SJim Harris             fw_device,
899f11c7f63SJim Harris             (SCIF_SAS_REQUEST_T *)fw_task
900f11c7f63SJim Harris          );
901f11c7f63SJim Harris 
902f11c7f63SJim Harris          return SCI_SUCCESS;
903f11c7f63SJim Harris       }
904f11c7f63SJim Harris 
905f11c7f63SJim Harris       // Ask the core to start processing for this task request.
9060f2a8452SJim Harris       status = (SCI_STATUS)scic_controller_start_task(
907f11c7f63SJim Harris                   fw_controller->core_object,
908f11c7f63SJim Harris                   fw_device->core_object,
909f11c7f63SJim Harris                   fw_task->parent.core_object,
910f11c7f63SJim Harris                   io_tag
911f11c7f63SJim Harris                );
912f11c7f63SJim Harris 
913f11c7f63SJim Harris       if (status == SCI_SUCCESS)
914f11c7f63SJim Harris       {
915f11c7f63SJim Harris          // We were able to start the core request. As a result,
916f11c7f63SJim Harris          // commit to starting the request for the framework by changing
917f11c7f63SJim Harris          // the state of the task request.
918f11c7f63SJim Harris          fw_task->parent.state_handlers->start_handler(&fw_task->parent.parent);
919f11c7f63SJim Harris       }
920f11c7f63SJim Harris       else
921f11c7f63SJim Harris       {
922f11c7f63SJim Harris          // We were unable to start the core task request. As a result,
923f11c7f63SJim Harris          // back out the start operation for the framework.  It's easier to
924f11c7f63SJim Harris          // back out the framework start operation then to backout the core
925f11c7f63SJim Harris          // start task operation.
926f11c7f63SJim Harris          fw_device->domain->state_handlers->complete_task_handler(
927f11c7f63SJim Harris             &fw_device->domain->parent, remote_device, task_request
928f11c7f63SJim Harris          );
929f11c7f63SJim Harris 
930f11c7f63SJim Harris          if (status == SCI_SUCCESS)
931f11c7f63SJim Harris          {
932f11c7f63SJim Harris             SCIF_LOG_WARNING((
933f11c7f63SJim Harris                sci_base_object_get_logger(fw_controller),
934f11c7f63SJim Harris                SCIF_LOG_OBJECT_CONTROLLER,
935f11c7f63SJim Harris                "Controller:0x%x TaskRequest:0x%x Status:0x%x core start failed\n",
936f11c7f63SJim Harris                fw_controller, fw_task, status
937f11c7f63SJim Harris             ));
938f11c7f63SJim Harris          }
939f11c7f63SJim Harris       }
940f11c7f63SJim Harris    }
941f11c7f63SJim Harris    else
942f11c7f63SJim Harris    {
943f11c7f63SJim Harris       SCIF_LOG_WARNING((
944f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
945f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
946f11c7f63SJim Harris          "Controller:0x%x TaskRequest:0x%x Status:0x%x Task start failed\n",
947f11c7f63SJim Harris          fw_controller, fw_task, status
948f11c7f63SJim Harris       ));
949f11c7f63SJim Harris    }
950f11c7f63SJim Harris 
951f11c7f63SJim Harris    return status;
952f11c7f63SJim Harris }
953f11c7f63SJim Harris 
954f11c7f63SJim Harris /**
955f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
956f11c7f63SJim Harris  *        when a user attempts to complete a task request.
957f11c7f63SJim Harris  *
958f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
959f11c7f63SJim Harris  *             on which the user is attempting to perform a complete task
960f11c7f63SJim Harris  *             operation.
961f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
962f11c7f63SJim Harris  *             object on which the user is attempting to perform a start
963f11c7f63SJim Harris  *             task operation.
964f11c7f63SJim Harris  * @param[in]  task_request This parameter specifies the task management
965f11c7f63SJim Harris  *             request to be started.
966f11c7f63SJim Harris  *
967f11c7f63SJim Harris  * @return This method returns an indication of whether the complete task
968f11c7f63SJim Harris  *         operation succeeded.
969f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the complete task operation
970f11c7f63SJim Harris  *         begins successfully.
971f11c7f63SJim Harris  */
972f11c7f63SJim Harris static
scif_sas_controller_ready_complete_task_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * task_request)973f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_complete_task_handler(
974f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
975f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
976f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * task_request
977f11c7f63SJim Harris )
978f11c7f63SJim Harris {
979f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
980f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T *fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)remote_device;
981f11c7f63SJim Harris    SCIF_SAS_TASK_REQUEST_T  *fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request;
982f11c7f63SJim Harris    SCI_STATUS                status;
983f11c7f63SJim Harris    SCI_STATUS                core_status;
984f11c7f63SJim Harris 
985f11c7f63SJim Harris    SCIF_LOG_TRACE((
986f11c7f63SJim Harris       sci_base_object_get_logger(fw_controller),
987f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
988f11c7f63SJim Harris       "scif_sas_controller_ready_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n",
989f11c7f63SJim Harris       controller, remote_device, task_request
990f11c7f63SJim Harris    ));
991f11c7f63SJim Harris 
992f11c7f63SJim Harris    status = fw_device->domain->state_handlers->complete_task_handler(
993f11c7f63SJim Harris                &fw_device->domain->parent, remote_device, task_request
994f11c7f63SJim Harris             );
995f11c7f63SJim Harris 
996f11c7f63SJim Harris    if (scif_sas_task_request_get_function(fw_task)
997f11c7f63SJim Harris           == SCI_SAS_HARD_RESET)
998f11c7f63SJim Harris    {
999f11c7f63SJim Harris       //No more things to do in the core, since this task is for Target Reset.
1000f11c7f63SJim Harris       return status;
1001f11c7f63SJim Harris    }
1002f11c7f63SJim Harris 
1003f11c7f63SJim Harris    fw_task->parent.state_handlers->destruct_handler(&fw_task->parent.parent);
1004f11c7f63SJim Harris 
1005f11c7f63SJim Harris    // Ask the core to finish processing for this task request.
1006f11c7f63SJim Harris    core_status = scic_controller_complete_task(
1007f11c7f63SJim Harris                     fw_controller->core_object,
1008f11c7f63SJim Harris                     fw_device->core_object,
1009f11c7f63SJim Harris                     fw_task->parent.core_object
1010f11c7f63SJim Harris                  );
1011f11c7f63SJim Harris 
1012f11c7f63SJim Harris    if (status == SCI_SUCCESS)
1013f11c7f63SJim Harris       status = core_status;
1014f11c7f63SJim Harris 
1015f11c7f63SJim Harris    if (status != SCI_SUCCESS)
1016f11c7f63SJim Harris    {
1017f11c7f63SJim Harris       SCIF_LOG_WARNING((
1018f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
1019f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
1020f11c7f63SJim Harris          "Controller:0x%x TaskRequest:0x%x Status:0x%x CoreStatus:0x%x "
1021f11c7f63SJim Harris          "failed to complete\n",
1022f11c7f63SJim Harris          fw_controller, fw_task, status, core_status
1023f11c7f63SJim Harris       ));
1024f11c7f63SJim Harris    }
1025f11c7f63SJim Harris 
1026f11c7f63SJim Harris    return status;
1027f11c7f63SJim Harris }
1028f11c7f63SJim Harris 
1029f11c7f63SJim Harris 
1030f11c7f63SJim Harris 
1031f11c7f63SJim Harris /**
1032f11c7f63SJim Harris  * @brief This method provides common handling for several states
1033f11c7f63SJim Harris  *        when a user attempts to start an internal request.
1034f11c7f63SJim Harris  *
1035f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1036f11c7f63SJim Harris  *             on which the user is attempting to perform a start IO
1037f11c7f63SJim Harris  *             operation.
1038f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1039f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1040f11c7f63SJim Harris  *             operation.
1041f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1042f11c7f63SJim Harris  *             started.
1043f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
1044f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_io() for
1045f11c7f63SJim Harris  *             more information.
1046f11c7f63SJim Harris  *
1047f11c7f63SJim Harris  * @return This method returns an indication of whether the start IO
1048f11c7f63SJim Harris  *         operation succeeded.
1049f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start IO operation
1050f11c7f63SJim Harris  *         begins successfully.
1051f11c7f63SJim Harris  */
1052f11c7f63SJim Harris static
scif_sas_controller_common_start_high_priority_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)1053f11c7f63SJim Harris SCI_STATUS scif_sas_controller_common_start_high_priority_io_handler(
1054f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1055f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1056f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
1057f11c7f63SJim Harris    U16                        io_tag
1058f11c7f63SJim Harris )
1059f11c7f63SJim Harris {
1060f11c7f63SJim Harris    SCI_STATUS                status;
1061f11c7f63SJim Harris    SCIF_SAS_IO_REQUEST_T    *fw_io         = (SCIF_SAS_IO_REQUEST_T*)io_request;
1062f11c7f63SJim Harris    SCIF_SAS_CONTROLLER_T    *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
1063f11c7f63SJim Harris    SCIF_SAS_REMOTE_DEVICE_T *fw_device     = (SCIF_SAS_REMOTE_DEVICE_T*)
1064f11c7f63SJim Harris                                              remote_device;
1065f11c7f63SJim Harris 
1066f11c7f63SJim Harris    status = fw_device->domain->state_handlers->start_high_priority_io_handler(
1067f11c7f63SJim Harris                &fw_device->domain->parent, remote_device, io_request
1068f11c7f63SJim Harris             );
1069f11c7f63SJim Harris 
1070f11c7f63SJim Harris    // Check to see that the other objects in the framework allowed
1071f11c7f63SJim Harris    // this IO to be started.
1072f11c7f63SJim Harris    if (status == SCI_SUCCESS)
1073f11c7f63SJim Harris    {
1074f11c7f63SJim Harris       // Ask the core to start processing for this IO request.
10750f2a8452SJim Harris       status = (SCI_STATUS)scic_controller_start_io(
1076f11c7f63SJim Harris                   fw_controller->core_object,
1077f11c7f63SJim Harris                   fw_device->core_object,
1078f11c7f63SJim Harris                   fw_io->parent.core_object,
1079f11c7f63SJim Harris                   io_tag
1080f11c7f63SJim Harris                );
1081f11c7f63SJim Harris 
1082f11c7f63SJim Harris       if (status == SCI_SUCCESS)
1083f11c7f63SJim Harris       {
1084f11c7f63SJim Harris          // We were able to start the core request. As a result,
1085f11c7f63SJim Harris          // commit to starting the request for the framework by changing
1086f11c7f63SJim Harris          // the state of the IO request.
1087f11c7f63SJim Harris          sci_base_state_machine_change_state(
1088f11c7f63SJim Harris             &io_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED
1089f11c7f63SJim Harris          );
1090f11c7f63SJim Harris       }
1091f11c7f63SJim Harris       else
1092f11c7f63SJim Harris       {
1093f11c7f63SJim Harris          // We were unable to start the core IO request. As a result,
1094f11c7f63SJim Harris          // back out the start operation for the framework.  It's easier to
1095f11c7f63SJim Harris          // back out the framework start operation then to backout the core
1096f11c7f63SJim Harris          // start IO operation.
1097f11c7f63SJim Harris          fw_device->domain->state_handlers->complete_io_handler(
1098f11c7f63SJim Harris             &fw_device->domain->parent, remote_device, io_request
1099f11c7f63SJim Harris          );
1100f11c7f63SJim Harris 
1101f11c7f63SJim Harris          // Invoke the IO completion handler.  For most IOs, this does nothing
1102f11c7f63SJim Harris          // since we are still in the constructed state.  For NCQ, this will
1103f11c7f63SJim Harris          // the return of the NCQ tag back to the remote device free pool.
1104f11c7f63SJim Harris          fw_io->parent.state_handlers->complete_handler(io_request);
1105f11c7f63SJim Harris 
1106f11c7f63SJim Harris          SCIF_LOG_WARNING((
1107f11c7f63SJim Harris             sci_base_object_get_logger(fw_controller),
1108f11c7f63SJim Harris             SCIF_LOG_OBJECT_CONTROLLER,
1109f11c7f63SJim Harris             "Controller:0x%x IORequest:0x%x Status:0x%x core IO start failed\n",
1110f11c7f63SJim Harris             fw_controller, fw_io, status
1111f11c7f63SJim Harris          ));
1112f11c7f63SJim Harris       }
1113f11c7f63SJim Harris    }
1114f11c7f63SJim Harris    else
1115f11c7f63SJim Harris    {
1116f11c7f63SJim Harris       SCIF_LOG_WARNING((
1117f11c7f63SJim Harris          sci_base_object_get_logger(fw_controller),
1118f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER,
1119f11c7f63SJim Harris          "Controller:0x%x IORequest:0x%x Status:0x%x IO start failed\n",
1120f11c7f63SJim Harris          fw_controller, fw_io, status
1121f11c7f63SJim Harris       ));
1122f11c7f63SJim Harris 
1123f11c7f63SJim Harris       // Invoke the IO completion handler.  For most IOs, this does nothing
1124f11c7f63SJim Harris       // since we are still in the constructed state.  For NCQ, this will
1125f11c7f63SJim Harris       // the return of the NCQ tag back to the remote device free pool.
1126f11c7f63SJim Harris       fw_io->parent.state_handlers->complete_handler(io_request);
1127f11c7f63SJim Harris 
1128f11c7f63SJim Harris    }
1129f11c7f63SJim Harris 
1130f11c7f63SJim Harris    if (fw_io->parent.is_internal && status != SCI_SUCCESS )
1131f11c7f63SJim Harris    {
1132f11c7f63SJim Harris       SCIC_TRANSPORT_PROTOCOL protocol =
1133f11c7f63SJim Harris          scic_io_request_get_protocol(fw_io->parent.core_object);
1134f11c7f63SJim Harris 
1135f11c7f63SJim Harris       U8 retry_count = fw_io->retry_count;
1136f11c7f63SJim Harris 
1137f11c7f63SJim Harris       scif_sas_internal_io_request_destruct(
1138f11c7f63SJim Harris          fw_device->domain->controller,
1139f11c7f63SJim Harris          (SCIF_SAS_INTERNAL_IO_REQUEST_T *)fw_io
1140f11c7f63SJim Harris       );
1141f11c7f63SJim Harris 
1142f11c7f63SJim Harris       if ( protocol == SCIC_SMP_PROTOCOL )
1143f11c7f63SJim Harris       {
1144f11c7f63SJim Harris          if (fw_device->protocol_device.smp_device.smp_activity_timer != NULL)
1145f11c7f63SJim Harris          {
1146f11c7f63SJim Harris             //destroy the smp_activity_timer
1147f11c7f63SJim Harris             scif_cb_timer_destroy (
1148f11c7f63SJim Harris                fw_controller,
1149f11c7f63SJim Harris                fw_device->protocol_device.smp_device.smp_activity_timer
1150f11c7f63SJim Harris             );
1151f11c7f63SJim Harris 
1152f11c7f63SJim Harris             fw_device->protocol_device.smp_device.smp_activity_timer = NULL;
1153f11c7f63SJim Harris          }
1154f11c7f63SJim Harris 
1155f11c7f63SJim Harris          //we should retry for finite times
1156f11c7f63SJim Harris          if ( retry_count < SCIF_SAS_IO_RETRY_LIMIT)
1157f11c7f63SJim Harris          {
1158f11c7f63SJim Harris          //An internal smp request failed being started, most likely due to remote device
1159f11c7f63SJim Harris          //is not in ready state, for example, UPDATING_PORT_WIDTH state. In this case,
1160f11c7f63SJim Harris          //we should retry the IO.
1161f11c7f63SJim Harris          scif_sas_smp_remote_device_retry_internal_io(
1162f11c7f63SJim Harris             (SCIF_SAS_REMOTE_DEVICE_T *)remote_device,
1163f11c7f63SJim Harris             retry_count,
1164f11c7f63SJim Harris             SMP_REQUEST_RETRY_WAIT_DURATION
1165f11c7f63SJim Harris          );
1166f11c7f63SJim Harris       }
1167f11c7f63SJim Harris    }
1168f11c7f63SJim Harris    }
1169f11c7f63SJim Harris 
1170f11c7f63SJim Harris    return status;
1171f11c7f63SJim Harris }
1172f11c7f63SJim Harris 
1173f11c7f63SJim Harris 
1174f11c7f63SJim Harris /**
1175f11c7f63SJim Harris  * @brief This method provides READY state specific handling for
1176f11c7f63SJim Harris  *        when a user attempts to start an internal request. If the high
1177f11c7f63SJim Harris  *        priority IO is also internal, this method will schedule its timer.
1178f11c7f63SJim Harris  *
1179f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1180f11c7f63SJim Harris  *             on which the user is attempting to perform a start IO
1181f11c7f63SJim Harris  *             operation.
1182f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1183f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1184f11c7f63SJim Harris  *             operation.
1185f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1186f11c7f63SJim Harris  *             started.
1187f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
1188f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_io() for
1189f11c7f63SJim Harris  *             more information.
1190f11c7f63SJim Harris  *
1191f11c7f63SJim Harris  * @return This method returns an indication of whether the start IO
1192f11c7f63SJim Harris  *         operation succeeded.
1193f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start IO operation
1194f11c7f63SJim Harris  *         begins successfully.
1195f11c7f63SJim Harris  */
1196f11c7f63SJim Harris static
scif_sas_controller_ready_start_high_priority_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)1197f11c7f63SJim Harris SCI_STATUS scif_sas_controller_ready_start_high_priority_io_handler(
1198f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1199f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1200f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
1201f11c7f63SJim Harris    U16                        io_tag
1202f11c7f63SJim Harris )
1203f11c7f63SJim Harris {
1204f11c7f63SJim Harris    SCI_STATUS status;
1205f11c7f63SJim Harris    SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)io_request;
1206f11c7f63SJim Harris 
1207f11c7f63SJim Harris    SCIF_LOG_TRACE((
1208f11c7f63SJim Harris       sci_base_object_get_logger(controller),
1209f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
1210f11c7f63SJim Harris       "scif_sas_controller_ready_start_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
1211f11c7f63SJim Harris       controller, remote_device, io_request, io_tag
1212f11c7f63SJim Harris    ));
1213f11c7f63SJim Harris 
1214f11c7f63SJim Harris    status = scif_sas_controller_common_start_high_priority_io_handler(
1215f11c7f63SJim Harris                controller, remote_device, io_request, io_tag);
1216f11c7f63SJim Harris 
1217f11c7f63SJim Harris    if (status == SCI_SUCCESS)
1218f11c7f63SJim Harris    {
1219f11c7f63SJim Harris       //External io could also be put in high priority queue. i.e. the
1220f11c7f63SJim Harris       //smp request for EA Target Reset.
1221f11c7f63SJim Harris       if (fw_io->parent.is_internal)
1222f11c7f63SJim Harris       {
1223f11c7f63SJim Harris          SCIF_SAS_INTERNAL_IO_REQUEST_T * fw_internal_io =
1224f11c7f63SJim Harris             (SCIF_SAS_INTERNAL_IO_REQUEST_T *)fw_io;
1225f11c7f63SJim Harris 
1226f11c7f63SJim Harris          //start the timer for internal io
1227f11c7f63SJim Harris          scif_cb_timer_start(
1228f11c7f63SJim Harris             (SCI_CONTROLLER_HANDLE_T)controller,
1229f11c7f63SJim Harris              fw_internal_io->internal_io_timer,
1230f11c7f63SJim Harris              SCIF_SAS_INTERNAL_REQUEST_TIMEOUT
1231f11c7f63SJim Harris          );
1232f11c7f63SJim Harris       }
1233f11c7f63SJim Harris    }
1234f11c7f63SJim Harris    else
1235f11c7f63SJim Harris    {
1236f11c7f63SJim Harris       //If failed to start, most likely the device or domain is not in
1237f11c7f63SJim Harris       //correct state, and the IO has been cleaned up in controller's start
1238f11c7f63SJim Harris       //high priority IO handler. We should just continue to start the next
1239f11c7f63SJim Harris       //IO in the HP queue.
1240f11c7f63SJim Harris 
1241f11c7f63SJim Harris       SCIF_LOG_TRACE((
1242f11c7f63SJim Harris          sci_base_object_get_logger(controller),
1243f11c7f63SJim Harris          SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
1244f11c7f63SJim Harris          "scif_controller_start_high_priority_io(0x%x, 0x%x), starting io failed\n",
1245f11c7f63SJim Harris          controller, fw_io
1246f11c7f63SJim Harris       ));
1247f11c7f63SJim Harris    }
1248f11c7f63SJim Harris 
1249f11c7f63SJim Harris    return status;
1250f11c7f63SJim Harris }
1251f11c7f63SJim Harris 
1252f11c7f63SJim Harris 
1253f11c7f63SJim Harris //******************************************************************************
1254f11c7f63SJim Harris //* S T O P P I N G   H A N D L E R S
1255f11c7f63SJim Harris //******************************************************************************
1256f11c7f63SJim Harris /**
1257f11c7f63SJim Harris  * @brief This method provides STOPPING state specific handling for
1258f11c7f63SJim Harris  *        when a user attempts to start an internal request. Note that we don't
1259f11c7f63SJim Harris  *        start the timer for internal IO during controller stopping state.
1260f11c7f63SJim Harris  *
1261f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1262f11c7f63SJim Harris  *             on which the user is attempting to perform a start IO
1263f11c7f63SJim Harris  *             operation.
1264f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1265f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1266f11c7f63SJim Harris  *             operation.
1267f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1268f11c7f63SJim Harris  *             started.
1269f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
1270f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_io() for
1271f11c7f63SJim Harris  *             more information.
1272f11c7f63SJim Harris  *
1273f11c7f63SJim Harris  * @return This method returns an indication of whether the start IO
1274f11c7f63SJim Harris  *         operation succeeded.
1275f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the start IO operation
1276f11c7f63SJim Harris  *         begins successfully.
1277f11c7f63SJim Harris  */
1278f11c7f63SJim Harris static
scif_sas_controller_stopping_start_high_priority_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)1279f11c7f63SJim Harris SCI_STATUS scif_sas_controller_stopping_start_high_priority_io_handler(
1280f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1281f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1282f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
1283f11c7f63SJim Harris    U16                        io_tag
1284f11c7f63SJim Harris )
1285f11c7f63SJim Harris {
1286f11c7f63SJim Harris    SCIF_LOG_TRACE((
1287f11c7f63SJim Harris       sci_base_object_get_logger(controller),
1288f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
1289f11c7f63SJim Harris       "scif_sas_controller_stopping_start_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
1290f11c7f63SJim Harris       controller, remote_device, io_request, io_tag
1291f11c7f63SJim Harris    ));
1292f11c7f63SJim Harris 
1293f11c7f63SJim Harris    return scif_sas_controller_common_start_high_priority_io_handler(
1294f11c7f63SJim Harris              controller, remote_device, io_request, io_tag);
1295f11c7f63SJim Harris }
1296f11c7f63SJim Harris 
1297f11c7f63SJim Harris 
1298f11c7f63SJim Harris //******************************************************************************
1299f11c7f63SJim Harris //* S T O P P E D   H A N D L E R S
1300f11c7f63SJim Harris //******************************************************************************
1301f11c7f63SJim Harris 
1302f11c7f63SJim Harris /**
1303f11c7f63SJim Harris  * @brief This method provides STOPPED state specific handling for
1304f11c7f63SJim Harris  *        when a user attempts to reset a controller.
1305f11c7f63SJim Harris  *
1306f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1307f11c7f63SJim Harris  *             on which the user is attempting to perform a reset
1308f11c7f63SJim Harris  *             operation.
1309f11c7f63SJim Harris  *
1310f11c7f63SJim Harris  * @return This method returns an indication of whether the reset operation
1311f11c7f63SJim Harris  *         succeeded.
1312f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the reset operation
1313f11c7f63SJim Harris  *         completes successfully.
1314f11c7f63SJim Harris  */
1315f11c7f63SJim Harris static
scif_sas_controller_stopped_reset_handler(SCI_BASE_CONTROLLER_T * controller)1316f11c7f63SJim Harris SCI_STATUS scif_sas_controller_stopped_reset_handler(
1317f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller
1318f11c7f63SJim Harris )
1319f11c7f63SJim Harris {
1320f11c7f63SJim Harris    return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
1321f11c7f63SJim Harris }
1322f11c7f63SJim Harris 
1323f11c7f63SJim Harris 
1324f11c7f63SJim Harris //******************************************************************************
1325f11c7f63SJim Harris //* F A I L E D   H A N D L E R S
1326f11c7f63SJim Harris //******************************************************************************
1327f11c7f63SJim Harris 
1328f11c7f63SJim Harris /**
1329f11c7f63SJim Harris  * @brief This method provides FAILED state specific handling for
1330f11c7f63SJim Harris  *        when a user attempts to reset a controller.
1331f11c7f63SJim Harris  *
1332f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1333f11c7f63SJim Harris  *             on which the user is attempting to perform a reset
1334f11c7f63SJim Harris  *             operation.
1335f11c7f63SJim Harris  *
1336f11c7f63SJim Harris  * @return This method returns an indication of whether the reset operation
1337f11c7f63SJim Harris  *         succeeded.
1338f11c7f63SJim Harris  * @retval SCI_SUCCESS This value is returned when the reset operation
1339f11c7f63SJim Harris  *         completes successfully.
1340f11c7f63SJim Harris  */
1341f11c7f63SJim Harris static
scif_sas_controller_failed_reset_handler(SCI_BASE_CONTROLLER_T * controller)1342f11c7f63SJim Harris SCI_STATUS scif_sas_controller_failed_reset_handler(
1343f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller
1344f11c7f63SJim Harris )
1345f11c7f63SJim Harris {
1346f11c7f63SJim Harris    return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
1347f11c7f63SJim Harris }
1348f11c7f63SJim Harris 
1349f11c7f63SJim Harris //******************************************************************************
1350f11c7f63SJim Harris //* D E F A U L T   H A N D L E R S
1351f11c7f63SJim Harris //******************************************************************************
1352f11c7f63SJim Harris 
1353f11c7f63SJim Harris /**
1354f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1355f11c7f63SJim Harris  *        when a user attempts to start a controller and a start operation
1356f11c7f63SJim Harris  *        is not allowed.
1357f11c7f63SJim Harris  *
1358f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1359f11c7f63SJim Harris  *             on which the user is attempting to perform a start operation.
1360f11c7f63SJim Harris  * @param[in]  timeout This parameter specifies the timeout value (in
1361f11c7f63SJim Harris  *             milliseconds) to be utilized for this operation.
1362f11c7f63SJim Harris  *
1363f11c7f63SJim Harris  * @return This method returns an indication that start operations are not
1364f11c7f63SJim Harris  *         allowed.
1365f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1366f11c7f63SJim Harris  */
1367f11c7f63SJim Harris static
scif_sas_controller_default_start_handler(SCI_BASE_CONTROLLER_T * controller,U32 timeout)1368f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_start_handler(
1369f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller,
1370f11c7f63SJim Harris    U32                     timeout
1371f11c7f63SJim Harris )
1372f11c7f63SJim Harris {
1373f11c7f63SJim Harris    SCIF_LOG_WARNING((
1374f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1375f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1376f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to start controller.\n",
1377f11c7f63SJim Harris       controller,
1378f11c7f63SJim Harris       sci_base_state_machine_get_state(
1379f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1380f11c7f63SJim Harris    ));
1381f11c7f63SJim Harris 
1382f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1383f11c7f63SJim Harris }
1384f11c7f63SJim Harris 
1385f11c7f63SJim Harris /**
1386f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1387f11c7f63SJim Harris  *        when a user attempts to stop a controller and a stop operation
1388f11c7f63SJim Harris  *        is not allowed.
1389f11c7f63SJim Harris  *
1390f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1391f11c7f63SJim Harris  *             on which the user is attempting to perform a stop operation.
1392f11c7f63SJim Harris  * @param[in]  timeout This parameter specifies the timeout value (in
1393f11c7f63SJim Harris  *             milliseconds) to be utilized for this operation.
1394f11c7f63SJim Harris  *
1395f11c7f63SJim Harris  * @return This method returns an indication that stop operations are not
1396f11c7f63SJim Harris  *         allowed.
1397f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1398f11c7f63SJim Harris  */
1399f11c7f63SJim Harris static
scif_sas_controller_default_stop_handler(SCI_BASE_CONTROLLER_T * controller,U32 timeout)1400f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_stop_handler(
1401f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller,
1402f11c7f63SJim Harris    U32                     timeout
1403f11c7f63SJim Harris )
1404f11c7f63SJim Harris {
1405f11c7f63SJim Harris    SCIF_LOG_WARNING((
1406f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1407f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1408f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to stop controller.\n",
1409f11c7f63SJim Harris       controller,
1410f11c7f63SJim Harris       sci_base_state_machine_get_state(
1411f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1412f11c7f63SJim Harris    ));
1413f11c7f63SJim Harris 
1414f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1415f11c7f63SJim Harris }
1416f11c7f63SJim Harris 
1417f11c7f63SJim Harris /**
1418f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1419f11c7f63SJim Harris  *        when a user attempts to reset a controller and a reset operation
1420f11c7f63SJim Harris  *        is not allowed.
1421f11c7f63SJim Harris  *
1422f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1423f11c7f63SJim Harris  *             on which the user is attempting to perform a reset operation.
1424f11c7f63SJim Harris  *
1425f11c7f63SJim Harris  * @return This method returns an indication that reset operations are not
1426f11c7f63SJim Harris  *         allowed.
1427f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1428f11c7f63SJim Harris  */
1429f11c7f63SJim Harris static
scif_sas_controller_default_reset_handler(SCI_BASE_CONTROLLER_T * controller)1430f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_reset_handler(
1431f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller
1432f11c7f63SJim Harris )
1433f11c7f63SJim Harris {
1434f11c7f63SJim Harris    SCIF_LOG_WARNING((
1435f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1436f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1437f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to reset controller.\n",
1438f11c7f63SJim Harris       controller,
1439f11c7f63SJim Harris       sci_base_state_machine_get_state(
1440f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1441f11c7f63SJim Harris    ));
1442f11c7f63SJim Harris 
1443f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1444f11c7f63SJim Harris }
1445f11c7f63SJim Harris 
1446f11c7f63SJim Harris /**
1447f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1448f11c7f63SJim Harris  *        when a user attempts to initialize a controller and an initialize
1449f11c7f63SJim Harris  *        operation is not allowed.
1450f11c7f63SJim Harris  *
1451f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1452f11c7f63SJim Harris  *             on which the user is attempting to perform an initialize
1453f11c7f63SJim Harris  *             operation.
1454f11c7f63SJim Harris  *
1455f11c7f63SJim Harris  * @return This method returns an indication that initialize operations
1456f11c7f63SJim Harris  *         are not allowed.
1457f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1458f11c7f63SJim Harris  */
1459f11c7f63SJim Harris static
scif_sas_controller_default_initialize_handler(SCI_BASE_CONTROLLER_T * controller)1460f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_initialize_handler(
1461f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T * controller
1462f11c7f63SJim Harris )
1463f11c7f63SJim Harris {
1464f11c7f63SJim Harris    SCIF_LOG_WARNING((
1465f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1466f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1467f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to initialize controller.\n",
1468f11c7f63SJim Harris       controller,
1469f11c7f63SJim Harris       sci_base_state_machine_get_state(
1470f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1471f11c7f63SJim Harris    ));
1472f11c7f63SJim Harris 
1473f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1474f11c7f63SJim Harris }
1475f11c7f63SJim Harris 
1476f11c7f63SJim Harris /**
1477f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1478f11c7f63SJim Harris  *        when a user attempts to start an IO on a controller and a start
1479f11c7f63SJim Harris  *        IO operation is not allowed.
1480f11c7f63SJim Harris  *
1481f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1482f11c7f63SJim Harris  *             on which the user is attempting to perform a start IO
1483f11c7f63SJim Harris  *             operation.
1484f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1485f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1486f11c7f63SJim Harris  *             operation.
1487f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1488f11c7f63SJim Harris  *             started.
1489f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
1490f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_io() for
1491f11c7f63SJim Harris  *             more information.
1492f11c7f63SJim Harris  *
1493f11c7f63SJim Harris  * @return This method returns an indication that start IO operations
1494f11c7f63SJim Harris  *         are not allowed.
1495f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1496f11c7f63SJim Harris  */
1497f11c7f63SJim Harris static
scif_sas_controller_default_start_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)1498f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_start_io_handler(
1499f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1500f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1501f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
1502f11c7f63SJim Harris    U16                        io_tag
1503f11c7f63SJim Harris )
1504f11c7f63SJim Harris {
1505f11c7f63SJim Harris    SCIF_LOG_WARNING((
1506f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1507f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1508f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to start IO.\n",
1509f11c7f63SJim Harris       controller,
1510f11c7f63SJim Harris       sci_base_state_machine_get_state(
1511f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1512f11c7f63SJim Harris    ));
1513f11c7f63SJim Harris 
1514f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1515f11c7f63SJim Harris }
1516f11c7f63SJim Harris 
1517f11c7f63SJim Harris /**
1518f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1519f11c7f63SJim Harris  *        when a user attempts to complete an IO on a controller and a
1520f11c7f63SJim Harris  *        complete IO operation is not allowed.
1521f11c7f63SJim Harris  *
1522f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1523f11c7f63SJim Harris  *             on which the user is attempting to perform a complete IO
1524f11c7f63SJim Harris  *             operation.
1525f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1526f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1527f11c7f63SJim Harris  *             operation.
1528f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1529f11c7f63SJim Harris  *             started.
1530f11c7f63SJim Harris  *
1531f11c7f63SJim Harris  * @return This method returns an indication that complete IO operations
1532f11c7f63SJim Harris  *         are not allowed.
1533f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1534f11c7f63SJim Harris  */
1535f11c7f63SJim Harris static
scif_sas_controller_default_complete_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request)1536f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_complete_io_handler(
1537f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1538f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1539f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request
1540f11c7f63SJim Harris )
1541f11c7f63SJim Harris {
1542f11c7f63SJim Harris    SCIF_LOG_WARNING((
1543f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1544f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1545f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to complete IO.\n",
1546f11c7f63SJim Harris       controller,
1547f11c7f63SJim Harris       sci_base_state_machine_get_state(
1548f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1549f11c7f63SJim Harris    ));
1550f11c7f63SJim Harris 
1551f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1552f11c7f63SJim Harris }
1553f11c7f63SJim Harris 
1554f11c7f63SJim Harris /**
1555f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1556f11c7f63SJim Harris  *        when a user attempts to continue an IO on a controller and a
1557f11c7f63SJim Harris  *        continue IO operation is not allowed.
1558f11c7f63SJim Harris  *
1559f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1560f11c7f63SJim Harris  *             on which the user is attempting to perform a continue IO
1561f11c7f63SJim Harris  *             operation.
1562f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1563f11c7f63SJim Harris  *             object on which the user is attempting to perform a start IO
1564f11c7f63SJim Harris  *             operation.
1565f11c7f63SJim Harris  * @param[in]  io_request This parameter specifies the IO request to be
1566f11c7f63SJim Harris  *             started.
1567f11c7f63SJim Harris  *
1568f11c7f63SJim Harris  * @return This method returns an indication that continue IO operations
1569f11c7f63SJim Harris  *         are not allowed.
1570f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1571f11c7f63SJim Harris  */
1572f11c7f63SJim Harris static
scif_sas_controller_default_continue_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request)1573f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_continue_io_handler(
1574f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1575f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1576f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request
1577f11c7f63SJim Harris )
1578f11c7f63SJim Harris {
1579f11c7f63SJim Harris    SCIF_LOG_WARNING((
1580f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1581f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1582f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to continue IO.\n",
1583f11c7f63SJim Harris       controller,
1584f11c7f63SJim Harris       sci_base_state_machine_get_state(
1585f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1586f11c7f63SJim Harris    ));
1587f11c7f63SJim Harris 
1588f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1589f11c7f63SJim Harris }
1590f11c7f63SJim Harris 
1591f11c7f63SJim Harris /**
1592f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1593f11c7f63SJim Harris  *        when a user attempts to start a task on a controller and a start
1594f11c7f63SJim Harris  *        task operation is not allowed.
1595f11c7f63SJim Harris  *
1596f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1597f11c7f63SJim Harris  *             on which the user is attempting to perform a start task
1598f11c7f63SJim Harris  *             operation.
1599f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1600f11c7f63SJim Harris  *             object on which the user is attempting to perform a start
1601f11c7f63SJim Harris  *             task operation.
1602f11c7f63SJim Harris  * @param[in]  task_request This parameter specifies the task management
1603f11c7f63SJim Harris  *             request to be started.
1604f11c7f63SJim Harris  * @param[in]  io_tag This parameter specifies the optional allocated
1605f11c7f63SJim Harris  *             IO tag.  Please reference scif_controller_start_task() for
1606f11c7f63SJim Harris  *             more information.
1607f11c7f63SJim Harris  *
1608f11c7f63SJim Harris  * @return This method returns an indication that start task operations
1609f11c7f63SJim Harris  *         are not allowed.
1610f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1611f11c7f63SJim Harris  */
1612f11c7f63SJim Harris static
scif_sas_controller_default_start_task_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * task_request,U16 io_tag)1613f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_start_task_handler(
1614f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1615f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1616f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * task_request,
1617f11c7f63SJim Harris    U16                        io_tag
1618f11c7f63SJim Harris )
1619f11c7f63SJim Harris {
1620f11c7f63SJim Harris    SCIF_LOG_WARNING((
1621f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1622f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1623f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to start task mgmt.\n",
1624f11c7f63SJim Harris       controller,
1625f11c7f63SJim Harris       sci_base_state_machine_get_state(
1626f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1627f11c7f63SJim Harris    ));
1628f11c7f63SJim Harris 
1629f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1630f11c7f63SJim Harris }
1631f11c7f63SJim Harris 
1632f11c7f63SJim Harris /**
1633f11c7f63SJim Harris  * @brief This method provides default handling (i.e. returns an error)
1634f11c7f63SJim Harris  *        when a user attempts to complete a task on a controller and a
1635f11c7f63SJim Harris  *        complete task operation is not allowed.
1636f11c7f63SJim Harris  *
1637f11c7f63SJim Harris  * @param[in]  controller This parameter specifies the controller object
1638f11c7f63SJim Harris  *             on which the user is attempting to perform a complete task
1639f11c7f63SJim Harris  *             operation.
1640f11c7f63SJim Harris  * @param[in]  remote_device This parameter specifies the remote deivce
1641f11c7f63SJim Harris  *             object on which the user is attempting to perform a start
1642f11c7f63SJim Harris  *             task operation.
1643f11c7f63SJim Harris  * @param[in]  task_request This parameter specifies the task management
1644f11c7f63SJim Harris  *             request to be started.
1645f11c7f63SJim Harris  *
1646f11c7f63SJim Harris  * @return This method returns an indication that complete task operations
1647f11c7f63SJim Harris  *         are not allowed.
1648f11c7f63SJim Harris  * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1649f11c7f63SJim Harris  */
1650f11c7f63SJim Harris static
scif_sas_controller_default_complete_task_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * task_request)1651f11c7f63SJim Harris SCI_STATUS scif_sas_controller_default_complete_task_handler(
1652f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1653f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1654f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * task_request
1655f11c7f63SJim Harris )
1656f11c7f63SJim Harris {
1657f11c7f63SJim Harris    SCIF_LOG_WARNING((
1658f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1659f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1660f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to complete task mgmt.\n",
1661f11c7f63SJim Harris       controller,
1662f11c7f63SJim Harris       sci_base_state_machine_get_state(
1663f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1664f11c7f63SJim Harris    ));
1665f11c7f63SJim Harris 
1666f11c7f63SJim Harris    return SCI_FAILURE_INVALID_STATE;
1667f11c7f63SJim Harris }
1668f11c7f63SJim Harris 
1669f11c7f63SJim Harris static
scif_sas_controller_failed_state_start_io_handler(SCI_BASE_CONTROLLER_T * controller,SCI_BASE_REMOTE_DEVICE_T * remote_device,SCI_BASE_REQUEST_T * io_request,U16 io_tag)1670f11c7f63SJim Harris SCI_STATUS scif_sas_controller_failed_state_start_io_handler(
1671f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T    * controller,
1672f11c7f63SJim Harris    SCI_BASE_REMOTE_DEVICE_T * remote_device,
1673f11c7f63SJim Harris    SCI_BASE_REQUEST_T       * io_request,
1674f11c7f63SJim Harris    U16                        io_tag
1675f11c7f63SJim Harris )
1676f11c7f63SJim Harris {
1677f11c7f63SJim Harris    SCIF_LOG_WARNING((
1678f11c7f63SJim Harris       sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
1679f11c7f63SJim Harris       SCIF_LOG_OBJECT_CONTROLLER,
1680f11c7f63SJim Harris       "Controller:0x%x State:0x%x invalid state to start IO.\n",
1681f11c7f63SJim Harris       controller,
1682f11c7f63SJim Harris       sci_base_state_machine_get_state(
1683f11c7f63SJim Harris          &((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
1684f11c7f63SJim Harris    ));
1685f11c7f63SJim Harris 
16860f2a8452SJim Harris    return SCI_FAILURE;
1687f11c7f63SJim Harris }
1688f11c7f63SJim Harris 
1689f11c7f63SJim Harris #define scif_sas_controller_stopping_complete_io_handler   \
1690f11c7f63SJim Harris         scif_sas_controller_ready_complete_io_handler
1691f11c7f63SJim Harris #define scif_sas_controller_stopping_complete_task_handler \
1692f11c7f63SJim Harris         scif_sas_controller_ready_complete_task_handler
1693f11c7f63SJim Harris #define scif_sas_controller_default_start_high_priority_io_handler \
1694f11c7f63SJim Harris         scif_sas_controller_default_start_io_handler
1695f11c7f63SJim Harris #define scif_sas_controller_default_complete_high_priority_io_handler \
1696f11c7f63SJim Harris         scif_sas_controller_default_complete_io_handler
1697f11c7f63SJim Harris #define scif_sas_controller_stopping_complete_high_priority_io_handler \
1698f11c7f63SJim Harris         scif_sas_controller_ready_complete_high_priority_io_handler
1699f11c7f63SJim Harris 
1700f11c7f63SJim Harris 
1701f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_HANDLER_T
1702f11c7f63SJim Harris    scif_sas_controller_state_handler_table[SCI_BASE_CONTROLLER_MAX_STATES] =
1703f11c7f63SJim Harris {
1704f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_INITIAL
1705f11c7f63SJim Harris    {
1706f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1707f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1708f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1709f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1710f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1711f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1712f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1713f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1714f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1715f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1716f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1717f11c7f63SJim Harris    },
1718f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_RESET
1719f11c7f63SJim Harris    {
1720f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1721f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1722f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1723f11c7f63SJim Harris       scif_sas_controller_reset_initialize_handler,
1724f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1725f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1726f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1727f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1728f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1729f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1730f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1731f11c7f63SJim Harris    },
1732f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_INITIALIZING
1733f11c7f63SJim Harris    {
1734f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1735f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1736f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1737f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1738f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1739f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1740f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1741f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1742f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1743f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1744f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1745f11c7f63SJim Harris    },
1746f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_INITIALIZED
1747f11c7f63SJim Harris    {
1748f11c7f63SJim Harris       scif_sas_controller_initialized_start_handler,
1749f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1750f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1751f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1752f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1753f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1754f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1755f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1756f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1757f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1758f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1759f11c7f63SJim Harris    },
1760f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_STARTING
1761f11c7f63SJim Harris    {
1762f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1763f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1764f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1765f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1766f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1767f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1768f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1769f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1770f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1771f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1772f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1773f11c7f63SJim Harris    },
1774f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_READY
1775f11c7f63SJim Harris    {
1776f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1777f11c7f63SJim Harris       scif_sas_controller_ready_stop_handler,
1778f11c7f63SJim Harris       scif_sas_controller_ready_reset_handler,
1779f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1780f11c7f63SJim Harris       scif_sas_controller_ready_start_io_handler,
1781f11c7f63SJim Harris       scif_sas_controller_ready_start_high_priority_io_handler,
1782f11c7f63SJim Harris       scif_sas_controller_ready_complete_io_handler,
1783f11c7f63SJim Harris       scif_sas_controller_ready_complete_high_priority_io_handler,
1784f11c7f63SJim Harris       scif_sas_controller_ready_continue_io_handler,
1785f11c7f63SJim Harris       scif_sas_controller_ready_start_task_handler,
1786f11c7f63SJim Harris       scif_sas_controller_ready_complete_task_handler
1787f11c7f63SJim Harris    },
1788f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_RESETTING
1789f11c7f63SJim Harris    {
1790f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1791f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1792f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1793f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1794f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1795f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1796f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1797f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1798f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1799f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1800f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1801f11c7f63SJim Harris    },
1802f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_STOPPING
1803f11c7f63SJim Harris    {
1804f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1805f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1806f11c7f63SJim Harris       scif_sas_controller_default_reset_handler,
1807f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1808f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1809f11c7f63SJim Harris       scif_sas_controller_stopping_start_high_priority_io_handler,
1810f11c7f63SJim Harris       scif_sas_controller_stopping_complete_io_handler,
1811f11c7f63SJim Harris       scif_sas_controller_stopping_complete_high_priority_io_handler,
1812f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1813f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler, /**@todo Allow in core?*/
1814f11c7f63SJim Harris       scif_sas_controller_stopping_complete_task_handler
1815f11c7f63SJim Harris    },
1816f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_STOPPED
1817f11c7f63SJim Harris    {
1818f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1819f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1820f11c7f63SJim Harris       scif_sas_controller_stopped_reset_handler,
1821f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1822f11c7f63SJim Harris       scif_sas_controller_default_start_io_handler,
1823f11c7f63SJim Harris       scif_sas_controller_default_start_high_priority_io_handler,
1824f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1825f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1826f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1827f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1828f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1829f11c7f63SJim Harris    },
1830f11c7f63SJim Harris    // SCI_BASE_CONTROLLER_STATE_FAILED
1831f11c7f63SJim Harris    {
1832f11c7f63SJim Harris       scif_sas_controller_default_start_handler,
1833f11c7f63SJim Harris       scif_sas_controller_default_stop_handler,
1834f11c7f63SJim Harris       scif_sas_controller_failed_reset_handler,
1835f11c7f63SJim Harris       scif_sas_controller_default_initialize_handler,
1836f11c7f63SJim Harris       scif_sas_controller_failed_state_start_io_handler,
1837f11c7f63SJim Harris       scif_sas_controller_failed_state_start_io_handler,
1838f11c7f63SJim Harris       scif_sas_controller_default_complete_io_handler,
1839f11c7f63SJim Harris       scif_sas_controller_default_complete_high_priority_io_handler,
1840f11c7f63SJim Harris       scif_sas_controller_default_continue_io_handler,
1841f11c7f63SJim Harris       scif_sas_controller_default_start_task_handler,
1842f11c7f63SJim Harris       scif_sas_controller_default_complete_task_handler
1843f11c7f63SJim Harris    }
1844f11c7f63SJim Harris };
1845f11c7f63SJim Harris 
1846