diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/sata_mv.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index bb2409e761d0..65dc65304f51 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
@@ -1380,12 +1380,12 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1380 | struct ata_port *ap = host_set->ports[port]; | 1380 | struct ata_port *ap = host_set->ports[port]; |
1381 | struct mv_port_priv *pp = ap->private_data; | 1381 | struct mv_port_priv *pp = ap->private_data; |
1382 | 1382 | ||
1383 | hard_port = port & MV_PORT_MASK; /* range 0-3 */ | 1383 | hard_port = mv_hardport_from_port(port); /* range 0..3 */ |
1384 | handled = 0; /* ensure ata_status is set if handled++ */ | 1384 | handled = 0; /* ensure ata_status is set if handled++ */ |
1385 | 1385 | ||
1386 | /* Note that DEV_IRQ might happen spuriously during EDMA, | 1386 | /* Note that DEV_IRQ might happen spuriously during EDMA, |
1387 | * and should be ignored in such cases. We could mask it, | 1387 | * and should be ignored in such cases. |
1388 | * but it's pretty rare and may not be worth the overhead. | 1388 | * The cause of this is still under investigation. |
1389 | */ | 1389 | */ |
1390 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { | 1390 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { |
1391 | /* EDMA: check for response queue interrupt */ | 1391 | /* EDMA: check for response queue interrupt */ |
@@ -1399,6 +1399,11 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1399 | ata_status = readb((void __iomem *) | 1399 | ata_status = readb((void __iomem *) |
1400 | ap->ioaddr.status_addr); | 1400 | ap->ioaddr.status_addr); |
1401 | handled = 1; | 1401 | handled = 1; |
1402 | /* ignore spurious intr if drive still BUSY */ | ||
1403 | if (ata_status & ATA_BUSY) { | ||
1404 | ata_status = 0; | ||
1405 | handled = 0; | ||
1406 | } | ||
1402 | } | 1407 | } |
1403 | } | 1408 | } |
1404 | 1409 | ||