1f11c7f63SJim Harris /*-
2718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3718cf2ccSPedro F. Giffuni *
4f11c7f63SJim Harris * This file is provided under a dual BSD/GPLv2 license. When using or
5f11c7f63SJim Harris * redistributing this file, you may do so under either license.
6f11c7f63SJim Harris *
7f11c7f63SJim Harris * GPL LICENSE SUMMARY
8f11c7f63SJim Harris *
9f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10f11c7f63SJim Harris *
11f11c7f63SJim Harris * This program is free software; you can redistribute it and/or modify
12f11c7f63SJim Harris * it under the terms of version 2 of the GNU General Public License as
13f11c7f63SJim Harris * published by the Free Software Foundation.
14f11c7f63SJim Harris *
15f11c7f63SJim Harris * This program is distributed in the hope that it will be useful, but
16f11c7f63SJim Harris * WITHOUT ANY WARRANTY; without even the implied warranty of
17f11c7f63SJim Harris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18f11c7f63SJim Harris * General Public License for more details.
19f11c7f63SJim Harris *
20f11c7f63SJim Harris * You should have received a copy of the GNU General Public License
21f11c7f63SJim Harris * along with this program; if not, write to the Free Software
22f11c7f63SJim Harris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23f11c7f63SJim Harris * The full GNU General Public License is included in this distribution
24f11c7f63SJim Harris * in the file called LICENSE.GPL.
25f11c7f63SJim Harris *
26f11c7f63SJim Harris * BSD LICENSE
27f11c7f63SJim Harris *
28f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29f11c7f63SJim Harris * All rights reserved.
30f11c7f63SJim Harris *
31f11c7f63SJim Harris * Redistribution and use in source and binary forms, with or without
32f11c7f63SJim Harris * modification, are permitted provided that the following conditions
33f11c7f63SJim Harris * are met:
34f11c7f63SJim Harris *
35f11c7f63SJim Harris * * Redistributions of source code must retain the above copyright
36f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer.
37f11c7f63SJim Harris * * Redistributions in binary form must reproduce the above copyright
38f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer in
39f11c7f63SJim Harris * the documentation and/or other materials provided with the
40f11c7f63SJim Harris * distribution.
41f11c7f63SJim Harris *
42f11c7f63SJim Harris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43f11c7f63SJim Harris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44f11c7f63SJim Harris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45f11c7f63SJim Harris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46f11c7f63SJim Harris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47f11c7f63SJim Harris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48f11c7f63SJim Harris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49f11c7f63SJim Harris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50f11c7f63SJim Harris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51f11c7f63SJim Harris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52f11c7f63SJim Harris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53f11c7f63SJim Harris */
54f11c7f63SJim Harris
55f11c7f63SJim Harris #include <sys/cdefs.h>
56f11c7f63SJim Harris /**
57f11c7f63SJim Harris * @file
58f11c7f63SJim Harris *
59f11c7f63SJim Harris * @brief This file contains the implementation of the SCIF_SAS_CONTROLLER
60f11c7f63SJim Harris * object.
61f11c7f63SJim Harris */
62f11c7f63SJim Harris
63f11c7f63SJim Harris
64f11c7f63SJim Harris #include <dev/isci/scil/sci_status.h>
65f11c7f63SJim Harris #include <dev/isci/scil/sci_util.h>
66f11c7f63SJim Harris #include <dev/isci/scil/sci_controller.h>
67f11c7f63SJim Harris #include <dev/isci/scil/scic_controller.h>
68f11c7f63SJim Harris #include <dev/isci/scil/scic_user_callback.h>
69f11c7f63SJim Harris #include <dev/isci/scil/scif_user_callback.h>
70f11c7f63SJim Harris
71f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_controller.h>
72f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_library.h>
73f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_logger.h>
74f11c7f63SJim Harris
75f11c7f63SJim Harris
76f11c7f63SJim Harris //******************************************************************************
77f11c7f63SJim Harris //* P U B L I C M E T H O D S
78f11c7f63SJim Harris //******************************************************************************
79f11c7f63SJim Harris
scif_controller_construct(SCI_LIBRARY_HANDLE_T library,SCI_CONTROLLER_HANDLE_T controller,void * user_object)80f11c7f63SJim Harris SCI_STATUS scif_controller_construct(
81f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T library,
82f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
83f11c7f63SJim Harris void * user_object
84f11c7f63SJim Harris )
85f11c7f63SJim Harris {
86f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
87f11c7f63SJim Harris SCIF_SAS_LIBRARY_T * fw_library = (SCIF_SAS_LIBRARY_T*) library;
88f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
89f11c7f63SJim Harris
902d57bb86SJim Harris // Validate the user supplied parameters.
912d57bb86SJim Harris if ((library == SCI_INVALID_HANDLE) || (controller == SCI_INVALID_HANDLE))
922d57bb86SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
932d57bb86SJim Harris
94f11c7f63SJim Harris SCIF_LOG_TRACE((
95f11c7f63SJim Harris sci_base_object_get_logger(library),
96f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
97f11c7f63SJim Harris "scif_controller_construct(0x%x, 0x%x) enter\n",
98f11c7f63SJim Harris library, controller
99f11c7f63SJim Harris ));
100f11c7f63SJim Harris
101f11c7f63SJim Harris // Construct the base controller. As part of constructing the base
102f11c7f63SJim Harris // controller we ask it to also manage the MDL iteration for the Core.
103f11c7f63SJim Harris sci_base_controller_construct(
104f11c7f63SJim Harris &fw_controller->parent,
105f11c7f63SJim Harris sci_base_object_get_logger(fw_library),
106f11c7f63SJim Harris scif_sas_controller_state_table,
107f11c7f63SJim Harris fw_controller->mdes,
108f11c7f63SJim Harris SCIF_SAS_MAX_MEMORY_DESCRIPTORS,
109f11c7f63SJim Harris sci_controller_get_memory_descriptor_list_handle(fw_controller->core_object)
110f11c7f63SJim Harris );
111f11c7f63SJim Harris
112f11c7f63SJim Harris scif_sas_controller_initialize_state_logging(fw_controller);
113f11c7f63SJim Harris
114f11c7f63SJim Harris sci_object_set_association(fw_controller, user_object);
115f11c7f63SJim Harris
116f11c7f63SJim Harris status = scic_controller_construct(
117f11c7f63SJim Harris fw_library->core_object, fw_controller->core_object, fw_controller
118f11c7f63SJim Harris );
119f11c7f63SJim Harris
120f11c7f63SJim Harris // If the core controller was successfully constructed, then
121f11c7f63SJim Harris // finish construction of the framework controller.
122f11c7f63SJim Harris if (status == SCI_SUCCESS)
123f11c7f63SJim Harris {
124f11c7f63SJim Harris // Set the association in the core controller to this framework
125f11c7f63SJim Harris // controller.
126f11c7f63SJim Harris sci_object_set_association(
127f11c7f63SJim Harris (SCI_OBJECT_HANDLE_T) fw_controller->core_object, fw_controller
128f11c7f63SJim Harris );
129f11c7f63SJim Harris
130f11c7f63SJim Harris sci_base_state_machine_change_state(
131f11c7f63SJim Harris &fw_controller->parent.state_machine,
132f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_RESET
133f11c7f63SJim Harris );
134f11c7f63SJim Harris }
135f11c7f63SJim Harris
136f11c7f63SJim Harris return status;
137f11c7f63SJim Harris }
138f11c7f63SJim Harris
139f11c7f63SJim Harris // ---------------------------------------------------------------------------
140f11c7f63SJim Harris
scif_controller_initialize(SCI_CONTROLLER_HANDLE_T controller)141f11c7f63SJim Harris SCI_STATUS scif_controller_initialize(
142f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller
143f11c7f63SJim Harris )
144f11c7f63SJim Harris {
145f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
146f11c7f63SJim Harris
1472d57bb86SJim Harris // Validate the user supplied parameters.
1482d57bb86SJim Harris if (controller == SCI_INVALID_HANDLE)
1492d57bb86SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
1502d57bb86SJim Harris
151f11c7f63SJim Harris SCIF_LOG_TRACE((
152f11c7f63SJim Harris sci_base_object_get_logger(controller),
153f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
154f11c7f63SJim Harris "scif_controller_initialize(0x%x) enter\n",
155f11c7f63SJim Harris controller
156f11c7f63SJim Harris ));
157f11c7f63SJim Harris
158f11c7f63SJim Harris return fw_controller->state_handlers->initialize_handler(
159f11c7f63SJim Harris &fw_controller->parent
160f11c7f63SJim Harris );
161f11c7f63SJim Harris }
162f11c7f63SJim Harris
163f11c7f63SJim Harris // ---------------------------------------------------------------------------
164f11c7f63SJim Harris
scif_controller_get_suggested_start_timeout(SCI_CONTROLLER_HANDLE_T controller)165f11c7f63SJim Harris U32 scif_controller_get_suggested_start_timeout(
166f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller
167f11c7f63SJim Harris )
168f11c7f63SJim Harris {
169f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
170f11c7f63SJim Harris
171f11c7f63SJim Harris // Validate the user supplied parameters.
172f11c7f63SJim Harris if (controller == SCI_INVALID_HANDLE)
173f11c7f63SJim Harris return 0;
174f11c7f63SJim Harris
175f11c7f63SJim Harris // Currently we aren't adding any additional time into the suggested
176f11c7f63SJim Harris // timeout value for the start operation. Simply utilize the core
177f11c7f63SJim Harris // value.
178f11c7f63SJim Harris return scic_controller_get_suggested_start_timeout(fw_controller->core_object);
179f11c7f63SJim Harris }
180f11c7f63SJim Harris
181f11c7f63SJim Harris // ---------------------------------------------------------------------------
182f11c7f63SJim Harris
scif_controller_start(SCI_CONTROLLER_HANDLE_T controller,U32 timeout)183f11c7f63SJim Harris SCI_STATUS scif_controller_start(
184f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
185f11c7f63SJim Harris U32 timeout
186f11c7f63SJim Harris )
187f11c7f63SJim Harris {
188f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
189f11c7f63SJim Harris
1902d57bb86SJim Harris // Validate the user supplied parameters.
1912d57bb86SJim Harris if (controller == SCI_INVALID_HANDLE)
1922d57bb86SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
1932d57bb86SJim Harris
194f11c7f63SJim Harris SCIF_LOG_TRACE((
195f11c7f63SJim Harris sci_base_object_get_logger(controller),
196f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
197f11c7f63SJim Harris "scif_controller_start(0x%x, 0x%x) enter\n",
198f11c7f63SJim Harris controller, timeout
199f11c7f63SJim Harris ));
200f11c7f63SJim Harris
201f11c7f63SJim Harris return fw_controller->state_handlers->
202f11c7f63SJim Harris start_handler(&fw_controller->parent, timeout);
203f11c7f63SJim Harris }
204f11c7f63SJim Harris
205f11c7f63SJim Harris // ---------------------------------------------------------------------------
206f11c7f63SJim Harris
scif_controller_stop(SCI_CONTROLLER_HANDLE_T controller,U32 timeout)207f11c7f63SJim Harris SCI_STATUS scif_controller_stop(
208f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
209f11c7f63SJim Harris U32 timeout
210f11c7f63SJim Harris )
211f11c7f63SJim Harris {
212f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
213f11c7f63SJim Harris
2142d57bb86SJim Harris // Validate the user supplied parameters.
2152d57bb86SJim Harris if (controller == SCI_INVALID_HANDLE)
2162d57bb86SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2172d57bb86SJim Harris
218f11c7f63SJim Harris SCIF_LOG_TRACE((
219f11c7f63SJim Harris sci_base_object_get_logger(controller),
220f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
221f11c7f63SJim Harris "scif_controller_stop(0x%x, 0x%x) enter\n",
222f11c7f63SJim Harris controller, timeout
223f11c7f63SJim Harris ));
224f11c7f63SJim Harris
225f11c7f63SJim Harris return fw_controller->state_handlers->
226f11c7f63SJim Harris stop_handler(&fw_controller->parent, timeout);
227f11c7f63SJim Harris
228f11c7f63SJim Harris }
229f11c7f63SJim Harris
230f11c7f63SJim Harris // ---------------------------------------------------------------------------
231f11c7f63SJim Harris
scif_controller_reset(SCI_CONTROLLER_HANDLE_T controller)232f11c7f63SJim Harris SCI_STATUS scif_controller_reset(
233f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller
234f11c7f63SJim Harris )
235f11c7f63SJim Harris {
236f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
237f11c7f63SJim Harris
2382d57bb86SJim Harris // Validate the user supplied parameters.
2392d57bb86SJim Harris if (controller == SCI_INVALID_HANDLE)
2402d57bb86SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2412d57bb86SJim Harris
242f11c7f63SJim Harris SCIF_LOG_TRACE((
243f11c7f63SJim Harris sci_base_object_get_logger(controller),
244f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_CONTROLLER_RESET,
245f11c7f63SJim Harris "scif_controller_reset(0x%x) enter\n",
246f11c7f63SJim Harris controller
247f11c7f63SJim Harris ));
248f11c7f63SJim Harris
249f11c7f63SJim Harris return fw_controller->state_handlers->
250f11c7f63SJim Harris reset_handler(&fw_controller->parent);
251f11c7f63SJim Harris }
252f11c7f63SJim Harris
253f11c7f63SJim Harris // ---------------------------------------------------------------------------
254f11c7f63SJim Harris
scif_controller_get_scic_handle(SCI_CONTROLLER_HANDLE_T controller)255f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T scif_controller_get_scic_handle(
256f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller
257f11c7f63SJim Harris )
258f11c7f63SJim Harris {
259f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
260f11c7f63SJim Harris
261f11c7f63SJim Harris return fw_controller->core_object;
262f11c7f63SJim Harris }
263f11c7f63SJim Harris
264f11c7f63SJim Harris // ---------------------------------------------------------------------------
265f11c7f63SJim Harris
scif_controller_start_io(SCI_CONTROLLER_HANDLE_T controller,SCI_REMOTE_DEVICE_HANDLE_T remote_device,SCI_IO_REQUEST_HANDLE_T io_request,U16 io_tag)266f11c7f63SJim Harris SCI_IO_STATUS scif_controller_start_io(
267f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
268f11c7f63SJim Harris SCI_REMOTE_DEVICE_HANDLE_T remote_device,
269f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T io_request,
270f11c7f63SJim Harris U16 io_tag
271f11c7f63SJim Harris )
272f11c7f63SJim Harris {
273f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
2740f2a8452SJim Harris SCI_STATUS status;
275f11c7f63SJim Harris
276f11c7f63SJim Harris SCIF_LOG_TRACE((
277f11c7f63SJim Harris sci_base_object_get_logger(controller),
278f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
279f11c7f63SJim Harris "scif_controller_start_io(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
280f11c7f63SJim Harris controller, remote_device, io_request, io_tag
281f11c7f63SJim Harris ));
282f11c7f63SJim Harris
283f11c7f63SJim Harris if (
284f11c7f63SJim Harris sci_pool_empty(fw_controller->hprq.pool)
285f11c7f63SJim Harris || scif_sas_controller_sufficient_resource(controller)
286f11c7f63SJim Harris )
287f11c7f63SJim Harris {
2880f2a8452SJim Harris status = fw_controller->state_handlers->start_io_handler(
289f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) controller,
290f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
291f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) io_request,
292f11c7f63SJim Harris io_tag
293f11c7f63SJim Harris );
294f11c7f63SJim Harris }
295f11c7f63SJim Harris else
2960f2a8452SJim Harris status = SCI_FAILURE_INSUFFICIENT_RESOURCES;
2970f2a8452SJim Harris
2980f2a8452SJim Harris return (SCI_IO_STATUS)status;
299f11c7f63SJim Harris }
300f11c7f63SJim Harris
301f11c7f63SJim Harris // ---------------------------------------------------------------------------
302f11c7f63SJim Harris
scif_controller_start_task(SCI_CONTROLLER_HANDLE_T controller,SCI_REMOTE_DEVICE_HANDLE_T remote_device,SCI_TASK_REQUEST_HANDLE_T task_request,U16 io_tag)303f11c7f63SJim Harris SCI_TASK_STATUS scif_controller_start_task(
304f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
305f11c7f63SJim Harris SCI_REMOTE_DEVICE_HANDLE_T remote_device,
306f11c7f63SJim Harris SCI_TASK_REQUEST_HANDLE_T task_request,
307f11c7f63SJim Harris U16 io_tag
308f11c7f63SJim Harris )
309f11c7f63SJim Harris {
310f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
3110f2a8452SJim Harris SCI_STATUS status;
312f11c7f63SJim Harris
313f11c7f63SJim Harris // Validate the user supplied parameters.
314f11c7f63SJim Harris if ( (controller == SCI_INVALID_HANDLE)
315f11c7f63SJim Harris || (remote_device == SCI_INVALID_HANDLE)
316f11c7f63SJim Harris || (task_request == SCI_INVALID_HANDLE) )
317f11c7f63SJim Harris {
3180f2a8452SJim Harris return SCI_TASK_FAILURE_INVALID_PARAMETER_VALUE;
319f11c7f63SJim Harris }
320f11c7f63SJim Harris
3212d57bb86SJim Harris SCIF_LOG_TRACE((
3222d57bb86SJim Harris sci_base_object_get_logger(controller),
3232d57bb86SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
3242d57bb86SJim Harris "scif_controller_start_task(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
3252d57bb86SJim Harris controller, remote_device, task_request, io_tag
3262d57bb86SJim Harris ));
3272d57bb86SJim Harris
328f11c7f63SJim Harris if (scif_sas_controller_sufficient_resource(controller))
329f11c7f63SJim Harris {
3300f2a8452SJim Harris status = fw_controller->state_handlers->start_task_handler(
331f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) controller,
332f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
333f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) task_request,
334f11c7f63SJim Harris io_tag
335f11c7f63SJim Harris );
336f11c7f63SJim Harris }
337f11c7f63SJim Harris else
3380f2a8452SJim Harris status = SCI_FAILURE_INSUFFICIENT_RESOURCES;
3390f2a8452SJim Harris
3400f2a8452SJim Harris return (SCI_TASK_STATUS)status;
341f11c7f63SJim Harris }
342f11c7f63SJim Harris
343f11c7f63SJim Harris // ---------------------------------------------------------------------------
344f11c7f63SJim Harris
scif_controller_complete_io(SCI_CONTROLLER_HANDLE_T controller,SCI_REMOTE_DEVICE_HANDLE_T remote_device,SCI_IO_REQUEST_HANDLE_T io_request)345f11c7f63SJim Harris SCI_STATUS scif_controller_complete_io(
346f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
347f11c7f63SJim Harris SCI_REMOTE_DEVICE_HANDLE_T remote_device,
348f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T io_request
349f11c7f63SJim Harris )
350f11c7f63SJim Harris {
351f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
352f11c7f63SJim Harris
353f11c7f63SJim Harris SCIF_LOG_TRACE((
354f11c7f63SJim Harris sci_base_object_get_logger(controller),
355f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
356f11c7f63SJim Harris "scif_controller_complete_io(0x%x, 0x%x, 0x%x) enter\n",
357f11c7f63SJim Harris controller, remote_device, io_request
358f11c7f63SJim Harris ));
359f11c7f63SJim Harris
360f11c7f63SJim Harris return fw_controller->state_handlers->complete_io_handler(
361f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) controller,
362f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
363f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) io_request
364f11c7f63SJim Harris );
365f11c7f63SJim Harris }
366f11c7f63SJim Harris
367f11c7f63SJim Harris // ---------------------------------------------------------------------------
368f11c7f63SJim Harris
scif_controller_complete_task(SCI_CONTROLLER_HANDLE_T controller,SCI_REMOTE_DEVICE_HANDLE_T remote_device,SCI_TASK_REQUEST_HANDLE_T task_request)369f11c7f63SJim Harris SCI_STATUS scif_controller_complete_task(
370f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
371f11c7f63SJim Harris SCI_REMOTE_DEVICE_HANDLE_T remote_device,
372f11c7f63SJim Harris SCI_TASK_REQUEST_HANDLE_T task_request
373f11c7f63SJim Harris )
374f11c7f63SJim Harris {
375f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
376f11c7f63SJim Harris
377f11c7f63SJim Harris // Validate the user supplied parameters.
378f11c7f63SJim Harris if ( (controller == SCI_INVALID_HANDLE)
379f11c7f63SJim Harris || (remote_device == SCI_INVALID_HANDLE)
380f11c7f63SJim Harris || (task_request == SCI_INVALID_HANDLE) )
381f11c7f63SJim Harris {
382f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
383f11c7f63SJim Harris }
384f11c7f63SJim Harris
3852d57bb86SJim Harris SCIF_LOG_TRACE((
3862d57bb86SJim Harris sci_base_object_get_logger(controller),
3872d57bb86SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
3882d57bb86SJim Harris "scif_controller_complete_task(0x%x, 0x%x, 0x%x) enter\n",
3892d57bb86SJim Harris controller, remote_device, task_request
3902d57bb86SJim Harris ));
3912d57bb86SJim Harris
392f11c7f63SJim Harris return fw_controller->state_handlers->complete_task_handler(
393f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) controller,
394f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
395f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) task_request
396f11c7f63SJim Harris );
397f11c7f63SJim Harris }
398f11c7f63SJim Harris
399f11c7f63SJim Harris // ---------------------------------------------------------------------------
400f11c7f63SJim Harris
scif_controller_get_domain_handle(SCI_CONTROLLER_HANDLE_T controller,U8 port_index,SCI_DOMAIN_HANDLE_T * domain_handle)401f11c7f63SJim Harris SCI_STATUS scif_controller_get_domain_handle(
402f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
403f11c7f63SJim Harris U8 port_index,
404f11c7f63SJim Harris SCI_DOMAIN_HANDLE_T * domain_handle
405f11c7f63SJim Harris )
406f11c7f63SJim Harris {
407f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
408f11c7f63SJim Harris
409f11c7f63SJim Harris // Validate the user supplied parameters.
410f11c7f63SJim Harris if (controller == SCI_INVALID_HANDLE)
411f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
412f11c7f63SJim Harris
413f11c7f63SJim Harris // Retrieve the domain handle if the supplied index is legitimate.
414f11c7f63SJim Harris if (port_index < SCI_MAX_PORTS)
415f11c7f63SJim Harris {
416f11c7f63SJim Harris *domain_handle = &fw_controller->domains[port_index];
417f11c7f63SJim Harris return SCI_SUCCESS;
418f11c7f63SJim Harris }
419f11c7f63SJim Harris
420f11c7f63SJim Harris return SCI_FAILURE_INVALID_PORT;
421f11c7f63SJim Harris }
422f11c7f63SJim Harris
423f11c7f63SJim Harris /**
424f11c7f63SJim Harris * @brief This method builds the memory descriptor list for this
425f11c7f63SJim Harris * controller.
426f11c7f63SJim Harris *
427f11c7f63SJim Harris * @param[in] fw_controller This parameter specifies the framework
428f11c7f63SJim Harris * controller object for which to build the MDL.
429f11c7f63SJim Harris *
430f11c7f63SJim Harris * @return none
431f11c7f63SJim Harris */
scif_sas_controller_build_mdl(SCIF_SAS_CONTROLLER_T * fw_controller)432f11c7f63SJim Harris void scif_sas_controller_build_mdl(
433f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
434f11c7f63SJim Harris )
435f11c7f63SJim Harris {
436f11c7f63SJim Harris // one internal request for each domain.
437f11c7f63SJim Harris sci_base_mde_construct(
438f11c7f63SJim Harris &fw_controller->mdes[SCIF_SAS_MDE_INTERNAL_IO],
439f11c7f63SJim Harris 4,
440f11c7f63SJim Harris fw_controller->internal_request_entries *
441f11c7f63SJim Harris scif_sas_internal_request_get_object_size(),
442f11c7f63SJim Harris SCI_MDE_ATTRIBUTE_PHYSICALLY_CONTIGUOUS
443f11c7f63SJim Harris );
444f11c7f63SJim Harris }
445f11c7f63SJim Harris
446f11c7f63SJim Harris // ---------------------------------------------------------------------------
447f11c7f63SJim Harris
scif_controller_set_mode(SCI_CONTROLLER_HANDLE_T controller,SCI_CONTROLLER_MODE mode)448f11c7f63SJim Harris SCI_STATUS scif_controller_set_mode(
449f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
450f11c7f63SJim Harris SCI_CONTROLLER_MODE mode
451f11c7f63SJim Harris )
452f11c7f63SJim Harris {
453f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
454f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
455f11c7f63SJim Harris
456f11c7f63SJim Harris if (
457f11c7f63SJim Harris (fw_controller->parent.state_machine.current_state_id
458f11c7f63SJim Harris == SCI_BASE_CONTROLLER_STATE_INITIALIZING)
459f11c7f63SJim Harris || (fw_controller->parent.state_machine.current_state_id
460f11c7f63SJim Harris == SCI_BASE_CONTROLLER_STATE_INITIALIZED)
461f11c7f63SJim Harris )
462f11c7f63SJim Harris {
463f11c7f63SJim Harris switch (mode)
464f11c7f63SJim Harris {
465f11c7f63SJim Harris case SCI_MODE_SPEED:
466f11c7f63SJim Harris fw_controller->internal_request_entries =
467f11c7f63SJim Harris MIN(fw_controller->internal_request_entries, SCIF_SAS_MAX_INTERNAL_REQUEST_COUNT);
468f11c7f63SJim Harris scif_sas_controller_build_mdl(fw_controller);
469f11c7f63SJim Harris break;
470f11c7f63SJim Harris
471f11c7f63SJim Harris case SCI_MODE_SIZE:
472f11c7f63SJim Harris fw_controller->internal_request_entries =
473f11c7f63SJim Harris MIN(fw_controller->internal_request_entries, SCIF_SAS_MIN_INTERNAL_REQUEST_COUNT);
474f11c7f63SJim Harris scif_sas_controller_build_mdl(fw_controller);
475f11c7f63SJim Harris break;
476f11c7f63SJim Harris
477f11c7f63SJim Harris default:
478f11c7f63SJim Harris status = SCI_FAILURE_INVALID_PARAMETER_VALUE;
479f11c7f63SJim Harris break;
480f11c7f63SJim Harris }
481f11c7f63SJim Harris }
482f11c7f63SJim Harris else
483f11c7f63SJim Harris status = SCI_FAILURE_INVALID_STATE;
484f11c7f63SJim Harris
485f11c7f63SJim Harris if (status != SCI_SUCCESS)
486f11c7f63SJim Harris {
487f11c7f63SJim Harris return status;
488f11c7f63SJim Harris }
489f11c7f63SJim Harris else
490f11c7f63SJim Harris {
491f11c7f63SJim Harris // Currently, the framework doesn't change any configurations for
492f11c7f63SJim Harris // speed or size modes. Default to speed mode basically.
493f11c7f63SJim Harris return scic_controller_set_mode(fw_controller->core_object, mode);
494f11c7f63SJim Harris }
495f11c7f63SJim Harris }
496f11c7f63SJim Harris
497f11c7f63SJim Harris // ---------------------------------------------------------------------------
498f11c7f63SJim Harris
scif_controller_get_sat_compliance_version(void)499f11c7f63SJim Harris U32 scif_controller_get_sat_compliance_version(
500f11c7f63SJim Harris void
501f11c7f63SJim Harris )
502f11c7f63SJim Harris {
503f11c7f63SJim Harris /// @todo Fix return of SAT compliance version.
504f11c7f63SJim Harris return 0;
505f11c7f63SJim Harris }
506f11c7f63SJim Harris
507f11c7f63SJim Harris // ---------------------------------------------------------------------------
508f11c7f63SJim Harris
scif_controller_get_sat_compliance_version_revision(void)509f11c7f63SJim Harris U32 scif_controller_get_sat_compliance_version_revision(
510f11c7f63SJim Harris void
511f11c7f63SJim Harris )
512f11c7f63SJim Harris {
513f11c7f63SJim Harris /// @todo Fix return of SAT compliance revision.
514f11c7f63SJim Harris return 0;
515f11c7f63SJim Harris }
516f11c7f63SJim Harris
517f11c7f63SJim Harris // ---------------------------------------------------------------------------
518f11c7f63SJim Harris
scif_user_parameters_set(SCI_CONTROLLER_HANDLE_T controller,SCIF_USER_PARAMETERS_T * scif_parms)519f11c7f63SJim Harris SCI_STATUS scif_user_parameters_set(
520f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
521f11c7f63SJim Harris SCIF_USER_PARAMETERS_T * scif_parms
522f11c7f63SJim Harris )
523f11c7f63SJim Harris {
524f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
525f11c7f63SJim Harris
526f11c7f63SJim Harris //validate all the registry entries before overwriting the default parameter
527f11c7f63SJim Harris //values.
528f11c7f63SJim Harris if (scif_parms->sas.is_sata_ncq_enabled != 1 && scif_parms->sas.is_sata_ncq_enabled != 0)
529f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
530f11c7f63SJim Harris
531da1d1cd3SConrad Meyer if (scif_parms->sas.max_ncq_depth < 1 || scif_parms->sas.max_ncq_depth > 32)
532f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
533f11c7f63SJim Harris
534f11c7f63SJim Harris if (scif_parms->sas.is_sata_standby_timer_enabled != 1
535f11c7f63SJim Harris && scif_parms->sas.is_sata_standby_timer_enabled != 0)
536f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
537f11c7f63SJim Harris
538f11c7f63SJim Harris if (scif_parms->sas.is_non_zero_buffer_offsets_enabled != 1
539f11c7f63SJim Harris && scif_parms->sas.is_non_zero_buffer_offsets_enabled != 0)
540f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
541f11c7f63SJim Harris
542f11c7f63SJim Harris if (scif_parms->sas.reset_type != SCI_SAS_ABORT_TASK
543f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_ABORT_TASK_SET
544f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_CLEAR_TASK_SET
545f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_LOGICAL_UNIT_RESET
546f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_I_T_NEXUS_RESET
547f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_CLEAR_ACA
548f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_QUERY_TASK
549f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_QUERY_TASK_SET
550f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_QUERY_ASYNCHRONOUS_EVENT
551f11c7f63SJim Harris && scif_parms->sas.reset_type != SCI_SAS_HARD_RESET)
552f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
553f11c7f63SJim Harris
554f11c7f63SJim Harris if (scif_parms->sas.clear_affiliation_during_controller_stop != 1
555f11c7f63SJim Harris && scif_parms->sas.clear_affiliation_during_controller_stop !=0)
556f11c7f63SJim Harris return SCI_FAILURE_INVALID_PARAMETER_VALUE;
557f11c7f63SJim Harris
558f11c7f63SJim Harris memcpy((&fw_controller->user_parameters), scif_parms, sizeof(*scif_parms));
559f11c7f63SJim Harris
560f11c7f63SJim Harris // In the future more could be done to prevent setting parameters at the
561f11c7f63SJim Harris // wrong time, but for now we'll simply set the values even if it is too
562*f7c32ed6Sbetterentley // late for them to take effect.
563f11c7f63SJim Harris return SCI_SUCCESS;
564f11c7f63SJim Harris }
565f11c7f63SJim Harris
566f11c7f63SJim Harris // ---------------------------------------------------------------------------
567f11c7f63SJim Harris
568f11c7f63SJim Harris #if !defined(DISABLE_INTERRUPTS)
569f11c7f63SJim Harris
570f11c7f63SJim Harris /**
571f11c7f63SJim Harris * @brief This routine check each domain of the controller to see if
572f11c7f63SJim Harris * any domain is overriding interrupt coalescence.
573f11c7f63SJim Harris *
574f11c7f63SJim Harris * @param[in] fw_controller frame controller
575f11c7f63SJim Harris * @param[in] fw_smp_phy The smp phy to be freed.
576f11c7f63SJim Harris *
577f11c7f63SJim Harris * @return none
578f11c7f63SJim Harris */
579f11c7f63SJim Harris static
scif_sas_controller_is_overriding_interrupt_coalescence(SCIF_SAS_CONTROLLER_T * fw_controller)580f11c7f63SJim Harris BOOL scif_sas_controller_is_overriding_interrupt_coalescence(
581f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
582f11c7f63SJim Harris )
583f11c7f63SJim Harris {
584f11c7f63SJim Harris U8 index;
585f11c7f63SJim Harris
586f11c7f63SJim Harris for(index = 0; index < SCI_MAX_DOMAINS; index++)
587f11c7f63SJim Harris {
588f11c7f63SJim Harris if(fw_controller->domains[index].parent.state_machine.current_state_id ==
589f11c7f63SJim Harris SCI_BASE_DOMAIN_STATE_DISCOVERING)
590f11c7f63SJim Harris return TRUE;
591f11c7f63SJim Harris }
592f11c7f63SJim Harris
593f11c7f63SJim Harris return FALSE;
594f11c7f63SJim Harris }
595f11c7f63SJim Harris
scif_controller_set_interrupt_coalescence(SCI_CONTROLLER_HANDLE_T controller,U32 coalesce_number,U32 coalesce_timeout)596f11c7f63SJim Harris SCI_STATUS scif_controller_set_interrupt_coalescence(
597f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
598f11c7f63SJim Harris U32 coalesce_number,
599f11c7f63SJim Harris U32 coalesce_timeout
600f11c7f63SJim Harris )
601f11c7f63SJim Harris {
602f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T * )controller;
603f11c7f63SJim Harris
604f11c7f63SJim Harris ///when framework is in the middle of temporarily overriding the interrupt
605f11c7f63SJim Harris ///coalescence values, user's request of setting interrupt coalescence
606f11c7f63SJim Harris ///will be saved. As soon as the framework done the temporary overriding,
607f11c7f63SJim Harris ///it will serve user's request to set new interrupt coalescence.
608f11c7f63SJim Harris if (scif_sas_controller_is_overriding_interrupt_coalescence(fw_controller))
609f11c7f63SJim Harris {
610f11c7f63SJim Harris U32 curr_coalesce_number;
611f11c7f63SJim Harris U32 curr_coalesce_timeout;
612f11c7f63SJim Harris SCI_STATUS core_status;
613f11c7f63SJim Harris
614f11c7f63SJim Harris // save current interrupt coalescence info.
615f11c7f63SJim Harris scic_controller_get_interrupt_coalescence (
616f11c7f63SJim Harris fw_controller->core_object, &curr_coalesce_number, &curr_coalesce_timeout);
617f11c7f63SJim Harris
618f11c7f63SJim Harris //try user's request out in the core, but immediately restore core's
619f11c7f63SJim Harris //current setting.
620f11c7f63SJim Harris core_status = scic_controller_set_interrupt_coalescence(
621f11c7f63SJim Harris fw_controller->core_object, coalesce_number, coalesce_timeout);
622f11c7f63SJim Harris
623f11c7f63SJim Harris if ( core_status == SCI_SUCCESS )
624f11c7f63SJim Harris {
625f11c7f63SJim Harris fw_controller->saved_interrupt_coalesce_number = (U16)coalesce_number;
626f11c7f63SJim Harris fw_controller->saved_interrupt_coalesce_timeout = coalesce_timeout;
627f11c7f63SJim Harris }
628f11c7f63SJim Harris
629f11c7f63SJim Harris //restore current interrupt coalescence.
630f11c7f63SJim Harris scic_controller_set_interrupt_coalescence(
631f11c7f63SJim Harris fw_controller->core_object, curr_coalesce_number, curr_coalesce_timeout);
632f11c7f63SJim Harris
633f11c7f63SJim Harris return core_status;
634f11c7f63SJim Harris }
635f11c7f63SJim Harris else
636f11c7f63SJim Harris {
637f11c7f63SJim Harris ///If framework is not internally overriding the interrupt coalescence,
638f11c7f63SJim Harris ///serve user's request immediately by passing the reqeust to core.
639f11c7f63SJim Harris return scic_controller_set_interrupt_coalescence(
640f11c7f63SJim Harris fw_controller->core_object, coalesce_number, coalesce_timeout);
641f11c7f63SJim Harris }
642f11c7f63SJim Harris }
643f11c7f63SJim Harris
644f11c7f63SJim Harris // ---------------------------------------------------------------------------
645f11c7f63SJim Harris
scif_controller_get_interrupt_coalescence(SCI_CONTROLLER_HANDLE_T controller,U32 * coalesce_number,U32 * coalesce_timeout)646f11c7f63SJim Harris void scif_controller_get_interrupt_coalescence(
647f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
648f11c7f63SJim Harris U32 * coalesce_number,
649f11c7f63SJim Harris U32 * coalesce_timeout
650f11c7f63SJim Harris )
651f11c7f63SJim Harris {
652f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * scif_controller = (SCIF_SAS_CONTROLLER_T * )controller;
653f11c7f63SJim Harris
654f11c7f63SJim Harris scic_controller_get_interrupt_coalescence(
655f11c7f63SJim Harris scif_controller->core_object, coalesce_number, coalesce_timeout);
656f11c7f63SJim Harris }
657f11c7f63SJim Harris
658f11c7f63SJim Harris /**
659f11c7f63SJim Harris * @brief This method will save the interrupt coalescence values. If
660f11c7f63SJim Harris * the interrupt coalescence values have already been saved,
661f11c7f63SJim Harris * then this method performs no operations.
662f11c7f63SJim Harris *
663f11c7f63SJim Harris * @param[in,out] fw_controller This parameter specifies the controller
664f11c7f63SJim Harris * for which to save the interrupt coalescence values.
665f11c7f63SJim Harris *
666f11c7f63SJim Harris * @return none
667f11c7f63SJim Harris */
scif_sas_controller_save_interrupt_coalescence(SCIF_SAS_CONTROLLER_T * fw_controller)668f11c7f63SJim Harris void scif_sas_controller_save_interrupt_coalescence(
669f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
670f11c7f63SJim Harris )
671f11c7f63SJim Harris {
672f11c7f63SJim Harris if ( !scif_sas_controller_is_overriding_interrupt_coalescence(fw_controller))
673f11c7f63SJim Harris {
674f11c7f63SJim Harris // Override core's interrupt coalescing settings during SMP
675f11c7f63SJim Harris // DISCOVER process cause' there is only 1 outstanding SMP
676f11c7f63SJim Harris // request per domain is allowed.
677f11c7f63SJim Harris scic_controller_get_interrupt_coalescence(
678f11c7f63SJim Harris fw_controller->core_object,
679f11c7f63SJim Harris (U32*)&(fw_controller->saved_interrupt_coalesce_number),
680f11c7f63SJim Harris &(fw_controller->saved_interrupt_coalesce_timeout)
681f11c7f63SJim Harris );
682f11c7f63SJim Harris
683f11c7f63SJim Harris // Temporarily disable the interrupt coalescing.
684f11c7f63SJim Harris scic_controller_set_interrupt_coalescence(fw_controller->core_object,0,0);
685f11c7f63SJim Harris }
686f11c7f63SJim Harris }
687f11c7f63SJim Harris
688f11c7f63SJim Harris /**
689f11c7f63SJim Harris * @brief This method will restore the interrupt coalescence values. If
690f11c7f63SJim Harris * the interrupt coalescence values have not already been saved,
691f11c7f63SJim Harris * then this method performs no operations.
692f11c7f63SJim Harris *
693f11c7f63SJim Harris * @param[in,out] fw_controller This parameter specifies the controller
694f11c7f63SJim Harris * for which to restore the interrupt coalescence values.
695f11c7f63SJim Harris *
696f11c7f63SJim Harris * @return none
697f11c7f63SJim Harris */
scif_sas_controller_restore_interrupt_coalescence(SCIF_SAS_CONTROLLER_T * fw_controller)698f11c7f63SJim Harris void scif_sas_controller_restore_interrupt_coalescence(
699f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
700f11c7f63SJim Harris )
701f11c7f63SJim Harris {
702f11c7f63SJim Harris if ( !scif_sas_controller_is_overriding_interrupt_coalescence(fw_controller))
703f11c7f63SJim Harris scic_controller_set_interrupt_coalescence(
704f11c7f63SJim Harris fw_controller->core_object,
705f11c7f63SJim Harris fw_controller->saved_interrupt_coalesce_number,
706f11c7f63SJim Harris fw_controller->saved_interrupt_coalesce_timeout
707f11c7f63SJim Harris );
708f11c7f63SJim Harris }
709f11c7f63SJim Harris
710f11c7f63SJim Harris #endif // !defined(DISABLE_INTERRUPTS)
711f11c7f63SJim Harris
712f11c7f63SJim Harris // ---------------------------------------------------------------------------
713f11c7f63SJim Harris
scic_cb_controller_start_complete(SCI_CONTROLLER_HANDLE_T controller,SCI_STATUS completion_status)714f11c7f63SJim Harris void scic_cb_controller_start_complete(
715f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
716f11c7f63SJim Harris SCI_STATUS completion_status
717f11c7f63SJim Harris )
718f11c7f63SJim Harris {
719f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)
720f11c7f63SJim Harris sci_object_get_association(controller);
721f11c7f63SJim Harris
722f11c7f63SJim Harris SCIF_LOG_TRACE((
723f11c7f63SJim Harris sci_base_object_get_logger(controller),
724f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
725f11c7f63SJim Harris "scic_cb_controller_start_complete(0x%x, 0x%x) enter\n",
726f11c7f63SJim Harris controller, completion_status
727f11c7f63SJim Harris ));
728f11c7f63SJim Harris
729f11c7f63SJim Harris if (completion_status == SCI_SUCCESS
730f11c7f63SJim Harris || completion_status == SCI_FAILURE_TIMEOUT)
731f11c7f63SJim Harris {
732f11c7f63SJim Harris // Even the initialization of the core controller timed out, framework
733f11c7f63SJim Harris // controller should still transit to READY state.
734f11c7f63SJim Harris sci_base_state_machine_change_state(
735f11c7f63SJim Harris &fw_controller->parent.state_machine,
736f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_READY
737f11c7f63SJim Harris );
738f11c7f63SJim Harris }
739f11c7f63SJim Harris
740f11c7f63SJim Harris scif_cb_controller_start_complete(fw_controller, completion_status);
741f11c7f63SJim Harris }
742f11c7f63SJim Harris
743f11c7f63SJim Harris // ---------------------------------------------------------------------------
744f11c7f63SJim Harris
scic_cb_controller_stop_complete(SCI_CONTROLLER_HANDLE_T controller,SCI_STATUS completion_status)745f11c7f63SJim Harris void scic_cb_controller_stop_complete(
746f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
747f11c7f63SJim Harris SCI_STATUS completion_status
748f11c7f63SJim Harris )
749f11c7f63SJim Harris {
750f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)
751f11c7f63SJim Harris sci_object_get_association(controller);
752f11c7f63SJim Harris
753f11c7f63SJim Harris SCIF_LOG_TRACE((
754f11c7f63SJim Harris sci_base_object_get_logger(controller),
755f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
756f11c7f63SJim Harris "scic_cb_controller_stop_complete(0x%x, 0x%x) enter\n",
757f11c7f63SJim Harris controller, completion_status
758f11c7f63SJim Harris ));
759f11c7f63SJim Harris
760f11c7f63SJim Harris if (completion_status == SCI_SUCCESS)
761f11c7f63SJim Harris {
762f11c7f63SJim Harris sci_base_state_machine_change_state(
763f11c7f63SJim Harris &fw_controller->parent.state_machine,
764f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_STOPPED
765f11c7f63SJim Harris );
766f11c7f63SJim Harris }
767f11c7f63SJim Harris else
768f11c7f63SJim Harris {
769f11c7f63SJim Harris sci_base_state_machine_change_state(
770f11c7f63SJim Harris &fw_controller->parent.state_machine,
771f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_FAILED
772f11c7f63SJim Harris );
773f11c7f63SJim Harris }
774f11c7f63SJim Harris
775f11c7f63SJim Harris scif_cb_controller_stop_complete(fw_controller, completion_status);
776f11c7f63SJim Harris }
777f11c7f63SJim Harris
778f11c7f63SJim Harris
779f11c7f63SJim Harris // ---------------------------------------------------------------------------
780f11c7f63SJim Harris
scic_cb_controller_error(SCI_CONTROLLER_HANDLE_T controller,SCI_CONTROLLER_ERROR error)781f11c7f63SJim Harris void scic_cb_controller_error(
782f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
783f11c7f63SJim Harris SCI_CONTROLLER_ERROR error
784f11c7f63SJim Harris )
785f11c7f63SJim Harris {
786f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)
787f11c7f63SJim Harris sci_object_get_association(controller);
788f11c7f63SJim Harris
789f11c7f63SJim Harris fw_controller->parent.error = error;
790f11c7f63SJim Harris
791f11c7f63SJim Harris SCIF_LOG_TRACE((
792f11c7f63SJim Harris sci_base_object_get_logger(controller),
793f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
794f11c7f63SJim Harris "scic_cb_controller_not_ready(0x%x) enter\n",
795f11c7f63SJim Harris controller
796f11c7f63SJim Harris ));
797f11c7f63SJim Harris
798f11c7f63SJim Harris sci_base_state_machine_change_state(
799f11c7f63SJim Harris &fw_controller->parent.state_machine,
800f11c7f63SJim Harris SCI_BASE_CONTROLLER_STATE_FAILED
801f11c7f63SJim Harris );
802f11c7f63SJim Harris }
803f11c7f63SJim Harris
804f11c7f63SJim Harris //******************************************************************************
805f11c7f63SJim Harris //* P R O T E C T E D M E T H O D S
806f11c7f63SJim Harris //******************************************************************************
807f11c7f63SJim Harris
808f11c7f63SJim Harris /**
809f11c7f63SJim Harris * @brief This method is utilized to continue an internal IO operation
810f11c7f63SJim Harris * on the controller. This method is utilized for SAT translated
811f11c7f63SJim Harris * requests that generate multiple ATA commands in order to fulfill
812f11c7f63SJim Harris * the original SCSI request.
813f11c7f63SJim Harris *
814f11c7f63SJim Harris * @param[in] controller This parameter specifies the controller on which
815f11c7f63SJim Harris * to continue an internal IO request.
816f11c7f63SJim Harris * @param[in] remote_device This parameter specifies the remote device
817f11c7f63SJim Harris * on which to continue an internal IO request.
818f11c7f63SJim Harris * @param[in] io_request This parameter specifies the IO request to be
819f11c7f63SJim Harris * continue.
820f11c7f63SJim Harris *
821f11c7f63SJim Harris * @return Indicate if the continue operation was successful.
822f11c7f63SJim Harris * @retval SCI_SUCCESS This value is returned if the operation succeeded.
823f11c7f63SJim Harris */
scif_sas_controller_continue_io(SCI_CONTROLLER_HANDLE_T controller,SCI_REMOTE_DEVICE_HANDLE_T remote_device,SCI_IO_REQUEST_HANDLE_T io_request)824f11c7f63SJim Harris SCI_STATUS scif_sas_controller_continue_io(
825f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller,
826f11c7f63SJim Harris SCI_REMOTE_DEVICE_HANDLE_T remote_device,
827f11c7f63SJim Harris SCI_IO_REQUEST_HANDLE_T io_request
828f11c7f63SJim Harris )
829f11c7f63SJim Harris {
830f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller;
831f11c7f63SJim Harris
832f11c7f63SJim Harris return fw_controller->state_handlers->continue_io_handler(
833f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) controller,
834f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
835f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) io_request
836f11c7f63SJim Harris );
837f11c7f63SJim Harris }
838f11c7f63SJim Harris
839f11c7f63SJim Harris /**
840f11c7f63SJim Harris * @brief This method will attempt to destruct a framework controller.
841f11c7f63SJim Harris * This includes free any resources retreived from the user (e.g.
842f11c7f63SJim Harris * timers).
843f11c7f63SJim Harris *
844f11c7f63SJim Harris * @param[in] fw_controller This parameter specifies the framework
845f11c7f63SJim Harris * controller to destructed.
846f11c7f63SJim Harris *
847f11c7f63SJim Harris * @return none
848f11c7f63SJim Harris */
scif_sas_controller_destruct(SCIF_SAS_CONTROLLER_T * fw_controller)849f11c7f63SJim Harris void scif_sas_controller_destruct(
850f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
851f11c7f63SJim Harris )
852f11c7f63SJim Harris {
853f11c7f63SJim Harris SCIF_LOG_TRACE((
854f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
855f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
856f11c7f63SJim Harris "scif_sas_controller_destruct(0x%x) enter\n",
857f11c7f63SJim Harris fw_controller
858f11c7f63SJim Harris ));
859f11c7f63SJim Harris }
860f11c7f63SJim Harris
861f11c7f63SJim Harris //-----------------------------------------------------------------------------
862f11c7f63SJim Harris // INTERNAL REQUEST RELATED METHODS
863f11c7f63SJim Harris //-----------------------------------------------------------------------------
864f11c7f63SJim Harris
865f11c7f63SJim Harris /**
866f11c7f63SJim Harris * @brief This routine is to allocate the memory for creating a new internal
867f11c7f63SJim Harris * request.
868f11c7f63SJim Harris *
869f11c7f63SJim Harris * @param[in] scif_controller handle to frame controller
870f11c7f63SJim Harris *
871f11c7f63SJim Harris * @return void* address to internal request memory
872f11c7f63SJim Harris */
scif_sas_controller_allocate_internal_request(SCIF_SAS_CONTROLLER_T * fw_controller)873f11c7f63SJim Harris void * scif_sas_controller_allocate_internal_request(
874f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
875f11c7f63SJim Harris )
876f11c7f63SJim Harris {
877f11c7f63SJim Harris POINTER_UINT internal_io_address;
878f11c7f63SJim Harris
879f11c7f63SJim Harris if( !sci_pool_empty(fw_controller->internal_request_memory_pool) )
880f11c7f63SJim Harris {
881f11c7f63SJim Harris sci_pool_get(
882f11c7f63SJim Harris fw_controller->internal_request_memory_pool, internal_io_address
883f11c7f63SJim Harris );
884f11c7f63SJim Harris
885f11c7f63SJim Harris //clean the memory.
886f11c7f63SJim Harris memset((char*)internal_io_address, 0, scif_sas_internal_request_get_object_size());
887f11c7f63SJim Harris
888f11c7f63SJim Harris return (void *) internal_io_address;
889f11c7f63SJim Harris }
890f11c7f63SJim Harris else
891f11c7f63SJim Harris return NULL;
892f11c7f63SJim Harris }
893f11c7f63SJim Harris
894f11c7f63SJim Harris /**
895f11c7f63SJim Harris * @brief This routine is to free the memory for a completed internal request.
896f11c7f63SJim Harris *
897f11c7f63SJim Harris * @param[in] scif_controller handle to frame controller
898f11c7f63SJim Harris * @param[in] fw_internal_io The internal IO to be freed.
899f11c7f63SJim Harris *
900f11c7f63SJim Harris * @return none
901f11c7f63SJim Harris */
scif_sas_controller_free_internal_request(SCIF_SAS_CONTROLLER_T * fw_controller,void * fw_internal_request_buffer)902f11c7f63SJim Harris void scif_sas_controller_free_internal_request(
903f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller,
904f11c7f63SJim Harris void * fw_internal_request_buffer
905f11c7f63SJim Harris )
906f11c7f63SJim Harris {
907f11c7f63SJim Harris SCIF_LOG_TRACE((
908f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
909f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
910f11c7f63SJim Harris "scif_controller_free_internal_request(0x%x, 0x%x) enter\n",
911f11c7f63SJim Harris fw_controller, fw_internal_request_buffer
912f11c7f63SJim Harris ));
913f11c7f63SJim Harris
914caa7e52fSEitan Adler //return the memory to the pool.
915f11c7f63SJim Harris if( !sci_pool_full(fw_controller->internal_request_memory_pool) )
916f11c7f63SJim Harris {
917f11c7f63SJim Harris sci_pool_put(
918f11c7f63SJim Harris fw_controller->internal_request_memory_pool,
919f11c7f63SJim Harris (POINTER_UINT) fw_internal_request_buffer
920f11c7f63SJim Harris );
921f11c7f63SJim Harris }
922f11c7f63SJim Harris }
923f11c7f63SJim Harris
924f11c7f63SJim Harris
925f11c7f63SJim Harris /**
926f11c7f63SJim Harris * @brief this routine is called by OS' DPC to start io requests from internal
927f11c7f63SJim Harris * high priority request queue
928f11c7f63SJim Harris * @param[in] fw_controller The framework controller.
929f11c7f63SJim Harris *
930f11c7f63SJim Harris * @return none
931f11c7f63SJim Harris */
scif_sas_controller_start_high_priority_io(SCIF_SAS_CONTROLLER_T * fw_controller)932f11c7f63SJim Harris void scif_sas_controller_start_high_priority_io(
933f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
934f11c7f63SJim Harris )
935f11c7f63SJim Harris {
936f11c7f63SJim Harris POINTER_UINT io_address;
937f11c7f63SJim Harris SCIF_SAS_IO_REQUEST_T * fw_io;
938f11c7f63SJim Harris SCI_STATUS status;
939f11c7f63SJim Harris
940f11c7f63SJim Harris SCIF_LOG_TRACE((
941f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
942f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
943f11c7f63SJim Harris "scif_controller_start_high_priority_io(0x%x) enter\n",
944f11c7f63SJim Harris fw_controller
945f11c7f63SJim Harris ));
946f11c7f63SJim Harris
947f11c7f63SJim Harris while ( !sci_pool_empty(fw_controller->hprq.pool) )
948f11c7f63SJim Harris {
949f11c7f63SJim Harris sci_pool_get(fw_controller->hprq.pool, io_address);
950f11c7f63SJim Harris
951f11c7f63SJim Harris fw_io = (SCIF_SAS_IO_REQUEST_T *)io_address;
952f11c7f63SJim Harris
953f11c7f63SJim Harris status = fw_controller->state_handlers->start_high_priority_io_handler(
954f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) fw_controller,
955f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) fw_io->parent.device,
956f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) fw_io,
957f11c7f63SJim Harris SCI_CONTROLLER_INVALID_IO_TAG
958f11c7f63SJim Harris );
959f11c7f63SJim Harris }
960f11c7f63SJim Harris }
961f11c7f63SJim Harris
962f11c7f63SJim Harris /**
963f11c7f63SJim Harris * @brief This method will check how many outstanding IOs currently and number
964f11c7f63SJim Harris * of IOs in high priority queue, if the overall number exceeds the max_tc,
965f11c7f63SJim Harris * return FALSE.
966f11c7f63SJim Harris *
967f11c7f63SJim Harris * @param[in] fw_controller The framework controller.
968f11c7f63SJim Harris *
969f11c7f63SJim Harris * @return BOOL Indicate whether there is sufficient resource to start an IO.
970f11c7f63SJim Harris * @retvalue TRUE The controller has sufficient resource.
971f11c7f63SJim Harris * @retvalue FALSE There is not sufficient resource available.
972f11c7f63SJim Harris */
scif_sas_controller_sufficient_resource(SCIF_SAS_CONTROLLER_T * fw_controller)973f11c7f63SJim Harris BOOL scif_sas_controller_sufficient_resource(
974f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T *fw_controller
975f11c7f63SJim Harris )
976f11c7f63SJim Harris {
977f11c7f63SJim Harris SCIF_SAS_DOMAIN_T * fw_domain;
978f11c7f63SJim Harris U32 domain_index;
979f11c7f63SJim Harris U32 outstanding_io_count = 0;
980f11c7f63SJim Harris U32 high_priority_io_count = 0;
981f11c7f63SJim Harris
982f11c7f63SJim Harris for(domain_index = 0; domain_index < SCI_MAX_DOMAINS; domain_index++)
983f11c7f63SJim Harris {
984f11c7f63SJim Harris fw_domain = &fw_controller->domains[domain_index];
985f11c7f63SJim Harris outstanding_io_count += fw_domain->request_list.element_count;
986f11c7f63SJim Harris }
987f11c7f63SJim Harris
988f11c7f63SJim Harris high_priority_io_count = sci_pool_count(fw_controller->hprq.pool);
989f11c7f63SJim Harris
990f11c7f63SJim Harris if ( (outstanding_io_count + high_priority_io_count) > SCI_MAX_IO_REQUESTS )
991f11c7f63SJim Harris return FALSE;
992f11c7f63SJim Harris
993f11c7f63SJim Harris return TRUE;
994f11c7f63SJim Harris }
995f11c7f63SJim Harris
996f11c7f63SJim Harris
997f11c7f63SJim Harris /**
998f11c7f63SJim Harris * @brief This method is the starting point to complete high prority io for a
999f11c7f63SJim Harris * controller then down to domain, device.
1000f11c7f63SJim Harris *
1001f11c7f63SJim Harris * @param[in] fw_controller The framework controller
1002f11c7f63SJim Harris * @param[in] remote_device The framework remote device.
1003f11c7f63SJim Harris * @param[in] io_request The high priority io request to be completed.
1004f11c7f63SJim Harris *
1005f11c7f63SJim Harris * @return SCI_STATUS indicate the completion status from framework down to the
1006f11c7f63SJim Harris * core.
1007f11c7f63SJim Harris */
scif_sas_controller_complete_high_priority_io(SCIF_SAS_CONTROLLER_T * fw_controller,SCIF_SAS_REMOTE_DEVICE_T * remote_device,SCIF_SAS_REQUEST_T * io_request)1008f11c7f63SJim Harris SCI_STATUS scif_sas_controller_complete_high_priority_io(
1009f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T *fw_controller,
1010f11c7f63SJim Harris SCIF_SAS_REMOTE_DEVICE_T *remote_device,
1011f11c7f63SJim Harris SCIF_SAS_REQUEST_T *io_request
1012f11c7f63SJim Harris )
1013f11c7f63SJim Harris {
1014f11c7f63SJim Harris SCIF_LOG_TRACE((
1015f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
1016f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
1017f11c7f63SJim Harris "scif_sas_controller_complete_high_priority_io(0x%x, 0x%x, 0x%x) enter\n",
1018f11c7f63SJim Harris fw_controller, remote_device, io_request
1019f11c7f63SJim Harris ));
1020f11c7f63SJim Harris
1021f11c7f63SJim Harris //call controller's new added complete_high_priority_io_handler
1022f11c7f63SJim Harris return fw_controller->state_handlers->complete_high_priority_io_handler(
1023f11c7f63SJim Harris (SCI_BASE_CONTROLLER_T*) fw_controller,
1024f11c7f63SJim Harris (SCI_BASE_REMOTE_DEVICE_T*) remote_device,
1025f11c7f63SJim Harris (SCI_BASE_REQUEST_T*) io_request
1026f11c7f63SJim Harris );
1027f11c7f63SJim Harris }
1028f11c7f63SJim Harris
1029f11c7f63SJim Harris /**
1030f11c7f63SJim Harris
1031f11c7f63SJim Harris * @brief This routine is to allocate the memory for creating a smp phy object.
1032f11c7f63SJim Harris *
1033f11c7f63SJim Harris * @param[in] scif_controller handle to frame controller
1034f11c7f63SJim Harris *
1035f11c7f63SJim Harris * @return SCIF_SAS_SMP_PHY_T * An allocated space for smp phy. If failed to allocate,
1036f11c7f63SJim Harris * return NULL.
1037f11c7f63SJim Harris */
scif_sas_controller_allocate_smp_phy(SCIF_SAS_CONTROLLER_T * fw_controller)1038f11c7f63SJim Harris SCIF_SAS_SMP_PHY_T * scif_sas_controller_allocate_smp_phy(
1039f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
1040f11c7f63SJim Harris )
1041f11c7f63SJim Harris {
1042f11c7f63SJim Harris SCIF_SAS_SMP_PHY_T * smp_phy;
1043f11c7f63SJim Harris
1044f11c7f63SJim Harris SCIF_LOG_TRACE((
1045f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
1046f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER,
1047f11c7f63SJim Harris "scif_controller_allocate_smp_phy(0x%x) enter\n",
1048f11c7f63SJim Harris fw_controller
1049f11c7f63SJim Harris ));
1050f11c7f63SJim Harris
1051f11c7f63SJim Harris if( !sci_fast_list_is_empty(&fw_controller->smp_phy_memory_list) )
1052f11c7f63SJim Harris {
1053f11c7f63SJim Harris smp_phy = (SCIF_SAS_SMP_PHY_T *)
1054f11c7f63SJim Harris sci_fast_list_remove_head(&fw_controller->smp_phy_memory_list);
1055f11c7f63SJim Harris
1056f11c7f63SJim Harris //clean the memory.
1057f11c7f63SJim Harris memset((char*)smp_phy,
1058f11c7f63SJim Harris 0,
1059f11c7f63SJim Harris sizeof(SCIF_SAS_SMP_PHY_T)
1060f11c7f63SJim Harris );
1061f11c7f63SJim Harris
1062f11c7f63SJim Harris return smp_phy;
1063f11c7f63SJim Harris }
1064f11c7f63SJim Harris else
1065f11c7f63SJim Harris return NULL;
1066f11c7f63SJim Harris }
1067f11c7f63SJim Harris
1068f11c7f63SJim Harris /**
1069f11c7f63SJim Harris * @brief This routine is to free the memory for a released smp phy.
1070f11c7f63SJim Harris *
1071f11c7f63SJim Harris * @param[in] fw_controller The framework controller, a smp phy is released
1072f11c7f63SJim Harris * to its memory.
1073f11c7f63SJim Harris * @param[in] fw_smp_phy The smp phy to be freed.
1074f11c7f63SJim Harris *
1075f11c7f63SJim Harris * @return none
1076f11c7f63SJim Harris */
scif_sas_controller_free_smp_phy(SCIF_SAS_CONTROLLER_T * fw_controller,SCIF_SAS_SMP_PHY_T * smp_phy)1077f11c7f63SJim Harris void scif_sas_controller_free_smp_phy(
1078f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller,
1079f11c7f63SJim Harris SCIF_SAS_SMP_PHY_T * smp_phy
1080f11c7f63SJim Harris )
1081f11c7f63SJim Harris {
1082f11c7f63SJim Harris SCIF_LOG_TRACE((
1083f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
1084f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER,
1085f11c7f63SJim Harris "scif_controller_free_smp_phy(0x%x, 0x%x) enter\n",
1086f11c7f63SJim Harris fw_controller, smp_phy
1087f11c7f63SJim Harris ));
1088f11c7f63SJim Harris
1089f11c7f63SJim Harris //return the memory to the list.
1090f11c7f63SJim Harris sci_fast_list_insert_tail(
1091f11c7f63SJim Harris &fw_controller->smp_phy_memory_list,
1092f11c7f63SJim Harris &smp_phy->list_element
1093f11c7f63SJim Harris );
1094f11c7f63SJim Harris }
1095f11c7f63SJim Harris
1096f11c7f63SJim Harris
1097f11c7f63SJim Harris /**
1098f11c7f63SJim Harris * @brief This method clear affiliation for all the EA SATA devices associated
1099f11c7f63SJim Harris * to this controller.
1100f11c7f63SJim Harris *
1101f11c7f63SJim Harris * @param[in] fw_controller This parameter specifies the framework
1102f11c7f63SJim Harris * controller object for whose remote devices are to be stopped.
1103f11c7f63SJim Harris *
1104f11c7f63SJim Harris * @return This method returns a value indicating if the operation completed.
1105f11c7f63SJim Harris * @retval SCI_COMPLETE This value indicates that all the EA SATA devices'
1106f11c7f63SJim Harris * affiliation was cleared.
1107f11c7f63SJim Harris * @retval SCI_INCOMPLETE This value indicates clear affiliation activity is
1108f11c7f63SJim Harris * yet to be completed.
1109f11c7f63SJim Harris */
scif_sas_controller_clear_affiliation(SCIF_SAS_CONTROLLER_T * fw_controller)1110f11c7f63SJim Harris SCI_STATUS scif_sas_controller_clear_affiliation(
1111f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
1112f11c7f63SJim Harris )
1113f11c7f63SJim Harris {
1114f11c7f63SJim Harris U8 index;
1115f11c7f63SJim Harris SCI_STATUS status;
1116f11c7f63SJim Harris SCIF_SAS_DOMAIN_T * fw_domain;
1117f11c7f63SJim Harris
1118f11c7f63SJim Harris SCIF_LOG_TRACE((
1119f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
1120f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER,
1121f11c7f63SJim Harris "scif_sas_controller_clear_affiliation(0x%x) enter\n",
1122f11c7f63SJim Harris fw_controller
1123f11c7f63SJim Harris ));
1124f11c7f63SJim Harris
1125f11c7f63SJim Harris index = fw_controller->current_domain_to_clear_affiliation;
1126f11c7f63SJim Harris
1127f11c7f63SJim Harris if (index < SCI_MAX_DOMAINS)
1128f11c7f63SJim Harris {
1129f11c7f63SJim Harris fw_domain = &fw_controller->domains[index];
1130f11c7f63SJim Harris
1131f11c7f63SJim Harris //Need to stop all the on-going smp activities before clearing affiliation.
1132f11c7f63SJim Harris scif_sas_domain_cancel_smp_activities(fw_domain);
1133f11c7f63SJim Harris
1134f11c7f63SJim Harris scif_sas_domain_start_clear_affiliation(fw_domain);
1135f11c7f63SJim Harris
1136f11c7f63SJim Harris status = SCI_WARNING_SEQUENCE_INCOMPLETE;
1137f11c7f63SJim Harris }
1138f11c7f63SJim Harris else
1139f11c7f63SJim Harris { //the controller has done clear affiliation work to all its domains.
1140f11c7f63SJim Harris scif_sas_controller_continue_to_stop(fw_controller);
1141f11c7f63SJim Harris status = SCI_SUCCESS;
1142f11c7f63SJim Harris }
1143f11c7f63SJim Harris
1144f11c7f63SJim Harris return status;
1145f11c7f63SJim Harris }
1146f11c7f63SJim Harris
1147f11c7f63SJim Harris
1148f11c7f63SJim Harris /**
1149f11c7f63SJim Harris * @brief This method sets SCIF user parameters to
1150f11c7f63SJim Harris * default values. Users can override these values utilizing
1151f11c7f63SJim Harris * the sciF_user_parameters_set() methods.
1152f11c7f63SJim Harris *
1153f11c7f63SJim Harris * @param[in] controller This parameter specifies the controller for
1154f11c7f63SJim Harris * which to set the configuration parameters to their
1155f11c7f63SJim Harris * default values.
1156f11c7f63SJim Harris *
1157f11c7f63SJim Harris * @return none
1158f11c7f63SJim Harris */
scif_sas_controller_set_default_config_parameters(SCIF_SAS_CONTROLLER_T * this_controller)1159f11c7f63SJim Harris void scif_sas_controller_set_default_config_parameters(
1160f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * this_controller
1161f11c7f63SJim Harris )
1162f11c7f63SJim Harris {
1163f11c7f63SJim Harris SCIF_USER_PARAMETERS_T * scif_parms = &(this_controller->user_parameters);
1164f11c7f63SJim Harris
1165f11c7f63SJim Harris scif_parms->sas.is_sata_ncq_enabled = TRUE;
1166f11c7f63SJim Harris scif_parms->sas.max_ncq_depth = 32;
1167f11c7f63SJim Harris scif_parms->sas.is_sata_standby_timer_enabled = FALSE;
1168f11c7f63SJim Harris scif_parms->sas.is_non_zero_buffer_offsets_enabled = FALSE;
1169f11c7f63SJim Harris scif_parms->sas.reset_type = SCI_SAS_LOGICAL_UNIT_RESET;
1170f11c7f63SJim Harris scif_parms->sas.clear_affiliation_during_controller_stop = TRUE;
1171f11c7f63SJim Harris scif_parms->sas.ignore_fua = FALSE;
1172f11c7f63SJim Harris
1173f11c7f63SJim Harris }
1174f11c7f63SJim Harris
1175f11c7f63SJim Harris
1176f11c7f63SJim Harris /**
1177f11c7f63SJim Harris * @brief This method releases resource for framework controller and associated
1178f11c7f63SJim Harris * objects.
1179f11c7f63SJim Harris *
1180f11c7f63SJim Harris * @param[in] fw_controller This parameter specifies the framework
1181f11c7f63SJim Harris * controller and associated objects whose resources are to be released.
1182f11c7f63SJim Harris *
1183f11c7f63SJim Harris * @return This method returns a value indicating if the operation succeeded.
1184f11c7f63SJim Harris * @retval SCI_SUCCESS This value indicates that resource release succeeded.
1185f11c7f63SJim Harris * @retval SCI_FAILURE This value indicates certain failure during the process
1186f11c7f63SJim Harris * of resource release.
1187f11c7f63SJim Harris */
scif_sas_controller_release_resource(SCIF_SAS_CONTROLLER_T * fw_controller)1188f11c7f63SJim Harris SCI_STATUS scif_sas_controller_release_resource(
1189f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
1190f11c7f63SJim Harris )
1191f11c7f63SJim Harris {
1192f11c7f63SJim Harris U8 index;
1193f11c7f63SJim Harris SCIF_SAS_DOMAIN_T * fw_domain;
1194f11c7f63SJim Harris
1195f11c7f63SJim Harris SCIF_LOG_TRACE((
1196f11c7f63SJim Harris sci_base_object_get_logger(fw_controller),
1197f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER,
1198f11c7f63SJim Harris "scif_sas_controller_release_resource(0x%x) enter\n",
1199f11c7f63SJim Harris fw_controller
1200f11c7f63SJim Harris ));
1201f11c7f63SJim Harris
1202f11c7f63SJim Harris //currently the only resource to be released is domain's timer.
1203f11c7f63SJim Harris for (index = 0; index < SCI_MAX_DOMAINS; index++)
1204f11c7f63SJim Harris {
1205f11c7f63SJim Harris fw_domain = &fw_controller->domains[index];
1206f11c7f63SJim Harris
1207f11c7f63SJim Harris scif_sas_domain_release_resource(fw_controller, fw_domain);
1208f11c7f63SJim Harris }
1209f11c7f63SJim Harris
1210f11c7f63SJim Harris return SCI_SUCCESS;
1211f11c7f63SJim Harris }
1212f11c7f63SJim Harris
1213f11c7f63SJim Harris
1214f11c7f63SJim Harris #ifdef SCI_LOGGING
1215f11c7f63SJim Harris /**
1216f11c7f63SJim Harris * This method will start state transition logging for the framework
1217f11c7f63SJim Harris * controller object.
1218f11c7f63SJim Harris *
1219f11c7f63SJim Harris * @param[in] fw_controller The framework controller object on which to
1220f11c7f63SJim Harris * observe state changes.
1221f11c7f63SJim Harris *
1222f11c7f63SJim Harris * @return none
1223f11c7f63SJim Harris */
scif_sas_controller_initialize_state_logging(SCIF_SAS_CONTROLLER_T * fw_controller)1224f11c7f63SJim Harris void scif_sas_controller_initialize_state_logging(
1225f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
1226f11c7f63SJim Harris )
1227f11c7f63SJim Harris {
1228f11c7f63SJim Harris sci_base_state_machine_logger_initialize(
1229f11c7f63SJim Harris &fw_controller->parent.state_machine_logger,
1230f11c7f63SJim Harris &fw_controller->parent.state_machine,
1231f11c7f63SJim Harris &fw_controller->parent.parent,
1232f11c7f63SJim Harris scif_cb_logger_log_states,
1233f11c7f63SJim Harris "SCIF_SAS_CONTROLLER_T", "base state machine",
1234f11c7f63SJim Harris SCIF_LOG_OBJECT_CONTROLLER
1235f11c7f63SJim Harris );
1236f11c7f63SJim Harris }
1237f11c7f63SJim Harris
1238f11c7f63SJim Harris /**
1239f11c7f63SJim Harris * This method will remove the logging of state transitions from the framework
1240f11c7f63SJim Harris * controller object.
1241f11c7f63SJim Harris *
1242f11c7f63SJim Harris * @param[in] fw_controller The framework controller to change.
1243f11c7f63SJim Harris *
1244f11c7f63SJim Harris * @return none
1245f11c7f63SJim Harris */
scif_sas_controller_deinitialize_state_logging(SCIF_SAS_CONTROLLER_T * fw_controller)1246f11c7f63SJim Harris void scif_sas_controller_deinitialize_state_logging(
1247f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller
1248f11c7f63SJim Harris )
1249f11c7f63SJim Harris {
1250f11c7f63SJim Harris sci_base_state_machine_logger_deinitialize(
1251f11c7f63SJim Harris &fw_controller->parent.state_machine_logger,
1252f11c7f63SJim Harris &fw_controller->parent.state_machine
1253f11c7f63SJim Harris );
1254f11c7f63SJim Harris }
1255f11c7f63SJim Harris #endif // SCI_LOGGING
1256