]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata: Allow more quirks
authorNiklas Cassel <cassel@kernel.org>
Tue, 2 Dec 2025 12:21:36 +0000 (13:21 +0100)
committerDamien Le Moal <dlemoal@kernel.org>
Mon, 15 Dec 2025 07:32:05 +0000 (16:32 +0900)
We have currently used up 30 out of the 32-bits in the struct ata_device
struct member quirks. Thus, it is only possible to add two more quirks.

Change the struct ata_device struct member quirks from an unsigned int to
an u64.

Doing this core level change now, will make it easier for us now, as we
will not need to also do core level changes once the final two bits are
used as well.

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/libata.h

index 9b0efca03a7d5f3693fb252d1a3bcbdcf4f4148c..b9610548178456d5410b2b11a8552f07cae195ba 100644 (file)
@@ -76,8 +76,8 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
                                        u16 heads, u16 sectors);
 static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
 static void ata_dev_xfermask(struct ata_device *dev);
-static unsigned int ata_dev_quirks(const struct ata_device *dev);
-static u64 ata_dev_get_quirk_value(struct ata_device *dev, unsigned int quirk);
+static u64 ata_dev_quirks(const struct ata_device *dev);
+static u64 ata_dev_get_quirk_value(struct ata_device *dev, u64 quirk);
 
 static DEFINE_IDA(ata_ida);
 
@@ -88,8 +88,8 @@ struct ata_force_param {
        u8              cbl;
        u8              spd_limit;
        unsigned int    xfer_mask;
-       unsigned int    quirk_on;
-       unsigned int    quirk_off;
+       u64             quirk_on;
+       u64             quirk_off;
        unsigned int    pflags_on;
        u16             lflags_on;
        u16             lflags_off;
@@ -4088,7 +4088,7 @@ static const struct ata_dev_quirk_value __ata_dev_max_sec_quirks[] = {
 struct ata_dev_quirks_entry {
        const char *model_num;
        const char *model_rev;
-       unsigned int quirks;
+       u64 quirks;
 };
 
 static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
@@ -4377,14 +4377,14 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
        { }
 };
 
-static unsigned int ata_dev_quirks(const struct ata_device *dev)
+static u64 ata_dev_quirks(const struct ata_device *dev)
 {
        unsigned char model_num[ATA_ID_PROD_LEN + 1];
        unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
        const struct ata_dev_quirks_entry *ad = __ata_dev_quirks;
 
-       /* dev->quirks is an unsigned int. */
-       BUILD_BUG_ON(__ATA_QUIRK_MAX > 32);
+       /* dev->quirks is an u64. */
+       BUILD_BUG_ON(__ATA_QUIRK_MAX > 64);
 
        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));
@@ -4435,7 +4435,7 @@ out:
        return val;
 }
 
-static u64 ata_dev_get_quirk_value(struct ata_device *dev, unsigned int quirk)
+static u64 ata_dev_get_quirk_value(struct ata_device *dev, u64 quirk)
 {
        if (quirk == ATA_QUIRK_MAX_SEC)
                return ata_dev_get_max_sec_quirk_value(dev);
index 7e5cd1647353f99d0c4a565c98446eb89fd1aad6..aa88244f3d8385ea90eb228b5fbe2f6a8f333c09 100644 (file)
@@ -46,7 +46,7 @@
 
 /*
  * Quirk flags bits.
- * ata_device->quirks is an unsigned int, so __ATA_QUIRK_MAX must not exceed 32.
+ * ata_device->quirks is an u64, so __ATA_QUIRK_MAX must not exceed 64.
  */
 enum ata_quirks {
        __ATA_QUIRK_DIAGNOSTIC,         /* Failed boot diag */
@@ -89,36 +89,36 @@ enum ata_quirks {
  * Some quirks may be drive/controller pair dependent.
  */
 enum {
-       ATA_QUIRK_DIAGNOSTIC            = (1U << __ATA_QUIRK_DIAGNOSTIC),
-       ATA_QUIRK_NODMA                 = (1U << __ATA_QUIRK_NODMA),
-       ATA_QUIRK_NONCQ                 = (1U << __ATA_QUIRK_NONCQ),
-       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),
-       ATA_QUIRK_IVB                   = (1U << __ATA_QUIRK_IVB),
-       ATA_QUIRK_STUCK_ERR             = (1U << __ATA_QUIRK_STUCK_ERR),
-       ATA_QUIRK_BRIDGE_OK             = (1U << __ATA_QUIRK_BRIDGE_OK),
-       ATA_QUIRK_ATAPI_MOD16_DMA       = (1U << __ATA_QUIRK_ATAPI_MOD16_DMA),
-       ATA_QUIRK_FIRMWARE_WARN         = (1U << __ATA_QUIRK_FIRMWARE_WARN),
-       ATA_QUIRK_1_5_GBPS              = (1U << __ATA_QUIRK_1_5_GBPS),
-       ATA_QUIRK_NOSETXFER             = (1U << __ATA_QUIRK_NOSETXFER),
-       ATA_QUIRK_BROKEN_FPDMA_AA       = (1U << __ATA_QUIRK_BROKEN_FPDMA_AA),
-       ATA_QUIRK_DUMP_ID               = (1U << __ATA_QUIRK_DUMP_ID),
-       ATA_QUIRK_MAX_SEC_LBA48         = (1U << __ATA_QUIRK_MAX_SEC_LBA48),
-       ATA_QUIRK_ATAPI_DMADIR          = (1U << __ATA_QUIRK_ATAPI_DMADIR),
-       ATA_QUIRK_NO_NCQ_TRIM           = (1U << __ATA_QUIRK_NO_NCQ_TRIM),
-       ATA_QUIRK_NOLPM                 = (1U << __ATA_QUIRK_NOLPM),
-       ATA_QUIRK_WD_BROKEN_LPM         = (1U << __ATA_QUIRK_WD_BROKEN_LPM),
-       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               = (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),
-       ATA_QUIRK_NO_LPM_ON_ATI         = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),
-       ATA_QUIRK_NO_ID_DEV_LOG         = (1U << __ATA_QUIRK_NO_ID_DEV_LOG),
-       ATA_QUIRK_NO_LOG_DIR            = (1U << __ATA_QUIRK_NO_LOG_DIR),
-       ATA_QUIRK_NO_FUA                = (1U << __ATA_QUIRK_NO_FUA),
+       ATA_QUIRK_DIAGNOSTIC            = BIT_ULL(__ATA_QUIRK_DIAGNOSTIC),
+       ATA_QUIRK_NODMA                 = BIT_ULL(__ATA_QUIRK_NODMA),
+       ATA_QUIRK_NONCQ                 = BIT_ULL(__ATA_QUIRK_NONCQ),
+       ATA_QUIRK_BROKEN_HPA            = BIT_ULL(__ATA_QUIRK_BROKEN_HPA),
+       ATA_QUIRK_DISABLE               = BIT_ULL(__ATA_QUIRK_DISABLE),
+       ATA_QUIRK_HPA_SIZE              = BIT_ULL(__ATA_QUIRK_HPA_SIZE),
+       ATA_QUIRK_IVB                   = BIT_ULL(__ATA_QUIRK_IVB),
+       ATA_QUIRK_STUCK_ERR             = BIT_ULL(__ATA_QUIRK_STUCK_ERR),
+       ATA_QUIRK_BRIDGE_OK             = BIT_ULL(__ATA_QUIRK_BRIDGE_OK),
+       ATA_QUIRK_ATAPI_MOD16_DMA       = BIT_ULL(__ATA_QUIRK_ATAPI_MOD16_DMA),
+       ATA_QUIRK_FIRMWARE_WARN         = BIT_ULL(__ATA_QUIRK_FIRMWARE_WARN),
+       ATA_QUIRK_1_5_GBPS              = BIT_ULL(__ATA_QUIRK_1_5_GBPS),
+       ATA_QUIRK_NOSETXFER             = BIT_ULL(__ATA_QUIRK_NOSETXFER),
+       ATA_QUIRK_BROKEN_FPDMA_AA       = BIT_ULL(__ATA_QUIRK_BROKEN_FPDMA_AA),
+       ATA_QUIRK_DUMP_ID               = BIT_ULL(__ATA_QUIRK_DUMP_ID),
+       ATA_QUIRK_MAX_SEC_LBA48         = BIT_ULL(__ATA_QUIRK_MAX_SEC_LBA48),
+       ATA_QUIRK_ATAPI_DMADIR          = BIT_ULL(__ATA_QUIRK_ATAPI_DMADIR),
+       ATA_QUIRK_NO_NCQ_TRIM           = BIT_ULL(__ATA_QUIRK_NO_NCQ_TRIM),
+       ATA_QUIRK_NOLPM                 = BIT_ULL(__ATA_QUIRK_NOLPM),
+       ATA_QUIRK_WD_BROKEN_LPM         = BIT_ULL(__ATA_QUIRK_WD_BROKEN_LPM),
+       ATA_QUIRK_ZERO_AFTER_TRIM       = BIT_ULL(__ATA_QUIRK_ZERO_AFTER_TRIM),
+       ATA_QUIRK_NO_DMA_LOG            = BIT_ULL(__ATA_QUIRK_NO_DMA_LOG),
+       ATA_QUIRK_NOTRIM                = BIT_ULL(__ATA_QUIRK_NOTRIM),
+       ATA_QUIRK_MAX_SEC               = BIT_ULL(__ATA_QUIRK_MAX_SEC),
+       ATA_QUIRK_MAX_TRIM_128M         = BIT_ULL(__ATA_QUIRK_MAX_TRIM_128M),
+       ATA_QUIRK_NO_NCQ_ON_ATI         = BIT_ULL(__ATA_QUIRK_NO_NCQ_ON_ATI),
+       ATA_QUIRK_NO_LPM_ON_ATI         = BIT_ULL(__ATA_QUIRK_NO_LPM_ON_ATI),
+       ATA_QUIRK_NO_ID_DEV_LOG         = BIT_ULL(__ATA_QUIRK_NO_ID_DEV_LOG),
+       ATA_QUIRK_NO_LOG_DIR            = BIT_ULL(__ATA_QUIRK_NO_LOG_DIR),
+       ATA_QUIRK_NO_FUA                = BIT_ULL(__ATA_QUIRK_NO_FUA),
 };
 
 enum {
@@ -719,7 +719,7 @@ struct ata_cdl {
 struct ata_device {
        struct ata_link         *link;
        unsigned int            devno;          /* 0 or 1 */
-       unsigned int            quirks;         /* List of broken features */
+       u64                     quirks;         /* List of broken features */
        unsigned long           flags;          /* ATA_DFLAG_xxx */
        struct scsi_device      *sdev;          /* attached SCSI device */
        void                    *private_data;