aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdmund Nadolski <edmund.nadolski@intel.com>2011-05-19 07:59:56 -0400
committerDan Williams <dan.j.williams@intel.com>2011-07-03 07:04:49 -0400
commit6cb5853d3e252015eaf72d3761491e3da959556d (patch)
treee62addf161577f80ed350ef5478a2f9d558a2a48
parent0473661a125905240879456567e117ed8a58cf5d (diff)
isci: convert scic_timeout_timer to sci_timer
Signed-off-by: Edmund Nadolski <edmund.nadolski@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--drivers/scsi/isci/host.c59
-rw-r--r--drivers/scsi/isci/host.h5
2 files changed, 36 insertions, 28 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c
index 7b497f2667b7..156b37563761 100644
--- a/drivers/scsi/isci/host.c
+++ b/drivers/scsi/isci/host.c
@@ -1115,7 +1115,7 @@ static enum sci_status scic_controller_start(struct scic_sds_controller *scic,
1115 1115
1116 scic_sds_controller_start_next_phy(scic); 1116 scic_sds_controller_start_next_phy(scic);
1117 1117
1118 isci_timer_start(scic->timeout_timer, timeout); 1118 sci_mod_timer(&scic->timer, timeout);
1119 1119
1120 sci_base_state_machine_change_state(&scic->state_machine, 1120 sci_base_state_machine_change_state(&scic->state_machine,
1121 SCI_BASE_CONTROLLER_STATE_STARTING); 1121 SCI_BASE_CONTROLLER_STATE_STARTING);
@@ -1296,7 +1296,7 @@ static enum sci_status scic_controller_stop(struct scic_sds_controller *scic,
1296 return SCI_FAILURE_INVALID_STATE; 1296 return SCI_FAILURE_INVALID_STATE;
1297 } 1297 }
1298 1298
1299 isci_timer_start(scic->timeout_timer, timeout); 1299 sci_mod_timer(&scic->timer, timeout);
1300 sci_base_state_machine_change_state(&scic->state_machine, 1300 sci_base_state_machine_change_state(&scic->state_machine,
1301 SCI_BASE_CONTROLLER_STATE_STOPPING); 1301 SCI_BASE_CONTROLLER_STATE_STOPPING);
1302 return SCI_SUCCESS; 1302 return SCI_SUCCESS;
@@ -1376,6 +1376,8 @@ void isci_host_deinit(struct isci_host *ihost)
1376 1376
1377 del_timer_sync(&ihost->sci.power_control.timer.timer); 1377 del_timer_sync(&ihost->sci.power_control.timer.timer);
1378 1378
1379 del_timer_sync(&ihost->sci.timer.timer);
1380
1379 isci_timer_list_destroy(ihost); 1381 isci_timer_list_destroy(ihost);
1380} 1382}
1381 1383
@@ -1433,7 +1435,7 @@ static inline void scic_sds_controller_starting_state_exit(struct sci_base_state
1433{ 1435{
1434 struct scic_sds_controller *scic = container_of(sm, typeof(*scic), state_machine); 1436 struct scic_sds_controller *scic = container_of(sm, typeof(*scic), state_machine);
1435 1437
1436 isci_timer_stop(scic->timeout_timer); 1438 sci_del_timer(&scic->timer);
1437} 1439}
1438 1440
1439#define INTERRUPT_COALESCE_TIMEOUT_BASE_RANGE_LOWER_BOUND_NS 853 1441#define INTERRUPT_COALESCE_TIMEOUT_BASE_RANGE_LOWER_BOUND_NS 853
@@ -1669,7 +1671,7 @@ static void scic_sds_controller_stopping_state_exit(struct sci_base_state_machin
1669{ 1671{
1670 struct scic_sds_controller *scic = container_of(sm, typeof(*scic), state_machine); 1672 struct scic_sds_controller *scic = container_of(sm, typeof(*scic), state_machine);
1671 1673
1672 isci_timer_stop(scic->timeout_timer); 1674 sci_del_timer(&scic->timer);
1673} 1675}
1674 1676
1675 1677
@@ -1776,7 +1778,33 @@ static void scic_sds_controller_set_default_config_parameters(struct scic_sds_co
1776 scic->user_parameters.sds1.no_outbound_task_timeout = 20; 1778 scic->user_parameters.sds1.no_outbound_task_timeout = 20;
1777} 1779}
1778 1780
1781static void controller_timeout(unsigned long data)
1782{
1783 struct sci_timer *tmr = (struct sci_timer *)data;
1784 struct scic_sds_controller *scic = container_of(tmr, typeof(*scic), timer);
1785 struct isci_host *ihost = scic_to_ihost(scic);
1786 struct sci_base_state_machine *sm = &scic->state_machine;
1787 unsigned long flags;
1788
1789 spin_lock_irqsave(&ihost->scic_lock, flags);
1790
1791 if (tmr->cancel)
1792 goto done;
1793
1794 if (sm->current_state_id == SCI_BASE_CONTROLLER_STATE_STARTING)
1795 scic_sds_controller_transition_to_ready(scic, SCI_FAILURE_TIMEOUT);
1796 else if (sm->current_state_id == SCI_BASE_CONTROLLER_STATE_STOPPING) {
1797 sci_base_state_machine_change_state(sm, SCI_BASE_CONTROLLER_STATE_FAILED);
1798 isci_host_stop_complete(ihost, SCI_FAILURE_TIMEOUT);
1799 } else /* / @todo Now what do we want to do in this case? */
1800 dev_err(scic_to_dev(scic),
1801 "%s: Controller timer fired when controller was not "
1802 "in a state being timed.\n",
1803 __func__);
1779 1804
1805done:
1806 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1807}
1780 1808
1781/** 1809/**
1782 * scic_controller_construct() - This method will attempt to construct a 1810 * scic_controller_construct() - This method will attempt to construct a
@@ -1826,6 +1854,8 @@ static enum sci_status scic_controller_construct(struct scic_sds_controller *sci
1826 1854
1827 scic->invalid_phy_mask = 0; 1855 scic->invalid_phy_mask = 0;
1828 1856
1857 sci_init_timer(&scic->timer, controller_timeout);
1858
1829 /* Set the default maximum values */ 1859 /* Set the default maximum values */
1830 scic->completion_event_entries = SCU_EVENT_COUNT; 1860 scic->completion_event_entries = SCU_EVENT_COUNT;
1831 scic->completion_queue_entries = SCU_COMPLETION_QUEUE_COUNT; 1861 scic->completion_queue_entries = SCU_COMPLETION_QUEUE_COUNT;
@@ -1901,24 +1931,6 @@ void scic_oem_parameters_get(
1901 memcpy(scic_parms, (&scic->oem_parameters), sizeof(*scic_parms)); 1931 memcpy(scic_parms, (&scic->oem_parameters), sizeof(*scic_parms));
1902} 1932}
1903 1933
1904static void scic_sds_controller_timeout_handler(void *_scic)
1905{
1906 struct scic_sds_controller *scic = _scic;
1907 struct isci_host *ihost = scic_to_ihost(scic);
1908 struct sci_base_state_machine *sm = &scic->state_machine;
1909
1910 if (sm->current_state_id == SCI_BASE_CONTROLLER_STATE_STARTING)
1911 scic_sds_controller_transition_to_ready(scic, SCI_FAILURE_TIMEOUT);
1912 else if (sm->current_state_id == SCI_BASE_CONTROLLER_STATE_STOPPING) {
1913 sci_base_state_machine_change_state(sm, SCI_BASE_CONTROLLER_STATE_FAILED);
1914 isci_host_stop_complete(ihost, SCI_FAILURE_TIMEOUT);
1915 } else /* / @todo Now what do we want to do in this case? */
1916 dev_err(scic_to_dev(scic),
1917 "%s: Controller timer fired when controller was not "
1918 "in a state being timed.\n",
1919 __func__);
1920}
1921
1922static enum sci_status scic_sds_controller_initialize_phy_startup(struct scic_sds_controller *scic) 1934static enum sci_status scic_sds_controller_initialize_phy_startup(struct scic_sds_controller *scic)
1923{ 1935{
1924 struct isci_host *ihost = scic_to_ihost(scic); 1936 struct isci_host *ihost = scic_to_ihost(scic);
@@ -2246,9 +2258,6 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc
2246 2258
2247 sci_base_state_machine_change_state(sm, SCI_BASE_CONTROLLER_STATE_INITIALIZING); 2259 sci_base_state_machine_change_state(sm, SCI_BASE_CONTROLLER_STATE_INITIALIZING);
2248 2260
2249 scic->timeout_timer = isci_timer_create(ihost, scic,
2250 scic_sds_controller_timeout_handler);
2251
2252 scic_sds_controller_initialize_phy_startup(scic); 2261 scic_sds_controller_initialize_phy_startup(scic);
2253 2262
2254 scic_sds_controller_initialize_power_control(scic); 2263 scic_sds_controller_initialize_power_control(scic);
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h
index 2be935fa6af2..80808661ce5c 100644
--- a/drivers/scsi/isci/host.h
+++ b/drivers/scsi/isci/host.h
@@ -137,10 +137,9 @@ struct scic_sds_controller {
137 struct sci_base_state_machine state_machine; 137 struct sci_base_state_machine state_machine;
138 138
139 /** 139 /**
140 * This field is the driver timer object handler used to time the controller 140 * Timer for controller start/stop operations.
141 * object start and stop requests.
142 */ 141 */
143 void *timeout_timer; 142 struct sci_timer timer;
144 143
145 /** 144 /**
146 * This field contains the user parameters to be utilized for this 145 * This field contains the user parameters to be utilized for this