get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/13122/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 13122,
    "url": "http://patches.dpdk.org/api/patches/13122/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1464703068-2924-3-git-send-email-nhorman@tuxdriver.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1464703068-2924-3-git-send-email-nhorman@tuxdriver.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1464703068-2924-3-git-send-email-nhorman@tuxdriver.com",
    "date": "2016-05-31T13:57:43",
    "name": "[dpdk-dev,PATCHv6,2/7] drivers: Update driver registration macro usage",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "426870c060abc617b1bd3039f5a8dacd636e4e4e",
    "submitter": {
        "id": 32,
        "url": "http://patches.dpdk.org/api/people/32/?format=api",
        "name": "Neil Horman",
        "email": "nhorman@tuxdriver.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1464703068-2924-3-git-send-email-nhorman@tuxdriver.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/13122/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/13122/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 6C2BE58C5;\n\tTue, 31 May 2016 15:58:26 +0200 (CEST)",
            "from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58])\n\tby dpdk.org (Postfix) with ESMTP id A924458C3\n\tfor <dev@dpdk.org>; Tue, 31 May 2016 15:58:24 +0200 (CEST)",
            "from hmsreliant.think-freely.org\n\t([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost)\n\tby smtp.tuxdriver.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.63)\n\t(envelope-from <nhorman@tuxdriver.com>)\n\tid 1b7kBW-0005Ke-9G; Tue, 31 May 2016 09:58:21 -0400"
        ],
        "From": "Neil Horman <nhorman@tuxdriver.com>",
        "To": "dev@dpdk.org",
        "Cc": "Neil Horman <nhorman@tuxdriver.com>,\n\tBruce Richardson <bruce.richardson@intel.com>,\n\tThomas Monjalon <thomas.monjalon@6wind.com>,\n\tStephen Hemminger <stephen@networkplumber.org>,\n\tPanu Matilainen <pmatilai@redhat.com>",
        "Date": "Tue, 31 May 2016 09:57:43 -0400",
        "Message-Id": "<1464703068-2924-3-git-send-email-nhorman@tuxdriver.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1464703068-2924-1-git-send-email-nhorman@tuxdriver.com>",
        "References": "<1463431287-4551-1-git-send-email-nhorman@tuxdriver.com>\n\t<1464703068-2924-1-git-send-email-nhorman@tuxdriver.com>",
        "X-Spam-Score": "-1.0 (-)",
        "X-Spam-Status": "No",
        "Subject": "[dpdk-dev] [PATCHv6 2/7] drivers: Update driver registration macro\n\tusage",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Modify the PMD_REGISTER_DRIVER macro, adding a name argument to it.  The\naddition of a name argument creates a token that can be used for subsequent\nmacros in the creation of unique symbol names to export additional bits of\ninformation for use by the pmdinfogen tool.  For example:\n\nPMD_REGISTER_DRIVER(ena_driver, ena);\n\nregisters the ena_driver struct as it always did, and creates a symbol\nconst char this_pmd_name0[] __attribute__((used)) = \"ena\";\n\nwhich pmdinfogen can search for and extract.  The subsequent macro\n\nDRIVER_REGISTER_PCI_TABLE(ena, ena_pci_id_map);\n\ncreates a symbol\nconst char ena_pci_tbl_export[] __attribute__((used)) = \"ena_pci_id_map\";\n\nWhich allows pmdinfogen to find the pci table of this driver\n\nUsing this pattern, we can export arbitrary bits of information.\n\npmdinfo uses this information to extract hardware support from an object file\nand create a json string to make hardware support info discoverable later.\n\nSigned-off-by: Neil Horman <nhorman@tuxdriver.com>\nCC: Bruce Richardson <bruce.richardson@intel.com>\nCC: Thomas Monjalon <thomas.monjalon@6wind.com>\nCC: Stephen Hemminger <stephen@networkplumber.org>\nCC: Panu Matilainen <pmatilai@redhat.com>\n---\n drivers/Makefile                           |  2 ++\n drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-\n drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-\n drivers/crypto/null/null_crypto_pmd.c      |  4 +++-\n drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-\n drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-\n drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-\n drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--\n drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-\n drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-\n drivers/net/e1000/em_ethdev.c              |  3 ++-\n drivers/net/e1000/igb_ethdev.c             |  6 ++++--\n drivers/net/ena/ena_ethdev.c               |  3 ++-\n drivers/net/enic/enic_ethdev.c             |  3 ++-\n drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-\n drivers/net/i40e/i40e_ethdev.c             |  3 ++-\n drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-\n drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--\n drivers/net/mlx4/mlx4.c                    |  3 ++-\n drivers/net/mlx5/mlx5.c                    |  3 ++-\n drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--\n drivers/net/nfp/nfp_net.c                  |  3 ++-\n drivers/net/null/rte_eth_null.c            |  3 ++-\n drivers/net/pcap/rte_eth_pcap.c            |  4 +++-\n drivers/net/qede/qede_ethdev.c             |  6 ++++--\n drivers/net/ring/rte_eth_ring.c            |  3 ++-\n drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-\n drivers/net/vhost/rte_eth_vhost.c          |  3 ++-\n drivers/net/virtio/virtio_ethdev.c         |  3 ++-\n drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-\n drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-\n lib/librte_eal/common/include/rte_dev.h    | 27 +++++++++++++++++++++------\n 32 files changed, 102 insertions(+), 41 deletions(-)",
    "diff": "diff --git a/drivers/Makefile b/drivers/Makefile\nindex 81c03a8..75a3168 100644\n--- a/drivers/Makefile\n+++ b/drivers/Makefile\n@@ -34,4 +34,6 @@ include $(RTE_SDK)/mk/rte.vars.mk\n DIRS-y += net\n DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += crypto\n \n+DEPDIRS-y += buildtools/pmdinfo\n+\n include $(RTE_SDK)/mk/rte.subdir.mk\ndiff --git a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\nindex 2987ef6..593769f 100644\n--- a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\n+++ b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\n@@ -521,4 +521,6 @@ static struct rte_driver aesni_gcm_pmd_drv = {\n \t.uninit = aesni_gcm_uninit\n };\n \n-PMD_REGISTER_DRIVER(aesni_gcm_pmd_drv);\n+PMD_REGISTER_DRIVER(aesni_gcm_pmd_drv, aesni_gcm);\n+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \\\n+max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\nindex 3415ac1..2e30939 100644\n--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n@@ -716,4 +716,6 @@ static struct rte_driver cryptodev_aesni_mb_pmd_drv = {\n \t.uninit = cryptodev_aesni_mb_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_aesni_mb_pmd_drv);\n+PMD_REGISTER_DRIVER(cryptodev_aesni_mb_pmd_drvi, aesni_mb);\n+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \\\n+max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/null/null_crypto_pmd.c b/drivers/crypto/null/null_crypto_pmd.c\nindex bdaf13c..44c4fba 100644\n--- a/drivers/crypto/null/null_crypto_pmd.c\n+++ b/drivers/crypto/null/null_crypto_pmd.c\n@@ -275,4 +275,6 @@ static struct rte_driver cryptodev_null_pmd_drv = {\n \t.uninit = cryptodev_null_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_null_pmd_drv);\n+PMD_REGISTER_DRIVER(cryptodev_null_pmd_drv, cryptodev_null_pmd);\n+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \\\n+max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/qat/rte_qat_cryptodev.c b/drivers/crypto/qat/rte_qat_cryptodev.c\nindex a7912f5..d2de6a6 100644\n--- a/drivers/crypto/qat/rte_qat_cryptodev.c\n+++ b/drivers/crypto/qat/rte_qat_cryptodev.c\n@@ -137,4 +137,6 @@ static struct rte_driver pmd_qat_drv = {\n \t.init = rte_qat_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(pmd_qat_drv);\n+PMD_REGISTER_DRIVER(pmd_qat_drv, qat);\n+DRIVER_REGISTER_PCI_TABLE(qat, pci_id_qat_map);\n+\ndiff --git a/drivers/crypto/snow3g/rte_snow3g_pmd.c b/drivers/crypto/snow3g/rte_snow3g_pmd.c\nindex f3e0e66..eee2544 100644\n--- a/drivers/crypto/snow3g/rte_snow3g_pmd.c\n+++ b/drivers/crypto/snow3g/rte_snow3g_pmd.c\n@@ -548,4 +548,6 @@ static struct rte_driver cryptodev_snow3g_pmd_drv = {\n \t.uninit = cryptodev_snow3g_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_snow3g_pmd_drv);\n+PMD_REGISTER_DRIVER(cryptodev_snow3g_pmd_drv, snow3g);\n+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \\\n+max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c\nindex f17bd7e..e960512 100644\n--- a/drivers/net/af_packet/rte_eth_af_packet.c\n+++ b/drivers/net/af_packet/rte_eth_af_packet.c\n@@ -878,4 +878,6 @@ static struct rte_driver pmd_af_packet_drv = {\n \t.uninit = rte_pmd_af_packet_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_af_packet_drv);\n+PMD_REGISTER_DRIVER(pmd_af_packet_drv, eth_af_packet);\n+DRIVER_REGISTER_PARAM_STRING(eth_af_packet, \"iface=<string> \\\n+qpairs=<int> blocksz=<int> framesz=<int> framecnt=<int>\");\ndiff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c\nindex 071b44f..2b88324 100644\n--- a/drivers/net/bnx2x/bnx2x_ethdev.c\n+++ b/drivers/net/bnx2x/bnx2x_ethdev.c\n@@ -550,5 +550,7 @@ static struct rte_driver rte_bnx2xvf_driver = {\n \t.init = rte_bnx2xvf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_bnx2x_driver);\n-PMD_REGISTER_DRIVER(rte_bnx2xvf_driver);\n+PMD_REGISTER_DRIVER(rte_bnx2x_driver, bnx2x);\n+DRIVER_REGISTER_PCI_TABLE(bnx2x, pci_id_bnx2x_map);\n+PMD_REGISTER_DRIVER(rte_bnx2xvf_driver, bnx2xvf);\n+DRIVER_REGISTER_PCI_TABLE(bnx2xvf, pci_id_bnx2xvf_map);\ndiff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c\nindex 129f04b..b4556be 100644\n--- a/drivers/net/bonding/rte_eth_bond_pmd.c\n+++ b/drivers/net/bonding/rte_eth_bond_pmd.c\n@@ -2511,4 +2511,9 @@ static struct rte_driver bond_drv = {\n \t.uninit = bond_uninit,\n };\n \n-PMD_REGISTER_DRIVER(bond_drv);\n+PMD_REGISTER_DRIVER(bond_drv, bonding);\n+\n+DRIVER_REGISTER_PARAM_STRING(bonding, \"slave=<ifc> primary=<ifc> mode=[0-4] \\\n+xmit_policy=[l2 | l23 | l34] socket_id=<int> mac=<mac addr> \\\n+lsc_poll_period_ms=<int> up_delay=<int> down_delay=<int>\");\n+\ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 04eddaf..e84e48b 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -894,4 +894,6 @@ static struct rte_driver rte_cxgbe_driver = {\n \t.init = rte_cxgbe_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_cxgbe_driver);\n+PMD_REGISTER_DRIVER(rte_cxgbe_driver, cxgb4);\n+DRIVER_REGISTER_PCI_TABLE(cxgb4, cxgb4_pci_tbl);\n+\ndiff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c\nindex 653be09..4de5eb2 100644\n--- a/drivers/net/e1000/em_ethdev.c\n+++ b/drivers/net/e1000/em_ethdev.c\n@@ -1777,4 +1777,5 @@ struct rte_driver em_pmd_drv = {\n \t.init = rte_em_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(em_pmd_drv);\n+PMD_REGISTER_DRIVER(em_pmd_drv, em);\n+DRIVER_REGISTER_PCI_TABLE(em, pci_id_em_map);\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex f0921ee..f49aae7 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -4973,5 +4973,7 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)\n \tE1000_WRITE_FLUSH(hw);\n }\n \n-PMD_REGISTER_DRIVER(pmd_igb_drv);\n-PMD_REGISTER_DRIVER(pmd_igbvf_drv);\n+PMD_REGISTER_DRIVER(pmd_igb_drv, igb);\n+DRIVER_REGISTER_PCI_TABLE(igb, pci_id_igb_map);\n+PMD_REGISTER_DRIVER(pmd_igbvf_drv, igbvf);\n+DRIVER_REGISTER_PCI_TABLE(igbvf, pci_id_igbvf_map);\ndiff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex e157587..702289b 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -1450,4 +1450,5 @@ struct rte_driver ena_pmd_drv = {\n \t.init = rte_ena_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(ena_pmd_drv);\n+PMD_REGISTER_DRIVER(ena_pmd_drv, ena);\n+DRIVER_REGISTER_PCI_TABLE(ena, pci_id_ena_map);\ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex 6bea940..36ee7ca 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -684,4 +684,5 @@ static struct rte_driver rte_enic_driver = {\n \t.init = rte_enic_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_enic_driver);\n+PMD_REGISTER_DRIVER(rte_enic_driver, enic);\n+DRIVER_REGISTER_PCI_TABLE(enic, pci_id_enic_map);\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex c2d377f..9b2a7ee 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -3055,4 +3055,5 @@ static struct rte_driver rte_fm10k_driver = {\n \t.init = rte_pmd_fm10k_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_fm10k_driver);\n+PMD_REGISTER_DRIVER(rte_fm10k_driver, fm10k);\n+DRIVER_REGISTER_PCI_TABLE(fm10k, pci_id_fm10k_map);\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 24777d5..3b6c661 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -695,7 +695,8 @@ static struct rte_driver rte_i40e_driver = {\n \t.init = rte_i40e_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_i40e_driver);\n+PMD_REGISTER_DRIVER(rte_i40e_driver, i40e);\n+DRIVER_REGISTER_PCI_TABLE(i40e, pci_id_i40e_map);\n \n /*\n  * Initialize registers for flexible payload, which should be set by NVM.\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex 90682ac..e94a459 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -1563,7 +1563,8 @@ static struct rte_driver rte_i40evf_driver = {\n \t.init = rte_i40evf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_i40evf_driver);\n+PMD_REGISTER_DRIVER(rte_i40evf_driver, i40evf);\n+DRIVER_REGISTER_PCI_TABLE(i40evf, pci_id_i40evf_map);\n \n static int\n i40evf_dev_configure(struct rte_eth_dev *dev)\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex a2b170b..af1ca56 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -7164,5 +7164,7 @@ static struct rte_driver rte_ixgbevf_driver = {\n \t.init = rte_ixgbevf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_ixgbe_driver);\n-PMD_REGISTER_DRIVER(rte_ixgbevf_driver);\n+PMD_REGISTER_DRIVER(rte_ixgbe_driver, ixgbe);\n+DRIVER_REGISTER_PCI_TABLE(ixgbe, pci_id_ixgbe_map);\n+PMD_REGISTER_DRIVER(rte_ixgbevf_driver, ixgbevf);\n+DRIVER_REGISTER_PCI_TABLE(ixgbevf, pci_id_ixgbevf_map);\ndiff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex 9ed1491..aedf1e9 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -5865,4 +5865,5 @@ static struct rte_driver rte_mlx4_driver = {\n \t.init = rte_mlx4_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_mlx4_driver)\n+PMD_REGISTER_DRIVER(rte_mlx4_driveri, mlx4)\n+DRIVER_REGISTER_PCI_TABLE(mlx4, mlx4_pci_id_map);\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 041cfc3..5f2d6c8 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -672,4 +672,5 @@ static struct rte_driver rte_mlx5_driver = {\n \t.init = rte_mlx5_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_mlx5_driver)\n+PMD_REGISTER_DRIVER(rte_mlx5_driveri, mlx5)\n+DRIVER_REGISTER_PCI_TABLE(mlx5, mlx5_pci_id_map);\ndiff --git a/drivers/net/mpipe/mpipe_tilegx.c b/drivers/net/mpipe/mpipe_tilegx.c\nindex 26e1424..4a2a905 100644\n--- a/drivers/net/mpipe/mpipe_tilegx.c\n+++ b/drivers/net/mpipe/mpipe_tilegx.c\n@@ -1635,8 +1635,8 @@ static struct rte_driver pmd_mpipe_gbe_drv = {\n \t.init = rte_pmd_mpipe_devinit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_mpipe_xgbe_drv);\n-PMD_REGISTER_DRIVER(pmd_mpipe_gbe_drv);\n+PMD_REGISTER_DRIVER(pmd_mpipe_xgbe_drv, mpipe_xgbe);\n+PMD_REGISTER_DRIVER(pmd_mpipe_gbe_drv, mpipe_gbe);\n \n static void __attribute__((constructor, used))\n mpipe_init_contexts(void)\ndiff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c\nindex ea5a2a3..78394a1 100644\n--- a/drivers/net/nfp/nfp_net.c\n+++ b/drivers/net/nfp/nfp_net.c\n@@ -2490,7 +2490,8 @@ static struct rte_driver rte_nfp_net_driver = {\n \t.init = nfp_net_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_nfp_net_driver);\n+PMD_REGISTER_DRIVER(rte_nfp_net_driver, nfp);\n+DRIVER_REGISTER_PCI_TABLE(nfp, pci_id_nfp_net_map);\n \n /*\n  * Local variables:\ndiff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c\nindex 5e8e203..88eb582 100644\n--- a/drivers/net/null/rte_eth_null.c\n+++ b/drivers/net/null/rte_eth_null.c\n@@ -689,4 +689,5 @@ static struct rte_driver pmd_null_drv = {\n \t.uninit = rte_pmd_null_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_null_drv);\n+PMD_REGISTER_DRIVER(pmd_null_drv, eth_null);\n+DRIVER_REGISTER_PARAM_STRING(eth_null, \"size=<int> copy=<int>\");\ndiff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c\nindex c98e234..397f01c 100644\n--- a/drivers/net/pcap/rte_eth_pcap.c\n+++ b/drivers/net/pcap/rte_eth_pcap.c\n@@ -1090,4 +1090,6 @@ static struct rte_driver pmd_pcap_drv = {\n \t.uninit = rte_pmd_pcap_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_pcap_drv);\n+PMD_REGISTER_DRIVER(pmd_pcap_drv, pcap);\n+DRIVER_REGISTER_PARAM_STRING(pcap, \"rx_pcap=<string> tx_pcap=<string> \\\n+rx_iface=<ifc> tx_iface=<ifc> iface=<ifc>\");\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 1273fd3..187ccf1 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -1102,5 +1102,7 @@ static struct rte_driver rte_qede_driver = {\n \t.init = rte_qedevf_pmd_init\n };\n \n-PMD_REGISTER_DRIVER(rte_qede_driver);\n-PMD_REGISTER_DRIVER(rte_qedevf_driver);\n+PMD_REGISTER_DRIVER(rte_qede_driver, qede);\n+DRIVER_REGISTER_PCI_TABLE(qede, pci_id_qede_map);\n+PMD_REGISTER_DRIVER(rte_qedevf_driver, qedevf);\n+DRIVER_REGISTER_PCI_TABLE(qedevf, pci_id_qedevf_map);\ndiff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c\nindex b1783c3..f2f5217 100644\n--- a/drivers/net/ring/rte_eth_ring.c\n+++ b/drivers/net/ring/rte_eth_ring.c\n@@ -630,4 +630,5 @@ static struct rte_driver pmd_ring_drv = {\n \t.uninit = rte_pmd_ring_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_ring_drv);\n+PMD_REGISTER_DRIVER(pmd_ring_drv, eth_ring);\n+DRIVER_REGISTER_PARAM_STRING(eth_ring, \"nodeaction=[attach|detach]\");\ndiff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c\nindex 78c43b0..abbc907 100644\n--- a/drivers/net/szedata2/rte_eth_szedata2.c\n+++ b/drivers/net/szedata2/rte_eth_szedata2.c\n@@ -1601,4 +1601,5 @@ static struct rte_driver rte_szedata2_driver = {\n \t.uninit = rte_szedata2_uninit,\n };\n \n-PMD_REGISTER_DRIVER(rte_szedata2_driver);\n+PMD_REGISTER_DRIVER(rte_szedata2_driver, rte_szedata2_pmd);\n+DRIVER_REGISTER_PCI_TABLE(rte_szedata2_pmd, rte_szedata2_pci_id_table);\ndiff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c\nindex 310cbef..d321c3e 100644\n--- a/drivers/net/vhost/rte_eth_vhost.c\n+++ b/drivers/net/vhost/rte_eth_vhost.c\n@@ -924,4 +924,5 @@ static struct rte_driver pmd_vhost_drv = {\n \t.uninit = rte_pmd_vhost_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_vhost_drv);\n+PMD_REGISTER_DRIVER(pmd_vhost_drv, eth_vhost);\n+DRIVER_REGISTER_PARAM_STRING(eth_vhost, \"iface=<ifc> queues=<int>\");\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex c3fb628..24d387f 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -1459,4 +1459,5 @@ static struct rte_driver rte_virtio_driver = {\n \t.init = rte_virtio_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_virtio_driver);\n+PMD_REGISTER_DRIVER(rte_virtio_driver, virtio_net);\n+DRIVER_REGISTER_PCI_TABLE(virtio_net, pci_id_virtio_map);\ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 29b469c..8da4449 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -954,4 +954,5 @@ static struct rte_driver rte_vmxnet3_driver = {\n \t.init = rte_vmxnet3_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_vmxnet3_driver);\n+PMD_REGISTER_DRIVER(rte_vmxnet3_driver, vmxnet3);\n+DRIVER_REGISTER_PCI_TABLE(vmxnet3, pci_id_vmxnet3_map);\ndiff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c\nindex 1adeb5b..81f8af9 100644\n--- a/drivers/net/xenvirt/rte_eth_xenvirt.c\n+++ b/drivers/net/xenvirt/rte_eth_xenvirt.c\n@@ -763,4 +763,4 @@ static struct rte_driver pmd_xenvirt_drv = {\n \t.uninit = rte_pmd_xenvirt_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_xenvirt_drv);\n+PMD_REGISTER_DRIVER(pmd_xenvirt_drv, xenvirt);\ndiff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h\nindex f1b5507..281d20d 100644\n--- a/lib/librte_eal/common/include/rte_dev.h\n+++ b/lib/librte_eal/common/include/rte_dev.h\n@@ -48,7 +48,7 @@ extern \"C\" {\n \n #include <stdio.h>\n #include <sys/queue.h>\n-\n+#include <rte_pci.h>\n #include <rte_log.h>\n \n __attribute__((format(printf, 2, 0)))\n@@ -178,12 +178,27 @@ int rte_eal_vdev_init(const char *name, const char *args);\n  */\n int rte_eal_vdev_uninit(const char *name);\n \n-#define PMD_REGISTER_DRIVER(d)\\\n-void devinitfn_ ##d(void);\\\n-void __attribute__((constructor, used)) devinitfn_ ##d(void)\\\n+#define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[] __attribute__((used))\n+\n+#define DRIVER_EXPORT_NAME(name, idx) \\\n+static const char DRIVER_EXPORT_NAME_ARRAY(this_pmd_name, idx) = RTE_STR(name);\\\n+ \n+#define PMD_REGISTER_DRIVER(drv, nm)\\\n+void devinitfn_ ##drv(void);\\\n+void __attribute__((constructor, used)) devinitfn_ ##drv(void)\\\n {\\\n-\trte_eal_driver_register(&d);\\\n-}\n+\t(drv).name = RTE_STR(nm);\\\n+        rte_eal_driver_register(&drv);\\\n+}\\\n+DRIVER_EXPORT_NAME(nm, __COUNTER__)\n+\n+#define DRV_EXP_TAG(name, tag) __##name##_##tag\n+\n+#define DRIVER_REGISTER_PCI_TABLE(name, table) \\\n+static const char DRV_EXP_TAG(name, pci_tbl_export)[] __attribute__((used)) = RTE_STR(table)\n+\n+#define DRIVER_REGISTER_PARAM_STRING(name, str) \\\n+static const char DRV_EXP_TAG(name, param_string_export)[] __attribute__((used)) = str\n \n #ifdef __cplusplus\n }\n",
    "prefixes": [
        "dpdk-dev",
        "PATCHv6",
        "2/7"
    ]
}