aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r--drivers/pci/quirks.c182
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);
3137DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b7, quirk_remove_d3_delay); 3137DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b7, quirk_remove_d3_delay);
3138DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2298, quirk_remove_d3_delay); 3138DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2298, quirk_remove_d3_delay);
3139DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x229c, quirk_remove_d3_delay); 3139DECLARE_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}
3149DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CHELSIO, 0x0030, 3150DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x0030,
3150 quirk_broken_intx_masking); 3151 quirk_broken_intx_masking);
3151DECLARE_PCI_FIXUP_HEADER(0x1814, 0x0601, /* Ralink RT2800 802.11n PCI */ 3152DECLARE_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 */
3159DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, 3161DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REALTEK, 0x8169,
3160 quirk_broken_intx_masking); 3162 quirk_broken_intx_masking);
3161DECLARE_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 */
3168DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1572, 3168DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1572,
3169 quirk_broken_intx_masking); 3169 quirk_broken_intx_masking);
3170DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1574, 3170DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1574,
3171 quirk_broken_intx_masking); 3171 quirk_broken_intx_masking);
3172DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1580, 3172DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1580,
3173 quirk_broken_intx_masking); 3173 quirk_broken_intx_masking);
3174DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1581, 3174DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1581,
3175 quirk_broken_intx_masking); 3175 quirk_broken_intx_masking);
3176DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1583, 3176DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1583,
3177 quirk_broken_intx_masking); 3177 quirk_broken_intx_masking);
3178DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1584, 3178DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1584,
3179 quirk_broken_intx_masking); 3179 quirk_broken_intx_masking);
3180DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1585, 3180DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1585,
3181 quirk_broken_intx_masking); 3181 quirk_broken_intx_masking);
3182DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1586, 3182DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1586,
3183 quirk_broken_intx_masking); 3183 quirk_broken_intx_masking);
3184DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1587, 3184DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1587,
3185 quirk_broken_intx_masking); 3185 quirk_broken_intx_masking);
3186DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1588, 3186DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1588,
3187 quirk_broken_intx_masking); 3187 quirk_broken_intx_masking);
3188DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1589, 3188DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1589,
3189 quirk_broken_intx_masking); 3189 quirk_broken_intx_masking);
3190DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d0, 3190DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d0,
3191 quirk_broken_intx_masking); 3191 quirk_broken_intx_masking);
3192DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d1, 3192DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d1,
3193 quirk_broken_intx_masking); 3193 quirk_broken_intx_masking);
3194DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x37d2, 3194DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d2,
3195 quirk_broken_intx_masking); 3195 quirk_broken_intx_masking);
3196
3197static 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 */
3223static 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
3278out:
3279 pci_disable_device(pdev);
3280}
3281DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID,
3282 mellanox_check_broken_intx_masking);
3196 3283
3197static void quirk_no_bus_reset(struct pci_dev *dev) 3284static 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
3255DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE, 3342DECLARE_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
3345static void quirk_chelsio_extend_vpd(struct pci_dev *dev)
3346{
3347 pci_set_vpd_size(dev, 8192);
3348}
3349
3350DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x20, quirk_chelsio_extend_vpd);
3351DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x21, quirk_chelsio_extend_vpd);
3352DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x22, quirk_chelsio_extend_vpd);
3353DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x23, quirk_chelsio_extend_vpd);
3354DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x24, quirk_chelsio_extend_vpd);
3355DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x25, quirk_chelsio_extend_vpd);
3356DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x26, quirk_chelsio_extend_vpd);
3357DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x30, quirk_chelsio_extend_vpd);
3358DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x31, quirk_chelsio_extend_vpd);
3359DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x32, quirk_chelsio_extend_vpd);
3360DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x35, quirk_chelsio_extend_vpd);
3361DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x36, quirk_chelsio_extend_vpd);
3362DECLARE_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.