xref: /linux/net/core/netdev_config.c (revision 8e3245cb30864f93d7706e03e61ca1972ea4f64c)
1b9ac2c60SJakub Kicinski // SPDX-License-Identifier: GPL-2.0-only
2b9ac2c60SJakub Kicinski 
3b9ac2c60SJakub Kicinski #include <linux/netdevice.h>
4b9ac2c60SJakub Kicinski #include <net/netdev_queues.h>
5b9ac2c60SJakub Kicinski #include <net/netdev_rx_queue.h>
6b9ac2c60SJakub Kicinski 
7*8e3245cbSJakub Kicinski #include "dev.h"
8*8e3245cbSJakub Kicinski 
9*8e3245cbSJakub Kicinski static int netdev_nop_validate_qcfg(struct net_device *dev,
10*8e3245cbSJakub Kicinski 				    struct netdev_queue_config *qcfg,
11*8e3245cbSJakub Kicinski 				    struct netlink_ext_ack *extack)
12*8e3245cbSJakub Kicinski {
13*8e3245cbSJakub Kicinski 	return 0;
14*8e3245cbSJakub Kicinski }
15*8e3245cbSJakub Kicinski 
16*8e3245cbSJakub Kicinski static int __netdev_queue_config(struct net_device *dev, int rxq_idx,
17*8e3245cbSJakub Kicinski 				 struct netdev_queue_config *qcfg,
18*8e3245cbSJakub Kicinski 				 struct netlink_ext_ack *extack,
19*8e3245cbSJakub Kicinski 				 bool validate)
20*8e3245cbSJakub Kicinski {
21*8e3245cbSJakub Kicinski 	int (*validate_cb)(struct net_device *dev,
22*8e3245cbSJakub Kicinski 			   struct netdev_queue_config *qcfg,
23*8e3245cbSJakub Kicinski 			   struct netlink_ext_ack *extack);
24*8e3245cbSJakub Kicinski 	struct pp_memory_provider_params *mpp;
25*8e3245cbSJakub Kicinski 	int err;
26*8e3245cbSJakub Kicinski 
27*8e3245cbSJakub Kicinski 	validate_cb = netdev_nop_validate_qcfg;
28*8e3245cbSJakub Kicinski 	if (validate && dev->queue_mgmt_ops->ndo_validate_qcfg)
29*8e3245cbSJakub Kicinski 		validate_cb = dev->queue_mgmt_ops->ndo_validate_qcfg;
30*8e3245cbSJakub Kicinski 
31*8e3245cbSJakub Kicinski 	memset(qcfg, 0, sizeof(*qcfg));
32*8e3245cbSJakub Kicinski 
33*8e3245cbSJakub Kicinski 	/* Get defaults from the driver, in case user config not set */
34*8e3245cbSJakub Kicinski 	if (dev->queue_mgmt_ops->ndo_default_qcfg)
35*8e3245cbSJakub Kicinski 		dev->queue_mgmt_ops->ndo_default_qcfg(dev, qcfg);
36*8e3245cbSJakub Kicinski 	err = validate_cb(dev, qcfg, extack);
37*8e3245cbSJakub Kicinski 	if (err)
38*8e3245cbSJakub Kicinski 		return err;
39*8e3245cbSJakub Kicinski 
40*8e3245cbSJakub Kicinski 	/* Apply MP overrides */
41*8e3245cbSJakub Kicinski 	mpp = &__netif_get_rx_queue(dev, rxq_idx)->mp_params;
42*8e3245cbSJakub Kicinski 	if (mpp->rx_page_size)
43*8e3245cbSJakub Kicinski 		qcfg->rx_page_size = mpp->rx_page_size;
44*8e3245cbSJakub Kicinski 	err = validate_cb(dev, qcfg, extack);
45*8e3245cbSJakub Kicinski 	if (err)
46*8e3245cbSJakub Kicinski 		return err;
47*8e3245cbSJakub Kicinski 
48*8e3245cbSJakub Kicinski 	return 0;
49*8e3245cbSJakub Kicinski }
50*8e3245cbSJakub Kicinski 
51b9ac2c60SJakub Kicinski /**
52b9ac2c60SJakub Kicinski  * netdev_queue_config() - get configuration for a given queue
53b9ac2c60SJakub Kicinski  * @dev:      net_device instance
54b9ac2c60SJakub Kicinski  * @rxq_idx:  index of the queue of interest
55b9ac2c60SJakub Kicinski  * @qcfg: queue configuration struct (output)
56b9ac2c60SJakub Kicinski  *
57b9ac2c60SJakub Kicinski  * Render the configuration for a given queue. This helper should be used
58b9ac2c60SJakub Kicinski  * by drivers which support queue configuration to retrieve config for
59b9ac2c60SJakub Kicinski  * a particular queue.
60b9ac2c60SJakub Kicinski  *
61b9ac2c60SJakub Kicinski  * @qcfg is an output parameter and is always fully initialized by this
62b9ac2c60SJakub Kicinski  * function. Some values may not be set by the user, drivers may either
63b9ac2c60SJakub Kicinski  * deal with the "unset" values in @qcfg, or provide the callback
64b9ac2c60SJakub Kicinski  * to populate defaults in queue_management_ops.
65b9ac2c60SJakub Kicinski  */
66b9ac2c60SJakub Kicinski void netdev_queue_config(struct net_device *dev, int rxq_idx,
67b9ac2c60SJakub Kicinski 			 struct netdev_queue_config *qcfg)
68b9ac2c60SJakub Kicinski {
69*8e3245cbSJakub Kicinski 	__netdev_queue_config(dev, rxq_idx, qcfg, NULL, false);
70b9ac2c60SJakub Kicinski }
71b9ac2c60SJakub Kicinski EXPORT_SYMBOL(netdev_queue_config);
72*8e3245cbSJakub Kicinski 
73*8e3245cbSJakub Kicinski int netdev_queue_config_validate(struct net_device *dev, int rxq_idx,
74*8e3245cbSJakub Kicinski 				 struct netdev_queue_config *qcfg,
75*8e3245cbSJakub Kicinski 				 struct netlink_ext_ack *extack)
76*8e3245cbSJakub Kicinski {
77*8e3245cbSJakub Kicinski 	return __netdev_queue_config(dev, rxq_idx, qcfg, extack, true);
78*8e3245cbSJakub Kicinski }
79