linux/include/net/devlink.h
<<
>>
Prefs
   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_ */
 141