at v4.6 3.6 kB view raw
1/* 2 * include/net/devlink.h - Network physical device Netlink interface 3 * Copyright (c) 2016 Mellanox Technologies. All rights reserved. 4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11#ifndef _NET_DEVLINK_H_ 12#define _NET_DEVLINK_H_ 13 14#include <linux/device.h> 15#include <linux/slab.h> 16#include <linux/gfp.h> 17#include <linux/list.h> 18#include <linux/netdevice.h> 19#include <net/net_namespace.h> 20#include <uapi/linux/devlink.h> 21 22struct devlink_ops; 23 24struct devlink { 25 struct list_head list; 26 struct list_head port_list; 27 const struct devlink_ops *ops; 28 struct device *dev; 29 possible_net_t _net; 30 char priv[0] __aligned(NETDEV_ALIGN); 31}; 32 33struct devlink_port { 34 struct list_head list; 35 struct devlink *devlink; 36 unsigned index; 37 bool registered; 38 enum devlink_port_type type; 39 enum devlink_port_type desired_type; 40 void *type_dev; 41 bool split; 42 u32 split_group; 43}; 44 45struct devlink_ops { 46 size_t priv_size; 47 int (*port_type_set)(struct devlink_port *devlink_port, 48 enum devlink_port_type port_type); 49 int (*port_split)(struct devlink *devlink, unsigned int port_index, 50 unsigned int count); 51 int (*port_unsplit)(struct devlink *devlink, unsigned int port_index); 52}; 53 54static inline void *devlink_priv(struct devlink *devlink) 55{ 56 BUG_ON(!devlink); 57 return &devlink->priv; 58} 59 60static inline struct devlink *priv_to_devlink(void *priv) 61{ 62 BUG_ON(!priv); 63 return container_of(priv, struct devlink, priv); 64} 65 66struct ib_device; 67 68#if IS_ENABLED(CONFIG_NET_DEVLINK) 69 70struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size); 71int devlink_register(struct devlink *devlink, struct device *dev); 72void devlink_unregister(struct devlink *devlink); 73void devlink_free(struct devlink *devlink); 74int devlink_port_register(struct devlink *devlink, 75 struct devlink_port *devlink_port, 76 unsigned int port_index); 77void devlink_port_unregister(struct devlink_port *devlink_port); 78void devlink_port_type_eth_set(struct devlink_port *devlink_port, 79 struct net_device *netdev); 80void devlink_port_type_ib_set(struct devlink_port *devlink_port, 81 struct ib_device *ibdev); 82void devlink_port_type_clear(struct devlink_port *devlink_port); 83void devlink_port_split_set(struct devlink_port *devlink_port, 84 u32 split_group); 85 86#else 87 88static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, 89 size_t priv_size) 90{ 91 return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL); 92} 93 94static inline int devlink_register(struct devlink *devlink, struct device *dev) 95{ 96 return 0; 97} 98 99static inline void devlink_unregister(struct devlink *devlink) 100{ 101} 102 103static inline void devlink_free(struct devlink *devlink) 104{ 105 kfree(devlink); 106} 107 108static inline int devlink_port_register(struct devlink *devlink, 109 struct devlink_port *devlink_port, 110 unsigned int port_index) 111{ 112 return 0; 113} 114 115static inline void devlink_port_unregister(struct devlink_port *devlink_port) 116{ 117} 118 119static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port, 120 struct net_device *netdev) 121{ 122} 123 124static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port, 125 struct ib_device *ibdev) 126{ 127} 128 129static inline void devlink_port_type_clear(struct devlink_port *devlink_port) 130{ 131} 132 133static inline void devlink_port_split_set(struct devlink_port *devlink_port, 134 u32 split_group) 135{ 136} 137 138#endif 139 140#endif /* _NET_DEVLINK_H_ */