Commit d857d9a0 authored by Maciej Trela's avatar Maciej Trela Committed by Dan Williams

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMaciej Trela <Maciej.Trela@intel.com>
Signed-off-by: default avatarMaciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 41e2b905
/*
* 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 ...@@ -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++) { for (index = 0; index < SCI_MAX_PHYS; index++) {
sci_phy = &scic->phy_table[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)) if (!scic_sds_phy_get_port(sci_phy))
continue; continue;
......
This diff is collapsed.
...@@ -56,17 +56,10 @@ ...@@ -56,17 +56,10 @@
#ifndef _SCIC_SDS_PHY_H_ #ifndef _SCIC_SDS_PHY_H_
#define _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_sata.h"
#include "intel_sas.h" #include "intel_sas.h"
#include "sci_base_phy.h"
#include "scu_registers.h" #include "scu_registers.h"
#include "sci_base_state_machine.h"
struct scic_sds_port; struct scic_sds_port;
/** /**
...@@ -91,6 +84,53 @@ struct scic_sds_port; ...@@ -91,6 +84,53 @@ struct scic_sds_port;
*/ */
#define SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT 250 #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 - * enum scic_sds_phy_starting_substates -
* *
...@@ -184,7 +224,15 @@ enum scic_sds_phy_protocol { ...@@ -184,7 +224,15 @@ enum scic_sds_phy_protocol {
* *
*/ */
struct scic_sds_phy { 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. * This field specifies the port object that owns/contains this phy.
...@@ -260,7 +308,7 @@ struct scic_sds_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_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_frame_handler_t)(struct scic_sds_phy *, u32);
typedef enum sci_status (*scic_sds_phy_power_handler_t)(struct scic_sds_phy *); 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 *); ...@@ -272,9 +320,28 @@ typedef enum sci_status (*scic_sds_phy_power_handler_t)(struct scic_sds_phy *);
*/ */
struct scic_sds_phy_state_handler { 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.
*/
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.
*/ */
struct sci_base_phy_state_handler parent; scic_sds_phy_handler_t destruct_handler;
/** /**
* The state handler for unsolicited frames received from the SCU hardware. * The state handler for unsolicited frames received from the SCU hardware.
......
...@@ -316,7 +316,7 @@ enum sci_status scic_sds_port_add_phy( ...@@ -316,7 +316,7 @@ enum sci_status scic_sds_port_add_phy(
struct scic_sds_phy *the_phy) struct scic_sds_phy *the_phy)
{ {
return this_port->state_handlers->add_phy_handler( 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( ...@@ -334,7 +334,7 @@ enum sci_status scic_sds_port_remove_phy(
struct scic_sds_phy *the_phy) struct scic_sds_phy *the_phy)
{ {
return this_port->state_handlers->remove_phy_handler( 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( ...@@ -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( static enum sci_status scic_sds_port_ready_substate_add_phy_handler(
struct scic_sds_port *port, 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; 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) { 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; 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( ...@@ -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( static enum sci_status scic_sds_port_ready_substate_remove_phy_handler(
struct scic_sds_port *port, 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; 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) { 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; 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 ...@@ -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( static enum sci_status scic_sds_port_ready_configuring_substate_add_phy_handler(
struct scic_sds_port *port, 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; 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) { 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 * 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( ...@@ -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( static enum sci_status scic_sds_port_ready_configuring_substate_remove_phy_handler(
struct scic_sds_port *port, 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; 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) { 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 * 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, ...@@ -1406,14 +1402,14 @@ scic_sds_port_default_reset_handler(struct scic_sds_port *sci_port,
static enum sci_status static enum sci_status
scic_sds_port_default_add_phy_handler(struct scic_sds_port *sci_port, 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__); return default_port_handler(sci_port, __func__);
} }
static enum sci_status static enum sci_status
scic_sds_port_default_remove_phy_handler(struct scic_sds_port *sci_port, 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__); return default_port_handler(sci_port, __func__);
} }
...@@ -1939,9 +1935,8 @@ static enum sci_status scic_sds_port_stopped_state_destruct_handler( ...@@ -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( static enum sci_status scic_sds_port_stopped_state_add_phy_handler(
struct scic_sds_port *port, 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; struct sci_sas_address port_sas_address;
/* Read the port assigned SAS Address if there is one */ /* 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( ...@@ -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 * Make sure that the PHY SAS Address matches the SAS Address
* for this port. */ * 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 ( if (
(port_sas_address.high != phy_sas_address.high) (port_sas_address.high != phy_sas_address.high)
...@@ -1963,10 +1958,9 @@ static enum sci_status scic_sds_port_stopped_state_add_phy_handler( ...@@ -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 * 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 * 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( ...@@ -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( static enum sci_status scic_sds_port_stopped_state_remove_phy_handler(
struct scic_sds_port *port, 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, phy);
return scic_sds_port_clear_phy(port, this_phy);
} }
/* /*
......
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include "sci_controller_constants.h" #include "sci_controller_constants.h"
#include "intel_sas.h" #include "intel_sas.h"
#include "sci_base_phy.h"
#include "scu_registers.h" #include "scu_registers.h"
#define SCIC_SDS_DUMMY_PORT 0xFF #define SCIC_SDS_DUMMY_PORT 0xFF
...@@ -260,12 +259,10 @@ struct scic_sds_port { ...@@ -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_handler_t)(struct scic_sds_port *);
typedef enum sci_status (*scic_sds_port_phy_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 *, typedef enum sci_status (*scic_sds_port_reset_handler_t)(struct scic_sds_port *,
u32 timeout); u32 timeout);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment