Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'devlink-move-port-ops-into-separate-structure'

Jiri Pirko says:

====================
devlink: move port ops into separate structure

In devlink, some of the objects have separate ops registered alongside
with the object itself. Port however have ops in devlink_ops structure.
For drivers what register multiple kinds of ports with different ops
this is not convenient.

This patchset changes does following changes:
1) Introduces devlink_port_ops with functions that allow devlink port
to be registered passing a pointer to driver port ops. (patch #1)
2) Converts drivers to define port_ops and register ports passing the
ops pointer. (patches #2, #3, #4, #6, #8, and #9)
3) Moves ops from devlink_ops struct to devlink_port_ops.
(patches #5, #7, #10-15)

No functional changes.
====================

Link: https://lore.kernel.org/r/20230526102841.2226553-1-jiri@resnulli.us
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+298 -279
+7 -3
drivers/net/ethernet/intel/ice/ice_devlink.c
··· 1256 1256 BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE), 1257 1257 .reload_down = ice_devlink_reload_down, 1258 1258 .reload_up = ice_devlink_reload_up, 1259 - .port_split = ice_devlink_port_split, 1260 - .port_unsplit = ice_devlink_port_unsplit, 1261 1259 .eswitch_mode_get = ice_eswitch_mode_get, 1262 1260 .eswitch_mode_set = ice_eswitch_mode_set, 1263 1261 .info_get = ice_devlink_info_get, ··· 1510 1512 ice_active_port_option = active_idx; 1511 1513 } 1512 1514 1515 + static const struct devlink_port_ops ice_devlink_port_ops = { 1516 + .port_split = ice_devlink_port_split, 1517 + .port_unsplit = ice_devlink_port_unsplit, 1518 + }; 1519 + 1513 1520 /** 1514 1521 * ice_devlink_create_pf_port - Create a devlink port for this PF 1515 1522 * @pf: the PF to create a devlink port for ··· 1554 1551 devlink_port_attrs_set(devlink_port, &attrs); 1555 1552 devlink = priv_to_devlink(pf); 1556 1553 1557 - err = devlink_port_register(devlink, devlink_port, vsi->idx); 1554 + err = devlink_port_register_with_ops(devlink, devlink_port, vsi->idx, 1555 + &ice_devlink_port_ops); 1558 1556 if (err) { 1559 1557 dev_err(dev, "Failed to create devlink port for PF %d, error %d\n", 1560 1558 pf->hw.pf_id, err);
+31 -27
drivers/net/ethernet/mellanox/mlx4/main.c
··· 3024 3024 } 3025 3025 } 3026 3026 3027 + static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port, 3028 + enum devlink_port_type port_type) 3029 + { 3030 + struct mlx4_port_info *info = container_of(devlink_port, 3031 + struct mlx4_port_info, 3032 + devlink_port); 3033 + enum mlx4_port_type mlx4_port_type; 3034 + 3035 + switch (port_type) { 3036 + case DEVLINK_PORT_TYPE_AUTO: 3037 + mlx4_port_type = MLX4_PORT_TYPE_AUTO; 3038 + break; 3039 + case DEVLINK_PORT_TYPE_ETH: 3040 + mlx4_port_type = MLX4_PORT_TYPE_ETH; 3041 + break; 3042 + case DEVLINK_PORT_TYPE_IB: 3043 + mlx4_port_type = MLX4_PORT_TYPE_IB; 3044 + break; 3045 + default: 3046 + return -EOPNOTSUPP; 3047 + } 3048 + 3049 + return __set_port_type(info, mlx4_port_type); 3050 + } 3051 + 3052 + static const struct devlink_port_ops mlx4_devlink_port_ops = { 3053 + .port_type_set = mlx4_devlink_port_type_set, 3054 + }; 3055 + 3027 3056 static int mlx4_init_port_info(struct mlx4_dev *dev, int port) 3028 3057 { 3029 3058 struct devlink *devlink = priv_to_devlink(mlx4_priv(dev)); 3030 3059 struct mlx4_port_info *info = &mlx4_priv(dev)->port[port]; 3031 3060 int err; 3032 3061 3033 - err = devl_port_register(devlink, &info->devlink_port, port); 3062 + err = devl_port_register_with_ops(devlink, &info->devlink_port, port, 3063 + &mlx4_devlink_port_ops); 3034 3064 if (err) 3035 3065 return err; 3036 3066 ··· 3904 3874 return err; 3905 3875 } 3906 3876 3907 - static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port, 3908 - enum devlink_port_type port_type) 3909 - { 3910 - struct mlx4_port_info *info = container_of(devlink_port, 3911 - struct mlx4_port_info, 3912 - devlink_port); 3913 - enum mlx4_port_type mlx4_port_type; 3914 - 3915 - switch (port_type) { 3916 - case DEVLINK_PORT_TYPE_AUTO: 3917 - mlx4_port_type = MLX4_PORT_TYPE_AUTO; 3918 - break; 3919 - case DEVLINK_PORT_TYPE_ETH: 3920 - mlx4_port_type = MLX4_PORT_TYPE_ETH; 3921 - break; 3922 - case DEVLINK_PORT_TYPE_IB: 3923 - mlx4_port_type = MLX4_PORT_TYPE_IB; 3924 - break; 3925 - default: 3926 - return -EOPNOTSUPP; 3927 - } 3928 - 3929 - return __set_port_type(info, mlx4_port_type); 3930 - } 3931 - 3932 3877 static void mlx4_devlink_param_load_driverinit_values(struct devlink *devlink) 3933 3878 { 3934 3879 struct mlx4_priv *priv = devlink_priv(devlink); ··· 3988 3983 } 3989 3984 3990 3985 static const struct devlink_ops mlx4_devlink_ops = { 3991 - .port_type_set = mlx4_devlink_port_type_set, 3992 3986 .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT), 3993 3987 .reload_down = mlx4_devlink_reload_down, 3994 3988 .reload_up = mlx4_devlink_reload_up,
-9
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
··· 310 310 .eswitch_inline_mode_get = mlx5_devlink_eswitch_inline_mode_get, 311 311 .eswitch_encap_mode_set = mlx5_devlink_eswitch_encap_mode_set, 312 312 .eswitch_encap_mode_get = mlx5_devlink_eswitch_encap_mode_get, 313 - .port_function_hw_addr_get = mlx5_devlink_port_function_hw_addr_get, 314 - .port_function_hw_addr_set = mlx5_devlink_port_function_hw_addr_set, 315 313 .rate_leaf_tx_share_set = mlx5_esw_devlink_rate_leaf_tx_share_set, 316 314 .rate_leaf_tx_max_set = mlx5_esw_devlink_rate_leaf_tx_max_set, 317 315 .rate_node_tx_share_set = mlx5_esw_devlink_rate_node_tx_share_set, ··· 317 319 .rate_node_new = mlx5_esw_devlink_rate_node_new, 318 320 .rate_node_del = mlx5_esw_devlink_rate_node_del, 319 321 .rate_leaf_parent_set = mlx5_esw_devlink_rate_parent_set, 320 - .port_fn_roce_get = mlx5_devlink_port_fn_roce_get, 321 - .port_fn_roce_set = mlx5_devlink_port_fn_roce_set, 322 - .port_fn_migratable_get = mlx5_devlink_port_fn_migratable_get, 323 - .port_fn_migratable_set = mlx5_devlink_port_fn_migratable_set, 324 322 #endif 325 323 #ifdef CONFIG_MLX5_SF_MANAGER 326 324 .port_new = mlx5_devlink_sf_port_new, 327 - .port_del = mlx5_devlink_sf_port_del, 328 - .port_fn_state_get = mlx5_devlink_sf_port_fn_state_get, 329 - .port_fn_state_set = mlx5_devlink_sf_port_fn_state_set, 330 325 #endif 331 326 .flash_update = mlx5_devlink_flash_update, 332 327 .info_get = mlx5_devlink_info_get,
+6 -6
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
··· 506 506 struct netlink_ext_ack *extack); 507 507 int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, 508 508 enum devlink_eswitch_encap_mode *encap); 509 - int mlx5_devlink_port_function_hw_addr_get(struct devlink_port *port, 510 - u8 *hw_addr, int *hw_addr_len, 511 - struct netlink_ext_ack *extack); 512 - int mlx5_devlink_port_function_hw_addr_set(struct devlink_port *port, 513 - const u8 *hw_addr, int hw_addr_len, 514 - struct netlink_ext_ack *extack); 509 + int mlx5_devlink_port_fn_hw_addr_get(struct devlink_port *port, 510 + u8 *hw_addr, int *hw_addr_len, 511 + struct netlink_ext_ack *extack); 512 + int mlx5_devlink_port_fn_hw_addr_set(struct devlink_port *port, 513 + const u8 *hw_addr, int hw_addr_len, 514 + struct netlink_ext_ack *extack); 515 515 int mlx5_devlink_port_fn_roce_get(struct devlink_port *port, bool *is_enabled, 516 516 struct netlink_ext_ack *extack); 517 517 int mlx5_devlink_port_fn_roce_set(struct devlink_port *port, bool enable,
+6 -6
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
··· 3957 3957 mlx5_esw_is_sf_vport(esw, vport_num); 3958 3958 } 3959 3959 3960 - int mlx5_devlink_port_function_hw_addr_get(struct devlink_port *port, 3961 - u8 *hw_addr, int *hw_addr_len, 3962 - struct netlink_ext_ack *extack) 3960 + int mlx5_devlink_port_fn_hw_addr_get(struct devlink_port *port, 3961 + u8 *hw_addr, int *hw_addr_len, 3962 + struct netlink_ext_ack *extack) 3963 3963 { 3964 3964 struct mlx5_eswitch *esw; 3965 3965 struct mlx5_vport *vport; ··· 3986 3986 return 0; 3987 3987 } 3988 3988 3989 - int mlx5_devlink_port_function_hw_addr_set(struct devlink_port *port, 3990 - const u8 *hw_addr, int hw_addr_len, 3991 - struct netlink_ext_ack *extack) 3989 + int mlx5_devlink_port_fn_hw_addr_set(struct devlink_port *port, 3990 + const u8 *hw_addr, int hw_addr_len, 3991 + struct netlink_ext_ack *extack) 3992 3992 { 3993 3993 struct mlx5_eswitch *esw; 3994 3994 u16 vport_num;
+7 -3
drivers/net/ethernet/mellanox/mlxsw/core.c
··· 1723 1723 BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE), 1724 1724 .reload_down = mlxsw_devlink_core_bus_device_reload_down, 1725 1725 .reload_up = mlxsw_devlink_core_bus_device_reload_up, 1726 - .port_split = mlxsw_devlink_port_split, 1727 - .port_unsplit = mlxsw_devlink_port_unsplit, 1728 1726 .sb_pool_get = mlxsw_devlink_sb_pool_get, 1729 1727 .sb_pool_set = mlxsw_devlink_sb_pool_set, 1730 1728 .sb_port_pool_get = mlxsw_devlink_sb_port_pool_get, ··· 3114 3116 } 3115 3117 EXPORT_SYMBOL(mlxsw_core_res_get); 3116 3118 3119 + static const struct devlink_port_ops mlxsw_devlink_port_ops = { 3120 + .port_split = mlxsw_devlink_port_split, 3121 + .port_unsplit = mlxsw_devlink_port_unsplit, 3122 + }; 3123 + 3117 3124 static int __mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u16 local_port, 3118 3125 enum devlink_port_flavour flavour, 3119 3126 u8 slot_index, u32 port_number, bool split, ··· 3153 3150 devlink_port_linecard_set(devlink_port, 3154 3151 linecard->devlink_linecard); 3155 3152 } 3156 - err = devl_port_register(devlink, devlink_port, local_port); 3153 + err = devl_port_register_with_ops(devlink, devlink_port, local_port, 3154 + &mlxsw_devlink_port_ops); 3157 3155 if (err) 3158 3156 memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port)); 3159 3157 return err;
+7 -3
drivers/net/ethernet/netronome/nfp/nfp_devlink.c
··· 311 311 } 312 312 313 313 const struct devlink_ops nfp_devlink_ops = { 314 - .port_split = nfp_devlink_port_split, 315 - .port_unsplit = nfp_devlink_port_unsplit, 316 314 .sb_pool_get = nfp_devlink_sb_pool_get, 317 315 .sb_pool_set = nfp_devlink_sb_pool_set, 318 316 .eswitch_mode_get = nfp_devlink_eswitch_mode_get, 319 317 .eswitch_mode_set = nfp_devlink_eswitch_mode_set, 320 318 .info_get = nfp_devlink_info_get, 321 319 .flash_update = nfp_devlink_flash_update, 320 + }; 321 + 322 + static const struct devlink_port_ops nfp_devlink_port_ops = { 323 + .port_split = nfp_devlink_port_split, 324 + .port_unsplit = nfp_devlink_port_unsplit, 322 325 }; 323 326 324 327 int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) ··· 354 351 355 352 devlink = priv_to_devlink(app->pf); 356 353 357 - return devl_port_register(devlink, &port->dl_port, port->eth_id); 354 + return devl_port_register_with_ops(devlink, &port->dl_port, 355 + port->eth_id, &nfp_devlink_port_ops); 358 356 } 359 357 360 358 void nfp_devlink_port_unregister(struct nfp_port *port)
+42 -38
drivers/net/ethernet/sfc/efx_devlink.c
··· 25 25 }; 26 26 27 27 #ifdef CONFIG_SFC_SRIOV 28 - static void efx_devlink_del_port(struct devlink_port *dl_port) 29 - { 30 - if (!dl_port) 31 - return; 32 - devl_port_unregister(dl_port); 33 - } 34 - 35 - static int efx_devlink_add_port(struct efx_nic *efx, 36 - struct mae_mport_desc *mport) 37 - { 38 - bool external = false; 39 - 40 - if (!ef100_mport_on_local_intf(efx, mport)) 41 - external = true; 42 - 43 - switch (mport->mport_type) { 44 - case MAE_MPORT_DESC_MPORT_TYPE_VNIC: 45 - if (mport->vf_idx != MAE_MPORT_DESC_VF_IDX_NULL) 46 - devlink_port_attrs_pci_vf_set(&mport->dl_port, 0, mport->pf_idx, 47 - mport->vf_idx, 48 - external); 49 - else 50 - devlink_port_attrs_pci_pf_set(&mport->dl_port, 0, mport->pf_idx, 51 - external); 52 - break; 53 - default: 54 - /* MAE_MPORT_DESC_MPORT_ALIAS and UNDEFINED */ 55 - return 0; 56 - } 57 - 58 - mport->dl_port.index = mport->mport_id; 59 - 60 - return devl_port_register(efx->devlink, &mport->dl_port, mport->mport_id); 61 - } 62 28 63 29 static int efx_devlink_port_addr_get(struct devlink_port *port, u8 *hw_addr, 64 30 int *hw_addr_len, ··· 122 156 mport_desc->mport_id); 123 157 124 158 return rc; 159 + } 160 + 161 + static const struct devlink_port_ops sfc_devlink_port_ops = { 162 + .port_fn_hw_addr_get = efx_devlink_port_addr_get, 163 + .port_fn_hw_addr_set = efx_devlink_port_addr_set, 164 + }; 165 + 166 + static void efx_devlink_del_port(struct devlink_port *dl_port) 167 + { 168 + if (!dl_port) 169 + return; 170 + devl_port_unregister(dl_port); 171 + } 172 + 173 + static int efx_devlink_add_port(struct efx_nic *efx, 174 + struct mae_mport_desc *mport) 175 + { 176 + bool external = false; 177 + 178 + if (!ef100_mport_on_local_intf(efx, mport)) 179 + external = true; 180 + 181 + switch (mport->mport_type) { 182 + case MAE_MPORT_DESC_MPORT_TYPE_VNIC: 183 + if (mport->vf_idx != MAE_MPORT_DESC_VF_IDX_NULL) 184 + devlink_port_attrs_pci_vf_set(&mport->dl_port, 0, mport->pf_idx, 185 + mport->vf_idx, 186 + external); 187 + else 188 + devlink_port_attrs_pci_pf_set(&mport->dl_port, 0, mport->pf_idx, 189 + external); 190 + break; 191 + default: 192 + /* MAE_MPORT_DESC_MPORT_ALIAS and UNDEFINED */ 193 + return 0; 194 + } 195 + 196 + mport->dl_port.index = mport->mport_id; 197 + 198 + return devl_port_register_with_ops(efx->devlink, &mport->dl_port, 199 + mport->mport_id, 200 + &sfc_devlink_port_ops); 125 201 } 126 202 127 203 #endif ··· 617 609 618 610 static const struct devlink_ops sfc_devlink_ops = { 619 611 .info_get = efx_devlink_info_get, 620 - #ifdef CONFIG_SFC_SRIOV 621 - .port_function_hw_addr_get = efx_devlink_port_addr_get, 622 - .port_function_hw_addr_set = efx_devlink_port_addr_set, 623 - #endif 624 612 }; 625 613 626 614 #ifdef CONFIG_SFC_SRIOV
+108 -120
include/net/devlink.h
··· 123 123 struct list_head list; 124 124 struct list_head region_list; 125 125 struct devlink *devlink; 126 + const struct devlink_port_ops *ops; 126 127 unsigned int index; 127 128 spinlock_t type_lock; /* Protects type and type_eth/ib 128 129 * structures consistency. ··· 1274 1273 int (*reload_up)(struct devlink *devlink, enum devlink_reload_action action, 1275 1274 enum devlink_reload_limit limit, u32 *actions_performed, 1276 1275 struct netlink_ext_ack *extack); 1277 - int (*port_type_set)(struct devlink_port *devlink_port, 1278 - enum devlink_port_type port_type); 1279 - int (*port_split)(struct devlink *devlink, struct devlink_port *port, 1280 - unsigned int count, struct netlink_ext_ack *extack); 1281 - int (*port_unsplit)(struct devlink *devlink, struct devlink_port *port, 1282 - struct netlink_ext_ack *extack); 1283 1276 int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index, 1284 1277 u16 pool_index, 1285 1278 struct devlink_sb_pool_info *pool_info); ··· 1430 1435 const struct devlink_trap_policer *policer, 1431 1436 u64 *p_drops); 1432 1437 /** 1433 - * @port_function_hw_addr_get: Port function's hardware address get function. 1434 - * 1435 - * Should be used by device drivers to report the hardware address of a function managed 1436 - * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port 1437 - * function handling for a particular port. 1438 - * 1439 - * Note: @extack can be NULL when port notifier queries the port function. 1440 - */ 1441 - int (*port_function_hw_addr_get)(struct devlink_port *port, u8 *hw_addr, 1442 - int *hw_addr_len, 1443 - struct netlink_ext_ack *extack); 1444 - /** 1445 - * @port_function_hw_addr_set: Port function's hardware address set function. 1446 - * 1447 - * Should be used by device drivers to set the hardware address of a function managed 1448 - * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port 1449 - * function handling for a particular port. 1450 - */ 1451 - int (*port_function_hw_addr_set)(struct devlink_port *port, 1452 - const u8 *hw_addr, int hw_addr_len, 1453 - struct netlink_ext_ack *extack); 1454 - /** 1455 - * @port_fn_roce_get: Port function's roce get function. 1456 - * 1457 - * Query RoCE state of a function managed by the devlink port. 1458 - * Return -EOPNOTSUPP if port function RoCE handling is not supported. 1459 - */ 1460 - int (*port_fn_roce_get)(struct devlink_port *devlink_port, 1461 - bool *is_enable, 1462 - struct netlink_ext_ack *extack); 1463 - /** 1464 - * @port_fn_roce_set: Port function's roce set function. 1465 - * 1466 - * Enable/Disable the RoCE state of a function managed by the devlink 1467 - * port. 1468 - * Return -EOPNOTSUPP if port function RoCE handling is not supported. 1469 - */ 1470 - int (*port_fn_roce_set)(struct devlink_port *devlink_port, 1471 - bool enable, struct netlink_ext_ack *extack); 1472 - /** 1473 - * @port_fn_migratable_get: Port function's migratable get function. 1474 - * 1475 - * Query migratable state of a function managed by the devlink port. 1476 - * Return -EOPNOTSUPP if port function migratable handling is not 1477 - * supported. 1478 - */ 1479 - int (*port_fn_migratable_get)(struct devlink_port *devlink_port, 1480 - bool *is_enable, 1481 - struct netlink_ext_ack *extack); 1482 - /** 1483 - * @port_fn_migratable_set: Port function's migratable set function. 1484 - * 1485 - * Enable/Disable migratable state of a function managed by the devlink 1486 - * port. 1487 - * Return -EOPNOTSUPP if port function migratable handling is not 1488 - * supported. 1489 - */ 1490 - int (*port_fn_migratable_set)(struct devlink_port *devlink_port, 1491 - bool enable, 1492 - struct netlink_ext_ack *extack); 1493 - /** 1494 1438 * port_new() - Add a new port function of a specified flavor 1495 1439 * @devlink: Devlink instance 1496 1440 * @attrs: attributes of the new port ··· 1447 1513 int (*port_new)(struct devlink *devlink, 1448 1514 const struct devlink_port_new_attrs *attrs, 1449 1515 struct netlink_ext_ack *extack); 1450 - /** 1451 - * port_del() - Delete a port function 1452 - * @devlink: Devlink instance 1453 - * @port: The devlink port 1454 - * @extack: extack for reporting error messages 1455 - * 1456 - * Devlink core will call this device driver function upon user request 1457 - * to delete a previously created port function 1458 - * 1459 - * Notes: 1460 - * - On success, drivers must unregister the corresponding devlink 1461 - * port 1462 - * 1463 - * Return: 0 on success, negative value otherwise. 1464 - */ 1465 - int (*port_del)(struct devlink *devlink, struct devlink_port *port, 1466 - struct netlink_ext_ack *extack); 1467 - /** 1468 - * port_fn_state_get() - Get the state of a port function 1469 - * @devlink: Devlink instance 1470 - * @port: The devlink port 1471 - * @state: Admin configured state 1472 - * @opstate: Current operational state 1473 - * @extack: extack for reporting error messages 1474 - * 1475 - * Reports the admin and operational state of a devlink port function 1476 - * 1477 - * Return: 0 on success, negative value otherwise. 1478 - */ 1479 - int (*port_fn_state_get)(struct devlink_port *port, 1480 - enum devlink_port_fn_state *state, 1481 - enum devlink_port_fn_opstate *opstate, 1482 - struct netlink_ext_ack *extack); 1483 - /** 1484 - * port_fn_state_set() - Set the admin state of a port function 1485 - * @devlink: Devlink instance 1486 - * @port: The devlink port 1487 - * @state: Admin state 1488 - * @extack: extack for reporting error messages 1489 - * 1490 - * Set the admin state of a devlink port function 1491 - * 1492 - * Return: 0 on success, negative value otherwise. 1493 - */ 1494 - int (*port_fn_state_set)(struct devlink_port *port, 1495 - enum devlink_port_fn_state state, 1496 - struct netlink_ext_ack *extack); 1497 1516 1498 1517 /** 1499 1518 * Rate control callbacks. ··· 1536 1649 void devlink_register(struct devlink *devlink); 1537 1650 void devlink_unregister(struct devlink *devlink); 1538 1651 void devlink_free(struct devlink *devlink); 1652 + 1653 + /** 1654 + * struct devlink_port_ops - Port operations 1655 + * @port_split: Callback used to split the port into multiple ones. 1656 + * @port_unsplit: Callback used to unsplit the port group back into 1657 + * a single port. 1658 + * @port_type_set: Callback used to set a type of a port. 1659 + * @port_del: Callback used to delete selected port along with related function. 1660 + * Devlink core calls this upon user request to delete 1661 + * a port previously created by devlink_ops->port_new(). 1662 + * @port_fn_hw_addr_get: Callback used to set port function's hardware address. 1663 + * Should be used by device drivers to report 1664 + * the hardware address of a function managed 1665 + * by the devlink port. 1666 + * @port_fn_hw_addr_set: Callback used to set port function's hardware address. 1667 + * Should be used by device drivers to set the hardware 1668 + * address of a function managed by the devlink port. 1669 + * @port_fn_roce_get: Callback used to get port function's RoCE capability. 1670 + * Should be used by device drivers to report 1671 + * the current state of RoCE capability of a function 1672 + * managed by the devlink port. 1673 + * @port_fn_roce_set: Callback used to set port function's RoCE capability. 1674 + * Should be used by device drivers to enable/disable 1675 + * RoCE capability of a function managed 1676 + * by the devlink port. 1677 + * @port_fn_migratable_get: Callback used to get port function's migratable 1678 + * capability. Should be used by device drivers 1679 + * to report the current state of migratable capability 1680 + * of a function managed by the devlink port. 1681 + * @port_fn_migratable_set: Callback used to set port function's migratable 1682 + * capability. Should be used by device drivers 1683 + * to enable/disable migratable capability of 1684 + * a function managed by the devlink port. 1685 + * @port_fn_state_get: Callback used to get port function's state. 1686 + * Should be used by device drivers to report 1687 + * the current admin and operational state of a 1688 + * function managed by the devlink port. 1689 + * @port_fn_state_set: Callback used to get port function's state. 1690 + * Should be used by device drivers set 1691 + * the admin state of a function managed 1692 + * by the devlink port. 1693 + * 1694 + * Note: Driver should return -EOPNOTSUPP if it doesn't support 1695 + * port function (@port_fn_*) handling for a particular port. 1696 + */ 1697 + struct devlink_port_ops { 1698 + int (*port_split)(struct devlink *devlink, struct devlink_port *port, 1699 + unsigned int count, struct netlink_ext_ack *extack); 1700 + int (*port_unsplit)(struct devlink *devlink, struct devlink_port *port, 1701 + struct netlink_ext_ack *extack); 1702 + int (*port_type_set)(struct devlink_port *devlink_port, 1703 + enum devlink_port_type port_type); 1704 + int (*port_del)(struct devlink *devlink, struct devlink_port *port, 1705 + struct netlink_ext_ack *extack); 1706 + int (*port_fn_hw_addr_get)(struct devlink_port *port, u8 *hw_addr, 1707 + int *hw_addr_len, 1708 + struct netlink_ext_ack *extack); 1709 + int (*port_fn_hw_addr_set)(struct devlink_port *port, 1710 + const u8 *hw_addr, int hw_addr_len, 1711 + struct netlink_ext_ack *extack); 1712 + int (*port_fn_roce_get)(struct devlink_port *devlink_port, 1713 + bool *is_enable, 1714 + struct netlink_ext_ack *extack); 1715 + int (*port_fn_roce_set)(struct devlink_port *devlink_port, 1716 + bool enable, struct netlink_ext_ack *extack); 1717 + int (*port_fn_migratable_get)(struct devlink_port *devlink_port, 1718 + bool *is_enable, 1719 + struct netlink_ext_ack *extack); 1720 + int (*port_fn_migratable_set)(struct devlink_port *devlink_port, 1721 + bool enable, 1722 + struct netlink_ext_ack *extack); 1723 + int (*port_fn_state_get)(struct devlink_port *port, 1724 + enum devlink_port_fn_state *state, 1725 + enum devlink_port_fn_opstate *opstate, 1726 + struct netlink_ext_ack *extack); 1727 + int (*port_fn_state_set)(struct devlink_port *port, 1728 + enum devlink_port_fn_state state, 1729 + struct netlink_ext_ack *extack); 1730 + }; 1731 + 1539 1732 void devlink_port_init(struct devlink *devlink, 1540 1733 struct devlink_port *devlink_port); 1541 1734 void devlink_port_fini(struct devlink_port *devlink_port); 1542 - int devl_port_register(struct devlink *devlink, 1543 - struct devlink_port *devlink_port, 1544 - unsigned int port_index); 1545 - int devlink_port_register(struct devlink *devlink, 1546 - struct devlink_port *devlink_port, 1547 - unsigned int port_index); 1735 + 1736 + int devl_port_register_with_ops(struct devlink *devlink, 1737 + struct devlink_port *devlink_port, 1738 + unsigned int port_index, 1739 + const struct devlink_port_ops *ops); 1740 + 1741 + static inline int devl_port_register(struct devlink *devlink, 1742 + struct devlink_port *devlink_port, 1743 + unsigned int port_index) 1744 + { 1745 + return devl_port_register_with_ops(devlink, devlink_port, 1746 + port_index, NULL); 1747 + } 1748 + 1749 + int devlink_port_register_with_ops(struct devlink *devlink, 1750 + struct devlink_port *devlink_port, 1751 + unsigned int port_index, 1752 + const struct devlink_port_ops *ops); 1753 + 1754 + static inline int devlink_port_register(struct devlink *devlink, 1755 + struct devlink_port *devlink_port, 1756 + unsigned int port_index) 1757 + { 1758 + return devlink_port_register_with_ops(devlink, devlink_port, 1759 + port_index, NULL); 1760 + } 1761 + 1548 1762 void devl_port_unregister(struct devlink_port *devlink_port); 1549 1763 void devlink_port_unregister(struct devlink_port *devlink_port); 1550 1764 void devlink_port_type_eth_set(struct devlink_port *devlink_port);
+57 -62
net/devlink/leftover.c
··· 447 447 caps->value |= cap; 448 448 } 449 449 450 - static int devlink_port_fn_roce_fill(const struct devlink_ops *ops, 451 - struct devlink_port *devlink_port, 450 + static int devlink_port_fn_roce_fill(struct devlink_port *devlink_port, 452 451 struct nla_bitfield32 *caps, 453 452 struct netlink_ext_ack *extack) 454 453 { 455 454 bool is_enable; 456 455 int err; 457 456 458 - if (!ops->port_fn_roce_get) 457 + if (!devlink_port->ops->port_fn_roce_get) 459 458 return 0; 460 459 461 - err = ops->port_fn_roce_get(devlink_port, &is_enable, extack); 460 + err = devlink_port->ops->port_fn_roce_get(devlink_port, &is_enable, 461 + extack); 462 462 if (err) { 463 463 if (err == -EOPNOTSUPP) 464 464 return 0; ··· 469 469 return 0; 470 470 } 471 471 472 - static int devlink_port_fn_migratable_fill(const struct devlink_ops *ops, 473 - struct devlink_port *devlink_port, 472 + static int devlink_port_fn_migratable_fill(struct devlink_port *devlink_port, 474 473 struct nla_bitfield32 *caps, 475 474 struct netlink_ext_ack *extack) 476 475 { 477 476 bool is_enable; 478 477 int err; 479 478 480 - if (!ops->port_fn_migratable_get || 479 + if (!devlink_port->ops->port_fn_migratable_get || 481 480 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) 482 481 return 0; 483 482 484 - err = ops->port_fn_migratable_get(devlink_port, &is_enable, extack); 483 + err = devlink_port->ops->port_fn_migratable_get(devlink_port, 484 + &is_enable, extack); 485 485 if (err) { 486 486 if (err == -EOPNOTSUPP) 487 487 return 0; ··· 492 492 return 0; 493 493 } 494 494 495 - static int devlink_port_fn_caps_fill(const struct devlink_ops *ops, 496 - struct devlink_port *devlink_port, 495 + static int devlink_port_fn_caps_fill(struct devlink_port *devlink_port, 497 496 struct sk_buff *msg, 498 497 struct netlink_ext_ack *extack, 499 498 bool *msg_updated) ··· 500 501 struct nla_bitfield32 caps = {}; 501 502 int err; 502 503 503 - err = devlink_port_fn_roce_fill(ops, devlink_port, &caps, extack); 504 + err = devlink_port_fn_roce_fill(devlink_port, &caps, extack); 504 505 if (err) 505 506 return err; 506 507 507 - err = devlink_port_fn_migratable_fill(ops, devlink_port, &caps, extack); 508 + err = devlink_port_fn_migratable_fill(devlink_port, &caps, extack); 508 509 if (err) 509 510 return err; 510 511 ··· 690 691 return 0; 691 692 } 692 693 693 - static int devlink_port_fn_hw_addr_fill(const struct devlink_ops *ops, 694 - struct devlink_port *port, 694 + static int devlink_port_fn_hw_addr_fill(struct devlink_port *port, 695 695 struct sk_buff *msg, 696 696 struct netlink_ext_ack *extack, 697 697 bool *msg_updated) ··· 699 701 int hw_addr_len; 700 702 int err; 701 703 702 - if (!ops->port_function_hw_addr_get) 704 + if (!port->ops->port_fn_hw_addr_get) 703 705 return 0; 704 706 705 - err = ops->port_function_hw_addr_get(port, hw_addr, &hw_addr_len, 707 + err = port->ops->port_fn_hw_addr_get(port, hw_addr, &hw_addr_len, 706 708 extack); 707 709 if (err) { 708 710 if (err == -EOPNOTSUPP) ··· 787 789 opstate == DEVLINK_PORT_FN_OPSTATE_ATTACHED; 788 790 } 789 791 790 - static int devlink_port_fn_state_fill(const struct devlink_ops *ops, 791 - struct devlink_port *port, 792 + static int devlink_port_fn_state_fill(struct devlink_port *port, 792 793 struct sk_buff *msg, 793 794 struct netlink_ext_ack *extack, 794 795 bool *msg_updated) ··· 796 799 enum devlink_port_fn_state state; 797 800 int err; 798 801 799 - if (!ops->port_fn_state_get) 802 + if (!port->ops->port_fn_state_get) 800 803 return 0; 801 804 802 - err = ops->port_fn_state_get(port, &state, &opstate, extack); 805 + err = port->ops->port_fn_state_get(port, &state, &opstate, extack); 803 806 if (err) { 804 807 if (err == -EOPNOTSUPP) 805 808 return 0; ··· 826 829 devlink_port_fn_mig_set(struct devlink_port *devlink_port, bool enable, 827 830 struct netlink_ext_ack *extack) 828 831 { 829 - const struct devlink_ops *ops = devlink_port->devlink->ops; 830 - 831 - return ops->port_fn_migratable_set(devlink_port, enable, extack); 832 + return devlink_port->ops->port_fn_migratable_set(devlink_port, enable, 833 + extack); 832 834 } 833 835 834 836 static int 835 837 devlink_port_fn_roce_set(struct devlink_port *devlink_port, bool enable, 836 838 struct netlink_ext_ack *extack) 837 839 { 838 - const struct devlink_ops *ops = devlink_port->devlink->ops; 839 - 840 - return ops->port_fn_roce_set(devlink_port, enable, extack); 840 + return devlink_port->ops->port_fn_roce_set(devlink_port, enable, 841 + extack); 841 842 } 842 843 843 844 static int devlink_port_fn_caps_set(struct devlink_port *devlink_port, ··· 869 874 devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port, 870 875 struct netlink_ext_ack *extack) 871 876 { 872 - const struct devlink_ops *ops; 873 877 struct nlattr *function_attr; 874 878 bool msg_updated = false; 875 879 int err; ··· 877 883 if (!function_attr) 878 884 return -EMSGSIZE; 879 885 880 - ops = port->devlink->ops; 881 - err = devlink_port_fn_hw_addr_fill(ops, port, msg, extack, 882 - &msg_updated); 886 + err = devlink_port_fn_hw_addr_fill(port, msg, extack, &msg_updated); 883 887 if (err) 884 888 goto out; 885 - err = devlink_port_fn_caps_fill(ops, port, msg, extack, 886 - &msg_updated); 889 + err = devlink_port_fn_caps_fill(port, msg, extack, &msg_updated); 887 890 if (err) 888 891 goto out; 889 - err = devlink_port_fn_state_fill(ops, port, msg, extack, &msg_updated); 892 + err = devlink_port_fn_state_fill(port, msg, extack, &msg_updated); 890 893 out: 891 894 if (err || !msg_updated) 892 895 nla_nest_cancel(msg, function_attr); ··· 1128 1137 { 1129 1138 int err; 1130 1139 1131 - if (!devlink_port->devlink->ops->port_type_set) 1140 + if (!devlink_port->ops->port_type_set) 1132 1141 return -EOPNOTSUPP; 1133 1142 1134 1143 if (port_type == devlink_port->type) 1135 1144 return 0; 1136 1145 1137 - err = devlink_port->devlink->ops->port_type_set(devlink_port, 1138 - port_type); 1146 + err = devlink_port->ops->port_type_set(devlink_port, port_type); 1139 1147 if (err) 1140 1148 return err; 1141 1149 ··· 1147 1157 const struct nlattr *attr, 1148 1158 struct netlink_ext_ack *extack) 1149 1159 { 1150 - const struct devlink_ops *ops = port->devlink->ops; 1151 1160 const u8 *hw_addr; 1152 1161 int hw_addr_len; 1153 1162 ··· 1167 1178 } 1168 1179 } 1169 1180 1170 - return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len, 1181 + return port->ops->port_fn_hw_addr_set(port, hw_addr, hw_addr_len, 1171 1182 extack); 1172 1183 } 1173 1184 ··· 1176 1187 struct netlink_ext_ack *extack) 1177 1188 { 1178 1189 enum devlink_port_fn_state state; 1179 - const struct devlink_ops *ops; 1180 1190 1181 1191 state = nla_get_u8(attr); 1182 - ops = port->devlink->ops; 1183 - return ops->port_fn_state_set(port, state, extack); 1192 + return port->ops->port_fn_state_set(port, state, extack); 1184 1193 } 1185 1194 1186 1195 static int devlink_port_function_validate(struct devlink_port *devlink_port, 1187 1196 struct nlattr **tb, 1188 1197 struct netlink_ext_ack *extack) 1189 1198 { 1190 - const struct devlink_ops *ops = devlink_port->devlink->ops; 1199 + const struct devlink_port_ops *ops = devlink_port->ops; 1191 1200 struct nlattr *attr; 1192 1201 1193 1202 if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] && 1194 - !ops->port_function_hw_addr_set) { 1203 + !ops->port_fn_hw_addr_set) { 1195 1204 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR], 1196 1205 "Port doesn't support function attributes"); 1197 1206 return -EOPNOTSUPP; ··· 1307 1320 1308 1321 if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_SPLIT_COUNT)) 1309 1322 return -EINVAL; 1310 - if (!devlink->ops->port_split) 1323 + if (!devlink_port->ops->port_split) 1311 1324 return -EOPNOTSUPP; 1312 1325 1313 1326 count = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT]); ··· 1326 1339 return -EINVAL; 1327 1340 } 1328 1341 1329 - return devlink->ops->port_split(devlink, devlink_port, count, 1330 - info->extack); 1342 + return devlink_port->ops->port_split(devlink, devlink_port, count, 1343 + info->extack); 1331 1344 } 1332 1345 1333 1346 static int devlink_nl_cmd_port_unsplit_doit(struct sk_buff *skb, ··· 1336 1349 struct devlink_port *devlink_port = info->user_ptr[1]; 1337 1350 struct devlink *devlink = info->user_ptr[0]; 1338 1351 1339 - if (!devlink->ops->port_unsplit) 1352 + if (!devlink_port->ops->port_unsplit) 1340 1353 return -EOPNOTSUPP; 1341 - return devlink->ops->port_unsplit(devlink, devlink_port, info->extack); 1354 + return devlink_port->ops->port_unsplit(devlink, devlink_port, info->extack); 1342 1355 } 1343 1356 1344 1357 static int devlink_nl_cmd_port_new_doit(struct sk_buff *skb, ··· 1348 1361 struct devlink_port_new_attrs new_attrs = {}; 1349 1362 struct devlink *devlink = info->user_ptr[0]; 1350 1363 1351 - if (!devlink->ops->port_new || !devlink->ops->port_del) 1364 + if (!devlink->ops->port_new) 1352 1365 return -EOPNOTSUPP; 1353 1366 1354 1367 if (!info->attrs[DEVLINK_ATTR_PORT_FLAVOUR] || ··· 1387 1400 struct netlink_ext_ack *extack = info->extack; 1388 1401 struct devlink *devlink = info->user_ptr[0]; 1389 1402 1390 - if (!devlink->ops->port_del) 1403 + if (!devlink_port->ops->port_del) 1391 1404 return -EOPNOTSUPP; 1392 1405 1393 - return devlink->ops->port_del(devlink, devlink_port, extack); 1406 + return devlink_port->ops->port_del(devlink, devlink_port, extack); 1394 1407 } 1395 1408 1396 1409 static int ··· 6780 6793 } 6781 6794 EXPORT_SYMBOL_GPL(devlink_port_fini); 6782 6795 6796 + static const struct devlink_port_ops devlink_port_dummy_ops = {}; 6797 + 6783 6798 /** 6784 - * devl_port_register() - Register devlink port 6799 + * devl_port_register_with_ops() - Register devlink port 6785 6800 * 6786 6801 * @devlink: devlink 6787 6802 * @devlink_port: devlink port 6788 6803 * @port_index: driver-specific numerical identifier of the port 6804 + * @ops: port ops 6789 6805 * 6790 6806 * Register devlink port with provided port index. User can use 6791 6807 * any indexing, even hw-related one. devlink_port structure ··· 6796 6806 * Note that the caller should take care of zeroing the devlink_port 6797 6807 * structure. 6798 6808 */ 6799 - int devl_port_register(struct devlink *devlink, 6800 - struct devlink_port *devlink_port, 6801 - unsigned int port_index) 6809 + int devl_port_register_with_ops(struct devlink *devlink, 6810 + struct devlink_port *devlink_port, 6811 + unsigned int port_index, 6812 + const struct devlink_port_ops *ops) 6802 6813 { 6803 6814 int err; 6804 6815 ··· 6810 6819 devlink_port_init(devlink, devlink_port); 6811 6820 devlink_port->registered = true; 6812 6821 devlink_port->index = port_index; 6822 + devlink_port->ops = ops ? ops : &devlink_port_dummy_ops; 6813 6823 spin_lock_init(&devlink_port->type_lock); 6814 6824 INIT_LIST_HEAD(&devlink_port->reporter_list); 6815 6825 err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL); ··· 6822 6830 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); 6823 6831 return 0; 6824 6832 } 6825 - EXPORT_SYMBOL_GPL(devl_port_register); 6833 + EXPORT_SYMBOL_GPL(devl_port_register_with_ops); 6826 6834 6827 6835 /** 6828 - * devlink_port_register - Register devlink port 6836 + * devlink_port_register_with_ops - Register devlink port 6829 6837 * 6830 6838 * @devlink: devlink 6831 6839 * @devlink_port: devlink port 6832 6840 * @port_index: driver-specific numerical identifier of the port 6841 + * @ops: port ops 6833 6842 * 6834 6843 * Register devlink port with provided port index. User can use 6835 6844 * any indexing, even hw-related one. devlink_port structure ··· 6840 6847 * 6841 6848 * Context: Takes and release devlink->lock <mutex>. 6842 6849 */ 6843 - int devlink_port_register(struct devlink *devlink, 6844 - struct devlink_port *devlink_port, 6845 - unsigned int port_index) 6850 + int devlink_port_register_with_ops(struct devlink *devlink, 6851 + struct devlink_port *devlink_port, 6852 + unsigned int port_index, 6853 + const struct devlink_port_ops *ops) 6846 6854 { 6847 6855 int err; 6848 6856 6849 6857 devl_lock(devlink); 6850 - err = devl_port_register(devlink, devlink_port, port_index); 6858 + err = devl_port_register_with_ops(devlink, devlink_port, 6859 + port_index, ops); 6851 6860 devl_unlock(devlink); 6852 6861 return err; 6853 6862 } 6854 - EXPORT_SYMBOL_GPL(devlink_port_register); 6863 + EXPORT_SYMBOL_GPL(devlink_port_register_with_ops); 6855 6864 6856 6865 /** 6857 6866 * devl_port_unregister() - Unregister devlink port