libata: Include WWN ID in inquiry VPD emulation
authorHannes Reinecke <hare@suse.de>
Mon, 7 Mar 2011 07:56:44 +0000 (08:56 +0100)
committerJeff Garzik <jgarzik@pobox.com>
Mon, 14 Mar 2011 06:59:37 +0000 (02:59 -0400)
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>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/ata/libata-scsi.c
include/linux/ata.h

index c11675f34b93fc1dca8171cb5ccddecf7b99914f..a834199913576057467884dcd41ea0b1bc22ec80 100644 (file)
@@ -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;
 }
index 0c4929fa34d31da64a79bd22dbfdccd8aaba33dc..198e1ea2b2eb530b799de6bc309a61c6bffbe91b 100644 (file)
@@ -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,11 @@ static inline int ata_id_has_unload(const u16 *id)
        return 0;
 }
 
+static inline bool ata_id_has_wwn(const u16 *id)
+{
+       return (id[ATA_ID_CSF_DEFAULT] & 0xC100) == 0x4100;
+}
+
 static inline int ata_id_form_factor(const u16 *id)
 {
        u16 val = id[168];