From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58]) by dpdk.org (Postfix) with ESMTP id EE9CC68BE for ; Thu, 10 Apr 2014 22:49:25 +0200 (CEST) Received: from hmsreliant.think-freely.org ([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost) by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63) (envelope-from ) id 1WYLw4-0004PS-B1; Thu, 10 Apr 2014 16:51:02 -0400 From: Neil Horman To: dev@dpdk.org Date: Thu, 10 Apr 2014 16:50:02 -0400 Message-Id: <1397163009-29950-12-git-send-email-nhorman@tuxdriver.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1397163009-29950-1-git-send-email-nhorman@tuxdriver.com> References: <1397162846-28912-1-git-send-email-nhorman@tuxdriver.com> <1397163009-29950-1-git-send-email-nhorman@tuxdriver.com> X-Spam-Score: -2.9 (--) X-Spam-Status: No Subject: [dpdk-dev] [PATCH 12/19] pmd: Add PMD_INIT macro for use in pci based PMDs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Apr 2014 20:49:26 -0000 Like their non-pci counterparts, the PMD_INIT macro can be used by pci based PMD's to register an init routine without having the core libraries reference symbols in them directly. Signed-off-by: Neil Horman --- lib/librte_eal/common/include/rte_pmd.h | 9 +++++++ lib/librte_ether/rte_ethdev.c | 44 +++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/common/include/rte_pmd.h b/lib/librte_eal/common/include/rte_pmd.h index 75a4895..bcba8f8 100644 --- a/lib/librte_eal/common/include/rte_pmd.h +++ b/lib/librte_eal/common/include/rte_pmd.h @@ -44,7 +44,9 @@ extern "C" { #endif +extern void rte_pmd_register_init(int (*pmd_initfn)(void)); extern void rte_eal_nonpci_dev_init_register(const char *name, int (*dev_initfn)(const char *, const char *)); + #define PMD_INIT_NONPCI(x,n)\ void devinitfn_ ##x(void);\ void __attribute__((constructor, used)) devinitfn_ ##x(void)\ @@ -52,6 +54,13 @@ void __attribute__((constructor, used)) devinitfn_ ##x(void)\ rte_eal_nonpci_dev_init_register(n,x);\ } +#define PMD_INIT(x)\ +void devinitfn_ ##x(void);\ +void __attribute__((constructor, used)) devinitfn_ ##x(void)\ +{\ + rte_pmd_register_init(x);\ +} + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index dd378f0..a9efe73 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -64,6 +64,7 @@ #include #include #include +#include #include "rte_ether.h" #include "rte_ethdev.h" @@ -112,9 +113,38 @@ static uint8_t nb_ports = 0; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +TAILQ_HEAD(pmd_list, pmd_entry); + +/* Definition for shared object drivers. */ +struct pmd_entry { + TAILQ_ENTRY(pmd_entry) next; + int (*pmd_initfn)(void); +}; + +/* List of external loadable drivers */ +static struct pmd_list pmd_init_list = +TAILQ_HEAD_INITIALIZER(pmd_init_list); + +void rte_pmd_register_init(int (*pmd_initfn)(void)) +{ + struct pmd_entry *new = malloc(sizeof(struct pmd_entry)); + + if (!new) { + printf("Not enough memory to register pci pmd\n"); + goto out; + } + + new->pmd_initfn = pmd_initfn; + TAILQ_INSERT_TAIL(&pmd_init_list, new, next); +out: + return; + +} + int rte_pmd_init_all(void) { int ret = -ENODEV; + struct pmd_entry *entry; #ifdef RTE_LIBRTE_IGB_PMD if ((ret = rte_igb_pmd_init()) != 0) { @@ -159,9 +189,19 @@ int rte_pmd_init_all(void) } #endif /* RTE_LIBRTE_VMXNET3_PMD */ - if (ret == -ENODEV) + if (ret == -ENODEV) { RTE_LOG(ERR, PMD, "No PMD(s) are configured\n"); - return (ret); + goto out; + } + + TAILQ_FOREACH(entry, &pmd_init_list, next) { + ret = entry->pmd_initfn(); + if (ret != 0) + break; + } + +out: + return ret; } /** -- 1.8.3.1