Rework bond pmd initialisation so that we don't need to modify eal for this pmd
to work.

Signed-off-by: David Marchand <david.marchand at 6wind.com>
---
 lib/librte_pmd_bond/rte_eth_bond_pmd.c     |   33 ++++++++++++++++++++++------
 lib/librte_pmd_bond/rte_eth_bond_private.h |    2 ++
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c 
b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
index d72d6ed..42cf37a 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
@@ -707,11 +707,8 @@ bond_ethdev_close(struct rte_eth_dev *dev __rte_unused)
 {
 }

-static int
-bond_ethdev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-       return 0;
-}
+/* forward declaration */
+static int bond_ethdev_configure(struct rte_eth_dev *dev);

 static void
 bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
@@ -1027,6 +1024,7 @@ struct eth_dev_ops default_dev_ops = {
 static int
 bond_init(const char *name, const char *params)
 {
+       struct bond_dev_private *internals;
        struct rte_kvargs *kvlist;
        uint8_t bonding_mode, socket_id;
        int  arg_count, port_id;
@@ -1078,10 +1076,31 @@ bond_init(const char *name, const char *params)
                                name, bonding_mode, socket_id);
                return -1;
        }
+       internals = rte_eth_devices[port_id].data->dev_private;
+       internals->kvlist = kvlist;

        RTE_LOG(INFO, EAL,
                        "Create bonded device %s on port %d in mode %u on 
socket %u.\n",
                        name, port_id, bonding_mode, socket_id);
+       return 0;
+}
+
+/* this part will resolve the slave portids after all the other pdev and vdev
+ * have been allocated */
+static int
+bond_ethdev_configure(struct rte_eth_dev *dev)
+{
+       char *name = dev->data->name;
+       struct bond_dev_private *internals = dev->data->dev_private;
+       struct rte_kvargs *kvlist = internals->kvlist;
+       int arg_count, port_id = dev - rte_eth_devices;
+
+       /*
+        * if no kvlist, it means that this bonded device has been created
+        * through the bonding api.
+        */
+       if (!kvlist)
+               return 0;

        /* Parse MAC address for bonded device */
        arg_count = rte_kvargs_count(kvlist, PMD_BOND_MAC_ADDR_KVARG);
@@ -1199,8 +1218,8 @@ bond_init(const char *name, const char *params)
 }

 static struct rte_driver bond_drv = {
-       .name = PMD_BOND_NAME,
-       .type = PMD_BDEV,
+       .name = "eth_bond",
+       .type = PMD_VDEV,
        .init = bond_init,
 };

diff --git a/lib/librte_pmd_bond/rte_eth_bond_private.h 
b/lib/librte_pmd_bond/rte_eth_bond_private.h
index 60f1e8d..1db6e4d 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_private.h
+++ b/lib/librte_pmd_bond/rte_eth_bond_private.h
@@ -123,6 +123,8 @@ struct bond_dev_private {

        /** Persisted configuration of slaves */
        struct slave_conf presisted_slaves_conf[RTE_MAX_ETHPORTS];
+
+       struct rte_kvargs *kvlist;
 };

 extern struct eth_dev_ops default_dev_ops;
-- 
1.7.10.4

Reply via email to