xref: /freebsd/sys/dev/isci/scil/scic_sds_controller.h (revision 718cf2ccb9956613756ab15d7a0e28f2c8e91cab)
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  * $FreeBSD$
55f11c7f63SJim Harris  */
56f11c7f63SJim Harris #ifndef _SCIC_SDS_CONTROLLER_H_
57f11c7f63SJim Harris #define _SCIC_SDS_CONTROLLER_H_
58f11c7f63SJim Harris 
59f11c7f63SJim Harris /**
60f11c7f63SJim Harris  * @file
61f11c7f63SJim Harris  *
62f11c7f63SJim Harris  * @brief This file contains the structures, constants and prototypes used for
63f11c7f63SJim Harris  *        the core controller object.
64f11c7f63SJim Harris  */
65f11c7f63SJim Harris 
66f11c7f63SJim Harris #ifdef __cplusplus
67f11c7f63SJim Harris extern "C" {
68f11c7f63SJim Harris #endif // __cplusplus
69f11c7f63SJim Harris 
70f11c7f63SJim Harris #include <dev/isci/scil/sci_pool.h>
71f11c7f63SJim Harris #include <dev/isci/scil/sci_controller_constants.h>
72f11c7f63SJim Harris #include <dev/isci/scil/sci_memory_descriptor_list.h>
73f11c7f63SJim Harris #include <dev/isci/scil/sci_base_controller.h>
74f11c7f63SJim Harris #include <dev/isci/scil/scic_config_parameters.h>
75f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_port.h>
76f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_phy.h>
77f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_remote_node_table.h>
78f11c7f63SJim Harris #include <dev/isci/scil/scu_registers.h>
79f11c7f63SJim Harris #include <dev/isci/scil/scu_constants.h>
80f11c7f63SJim Harris #include <dev/isci/scil/scu_remote_node_context.h>
81f11c7f63SJim Harris #include <dev/isci/scil/scu_task_context.h>
82f11c7f63SJim Harris #include <dev/isci/scil/scu_unsolicited_frame.h>
83f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_unsolicited_frame_control.h>
84f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_port_configuration_agent.h>
85f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_pci.h>
86f11c7f63SJim Harris 
87f11c7f63SJim Harris struct SCIC_SDS_REMOTE_DEVICE;
88f11c7f63SJim Harris struct SCIC_SDS_REQUEST;
89f11c7f63SJim Harris 
90f11c7f63SJim Harris 
91f11c7f63SJim Harris #define SCU_COMPLETION_RAM_ALIGNMENT            (64)
92f11c7f63SJim Harris 
93f11c7f63SJim Harris /**
94f11c7f63SJim Harris  * @enum SCIC_SDS_CONTROLLER_MEMORY_DESCRIPTORS
95f11c7f63SJim Harris  *
96f11c7f63SJim Harris  * This enumeration depects the types of MDEs that are going to be created for
97f11c7f63SJim Harris  * the controller object.
98f11c7f63SJim Harris  */
99f11c7f63SJim Harris enum SCIC_SDS_CONTROLLER_MEMORY_DESCRIPTORS
100f11c7f63SJim Harris {
101f11c7f63SJim Harris    /**
102f11c7f63SJim Harris     * Completion queue MDE entry
103f11c7f63SJim Harris     */
104f11c7f63SJim Harris    SCU_MDE_COMPLETION_QUEUE,
105f11c7f63SJim Harris 
106f11c7f63SJim Harris    /**
107f11c7f63SJim Harris     * Remote node context MDE entry
108f11c7f63SJim Harris     */
109f11c7f63SJim Harris    SCU_MDE_REMOTE_NODE_CONTEXT,
110f11c7f63SJim Harris 
111f11c7f63SJim Harris    /**
112f11c7f63SJim Harris     * Task context MDE entry
113f11c7f63SJim Harris     */
114f11c7f63SJim Harris    SCU_MDE_TASK_CONTEXT,
115f11c7f63SJim Harris 
116f11c7f63SJim Harris    /**
117f11c7f63SJim Harris     * Unsolicited frame buffer MDE entrys this is the start of the unsolicited
118f11c7f63SJim Harris     * frame buffer entries.
119f11c7f63SJim Harris     */
120f11c7f63SJim Harris    SCU_MDE_UF_BUFFER,
121f11c7f63SJim Harris 
122f11c7f63SJim Harris    SCU_MAX_MDES
123f11c7f63SJim Harris };
124f11c7f63SJim Harris 
125f11c7f63SJim Harris /**
126f11c7f63SJim Harris  * @struct SCIC_POWER_CONTROL
127f11c7f63SJim Harris  *
128f11c7f63SJim Harris  * This structure defines the fields for managing power control for direct
129f11c7f63SJim Harris  * attached disk devices.
130f11c7f63SJim Harris  */
131f11c7f63SJim Harris typedef struct SCIC_POWER_CONTROL
132f11c7f63SJim Harris {
133f11c7f63SJim Harris    /**
134f11c7f63SJim Harris     * This field is set when the power control timer is running and cleared when
135f11c7f63SJim Harris     * it is not.
136f11c7f63SJim Harris     */
137f11c7f63SJim Harris    BOOL timer_started;
138f11c7f63SJim Harris 
139f11c7f63SJim Harris    /**
140f11c7f63SJim Harris     * This field is the handle to the driver timer object.  This timer is used to
141f11c7f63SJim Harris     * control when the directed attached disks can consume power.
142f11c7f63SJim Harris     */
143f11c7f63SJim Harris    void *timer;
144f11c7f63SJim Harris 
145f11c7f63SJim Harris    /**
146f11c7f63SJim Harris    * This field is used to keep track of how many phys are put into the
147f11c7f63SJim Harris    * requesters field.
148f11c7f63SJim Harris    */
149f11c7f63SJim Harris    U8 phys_waiting;
150f11c7f63SJim Harris 
151f11c7f63SJim Harris    /**
152f11c7f63SJim Harris    * This field is used to keep track of how many remote devices have been granted to consume power
153f11c7f63SJim Harris    */
154f11c7f63SJim Harris    U8 remote_devices_granted_power;
155f11c7f63SJim Harris 
156f11c7f63SJim Harris    /**
157f11c7f63SJim Harris     * This field is an array of phys that we are waiting on. The phys are direct
158f11c7f63SJim Harris     * mapped into requesters via SCIC_SDS_PHY_T.phy_index
159f11c7f63SJim Harris     */
160f11c7f63SJim Harris    SCIC_SDS_PHY_T *requesters[SCI_MAX_PHYS];
161f11c7f63SJim Harris 
162f11c7f63SJim Harris } SCIC_POWER_CONTROL_T;
163f11c7f63SJim Harris 
164f11c7f63SJim Harris /**
165f11c7f63SJim Harris  * @struct SCIC_SDS_CONTROLLER
166f11c7f63SJim Harris  *
167f11c7f63SJim Harris  * This structure represents the SCU contoller object.
168f11c7f63SJim Harris  */
169f11c7f63SJim Harris typedef struct SCIC_SDS_CONTROLLER
170f11c7f63SJim Harris {
171f11c7f63SJim Harris    /**
172f11c7f63SJim Harris     * The SCI_BASE_CONTROLLER is the parent object for the SCIC_SDS_CONTROLLER
173f11c7f63SJim Harris     * object.
174f11c7f63SJim Harris     */
175f11c7f63SJim Harris    SCI_BASE_CONTROLLER_T parent;
176f11c7f63SJim Harris 
177f11c7f63SJim Harris    /**
178f11c7f63SJim Harris     * This field is the driver timer object handler used to time the controller
179f11c7f63SJim Harris     * object start and stop requests.
180f11c7f63SJim Harris     */
181f11c7f63SJim Harris    void *timeout_timer;
182f11c7f63SJim Harris 
183f11c7f63SJim Harris    /**
184f11c7f63SJim Harris     * This field is the current set of state handlers assigned to this controller
185f11c7f63SJim Harris     * object.
186f11c7f63SJim Harris     */
187f11c7f63SJim Harris    struct SCIC_SDS_CONTROLLER_STATE_HANDLER *state_handlers;
188f11c7f63SJim Harris 
189f11c7f63SJim Harris    /**
190f11c7f63SJim Harris     * This field contains the user parameters to be utilized for this
191f11c7f63SJim Harris     * core controller object.
192f11c7f63SJim Harris     */
193f11c7f63SJim Harris    SCIC_USER_PARAMETERS_T  user_parameters;
194f11c7f63SJim Harris 
195f11c7f63SJim Harris    /**
196f11c7f63SJim Harris     * This field contains the OEM parameters version defining the structure
197f11c7f63SJim Harris     * layout. It comes from the version in the OEM block header.
198f11c7f63SJim Harris     */
199f11c7f63SJim Harris    U8 oem_parameters_version;
200f11c7f63SJim Harris 
201f11c7f63SJim Harris    /**
202f11c7f63SJim Harris     * This field contains the OEM parameters to be utilized for this
203f11c7f63SJim Harris     * core controller object.
204f11c7f63SJim Harris     */
205f11c7f63SJim Harris    SCIC_OEM_PARAMETERS_T  oem_parameters;
206f11c7f63SJim Harris 
207f11c7f63SJim Harris    /**
208f11c7f63SJim Harris     * This field contains the port configuration agent for this controller.
209f11c7f63SJim Harris     */
210f11c7f63SJim Harris    SCIC_SDS_PORT_CONFIGURATION_AGENT_T port_agent;
211f11c7f63SJim Harris 
212f11c7f63SJim Harris    /**
213f11c7f63SJim Harris     * This field is the array of port objects that are controlled by this
214f11c7f63SJim Harris     * controller object.  There is one dummy port object also contained within
215f11c7f63SJim Harris     * this controller object.
216f11c7f63SJim Harris     */
217f11c7f63SJim Harris    struct SCIC_SDS_PORT port_table[SCI_MAX_PORTS + 1];
218f11c7f63SJim Harris 
219f11c7f63SJim Harris    /**
220f11c7f63SJim Harris     * This field is the array of phy objects that are controlled by this
221f11c7f63SJim Harris     * controller object.
222f11c7f63SJim Harris     */
223f11c7f63SJim Harris    struct SCIC_SDS_PHY phy_table[SCI_MAX_PHYS];
224f11c7f63SJim Harris 
225f11c7f63SJim Harris    /**
226f11c7f63SJim Harris     * This field is the array of device objects that are currently constructed
227f11c7f63SJim Harris     * for this controller object.  This table is used as a fast lookup of device
228f11c7f63SJim Harris     * objects that need to handle device completion notifications from the
229f11c7f63SJim Harris     * hardware. The table is RNi based.
230f11c7f63SJim Harris     */
231f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE *device_table[SCI_MAX_REMOTE_DEVICES];
232f11c7f63SJim Harris 
233f11c7f63SJim Harris    /**
234f11c7f63SJim Harris     * This field is the array of IO request objects that are currently active for
235f11c7f63SJim Harris     * this controller object.  This table is used as a fast lookup of the io
236f11c7f63SJim Harris     * request object that need to handle completion queue notifications.  The
237f11c7f63SJim Harris     * table is TCi based.
238f11c7f63SJim Harris     */
239f11c7f63SJim Harris    struct SCIC_SDS_REQUEST *io_request_table[SCI_MAX_IO_REQUESTS];
240f11c7f63SJim Harris 
241f11c7f63SJim Harris    /**
242f11c7f63SJim Harris     * This field is the free RNi data structure
243f11c7f63SJim Harris     */
244f11c7f63SJim Harris    SCIC_REMOTE_NODE_TABLE_T available_remote_nodes;
245f11c7f63SJim Harris 
246f11c7f63SJim Harris    /**
247f11c7f63SJim Harris     * This field is the TCi pool used to manage the task context index.
248f11c7f63SJim Harris     */
249f11c7f63SJim Harris    SCI_POOL_CREATE(tci_pool, U16, SCI_MAX_IO_REQUESTS);
250f11c7f63SJim Harris 
251f11c7f63SJim Harris    /**
252453130d9SPedro F. Giffuni     * This filed is the SCIC_POWER_CONTROL data used to control when direct
253f11c7f63SJim Harris     * attached devices can consume power.
254f11c7f63SJim Harris     */
255f11c7f63SJim Harris    SCIC_POWER_CONTROL_T power_control;
256f11c7f63SJim Harris 
257f11c7f63SJim Harris    /**
258f11c7f63SJim Harris     * This field is the array of sequence values for the IO Tag fields.  Even
259f11c7f63SJim Harris     * though only 4 bits of the field is used for the sequence the sequence is 16
260f11c7f63SJim Harris     * bits in size so the sequence can be bitwise or'd with the TCi to build the
261f11c7f63SJim Harris     * IO Tag value.
262f11c7f63SJim Harris     */
263f11c7f63SJim Harris    U16 io_request_sequence[SCI_MAX_IO_REQUESTS];
264f11c7f63SJim Harris 
265f11c7f63SJim Harris    /**
266f11c7f63SJim Harris     * This field in the array of sequence values for the RNi.  These are used
267f11c7f63SJim Harris     * to control io request build to io request start operations.  The sequence
268f11c7f63SJim Harris     * value is recorded into an io request when it is built and is checked on
269f11c7f63SJim Harris     * the io request start operation to make sure that there was not a device
270f11c7f63SJim Harris     * hot plug between the build and start operation.
271f11c7f63SJim Harris     */
272f11c7f63SJim Harris    U8  remote_device_sequence[SCI_MAX_REMOTE_DEVICES];
273f11c7f63SJim Harris 
274f11c7f63SJim Harris    /**
275f11c7f63SJim Harris     * This field is a pointer to the memory allocated by the driver for the task
276f11c7f63SJim Harris     * context table.  This data is shared between the hardware and software.
277f11c7f63SJim Harris     */
278f11c7f63SJim Harris    SCU_TASK_CONTEXT_T *task_context_table;
279f11c7f63SJim Harris 
280f11c7f63SJim Harris    /**
281f11c7f63SJim Harris     * This field is a pointer to the memory allocated by the driver for the
282f11c7f63SJim Harris     * remote node context table.  This table is shared between the hardware and
283f11c7f63SJim Harris     * software.
284f11c7f63SJim Harris     */
285f11c7f63SJim Harris    SCU_REMOTE_NODE_CONTEXT_T *remote_node_context_table;
286f11c7f63SJim Harris 
287f11c7f63SJim Harris    /**
288f11c7f63SJim Harris     * This field is the array of physical memory requiremets for this controller
289f11c7f63SJim Harris     * object.
290f11c7f63SJim Harris     */
291f11c7f63SJim Harris    SCI_PHYSICAL_MEMORY_DESCRIPTOR_T memory_descriptors[SCU_MAX_MDES];
292f11c7f63SJim Harris 
293f11c7f63SJim Harris    /**
294f11c7f63SJim Harris     * This field is a pointer to the completion queue.  This memory is
295f11c7f63SJim Harris     * written to by the hardware and read by the software.
296f11c7f63SJim Harris     */
297f11c7f63SJim Harris    U32 *completion_queue;
298f11c7f63SJim Harris 
299f11c7f63SJim Harris    /**
300f11c7f63SJim Harris     * This field is the software copy of the completion queue get pointer.  The
301f11c7f63SJim Harris     * controller object writes this value to the hardware after processing the
302f11c7f63SJim Harris     * completion entries.
303f11c7f63SJim Harris     */
304f11c7f63SJim Harris    U32 completion_queue_get;
305f11c7f63SJim Harris 
306f11c7f63SJim Harris    /**
307f11c7f63SJim Harris     * This field is the minimum of the number of hardware supported port entries
308f11c7f63SJim Harris     * and the software requested port entries.
309f11c7f63SJim Harris     */
310f11c7f63SJim Harris    U32 logical_port_entries;
311f11c7f63SJim Harris 
312f11c7f63SJim Harris    /**
313f11c7f63SJim Harris     * This field is the minimum number of hardware supported completion queue
314f11c7f63SJim Harris     * entries and the software requested completion queue entries.
315f11c7f63SJim Harris     */
316f11c7f63SJim Harris    U32 completion_queue_entries;
317f11c7f63SJim Harris 
318f11c7f63SJim Harris    /**
319f11c7f63SJim Harris     * This field is the minimum number of hardware supported event entries and
320f11c7f63SJim Harris     * the software requested event entries.
321f11c7f63SJim Harris     */
322f11c7f63SJim Harris    U32 completion_event_entries;
323f11c7f63SJim Harris 
324f11c7f63SJim Harris    /**
325f11c7f63SJim Harris     * This field is the minimum number of devices supported by the hardware and
326f11c7f63SJim Harris     * the number of devices requested by the software.
327f11c7f63SJim Harris     */
328f11c7f63SJim Harris    U32 remote_node_entries;
329f11c7f63SJim Harris 
330f11c7f63SJim Harris    /**
331f11c7f63SJim Harris     * This field is the minimum number of IO requests supported by the hardware
332f11c7f63SJim Harris     * and the number of IO requests requested by the software.
333f11c7f63SJim Harris     */
334f11c7f63SJim Harris    U32 task_context_entries;
335f11c7f63SJim Harris 
336f11c7f63SJim Harris    /**
337f11c7f63SJim Harris     * This object contains all of the unsolicited frame specific
338f11c7f63SJim Harris     * data utilized by the core controller.
339f11c7f63SJim Harris     */
340f11c7f63SJim Harris    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T uf_control;
341f11c7f63SJim Harris 
342f11c7f63SJim Harris    /**
343f11c7f63SJim Harris     * This field records the fact that the controller has encountered a fatal
344f11c7f63SJim Harris     * error and must be reset.
345f11c7f63SJim Harris     */
346f11c7f63SJim Harris    BOOL encountered_fatal_error;
347f11c7f63SJim Harris 
348f11c7f63SJim Harris    /**
349f11c7f63SJim Harris     * This field specifies that the controller should ignore
350f11c7f63SJim Harris     * completion processing for non-fastpath events.  This will
351f11c7f63SJim Harris     * cause the completions to be thrown away.
352f11c7f63SJim Harris     */
353f11c7f63SJim Harris    BOOL restrict_completions;
354f11c7f63SJim Harris 
355f11c7f63SJim Harris    // Phy Startup Data
356f11c7f63SJim Harris    /**
357f11c7f63SJim Harris     * This field is the driver timer handle for controller phy request startup.
358f11c7f63SJim Harris     * On controller start the controller will start each PHY individually in
359f11c7f63SJim Harris     * order of phy index.
360f11c7f63SJim Harris     */
361f11c7f63SJim Harris    void *phy_startup_timer;
362f11c7f63SJim Harris 
363f11c7f63SJim Harris    /**
364f11c7f63SJim Harris     * This field is set when the phy_startup_timer is running and is cleared when
365f11c7f63SJim Harris     * the phy_startup_timer is stopped.
366f11c7f63SJim Harris     */
367f11c7f63SJim Harris    BOOL phy_startup_timer_pending;
368f11c7f63SJim Harris 
369f11c7f63SJim Harris    /**
370f11c7f63SJim Harris     * This field is the index of the next phy start.  It is initialized to 0 and
371f11c7f63SJim Harris     * increments for each phy index that is started.
372f11c7f63SJim Harris     */
373f11c7f63SJim Harris    U32 next_phy_to_start;
374f11c7f63SJim Harris 
375f11c7f63SJim Harris    /**
376453130d9SPedro F. Giffuni     * This field controls the invalid link up notifications to the SCI_USER.  If
377f11c7f63SJim Harris     * an invalid_link_up notification is reported a bit for the PHY index is set
378f11c7f63SJim Harris     * so further notifications are not made.  Once the PHY object reports link up
379f11c7f63SJim Harris     * and is made part of a port then this bit for the PHY index is cleared.
380f11c7f63SJim Harris     */
381f11c7f63SJim Harris    U8  invalid_phy_mask;
382f11c7f63SJim Harris 
383f11c7f63SJim Harris    /**
384f11c7f63SJim Harris     * This is the controller index for this controller object.
385f11c7f63SJim Harris     */
386f11c7f63SJim Harris    U8 controller_index;
387f11c7f63SJim Harris 
388f11c7f63SJim Harris    /**
389f11c7f63SJim Harris     * This field is the PCI revision code for the controller object.
390f11c7f63SJim Harris     */
391f11c7f63SJim Harris    enum SCU_CONTROLLER_PCI_REVISION_CODE pci_revision;
392f11c7f63SJim Harris 
393f11c7f63SJim Harris    /*
394f11c7f63SJim Harris     * This field saves the current interrupt coalescing number of the controller.
395f11c7f63SJim Harris     */
396f11c7f63SJim Harris    U16 interrupt_coalesce_number;
397f11c7f63SJim Harris 
398f11c7f63SJim Harris    /*
399f11c7f63SJim Harris     * This field saves the current interrupt coalescing timeout value in microseconds.
400f11c7f63SJim Harris     */
401f11c7f63SJim Harris    U32 interrupt_coalesce_timeout;
402f11c7f63SJim Harris 
403f11c7f63SJim Harris    // Hardware memory mapped register space
404f11c7f63SJim Harris #ifdef ARLINGTON_BUILD
405f11c7f63SJim Harris    /**
406f11c7f63SJim Harris     * This field is a pointer to the memory mapped register space for the
407f11c7f63SJim Harris     * LEX_REGISTERS.
408f11c7f63SJim Harris     */
409f11c7f63SJim Harris    LEX_REGISTERS_T *lex_registers;
410f11c7f63SJim Harris #endif
411f11c7f63SJim Harris 
412f11c7f63SJim Harris    /**
413f11c7f63SJim Harris     * This field is a pointer to the memory mapped register space for the
414f11c7f63SJim Harris     * SMU_REGISTERS.
415f11c7f63SJim Harris     */
416f11c7f63SJim Harris    SMU_REGISTERS_T *smu_registers;
417f11c7f63SJim Harris 
418f11c7f63SJim Harris    /**
419f11c7f63SJim Harris     * This field is a pointer to the memory mapped register space for the
420f11c7f63SJim Harris     * SCU_REGISTERS.
421f11c7f63SJim Harris     */
422f11c7f63SJim Harris    SCU_REGISTERS_T *scu_registers;
423f11c7f63SJim Harris 
424f11c7f63SJim Harris } SCIC_SDS_CONTROLLER_T;
425f11c7f63SJim Harris 
426f11c7f63SJim Harris 
427f11c7f63SJim Harris typedef void (*SCIC_SDS_CONTROLLER_PHY_HANDLER_T)(
428f11c7f63SJim Harris                      struct SCIC_SDS_CONTROLLER *controller,
429f11c7f63SJim Harris                      struct SCIC_SDS_PORT       *port,
430f11c7f63SJim Harris                      struct SCIC_SDS_PHY        *phy
431f11c7f63SJim Harris                      );
432f11c7f63SJim Harris 
433f11c7f63SJim Harris typedef void (*SCIC_SDS_CONTROLLER_DEVICE_HANDLER_T)(
434f11c7f63SJim Harris                      struct SCIC_SDS_CONTROLLER    * controller,
435f11c7f63SJim Harris                      struct SCIC_SDS_REMOTE_DEVICE * device
436f11c7f63SJim Harris                      );
437f11c7f63SJim Harris /**
438f11c7f63SJim Harris  * @struct SCIC_SDS_CONTROLLER_STATE_HANDLER
439f11c7f63SJim Harris  *
440f11c7f63SJim Harris  * This structure contains the SDS core specific definition for the state
441f11c7f63SJim Harris  * handlers.
442f11c7f63SJim Harris  */
443f11c7f63SJim Harris typedef struct SCIC_SDS_CONTROLLER_STATE_HANDLER
444f11c7f63SJim Harris {
445f11c7f63SJim Harris    SCI_BASE_CONTROLLER_STATE_HANDLER_T parent;
446f11c7f63SJim Harris 
447f11c7f63SJim Harris    SCI_BASE_CONTROLLER_REQUEST_HANDLER_T terminate_request_handler;
448f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_PHY_HANDLER_T     link_up_handler;
449f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_PHY_HANDLER_T     link_down_handler;
450f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_DEVICE_HANDLER_T  remote_device_started_handler;
451f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_DEVICE_HANDLER_T  remote_device_stopped_handler;
452f11c7f63SJim Harris 
453f11c7f63SJim Harris } SCIC_SDS_CONTROLLER_STATE_HANDLER_T;
454f11c7f63SJim Harris 
455f11c7f63SJim Harris extern SCIC_SDS_CONTROLLER_STATE_HANDLER_T
456f11c7f63SJim Harris        scic_sds_controller_state_handler_table[];
457f11c7f63SJim Harris extern SCI_BASE_STATE_T scic_sds_controller_state_table[];
458f11c7f63SJim Harris 
459f11c7f63SJim Harris /**
460f11c7f63SJim Harris  * This macro will increment the specified index to and if the index wraps
461f11c7f63SJim Harris  * to 0 it will toggel the cycle bit.
462f11c7f63SJim Harris  */
463f11c7f63SJim Harris #define INCREMENT_QUEUE_GET(index, cycle, entry_count, bit_toggle) \
464f11c7f63SJim Harris { \
465f11c7f63SJim Harris    if ((index) + 1 == entry_count) \
466f11c7f63SJim Harris    { \
467f11c7f63SJim Harris       (index) = 0; \
468f11c7f63SJim Harris       (cycle) = (cycle) ^ (bit_toggle); \
469f11c7f63SJim Harris    } \
470f11c7f63SJim Harris    else \
471f11c7f63SJim Harris    { \
472f11c7f63SJim Harris       index = index + 1; \
473f11c7f63SJim Harris    } \
474f11c7f63SJim Harris }
475f11c7f63SJim Harris 
476f11c7f63SJim Harris /**
477f11c7f63SJim Harris  * This is a helper macro that sets the state handlers for the controller
478f11c7f63SJim Harris  * object
479f11c7f63SJim Harris  */
480f11c7f63SJim Harris #define scic_sds_controller_set_state_handlers(this_controller, handlers) \
481f11c7f63SJim Harris    ((this_controller)->state_handlers = (handlers))
482f11c7f63SJim Harris 
483f11c7f63SJim Harris /**
484f11c7f63SJim Harris  * This is a helper macro that gets the base state machine for the
485f11c7f63SJim Harris  * controller object
486f11c7f63SJim Harris  */
487f11c7f63SJim Harris #define scic_sds_controller_get_base_state_machine(this_contoroller) \
488f11c7f63SJim Harris    (&(this_controller)->parent.state_machine)
489f11c7f63SJim Harris 
490f11c7f63SJim Harris /**
491f11c7f63SJim Harris  * This is a helper macro to get the port configuration agent from the
492f11c7f63SJim Harris  * controller object.
493f11c7f63SJim Harris  */
494f11c7f63SJim Harris #define scic_sds_controller_get_port_configuration_agent(controller) \
495f11c7f63SJim Harris    (&(controller)->port_agent)
496f11c7f63SJim Harris 
497f11c7f63SJim Harris /**
498f11c7f63SJim Harris  * This is a helper macro that sets the base state machine state handlers
499f11c7f63SJim Harris  * based on the state id
500f11c7f63SJim Harris  */
501f11c7f63SJim Harris #define scic_sds_controller_set_base_state_handlers(this_controller, state_id) \
502f11c7f63SJim Harris    scic_sds_controller_set_state_handlers( \
503f11c7f63SJim Harris       this_controller, &scic_sds_controller_state_handler_table[(state_id)])
504f11c7f63SJim Harris 
505f11c7f63SJim Harris /**
506f11c7f63SJim Harris  * This macro writes to the smu_register for this controller
507f11c7f63SJim Harris  */
508f11c7f63SJim Harris #define smu_register_write(controller, reg, value) \
509f11c7f63SJim Harris    scic_sds_pci_write_smu_dword((controller), &(reg), (value))
510f11c7f63SJim Harris 
511f11c7f63SJim Harris /**
512f11c7f63SJim Harris  * This macro reads the smu_register for this controller
513f11c7f63SJim Harris  */
514f11c7f63SJim Harris #define smu_register_read(controller, reg) \
515f11c7f63SJim Harris    scic_sds_pci_read_smu_dword((controller), &(reg))
516f11c7f63SJim Harris 
517f11c7f63SJim Harris /**
518f11c7f63SJim Harris  * This mcaro writes the scu_register for this controller
519f11c7f63SJim Harris  */
520f11c7f63SJim Harris #define scu_register_write(controller, reg, value) \
521f11c7f63SJim Harris    scic_sds_pci_write_scu_dword((controller), &(reg), (value))
522f11c7f63SJim Harris 
523f11c7f63SJim Harris /**
524f11c7f63SJim Harris  * This macro reads the scu_register for this controller
525f11c7f63SJim Harris  */
526f11c7f63SJim Harris #define scu_register_read(controller, reg) \
527f11c7f63SJim Harris    scic_sds_pci_read_scu_dword((controller), &(reg))
528f11c7f63SJim Harris 
529f11c7f63SJim Harris #ifdef ARLINGTON_BUILD
530f11c7f63SJim Harris    /**
531f11c7f63SJim Harris     * This macro writes to the lex_register for this controller.
532f11c7f63SJim Harris     */
533f11c7f63SJim Harris    #define lex_register_write(controller, reg, value) \
534f11c7f63SJim Harris       scic_cb_pci_write_dword((controller), (reg), (value))
535f11c7f63SJim Harris 
536f11c7f63SJim Harris    /**
537f11c7f63SJim Harris     * This macro reads from the lex_register for this controller.
538f11c7f63SJim Harris     */
539f11c7f63SJim Harris    #define lex_register_read(controller, reg) \
540f11c7f63SJim Harris       scic_cb_pci_read_dword((controller), (reg))
541f11c7f63SJim Harris #endif // ARLINGTON_BUILD
542f11c7f63SJim Harris 
543f11c7f63SJim Harris /**
544f11c7f63SJim Harris  * This macro returns the protocol engine group for this controller object.
545f11c7f63SJim Harris  * Presently we only support protocol engine group 0 so just return that
546f11c7f63SJim Harris  */
547f11c7f63SJim Harris #define scic_sds_controller_get_protocol_engine_group(controller) 0
548f11c7f63SJim Harris 
549f11c7f63SJim Harris /**
550f11c7f63SJim Harris  * This macro constructs an IO tag from the sequence and index values.
551f11c7f63SJim Harris  */
552f11c7f63SJim Harris #define scic_sds_io_tag_construct(sequence, task_index) \
553f11c7f63SJim Harris    ((sequence) << 12 | (task_index))
554f11c7f63SJim Harris 
555f11c7f63SJim Harris /**
556f11c7f63SJim Harris  * This macro returns the IO sequence from the IO tag value.
557f11c7f63SJim Harris  */
558f11c7f63SJim Harris #define scic_sds_io_tag_get_sequence(io_tag) \
559f11c7f63SJim Harris    (((io_tag) & 0xF000) >> 12)
560f11c7f63SJim Harris 
561f11c7f63SJim Harris /**
562f11c7f63SJim Harris  * This macro returns the TCi from the io tag value
563f11c7f63SJim Harris  */
564f11c7f63SJim Harris #define scic_sds_io_tag_get_index(io_tag) \
565f11c7f63SJim Harris    ((io_tag) & 0x0FFF)
566f11c7f63SJim Harris 
567f11c7f63SJim Harris /**
568f11c7f63SJim Harris  * This is a helper macro to increment the io sequence count.
569f11c7f63SJim Harris  *
570f11c7f63SJim Harris  * We may find in the future that it will be faster to store the sequence
571f11c7f63SJim Harris  * count in such a way as we dont perform the shift operation to build io
572f11c7f63SJim Harris  * tag values so therefore need a way to incrment them correctly
573f11c7f63SJim Harris  */
574f11c7f63SJim Harris #define scic_sds_io_sequence_increment(value) \
575f11c7f63SJim Harris    ((value) = (((value) + 1) & 0x000F))
576f11c7f63SJim Harris 
577f11c7f63SJim Harris #define scic_sds_remote_device_node_count(device) \
578f11c7f63SJim Harris    ( \
579f11c7f63SJim Harris       ( \
580f11c7f63SJim Harris          (device)->target_protocols.u.bits.attached_stp_target \
581f11c7f63SJim Harris       && ((device)->is_direct_attached != TRUE) \
582f11c7f63SJim Harris       ) \
583f11c7f63SJim Harris       ? SCU_STP_REMOTE_NODE_COUNT : SCU_SSP_REMOTE_NODE_COUNT \
584f11c7f63SJim Harris    )
585f11c7f63SJim Harris 
586f11c7f63SJim Harris /**
587f11c7f63SJim Harris  * This macro will set the bit in the invalid phy mask for this controller
588f11c7f63SJim Harris  * object.  This is used to control messages reported for invalid link up
589f11c7f63SJim Harris  * notifications.
590f11c7f63SJim Harris  */
591f11c7f63SJim Harris #define scic_sds_controller_set_invalid_phy(controller, phy) \
592f11c7f63SJim Harris    ((controller)->invalid_phy_mask |= (1 << (phy)->phy_index))
593f11c7f63SJim Harris 
594f11c7f63SJim Harris /**
595f11c7f63SJim Harris  * This macro will clear the bit in the invalid phy mask for this controller
596f11c7f63SJim Harris  * object.  This is used to control messages reported for invalid link up
597f11c7f63SJim Harris  * notifications.
598f11c7f63SJim Harris  */
599f11c7f63SJim Harris #define scic_sds_controller_clear_invalid_phy(controller, phy) \
600f11c7f63SJim Harris    ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
601f11c7f63SJim Harris 
602f11c7f63SJim Harris // ---------------------------------------------------------------------------
603f11c7f63SJim Harris 
604f11c7f63SJim Harris U32 scic_sds_controller_get_object_size(void);
605f11c7f63SJim Harris 
606f11c7f63SJim Harris // ---------------------------------------------------------------------------
607f11c7f63SJim Harris 
608f11c7f63SJim Harris U32 scic_sds_controller_get_min_timer_count(void);
609f11c7f63SJim Harris U32 scic_sds_controller_get_max_timer_count(void);
610f11c7f63SJim Harris 
611f11c7f63SJim Harris // ---------------------------------------------------------------------------
612f11c7f63SJim Harris 
613f11c7f63SJim Harris void scic_sds_controller_post_request(
614f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
615f11c7f63SJim Harris    U32                    request
616f11c7f63SJim Harris );
617f11c7f63SJim Harris 
618f11c7f63SJim Harris // ---------------------------------------------------------------------------
619f11c7f63SJim Harris 
620f11c7f63SJim Harris void scic_sds_controller_release_frame(
621f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
622f11c7f63SJim Harris    U32                   frame_index
623f11c7f63SJim Harris );
624f11c7f63SJim Harris 
625f11c7f63SJim Harris void scic_sds_controller_copy_sata_response(
626f11c7f63SJim Harris    void * response_buffer,
627f11c7f63SJim Harris    void * frame_header,
628f11c7f63SJim Harris    void * frame_buffer
629f11c7f63SJim Harris );
630f11c7f63SJim Harris 
631f11c7f63SJim Harris // ---------------------------------------------------------------------------
632f11c7f63SJim Harris 
633f11c7f63SJim Harris SCI_STATUS scic_sds_controller_allocate_remote_node_context(
634f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T         *this_controller,
635f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE *the_device,
636f11c7f63SJim Harris    U16                           *node_id
637f11c7f63SJim Harris );
638f11c7f63SJim Harris 
639f11c7f63SJim Harris void scic_sds_controller_free_remote_node_context(
640f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T         *this_controller,
641f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE *the_device,
642f11c7f63SJim Harris    U16                            node_id
643f11c7f63SJim Harris );
644f11c7f63SJim Harris 
645f11c7f63SJim Harris SCU_REMOTE_NODE_CONTEXT_T *scic_sds_controller_get_remote_node_context_buffer(
646f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
647f11c7f63SJim Harris    U16                    node_id
648f11c7f63SJim Harris );
649f11c7f63SJim Harris 
650f11c7f63SJim Harris // ---------------------------------------------------------------------------
651f11c7f63SJim Harris 
652f11c7f63SJim Harris struct SCIC_SDS_REQUEST *scic_sds_controller_get_io_request_from_tag(
653f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
654f11c7f63SJim Harris    U16                    io_tag
655f11c7f63SJim Harris );
656f11c7f63SJim Harris 
657f11c7f63SJim Harris U16 scic_sds_controller_get_io_sequence_from_tag(
658f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
659f11c7f63SJim Harris    U16                    io_tag
660f11c7f63SJim Harris );
661f11c7f63SJim Harris 
662f11c7f63SJim Harris SCU_TASK_CONTEXT_T *scic_sds_controller_get_task_context_buffer(
663f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
664f11c7f63SJim Harris    U16                   io_tag
665f11c7f63SJim Harris );
666f11c7f63SJim Harris 
667f11c7f63SJim Harris //-----------------------------------------------------------------------------
668f11c7f63SJim Harris 
669f11c7f63SJim Harris SCI_STATUS scic_sds_terminate_reqests(
670f11c7f63SJim Harris         SCIC_SDS_CONTROLLER_T *this_controller,
671f11c7f63SJim Harris         struct SCIC_SDS_REMOTE_DEVICE *this_remote_device,
672f11c7f63SJim Harris         struct SCIC_SDS_PORT *this_port
673f11c7f63SJim Harris );
674f11c7f63SJim Harris 
675f11c7f63SJim Harris //*****************************************************************************
676f11c7f63SJim Harris //* CORE CONTROLLER POWER CONTROL METHODS
677f11c7f63SJim Harris //*****************************************************************************
678f11c7f63SJim Harris 
679f11c7f63SJim Harris void scic_sds_controller_power_control_timer_handler(
680f11c7f63SJim Harris    void *controller
681f11c7f63SJim Harris );
682f11c7f63SJim Harris 
683f11c7f63SJim Harris void scic_sds_controller_power_control_queue_insert(
684f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
685f11c7f63SJim Harris    struct SCIC_SDS_PHY   *the_phy
686f11c7f63SJim Harris );
687f11c7f63SJim Harris 
688f11c7f63SJim Harris void scic_sds_controller_power_control_queue_remove(
689f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
690f11c7f63SJim Harris    struct SCIC_SDS_PHY   *the_phy
691f11c7f63SJim Harris );
692f11c7f63SJim Harris 
693f11c7f63SJim Harris //*****************************************************************************
694f11c7f63SJim Harris //* CORE CONTROLLER PHY MESSAGE PROCESSING
695f11c7f63SJim Harris //*****************************************************************************
696f11c7f63SJim Harris 
697f11c7f63SJim Harris void scic_sds_controller_link_up(
698f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
699f11c7f63SJim Harris    struct SCIC_SDS_PORT  *the_port,
700f11c7f63SJim Harris    struct SCIC_SDS_PHY   *the_phy
701f11c7f63SJim Harris );
702f11c7f63SJim Harris 
703f11c7f63SJim Harris void scic_sds_controller_link_down(
704f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller,
705f11c7f63SJim Harris    struct SCIC_SDS_PORT  *the_port,
706f11c7f63SJim Harris    struct SCIC_SDS_PHY   *the_phy
707f11c7f63SJim Harris );
708f11c7f63SJim Harris 
709f11c7f63SJim Harris //*****************************************************************************
710f11c7f63SJim Harris //* CORE CONTROLLER PORT AGENT MESSAGE PROCESSING
711f11c7f63SJim Harris //*****************************************************************************
712f11c7f63SJim Harris void scic_sds_controller_port_agent_configured_ports(
713f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T * this_controller
714f11c7f63SJim Harris );
715f11c7f63SJim Harris 
716f11c7f63SJim Harris //*****************************************************************************
717f11c7f63SJim Harris //* CORE CONTROLLER REMOTE DEVICE MESSAGE PROCESSING
718f11c7f63SJim Harris //*****************************************************************************
719f11c7f63SJim Harris 
720f11c7f63SJim Harris BOOL scic_sds_controller_has_remote_devices_stopping(
721f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T * this_controller
722f11c7f63SJim Harris );
723f11c7f63SJim Harris 
724f11c7f63SJim Harris void scic_sds_controller_remote_device_started(
725f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T         * this_controller,
726f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE * the_device
727f11c7f63SJim Harris );
728f11c7f63SJim Harris 
729f11c7f63SJim Harris void scic_sds_controller_remote_device_stopped(
730f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T         * this_controller,
731f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE * the_device
732f11c7f63SJim Harris );
733f11c7f63SJim Harris 
734f11c7f63SJim Harris //*****************************************************************************
735f11c7f63SJim Harris //* CORE CONTROLLER PRIVATE METHODS
736f11c7f63SJim Harris //*****************************************************************************
737f11c7f63SJim Harris 
738f11c7f63SJim Harris #ifdef SCI_LOGGING
739f11c7f63SJim Harris void scic_sds_controller_initialize_state_logging(
740f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
741f11c7f63SJim Harris );
742f11c7f63SJim Harris 
743f11c7f63SJim Harris void scic_sds_controller_deinitialize_state_logging(
744f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
745f11c7f63SJim Harris );
746f11c7f63SJim Harris #else
747f11c7f63SJim Harris #define scic_sds_controller_initialize_state_logging(x)
748f11c7f63SJim Harris #define scic_sds_controller_deinitialize_state_logging(x)
749f11c7f63SJim Harris #endif
750f11c7f63SJim Harris 
751f11c7f63SJim Harris SCI_STATUS scic_sds_controller_validate_memory_descriptor_table(
752f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
753f11c7f63SJim Harris );
754f11c7f63SJim Harris 
755f11c7f63SJim Harris void scic_sds_controller_ram_initialization(
756f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
757f11c7f63SJim Harris );
758f11c7f63SJim Harris 
759f11c7f63SJim Harris void scic_sds_controller_assign_task_entries(
760f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
761f11c7f63SJim Harris );
762f11c7f63SJim Harris 
763f11c7f63SJim Harris void scic_sds_controller_afe_initialization(
764f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T * this_controller
765f11c7f63SJim Harris );
766f11c7f63SJim Harris 
767f11c7f63SJim Harris void scic_sds_controller_enable_port_task_scheduler(
768f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
769f11c7f63SJim Harris );
770f11c7f63SJim Harris 
771f11c7f63SJim Harris void scic_sds_controller_initialize_completion_queue(
772f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
773f11c7f63SJim Harris );
774f11c7f63SJim Harris 
775f11c7f63SJim Harris void scic_sds_controller_initialize_unsolicited_frame_queue(
776f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
777f11c7f63SJim Harris );
778f11c7f63SJim Harris 
779f11c7f63SJim Harris void scic_sds_controller_phy_timer_stop(
780f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
781f11c7f63SJim Harris );
782f11c7f63SJim Harris 
783f11c7f63SJim Harris BOOL scic_sds_controller_is_start_complete(
784f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
785f11c7f63SJim Harris );
786f11c7f63SJim Harris 
787f11c7f63SJim Harris SCI_STATUS scic_sds_controller_start_next_phy(
788f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
789f11c7f63SJim Harris );
790f11c7f63SJim Harris 
791f11c7f63SJim Harris SCI_STATUS scic_sds_controller_stop_phys(
792f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
793f11c7f63SJim Harris );
794f11c7f63SJim Harris 
795f11c7f63SJim Harris SCI_STATUS scic_sds_controller_stop_ports(
796f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
797f11c7f63SJim Harris );
798f11c7f63SJim Harris 
799f11c7f63SJim Harris SCI_STATUS scic_sds_controller_stop_devices(
800f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
801f11c7f63SJim Harris );
802f11c7f63SJim Harris 
803f11c7f63SJim Harris void scic_sds_controller_copy_task_context(
804f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T   *this_controller,
805f11c7f63SJim Harris    struct SCIC_SDS_REQUEST *this_request
806f11c7f63SJim Harris );
807f11c7f63SJim Harris 
808f11c7f63SJim Harris void scic_sds_controller_timeout_handler(
809f11c7f63SJim Harris    SCI_CONTROLLER_HANDLE_T controller
810f11c7f63SJim Harris );
811f11c7f63SJim Harris 
812f11c7f63SJim Harris void scic_sds_controller_initialize_power_control(
813f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
814f11c7f63SJim Harris );
815f11c7f63SJim Harris 
816f11c7f63SJim Harris void scic_sds_controller_register_setup(
817f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
818f11c7f63SJim Harris );
819f11c7f63SJim Harris 
820f11c7f63SJim Harris void scic_sds_controller_reset_hardware(
821f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T * this_controller
822f11c7f63SJim Harris );
823f11c7f63SJim Harris 
824f11c7f63SJim Harris #ifdef ARLINGTON_BUILD
825f11c7f63SJim Harris void scic_sds_controller_lex_atux_initialization(
826f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
827f11c7f63SJim Harris );
828f11c7f63SJim Harris 
829f11c7f63SJim Harris void scic_sds_controller_enable_chipwatch(
830f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
831f11c7f63SJim Harris );
832f11c7f63SJim Harris #endif // ARLINGTON_BUILD
833f11c7f63SJim Harris 
834f11c7f63SJim Harris void scic_sds_controller_build_memory_descriptor_table(
835f11c7f63SJim Harris    SCIC_SDS_CONTROLLER_T *this_controller
836f11c7f63SJim Harris );
837f11c7f63SJim Harris 
838f11c7f63SJim Harris #ifdef __cplusplus
839f11c7f63SJim Harris }
840f11c7f63SJim Harris #endif // __cplusplus
841f11c7f63SJim Harris 
842f11c7f63SJim Harris #endif // _SCIC_SDS_CONTROLLER_H_
843