diff options
| -rw-r--r-- | drivers/ata/libata-scsi.c | 19 | ||||
| -rw-r--r-- | include/linux/ata.h | 5 |
2 files changed, 15 insertions, 9 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 43403aa0801f..96abd42c9985 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -2082,14 +2082,14 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf) | |||
| 2082 | 0x00, | 2082 | 0x00, |
| 2083 | 0xA0, /* SAM-5 (no version claimed) */ | 2083 | 0xA0, /* SAM-5 (no version claimed) */ |
| 2084 | 2084 | ||
| 2085 | 0x04, | 2085 | 0x06, |
| 2086 | 0xC0, /* SBC-3 (no version claimed) */ | 2086 | 0x00, /* SBC-4 (no version claimed) */ |
| 2087 | 2087 | ||
| 2088 | 0x04, | 2088 | 0x05, |
| 2089 | 0x60, /* SPC-4 (no version claimed) */ | 2089 | 0xC0, /* SPC-5 (no version claimed) */ |
| 2090 | 2090 | ||
| 2091 | 0x60, | 2091 | 0x60, |
| 2092 | 0x20, /* ZBC (no version claimed) */ | 2092 | 0x24, /* ZBC r05 */ |
| 2093 | }; | 2093 | }; |
| 2094 | 2094 | ||
| 2095 | u8 hdr[] = { | 2095 | u8 hdr[] = { |
| @@ -2109,10 +2109,8 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf) | |||
| 2109 | (args->dev->link->ap->pflags & ATA_PFLAG_EXTERNAL)) | 2109 | (args->dev->link->ap->pflags & ATA_PFLAG_EXTERNAL)) |
| 2110 | hdr[1] |= (1 << 7); | 2110 | hdr[1] |= (1 << 7); |
| 2111 | 2111 | ||
| 2112 | if (args->dev->class == ATA_DEV_ZAC) { | 2112 | if (args->dev->class == ATA_DEV_ZAC) |
| 2113 | hdr[0] = TYPE_ZBC; | 2113 | hdr[0] = TYPE_ZBC; |
| 2114 | hdr[2] = 0x6; /* ZBC is defined in SPC-4 */ | ||
| 2115 | } | ||
| 2116 | 2114 | ||
| 2117 | memcpy(rbuf, hdr, sizeof(hdr)); | 2115 | memcpy(rbuf, hdr, sizeof(hdr)); |
| 2118 | memcpy(&rbuf[8], "ATA ", 8); | 2116 | memcpy(&rbuf[8], "ATA ", 8); |
| @@ -2126,7 +2124,7 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf) | |||
| 2126 | if (rbuf[32] == 0 || rbuf[32] == ' ') | 2124 | if (rbuf[32] == 0 || rbuf[32] == ' ') |
| 2127 | memcpy(&rbuf[32], "n/a ", 4); | 2125 | memcpy(&rbuf[32], "n/a ", 4); |
| 2128 | 2126 | ||
| 2129 | if (args->dev->class == ATA_DEV_ZAC) | 2127 | if (ata_id_zoned_cap(args->id) || args->dev->class == ATA_DEV_ZAC) |
| 2130 | memcpy(rbuf + 58, versions_zbc, sizeof(versions_zbc)); | 2128 | memcpy(rbuf + 58, versions_zbc, sizeof(versions_zbc)); |
| 2131 | else | 2129 | else |
| 2132 | memcpy(rbuf + 58, versions, sizeof(versions)); | 2130 | memcpy(rbuf + 58, versions, sizeof(versions)); |
| @@ -2322,12 +2320,15 @@ static unsigned int ata_scsiop_inq_b1(struct ata_scsi_args *args, u8 *rbuf) | |||
| 2322 | { | 2320 | { |
| 2323 | int form_factor = ata_id_form_factor(args->id); | 2321 | int form_factor = ata_id_form_factor(args->id); |
| 2324 | int media_rotation_rate = ata_id_rotation_rate(args->id); | 2322 | int media_rotation_rate = ata_id_rotation_rate(args->id); |
| 2323 | u8 zoned = ata_id_zoned_cap(args->id); | ||
| 2325 | 2324 | ||
| 2326 | rbuf[1] = 0xb1; | 2325 | rbuf[1] = 0xb1; |
| 2327 | rbuf[3] = 0x3c; | 2326 | rbuf[3] = 0x3c; |
| 2328 | rbuf[4] = media_rotation_rate >> 8; | 2327 | rbuf[4] = media_rotation_rate >> 8; |
| 2329 | rbuf[5] = media_rotation_rate; | 2328 | rbuf[5] = media_rotation_rate; |
| 2330 | rbuf[7] = form_factor; | 2329 | rbuf[7] = form_factor; |
| 2330 | if (zoned) | ||
| 2331 | rbuf[8] = (zoned << 4); | ||
| 2331 | 2332 | ||
| 2332 | return 0; | 2333 | return 0; |
| 2333 | } | 2334 | } |
diff --git a/include/linux/ata.h b/include/linux/ata.h index e62703201e84..ac1cb9310dea 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -935,6 +935,11 @@ static inline bool ata_id_is_ssd(const u16 *id) | |||
| 935 | return id[ATA_ID_ROT_SPEED] == 0x01; | 935 | return id[ATA_ID_ROT_SPEED] == 0x01; |
| 936 | } | 936 | } |
| 937 | 937 | ||
| 938 | static inline u8 ata_id_zoned_cap(const u16 *id) | ||
| 939 | { | ||
| 940 | return (id[ATA_ID_ADDITIONAL_SUPP] & 0x3); | ||
| 941 | } | ||
| 942 | |||
| 938 | static inline bool ata_id_pio_need_iordy(const u16 *id, const u8 pio) | 943 | static inline bool ata_id_pio_need_iordy(const u16 *id, const u8 pio) |
| 939 | { | 944 | { |
| 940 | /* CF spec. r4.1 Table 22 says no IORDY on PIO5 and PIO6. */ | 945 | /* CF spec. r4.1 Table 22 says no IORDY on PIO5 and PIO6. */ |
