diff options
-rw-r--r-- | drivers/scsi/isci/remote_device.c | 58 | ||||
-rw-r--r-- | drivers/scsi/isci/remote_node_context.c | 8 |
2 files changed, 55 insertions, 11 deletions
diff --git a/drivers/scsi/isci/remote_device.c b/drivers/scsi/isci/remote_device.c index 37e9bdead6f6..be9f0e0be4ff 100644 --- a/drivers/scsi/isci/remote_device.c +++ b/drivers/scsi/isci/remote_device.c | |||
@@ -207,23 +207,67 @@ enum sci_status isci_remote_device_terminate_requests( | |||
207 | "about to wait\n", | 207 | "about to wait\n", |
208 | __func__, idev, ireq, idev->started_request_count, | 208 | __func__, idev, ireq, idev->started_request_count, |
209 | rnc_suspend_count, idev->rnc.suspend_count); | 209 | rnc_suspend_count, idev->rnc.suspend_count); |
210 | |||
211 | #define MAX_SUSPEND_MSECS 10000 | ||
210 | if (ireq) { | 212 | if (ireq) { |
211 | /* Terminate a specific TC. */ | 213 | /* Terminate a specific TC. */ |
212 | set_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); | 214 | set_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); |
213 | sci_remote_device_terminate_req(ihost, idev, 0, ireq); | 215 | sci_remote_device_terminate_req(ihost, idev, 0, ireq); |
214 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 216 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
215 | wait_event(ihost->eventq, | 217 | if (!wait_event_timeout(ihost->eventq, |
216 | isci_check_reqterm(ihost, idev, ireq, | 218 | isci_check_reqterm(ihost, idev, ireq, |
217 | rnc_suspend_count)); | 219 | rnc_suspend_count), |
220 | msecs_to_jiffies(MAX_SUSPEND_MSECS))) { | ||
221 | |||
222 | dev_warn(&ihost->pdev->dev, "%s host%d timeout single\n", | ||
223 | __func__, ihost->id); | ||
224 | dev_dbg(&ihost->pdev->dev, | ||
225 | "%s: ******* Timeout waiting for " | ||
226 | "suspend; idev=%p, current state %s; " | ||
227 | "started_request_count=%d, flags=%lx\n\t" | ||
228 | "rnc_suspend_count=%d, rnc.suspend_count=%d " | ||
229 | "RNC: current state %s, current " | ||
230 | "suspend_type %x dest state %d;\n" | ||
231 | "ireq=%p, ireq->flags = %lx\n", | ||
232 | __func__, idev, | ||
233 | dev_state_name(idev->sm.current_state_id), | ||
234 | idev->started_request_count, idev->flags, | ||
235 | rnc_suspend_count, idev->rnc.suspend_count, | ||
236 | rnc_state_name(idev->rnc.sm.current_state_id), | ||
237 | idev->rnc.suspend_type, | ||
238 | idev->rnc.destination_state, | ||
239 | ireq, ireq->flags); | ||
240 | } | ||
218 | clear_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); | 241 | clear_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); |
219 | isci_free_tag(ihost, ireq->io_tag); | 242 | isci_free_tag(ihost, ireq->io_tag); |
220 | } else { | 243 | } else { |
221 | /* Terminate all TCs. */ | 244 | /* Terminate all TCs. */ |
222 | sci_remote_device_terminate_requests(idev); | 245 | sci_remote_device_terminate_requests(idev); |
223 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 246 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
224 | wait_event(ihost->eventq, | 247 | if (!wait_event_timeout(ihost->eventq, |
225 | isci_check_devempty(ihost, idev, | 248 | isci_check_devempty(ihost, idev, |
226 | rnc_suspend_count)); | 249 | rnc_suspend_count), |
250 | msecs_to_jiffies(MAX_SUSPEND_MSECS))) { | ||
251 | |||
252 | dev_warn(&ihost->pdev->dev, "%s host%d timeout all\n", | ||
253 | __func__, ihost->id); | ||
254 | dev_dbg(&ihost->pdev->dev, | ||
255 | "%s: ******* Timeout waiting for " | ||
256 | "suspend; idev=%p, current state %s; " | ||
257 | "started_request_count=%d, flags=%lx\n\t" | ||
258 | "rnc_suspend_count=%d, " | ||
259 | "RNC: current state %s, " | ||
260 | "rnc.suspend_count=%d, current " | ||
261 | "suspend_type %x dest state %d\n", | ||
262 | __func__, idev, | ||
263 | dev_state_name(idev->sm.current_state_id), | ||
264 | idev->started_request_count, idev->flags, | ||
265 | rnc_suspend_count, | ||
266 | rnc_state_name(idev->rnc.sm.current_state_id), | ||
267 | idev->rnc.suspend_count, | ||
268 | idev->rnc.suspend_type, | ||
269 | idev->rnc.destination_state); | ||
270 | } | ||
227 | } | 271 | } |
228 | dev_dbg(&ihost->pdev->dev, "%s: idev=%p, wait done\n", | 272 | dev_dbg(&ihost->pdev->dev, "%s: idev=%p, wait done\n", |
229 | __func__, idev); | 273 | __func__, idev); |
@@ -1315,7 +1359,7 @@ void isci_remote_device_wait_for_resume_from_abort( | |||
1315 | dev_dbg(scirdev_to_dev(idev), "%s: starting resume wait: %p\n", | 1359 | dev_dbg(scirdev_to_dev(idev), "%s: starting resume wait: %p\n", |
1316 | __func__, idev); | 1360 | __func__, idev); |
1317 | 1361 | ||
1318 | #define MAX_RESUME_MSECS 5 | 1362 | #define MAX_RESUME_MSECS 10000 |
1319 | if (!wait_event_timeout(ihost->eventq, | 1363 | if (!wait_event_timeout(ihost->eventq, |
1320 | (!test_bit(IDEV_ABORT_PATH_RESUME_PENDING, | 1364 | (!test_bit(IDEV_ABORT_PATH_RESUME_PENDING, |
1321 | &idev->flags) | 1365 | &idev->flags) |
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c index b698081ce2dd..a0a62e3a500d 100644 --- a/drivers/scsi/isci/remote_node_context.c +++ b/drivers/scsi/isci/remote_node_context.c | |||
@@ -445,7 +445,7 @@ enum sci_status sci_remote_node_context_event_handler(struct sci_remote_node_con | |||
445 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | 445 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: |
446 | /* We really dont care if the hardware is going to suspend | 446 | /* We really dont care if the hardware is going to suspend |
447 | * the device since it's being invalidated anyway */ | 447 | * the device since it's being invalidated anyway */ |
448 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | 448 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), |
449 | "%s: SCIC Remote Node Context 0x%p was " | 449 | "%s: SCIC Remote Node Context 0x%p was " |
450 | "suspeneded by hardware while being " | 450 | "suspeneded by hardware while being " |
451 | "invalidated.\n", __func__, sci_rnc); | 451 | "invalidated.\n", __func__, sci_rnc); |
@@ -464,7 +464,7 @@ enum sci_status sci_remote_node_context_event_handler(struct sci_remote_node_con | |||
464 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | 464 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: |
465 | /* We really dont care if the hardware is going to suspend | 465 | /* We really dont care if the hardware is going to suspend |
466 | * the device since it's being resumed anyway */ | 466 | * the device since it's being resumed anyway */ |
467 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | 467 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), |
468 | "%s: SCIC Remote Node Context 0x%p was " | 468 | "%s: SCIC Remote Node Context 0x%p was " |
469 | "suspeneded by hardware while being resumed.\n", | 469 | "suspeneded by hardware while being resumed.\n", |
470 | __func__, sci_rnc); | 470 | __func__, sci_rnc); |
@@ -568,9 +568,9 @@ enum sci_status sci_remote_node_context_suspend( | |||
568 | RNC_DEST_UNSPECIFIED; | 568 | RNC_DEST_UNSPECIFIED; |
569 | 569 | ||
570 | dev_dbg(scirdev_to_dev(idev), | 570 | dev_dbg(scirdev_to_dev(idev), |
571 | "%s: current state %d, current suspend_type %x dest state %d," | 571 | "%s: current state %s, current suspend_type %x dest state %d," |
572 | " arg suspend_reason %d, arg suspend_type %x", | 572 | " arg suspend_reason %d, arg suspend_type %x", |
573 | __func__, state, sci_rnc->suspend_type, | 573 | __func__, rnc_state_name(state), sci_rnc->suspend_type, |
574 | sci_rnc->destination_state, suspend_reason, | 574 | sci_rnc->destination_state, suspend_reason, |
575 | suspend_type); | 575 | suspend_type); |
576 | 576 | ||