aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/libata-sff.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 3cc385dbfe2a..a4700af43d10 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2379,7 +2379,7 @@ void ata_sff_error_handler(struct ata_port *ap)
2379 ata_reset_fn_t hardreset = ap->ops->hardreset; 2379 ata_reset_fn_t hardreset = ap->ops->hardreset;
2380 struct ata_queued_cmd *qc; 2380 struct ata_queued_cmd *qc;
2381 unsigned long flags; 2381 unsigned long flags;
2382 int thaw = 0; 2382 bool thaw = false;
2383 2383
2384 qc = __ata_qc_from_tag(ap, ap->link.active_tag); 2384 qc = __ata_qc_from_tag(ap, ap->link.active_tag);
2385 if (qc && !(qc->flags & ATA_QCFLAG_FAILED)) 2385 if (qc && !(qc->flags & ATA_QCFLAG_FAILED))
@@ -2405,15 +2405,22 @@ void ata_sff_error_handler(struct ata_port *ap)
2405 if (qc->err_mask == AC_ERR_TIMEOUT 2405 if (qc->err_mask == AC_ERR_TIMEOUT
2406 && (host_stat & ATA_DMA_ERR)) { 2406 && (host_stat & ATA_DMA_ERR)) {
2407 qc->err_mask = AC_ERR_HOST_BUS; 2407 qc->err_mask = AC_ERR_HOST_BUS;
2408 thaw = 1; 2408 thaw = true;
2409 } 2409 }
2410 2410
2411 ap->ops->bmdma_stop(qc); 2411 ap->ops->bmdma_stop(qc);
2412
2413 /* if we're gonna thaw, make sure IRQ is clear */
2414 if (thaw) {
2415 ap->ops->sff_check_status(ap);
2416 ap->ops->sff_irq_clear(ap);
2417
2418 spin_unlock_irqrestore(ap->lock, flags);
2419 ata_eh_thaw_port(ap);
2420 spin_lock_irqsave(ap->lock, flags);
2421 }
2412 } 2422 }
2413 2423
2414 ata_sff_sync(ap); /* FIXME: We don't need this */
2415 ap->ops->sff_check_status(ap);
2416 ap->ops->sff_irq_clear(ap);
2417 /* We *MUST* do FIFO draining before we issue a reset as several 2424 /* We *MUST* do FIFO draining before we issue a reset as several
2418 * devices helpfully clear their internal state and will lock solid 2425 * devices helpfully clear their internal state and will lock solid
2419 * if we touch the data port post reset. Pass qc in case anyone wants 2426 * if we touch the data port post reset. Pass qc in case anyone wants
@@ -2424,9 +2431,6 @@ void ata_sff_error_handler(struct ata_port *ap)
2424 2431
2425 spin_unlock_irqrestore(ap->lock, flags); 2432 spin_unlock_irqrestore(ap->lock, flags);
2426 2433
2427 if (thaw)
2428 ata_eh_thaw_port(ap);
2429
2430 /* PIO and DMA engines have been stopped, perform recovery */ 2434 /* PIO and DMA engines have been stopped, perform recovery */
2431 2435
2432 /* Ignore ata_sff_softreset if ctl isn't accessible and 2436 /* Ignore ata_sff_softreset if ctl isn't accessible and