diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/isci/host.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index dbdc3bab9ca3..7f351a35e87b 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) | |||
113 | { | 113 | { |
114 | struct isci_host *ihost = isci_host_from_sas_ha(SHOST_TO_SAS_HA(shost)); | 114 | struct isci_host *ihost = isci_host_from_sas_ha(SHOST_TO_SAS_HA(shost)); |
115 | 115 | ||
116 | /** | 116 | if (test_bit(IHOST_START_PENDING, &ihost->flags)) |
117 | * check interrupt_handler's status and call completion_handler if true, | ||
118 | * link_up events should be coming from the scu core lib, as phy's come | ||
119 | * online. for each link_up from the core, call | ||
120 | * get_received_identify_address_frame, copy the frame into the | ||
121 | * sas_phy object and call libsas notify_port_event(PORTE_BYTES_DMAED). | ||
122 | * continue to return zero from thee scan_finished routine until | ||
123 | * the scic_cb_controller_start_complete() call comes from the core. | ||
124 | **/ | ||
125 | if (scic_sds_controller_isr(ihost->core_controller)) | ||
126 | scic_sds_controller_completion_handler(ihost->core_controller); | ||
127 | |||
128 | if (test_bit(IHOST_START_PENDING, &ihost->flags) && time < HZ*10) { | ||
129 | dev_dbg(&ihost->pdev->dev, | ||
130 | "%s: ihost->status = %d, time = %ld\n", | ||
131 | __func__, isci_host_get_state(ihost), time); | ||
132 | return 0; | 117 | return 0; |
133 | } | ||
134 | 118 | ||
119 | /* todo: use sas_flush_discovery once it is upstream */ | ||
120 | scsi_flush_work(shost); | ||
121 | |||
122 | scsi_flush_work(shost); | ||
135 | 123 | ||
136 | dev_dbg(&ihost->pdev->dev, | 124 | dev_dbg(&ihost->pdev->dev, |
137 | "%s: ihost->status = %d, time = %ld\n", | 125 | "%s: ihost->status = %d, time = %ld\n", |
138 | __func__, isci_host_get_state(ihost), time); | 126 | __func__, isci_host_get_state(ihost), time); |
139 | 127 | ||
140 | scic_controller_enable_interrupts(ihost->core_controller); | ||
141 | |||
142 | return 1; | 128 | return 1; |
143 | 129 | ||
144 | } | 130 | } |
@@ -150,8 +136,11 @@ void isci_host_scan_start(struct Scsi_Host *shost) | |||
150 | unsigned long tmo = scic_controller_get_suggested_start_timeout(scic); | 136 | unsigned long tmo = scic_controller_get_suggested_start_timeout(scic); |
151 | 137 | ||
152 | set_bit(IHOST_START_PENDING, &ihost->flags); | 138 | set_bit(IHOST_START_PENDING, &ihost->flags); |
153 | scic_controller_disable_interrupts(ihost->core_controller); | 139 | |
140 | spin_lock_irq(&ihost->scic_lock); | ||
154 | scic_controller_start(scic, tmo); | 141 | scic_controller_start(scic, tmo); |
142 | scic_controller_enable_interrupts(scic); | ||
143 | spin_unlock_irq(&ihost->scic_lock); | ||
155 | } | 144 | } |
156 | 145 | ||
157 | void isci_host_stop_complete(struct isci_host *ihost, enum sci_status completion_status) | 146 | void isci_host_stop_complete(struct isci_host *ihost, enum sci_status completion_status) |