From 7d77b247088fb360aa74bfdd9e19bce1e1987668 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Sun, 23 Sep 2007 13:14:13 +0900 Subject: 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 Cc: Kriten Carlson Accardi Signed-off-by: Jeff Garzik --- drivers/ata/ahci.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) (limited to 'drivers/ata/ahci.c') diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index cf3404467ce..9f3c591c721 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1356,27 +1356,17 @@ static void ahci_port_intr(struct ata_port *ap) } if (status & PORT_IRQ_SDB_FIS) { - /* - * if this is an ATAPI device with AN turned on, - * then we should interrogate the device to - * determine the cause of the interrupt - * - * for AN - this we should check the SDB FIS - * and find the I and N bits set + /* If the 'N' bit in word 0 of the FIS is set, we just + * received asynchronous notification. Tell libata + * about it. Note that as the SDB FIS itself is + * accessible, SNotification can be emulated by the + * driver but don't bother for the time being. */ const __le32 *f = pp->rx_fis + RX_FIS_SDB; u32 f0 = le32_to_cpu(f[0]); - /* check the 'N' bit in word 0 of the FIS */ - if (f0 & (1 << 15)) { - int port_addr = ((f0 & 0x00000f00) >> 8); - struct ata_device *adev; - if (port_addr < ATA_MAX_DEVICES) { - adev = &ap->link.device[port_addr]; - if (adev->flags & ATA_DFLAG_AN) - ata_scsi_media_change_notify(adev); - } - } + if (f0 & (1 << 15)) + sata_async_notification(ap); } if (ap->link.sactive) -- cgit v1.2.3