Skip to content

Commit 096571b

Browse files
committed
Merge tag 'ata-6.19-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux
Pull ata fix from Niklas Cassel: - The DELLBOSS VD SATA controller times out when sending I/Os of size 4096 KiB or larger, even though it claims LBA48 support, which per the ACS standard requires support for a maximum command size of 65535 sectors, i.e. 32 MiB - 512. Thus, quirk the device so that it sets a lower maximum command size (me) * tag 'ata-6.19-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux: ata: libata-core: Quirk DELLBOSS VD max_sectors ata: libata: Move quirk flags to their own enum
2 parents 001eefb + 2e98327 commit 096571b

3 files changed

Lines changed: 52 additions & 36 deletions

File tree

drivers/ata/libata-core.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3146,6 +3146,10 @@ int ata_dev_configure(struct ata_device *dev)
31463146
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_1024,
31473147
dev->max_sectors);
31483148

3149+
if (dev->quirks & ATA_QUIRK_MAX_SEC_8191)
3150+
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_8191,
3151+
dev->max_sectors);
3152+
31493153
if (dev->quirks & ATA_QUIRK_MAX_SEC_LBA48)
31503154
dev->max_sectors = ATA_MAX_SECTORS_LBA48;
31513155

@@ -3998,6 +4002,7 @@ static const char * const ata_quirk_names[] = {
39984002
[__ATA_QUIRK_NO_DMA_LOG] = "nodmalog",
39994003
[__ATA_QUIRK_NOTRIM] = "notrim",
40004004
[__ATA_QUIRK_MAX_SEC_1024] = "maxsec1024",
4005+
[__ATA_QUIRK_MAX_SEC_8191] = "maxsec8191",
40014006
[__ATA_QUIRK_MAX_TRIM_128M] = "maxtrim128m",
40024007
[__ATA_QUIRK_NO_NCQ_ON_ATI] = "noncqonati",
40034008
[__ATA_QUIRK_NO_LPM_ON_ATI] = "nolpmonati",
@@ -4104,6 +4109,12 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
41044109
{ "LITEON CX1-JB*-HP", NULL, ATA_QUIRK_MAX_SEC_1024 },
41054110
{ "LITEON EP1-*", NULL, ATA_QUIRK_MAX_SEC_1024 },
41064111

4112+
/*
4113+
* These devices time out with higher max sects.
4114+
* https://bugzilla.kernel.org/show_bug.cgi?id=220693
4115+
*/
4116+
{ "DELLBOSS VD", "MV.R00-0", ATA_QUIRK_MAX_SEC_8191 },
4117+
41074118
/* Devices we expect to fail diagnostics */
41084119

41094120
/* Devices where NCQ should be avoided */

include/linux/ata.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ enum {
2929
ATA_MAX_SECTORS_128 = 128,
3030
ATA_MAX_SECTORS = 256,
3131
ATA_MAX_SECTORS_1024 = 1024,
32+
ATA_MAX_SECTORS_8191 = 8191,
3233
ATA_MAX_SECTORS_LBA48 = 65535,/* avoid count to be 0000h */
3334
ATA_MAX_SECTORS_TAPE = 65535,
3435
ATA_MAX_TRIM_RNUM = 64, /* 512-byte payload / (6-byte LBA + 2-byte range per entry) */

include/linux/libata.h

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ enum ata_quirks {
7575
__ATA_QUIRK_NO_DMA_LOG, /* Do not use DMA for log read */
7676
__ATA_QUIRK_NOTRIM, /* Do not use TRIM */
7777
__ATA_QUIRK_MAX_SEC_1024, /* Limit max sects to 1024 */
78+
__ATA_QUIRK_MAX_SEC_8191, /* Limit max sects to 8191 */
7879
__ATA_QUIRK_MAX_TRIM_128M, /* Limit max trim size to 128M */
7980
__ATA_QUIRK_NO_NCQ_ON_ATI, /* Disable NCQ on ATI chipset */
8081
__ATA_QUIRK_NO_LPM_ON_ATI, /* Disable LPM on ATI chipset */
@@ -85,6 +86,45 @@ enum ata_quirks {
8586
__ATA_QUIRK_MAX,
8687
};
8788

89+
/*
90+
* Quirk flags: may be set by libata or controller drivers on drives.
91+
* Some quirks may be drive/controller pair dependent.
92+
*/
93+
enum {
94+
ATA_QUIRK_DIAGNOSTIC = (1U << __ATA_QUIRK_DIAGNOSTIC),
95+
ATA_QUIRK_NODMA = (1U << __ATA_QUIRK_NODMA),
96+
ATA_QUIRK_NONCQ = (1U << __ATA_QUIRK_NONCQ),
97+
ATA_QUIRK_MAX_SEC_128 = (1U << __ATA_QUIRK_MAX_SEC_128),
98+
ATA_QUIRK_BROKEN_HPA = (1U << __ATA_QUIRK_BROKEN_HPA),
99+
ATA_QUIRK_DISABLE = (1U << __ATA_QUIRK_DISABLE),
100+
ATA_QUIRK_HPA_SIZE = (1U << __ATA_QUIRK_HPA_SIZE),
101+
ATA_QUIRK_IVB = (1U << __ATA_QUIRK_IVB),
102+
ATA_QUIRK_STUCK_ERR = (1U << __ATA_QUIRK_STUCK_ERR),
103+
ATA_QUIRK_BRIDGE_OK = (1U << __ATA_QUIRK_BRIDGE_OK),
104+
ATA_QUIRK_ATAPI_MOD16_DMA = (1U << __ATA_QUIRK_ATAPI_MOD16_DMA),
105+
ATA_QUIRK_FIRMWARE_WARN = (1U << __ATA_QUIRK_FIRMWARE_WARN),
106+
ATA_QUIRK_1_5_GBPS = (1U << __ATA_QUIRK_1_5_GBPS),
107+
ATA_QUIRK_NOSETXFER = (1U << __ATA_QUIRK_NOSETXFER),
108+
ATA_QUIRK_BROKEN_FPDMA_AA = (1U << __ATA_QUIRK_BROKEN_FPDMA_AA),
109+
ATA_QUIRK_DUMP_ID = (1U << __ATA_QUIRK_DUMP_ID),
110+
ATA_QUIRK_MAX_SEC_LBA48 = (1U << __ATA_QUIRK_MAX_SEC_LBA48),
111+
ATA_QUIRK_ATAPI_DMADIR = (1U << __ATA_QUIRK_ATAPI_DMADIR),
112+
ATA_QUIRK_NO_NCQ_TRIM = (1U << __ATA_QUIRK_NO_NCQ_TRIM),
113+
ATA_QUIRK_NOLPM = (1U << __ATA_QUIRK_NOLPM),
114+
ATA_QUIRK_WD_BROKEN_LPM = (1U << __ATA_QUIRK_WD_BROKEN_LPM),
115+
ATA_QUIRK_ZERO_AFTER_TRIM = (1U << __ATA_QUIRK_ZERO_AFTER_TRIM),
116+
ATA_QUIRK_NO_DMA_LOG = (1U << __ATA_QUIRK_NO_DMA_LOG),
117+
ATA_QUIRK_NOTRIM = (1U << __ATA_QUIRK_NOTRIM),
118+
ATA_QUIRK_MAX_SEC_1024 = (1U << __ATA_QUIRK_MAX_SEC_1024),
119+
ATA_QUIRK_MAX_SEC_8191 = (1U << __ATA_QUIRK_MAX_SEC_8191),
120+
ATA_QUIRK_MAX_TRIM_128M = (1U << __ATA_QUIRK_MAX_TRIM_128M),
121+
ATA_QUIRK_NO_NCQ_ON_ATI = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),
122+
ATA_QUIRK_NO_LPM_ON_ATI = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),
123+
ATA_QUIRK_NO_ID_DEV_LOG = (1U << __ATA_QUIRK_NO_ID_DEV_LOG),
124+
ATA_QUIRK_NO_LOG_DIR = (1U << __ATA_QUIRK_NO_LOG_DIR),
125+
ATA_QUIRK_NO_FUA = (1U << __ATA_QUIRK_NO_FUA),
126+
};
127+
88128
enum {
89129
/* various global constants */
90130
LIBATA_MAX_PRD = ATA_MAX_PRD / 2,
@@ -390,42 +430,6 @@ enum {
390430
*/
391431
ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 8,
392432

393-
/*
394-
* Quirk flags: may be set by libata or controller drivers on drives.
395-
* Some quirks may be drive/controller pair dependent.
396-
*/
397-
ATA_QUIRK_DIAGNOSTIC = (1U << __ATA_QUIRK_DIAGNOSTIC),
398-
ATA_QUIRK_NODMA = (1U << __ATA_QUIRK_NODMA),
399-
ATA_QUIRK_NONCQ = (1U << __ATA_QUIRK_NONCQ),
400-
ATA_QUIRK_MAX_SEC_128 = (1U << __ATA_QUIRK_MAX_SEC_128),
401-
ATA_QUIRK_BROKEN_HPA = (1U << __ATA_QUIRK_BROKEN_HPA),
402-
ATA_QUIRK_DISABLE = (1U << __ATA_QUIRK_DISABLE),
403-
ATA_QUIRK_HPA_SIZE = (1U << __ATA_QUIRK_HPA_SIZE),
404-
ATA_QUIRK_IVB = (1U << __ATA_QUIRK_IVB),
405-
ATA_QUIRK_STUCK_ERR = (1U << __ATA_QUIRK_STUCK_ERR),
406-
ATA_QUIRK_BRIDGE_OK = (1U << __ATA_QUIRK_BRIDGE_OK),
407-
ATA_QUIRK_ATAPI_MOD16_DMA = (1U << __ATA_QUIRK_ATAPI_MOD16_DMA),
408-
ATA_QUIRK_FIRMWARE_WARN = (1U << __ATA_QUIRK_FIRMWARE_WARN),
409-
ATA_QUIRK_1_5_GBPS = (1U << __ATA_QUIRK_1_5_GBPS),
410-
ATA_QUIRK_NOSETXFER = (1U << __ATA_QUIRK_NOSETXFER),
411-
ATA_QUIRK_BROKEN_FPDMA_AA = (1U << __ATA_QUIRK_BROKEN_FPDMA_AA),
412-
ATA_QUIRK_DUMP_ID = (1U << __ATA_QUIRK_DUMP_ID),
413-
ATA_QUIRK_MAX_SEC_LBA48 = (1U << __ATA_QUIRK_MAX_SEC_LBA48),
414-
ATA_QUIRK_ATAPI_DMADIR = (1U << __ATA_QUIRK_ATAPI_DMADIR),
415-
ATA_QUIRK_NO_NCQ_TRIM = (1U << __ATA_QUIRK_NO_NCQ_TRIM),
416-
ATA_QUIRK_NOLPM = (1U << __ATA_QUIRK_NOLPM),
417-
ATA_QUIRK_WD_BROKEN_LPM = (1U << __ATA_QUIRK_WD_BROKEN_LPM),
418-
ATA_QUIRK_ZERO_AFTER_TRIM = (1U << __ATA_QUIRK_ZERO_AFTER_TRIM),
419-
ATA_QUIRK_NO_DMA_LOG = (1U << __ATA_QUIRK_NO_DMA_LOG),
420-
ATA_QUIRK_NOTRIM = (1U << __ATA_QUIRK_NOTRIM),
421-
ATA_QUIRK_MAX_SEC_1024 = (1U << __ATA_QUIRK_MAX_SEC_1024),
422-
ATA_QUIRK_MAX_TRIM_128M = (1U << __ATA_QUIRK_MAX_TRIM_128M),
423-
ATA_QUIRK_NO_NCQ_ON_ATI = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),
424-
ATA_QUIRK_NO_LPM_ON_ATI = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),
425-
ATA_QUIRK_NO_ID_DEV_LOG = (1U << __ATA_QUIRK_NO_ID_DEV_LOG),
426-
ATA_QUIRK_NO_LOG_DIR = (1U << __ATA_QUIRK_NO_LOG_DIR),
427-
ATA_QUIRK_NO_FUA = (1U << __ATA_QUIRK_NO_FUA),
428-
429433
/* User visible DMA mask for DMA control. DO NOT renumber. */
430434
ATA_DMA_MASK_ATA = (1 << 0), /* DMA on ATA Disk */
431435
ATA_DMA_MASK_ATAPI = (1 << 1), /* DMA on ATAPI */

0 commit comments

Comments
 (0)