Commit ac0eeb4f authored by Edmund Nadolski's avatar Edmund Nadolski Committed by Dan Williams

isci: convert port config agent timer to sci_timer

Signed-off-by: default avatarEdmund Nadolski <edmund.nadolski@intel.com>
[squashed collateral cleanups]
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 5553ba2b
...@@ -1366,6 +1366,8 @@ void isci_host_deinit(struct isci_host *ihost) ...@@ -1366,6 +1366,8 @@ void isci_host_deinit(struct isci_host *ihost)
del_timer_sync(&sci_port->timer.timer); del_timer_sync(&sci_port->timer.timer);
} }
del_timer_sync(&ihost->sci.port_agent.timer.timer);
isci_timer_list_destroy(ihost); isci_timer_list_destroy(ihost);
} }
......
...@@ -122,7 +122,7 @@ struct scic_sds_port_configuration_agent { ...@@ -122,7 +122,7 @@ struct scic_sds_port_configuration_agent {
bool timer_pending; bool timer_pending;
port_config_fn link_up_handler; port_config_fn link_up_handler;
port_config_fn link_down_handler; port_config_fn link_down_handler;
void *timer; struct sci_timer timer;
}; };
/** /**
...@@ -568,15 +568,6 @@ static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic) ...@@ -568,15 +568,6 @@ static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic)
} \ } \
} }
/**
* scic_sds_controller_get_port_configuration_agent() -
*
* This is a helper macro to get the port configuration agent from the
* controller object.
*/
#define scic_sds_controller_get_port_configuration_agent(controller) \
(&(controller)->port_agent)
/** /**
* scic_sds_controller_get_protocol_engine_group() - * scic_sds_controller_get_protocol_engine_group() -
* *
......
...@@ -328,21 +328,25 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration( ...@@ -328,21 +328,25 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration(
return scic_sds_port_configuration_agent_validate_ports(controller, port_agent); return scic_sds_port_configuration_agent_validate_ports(controller, port_agent);
} }
/** static void mpc_agent_timeout(unsigned long data)
*
*
* This timer routine is used to allow the SCI User to rediscover or change
* device objects before a new series of link up notifications because a link
* down has allowed a better port configuration.
*/
static void scic_sds_mpc_agent_timeout_handler(void *object)
{ {
u8 index; u8 index;
struct scic_sds_controller *scic = object; struct sci_timer *tmr = (struct sci_timer *)data;
struct isci_host *ihost = scic_to_ihost(scic); struct scic_sds_port_configuration_agent *port_agent;
struct scic_sds_port_configuration_agent *port_agent = &scic->port_agent; struct scic_sds_controller *scic;
struct isci_host *ihost;
unsigned long flags;
u16 configure_phy_mask; u16 configure_phy_mask;
port_agent = container_of(tmr, typeof(*port_agent), timer);
scic = container_of(port_agent, typeof(*scic), port_agent);
ihost = scic_to_ihost(scic);
spin_lock_irqsave(&ihost->scic_lock, flags);
if (tmr->cancel)
goto done;
port_agent->timer_pending = false; port_agent->timer_pending = false;
/* Find the mask of phys that are reported read but as yet unconfigured into a port */ /* Find the mask of phys that are reported read but as yet unconfigured into a port */
...@@ -357,6 +361,9 @@ static void scic_sds_mpc_agent_timeout_handler(void *object) ...@@ -357,6 +361,9 @@ static void scic_sds_mpc_agent_timeout_handler(void *object)
sci_phy); sci_phy);
} }
} }
done:
spin_unlock_irqrestore(&ihost->scic_lock, flags);
} }
/** /**
...@@ -441,7 +448,7 @@ static void scic_sds_mpc_agent_link_down( ...@@ -441,7 +448,7 @@ static void scic_sds_mpc_agent_link_down(
!port_agent->timer_pending) { !port_agent->timer_pending) {
port_agent->timer_pending = true; port_agent->timer_pending = true;
isci_timer_start(port_agent->timer, sci_mod_timer(&port_agent->timer,
SCIC_SDS_MPC_RECONFIGURATION_TIMEOUT); SCIC_SDS_MPC_RECONFIGURATION_TIMEOUT);
} }
...@@ -498,31 +505,6 @@ static enum sci_status scic_sds_apc_agent_validate_phy_configuration( ...@@ -498,31 +505,6 @@ static enum sci_status scic_sds_apc_agent_validate_phy_configuration(
return scic_sds_port_configuration_agent_validate_ports(controller, port_agent); return scic_sds_port_configuration_agent_validate_ports(controller, port_agent);
} }
/**
*
* @controller: This is the controller that to which the port agent is assigned.
* @port_agent: This is the port agent that is requesting the timer start
* operation.
* @phy: This is the phy that has caused the timer operation to be scheduled.
*
* This routine will restart the automatic port configuration timeout timer for
* the next time period. This could be caused by either a link down event or a
* link up event where we can not yet tell to which port a phy belongs.
*/
static inline void scic_sds_apc_agent_start_timer(
struct scic_sds_controller *scic,
struct scic_sds_port_configuration_agent *port_agent,
struct scic_sds_phy *sci_phy,
u32 timeout)
{
if (port_agent->timer_pending)
isci_timer_stop(port_agent->timer);
port_agent->timer_pending = true;
isci_timer_start(port_agent->timer, timeout);
}
/** /**
* *
* @controller: This is the controller object that receives the link up * @controller: This is the controller object that receives the link up
...@@ -635,9 +617,17 @@ static void scic_sds_apc_agent_configure_ports( ...@@ -635,9 +617,17 @@ static void scic_sds_apc_agent_configure_ports(
break; break;
case SCIC_SDS_APC_START_TIMER: case SCIC_SDS_APC_START_TIMER:
scic_sds_apc_agent_start_timer( /*
controller, port_agent, phy, SCIC_SDS_APC_WAIT_LINK_UP_NOTIFICATION * This can occur for either a link down event, or a link
); * up event where we cannot yet tell the port to which a
* phy belongs.
*/
if (port_agent->timer_pending)
sci_del_timer(&port_agent->timer);
port_agent->timer_pending = true;
sci_mod_timer(&port_agent->timer,
SCIC_SDS_APC_WAIT_LINK_UP_NOTIFICATION);
break; break;
case SCIC_SDS_APC_SKIP_PHY: case SCIC_SDS_APC_SKIP_PHY:
...@@ -719,15 +709,24 @@ static void scic_sds_apc_agent_link_down( ...@@ -719,15 +709,24 @@ static void scic_sds_apc_agent_link_down(
} }
/* configure the phys into ports when the timer fires */ /* configure the phys into ports when the timer fires */
static void scic_sds_apc_agent_timeout_handler(void *object) static void apc_agent_timeout(unsigned long data)
{ {
u32 index; u32 index;
struct sci_timer *tmr = (struct sci_timer *)data;
struct scic_sds_port_configuration_agent *port_agent; struct scic_sds_port_configuration_agent *port_agent;
struct scic_sds_controller *scic = object; struct scic_sds_controller *scic;
struct isci_host *ihost = scic_to_ihost(scic); struct isci_host *ihost;
unsigned long flags;
u16 configure_phy_mask; u16 configure_phy_mask;
port_agent = scic_sds_controller_get_port_configuration_agent(scic); port_agent = container_of(tmr, typeof(*port_agent), timer);
scic = container_of(port_agent, typeof(*scic), port_agent);
ihost = scic_to_ihost(scic);
spin_lock_irqsave(&ihost->scic_lock, flags);
if (tmr->cancel)
goto done;
port_agent->timer_pending = false; port_agent->timer_pending = false;
...@@ -743,6 +742,9 @@ static void scic_sds_apc_agent_timeout_handler(void *object) ...@@ -743,6 +742,9 @@ static void scic_sds_apc_agent_timeout_handler(void *object)
scic_sds_apc_agent_configure_ports(scic, port_agent, scic_sds_apc_agent_configure_ports(scic, port_agent,
&ihost->phys[index].sci, false); &ihost->phys[index].sci, false);
} }
done:
spin_unlock_irqrestore(&ihost->scic_lock, flags);
} }
/* /*
...@@ -769,7 +771,6 @@ void scic_sds_port_configuration_agent_construct( ...@@ -769,7 +771,6 @@ void scic_sds_port_configuration_agent_construct(
port_agent->link_down_handler = NULL; port_agent->link_down_handler = NULL;
port_agent->timer_pending = false; port_agent->timer_pending = false;
port_agent->timer = NULL;
for (index = 0; index < SCI_MAX_PORTS; index++) { for (index = 0; index < SCI_MAX_PORTS; index++) {
port_agent->phy_valid_port_range[index].min_index = 0; port_agent->phy_valid_port_range[index].min_index = 0;
...@@ -781,9 +782,8 @@ enum sci_status scic_sds_port_configuration_agent_initialize( ...@@ -781,9 +782,8 @@ enum sci_status scic_sds_port_configuration_agent_initialize(
struct scic_sds_controller *scic, struct scic_sds_controller *scic,
struct scic_sds_port_configuration_agent *port_agent) struct scic_sds_port_configuration_agent *port_agent)
{ {
enum sci_status status = SCI_SUCCESS; enum sci_status status;
enum scic_port_configuration_mode mode; enum scic_port_configuration_mode mode;
struct isci_host *ihost = scic_to_ihost(scic);
mode = scic->oem_parameters.sds1.controller.mode_type; mode = scic->oem_parameters.sds1.controller.mode_type;
...@@ -794,10 +794,7 @@ enum sci_status scic_sds_port_configuration_agent_initialize( ...@@ -794,10 +794,7 @@ enum sci_status scic_sds_port_configuration_agent_initialize(
port_agent->link_up_handler = scic_sds_mpc_agent_link_up; port_agent->link_up_handler = scic_sds_mpc_agent_link_up;
port_agent->link_down_handler = scic_sds_mpc_agent_link_down; port_agent->link_down_handler = scic_sds_mpc_agent_link_down;
port_agent->timer = isci_timer_create( sci_init_timer(&port_agent->timer, mpc_agent_timeout);
ihost,
scic,
scic_sds_mpc_agent_timeout_handler);
} else { } else {
status = scic_sds_apc_agent_validate_phy_configuration( status = scic_sds_apc_agent_validate_phy_configuration(
scic, port_agent); scic, port_agent);
...@@ -805,21 +802,7 @@ enum sci_status scic_sds_port_configuration_agent_initialize( ...@@ -805,21 +802,7 @@ enum sci_status scic_sds_port_configuration_agent_initialize(
port_agent->link_up_handler = scic_sds_apc_agent_link_up; port_agent->link_up_handler = scic_sds_apc_agent_link_up;
port_agent->link_down_handler = scic_sds_apc_agent_link_down; port_agent->link_down_handler = scic_sds_apc_agent_link_down;
port_agent->timer = isci_timer_create( sci_init_timer(&port_agent->timer, apc_agent_timeout);
ihost,
scic,
scic_sds_apc_agent_timeout_handler);
}
/* Make sure we have actually gotten a timer */
if ((status == SCI_SUCCESS) && (port_agent->timer == NULL)) {
dev_err(scic_to_dev(scic),
"%s: Controller 0x%p automatic port configuration "
"agent could not get timer.\n",
__func__,
scic);
status = SCI_FAILURE;
} }
return status; return status;
......
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