> On Mar 9, 2017, at 8:18 AM, Yigit, Ferruh <ferruh.yi...@intel.com> wrote: > > On 3/7/2017 4:31 PM, Pascal Mazon wrote: >> Tap PMD is flexible, it supports any speed. >> >> Signed-off-by: Pascal Mazon <pascal.ma...@6wind.com> >> --- >> doc/guides/nics/features/tap.ini | 1 + >> drivers/net/tap/rte_eth_tap.c | 35 +++++++++++++++++++++++++++++++++++ >> 2 files changed, 36 insertions(+) >> >> diff --git a/doc/guides/nics/features/tap.ini >> b/doc/guides/nics/features/tap.ini >> index d9b47a003654..dad5a0561087 100644 >> --- a/doc/guides/nics/features/tap.ini >> +++ b/doc/guides/nics/features/tap.ini >> @@ -9,6 +9,7 @@ Jumbo frame = Y >> Promiscuous mode = Y >> Allmulticast mode = Y >> Basic stats = Y >> +Speed capabilities = Y >> Unicast MAC filter = Y >> Other kdrv = Y >> ARMv7 = Y >> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c >> index 1e46ee36efa2..ef525a3f0826 100644 >> --- a/drivers/net/tap/rte_eth_tap.c >> +++ b/drivers/net/tap/rte_eth_tap.c >> @@ -351,6 +351,40 @@ tap_dev_configure(struct rte_eth_dev *dev __rte_unused) >> return 0; >> } >> >> +static uint32_t >> +tap_dev_speed_capa(void) >> +{ >> + uint32_t speed = pmd_link.link_speed; > > link_speed is already hardcoded into PMD, so there is nothing to detect > here. Would it be different if PMD directly return pmd_link.link_speed?
The link speed is passed into the PMD via the command line, which means it can change per run. > >> + uint32_t capa = 0; >> + >> + if (speed >= ETH_SPEED_NUM_10M) >> + capa |= ETH_LINK_SPEED_10M; >> + if (speed >= ETH_SPEED_NUM_100M) >> + capa |= ETH_LINK_SPEED_100M; >> + if (speed >= ETH_SPEED_NUM_1G) >> + capa |= ETH_LINK_SPEED_1G; >> + if (speed >= ETH_SPEED_NUM_5G) >> + capa |= ETH_LINK_SPEED_2_5G; >> + if (speed >= ETH_SPEED_NUM_5G) >> + capa |= ETH_LINK_SPEED_5G; >> + if (speed >= ETH_SPEED_NUM_10G) >> + capa |= ETH_LINK_SPEED_10G; >> + if (speed >= ETH_SPEED_NUM_20G) >> + capa |= ETH_LINK_SPEED_20G; >> + if (speed >= ETH_SPEED_NUM_25G) >> + capa |= ETH_LINK_SPEED_25G; >> + if (speed >= ETH_SPEED_NUM_40G) >> + capa |= ETH_LINK_SPEED_40G; >> + if (speed >= ETH_SPEED_NUM_50G) >> + capa |= ETH_LINK_SPEED_50G; >> + if (speed >= ETH_SPEED_NUM_56G) >> + capa |= ETH_LINK_SPEED_56G; >> + if (speed >= ETH_SPEED_NUM_100G) >> + capa |= ETH_LINK_SPEED_100G; > > I would prefer switch here [1], but functionally both are same, it is > your call. > > [1] > switch (speed) { > case ETH_SPEED_NUM_100G: > capa |= ETH_LINK_SPEED_100G > /* fallthrough */ > case ETH_SPEED_NUM_56G: > capa |= ETH_LINK_SPEED_56G > /* fallthrough */ > ... > }; > > >> + >> + return capa; >> +} >> + >> static void >> tap_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) >> { >> @@ -363,6 +397,7 @@ tap_dev_info(struct rte_eth_dev *dev, struct >> rte_eth_dev_info *dev_info) >> dev_info->max_tx_queues = internals->nb_queues; >> dev_info->min_rx_bufsize = 0; >> dev_info->pci_dev = NULL; >> + dev_info->speed_capa = tap_dev_speed_capa(); >> } >> >> static void Regards, Keith