===================================================================
@@ -1508,11 +1508,41 @@ static DEFINE_PCI_DEVICE_TABLE(mlx5_ib_p
MODULE_DEVICE_TABLE(pci, mlx5_ib_pci_table);
+static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
+ pci_channel_state_t state)
+{
+ struct mlx5_ib_dev *dev = mlx5_pci2ibdev(pdev);
+ struct mlx5_core_dev *mdev = &dev->mdev;
+ u8 port;
+
+ /* To avoid the mcast hang with ipoib up */
+ for (port = 1; port <= dev->mdev.caps.num_ports; port++)
+ mlx5_ib_event(mdev, MLX5_DEV_EVENT_PORT_DOWN, &port);
+
+ remove_one(pdev);
+
+ return state == pci_channel_io_perm_failure ?
+ PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
+}
+
+static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
+{
+ int ret = init_one(pdev, 0);
+
+ return ret ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
+}
+
+static const struct pci_error_handlers mlx5_err_handler = {
+ .error_detected = mlx5_pci_err_detected,
+ .slot_reset = mlx5_pci_slot_reset,
+};
+
static struct pci_driver mlx5_ib_driver = {
.name = DRIVER_NAME,
.id_table = mlx5_ib_pci_table,
.probe = init_one,
- .remove = remove_one
+ .remove = remove_one,
+ .err_handler = &mlx5_err_handler,
};
static int __init mlx5_ib_init(void)
===================================================================
@@ -646,6 +646,13 @@ static int mlx5_cmd_invoke(struct mlx5_c
if (callback && page_queue)
return -EINVAL;
+ if (pci_channel_offline(dev->pdev)) {
+ /* Device is going through error recovery
+ * and cannot accept commands.
+ */
+ return -EIO;
+ }
+
ent = alloc_cmd(cmd, in, out, uout, uout_size, callback, context,
page_queue);
if (IS_ERR(ent))
This patch is to add PCI error handler function support for mlx5. Created the functions for error_detected and slot_rest, plus will send a port down event to users when the driver error_detected function is invoked. This is to prevent a hang seeing in mcast_remove_one at the time ib_unregister_device is called for the ib_sa module. It will fail hardware commands while the driver is handling a PCI error. Signed-off-by: Carol Soto <clsoto@linux.vnet.ibm.com> --- drivers/infiniband/hw/mlx5/main.c | 32 +++++++++++++++++++++++++- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 7 +++++ 2 files changed, 38 insertions(+), 1 deletion(-)