diff options
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 108 |
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 | ||
178 | static atomic_t pf_loading = ATOMIC_INIT(0); | 178 | static atomic_t pf_loading = ATOMIC_INIT(0); |
179 | 179 | ||
180 | static 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 | |||
187 | static 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 | |||
194 | static int | ||
195 | mlx4_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 | |||
212 | enum 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 | |||
218 | static 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 | |||
237 | static 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 | |||
251 | static 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 | |||
180 | static inline void mlx4_set_num_reserved_uars(struct mlx4_dev *dev, | 275 | static 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 | ||
3902 | err_params_unregister: | ||
3903 | devlink_params_unregister(devlink, mlx4_devlink_params, | ||
3904 | ARRAY_SIZE(mlx4_devlink_params)); | ||
3803 | err_devlink_unregister: | 3905 | err_devlink_unregister: |
3804 | devlink_unregister(devlink); | 3906 | devlink_unregister(devlink); |
3805 | err_persist_free: | 3907 | err_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); |