xref: /freebsd/sys/dev/isci/scil/scif_sas_domain.h (revision 42249ef2)
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_DOMAIN_H_
57 #define _SCIF_SAS_DOMAIN_H_
58 
59 /**
60  * @file
61  *
62  * @brief This file contains the protected interface structures, constants,
63  *        and methods for the SCIF_SAS_DOMAIN object.
64  */
65 
66 #ifdef __cplusplus
67 extern "C" {
68 #endif // __cplusplus
69 
70 #include <dev/isci/scil/sci_abstract_list.h>
71 #include <dev/isci/scil/sci_fast_list.h>
72 #include <dev/isci/scil/scif_domain.h>
73 
74 #include <dev/isci/scil/sci_base_domain.h>
75 #include <dev/isci/scil/scif_sas_request.h>
76 #include <dev/isci/scil/scif_sas_task_request.h>
77 #include <dev/isci/scil/scif_sas_remote_device.h>
78 
79 
80 extern SCI_BASE_DOMAIN_STATE_HANDLER_T scif_sas_domain_state_handler_table[];
81 extern SCI_BASE_STATE_T scif_sas_domain_state_table[];
82 
83 #define PORT_HARD_RESET_TIMEOUT 1000 //1000 miliseconds
84 
85 #define SCIF_DOMAIN_DISCOVER_TIMEOUT 20000 // miliseconds
86 
87 /**
88  * @struct SCIF_SAS_DOMAIN
89  *
90  * @brief The SCI SAS Framework domain object abstracts the SAS domain
91  *        level behavior for the framework component.  Additionally,
92  *        it provides a higher level of abstraction for the core port
93  *        object.  There is a 1:1 correspondance between core ports and
94  *        framework domain objects.  Essentially, each core port provides
95  *        the access to the remote devices in the domain.
96  */
97 typedef struct SCIF_SAS_DOMAIN
98 {
99    /**
100     * The SCI_BASE_DOMAIN is the parent object for the SCIF_SAS_DOMAIN
101     * object.
102     */
103    SCI_BASE_DOMAIN_T  parent;
104 
105    /**
106     * This field contains the handle for the SCI Core port object that
107     * is managed by this framework domain object.
108     */
109    SCI_PORT_HANDLE_T  core_object;
110 
111    /**
112     * This field specifies the controller containing this domain object.
113     */
114    struct SCIF_SAS_CONTROLLER * controller;
115 
116    /**
117     * This field references the list of state specific handler methods to
118     * be utilized for this domain instance.
119     */
120    SCI_BASE_DOMAIN_STATE_HANDLER_T * state_handlers;
121 
122    /**
123     * This field contains references to all of the devices contained in
124     * this domain.
125     */
126    SCI_ABSTRACT_LIST_T  remote_device_list;
127 
128    /**
129     * This field contains the list of all outstanding request (IO or
130     * management) in this domain.
131     */
132    SCI_FAST_LIST_T  request_list;
133 
134    /**
135     * This field indicates whether the core port object is in a ready state
136     * or not.
137     */
138    BOOL  is_port_ready;
139 
140    /**
141     * This field indicates the number of remote devices that have been
142     * started in this domain.
143     */
144    U32  device_start_count;
145 
146    /**
147     * This field indicates the number of remote devices that are currently
148     * in the process of becoming ready.  This field is utilized to gate
149     * the transition back to the READY state for the domain.
150     */
151    U32  device_start_in_progress_count;
152 
153    /**
154     * This field records how many broadcast change primitve are
155     * received and not processed yet.
156     */
157    U32  broadcast_change_count;
158 
159    /**
160     * This fields indicates whether the expanders in this domain need to
161     * have there config route table configured by our driver. For expample,
162     * if we found the top level expander is a self-configuring expander and
163     * it is able to config others, all the expanders in this domain don't
164     * need to configure route table.
165     */
166    BOOL is_config_route_table_needed;
167 
168    struct
169    {
170       /**
171        * This field provides the domain object a scratch area to indicate
172        * status of an ongoing operation.
173        */
174       SCI_STATUS  status;
175 
176       /**
177        * This is the timer handle that is utilized to time the discovery
178        * or domain reset operations.
179        */
180       void * timer;
181 
182       /**
183        * This field specifies the timeout value, in milliseconds, for the
184        * entire operation (discovery or reset).
185        */
186       U32 timeout;
187 
188       /**
189        * This field specifies the timeout value, in milliseconds, for a
190        * single device.
191        */
192       U32 device_timeout;
193 
194    } operation;
195 
196 } SCIF_SAS_DOMAIN_T;
197 
198 void scif_sas_domain_construct(
199    SCIF_SAS_DOMAIN_T          * fw_domain,
200    U8                           domain_id,
201    struct SCIF_SAS_CONTROLLER * fw_controller
202 );
203 
204 void scif_sas_domain_terminate_requests(
205    SCIF_SAS_DOMAIN_T        * fw_domain,
206    SCIF_SAS_REMOTE_DEVICE_T * fw_device,
207    SCIF_SAS_REQUEST_T       * fw_request,
208    SCIF_SAS_TASK_REQUEST_T  * fw_requestor
209 );
210 
211 SCIF_SAS_REQUEST_T * scif_sas_domain_get_request_by_io_tag(
212    SCIF_SAS_DOMAIN_T * fw_domain,
213    U16                 io_tag
214 );
215 
216 void scif_sas_domain_transition_to_stopped_state(
217    SCIF_SAS_DOMAIN_T * fw_domain
218 );
219 
220 void scif_sas_domain_initialize(
221    SCIF_SAS_DOMAIN_T * fw_domain
222 );
223 
224 void scif_sas_domain_remote_device_start_complete(
225    SCIF_SAS_DOMAIN_T        * fw_domain,
226    SCIF_SAS_REMOTE_DEVICE_T * fw_device
227 );
228 
229 BOOL scif_sas_domain_is_in_smp_activity(
230    SCIF_SAS_DOMAIN_T        * fw_domain
231 );
232 
233 SCIF_SAS_REMOTE_DEVICE_T * scif_sas_domain_get_device_by_containing_device(
234    SCIF_SAS_DOMAIN_T        * fw_domain,
235    SCIF_SAS_REMOTE_DEVICE_T * containing_device,
236    U8                         expander_phy_id
237 );
238 
239 SCIF_SAS_REMOTE_DEVICE_T * scif_sas_domain_find_device_in_spinup_hold(
240    SCIF_SAS_DOMAIN_T        * fw_domain
241 );
242 
243 SCIF_SAS_REMOTE_DEVICE_T * scif_sas_domain_find_device_has_scheduled_activity(
244    SCIF_SAS_DOMAIN_T        * fw_domain,
245    U8                         smp_activity
246 );
247 
248 void scif_sas_domain_start_smp_activity(
249   SCIF_SAS_DOMAIN_T        * fw_domain
250 );
251 
252 void scif_sas_domain_remove_expander_device(
253    SCIF_SAS_DOMAIN_T        * fw_domain,
254    SCIF_SAS_REMOTE_DEVICE_T * fw_device
255 );
256 
257 void scif_sas_domain_start_smp_discover(
258    SCIF_SAS_DOMAIN_T        * fw_domain,
259    SCIF_SAS_REMOTE_DEVICE_T * top_expander
260 );
261 
262 void scif_sas_domain_continue_discover(
263    SCIF_SAS_DOMAIN_T * fw_domain
264 );
265 
266 void scif_sas_domain_finish_discover(
267    SCIF_SAS_DOMAIN_T * fw_domain
268 );
269 
270 void scif_sas_domain_transition_to_discovering_state(
271    SCIF_SAS_DOMAIN_T * fw_domain
272 );
273 
274 void scif_sas_domain_cancel_smp_activities(
275    SCIF_SAS_DOMAIN_T * fw_domain
276 );
277 
278 U8 scif_sas_domain_get_smp_request_count(
279    SCIF_SAS_DOMAIN_T * fw_domain
280 );
281 
282 void scif_sas_domain_schedule_clear_affiliation(
283    SCIF_SAS_DOMAIN_T * fw_domain
284 );
285 
286 void scif_sas_domain_start_clear_affiliation(
287    SCIF_SAS_DOMAIN_T * fw_domain
288 );
289 
290 void scif_sas_domain_continue_clear_affiliation(
291    SCIF_SAS_DOMAIN_T * fw_domain
292 );
293 
294 void scif_sas_domain_release_resource(
295    struct SCIF_SAS_CONTROLLER * fw_controller,
296    SCIF_SAS_DOMAIN_T     * fw_domain
297 );
298 
299 SCIF_SAS_REMOTE_DEVICE_T * scif_sas_domain_find_next_ea_target_reset(
300    SCIF_SAS_DOMAIN_T * fw_domain
301 );
302 
303 #if !defined(DISABLE_WIDE_PORTED_TARGETS)
304 void scif_sas_domain_update_device_port_width(
305    SCIF_SAS_DOMAIN_T     * fw_domain,
306    SCI_PORT_HANDLE_T      port
307 );
308 #else  //!defined(DISABLE_WIDE_PORTED_TARGETS)
309 #define scif_sas_domain_update_device_port_width(domain, port)
310 #endif //!defined(DISABLE_WIDE_PORTED_TARGETS)
311 
312 #ifdef SCI_LOGGING
313 void scif_sas_domain_initialize_state_logging(
314    SCIF_SAS_DOMAIN_T *fw_domain
315 );
316 
317 void scif_sas_domain_deinitialize_state_logging(
318    SCIF_SAS_DOMAIN_T *fw_domain
319 );
320 #else // SCI_LOGGING
321 #define scif_sas_domain_initialize_state_logging(x)
322 #define scif_sas_domain_deinitialize_state_logging(x)
323 #endif // SCI_LOGGING
324 
325 #ifdef __cplusplus
326 }
327 #endif // __cplusplus
328 
329 #endif // _SCIF_SAS_DOMAIN_H_
330 
331