/* * include/net/devlink.h - Network physical device Netlink interface * Copyright (c) 2016 Mellanox Technologies. All rights reserved. * Copyright (c) 2016 Jiri Pirko * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #ifndef _NET_DEVLINK_H_ #define _NET_DEVLINK_H_ #include #include #include #include #include #include #include struct devlink_ops; struct devlink { struct list_head list; struct list_head port_list; const struct devlink_ops *ops; struct device *dev; possible_net_t _net; char priv[0] __aligned(NETDEV_ALIGN); }; struct devlink_port { struct list_head list; struct devlink *devlink; unsigned index; bool registered; enum devlink_port_type type; enum devlink_port_type desired_type; void *type_dev; bool split; u32 split_group; }; struct devlink_ops { size_t priv_size; int (*port_type_set)(struct devlink_port *devlink_port, enum devlink_port_type port_type); int (*port_split)(struct devlink *devlink, unsigned int port_index, unsigned int count); int (*port_unsplit)(struct devlink *devlink, unsigned int port_index); }; static inline void *devlink_priv(struct devlink *devlink) { BUG_ON(!devlink); return &devlink->priv; } static inline struct devlink *priv_to_devlink(void *priv) { BUG_ON(!priv); return container_of(priv, struct devlink, priv); } struct ib_device; #if IS_ENABLED(CONFIG_NET_DEVLINK) struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size); int devlink_register(struct devlink *devlink, struct device *dev); void devlink_unregister(struct devlink *devlink); void devlink_free(struct devlink *devlink); int devlink_port_register(struct devlink *devlink, struct devlink_port *devlink_port, unsigned int port_index); void devlink_port_unregister(struct devlink_port *devlink_port); void devlink_port_type_eth_set(struct devlink_port *devlink_port, struct net_device *netdev); void devlink_port_type_ib_set(struct devlink_port *devlink_port, struct ib_device *ibdev); void devlink_port_type_clear(struct devlink_port *devlink_port); void devlink_port_split_set(struct devlink_port *devlink_port, u32 split_group); #else static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size) { return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL); } static inline int devlink_register(struct devlink *devlink, struct device *dev) { return 0; } static inline void devlink_unregister(struct devlink *devlink) { } static inline void devlink_free(struct devlink *devlink) { kfree(devlink); } static inline int devlink_port_register(struct devlink *devlink, struct devlink_port *devlink_port, unsigned int port_index) { return 0; } static inline void devlink_port_unregister(struct devlink_port *devlink_port) { } static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port, struct net_device *netdev) { } static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port, struct ib_device *ibdev) { } static inline void devlink_port_type_clear(struct devlink_port *devlink_port) { } static inline void devlink_port_split_set(struct devlink_port *devlink_port, u32 split_group) { } #endif #endif /* _NET_DEVLINK_H_ */