LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* Re: HPA patches
  2007-03-23 19:13 HPA patches Alan Cox
@ 2007-03-23 18:24 ` Randy Dunlap
  2007-03-23 20:08   ` Alan Cox
  2007-03-23 20:56 ` Matthew Garrett
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 22+ messages in thread
From: Randy Dunlap @ 2007-03-23 18:24 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Fri, 23 Mar 2007 19:13:21 +0000 Alan Cox wrote:

> For reference this is what I am currently using with 2.6.21-rc4-mm1 and
> it is working for all my test cases so far: Its basically Kyle's patch
> with a libata switch to turn it on/off and some minor fixups from
> the original patch as posted
> 
> diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.21-rc4-mm1/drivers/ata/libata-core.c linux-2.6.21-rc4-mm1/drivers/ata/libata-core.c
> --- linux.vanilla-2.6.21-rc4-mm1/drivers/ata/libata-core.c	2007-03-23 11:49:49.000000000 +0000
> +++ linux-2.6.21-rc4-mm1/drivers/ata/libata-core.c	2007-03-23 13:05:15.000000000 +0000
> @@ -89,6 +89,10 @@
>  module_param_named(fua, libata_fua, int, 0444);
>  MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
>  
> +static int ata_ignore_hpa = 0;

Don't init to 0.  Not needed, bloats binary files.

> +module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
> +MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");

So 1 = on = ignore, right?

> +
>  static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ;
>  module_param(ata_probe_timeout, int, 0444);
>  MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)");
> @@ -808,6 +812,202 @@
>  	*p = '\0';
>  }
>  
> +
> +/**
> + *	ata_read_native_max_address_ext	-	LBA48 native max query
> + *	@dev: Device to query
> + *
> + *	Performa an LBA48 size query upon the device in question. Return the

	Perform

> + *	actual LBA48 size or zero if the command fails.
> + */
> +
> +static u64 ata_read_native_max_address_ext(struct ata_device *dev)
> +{
> +	unsigned int err;
> +	struct ata_taskfile tf;
> +
> +	ata_tf_init(dev, &tf);
> +
> +	tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
> +	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
> +	tf.protocol |= ATA_PROT_NODATA;
> +	tf.device = 0x40;

What is 0x40?  can it be #defined (or enum-ed) instead of a magic
value?  please?  (more of same below)

> +
> +	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
> +	if (err)
> +		return 0;
> +
> +	return ata_tf_to_lba48(&tf);
> +}
> +
> +/**
> + *	ata_read_native_max_address	-	LBA28 native max query
> + *	@dev: Device to query
> + *
> + *	Performa an LBA28 size query upon the device in question. Return the

	Perform

> + *	actual LBA28 size or zero if the command fails.
> + */
> +
> +static u64 ata_read_native_max_address(struct ata_device *dev)
> +{
> +	unsigned int err;
> +	struct ata_taskfile tf;
> +
> +	ata_tf_init(dev, &tf);
> +
> +	tf.command = ATA_CMD_READ_NATIVE_MAX;
> +	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
> +	tf.protocol |= ATA_PROT_NODATA;
> +	tf.device = 0x40;
> +
> +	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
> +	if (err)
> +		return 0;
> +
> +	return ata_tf_to_lba(&tf);
> +}
> +
> +/**
> + *	ata_set_native_max_address_ext	-	LBA48 native max set
> + *	@dev: Device to query
> + *
> + *	Perform an LBA48 size set max upon the device in question. Return the
> + *	actual LBA48 size or zero if the command fails.
> + */
> +
> +static u64 ata_set_native_max_address_ext(struct ata_device *dev, u64 new_sectors)
> +{
...
> +}
> +
> +/**
> + *	ata_set_native_max_address	-	LBA28 native max set
> + *	@dev: Device to query
> + *
> + *	Perform an LBA28 size set max upon the device in question. Return the
> + *	actual LBA28 size or zero if the command fails.
> + */
> +
> +static u64 ata_set_native_max_address(struct ata_device *dev, u64 new_sectors)
> +{
...
> +}
> +
> +/**
> + *	ata_hpa_resize		-	Resize a device with an HPA set
> + *	@dev: Device to resize
> + *
> + *	Read the size of an LBA28 or LBA48 disk with HPA features and resize
> + *	it if required to the full size of the media. The caller must check
> + *	the drive has the HPA feature set enabled.
> + */
> +
> +static u64 ata_hpa_resize(struct ata_device *dev)
> +{
> +	u64 sectors = dev->n_sectors;
> +	u64 hpa_sectors;
> +	
> +	if (ata_id_has_lba48(dev->id))
> +		hpa_sectors = ata_read_native_max_address_ext(dev);
> +	else
> +		hpa_sectors = ata_read_native_max_address(dev);
> +
> +	/* if no hpa, both should be equal */
> +	ata_dev_printk(dev, KERN_INFO, "%s 1: sectors = %lld, hpa_sectors = %lld\n",
> +		__FUNCTION__, sectors, hpa_sectors);

(long long) or (unsigned long long) on sectors and hpa_sectors...

> +
> +	if (hpa_sectors > sectors) {
> +		ata_dev_printk(dev, KERN_INFO,
> +			"Host Protected Area detected:\n"
> +			"\tcurrent size: %lld sectors\n"
> +			"\tnative size: %lld sectors\n",
> +			sectors, hpa_sectors);

printk format types ok?

> +
> +		if (ata_ignore_hpa) {
> +			if (ata_id_has_lba48(dev->id))
> +				hpa_sectors = ata_set_native_max_address_ext(dev, hpa_sectors);
> +			else
> +				hpa_sectors = ata_set_native_max_address(dev, hpa_sectors);
> +
> +			if (hpa_sectors) {
> +				ata_dev_printk(dev, KERN_INFO,
> +					"native size increased to %lld sectors\n", hpa_sectors);

Line lengths < 80 and printk format types?

> +				return hpa_sectors;
> +			}
> +		}
> +	}
> +	return sectors;
> +}
> +
>  static u64 ata_id_n_sectors(const u16 *id)
>  {
>  	if (ata_id_has_lba(id)) {
> @@ -1658,6 +1858,7 @@
>  			snprintf(revbuf, 7, "ATA-%d",  ata_id_major_version(id));
>  
>  		dev->n_sectors = ata_id_n_sectors(id);
> +		dev->n_sectors_boot = dev->n_sectors;
>  
>  		/* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
>  		ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
> @@ -1684,6 +1885,9 @@
>  					dev->flags |= ATA_DFLAG_FLUSH_EXT;
>  			}
>  
> +			if (ata_id_hpa_enabled(dev->id))
> +				dev->n_sectors = ata_hpa_resize(dev);
> +
>  			/* config NCQ */
>  			ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
>  
> @@ -3384,6 +3595,11 @@
>  			       "%llu != %llu\n",
>  			       (unsigned long long)dev->n_sectors,
>  			       (unsigned long long)new_n_sectors);
> +		/* Are we the boot time size - if so we appear to be the
> +		   same disk at this point and our HPA got reapplied */
> +		if (ata_ignore_hpa && dev->n_sectors_boot == new_n_sectors 
> +		    && ata_id_hpa_enabled(new_id))
> +			return 1;
>  		return 0;
>  	}


---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***

^ permalink raw reply	[flat|nested] 22+ messages in thread

* HPA patches
@ 2007-03-23 19:13 Alan Cox
  2007-03-23 18:24 ` Randy Dunlap
                   ` (3 more replies)
  0 siblings, 4 replies; 22+ messages in thread
From: Alan Cox @ 2007-03-23 19:13 UTC (permalink / raw)
  To: linux-kernel, linux-ide, kyle

For reference this is what I am currently using with 2.6.21-rc4-mm1 and
it is working for all my test cases so far: Its basically Kyle's patch
with a libata switch to turn it on/off and some minor fixups from
the original patch as posted

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.21-rc4-mm1/drivers/ata/libata-core.c linux-2.6.21-rc4-mm1/drivers/ata/libata-core.c
--- linux.vanilla-2.6.21-rc4-mm1/drivers/ata/libata-core.c	2007-03-23 11:49:49.000000000 +0000
+++ linux-2.6.21-rc4-mm1/drivers/ata/libata-core.c	2007-03-23 13:05:15.000000000 +0000
@@ -89,6 +89,10 @@
 module_param_named(fua, libata_fua, int, 0444);
 MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
 
+static int ata_ignore_hpa = 0;
+module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
+MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");
+
 static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ;
 module_param(ata_probe_timeout, int, 0444);
 MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)");
@@ -808,6 +812,202 @@
 	*p = '\0';
 }
 
+static u64 ata_tf_to_lba48(struct ata_taskfile *tf)
+{
+	u64 sectors = 0;
+
+	sectors |= ((u64)(tf->hob_lbah & 0xff)) << 40;
+	sectors |= ((u64)(tf->hob_lbam & 0xff)) << 32;
+	sectors |= (tf->hob_lbal & 0xff) << 24;
+	sectors |= (tf->lbah & 0xff) << 16;
+	sectors |= (tf->lbam & 0xff) << 8;
+	sectors |= (tf->lbal & 0xff);
+
+	return ++sectors;
+}
+
+static u64 ata_tf_to_lba(struct ata_taskfile *tf)
+{
+	u64 sectors = 0;
+
+	sectors |= (tf->device & 0x0f) << 24;
+	sectors |= (tf->lbah & 0xff) << 16;
+	sectors |= (tf->lbam & 0xff) << 8;
+	sectors |= (tf->lbal & 0xff);
+
+	return ++sectors;
+}
+
+/**
+ *	ata_read_native_max_address_ext	-	LBA48 native max query
+ *	@dev: Device to query
+ *
+ *	Performa an LBA48 size query upon the device in question. Return the
+ *	actual LBA48 size or zero if the command fails.
+ */
+
+static u64 ata_read_native_max_address_ext(struct ata_device *dev)
+{
+	unsigned int err;
+	struct ata_taskfile tf;
+
+	ata_tf_init(dev, &tf);
+
+	tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
+	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
+	tf.protocol |= ATA_PROT_NODATA;
+	tf.device = 0x40;
+
+	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+	if (err)
+		return 0;
+
+	return ata_tf_to_lba48(&tf);
+}
+
+/**
+ *	ata_read_native_max_address	-	LBA28 native max query
+ *	@dev: Device to query
+ *
+ *	Performa an LBA28 size query upon the device in question. Return the
+ *	actual LBA28 size or zero if the command fails.
+ */
+
+static u64 ata_read_native_max_address(struct ata_device *dev)
+{
+	unsigned int err;
+	struct ata_taskfile tf;
+
+	ata_tf_init(dev, &tf);
+
+	tf.command = ATA_CMD_READ_NATIVE_MAX;
+	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
+	tf.protocol |= ATA_PROT_NODATA;
+	tf.device = 0x40;
+
+	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+	if (err)
+		return 0;
+
+	return ata_tf_to_lba(&tf);
+}
+
+/**
+ *	ata_set_native_max_address_ext	-	LBA48 native max set
+ *	@dev: Device to query
+ *
+ *	Perform an LBA48 size set max upon the device in question. Return the
+ *	actual LBA48 size or zero if the command fails.
+ */
+
+static u64 ata_set_native_max_address_ext(struct ata_device *dev, u64 new_sectors)
+{
+	unsigned int err;
+	struct ata_taskfile tf;
+
+	new_sectors--;
+
+	ata_tf_init(dev, &tf);
+
+	tf.command = ATA_CMD_SET_MAX_EXT;
+	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
+	tf.protocol |= ATA_PROT_NODATA;
+	tf.device = 0x40;
+
+	tf.lbal = (new_sectors >> 0) & 0xff;
+	tf.lbam = (new_sectors >> 8) & 0xff;
+	tf.lbah = (new_sectors >> 16) & 0xff;
+
+	tf.hob_lbal = (new_sectors >> 24) & 0xff;
+	tf.hob_lbam = (new_sectors >> 32) & 0xff;
+	tf.hob_lbah = (new_sectors >> 40) & 0xff;
+
+	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+	if (err)
+		return 0;
+
+	return ata_tf_to_lba48(&tf);
+}
+
+/**
+ *	ata_set_native_max_address	-	LBA28 native max set
+ *	@dev: Device to query
+ *
+ *	Perform an LBA28 size set max upon the device in question. Return the
+ *	actual LBA28 size or zero if the command fails.
+ */
+
+static u64 ata_set_native_max_address(struct ata_device *dev, u64 new_sectors)
+{
+	unsigned int err;
+	struct ata_taskfile tf;
+
+	new_sectors--;
+
+	ata_tf_init(dev, &tf);
+
+	tf.command = ATA_CMD_SET_MAX;
+	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
+	tf.protocol |= ATA_PROT_NODATA;
+
+	tf.lbal = (new_sectors >> 0) & 0xff;
+	tf.lbam = (new_sectors >> 8) & 0xff;
+	tf.lbah = (new_sectors >> 16) & 0xff;
+	tf.device = ((new_sectors >> 24) & 0xff) | 0x40;
+
+	err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+	if (err)
+		return 0;
+
+	return ata_tf_to_lba(&tf);
+}
+
+/**
+ *	ata_hpa_resize		-	Resize a device with an HPA set
+ *	@dev: Device to resize
+ *
+ *	Read the size of an LBA28 or LBA48 disk with HPA features and resize
+ *	it if required to the full size of the media. The caller must check
+ *	the drive has the HPA feature set enabled.
+ */
+
+static u64 ata_hpa_resize(struct ata_device *dev)
+{
+	u64 sectors = dev->n_sectors;
+	u64 hpa_sectors;
+	
+	if (ata_id_has_lba48(dev->id))
+		hpa_sectors = ata_read_native_max_address_ext(dev);
+	else
+		hpa_sectors = ata_read_native_max_address(dev);
+
+	/* if no hpa, both should be equal */
+	ata_dev_printk(dev, KERN_INFO, "%s 1: sectors = %lld, hpa_sectors = %lld\n",
+		__FUNCTION__, sectors, hpa_sectors);
+
+	if (hpa_sectors > sectors) {
+		ata_dev_printk(dev, KERN_INFO,
+			"Host Protected Area detected:\n"
+			"\tcurrent size: %lld sectors\n"
+			"\tnative size: %lld sectors\n",
+			sectors, hpa_sectors);
+
+		if (ata_ignore_hpa) {
+			if (ata_id_has_lba48(dev->id))
+				hpa_sectors = ata_set_native_max_address_ext(dev, hpa_sectors);
+			else
+				hpa_sectors = ata_set_native_max_address(dev, hpa_sectors);
+
+			if (hpa_sectors) {
+				ata_dev_printk(dev, KERN_INFO,
+					"native size increased to %lld sectors\n", hpa_sectors);
+				return hpa_sectors;
+			}
+		}
+	}
+	return sectors;
+}
+
 static u64 ata_id_n_sectors(const u16 *id)
 {
 	if (ata_id_has_lba(id)) {
@@ -1658,6 +1858,7 @@
 			snprintf(revbuf, 7, "ATA-%d",  ata_id_major_version(id));
 
 		dev->n_sectors = ata_id_n_sectors(id);
+		dev->n_sectors_boot = dev->n_sectors;
 
 		/* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
 		ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
@@ -1684,6 +1885,9 @@
 					dev->flags |= ATA_DFLAG_FLUSH_EXT;
 			}
 
+			if (ata_id_hpa_enabled(dev->id))
+				dev->n_sectors = ata_hpa_resize(dev);
+
 			/* config NCQ */
 			ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
 
@@ -3384,6 +3595,11 @@
 			       "%llu != %llu\n",
 			       (unsigned long long)dev->n_sectors,
 			       (unsigned long long)new_n_sectors);
+		/* Are we the boot time size - if so we appear to be the
+		   same disk at this point and our HPA got reapplied */
+		if (ata_ignore_hpa && dev->n_sectors_boot == new_n_sectors 
+		    && ata_id_hpa_enabled(new_id))
+			return 1;
 		return 0;
 	}
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.21-rc4-mm1/include/linux/ata.h linux-2.6.21-rc4-mm1/include/linux/ata.h
--- linux.vanilla-2.6.21-rc4-mm1/include/linux/ata.h	2007-03-23 11:49:09.000000000 +0000
+++ linux-2.6.21-rc4-mm1/include/linux/ata.h	2007-03-23 12:53:43.000000000 +0000
@@ -158,6 +158,8 @@
 	ATA_CMD_INIT_DEV_PARAMS	= 0x91,
 	ATA_CMD_READ_NATIVE_MAX	= 0xF8,
 	ATA_CMD_READ_NATIVE_MAX_EXT = 0x27,
+	ATA_CMD_SET_MAX		= 0xF9,
+	ATA_CMD_SET_MAX_EXT	= 0x37,
 	ATA_CMD_READ_LOG_EXT	= 0x2f,
 
 	/* READ_LOG_EXT pages */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.21-rc4-mm1/include/linux/libata.h linux-2.6.21-rc4-mm1/include/linux/libata.h
--- linux.vanilla-2.6.21-rc4-mm1/include/linux/libata.h	2007-03-23 11:49:51.000000000 +0000
+++ linux-2.6.21-rc4-mm1/include/linux/libata.h	2007-03-23 13:01:27.000000000 +0000
@@ -461,6 +461,7 @@
 	struct scsi_device	*sdev;		/* attached SCSI device */
 	/* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
 	u64			n_sectors;	/* size of device, if ATA */
+	u64			n_sectors_boot;	/* size of ATA device at startup */
 	unsigned int		class;		/* ATA_DEV_xxx */
 	u16			id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
 	u8			pio_mode;

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 20:08   ` Alan Cox
@ 2007-03-23 19:22     ` David Miller
  2007-03-23 21:51       ` Alan Cox
  2007-03-23 20:03     ` Randy Dunlap
  1 sibling, 1 reply; 22+ messages in thread
From: David Miller @ 2007-03-23 19:22 UTC (permalink / raw)
  To: alan; +Cc: randy.dunlap, linux-kernel, linux-ide, kyle

From: Alan Cox <alan@lxorguk.ukuu.org.uk>
Date: Fri, 23 Mar 2007 20:08:19 +0000

> u64 is always unsigned long long (and its debug anyway)

It's plain "unsigned long" on sparc64 and some other 64-bit platforms.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 20:08   ` Alan Cox
  2007-03-23 19:22     ` David Miller
@ 2007-03-23 20:03     ` Randy Dunlap
  2007-03-23 21:47       ` Alan Cox
  2007-04-13  3:16       ` Kyle McMartin
  1 sibling, 2 replies; 22+ messages in thread
From: Randy Dunlap @ 2007-03-23 20:03 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Fri, 23 Mar 2007 20:08:19 +0000 Alan Cox wrote:

> > > +static int ata_ignore_hpa = 0;
> > 
> > Don't init to 0.  Not needed, bloats binary files.
> 
> It'll be one for the final release 8)
> 
> > > +module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
> > > +MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");
> > 
> > So 1 = on = ignore, right?
> 
> Yes.
> 
> > > +	tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
> > > +	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
> > > +	tf.protocol |= ATA_PROT_NODATA;
> > > +	tf.device = 0x40;
> > 
> > What is 0x40?  can it be #defined (or enum-ed) instead of a magic
> > value?  please?  (more of same below)
> 
> It's 0x40. Its a "command dependant bit" - no useful name.

dependent.  OK, thanks.

> > > +	u64 sectors = dev->n_sectors;
> > > +	u64 hpa_sectors;
> > > +	
> > > +	if (ata_id_has_lba48(dev->id))
> > > +		hpa_sectors = ata_read_native_max_address_ext(dev);
> > > +	else
> > > +		hpa_sectors = ata_read_native_max_address(dev);
> > > +
> > > +	/* if no hpa, both should be equal */
> > > +	ata_dev_printk(dev, KERN_INFO, "%s 1: sectors = %lld, hpa_sectors = %lld\n",
> > > +		__FUNCTION__, sectors, hpa_sectors);
> > 
> > (long long) or (unsigned long long) on sectors and hpa_sectors...
> 
> u64 is always unsigned long long (and its debug anyway)
> 
> > 
> > > +
> > > +	if (hpa_sectors > sectors) {
> > > +		ata_dev_printk(dev, KERN_INFO,
> > > +			"Host Protected Area detected:\n"
> > > +			"\tcurrent size: %lld sectors\n"
> > > +			"\tnative size: %lld sectors\n",
> > > +			sectors, hpa_sectors);
> > 
> > printk format types ok?
> 
> Yes
> 
> > > +			if (hpa_sectors) {
> > > +				ata_dev_printk(dev, KERN_INFO,
> > > +					"native size increased to %lld sectors\n", hpa_sectors);
> > 
> > Line lengths < 80 and printk format types?
> 
> See above, and the 80 column fascists can suffer in the name of
> readability. 

Already corrected (printk types).  And putting
					hpa_sectors);
on a separate line doesn't hurt readability.

---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 18:24 ` Randy Dunlap
@ 2007-03-23 20:08   ` Alan Cox
  2007-03-23 19:22     ` David Miller
  2007-03-23 20:03     ` Randy Dunlap
  0 siblings, 2 replies; 22+ messages in thread
From: Alan Cox @ 2007-03-23 20:08 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: linux-kernel, linux-ide, kyle

> > +static int ata_ignore_hpa = 0;
> 
> Don't init to 0.  Not needed, bloats binary files.

It'll be one for the final release 8)

> > +module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
> > +MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");
> 
> So 1 = on = ignore, right?

Yes.

> > +	tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
> > +	tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
> > +	tf.protocol |= ATA_PROT_NODATA;
> > +	tf.device = 0x40;
> 
> What is 0x40?  can it be #defined (or enum-ed) instead of a magic
> value?  please?  (more of same below)

It's 0x40. Its a "command dependant bit" - no useful name.

> > +	u64 sectors = dev->n_sectors;
> > +	u64 hpa_sectors;
> > +	
> > +	if (ata_id_has_lba48(dev->id))
> > +		hpa_sectors = ata_read_native_max_address_ext(dev);
> > +	else
> > +		hpa_sectors = ata_read_native_max_address(dev);
> > +
> > +	/* if no hpa, both should be equal */
> > +	ata_dev_printk(dev, KERN_INFO, "%s 1: sectors = %lld, hpa_sectors = %lld\n",
> > +		__FUNCTION__, sectors, hpa_sectors);
> 
> (long long) or (unsigned long long) on sectors and hpa_sectors...

u64 is always unsigned long long (and its debug anyway)

> 
> > +
> > +	if (hpa_sectors > sectors) {
> > +		ata_dev_printk(dev, KERN_INFO,
> > +			"Host Protected Area detected:\n"
> > +			"\tcurrent size: %lld sectors\n"
> > +			"\tnative size: %lld sectors\n",
> > +			sectors, hpa_sectors);
> 
> printk format types ok?

Yes

> > +			if (hpa_sectors) {
> > +				ata_dev_printk(dev, KERN_INFO,
> > +					"native size increased to %lld sectors\n", hpa_sectors);
> 
> Line lengths < 80 and printk format types?

See above, and the 80 column fascists can suffer in the name of
readability. 

Alan

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 19:13 HPA patches Alan Cox
  2007-03-23 18:24 ` Randy Dunlap
@ 2007-03-23 20:56 ` Matthew Garrett
  2007-03-27  5:00   ` Jeff Garzik
  2007-03-26 20:45 ` Kyle McMartin
  2007-03-28  0:08 ` Matthew Garrett
  3 siblings, 1 reply; 22+ messages in thread
From: Matthew Garrett @ 2007-03-23 20:56 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Fri, Mar 23, 2007 at 07:13:21PM +0000, Alan Cox wrote:
> +static int ata_ignore_hpa = 0;
> +module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
> +MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");

I'm not sure I like the language here. "Ignore HPA" appears to mean 
"Explicitly disable the HPA", which I guess is one interpretation of 
"ignore" - however, naively I'd expect "Ignore HPA" to mean "Don't touch 
the HPA" with the result that it would remain inaccessible to userspace.

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 20:03     ` Randy Dunlap
@ 2007-03-23 21:47       ` Alan Cox
  2007-03-23 22:47         ` Chuck Ebbert
  2007-04-13  3:16       ` Kyle McMartin
  1 sibling, 1 reply; 22+ messages in thread
From: Alan Cox @ 2007-03-23 21:47 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: linux-kernel, linux-ide, kyle

> > > What is 0x40?  can it be #defined (or enum-ed) instead of a magic
> > > value?  please?  (more of same below)
> > 
> > It's 0x40. Its a "command dependant bit" - no useful name.
> 
> dependent.  OK, thanks.

IDE is a bit like that. I'm amazed some of the command flags arent in
latin.

> Already corrected (printk types).  And putting
> 					hpa_sectors);
> on a separate line doesn't hurt readability.

Maybe

Thanks for looking over the diff.

Alan

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 19:22     ` David Miller
@ 2007-03-23 21:51       ` Alan Cox
  0 siblings, 0 replies; 22+ messages in thread
From: Alan Cox @ 2007-03-23 21:51 UTC (permalink / raw)
  To: David Miller; +Cc: randy.dunlap, linux-kernel, linux-ide, kyle

On Fri, 23 Mar 2007 12:22:32 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Alan Cox <alan@lxorguk.ukuu.org.uk>
> Date: Fri, 23 Mar 2007 20:08:19 +0000
> 
> > u64 is always unsigned long long (and its debug anyway)
> 
> It's plain "unsigned long" on sparc64 and some other 64-bit platforms.

I stand corrected. In which case Randy is right and I do need to go fix
that formatting.

Thanks

Alan

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 21:47       ` Alan Cox
@ 2007-03-23 22:47         ` Chuck Ebbert
  0 siblings, 0 replies; 22+ messages in thread
From: Chuck Ebbert @ 2007-03-23 22:47 UTC (permalink / raw)
  To: Alan Cox; +Cc: Randy Dunlap, linux-kernel, linux-ide, kyle

Alan Cox wrote:
>>>> What is 0x40?  can it be #defined (or enum-ed) instead of a magic
>>>> value?  please?  (more of same below)
>>> It's 0x40. Its a "command dependant bit" - no useful name.
>> dependent.  OK, thanks.
> 
> IDE is a bit like that. I'm amazed some of the command flags arent in
> latin.
> 

Hmm, what's latin for "no useful name?" You could call it that.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 19:13 HPA patches Alan Cox
  2007-03-23 18:24 ` Randy Dunlap
  2007-03-23 20:56 ` Matthew Garrett
@ 2007-03-26 20:45 ` Kyle McMartin
  2007-03-28  0:08 ` Matthew Garrett
  3 siblings, 0 replies; 22+ messages in thread
From: Kyle McMartin @ 2007-03-26 20:45 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Fri, Mar 23, 2007 at 07:13:21PM +0000, Alan Cox wrote:
> For reference this is what I am currently using with 2.6.21-rc4-mm1 and
> it is working for all my test cases so far: Its basically Kyle's patch
> with a libata switch to turn it on/off and some minor fixups from
> the original patch as posted
> 

This looks good to me. Thanks for picking this up!

Acked-By: Kyle McMartin <kyle@canonical.com>

Cheers,
	Kyle M.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 20:56 ` Matthew Garrett
@ 2007-03-27  5:00   ` Jeff Garzik
  0 siblings, 0 replies; 22+ messages in thread
From: Jeff Garzik @ 2007-03-27  5:00 UTC (permalink / raw)
  To: Matthew Garrett; +Cc: Alan Cox, linux-kernel, linux-ide, kyle

Matthew Garrett wrote:
> On Fri, Mar 23, 2007 at 07:13:21PM +0000, Alan Cox wrote:
>> +static int ata_ignore_hpa = 0;
>> +module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
>> +MODULE_PARM_DESC(ignore_hpa, "Ignore HPA (0=off 1=on)");
> 
> I'm not sure I like the language here. "Ignore HPA" appears to mean 
> "Explicitly disable the HPA", which I guess is one interpretation of 
> "ignore" - however, naively I'd expect "Ignore HPA" to mean "Don't touch 
> the HPA" with the result that it would remain inaccessible to userspace.

"ignore" sounds more appropriate to me.

We're not just making it inaccessible, we are actively ignoring all 
traces of its existence everywhere, when that setting is enabled.

	Jeff




^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 19:13 HPA patches Alan Cox
                   ` (2 preceding siblings ...)
  2007-03-26 20:45 ` Kyle McMartin
@ 2007-03-28  0:08 ` Matthew Garrett
  2007-03-28  0:16   ` Matthew Garrett
  2007-03-28  9:57   ` HPA patches Alan Cox
  3 siblings, 2 replies; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28  0:08 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Fri, Mar 23, 2007 at 07:13:21PM +0000, Alan Cox wrote:
> For reference this is what I am currently using with 2.6.21-rc4-mm1 and
> it is working for all my test cases so far: Its basically Kyle's patch
> with a libata switch to turn it on/off and some minor fixups from
> the original patch as posted

Fails for me on a Macbook Pro with:

ata1: PATA max UDMA/133 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x000140b0 irq 14
ata2: PATA max UDMA/133 cmd 0x00010170 ctl 0x00010376 bmdma 0x000140b8 irq 15
scsi0: ata_piix
ata1.00: ATAPI, max UDMA/66
ata1.00: configured for UDMA/66
scsi1 : ata_piix
ATA: abornaml status 0x7f on port 0x00010177
scsi 0:0:0:0: CD-ROM MATSHITA DVD-R UJ-857D KCV9 PQ : 0 ANSI: 5
ata_piix 0000:00:1f.2: MAP [ P0 p" XX XX ]
ata_piix 0000:00:1f.2: invalid MAP value 0
ata3: SATA max UDMA/133 cmd 0x000140c8 ctl 0x000140e6 bmdma 0x000140a0 irq 20
ata4: SATA max UDMA/133 cmd 0x000140c0 ctl 0x000140e2 bmdma 0x000140a8 irq 20
scsi2 : ata_piix
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ata3.01: ata_hpa_resize 1: sectors = 234441648, hpa_sectors = 0
ata3.01: ATA-8: FUJITSU MHW2120BH, 00810013, max UDMA/100
ata3.01: 234441648 sectors, multi 16: LBA48 NCQ (depth 0/32)
ata3.01: failed to set xfermode (err_mask=0x40)
ata3: failed to recover some devices, retrying in 5 secs
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ata3.01: ata_hpa_resize 1: sectors = 234441648, hpa_sectors = 0
ata3.01: failed to set xfermode (err_mask=0x40)
ata3.01: limiting speed to UDMA/100:PIO3
ata3: failed to recover some devices, retrying in 5 secs
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ATA: abnormal status 0x7F on port 0x000140cf
ata3.01: qc timeout (cmd 0x27)
ata3.01: ata_hpa_resize 1: sectors = 234441648, hpa_sectors = 0
ata3.01: failed to set xfermode (err_mask=0x40)
ata3.01: disabled
scsi3: ata_piix
ATA: abnormal status 0x7F on port 0x000140c7

and I end up with no root filesystem. Reverting the patch leaves things 
working. This is the ubuntu tree - I can try libata-dev if you think 
there's likely to be any relevant difference.

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28  0:08 ` Matthew Garrett
@ 2007-03-28  0:16   ` Matthew Garrett
  2007-03-28  1:16     ` ata_piix can't drive Mac hardware properly Matthew Garrett
  2007-03-28  9:57   ` HPA patches Alan Cox
  1 sibling, 1 reply; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28  0:16 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 01:08:52AM +0100, Matthew Garrett wrote:
> ata3.01: ata_hpa_resize 1: sectors = 234441648, hpa_sectors = 0
                                                                ^
Does this just indicate the lack of an hpa? If so, the

/* if no hpa, both should be equal */

comment seems to be wrong (or, alternatively, it's the 
ata_read_native_max_address_ext call that's failing and returning 
garbage? I'll look into that)

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* ata_piix can't drive Mac hardware properly
  2007-03-28  0:16   ` Matthew Garrett
@ 2007-03-28  1:16     ` Matthew Garrett
  2007-03-28  4:07       ` Matthew Garrett
  0 siblings, 1 reply; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28  1:16 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 01:16:10AM +0100, Matthew Garrett wrote:

> comment seems to be wrong (or, alternatively, it's the 
> ata_read_native_max_address_ext call that's failing and returning 
> garbage? I'll look into that)

It's ata_read_native_max_address_ext failing, and it's fine if I use 
ahci rather than ata_piix, so I'll just chalk this up to Apple's 
firmware being broken (again) and putting the hardware into some sort of 
"I can't believe it's not piix" mode and see what I can do about 
ensuring we use ahci instead.

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: ata_piix can't drive Mac hardware properly
  2007-03-28  1:16     ` ata_piix can't drive Mac hardware properly Matthew Garrett
@ 2007-03-28  4:07       ` Matthew Garrett
  0 siblings, 0 replies; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28  4:07 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 02:16:08AM +0100, Matthew Garrett wrote:

> It's ata_read_native_max_address_ext failing, and it's fine if I use 
> ahci rather than ata_piix, so I'll just chalk this up to Apple's 
> firmware being broken (again) and putting the hardware into some sort of 
> "I can't believe it's not piix" mode and see what I can do about 
> ensuring we use ahci instead.

Slightly oddly, with ata_piix it seems to be failing with AC_ERR_HSM. 
Any idea why that might be?

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28  0:08 ` Matthew Garrett
  2007-03-28  0:16   ` Matthew Garrett
@ 2007-03-28  9:57   ` Alan Cox
  2007-03-28 20:08     ` Matthew Garrett
  1 sibling, 1 reply; 22+ messages in thread
From: Alan Cox @ 2007-03-28  9:57 UTC (permalink / raw)
  To: Matthew Garrett; +Cc: linux-kernel, linux-ide, kyle

On Wed, 28 Mar 2007 01:08:52 +0100
Matthew Garrett <mjg59@srcf.ucam.org> wrote:

> On Fri, Mar 23, 2007 at 07:13:21PM +0000, Alan Cox wrote:
> > For reference this is what I am currently using with 2.6.21-rc4-mm1 and
> > it is working for all my test cases so far: Its basically Kyle's patch
> > with a libata switch to turn it on/off and some minor fixups from
> > the original patch as posted
> 
> Fails for me on a Macbook Pro with:

Ok thanks. This is interesting as the only thing new it is doing is
asking for the HPA size. Does I think explain the problem however: Can
you move the HPA setting call to after the mode has been set and see if
that makes the problem vanish ?

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28  9:57   ` HPA patches Alan Cox
@ 2007-03-28 20:08     ` Matthew Garrett
  2007-03-28 21:54       ` Alan Cox
  0 siblings, 1 reply; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28 20:08 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 10:57:54AM +0100, Alan Cox wrote:

> Ok thanks. This is interesting as the only thing new it is doing is
> asking for the HPA size. Does I think explain the problem however: Can
> you move the HPA setting call to after the mode has been set and see if
> that makes the problem vanish ?

Hm. I tried adding it in the eh code after ata_set_mode() in 
ata_eh_recover(), which alters the problem slightly - hpa_sectors is 
still 0, so the taskfile call is still failing, but now the system just 
stops at around the time that anything attempts to access sda with no 
errors other than

sd: 2:0:1:0: timing out command, waited 180s
sd: 2:0:1:0: SCSI error: return code = 0x00000028
end_request: I/O error, dev sda, sector 0
Buffer I/O error on device sda, logical block 0

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28 21:54       ` Alan Cox
@ 2007-03-28 21:28         ` Matthew Garrett
  2007-03-28 21:30         ` Kyle McMartin
  1 sibling, 0 replies; 22+ messages in thread
From: Matthew Garrett @ 2007-03-28 21:28 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 10:54:31PM +0100, Alan Cox wrote:

> I wonder if the firmware is dying when we ask the disk to go zero sized
> rather than erroring politely. I'm not sure hth HPA sectors can come back
> as zero but we can be fairly sure 0 means "no HPA" in this case I guess ?

No, it seems to be looking at 0 because ata_read_native_max_address_ext 
returns 0 in the error case - the error that ata_exec_internal generates 
seems to be AC_ERR_HSM. Since 0 isn't > the size reported, we'll never 
try to resize it anyway, judging by ata_hpa_resize - that is, it seems 
to be the ata_read_native_max_address_ext call that breaks it.

-- 
Matthew Garrett | mjg59@srcf.ucam.org

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28 21:54       ` Alan Cox
  2007-03-28 21:28         ` Matthew Garrett
@ 2007-03-28 21:30         ` Kyle McMartin
  1 sibling, 0 replies; 22+ messages in thread
From: Kyle McMartin @ 2007-03-28 21:30 UTC (permalink / raw)
  To: Alan Cox; +Cc: Matthew Garrett, linux-kernel, linux-ide, kyle

On Wed, Mar 28, 2007 at 10:54:31PM +0100, Alan Cox wrote:
> > Hm. I tried adding it in the eh code after ata_set_mode() in 
> > ata_eh_recover(), which alters the problem slightly - hpa_sectors is 
> > still 0, so the taskfile call is still failing, but now the system just 
> > stops at around the time that anything attempts to access sda with no 
> > errors other than
> 
> I wonder if the firmware is dying when we ask the disk to go zero sized
> rather than erroring politely. I'm not sure hth HPA sectors can come back
> as zero but we can be fairly sure 0 means "no HPA" in this case I guess ?
> 

The command is "Read Native Max Sectors" which should be the full disk
size as long as the command is supported, and the size returned by IDENTIFY
would be smaller if HPA was in use.

AIUI at least.

Cheers,
	Kyle

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-28 20:08     ` Matthew Garrett
@ 2007-03-28 21:54       ` Alan Cox
  2007-03-28 21:28         ` Matthew Garrett
  2007-03-28 21:30         ` Kyle McMartin
  0 siblings, 2 replies; 22+ messages in thread
From: Alan Cox @ 2007-03-28 21:54 UTC (permalink / raw)
  To: Matthew Garrett; +Cc: linux-kernel, linux-ide, kyle

> Hm. I tried adding it in the eh code after ata_set_mode() in 
> ata_eh_recover(), which alters the problem slightly - hpa_sectors is 
> still 0, so the taskfile call is still failing, but now the system just 
> stops at around the time that anything attempts to access sda with no 
> errors other than

I wonder if the firmware is dying when we ask the disk to go zero sized
rather than erroring politely. I'm not sure hth HPA sectors can come back
as zero but we can be fairly sure 0 means "no HPA" in this case I guess ?


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-03-23 20:03     ` Randy Dunlap
  2007-03-23 21:47       ` Alan Cox
@ 2007-04-13  3:16       ` Kyle McMartin
  2007-04-13 10:56         ` Alan Cox
  1 sibling, 1 reply; 22+ messages in thread
From: Kyle McMartin @ 2007-04-13  3:16 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Alan Cox, linux-kernel, linux-ide, kyle

On Fri, Mar 23, 2007 at 01:03:15PM -0700, Randy Dunlap wrote:
> > It's 0x40. Its a "command dependant bit" - no useful name.
> 
> dependent.  OK, thanks.
> 

Hi,

Pondering about this, it's ATA_LBA according to the docs, specifying
that the address is an LBA.

Cheers,
	Kyle

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: HPA patches
  2007-04-13  3:16       ` Kyle McMartin
@ 2007-04-13 10:56         ` Alan Cox
  0 siblings, 0 replies; 22+ messages in thread
From: Alan Cox @ 2007-04-13 10:56 UTC (permalink / raw)
  To: Kyle McMartin; +Cc: Randy Dunlap, linux-kernel, linux-ide, kyle

> Pondering about this, it's ATA_LBA according to the docs, specifying
> that the address is an LBA.

This is true for some commands, but not all. It gets used for other stuff
too.

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2007-04-13 10:53 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-03-23 19:13 HPA patches Alan Cox
2007-03-23 18:24 ` Randy Dunlap
2007-03-23 20:08   ` Alan Cox
2007-03-23 19:22     ` David Miller
2007-03-23 21:51       ` Alan Cox
2007-03-23 20:03     ` Randy Dunlap
2007-03-23 21:47       ` Alan Cox
2007-03-23 22:47         ` Chuck Ebbert
2007-04-13  3:16       ` Kyle McMartin
2007-04-13 10:56         ` Alan Cox
2007-03-23 20:56 ` Matthew Garrett
2007-03-27  5:00   ` Jeff Garzik
2007-03-26 20:45 ` Kyle McMartin
2007-03-28  0:08 ` Matthew Garrett
2007-03-28  0:16   ` Matthew Garrett
2007-03-28  1:16     ` ata_piix can't drive Mac hardware properly Matthew Garrett
2007-03-28  4:07       ` Matthew Garrett
2007-03-28  9:57   ` HPA patches Alan Cox
2007-03-28 20:08     ` Matthew Garrett
2007-03-28 21:54       ` Alan Cox
2007-03-28 21:28         ` Matthew Garrett
2007-03-28 21:30         ` Kyle McMartin

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).