1f11c7f63SJim Harris /*-
2*718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3*718cf2ccSPedro F. Giffuni *
4f11c7f63SJim Harris * This file is provided under a dual BSD/GPLv2 license. When using or
5f11c7f63SJim Harris * redistributing this file, you may do so under either license.
6f11c7f63SJim Harris *
7f11c7f63SJim Harris * GPL LICENSE SUMMARY
8f11c7f63SJim Harris *
9f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10f11c7f63SJim Harris *
11f11c7f63SJim Harris * This program is free software; you can redistribute it and/or modify
12f11c7f63SJim Harris * it under the terms of version 2 of the GNU General Public License as
13f11c7f63SJim Harris * published by the Free Software Foundation.
14f11c7f63SJim Harris *
15f11c7f63SJim Harris * This program is distributed in the hope that it will be useful, but
16f11c7f63SJim Harris * WITHOUT ANY WARRANTY; without even the implied warranty of
17f11c7f63SJim Harris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18f11c7f63SJim Harris * General Public License for more details.
19f11c7f63SJim Harris *
20f11c7f63SJim Harris * You should have received a copy of the GNU General Public License
21f11c7f63SJim Harris * along with this program; if not, write to the Free Software
22f11c7f63SJim Harris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23f11c7f63SJim Harris * The full GNU General Public License is included in this distribution
24f11c7f63SJim Harris * in the file called LICENSE.GPL.
25f11c7f63SJim Harris *
26f11c7f63SJim Harris * BSD LICENSE
27f11c7f63SJim Harris *
28f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29f11c7f63SJim Harris * All rights reserved.
30f11c7f63SJim Harris *
31f11c7f63SJim Harris * Redistribution and use in source and binary forms, with or without
32f11c7f63SJim Harris * modification, are permitted provided that the following conditions
33f11c7f63SJim Harris * are met:
34f11c7f63SJim Harris *
35f11c7f63SJim Harris * * Redistributions of source code must retain the above copyright
36f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer.
37f11c7f63SJim Harris * * Redistributions in binary form must reproduce the above copyright
38f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer in
39f11c7f63SJim Harris * the documentation and/or other materials provided with the
40f11c7f63SJim Harris * distribution.
41f11c7f63SJim Harris *
42f11c7f63SJim Harris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43f11c7f63SJim Harris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44f11c7f63SJim Harris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45f11c7f63SJim Harris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46f11c7f63SJim Harris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47f11c7f63SJim Harris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48f11c7f63SJim Harris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49f11c7f63SJim Harris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50f11c7f63SJim Harris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51f11c7f63SJim Harris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52f11c7f63SJim Harris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53f11c7f63SJim Harris */
54f11c7f63SJim Harris
55f11c7f63SJim Harris #include <sys/cdefs.h>
56f11c7f63SJim Harris /**
57f11c7f63SJim Harris * @file
58f11c7f63SJim Harris *
59f11c7f63SJim Harris * @brief This file contains the implementation of the SCIC_SDS_PHY public and
60f11c7f63SJim Harris * protected methods.
61f11c7f63SJim Harris */
62f11c7f63SJim Harris
63f11c7f63SJim Harris #include <dev/isci/scil/scic_user_callback.h>
64f11c7f63SJim Harris #include <dev/isci/scil/scic_phy.h>
65f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_phy.h>
66f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_port.h>
67f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_controller_registers.h>
68f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_phy_registers.h>
69f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_logger.h>
70f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_remote_node_context.h>
71f11c7f63SJim Harris #include <dev/isci/scil/sci_util.h>
72f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_controller.h>
73f11c7f63SJim Harris #include <dev/isci/scil/scu_event_codes.h>
74f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state.h>
75f11c7f63SJim Harris #include <dev/isci/scil/intel_ata.h>
76f11c7f63SJim Harris #include <dev/isci/scil/intel_sata.h>
77f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state_machine.h>
78f11c7f63SJim Harris #include <dev/isci/scil/scic_sds_port_registers.h>
79f11c7f63SJim Harris
80f11c7f63SJim Harris #define SCIC_SDS_PHY_MIN_TIMER_COUNT (SCI_MAX_PHYS)
81f11c7f63SJim Harris #define SCIC_SDS_PHY_MAX_TIMER_COUNT (SCI_MAX_PHYS)
82f11c7f63SJim Harris
83f11c7f63SJim Harris // Maximum arbitration wait time in micro-seconds
84f11c7f63SJim Harris #define SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME (700)
85f11c7f63SJim Harris
86f11c7f63SJim Harris #define AFE_REGISTER_WRITE_DELAY 10
87f11c7f63SJim Harris
88f11c7f63SJim Harris //*****************************************************************************
89f11c7f63SJim Harris //* SCIC SDS PHY Internal Methods
90f11c7f63SJim Harris //*****************************************************************************
91f11c7f63SJim Harris
92f11c7f63SJim Harris /**
93f11c7f63SJim Harris * @brief This method will initialize the phy transport layer registers
94f11c7f63SJim Harris *
95f11c7f63SJim Harris * @param[in] this_phy
96f11c7f63SJim Harris * @param[in] transport_layer_registers
97f11c7f63SJim Harris *
98f11c7f63SJim Harris * @return SCI_STATUS
99f11c7f63SJim Harris */
100f11c7f63SJim Harris static
scic_sds_phy_transport_layer_initialization(SCIC_SDS_PHY_T * this_phy,SCU_TRANSPORT_LAYER_REGISTERS_T * transport_layer_registers)101f11c7f63SJim Harris SCI_STATUS scic_sds_phy_transport_layer_initialization(
102f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
103f11c7f63SJim Harris SCU_TRANSPORT_LAYER_REGISTERS_T *transport_layer_registers
104f11c7f63SJim Harris )
105f11c7f63SJim Harris {
106f11c7f63SJim Harris U32 tl_control;
107f11c7f63SJim Harris
108f11c7f63SJim Harris SCIC_LOG_TRACE((
109f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
110f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
111f11c7f63SJim Harris "scic_sds_phy_link_layer_initialization(this_phy:0x%x, link_layer_registers:0x%x)\n",
112f11c7f63SJim Harris this_phy, transport_layer_registers
113f11c7f63SJim Harris ));
114f11c7f63SJim Harris
115f11c7f63SJim Harris this_phy->transport_layer_registers = transport_layer_registers;
116f11c7f63SJim Harris
117f11c7f63SJim Harris SCU_STPTLDARNI_WRITE(this_phy, SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX);
118f11c7f63SJim Harris
119f11c7f63SJim Harris // Hardware team recommends that we enable the STP prefetch for all transports
120f11c7f63SJim Harris tl_control = SCU_TLCR_READ(this_phy);
121f11c7f63SJim Harris tl_control |= SCU_TLCR_GEN_BIT(STP_WRITE_DATA_PREFETCH);
122f11c7f63SJim Harris SCU_TLCR_WRITE(this_phy, tl_control);
123f11c7f63SJim Harris
124f11c7f63SJim Harris return SCI_SUCCESS;
125f11c7f63SJim Harris }
126f11c7f63SJim Harris
127f11c7f63SJim Harris /**
128f11c7f63SJim Harris * @brief This method will initialize the phy link layer registers
129f11c7f63SJim Harris *
130f11c7f63SJim Harris * @param[in] this_phy
131f11c7f63SJim Harris * @param[in] link_layer_registers
132f11c7f63SJim Harris *
133f11c7f63SJim Harris * @return SCI_STATUS
134f11c7f63SJim Harris */
135f11c7f63SJim Harris static
scic_sds_phy_link_layer_initialization(SCIC_SDS_PHY_T * this_phy,SCU_LINK_LAYER_REGISTERS_T * link_layer_registers)136f11c7f63SJim Harris SCI_STATUS scic_sds_phy_link_layer_initialization(
137f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
138f11c7f63SJim Harris SCU_LINK_LAYER_REGISTERS_T *link_layer_registers
139f11c7f63SJim Harris )
140f11c7f63SJim Harris {
141f11c7f63SJim Harris U32 phy_configuration;
142f11c7f63SJim Harris SAS_CAPABILITIES_T phy_capabilities;
143f11c7f63SJim Harris U32 parity_check = 0;
144f11c7f63SJim Harris U32 parity_count = 0;
145f11c7f63SJim Harris U32 link_layer_control;
146f11c7f63SJim Harris U32 phy_timer_timeout_values;
147f11c7f63SJim Harris U32 clksm_value = 0;
148f11c7f63SJim Harris
149f11c7f63SJim Harris SCIC_LOG_TRACE((
150f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
151f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
152f11c7f63SJim Harris "scic_sds_phy_link_layer_initialization(this_phy:0x%x, link_layer_registers:0x%x)\n",
153f11c7f63SJim Harris this_phy, link_layer_registers
154f11c7f63SJim Harris ));
155f11c7f63SJim Harris
156f11c7f63SJim Harris this_phy->link_layer_registers = link_layer_registers;
157f11c7f63SJim Harris
158f11c7f63SJim Harris // Set our IDENTIFY frame data
159f11c7f63SJim Harris #define SCI_END_DEVICE 0x01
160f11c7f63SJim Harris
161f11c7f63SJim Harris SCU_SAS_TIID_WRITE(
162f11c7f63SJim Harris this_phy,
163f11c7f63SJim Harris ( SCU_SAS_TIID_GEN_BIT(SMP_INITIATOR)
164f11c7f63SJim Harris | SCU_SAS_TIID_GEN_BIT(SSP_INITIATOR)
165f11c7f63SJim Harris | SCU_SAS_TIID_GEN_BIT(STP_INITIATOR)
166f11c7f63SJim Harris | SCU_SAS_TIID_GEN_BIT(DA_SATA_HOST)
167f11c7f63SJim Harris | SCU_SAS_TIID_GEN_VAL(DEVICE_TYPE, SCI_END_DEVICE) )
168f11c7f63SJim Harris );
169f11c7f63SJim Harris
170f11c7f63SJim Harris // Write the device SAS Address
171f11c7f63SJim Harris SCU_SAS_TIDNH_WRITE(this_phy, 0xFEDCBA98);
172f11c7f63SJim Harris SCU_SAS_TIDNL_WRITE(this_phy, this_phy->phy_index);
173f11c7f63SJim Harris
174f11c7f63SJim Harris // Write the source SAS Address
175f11c7f63SJim Harris SCU_SAS_TISSAH_WRITE(
176f11c7f63SJim Harris this_phy,
177f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.phys[
178f11c7f63SJim Harris this_phy->phy_index].sas_address.sci_format.high
179f11c7f63SJim Harris );
180f11c7f63SJim Harris SCU_SAS_TISSAL_WRITE(
181f11c7f63SJim Harris this_phy,
182f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.phys[
183f11c7f63SJim Harris this_phy->phy_index].sas_address.sci_format.low
184f11c7f63SJim Harris );
185f11c7f63SJim Harris
186f11c7f63SJim Harris // Clear and Set the PHY Identifier
187f11c7f63SJim Harris SCU_SAS_TIPID_WRITE(this_phy, 0x00000000);
188f11c7f63SJim Harris SCU_SAS_TIPID_WRITE(this_phy, SCU_SAS_TIPID_GEN_VALUE(ID, this_phy->phy_index));
189f11c7f63SJim Harris
190f11c7f63SJim Harris // Change the initial state of the phy configuration register
191f11c7f63SJim Harris phy_configuration = SCU_SAS_PCFG_READ(this_phy);
192f11c7f63SJim Harris
193f11c7f63SJim Harris // Hold OOB state machine in reset
194f11c7f63SJim Harris phy_configuration |= SCU_SAS_PCFG_GEN_BIT(OOB_RESET);
195f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, phy_configuration);
196f11c7f63SJim Harris
197f11c7f63SJim Harris // Configure the SNW capabilities
198f11c7f63SJim Harris phy_capabilities.u.all = 0;
199f11c7f63SJim Harris phy_capabilities.u.bits.start = 1;
200f11c7f63SJim Harris phy_capabilities.u.bits.gen3_without_ssc_supported = 1;
201f11c7f63SJim Harris phy_capabilities.u.bits.gen2_without_ssc_supported = 1;
202f11c7f63SJim Harris phy_capabilities.u.bits.gen1_without_ssc_supported = 1;
203f11c7f63SJim Harris
204f11c7f63SJim Harris /*
205f11c7f63SJim Harris * Set up SSC settings according to version of OEM Parameters.
206f11c7f63SJim Harris */
207f11c7f63SJim Harris {
208f11c7f63SJim Harris U8 header_version, enable_sata, enable_sas,
209f11c7f63SJim Harris sata_spread, sas_type, sas_spread;
210f11c7f63SJim Harris OEM_SSC_PARAMETERS_T ssc;
211f11c7f63SJim Harris
212f11c7f63SJim Harris header_version = this_phy->owning_port->owning_controller->
213f11c7f63SJim Harris oem_parameters_version;
214f11c7f63SJim Harris
215f11c7f63SJim Harris ssc.bf.ssc_sata_tx_spread_level =
216f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.controller.ssc_sata_tx_spread_level;
217f11c7f63SJim Harris ssc.bf.ssc_sas_tx_spread_level =
218f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.controller.ssc_sas_tx_spread_level;
219f11c7f63SJim Harris ssc.bf.ssc_sas_tx_type =
220f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.controller.ssc_sas_tx_type;
221f11c7f63SJim Harris enable_sata = enable_sas = sata_spread = sas_type = sas_spread = 0;
222f11c7f63SJim Harris
223f11c7f63SJim Harris if (header_version == SCI_OEM_PARAM_VER_1_0)
224f11c7f63SJim Harris {
225f11c7f63SJim Harris /*
226f11c7f63SJim Harris * Version 1.0 is merely turning SSC on to default values.;
227f11c7f63SJim Harris */
228f11c7f63SJim Harris if (ssc.do_enable_ssc != 0)
229f11c7f63SJim Harris {
230f11c7f63SJim Harris enable_sas = enable_sata = TRUE;
231f11c7f63SJim Harris sas_type = 0x0; // Downspreading
232f11c7f63SJim Harris sata_spread = 0x2; // +0 to -1419 PPM
233f11c7f63SJim Harris sas_spread = 0x2; // +0 to -1419 PPM
234f11c7f63SJim Harris }
235f11c7f63SJim Harris }
236f11c7f63SJim Harris else // header_version >= SCI_OEM_PARAM_VER_1_1
237f11c7f63SJim Harris {
238f11c7f63SJim Harris /*
239f11c7f63SJim Harris * Version 1.1 can turn on SAS and SATA independently and
240f11c7f63SJim Harris * specify spread levels. Also can specify spread type for SAS.
241f11c7f63SJim Harris */
242f11c7f63SJim Harris if ((sata_spread = ssc.bf.ssc_sata_tx_spread_level) != 0)
243f11c7f63SJim Harris enable_sata = TRUE; // Downspreading only
244f11c7f63SJim Harris if ((sas_spread = ssc.bf.ssc_sas_tx_spread_level) != 0)
245f11c7f63SJim Harris {
246f11c7f63SJim Harris enable_sas = TRUE;
247f11c7f63SJim Harris sas_type = ssc.bf.ssc_sas_tx_type;
248f11c7f63SJim Harris }
249f11c7f63SJim Harris }
250f11c7f63SJim Harris
251f11c7f63SJim Harris if (enable_sas == TRUE)
252f11c7f63SJim Harris {
253f11c7f63SJim Harris U32 reg_val = scu_afe_register_read(
254f11c7f63SJim Harris this_phy->owning_port->owning_controller,
255f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].
256f11c7f63SJim Harris afe_xcvr_control0);
257f11c7f63SJim Harris reg_val |= (0x00100000 | (((U32)sas_type) << 19));
258f11c7f63SJim Harris scu_afe_register_write(
259f11c7f63SJim Harris this_phy->owning_port->owning_controller,
260f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].afe_xcvr_control0,
261f11c7f63SJim Harris reg_val);
262f11c7f63SJim Harris
263f11c7f63SJim Harris reg_val = scu_afe_register_read(
264f11c7f63SJim Harris this_phy->owning_port->owning_controller,
265f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].
266f11c7f63SJim Harris afe_tx_ssc_control);
267f11c7f63SJim Harris reg_val |= (((U32)(sas_spread)) << 8);
268f11c7f63SJim Harris scu_afe_register_write(
269f11c7f63SJim Harris this_phy->owning_port->owning_controller,
270f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].afe_tx_ssc_control,
271f11c7f63SJim Harris reg_val);
272f11c7f63SJim Harris phy_capabilities.u.bits.gen3_with_ssc_supported = 1;
273f11c7f63SJim Harris phy_capabilities.u.bits.gen2_with_ssc_supported = 1;
274f11c7f63SJim Harris phy_capabilities.u.bits.gen1_with_ssc_supported = 1;
275f11c7f63SJim Harris }
276f11c7f63SJim Harris
277f11c7f63SJim Harris if (enable_sata == TRUE)
278f11c7f63SJim Harris {
279f11c7f63SJim Harris U32 reg_val = scu_afe_register_read(
280f11c7f63SJim Harris this_phy->owning_port->owning_controller,
281f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].
282f11c7f63SJim Harris afe_tx_ssc_control);
283f11c7f63SJim Harris reg_val |= (U32)sata_spread;
284f11c7f63SJim Harris scu_afe_register_write(
285f11c7f63SJim Harris this_phy->owning_port->owning_controller,
286f11c7f63SJim Harris scu_afe_xcvr[this_phy->phy_index].afe_tx_ssc_control,
287f11c7f63SJim Harris reg_val);
288f11c7f63SJim Harris
289f11c7f63SJim Harris reg_val = scu_link_layer_register_read(
290f11c7f63SJim Harris this_phy,
291f11c7f63SJim Harris stp_control);
292f11c7f63SJim Harris reg_val |= (U32)(1 << 12);
293f11c7f63SJim Harris scu_link_layer_register_write(
294f11c7f63SJim Harris this_phy,
295f11c7f63SJim Harris stp_control,
296f11c7f63SJim Harris reg_val);
297f11c7f63SJim Harris }
298f11c7f63SJim Harris }
299f11c7f63SJim Harris
300f11c7f63SJim Harris // The SAS specification indicates that the phy_capabilities that
301f11c7f63SJim Harris // are transmitted shall have an even parity. Calculate the parity.
302f11c7f63SJim Harris parity_check = phy_capabilities.u.all;
303f11c7f63SJim Harris while (parity_check != 0)
304f11c7f63SJim Harris {
305f11c7f63SJim Harris if (parity_check & 0x1)
306f11c7f63SJim Harris parity_count++;
307f11c7f63SJim Harris parity_check >>= 1;
308f11c7f63SJim Harris }
309f11c7f63SJim Harris
310f11c7f63SJim Harris // If parity indicates there are an odd number of bits set, then
311f11c7f63SJim Harris // set the parity bit to 1 in the phy capabilities.
312f11c7f63SJim Harris if ((parity_count % 2) != 0)
313f11c7f63SJim Harris phy_capabilities.u.bits.parity = 1;
314f11c7f63SJim Harris
315f11c7f63SJim Harris SCU_SAS_PHYCAP_WRITE(this_phy, phy_capabilities.u.all);
316f11c7f63SJim Harris
317f11c7f63SJim Harris // Set the enable spinup period but disable the ability to send notify enable spinup
318f11c7f63SJim Harris SCU_SAS_ENSPINUP_WRITE(
319f11c7f63SJim Harris this_phy,
320f11c7f63SJim Harris SCU_ENSPINUP_GEN_VAL(
321f11c7f63SJim Harris COUNT,
322f11c7f63SJim Harris this_phy->owning_port->owning_controller->user_parameters.sds1.
323f11c7f63SJim Harris phys[this_phy->phy_index].notify_enable_spin_up_insertion_frequency
324f11c7f63SJim Harris )
325f11c7f63SJim Harris );
326f11c7f63SJim Harris
327f11c7f63SJim Harris // Write the ALIGN Insertion Ferequency for connected phy and inpendent of connected state
328f11c7f63SJim Harris clksm_value = SCU_ALIGN_INSERTION_FREQUENCY_GEN_VAL (
329f11c7f63SJim Harris CONNECTED,
330f11c7f63SJim Harris this_phy->owning_port->owning_controller->user_parameters.sds1.
331f11c7f63SJim Harris phys[this_phy->phy_index].in_connection_align_insertion_frequency
332f11c7f63SJim Harris );
333f11c7f63SJim Harris
334f11c7f63SJim Harris clksm_value |= SCU_ALIGN_INSERTION_FREQUENCY_GEN_VAL (
335f11c7f63SJim Harris GENERAL,
336f11c7f63SJim Harris this_phy->owning_port->owning_controller->user_parameters.sds1.
337f11c7f63SJim Harris phys[this_phy->phy_index].align_insertion_frequency
338f11c7f63SJim Harris );
339f11c7f63SJim Harris
340f11c7f63SJim Harris SCU_SAS_CLKSM_WRITE ( this_phy, clksm_value);
341f11c7f63SJim Harris
342f11c7f63SJim Harris
343f11c7f63SJim Harris #if defined(PBG_HBA_A0_BUILD) || defined(PBG_HBA_A2_BUILD) || defined(PBG_HBA_BETA_BUILD)
344f11c7f63SJim Harris /// @todo Provide a way to write this register correctly
345f11c7f63SJim Harris scu_link_layer_register_write(this_phy, afe_lookup_table_control, 0x02108421);
346f11c7f63SJim Harris #elif defined(PBG_BUILD)
347f11c7f63SJim Harris if (
348f11c7f63SJim Harris (this_phy->owning_port->owning_controller->pci_revision == SCIC_SDS_PCI_REVISION_C0)
349f11c7f63SJim Harris || (this_phy->owning_port->owning_controller->pci_revision == SCIC_SDS_PCI_REVISION_C1)
350f11c7f63SJim Harris )
351f11c7f63SJim Harris {
352f11c7f63SJim Harris scu_link_layer_register_write(this_phy, afe_lookup_table_control, 0x04210400);
353f11c7f63SJim Harris scu_link_layer_register_write(this_phy, sas_primitive_timeout, 0x20A7C05);
354f11c7f63SJim Harris }
355f11c7f63SJim Harris else
356f11c7f63SJim Harris {
357f11c7f63SJim Harris scu_link_layer_register_write(this_phy, afe_lookup_table_control, 0x02108421);
358f11c7f63SJim Harris }
359f11c7f63SJim Harris #else
360f11c7f63SJim Harris /// @todo Provide a way to write this register correctly
361f11c7f63SJim Harris scu_link_layer_register_write(this_phy, afe_lookup_table_control, 0x0e739ce7);
362f11c7f63SJim Harris #endif
363f11c7f63SJim Harris
364f11c7f63SJim Harris link_layer_control = SCU_SAS_LLCTL_GEN_VAL(
365f11c7f63SJim Harris NO_OUTBOUND_TASK_TIMEOUT,
366f11c7f63SJim Harris (U8) this_phy->owning_port->owning_controller->
367f11c7f63SJim Harris user_parameters.sds1.no_outbound_task_timeout
368f11c7f63SJim Harris );
369f11c7f63SJim Harris
370f11c7f63SJim Harris #if PHY_MAX_LINK_SPEED_GENERATION == SCIC_SDS_PARM_GEN1_SPEED
371f11c7f63SJim Harris #define COMPILED_MAX_LINK_RATE SCU_SAS_LINK_LAYER_CONTROL_MAX_LINK_RATE_GEN1
372f11c7f63SJim Harris #elif PHY_MAX_LINK_SPEED_GENERATION == SCIC_SDS_PARM_GEN2_SPEED
373f11c7f63SJim Harris #define COMPILED_MAX_LINK_RATE SCU_SAS_LINK_LAYER_CONTROL_MAX_LINK_RATE_GEN2
374f11c7f63SJim Harris #else
375f11c7f63SJim Harris #define COMPILED_MAX_LINK_RATE SCU_SAS_LINK_LAYER_CONTROL_MAX_LINK_RATE_GEN3
376f11c7f63SJim Harris #endif // PHY_MAX_LINK_SPEED_GENERATION
377f11c7f63SJim Harris
378f11c7f63SJim Harris if (this_phy->owning_port->owning_controller->user_parameters.sds1.
379f11c7f63SJim Harris phys[this_phy->phy_index].max_speed_generation == SCIC_SDS_PARM_GEN3_SPEED)
380f11c7f63SJim Harris {
381f11c7f63SJim Harris link_layer_control |= SCU_SAS_LLCTL_GEN_VAL(
382f11c7f63SJim Harris MAX_LINK_RATE, COMPILED_MAX_LINK_RATE
383f11c7f63SJim Harris );
384f11c7f63SJim Harris }
385f11c7f63SJim Harris else if (this_phy->owning_port->owning_controller->user_parameters.sds1.
386f11c7f63SJim Harris phys[this_phy->phy_index].max_speed_generation == SCIC_SDS_PARM_GEN2_SPEED)
387f11c7f63SJim Harris {
388f11c7f63SJim Harris link_layer_control |= SCU_SAS_LLCTL_GEN_VAL(
389f11c7f63SJim Harris MAX_LINK_RATE,
390f11c7f63SJim Harris MIN(
391f11c7f63SJim Harris SCU_SAS_LINK_LAYER_CONTROL_MAX_LINK_RATE_GEN2,
392f11c7f63SJim Harris COMPILED_MAX_LINK_RATE)
393f11c7f63SJim Harris );
394f11c7f63SJim Harris }
395f11c7f63SJim Harris else
396f11c7f63SJim Harris {
397f11c7f63SJim Harris link_layer_control |= SCU_SAS_LLCTL_GEN_VAL(
398f11c7f63SJim Harris MAX_LINK_RATE,
399f11c7f63SJim Harris MIN(
400f11c7f63SJim Harris SCU_SAS_LINK_LAYER_CONTROL_MAX_LINK_RATE_GEN1,
401f11c7f63SJim Harris COMPILED_MAX_LINK_RATE)
402f11c7f63SJim Harris );
403f11c7f63SJim Harris }
404f11c7f63SJim Harris
405f11c7f63SJim Harris scu_link_layer_register_write(
406f11c7f63SJim Harris this_phy, link_layer_control, link_layer_control
407f11c7f63SJim Harris );
408f11c7f63SJim Harris
409f11c7f63SJim Harris phy_timer_timeout_values = scu_link_layer_register_read(
410f11c7f63SJim Harris this_phy,
411f11c7f63SJim Harris phy_timer_timeout_values
412f11c7f63SJim Harris );
413f11c7f63SJim Harris
414f11c7f63SJim Harris // Clear the default 0x36 (54us) RATE_CHANGE timeout value.
415f11c7f63SJim Harris phy_timer_timeout_values &= ~SCU_SAS_PHYTOV_GEN_VAL(RATE_CHANGE, 0xFF);
416f11c7f63SJim Harris
417f11c7f63SJim Harris // Set RATE_CHANGE timeout value to 0x3B (59us). This ensures SCU can
418f11c7f63SJim Harris // lock with 3Gb drive when SCU max rate is set to 1.5Gb.
419f11c7f63SJim Harris phy_timer_timeout_values |= SCU_SAS_PHYTOV_GEN_VAL(RATE_CHANGE, 0x3B);
420f11c7f63SJim Harris
421f11c7f63SJim Harris scu_link_layer_register_write(
422f11c7f63SJim Harris this_phy, phy_timer_timeout_values, phy_timer_timeout_values
423f11c7f63SJim Harris );
424f11c7f63SJim Harris
425f11c7f63SJim Harris // Program the max ARB time for the PHY to 700us so we inter-operate with
426f11c7f63SJim Harris // the PMC expander which shuts down PHYs if the expander PHY generates too
427f11c7f63SJim Harris // many breaks. This time value will guarantee that the initiator PHY will
428f11c7f63SJim Harris // generate the break.
429f11c7f63SJim Harris #if defined(PBG_HBA_A0_BUILD) || defined(PBG_HBA_A2_BUILD)
430f11c7f63SJim Harris scu_link_layer_register_write(
431f11c7f63SJim Harris this_phy,
432f11c7f63SJim Harris maximum_arbitration_wait_timer_timeout,
433f11c7f63SJim Harris SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME
434f11c7f63SJim Harris );
435f11c7f63SJim Harris #endif // defined(PBG_HBA_A0_BUILD) || defined(PBG_HBA_A2_BUILD)
436f11c7f63SJim Harris
437f11c7f63SJim Harris // Disable the link layer hang detection timer
438f11c7f63SJim Harris scu_link_layer_register_write(
439f11c7f63SJim Harris this_phy, link_layer_hang_detection_timeout, 0x00000000
440f11c7f63SJim Harris );
441f11c7f63SJim Harris
442f11c7f63SJim Harris // We can exit the initial state to the stopped state
443f11c7f63SJim Harris sci_base_state_machine_change_state(
444f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
445f11c7f63SJim Harris SCI_BASE_PHY_STATE_STOPPED
446f11c7f63SJim Harris );
447f11c7f63SJim Harris
448f11c7f63SJim Harris return SCI_SUCCESS;
449f11c7f63SJim Harris }
450f11c7f63SJim Harris
451f11c7f63SJim Harris /**
452f11c7f63SJim Harris * This function will handle the sata SIGNATURE FIS timeout condition. It
453f11c7f63SJim Harris * will restart the starting substate machine since we dont know what has
454f11c7f63SJim Harris * actually happening.
455f11c7f63SJim Harris *
456f11c7f63SJim Harris * @param[in] cookie This object is cast to the SCIC_SDS_PHY_T object.
457f11c7f63SJim Harris *
458f11c7f63SJim Harris * @return none
459f11c7f63SJim Harris */
scic_sds_phy_sata_timeout(SCI_OBJECT_HANDLE_T cookie)460f11c7f63SJim Harris void scic_sds_phy_sata_timeout( SCI_OBJECT_HANDLE_T cookie)
461f11c7f63SJim Harris {
462f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy = (SCIC_SDS_PHY_T *)cookie;
463f11c7f63SJim Harris
464f11c7f63SJim Harris SCIC_LOG_INFO((
465f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
466f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
467f11c7f63SJim Harris "SCIC SDS Phy 0x%x did not receive signature fis before timeout.\n",
468f11c7f63SJim Harris this_phy
469f11c7f63SJim Harris ));
470f11c7f63SJim Harris
471f11c7f63SJim Harris sci_base_state_machine_stop(
472f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy));
473f11c7f63SJim Harris
474f11c7f63SJim Harris sci_base_state_machine_change_state(
475f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
476f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
477f11c7f63SJim Harris );
478f11c7f63SJim Harris }
479f11c7f63SJim Harris
480f11c7f63SJim Harris //*****************************************************************************
481f11c7f63SJim Harris //* SCIC SDS PHY External Methods
482f11c7f63SJim Harris //*****************************************************************************
483f11c7f63SJim Harris
484f11c7f63SJim Harris /**
485f11c7f63SJim Harris * @brief This method returns the object size for a phy object.
486f11c7f63SJim Harris *
487f11c7f63SJim Harris * @return U32
488f11c7f63SJim Harris */
scic_sds_phy_get_object_size(void)489f11c7f63SJim Harris U32 scic_sds_phy_get_object_size(void)
490f11c7f63SJim Harris {
491f11c7f63SJim Harris return sizeof(SCIC_SDS_PHY_T);
492f11c7f63SJim Harris }
493f11c7f63SJim Harris
494f11c7f63SJim Harris /**
495f11c7f63SJim Harris * @brief This method returns the minimum number of timers required for a
496f11c7f63SJim Harris * phy object.
497f11c7f63SJim Harris *
498f11c7f63SJim Harris * @return U32
499f11c7f63SJim Harris */
scic_sds_phy_get_min_timer_count(void)500f11c7f63SJim Harris U32 scic_sds_phy_get_min_timer_count(void)
501f11c7f63SJim Harris {
502f11c7f63SJim Harris return SCIC_SDS_PHY_MIN_TIMER_COUNT;
503f11c7f63SJim Harris }
504f11c7f63SJim Harris
505f11c7f63SJim Harris /**
506f11c7f63SJim Harris * @brief This method returns the maximum number of timers required for a
507f11c7f63SJim Harris * phy object.
508f11c7f63SJim Harris *
509f11c7f63SJim Harris * @return U32
510f11c7f63SJim Harris */
scic_sds_phy_get_max_timer_count(void)511f11c7f63SJim Harris U32 scic_sds_phy_get_max_timer_count(void)
512f11c7f63SJim Harris {
513f11c7f63SJim Harris return SCIC_SDS_PHY_MAX_TIMER_COUNT;
514f11c7f63SJim Harris }
515f11c7f63SJim Harris
516f11c7f63SJim Harris #ifdef SCI_LOGGING
517f11c7f63SJim Harris static
scic_sds_phy_initialize_state_logging(SCIC_SDS_PHY_T * this_phy)518f11c7f63SJim Harris void scic_sds_phy_initialize_state_logging(
519f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
520f11c7f63SJim Harris )
521f11c7f63SJim Harris {
522f11c7f63SJim Harris sci_base_state_machine_logger_initialize(
523f11c7f63SJim Harris &this_phy->parent.state_machine_logger,
524f11c7f63SJim Harris &this_phy->parent.state_machine,
525f11c7f63SJim Harris &this_phy->parent.parent,
526f11c7f63SJim Harris scic_cb_logger_log_states,
527f11c7f63SJim Harris "SCIC_SDS_PHY_T", "base state machine",
528f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY
529f11c7f63SJim Harris );
530f11c7f63SJim Harris
531f11c7f63SJim Harris sci_base_state_machine_logger_initialize(
532f11c7f63SJim Harris &this_phy->starting_substate_machine_logger,
533f11c7f63SJim Harris &this_phy->starting_substate_machine,
534f11c7f63SJim Harris &this_phy->parent.parent,
535f11c7f63SJim Harris scic_cb_logger_log_states,
536f11c7f63SJim Harris "SCIC_SDS_PHY_T", "starting substate machine",
537f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY
538f11c7f63SJim Harris );
539f11c7f63SJim Harris }
540f11c7f63SJim Harris #endif // SCI_LOGGING
541f11c7f63SJim Harris
542f11c7f63SJim Harris #ifdef SCIC_DEBUG_ENABLED
543f11c7f63SJim Harris /**
544f11c7f63SJim Harris * Debug code to record the state transitions in the phy
545f11c7f63SJim Harris *
546f11c7f63SJim Harris * @param our_observer
547f11c7f63SJim Harris * @param the_state_machine
548f11c7f63SJim Harris */
scic_sds_phy_observe_state_change(SCI_BASE_OBSERVER_T * our_observer,SCI_BASE_SUBJECT_T * the_subject)549f11c7f63SJim Harris void scic_sds_phy_observe_state_change(
550f11c7f63SJim Harris SCI_BASE_OBSERVER_T * our_observer,
551f11c7f63SJim Harris SCI_BASE_SUBJECT_T * the_subject
552f11c7f63SJim Harris )
553f11c7f63SJim Harris {
554f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
555f11c7f63SJim Harris SCI_BASE_STATE_MACHINE_T *the_state_machine;
556f11c7f63SJim Harris
557f11c7f63SJim Harris U8 transition_requestor;
558f11c7f63SJim Harris U32 base_state_id;
559f11c7f63SJim Harris U32 starting_substate_id;
560f11c7f63SJim Harris
561f11c7f63SJim Harris the_state_machine = (SCI_BASE_STATE_MACHINE_T *)the_subject;
562f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)the_state_machine->state_machine_owner;
563f11c7f63SJim Harris
564f11c7f63SJim Harris if (the_state_machine == &this_phy->parent.state_machine)
565f11c7f63SJim Harris {
566f11c7f63SJim Harris transition_requestor = 0x01;
567f11c7f63SJim Harris }
568f11c7f63SJim Harris else if (the_state_machine == &this_phy->starting_substate_machine)
569f11c7f63SJim Harris {
570f11c7f63SJim Harris transition_requestor = 0x02;
571f11c7f63SJim Harris }
572f11c7f63SJim Harris else
573f11c7f63SJim Harris {
574f11c7f63SJim Harris transition_requestor = 0xFF;
575f11c7f63SJim Harris }
576f11c7f63SJim Harris
577f11c7f63SJim Harris base_state_id =
578f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine);
579f11c7f63SJim Harris starting_substate_id =
580f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->starting_substate_machine);
581f11c7f63SJim Harris
582f11c7f63SJim Harris this_phy->state_record.state_transition_table[
583f11c7f63SJim Harris this_phy->state_record.index++] = ( (transition_requestor << 24)
584f11c7f63SJim Harris | ((U8)base_state_id << 8)
585f11c7f63SJim Harris | ((U8)starting_substate_id));
586f11c7f63SJim Harris
587f11c7f63SJim Harris this_phy->state_record.index =
588f11c7f63SJim Harris this_phy->state_record.index & (MAX_STATE_TRANSITION_RECORD - 1);
589f11c7f63SJim Harris
590f11c7f63SJim Harris }
591f11c7f63SJim Harris #endif // SCIC_DEBUG_ENABLED
592f11c7f63SJim Harris
593f11c7f63SJim Harris #ifdef SCIC_DEBUG_ENABLED
594f11c7f63SJim Harris /**
595f11c7f63SJim Harris * This method initializes the state record debug information for the phy
596f11c7f63SJim Harris * object.
597f11c7f63SJim Harris *
598f11c7f63SJim Harris * @pre The state machines for the phy object must be constructed before this
599f11c7f63SJim Harris * function is called.
600f11c7f63SJim Harris *
601f11c7f63SJim Harris * @param this_phy The phy which is being initialized.
602f11c7f63SJim Harris */
scic_sds_phy_initialize_state_recording(SCIC_SDS_PHY_T * this_phy)603f11c7f63SJim Harris void scic_sds_phy_initialize_state_recording(
604f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
605f11c7f63SJim Harris )
606f11c7f63SJim Harris {
607f11c7f63SJim Harris this_phy->state_record.index = 0;
608f11c7f63SJim Harris
609f11c7f63SJim Harris sci_base_observer_initialize(
610f11c7f63SJim Harris &this_phy->state_record.base_state_observer,
611f11c7f63SJim Harris scic_sds_phy_observe_state_change,
612f11c7f63SJim Harris &this_phy->parent.state_machine.parent
613f11c7f63SJim Harris );
614f11c7f63SJim Harris
615f11c7f63SJim Harris sci_base_observer_initialize(
616f11c7f63SJim Harris &this_phy->state_record.starting_state_observer,
617f11c7f63SJim Harris scic_sds_phy_observe_state_change,
618f11c7f63SJim Harris &this_phy->starting_substate_machine.parent
619f11c7f63SJim Harris );
620f11c7f63SJim Harris }
621f11c7f63SJim Harris #endif // SCIC_DEBUG_ENABLED
622f11c7f63SJim Harris
623f11c7f63SJim Harris /**
624f11c7f63SJim Harris * @brief This method will construct the SCIC_SDS_PHY object
625f11c7f63SJim Harris *
626f11c7f63SJim Harris * @param[in] this_phy
627f11c7f63SJim Harris * @param[in] owning_port
628f11c7f63SJim Harris * @param[in] phy_index
629f11c7f63SJim Harris *
630f11c7f63SJim Harris * @return none
631f11c7f63SJim Harris */
scic_sds_phy_construct(SCIC_SDS_PHY_T * this_phy,SCIC_SDS_PORT_T * owning_port,U8 phy_index)632f11c7f63SJim Harris void scic_sds_phy_construct(
633f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
634f11c7f63SJim Harris SCIC_SDS_PORT_T *owning_port,
635f11c7f63SJim Harris U8 phy_index
636f11c7f63SJim Harris )
637f11c7f63SJim Harris {
638f11c7f63SJim Harris // Call the base constructor first
639f11c7f63SJim Harris // Copy the logger from the port (this could be the dummy port)
640f11c7f63SJim Harris sci_base_phy_construct(
641f11c7f63SJim Harris &this_phy->parent,
642f11c7f63SJim Harris sci_base_object_get_logger(owning_port),
643f11c7f63SJim Harris scic_sds_phy_state_table
644f11c7f63SJim Harris );
645f11c7f63SJim Harris
646f11c7f63SJim Harris // Copy the rest of the input data to our locals
647f11c7f63SJim Harris this_phy->owning_port = owning_port;
648f11c7f63SJim Harris this_phy->phy_index = phy_index;
649f11c7f63SJim Harris this_phy->bcn_received_while_port_unassigned = FALSE;
650f11c7f63SJim Harris this_phy->protocol = SCIC_SDS_PHY_PROTOCOL_UNKNOWN;
651f11c7f63SJim Harris this_phy->link_layer_registers = NULL;
652f11c7f63SJim Harris this_phy->max_negotiated_speed = SCI_SAS_NO_LINK_RATE;
653f11c7f63SJim Harris this_phy->sata_timeout_timer = NULL;
654f11c7f63SJim Harris
655f11c7f63SJim Harris // Clear out the identification buffer data
656f11c7f63SJim Harris memset(&this_phy->phy_type, 0, sizeof(this_phy->phy_type));
657f11c7f63SJim Harris
658f11c7f63SJim Harris // Clear out the error counter data
659f11c7f63SJim Harris memset(this_phy->error_counter, 0, sizeof(this_phy->error_counter));
660f11c7f63SJim Harris
66196240c89SEitan Adler // Initialize the substate machines
662f11c7f63SJim Harris sci_base_state_machine_construct(
663f11c7f63SJim Harris &this_phy->starting_substate_machine,
664f11c7f63SJim Harris &this_phy->parent.parent,
665f11c7f63SJim Harris scic_sds_phy_starting_substates,
666f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL
667f11c7f63SJim Harris );
668f11c7f63SJim Harris
669f11c7f63SJim Harris #ifdef SCI_LOGGING
670f11c7f63SJim Harris scic_sds_phy_initialize_state_logging(this_phy);
671f11c7f63SJim Harris #endif // SCI_LOGGING
672f11c7f63SJim Harris
673f11c7f63SJim Harris #ifdef SCIC_DEBUG_ENABLED
674f11c7f63SJim Harris scic_sds_phy_initialize_state_recording(this_phy);
675f11c7f63SJim Harris #endif // SCIC_DEBUG_ENABLED
676f11c7f63SJim Harris }
677f11c7f63SJim Harris
678f11c7f63SJim Harris /**
679f11c7f63SJim Harris * @brief This method returns the port currently containing this phy.
680f11c7f63SJim Harris * If the phy is currently contained by the dummy port, then
681f11c7f63SJim Harris * the phy is considered to not be part of a port.
682f11c7f63SJim Harris *
683f11c7f63SJim Harris * @param[in] this_phy This parameter specifies the phy for which to
684f11c7f63SJim Harris * retrieve the containing port.
685f11c7f63SJim Harris *
686f11c7f63SJim Harris * @return This method returns a handle to a port that contains
687f11c7f63SJim Harris * the supplied phy.
688f11c7f63SJim Harris * @retval SCI_INVALID_HANDLE This value is returned if the phy is not
689f11c7f63SJim Harris * part of a real port (i.e. it's contained in the dummy port).
690f11c7f63SJim Harris * @retval !SCI_INVALID_HANDLE All other values indicate a handle/pointer
691f11c7f63SJim Harris * to the port containing the phy.
692f11c7f63SJim Harris */
scic_sds_phy_get_port(SCIC_SDS_PHY_T * this_phy)693f11c7f63SJim Harris SCI_PORT_HANDLE_T scic_sds_phy_get_port(
694f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
695f11c7f63SJim Harris )
696f11c7f63SJim Harris {
697f11c7f63SJim Harris SCIC_LOG_TRACE((
698f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
699f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
700f11c7f63SJim Harris "scic_phy_get_port(0x%x) enter\n",
701f11c7f63SJim Harris this_phy
702f11c7f63SJim Harris ));
703f11c7f63SJim Harris
704f11c7f63SJim Harris if (scic_sds_port_get_index(this_phy->owning_port) == SCIC_SDS_DUMMY_PORT)
705f11c7f63SJim Harris return SCI_INVALID_HANDLE;
706f11c7f63SJim Harris
707f11c7f63SJim Harris return this_phy->owning_port;
708f11c7f63SJim Harris }
709f11c7f63SJim Harris
710f11c7f63SJim Harris /**
711f11c7f63SJim Harris * @brief This method will assign a port to the phy object.
712f11c7f63SJim Harris *
713f11c7f63SJim Harris * @param[in, out] this_phy This parameter specifies the phy for which
714f11c7f63SJim Harris * to assign a port object.
715f11c7f63SJim Harris * @param[in] the_port This parameter is the port to assing to the phy.
716f11c7f63SJim Harris */
scic_sds_phy_set_port(SCIC_SDS_PHY_T * this_phy,SCIC_SDS_PORT_T * the_port)717f11c7f63SJim Harris void scic_sds_phy_set_port(
718f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy,
719f11c7f63SJim Harris SCIC_SDS_PORT_T * the_port
720f11c7f63SJim Harris )
721f11c7f63SJim Harris {
722f11c7f63SJim Harris this_phy->owning_port = the_port;
723f11c7f63SJim Harris
724f11c7f63SJim Harris if (this_phy->bcn_received_while_port_unassigned)
725f11c7f63SJim Harris {
726f11c7f63SJim Harris this_phy->bcn_received_while_port_unassigned = FALSE;
727f11c7f63SJim Harris scic_sds_port_broadcast_change_received(this_phy->owning_port, this_phy);
728f11c7f63SJim Harris }
729f11c7f63SJim Harris }
730f11c7f63SJim Harris
731f11c7f63SJim Harris /**
732f11c7f63SJim Harris * @brief This method will initialize the constructed phy
733f11c7f63SJim Harris *
734f11c7f63SJim Harris * @param[in] this_phy
735f11c7f63SJim Harris * @param[in] link_layer_registers
736f11c7f63SJim Harris *
737f11c7f63SJim Harris * @return SCI_STATUS
738f11c7f63SJim Harris */
scic_sds_phy_initialize(SCIC_SDS_PHY_T * this_phy,void * transport_layer_registers,SCU_LINK_LAYER_REGISTERS_T * link_layer_registers)739f11c7f63SJim Harris SCI_STATUS scic_sds_phy_initialize(
740f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
741f11c7f63SJim Harris void *transport_layer_registers,
742f11c7f63SJim Harris SCU_LINK_LAYER_REGISTERS_T *link_layer_registers
743f11c7f63SJim Harris )
744f11c7f63SJim Harris {
745f11c7f63SJim Harris SCIC_LOG_TRACE((
746f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
747f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
748f11c7f63SJim Harris "scic_sds_phy_initialize(this_phy:0x%x, link_layer_registers:0x%x)\n",
749f11c7f63SJim Harris this_phy, link_layer_registers
750f11c7f63SJim Harris ));
751f11c7f63SJim Harris
752b790c193SPedro F. Giffuni // Perform the initialization of the TL hardware
753f11c7f63SJim Harris scic_sds_phy_transport_layer_initialization(this_phy, transport_layer_registers);
754f11c7f63SJim Harris
755f11c7f63SJim Harris // Perofrm the initialization of the PE hardware
756f11c7f63SJim Harris scic_sds_phy_link_layer_initialization(this_phy, link_layer_registers);
757f11c7f63SJim Harris
758f11c7f63SJim Harris // There is nothing that needs to be done in this state just
759f11c7f63SJim Harris // transition to the stopped state.
760f11c7f63SJim Harris sci_base_state_machine_change_state(
761f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
762f11c7f63SJim Harris SCI_BASE_PHY_STATE_STOPPED
763f11c7f63SJim Harris );
764f11c7f63SJim Harris
765f11c7f63SJim Harris return SCI_SUCCESS;
766f11c7f63SJim Harris }
767f11c7f63SJim Harris
768f11c7f63SJim Harris /**
769f11c7f63SJim Harris * This method assigns the direct attached device ID for this phy.
770f11c7f63SJim Harris *
771f11c7f63SJim Harris * @param[in] this_phy The phy for which the direct attached device id is to
772f11c7f63SJim Harris * be assigned.
773f11c7f63SJim Harris * @param[in] device_id The direct attached device ID to assign to the phy.
774f11c7f63SJim Harris * This will either be the RNi for the device or an invalid RNi if there
775f11c7f63SJim Harris * is no current device assigned to the phy.
776f11c7f63SJim Harris */
scic_sds_phy_setup_transport(SCIC_SDS_PHY_T * this_phy,U32 device_id)777f11c7f63SJim Harris void scic_sds_phy_setup_transport(
778f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy,
779f11c7f63SJim Harris U32 device_id
780f11c7f63SJim Harris )
781f11c7f63SJim Harris {
782f11c7f63SJim Harris U32 tl_control;
783f11c7f63SJim Harris
784f11c7f63SJim Harris SCU_STPTLDARNI_WRITE(this_phy, device_id);
785f11c7f63SJim Harris
786f11c7f63SJim Harris // The read should guarntee that the first write gets posted
787f11c7f63SJim Harris // before the next write
788f11c7f63SJim Harris tl_control = SCU_TLCR_READ(this_phy);
789f11c7f63SJim Harris tl_control |= SCU_TLCR_GEN_BIT(CLEAR_TCI_NCQ_MAPPING_TABLE);
790f11c7f63SJim Harris SCU_TLCR_WRITE(this_phy, tl_control);
791f11c7f63SJim Harris }
792f11c7f63SJim Harris
793f11c7f63SJim Harris /**
794f11c7f63SJim Harris * This function will perform the register reads/writes to suspend the SCU
795f11c7f63SJim Harris * hardware protocol engine.
796f11c7f63SJim Harris *
797f11c7f63SJim Harris * @param[in,out] this_phy The phy object to be suspended.
798f11c7f63SJim Harris *
799f11c7f63SJim Harris * @return none
800f11c7f63SJim Harris */
scic_sds_phy_suspend(SCIC_SDS_PHY_T * this_phy)801f11c7f63SJim Harris void scic_sds_phy_suspend(
802f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
803f11c7f63SJim Harris )
804f11c7f63SJim Harris {
805f11c7f63SJim Harris U32 scu_sas_pcfg_value;
806f11c7f63SJim Harris
807f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
808f11c7f63SJim Harris scu_sas_pcfg_value |= SCU_SAS_PCFG_GEN_BIT(SUSPEND_PROTOCOL_ENGINE);
809f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
810f11c7f63SJim Harris
811f11c7f63SJim Harris scic_sds_phy_setup_transport(
812f11c7f63SJim Harris this_phy, SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX
813f11c7f63SJim Harris );
814f11c7f63SJim Harris }
815f11c7f63SJim Harris
816f11c7f63SJim Harris /**
817f11c7f63SJim Harris * This function will perform the register reads/writes required to resume the
818f11c7f63SJim Harris * SCU hardware protocol engine.
819f11c7f63SJim Harris *
820f11c7f63SJim Harris * @param[in,out] this_phy The phy object to resume.
821f11c7f63SJim Harris *
822f11c7f63SJim Harris * @return none
823f11c7f63SJim Harris */
scic_sds_phy_resume(SCIC_SDS_PHY_T * this_phy)824f11c7f63SJim Harris void scic_sds_phy_resume(
825f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
826f11c7f63SJim Harris )
827f11c7f63SJim Harris {
828f11c7f63SJim Harris U32 scu_sas_pcfg_value;
829f11c7f63SJim Harris
830f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
831f11c7f63SJim Harris
832f11c7f63SJim Harris scu_sas_pcfg_value &= ~SCU_SAS_PCFG_GEN_BIT(SUSPEND_PROTOCOL_ENGINE);
833f11c7f63SJim Harris
834f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
835f11c7f63SJim Harris }
836f11c7f63SJim Harris
837f11c7f63SJim Harris /**
838f11c7f63SJim Harris * @brief This method returns the local sas address assigned to this phy.
839f11c7f63SJim Harris *
840f11c7f63SJim Harris * @param[in] this_phy This parameter specifies the phy for which
841f11c7f63SJim Harris * to retrieve the local SAS address.
842f11c7f63SJim Harris * @param[out] sas_address This parameter specifies the location into
843f11c7f63SJim Harris * which to copy the local SAS address.
844f11c7f63SJim Harris *
845f11c7f63SJim Harris * @return none
846f11c7f63SJim Harris */
scic_sds_phy_get_sas_address(SCIC_SDS_PHY_T * this_phy,SCI_SAS_ADDRESS_T * sas_address)847f11c7f63SJim Harris void scic_sds_phy_get_sas_address(
848f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
849f11c7f63SJim Harris SCI_SAS_ADDRESS_T *sas_address
850f11c7f63SJim Harris )
851f11c7f63SJim Harris {
852f11c7f63SJim Harris SCIC_LOG_TRACE((
853f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
854f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
855f11c7f63SJim Harris "scic_sds_phy_get_sas_address(this_phy:0x%x, sas_address:0x%x)\n",
856f11c7f63SJim Harris this_phy, sas_address
857f11c7f63SJim Harris ));
858f11c7f63SJim Harris
859f11c7f63SJim Harris sas_address->high = SCU_SAS_TISSAH_READ(this_phy);
860f11c7f63SJim Harris sas_address->low = SCU_SAS_TISSAL_READ(this_phy);
861f11c7f63SJim Harris }
862f11c7f63SJim Harris
863f11c7f63SJim Harris /**
864f11c7f63SJim Harris * @brief This method returns the remote end-point (i.e. attached)
865f11c7f63SJim Harris * sas address assigned to this phy.
866f11c7f63SJim Harris *
867f11c7f63SJim Harris * @param[in] this_phy This parameter specifies the phy for which
868f11c7f63SJim Harris * to retrieve the remote end-point SAS address.
869f11c7f63SJim Harris * @param[out] sas_address This parameter specifies the location into
870f11c7f63SJim Harris * which to copy the remote end-point SAS address.
871f11c7f63SJim Harris *
872f11c7f63SJim Harris * @return none
873f11c7f63SJim Harris */
scic_sds_phy_get_attached_sas_address(SCIC_SDS_PHY_T * this_phy,SCI_SAS_ADDRESS_T * sas_address)874f11c7f63SJim Harris void scic_sds_phy_get_attached_sas_address(
875f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
876f11c7f63SJim Harris SCI_SAS_ADDRESS_T *sas_address
877f11c7f63SJim Harris )
878f11c7f63SJim Harris {
879f11c7f63SJim Harris SCIC_LOG_TRACE((
880f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
881f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
882f11c7f63SJim Harris "scic_sds_phy_get_attached_sas_address(0x%x, 0x%x) enter\n",
883f11c7f63SJim Harris this_phy, sas_address
884f11c7f63SJim Harris ));
885f11c7f63SJim Harris
886f11c7f63SJim Harris sas_address->high
887f11c7f63SJim Harris = this_phy->phy_type.sas.identify_address_frame_buffer.sas_address.high;
888f11c7f63SJim Harris sas_address->low
889f11c7f63SJim Harris = this_phy->phy_type.sas.identify_address_frame_buffer.sas_address.low;
890f11c7f63SJim Harris }
891f11c7f63SJim Harris
892f11c7f63SJim Harris /**
893f11c7f63SJim Harris * @brief This method returns the supported protocols assigned to
894f11c7f63SJim Harris * this phy
895f11c7f63SJim Harris *
896f11c7f63SJim Harris * @param[in] this_phy
897f11c7f63SJim Harris * @param[out] protocols
898f11c7f63SJim Harris */
scic_sds_phy_get_protocols(SCIC_SDS_PHY_T * this_phy,SCI_SAS_IDENTIFY_ADDRESS_FRAME_PROTOCOLS_T * protocols)899f11c7f63SJim Harris void scic_sds_phy_get_protocols(
900f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
901f11c7f63SJim Harris SCI_SAS_IDENTIFY_ADDRESS_FRAME_PROTOCOLS_T * protocols
902f11c7f63SJim Harris )
903f11c7f63SJim Harris {
904f11c7f63SJim Harris U32 tiid_value = SCU_SAS_TIID_READ(this_phy);
905f11c7f63SJim Harris
906f11c7f63SJim Harris //Check each bit of this register. please refer to
907f11c7f63SJim Harris //SAS Transmit Identification Register (SAS_TIID).
908f11c7f63SJim Harris if (tiid_value & 0x2)
909f11c7f63SJim Harris protocols->u.bits.smp_target = 1;
910f11c7f63SJim Harris
911f11c7f63SJim Harris if (tiid_value & 0x4)
912f11c7f63SJim Harris protocols->u.bits.stp_target = 1;
913f11c7f63SJim Harris
914f11c7f63SJim Harris if (tiid_value & 0x8)
915f11c7f63SJim Harris protocols->u.bits.ssp_target = 1;
916f11c7f63SJim Harris
917f11c7f63SJim Harris if (tiid_value & 0x200)
918f11c7f63SJim Harris protocols->u.bits.smp_initiator = 1;
919f11c7f63SJim Harris
920f11c7f63SJim Harris if ((tiid_value & 0x400))
921f11c7f63SJim Harris protocols->u.bits.stp_initiator = 1;
922f11c7f63SJim Harris
923f11c7f63SJim Harris if (tiid_value & 0x800)
924f11c7f63SJim Harris protocols->u.bits.ssp_initiator = 1;
925f11c7f63SJim Harris
926f11c7f63SJim Harris SCIC_LOG_TRACE((
927f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
928f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
929f11c7f63SJim Harris "scic_sds_phy_get_protocols(this_phy:0x%x, protocols:0x%x)\n",
930f11c7f63SJim Harris this_phy, protocols->u.all
931f11c7f63SJim Harris ));
932f11c7f63SJim Harris }
933f11c7f63SJim Harris
934f11c7f63SJim Harris /**
935f11c7f63SJim Harris * This method returns the supported protocols for the attached phy. If this
936f11c7f63SJim Harris * is a SAS phy the protocols are returned from the identify address frame.
937f11c7f63SJim Harris * If this is a SATA phy then protocols are made up and the target phy is an
938f11c7f63SJim Harris * STP target phy.
939f11c7f63SJim Harris *
940f11c7f63SJim Harris * @note The caller will get the entire set of bits for the protocol value.
941f11c7f63SJim Harris *
942f11c7f63SJim Harris * @param[in] this_phy The parameter is the phy object for which the attached
943f11c7f63SJim Harris * phy protcols are to be returned.
944f11c7f63SJim Harris * @param[out] protocols The parameter is the returned protocols for the
945f11c7f63SJim Harris * attached phy.
946f11c7f63SJim Harris */
scic_sds_phy_get_attached_phy_protocols(SCIC_SDS_PHY_T * this_phy,SCI_SAS_IDENTIFY_ADDRESS_FRAME_PROTOCOLS_T * protocols)947f11c7f63SJim Harris void scic_sds_phy_get_attached_phy_protocols(
948f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
949f11c7f63SJim Harris SCI_SAS_IDENTIFY_ADDRESS_FRAME_PROTOCOLS_T * protocols
950f11c7f63SJim Harris )
951f11c7f63SJim Harris {
952f11c7f63SJim Harris SCIC_LOG_TRACE((
953f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
954f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
955f11c7f63SJim Harris "scic_sds_phy_get_attached_phy_protocols(this_phy:0x%x, protocols:0x%x[0x%x])\n",
956f11c7f63SJim Harris this_phy, protocols, protocols->u.all
957f11c7f63SJim Harris ));
958f11c7f63SJim Harris
959f11c7f63SJim Harris protocols->u.all = 0;
960f11c7f63SJim Harris
961f11c7f63SJim Harris if (this_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS)
962f11c7f63SJim Harris {
963f11c7f63SJim Harris protocols->u.all =
964f11c7f63SJim Harris this_phy->phy_type.sas.identify_address_frame_buffer.protocols.u.all;
965f11c7f63SJim Harris }
966f11c7f63SJim Harris else if (this_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA)
967f11c7f63SJim Harris {
968f11c7f63SJim Harris protocols->u.bits.stp_target = 1;
969f11c7f63SJim Harris }
970f11c7f63SJim Harris }
971f11c7f63SJim Harris
972f11c7f63SJim Harris
973f11c7f63SJim Harris /**
974f11c7f63SJim Harris * @brief This method release resources in for a scic phy.
975f11c7f63SJim Harris *
976f11c7f63SJim Harris * @param[in] controller This parameter specifies the core controller, one of
977f11c7f63SJim Harris * its phy's resources are to be released.
978b78540b1SGabor Kovesdan * @param[in] this_phy This parameter specifies the phy whose resource is to
979f11c7f63SJim Harris * be released.
980f11c7f63SJim Harris */
scic_sds_phy_release_resource(SCIC_SDS_CONTROLLER_T * controller,SCIC_SDS_PHY_T * this_phy)981f11c7f63SJim Harris void scic_sds_phy_release_resource(
982f11c7f63SJim Harris SCIC_SDS_CONTROLLER_T * controller,
983f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
984f11c7f63SJim Harris )
985f11c7f63SJim Harris {
986f11c7f63SJim Harris SCIC_LOG_TRACE((
987f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
988f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
989f11c7f63SJim Harris "scic_sds_phy_release_resource(0x%x, 0x%x)\n",
990f11c7f63SJim Harris controller, this_phy
991f11c7f63SJim Harris ));
992f11c7f63SJim Harris
993f11c7f63SJim Harris //Currently, the only resource to be released is a timer.
994f11c7f63SJim Harris if (this_phy->sata_timeout_timer != NULL)
995f11c7f63SJim Harris {
996f11c7f63SJim Harris scic_cb_timer_destroy(controller, this_phy->sata_timeout_timer);
997f11c7f63SJim Harris this_phy->sata_timeout_timer = NULL;
998f11c7f63SJim Harris }
999f11c7f63SJim Harris }
1000f11c7f63SJim Harris
1001f11c7f63SJim Harris
1002f11c7f63SJim Harris //*****************************************************************************
1003f11c7f63SJim Harris //* SCIC SDS PHY Handler Redirects
1004f11c7f63SJim Harris //*****************************************************************************
1005f11c7f63SJim Harris
1006f11c7f63SJim Harris /**
1007f11c7f63SJim Harris * @brief This method will attempt to reset the phy. This
1008f11c7f63SJim Harris * request is only valid when the phy is in an ready
1009f11c7f63SJim Harris * state
1010f11c7f63SJim Harris *
1011f11c7f63SJim Harris * @param[in] this_phy
1012f11c7f63SJim Harris *
1013f11c7f63SJim Harris * @return SCI_STATUS
1014f11c7f63SJim Harris */
scic_sds_phy_reset(SCIC_SDS_PHY_T * this_phy)1015f11c7f63SJim Harris SCI_STATUS scic_sds_phy_reset(
1016f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
1017f11c7f63SJim Harris )
1018f11c7f63SJim Harris {
1019f11c7f63SJim Harris SCIC_LOG_TRACE((
1020f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1021f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1022f11c7f63SJim Harris "scic_sds_phy_reset(this_phy:0x%08x)\n",
1023f11c7f63SJim Harris this_phy
1024f11c7f63SJim Harris ));
1025f11c7f63SJim Harris
1026f11c7f63SJim Harris return this_phy->state_handlers->parent.reset_handler(
1027f11c7f63SJim Harris &this_phy->parent
1028f11c7f63SJim Harris );
1029f11c7f63SJim Harris }
1030f11c7f63SJim Harris
1031f11c7f63SJim Harris /**
1032b790c193SPedro F. Giffuni * @brief This method will process the event code received.
1033f11c7f63SJim Harris *
1034f11c7f63SJim Harris * @param[in] this_phy
1035f11c7f63SJim Harris * @param[in] event_code
1036f11c7f63SJim Harris *
1037f11c7f63SJim Harris * @return SCI_STATUS
1038f11c7f63SJim Harris */
scic_sds_phy_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)1039f11c7f63SJim Harris SCI_STATUS scic_sds_phy_event_handler(
1040f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
1041f11c7f63SJim Harris U32 event_code
1042f11c7f63SJim Harris )
1043f11c7f63SJim Harris {
1044f11c7f63SJim Harris SCIC_LOG_TRACE((
1045f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1046f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1047f11c7f63SJim Harris "scic_sds_phy_event_handler(this_phy:0x%08x, event_code:%x)\n",
1048f11c7f63SJim Harris this_phy, event_code
1049f11c7f63SJim Harris ));
1050f11c7f63SJim Harris
1051f11c7f63SJim Harris return this_phy->state_handlers->event_handler(this_phy, event_code);
1052f11c7f63SJim Harris }
1053f11c7f63SJim Harris
1054f11c7f63SJim Harris /**
1055b790c193SPedro F. Giffuni * @brief This method will process the frame index received.
1056f11c7f63SJim Harris *
1057f11c7f63SJim Harris * @param[in] this_phy
1058f11c7f63SJim Harris * @param[in] frame_index
1059f11c7f63SJim Harris *
1060f11c7f63SJim Harris * @return SCI_STATUS
1061f11c7f63SJim Harris */
scic_sds_phy_frame_handler(SCIC_SDS_PHY_T * this_phy,U32 frame_index)1062f11c7f63SJim Harris SCI_STATUS scic_sds_phy_frame_handler(
1063f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
1064f11c7f63SJim Harris U32 frame_index
1065f11c7f63SJim Harris )
1066f11c7f63SJim Harris {
1067f11c7f63SJim Harris SCIC_LOG_TRACE((
1068f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1069f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1070f11c7f63SJim Harris "scic_sds_phy_frame_handler(this_phy:0x%08x, frame_index:%d)\n",
1071f11c7f63SJim Harris this_phy, frame_index
1072f11c7f63SJim Harris ));
1073f11c7f63SJim Harris
1074f11c7f63SJim Harris return this_phy->state_handlers->frame_handler(this_phy, frame_index);
1075f11c7f63SJim Harris }
1076f11c7f63SJim Harris
1077f11c7f63SJim Harris /**
1078f11c7f63SJim Harris * @brief This method will give the phy permission to consume power
1079f11c7f63SJim Harris *
1080f11c7f63SJim Harris * @param[in] this_phy
1081f11c7f63SJim Harris *
1082f11c7f63SJim Harris * @return SCI_STATUS
1083f11c7f63SJim Harris */
scic_sds_phy_consume_power_handler(SCIC_SDS_PHY_T * this_phy)1084f11c7f63SJim Harris SCI_STATUS scic_sds_phy_consume_power_handler(
1085f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
1086f11c7f63SJim Harris )
1087f11c7f63SJim Harris {
1088f11c7f63SJim Harris SCIC_LOG_TRACE((
1089f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1090f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1091f11c7f63SJim Harris "scic_sds_phy_consume_power_handler(this_phy:0x%08x)\n",
1092f11c7f63SJim Harris this_phy
1093f11c7f63SJim Harris ));
1094f11c7f63SJim Harris
1095f11c7f63SJim Harris return this_phy->state_handlers->consume_power_handler(this_phy);
1096f11c7f63SJim Harris }
1097f11c7f63SJim Harris
1098f11c7f63SJim Harris //*****************************************************************************
1099f11c7f63SJim Harris //* SCIC PHY Public Methods
1100f11c7f63SJim Harris //*****************************************************************************
1101f11c7f63SJim Harris
scic_phy_get_properties(SCI_PHY_HANDLE_T phy,SCIC_PHY_PROPERTIES_T * properties)1102f11c7f63SJim Harris SCI_STATUS scic_phy_get_properties(
1103f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1104f11c7f63SJim Harris SCIC_PHY_PROPERTIES_T * properties
1105f11c7f63SJim Harris )
1106f11c7f63SJim Harris {
1107f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1108f11c7f63SJim Harris U8 max_speed_generation;
1109f11c7f63SJim Harris
1110f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1111f11c7f63SJim Harris
1112f11c7f63SJim Harris SCIC_LOG_TRACE((
1113f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1114f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1115f11c7f63SJim Harris "scic_phy_get_properties(0x%x, 0x%x) enter\n",
1116f11c7f63SJim Harris this_phy, properties
1117f11c7f63SJim Harris ));
1118f11c7f63SJim Harris
1119f11c7f63SJim Harris if (phy == SCI_INVALID_HANDLE)
1120f11c7f63SJim Harris {
1121f11c7f63SJim Harris return SCI_FAILURE_INVALID_PHY;
1122f11c7f63SJim Harris }
1123f11c7f63SJim Harris
1124f11c7f63SJim Harris memset(properties, 0, sizeof(SCIC_PHY_PROPERTIES_T));
1125f11c7f63SJim Harris
1126f11c7f63SJim Harris //get max link rate of this phy set by user.
1127f11c7f63SJim Harris max_speed_generation =
1128f11c7f63SJim Harris this_phy->owning_port->owning_controller->user_parameters.sds1.
1129f11c7f63SJim Harris phys[this_phy->phy_index].max_speed_generation;
1130f11c7f63SJim Harris
1131f11c7f63SJim Harris properties->negotiated_link_rate = this_phy->max_negotiated_speed;
1132f11c7f63SJim Harris
1133f11c7f63SJim Harris if (max_speed_generation == SCIC_SDS_PARM_GEN3_SPEED)
1134f11c7f63SJim Harris properties->max_link_rate = SCI_SAS_600_GB;
1135f11c7f63SJim Harris else if (max_speed_generation == SCIC_SDS_PARM_GEN2_SPEED)
1136f11c7f63SJim Harris properties->max_link_rate = SCI_SAS_300_GB;
1137f11c7f63SJim Harris else
1138f11c7f63SJim Harris properties->max_link_rate = SCI_SAS_150_GB;
1139f11c7f63SJim Harris
1140f11c7f63SJim Harris properties->index = this_phy->phy_index;
1141f11c7f63SJim Harris properties->owning_port = scic_sds_phy_get_port(this_phy);
1142f11c7f63SJim Harris
1143f11c7f63SJim Harris scic_sds_phy_get_protocols(this_phy, &properties->transmit_iaf.protocols);
1144f11c7f63SJim Harris
1145f11c7f63SJim Harris properties->transmit_iaf.sas_address.high =
1146f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.
1147f11c7f63SJim Harris phys[this_phy->phy_index].sas_address.sci_format.high;
1148f11c7f63SJim Harris
1149f11c7f63SJim Harris properties->transmit_iaf.sas_address.low =
1150f11c7f63SJim Harris this_phy->owning_port->owning_controller->oem_parameters.sds1.
1151f11c7f63SJim Harris phys[this_phy->phy_index].sas_address.sci_format.low;
1152f11c7f63SJim Harris
1153f11c7f63SJim Harris return SCI_SUCCESS;
1154f11c7f63SJim Harris }
1155f11c7f63SJim Harris
1156f11c7f63SJim Harris // ---------------------------------------------------------------------------
1157f11c7f63SJim Harris
scic_sas_phy_get_properties(SCI_PHY_HANDLE_T phy,SCIC_SAS_PHY_PROPERTIES_T * properties)1158f11c7f63SJim Harris SCI_STATUS scic_sas_phy_get_properties(
1159f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1160f11c7f63SJim Harris SCIC_SAS_PHY_PROPERTIES_T * properties
1161f11c7f63SJim Harris )
1162f11c7f63SJim Harris {
1163f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1164f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1165f11c7f63SJim Harris
1166f11c7f63SJim Harris SCIC_LOG_TRACE((
1167f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1168f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1169f11c7f63SJim Harris "scic_sas_phy_get_properties(0x%x, 0x%x) enter\n",
1170f11c7f63SJim Harris this_phy, properties
1171f11c7f63SJim Harris ));
1172f11c7f63SJim Harris
1173f11c7f63SJim Harris if (this_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS)
1174f11c7f63SJim Harris {
1175f11c7f63SJim Harris memcpy(
1176f11c7f63SJim Harris &properties->received_iaf,
1177f11c7f63SJim Harris &this_phy->phy_type.sas.identify_address_frame_buffer,
1178f11c7f63SJim Harris sizeof(SCI_SAS_IDENTIFY_ADDRESS_FRAME_T)
1179f11c7f63SJim Harris );
1180f11c7f63SJim Harris
1181f11c7f63SJim Harris properties->received_capabilities.u.all
1182f11c7f63SJim Harris = SCU_SAS_RECPHYCAP_READ(this_phy);
1183f11c7f63SJim Harris
1184f11c7f63SJim Harris return SCI_SUCCESS;
1185f11c7f63SJim Harris }
1186f11c7f63SJim Harris
1187f11c7f63SJim Harris return SCI_FAILURE;
1188f11c7f63SJim Harris }
1189f11c7f63SJim Harris
1190f11c7f63SJim Harris // ---------------------------------------------------------------------------
1191f11c7f63SJim Harris
scic_sata_phy_get_properties(SCI_PHY_HANDLE_T phy,SCIC_SATA_PHY_PROPERTIES_T * properties)1192f11c7f63SJim Harris SCI_STATUS scic_sata_phy_get_properties(
1193f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1194f11c7f63SJim Harris SCIC_SATA_PHY_PROPERTIES_T * properties
1195f11c7f63SJim Harris )
1196f11c7f63SJim Harris {
1197f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1198f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1199f11c7f63SJim Harris
1200f11c7f63SJim Harris SCIC_LOG_TRACE((
1201f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1202f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1203f11c7f63SJim Harris "scic_sata_phy_get_properties(0x%x, 0x%x) enter\n",
1204f11c7f63SJim Harris this_phy, properties
1205f11c7f63SJim Harris ));
1206f11c7f63SJim Harris
1207f11c7f63SJim Harris if (this_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA)
1208f11c7f63SJim Harris {
1209f11c7f63SJim Harris memcpy(
1210f11c7f63SJim Harris &properties->signature_fis,
1211f11c7f63SJim Harris &this_phy->phy_type.sata.signature_fis_buffer,
1212f11c7f63SJim Harris sizeof(SATA_FIS_REG_D2H_T)
1213f11c7f63SJim Harris );
1214f11c7f63SJim Harris
1215f11c7f63SJim Harris /// @todo add support for port selectors.
1216f11c7f63SJim Harris properties->is_port_selector_present = FALSE;
1217f11c7f63SJim Harris
1218f11c7f63SJim Harris return SCI_SUCCESS;
1219f11c7f63SJim Harris }
1220f11c7f63SJim Harris
1221f11c7f63SJim Harris return SCI_FAILURE;
1222f11c7f63SJim Harris }
1223f11c7f63SJim Harris
1224f11c7f63SJim Harris // ---------------------------------------------------------------------------
1225f11c7f63SJim Harris
1226f11c7f63SJim Harris #if !defined(DISABLE_PORT_SELECTORS)
1227f11c7f63SJim Harris
scic_sata_phy_send_port_selection_signal(SCI_PHY_HANDLE_T phy)1228f11c7f63SJim Harris SCI_STATUS scic_sata_phy_send_port_selection_signal(
1229f11c7f63SJim Harris SCI_PHY_HANDLE_T phy
1230f11c7f63SJim Harris )
1231f11c7f63SJim Harris {
1232f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1233f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1234f11c7f63SJim Harris
1235f11c7f63SJim Harris SCIC_LOG_TRACE((
1236f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1237f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1238f11c7f63SJim Harris "scic_sata_phy_send_port_selection_signals(0x%x) enter\n",
1239f11c7f63SJim Harris this_phy
1240f11c7f63SJim Harris ));
1241f11c7f63SJim Harris
1242f11c7f63SJim Harris /// @todo To be implemented
1243f11c7f63SJim Harris ASSERT(FALSE);
1244f11c7f63SJim Harris return SCI_FAILURE;
1245f11c7f63SJim Harris }
1246f11c7f63SJim Harris
1247f11c7f63SJim Harris #endif // !defined(DISABLE_PORT_SELECTORS)
1248f11c7f63SJim Harris
1249f11c7f63SJim Harris // ---------------------------------------------------------------------------
1250f11c7f63SJim Harris
1251f11c7f63SJim Harris #if !defined(DISABLE_PHY_COUNTERS)
1252f11c7f63SJim Harris
scic_phy_enable_counter(SCI_PHY_HANDLE_T phy,SCIC_PHY_COUNTER_ID_T counter_id)1253f11c7f63SJim Harris SCI_STATUS scic_phy_enable_counter(
1254f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1255f11c7f63SJim Harris SCIC_PHY_COUNTER_ID_T counter_id
1256f11c7f63SJim Harris )
1257f11c7f63SJim Harris {
1258f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1259f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1260f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1261f11c7f63SJim Harris
1262f11c7f63SJim Harris SCIC_LOG_TRACE((
1263f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1264f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1265f11c7f63SJim Harris "scic_phy_enable_counter(0x%x, 0x%x) enter\n",
1266f11c7f63SJim Harris this_phy, counter_id
1267f11c7f63SJim Harris ));
1268f11c7f63SJim Harris
1269f11c7f63SJim Harris switch(counter_id)
1270f11c7f63SJim Harris {
1271f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT:
1272f11c7f63SJim Harris {
1273f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1274f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_RX_DONE_ACK_NAK_TIMEOUT_INDEX);
1275f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1276f11c7f63SJim Harris }
1277f11c7f63SJim Harris break;
1278f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT:
1279f11c7f63SJim Harris {
1280f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1281f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_TX_DONE_ACK_NAK_TIMEOUT_INDEX);
1282f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1283f11c7f63SJim Harris }
1284f11c7f63SJim Harris break;
1285f11c7f63SJim Harris case SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED:
1286f11c7f63SJim Harris {
1287f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1288f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_INACTIVITY_TIMER_EXPIRED_INDEX);
1289f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1290f11c7f63SJim Harris }
1291f11c7f63SJim Harris break;
1292f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT:
1293f11c7f63SJim Harris {
1294f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1295f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_RX_DONE_CREDIT_TIMEOUT_INDEX);
1296f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1297f11c7f63SJim Harris }
1298f11c7f63SJim Harris break;
1299f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT:
1300f11c7f63SJim Harris {
1301f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1302f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_TX_DONE_CREDIT_TIMEOUT_INDEX);
1303f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1304f11c7f63SJim Harris }
1305f11c7f63SJim Harris break;
1306f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED:
1307f11c7f63SJim Harris {
1308f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1309f11c7f63SJim Harris control |= (1 << SCU_ERR_CNT_RX_CREDIT_BLOCKED_RECEIVED_INDEX);
1310f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1311f11c7f63SJim Harris }
1312f11c7f63SJim Harris break;
1313f11c7f63SJim Harris
1314f11c7f63SJim Harris // These error counters are enabled by default, and cannot be
1315f11c7f63SJim Harris // disabled. Return SCI_SUCCESS to denote that they are
1316f11c7f63SJim Harris // enabled, hiding the fact that enabling the counter is
1317f11c7f63SJim Harris // a no-op.
1318f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME:
1319f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME:
1320f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_DWORD:
1321f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD:
1322f11c7f63SJim Harris case SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR:
1323f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR:
1324f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR:
1325f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME:
1326f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT:
1327f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE:
1328f11c7f63SJim Harris case SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR:
1329f11c7f63SJim Harris break;
1330f11c7f63SJim Harris
1331f11c7f63SJim Harris default:
1332f11c7f63SJim Harris status = SCI_FAILURE;
1333f11c7f63SJim Harris break;
1334f11c7f63SJim Harris }
1335f11c7f63SJim Harris return status;
1336f11c7f63SJim Harris }
1337f11c7f63SJim Harris
1338f11c7f63SJim Harris // ---------------------------------------------------------------------------
1339f11c7f63SJim Harris
scic_phy_disable_counter(SCI_PHY_HANDLE_T phy,SCIC_PHY_COUNTER_ID_T counter_id)1340f11c7f63SJim Harris SCI_STATUS scic_phy_disable_counter(
1341f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1342f11c7f63SJim Harris SCIC_PHY_COUNTER_ID_T counter_id
1343f11c7f63SJim Harris )
1344f11c7f63SJim Harris {
1345f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1346f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1347f11c7f63SJim Harris
1348f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1349f11c7f63SJim Harris
1350f11c7f63SJim Harris SCIC_LOG_TRACE((
1351f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1352f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1353f11c7f63SJim Harris "scic_phy_disable_counter(0x%x, 0x%x) enter\n",
1354f11c7f63SJim Harris this_phy, counter_id
1355f11c7f63SJim Harris ));
1356f11c7f63SJim Harris
1357f11c7f63SJim Harris switch(counter_id)
1358f11c7f63SJim Harris {
1359f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT:
1360f11c7f63SJim Harris {
1361f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1362f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_RX_DONE_ACK_NAK_TIMEOUT_INDEX);
1363f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1364f11c7f63SJim Harris }
1365f11c7f63SJim Harris break;
1366f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT:
1367f11c7f63SJim Harris {
1368f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1369f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_TX_DONE_ACK_NAK_TIMEOUT_INDEX);
1370f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1371f11c7f63SJim Harris }
1372f11c7f63SJim Harris break;
1373f11c7f63SJim Harris case SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED:
1374f11c7f63SJim Harris {
1375f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1376f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_INACTIVITY_TIMER_EXPIRED_INDEX);
1377f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1378f11c7f63SJim Harris }
1379f11c7f63SJim Harris break;
1380f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT:
1381f11c7f63SJim Harris {
1382f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1383f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_RX_DONE_CREDIT_TIMEOUT_INDEX);
1384f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1385f11c7f63SJim Harris }
1386f11c7f63SJim Harris break;
1387f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT:
1388f11c7f63SJim Harris {
1389f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1390f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_TX_DONE_CREDIT_TIMEOUT_INDEX);
1391f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1392f11c7f63SJim Harris }
1393f11c7f63SJim Harris break;
1394f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED:
1395f11c7f63SJim Harris {
1396f11c7f63SJim Harris U32 control = SCU_SAS_ECENCR_READ(this_phy);
1397f11c7f63SJim Harris control &= ~(1 << SCU_ERR_CNT_RX_CREDIT_BLOCKED_RECEIVED_INDEX);
1398f11c7f63SJim Harris SCU_SAS_ECENCR_WRITE(this_phy, control);
1399f11c7f63SJim Harris }
1400f11c7f63SJim Harris break;
1401f11c7f63SJim Harris
1402f11c7f63SJim Harris // These error counters cannot be disabled, so return SCI_FAILURE.
1403f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME:
1404f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME:
1405f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_DWORD:
1406f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD:
1407f11c7f63SJim Harris case SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR:
1408f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR:
1409f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR:
1410f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME:
1411f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT:
1412f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE:
1413f11c7f63SJim Harris case SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR:
1414f11c7f63SJim Harris default:
1415f11c7f63SJim Harris status = SCI_FAILURE;
1416f11c7f63SJim Harris break;
1417f11c7f63SJim Harris }
1418f11c7f63SJim Harris return status;
1419f11c7f63SJim Harris }
1420f11c7f63SJim Harris
1421f11c7f63SJim Harris // ---------------------------------------------------------------------------
1422f11c7f63SJim Harris
scic_phy_get_counter(SCI_PHY_HANDLE_T phy,SCIC_PHY_COUNTER_ID_T counter_id,U32 * data)1423f11c7f63SJim Harris SCI_STATUS scic_phy_get_counter(
1424f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1425f11c7f63SJim Harris SCIC_PHY_COUNTER_ID_T counter_id,
1426f11c7f63SJim Harris U32 * data
1427f11c7f63SJim Harris )
1428f11c7f63SJim Harris {
1429f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1430f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1431f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1432f11c7f63SJim Harris
1433f11c7f63SJim Harris SCIC_LOG_TRACE((
1434f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1435f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1436f11c7f63SJim Harris "scic_phy_get_counter(0x%x, 0x%x) enter\n",
1437f11c7f63SJim Harris this_phy, counter_id
1438f11c7f63SJim Harris ));
1439f11c7f63SJim Harris
1440f11c7f63SJim Harris switch(counter_id)
1441f11c7f63SJim Harris {
1442f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME:
1443f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_frame_count);
1444f11c7f63SJim Harris break;
1445f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME:
1446f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, transmit_frame_count);
1447f11c7f63SJim Harris break;
1448f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_DWORD:
1449f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_dword_count);
1450f11c7f63SJim Harris break;
1451f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD:
1452f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, transmit_dword_count);
1453f11c7f63SJim Harris break;
1454f11c7f63SJim Harris case SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR:
1455f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, loss_of_sync_error_count);
1456f11c7f63SJim Harris break;
1457f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR:
1458f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, running_disparity_error_count);
1459f11c7f63SJim Harris break;
1460f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR:
1461f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_frame_crc_error_count);
1462f11c7f63SJim Harris break;
1463f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT:
1464f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_RX_DONE_ACK_NAK_TIMEOUT_INDEX];
1465f11c7f63SJim Harris break;
1466f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT:
1467f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_TX_DONE_ACK_NAK_TIMEOUT_INDEX];
1468f11c7f63SJim Harris break;
1469f11c7f63SJim Harris case SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED:
1470f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_INACTIVITY_TIMER_EXPIRED_INDEX];
1471f11c7f63SJim Harris break;
1472f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT:
1473f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_RX_DONE_CREDIT_TIMEOUT_INDEX];
1474f11c7f63SJim Harris break;
1475f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT:
1476f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_TX_DONE_CREDIT_TIMEOUT_INDEX];
1477f11c7f63SJim Harris break;
1478f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED:
1479f11c7f63SJim Harris *data = this_phy->error_counter[SCU_ERR_CNT_RX_CREDIT_BLOCKED_RECEIVED_INDEX];
1480f11c7f63SJim Harris break;
1481f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME:
1482f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_short_frame_count);
1483f11c7f63SJim Harris break;
1484f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT:
1485f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_frame_without_credit_count);
1486f11c7f63SJim Harris break;
1487f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE:
1488f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, received_frame_after_done_count);
1489f11c7f63SJim Harris break;
1490f11c7f63SJim Harris case SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR:
1491f11c7f63SJim Harris *data = scu_link_layer_register_read(this_phy, phy_reset_problem_count);
1492f11c7f63SJim Harris break;
1493f11c7f63SJim Harris default:
1494f11c7f63SJim Harris status = SCI_FAILURE;
1495f11c7f63SJim Harris break;
1496f11c7f63SJim Harris }
1497f11c7f63SJim Harris
1498f11c7f63SJim Harris return status;
1499f11c7f63SJim Harris }
1500f11c7f63SJim Harris
1501f11c7f63SJim Harris // ---------------------------------------------------------------------------
1502f11c7f63SJim Harris
scic_phy_clear_counter(SCI_PHY_HANDLE_T phy,SCIC_PHY_COUNTER_ID_T counter_id)1503f11c7f63SJim Harris SCI_STATUS scic_phy_clear_counter(
1504f11c7f63SJim Harris SCI_PHY_HANDLE_T phy,
1505f11c7f63SJim Harris SCIC_PHY_COUNTER_ID_T counter_id
1506f11c7f63SJim Harris )
1507f11c7f63SJim Harris {
1508f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1509f11c7f63SJim Harris SCI_STATUS status = SCI_SUCCESS;
1510f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1511f11c7f63SJim Harris
1512f11c7f63SJim Harris SCIC_LOG_TRACE((
1513f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1514f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1515f11c7f63SJim Harris "scic_phy_clear_counter(0x%x, 0x%x) enter\n",
1516f11c7f63SJim Harris this_phy, counter_id
1517f11c7f63SJim Harris ));
1518f11c7f63SJim Harris
1519f11c7f63SJim Harris switch(counter_id)
1520f11c7f63SJim Harris {
1521f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME:
1522f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_frame_count, 0);
1523f11c7f63SJim Harris break;
1524f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME:
1525f11c7f63SJim Harris scu_link_layer_register_write(this_phy, transmit_frame_count, 0);
1526f11c7f63SJim Harris break;
1527f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_DWORD:
1528f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_dword_count, 0);
1529f11c7f63SJim Harris break;
1530f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD:
1531f11c7f63SJim Harris scu_link_layer_register_write(this_phy, transmit_dword_count, 0);
1532f11c7f63SJim Harris break;
1533f11c7f63SJim Harris case SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR:
1534f11c7f63SJim Harris scu_link_layer_register_write(this_phy, loss_of_sync_error_count, 0);
1535f11c7f63SJim Harris break;
1536f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR:
1537f11c7f63SJim Harris scu_link_layer_register_write(this_phy, running_disparity_error_count, 0);
1538f11c7f63SJim Harris break;
1539f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR:
1540f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_frame_crc_error_count, 0);
1541f11c7f63SJim Harris break;
1542f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT:
1543f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_RX_DONE_ACK_NAK_TIMEOUT_INDEX] = 0;
1544f11c7f63SJim Harris break;
1545f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT:
1546f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_TX_DONE_ACK_NAK_TIMEOUT_INDEX] = 0;
1547f11c7f63SJim Harris break;
1548f11c7f63SJim Harris case SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED:
1549f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_INACTIVITY_TIMER_EXPIRED_INDEX] = 0;
1550f11c7f63SJim Harris break;
1551f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT:
1552f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_RX_DONE_CREDIT_TIMEOUT_INDEX] = 0;
1553f11c7f63SJim Harris break;
1554f11c7f63SJim Harris case SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT:
1555f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_TX_DONE_CREDIT_TIMEOUT_INDEX] = 0;
1556f11c7f63SJim Harris break;
1557f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED:
1558f11c7f63SJim Harris this_phy->error_counter[SCU_ERR_CNT_RX_CREDIT_BLOCKED_RECEIVED_INDEX] = 0;
1559f11c7f63SJim Harris break;
1560f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME:
1561f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_short_frame_count, 0);
1562f11c7f63SJim Harris break;
1563f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT:
1564f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_frame_without_credit_count, 0);
1565f11c7f63SJim Harris break;
1566f11c7f63SJim Harris case SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE:
1567f11c7f63SJim Harris scu_link_layer_register_write(this_phy, received_frame_after_done_count, 0);
1568f11c7f63SJim Harris break;
1569f11c7f63SJim Harris case SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR:
1570f11c7f63SJim Harris scu_link_layer_register_write(this_phy, phy_reset_problem_count, 0);
1571f11c7f63SJim Harris break;
1572f11c7f63SJim Harris default:
1573f11c7f63SJim Harris status = SCI_FAILURE;
1574f11c7f63SJim Harris }
1575f11c7f63SJim Harris
1576f11c7f63SJim Harris return status;
1577f11c7f63SJim Harris }
1578f11c7f63SJim Harris
1579f11c7f63SJim Harris #endif // !defined(DISABLE_PHY_COUNTERS)
1580f11c7f63SJim Harris
scic_phy_stop(SCI_PHY_HANDLE_T phy)1581f11c7f63SJim Harris SCI_STATUS scic_phy_stop(
1582f11c7f63SJim Harris SCI_PHY_HANDLE_T phy
1583f11c7f63SJim Harris )
1584f11c7f63SJim Harris {
1585f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1586f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1587f11c7f63SJim Harris
1588f11c7f63SJim Harris SCIC_LOG_TRACE((
1589f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1590f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1591f11c7f63SJim Harris "scic_phy_stop(this_phy:0x%x)\n",
1592f11c7f63SJim Harris this_phy
1593f11c7f63SJim Harris ));
1594f11c7f63SJim Harris
1595f11c7f63SJim Harris return this_phy->state_handlers->parent.stop_handler(&this_phy->parent);
1596f11c7f63SJim Harris }
1597f11c7f63SJim Harris
scic_phy_start(SCI_PHY_HANDLE_T phy)1598f11c7f63SJim Harris SCI_STATUS scic_phy_start(
1599f11c7f63SJim Harris SCI_PHY_HANDLE_T phy
1600f11c7f63SJim Harris )
1601f11c7f63SJim Harris {
1602f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1603f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1604f11c7f63SJim Harris
1605f11c7f63SJim Harris SCIC_LOG_TRACE((
1606f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1607f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1608f11c7f63SJim Harris "scic_phy_start(this_phy:0x%x)\n",
1609f11c7f63SJim Harris this_phy
1610f11c7f63SJim Harris ));
1611f11c7f63SJim Harris
1612f11c7f63SJim Harris return this_phy->state_handlers->parent.start_handler(&this_phy->parent);
1613f11c7f63SJim Harris }
1614f11c7f63SJim Harris
1615f11c7f63SJim Harris //******************************************************************************
1616f11c7f63SJim Harris //* PHY STATE MACHINE
1617f11c7f63SJim Harris //******************************************************************************
1618f11c7f63SJim Harris
1619f11c7f63SJim Harris //***************************************************************************
1620f11c7f63SJim Harris //* DEFAULT HANDLERS
1621f11c7f63SJim Harris //***************************************************************************
1622f11c7f63SJim Harris
1623f11c7f63SJim Harris /**
1624f11c7f63SJim Harris * This is the default method for phy a start request. It will report a
1625f11c7f63SJim Harris * warning and exit.
1626f11c7f63SJim Harris *
1627f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1628f11c7f63SJim Harris * SCIC_SDS_PHY object.
1629f11c7f63SJim Harris *
1630f11c7f63SJim Harris * @return SCI_STATUS
1631f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1632f11c7f63SJim Harris */
scic_sds_phy_default_start_handler(SCI_BASE_PHY_T * phy)1633f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_start_handler(
1634f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1635f11c7f63SJim Harris )
1636f11c7f63SJim Harris {
1637f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1638f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1639f11c7f63SJim Harris
1640f11c7f63SJim Harris SCIC_LOG_WARNING((
1641f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1642f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1643f11c7f63SJim Harris "SCIC Phy 0x%08x requested to start from invalid state %d\n",
1644f11c7f63SJim Harris this_phy,
1645f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1646f11c7f63SJim Harris ));
1647f11c7f63SJim Harris
1648f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1649f11c7f63SJim Harris
1650f11c7f63SJim Harris }
1651f11c7f63SJim Harris
1652f11c7f63SJim Harris /**
1653f11c7f63SJim Harris * This is the default method for phy a stop request. It will report a
1654f11c7f63SJim Harris * warning and exit.
1655f11c7f63SJim Harris *
1656f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1657f11c7f63SJim Harris * SCIC_SDS_PHY object.
1658f11c7f63SJim Harris *
1659f11c7f63SJim Harris * @return SCI_STATUS
1660f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1661f11c7f63SJim Harris */
scic_sds_phy_default_stop_handler(SCI_BASE_PHY_T * phy)1662f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_stop_handler(
1663f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1664f11c7f63SJim Harris )
1665f11c7f63SJim Harris {
1666f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1667f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1668f11c7f63SJim Harris
1669f11c7f63SJim Harris SCIC_LOG_WARNING((
1670f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1671f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1672f11c7f63SJim Harris "SCIC Phy 0x%08x requested to stop from invalid state %d\n",
1673f11c7f63SJim Harris this_phy,
1674f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1675f11c7f63SJim Harris ));
1676f11c7f63SJim Harris
1677f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1678f11c7f63SJim Harris }
1679f11c7f63SJim Harris
1680f11c7f63SJim Harris /**
1681f11c7f63SJim Harris * This is the default method for phy a reset request. It will report a
1682f11c7f63SJim Harris * warning and exit.
1683f11c7f63SJim Harris *
1684f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1685f11c7f63SJim Harris * SCIC_SDS_PHY object.
1686f11c7f63SJim Harris *
1687f11c7f63SJim Harris * @return SCI_STATUS
1688f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1689f11c7f63SJim Harris */
scic_sds_phy_default_reset_handler(SCI_BASE_PHY_T * phy)1690f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_reset_handler(
1691f11c7f63SJim Harris SCI_BASE_PHY_T * phy
1692f11c7f63SJim Harris )
1693f11c7f63SJim Harris {
1694f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1695f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1696f11c7f63SJim Harris
1697f11c7f63SJim Harris SCIC_LOG_WARNING((
1698f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1699f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1700f11c7f63SJim Harris "SCIC Phy 0x%08x requested to reset from invalid state %d\n",
1701f11c7f63SJim Harris this_phy,
1702f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1703f11c7f63SJim Harris ));
1704f11c7f63SJim Harris
1705f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1706f11c7f63SJim Harris }
1707f11c7f63SJim Harris
1708f11c7f63SJim Harris /**
1709f11c7f63SJim Harris * This is the default method for phy a destruct request. It will report a
1710f11c7f63SJim Harris * warning and exit.
1711f11c7f63SJim Harris *
1712f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1713f11c7f63SJim Harris * SCIC_SDS_PHY object.
1714f11c7f63SJim Harris *
1715f11c7f63SJim Harris * @return SCI_STATUS
1716f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1717f11c7f63SJim Harris */
scic_sds_phy_default_destroy_handler(SCI_BASE_PHY_T * phy)1718f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_destroy_handler(
1719f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1720f11c7f63SJim Harris )
1721f11c7f63SJim Harris {
1722f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1723f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1724f11c7f63SJim Harris
1725f11c7f63SJim Harris /// @todo Implement something for the default
1726f11c7f63SJim Harris SCIC_LOG_WARNING((
1727f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1728f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1729f11c7f63SJim Harris "SCIC Phy 0x%08x requested to destroy from invalid state %d\n",
1730f11c7f63SJim Harris this_phy,
1731f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1732f11c7f63SJim Harris ));
1733f11c7f63SJim Harris
1734f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1735f11c7f63SJim Harris }
1736f11c7f63SJim Harris
1737f11c7f63SJim Harris /**
1738f11c7f63SJim Harris * This is the default method for a phy frame handling request. It will
1739f11c7f63SJim Harris * report a warning, release the frame and exit.
1740f11c7f63SJim Harris *
1741f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1742f11c7f63SJim Harris * SCIC_SDS_PHY object.
1743f11c7f63SJim Harris * @param[in] frame_index This is the frame index that was received from the
1744f11c7f63SJim Harris * SCU hardware.
1745f11c7f63SJim Harris *
1746f11c7f63SJim Harris * @return SCI_STATUS
1747f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1748f11c7f63SJim Harris */
scic_sds_phy_default_frame_handler(SCIC_SDS_PHY_T * this_phy,U32 frame_index)1749f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_frame_handler(
1750f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
1751f11c7f63SJim Harris U32 frame_index
1752f11c7f63SJim Harris )
1753f11c7f63SJim Harris {
1754f11c7f63SJim Harris SCIC_LOG_WARNING((
1755f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1756f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1757b790c193SPedro F. Giffuni "SCIC Phy 0x%08x received unexpected frame data %d while in state %d\n",
1758f11c7f63SJim Harris this_phy, frame_index,
1759f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1760f11c7f63SJim Harris ));
1761f11c7f63SJim Harris
1762f11c7f63SJim Harris scic_sds_controller_release_frame(
1763f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy), frame_index);
1764f11c7f63SJim Harris
1765f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1766f11c7f63SJim Harris }
1767f11c7f63SJim Harris
1768f11c7f63SJim Harris /**
1769f11c7f63SJim Harris * This is the default method for a phy event handler. It will report a
1770f11c7f63SJim Harris * warning and exit.
1771f11c7f63SJim Harris *
1772f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1773f11c7f63SJim Harris * SCIC_SDS_PHY object.
1774f11c7f63SJim Harris * @param[in] event_code This is the event code that was received from the SCU
1775f11c7f63SJim Harris * hardware.
1776f11c7f63SJim Harris *
1777f11c7f63SJim Harris * @return SCI_STATUS
1778f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1779f11c7f63SJim Harris */
scic_sds_phy_default_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)1780f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_event_handler(
1781f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
1782f11c7f63SJim Harris U32 event_code
1783f11c7f63SJim Harris )
1784f11c7f63SJim Harris {
1785f11c7f63SJim Harris SCIC_LOG_WARNING((
1786f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1787f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1788f11c7f63SJim Harris "SCIC Phy 0x%08x received unexpected event status %x while in state %d\n",
1789f11c7f63SJim Harris this_phy, event_code,
1790f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1791f11c7f63SJim Harris ));
1792f11c7f63SJim Harris
1793f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1794f11c7f63SJim Harris }
1795f11c7f63SJim Harris
1796f11c7f63SJim Harris /**
1797f11c7f63SJim Harris * This is the default method for a phy consume power handler. It will report
1798f11c7f63SJim Harris * a warning and exit.
1799f11c7f63SJim Harris *
1800f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1801f11c7f63SJim Harris * SCIC_SDS_PHY object.
1802f11c7f63SJim Harris *
1803f11c7f63SJim Harris * @return SCI_STATUS
1804f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
1805f11c7f63SJim Harris */
scic_sds_phy_default_consume_power_handler(SCIC_SDS_PHY_T * this_phy)1806f11c7f63SJim Harris SCI_STATUS scic_sds_phy_default_consume_power_handler(
1807f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
1808f11c7f63SJim Harris )
1809f11c7f63SJim Harris {
1810f11c7f63SJim Harris SCIC_LOG_WARNING((
1811f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
1812f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY,
1813f11c7f63SJim Harris "SCIC Phy 0x%08x given unexpected permission to consume power while in state %d\n",
1814f11c7f63SJim Harris this_phy,
1815f11c7f63SJim Harris sci_base_state_machine_get_state(&this_phy->parent.state_machine)
1816f11c7f63SJim Harris ));
1817f11c7f63SJim Harris
1818f11c7f63SJim Harris return SCI_FAILURE_INVALID_STATE;
1819f11c7f63SJim Harris }
1820f11c7f63SJim Harris
1821f11c7f63SJim Harris //******************************************************************************
1822f11c7f63SJim Harris //* PHY STOPPED STATE HANDLERS
1823f11c7f63SJim Harris //******************************************************************************
1824f11c7f63SJim Harris
1825f11c7f63SJim Harris /**
1826f11c7f63SJim Harris * This method takes the SCIC_SDS_PHY from a stopped state and attempts to
1827f11c7f63SJim Harris * start it.
1828f11c7f63SJim Harris * - The phy state machine is transitioned to the
1829f11c7f63SJim Harris * SCI_BASE_PHY_STATE_STARTING.
1830f11c7f63SJim Harris *
1831f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1832f11c7f63SJim Harris * SCIC_SDS_PHY object.
1833f11c7f63SJim Harris *
1834f11c7f63SJim Harris * @return SCI_STATUS
1835f11c7f63SJim Harris * @retval SCI_SUCCESS
1836f11c7f63SJim Harris */
1837f11c7f63SJim Harris static
scic_sds_phy_stopped_state_start_handler(SCI_BASE_PHY_T * phy)1838f11c7f63SJim Harris SCI_STATUS scic_sds_phy_stopped_state_start_handler(
1839f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1840f11c7f63SJim Harris )
1841f11c7f63SJim Harris {
1842f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1843f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1844f11c7f63SJim Harris
1845f11c7f63SJim Harris
1846f11c7f63SJim Harris
1847f11c7f63SJim Harris // Create the SIGNATURE FIS Timeout timer for this phy
1848f11c7f63SJim Harris this_phy->sata_timeout_timer = scic_cb_timer_create(
1849f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
1850f11c7f63SJim Harris scic_sds_phy_sata_timeout,
1851f11c7f63SJim Harris this_phy
1852f11c7f63SJim Harris );
1853f11c7f63SJim Harris
1854f11c7f63SJim Harris if (this_phy->sata_timeout_timer != NULL)
1855f11c7f63SJim Harris {
1856f11c7f63SJim Harris sci_base_state_machine_change_state(
1857f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
1858f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
1859f11c7f63SJim Harris );
1860f11c7f63SJim Harris }
1861f11c7f63SJim Harris
1862f11c7f63SJim Harris return SCI_SUCCESS;
1863f11c7f63SJim Harris }
1864f11c7f63SJim Harris
1865f11c7f63SJim Harris /**
1866f11c7f63SJim Harris * This method takes the SCIC_SDS_PHY from a stopped state and destroys it.
1867f11c7f63SJim Harris * - This function takes no action.
1868f11c7f63SJim Harris *
1869b790c193SPedro F. Giffuni * @todo Shouldn't this function transition the SCI_BASE_PHY::state_machine to
1870f11c7f63SJim Harris * the SCI_BASE_PHY_STATE_FINAL?
1871f11c7f63SJim Harris *
1872f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1873f11c7f63SJim Harris * SCIC_SDS_PHY object.
1874f11c7f63SJim Harris *
1875f11c7f63SJim Harris * @return SCI_STATUS
1876f11c7f63SJim Harris * @retval SCI_SUCCESS
1877f11c7f63SJim Harris */
1878f11c7f63SJim Harris static
scic_sds_phy_stopped_state_destroy_handler(SCI_BASE_PHY_T * phy)1879f11c7f63SJim Harris SCI_STATUS scic_sds_phy_stopped_state_destroy_handler(
1880f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1881f11c7f63SJim Harris )
1882f11c7f63SJim Harris {
1883f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1884f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1885f11c7f63SJim Harris
1886f11c7f63SJim Harris /// @todo what do we actually need to do here?
1887f11c7f63SJim Harris return SCI_SUCCESS;
1888f11c7f63SJim Harris }
1889f11c7f63SJim Harris
1890f11c7f63SJim Harris //******************************************************************************
1891f11c7f63SJim Harris //* PHY STARTING STATE HANDLERS
1892f11c7f63SJim Harris //******************************************************************************
1893f11c7f63SJim Harris
1894f11c7f63SJim Harris // All of these state handlers are mapped to the starting sub-state machine
1895f11c7f63SJim Harris
1896f11c7f63SJim Harris //******************************************************************************
1897f11c7f63SJim Harris //* PHY READY STATE HANDLERS
1898f11c7f63SJim Harris //******************************************************************************
1899f11c7f63SJim Harris
1900f11c7f63SJim Harris /**
1901f11c7f63SJim Harris * This method takes the SCIC_SDS_PHY from a ready state and attempts to stop
1902f11c7f63SJim Harris * it.
1903f11c7f63SJim Harris * - The phy state machine is transitioned to the SCI_BASE_PHY_STATE_STOPPED.
1904f11c7f63SJim Harris *
1905f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1906f11c7f63SJim Harris * SCIC_SDS_PHY object.
1907f11c7f63SJim Harris *
1908f11c7f63SJim Harris * @return SCI_STATUS
1909f11c7f63SJim Harris * @retval SCI_SUCCESS
1910f11c7f63SJim Harris */
1911f11c7f63SJim Harris static
scic_sds_phy_ready_state_stop_handler(SCI_BASE_PHY_T * phy)1912f11c7f63SJim Harris SCI_STATUS scic_sds_phy_ready_state_stop_handler(
1913f11c7f63SJim Harris SCI_BASE_PHY_T *phy
1914f11c7f63SJim Harris )
1915f11c7f63SJim Harris {
1916f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
1917f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1918f11c7f63SJim Harris
1919f11c7f63SJim Harris sci_base_state_machine_change_state(
1920f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
1921f11c7f63SJim Harris SCI_BASE_PHY_STATE_STOPPED
1922f11c7f63SJim Harris );
1923f11c7f63SJim Harris
1924f11c7f63SJim Harris scic_sds_controller_link_down(
1925f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
1926f11c7f63SJim Harris scic_sds_phy_get_port(this_phy),
1927f11c7f63SJim Harris this_phy
1928f11c7f63SJim Harris );
1929f11c7f63SJim Harris
1930f11c7f63SJim Harris return SCI_SUCCESS;
1931f11c7f63SJim Harris }
1932f11c7f63SJim Harris
1933f11c7f63SJim Harris /**
1934f11c7f63SJim Harris * This method takes the SCIC_SDS_PHY from a ready state and attempts to reset
1935f11c7f63SJim Harris * it.
1936f11c7f63SJim Harris * - The phy state machine is transitioned to the SCI_BASE_PHY_STATE_STARTING.
1937f11c7f63SJim Harris *
1938f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
1939f11c7f63SJim Harris * SCIC_SDS_PHY object.
1940f11c7f63SJim Harris *
1941f11c7f63SJim Harris * @return SCI_STATUS
1942f11c7f63SJim Harris * @retval SCI_SUCCESS
1943f11c7f63SJim Harris */
1944f11c7f63SJim Harris static
scic_sds_phy_ready_state_reset_handler(SCI_BASE_PHY_T * phy)1945f11c7f63SJim Harris SCI_STATUS scic_sds_phy_ready_state_reset_handler(
1946f11c7f63SJim Harris SCI_BASE_PHY_T * phy
1947f11c7f63SJim Harris )
1948f11c7f63SJim Harris {
1949f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy;
1950f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
1951f11c7f63SJim Harris
1952f11c7f63SJim Harris sci_base_state_machine_change_state(
1953f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
1954f11c7f63SJim Harris SCI_BASE_PHY_STATE_RESETTING
1955f11c7f63SJim Harris );
1956f11c7f63SJim Harris
1957f11c7f63SJim Harris return SCI_SUCCESS;
1958f11c7f63SJim Harris }
1959f11c7f63SJim Harris
1960f11c7f63SJim Harris /**
1961f11c7f63SJim Harris * This method request the SCIC_SDS_PHY handle the received event. The only
1962f11c7f63SJim Harris * event that we are interested in while in the ready state is the link
1963f11c7f63SJim Harris * failure event.
1964f11c7f63SJim Harris * - decoded event is a link failure
1965f11c7f63SJim Harris * - transition the SCIC_SDS_PHY back to the SCI_BASE_PHY_STATE_STARTING
1966f11c7f63SJim Harris * state.
1967b790c193SPedro F. Giffuni * - any other event received will report a warning message
1968f11c7f63SJim Harris *
1969f11c7f63SJim Harris * @param[in] phy This is the SCIC_SDS_PHY object which has received the
1970f11c7f63SJim Harris * event.
1971f11c7f63SJim Harris *
1972f11c7f63SJim Harris * @return SCI_STATUS
1973f11c7f63SJim Harris * @retval SCI_SUCCESS if the event received is a link failure
1974f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE for any other event received.
1975f11c7f63SJim Harris */
1976f11c7f63SJim Harris static
scic_sds_phy_ready_state_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)1977f11c7f63SJim Harris SCI_STATUS scic_sds_phy_ready_state_event_handler(
1978f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
1979f11c7f63SJim Harris U32 event_code
1980f11c7f63SJim Harris )
1981f11c7f63SJim Harris {
1982f11c7f63SJim Harris SCI_STATUS result = SCI_FAILURE;
1983f11c7f63SJim Harris
1984f11c7f63SJim Harris switch (scu_get_event_code(event_code))
1985f11c7f63SJim Harris {
1986f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
1987f11c7f63SJim Harris // Link failure change state back to the starting state
1988f11c7f63SJim Harris sci_base_state_machine_change_state(
1989f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
1990f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
1991f11c7f63SJim Harris );
1992f11c7f63SJim Harris
1993f11c7f63SJim Harris result = SCI_SUCCESS;
1994f11c7f63SJim Harris break;
1995f11c7f63SJim Harris
1996f11c7f63SJim Harris case SCU_EVENT_BROADCAST_CHANGE:
1997f11c7f63SJim Harris // Broadcast change received. Notify the port.
1998f11c7f63SJim Harris if (scic_sds_phy_get_port(this_phy) != SCI_INVALID_HANDLE)
1999f11c7f63SJim Harris scic_sds_port_broadcast_change_received(this_phy->owning_port, this_phy);
2000f11c7f63SJim Harris else
2001f11c7f63SJim Harris this_phy->bcn_received_while_port_unassigned = TRUE;
2002f11c7f63SJim Harris break;
2003f11c7f63SJim Harris
2004f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(RX_CREDIT_BLOCKED_RECEIVED):
2005f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(TX_DONE_CREDIT_TIMEOUT):
2006f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(RX_DONE_CREDIT_TIMEOUT):
2007f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(INACTIVITY_TIMER_EXPIRED):
2008f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(TX_DONE_ACK_NAK_TIMEOUT):
2009f11c7f63SJim Harris case SCU_EVENT_ERR_CNT(RX_DONE_ACK_NAK_TIMEOUT):
2010f11c7f63SJim Harris {
2011f11c7f63SJim Harris U32 error_counter_index =
2012f11c7f63SJim Harris scu_get_event_specifier(event_code) >> SCU_EVENT_SPECIFIC_CODE_SHIFT;
2013f11c7f63SJim Harris
2014f11c7f63SJim Harris this_phy->error_counter[error_counter_index]++;
2015f11c7f63SJim Harris result = SCI_SUCCESS;
2016f11c7f63SJim Harris }
2017f11c7f63SJim Harris break;
2018f11c7f63SJim Harris
2019f11c7f63SJim Harris default:
2020f11c7f63SJim Harris SCIC_LOG_WARNING((
2021f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2022f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2023b790c193SPedro F. Giffuni "SCIC PHY 0x%x ready state machine received unexpected event_code %x\n",
2024f11c7f63SJim Harris this_phy, event_code
2025f11c7f63SJim Harris ));
2026f11c7f63SJim Harris result = SCI_FAILURE_INVALID_STATE;
2027f11c7f63SJim Harris break;
2028f11c7f63SJim Harris }
2029f11c7f63SJim Harris
2030f11c7f63SJim Harris return result;
2031f11c7f63SJim Harris }
2032f11c7f63SJim Harris
2033f11c7f63SJim Harris // ---------------------------------------------------------------------------
2034f11c7f63SJim Harris
2035f11c7f63SJim Harris /**
2036f11c7f63SJim Harris * This is the resetting state event handler.
2037f11c7f63SJim Harris *
2038f11c7f63SJim Harris * @param[in] this_phy This is the SCIC_SDS_PHY object which is receiving the
2039f11c7f63SJim Harris * event.
2040f11c7f63SJim Harris * @param[in] event_code This is the event code to be processed.
2041f11c7f63SJim Harris *
2042f11c7f63SJim Harris * @return SCI_STATUS
2043f11c7f63SJim Harris * @retval SCI_FAILURE_INVALID_STATE
2044f11c7f63SJim Harris */
2045f11c7f63SJim Harris static
scic_sds_phy_resetting_state_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2046f11c7f63SJim Harris SCI_STATUS scic_sds_phy_resetting_state_event_handler(
2047f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2048f11c7f63SJim Harris U32 event_code
2049f11c7f63SJim Harris )
2050f11c7f63SJim Harris {
2051f11c7f63SJim Harris SCI_STATUS result = SCI_FAILURE;
2052f11c7f63SJim Harris
2053f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2054f11c7f63SJim Harris {
2055f11c7f63SJim Harris case SCU_EVENT_HARD_RESET_TRANSMITTED:
2056f11c7f63SJim Harris // Link failure change state back to the starting state
2057f11c7f63SJim Harris sci_base_state_machine_change_state(
2058f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
2059f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
2060f11c7f63SJim Harris );
2061f11c7f63SJim Harris
2062f11c7f63SJim Harris result = SCI_SUCCESS;
2063f11c7f63SJim Harris break;
2064f11c7f63SJim Harris
2065f11c7f63SJim Harris default:
2066f11c7f63SJim Harris SCIC_LOG_WARNING((
2067f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2068f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2069b790c193SPedro F. Giffuni "SCIC PHY 0x%x resetting state machine received unexpected event_code %x\n",
2070f11c7f63SJim Harris this_phy, event_code
2071f11c7f63SJim Harris ));
2072f11c7f63SJim Harris
2073f11c7f63SJim Harris result = SCI_FAILURE_INVALID_STATE;
2074f11c7f63SJim Harris break;
2075f11c7f63SJim Harris }
2076f11c7f63SJim Harris
2077f11c7f63SJim Harris return result;
2078f11c7f63SJim Harris }
2079f11c7f63SJim Harris
2080f11c7f63SJim Harris // ---------------------------------------------------------------------------
2081f11c7f63SJim Harris
2082f11c7f63SJim Harris SCIC_SDS_PHY_STATE_HANDLER_T
2083f11c7f63SJim Harris scic_sds_phy_state_handler_table[SCI_BASE_PHY_MAX_STATES] =
2084f11c7f63SJim Harris {
2085f11c7f63SJim Harris // SCI_BASE_PHY_STATE_INITIAL
2086f11c7f63SJim Harris {
2087f11c7f63SJim Harris {
2088f11c7f63SJim Harris scic_sds_phy_default_start_handler,
2089f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
2090f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
2091f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
2092f11c7f63SJim Harris },
2093f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2094f11c7f63SJim Harris scic_sds_phy_default_event_handler,
2095f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2096f11c7f63SJim Harris },
2097f11c7f63SJim Harris // SCI_BASE_PHY_STATE_STOPPED
2098f11c7f63SJim Harris {
2099f11c7f63SJim Harris {
2100f11c7f63SJim Harris scic_sds_phy_stopped_state_start_handler,
2101f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
2102f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
2103f11c7f63SJim Harris scic_sds_phy_stopped_state_destroy_handler
2104f11c7f63SJim Harris },
2105f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2106f11c7f63SJim Harris scic_sds_phy_default_event_handler,
2107f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2108f11c7f63SJim Harris },
2109f11c7f63SJim Harris // SCI_BASE_PHY_STATE_STARTING
2110f11c7f63SJim Harris {
2111f11c7f63SJim Harris {
2112f11c7f63SJim Harris scic_sds_phy_default_start_handler,
2113f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
2114f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
2115f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
2116f11c7f63SJim Harris },
2117f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2118f11c7f63SJim Harris scic_sds_phy_default_event_handler,
2119f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2120f11c7f63SJim Harris },
2121f11c7f63SJim Harris // SCI_BASE_PHY_STATE_READY
2122f11c7f63SJim Harris {
2123f11c7f63SJim Harris {
2124f11c7f63SJim Harris scic_sds_phy_default_start_handler,
2125f11c7f63SJim Harris scic_sds_phy_ready_state_stop_handler,
2126f11c7f63SJim Harris scic_sds_phy_ready_state_reset_handler,
2127f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
2128f11c7f63SJim Harris },
2129f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2130f11c7f63SJim Harris scic_sds_phy_ready_state_event_handler,
2131f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2132f11c7f63SJim Harris },
2133f11c7f63SJim Harris // SCI_BASE_PHY_STATE_RESETTING
2134f11c7f63SJim Harris {
2135f11c7f63SJim Harris {
2136f11c7f63SJim Harris scic_sds_phy_default_start_handler,
2137f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
2138f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
2139f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
2140f11c7f63SJim Harris },
2141f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2142f11c7f63SJim Harris scic_sds_phy_resetting_state_event_handler,
2143f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2144f11c7f63SJim Harris },
2145f11c7f63SJim Harris // SCI_BASE_PHY_STATE_FINAL
2146f11c7f63SJim Harris {
2147f11c7f63SJim Harris {
2148f11c7f63SJim Harris scic_sds_phy_default_start_handler,
2149f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
2150f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
2151f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
2152f11c7f63SJim Harris },
2153f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
2154f11c7f63SJim Harris scic_sds_phy_default_event_handler,
2155f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
2156f11c7f63SJim Harris }
2157f11c7f63SJim Harris };
2158f11c7f63SJim Harris
2159f11c7f63SJim Harris //****************************************************************************
2160f11c7f63SJim Harris //* PHY STATE PRIVATE METHODS
2161f11c7f63SJim Harris //****************************************************************************
2162f11c7f63SJim Harris
2163f11c7f63SJim Harris /**
2164f11c7f63SJim Harris * This method will stop the SCIC_SDS_PHY object. This does not reset the
2165f11c7f63SJim Harris * protocol engine it just suspends it and places it in a state where it will
2166f11c7f63SJim Harris * not cause the end device to power up.
2167f11c7f63SJim Harris *
2168f11c7f63SJim Harris * @param[in] this_phy This is the SCIC_SDS_PHY object to stop.
2169f11c7f63SJim Harris *
2170f11c7f63SJim Harris * @return none
2171f11c7f63SJim Harris */
2172f11c7f63SJim Harris static
scu_link_layer_stop_protocol_engine(SCIC_SDS_PHY_T * this_phy)2173f11c7f63SJim Harris void scu_link_layer_stop_protocol_engine(
2174f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
2175f11c7f63SJim Harris )
2176f11c7f63SJim Harris {
2177f11c7f63SJim Harris U32 scu_sas_pcfg_value;
2178f11c7f63SJim Harris U32 enable_spinup_value;
2179f11c7f63SJim Harris
2180f11c7f63SJim Harris // Suspend the protocol engine and place it in a sata spinup hold state
2181f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
2182f11c7f63SJim Harris scu_sas_pcfg_value |= (
2183f11c7f63SJim Harris SCU_SAS_PCFG_GEN_BIT(OOB_RESET)
2184f11c7f63SJim Harris | SCU_SAS_PCFG_GEN_BIT(SUSPEND_PROTOCOL_ENGINE)
2185f11c7f63SJim Harris | SCU_SAS_PCFG_GEN_BIT(SATA_SPINUP_HOLD)
2186f11c7f63SJim Harris );
2187f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
2188f11c7f63SJim Harris
2189f11c7f63SJim Harris // Disable the notify enable spinup primitives
2190f11c7f63SJim Harris enable_spinup_value = SCU_SAS_ENSPINUP_READ(this_phy);
2191f11c7f63SJim Harris enable_spinup_value &= ~SCU_ENSPINUP_GEN_BIT(ENABLE);
2192f11c7f63SJim Harris SCU_SAS_ENSPINUP_WRITE(this_phy, enable_spinup_value);
2193f11c7f63SJim Harris }
2194f11c7f63SJim Harris
2195f11c7f63SJim Harris /**
2196f11c7f63SJim Harris * This method will start the OOB/SN state machine for this SCIC_SDS_PHY
2197f11c7f63SJim Harris * object.
2198f11c7f63SJim Harris *
2199f11c7f63SJim Harris * @param[in] this_phy This is the SCIC_SDS_PHY object on which to start the
2200f11c7f63SJim Harris * OOB/SN state machine.
2201f11c7f63SJim Harris */
2202f11c7f63SJim Harris static
scu_link_layer_start_oob(SCIC_SDS_PHY_T * this_phy)2203f11c7f63SJim Harris void scu_link_layer_start_oob(
2204f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
2205f11c7f63SJim Harris )
2206f11c7f63SJim Harris {
2207f11c7f63SJim Harris U32 scu_sas_pcfg_value;
2208f11c7f63SJim Harris
2209f11c7f63SJim Harris /* Reset OOB sequence - start */
2210f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
2211f11c7f63SJim Harris scu_sas_pcfg_value &=
2212f11c7f63SJim Harris ~(SCU_SAS_PCFG_GEN_BIT(OOB_RESET) | SCU_SAS_PCFG_GEN_BIT(HARD_RESET));
2213f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
2214f11c7f63SJim Harris SCU_SAS_PCFG_READ(this_phy);
2215f11c7f63SJim Harris /* Reset OOB sequence - end */
2216f11c7f63SJim Harris
2217f11c7f63SJim Harris /* Start OOB sequence - start */
2218f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
2219f11c7f63SJim Harris scu_sas_pcfg_value |= SCU_SAS_PCFG_GEN_BIT(OOB_ENABLE);
2220f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
2221f11c7f63SJim Harris SCU_SAS_PCFG_READ(this_phy);
2222f11c7f63SJim Harris /* Start OOB sequence - end */
2223f11c7f63SJim Harris }
2224f11c7f63SJim Harris
2225f11c7f63SJim Harris /**
2226f11c7f63SJim Harris * This method will transmit a hard reset request on the specified phy. The
2227f11c7f63SJim Harris * SCU hardware requires that we reset the OOB state machine and set the hard
2228f11c7f63SJim Harris * reset bit in the phy configuration register.
2229f11c7f63SJim Harris * We then must start OOB over with the hard reset bit set.
2230f11c7f63SJim Harris *
2231f11c7f63SJim Harris * @param[in] this_phy
2232f11c7f63SJim Harris */
2233f11c7f63SJim Harris static
scu_link_layer_tx_hard_reset(SCIC_SDS_PHY_T * this_phy)2234f11c7f63SJim Harris void scu_link_layer_tx_hard_reset(
2235f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
2236f11c7f63SJim Harris )
2237f11c7f63SJim Harris {
2238f11c7f63SJim Harris U32 phy_configuration_value;
2239f11c7f63SJim Harris
2240f11c7f63SJim Harris // SAS Phys must wait for the HARD_RESET_TX event notification to transition
2241f11c7f63SJim Harris // to the starting state.
2242f11c7f63SJim Harris phy_configuration_value = SCU_SAS_PCFG_READ(this_phy);
2243f11c7f63SJim Harris phy_configuration_value |=
2244f11c7f63SJim Harris (SCU_SAS_PCFG_GEN_BIT(HARD_RESET) | SCU_SAS_PCFG_GEN_BIT(OOB_RESET));
2245f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, phy_configuration_value);
2246f11c7f63SJim Harris
2247f11c7f63SJim Harris // Now take the OOB state machine out of reset
2248f11c7f63SJim Harris phy_configuration_value |= SCU_SAS_PCFG_GEN_BIT(OOB_ENABLE);
2249f11c7f63SJim Harris phy_configuration_value &= ~SCU_SAS_PCFG_GEN_BIT(OOB_RESET);
2250f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, phy_configuration_value);
2251f11c7f63SJim Harris }
2252f11c7f63SJim Harris
2253f11c7f63SJim Harris //****************************************************************************
2254f11c7f63SJim Harris //* PHY BASE STATE METHODS
2255f11c7f63SJim Harris //****************************************************************************
2256f11c7f63SJim Harris
2257f11c7f63SJim Harris /**
2258f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2259f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_INITIAL.
2260f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2261f11c7f63SJim Harris * machine initial state.
2262f11c7f63SJim Harris *
2263f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2264f11c7f63SJim Harris * SCIC_SDS_PHY object.
2265f11c7f63SJim Harris *
2266f11c7f63SJim Harris * @return none
2267f11c7f63SJim Harris */
2268f11c7f63SJim Harris static
scic_sds_phy_initial_state_enter(SCI_BASE_OBJECT_T * object)2269f11c7f63SJim Harris void scic_sds_phy_initial_state_enter(
2270f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2271f11c7f63SJim Harris )
2272f11c7f63SJim Harris {
2273f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2274f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2275f11c7f63SJim Harris
2276f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_INITIAL);
2277f11c7f63SJim Harris }
2278f11c7f63SJim Harris
2279f11c7f63SJim Harris /**
2280f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2281f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_INITIAL.
2282f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2283f11c7f63SJim Harris * machine initial state.
2284f11c7f63SJim Harris * - The SCU hardware is requested to stop the protocol engine.
2285f11c7f63SJim Harris *
2286f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2287f11c7f63SJim Harris * SCIC_SDS_PHY object.
2288f11c7f63SJim Harris *
2289f11c7f63SJim Harris * @return none
2290f11c7f63SJim Harris */
2291f11c7f63SJim Harris static
scic_sds_phy_stopped_state_enter(SCI_BASE_OBJECT_T * object)2292f11c7f63SJim Harris void scic_sds_phy_stopped_state_enter(
2293f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2294f11c7f63SJim Harris )
2295f11c7f63SJim Harris {
2296f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2297f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2298f11c7f63SJim Harris
2299f11c7f63SJim Harris /// @todo We need to get to the controller to place this PE in a reset state
2300f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_STOPPED);
2301f11c7f63SJim Harris
2302f11c7f63SJim Harris if (this_phy->sata_timeout_timer != NULL)
2303f11c7f63SJim Harris {
2304f11c7f63SJim Harris scic_cb_timer_destroy(
2305f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
2306f11c7f63SJim Harris this_phy->sata_timeout_timer
2307f11c7f63SJim Harris );
2308f11c7f63SJim Harris
2309f11c7f63SJim Harris this_phy->sata_timeout_timer = NULL;
2310f11c7f63SJim Harris }
2311f11c7f63SJim Harris
2312f11c7f63SJim Harris scu_link_layer_stop_protocol_engine(this_phy);
2313f11c7f63SJim Harris }
2314f11c7f63SJim Harris
2315f11c7f63SJim Harris /**
2316f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2317f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_STARTING.
2318f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2319f11c7f63SJim Harris * machine starting state.
232026f370d0SKevin Lo * - The SCU hardware is requested to start OOB/SN on this protocol engine.
2321f11c7f63SJim Harris * - The phy starting substate machine is started.
2322f11c7f63SJim Harris * - If the previous state was the ready state then the
2323f11c7f63SJim Harris * SCIC_SDS_CONTROLLER is informed that the phy has gone link down.
2324f11c7f63SJim Harris *
2325f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2326f11c7f63SJim Harris * SCIC_SDS_PHY object.
2327f11c7f63SJim Harris *
2328f11c7f63SJim Harris * @return none
2329f11c7f63SJim Harris */
2330f11c7f63SJim Harris static
scic_sds_phy_starting_state_enter(SCI_BASE_OBJECT_T * object)2331f11c7f63SJim Harris void scic_sds_phy_starting_state_enter(
2332f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2333f11c7f63SJim Harris )
2334f11c7f63SJim Harris {
2335f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2336f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2337f11c7f63SJim Harris
2338f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_STARTING);
2339f11c7f63SJim Harris
2340f11c7f63SJim Harris scu_link_layer_stop_protocol_engine(this_phy);
2341f11c7f63SJim Harris scu_link_layer_start_oob(this_phy);
2342f11c7f63SJim Harris
2343f11c7f63SJim Harris // We don't know what kind of phy we are going to be just yet
2344f11c7f63SJim Harris this_phy->protocol = SCIC_SDS_PHY_PROTOCOL_UNKNOWN;
2345f11c7f63SJim Harris this_phy->bcn_received_while_port_unassigned = FALSE;
2346f11c7f63SJim Harris
2347f11c7f63SJim Harris // Change over to the starting substate machine to continue
2348f11c7f63SJim Harris sci_base_state_machine_start(&this_phy->starting_substate_machine);
2349f11c7f63SJim Harris
2350f11c7f63SJim Harris if (this_phy->parent.state_machine.previous_state_id
2351f11c7f63SJim Harris == SCI_BASE_PHY_STATE_READY)
2352f11c7f63SJim Harris {
2353f11c7f63SJim Harris scic_sds_controller_link_down(
2354f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
2355f11c7f63SJim Harris scic_sds_phy_get_port(this_phy),
2356f11c7f63SJim Harris this_phy
2357f11c7f63SJim Harris );
2358f11c7f63SJim Harris }
2359f11c7f63SJim Harris }
2360f11c7f63SJim Harris
2361f11c7f63SJim Harris /**
2362f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2363f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_READY.
2364f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2365f11c7f63SJim Harris * machine ready state.
2366f11c7f63SJim Harris * - The SCU hardware protocol engine is resumed.
2367f11c7f63SJim Harris * - The SCIC_SDS_CONTROLLER is informed that the phy object has gone link
2368f11c7f63SJim Harris * up.
2369f11c7f63SJim Harris *
2370f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2371f11c7f63SJim Harris * SCIC_SDS_PHY object.
2372f11c7f63SJim Harris *
2373f11c7f63SJim Harris * @return none
2374f11c7f63SJim Harris */
2375f11c7f63SJim Harris static
scic_sds_phy_ready_state_enter(SCI_BASE_OBJECT_T * object)2376f11c7f63SJim Harris void scic_sds_phy_ready_state_enter(
2377f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2378f11c7f63SJim Harris )
2379f11c7f63SJim Harris {
2380f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2381f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2382f11c7f63SJim Harris
2383f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_READY);
2384f11c7f63SJim Harris
2385f11c7f63SJim Harris scic_sds_controller_link_up(
2386f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
2387f11c7f63SJim Harris scic_sds_phy_get_port(this_phy),
2388f11c7f63SJim Harris this_phy
2389f11c7f63SJim Harris );
2390f11c7f63SJim Harris }
2391f11c7f63SJim Harris
2392f11c7f63SJim Harris /**
2393f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2394f11c7f63SJim Harris * exiting the SCI_BASE_PHY_STATE_INITIAL. This function suspends the SCU
2395f11c7f63SJim Harris * hardware protocol engine represented by this SCIC_SDS_PHY object.
2396f11c7f63SJim Harris *
2397f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2398f11c7f63SJim Harris * SCIC_SDS_PHY object.
2399f11c7f63SJim Harris *
2400f11c7f63SJim Harris * @return none
2401f11c7f63SJim Harris */
2402f11c7f63SJim Harris static
scic_sds_phy_ready_state_exit(SCI_BASE_OBJECT_T * object)2403f11c7f63SJim Harris void scic_sds_phy_ready_state_exit(
2404f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2405f11c7f63SJim Harris )
2406f11c7f63SJim Harris {
2407f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2408f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2409f11c7f63SJim Harris
2410f11c7f63SJim Harris scic_sds_phy_suspend(this_phy);
2411f11c7f63SJim Harris }
2412f11c7f63SJim Harris
2413f11c7f63SJim Harris /**
2414f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2415f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_RESETTING.
2416f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2417f11c7f63SJim Harris * machine resetting state.
2418f11c7f63SJim Harris *
2419f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2420f11c7f63SJim Harris * SCIC_SDS_PHY object.
2421f11c7f63SJim Harris *
2422f11c7f63SJim Harris * @return none
2423f11c7f63SJim Harris */
2424f11c7f63SJim Harris static
scic_sds_phy_resetting_state_enter(SCI_BASE_OBJECT_T * object)2425f11c7f63SJim Harris void scic_sds_phy_resetting_state_enter(
2426f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2427f11c7f63SJim Harris )
2428f11c7f63SJim Harris {
2429f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy;
2430f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2431f11c7f63SJim Harris
2432f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_RESETTING);
2433f11c7f63SJim Harris
2434f11c7f63SJim Harris // The phy is being reset, therefore deactivate it from the port.
2435f11c7f63SJim Harris // In the resetting state we don't notify the user regarding
2436f11c7f63SJim Harris // link up and link down notifications.
2437f11c7f63SJim Harris scic_sds_port_deactivate_phy(this_phy->owning_port, this_phy, FALSE);
2438f11c7f63SJim Harris
2439f11c7f63SJim Harris if (this_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS)
2440f11c7f63SJim Harris {
2441f11c7f63SJim Harris scu_link_layer_tx_hard_reset(this_phy);
2442f11c7f63SJim Harris }
2443f11c7f63SJim Harris else
2444f11c7f63SJim Harris {
2445f11c7f63SJim Harris // The SCU does not need to have a descrete reset state so just go back to
2446f11c7f63SJim Harris // the starting state.
2447f11c7f63SJim Harris sci_base_state_machine_change_state(
2448f11c7f63SJim Harris &this_phy->parent.state_machine,
2449f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
2450f11c7f63SJim Harris );
2451f11c7f63SJim Harris }
2452f11c7f63SJim Harris }
2453f11c7f63SJim Harris
2454f11c7f63SJim Harris /**
2455f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
2456f11c7f63SJim Harris * entering the SCI_BASE_PHY_STATE_FINAL.
2457f11c7f63SJim Harris * - This function sets the state handlers for the phy object base state
2458f11c7f63SJim Harris * machine final state.
2459f11c7f63SJim Harris *
2460f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
2461f11c7f63SJim Harris * SCIC_SDS_PHY object.
2462f11c7f63SJim Harris *
2463f11c7f63SJim Harris * @return none
2464f11c7f63SJim Harris */
2465f11c7f63SJim Harris static
scic_sds_phy_final_state_enter(SCI_BASE_OBJECT_T * object)2466f11c7f63SJim Harris void scic_sds_phy_final_state_enter(
2467f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
2468f11c7f63SJim Harris )
2469f11c7f63SJim Harris {
2470f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2471f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
2472f11c7f63SJim Harris
2473f11c7f63SJim Harris scic_sds_phy_set_base_state_handlers(this_phy, SCI_BASE_PHY_STATE_FINAL);
2474f11c7f63SJim Harris
2475f11c7f63SJim Harris // Nothing to do here
2476f11c7f63SJim Harris }
2477f11c7f63SJim Harris
2478f11c7f63SJim Harris // ---------------------------------------------------------------------------
2479f11c7f63SJim Harris
2480f11c7f63SJim Harris SCI_BASE_STATE_T scic_sds_phy_state_table[SCI_BASE_PHY_MAX_STATES] =
2481f11c7f63SJim Harris {
2482f11c7f63SJim Harris {
2483f11c7f63SJim Harris SCI_BASE_PHY_STATE_INITIAL,
2484f11c7f63SJim Harris scic_sds_phy_initial_state_enter,
2485f11c7f63SJim Harris NULL,
2486f11c7f63SJim Harris },
2487f11c7f63SJim Harris {
2488f11c7f63SJim Harris SCI_BASE_PHY_STATE_STOPPED,
2489f11c7f63SJim Harris scic_sds_phy_stopped_state_enter,
2490f11c7f63SJim Harris NULL,
2491f11c7f63SJim Harris },
2492f11c7f63SJim Harris {
2493f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING,
2494f11c7f63SJim Harris scic_sds_phy_starting_state_enter,
2495f11c7f63SJim Harris NULL,
2496f11c7f63SJim Harris },
2497f11c7f63SJim Harris {
2498f11c7f63SJim Harris SCI_BASE_PHY_STATE_READY,
2499f11c7f63SJim Harris scic_sds_phy_ready_state_enter,
2500f11c7f63SJim Harris scic_sds_phy_ready_state_exit,
2501f11c7f63SJim Harris },
2502f11c7f63SJim Harris {
2503f11c7f63SJim Harris SCI_BASE_PHY_STATE_RESETTING,
2504f11c7f63SJim Harris scic_sds_phy_resetting_state_enter,
2505f11c7f63SJim Harris NULL,
2506f11c7f63SJim Harris },
2507f11c7f63SJim Harris {
2508f11c7f63SJim Harris SCI_BASE_PHY_STATE_FINAL,
2509f11c7f63SJim Harris scic_sds_phy_final_state_enter,
2510f11c7f63SJim Harris NULL,
2511f11c7f63SJim Harris }
2512f11c7f63SJim Harris };
2513f11c7f63SJim Harris
2514f11c7f63SJim Harris //******************************************************************************
2515f11c7f63SJim Harris //* PHY STARTING SUB-STATE MACHINE
2516f11c7f63SJim Harris //******************************************************************************
2517f11c7f63SJim Harris
2518f11c7f63SJim Harris //*****************************************************************************
2519f11c7f63SJim Harris //* SCIC SDS PHY HELPER FUNCTIONS
2520f11c7f63SJim Harris //*****************************************************************************
2521f11c7f63SJim Harris
2522f11c7f63SJim Harris
2523f11c7f63SJim Harris /**
2524f11c7f63SJim Harris * This method continues the link training for the phy as if it were a SAS PHY
2525f11c7f63SJim Harris * instead of a SATA PHY. This is done because the completion queue had a SAS
2526f11c7f63SJim Harris * PHY DETECTED event when the state machine was expecting a SATA PHY event.
2527f11c7f63SJim Harris *
2528f11c7f63SJim Harris * @param[in] this_phy The phy object that received SAS PHY DETECTED.
2529f11c7f63SJim Harris *
2530f11c7f63SJim Harris * @return none
2531f11c7f63SJim Harris */
2532f11c7f63SJim Harris static
scic_sds_phy_start_sas_link_training(SCIC_SDS_PHY_T * this_phy)2533f11c7f63SJim Harris void scic_sds_phy_start_sas_link_training(
2534f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
2535f11c7f63SJim Harris )
2536f11c7f63SJim Harris {
2537f11c7f63SJim Harris U32 phy_control;
2538f11c7f63SJim Harris
2539f11c7f63SJim Harris phy_control = SCU_SAS_PCFG_READ(this_phy);
2540f11c7f63SJim Harris phy_control |= SCU_SAS_PCFG_GEN_BIT(SATA_SPINUP_HOLD);
2541f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, phy_control);
2542f11c7f63SJim Harris
2543f11c7f63SJim Harris sci_base_state_machine_change_state(
2544f11c7f63SJim Harris &this_phy->starting_substate_machine,
2545f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN
2546f11c7f63SJim Harris );
2547f11c7f63SJim Harris
2548f11c7f63SJim Harris this_phy->protocol = SCIC_SDS_PHY_PROTOCOL_SAS;
2549f11c7f63SJim Harris }
2550f11c7f63SJim Harris
2551f11c7f63SJim Harris /**
2552f11c7f63SJim Harris * This method continues the link training for the phy as if it were a SATA
2553f11c7f63SJim Harris * PHY instead of a SAS PHY. This is done because the completion queue had a
2554f11c7f63SJim Harris * SATA SPINUP HOLD event when the state machine was expecting a SAS PHY
2555f11c7f63SJim Harris * event.
2556f11c7f63SJim Harris *
2557f11c7f63SJim Harris * @param[in] this_phy The phy object that received a SATA SPINUP HOLD event
2558f11c7f63SJim Harris *
2559f11c7f63SJim Harris * @return none
2560f11c7f63SJim Harris */
2561f11c7f63SJim Harris static
scic_sds_phy_start_sata_link_training(SCIC_SDS_PHY_T * this_phy)2562f11c7f63SJim Harris void scic_sds_phy_start_sata_link_training(
2563f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy
2564f11c7f63SJim Harris )
2565f11c7f63SJim Harris {
2566f11c7f63SJim Harris sci_base_state_machine_change_state(
2567f11c7f63SJim Harris &this_phy->starting_substate_machine,
2568f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER
2569f11c7f63SJim Harris );
2570f11c7f63SJim Harris
2571f11c7f63SJim Harris this_phy->protocol = SCIC_SDS_PHY_PROTOCOL_SATA;
2572f11c7f63SJim Harris }
2573f11c7f63SJim Harris
2574f11c7f63SJim Harris /**
2575f11c7f63SJim Harris * @brief This method performs processing common to all protocols upon
2576f11c7f63SJim Harris * completion of link training.
2577f11c7f63SJim Harris *
2578f11c7f63SJim Harris * @param[in,out] this_phy This parameter specifies the phy object for which
2579f11c7f63SJim Harris * link training has completed.
2580f11c7f63SJim Harris * @param[in] max_link_rate This parameter specifies the maximum link
2581f11c7f63SJim Harris * rate to be associated with this phy.
2582f11c7f63SJim Harris * @param[in] next_state This parameter specifies the next state for the
2583f11c7f63SJim Harris * phy's starting sub-state machine.
2584f11c7f63SJim Harris *
2585f11c7f63SJim Harris * @return none
2586f11c7f63SJim Harris */
2587f11c7f63SJim Harris static
scic_sds_phy_complete_link_training(SCIC_SDS_PHY_T * this_phy,SCI_SAS_LINK_RATE max_link_rate,U32 next_state)2588f11c7f63SJim Harris void scic_sds_phy_complete_link_training(
2589f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy,
2590f11c7f63SJim Harris SCI_SAS_LINK_RATE max_link_rate,
2591f11c7f63SJim Harris U32 next_state
2592f11c7f63SJim Harris )
2593f11c7f63SJim Harris {
2594f11c7f63SJim Harris this_phy->max_negotiated_speed = max_link_rate;
2595f11c7f63SJim Harris
2596f11c7f63SJim Harris sci_base_state_machine_change_state(
2597f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy), next_state
2598f11c7f63SJim Harris );
2599f11c7f63SJim Harris }
2600f11c7f63SJim Harris
2601f11c7f63SJim Harris /**
2602f11c7f63SJim Harris * This method restarts the SCIC_SDS_PHY objects base state machine in the
2603f11c7f63SJim Harris * starting state from any starting substate.
2604f11c7f63SJim Harris *
2605f11c7f63SJim Harris * @param[in] this_phy The SCIC_SDS_PHY object to restart.
2606f11c7f63SJim Harris *
2607f11c7f63SJim Harris * @return none
2608f11c7f63SJim Harris */
scic_sds_phy_restart_starting_state(SCIC_SDS_PHY_T * this_phy)2609f11c7f63SJim Harris void scic_sds_phy_restart_starting_state(
2610f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
2611f11c7f63SJim Harris )
2612f11c7f63SJim Harris {
2613f11c7f63SJim Harris // Stop the current substate machine
2614f11c7f63SJim Harris sci_base_state_machine_stop(
2615f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy)
2616f11c7f63SJim Harris );
2617f11c7f63SJim Harris
2618f11c7f63SJim Harris // Re-enter the base state machine starting state
2619f11c7f63SJim Harris sci_base_state_machine_change_state(
2620f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
2621f11c7f63SJim Harris SCI_BASE_PHY_STATE_STARTING
2622f11c7f63SJim Harris );
2623f11c7f63SJim Harris }
2624f11c7f63SJim Harris
2625f11c7f63SJim Harris
2626f11c7f63SJim Harris //*****************************************************************************
2627f11c7f63SJim Harris //* SCIC SDS PHY general handlers
2628f11c7f63SJim Harris //*****************************************************************************
2629f11c7f63SJim Harris
2630f11c7f63SJim Harris static
scic_sds_phy_starting_substate_general_stop_handler(SCI_BASE_PHY_T * phy)2631f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_general_stop_handler(
2632f11c7f63SJim Harris SCI_BASE_PHY_T *phy
2633f11c7f63SJim Harris )
2634f11c7f63SJim Harris {
2635f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
2636f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)phy;
2637f11c7f63SJim Harris
2638f11c7f63SJim Harris sci_base_state_machine_stop(
2639f11c7f63SJim Harris &this_phy->starting_substate_machine
2640f11c7f63SJim Harris );
2641f11c7f63SJim Harris
2642f11c7f63SJim Harris sci_base_state_machine_change_state(
2643f11c7f63SJim Harris &phy->state_machine,
2644f11c7f63SJim Harris SCI_BASE_PHY_STATE_STOPPED
2645f11c7f63SJim Harris );
2646f11c7f63SJim Harris
2647f11c7f63SJim Harris return SCI_SUCCESS;
2648f11c7f63SJim Harris }
2649f11c7f63SJim Harris
2650f11c7f63SJim Harris //*****************************************************************************
2651f11c7f63SJim Harris //* SCIC SDS PHY EVENT_HANDLERS
2652f11c7f63SJim Harris //*****************************************************************************
2653f11c7f63SJim Harris
2654f11c7f63SJim Harris /**
2655f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2656f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SPEED_EN.
2657f11c7f63SJim Harris * - decode the event
2658f11c7f63SJim Harris * - sas phy detected causes a state transition to the wait for speed
2659f11c7f63SJim Harris * event notification.
2660f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2661f11c7f63SJim Harris *
2662f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2663f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2664f11c7f63SJim Harris * decode.
2665f11c7f63SJim Harris *
2666f11c7f63SJim Harris * @return SCI_STATUS
2667f11c7f63SJim Harris * @retval SCI_SUCCESS on any valid event notification
2668f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2669f11c7f63SJim Harris */
2670f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_ossp_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2671f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_ossp_event_handler(
2672f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2673f11c7f63SJim Harris U32 event_code
2674f11c7f63SJim Harris )
2675f11c7f63SJim Harris {
2676f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2677f11c7f63SJim Harris
2678f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2679f11c7f63SJim Harris {
2680f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
2681f11c7f63SJim Harris scic_sds_phy_start_sas_link_training(this_phy);
2682f11c7f63SJim Harris this_phy->is_in_link_training = TRUE;
2683f11c7f63SJim Harris break;
2684f11c7f63SJim Harris
2685f11c7f63SJim Harris case SCU_EVENT_SATA_SPINUP_HOLD:
2686f11c7f63SJim Harris scic_sds_phy_start_sata_link_training(this_phy);
2687f11c7f63SJim Harris this_phy->is_in_link_training = TRUE;
2688f11c7f63SJim Harris break;
2689f11c7f63SJim Harris
2690f11c7f63SJim Harris default:
2691f11c7f63SJim Harris SCIC_LOG_WARNING((
2692f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2693f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2694b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
2695f11c7f63SJim Harris event_code
2696f11c7f63SJim Harris ));
2697f11c7f63SJim Harris
2698f11c7f63SJim Harris result = SCI_FAILURE;
2699f11c7f63SJim Harris break;
2700f11c7f63SJim Harris }
2701f11c7f63SJim Harris
2702f11c7f63SJim Harris return result;
2703f11c7f63SJim Harris }
2704f11c7f63SJim Harris
2705f11c7f63SJim Harris /**
2706f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2707f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SPEED_EN.
2708f11c7f63SJim Harris * - decode the event
2709f11c7f63SJim Harris * - sas phy detected returns us back to this state.
2710f11c7f63SJim Harris * - speed event detected causes a state transition to the wait for iaf.
2711f11c7f63SJim Harris * - identify timeout is an un-expected event and the state machine is
2712f11c7f63SJim Harris * restarted.
2713f11c7f63SJim Harris * - link failure events restart the starting state machine
2714f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2715f11c7f63SJim Harris *
2716f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2717f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2718f11c7f63SJim Harris * decode.
2719f11c7f63SJim Harris *
2720f11c7f63SJim Harris * @return SCI_STATUS
2721f11c7f63SJim Harris * @retval SCI_SUCCESS on any valid event notification
2722f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2723f11c7f63SJim Harris */
2724f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sas_phy_speed_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2725f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sas_phy_speed_event_handler(
2726f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2727f11c7f63SJim Harris U32 event_code
2728f11c7f63SJim Harris )
2729f11c7f63SJim Harris {
2730f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2731f11c7f63SJim Harris
2732f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2733f11c7f63SJim Harris {
2734f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
2735f11c7f63SJim Harris // Why is this being reported again by the controller?
2736f11c7f63SJim Harris // We would re-enter this state so just stay here
2737f11c7f63SJim Harris break;
2738f11c7f63SJim Harris
2739f11c7f63SJim Harris case SCU_EVENT_SAS_15:
2740f11c7f63SJim Harris case SCU_EVENT_SAS_15_SSC:
2741f11c7f63SJim Harris scic_sds_phy_complete_link_training(
2742f11c7f63SJim Harris this_phy, SCI_SAS_150_GB, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF
2743f11c7f63SJim Harris );
2744f11c7f63SJim Harris break;
2745f11c7f63SJim Harris
2746f11c7f63SJim Harris case SCU_EVENT_SAS_30:
2747f11c7f63SJim Harris case SCU_EVENT_SAS_30_SSC:
2748f11c7f63SJim Harris scic_sds_phy_complete_link_training(
2749f11c7f63SJim Harris this_phy, SCI_SAS_300_GB, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF
2750f11c7f63SJim Harris );
2751f11c7f63SJim Harris break;
2752f11c7f63SJim Harris
2753f11c7f63SJim Harris case SCU_EVENT_SAS_60:
2754f11c7f63SJim Harris case SCU_EVENT_SAS_60_SSC:
2755f11c7f63SJim Harris scic_sds_phy_complete_link_training(
2756f11c7f63SJim Harris this_phy, SCI_SAS_600_GB, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF
2757f11c7f63SJim Harris );
2758f11c7f63SJim Harris break;
2759f11c7f63SJim Harris
2760f11c7f63SJim Harris case SCU_EVENT_SATA_SPINUP_HOLD:
2761f11c7f63SJim Harris // We were doing SAS PHY link training and received a SATA PHY event
2762f11c7f63SJim Harris // continue OOB/SN as if this were a SATA PHY
2763f11c7f63SJim Harris scic_sds_phy_start_sata_link_training(this_phy);
2764f11c7f63SJim Harris break;
2765f11c7f63SJim Harris
2766f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
2767f11c7f63SJim Harris // Link failure change state back to the starting state
2768f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
2769f11c7f63SJim Harris break;
2770f11c7f63SJim Harris
2771f11c7f63SJim Harris default:
2772f11c7f63SJim Harris SCIC_LOG_WARNING((
2773f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2774f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2775b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
2776f11c7f63SJim Harris event_code
2777f11c7f63SJim Harris ));
2778f11c7f63SJim Harris
2779f11c7f63SJim Harris result = SCI_FAILURE;
2780f11c7f63SJim Harris break;
2781f11c7f63SJim Harris }
2782f11c7f63SJim Harris
2783f11c7f63SJim Harris return result;
2784f11c7f63SJim Harris }
2785f11c7f63SJim Harris
2786f11c7f63SJim Harris /**
2787f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2788f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF.
2789f11c7f63SJim Harris * - decode the event
2790f11c7f63SJim Harris * - sas phy detected event backs up the state machine to the await
2791f11c7f63SJim Harris * speed notification.
2792f11c7f63SJim Harris * - identify timeout is an un-expected event and the state machine is
2793f11c7f63SJim Harris * restarted.
2794f11c7f63SJim Harris * - link failure events restart the starting state machine
2795f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2796f11c7f63SJim Harris *
2797f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2798f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2799f11c7f63SJim Harris * decode.
2800f11c7f63SJim Harris *
2801f11c7f63SJim Harris * @return SCI_STATUS
2802f11c7f63SJim Harris * @retval SCI_SUCCESS on any valid event notification
2803f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2804f11c7f63SJim Harris */
2805f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_iaf_uf_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2806f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_iaf_uf_event_handler(
2807f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2808f11c7f63SJim Harris U32 event_code
2809f11c7f63SJim Harris )
2810f11c7f63SJim Harris {
2811f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2812f11c7f63SJim Harris
2813f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2814f11c7f63SJim Harris {
2815f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
2816f11c7f63SJim Harris // Backup the state machine
2817f11c7f63SJim Harris scic_sds_phy_start_sas_link_training(this_phy);
2818f11c7f63SJim Harris break;
2819f11c7f63SJim Harris
2820f11c7f63SJim Harris case SCU_EVENT_SATA_SPINUP_HOLD:
2821f11c7f63SJim Harris // We were doing SAS PHY link training and received a SATA PHY event
2822f11c7f63SJim Harris // continue OOB/SN as if this were a SATA PHY
2823f11c7f63SJim Harris scic_sds_phy_start_sata_link_training(this_phy);
2824f11c7f63SJim Harris break;
2825f11c7f63SJim Harris
2826f11c7f63SJim Harris case SCU_EVENT_RECEIVED_IDENTIFY_TIMEOUT:
2827f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
2828f11c7f63SJim Harris case SCU_EVENT_HARD_RESET_RECEIVED:
2829f11c7f63SJim Harris // Start the oob/sn state machine over again
2830f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
2831f11c7f63SJim Harris break;
2832f11c7f63SJim Harris
2833f11c7f63SJim Harris default:
2834f11c7f63SJim Harris SCIC_LOG_WARNING((
2835f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2836f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2837b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
2838f11c7f63SJim Harris event_code
2839f11c7f63SJim Harris ));
2840f11c7f63SJim Harris
2841f11c7f63SJim Harris result = SCI_FAILURE;
2842f11c7f63SJim Harris break;
2843f11c7f63SJim Harris }
2844f11c7f63SJim Harris
2845f11c7f63SJim Harris return result;
2846f11c7f63SJim Harris }
2847f11c7f63SJim Harris
2848f11c7f63SJim Harris /**
2849f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2850f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_POWER.
2851f11c7f63SJim Harris * - decode the event
2852f11c7f63SJim Harris * - link failure events restart the starting state machine
2853f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2854f11c7f63SJim Harris *
2855f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2856f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2857f11c7f63SJim Harris * decode.
2858f11c7f63SJim Harris *
2859f11c7f63SJim Harris * @return SCI_STATUS
2860f11c7f63SJim Harris * @retval SCI_SUCCESS on a link failure event
2861f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2862f11c7f63SJim Harris */
2863f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sas_power_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2864f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sas_power_event_handler(
2865f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2866f11c7f63SJim Harris U32 event_code
2867f11c7f63SJim Harris )
2868f11c7f63SJim Harris {
2869f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2870f11c7f63SJim Harris
2871f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2872f11c7f63SJim Harris {
2873f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
2874f11c7f63SJim Harris // Link failure change state back to the starting state
2875f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
2876f11c7f63SJim Harris break;
2877f11c7f63SJim Harris
2878f11c7f63SJim Harris default:
2879f11c7f63SJim Harris SCIC_LOG_WARNING((
2880f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2881f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2882b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
2883f11c7f63SJim Harris event_code
2884f11c7f63SJim Harris ));
2885f11c7f63SJim Harris
2886f11c7f63SJim Harris result = SCI_FAILURE;
2887f11c7f63SJim Harris break;
2888f11c7f63SJim Harris }
2889f11c7f63SJim Harris
2890f11c7f63SJim Harris return result;
2891f11c7f63SJim Harris }
2892f11c7f63SJim Harris
2893f11c7f63SJim Harris /**
2894f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2895f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER.
2896f11c7f63SJim Harris * - decode the event
2897f11c7f63SJim Harris * - link failure events restart the starting state machine
2898f11c7f63SJim Harris * - sata spinup hold events are ignored since they are expected
2899f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2900f11c7f63SJim Harris *
2901f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2902f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2903f11c7f63SJim Harris * decode.
2904f11c7f63SJim Harris *
2905f11c7f63SJim Harris * @return SCI_STATUS
2906f11c7f63SJim Harris * @retval SCI_SUCCESS on a link failure event
2907f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2908f11c7f63SJim Harris */
2909f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sata_power_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2910f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sata_power_event_handler(
2911f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2912f11c7f63SJim Harris U32 event_code
2913f11c7f63SJim Harris )
2914f11c7f63SJim Harris {
2915f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2916f11c7f63SJim Harris
2917f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2918f11c7f63SJim Harris {
2919f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
2920f11c7f63SJim Harris // Link failure change state back to the starting state
2921f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
2922f11c7f63SJim Harris break;
2923f11c7f63SJim Harris
2924f11c7f63SJim Harris case SCU_EVENT_SATA_SPINUP_HOLD:
2925f11c7f63SJim Harris // These events are received every 10ms and are expected while in this state
2926f11c7f63SJim Harris break;
2927f11c7f63SJim Harris
2928f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
2929f11c7f63SJim Harris // There has been a change in the phy type before OOB/SN for the
2930f11c7f63SJim Harris // SATA finished start down the SAS link traning path.
2931f11c7f63SJim Harris scic_sds_phy_start_sas_link_training(this_phy);
2932f11c7f63SJim Harris break;
2933f11c7f63SJim Harris
2934f11c7f63SJim Harris default:
2935f11c7f63SJim Harris SCIC_LOG_WARNING((
2936f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
2937f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
2938b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
2939f11c7f63SJim Harris event_code
2940f11c7f63SJim Harris ));
2941f11c7f63SJim Harris
2942f11c7f63SJim Harris result = SCI_FAILURE;
2943f11c7f63SJim Harris break;
2944f11c7f63SJim Harris }
2945f11c7f63SJim Harris
2946f11c7f63SJim Harris return result;
2947f11c7f63SJim Harris }
2948f11c7f63SJim Harris
2949f11c7f63SJim Harris /**
2950f11c7f63SJim Harris * This method is called when an event notification is received for the phy
2951f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN.
2952f11c7f63SJim Harris * - decode the event
2953f11c7f63SJim Harris * - link failure events restart the starting state machine
2954f11c7f63SJim Harris * - sata spinup hold events are ignored since they are expected
2955f11c7f63SJim Harris * - sata phy detected event change to the wait speed event
2956f11c7f63SJim Harris * - any other events log a warning message and set a failure status
2957f11c7f63SJim Harris *
2958f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
2959f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
2960f11c7f63SJim Harris * decode.
2961f11c7f63SJim Harris *
2962f11c7f63SJim Harris * @return SCI_STATUS
2963f11c7f63SJim Harris * @retval SCI_SUCCESS on a link failure event
2964f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
2965f11c7f63SJim Harris */
2966f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sata_phy_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)2967f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sata_phy_event_handler(
2968f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
2969f11c7f63SJim Harris U32 event_code
2970f11c7f63SJim Harris )
2971f11c7f63SJim Harris {
2972f11c7f63SJim Harris U32 result = SCI_SUCCESS;
2973f11c7f63SJim Harris
2974f11c7f63SJim Harris switch (scu_get_event_code(event_code))
2975f11c7f63SJim Harris {
2976f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
2977f11c7f63SJim Harris // Link failure change state back to the starting state
2978f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
2979f11c7f63SJim Harris break;
2980f11c7f63SJim Harris
2981f11c7f63SJim Harris case SCU_EVENT_SATA_SPINUP_HOLD:
2982f11c7f63SJim Harris // These events might be received since we dont know how many may be in
2983f11c7f63SJim Harris // the completion queue while waiting for power
2984f11c7f63SJim Harris break;
2985f11c7f63SJim Harris
2986f11c7f63SJim Harris case SCU_EVENT_SATA_PHY_DETECTED:
2987f11c7f63SJim Harris this_phy->protocol = SCIC_SDS_PHY_PROTOCOL_SATA;
2988f11c7f63SJim Harris
2989f11c7f63SJim Harris // We have received the SATA PHY notification change state
2990f11c7f63SJim Harris sci_base_state_machine_change_state(
2991f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
2992f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN
2993f11c7f63SJim Harris );
2994f11c7f63SJim Harris break;
2995f11c7f63SJim Harris
2996f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
2997f11c7f63SJim Harris // There has been a change in the phy type before OOB/SN for the
2998f11c7f63SJim Harris // SATA finished start down the SAS link traning path.
2999f11c7f63SJim Harris scic_sds_phy_start_sas_link_training(this_phy);
3000f11c7f63SJim Harris break;
3001f11c7f63SJim Harris
3002f11c7f63SJim Harris default:
3003f11c7f63SJim Harris SCIC_LOG_WARNING((
3004f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
3005f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
3006b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
3007f11c7f63SJim Harris event_code
3008f11c7f63SJim Harris ));
3009f11c7f63SJim Harris
3010f11c7f63SJim Harris result = SCI_FAILURE;
3011f11c7f63SJim Harris break;
3012f11c7f63SJim Harris }
3013f11c7f63SJim Harris
3014f11c7f63SJim Harris return result;
3015f11c7f63SJim Harris }
3016f11c7f63SJim Harris
3017f11c7f63SJim Harris /**
3018f11c7f63SJim Harris * This method is called when an event notification is received for the phy
3019f11c7f63SJim Harris * object when in the state
3020f11c7f63SJim Harris * SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN.
3021f11c7f63SJim Harris * - decode the event
3022f11c7f63SJim Harris * - sata phy detected returns us back to this state.
3023f11c7f63SJim Harris * - speed event detected causes a state transition to the wait for
3024f11c7f63SJim Harris * signature.
3025f11c7f63SJim Harris * - link failure events restart the starting state machine
3026f11c7f63SJim Harris * - any other events log a warning message and set a failure status
3027f11c7f63SJim Harris *
3028f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
3029f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
3030f11c7f63SJim Harris * decode.
3031f11c7f63SJim Harris *
3032f11c7f63SJim Harris * @return SCI_STATUS
3033f11c7f63SJim Harris * @retval SCI_SUCCESS on any valid event notification
3034f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
3035f11c7f63SJim Harris */
3036f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sata_speed_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)3037f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sata_speed_event_handler(
3038f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
3039f11c7f63SJim Harris U32 event_code
3040f11c7f63SJim Harris )
3041f11c7f63SJim Harris {
3042f11c7f63SJim Harris U32 result = SCI_SUCCESS;
3043f11c7f63SJim Harris
3044f11c7f63SJim Harris switch (scu_get_event_code(event_code))
3045f11c7f63SJim Harris {
3046f11c7f63SJim Harris case SCU_EVENT_SATA_PHY_DETECTED:
3047f11c7f63SJim Harris // The hardware reports multiple SATA PHY detected events
3048f11c7f63SJim Harris // ignore the extras
3049f11c7f63SJim Harris break;
3050f11c7f63SJim Harris
3051f11c7f63SJim Harris case SCU_EVENT_SATA_15:
3052f11c7f63SJim Harris case SCU_EVENT_SATA_15_SSC:
3053f11c7f63SJim Harris scic_sds_phy_complete_link_training(
3054f11c7f63SJim Harris this_phy,
3055f11c7f63SJim Harris SCI_SAS_150_GB,
3056f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF
3057f11c7f63SJim Harris );
3058f11c7f63SJim Harris break;
3059f11c7f63SJim Harris
3060f11c7f63SJim Harris case SCU_EVENT_SATA_30:
3061f11c7f63SJim Harris case SCU_EVENT_SATA_30_SSC:
3062f11c7f63SJim Harris scic_sds_phy_complete_link_training(
3063f11c7f63SJim Harris this_phy,
3064f11c7f63SJim Harris SCI_SAS_300_GB,
3065f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF
3066f11c7f63SJim Harris );
3067f11c7f63SJim Harris break;
3068f11c7f63SJim Harris
3069f11c7f63SJim Harris case SCU_EVENT_SATA_60:
3070f11c7f63SJim Harris case SCU_EVENT_SATA_60_SSC:
3071f11c7f63SJim Harris scic_sds_phy_complete_link_training(
3072f11c7f63SJim Harris this_phy,
3073f11c7f63SJim Harris SCI_SAS_600_GB,
3074f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF
3075f11c7f63SJim Harris );
3076f11c7f63SJim Harris break;
3077f11c7f63SJim Harris
3078f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
3079f11c7f63SJim Harris // Link failure change state back to the starting state
3080f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
3081f11c7f63SJim Harris break;
3082f11c7f63SJim Harris
3083f11c7f63SJim Harris case SCU_EVENT_SAS_PHY_DETECTED:
3084f11c7f63SJim Harris // There has been a change in the phy type before OOB/SN for the
3085f11c7f63SJim Harris // SATA finished start down the SAS link traning path.
3086f11c7f63SJim Harris scic_sds_phy_start_sas_link_training(this_phy);
3087f11c7f63SJim Harris break;
3088f11c7f63SJim Harris
3089f11c7f63SJim Harris default:
3090f11c7f63SJim Harris SCIC_LOG_WARNING((
3091f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
3092f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
3093b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
3094f11c7f63SJim Harris event_code
3095f11c7f63SJim Harris ));
3096f11c7f63SJim Harris
3097f11c7f63SJim Harris result = SCI_FAILURE;
3098f11c7f63SJim Harris break;
3099f11c7f63SJim Harris }
3100f11c7f63SJim Harris
3101f11c7f63SJim Harris return result;
3102f11c7f63SJim Harris }
3103f11c7f63SJim Harris
3104f11c7f63SJim Harris /**
3105f11c7f63SJim Harris * This method is called when an event notification is received for the phy
3106f11c7f63SJim Harris * object when in the state SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF.
3107f11c7f63SJim Harris * - decode the event
3108f11c7f63SJim Harris * - sas phy detected event backs up the state machine to the await
3109f11c7f63SJim Harris * speed notification.
3110f11c7f63SJim Harris * - identify timeout is an un-expected event and the state machine is
3111f11c7f63SJim Harris * restarted.
3112f11c7f63SJim Harris * - link failure events restart the starting state machine
3113f11c7f63SJim Harris * - any other events log a warning message and set a failure status
3114f11c7f63SJim Harris *
3115f11c7f63SJim Harris * @param[in] phy This SCIC_SDS_PHY object which has received an event.
3116f11c7f63SJim Harris * @param[in] event_code This is the event code which the phy object is to
3117f11c7f63SJim Harris * decode.
3118f11c7f63SJim Harris *
3119f11c7f63SJim Harris * @return SCI_STATUS
3120f11c7f63SJim Harris * @retval SCI_SUCCESS on any valid event notification
3121f11c7f63SJim Harris * @retval SCI_FAILURE on any unexpected event notifation
3122f11c7f63SJim Harris */
3123f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sig_fis_event_handler(SCIC_SDS_PHY_T * this_phy,U32 event_code)3124f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sig_fis_event_handler(
3125f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
3126f11c7f63SJim Harris U32 event_code
3127f11c7f63SJim Harris )
3128f11c7f63SJim Harris {
3129f11c7f63SJim Harris U32 result = SCI_SUCCESS;
3130f11c7f63SJim Harris
3131f11c7f63SJim Harris switch (scu_get_event_code(event_code))
3132f11c7f63SJim Harris {
3133f11c7f63SJim Harris case SCU_EVENT_SATA_PHY_DETECTED:
3134f11c7f63SJim Harris // Backup the state machine
3135f11c7f63SJim Harris sci_base_state_machine_change_state(
3136f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3137f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN
3138f11c7f63SJim Harris );
3139f11c7f63SJim Harris break;
3140f11c7f63SJim Harris
3141f11c7f63SJim Harris case SCU_EVENT_LINK_FAILURE:
3142f11c7f63SJim Harris // Link failure change state back to the starting state
3143f11c7f63SJim Harris scic_sds_phy_restart_starting_state(this_phy);
3144f11c7f63SJim Harris break;
3145f11c7f63SJim Harris
3146f11c7f63SJim Harris default:
3147f11c7f63SJim Harris SCIC_LOG_WARNING((
3148f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
3149f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_RECEIVED_EVENTS,
3150b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected event_code %x\n",
3151f11c7f63SJim Harris event_code
3152f11c7f63SJim Harris ));
3153f11c7f63SJim Harris
3154f11c7f63SJim Harris result = SCI_FAILURE;
3155f11c7f63SJim Harris break;
3156f11c7f63SJim Harris }
3157f11c7f63SJim Harris
3158f11c7f63SJim Harris return result;
3159f11c7f63SJim Harris }
3160f11c7f63SJim Harris
3161f11c7f63SJim Harris
3162f11c7f63SJim Harris //*****************************************************************************
3163f11c7f63SJim Harris //* SCIC SDS PHY FRAME_HANDLERS
3164f11c7f63SJim Harris //*****************************************************************************
3165f11c7f63SJim Harris
3166f11c7f63SJim Harris /**
3167f11c7f63SJim Harris * This method decodes the unsolicited frame when the SCIC_SDS_PHY is in the
3168f11c7f63SJim Harris * SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF.
3169f11c7f63SJim Harris * - Get the UF Header
3170f11c7f63SJim Harris * - If the UF is an IAF
3171f11c7f63SJim Harris * - Copy IAF data to local phy object IAF data buffer.
3172f11c7f63SJim Harris * - Change starting substate to wait power.
3173f11c7f63SJim Harris * - else
3174f11c7f63SJim Harris * - log warning message of unexpected unsolicted frame
3175f11c7f63SJim Harris * - release frame buffer
3176f11c7f63SJim Harris *
3177f11c7f63SJim Harris * @param[in] phy This is SCIC_SDS_PHY object which is being requested to
3178f11c7f63SJim Harris * decode the frame data.
3179f11c7f63SJim Harris * @param[in] frame_index This is the index of the unsolicited frame which was
3180f11c7f63SJim Harris * received for this phy.
3181f11c7f63SJim Harris *
3182f11c7f63SJim Harris * @return SCI_STATUS
3183f11c7f63SJim Harris * @retval SCI_SUCCESS
3184f11c7f63SJim Harris */
3185f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_iaf_uf_frame_handler(SCIC_SDS_PHY_T * this_phy,U32 frame_index)3186f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_iaf_uf_frame_handler(
3187f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
3188f11c7f63SJim Harris U32 frame_index
3189f11c7f63SJim Harris )
3190f11c7f63SJim Harris {
3191f11c7f63SJim Harris SCI_STATUS result;
3192f11c7f63SJim Harris U32 *frame_words;
3193f11c7f63SJim Harris SCI_SAS_IDENTIFY_ADDRESS_FRAME_T *identify_frame;
3194f11c7f63SJim Harris
3195f11c7f63SJim Harris result = scic_sds_unsolicited_frame_control_get_header(
3196f11c7f63SJim Harris &(scic_sds_phy_get_controller(this_phy)->uf_control),
3197f11c7f63SJim Harris frame_index,
3198f11c7f63SJim Harris (void **)&frame_words);
3199f11c7f63SJim Harris
3200f11c7f63SJim Harris if (result != SCI_SUCCESS)
3201f11c7f63SJim Harris {
3202f11c7f63SJim Harris return result;
3203f11c7f63SJim Harris }
3204f11c7f63SJim Harris
3205f11c7f63SJim Harris frame_words[0] = SCIC_SWAP_DWORD(frame_words[0]);
3206f11c7f63SJim Harris identify_frame = (SCI_SAS_IDENTIFY_ADDRESS_FRAME_T *)frame_words;
3207f11c7f63SJim Harris
3208f11c7f63SJim Harris if (identify_frame->address_frame_type == 0)
3209f11c7f63SJim Harris {
3210f11c7f63SJim Harris // Byte swap the rest of the frame so we can make
3211f11c7f63SJim Harris // a copy of the buffer
3212f11c7f63SJim Harris frame_words[1] = SCIC_SWAP_DWORD(frame_words[1]);
3213f11c7f63SJim Harris frame_words[2] = SCIC_SWAP_DWORD(frame_words[2]);
3214f11c7f63SJim Harris frame_words[3] = SCIC_SWAP_DWORD(frame_words[3]);
3215f11c7f63SJim Harris frame_words[4] = SCIC_SWAP_DWORD(frame_words[4]);
3216f11c7f63SJim Harris frame_words[5] = SCIC_SWAP_DWORD(frame_words[5]);
3217f11c7f63SJim Harris
3218f11c7f63SJim Harris memcpy(
3219f11c7f63SJim Harris &this_phy->phy_type.sas.identify_address_frame_buffer,
3220f11c7f63SJim Harris identify_frame,
3221f11c7f63SJim Harris sizeof(SCI_SAS_IDENTIFY_ADDRESS_FRAME_T)
3222f11c7f63SJim Harris );
3223f11c7f63SJim Harris
3224f11c7f63SJim Harris if (identify_frame->protocols.u.bits.smp_target)
3225f11c7f63SJim Harris {
3226f11c7f63SJim Harris // We got the IAF for an expander PHY go to the final state since
3227f11c7f63SJim Harris // there are no power requirements for expander phys.
3228f11c7f63SJim Harris sci_base_state_machine_change_state(
3229f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3230f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL
3231f11c7f63SJim Harris );
3232f11c7f63SJim Harris }
3233f11c7f63SJim Harris else
3234f11c7f63SJim Harris {
3235f11c7f63SJim Harris // We got the IAF we can now go to the await spinup semaphore state
3236f11c7f63SJim Harris sci_base_state_machine_change_state(
3237f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3238f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER
3239f11c7f63SJim Harris );
3240f11c7f63SJim Harris }
3241f11c7f63SJim Harris
3242f11c7f63SJim Harris result = SCI_SUCCESS;
3243f11c7f63SJim Harris }
3244f11c7f63SJim Harris else
3245f11c7f63SJim Harris {
3246f11c7f63SJim Harris SCIC_LOG_WARNING((
3247f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
3248f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_UNSOLICITED_FRAMES,
3249b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected frame id %x\n",
3250f11c7f63SJim Harris frame_index
3251f11c7f63SJim Harris ));
3252f11c7f63SJim Harris }
3253f11c7f63SJim Harris
3254f11c7f63SJim Harris // Regardless of the result release this frame since we are done with it
3255f11c7f63SJim Harris scic_sds_controller_release_frame(
3256f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy), frame_index
3257f11c7f63SJim Harris );
3258f11c7f63SJim Harris
3259f11c7f63SJim Harris return result;
3260f11c7f63SJim Harris }
3261f11c7f63SJim Harris
3262f11c7f63SJim Harris /**
3263f11c7f63SJim Harris * This method decodes the unsolicited frame when the SCIC_SDS_PHY is in the
3264f11c7f63SJim Harris * SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF.
3265f11c7f63SJim Harris * - Get the UF Header
3266f11c7f63SJim Harris * - If the UF is an SIGNATURE FIS
3267f11c7f63SJim Harris * - Copy IAF data to local phy object SIGNATURE FIS data buffer.
3268f11c7f63SJim Harris * - else
3269f11c7f63SJim Harris * - log warning message of unexpected unsolicted frame
3270f11c7f63SJim Harris * - release frame buffer
3271f11c7f63SJim Harris *
3272f11c7f63SJim Harris * @param[in] phy This is SCIC_SDS_PHY object which is being requested to
3273f11c7f63SJim Harris * decode the frame data.
3274f11c7f63SJim Harris * @param[in] frame_index This is the index of the unsolicited frame which was
3275f11c7f63SJim Harris * received for this phy.
3276f11c7f63SJim Harris *
3277f11c7f63SJim Harris * @return SCI_STATUS
3278f11c7f63SJim Harris * @retval SCI_SUCCESS
3279f11c7f63SJim Harris *
3280f11c7f63SJim Harris * @todo Must decode the SIGNATURE FIS data
3281f11c7f63SJim Harris */
3282f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sig_fis_frame_handler(SCIC_SDS_PHY_T * this_phy,U32 frame_index)3283f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sig_fis_frame_handler(
3284f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy,
3285f11c7f63SJim Harris U32 frame_index
3286f11c7f63SJim Harris )
3287f11c7f63SJim Harris {
3288f11c7f63SJim Harris SCI_STATUS result;
3289f11c7f63SJim Harris U32 * frame_words;
3290f11c7f63SJim Harris SATA_FIS_HEADER_T * fis_frame_header;
3291f11c7f63SJim Harris U32 * fis_frame_data;
3292f11c7f63SJim Harris
3293f11c7f63SJim Harris result = scic_sds_unsolicited_frame_control_get_header(
3294f11c7f63SJim Harris &(scic_sds_phy_get_controller(this_phy)->uf_control),
3295f11c7f63SJim Harris frame_index,
3296f11c7f63SJim Harris (void **)&frame_words);
3297f11c7f63SJim Harris
3298f11c7f63SJim Harris if (result != SCI_SUCCESS)
3299f11c7f63SJim Harris {
3300f11c7f63SJim Harris return result;
3301f11c7f63SJim Harris }
3302f11c7f63SJim Harris
3303f11c7f63SJim Harris fis_frame_header = (SATA_FIS_HEADER_T *)frame_words;
3304f11c7f63SJim Harris
3305f11c7f63SJim Harris if (
3306f11c7f63SJim Harris (fis_frame_header->fis_type == SATA_FIS_TYPE_REGD2H)
3307f11c7f63SJim Harris && !(fis_frame_header->status & ATA_STATUS_REG_BSY_BIT)
3308f11c7f63SJim Harris )
3309f11c7f63SJim Harris {
3310f11c7f63SJim Harris scic_sds_unsolicited_frame_control_get_buffer(
3311f11c7f63SJim Harris &(scic_sds_phy_get_controller(this_phy)->uf_control),
3312f11c7f63SJim Harris frame_index,
3313f11c7f63SJim Harris (void **)&fis_frame_data
3314f11c7f63SJim Harris );
3315f11c7f63SJim Harris
3316f11c7f63SJim Harris scic_sds_controller_copy_sata_response(
3317f11c7f63SJim Harris &this_phy->phy_type.sata.signature_fis_buffer,
3318f11c7f63SJim Harris frame_words,
3319f11c7f63SJim Harris fis_frame_data
3320f11c7f63SJim Harris );
3321f11c7f63SJim Harris
3322f11c7f63SJim Harris // We got the IAF we can now go to the await spinup semaphore state
3323f11c7f63SJim Harris sci_base_state_machine_change_state(
3324f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3325f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL
3326f11c7f63SJim Harris );
3327f11c7f63SJim Harris
3328f11c7f63SJim Harris result = SCI_SUCCESS;
3329f11c7f63SJim Harris }
3330f11c7f63SJim Harris else
3331f11c7f63SJim Harris {
3332f11c7f63SJim Harris SCIC_LOG_WARNING((
3333f11c7f63SJim Harris sci_base_object_get_logger(this_phy),
3334f11c7f63SJim Harris SCIC_LOG_OBJECT_PHY | SCIC_LOG_OBJECT_UNSOLICITED_FRAMES,
3335b790c193SPedro F. Giffuni "PHY starting substate machine received unexpected frame id %x\n",
3336f11c7f63SJim Harris frame_index
3337f11c7f63SJim Harris ));
3338f11c7f63SJim Harris }
3339f11c7f63SJim Harris
3340f11c7f63SJim Harris // Regardless of the result release this frame since we are done with it
3341f11c7f63SJim Harris scic_sds_controller_release_frame(
3342f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy), frame_index
3343f11c7f63SJim Harris );
3344f11c7f63SJim Harris
3345f11c7f63SJim Harris return result;
3346f11c7f63SJim Harris }
3347f11c7f63SJim Harris
3348f11c7f63SJim Harris //*****************************************************************************
3349f11c7f63SJim Harris //* SCIC SDS PHY POWER_HANDLERS
3350f11c7f63SJim Harris //*****************************************************************************
3351f11c7f63SJim Harris
3352f11c7f63SJim Harris /**
3353f11c7f63SJim Harris * This method is called by the SCIC_SDS_CONTROLLER when the phy object is
3354f11c7f63SJim Harris * granted power.
3355f11c7f63SJim Harris * - The notify enable spinups are turned on for this phy object
3356f11c7f63SJim Harris * - The phy state machine is transitioned to the
3357f11c7f63SJim Harris * SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL.
3358f11c7f63SJim Harris *
3359f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
3360f11c7f63SJim Harris * SCIC_SDS_PHY object.
3361f11c7f63SJim Harris *
3362f11c7f63SJim Harris * @return SCI_STATUS
3363f11c7f63SJim Harris * @retval SCI_SUCCESS
3364f11c7f63SJim Harris */
3365f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sas_power_consume_power_handler(SCIC_SDS_PHY_T * this_phy)3366f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sas_power_consume_power_handler(
3367f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
3368f11c7f63SJim Harris )
3369f11c7f63SJim Harris {
3370f11c7f63SJim Harris U32 enable_spinup;
3371f11c7f63SJim Harris
3372f11c7f63SJim Harris enable_spinup = SCU_SAS_ENSPINUP_READ(this_phy);
3373f11c7f63SJim Harris enable_spinup |= SCU_ENSPINUP_GEN_BIT(ENABLE);
3374f11c7f63SJim Harris SCU_SAS_ENSPINUP_WRITE(this_phy, enable_spinup);
3375f11c7f63SJim Harris
3376f11c7f63SJim Harris // Change state to the final state this substate machine has run to completion
3377f11c7f63SJim Harris sci_base_state_machine_change_state(
3378f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3379f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL
3380f11c7f63SJim Harris );
3381f11c7f63SJim Harris
3382f11c7f63SJim Harris return SCI_SUCCESS;
3383f11c7f63SJim Harris }
3384f11c7f63SJim Harris
3385f11c7f63SJim Harris /**
3386f11c7f63SJim Harris * This method is called by the SCIC_SDS_CONTROLLER when the phy object is
3387f11c7f63SJim Harris * granted power.
3388f11c7f63SJim Harris * - The phy state machine is transitioned to the
3389f11c7f63SJim Harris * SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN.
3390f11c7f63SJim Harris *
3391f11c7f63SJim Harris * @param[in] phy This is the SCI_BASE_PHY object which is cast into a
3392f11c7f63SJim Harris * SCIC_SDS_PHY object.
3393f11c7f63SJim Harris *
3394f11c7f63SJim Harris * @return SCI_STATUS
3395f11c7f63SJim Harris * @retval SCI_SUCCESS
3396f11c7f63SJim Harris */
3397f11c7f63SJim Harris static
scic_sds_phy_starting_substate_await_sata_power_consume_power_handler(SCIC_SDS_PHY_T * this_phy)3398f11c7f63SJim Harris SCI_STATUS scic_sds_phy_starting_substate_await_sata_power_consume_power_handler(
3399f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy
3400f11c7f63SJim Harris )
3401f11c7f63SJim Harris {
3402f11c7f63SJim Harris U32 scu_sas_pcfg_value;
3403f11c7f63SJim Harris
3404f11c7f63SJim Harris // Release the spinup hold state and reset the OOB state machine
3405f11c7f63SJim Harris scu_sas_pcfg_value = SCU_SAS_PCFG_READ(this_phy);
3406f11c7f63SJim Harris scu_sas_pcfg_value &=
3407f11c7f63SJim Harris ~(SCU_SAS_PCFG_GEN_BIT(SATA_SPINUP_HOLD) | SCU_SAS_PCFG_GEN_BIT(OOB_ENABLE));
3408f11c7f63SJim Harris scu_sas_pcfg_value |= SCU_SAS_PCFG_GEN_BIT(OOB_RESET);
3409f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
3410f11c7f63SJim Harris
3411f11c7f63SJim Harris // Now restart the OOB operation
3412f11c7f63SJim Harris scu_sas_pcfg_value &= ~SCU_SAS_PCFG_GEN_BIT(OOB_RESET);
3413f11c7f63SJim Harris scu_sas_pcfg_value |= SCU_SAS_PCFG_GEN_BIT(OOB_ENABLE);
3414f11c7f63SJim Harris SCU_SAS_PCFG_WRITE(this_phy, scu_sas_pcfg_value);
3415f11c7f63SJim Harris
3416f11c7f63SJim Harris // Change state to the final state this substate machine has run to completion
3417f11c7f63SJim Harris sci_base_state_machine_change_state(
3418f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3419f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN
3420f11c7f63SJim Harris );
3421f11c7f63SJim Harris
3422f11c7f63SJim Harris return SCI_SUCCESS;
3423f11c7f63SJim Harris }
3424f11c7f63SJim Harris
3425f11c7f63SJim Harris // ---------------------------------------------------------------------------
3426f11c7f63SJim Harris
3427f11c7f63SJim Harris SCIC_SDS_PHY_STATE_HANDLER_T
3428f11c7f63SJim Harris scic_sds_phy_starting_substate_handler_table[SCIC_SDS_PHY_STARTING_MAX_SUBSTATES] =
3429f11c7f63SJim Harris {
3430f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL
3431f11c7f63SJim Harris {
3432f11c7f63SJim Harris {
3433f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3434f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3435f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3436f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3437f11c7f63SJim Harris },
3438f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3439f11c7f63SJim Harris scic_sds_phy_default_event_handler,
3440f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3441f11c7f63SJim Harris },
3442f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN
3443f11c7f63SJim Harris {
3444f11c7f63SJim Harris {
3445f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3446f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3447f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3448f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3449f11c7f63SJim Harris },
3450f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3451f11c7f63SJim Harris scic_sds_phy_starting_substate_await_ossp_event_handler,
3452f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3453f11c7f63SJim Harris },
3454f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN
3455f11c7f63SJim Harris {
3456f11c7f63SJim Harris {
3457f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3458f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3459f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3460f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3461f11c7f63SJim Harris },
3462f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3463f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sas_phy_speed_event_handler,
3464f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3465f11c7f63SJim Harris },
3466f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF
3467f11c7f63SJim Harris {
3468f11c7f63SJim Harris {
3469f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3470f11c7f63SJim Harris scic_sds_phy_default_stop_handler,
3471f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3472f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3473f11c7f63SJim Harris },
3474f11c7f63SJim Harris scic_sds_phy_starting_substate_await_iaf_uf_frame_handler,
3475f11c7f63SJim Harris scic_sds_phy_starting_substate_await_iaf_uf_event_handler,
3476f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3477f11c7f63SJim Harris },
3478f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER
3479f11c7f63SJim Harris {
3480f11c7f63SJim Harris {
3481f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3482f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3483f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3484f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3485f11c7f63SJim Harris },
3486f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3487f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sas_power_event_handler,
3488f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sas_power_consume_power_handler
3489f11c7f63SJim Harris },
3490f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER,
3491f11c7f63SJim Harris {
3492f11c7f63SJim Harris {
3493f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3494f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3495f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3496f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3497f11c7f63SJim Harris },
3498f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3499f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sata_power_event_handler,
3500f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sata_power_consume_power_handler
3501f11c7f63SJim Harris },
3502f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN,
3503f11c7f63SJim Harris {
3504f11c7f63SJim Harris {
3505f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3506f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3507f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3508f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3509f11c7f63SJim Harris },
3510f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3511f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sata_phy_event_handler,
3512f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3513f11c7f63SJim Harris },
3514f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN,
3515f11c7f63SJim Harris {
3516f11c7f63SJim Harris {
3517f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3518f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3519f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3520f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3521f11c7f63SJim Harris },
3522f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3523f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sata_speed_event_handler,
3524f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3525f11c7f63SJim Harris },
3526f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF,
3527f11c7f63SJim Harris {
3528f11c7f63SJim Harris {
3529f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3530f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3531f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3532f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3533f11c7f63SJim Harris },
3534f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sig_fis_frame_handler,
3535f11c7f63SJim Harris scic_sds_phy_starting_substate_await_sig_fis_event_handler,
3536f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3537f11c7f63SJim Harris },
3538f11c7f63SJim Harris // SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL
3539f11c7f63SJim Harris {
3540f11c7f63SJim Harris {
3541f11c7f63SJim Harris scic_sds_phy_default_start_handler,
3542f11c7f63SJim Harris scic_sds_phy_starting_substate_general_stop_handler,
3543f11c7f63SJim Harris scic_sds_phy_default_reset_handler,
3544f11c7f63SJim Harris scic_sds_phy_default_destroy_handler
3545f11c7f63SJim Harris },
3546f11c7f63SJim Harris scic_sds_phy_default_frame_handler,
3547f11c7f63SJim Harris scic_sds_phy_default_event_handler,
3548f11c7f63SJim Harris scic_sds_phy_default_consume_power_handler
3549f11c7f63SJim Harris }
3550f11c7f63SJim Harris };
3551f11c7f63SJim Harris
3552f11c7f63SJim Harris /**
3553f11c7f63SJim Harris * This macro sets the starting substate handlers by state_id
3554f11c7f63SJim Harris */
3555f11c7f63SJim Harris #define scic_sds_phy_set_starting_substate_handlers(phy, state_id) \
3556f11c7f63SJim Harris scic_sds_phy_set_state_handlers( \
3557f11c7f63SJim Harris (phy), \
3558f11c7f63SJim Harris &scic_sds_phy_starting_substate_handler_table[(state_id)] \
3559f11c7f63SJim Harris )
3560f11c7f63SJim Harris
3561f11c7f63SJim Harris //****************************************************************************
3562f11c7f63SJim Harris //* PHY STARTING SUBSTATE METHODS
3563f11c7f63SJim Harris //****************************************************************************
3564f11c7f63SJim Harris
3565f11c7f63SJim Harris /**
3566f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3567f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL.
3568f11c7f63SJim Harris * - The initial state handlers are put in place for the SCIC_SDS_PHY
3569f11c7f63SJim Harris * object.
3570f11c7f63SJim Harris * - The state is changed to the wait phy type event notification.
3571f11c7f63SJim Harris *
3572f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3573f11c7f63SJim Harris * SCIC_SDS_PHY object.
3574f11c7f63SJim Harris *
3575f11c7f63SJim Harris * @return none
3576f11c7f63SJim Harris */
3577f11c7f63SJim Harris static
scic_sds_phy_starting_initial_substate_enter(SCI_BASE_OBJECT_T * object)3578f11c7f63SJim Harris void scic_sds_phy_starting_initial_substate_enter(
3579f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3580f11c7f63SJim Harris )
3581f11c7f63SJim Harris {
3582f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3583f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3584f11c7f63SJim Harris
3585f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3586f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL);
3587f11c7f63SJim Harris
3588f11c7f63SJim Harris // This is just an temporary state go off to the starting state
3589f11c7f63SJim Harris sci_base_state_machine_change_state(
3590f11c7f63SJim Harris scic_sds_phy_get_starting_substate_machine(this_phy),
3591f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN
3592f11c7f63SJim Harris );
3593f11c7f63SJim Harris }
3594f11c7f63SJim Harris
3595f11c7f63SJim Harris /**
3596f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3597f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_PHY_TYPE_EN.
3598f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3599f11c7f63SJim Harris *
3600f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3601f11c7f63SJim Harris * SCIC_SDS_PHY object.
3602f11c7f63SJim Harris *
3603f11c7f63SJim Harris * @return none
3604f11c7f63SJim Harris */
3605f11c7f63SJim Harris static
scic_sds_phy_starting_await_ossp_en_substate_enter(SCI_BASE_OBJECT_T * object)3606f11c7f63SJim Harris void scic_sds_phy_starting_await_ossp_en_substate_enter(
3607f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3608f11c7f63SJim Harris )
3609f11c7f63SJim Harris {
3610f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3611f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3612f11c7f63SJim Harris
3613f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3614f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN
3615f11c7f63SJim Harris );
3616f11c7f63SJim Harris }
3617f11c7f63SJim Harris
3618f11c7f63SJim Harris /**
3619f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3620f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SPEED_EN.
3621f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3622f11c7f63SJim Harris *
3623f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3624f11c7f63SJim Harris * SCIC_SDS_PHY object.
3625f11c7f63SJim Harris *
3626f11c7f63SJim Harris * @return none
3627f11c7f63SJim Harris */
3628f11c7f63SJim Harris static
scic_sds_phy_starting_await_sas_speed_en_substate_enter(SCI_BASE_OBJECT_T * object)3629f11c7f63SJim Harris void scic_sds_phy_starting_await_sas_speed_en_substate_enter(
3630f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3631f11c7f63SJim Harris )
3632f11c7f63SJim Harris {
3633f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3634f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3635f11c7f63SJim Harris
3636f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3637f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN
3638f11c7f63SJim Harris );
3639f11c7f63SJim Harris }
3640f11c7f63SJim Harris
3641f11c7f63SJim Harris /**
3642f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3643f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF.
3644f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3645f11c7f63SJim Harris *
3646f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3647f11c7f63SJim Harris * SCIC_SDS_PHY object.
3648f11c7f63SJim Harris *
3649f11c7f63SJim Harris * @return none
3650f11c7f63SJim Harris */
3651f11c7f63SJim Harris static
scic_sds_phy_starting_await_iaf_uf_substate_enter(SCI_BASE_OBJECT_T * object)3652f11c7f63SJim Harris void scic_sds_phy_starting_await_iaf_uf_substate_enter(
3653f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3654f11c7f63SJim Harris )
3655f11c7f63SJim Harris {
3656f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3657f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3658f11c7f63SJim Harris
3659f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3660f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF
3661f11c7f63SJim Harris );
3662f11c7f63SJim Harris }
3663f11c7f63SJim Harris
3664f11c7f63SJim Harris /**
3665f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3666f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER.
3667f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3668f11c7f63SJim Harris * - Add this phy object to the power control queue
3669f11c7f63SJim Harris *
3670f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3671f11c7f63SJim Harris * SCIC_SDS_PHY object.
3672f11c7f63SJim Harris *
3673f11c7f63SJim Harris * @return none
3674f11c7f63SJim Harris */
3675f11c7f63SJim Harris static
scic_sds_phy_starting_await_sas_power_substate_enter(SCI_BASE_OBJECT_T * object)3676f11c7f63SJim Harris void scic_sds_phy_starting_await_sas_power_substate_enter(
3677f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3678f11c7f63SJim Harris )
3679f11c7f63SJim Harris {
3680f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3681f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3682f11c7f63SJim Harris
3683f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3684f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER
3685f11c7f63SJim Harris );
3686f11c7f63SJim Harris
3687f11c7f63SJim Harris scic_sds_controller_power_control_queue_insert(
3688f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3689f11c7f63SJim Harris this_phy
3690f11c7f63SJim Harris );
3691f11c7f63SJim Harris }
3692f11c7f63SJim Harris
3693f11c7f63SJim Harris /**
3694f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3695f11c7f63SJim Harris * exiting the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER.
3696f11c7f63SJim Harris * - Remove the SCIC_SDS_PHY object from the power control queue.
3697f11c7f63SJim Harris *
3698f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3699f11c7f63SJim Harris * SCIC_SDS_PHY object.
3700f11c7f63SJim Harris *
3701f11c7f63SJim Harris * @return none
3702f11c7f63SJim Harris */
3703f11c7f63SJim Harris static
scic_sds_phy_starting_await_sas_power_substate_exit(SCI_BASE_OBJECT_T * object)3704f11c7f63SJim Harris void scic_sds_phy_starting_await_sas_power_substate_exit(
3705f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3706f11c7f63SJim Harris )
3707f11c7f63SJim Harris {
3708f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3709f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3710f11c7f63SJim Harris
3711f11c7f63SJim Harris scic_sds_controller_power_control_queue_remove(
3712f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy), this_phy
3713f11c7f63SJim Harris );
3714f11c7f63SJim Harris }
3715f11c7f63SJim Harris
3716f11c7f63SJim Harris /**
3717f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3718f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER.
3719f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3720f11c7f63SJim Harris * - Add this phy object to the power control queue
3721f11c7f63SJim Harris *
3722f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3723f11c7f63SJim Harris * SCIC_SDS_PHY object.
3724f11c7f63SJim Harris *
3725f11c7f63SJim Harris * @return none
3726f11c7f63SJim Harris */
3727f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_power_substate_enter(SCI_BASE_OBJECT_T * object)3728f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_power_substate_enter(
3729f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3730f11c7f63SJim Harris )
3731f11c7f63SJim Harris {
3732f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3733f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3734f11c7f63SJim Harris
3735f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3736f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER
3737f11c7f63SJim Harris );
3738f11c7f63SJim Harris
3739f11c7f63SJim Harris scic_sds_controller_power_control_queue_insert(
3740f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3741f11c7f63SJim Harris this_phy
3742f11c7f63SJim Harris );
3743f11c7f63SJim Harris }
3744f11c7f63SJim Harris
3745f11c7f63SJim Harris /**
3746f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3747f11c7f63SJim Harris * exiting the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER.
3748f11c7f63SJim Harris * - Remove the SCIC_SDS_PHY object from the power control queue.
3749f11c7f63SJim Harris *
3750f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3751f11c7f63SJim Harris * SCIC_SDS_PHY object.
3752f11c7f63SJim Harris *
3753f11c7f63SJim Harris * @return none
3754f11c7f63SJim Harris */
3755f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_power_substate_exit(SCI_BASE_OBJECT_T * object)3756f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_power_substate_exit(
3757f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3758f11c7f63SJim Harris )
3759f11c7f63SJim Harris {
3760f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3761f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3762f11c7f63SJim Harris
3763f11c7f63SJim Harris scic_sds_controller_power_control_queue_remove(
3764f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3765f11c7f63SJim Harris this_phy
3766f11c7f63SJim Harris );
3767f11c7f63SJim Harris }
3768f11c7f63SJim Harris
3769f11c7f63SJim Harris /**
3770f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3771f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN.
3772f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3773f11c7f63SJim Harris *
3774f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3775f11c7f63SJim Harris * SCIC_SDS_PHY object.
3776f11c7f63SJim Harris *
3777f11c7f63SJim Harris * @return none
3778f11c7f63SJim Harris */
3779f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_phy_substate_enter(SCI_BASE_OBJECT_T * object)3780f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_phy_substate_enter(
3781f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3782f11c7f63SJim Harris )
3783f11c7f63SJim Harris {
3784f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3785f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3786f11c7f63SJim Harris
3787f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3788f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN
3789f11c7f63SJim Harris );
3790f11c7f63SJim Harris
3791f11c7f63SJim Harris scic_cb_timer_start(
3792f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3793f11c7f63SJim Harris this_phy->sata_timeout_timer,
3794f11c7f63SJim Harris SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT
3795f11c7f63SJim Harris );
3796f11c7f63SJim Harris }
3797f11c7f63SJim Harris
3798f11c7f63SJim Harris /**
3799f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3800f11c7f63SJim Harris * exiting the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN.
3801f11c7f63SJim Harris * - stop the timer that was started on entry to await sata phy
3802f11c7f63SJim Harris * event notification
3803f11c7f63SJim Harris *
3804f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3805f11c7f63SJim Harris * SCIC_SDS_PHY object.
3806f11c7f63SJim Harris *
3807f11c7f63SJim Harris * @return none
3808f11c7f63SJim Harris */
3809f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_phy_substate_exit(SCI_BASE_OBJECT_T * object)3810f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_phy_substate_exit(
3811f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3812f11c7f63SJim Harris )
3813f11c7f63SJim Harris {
3814f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3815f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3816f11c7f63SJim Harris
3817f11c7f63SJim Harris scic_cb_timer_stop(
3818f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3819f11c7f63SJim Harris this_phy->sata_timeout_timer
3820f11c7f63SJim Harris );
3821f11c7f63SJim Harris }
3822f11c7f63SJim Harris
3823f11c7f63SJim Harris /**
3824f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3825f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN.
3826f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3827f11c7f63SJim Harris *
3828f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3829f11c7f63SJim Harris * SCIC_SDS_PHY object.
3830f11c7f63SJim Harris *
3831f11c7f63SJim Harris * @return none
3832f11c7f63SJim Harris */
3833f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_speed_substate_enter(SCI_BASE_OBJECT_T * object)3834f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_speed_substate_enter(
3835f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3836f11c7f63SJim Harris )
3837f11c7f63SJim Harris {
3838f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3839f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3840f11c7f63SJim Harris
3841f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3842f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN
3843f11c7f63SJim Harris );
3844f11c7f63SJim Harris
3845f11c7f63SJim Harris scic_cb_timer_start(
3846f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3847f11c7f63SJim Harris this_phy->sata_timeout_timer,
3848f11c7f63SJim Harris SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT
3849f11c7f63SJim Harris );
3850f11c7f63SJim Harris }
3851f11c7f63SJim Harris
3852f11c7f63SJim Harris /**
3853f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3854f11c7f63SJim Harris * exiting the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN.
3855f11c7f63SJim Harris * - stop the timer that was started on entry to await sata phy
3856f11c7f63SJim Harris * event notification
3857f11c7f63SJim Harris *
3858f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3859f11c7f63SJim Harris * SCIC_SDS_PHY object.
3860f11c7f63SJim Harris *
3861f11c7f63SJim Harris * @return none
3862f11c7f63SJim Harris */
3863f11c7f63SJim Harris static
scic_sds_phy_starting_await_sata_speed_substate_exit(SCI_BASE_OBJECT_T * object)3864f11c7f63SJim Harris void scic_sds_phy_starting_await_sata_speed_substate_exit(
3865f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3866f11c7f63SJim Harris )
3867f11c7f63SJim Harris {
3868f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3869f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3870f11c7f63SJim Harris
3871f11c7f63SJim Harris scic_cb_timer_stop(
3872f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3873f11c7f63SJim Harris this_phy->sata_timeout_timer
3874f11c7f63SJim Harris );
3875f11c7f63SJim Harris }
3876f11c7f63SJim Harris
3877f11c7f63SJim Harris /**
3878f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3879f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF.
3880f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3881f11c7f63SJim Harris * - Start the SIGNATURE FIS timeout timer
3882f11c7f63SJim Harris *
3883f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3884f11c7f63SJim Harris * SCIC_SDS_PHY object.
3885f11c7f63SJim Harris *
3886f11c7f63SJim Harris * @return none
3887f11c7f63SJim Harris */
3888f11c7f63SJim Harris static
scic_sds_phy_starting_await_sig_fis_uf_substate_enter(SCI_BASE_OBJECT_T * object)3889f11c7f63SJim Harris void scic_sds_phy_starting_await_sig_fis_uf_substate_enter(
3890f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3891f11c7f63SJim Harris )
3892f11c7f63SJim Harris {
3893f11c7f63SJim Harris BOOL continue_to_ready_state;
3894f11c7f63SJim Harris SCIC_SDS_PHY_T * this_phy;
3895f11c7f63SJim Harris
3896f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3897f11c7f63SJim Harris
3898f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3899f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF
3900f11c7f63SJim Harris );
3901f11c7f63SJim Harris
3902f11c7f63SJim Harris continue_to_ready_state = scic_sds_port_link_detected(
3903f11c7f63SJim Harris this_phy->owning_port,
3904f11c7f63SJim Harris this_phy
3905f11c7f63SJim Harris );
3906f11c7f63SJim Harris
3907f11c7f63SJim Harris if (continue_to_ready_state)
3908f11c7f63SJim Harris {
3909f11c7f63SJim Harris // Clear the PE suspend condition so we can actually receive SIG FIS
3910f11c7f63SJim Harris // The hardware will not respond to the XRDY until the PE suspend
3911f11c7f63SJim Harris // condition is cleared.
3912f11c7f63SJim Harris scic_sds_phy_resume(this_phy);
3913f11c7f63SJim Harris
3914f11c7f63SJim Harris scic_cb_timer_start(
3915f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3916f11c7f63SJim Harris this_phy->sata_timeout_timer,
3917f11c7f63SJim Harris SCIC_SDS_SIGNATURE_FIS_TIMEOUT
3918f11c7f63SJim Harris );
3919f11c7f63SJim Harris }
3920f11c7f63SJim Harris else
3921f11c7f63SJim Harris {
3922f11c7f63SJim Harris this_phy->is_in_link_training = FALSE;
3923f11c7f63SJim Harris }
3924f11c7f63SJim Harris }
3925f11c7f63SJim Harris
3926f11c7f63SJim Harris /**
3927f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3928f11c7f63SJim Harris * exiting the SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF.
3929f11c7f63SJim Harris * - Stop the SIGNATURE FIS timeout timer.
3930f11c7f63SJim Harris *
3931f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3932f11c7f63SJim Harris * SCIC_SDS_PHY object.
3933f11c7f63SJim Harris *
3934f11c7f63SJim Harris * @return none
3935f11c7f63SJim Harris */
3936f11c7f63SJim Harris static
scic_sds_phy_starting_await_sig_fis_uf_substate_exit(SCI_BASE_OBJECT_T * object)3937f11c7f63SJim Harris void scic_sds_phy_starting_await_sig_fis_uf_substate_exit(
3938f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3939f11c7f63SJim Harris )
3940f11c7f63SJim Harris {
3941f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3942f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3943f11c7f63SJim Harris
3944f11c7f63SJim Harris scic_cb_timer_stop(
3945f11c7f63SJim Harris scic_sds_phy_get_controller(this_phy),
3946f11c7f63SJim Harris this_phy->sata_timeout_timer
3947f11c7f63SJim Harris );
3948f11c7f63SJim Harris }
3949f11c7f63SJim Harris
3950f11c7f63SJim Harris /**
3951f11c7f63SJim Harris * This method will perform the actions required by the SCIC_SDS_PHY on
3952f11c7f63SJim Harris * entering the SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL.
3953f11c7f63SJim Harris * - Set the SCIC_SDS_PHY object state handlers for this state.
3954f11c7f63SJim Harris * - Change base state machine to the ready state.
3955f11c7f63SJim Harris *
3956f11c7f63SJim Harris * @param[in] object This is the SCI_BASE_OBJECT which is cast to a
3957f11c7f63SJim Harris * SCIC_SDS_PHY object.
3958f11c7f63SJim Harris *
3959f11c7f63SJim Harris * @return none
3960f11c7f63SJim Harris */
3961f11c7f63SJim Harris static
scic_sds_phy_starting_final_substate_enter(SCI_BASE_OBJECT_T * object)3962f11c7f63SJim Harris void scic_sds_phy_starting_final_substate_enter(
3963f11c7f63SJim Harris SCI_BASE_OBJECT_T *object
3964f11c7f63SJim Harris )
3965f11c7f63SJim Harris {
3966f11c7f63SJim Harris SCIC_SDS_PHY_T *this_phy;
3967f11c7f63SJim Harris this_phy = (SCIC_SDS_PHY_T *)object;
3968f11c7f63SJim Harris
3969f11c7f63SJim Harris scic_sds_phy_set_starting_substate_handlers(
3970f11c7f63SJim Harris this_phy, SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL
3971f11c7f63SJim Harris );
3972f11c7f63SJim Harris
3973f11c7f63SJim Harris // State machine has run to completion so exit out and change
3974f11c7f63SJim Harris // the base state machine to the ready state
3975f11c7f63SJim Harris sci_base_state_machine_change_state(
3976f11c7f63SJim Harris scic_sds_phy_get_base_state_machine(this_phy),
3977f11c7f63SJim Harris SCI_BASE_PHY_STATE_READY);
3978f11c7f63SJim Harris }
3979f11c7f63SJim Harris
3980f11c7f63SJim Harris // ---------------------------------------------------------------------------
3981f11c7f63SJim Harris
3982f11c7f63SJim Harris SCI_BASE_STATE_T
3983f11c7f63SJim Harris scic_sds_phy_starting_substates[SCIC_SDS_PHY_STARTING_MAX_SUBSTATES] =
3984f11c7f63SJim Harris {
3985f11c7f63SJim Harris {
3986f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL,
3987f11c7f63SJim Harris scic_sds_phy_starting_initial_substate_enter,
3988f11c7f63SJim Harris NULL,
3989f11c7f63SJim Harris },
3990f11c7f63SJim Harris {
3991f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN,
3992f11c7f63SJim Harris scic_sds_phy_starting_await_ossp_en_substate_enter,
3993f11c7f63SJim Harris NULL,
3994f11c7f63SJim Harris },
3995f11c7f63SJim Harris {
3996f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN,
3997f11c7f63SJim Harris scic_sds_phy_starting_await_sas_speed_en_substate_enter,
3998f11c7f63SJim Harris NULL,
3999f11c7f63SJim Harris },
4000f11c7f63SJim Harris {
4001f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF,
4002f11c7f63SJim Harris scic_sds_phy_starting_await_iaf_uf_substate_enter,
4003f11c7f63SJim Harris NULL,
4004f11c7f63SJim Harris },
4005f11c7f63SJim Harris {
4006f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER,
4007f11c7f63SJim Harris scic_sds_phy_starting_await_sas_power_substate_enter,
4008f11c7f63SJim Harris scic_sds_phy_starting_await_sas_power_substate_exit,
4009f11c7f63SJim Harris },
4010f11c7f63SJim Harris {
4011f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER,
4012f11c7f63SJim Harris scic_sds_phy_starting_await_sata_power_substate_enter,
4013f11c7f63SJim Harris scic_sds_phy_starting_await_sata_power_substate_exit
4014f11c7f63SJim Harris },
4015f11c7f63SJim Harris {
4016f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN,
4017f11c7f63SJim Harris scic_sds_phy_starting_await_sata_phy_substate_enter,
4018f11c7f63SJim Harris scic_sds_phy_starting_await_sata_phy_substate_exit
4019f11c7f63SJim Harris },
4020f11c7f63SJim Harris {
4021f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN,
4022f11c7f63SJim Harris scic_sds_phy_starting_await_sata_speed_substate_enter,
4023f11c7f63SJim Harris scic_sds_phy_starting_await_sata_speed_substate_exit
4024f11c7f63SJim Harris },
4025f11c7f63SJim Harris {
4026f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF,
4027f11c7f63SJim Harris scic_sds_phy_starting_await_sig_fis_uf_substate_enter,
4028f11c7f63SJim Harris scic_sds_phy_starting_await_sig_fis_uf_substate_exit
4029f11c7f63SJim Harris },
4030f11c7f63SJim Harris {
4031f11c7f63SJim Harris SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL,
4032f11c7f63SJim Harris scic_sds_phy_starting_final_substate_enter,
4033f11c7f63SJim Harris NULL,
4034f11c7f63SJim Harris }
4035f11c7f63SJim Harris };
4036f11c7f63SJim Harris
4037