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 <[email protected]> --- 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

