Skip to content

Commit 2ba5fbd

Browse files
yishaihdavem330
authored andcommitted
net/mlx4_core: Handle AER flow properly
Fix AER callbacks to work properly, it includes: - Refractoring AER to be aligned with Reset flow support. - Sync with concurrent catas flow. In addition, fix the shutdown PCI callback to sync with concurrent catas flow. Signed-off-by: Yishai Hadas <[email protected]> Signed-off-by: Or Gerlitz <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c69453e commit 2ba5fbd

File tree

1 file changed

+65
-6
lines changed
  • drivers/net/ethernet/mellanox/mlx4

1 file changed

+65
-6
lines changed

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,7 +3120,10 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
31203120
if (ret) {
31213121
kfree(dev->persist);
31223122
kfree(priv);
3123+
} else {
3124+
pci_save_state(pdev);
31233125
}
3126+
31243127
return ret;
31253128
}
31263129

@@ -3351,23 +3354,79 @@ MODULE_DEVICE_TABLE(pci, mlx4_pci_table);
33513354
static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev,
33523355
pci_channel_state_t state)
33533356
{
3354-
mlx4_unload_one(pdev);
3357+
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3358+
3359+
mlx4_err(persist->dev, "mlx4_pci_err_detected was called\n");
3360+
mlx4_enter_error_state(persist);
33553361

3356-
return state == pci_channel_io_perm_failure ?
3357-
PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
3362+
mutex_lock(&persist->interface_state_mutex);
3363+
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
3364+
mlx4_unload_one(pdev);
3365+
3366+
mutex_unlock(&persist->interface_state_mutex);
3367+
if (state == pci_channel_io_perm_failure)
3368+
return PCI_ERS_RESULT_DISCONNECT;
3369+
3370+
pci_disable_device(pdev);
3371+
return PCI_ERS_RESULT_NEED_RESET;
33583372
}
33593373

33603374
static pci_ers_result_t mlx4_pci_slot_reset(struct pci_dev *pdev)
33613375
{
3362-
struct mlx4_dev *dev = pci_get_drvdata(pdev);
3376+
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3377+
struct mlx4_dev *dev = persist->dev;
33633378
struct mlx4_priv *priv = mlx4_priv(dev);
33643379
int ret;
3380+
int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0};
3381+
int total_vfs;
33653382

3366-
ret = __mlx4_init_one(pdev, priv->pci_dev_data, priv);
3383+
mlx4_err(dev, "mlx4_pci_slot_reset was called\n");
3384+
ret = pci_enable_device(pdev);
3385+
if (ret) {
3386+
mlx4_err(dev, "Can not re-enable device, ret=%d\n", ret);
3387+
return PCI_ERS_RESULT_DISCONNECT;
3388+
}
3389+
3390+
pci_set_master(pdev);
3391+
pci_restore_state(pdev);
3392+
pci_save_state(pdev);
3393+
3394+
total_vfs = dev->persist->num_vfs;
3395+
memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
3396+
3397+
mutex_lock(&persist->interface_state_mutex);
3398+
if (!(persist->interface_state & MLX4_INTERFACE_STATE_UP)) {
3399+
ret = mlx4_load_one(pdev, priv->pci_dev_data, total_vfs, nvfs,
3400+
priv);
3401+
if (ret) {
3402+
mlx4_err(dev, "%s: mlx4_load_one failed, ret=%d\n",
3403+
__func__, ret);
3404+
goto end;
3405+
}
3406+
3407+
ret = restore_current_port_types(dev, dev->persist->
3408+
curr_port_type, dev->persist->
3409+
curr_port_poss_type);
3410+
if (ret)
3411+
mlx4_err(dev, "could not restore original port types (%d)\n", ret);
3412+
}
3413+
end:
3414+
mutex_unlock(&persist->interface_state_mutex);
33673415

33683416
return ret ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
33693417
}
33703418

3419+
static void mlx4_shutdown(struct pci_dev *pdev)
3420+
{
3421+
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3422+
3423+
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
3424+
mutex_lock(&persist->interface_state_mutex);
3425+
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
3426+
mlx4_unload_one(pdev);
3427+
mutex_unlock(&persist->interface_state_mutex);
3428+
}
3429+
33713430
static const struct pci_error_handlers mlx4_err_handler = {
33723431
.error_detected = mlx4_pci_err_detected,
33733432
.slot_reset = mlx4_pci_slot_reset,
@@ -3377,7 +3436,7 @@ static struct pci_driver mlx4_driver = {
33773436
.name = DRV_NAME,
33783437
.id_table = mlx4_pci_table,
33793438
.probe = mlx4_init_one,
3380-
.shutdown = mlx4_unload_one,
3439+
.shutdown = mlx4_shutdown,
33813440
.remove = mlx4_remove_one,
33823441
.err_handler = &mlx4_err_handler,
33833442
};

0 commit comments

Comments
 (0)