Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+0 −200
Original line number Diff line number Diff line
/*
 * 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_ */
+1 −1
Original line number Diff line number Diff line
@@ -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;
+158 −166

File changed.

Preview size limit exceeded, changes collapsed.

+79 −12
Original line number Diff line number Diff line
@@ -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.
+21 −29
Original line number Diff line number Diff line
@@ -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);
}

/*
Loading