summaryrefslogtreecommitdiffstats
path: root/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch')
-rw-r--r--dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch83
1 files changed, 83 insertions, 0 deletions
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
index 00000000000..951694ded79
--- /dev/null
+++ b/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch
@@ -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
+