From: Maciej Trela Date: Wed, 13 Apr 2011 00:28:39 +0000 (-0700) Subject: isci: remove base_phy abstraction X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=d857d9a0adf49e332413d918322405192aafc766;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git 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 Signed-off-by: Maciej Trela Signed-off-by: Maciej Patelczyk Signed-off-by: Dan Williams --- diff --git a/drivers/scsi/isci/core/sci_base_phy.h b/drivers/scsi/isci/core/sci_base_phy.h deleted file mode 100644 index 7e2c7e331437..000000000000 --- a/drivers/scsi/isci/core/sci_base_phy.h +++ /dev/null @@ -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_ */ diff --git a/drivers/scsi/isci/core/scic_sds_controller.c b/drivers/scsi/isci/core/scic_sds_controller.c index 577d1df2cfd2..78b2e6f76d1a 100644 --- a/drivers/scsi/isci/core/scic_sds_controller.c +++ b/drivers/scsi/isci/core/scic_sds_controller.c @@ -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; diff --git a/drivers/scsi/isci/core/scic_sds_phy.c b/drivers/scsi/isci/core/scic_sds_phy.c index c26e5df18142..d5bbc220ab84 100644 --- a/drivers/scsi/isci/core/scic_sds_phy.c +++ b/drivers/scsi/isci/core/scic_sds_phy.c @@ -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); } diff --git a/drivers/scsi/isci/core/scic_sds_phy.h b/drivers/scsi/isci/core/scic_sds_phy.h index 7f7a04542031..97c0476570ba 100644 --- a/drivers/scsi/isci/core/scic_sds_phy.h +++ b/drivers/scsi/isci/core/scic_sds_phy.h @@ -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. + */ + 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. diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c index ff9ac73927a4..ebbde7b3489f 100644 --- a/drivers/scsi/isci/core/scic_sds_port.c +++ b/drivers/scsi/isci/core/scic_sds_port.c @@ -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); } /* diff --git a/drivers/scsi/isci/core/scic_sds_port.h b/drivers/scsi/isci/core/scic_sds_port.h index 528c84d569a0..d79c5745e49a 100644 --- a/drivers/scsi/isci/core/scic_sds_port.h +++ b/drivers/scsi/isci/core/scic_sds_port.h @@ -59,7 +59,6 @@ #include #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);