diff options
author | Bartosz Golaszewski <bgolaszewski@baylibre.com> | 2020-05-23 16:27:08 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-05-24 02:56:17 +0300 |
commit | cb8a14b205699fee1053a406e1e3fce330b6bdc3 (patch) | |
tree | 4bd7f26459aed2dd4d419af814499e32ec312880 /net/devres.c | |
parent | 7eef3d095abe11fd7f99fa86c0be7c14b8852fae (diff) | |
download | linux-cb8a14b205699fee1053a406e1e3fce330b6bdc3.tar.xz |
net: move devres helpers into a separate source file
There's currently only a single devres helper in net/ - devm variant
of alloc_etherdev. Let's move it to net/devres.c with the intention of
assing a second one: devm_register_netdev(). This new routine will need
to know the address of the release function of devm_alloc_etherdev() so
that it can verify (using devres_find()) that the struct net_device
that's being passed to it is also resource managed.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/devres.c')
-rw-r--r-- | net/devres.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/net/devres.c b/net/devres.c new file mode 100644 index 000000000000..c1465d9f9019 --- /dev/null +++ b/net/devres.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * This file contains all networking devres helpers. + */ + +#include <linux/device.h> +#include <linux/etherdevice.h> +#include <linux/netdevice.h> + +static void devm_free_netdev(struct device *dev, void *res) +{ + free_netdev(*(struct net_device **)res); +} + +struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv, + unsigned int txqs, unsigned int rxqs) +{ + struct net_device **dr; + struct net_device *netdev; + + dr = devres_alloc(devm_free_netdev, sizeof(*dr), GFP_KERNEL); + if (!dr) + return NULL; + + netdev = alloc_etherdev_mqs(sizeof_priv, txqs, rxqs); + if (!netdev) { + devres_free(dr); + return NULL; + } + + *dr = netdev; + devres_add(dev, dr); + + return netdev; +} +EXPORT_SYMBOL(devm_alloc_etherdev_mqs); |