net/qede: replace config option with run-time arg

This patch adds support for handling run-time driver arguments.
We have removed config option for per VF Tx switching and added
a run-time argument vf_txswitch. By default, the VF Tx switching is
enabled however it can be disabled using run-time argument.

Sample usage to disable per port VF Tx switching is something like...

 -w 05:00.0,vf_txswitch=0 -w 05:00.1,vf_txswitch=0

Fixes: 1282943aa0 ("net/qede: fix default config option")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rasesh.mody@cavium.com>
This commit is contained in:
Rasesh Mody 2018-01-12 13:50:01 -08:00 committed by Ferruh Yigit
parent 785482203f
commit f64b91b0eb
3 changed files with 77 additions and 7 deletions

View File

@ -397,7 +397,6 @@ CONFIG_RTE_LIBRTE_QEDE_PMD=y
CONFIG_RTE_LIBRTE_QEDE_DEBUG_INFO=n
CONFIG_RTE_LIBRTE_QEDE_DEBUG_TX=n
CONFIG_RTE_LIBRTE_QEDE_DEBUG_RX=n
CONFIG_RTE_LIBRTE_QEDE_VF_TX_SWITCH=y
#Provides abs path/name of the firmware file.
#Empty string denotes driver will use default firmware
CONFIG_RTE_LIBRTE_QEDE_FW=""

View File

@ -9,6 +9,7 @@
#include "qede_ethdev.h"
#include <rte_alarm.h>
#include <rte_version.h>
#include <rte_kvargs.h>
/* Globals */
int qede_logtype_init;
@ -456,13 +457,13 @@ int qede_activate_vport(struct rte_eth_dev *eth_dev, bool flg)
params.update_vport_active_tx_flg = 1;
params.vport_active_rx_flg = flg;
params.vport_active_tx_flg = flg;
#ifndef RTE_LIBRTE_QEDE_VF_TX_SWITCH
if (IS_VF(edev)) {
params.update_tx_switching_flg = 1;
params.tx_switching_flg = !flg;
DP_INFO(edev, "VF tx-switching is disabled\n");
if (!qdev->enable_tx_switching) {
if (IS_VF(edev)) {
params.update_tx_switching_flg = 1;
params.tx_switching_flg = !flg;
DP_INFO(edev, "VF tx-switching is disabled\n");
}
}
#endif
for_each_hwfn(edev, i) {
p_hwfn = &edev->hwfns[i];
params.opaque_fid = p_hwfn->hw_info.opaque_fid;
@ -1281,6 +1282,68 @@ static void qede_dev_stop(struct rte_eth_dev *eth_dev)
DP_INFO(edev, "Device is stopped\n");
}
#define QEDE_TX_SWITCHING "vf_txswitch"
const char *valid_args[] = {
QEDE_TX_SWITCHING,
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);
#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
#endif
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_TX_SWITCHING, key) == 0)
qdev->enable_tx_switching = !!tmp;
return ret;
}
static int qede_args(struct rte_eth_dev *eth_dev)
{
struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
struct rte_kvargs *kvlist;
struct rte_devargs *devargs;
int ret;
int i;
devargs = pci_dev->device.devargs;
if (!devargs)
return 0; /* return success */
kvlist = rte_kvargs_parse(devargs->args, valid_args);
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;
}
}
}
rte_kvargs_free(kvlist);
return 0;
}
static int qede_dev_configure(struct rte_eth_dev *eth_dev)
{
struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
@ -1314,6 +1377,13 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
return -EINVAL;
}
/* Enable Tx switching by default */
qdev->enable_tx_switching = 1;
/* Parse devargs and fix up rxmode */
if (qede_args(eth_dev))
return -ENOTSUP;
/* Sanity checks and throw warnings */
if (rxmode->enable_scatter)
eth_dev->data->scattered_rx = 1;

View File

@ -188,6 +188,7 @@ struct qede_dev {
struct qede_fastpath *fp_array;
uint16_t mtu;
uint16_t new_mtu;
bool enable_tx_switching;
bool rss_enable;
struct rte_eth_rss_conf rss_conf;
uint16_t rss_ind_table[ECORE_RSS_IND_TABLE_SIZE];