Patchwork libata: Include WWN ID in inquiry VPD emulation

login
register
mail settings
Submitter Hannes Reinecke
Date March 4, 2011, 8:55 a.m.
Message ID <20110304085501.8B331F90E1@ochil.suse.de>
Download mbox | patch
Permalink /patch/85376/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Hannes Reinecke - March 4, 2011, 8:55 a.m.
As per SAT-3 the WWN ID should be included in the VPD page 0x83
(device identification) emulation.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/ata/libata-scsi.c |   11 +++++++++++
 include/linux/ata.h       |    9 +++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)
Sergei Shtylyov - March 4, 2011, 11:17 a.m.
Hello.

On 04-03-2011 11:55, Hannes Reinecke wrote:

> As per SAT-3 the WWN ID should be included in the VPD page 0x83
> (device identification) emulation.

> Signed-off-by: Hannes Reinecke<hare@suse.de>
[...]

> diff --git a/include/linux/ata.h b/include/linux/ata.h
> index 0c4929f..f62463e 100644
> --- a/include/linux/ata.h
> +++ b/include/linux/ata.h
[...]
> @@ -815,6 +817,13 @@ static inline int ata_id_has_unload(const u16 *id)
>   	return 0;
>   }
>
> +static inline int ata_id_has_wwn(const u16 *id)
> +{
> +	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
> +		return 0;
> +	return id[ATA_ID_CSF_DEFAULT] & (1 << 8);

    Could be compacted to:

	return (id[ATA_ID_CSF_DEFAULT] & 0xC100) == 0x4100;

WBR, Sergei
--
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
Hannes Reinecke - March 4, 2011, 11:36 a.m.
On 03/04/2011 12:17 PM, Sergei Shtylyov wrote:
> Hello.
> 
> On 04-03-2011 11:55, Hannes Reinecke wrote:
> 
>> As per SAT-3 the WWN ID should be included in the VPD page 0x83
>> (device identification) emulation.
> 
>> Signed-off-by: Hannes Reinecke<hare@suse.de>
> [...]
> 
>> diff --git a/include/linux/ata.h b/include/linux/ata.h
>> index 0c4929f..f62463e 100644
>> --- a/include/linux/ata.h
>> +++ b/include/linux/ata.h
> [...]
>> @@ -815,6 +817,13 @@ static inline int ata_id_has_unload(const u16 *id)
>>       return 0;
>>   }
>>
>> +static inline int ata_id_has_wwn(const u16 *id)
>> +{
>> +    if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
>> +        return 0;
>> +    return id[ATA_ID_CSF_DEFAULT] & (1 << 8);
> 
>    Could be compacted to:
> 
>     return (id[ATA_ID_CSF_DEFAULT] & 0xC100) == 0x4100;
> 
Indeed.

Will be reposting the patch if one of the libata gods gives it's
overall assent.

Tejun?

Cheers,

Hannes
Tejun Heo - March 4, 2011, 5:09 p.m.
Hello, Hannes.

On Fri, Mar 04, 2011 at 09:55:01AM +0100, Hannes Reinecke wrote:
> +static inline int ata_id_has_wwn(const u16 *id)
> +{
> +	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
> +		return 0;
> +	return id[ATA_ID_CSF_DEFAULT] & (1 << 8);
> +}

Can you please make this return bool?  Otherwise,

Acked-by: Tejun Heo <tj@kernel.org>

Thanks.
Jeff Garzik - March 4, 2011, 5:22 p.m.
On 03/04/2011 12:09 PM, Tejun Heo wrote:
> Hello, Hannes.
>
> On Fri, Mar 04, 2011 at 09:55:01AM +0100, Hannes Reinecke wrote:
>> +static inline int ata_id_has_wwn(const u16 *id)
>> +{
>> +	if ((id[ATA_ID_CSF_DEFAULT]&  0xC000) != 0x4000)
>> +		return 0;
>> +	return id[ATA_ID_CSF_DEFAULT]&  (1<<  8);
>> +}
>
> Can you please make this return bool?  Otherwise,

And if you're highly motivated, a separate patch to update 
include/linux/ata.h to return bool for obvious ata_id_has_xxx functions 
would be nice too.

But yes, including WWN here is just fine.


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

Patch

diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 600f635..e60d9e4 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -2056,6 +2056,17 @@  static unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf)
 		      ATA_ID_SERNO_LEN);
 	num += ATA_ID_SERNO_LEN;
 
+	if (ata_id_has_wwn(args->id)) {
+		/* SAT defined lu world wide name */
+		/* piv=0, assoc=lu, code_set=binary, designator=NAA */
+		rbuf[num + 0] = 1;
+		rbuf[num + 1] = 3;
+		rbuf[num + 3] = ATA_ID_WWN_LEN;
+		num += 4;
+		ata_id_string(args->id, (unsigned char *) rbuf + num,
+			      ATA_ID_WWN, ATA_ID_WWN_LEN);
+		num += ATA_ID_WWN_LEN;
+	}
 	rbuf[3] = num - 4;    /* page len (assume less than 256 bytes) */
 	return 0;
 }
diff --git a/include/linux/ata.h b/include/linux/ata.h
index 0c4929f..f62463e 100644
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -89,6 +89,7 @@  enum {
 	ATA_ID_SPG		= 98,
 	ATA_ID_LBA_CAPACITY_2	= 100,
 	ATA_ID_SECTOR_SIZE	= 106,
+	ATA_ID_WWN		= 108,
 	ATA_ID_LOGICAL_SECTOR_SIZE	= 117,	/* and 118 */
 	ATA_ID_LAST_LUN		= 126,
 	ATA_ID_DLF		= 128,
@@ -103,6 +104,7 @@  enum {
 	ATA_ID_SERNO_LEN	= 20,
 	ATA_ID_FW_REV_LEN	= 8,
 	ATA_ID_PROD_LEN		= 40,
+	ATA_ID_WWN_LEN		= 8,
 
 	ATA_PCI_CTL_OFS		= 2,
 
@@ -815,6 +817,13 @@  static inline int ata_id_has_unload(const u16 *id)
 	return 0;
 }
 
+static inline int ata_id_has_wwn(const u16 *id)
+{
+	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
+		return 0;
+	return id[ATA_ID_CSF_DEFAULT] & (1 << 8);
+}
+
 static inline int ata_id_form_factor(const u16 *id)
 {
 	u16 val = id[168];