/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2024, Intel Corporation. */ #ifndef _DEVLINK_PORT_H_ #define _DEVLINK_PORT_H_ #include "../ice.h" #include "../ice_sf_eth.h" /** * struct ice_dynamic_port - Track dynamically added devlink port instance * @hw_addr: the HW address for this port * @active: true if the port has been activated * @attached: true it the prot is attached * @devlink_port: the associated devlink port structure * @pf: pointer to the PF private structure * @vsi: the VSI associated with this port * @repr_id: the representor ID * @sfnum: the subfunction ID * @sf_dev: pointer to the subfunction device * * An instance of a dynamically added devlink port. Each port flavour */ struct ice_dynamic_port { u8 hw_addr[ETH_ALEN]; u8 active: 1; u8 attached: 1; struct devlink_port devlink_port; struct ice_pf *pf; struct ice_vsi *vsi; unsigned long repr_id; u32 sfnum; /* Flavour-specific implementation data */ union { struct ice_sf_dev *sf_dev; }; }; void ice_dealloc_all_dynamic_ports(struct ice_pf *pf); int ice_devlink_create_pf_port(struct ice_pf *pf); void ice_devlink_destroy_pf_port(struct ice_pf *pf); int ice_devlink_create_vf_port(struct ice_vf *vf); void ice_devlink_destroy_vf_port(struct ice_vf *vf); int ice_devlink_create_sf_port(struct ice_dynamic_port *dyn_port); void ice_devlink_destroy_sf_port(struct ice_dynamic_port *dyn_port); int ice_devlink_create_sf_dev_port(struct ice_sf_dev *sf_dev); void ice_devlink_destroy_sf_dev_port(struct ice_sf_dev *sf_dev); #define ice_devlink_port_to_dyn(port) \ container_of(port, struct ice_dynamic_port, devlink_port) int ice_devlink_port_new(struct devlink *devlink, const struct devlink_port_new_attrs *new_attr, struct netlink_ext_ack *extack, struct devlink_port **devlink_port); #endif /* _DEVLINK_PORT_H_ */