summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci
diff options
context:
space:
mode:
authorEdmund Nadolski <edmund.nadolski@intel.com>2011-02-18 09:25:09 -0800
committerDan Williams <dan.j.williams@intel.com>2011-07-03 03:55:27 -0700
commit77950f51f5299c1b4f4fa4a19974128da720d199 (patch)
tree4616a16bf4d2fe05826800274941af4c3c8df242 /drivers/scsi/isci
parent0cf89d1d27c1bdd0abf1714096f98ea44704dcff (diff)
isci: enable interrupts during controller start, and flush discovery
Polling the event queue during scan is an unneeded holdover from the original driver. Signed-off-by: Edmund Nadolski <edmund.nadolski@intel.com> [djbw: ensure we flush all port events and domain discovery] Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci')
-rw-r--r--drivers/scsi/isci/host.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c
index dbdc3bab9ca..7f351a35e87 100644
--- a/drivers/scsi/isci/host.c
+++ b/drivers/scsi/isci/host.c
@@ -113,32 +113,18 @@ int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time)
{
struct isci_host *ihost = isci_host_from_sas_ha(SHOST_TO_SAS_HA(shost));
- /**
- * check interrupt_handler's status and call completion_handler if true,
- * link_up events should be coming from the scu core lib, as phy's come
- * online. for each link_up from the core, call
- * get_received_identify_address_frame, copy the frame into the
- * sas_phy object and call libsas notify_port_event(PORTE_BYTES_DMAED).
- * continue to return zero from thee scan_finished routine until
- * the scic_cb_controller_start_complete() call comes from the core.
- **/
- if (scic_sds_controller_isr(ihost->core_controller))
- scic_sds_controller_completion_handler(ihost->core_controller);
-
- if (test_bit(IHOST_START_PENDING, &ihost->flags) && time < HZ*10) {
- dev_dbg(&ihost->pdev->dev,
- "%s: ihost->status = %d, time = %ld\n",
- __func__, isci_host_get_state(ihost), time);
+ if (test_bit(IHOST_START_PENDING, &ihost->flags))
return 0;
- }
+ /* todo: use sas_flush_discovery once it is upstream */
+ scsi_flush_work(shost);
+
+ scsi_flush_work(shost);
dev_dbg(&ihost->pdev->dev,
"%s: ihost->status = %d, time = %ld\n",
__func__, isci_host_get_state(ihost), time);
- scic_controller_enable_interrupts(ihost->core_controller);
-
return 1;
}
@@ -150,8 +136,11 @@ void isci_host_scan_start(struct Scsi_Host *shost)
unsigned long tmo = scic_controller_get_suggested_start_timeout(scic);
set_bit(IHOST_START_PENDING, &ihost->flags);
- scic_controller_disable_interrupts(ihost->core_controller);
+
+ spin_lock_irq(&ihost->scic_lock);
scic_controller_start(scic, tmo);
+ scic_controller_enable_interrupts(scic);
+ spin_unlock_irq(&ihost->scic_lock);
}
void isci_host_stop_complete(struct isci_host *ihost, enum sci_status completion_status)