1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3 *
4 * This file is provided under a dual BSD/GPLv2 license. When using or
5 * redistributing this file, you may do so under either license.
6 *
7 * GPL LICENSE SUMMARY
8 *
9 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23 * The full GNU General Public License is included in this distribution
24 * in the file called LICENSE.GPL.
25 *
26 * BSD LICENSE
27 *
28 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29 * All rights reserved.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 *
35 * * Redistributions of source code must retain the above copyright
36 * notice, this list of conditions and the following disclaimer.
37 * * Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in
39 * the documentation and/or other materials provided with the
40 * distribution.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 *
54 * $FreeBSD$
55 */
56 #ifndef _SCIF_SAS_CONTROLLER_H_
57 #define _SCIF_SAS_CONTROLLER_H_
58
59 /**
60 * @file
61 *
62 * @brief This file contains the protected interface structures, constants,
63 * and methods for the SCIF_SAS_CONTROLLER object.
64 */
65
66 #ifdef __cplusplus
67 extern "C" {
68 #endif // __cplusplus
69
70 #include <dev/isci/scil/sci_types.h>
71 #include <dev/isci/scil/sci_abstract_list.h>
72 #include <dev/isci/scil/sci_controller_constants.h>
73 #include <dev/isci/scil/sci_memory_descriptor_list.h>
74 #include <dev/isci/scil/sci_base_controller.h>
75 #include <dev/isci/scil/scif_controller.h>
76 #include <dev/isci/scil/scif_config_parameters.h>
77 #include <dev/isci/scil/scif_sas_domain.h>
78 #include <dev/isci/scil/scif_sas_io_request.h>
79 #include <dev/isci/scil/scif_sas_task_request.h>
80 #include <dev/isci/scil/scif_sas_constants.h>
81 #include <dev/isci/scil/sci_pool.h>
82 #include <dev/isci/scil/scif_sas_internal_io_request.h>
83 #include <dev/isci/scil/scif_sas_high_priority_request_queue.h>
84 #include <dev/isci/scil/scif_sas_smp_phy.h>
85
86
87 // Currently there is only a need for 1 memory descriptor. This descriptor
88 // describes the internal IO request memory.
89 #define SCIF_SAS_MAX_MEMORY_DESCRIPTORS 1
90
91 enum _SCIF_SAS_MAX_MEMORY_DESCRIPTORS
92 {
93 SCIF_SAS_MDE_INTERNAL_IO = 0
94
95 };
96
97 /**
98 * @struct SCIF_SAS_CONTROLLER
99 *
100 * @brief The SCI SAS Framework controller object abstracts storage controller
101 * level behavior for the framework component.
102 */
103 typedef struct SCIF_SAS_CONTROLLER
104 {
105 /**
106 * The SCI_BASE_CONTROLLER is the parent object for the SCIF_SAS_CONTROLLER
107 * object.
108 */
109 SCI_BASE_CONTROLLER_T parent;
110
111 /**
112 * This field contains the handle for the SCI Core controller object that
113 * is managed by this framework controller.
114 */
115 SCI_CONTROLLER_HANDLE_T core_object;
116
117 /**
118 * This field references the list of state specific handler methods to
119 * be utilized for this controller instance.
120 */
121 SCI_BASE_CONTROLLER_STATE_HANDLER_T * state_handlers;
122
123 /**
124 * This field contains the memory descriptors defining the physical
125 * memory requirements for this controller.
126 */
127 SCI_PHYSICAL_MEMORY_DESCRIPTOR_T mdes[SCIF_SAS_MAX_MEMORY_DESCRIPTORS];
128
129 /**
130 * This field contains the SAS domain objects managed by this controller.
131 */
132 SCIF_SAS_DOMAIN_T domains[SCI_MAX_DOMAINS];
133
134 /**
135 * This field represents the pool of available remote device objects
136 * supported by the controller.
137 */
138 SCI_ABSTRACT_ELEMENT_POOL_T free_remote_device_pool;
139
140 /**
141 * This field contains the maximum number of abstract elements that
142 * can be placed in the pool.
143 */
144 SCI_ABSTRACT_ELEMENT_T remote_device_pool_elements[SCI_MAX_REMOTE_DEVICES];
145
146 /**
147 * This field provides the controller object a scratch area to indicate
148 * status of an ongoing operation.
149 */
150 SCI_STATUS operation_status;
151
152 /**
153 * This field will contain an user specified parameter information
154 * to be utilized by the framework.
155 */
156 SCIF_USER_PARAMETERS_T user_parameters;
157
158 /**
159 * This field records the index for the current domain to clear affiliation
160 * EA SATA remote devices, during the controller stop process.
161 */
162 U8 current_domain_to_clear_affiliation;
163
164 U32 internal_request_entries;
165
166 /**
167 * This field provides a pool to manage the memory resource for all internal
168 * requests.
169 * requests.
170 */
171 SCI_POOL_CREATE(
172 internal_request_memory_pool,
173 POINTER_UINT,
174 SCIF_SAS_MAX_INTERNAL_REQUEST_COUNT
175 );
176
177 /**
178 * This field provides a queue for built internal requests waiting to be
179 * started.
180 */
181 SCIF_SAS_HIGH_PRIORITY_REQUEST_QUEUE_T hprq;
182
183 /**
184 * This represents the number of available SMP phy objects that can
185 * be managed by the framework.
186 */
187 SCIF_SAS_SMP_PHY_T smp_phy_array[SCIF_SAS_SMP_PHY_COUNT];
188
189 /**
190 * This field provides a list to manage the memory resource for all
191 * smp_phy objects.
192 */
193 SCI_FAST_LIST_T smp_phy_memory_list;
194
195 #if !defined(DISABLE_INTERRUPTS)
196 /**
197 * This field saves the interrupt coalescing count before changing interrupt
198 * coalescence.
199 */
200 U16 saved_interrupt_coalesce_number;
201
202 /**
203 * This field saves the interrupt coalescing timeout values in micorseconds
204 * before changing interrupt coalescence.
205 */
206 U32 saved_interrupt_coalesce_timeout;
207 #endif // !defined(DISABLE_INTERRUPTS)
208
209 } SCIF_SAS_CONTROLLER_T;
210
211 extern SCI_BASE_STATE_T scif_sas_controller_state_table[];
212 extern SCI_BASE_CONTROLLER_STATE_HANDLER_T
213 scif_sas_controller_state_handler_table[];
214
215 SCI_STATUS scif_sas_controller_continue_io(
216 SCI_CONTROLLER_HANDLE_T controller,
217 SCI_REMOTE_DEVICE_HANDLE_T remote_device,
218 SCI_IO_REQUEST_HANDLE_T io_request
219 );
220
221 void scif_sas_controller_destruct(
222 SCIF_SAS_CONTROLLER_T * fw_controller
223 );
224
225 void * scif_sas_controller_allocate_internal_request(
226 SCIF_SAS_CONTROLLER_T * fw_controller
227 );
228
229 void scif_sas_controller_free_internal_request(
230 SCIF_SAS_CONTROLLER_T * fw_controller,
231 void * fw_internal_request_buffer
232 );
233
234 void scif_sas_controller_start_high_priority_io(
235 SCIF_SAS_CONTROLLER_T * fw_controller
236 );
237
238 BOOL scif_sas_controller_sufficient_resource(
239 SCIF_SAS_CONTROLLER_T *fw_controller
240 );
241
242 SCI_STATUS scif_sas_controller_complete_high_priority_io(
243 SCIF_SAS_CONTROLLER_T * fw_controller,
244 SCIF_SAS_REMOTE_DEVICE_T * remote_device,
245 SCIF_SAS_REQUEST_T * io_request
246 );
247
248 SCIF_SAS_SMP_PHY_T * scif_sas_controller_allocate_smp_phy(
249 SCIF_SAS_CONTROLLER_T * fw_controller
250 );
251
252 void scif_sas_controller_free_smp_phy(
253 SCIF_SAS_CONTROLLER_T * fw_controller,
254 SCIF_SAS_SMP_PHY_T * smp_phy
255 );
256
257 SCI_STATUS scif_sas_controller_clear_affiliation(
258 SCIF_SAS_CONTROLLER_T * fw_controller
259 );
260
261 SCI_STATUS scif_sas_controller_continue_to_stop(
262 SCIF_SAS_CONTROLLER_T * fw_controller
263 );
264
265 void scif_sas_controller_set_default_config_parameters(
266 SCIF_SAS_CONTROLLER_T * this_controller
267 );
268
269 SCI_STATUS scif_sas_controller_release_resource(
270 SCIF_SAS_CONTROLLER_T * fw_controller
271 );
272
273 void scif_sas_controller_build_mdl(
274 SCIF_SAS_CONTROLLER_T * fw_controller
275 );
276
277 #if !defined(DISABLE_INTERRUPTS)
278
279 void scif_sas_controller_save_interrupt_coalescence(
280 SCIF_SAS_CONTROLLER_T * fw_controller
281 );
282
283 void scif_sas_controller_restore_interrupt_coalescence(
284 SCIF_SAS_CONTROLLER_T * fw_controller
285 );
286
287 #else // !defined(DISABLE_INTERRUPTS)
288 #define scif_sas_controller_save_interrupt_coalescence(controller)
289 #define scif_sas_controller_restore_interrupt_coalescence(controller)
290 #endif // !defined(DISABLE_INTERRUPTS)
291
292 #ifdef SCI_LOGGING
293 void scif_sas_controller_initialize_state_logging(
294 SCIF_SAS_CONTROLLER_T *this_controller
295 );
296
297 void scif_sas_controller_deinitialize_state_logging(
298 SCIF_SAS_CONTROLLER_T *this_controller
299 );
300 #else // SCI_LOGGING
301 #define scif_sas_controller_initialize_state_logging(x)
302 #define scif_sas_controller_deinitialize_state_logging(x)
303 #endif // SCI_LOGGING
304
305 #ifdef __cplusplus
306 }
307 #endif // __cplusplus
308
309 #endif // _SCIF_SAS_CONTROLLER_H_
310
Cache object: 8ced7f21a93e359fef89e02f237e0e5d
|