[PATCH 33/62] net/qede: use kvargs numeric helpers
Stephen Hemminger
stephen at networkplumber.org
Mon Sep 14 07:47:04 CEST 2026
qede_args_check() ignores the end pointer, so "1junk" is accepted, and
uses base 0, so a leading zero silently selects octal.
On failure it returned errno, a positive value, where the kvargs
handler contract expects a negative error code; return -EINVAL.
Both arguments are booleans, so drop qede_args_check() and use
rte_kvargs_handle_bool() on qdev->enable_tx_switching directly. The
handler needed the device only to reach that field and to apply the
VF argument on a VF alone, so the IS_VF() test moves to the caller and
the loop over valid_args[] becomes two explicit calls.
The old handler accepted any integer and reduced it with "!!", so
"vf_txswitch=2" meant true. It is now rejected, along with the other
values that are not booleans. A bare key enables tx-switching.
Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
drivers/net/qede/qede_ethdev.c | 55 ++++++++++------------------------
1 file changed, 16 insertions(+), 39 deletions(-)
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 4efc2dd349..5bf70ca2b5 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1203,39 +1203,14 @@ static const char * const valid_args[] = {
NULL,
};
-static int qede_args_check(const char *key, const char *val, void *opaque)
-{
- unsigned long tmp;
- int ret = 0;
- struct rte_eth_dev *eth_dev = opaque;
- struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
- struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
-
- errno = 0;
- tmp = strtoul(val, NULL, 0);
- if (errno) {
- DP_INFO(edev, "%s: \"%s\" is not a valid integer", key, val);
- return errno;
- }
-
- if ((strcmp(QEDE_NPAR_TX_SWITCHING, key) == 0) ||
- ((strcmp(QEDE_VF_TX_SWITCHING, key) == 0) && IS_VF(edev))) {
- qdev->enable_tx_switching = !!tmp;
- DP_INFO(edev, "Disabling %s tx-switching\n",
- strcmp(QEDE_NPAR_TX_SWITCHING, key) ?
- "VF" : "NPAR");
- }
-
- return ret;
-}
-
static int qede_args(struct rte_eth_dev *eth_dev)
{
struct rte_pci_device *pci_dev = RTE_CLASS_TO_BUS_DEVICE(eth_dev, *pci_dev);
+ struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+ struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
struct rte_kvargs *kvlist;
struct rte_devargs *devargs;
int ret;
- int i;
devargs = pci_dev->device.devargs;
if (!devargs)
@@ -1245,20 +1220,22 @@ static int qede_args(struct rte_eth_dev *eth_dev)
if (kvlist == NULL)
return -EINVAL;
- /* Process parameters. */
- for (i = 0; (valid_args[i] != NULL); ++i) {
- if (rte_kvargs_count(kvlist, valid_args[i])) {
- ret = rte_kvargs_process(kvlist, valid_args[i],
- qede_args_check, eth_dev);
- if (ret != ECORE_SUCCESS) {
- rte_kvargs_free(kvlist);
- return ret;
- }
- }
- }
+ /*
+ * Both arguments select the same thing. The VF one is only honoured
+ * on a VF, which is why the two are handled separately rather than
+ * in a loop over valid_args[].
+ */
+ ret = rte_kvargs_process_opt(kvlist, QEDE_NPAR_TX_SWITCHING,
+ rte_kvargs_handle_bool,
+ &qdev->enable_tx_switching);
+ if (ret == 0 && IS_VF(edev))
+ ret = rte_kvargs_process_opt(kvlist, QEDE_VF_TX_SWITCHING,
+ rte_kvargs_handle_bool,
+ &qdev->enable_tx_switching);
+
rte_kvargs_free(kvlist);
- return 0;
+ return ret;
}
static int qede_dev_configure(struct rte_eth_dev *eth_dev)
--
2.53.0
More information about the dev
mailing list