forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/net/ethernet/mellanox/mlx4/main.c
....@@ -63,7 +63,7 @@
6363
6464 #ifdef CONFIG_MLX4_DEBUG
6565
66
-int mlx4_debug_level = 0;
66
+int mlx4_debug_level; /* 0 by default */
6767 module_param_named(debug_level, mlx4_debug_level, int, 0644);
6868 MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0");
6969
....@@ -83,7 +83,7 @@
8383
8484 static uint8_t num_vfs[3] = {0, 0, 0};
8585 static int num_vfs_argc;
86
-module_param_array(num_vfs, byte , &num_vfs_argc, 0444);
86
+module_param_array(num_vfs, byte, &num_vfs_argc, 0444);
8787 MODULE_PARM_DESC(num_vfs, "enable #num_vfs functions if num_vfs > 0\n"
8888 "num_vfs=port1,port2,port1+2");
8989
....@@ -515,8 +515,7 @@
515515 dev->caps.max_rq_desc_sz = dev_cap->max_rq_desc_sz;
516516 /*
517517 * Subtract 1 from the limit because we need to allocate a
518
- * spare CQE so the HCA HW can tell the difference between an
519
- * empty CQ and a full CQ.
518
+ * spare CQE to enable resizing the CQ.
520519 */
521520 dev->caps.max_cqes = dev_cap->max_cq_sz - 1;
522521 dev->caps.reserved_cqs = dev_cap->reserved_cqs;
....@@ -2246,7 +2245,7 @@
22462245 for (i = 1; i <= dev->caps.num_ports; i++) {
22472246 if (mlx4_dev_port(dev, i, &port_cap)) {
22482247 mlx4_err(dev,
2249
- "QUERY_DEV_CAP command failed, can't veify DMFS high rate steering.\n");
2248
+ "QUERY_DEV_CAP command failed, can't verify DMFS high rate steering.\n");
22502249 } else if ((dev->caps.dmfs_high_steer_mode !=
22512250 MLX4_STEERING_DMFS_A0_DEFAULT) &&
22522251 (port_cap.dmfs_optimized_state ==
....@@ -2298,23 +2297,31 @@
22982297 static int mlx4_init_hca(struct mlx4_dev *dev)
22992298 {
23002299 struct mlx4_priv *priv = mlx4_priv(dev);
2300
+ struct mlx4_init_hca_param *init_hca = NULL;
2301
+ struct mlx4_dev_cap *dev_cap = NULL;
23012302 struct mlx4_adapter adapter;
2302
- struct mlx4_dev_cap dev_cap;
23032303 struct mlx4_profile profile;
2304
- struct mlx4_init_hca_param init_hca;
23052304 u64 icm_size;
23062305 struct mlx4_config_dev_params params;
23072306 int err;
23082307
23092308 if (!mlx4_is_slave(dev)) {
2310
- err = mlx4_dev_cap(dev, &dev_cap);
2311
- if (err) {
2312
- mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n");
2313
- return err;
2309
+ dev_cap = kzalloc(sizeof(*dev_cap), GFP_KERNEL);
2310
+ init_hca = kzalloc(sizeof(*init_hca), GFP_KERNEL);
2311
+
2312
+ if (!dev_cap || !init_hca) {
2313
+ err = -ENOMEM;
2314
+ goto out_free;
23142315 }
23152316
2316
- choose_steering_mode(dev, &dev_cap);
2317
- choose_tunnel_offload_mode(dev, &dev_cap);
2317
+ err = mlx4_dev_cap(dev, dev_cap);
2318
+ if (err) {
2319
+ mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n");
2320
+ goto out_free;
2321
+ }
2322
+
2323
+ choose_steering_mode(dev, dev_cap);
2324
+ choose_tunnel_offload_mode(dev, dev_cap);
23182325
23192326 if (dev->caps.dmfs_high_steer_mode == MLX4_STEERING_DMFS_A0_STATIC &&
23202327 mlx4_is_master(dev))
....@@ -2337,48 +2344,46 @@
23372344 MLX4_STEERING_MODE_DEVICE_MANAGED)
23382345 profile.num_mcg = MLX4_FS_NUM_MCG;
23392346
2340
- icm_size = mlx4_make_profile(dev, &profile, &dev_cap,
2341
- &init_hca);
2347
+ icm_size = mlx4_make_profile(dev, &profile, dev_cap,
2348
+ init_hca);
23422349 if ((long long) icm_size < 0) {
23432350 err = icm_size;
2344
- return err;
2351
+ goto out_free;
23452352 }
2346
-
2347
- dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1;
23482353
23492354 if (enable_4k_uar || !dev->persist->num_vfs) {
2350
- init_hca.log_uar_sz = ilog2(dev->caps.num_uars) +
2355
+ init_hca->log_uar_sz = ilog2(dev->caps.num_uars) +
23512356 PAGE_SHIFT - DEFAULT_UAR_PAGE_SHIFT;
2352
- init_hca.uar_page_sz = DEFAULT_UAR_PAGE_SHIFT - 12;
2357
+ init_hca->uar_page_sz = DEFAULT_UAR_PAGE_SHIFT - 12;
23532358 } else {
2354
- init_hca.log_uar_sz = ilog2(dev->caps.num_uars);
2355
- init_hca.uar_page_sz = PAGE_SHIFT - 12;
2359
+ init_hca->log_uar_sz = ilog2(dev->caps.num_uars);
2360
+ init_hca->uar_page_sz = PAGE_SHIFT - 12;
23562361 }
23572362
2358
- init_hca.mw_enabled = 0;
2363
+ init_hca->mw_enabled = 0;
23592364 if (dev->caps.flags & MLX4_DEV_CAP_FLAG_MEM_WINDOW ||
23602365 dev->caps.bmme_flags & MLX4_BMME_FLAG_TYPE_2_WIN)
2361
- init_hca.mw_enabled = INIT_HCA_TPT_MW_ENABLE;
2366
+ init_hca->mw_enabled = INIT_HCA_TPT_MW_ENABLE;
23622367
2363
- err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size);
2368
+ err = mlx4_init_icm(dev, dev_cap, init_hca, icm_size);
23642369 if (err)
2365
- return err;
2370
+ goto out_free;
23662371
2367
- err = mlx4_INIT_HCA(dev, &init_hca);
2372
+ err = mlx4_INIT_HCA(dev, init_hca);
23682373 if (err) {
23692374 mlx4_err(dev, "INIT_HCA command failed, aborting\n");
23702375 goto err_free_icm;
23712376 }
23722377
2373
- if (dev_cap.flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS) {
2374
- err = mlx4_query_func(dev, &dev_cap);
2378
+ if (dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS) {
2379
+ err = mlx4_query_func(dev, dev_cap);
23752380 if (err < 0) {
23762381 mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n");
23772382 goto err_close;
23782383 } else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) {
2379
- dev->caps.num_eqs = dev_cap.max_eqs;
2380
- dev->caps.reserved_eqs = dev_cap.reserved_eqs;
2381
- dev->caps.reserved_uars = dev_cap.reserved_uars;
2384
+ dev->caps.num_eqs = dev_cap->max_eqs;
2385
+ dev->caps.reserved_eqs = dev_cap->reserved_eqs;
2386
+ dev->caps.reserved_uars = dev_cap->reserved_uars;
23822387 }
23832388 }
23842389
....@@ -2387,14 +2392,13 @@
23872392 * read HCA frequency by QUERY_HCA command
23882393 */
23892394 if (dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS) {
2390
- memset(&init_hca, 0, sizeof(init_hca));
2391
- err = mlx4_QUERY_HCA(dev, &init_hca);
2395
+ err = mlx4_QUERY_HCA(dev, init_hca);
23922396 if (err) {
23932397 mlx4_err(dev, "QUERY_HCA command failed, disable timestamp\n");
23942398 dev->caps.flags2 &= ~MLX4_DEV_CAP_FLAG2_TS;
23952399 } else {
23962400 dev->caps.hca_core_clock =
2397
- init_hca.hca_core_clock;
2401
+ init_hca->hca_core_clock;
23982402 }
23992403
24002404 /* In case we got HCA frequency 0 - disable timestamping
....@@ -2470,7 +2474,8 @@
24702474 priv->eq_table.inta_pin = adapter.inta_pin;
24712475 memcpy(dev->board_id, adapter.board_id, sizeof(dev->board_id));
24722476
2473
- return 0;
2477
+ err = 0;
2478
+ goto out_free;
24742479
24752480 unmap_bf:
24762481 unmap_internal_clock(dev);
....@@ -2488,6 +2493,10 @@
24882493 err_free_icm:
24892494 if (!mlx4_is_slave(dev))
24902495 mlx4_free_icms(dev);
2496
+
2497
+out_free:
2498
+ kfree(dev_cap);
2499
+ kfree(init_hca);
24912500
24922501 return err;
24932502 }
....@@ -3028,6 +3037,17 @@
30283037 if (err)
30293038 return err;
30303039
3040
+ /* Ethernet and IB drivers will normally set the port type,
3041
+ * but if they are not built set the type now to prevent
3042
+ * devlink_port_type_warn() from firing.
3043
+ */
3044
+ if (!IS_ENABLED(CONFIG_MLX4_EN) &&
3045
+ dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
3046
+ devlink_port_type_eth_set(&info->devlink_port, NULL);
3047
+ else if (!IS_ENABLED(CONFIG_MLX4_INFINIBAND) &&
3048
+ dev->caps.port_type[port] == MLX4_PORT_TYPE_IB)
3049
+ devlink_port_type_ib_set(&info->devlink_port, NULL);
3050
+
30313051 info->dev = dev;
30323052 info->port = port;
30333053 if (!mlx4_is_slave(dev)) {
....@@ -3259,7 +3279,7 @@
32593279 free_mem:
32603280 dev->persist->num_vfs = 0;
32613281 kfree(dev->dev_vfs);
3262
- dev->dev_vfs = NULL;
3282
+ dev->dev_vfs = NULL;
32633283 return dev_flags & ~MLX4_FLAG_MASTER;
32643284 }
32653285
....@@ -3928,26 +3948,52 @@
39283948 }
39293949 }
39303950
3931
-static int mlx4_devlink_reload(struct devlink *devlink,
3932
- struct netlink_ext_ack *extack)
3951
+static void mlx4_restart_one_down(struct pci_dev *pdev);
3952
+static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload,
3953
+ struct devlink *devlink);
3954
+
3955
+static int mlx4_devlink_reload_down(struct devlink *devlink, bool netns_change,
3956
+ enum devlink_reload_action action,
3957
+ enum devlink_reload_limit limit,
3958
+ struct netlink_ext_ack *extack)
3959
+{
3960
+ struct mlx4_priv *priv = devlink_priv(devlink);
3961
+ struct mlx4_dev *dev = &priv->dev;
3962
+ struct mlx4_dev_persistent *persist = dev->persist;
3963
+
3964
+ if (netns_change) {
3965
+ NL_SET_ERR_MSG_MOD(extack, "Namespace change is not supported");
3966
+ return -EOPNOTSUPP;
3967
+ }
3968
+ if (persist->num_vfs)
3969
+ mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
3970
+ mlx4_restart_one_down(persist->pdev);
3971
+ return 0;
3972
+}
3973
+
3974
+static int mlx4_devlink_reload_up(struct devlink *devlink, enum devlink_reload_action action,
3975
+ enum devlink_reload_limit limit, u32 *actions_performed,
3976
+ struct netlink_ext_ack *extack)
39333977 {
39343978 struct mlx4_priv *priv = devlink_priv(devlink);
39353979 struct mlx4_dev *dev = &priv->dev;
39363980 struct mlx4_dev_persistent *persist = dev->persist;
39373981 int err;
39383982
3939
- if (persist->num_vfs)
3940
- mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
3941
- err = mlx4_restart_one(persist->pdev, true, devlink);
3983
+ *actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
3984
+ err = mlx4_restart_one_up(persist->pdev, true, devlink);
39423985 if (err)
3943
- mlx4_err(persist->dev, "mlx4_restart_one failed, ret=%d\n", err);
3986
+ mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n",
3987
+ err);
39443988
39453989 return err;
39463990 }
39473991
39483992 static const struct devlink_ops mlx4_devlink_ops = {
39493993 .port_type_set = mlx4_devlink_port_type_set,
3950
- .reload = mlx4_devlink_reload,
3994
+ .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
3995
+ .reload_down = mlx4_devlink_reload_down,
3996
+ .reload_up = mlx4_devlink_reload_up,
39513997 };
39523998
39533999 static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
....@@ -3990,6 +4036,8 @@
39904036 if (ret)
39914037 goto err_params_unregister;
39924038
4039
+ devlink_params_publish(devlink);
4040
+ devlink_reload_enable(devlink);
39934041 pci_save_state(pdev);
39944042 return 0;
39954043
....@@ -4101,6 +4149,8 @@
41014149 struct devlink *devlink = priv_to_devlink(priv);
41024150 int active_vfs = 0;
41034151
4152
+ devlink_reload_disable(devlink);
4153
+
41044154 if (mlx4_is_slave(dev))
41054155 persist->interface_state |= MLX4_INTERFACE_STATE_NOWAIT;
41064156
....@@ -4159,7 +4209,13 @@
41594209 return err;
41604210 }
41614211
4162
-int mlx4_restart_one(struct pci_dev *pdev, bool reload, struct devlink *devlink)
4212
+static void mlx4_restart_one_down(struct pci_dev *pdev)
4213
+{
4214
+ mlx4_unload_one(pdev);
4215
+}
4216
+
4217
+static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload,
4218
+ struct devlink *devlink)
41634219 {
41644220 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
41654221 struct mlx4_dev *dev = persist->dev;
....@@ -4171,7 +4227,6 @@
41714227 total_vfs = dev->persist->num_vfs;
41724228 memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
41734229
4174
- mlx4_unload_one(pdev);
41754230 if (reload)
41764231 mlx4_devlink_param_load_driverinit_values(devlink);
41774232 err = mlx4_load_one(pdev, pci_dev_data, total_vfs, nvfs, priv, 1);
....@@ -4188,6 +4243,12 @@
41884243 err);
41894244
41904245 return err;
4246
+}
4247
+
4248
+int mlx4_restart_one(struct pci_dev *pdev)
4249
+{
4250
+ mlx4_restart_one_down(pdev);
4251
+ return mlx4_restart_one_up(pdev, false, NULL);
41914252 }
41924253
41934254 #define MLX_SP(id) { PCI_VDEVICE(MELLANOX, id), MLX4_PCI_DEV_FORCE_SENSE_PORT }
....@@ -4334,8 +4395,9 @@
43344395 .resume = mlx4_pci_resume,
43354396 };
43364397
4337
-static int mlx4_suspend(struct pci_dev *pdev, pm_message_t state)
4398
+static int __maybe_unused mlx4_suspend(struct device *dev_d)
43384399 {
4400
+ struct pci_dev *pdev = to_pci_dev(dev_d);
43394401 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
43404402 struct mlx4_dev *dev = persist->dev;
43414403
....@@ -4348,8 +4410,9 @@
43484410 return 0;
43494411 }
43504412
4351
-static int mlx4_resume(struct pci_dev *pdev)
4413
+static int __maybe_unused mlx4_resume(struct device *dev_d)
43524414 {
4415
+ struct pci_dev *pdev = to_pci_dev(dev_d);
43534416 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
43544417 struct mlx4_dev *dev = persist->dev;
43554418 struct mlx4_priv *priv = mlx4_priv(dev);
....@@ -4378,14 +4441,15 @@
43784441 return ret;
43794442 }
43804443
4444
+static SIMPLE_DEV_PM_OPS(mlx4_pm_ops, mlx4_suspend, mlx4_resume);
4445
+
43814446 static struct pci_driver mlx4_driver = {
43824447 .name = DRV_NAME,
43834448 .id_table = mlx4_pci_table,
43844449 .probe = mlx4_init_one,
43854450 .shutdown = mlx4_shutdown,
43864451 .remove = mlx4_remove_one,
4387
- .suspend = mlx4_suspend,
4388
- .resume = mlx4_resume,
4452
+ .driver.pm = &mlx4_pm_ops,
43894453 .err_handler = &mlx4_err_handler,
43904454 };
43914455