diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 182 |
1 files changed, 144 insertions, 38 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index c232729f5b1b..9236e40ac055 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -2156,7 +2156,7 @@ static void quirk_blacklist_vpd(struct pci_dev *dev) | |||
2156 | { | 2156 | { |
2157 | if (dev->vpd) { | 2157 | if (dev->vpd) { |
2158 | dev->vpd->len = 0; | 2158 | dev->vpd->len = 0; |
2159 | dev_warn(&dev->dev, FW_BUG "VPD access disabled\n"); | 2159 | dev_warn(&dev->dev, FW_BUG "disabling VPD access (can't determine size of non-standard VPD format)\n"); |
2160 | } | 2160 | } |
2161 | } | 2161 | } |
2162 | 2162 | ||
@@ -3137,8 +3137,9 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b5, quirk_remove_d3_delay); | |||
3137 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b7, quirk_remove_d3_delay); | 3137 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b7, quirk_remove_d3_delay); |
3138 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2298, quirk_remove_d3_delay); | 3138 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2298, quirk_remove_d3_delay); |
3139 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x229c, quirk_remove_d3_delay); | 3139 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x229c, quirk_remove_d3_delay); |
3140 | |||
3140 | /* | 3141 | /* |
3141 | * Some devices may pass our check in pci_intx_mask_supported if | 3142 | * Some devices may pass our check in pci_intx_mask_supported() if |
3142 | * PCI_COMMAND_INTX_DISABLE works though they actually do not properly | 3143 | * PCI_COMMAND_INTX_DISABLE works though they actually do not properly |
3143 | * support this feature. | 3144 | * support this feature. |
3144 | */ | 3145 | */ |
@@ -3146,53 +3147,139 @@ static void quirk_broken_intx_masking(struct pci_dev *dev) | |||
3146 | { | 3147 | { |
3147 | dev->broken_intx_masking = 1; | 3148 | dev->broken_intx_masking = 1; |
3148 | } | 3149 | } |
3149 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CHELSIO, 0x0030, | 3150 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x0030, |
3150 | quirk_broken_intx_masking); | 3151 | quirk_broken_intx_masking); |
3151 | DECLARE_PCI_FIXUP_HEADER(0x1814, 0x0601, /* Ralink RT2800 802.11n PCI */ | 3152 | DECLARE_PCI_FIXUP_FINAL(0x1814, 0x0601, /* Ralink RT2800 802.11n PCI */ |
3152 | quirk_broken_intx_masking); | 3153 | quirk_broken_intx_masking); |
3154 | |||
3153 | /* | 3155 | /* |
3154 | * Realtek RTL8169 PCI Gigabit Ethernet Controller (rev 10) | 3156 | * Realtek RTL8169 PCI Gigabit Ethernet Controller (rev 10) |
3155 | * Subsystem: Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC | 3157 | * Subsystem: Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC |
3156 | * | 3158 | * |
3157 | * RTL8110SC - Fails under PCI device assignment using DisINTx masking. | 3159 | * RTL8110SC - Fails under PCI device assignment using DisINTx masking. |
3158 | */ | 3160 | */ |
3159 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, | 3161 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REALTEK, 0x8169, |
3160 | quirk_broken_intx_masking); | 3162 | quirk_broken_intx_masking); |
3161 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, | ||
3162 | quirk_broken_intx_masking); | ||
3163 | 3163 | ||
3164 | /* | 3164 | /* |
3165 | * Intel i40e (XL710/X710) 10/20/40GbE NICs all have broken INTx masking, | 3165 | * Intel i40e (XL710/X710) 10/20/40GbE NICs all have broken INTx masking, |
3166 | * DisINTx can be set but the interrupt status bit is non-functional. | 3166 | * DisINTx can be set but the interrupt status bit is non-functional. |
3167 | */ | 3167 | */ |
3168 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1572, | 3168 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1572, |
3169 | quirk_broken_intx_masking); | 3169 | quirk_broken_intx_masking); |
3170 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1574, | 3170 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1574, |
3171 | quirk_broken_intx_masking); | 3171 | quirk_broken_intx_masking); |
3172 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1580, | 3172 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1580, |
3173 | quirk_broken_intx_masking); | 3173 | quirk_broken_intx_masking); |
3174 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1581, | 3174 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1581, |
3175 | quirk_broken_intx_masking); | 3175 | quirk_broken_intx_masking); |
3176 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1583, | 3176 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1583, |
3177 | quirk_broken_intx_masking); | 3177 | quirk_broken_intx_masking); |
3178 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1584, | 3178 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1584, |
3179 | quirk_broken_intx_masking); | 3179 | quirk_broken_intx_masking); |
3180 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1585, | 3180 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1585, |
3181 | quirk_broken_intx_masking); | 3181 | quirk_broken_intx_masking); |
3182 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1586, | 3182 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1586, |
3183 | quirk_broken_intx_masking); | 3183 | quirk_broken_intx_masking); |
3184 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1587, | 3184 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1587, |
3185 | quirk_broken_intx_masking); | 3185 | quirk_broken_intx_masking); |
3186 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1588, | 3186 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1588, |
3187 | quirk_broken_intx_masking); | 3187 | quirk_broken_intx_masking); |
3188 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1589, | 3188 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1589, |
3189 | quirk_broken_intx_masking); | 3189 | quirk_broken_intx_masking); |
3190 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d0, | 3190 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d0, |
3191 | quirk_broken_intx_masking); | 3191 | quirk_broken_intx_masking); |
3192 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d1, | 3192 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d1, |
3193 | quirk_broken_intx_masking); | 3193 | quirk_broken_intx_masking); |
3194 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d2, | 3194 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d2, |
3195 | quirk_broken_intx_masking); | 3195 | quirk_broken_intx_masking); |
3196 | |||
3197 | static u16 mellanox_broken_intx_devs[] = { | ||
3198 | PCI_DEVICE_ID_MELLANOX_HERMON_SDR, | ||
3199 | PCI_DEVICE_ID_MELLANOX_HERMON_DDR, | ||
3200 | PCI_DEVICE_ID_MELLANOX_HERMON_QDR, | ||
3201 | PCI_DEVICE_ID_MELLANOX_HERMON_DDR_GEN2, | ||
3202 | PCI_DEVICE_ID_MELLANOX_HERMON_QDR_GEN2, | ||
3203 | PCI_DEVICE_ID_MELLANOX_HERMON_EN, | ||
3204 | PCI_DEVICE_ID_MELLANOX_HERMON_EN_GEN2, | ||
3205 | PCI_DEVICE_ID_MELLANOX_CONNECTX_EN, | ||
3206 | PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_T_GEN2, | ||
3207 | PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_GEN2, | ||
3208 | PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_5_GEN2, | ||
3209 | PCI_DEVICE_ID_MELLANOX_CONNECTX2, | ||
3210 | PCI_DEVICE_ID_MELLANOX_CONNECTX3, | ||
3211 | PCI_DEVICE_ID_MELLANOX_CONNECTX3_PRO, | ||
3212 | }; | ||
3213 | |||
3214 | #define CONNECTX_4_CURR_MAX_MINOR 99 | ||
3215 | #define CONNECTX_4_INTX_SUPPORT_MINOR 14 | ||
3216 | |||
3217 | /* | ||
3218 | * Check ConnectX-4/LX FW version to see if it supports legacy interrupts. | ||
3219 | * If so, don't mark it as broken. | ||
3220 | * FW minor > 99 means older FW version format and no INTx masking support. | ||
3221 | * FW minor < 14 means new FW version format and no INTx masking support. | ||
3222 | */ | ||
3223 | static void mellanox_check_broken_intx_masking(struct pci_dev *pdev) | ||
3224 | { | ||
3225 | __be32 __iomem *fw_ver; | ||
3226 | u16 fw_major; | ||
3227 | u16 fw_minor; | ||
3228 | u16 fw_subminor; | ||
3229 | u32 fw_maj_min; | ||
3230 | u32 fw_sub_min; | ||
3231 | int i; | ||
3232 | |||
3233 | for (i = 0; i < ARRAY_SIZE(mellanox_broken_intx_devs); i++) { | ||
3234 | if (pdev->device == mellanox_broken_intx_devs[i]) { | ||
3235 | pdev->broken_intx_masking = 1; | ||
3236 | return; | ||
3237 | } | ||
3238 | } | ||
3239 | |||
3240 | /* Getting here means Connect-IB cards and up. Connect-IB has no INTx | ||
3241 | * support so shouldn't be checked further | ||
3242 | */ | ||
3243 | if (pdev->device == PCI_DEVICE_ID_MELLANOX_CONNECTIB) | ||
3244 | return; | ||
3245 | |||
3246 | if (pdev->device != PCI_DEVICE_ID_MELLANOX_CONNECTX4 && | ||
3247 | pdev->device != PCI_DEVICE_ID_MELLANOX_CONNECTX4_LX) | ||
3248 | return; | ||
3249 | |||
3250 | /* For ConnectX-4 and ConnectX-4LX, need to check FW support */ | ||
3251 | if (pci_enable_device_mem(pdev)) { | ||
3252 | dev_warn(&pdev->dev, "Can't enable device memory\n"); | ||
3253 | return; | ||
3254 | } | ||
3255 | |||
3256 | fw_ver = ioremap(pci_resource_start(pdev, 0), 4); | ||
3257 | if (!fw_ver) { | ||
3258 | dev_warn(&pdev->dev, "Can't map ConnectX-4 initialization segment\n"); | ||
3259 | goto out; | ||
3260 | } | ||
3261 | |||
3262 | /* Reading from resource space should be 32b aligned */ | ||
3263 | fw_maj_min = ioread32be(fw_ver); | ||
3264 | fw_sub_min = ioread32be(fw_ver + 1); | ||
3265 | fw_major = fw_maj_min & 0xffff; | ||
3266 | fw_minor = fw_maj_min >> 16; | ||
3267 | fw_subminor = fw_sub_min & 0xffff; | ||
3268 | if (fw_minor > CONNECTX_4_CURR_MAX_MINOR || | ||
3269 | fw_minor < CONNECTX_4_INTX_SUPPORT_MINOR) { | ||
3270 | dev_warn(&pdev->dev, "ConnectX-4: FW %u.%u.%u doesn't support INTx masking, disabling. Please upgrade FW to %d.14.1100 and up for INTx support\n", | ||
3271 | fw_major, fw_minor, fw_subminor, pdev->device == | ||
3272 | PCI_DEVICE_ID_MELLANOX_CONNECTX4 ? 12 : 14); | ||
3273 | pdev->broken_intx_masking = 1; | ||
3274 | } | ||
3275 | |||
3276 | iounmap(fw_ver); | ||
3277 | |||
3278 | out: | ||
3279 | pci_disable_device(pdev); | ||
3280 | } | ||
3281 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, | ||
3282 | mellanox_check_broken_intx_masking); | ||
3196 | 3283 | ||
3197 | static void quirk_no_bus_reset(struct pci_dev *dev) | 3284 | static void quirk_no_bus_reset(struct pci_dev *dev) |
3198 | { | 3285 | { |
@@ -3255,6 +3342,25 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C | |||
3255 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE, | 3342 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE, |
3256 | quirk_thunderbolt_hotplug_msi); | 3343 | quirk_thunderbolt_hotplug_msi); |
3257 | 3344 | ||
3345 | static void quirk_chelsio_extend_vpd(struct pci_dev *dev) | ||
3346 | { | ||
3347 | pci_set_vpd_size(dev, 8192); | ||
3348 | } | ||
3349 | |||
3350 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x20, quirk_chelsio_extend_vpd); | ||
3351 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x21, quirk_chelsio_extend_vpd); | ||
3352 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x22, quirk_chelsio_extend_vpd); | ||
3353 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x23, quirk_chelsio_extend_vpd); | ||
3354 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x24, quirk_chelsio_extend_vpd); | ||
3355 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x25, quirk_chelsio_extend_vpd); | ||
3356 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x26, quirk_chelsio_extend_vpd); | ||
3357 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x30, quirk_chelsio_extend_vpd); | ||
3358 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x31, quirk_chelsio_extend_vpd); | ||
3359 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x32, quirk_chelsio_extend_vpd); | ||
3360 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x35, quirk_chelsio_extend_vpd); | ||
3361 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x36, quirk_chelsio_extend_vpd); | ||
3362 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x37, quirk_chelsio_extend_vpd); | ||
3363 | |||
3258 | #ifdef CONFIG_ACPI | 3364 | #ifdef CONFIG_ACPI |
3259 | /* | 3365 | /* |
3260 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. | 3366 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. |