isci: unify isci_phy and scic_sds_phy

They are one in the same object so remove the distinction.  The near
duplicate fields (owning_port, and isci_port) will be cleaned up
after the scic_sds_port isci_port unification.

Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams
2011-06-28 15:05:53 -07:00
szülő 5076a1a97e
commit 852809559e
8 fájl változott, egészen pontosan 508 új sor hozzáadva és 660 régi sor törölve

Fájl megtekintése

@@ -114,7 +114,7 @@ static s32 sci_sas_address_compare(
*/
static struct scic_sds_port *scic_sds_port_configuration_agent_find_port(
struct scic_sds_controller *scic,
struct scic_sds_phy *phy)
struct isci_phy *iphy)
{
u8 i;
struct sci_sas_address port_sas_address;
@@ -127,8 +127,8 @@ static struct scic_sds_port *scic_sds_port_configuration_agent_find_port(
* more phys match the sent and received SAS address as this phy in which
* case it should participate in the same port.
*/
scic_sds_phy_get_sas_address(phy, &phy_sas_address);
scic_sds_phy_get_attached_sas_address(phy, &phy_attached_device_address);
scic_sds_phy_get_sas_address(iphy, &phy_sas_address);
scic_sds_phy_get_attached_sas_address(iphy, &phy_attached_device_address);
for (i = 0; i < scic->logical_port_entries; i++) {
struct isci_host *ihost = scic_to_ihost(scic);
@@ -196,8 +196,8 @@ static enum sci_status scic_sds_port_configuration_agent_validate_ports(
* PE0 and PE3 can never have the same SAS Address unless they
* are part of the same x4 wide port and we have already checked
* for this condition. */
scic_sds_phy_get_sas_address(&ihost->phys[0].sci, &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[3].sci, &second_address);
scic_sds_phy_get_sas_address(&ihost->phys[0], &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[3], &second_address);
if (sci_sas_address_compare(first_address, second_address) == 0) {
return SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION;
@@ -209,8 +209,8 @@ static enum sci_status scic_sds_port_configuration_agent_validate_ports(
* part of the same port. */
if (port_agent->phy_valid_port_range[0].min_index == 0 &&
port_agent->phy_valid_port_range[1].min_index == 1) {
scic_sds_phy_get_sas_address(&ihost->phys[0].sci, &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[2].sci, &second_address);
scic_sds_phy_get_sas_address(&ihost->phys[0], &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[2], &second_address);
if (sci_sas_address_compare(first_address, second_address) == 0) {
return SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION;
@@ -223,8 +223,8 @@ static enum sci_status scic_sds_port_configuration_agent_validate_ports(
* part of the same port. */
if (port_agent->phy_valid_port_range[2].min_index == 2 &&
port_agent->phy_valid_port_range[3].min_index == 3) {
scic_sds_phy_get_sas_address(&ihost->phys[1].sci, &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[3].sci, &second_address);
scic_sds_phy_get_sas_address(&ihost->phys[1], &first_address);
scic_sds_phy_get_sas_address(&ihost->phys[3], &second_address);
if (sci_sas_address_compare(first_address, second_address) == 0) {
return SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION;
@@ -277,7 +277,7 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration(
for (phy_index = 0; phy_index < SCI_MAX_PHYS; phy_index++) {
if ((phy_mask & (1 << phy_index)) == 0)
continue;
scic_sds_phy_get_sas_address(&ihost->phys[phy_index].sci,
scic_sds_phy_get_sas_address(&ihost->phys[phy_index],
&sas_address);
/*
@@ -302,7 +302,7 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration(
while (phy_index < SCI_MAX_PHYS) {
if ((phy_mask & (1 << phy_index)) == 0)
continue;
scic_sds_phy_get_sas_address(&ihost->phys[phy_index].sci,
scic_sds_phy_get_sas_address(&ihost->phys[phy_index],
&phy_assigned_address);
if (sci_sas_address_compare(sas_address, phy_assigned_address) != 0) {
@@ -316,7 +316,7 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration(
port_agent->phy_valid_port_range[phy_index].max_index = phy_index;
scic_sds_port_add_phy(&ihost->ports[port_index].sci,
&ihost->phys[phy_index].sci);
&ihost->phys[phy_index]);
assigned_phy_mask |= (1 << phy_index);
}
@@ -352,12 +352,12 @@ static void mpc_agent_timeout(unsigned long data)
configure_phy_mask = ~port_agent->phy_configured_mask & port_agent->phy_ready_mask;
for (index = 0; index < SCI_MAX_PHYS; index++) {
struct scic_sds_phy *sci_phy = &ihost->phys[index].sci;
struct isci_phy *iphy = &ihost->phys[index];
if (configure_phy_mask & (1 << index)) {
port_agent->link_up_handler(scic, port_agent,
phy_get_non_dummy_port(sci_phy),
sci_phy);
phy_get_non_dummy_port(iphy),
iphy);
}
}
@@ -365,37 +365,22 @@ done:
spin_unlock_irqrestore(&ihost->scic_lock, flags);
}
/**
*
* @controller: This is the controller object that receives the link up
* notification.
* @port: This is the port object associated with the phy. If the is no
* associated port this is an NULL.
* @phy: This is the phy object which has gone ready.
*
* This method handles the manual port configuration link up notifications.
* Since all ports and phys are associate at initialization time we just turn
* around and notifiy the port object that there is a link up. If this PHY is
* not associated with a port there is no action taken. Is it possible to get a
* link up notification from a phy that has no assocoated port?
*/
static void scic_sds_mpc_agent_link_up(
struct scic_sds_controller *controller,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_port *port,
struct scic_sds_phy *phy)
static void scic_sds_mpc_agent_link_up(struct scic_sds_controller *controller,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_port *port,
struct isci_phy *iphy)
{
/*
* If the port has an invalid handle then the phy was not assigned to
/* If the port has an invalid handle then the phy was not assigned to
* a port. This is because the phy was not given the same SAS Address
* as the other PHYs in the port. */
* as the other PHYs in the port.
*/
if (port != NULL) {
port_agent->phy_ready_mask |= (1 << scic_sds_phy_get_index(phy));
port_agent->phy_ready_mask |= (1 << scic_sds_phy_get_index(iphy));
scic_sds_port_link_up(port, phy);
scic_sds_port_link_up(port, iphy);
if ((port->active_phy_mask & (1 << scic_sds_phy_get_index(phy))) != 0) {
port_agent->phy_configured_mask |= (1 << scic_sds_phy_get_index(phy));
if ((port->active_phy_mask & (1 << scic_sds_phy_get_index(iphy))) != 0) {
port_agent->phy_configured_mask |= (1 << scic_sds_phy_get_index(iphy));
}
}
}
@@ -421,7 +406,7 @@ static void scic_sds_mpc_agent_link_down(
struct scic_sds_controller *scic,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_port *sci_port,
struct scic_sds_phy *sci_phy)
struct isci_phy *iphy)
{
if (sci_port != NULL) {
/*
@@ -432,9 +417,9 @@ static void scic_sds_mpc_agent_link_down(
* state.
*/
port_agent->phy_ready_mask &=
~(1 << scic_sds_phy_get_index(sci_phy));
~(1 << scic_sds_phy_get_index(iphy));
port_agent->phy_configured_mask &=
~(1 << scic_sds_phy_get_index(sci_phy));
~(1 << scic_sds_phy_get_index(iphy));
/*
* Check to see if there are more phys waiting to be
@@ -451,7 +436,7 @@ static void scic_sds_mpc_agent_link_down(
SCIC_SDS_MPC_RECONFIGURATION_TIMEOUT);
}
scic_sds_port_link_down(sci_port, sci_phy);
scic_sds_port_link_down(sci_port, iphy);
}
}
@@ -482,11 +467,11 @@ static enum sci_status scic_sds_apc_agent_validate_phy_configuration(
port_index = phy_index;
/* Get the assigned SAS Address for the first PHY on the controller. */
scic_sds_phy_get_sas_address(&ihost->phys[phy_index].sci,
scic_sds_phy_get_sas_address(&ihost->phys[phy_index],
&sas_address);
while (++phy_index < SCI_MAX_PHYS) {
scic_sds_phy_get_sas_address(&ihost->phys[phy_index].sci,
scic_sds_phy_get_sas_address(&ihost->phys[phy_index],
&phy_assigned_address);
/* Verify each of the SAS address are all the same for every PHY */
@@ -504,20 +489,10 @@ static enum sci_status scic_sds_apc_agent_validate_phy_configuration(
return scic_sds_port_configuration_agent_validate_ports(controller, port_agent);
}
/**
*
* @controller: This is the controller object that receives the link up
* notification.
* @phy: This is the phy object which has gone link up.
*
* This method handles the automatic port configuration for link up
* notifications.
*/
static void scic_sds_apc_agent_configure_ports(
struct scic_sds_controller *controller,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_phy *phy,
bool start_timer)
static void scic_sds_apc_agent_configure_ports(struct scic_sds_controller *controller,
struct scic_sds_port_configuration_agent *port_agent,
struct isci_phy *iphy,
bool start_timer)
{
u8 port_index;
enum sci_status status;
@@ -525,10 +500,10 @@ static void scic_sds_apc_agent_configure_ports(
enum SCIC_SDS_APC_ACTIVITY apc_activity = SCIC_SDS_APC_SKIP_PHY;
struct isci_host *ihost = scic_to_ihost(controller);
port = scic_sds_port_configuration_agent_find_port(controller, phy);
port = scic_sds_port_configuration_agent_find_port(controller, iphy);
if (port != NULL) {
if (scic_sds_port_is_valid_phy_assignment(port, phy->phy_index))
if (scic_sds_port_is_valid_phy_assignment(port, iphy->phy_index))
apc_activity = SCIC_SDS_APC_ADD_PHY;
else
apc_activity = SCIC_SDS_APC_SKIP_PHY;
@@ -540,20 +515,20 @@ static void scic_sds_apc_agent_configure_ports(
*
* Note the break when we reach the condition of the port id == phy id */
for (
port_index = port_agent->phy_valid_port_range[phy->phy_index].min_index;
port_index <= port_agent->phy_valid_port_range[phy->phy_index].max_index;
port_index = port_agent->phy_valid_port_range[iphy->phy_index].min_index;
port_index <= port_agent->phy_valid_port_range[iphy->phy_index].max_index;
port_index++
) {
port = &ihost->ports[port_index].sci;
/* First we must make sure that this PHY can be added to this Port. */
if (scic_sds_port_is_valid_phy_assignment(port, phy->phy_index)) {
if (scic_sds_port_is_valid_phy_assignment(port, iphy->phy_index)) {
/*
* Port contains a PHY with a greater PHY ID than the current
* PHY that has gone link up. This phy can not be part of any
* port so skip it and move on. */
if (port->active_phy_mask > (1 << phy->phy_index)) {
if (port->active_phy_mask > (1 << iphy->phy_index)) {
apc_activity = SCIC_SDS_APC_SKIP_PHY;
break;
}
@@ -562,7 +537,7 @@ static void scic_sds_apc_agent_configure_ports(
* We have reached the end of our Port list and have not found
* any reason why we should not either add the PHY to the port
* or wait for more phys to become active. */
if (port->physical_port_index == phy->phy_index) {
if (port->physical_port_index == iphy->phy_index) {
/*
* The Port either has no active PHYs.
* Consider that if the port had any active PHYs we would have
@@ -608,10 +583,10 @@ static void scic_sds_apc_agent_configure_ports(
switch (apc_activity) {
case SCIC_SDS_APC_ADD_PHY:
status = scic_sds_port_add_phy(port, phy);
status = scic_sds_port_add_phy(port, iphy);
if (status == SCI_SUCCESS) {
port_agent->phy_configured_mask |= (1 << phy->phy_index);
port_agent->phy_configured_mask |= (1 << iphy->phy_index);
}
break;
@@ -651,14 +626,14 @@ static void scic_sds_apc_agent_configure_ports(
static void scic_sds_apc_agent_link_up(struct scic_sds_controller *scic,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_port *sci_port,
struct scic_sds_phy *sci_phy)
struct isci_phy *iphy)
{
u8 phy_index = sci_phy->phy_index;
u8 phy_index = iphy->phy_index;
if (!sci_port) {
/* the phy is not the part of this port */
port_agent->phy_ready_mask |= 1 << phy_index;
scic_sds_apc_agent_configure_ports(scic, port_agent, sci_phy, true);
scic_sds_apc_agent_configure_ports(scic, port_agent, iphy, true);
} else {
/* the phy is already the part of the port */
u32 port_state = sci_port->sm.current_state_id;
@@ -669,7 +644,7 @@ static void scic_sds_apc_agent_link_up(struct scic_sds_controller *scic,
*/
BUG_ON(port_state != SCI_PORT_RESETTING);
port_agent->phy_ready_mask |= 1 << phy_index;
scic_sds_port_link_up(sci_port, sci_phy);
scic_sds_port_link_up(sci_port, iphy);
}
}
@@ -690,18 +665,18 @@ static void scic_sds_apc_agent_link_down(
struct scic_sds_controller *controller,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_port *port,
struct scic_sds_phy *phy)
struct isci_phy *iphy)
{
port_agent->phy_ready_mask &= ~(1 << scic_sds_phy_get_index(phy));
port_agent->phy_ready_mask &= ~(1 << scic_sds_phy_get_index(iphy));
if (port != NULL) {
if (port_agent->phy_configured_mask & (1 << phy->phy_index)) {
if (port_agent->phy_configured_mask & (1 << iphy->phy_index)) {
enum sci_status status;
status = scic_sds_port_remove_phy(port, phy);
status = scic_sds_port_remove_phy(port, iphy);
if (status == SCI_SUCCESS) {
port_agent->phy_configured_mask &= ~(1 << phy->phy_index);
port_agent->phy_configured_mask &= ~(1 << iphy->phy_index);
}
}
}
@@ -739,7 +714,7 @@ static void apc_agent_timeout(unsigned long data)
continue;
scic_sds_apc_agent_configure_ports(scic, port_agent,
&ihost->phys[index].sci, false);
&ihost->phys[index], false);
}
done: