From: Matthew Garrett <mjg59@srcf.ucam.org>
To: linux-ide@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug - version 2
Date: Sat, 15 Sep 2007 18:06:53 +0100 [thread overview]
Message-ID: <20070915170652.GA25504@srcf.ucam.org> (raw)
In-Reply-To: <20070915030154.GA17655@srcf.ucam.org>
Modern laptops with hotswap bays still tend to utilise a PATA interface
on a SATA bridge, generally with the host controller in some legacy
emulation mode rather than AHCI. This means that the existing hotplug
code in libata is unable to work. The ACPI specification states that
these devices can send notifications when hotswapped, which avoids the
need to obtain notification from the controller. This patch uses the
existing libata-acpi code and simply registers a notification in order
to trigger a rescan whenever the firmware signals an event.
Signed-off-by: Matthew Garrett <mjg59@srcf.ucam.org>
---
Testing on an HP with the hotplug device as the slave on a PATA channel
flagged a bug - the notification needs to be tied to the channel handle
as well as the device ones. With this version, I can happily hotswap the
HP device. It ends up sitting for a few seconds while failing to
revalidate, but then recovers with everything working fine.
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
index c059f78..99f3179 100644
--- a/drivers/ata/libata-acpi.c
+++ b/drivers/ata/libata-acpi.c
@@ -66,6 +66,17 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
}
}
+static void ata_acpi_notify(acpi_handle handle, u32 event, void *data)
+{
+ struct ata_port *ap = data;
+ struct ata_eh_info *ehi = &ap->eh_info;
+
+ ata_ehi_clear_desc(ehi);
+ ata_ehi_push_desc(ehi, "ACPI event");
+ ata_ehi_hotplugged(ehi);
+ ata_port_freeze(ap);
+}
+
/**
* ata_acpi_associate - associate ATA host with ACPI objects
* @host: target ATA host
@@ -81,7 +92,7 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
*/
void ata_acpi_associate(struct ata_host *host)
{
- int i;
+ int i, j;
if (!is_pci_dev(host->dev) || libata_noacpi)
return;
@@ -97,6 +108,22 @@ void ata_acpi_associate(struct ata_host *host)
ata_acpi_associate_sata_port(ap);
else
ata_acpi_associate_ide_port(ap);
+
+ if (ap->acpi_handle)
+ acpi_install_notify_handler (ap->acpi_handle,
+ ACPI_SYSTEM_NOTIFY,
+ ata_acpi_notify,
+ ap);
+
+ for (j = 0; j < ATA_MAX_DEVICES; j++) {
+ struct ata_device *dev = &ap->device[j];
+
+ if (dev->acpi_handle)
+ acpi_install_notify_handler (ap->device->acpi_handle,
+ ACPI_SYSTEM_NOTIFY,
+ ata_acpi_notify,
+ ap);
+ }
}
}
--
Matthew Garrett | mjg59@srcf.ucam.org
next prev parent reply other threads:[~2007-09-15 17:06 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-15 3:01 [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug Matthew Garrett
2007-09-15 17:06 ` Matthew Garrett [this message]
2007-09-16 12:22 ` [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug - version 2 Tejun Heo
2007-09-20 22:04 ` Jeff Garzik
2007-09-20 22:21 ` Matthew Garrett
2007-09-21 2:35 ` Tejun Heo
2007-09-21 2:42 ` Matthew Garrett
2007-09-21 2:53 ` Tejun Heo
2007-09-21 2:57 ` Matthew Garrett
2007-09-21 3:08 ` Tejun Heo
2007-09-21 3:12 ` Matthew Garrett
2007-09-21 3:19 ` Tejun Heo
2007-09-24 23:14 ` [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug - version 3 Matthew Garrett
2007-09-27 17:26 ` Kristen Carlson Accardi
2007-09-27 17:55 ` Matthew Garrett
2007-09-27 20:39 ` Henrique de Moraes Holschuh
2007-10-02 15:04 ` Jeff Garzik
2007-10-02 18:46 ` Matthew Garrett
2007-10-02 18:49 ` [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug - version 4 Matthew Garrett
2007-10-02 18:55 ` Jeff Garzik
2007-10-02 20:38 ` Jeff Garzik
2007-10-02 20:42 ` Matthew Garrett
2007-10-02 21:20 ` Matthew Garrett
2007-10-02 21:23 ` Jeff Garzik
2007-10-03 0:24 ` [PATCH] libata: Integrate ACPI-based PATA/SATA hotplug - version 5 Matthew Garrett
2007-10-03 20:27 ` Jeff Garzik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070915170652.GA25504@srcf.ucam.org \
--to=mjg59@srcf.ucam.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).