]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata-core: Quirk DELLBOSS VD max_sectors
authorNiklas Cassel <cassel@kernel.org>
Mon, 1 Dec 2025 12:35:04 +0000 (13:35 +0100)
committerNiklas Cassel <cassel@kernel.org>
Tue, 2 Dec 2025 10:17:56 +0000 (11:17 +0100)
Commit 9b8b84879d4a ("block: Increase BLK_DEF_MAX_SECTORS_CAP") increased
the default max_sectors_kb from 1280 KiB to 4096 KiB.

DELLBOSS VD with FW rev MV.R00-0 times out when sending I/Os of size
4096 KiB.

Enable ATA_QUIRK_MAX_SEC, with value 8191 (sectors) for this device,
since any I/O with more sectors than that lead to I/O timeouts.

With this, the DELLBOSS VD SATA controller is usable again.

Cc: stable+noautosel@kernel.org # depends on Move quirk flags to their own enum
Fixes: 9b8b84879d4a ("block: Increase BLK_DEF_MAX_SECTORS_CAP")
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-core.c
include/linux/ata.h
include/linux/libata.h

index 2c737e63a0b966d5f928d2ef08a796cdcf3b90e2..08cc43b6bf4653d7babd08493fc7e8becfec0aa1 100644 (file)
@@ -3139,6 +3139,10 @@ int ata_dev_configure(struct ata_device *dev)
                dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_1024,
                                         dev->max_sectors);
 
+       if (dev->quirks & ATA_QUIRK_MAX_SEC_8191)
+               dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_8191,
+                                        dev->max_sectors);
+
        if (dev->quirks & ATA_QUIRK_MAX_SEC_LBA48)
                dev->max_sectors = ATA_MAX_SECTORS_LBA48;
 
@@ -3991,6 +3995,7 @@ static const char * const ata_quirk_names[] = {
        [__ATA_QUIRK_NO_DMA_LOG]        = "nodmalog",
        [__ATA_QUIRK_NOTRIM]            = "notrim",
        [__ATA_QUIRK_MAX_SEC_1024]      = "maxsec1024",
+       [__ATA_QUIRK_MAX_SEC_8191]      = "maxsec8191",
        [__ATA_QUIRK_MAX_TRIM_128M]     = "maxtrim128m",
        [__ATA_QUIRK_NO_NCQ_ON_ATI]     = "noncqonati",
        [__ATA_QUIRK_NO_LPM_ON_ATI]     = "nolpmonati",
@@ -4097,6 +4102,12 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
        { "LITEON CX1-JB*-HP",  NULL,           ATA_QUIRK_MAX_SEC_1024 },
        { "LITEON EP1-*",       NULL,           ATA_QUIRK_MAX_SEC_1024 },
 
+       /*
+        * These devices time out with higher max sects.
+        * https://bugzilla.kernel.org/show_bug.cgi?id=220693
+        */
+       { "DELLBOSS VD",        "MV.R00-0",     ATA_QUIRK_MAX_SEC_8191 },
+
        /* Devices we expect to fail diagnostics */
 
        /* Devices where NCQ should be avoided */
index 792e10a09787f8cf07b9d267afd28b5bacf685ee..1786e7b1165f7e91e921e39978951a3ad4da588a 100644 (file)
@@ -29,6 +29,7 @@ enum {
        ATA_MAX_SECTORS_128     = 128,
        ATA_MAX_SECTORS         = 256,
        ATA_MAX_SECTORS_1024    = 1024,
+       ATA_MAX_SECTORS_8191    = 8191,
        ATA_MAX_SECTORS_LBA48   = 65535,/* avoid count to be 0000h */
        ATA_MAX_SECTORS_TAPE    = 65535,
        ATA_MAX_TRIM_RNUM       = 64,   /* 512-byte payload / (6-byte LBA + 2-byte range per entry) */
index 9aa0541dc62dea24558f4e69ad447b73b7505464..abdc7b6f176c402d1b67dd966549806f8fbaeb0d 100644 (file)
@@ -75,6 +75,7 @@ enum ata_quirks {
        __ATA_QUIRK_NO_DMA_LOG,         /* Do not use DMA for log read */
        __ATA_QUIRK_NOTRIM,             /* Do not use TRIM */
        __ATA_QUIRK_MAX_SEC_1024,       /* Limit max sects to 1024 */
+       __ATA_QUIRK_MAX_SEC_8191,       /* Limit max sects to 8191 */
        __ATA_QUIRK_MAX_TRIM_128M,      /* Limit max trim size to 128M */
        __ATA_QUIRK_NO_NCQ_ON_ATI,      /* Disable NCQ on ATI chipset */
        __ATA_QUIRK_NO_LPM_ON_ATI,      /* Disable LPM on ATI chipset */
@@ -115,6 +116,7 @@ enum {
        ATA_QUIRK_NO_DMA_LOG            = (1U << __ATA_QUIRK_NO_DMA_LOG),
        ATA_QUIRK_NOTRIM                = (1U << __ATA_QUIRK_NOTRIM),
        ATA_QUIRK_MAX_SEC_1024          = (1U << __ATA_QUIRK_MAX_SEC_1024),
+       ATA_QUIRK_MAX_SEC_8191          = (1U << __ATA_QUIRK_MAX_SEC_8191),
        ATA_QUIRK_MAX_TRIM_128M         = (1U << __ATA_QUIRK_MAX_TRIM_128M),
        ATA_QUIRK_NO_NCQ_ON_ATI         = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),
        ATA_QUIRK_NO_LPM_ON_ATI         = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),