diff options
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r-- | drivers/ata/ahci.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index cf3404467ceb..9f3c591c7214 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1356,27 +1356,17 @@ static void ahci_port_intr(struct ata_port *ap) | |||
1356 | } | 1356 | } |
1357 | 1357 | ||
1358 | if (status & PORT_IRQ_SDB_FIS) { | 1358 | if (status & PORT_IRQ_SDB_FIS) { |
1359 | /* | 1359 | /* If the 'N' bit in word 0 of the FIS is set, we just |
1360 | * if this is an ATAPI device with AN turned on, | 1360 | * received asynchronous notification. Tell libata |
1361 | * then we should interrogate the device to | 1361 | * about it. Note that as the SDB FIS itself is |
1362 | * determine the cause of the interrupt | 1362 | * accessible, SNotification can be emulated by the |
1363 | * | 1363 | * driver but don't bother for the time being. |
1364 | * for AN - this we should check the SDB FIS | ||
1365 | * and find the I and N bits set | ||
1366 | */ | 1364 | */ |
1367 | const __le32 *f = pp->rx_fis + RX_FIS_SDB; | 1365 | const __le32 *f = pp->rx_fis + RX_FIS_SDB; |
1368 | u32 f0 = le32_to_cpu(f[0]); | 1366 | u32 f0 = le32_to_cpu(f[0]); |
1369 | 1367 | ||
1370 | /* check the 'N' bit in word 0 of the FIS */ | 1368 | if (f0 & (1 << 15)) |
1371 | if (f0 & (1 << 15)) { | 1369 | sata_async_notification(ap); |
1372 | int port_addr = ((f0 & 0x00000f00) >> 8); | ||
1373 | struct ata_device *adev; | ||
1374 | if (port_addr < ATA_MAX_DEVICES) { | ||
1375 | adev = &ap->link.device[port_addr]; | ||
1376 | if (adev->flags & ATA_DFLAG_AN) | ||
1377 | ata_scsi_media_change_notify(adev); | ||
1378 | } | ||
1379 | } | ||
1380 | } | 1370 | } |
1381 | 1371 | ||
1382 | if (ap->link.sactive) | 1372 | if (ap->link.sactive) |