]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata: Change libata.force to use the generic ATA_QUIRK_MAX_SEC quirk
authorNiklas Cassel <cassel@kernel.org>
Tue, 2 Dec 2025 12:21:33 +0000 (13:21 +0100)
committerDamien Le Moal <dlemoal@kernel.org>
Mon, 15 Dec 2025 07:32:05 +0000 (16:32 +0900)
Modify the existing libata.force parameters "max_sec_128" and
"max_sec_1024" to use the generic ATA_QUIRK_MAX_SEC quirk rather than
individual quirks.

This also allows us to remove the individual quirks ATA_QUIRK_MAX_SEC_128
and ATA_QUIRK_MAX_SEC_1024.

Signed-off-by: Niklas Cassel <cassel@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
drivers/ata/libata-core.c
include/linux/ata.h
include/linux/libata.h

index 1779cd5a1cbb084664b425760de52078cf8dfb16..cf7b57d048a3c5f2c8dcc80a439b1d3c03f27897 100644 (file)
@@ -84,6 +84,7 @@ static DEFINE_IDA(ata_ida);
 #ifdef CONFIG_ATA_FORCE
 struct ata_force_param {
        const char      *name;
+       u64             value;
        u8              cbl;
        u8              spd_limit;
        unsigned int    xfer_mask;
@@ -3169,14 +3170,6 @@ int ata_dev_configure(struct ata_device *dev)
                dev->quirks |= ATA_QUIRK_STUCK_ERR;
        }
 
-       if (dev->quirks & ATA_QUIRK_MAX_SEC_128)
-               dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
-                                        dev->max_sectors);
-
-       if (dev->quirks & ATA_QUIRK_MAX_SEC_1024)
-               dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_1024,
-                                        dev->max_sectors);
-
        if (dev->quirks & ATA_QUIRK_MAX_SEC)
                dev->max_sectors = min_t(unsigned int, dev->max_sectors,
                                         ata_dev_get_quirk_value(dev,
@@ -4012,7 +4005,6 @@ static const char * const ata_quirk_names[] = {
        [__ATA_QUIRK_DIAGNOSTIC]        = "diagnostic",
        [__ATA_QUIRK_NODMA]             = "nodma",
        [__ATA_QUIRK_NONCQ]             = "noncq",
-       [__ATA_QUIRK_MAX_SEC_128]       = "maxsec128",
        [__ATA_QUIRK_BROKEN_HPA]        = "brokenhpa",
        [__ATA_QUIRK_DISABLE]           = "disable",
        [__ATA_QUIRK_HPA_SIZE]          = "hpasize",
@@ -4033,7 +4025,6 @@ static const char * const ata_quirk_names[] = {
        [__ATA_QUIRK_ZERO_AFTER_TRIM]   = "zeroaftertrim",
        [__ATA_QUIRK_NO_DMA_LOG]        = "nodmalog",
        [__ATA_QUIRK_NOTRIM]            = "notrim",
-       [__ATA_QUIRK_MAX_SEC_1024]      = "maxsec1024",
        [__ATA_QUIRK_MAX_SEC]           = "maxsec",
        [__ATA_QUIRK_MAX_TRIM_128M]     = "maxtrim128m",
        [__ATA_QUIRK_NO_NCQ_ON_ATI]     = "noncqonati",
@@ -4417,6 +4408,14 @@ static u64 ata_dev_get_max_sec_quirk_value(struct ata_device *dev)
        const struct ata_dev_quirk_value *ad = __ata_dev_max_sec_quirks;
        u64 val = 0;
 
+#ifdef CONFIG_ATA_FORCE
+       const struct ata_force_ent *fe = ata_force_get_fe_for_dev(dev);
+       if (fe && (fe->param.quirk_on & ATA_QUIRK_MAX_SEC) && fe->param.value)
+               val = fe->param.value;
+#endif
+       if (val)
+               goto out;
+
        ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
        ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
 
@@ -4429,6 +4428,7 @@ static u64 ata_dev_get_max_sec_quirk_value(struct ata_device *dev)
                ad++;
        }
 
+out:
        ata_dev_warn(dev, "%s quirk is using value: %llu\n",
                     ata_quirk_names[__ATA_QUIRK_MAX_SEC], val);
 
@@ -6482,6 +6482,10 @@ EXPORT_SYMBOL_GPL(ata_platform_remove_one);
 #define force_quirk_on(name, flag)                     \
        { #name,        .quirk_on       = (flag) }
 
+#define force_quirk_val(name, flag, val)               \
+       { #name,        .quirk_on       = (flag),       \
+                       .value          = (val) }
+
 #define force_quirk_onoff(name, flag)                  \
        { "no" #name,   .quirk_on       = (flag) },     \
        { #name,        .quirk_off      = (flag) }
@@ -6556,8 +6560,8 @@ static const struct ata_force_param force_tbl[] __initconst = {
        force_quirk_onoff(iddevlog,     ATA_QUIRK_NO_ID_DEV_LOG),
        force_quirk_onoff(logdir,       ATA_QUIRK_NO_LOG_DIR),
 
-       force_quirk_on(max_sec_128,     ATA_QUIRK_MAX_SEC_128),
-       force_quirk_on(max_sec_1024,    ATA_QUIRK_MAX_SEC_1024),
+       force_quirk_val(max_sec_128,    ATA_QUIRK_MAX_SEC,      128),
+       force_quirk_val(max_sec_1024,   ATA_QUIRK_MAX_SEC,      1024),
        force_quirk_on(max_sec_lba48,   ATA_QUIRK_MAX_SEC_LBA48),
 
        force_quirk_onoff(lpm,          ATA_QUIRK_NOLPM),
index c9013e472aa3d508ee76484d920b7ad0f9151b2d..8fd48bcb2a46ce021dee041d9057ebb3217c3b9a 100644 (file)
@@ -26,9 +26,7 @@ enum {
        ATA_MAX_DEVICES         = 2,    /* per bus/port */
        ATA_MAX_PRD             = 256,  /* we could make these 256/256 */
        ATA_SECT_SIZE           = 512,
-       ATA_MAX_SECTORS_128     = 128,
        ATA_MAX_SECTORS         = 256,
-       ATA_MAX_SECTORS_1024    = 1024,
        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 11b6a44572acd3cd63683a2bbaacd9a189dc5384..7e5cd1647353f99d0c4a565c98446eb89fd1aad6 100644 (file)
@@ -52,7 +52,6 @@ enum ata_quirks {
        __ATA_QUIRK_DIAGNOSTIC,         /* Failed boot diag */
        __ATA_QUIRK_NODMA,              /* DMA problems */
        __ATA_QUIRK_NONCQ,              /* Don't use NCQ */
-       __ATA_QUIRK_MAX_SEC_128,        /* Limit max sects to 128 */
        __ATA_QUIRK_BROKEN_HPA,         /* Broken HPA */
        __ATA_QUIRK_DISABLE,            /* Disable it */
        __ATA_QUIRK_HPA_SIZE,           /* Native size off by one */
@@ -74,7 +73,6 @@ enum ata_quirks {
        __ATA_QUIRK_ZERO_AFTER_TRIM,    /* Guarantees zero after trim */
        __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,            /* Limit max sectors */
        __ATA_QUIRK_MAX_TRIM_128M,      /* Limit max trim size to 128M */
        __ATA_QUIRK_NO_NCQ_ON_ATI,      /* Disable NCQ on ATI chipset */
@@ -94,7 +92,6 @@ enum {
        ATA_QUIRK_DIAGNOSTIC            = (1U << __ATA_QUIRK_DIAGNOSTIC),
        ATA_QUIRK_NODMA                 = (1U << __ATA_QUIRK_NODMA),
        ATA_QUIRK_NONCQ                 = (1U << __ATA_QUIRK_NONCQ),
-       ATA_QUIRK_MAX_SEC_128           = (1U << __ATA_QUIRK_MAX_SEC_128),
        ATA_QUIRK_BROKEN_HPA            = (1U << __ATA_QUIRK_BROKEN_HPA),
        ATA_QUIRK_DISABLE               = (1U << __ATA_QUIRK_DISABLE),
        ATA_QUIRK_HPA_SIZE              = (1U << __ATA_QUIRK_HPA_SIZE),
@@ -115,7 +112,6 @@ enum {
        ATA_QUIRK_ZERO_AFTER_TRIM       = (1U << __ATA_QUIRK_ZERO_AFTER_TRIM),
        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               = (1U << __ATA_QUIRK_MAX_SEC),
        ATA_QUIRK_MAX_TRIM_128M         = (1U << __ATA_QUIRK_MAX_TRIM_128M),
        ATA_QUIRK_NO_NCQ_ON_ATI         = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),