Skip to content

Commit 86a3e5d

Browse files
yishaihdavem330
authored andcommitted
net/mlx4_core: Add PCI calls for suspend/resume
Implement suspend/resume callbacks in struct pci_driver. Signed-off-by: Yishai Hadas <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e5c9a70 commit 86a3e5d

File tree

1 file changed

+46
-0
lines changed
  • drivers/net/ethernet/mellanox/mlx4

1 file changed

+46
-0
lines changed

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4125,12 +4125,58 @@ static const struct pci_error_handlers mlx4_err_handler = {
41254125
.resume = mlx4_pci_resume,
41264126
};
41274127

4128+
static int mlx4_suspend(struct pci_dev *pdev, pm_message_t state)
4129+
{
4130+
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
4131+
struct mlx4_dev *dev = persist->dev;
4132+
4133+
mlx4_err(dev, "suspend was called\n");
4134+
mutex_lock(&persist->interface_state_mutex);
4135+
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
4136+
mlx4_unload_one(pdev);
4137+
mutex_unlock(&persist->interface_state_mutex);
4138+
4139+
return 0;
4140+
}
4141+
4142+
static int mlx4_resume(struct pci_dev *pdev)
4143+
{
4144+
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
4145+
struct mlx4_dev *dev = persist->dev;
4146+
struct mlx4_priv *priv = mlx4_priv(dev);
4147+
int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0};
4148+
int total_vfs;
4149+
int ret = 0;
4150+
4151+
mlx4_err(dev, "resume was called\n");
4152+
total_vfs = dev->persist->num_vfs;
4153+
memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
4154+
4155+
mutex_lock(&persist->interface_state_mutex);
4156+
if (!(persist->interface_state & MLX4_INTERFACE_STATE_UP)) {
4157+
ret = mlx4_load_one(pdev, priv->pci_dev_data, total_vfs,
4158+
nvfs, priv, 1);
4159+
if (!ret) {
4160+
ret = restore_current_port_types(dev,
4161+
dev->persist->curr_port_type,
4162+
dev->persist->curr_port_poss_type);
4163+
if (ret)
4164+
mlx4_err(dev, "resume: could not restore original port types (%d)\n", ret);
4165+
}
4166+
}
4167+
mutex_unlock(&persist->interface_state_mutex);
4168+
4169+
return ret;
4170+
}
4171+
41284172
static struct pci_driver mlx4_driver = {
41294173
.name = DRV_NAME,
41304174
.id_table = mlx4_pci_table,
41314175
.probe = mlx4_init_one,
41324176
.shutdown = mlx4_shutdown,
41334177
.remove = mlx4_remove_one,
4178+
.suspend = mlx4_suspend,
4179+
.resume = mlx4_resume,
41344180
.err_handler = &mlx4_err_handler,
41354181
};
41364182

0 commit comments

Comments
 (0)