aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c108
1 files changed, 106 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 872014702fc1..2445f7999629 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -177,6 +177,101 @@ struct mlx4_port_config {
177 177
178static atomic_t pf_loading = ATOMIC_INIT(0); 178static atomic_t pf_loading = ATOMIC_INIT(0);
179 179
180static int mlx4_devlink_ierr_reset_get(struct devlink *devlink, u32 id,
181 struct devlink_param_gset_ctx *ctx)
182{
183 ctx->val.vbool = !!mlx4_internal_err_reset;
184 return 0;
185}
186
187static int mlx4_devlink_ierr_reset_set(struct devlink *devlink, u32 id,
188 struct devlink_param_gset_ctx *ctx)
189{
190 mlx4_internal_err_reset = ctx->val.vbool;
191 return 0;
192}
193
194static int
195mlx4_devlink_max_macs_validate(struct devlink *devlink, u32 id,
196 union devlink_param_value val,
197 struct netlink_ext_ack *extack)
198{
199 u32 value = val.vu32;
200
201 if (value < 1 || value > 128)
202 return -ERANGE;
203
204 if (!is_power_of_2(value)) {
205 NL_SET_ERR_MSG_MOD(extack, "max_macs supported must be power of 2");
206 return -EINVAL;
207 }
208
209 return 0;
210}
211
212enum mlx4_devlink_param_id {
213 MLX4_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
214 MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
215 MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
216};
217
218static const struct devlink_param mlx4_devlink_params[] = {
219 DEVLINK_PARAM_GENERIC(INT_ERR_RESET,
220 BIT(DEVLINK_PARAM_CMODE_RUNTIME) |
221 BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
222 mlx4_devlink_ierr_reset_get,
223 mlx4_devlink_ierr_reset_set, NULL),
224 DEVLINK_PARAM_GENERIC(MAX_MACS,
225 BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
226 NULL, NULL, mlx4_devlink_max_macs_validate),
227 DEVLINK_PARAM_DRIVER(MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
228 "enable_64b_cqe_eqe", DEVLINK_PARAM_TYPE_BOOL,
229 BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
230 NULL, NULL, NULL),
231 DEVLINK_PARAM_DRIVER(MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
232 "enable_4k_uar", DEVLINK_PARAM_TYPE_BOOL,
233 BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
234 NULL, NULL, NULL),
235};
236
237static void mlx4_devlink_set_init_value(struct devlink *devlink, u32 param_id,
238 union devlink_param_value init_val)
239{
240 struct mlx4_priv *priv = devlink_priv(devlink);
241 struct mlx4_dev *dev = &priv->dev;
242 int err;
243
244 err = devlink_param_driverinit_value_set(devlink, param_id, init_val);
245 if (err)
246 mlx4_warn(dev,
247 "devlink set parameter %u value failed (err = %d)",
248 param_id, err);
249}
250
251static void mlx4_devlink_set_params_init_values(struct devlink *devlink)
252{
253 union devlink_param_value value;
254
255 value.vbool = !!mlx4_internal_err_reset;
256 mlx4_devlink_set_init_value(devlink,
257 DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
258 value);
259
260 value.vu32 = 1UL << log_num_mac;
261 mlx4_devlink_set_init_value(devlink,
262 DEVLINK_PARAM_GENERIC_ID_MAX_MACS, value);
263
264 value.vbool = enable_64b_cqe_eqe;
265 mlx4_devlink_set_init_value(devlink,
266 MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
267 value);
268
269 value.vbool = enable_4k_uar;
270 mlx4_devlink_set_init_value(devlink,
271 MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
272 value);
273}
274
180static inline void mlx4_set_num_reserved_uars(struct mlx4_dev *dev, 275static inline void mlx4_set_num_reserved_uars(struct mlx4_dev *dev,
181 struct mlx4_dev_cap *dev_cap) 276 struct mlx4_dev_cap *dev_cap)
182{ 277{
@@ -3792,14 +3887,21 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
3792 ret = devlink_register(devlink, &pdev->dev); 3887 ret = devlink_register(devlink, &pdev->dev);
3793 if (ret) 3888 if (ret)
3794 goto err_persist_free; 3889 goto err_persist_free;
3795 3890 ret = devlink_params_register(devlink, mlx4_devlink_params,
3796 ret = __mlx4_init_one(pdev, id->driver_data, priv); 3891 ARRAY_SIZE(mlx4_devlink_params));
3797 if (ret) 3892 if (ret)
3798 goto err_devlink_unregister; 3893 goto err_devlink_unregister;
3894 mlx4_devlink_set_params_init_values(devlink);
3895 ret = __mlx4_init_one(pdev, id->driver_data, priv);
3896 if (ret)
3897 goto err_params_unregister;
3799 3898
3800 pci_save_state(pdev); 3899 pci_save_state(pdev);
3801 return 0; 3900 return 0;
3802 3901
3902err_params_unregister:
3903 devlink_params_unregister(devlink, mlx4_devlink_params,
3904 ARRAY_SIZE(mlx4_devlink_params));
3803err_devlink_unregister: 3905err_devlink_unregister:
3804 devlink_unregister(devlink); 3906 devlink_unregister(devlink);
3805err_persist_free: 3907err_persist_free:
@@ -3936,6 +4038,8 @@ static void mlx4_remove_one(struct pci_dev *pdev)
3936 4038
3937 pci_release_regions(pdev); 4039 pci_release_regions(pdev);
3938 mlx4_pci_disable_device(dev); 4040 mlx4_pci_disable_device(dev);
4041 devlink_params_unregister(devlink, mlx4_devlink_params,
4042 ARRAY_SIZE(mlx4_devlink_params));
3939 devlink_unregister(devlink); 4043 devlink_unregister(devlink);
3940 kfree(dev->persist); 4044 kfree(dev->persist);
3941 devlink_free(devlink); 4045 devlink_free(devlink);