diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx5/core/en_main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 200 |
1 files changed, 46 insertions, 154 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 40626b6108fb..b5f1c4ca38ba 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -70,7 +70,6 @@ #include "qos.h" #include "en/trap.h" #include "lib/devcom.h" -#include "lib/sd.h" bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev, u8 page_shift, enum mlx5e_mpwrq_umr_mode umr_mode) @@ -1025,7 +1024,7 @@ static void mlx5e_free_rq(struct mlx5e_rq *rq) mlx5_wq_destroy(&rq->wq_ctrl); } -int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param, u16 q_counter) +int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param) { struct mlx5_core_dev *mdev = rq->mdev; u8 ts_format; @@ -1052,7 +1051,6 @@ int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param, u16 q_cou MLX5_SET(rqc, rqc, cqn, rq->cq.mcq.cqn); MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RST); MLX5_SET(rqc, rqc, ts_format, ts_format); - MLX5_SET(rqc, rqc, counter_set_id, q_counter); MLX5_SET(wq, wq, log_wq_pg_sz, rq->wq_ctrl.buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT); MLX5_SET64(wq, wq, dbr_addr, rq->wq_ctrl.db.dma); @@ -1276,7 +1274,7 @@ void mlx5e_free_rx_descs(struct mlx5e_rq *rq) } int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param, - struct mlx5e_xsk_param *xsk, int node, u16 q_counter, + struct mlx5e_xsk_param *xsk, int node, struct mlx5e_rq *rq) { struct mlx5_core_dev *mdev = rq->mdev; @@ -1289,7 +1287,7 @@ int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param, if (err) return err; - err = mlx5e_create_rq(rq, param, q_counter); + err = mlx5e_create_rq(rq, param); if (err) goto err_free_rq; @@ -2335,14 +2333,13 @@ static int mlx5e_set_tx_maxrate(struct net_device *dev, int index, u32 rate) static int mlx5e_open_rxq_rq(struct mlx5e_channel *c, struct mlx5e_params *params, struct mlx5e_rq_param *rq_params) { - u16 q_counter = c->priv->q_counter[c->sd_ix]; int err; err = mlx5e_init_rxq_rq(c, params, rq_params->xdp_frag_size, &c->rq); if (err) return err; - return mlx5e_open_rq(params, rq_params, NULL, cpu_to_node(c->cpu), q_counter, &c->rq); + return mlx5e_open_rq(params, rq_params, NULL, cpu_to_node(c->cpu), &c->rq); } static int mlx5e_open_queues(struct mlx5e_channel *c, @@ -2529,20 +2526,14 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, struct xsk_buff_pool *xsk_pool, struct mlx5e_channel **cp) { + int cpu = mlx5_comp_vector_get_cpu(priv->mdev, ix); struct net_device *netdev = priv->netdev; - struct mlx5_core_dev *mdev; struct mlx5e_xsk_param xsk; struct mlx5e_channel *c; unsigned int irq; - int vec_ix; - int cpu; int err; - mdev = mlx5_sd_ch_ix_get_dev(priv->mdev, ix); - vec_ix = mlx5_sd_ch_ix_get_vec_ix(mdev, ix); - cpu = mlx5_comp_vector_get_cpu(mdev, vec_ix); - - err = mlx5_comp_irqn_get(mdev, vec_ix, &irq); + err = mlx5_comp_irqn_get(priv->mdev, ix, &irq); if (err) return err; @@ -2555,20 +2546,18 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, return -ENOMEM; c->priv = priv; - c->mdev = mdev; + c->mdev = priv->mdev; c->tstamp = &priv->tstamp; c->ix = ix; - c->vec_ix = vec_ix; - c->sd_ix = mlx5_sd_ch_ix_get_dev_ix(mdev, ix); c->cpu = cpu; - c->pdev = mlx5_core_dma_dev(mdev); + c->pdev = mlx5_core_dma_dev(priv->mdev); c->netdev = priv->netdev; - c->mkey_be = cpu_to_be32(mdev->mlx5e_res.hw_objs.mkey); + c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey); c->num_tc = mlx5e_get_dcb_num_tc(params); c->xdp = !!params->xdp_prog; c->stats = &priv->channel_stats[ix]->ch; c->aff_mask = irq_get_effective_affinity_mask(irq); - c->lag_port = mlx5e_enumerate_lag_port(mdev, ix); + c->lag_port = mlx5e_enumerate_lag_port(priv->mdev, ix); netif_napi_add(netdev, &c->napi, mlx5e_napi_poll); @@ -2658,7 +2647,7 @@ int mlx5e_open_channels(struct mlx5e_priv *priv, if (!chs->c || !cparam) goto err_free; - err = mlx5e_build_channel_param(priv->mdev, &chs->params, cparam); + err = mlx5e_build_channel_param(priv->mdev, &chs->params, priv->q_counter, cparam); if (err) goto err_free; @@ -2946,18 +2935,15 @@ static MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_update_netdev_queues); static void mlx5e_set_default_xps_cpumasks(struct mlx5e_priv *priv, struct mlx5e_params *params) { - int ix; + struct mlx5_core_dev *mdev = priv->mdev; + int num_comp_vectors, ix, irq; - for (ix = 0; ix < params->num_channels; ix++) { - int num_comp_vectors, irq, vec_ix; - struct mlx5_core_dev *mdev; + num_comp_vectors = mlx5_comp_vectors_max(mdev); - mdev = mlx5_sd_ch_ix_get_dev(priv->mdev, ix); - num_comp_vectors = mlx5_comp_vectors_max(mdev); + for (ix = 0; ix < params->num_channels; ix++) { cpumask_clear(priv->scratchpad.cpumask); - vec_ix = mlx5_sd_ch_ix_get_vec_ix(mdev, ix); - for (irq = vec_ix; irq < num_comp_vectors; irq += params->num_channels) { + for (irq = ix; irq < num_comp_vectors; irq += params->num_channels) { int cpu = mlx5_comp_vector_get_cpu(mdev, irq); cpumask_set_cpu(cpu, priv->scratchpad.cpumask); @@ -3349,7 +3335,7 @@ int mlx5e_open_drop_rq(struct mlx5e_priv *priv, struct mlx5e_cq *cq = &drop_rq->cq; int err; - mlx5e_build_drop_rq_param(mdev, &rq_param); + mlx5e_build_drop_rq_param(mdev, priv->drop_rq_q_counter, &rq_param); err = mlx5e_alloc_drop_cq(priv, cq, &cq_param); if (err) @@ -3363,7 +3349,7 @@ int mlx5e_open_drop_rq(struct mlx5e_priv *priv, if (err) goto err_destroy_cq; - err = mlx5e_create_rq(drop_rq, &rq_param, priv->drop_rq_q_counter); + err = mlx5e_create_rq(drop_rq, &rq_param); if (err) goto err_free_rq; @@ -3799,7 +3785,7 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats) stats->tx_errors = stats->tx_aborted_errors + stats->tx_carrier_errors; } -void mlx5e_nic_set_rx_mode(struct mlx5e_priv *priv) +static void mlx5e_nic_set_rx_mode(struct mlx5e_priv *priv) { if (mlx5e_is_uplink_rep(priv)) return; /* no rx mode for uplink rep */ @@ -5004,15 +4990,6 @@ const struct net_device_ops mlx5e_netdev_ops = { #endif }; -const struct net_device_ops mlx5e_mgmt_netdev_ops = { - .ndo_open = mlx5e_open, - .ndo_stop = mlx5e_close, - .ndo_start_xmit = mlx5e_xmit, - .ndo_get_stats64 = mlx5e_get_stats, - .ndo_change_mtu = mlx5e_change_nic_mtu, - .ndo_set_rx_mode = mlx5e_set_rx_mode, -}; - static u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 wanted_timeout) { int i; @@ -5152,11 +5129,7 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev) SET_NETDEV_DEV(netdev, mdev->device); - if (mlx5_core_is_mgmt_pf(mdev)) - netdev->netdev_ops = &mlx5e_mgmt_netdev_ops; - else - netdev->netdev_ops = &mlx5e_netdev_ops; - + netdev->netdev_ops = &mlx5e_netdev_ops; netdev->xdp_metadata_ops = &mlx5e_xdp_metadata_ops; netdev->xsk_tx_metadata_ops = &mlx5e_xsk_tx_metadata_ops; @@ -5291,17 +5264,13 @@ void mlx5e_create_q_counters(struct mlx5e_priv *priv) u32 out[MLX5_ST_SZ_DW(alloc_q_counter_out)] = {}; u32 in[MLX5_ST_SZ_DW(alloc_q_counter_in)] = {}; struct mlx5_core_dev *mdev = priv->mdev; - struct mlx5_core_dev *pos; - int err, i; + int err; MLX5_SET(alloc_q_counter_in, in, opcode, MLX5_CMD_OP_ALLOC_Q_COUNTER); - - mlx5_sd_for_each_dev(i, mdev, pos) { - err = mlx5_cmd_exec_inout(pos, alloc_q_counter, in, out); - if (!err) - priv->q_counter[i] = - MLX5_GET(alloc_q_counter_out, out, counter_set_id); - } + err = mlx5_cmd_exec_inout(mdev, alloc_q_counter, in, out); + if (!err) + priv->q_counter = + MLX5_GET(alloc_q_counter_out, out, counter_set_id); err = mlx5_cmd_exec_inout(mdev, alloc_q_counter, in, out); if (!err) @@ -5312,17 +5281,13 @@ void mlx5e_create_q_counters(struct mlx5e_priv *priv) void mlx5e_destroy_q_counters(struct mlx5e_priv *priv) { u32 in[MLX5_ST_SZ_DW(dealloc_q_counter_in)] = {}; - struct mlx5_core_dev *pos; - int i; MLX5_SET(dealloc_q_counter_in, in, opcode, MLX5_CMD_OP_DEALLOC_Q_COUNTER); - mlx5_sd_for_each_dev(i, priv->mdev, pos) { - if (priv->q_counter[i]) { - MLX5_SET(dealloc_q_counter_in, in, counter_set_id, - priv->q_counter[i]); - mlx5_cmd_exec_in(pos, dealloc_q_counter, in); - } + if (priv->q_counter) { + MLX5_SET(dealloc_q_counter_in, in, counter_set_id, + priv->q_counter); + mlx5_cmd_exec_in(priv->mdev, dealloc_q_counter, in); } if (priv->drop_rq_q_counter) { @@ -5406,8 +5371,6 @@ static int mlx5e_init_nic_rx(struct mlx5e_priv *priv) features = MLX5E_RX_RES_FEATURE_PTP; if (mlx5_tunnel_inner_ft_supported(mdev)) features |= MLX5E_RX_RES_FEATURE_INNER_FT; - if (mlx5_get_sd(priv->mdev)) - features |= MLX5E_RX_RES_FEATURE_MULTI_VHCA; priv->rx_res = mlx5e_rx_res_create(priv->mdev, features, priv->max_nch, priv->drop_rq.rqn, &priv->channels.params.packet_merge, @@ -6017,52 +5980,28 @@ void mlx5e_destroy_netdev(struct mlx5e_priv *priv) free_netdev(netdev); } -static int _mlx5e_resume(struct auxiliary_device *adev) +static int mlx5e_resume(struct auxiliary_device *adev) { struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev); struct mlx5e_priv *priv = mlx5e_dev->priv; struct net_device *netdev = priv->netdev; struct mlx5_core_dev *mdev = edev->mdev; - struct mlx5_core_dev *pos, *to; - int err, i; + int err; if (netif_device_present(netdev)) return 0; - mlx5_sd_for_each_dev(i, mdev, pos) { - err = mlx5e_create_mdev_resources(pos, true); - if (err) - goto err_destroy_mdev_res; - } - - err = mlx5e_attach_netdev(priv); + err = mlx5e_create_mdev_resources(mdev); if (err) - goto err_destroy_mdev_res; - - return 0; - -err_destroy_mdev_res: - to = pos; - mlx5_sd_for_each_dev_to(i, mdev, to, pos) - mlx5e_destroy_mdev_resources(pos); - return err; -} - -static int mlx5e_resume(struct auxiliary_device *adev) -{ - struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); - struct mlx5_core_dev *mdev = edev->mdev; - struct auxiliary_device *actual_adev; - int err; + return err; - err = mlx5_sd_init(mdev); - if (err) + err = mlx5e_attach_netdev(priv); + if (err) { + mlx5e_destroy_mdev_resources(mdev); return err; + } - actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx); - if (actual_adev) - return _mlx5e_resume(actual_adev); return 0; } @@ -6072,53 +6011,33 @@ static int _mlx5e_suspend(struct auxiliary_device *adev) struct mlx5e_priv *priv = mlx5e_dev->priv; struct net_device *netdev = priv->netdev; struct mlx5_core_dev *mdev = priv->mdev; - struct mlx5_core_dev *pos; - int i; if (!netif_device_present(netdev)) { if (test_bit(MLX5E_STATE_DESTROYING, &priv->state)) - mlx5_sd_for_each_dev(i, mdev, pos) - mlx5e_destroy_mdev_resources(pos); + mlx5e_destroy_mdev_resources(mdev); return -ENODEV; } mlx5e_detach_netdev(priv); - mlx5_sd_for_each_dev(i, mdev, pos) - mlx5e_destroy_mdev_resources(pos); - + mlx5e_destroy_mdev_resources(mdev); return 0; } static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state) { - struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); - struct mlx5_core_dev *mdev = edev->mdev; - struct auxiliary_device *actual_adev; - int err = 0; - - actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx); - if (actual_adev) - err = _mlx5e_suspend(actual_adev); - - mlx5_sd_cleanup(mdev); - return err; + return _mlx5e_suspend(adev); } static int _mlx5e_probe(struct auxiliary_device *adev) { struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); + const struct mlx5e_profile *profile = &mlx5e_nic_profile; struct mlx5_core_dev *mdev = edev->mdev; - const struct mlx5e_profile *profile; struct mlx5e_dev *mlx5e_dev; struct net_device *netdev; struct mlx5e_priv *priv; int err; - if (mlx5_core_is_mgmt_pf(mdev)) - profile = &mlx5e_mgmt_pf_nic_profile; - else - profile = &mlx5e_nic_profile; - mlx5e_dev = mlx5e_create_devlink(&adev->dev, mdev); if (IS_ERR(mlx5e_dev)) return PTR_ERR(mlx5e_dev); @@ -6152,9 +6071,9 @@ static int _mlx5e_probe(struct auxiliary_device *adev) goto err_destroy_netdev; } - err = _mlx5e_resume(adev); + err = mlx5e_resume(adev); if (err) { - mlx5_core_err(mdev, "_mlx5e_resume failed, %d\n", err); + mlx5_core_err(mdev, "mlx5e_resume failed, %d\n", err); goto err_profile_cleanup; } @@ -6185,29 +6104,15 @@ err_devlink_unregister: static int mlx5e_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id) { - struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); - struct mlx5_core_dev *mdev = edev->mdev; - struct auxiliary_device *actual_adev; - int err; - - err = mlx5_sd_init(mdev); - if (err) - return err; - - actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx); - if (actual_adev) - return _mlx5e_probe(actual_adev); - return 0; + return _mlx5e_probe(adev); } -static void _mlx5e_remove(struct auxiliary_device *adev) +static void mlx5e_remove(struct auxiliary_device *adev) { - struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev); struct mlx5e_priv *priv = mlx5e_dev->priv; - struct mlx5_core_dev *mdev = edev->mdev; - mlx5_core_uplink_netdev_set(mdev, NULL); + mlx5_core_uplink_netdev_set(priv->mdev, NULL); mlx5e_dcbnl_delete_app(priv); unregister_netdev(priv->netdev); _mlx5e_suspend(adev); @@ -6217,19 +6122,6 @@ static void _mlx5e_remove(struct auxiliary_device *adev) mlx5e_destroy_devlink(mlx5e_dev); } -static void mlx5e_remove(struct auxiliary_device *adev) -{ - struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); - struct mlx5_core_dev *mdev = edev->mdev; - struct auxiliary_device *actual_adev; - - actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx); - if (actual_adev) - _mlx5e_remove(actual_adev); - - mlx5_sd_cleanup(mdev); -} - static const struct auxiliary_device_id mlx5e_id_table[] = { { .name = MLX5_ADEV_NAME ".eth", }, {}, |