aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/host.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-03-02 14:49:26 -0500
committerDan Williams <dan.j.williams@intel.com>2011-07-03 06:55:28 -0400
commit7c40a8035815479c7c12ab0cdcea71e0f4c3a9c8 (patch)
tree43290f7b96374f0ff8e80ad5e8620f3dc8242f1a /drivers/scsi/isci/host.c
parent150fc6fc725055b400a8865e6785dc8dd0a2225d (diff)
isci: rework timer api
Prepare the timer api for the arrival of dynamic creation and destruction events from the core. It pretended to do this previously but the core to date only used it in a static init-time only fashion. This is an interim fix until a cleaner event queue can be developed. 1/ make all locking external to the api (add WARN_ONCE to verify) 2/ add a timer_destroy interface (to be used by the core) 3/ use del_timer_sync() prior to deallocating timer data 4/ delete the "timer_list" indirection, we only have timers allocated for the isci_host 5/ fix detection of timer list allocation errors Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci/host.c')
-rw-r--r--drivers/scsi/isci/host.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c
index d8d6f67bd69c..1bc91f2b4f93 100644
--- a/drivers/scsi/isci/host.c
+++ b/drivers/scsi/isci/host.c
@@ -349,9 +349,14 @@ void isci_host_deinit(struct isci_host *ihost)
349 } 349 }
350 350
351 set_bit(IHOST_STOP_PENDING, &ihost->flags); 351 set_bit(IHOST_STOP_PENDING, &ihost->flags);
352
353 spin_lock_irq(&ihost->scic_lock);
352 scic_controller_stop(scic, SCIC_CONTROLLER_STOP_TIMEOUT); 354 scic_controller_stop(scic, SCIC_CONTROLLER_STOP_TIMEOUT);
355 spin_unlock_irq(&ihost->scic_lock);
356
353 wait_for_stop(ihost); 357 wait_for_stop(ihost);
354 scic_controller_reset(scic); 358 scic_controller_reset(scic);
359 isci_timer_list_destroy(ihost);
355} 360}
356 361
357static void __iomem *scu_base(struct isci_host *isci_host) 362static void __iomem *scu_base(struct isci_host *isci_host)
@@ -370,8 +375,6 @@ static void __iomem *smu_base(struct isci_host *isci_host)
370 return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id; 375 return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id;
371} 376}
372 377
373#define SCI_MAX_TIMER_COUNT 25
374
375int isci_host_init(struct isci_host *isci_host) 378int isci_host_init(struct isci_host *isci_host)
376{ 379{
377 int err = 0; 380 int err = 0;
@@ -382,11 +385,7 @@ int isci_host_init(struct isci_host *isci_host)
382 union scic_oem_parameters scic_oem_params; 385 union scic_oem_parameters scic_oem_params;
383 union scic_user_parameters scic_user_params; 386 union scic_user_parameters scic_user_params;
384 387
385 INIT_LIST_HEAD(&isci_host->timer_list_struct.timers); 388 isci_timer_list_construct(isci_host);
386 isci_timer_list_construct(
387 &isci_host->timer_list_struct,
388 SCI_MAX_TIMER_COUNT
389 );
390 389
391 controller = scic_controller_alloc(&isci_host->pdev->dev); 390 controller = scic_controller_alloc(&isci_host->pdev->dev);
392 391
@@ -473,7 +472,17 @@ int isci_host_init(struct isci_host *isci_host)
473 } 472 }
474 } 473 }
475 474
475 tasklet_init(&isci_host->completion_tasklet,
476 isci_host_completion_routine, (unsigned long)isci_host);
477
478 INIT_LIST_HEAD(&(isci_host->mdl_struct_list));
479
480 INIT_LIST_HEAD(&isci_host->requests_to_complete);
481 INIT_LIST_HEAD(&isci_host->requests_to_abort);
482
483 spin_lock_irq(&isci_host->scic_lock);
476 status = scic_controller_initialize(isci_host->core_controller); 484 status = scic_controller_initialize(isci_host->core_controller);
485 spin_unlock_irq(&isci_host->scic_lock);
477 if (status != SCI_SUCCESS) { 486 if (status != SCI_SUCCESS) {
478 dev_warn(&isci_host->pdev->dev, 487 dev_warn(&isci_host->pdev->dev,
479 "%s: scic_controller_initialize failed -" 488 "%s: scic_controller_initialize failed -"
@@ -482,17 +491,8 @@ int isci_host_init(struct isci_host *isci_host)
482 return -ENODEV; 491 return -ENODEV;
483 } 492 }
484 493
485 tasklet_init(&isci_host->completion_tasklet,
486 isci_host_completion_routine, (unsigned long)isci_host);
487
488 INIT_LIST_HEAD(&(isci_host->mdl_struct_list));
489
490 INIT_LIST_HEAD(&isci_host->requests_to_complete);
491 INIT_LIST_HEAD(&isci_host->requests_to_abort);
492
493 /* populate mdl with dma memory. scu_mdl_allocate_coherent() */ 494 /* populate mdl with dma memory. scu_mdl_allocate_coherent() */
494 err = isci_host_mdl_allocate_coherent(isci_host); 495 err = isci_host_mdl_allocate_coherent(isci_host);
495
496 if (err) 496 if (err)
497 return err; 497 return err;
498 498