aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-09-23 00:14:13 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:42 -0400
commit7d77b247088fb360aa74bfdd9e19bce1e1987668 (patch)
treeadd1b03309dd6fa82eb0f47e1a88766695f38f28 /drivers/ata/ahci.c
parente31e8531d668c9c4dc7883054788f89805188003 (diff)
libata-pmp-prep: implement sata_async_notification()
AN serves multiple purposes. For ATAPI, it's used for media change notification. For PMP, for downstream PHY status change notification. Implement sata_async_notification() which demultiplexes AN. To avoid unnecessary port events, ATAPI AN is not enabled if PMP is attached but SNTF is not available. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Kriten Carlson Accardi <kristen.c.accardi@intel.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c24
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)