This function should be preferred over the rte_eth_copy_pci_info as it is not
PCI-specific.

Signed-off-by: Jan Viktorin <viktorin at rehivetech.com>
---
 lib/librte_ether/rte_ethdev.c | 38 ++++++++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h | 15 +++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 75121bc..6d58544 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3309,3 +3309,41 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, 
struct rte_pci_device *pci_de
        eth_dev->data->numa_node = pci_dev->numa_node;
        eth_dev->data->drv_name = pci_dev->driver->name;
 }
+
+void
+rte_eth_copy_dev_info(struct rte_eth_dev *eth_dev, const union rte_device *dev)
+{
+       unsigned int drv_flags;
+
+       if (eth_dev == NULL || dev == NULL) {
+               RTE_PMD_DEBUG_TRACE("NULL pointer eth_dev=%p dev=%p\n",
+                               eth_dev, dev);
+               return;
+       }
+
+       if (eth_dev->dev->magic != dev->magic) {
+               rte_panic("%s() incompatible magic set: %08x != %08x\n",
+                               __func__, eth_dev->dev->magic, dev->magic);
+               return;
+       }
+
+       eth_dev->data->dev_flags = 0;
+
+       switch (eth_dev->dev->magic) {
+       case RTE_PCI_DEVICE_MAGIC:
+               drv_flags = dev->pci.driver->drv_flags;
+               if (drv_flags & RTE_PCI_DRV_INTR_LSC)
+                       eth_dev->data->dev_flags |= RTE_PCI_DRV_INTR_LSC;
+               if (drv_flags & RTE_PCI_DRV_DETACHABLE)
+                       eth_dev->data->dev_flags |= RTE_PCI_DRV_DETACHABLE;
+
+               eth_dev->data->kdrv = dev->pci.kdrv;
+               eth_dev->data->numa_node = dev->pci.numa_node;
+               eth_dev->data->drv_name = dev->pci.driver->name;
+               break;
+       default:
+               rte_panic("%s() unrecognized dev magic: %08x\n",
+                               __func__, dev->magic);
+               break;
+       }
+}
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 5dd2e1a..020c0f7 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -3864,6 +3864,21 @@ extern int rte_eth_timesync_write_time(uint8_t port_id,
  */
 extern void rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct 
rte_pci_device *pci_dev);

+/**
+ * Copy device info to the Ethernet device data. The target eth_dev must be
+ * compatible with the given device (from the same infrastructure - eg. PCI).
+ *
+ * @param eth_dev
+ * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
+ * @param pci_dev
+ * The *dev* pointer is the address of the *rte_device* union.
+ *
+ * @return
+ *   - 0 on success, negative on error
+ */
+extern void rte_eth_copy_dev_info(struct rte_eth_dev *eth_dev,
+               const union rte_device *dev);
+

 /**
  * Create memzone for HW rings.
-- 
2.6.3

Reply via email to