aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2014-11-05 07:08:22 -0500
committerTejun Heo <tj@kernel.org>2014-11-05 11:22:07 -0500
commitf9ca5ab832e7ac5bc2b6fe0e82ad46d536f436f9 (patch)
treeaaa569db1f8c16b3947fc3ba72ca398f4882214e
parent9162c6579bf90b3f5ddb7e3a6c6fa946c1b4cbeb (diff)
libata-scsi: Update SATL for ZAC drives
ZAC (zoned-access command) drives translate into ZBC (Zoned block command) device type for SCSI. So implement the correct mappings into libata-scsi and update the SCSI command set versions. Acked-by: Christoph Hellwig <hch@lst.de> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--drivers/ata/libata-scsi.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index bea6e7f4ebf0..1db6eab6dac3 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1969,6 +1969,7 @@ static void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
1969static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf) 1969static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
1970{ 1970{
1971 const u8 versions[] = { 1971 const u8 versions[] = {
1972 0x00,
1972 0x60, /* SAM-3 (no version claimed) */ 1973 0x60, /* SAM-3 (no version claimed) */
1973 1974
1974 0x03, 1975 0x03,
@@ -1977,6 +1978,20 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
1977 0x02, 1978 0x02,
1978 0x60 /* SPC-3 (no version claimed) */ 1979 0x60 /* SPC-3 (no version claimed) */
1979 }; 1980 };
1981 const u8 versions_zbc[] = {
1982 0x00,
1983 0xA0, /* SAM-5 (no version claimed) */
1984
1985 0x04,
1986 0xC0, /* SBC-3 (no version claimed) */
1987
1988 0x04,
1989 0x60, /* SPC-4 (no version claimed) */
1990
1991 0x60,
1992 0x20, /* ZBC (no version claimed) */
1993 };
1994
1980 u8 hdr[] = { 1995 u8 hdr[] = {
1981 TYPE_DISK, 1996 TYPE_DISK,
1982 0, 1997 0,
@@ -1991,6 +2006,11 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
1991 if (ata_id_removeable(args->id)) 2006 if (ata_id_removeable(args->id))
1992 hdr[1] |= (1 << 7); 2007 hdr[1] |= (1 << 7);
1993 2008
2009 if (args->dev->class == ATA_DEV_ZAC) {
2010 hdr[0] = TYPE_ZBC;
2011 hdr[2] = 0x6; /* ZBC is defined in SPC-4 */
2012 }
2013
1994 memcpy(rbuf, hdr, sizeof(hdr)); 2014 memcpy(rbuf, hdr, sizeof(hdr));
1995 memcpy(&rbuf[8], "ATA ", 8); 2015 memcpy(&rbuf[8], "ATA ", 8);
1996 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16); 2016 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
@@ -2003,7 +2023,10 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
2003 if (rbuf[32] == 0 || rbuf[32] == ' ') 2023 if (rbuf[32] == 0 || rbuf[32] == ' ')
2004 memcpy(&rbuf[32], "n/a ", 4); 2024 memcpy(&rbuf[32], "n/a ", 4);
2005 2025
2006 memcpy(rbuf + 59, versions, sizeof(versions)); 2026 if (args->dev->class == ATA_DEV_ZAC)
2027 memcpy(rbuf + 58, versions_zbc, sizeof(versions_zbc));
2028 else
2029 memcpy(rbuf + 58, versions, sizeof(versions));
2007 2030
2008 return 0; 2031 return 0;
2009} 2032}