diff options
author | Manuel Lauss <manuel.lauss@gmail.com> | 2015-09-30 21:10:25 +0200 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2015-09-30 17:37:55 -0400 |
commit | 8a3e33cf92c7b7ae25c589eccd1a69ab11cc4353 (patch) | |
tree | 5dd0856ad1213f3100101f7be901f682ca3ebf98 /drivers/ata/libahci.c | |
parent | a73f22f9811da0f69d5f04eadcfc87b4d6280814 (diff) | |
download | lwn-8a3e33cf92c7b7ae25c589eccd1a69ab11cc4353.tar.gz lwn-8a3e33cf92c7b7ae25c589eccd1a69ab11cc4353.zip |
ata: ahci: find eSATA ports and flag them as removable
If the AHCI ports' HPCP or ESP bits are set, the port
should be considered external (e.g. eSATA) and is marked
as removable. Userspace tools like udisks then treat it
like an usb drive.
With this patch applied, when I plug a drive into the esata port,
KDE pops up a window asking what to do with the drives(s), just
like it does for any random USB stick.
Removability is indicated to the upper layers by way of the
SCSI RMB bit, as I haven't found another way to signal
userspace to treat a sata disk like any usb stick.
Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata/libahci.c')
-rw-r--r-- | drivers/ata/libahci.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index d256a66158be..2fa551a5146e 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -1117,6 +1117,7 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap, int port_no, void __iomem *mmio, void __iomem *port_mmio) { + struct ahci_host_priv *hpriv = ap->host->private_data; const char *emsg = NULL; int rc; u32 tmp; @@ -1138,6 +1139,12 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap, writel(tmp, port_mmio + PORT_IRQ_STAT); writel(1 << port_no, mmio + HOST_IRQ_STAT); + + /* mark esata ports */ + tmp = readl(port_mmio + PORT_CMD); + if ((tmp & PORT_CMD_HPCP) || + ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))) + ap->pflags |= ATA_PFLAG_EXTERNAL; } void ahci_init_controller(struct ata_host *host) |