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

Reply via email to