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