This patch fixes a bug in replaying MAC address to the hardware 50/4950/1
authorSteve Shin <jonshin@cisco.com>
Mon, 30 Jan 2017 17:32:00 +0000 (09:32 -0800)
committerSteve Shin <jonshin@cisco.com>
Mon, 30 Jan 2017 17:32:00 +0000 (09:32 -0800)
in rte_eth_dev_config_restore() routine. Added default MAC replay as well.

Fixes: 4bdefaade6d1 ("ethdev: VMDQ enhancements")

Change-Id: I646799477e9a6f2fdeff7a52a76d216ef91115e9
Signed-off-by: Steve Shin <jonshin@cisco.com>
dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch [new file with mode: 0644]

diff --git a/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch b/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch
new file mode 100644 (file)
index 0000000..951694d
--- /dev/null
@@ -0,0 +1,83 @@
+From fb7c10892b057533931553f9367acd5541a0537c Mon Sep 17 00:00:00 2001
+From: Steve Shin <jonshin@cisco.com>
+Date: Mon, 30 Jan 2017 09:12:25 -0800
+Subject: [PATCH] This patch fixes a bug in replaying MAC address to the
+ hardware in rte_eth_dev_config_restore() routine. Added default MAC replay as
+ well.
+
+Fixes: 4bdefaade6d1 ("ethdev: VMDQ enhancements")
+
+Signed-off-by: Steve Shin <jonshin@cisco.com>
+---
+ lib/librte_ether/rte_ethdev.c | 48 ++++++++++++++++++++++++-------------------
+ 1 file changed, 27 insertions(+), 21 deletions(-)
+
+diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
+index fde8112..2c07dfe 100644
+--- a/lib/librte_ether/rte_ethdev.c
++++ b/lib/librte_ether/rte_ethdev.c
+@@ -857,34 +857,40 @@ struct rte_eth_dev *
+ {
+       struct rte_eth_dev *dev;
+       struct rte_eth_dev_info dev_info;
+-      struct ether_addr addr;
++      struct ether_addr *addr;
+       uint16_t i;
+       uint32_t pool = 0;
++      uint64_t pool_mask;
+       dev = &rte_eth_devices[port_id];
+       rte_eth_dev_info_get(port_id, &dev_info);
+-      if (RTE_ETH_DEV_SRIOV(dev).active)
+-              pool = RTE_ETH_DEV_SRIOV(dev).def_vmdq_idx;
+-
+-      /* replay MAC address configuration */
+-      for (i = 0; i < dev_info.max_mac_addrs; i++) {
+-              addr = dev->data->mac_addrs[i];
+-
+-              /* skip zero address */
+-              if (is_zero_ether_addr(&addr))
+-                      continue;
+-
+-              /* add address to the hardware */
+-              if  (*dev->dev_ops->mac_addr_add &&
+-                      (dev->data->mac_pool_sel[i] & (1ULL << pool)))
+-                      (*dev->dev_ops->mac_addr_add)(dev, &addr, i, pool);
+-              else {
+-                      RTE_PMD_DEBUG_TRACE("port %d: MAC address array not supported\n",
+-                                      port_id);
+-                      /* exit the loop but not return an error */
+-                      break;
++      /* replay MAC address configuration including default MAC */
++      addr = &dev->data->mac_addrs[0];
++      if (*dev->dev_ops->mac_addr_set != NULL)
++              (*dev->dev_ops->mac_addr_set)(dev, addr);
++      else if (*dev->dev_ops->mac_addr_add != NULL)
++              (*dev->dev_ops->mac_addr_add)(dev, addr, 0, pool);
++
++      if (*dev->dev_ops->mac_addr_add != NULL) {
++              for (i = 1; i < dev_info.max_mac_addrs; i++) {
++                      addr = &dev->data->mac_addrs[i];
++
++                      /* skip zero address */
++                      if (is_zero_ether_addr(addr))
++                              continue;
++
++                      pool = 0;
++                      pool_mask = dev->data->mac_pool_sel[i];
++
++                      do {
++                              if (pool_mask & 1ULL)
++                                      (*dev->dev_ops->mac_addr_add)(dev,
++                                              addr, i, pool);
++                              pool_mask >>= 1;
++                              pool++;
++                      } while (pool_mask);
+               }
+       }
+-- 
+1.9.1
+