]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net/mlx5: Nack sync reset request when HotPlug is enabled
authorMoshe Shemesh <moshe@nvidia.com>
Mon, 7 Aug 2023 10:11:32 +0000 (13:11 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 5 Dec 2023 06:11:53 +0000 (22:11 -0800)
Current sync reset flow is not supported when PCIe bridge connected
directly to mlx5 device has HotPlug interrupt enabled and can be
triggered on link state change event. Return nack on reset request in
such case.

Fixes: 92501fa6e421 ("net/mlx5: Ack on sync_reset_request only if PF can do reset_now")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Shay Drory <shayd@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c

index b568988e92e3e95985683f79b8c5fdf601d13d5a..c4e19d627da2148bd1fab3b6f388358320ecb9d0 100644 (file)
@@ -325,6 +325,29 @@ static void mlx5_fw_live_patch_event(struct work_struct *work)
                mlx5_core_err(dev, "Failed to reload FW tracer\n");
 }
 
+#if IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)
+static int mlx5_check_hotplug_interrupt(struct mlx5_core_dev *dev)
+{
+       struct pci_dev *bridge = dev->pdev->bus->self;
+       u16 reg16;
+       int err;
+
+       if (!bridge)
+               return -EOPNOTSUPP;
+
+       err = pcie_capability_read_word(bridge, PCI_EXP_SLTCTL, &reg16);
+       if (err)
+               return err;
+
+       if ((reg16 & PCI_EXP_SLTCTL_HPIE) && (reg16 & PCI_EXP_SLTCTL_DLLSCE)) {
+               mlx5_core_warn(dev, "FW reset is not supported as HotPlug is enabled\n");
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+#endif
+
 static int mlx5_check_dev_ids(struct mlx5_core_dev *dev, u16 dev_id)
 {
        struct pci_bus *bridge_bus = dev->pdev->bus;
@@ -357,6 +380,12 @@ static bool mlx5_is_reset_now_capable(struct mlx5_core_dev *dev)
                return false;
        }
 
+#if IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)
+       err = mlx5_check_hotplug_interrupt(dev);
+       if (err)
+               return false;
+#endif
+
        err = pci_read_config_word(dev->pdev, PCI_DEVICE_ID, &dev_id);
        if (err)
                return false;