Commit a31208b1 authored by Majd Dibbiny's avatar Majd Dibbiny Committed by David S. Miller

net/mlx5_core: New init and exit flow for mlx5_core

In the new flow, we separate the pci initialization and teardown from the
initialization and teardown of the other resources.

init_one calls mlx5_pci_init that handles the pci resources initialization.
It then calls mlx5_load_one to initialize the remainder of the resources.

When removing a device, remove_one is invoked. However, now remove_one
calls mlx5_unload_one to free all the resources except the pci resources.
When mlx5_unload_one returns, mlx5_pci_close is called to free the pci
resources.

The above separation will allow us to implement the pci error handlers and
suspend and resume callbacks.
Signed-off-by: default avatarMajd Dibbiny <majd@mellanox.com>
Signed-off-by: default avatarEli Cohen <eli@mellanox.com>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8ffe63e
...@@ -1364,6 +1364,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) ...@@ -1364,6 +1364,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
int err; int err;
int i; int i;
memset(cmd, 0, sizeof(*cmd));
cmd_if_rev = cmdif_rev(dev); cmd_if_rev = cmdif_rev(dev);
if (cmd_if_rev != CMD_IF_REV) { if (cmd_if_rev != CMD_IF_REV) {
dev_err(&dev->pdev->dev, dev_err(&dev->pdev->dev,
......
...@@ -242,6 +242,7 @@ int mlx5_init_cq_table(struct mlx5_core_dev *dev) ...@@ -242,6 +242,7 @@ int mlx5_init_cq_table(struct mlx5_core_dev *dev)
struct mlx5_cq_table *table = &dev->priv.cq_table; struct mlx5_cq_table *table = &dev->priv.cq_table;
int err; int err;
memset(table, 0, sizeof(*table));
spin_lock_init(&table->lock); spin_lock_init(&table->lock);
INIT_RADIX_TREE(&table->tree, GFP_ATOMIC); INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
err = mlx5_cq_debugfs_init(dev); err = mlx5_cq_debugfs_init(dev);
......
...@@ -346,6 +346,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx, ...@@ -346,6 +346,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
int inlen; int inlen;
eq->nent = roundup_pow_of_two(nent + MLX5_NUM_SPARE_EQE); eq->nent = roundup_pow_of_two(nent + MLX5_NUM_SPARE_EQE);
eq->cons_index = 0;
err = mlx5_buf_alloc(dev, eq->nent * MLX5_EQE_SIZE, &eq->buf); err = mlx5_buf_alloc(dev, eq->nent * MLX5_EQE_SIZE, &eq->buf);
if (err) if (err)
return err; return err;
......
...@@ -40,6 +40,7 @@ void mlx5_init_mr_table(struct mlx5_core_dev *dev) ...@@ -40,6 +40,7 @@ void mlx5_init_mr_table(struct mlx5_core_dev *dev)
{ {
struct mlx5_mr_table *table = &dev->priv.mr_table; struct mlx5_mr_table *table = &dev->priv.mr_table;
memset(table, 0, sizeof(*table));
rwlock_init(&table->lock); rwlock_init(&table->lock);
INIT_RADIX_TREE(&table->tree, GFP_ATOMIC); INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
} }
......
...@@ -345,6 +345,7 @@ void mlx5_init_qp_table(struct mlx5_core_dev *dev) ...@@ -345,6 +345,7 @@ void mlx5_init_qp_table(struct mlx5_core_dev *dev)
{ {
struct mlx5_qp_table *table = &dev->priv.qp_table; struct mlx5_qp_table *table = &dev->priv.qp_table;
memset(table, 0, sizeof(*table));
spin_lock_init(&table->lock); spin_lock_init(&table->lock);
INIT_RADIX_TREE(&table->tree, GFP_ATOMIC); INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
mlx5_qp_debugfs_init(dev); mlx5_qp_debugfs_init(dev);
......
...@@ -531,6 +531,7 @@ void mlx5_init_srq_table(struct mlx5_core_dev *dev) ...@@ -531,6 +531,7 @@ void mlx5_init_srq_table(struct mlx5_core_dev *dev)
{ {
struct mlx5_srq_table *table = &dev->priv.srq_table; struct mlx5_srq_table *table = &dev->priv.srq_table;
memset(table, 0, sizeof(*table));
spin_lock_init(&table->lock); spin_lock_init(&table->lock);
INIT_RADIX_TREE(&table->tree, GFP_ATOMIC); INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment