[dpdk-dev,2/3] vmxnet3: don't clear vf_table on restart
Commit Message
From: "Charles (Chas) Williams" <ciwillia@brocade.com>
From: Charles (Chas) Williams <ciwillia@brocade.com>
During an MTU change, the adapter is restarted. If hardware VLAN offload
is in use, this existing filter table would also be cleared. Instead,
setup the shadow table once during device initialization and just update
during restart.
Signed-off-by: Charles (Chas) Williams <ciwillia@brocade.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/vmxnet3/vmxnet3_ethdev.c | 23 ++++++++---------------
1 file changed, 8 insertions(+), 15 deletions(-)
Comments
On 12/3/15, 5:05 PM, "Stephen Hemminger" <stephen@networkplumber.org> wrote:
>From: "Charles (Chas) Williams" <ciwillia@brocade.com>
>
>From: Charles (Chas) Williams <ciwillia@brocade.com>
>
>During an MTU change, the adapter is restarted. If hardware VLAN offload
>is in use, this existing filter table would also be cleared. Instead,
>setup the shadow table once during device initialization and just update
>during restart.
>
>Signed-off-by: Charles (Chas) Williams <ciwillia@brocade.com>
>Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>---
Acked-by: Yong Wang <yongwang@vmware.com>
> drivers/net/vmxnet3/vmxnet3_ethdev.c | 23 ++++++++---------------
> 1 file changed, 8 insertions(+), 15 deletions(-)
>
>diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
>index c363bf6..2d7bf13 100644
>--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
>+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
>@@ -89,8 +89,8 @@ static void vmxnet3_dev_info_get(struct rte_eth_dev *dev,
> static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,
> uint16_t vid, int on);
> static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);
>-static void vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
>- int mask, int clear);
>+static void vmxnet3_dev_vlan_offload_update(struct rte_eth_dev *dev,
>+ int mask);
>
> #if PROCESS_SYS_EVENTS == 1
> static void vmxnet3_process_events(struct vmxnet3_hw *);
>@@ -294,6 +294,9 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
> /* Put device in Quiesce Mode */
> VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV);
>
>+ /* allow untagged pkts */
>+ VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);
>+
> return 0;
> }
>
>@@ -518,7 +521,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
> if (dev->data->dev_conf.rxmode.hw_vlan_filter)
> mask |= ETH_VLAN_FILTER_MASK;
>
>- vmxnet3_dev_vlan_offload_set_clear(dev, mask, 1);
>+ vmxnet3_dev_vlan_offload_update(dev, mask);
>
> PMD_INIT_LOG(DEBUG,
> "Writing MAC Address : %02x:%02x:%02x:%02x:%02x:%02x",
>@@ -835,8 +838,7 @@ vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vid, int on)
> }
>
> static void
>-vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
>- int mask, int clear)
>+vmxnet3_dev_vlan_offload_update(struct rte_eth_dev *dev, int mask)
> {
> struct vmxnet3_hw *hw = dev->data->dev_private;
> Vmxnet3_DSDevRead *devRead = &hw->shared->devRead;
>@@ -851,17 +853,8 @@ vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
> VMXNET3_CMD_UPDATE_FEATURE);
>
> if (mask & ETH_VLAN_FILTER_MASK) {
>- if (clear) {
>- memset(hw->shadow_vfta, 0,
>- VMXNET3_VFT_TABLE_SIZE);
>- /* allow untagged pkts */
>- VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);
>- }
> memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);
> } else {
>- /* allow any pkts -- no filtering */
>- if (clear)
>- memset(hw->shadow_vfta, 0xff, VMXNET3_VFT_TABLE_SIZE);
> memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);
> }
>
>@@ -872,7 +865,7 @@ vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
> static void
> vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
> {
>- vmxnet3_dev_vlan_offload_set_clear(dev, mask, 0);
>+ vmxnet3_dev_vlan_offload_update(dev, mask);
> }
>
> #if PROCESS_SYS_EVENTS == 1
>--
>2.1.4
>
@@ -89,8 +89,8 @@ static void vmxnet3_dev_info_get(struct rte_eth_dev *dev,
static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,
uint16_t vid, int on);
static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);
-static void vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
- int mask, int clear);
+static void vmxnet3_dev_vlan_offload_update(struct rte_eth_dev *dev,
+ int mask);
#if PROCESS_SYS_EVENTS == 1
static void vmxnet3_process_events(struct vmxnet3_hw *);
@@ -294,6 +294,9 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
/* Put device in Quiesce Mode */
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV);
+ /* allow untagged pkts */
+ VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);
+
return 0;
}
@@ -518,7 +521,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
if (dev->data->dev_conf.rxmode.hw_vlan_filter)
mask |= ETH_VLAN_FILTER_MASK;
- vmxnet3_dev_vlan_offload_set_clear(dev, mask, 1);
+ vmxnet3_dev_vlan_offload_update(dev, mask);
PMD_INIT_LOG(DEBUG,
"Writing MAC Address : %02x:%02x:%02x:%02x:%02x:%02x",
@@ -835,8 +838,7 @@ vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vid, int on)
}
static void
-vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
- int mask, int clear)
+vmxnet3_dev_vlan_offload_update(struct rte_eth_dev *dev, int mask)
{
struct vmxnet3_hw *hw = dev->data->dev_private;
Vmxnet3_DSDevRead *devRead = &hw->shared->devRead;
@@ -851,17 +853,8 @@ vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
VMXNET3_CMD_UPDATE_FEATURE);
if (mask & ETH_VLAN_FILTER_MASK) {
- if (clear) {
- memset(hw->shadow_vfta, 0,
- VMXNET3_VFT_TABLE_SIZE);
- /* allow untagged pkts */
- VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);
- }
memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);
} else {
- /* allow any pkts -- no filtering */
- if (clear)
- memset(hw->shadow_vfta, 0xff, VMXNET3_VFT_TABLE_SIZE);
memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);
}
@@ -872,7 +865,7 @@ vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,
static void
vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
{
- vmxnet3_dev_vlan_offload_set_clear(dev, mask, 0);
+ vmxnet3_dev_vlan_offload_update(dev, mask);
}
#if PROCESS_SYS_EVENTS == 1