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