mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
isci: remove base_phy abstraction
Merge struct sci_base_phy into scic_sds_phy. Until now sci_base_phy was referenced using scic_sds_phy->parent field. 'sci_base_phy' state machine handlers were also merged into scic_sds_phy state handlers. Reported-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Maciej Trela <Maciej.Trela@intel.com> Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
41e2b90584
commit
d857d9a0ad
6 changed files with 260 additions and 412 deletions
|
@ -1,200 +0,0 @@
|
|||
/*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called LICENSE.GPL.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _SCI_BASE_PHY_H_
|
||||
#define _SCI_BASE_PHY_H_
|
||||
|
||||
/**
|
||||
* This file contains all of the structures, constants, and methods common to
|
||||
* all phy object definitions.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sci_base_state_machine.h"
|
||||
|
||||
/**
|
||||
* enum sci_base_phy_states - This enumeration depicts the standard states
|
||||
* common to all phy state machine implementations.
|
||||
*
|
||||
*
|
||||
*/
|
||||
enum sci_base_phy_states {
|
||||
/**
|
||||
* Simply the initial state for the base domain state machine.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_INITIAL,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy has successfully been stopped.
|
||||
* In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the INITIAL state.
|
||||
* This state is entered from the STARTING state.
|
||||
* This state is entered from the READY state.
|
||||
* This state is entered from the RESETTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_STOPPED,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy is in the process of becomming
|
||||
* ready. In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the STOPPED state.
|
||||
* This state is entered from the READY state.
|
||||
* This state is entered from the RESETTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_STARTING,
|
||||
|
||||
/**
|
||||
* This state indicates the the phy is now ready. Thus, the user
|
||||
* is able to perform IO operations utilizing this phy as long as it
|
||||
* is currently part of a valid port.
|
||||
* This state is entered from the STARTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_READY,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy is in the process of being reset.
|
||||
* In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the READY state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_RESETTING,
|
||||
|
||||
/**
|
||||
* Simply the final state for the base phy state machine.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_FINAL,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct sci_base_phy - This structure defines all of the fields common to PHY
|
||||
* objects.
|
||||
*
|
||||
*
|
||||
*/
|
||||
struct sci_base_phy {
|
||||
/**
|
||||
* This field depicts the parent object (struct sci_base_object) for the phy.
|
||||
*/
|
||||
struct sci_base_object parent;
|
||||
|
||||
/**
|
||||
* This field contains the information for the base phy state machine.
|
||||
*/
|
||||
struct sci_base_state_machine state_machine;
|
||||
};
|
||||
|
||||
typedef enum sci_status (*sci_base_phy_handler_t)(struct sci_base_phy *);
|
||||
|
||||
/**
|
||||
* struct sci_base_phy_state_handler - This structure contains all of the state
|
||||
* handler methods common to base phy state machines. Handler methods
|
||||
* provide the ability to change the behavior for user requests or
|
||||
* transitions depending on the state the machine is in.
|
||||
*
|
||||
*
|
||||
*/
|
||||
struct sci_base_phy_state_handler {
|
||||
/**
|
||||
* The start_handler specifies the method invoked when there is an
|
||||
* attempt to start a phy.
|
||||
*/
|
||||
sci_base_phy_handler_t start_handler;
|
||||
|
||||
/**
|
||||
* The stop_handler specifies the method invoked when there is an
|
||||
* attempt to stop a phy.
|
||||
*/
|
||||
sci_base_phy_handler_t stop_handler;
|
||||
|
||||
/**
|
||||
* The reset_handler specifies the method invoked when there is an
|
||||
* attempt to reset a phy.
|
||||
*/
|
||||
sci_base_phy_handler_t reset_handler;
|
||||
|
||||
/**
|
||||
* The destruct_handler specifies the method invoked when attempting to
|
||||
* destruct a phy.
|
||||
*/
|
||||
sci_base_phy_handler_t destruct_handler;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* sci_base_phy_construct() - Construct the base phy
|
||||
* @this_phy: This parameter specifies the base phy to be constructed.
|
||||
* @state_table: This parameter specifies the table of state definitions to be
|
||||
* utilized for the phy state machine.
|
||||
*
|
||||
*/
|
||||
static inline void sci_base_phy_construct(
|
||||
struct sci_base_phy *base_phy,
|
||||
const struct sci_base_state *state_table)
|
||||
{
|
||||
base_phy->parent.private = NULL;
|
||||
sci_base_state_machine_construct(
|
||||
&base_phy->state_machine,
|
||||
&base_phy->parent,
|
||||
state_table,
|
||||
SCI_BASE_PHY_STATE_INITIAL
|
||||
);
|
||||
|
||||
sci_base_state_machine_start(
|
||||
&base_phy->state_machine
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
#endif /* _SCI_BASE_PHY_H_ */
|
|
@ -679,7 +679,7 @@ static enum sci_status scic_sds_controller_start_next_phy(struct scic_sds_contro
|
|||
|
||||
for (index = 0; index < SCI_MAX_PHYS; index++) {
|
||||
sci_phy = &scic->phy_table[index];
|
||||
state = sci_phy->parent.state_machine.current_state_id;
|
||||
state = sci_phy->state_machine.current_state_id;
|
||||
|
||||
if (!scic_sds_phy_get_port(sci_phy))
|
||||
continue;
|
||||
|
|
|
@ -253,7 +253,7 @@ scic_sds_phy_link_layer_initialization(struct scic_sds_phy *sci_phy,
|
|||
writel(0x1F4, &sci_phy->link_layer_registers->link_layer_hang_detection_timeout);
|
||||
|
||||
/* We can exit the initial state to the stopped state */
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STOPPED);
|
||||
|
||||
return SCI_SUCCESS;
|
||||
|
@ -276,7 +276,7 @@ static void scic_sds_phy_sata_timeout(void *phy)
|
|||
|
||||
sci_base_state_machine_stop(&sci_phy->starting_substate_machine);
|
||||
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
}
|
||||
|
||||
|
@ -353,7 +353,7 @@ enum sci_status scic_sds_phy_initialize(
|
|||
/*
|
||||
* There is nothing that needs to be done in this state just
|
||||
* transition to the stopped state. */
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STOPPED);
|
||||
|
||||
return SCI_SUCCESS;
|
||||
|
@ -515,7 +515,7 @@ void scic_sds_phy_get_attached_phy_protocols(
|
|||
*/
|
||||
enum sci_status scic_sds_phy_start(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return sci_phy->state_handlers->parent.start_handler(&sci_phy->parent);
|
||||
return sci_phy->state_handlers->start_handler(sci_phy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -527,7 +527,7 @@ enum sci_status scic_sds_phy_start(struct scic_sds_phy *sci_phy)
|
|||
*/
|
||||
enum sci_status scic_sds_phy_stop(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return sci_phy->state_handlers->parent.stop_handler(&sci_phy->parent);
|
||||
return sci_phy->state_handlers->stop_handler(sci_phy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -540,9 +540,7 @@ enum sci_status scic_sds_phy_stop(struct scic_sds_phy *sci_phy)
|
|||
enum sci_status scic_sds_phy_reset(
|
||||
struct scic_sds_phy *this_phy)
|
||||
{
|
||||
return this_phy->state_handlers->parent.reset_handler(
|
||||
&this_phy->parent
|
||||
);
|
||||
return this_phy->state_handlers->reset_handler(this_phy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -714,7 +712,7 @@ static void scic_sds_phy_restart_starting_state(
|
|||
sci_base_state_machine_stop(&sci_phy->starting_substate_machine);
|
||||
|
||||
/* Re-enter the base state machine starting state */
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
}
|
||||
|
||||
|
@ -722,12 +720,9 @@ static void scic_sds_phy_restart_starting_state(
|
|||
* SCIC SDS PHY general handlers
|
||||
************************************************************************** */
|
||||
static enum sci_status scic_sds_phy_starting_substate_general_stop_handler(
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy;
|
||||
this_phy = (struct scic_sds_phy *)phy;
|
||||
|
||||
sci_base_state_machine_stop(&this_phy->starting_substate_machine);
|
||||
sci_base_state_machine_stop(&phy->starting_substate_machine);
|
||||
|
||||
sci_base_state_machine_change_state(&phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STOPPED);
|
||||
|
@ -1331,11 +1326,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_sig_fis_frame_handle
|
|||
* * SCIC SDS PHY POWER_HANDLERS
|
||||
* ***************************************************************************** */
|
||||
|
||||
/**
|
||||
* scic_sds_phy_starting_substate_await_sas_power_consume_power_handler -
|
||||
* @phy: This is the struct sci_base_phy object which is cast into a struct scic_sds_phy
|
||||
* object.
|
||||
*
|
||||
/*
|
||||
* This method is called by the struct scic_sds_controller when the phy object is
|
||||
* granted power. - The notify enable spinups are turned on for this phy object
|
||||
* - The phy state machine is transitioned to the
|
||||
|
@ -1357,11 +1348,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_sas_power_consume_po
|
|||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @phy: This is the struct sci_base_phy object which is cast into a struct scic_sds_phy
|
||||
* object.
|
||||
*
|
||||
/*
|
||||
* This method is called by the struct scic_sds_controller when the phy object is
|
||||
* granted power. - The phy state machine is transitioned to the
|
||||
* SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN. enum sci_status SCI_SUCCESS
|
||||
|
@ -1393,148 +1380,153 @@ static enum sci_status scic_sds_phy_starting_substate_await_sata_power_consume_p
|
|||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
static enum sci_status default_phy_handler(struct sci_base_phy *base_phy, const char *func)
|
||||
static enum sci_status default_phy_handler(struct scic_sds_phy *sci_phy,
|
||||
const char *func)
|
||||
{
|
||||
struct scic_sds_phy *sci_phy;
|
||||
|
||||
sci_phy = container_of(base_phy, typeof(*sci_phy), parent);
|
||||
dev_dbg(sciphy_to_dev(sci_phy),
|
||||
"%s: in wrong state: %d\n", func,
|
||||
sci_base_state_machine_get_state(&base_phy->state_machine));
|
||||
sci_base_state_machine_get_state(&sci_phy->state_machine));
|
||||
return SCI_FAILURE_INVALID_STATE;
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_start_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_start_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return default_phy_handler(base_phy, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_stop_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_stop_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return default_phy_handler(base_phy, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_reset_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_reset_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return default_phy_handler(base_phy, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_destroy_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_destroy_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return default_phy_handler(base_phy, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_frame_handler(struct scic_sds_phy *sci_phy,
|
||||
u32 frame_index)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_frame_handler(struct scic_sds_phy *sci_phy,
|
||||
u32 frame_index)
|
||||
{
|
||||
struct scic_sds_controller *scic = scic_sds_phy_get_controller(sci_phy);
|
||||
|
||||
default_phy_handler(&sci_phy->parent, __func__);
|
||||
default_phy_handler(sci_phy, __func__);
|
||||
scic_sds_controller_release_frame(scic, frame_index);
|
||||
|
||||
return SCI_FAILURE_INVALID_STATE;
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_event_handler(struct scic_sds_phy *sci_phy,
|
||||
u32 event_code)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_event_handler(struct scic_sds_phy *sci_phy,
|
||||
u32 event_code)
|
||||
{
|
||||
return default_phy_handler(&sci_phy->parent, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_default_consume_power_handler(struct scic_sds_phy *sci_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_default_consume_power_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return default_phy_handler(&sci_phy->parent, __func__);
|
||||
return default_phy_handler(sci_phy, __func__);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static const struct scic_sds_phy_state_handler scic_sds_phy_starting_substate_handler_table[] = {
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_ossp_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_ossp_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sas_phy_speed_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sas_phy_speed_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_starting_substate_await_iaf_uf_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_iaf_uf_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_starting_substate_await_iaf_uf_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_iaf_uf_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sas_power_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_starting_substate_await_sas_power_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sas_power_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_starting_substate_await_sas_power_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_power_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_starting_substate_await_sata_power_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_power_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_starting_substate_await_sata_power_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_phy_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_phy_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_speed_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sata_speed_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_starting_substate_await_sig_fis_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sig_fis_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_starting_substate_await_sig_fis_frame_handler,
|
||||
.event_handler = scic_sds_phy_starting_substate_await_sig_fis_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_starting_substate_general_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
|
@ -1885,7 +1877,7 @@ static void scic_sds_phy_starting_final_substate_enter(struct sci_base_object *o
|
|||
{
|
||||
struct scic_sds_phy *sci_phy;
|
||||
|
||||
sci_phy = container_of(object, typeof(*sci_phy), parent.parent);
|
||||
sci_phy = container_of(object, typeof(*sci_phy), parent);
|
||||
|
||||
scic_sds_phy_set_starting_substate_handlers(sci_phy,
|
||||
SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL);
|
||||
|
@ -1893,7 +1885,7 @@ static void scic_sds_phy_starting_final_substate_enter(struct sci_base_object *o
|
|||
/* State machine has run to completion so exit out and change
|
||||
* the base state machine to the ready state
|
||||
*/
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_READY);
|
||||
}
|
||||
|
||||
|
@ -1937,22 +1929,17 @@ static const struct sci_base_state scic_sds_phy_starting_substates[] = {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @phy: This is the struct sci_base_phy object which is cast into a
|
||||
* struct scic_sds_phy object.
|
||||
*
|
||||
/*
|
||||
* This method takes the struct scic_sds_phy from a stopped state and
|
||||
* attempts to start it. - The phy state machine is transitioned to the
|
||||
* SCI_BASE_PHY_STATE_STARTING. enum sci_status SCI_SUCCESS
|
||||
*/
|
||||
static enum sci_status scic_sds_phy_stopped_state_start_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_stopped_state_start_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
struct isci_host *ihost;
|
||||
struct scic_sds_phy *sci_phy;
|
||||
struct scic_sds_controller *scic;
|
||||
|
||||
sci_phy = container_of(base_phy, typeof(*sci_phy), parent);
|
||||
scic = scic_sds_phy_get_controller(sci_phy),
|
||||
ihost = sci_object_get_association(scic);
|
||||
|
||||
|
@ -1961,28 +1948,31 @@ static enum sci_status scic_sds_phy_stopped_state_start_handler(struct sci_base_
|
|||
scic_sds_phy_sata_timeout);
|
||||
|
||||
if (sci_phy->sata_timeout_timer)
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
|
||||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_stopped_state_destroy_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_stopped_state_destroy_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_ready_state_stop_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_ready_state_stop_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
sci_base_state_machine_change_state(&base_phy->state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STOPPED);
|
||||
|
||||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
static enum sci_status scic_sds_phy_ready_state_reset_handler(struct sci_base_phy *base_phy)
|
||||
static enum sci_status
|
||||
scic_sds_phy_ready_state_reset_handler(struct scic_sds_phy *sci_phy)
|
||||
{
|
||||
sci_base_state_machine_change_state(&base_phy->state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_RESETTING);
|
||||
|
||||
return SCI_SUCCESS;
|
||||
|
@ -2007,7 +1997,7 @@ static enum sci_status scic_sds_phy_ready_state_event_handler(struct scic_sds_ph
|
|||
switch (scu_get_event_code(event_code)) {
|
||||
case SCU_EVENT_LINK_FAILURE:
|
||||
/* Link failure change state back to the starting state */
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
result = SCI_SUCCESS;
|
||||
break;
|
||||
|
@ -2041,7 +2031,7 @@ static enum sci_status scic_sds_phy_resetting_state_event_handler(struct scic_sd
|
|||
switch (scu_get_event_code(event_code)) {
|
||||
case SCU_EVENT_HARD_RESET_TRANSMITTED:
|
||||
/* Link failure change state back to the starting state */
|
||||
sci_base_state_machine_change_state(&sci_phy->parent.state_machine,
|
||||
sci_base_state_machine_change_state(&sci_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
result = SCI_SUCCESS;
|
||||
break;
|
||||
|
@ -2063,55 +2053,55 @@ static enum sci_status scic_sds_phy_resetting_state_event_handler(struct scic_sd
|
|||
|
||||
static const struct scic_sds_phy_state_handler scic_sds_phy_state_handler_table[] = {
|
||||
[SCI_BASE_PHY_STATE_INITIAL] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCI_BASE_PHY_STATE_STOPPED] = {
|
||||
.parent.start_handler = scic_sds_phy_stopped_state_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_stopped_state_destroy_handler,
|
||||
.start_handler = scic_sds_phy_stopped_state_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_stopped_state_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCI_BASE_PHY_STATE_STARTING] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCI_BASE_PHY_STATE_READY] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_ready_state_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_ready_state_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_ready_state_stop_handler,
|
||||
.reset_handler = scic_sds_phy_ready_state_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_ready_state_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCI_BASE_PHY_STATE_RESETTING] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_resetting_state_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
},
|
||||
[SCI_BASE_PHY_STATE_FINAL] = {
|
||||
.parent.start_handler = scic_sds_phy_default_start_handler,
|
||||
.parent.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.parent.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.parent.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.start_handler = scic_sds_phy_default_start_handler,
|
||||
.stop_handler = scic_sds_phy_default_stop_handler,
|
||||
.reset_handler = scic_sds_phy_default_reset_handler,
|
||||
.destruct_handler = scic_sds_phy_default_destroy_handler,
|
||||
.frame_handler = scic_sds_phy_default_frame_handler,
|
||||
.event_handler = scic_sds_phy_default_event_handler,
|
||||
.consume_power_handler = scic_sds_phy_default_consume_power_handler
|
||||
|
@ -2260,7 +2250,7 @@ static void scic_sds_phy_stopped_state_enter(struct sci_base_object *object)
|
|||
|
||||
scu_link_layer_stop_protocol_engine(sci_phy);
|
||||
|
||||
if (sci_phy->parent.state_machine.previous_state_id !=
|
||||
if (sci_phy->state_machine.previous_state_id !=
|
||||
SCI_BASE_PHY_STATE_INITIAL)
|
||||
scic_sds_controller_link_down(
|
||||
scic_sds_phy_get_controller(sci_phy),
|
||||
|
@ -2299,7 +2289,7 @@ static void scic_sds_phy_starting_state_enter(
|
|||
/* Change over to the starting substate machine to continue */
|
||||
sci_base_state_machine_start(&this_phy->starting_substate_machine);
|
||||
|
||||
if (this_phy->parent.state_machine.previous_state_id
|
||||
if (this_phy->state_machine.previous_state_id
|
||||
== SCI_BASE_PHY_STATE_READY) {
|
||||
scic_sds_controller_link_down(
|
||||
scic_sds_phy_get_controller(this_phy),
|
||||
|
@ -2380,12 +2370,10 @@ static void scic_sds_phy_resetting_state_enter(
|
|||
scu_link_layer_tx_hard_reset(this_phy);
|
||||
} else {
|
||||
/*
|
||||
* The SCU does not need to have a descrete reset state so just go back to
|
||||
* The SCU does not need to have a discrete reset state so just go back to
|
||||
* the starting state. */
|
||||
sci_base_state_machine_change_state(
|
||||
&this_phy->parent.state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING
|
||||
);
|
||||
sci_base_state_machine_change_state(&this_phy->state_machine,
|
||||
SCI_BASE_PHY_STATE_STARTING);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2436,10 +2424,14 @@ static const struct sci_base_state scic_sds_phy_state_table[] = {
|
|||
void scic_sds_phy_construct(struct scic_sds_phy *sci_phy,
|
||||
struct scic_sds_port *owning_port, u8 phy_index)
|
||||
{
|
||||
/*
|
||||
* Call the base constructor first
|
||||
*/
|
||||
sci_base_phy_construct(&sci_phy->parent, scic_sds_phy_state_table);
|
||||
|
||||
sci_phy->parent.private = NULL;
|
||||
sci_base_state_machine_construct(&sci_phy->state_machine,
|
||||
&sci_phy->parent,
|
||||
scic_sds_phy_state_table,
|
||||
SCI_BASE_PHY_STATE_INITIAL);
|
||||
|
||||
sci_base_state_machine_start(&sci_phy->state_machine);
|
||||
|
||||
/* Copy the rest of the input data to our locals */
|
||||
sci_phy->owning_port = owning_port;
|
||||
|
@ -2455,7 +2447,7 @@ void scic_sds_phy_construct(struct scic_sds_phy *sci_phy,
|
|||
|
||||
/* Initialize the the substate machines */
|
||||
sci_base_state_machine_construct(&sci_phy->starting_substate_machine,
|
||||
&sci_phy->parent.parent,
|
||||
&sci_phy->parent,
|
||||
scic_sds_phy_starting_substates,
|
||||
SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL);
|
||||
}
|
||||
|
|
|
@ -56,17 +56,10 @@
|
|||
#ifndef _SCIC_SDS_PHY_H_
|
||||
#define _SCIC_SDS_PHY_H_
|
||||
|
||||
/**
|
||||
* This file contains the structures, constants and prototypes for the
|
||||
* struct scic_sds_phy object.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "intel_sata.h"
|
||||
#include "intel_sas.h"
|
||||
#include "sci_base_phy.h"
|
||||
#include "scu_registers.h"
|
||||
#include "sci_base_state_machine.h"
|
||||
|
||||
struct scic_sds_port;
|
||||
/**
|
||||
|
@ -91,6 +84,53 @@ struct scic_sds_port;
|
|||
*/
|
||||
#define SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT 250
|
||||
|
||||
enum scic_sds_phy_states {
|
||||
/**
|
||||
* Simply the initial state for the base domain state machine.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_INITIAL,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy has successfully been stopped.
|
||||
* In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the INITIAL state.
|
||||
* This state is entered from the STARTING state.
|
||||
* This state is entered from the READY state.
|
||||
* This state is entered from the RESETTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_STOPPED,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy is in the process of becomming
|
||||
* ready. In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the STOPPED state.
|
||||
* This state is entered from the READY state.
|
||||
* This state is entered from the RESETTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_STARTING,
|
||||
|
||||
/**
|
||||
* This state indicates the the phy is now ready. Thus, the user
|
||||
* is able to perform IO operations utilizing this phy as long as it
|
||||
* is currently part of a valid port.
|
||||
* This state is entered from the STARTING state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_READY,
|
||||
|
||||
/**
|
||||
* This state indicates that the phy is in the process of being reset.
|
||||
* In this state no new IO operations are permitted on this phy.
|
||||
* This state is entered from the READY state.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_RESETTING,
|
||||
|
||||
/**
|
||||
* Simply the final state for the base phy state machine.
|
||||
*/
|
||||
SCI_BASE_PHY_STATE_FINAL,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* enum scic_sds_phy_starting_substates -
|
||||
*
|
||||
|
@ -184,7 +224,15 @@ enum scic_sds_phy_protocol {
|
|||
*
|
||||
*/
|
||||
struct scic_sds_phy {
|
||||
struct sci_base_phy parent;
|
||||
/**
|
||||
* This field depicts the parent object (struct sci_base_object) for the phy.
|
||||
*/
|
||||
struct sci_base_object parent;
|
||||
|
||||
/**
|
||||
* This field contains the information for the base phy state machine.
|
||||
*/
|
||||
struct sci_base_state_machine state_machine;
|
||||
|
||||
/**
|
||||
* This field specifies the port object that owns/contains this phy.
|
||||
|
@ -260,7 +308,7 @@ struct scic_sds_phy {
|
|||
|
||||
};
|
||||
|
||||
|
||||
typedef enum sci_status (*scic_sds_phy_handler_t)(struct scic_sds_phy *);
|
||||
typedef enum sci_status (*scic_sds_phy_event_handler_t)(struct scic_sds_phy *, u32);
|
||||
typedef enum sci_status (*scic_sds_phy_frame_handler_t)(struct scic_sds_phy *, u32);
|
||||
typedef enum sci_status (*scic_sds_phy_power_handler_t)(struct scic_sds_phy *);
|
||||
|
@ -272,9 +320,28 @@ typedef enum sci_status (*scic_sds_phy_power_handler_t)(struct scic_sds_phy *);
|
|||
*/
|
||||
struct scic_sds_phy_state_handler {
|
||||
/**
|
||||
* This is the struct sci_base_phy object state handlers.
|
||||
* The start_handler specifies the method invoked when there is an
|
||||
* attempt to start a phy.
|
||||
*/
|
||||
struct sci_base_phy_state_handler parent;
|
||||
scic_sds_phy_handler_t start_handler;
|
||||
|
||||
/**
|
||||
* The stop_handler specifies the method invoked when there is an
|
||||
* attempt to stop a phy.
|
||||
*/
|
||||
scic_sds_phy_handler_t stop_handler;
|
||||
|
||||
/**
|
||||
* The reset_handler specifies the method invoked when there is an
|
||||
* attempt to reset a phy.
|
||||
*/
|
||||
scic_sds_phy_handler_t reset_handler;
|
||||
|
||||
/**
|
||||
* The destruct_handler specifies the method invoked when attempting to
|
||||
* destruct a phy.
|
||||
*/
|
||||
scic_sds_phy_handler_t destruct_handler;
|
||||
|
||||
/**
|
||||
* The state handler for unsolicited frames received from the SCU hardware.
|
||||
|
|
|
@ -316,7 +316,7 @@ enum sci_status scic_sds_port_add_phy(
|
|||
struct scic_sds_phy *the_phy)
|
||||
{
|
||||
return this_port->state_handlers->add_phy_handler(
|
||||
this_port, &the_phy->parent);
|
||||
this_port, the_phy);
|
||||
}
|
||||
|
||||
|
||||
|
@ -334,7 +334,7 @@ enum sci_status scic_sds_port_remove_phy(
|
|||
struct scic_sds_phy *the_phy)
|
||||
{
|
||||
return this_port->state_handlers->remove_phy_handler(
|
||||
this_port, &the_phy->parent);
|
||||
this_port, the_phy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1084,15 +1084,14 @@ static enum sci_status scic_sds_port_ready_substate_complete_io_handler(
|
|||
|
||||
static enum sci_status scic_sds_port_ready_substate_add_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
enum sci_status status;
|
||||
|
||||
status = scic_sds_port_set_phy(port, this_phy);
|
||||
status = scic_sds_port_set_phy(port, phy);
|
||||
|
||||
if (status == SCI_SUCCESS) {
|
||||
scic_sds_port_general_link_up_handler(port, this_phy, true);
|
||||
scic_sds_port_general_link_up_handler(port, phy, true);
|
||||
|
||||
port->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
|
||||
|
||||
|
@ -1108,15 +1107,14 @@ static enum sci_status scic_sds_port_ready_substate_add_phy_handler(
|
|||
|
||||
static enum sci_status scic_sds_port_ready_substate_remove_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
enum sci_status status;
|
||||
|
||||
status = scic_sds_port_clear_phy(port, this_phy);
|
||||
status = scic_sds_port_clear_phy(port, phy);
|
||||
|
||||
if (status == SCI_SUCCESS) {
|
||||
scic_sds_port_deactivate_phy(port, this_phy, true);
|
||||
scic_sds_port_deactivate_phy(port, phy, true);
|
||||
|
||||
port->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
|
||||
|
||||
|
@ -1293,15 +1291,14 @@ static enum sci_status scic_sds_port_ready_operational_substate_start_io_handler
|
|||
*/
|
||||
static enum sci_status scic_sds_port_ready_configuring_substate_add_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
enum sci_status status;
|
||||
|
||||
status = scic_sds_port_set_phy(port, this_phy);
|
||||
status = scic_sds_port_set_phy(port, phy);
|
||||
|
||||
if (status == SCI_SUCCESS) {
|
||||
scic_sds_port_general_link_up_handler(port, this_phy, true);
|
||||
scic_sds_port_general_link_up_handler(port, phy, true);
|
||||
|
||||
/*
|
||||
* Re-enter the configuring state since this may be the last phy in
|
||||
|
@ -1321,15 +1318,14 @@ static enum sci_status scic_sds_port_ready_configuring_substate_add_phy_handler(
|
|||
*/
|
||||
static enum sci_status scic_sds_port_ready_configuring_substate_remove_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
enum sci_status status;
|
||||
|
||||
status = scic_sds_port_clear_phy(port, this_phy);
|
||||
status = scic_sds_port_clear_phy(port, phy);
|
||||
|
||||
if (status == SCI_SUCCESS) {
|
||||
scic_sds_port_deactivate_phy(port, this_phy, true);
|
||||
scic_sds_port_deactivate_phy(port, phy, true);
|
||||
|
||||
/*
|
||||
* Re-enter the configuring state since this may be the last phy in
|
||||
|
@ -1406,14 +1402,14 @@ scic_sds_port_default_reset_handler(struct scic_sds_port *sci_port,
|
|||
|
||||
static enum sci_status
|
||||
scic_sds_port_default_add_phy_handler(struct scic_sds_port *sci_port,
|
||||
struct sci_base_phy *base_phy)
|
||||
struct scic_sds_phy *base_phy)
|
||||
{
|
||||
return default_port_handler(sci_port, __func__);
|
||||
}
|
||||
|
||||
static enum sci_status
|
||||
scic_sds_port_default_remove_phy_handler(struct scic_sds_port *sci_port,
|
||||
struct sci_base_phy *base_phy)
|
||||
struct scic_sds_phy *base_phy)
|
||||
{
|
||||
return default_port_handler(sci_port, __func__);
|
||||
}
|
||||
|
@ -1939,9 +1935,8 @@ static enum sci_status scic_sds_port_stopped_state_destruct_handler(
|
|||
*/
|
||||
static enum sci_status scic_sds_port_stopped_state_add_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
struct sci_sas_address port_sas_address;
|
||||
|
||||
/* Read the port assigned SAS Address if there is one */
|
||||
|
@ -1953,7 +1948,7 @@ static enum sci_status scic_sds_port_stopped_state_add_phy_handler(
|
|||
/*
|
||||
* Make sure that the PHY SAS Address matches the SAS Address
|
||||
* for this port. */
|
||||
scic_sds_phy_get_sas_address(this_phy, &phy_sas_address);
|
||||
scic_sds_phy_get_sas_address(phy, &phy_sas_address);
|
||||
|
||||
if (
|
||||
(port_sas_address.high != phy_sas_address.high)
|
||||
|
@ -1963,10 +1958,9 @@ static enum sci_status scic_sds_port_stopped_state_add_phy_handler(
|
|||
}
|
||||
}
|
||||
|
||||
return scic_sds_port_set_phy(port, this_phy);
|
||||
return scic_sds_port_set_phy(port, phy);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This method takes the struct scic_sds_port that is in a stopped state and handles
|
||||
* the remove phy request. In MPC mode the only time a phy can be removed from
|
||||
|
@ -1976,11 +1970,9 @@ static enum sci_status scic_sds_port_stopped_state_add_phy_handler(
|
|||
*/
|
||||
static enum sci_status scic_sds_port_stopped_state_remove_phy_handler(
|
||||
struct scic_sds_port *port,
|
||||
struct sci_base_phy *phy)
|
||||
struct scic_sds_phy *phy)
|
||||
{
|
||||
struct scic_sds_phy *this_phy = (struct scic_sds_phy *)phy;
|
||||
|
||||
return scic_sds_port_clear_phy(port, this_phy);
|
||||
return scic_sds_port_clear_phy(port, phy);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include "sci_controller_constants.h"
|
||||
#include "intel_sas.h"
|
||||
#include "sci_base_phy.h"
|
||||
#include "scu_registers.h"
|
||||
|
||||
#define SCIC_SDS_DUMMY_PORT 0xFF
|
||||
|
@ -260,12 +259,10 @@ struct scic_sds_port {
|
|||
|
||||
};
|
||||
|
||||
struct sci_base_phy;
|
||||
|
||||
typedef enum sci_status (*scic_sds_port_handler_t)(struct scic_sds_port *);
|
||||
|
||||
typedef enum sci_status (*scic_sds_port_phy_handler_t)(struct scic_sds_port *,
|
||||
struct sci_base_phy *);
|
||||
struct scic_sds_phy *);
|
||||
|
||||
typedef enum sci_status (*scic_sds_port_reset_handler_t)(struct scic_sds_port *,
|
||||
u32 timeout);
|
||||
|
|
Loading…
Reference in a new issue