1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * This file contains all networking devres helpers.
6 #include <linux/device.h>
7 #include <linux/etherdevice.h>
8 #include <linux/netdevice.h>
10 struct net_device_devres
{
11 struct net_device
*ndev
;
14 static void devm_free_netdev(struct device
*dev
, void *this)
16 struct net_device_devres
*res
= this;
18 free_netdev(res
->ndev
);
21 struct net_device
*devm_alloc_etherdev_mqs(struct device
*dev
, int sizeof_priv
,
22 unsigned int txqs
, unsigned int rxqs
)
24 struct net_device_devres
*dr
;
26 dr
= devres_alloc(devm_free_netdev
, sizeof(*dr
), GFP_KERNEL
);
30 dr
->ndev
= alloc_etherdev_mqs(sizeof_priv
, txqs
, rxqs
);
40 EXPORT_SYMBOL(devm_alloc_etherdev_mqs
);
42 static void devm_netdev_release(struct device
*dev
, void *this)
44 struct net_device_devres
*res
= this;
46 unregister_netdev(res
->ndev
);
49 static int netdev_devres_match(struct device
*dev
, void *this, void *match_data
)
51 struct net_device_devres
*res
= this;
52 struct net_device
*ndev
= match_data
;
54 return ndev
== res
->ndev
;
58 * devm_register_netdev - resource managed variant of register_netdev()
59 * @dev: managing device for this netdev - usually the parent device
60 * @ndev: device to register
62 * This is a devres variant of register_netdev() for which the unregister
63 * function will be call automatically when the managing device is
64 * detached. Note: the net_device used must also be resource managed by
65 * the same struct device.
67 int devm_register_netdev(struct device
*dev
, struct net_device
*ndev
)
69 struct net_device_devres
*dr
;
72 /* struct net_device must itself be managed. For now a managed netdev
73 * can only be allocated by devm_alloc_etherdev_mqs() so the check is
76 if (WARN_ON(!devres_find(dev
, devm_free_netdev
,
77 netdev_devres_match
, ndev
)))
80 dr
= devres_alloc(devm_netdev_release
, sizeof(*dr
), GFP_KERNEL
);
84 ret
= register_netdev(ndev
);
91 devres_add(ndev
->dev
.parent
, dr
);
95 EXPORT_SYMBOL(devm_register_netdev
);