diff options
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 6223ec042c80..2a229a1d3211 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -396,28 +396,21 @@ void ata_bmdma_thaw(struct ata_port *ap) | |||
396 | } | 396 | } |
397 | 397 | ||
398 | /** | 398 | /** |
399 | * ata_bmdma_drive_eh - Perform EH with given methods for BMDMA controller | 399 | * ata_bmdma_error_handler - Stock error handler for BMDMA controller |
400 | * @ap: port to handle error for | 400 | * @ap: port to handle error for |
401 | * @prereset: prereset method (can be NULL) | ||
402 | * @softreset: softreset method (can be NULL) | ||
403 | * @hardreset: hardreset method (can be NULL) | ||
404 | * @postreset: postreset method (can be NULL) | ||
405 | * | 401 | * |
406 | * Handle error for ATA BMDMA controller. It can handle both | 402 | * Stock error handler for BMDMA controller. It can handle both |
407 | * PATA and SATA controllers. Many controllers should be able to | 403 | * PATA and SATA controllers. Many controllers should be able to |
408 | * use this EH as-is or with some added handling before and | 404 | * use this EH as-is or with some added handling before and |
409 | * after. | 405 | * after. |
410 | * | 406 | * |
411 | * This function is intended to be used for constructing | ||
412 | * ->error_handler callback by low level drivers. | ||
413 | * | ||
414 | * LOCKING: | 407 | * LOCKING: |
415 | * Kernel thread context (may sleep) | 408 | * Kernel thread context (may sleep) |
416 | */ | 409 | */ |
417 | void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | 410 | void ata_bmdma_error_handler(struct ata_port *ap) |
418 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, | ||
419 | ata_postreset_fn_t postreset) | ||
420 | { | 411 | { |
412 | ata_reset_fn_t softreset = ap->ops->softreset; | ||
413 | ata_reset_fn_t hardreset = ap->ops->hardreset; | ||
421 | struct ata_queued_cmd *qc; | 414 | struct ata_queued_cmd *qc; |
422 | unsigned long flags; | 415 | unsigned long flags; |
423 | int thaw = 0; | 416 | int thaw = 0; |
@@ -460,29 +453,19 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
460 | ata_eh_thaw_port(ap); | 453 | ata_eh_thaw_port(ap); |
461 | 454 | ||
462 | /* PIO and DMA engines have been stopped, perform recovery */ | 455 | /* PIO and DMA engines have been stopped, perform recovery */ |
463 | ata_do_eh(ap, prereset, softreset, hardreset, postreset); | ||
464 | } | ||
465 | |||
466 | /** | ||
467 | * ata_bmdma_error_handler - Stock error handler for BMDMA controller | ||
468 | * @ap: port to handle error for | ||
469 | * | ||
470 | * Stock error handler for BMDMA controller. | ||
471 | * | ||
472 | * LOCKING: | ||
473 | * Kernel thread context (may sleep) | ||
474 | */ | ||
475 | void ata_bmdma_error_handler(struct ata_port *ap) | ||
476 | { | ||
477 | ata_reset_fn_t softreset = NULL, hardreset = NULL; | ||
478 | 456 | ||
479 | if (ap->ioaddr.ctl_addr) | 457 | /* ata_std_softreset and sata_std_hardreset are inherited to |
480 | softreset = ata_std_softreset; | 458 | * all SFF drivers from ata_sff_port_ops. Ignore softreset if |
481 | if (sata_scr_valid(&ap->link)) | 459 | * ctl isn't accessible. Ignore hardreset if SCR access isn't |
482 | hardreset = sata_std_hardreset; | 460 | * available. |
461 | */ | ||
462 | if (softreset == ata_std_softreset && !ap->ioaddr.ctl_addr) | ||
463 | softreset = NULL; | ||
464 | if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link)) | ||
465 | hardreset = NULL; | ||
483 | 466 | ||
484 | ata_bmdma_drive_eh(ap, ata_std_prereset, softreset, hardreset, | 467 | ata_do_eh(ap, ap->ops->prereset, softreset, hardreset, |
485 | ata_std_postreset); | 468 | ap->ops->postreset); |
486 | } | 469 | } |
487 | 470 | ||
488 | /** | 471 | /** |