diff mbox

Export ahci eSATA attribute

Message ID 4CDE20CF.3010708@cfl.rr.com
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Phillip Susi Nov. 13, 2010, 5:23 a.m. UTC
How about this one?

Comments

Jeff Garzik Nov. 13, 2010, 5:30 a.m. UTC | #1
On 11/13/2010 12:23 AM, Phillip Susi wrote:
> How about this one?

As you noted in your previous mail, the entire PORT_CMD is already 
exported as a attribute.  I don't see much point in exporting this 
information a second time.

One way or another, userspace must handle AHCI-specific hardware details.

	Jeff


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Phillip Susi Nov. 13, 2010, 3:46 p.m. UTC | #2
On 11/13/2010 12:30 AM, Jeff Garzik wrote:
> As you noted in your previous mail, the entire PORT_CMD is already
> exported as a attribute. I don't see much point in exporting this
> information a second time.

Unfortunately it is not exported in a way that udev can make use of it. 
  Firstly because udev can only compare on specific value matches rather 
than an individual bit, and secondly because it is in the weird 
scsi_host device rather than the host device, so the attribute is not in 
an ancestor device of the disk device.  Placing this attribute this way 
puts it in the ancestry of the disk device so it can be matched by a 
udev ATTRS rule.
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Phillip Susi Nov. 18, 2010, 7:37 p.m. UTC | #3
I never got any comment back on this.  In order for udev to use the
existing attribute, it needs to be moved out of the scsi_host device,
and udev needs patched to handle bitwise comparisons, or my simple patch
adding the new attribute can be applied.

Are you certain you do not want to add a new attribute, and if so, would
you accept a patch moving the existing one out of the scsi_host device
so it will be a proper ancestor of the disk device?

On 11/13/2010 10:46 AM, Phillip Susi wrote:
> On 11/13/2010 12:30 AM, Jeff Garzik wrote:
>> As you noted in your previous mail, the entire PORT_CMD is already
>> exported as a attribute. I don't see much point in exporting this
>> information a second time.
> 
> Unfortunately it is not exported in a way that udev can make use of it.
>  Firstly because udev can only compare on specific value matches rather
> than an individual bit, and secondly because it is in the weird
> scsi_host device rather than the host device, so the attribute is not in
> an ancestor device of the disk device.  Placing this attribute this way
> puts it in the ancestry of the disk device so it can be matched by a
> udev ATTRS rule.

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Phillip Susi Jan. 20, 2011, 4:08 p.m. UTC | #4
I never got any comment back on this.  In order for udev to use the
existing attribute, it needs to be moved out of the scsi_host device,
and udev needs patched to handle bitwise comparisons, or my simple patch
adding the new attribute can be applied.

Are you certain you do not want to add a new attribute, and if so, would
you accept a patch moving the existing one out of the scsi_host device
so it will be a proper ancestor of the disk device?  Kay Sievers thinks
that the current location of scsi_host is broken should be fixed, but I
think that involves significant changes to the scsi layer so I found
that this patch was much simpler.

On 11/13/2010 10:46 AM, Phillip Susi wrote:
> On 11/13/2010 12:30 AM, Jeff Garzik wrote:
>> As you noted in your previous mail, the entire PORT_CMD is already
>> exported as a attribute. I don't see much point in exporting this
>> information a second time.
> 
> Unfortunately it is not exported in a way that udev can make use of it.
>  Firstly because udev can only compare on specific value matches rather
> than an individual bit, and secondly because it is in the weird
> scsi_host device rather than the host device, so the attribute is not in
> an ancestor device of the disk device.  Placing this attribute this way
> puts it in the ancestry of the disk device so it can be matched by a
> udev ATTRS rule.

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

From d5636730ab4fa52d64c7e530518bf25c68a590de Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@faldara.(none)>
Date: Sat, 13 Nov 2010 00:20:53 -0500
Subject: [PATCH] [PATCH] Export ahci eSATA attribute

The AHCI standard defines a port bit that indicates that port
is an eSATA external port.  Detect and export this bit as a
sysfs attribute named ahci_port_external.  It is intended that
this information be used by udisks to auto mount external eSATA
drives when they are hot plugged.
---
 drivers/ata/ahci.h    |    1 +
 drivers/ata/libahci.c |   15 +++++++++++++++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
index 329cbbb..421c523 100644
--- a/drivers/ata/ahci.h
+++ b/drivers/ata/ahci.h
@@ -172,6 +172,7 @@  enum {
 	PORT_CMD_ALPE		= (1 << 26), /* Aggressive Link PM enable */
 	PORT_CMD_ATAPI		= (1 << 24), /* Device is ATAPI */
 	PORT_CMD_FBSCP		= (1 << 22), /* FBS Capable Port */
+	PORT_CMD_ESP 		= (1 << 21), /* eSATA Port */
 	PORT_CMD_PMP		= (1 << 17), /* PMP attached */
 	PORT_CMD_LIST_ON	= (1 << 15), /* cmd list DMA engine running */
 	PORT_CMD_FIS_ON		= (1 << 14), /* FIS DMA engine running */
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index ebc08d6..c5b71ad 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -43,6 +43,7 @@ 
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
 #include <linux/libata.h>
 #include "ahci.h"
 
@@ -107,6 +108,8 @@  static ssize_t ahci_show_host_version(struct device *dev,
 				      struct device_attribute *attr, char *buf);
 static ssize_t ahci_show_port_cmd(struct device *dev,
 				  struct device_attribute *attr, char *buf);
+static ssize_t ahci_show_port_external(struct device *dev,
+			  struct device_attribute *attr, char *buf);
 static ssize_t ahci_read_em_buffer(struct device *dev,
 				   struct device_attribute *attr, char *buf);
 static ssize_t ahci_store_em_buffer(struct device *dev,
@@ -117,6 +120,7 @@  static DEVICE_ATTR(ahci_host_caps, S_IRUGO, ahci_show_host_caps, NULL);
 static DEVICE_ATTR(ahci_host_cap2, S_IRUGO, ahci_show_host_cap2, NULL);
 static DEVICE_ATTR(ahci_host_version, S_IRUGO, ahci_show_host_version, NULL);
 static DEVICE_ATTR(ahci_port_cmd, S_IRUGO, ahci_show_port_cmd, NULL);
+static DEVICE_ATTR(ahci_port_external, S_IRUGO, ahci_show_port_external, NULL);
 static DEVICE_ATTR(em_buffer, S_IWUSR | S_IRUGO,
 		   ahci_read_em_buffer, ahci_store_em_buffer);
 
@@ -136,6 +140,7 @@  EXPORT_SYMBOL_GPL(ahci_shost_attrs);
 struct device_attribute *ahci_sdev_attrs[] = {
 	&dev_attr_sw_activity,
 	&dev_attr_unload_heads,
+	&dev_attr_ahci_port_external,
 	NULL
 };
 EXPORT_SYMBOL_GPL(ahci_sdev_attrs);
@@ -250,6 +255,16 @@  static ssize_t ahci_show_port_cmd(struct device *dev,
 	return sprintf(buf, "%x\n", readl(port_mmio + PORT_CMD));
 }
 
+static ssize_t ahci_show_port_external(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	struct scsi_device *sdev = to_scsi_device(dev);
+	struct ata_port *ap = ata_shost_to_port(sdev->host);
+	void __iomem *port_mmio = ahci_port_base(ap);
+
+	return sprintf(buf, "%x\n", readl(port_mmio + PORT_CMD) & PORT_CMD_ESP ? 1 : 0);
+}
+
 static ssize_t ahci_read_em_buffer(struct device *dev,
 				   struct device_attribute *attr, char *buf)
 {
-- 
1.7.1