Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ata: libata: Add ATA_QUIRK_MAX_SEC and convert all device quirks

Add a new quirk ATA_QUIRK_MAX_SEC, which has a separate table with device
specific values.

Convert all existing ATA_QUIRK_MAX_SEC_XXX device quirks in
__ata_dev_quirks to the new format.

Quirks ATA_QUIRK_MAX_SEC_128 and ATA_QUIRK_MAX_SEC_1024 cannot be removed
yet, since they are also used by libata.force, which functionally, is a
separate user of the quirks. The quirks will be removed once all users
have been converted to use the new format.

The quirk ATA_QUIRK_MAX_SEC_8191 can be removed since it has no equivalent
libata.force parameter.

Signed-off-by: Niklas Cassel <cassel@kernel.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>

authored by

Niklas Cassel and committed by
Damien Le Moal
59b7bb3d 151cabd1

+61 -12
+59 -9
drivers/ata/libata-core.c
··· 77 77 static unsigned int ata_dev_set_xfermode(struct ata_device *dev); 78 78 static void ata_dev_xfermask(struct ata_device *dev); 79 79 static unsigned int ata_dev_quirks(const struct ata_device *dev); 80 + static u64 ata_dev_get_quirk_value(struct ata_device *dev, unsigned int quirk); 80 81 81 82 static DEFINE_IDA(ata_ida); 82 83 ··· 3165 3164 dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_1024, 3166 3165 dev->max_sectors); 3167 3166 3168 - if (dev->quirks & ATA_QUIRK_MAX_SEC_8191) 3169 - dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_8191, 3170 - dev->max_sectors); 3167 + if (dev->quirks & ATA_QUIRK_MAX_SEC) 3168 + dev->max_sectors = min_t(unsigned int, dev->max_sectors, 3169 + ata_dev_get_quirk_value(dev, 3170 + ATA_QUIRK_MAX_SEC)); 3171 3171 3172 3172 if (dev->quirks & ATA_QUIRK_MAX_SEC_LBA48) 3173 3173 dev->max_sectors = ATA_MAX_SECTORS_LBA48; ··· 4022 4020 [__ATA_QUIRK_NO_DMA_LOG] = "nodmalog", 4023 4021 [__ATA_QUIRK_NOTRIM] = "notrim", 4024 4022 [__ATA_QUIRK_MAX_SEC_1024] = "maxsec1024", 4025 - [__ATA_QUIRK_MAX_SEC_8191] = "maxsec8191", 4023 + [__ATA_QUIRK_MAX_SEC] = "maxsec", 4026 4024 [__ATA_QUIRK_MAX_TRIM_128M] = "maxtrim128m", 4027 4025 [__ATA_QUIRK_NO_NCQ_ON_ATI] = "noncqonati", 4028 4026 [__ATA_QUIRK_NO_LPM_ON_ATI] = "nolpmonati", ··· 4066 4064 4067 4065 kfree(str); 4068 4066 } 4067 + 4068 + struct ata_dev_quirk_value { 4069 + const char *model_num; 4070 + const char *model_rev; 4071 + u64 val; 4072 + }; 4073 + 4074 + static const struct ata_dev_quirk_value __ata_dev_max_sec_quirks[] = { 4075 + { "TORiSAN DVD-ROM DRD-N216", NULL, 128 }, 4076 + { "ST380013AS", "3.20", 1024 }, 4077 + { "LITEON CX1-JB*-HP", NULL, 1024 }, 4078 + { "LITEON EP1-*", NULL, 1024 }, 4079 + { "DELLBOSS VD", "MV.R00-0", 8191 }, 4080 + { }, 4081 + }; 4069 4082 4070 4083 struct ata_dev_quirks_entry { 4071 4084 const char *model_num; ··· 4126 4109 { "ASMT109x- Config", NULL, ATA_QUIRK_DISABLE }, 4127 4110 4128 4111 /* Weird ATAPI devices */ 4129 - { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_QUIRK_MAX_SEC_128 }, 4112 + { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_QUIRK_MAX_SEC }, 4130 4113 { "QUANTUM DAT DAT72-000", NULL, ATA_QUIRK_ATAPI_MOD16_DMA }, 4131 4114 { "Slimtype DVD A DS8A8SH", NULL, ATA_QUIRK_MAX_SEC_LBA48 }, 4132 4115 { "Slimtype DVD A DS8A9SH", NULL, ATA_QUIRK_MAX_SEC_LBA48 }, ··· 4135 4118 * Causes silent data corruption with higher max sects. 4136 4119 * http://lkml.kernel.org/g/x49wpy40ysk.fsf@segfault.boston.devel.redhat.com 4137 4120 */ 4138 - { "ST380013AS", "3.20", ATA_QUIRK_MAX_SEC_1024 }, 4121 + { "ST380013AS", "3.20", ATA_QUIRK_MAX_SEC }, 4139 4122 4140 4123 /* 4141 4124 * These devices time out with higher max sects. 4142 4125 * https://bugzilla.kernel.org/show_bug.cgi?id=121671 4143 4126 */ 4144 - { "LITEON CX1-JB*-HP", NULL, ATA_QUIRK_MAX_SEC_1024 }, 4145 - { "LITEON EP1-*", NULL, ATA_QUIRK_MAX_SEC_1024 }, 4127 + { "LITEON CX1-JB*-HP", NULL, ATA_QUIRK_MAX_SEC }, 4128 + { "LITEON EP1-*", NULL, ATA_QUIRK_MAX_SEC }, 4146 4129 4147 4130 /* 4148 4131 * These devices time out with higher max sects. 4149 4132 * https://bugzilla.kernel.org/show_bug.cgi?id=220693 4150 4133 */ 4151 - { "DELLBOSS VD", "MV.R00-0", ATA_QUIRK_MAX_SEC_8191 }, 4134 + { "DELLBOSS VD", "MV.R00-0", ATA_QUIRK_MAX_SEC }, 4152 4135 4153 4136 /* Devices we expect to fail diagnostics */ 4154 4137 ··· 4395 4378 } 4396 4379 ad++; 4397 4380 } 4381 + return 0; 4382 + } 4383 + 4384 + static u64 ata_dev_get_max_sec_quirk_value(struct ata_device *dev) 4385 + { 4386 + unsigned char model_num[ATA_ID_PROD_LEN + 1]; 4387 + unsigned char model_rev[ATA_ID_FW_REV_LEN + 1]; 4388 + const struct ata_dev_quirk_value *ad = __ata_dev_max_sec_quirks; 4389 + u64 val = 0; 4390 + 4391 + ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num)); 4392 + ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev)); 4393 + 4394 + while (ad->model_num) { 4395 + if (glob_match(ad->model_num, model_num) && 4396 + (!ad->model_rev || glob_match(ad->model_rev, model_rev))) { 4397 + val = ad->val; 4398 + break; 4399 + } 4400 + ad++; 4401 + } 4402 + 4403 + ata_dev_warn(dev, "%s quirk is using value: %llu\n", 4404 + ata_quirk_names[__ATA_QUIRK_MAX_SEC], val); 4405 + 4406 + return val; 4407 + } 4408 + 4409 + static u64 ata_dev_get_quirk_value(struct ata_device *dev, unsigned int quirk) 4410 + { 4411 + if (quirk == ATA_QUIRK_MAX_SEC) 4412 + return ata_dev_get_max_sec_quirk_value(dev); 4413 + 4398 4414 return 0; 4399 4415 } 4400 4416
-1
include/linux/ata.h
··· 29 29 ATA_MAX_SECTORS_128 = 128, 30 30 ATA_MAX_SECTORS = 256, 31 31 ATA_MAX_SECTORS_1024 = 1024, 32 - ATA_MAX_SECTORS_8191 = 8191, 33 32 ATA_MAX_SECTORS_LBA48 = 65535,/* avoid count to be 0000h */ 34 33 ATA_MAX_SECTORS_TAPE = 65535, 35 34 ATA_MAX_TRIM_RNUM = 64, /* 512-byte payload / (6-byte LBA + 2-byte range per entry) */
+2 -2
include/linux/libata.h
··· 75 75 __ATA_QUIRK_NO_DMA_LOG, /* Do not use DMA for log read */ 76 76 __ATA_QUIRK_NOTRIM, /* Do not use TRIM */ 77 77 __ATA_QUIRK_MAX_SEC_1024, /* Limit max sects to 1024 */ 78 - __ATA_QUIRK_MAX_SEC_8191, /* Limit max sects to 8191 */ 78 + __ATA_QUIRK_MAX_SEC, /* Limit max sectors */ 79 79 __ATA_QUIRK_MAX_TRIM_128M, /* Limit max trim size to 128M */ 80 80 __ATA_QUIRK_NO_NCQ_ON_ATI, /* Disable NCQ on ATI chipset */ 81 81 __ATA_QUIRK_NO_LPM_ON_ATI, /* Disable LPM on ATI chipset */ ··· 116 116 ATA_QUIRK_NO_DMA_LOG = (1U << __ATA_QUIRK_NO_DMA_LOG), 117 117 ATA_QUIRK_NOTRIM = (1U << __ATA_QUIRK_NOTRIM), 118 118 ATA_QUIRK_MAX_SEC_1024 = (1U << __ATA_QUIRK_MAX_SEC_1024), 119 - ATA_QUIRK_MAX_SEC_8191 = (1U << __ATA_QUIRK_MAX_SEC_8191), 119 + ATA_QUIRK_MAX_SEC = (1U << __ATA_QUIRK_MAX_SEC), 120 120 ATA_QUIRK_MAX_TRIM_128M = (1U << __ATA_QUIRK_MAX_TRIM_128M), 121 121 ATA_QUIRK_NO_NCQ_ON_ATI = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI), 122 122 ATA_QUIRK_NO_LPM_ON_ATI = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),