From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by dpdk.org (Postfix) with ESMTP id 5D1E791DD for ; Fri, 22 Jan 2016 16:27:59 +0100 (CET) Received: by mail-wm0-f54.google.com with SMTP id n5so137668680wmn.0 for ; Fri, 22 Jan 2016 07:27:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Pfrl2kpK19OunSR0H49Vzn2FG+pb1t+MvckB+HnoonA=; b=JiDabeJrmfcSP7PBmiuQHx7+Ii3K5JasO8MBb93v9/sbdQhO71eD91Vd4buvvOUxSA F1R+eOYWIbSmBEykjGeho/dVm2rl9jy97HtxApNwEnd2E1U+Npd0tXDvd22S6D5GFIbq jcBHvLxCMv4GV3pbZ4eY2uJjsad0FexOApV22ZEPNh6E5Nwoxlp+T6GxYOZ1t3mtZOWd VU53hIDqV49ChgJiJyL/9wlkdtSr5gcrnkcAoxcQpaevYMbI/Drhdc0fKgJSNeS7Qfh2 J6w/SWc3ZfaeYWae7eW7EWm4EoX1IKzLDhtbaS5zpJe1Z5QAaT6w6I+df2TjMIt55d9t KtlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Pfrl2kpK19OunSR0H49Vzn2FG+pb1t+MvckB+HnoonA=; b=CohSrt+Zuu29f5GmWDvNblO7kWjNV0Re5Bg7PH/6U3/p8VNM+duf/usvl1EK7Q6sOk bWxWXVZuK4MdzsdAc0jedSTc5a+j/8NDmKsMcBMH2z716ZRBKjCnoiMOpVcuceDcF6L7 jttm4WPQqroBXoiIDb3lCNXWd4nC2hv8zN8mSQ7sPJDa59UUsRr5zNa/952ffdOMyGK5 PgRkojVxc4d9bokBogOOMJRM9i3Pas3w7C6voxzvD3Gl+iWBNeq7QQbfMkf78HDVNoPv GwbBNA7AWROr6UceOg8dvA6dKBriLGNUPeBzeSIN4PfpxZtz+G2iCFL9T3K8mkRGE1xX b7EQ== X-Gm-Message-State: AG10YOS4hGcErN39nqRFMv1RLcPx3GIIYlfycZiWxPJR1ne8fSzyNLkonBDJ6F4qoA0eC/Uj X-Received: by 10.194.174.73 with SMTP id bq9mr3822782wjc.145.1453476479084; Fri, 22 Jan 2016 07:27:59 -0800 (PST) Received: from gloops.dev.6wind.com (144.77.126.78.rev.sfr.net. [78.126.77.144]) by smtp.gmail.com with ESMTPSA id w73sm3359464wmw.21.2016.01.22.07.27.58 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 22 Jan 2016 07:27:58 -0800 (PST) From: David Marchand To: dev@dpdk.org Date: Fri, 22 Jan 2016 16:27:42 +0100 Message-Id: <1453476464-31767-8-git-send-email-david.marchand@6wind.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1453476464-31767-1-git-send-email-david.marchand@6wind.com> References: <1453476464-31767-1-git-send-email-david.marchand@6wind.com> Cc: viktorin@rehivetech.com Subject: [dpdk-dev] [PATCH 7/9] pci: factorize driver search 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: Fri, 22 Jan 2016 15:27:59 -0000 Same idea as a few commits before, no need to implement the same logic in probe and detach functions. Here, the driver matching is done by a helper, then probe / detach functions are called respectively. Signed-off-by: David Marchand --- lib/librte_eal/common/eal_common_pci.c | 96 ++++++++++++---------------------- 1 file changed, 34 insertions(+), 62 deletions(-) diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index 769c42e..a1efd57 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -280,55 +280,16 @@ pci_detach_device(struct rte_pci_driver *dr, struct rte_pci_device *dev) return 0; } -/* - * If vendor/device ID match, call the devinit() function of all - * registered driver for the given device. Return -1 if initialization - * failed, return 1 if no driver is found for this device. - */ -static int -pci_probe_all_drivers(struct rte_pci_device *dev) -{ - struct rte_pci_driver *dr = NULL; - int rc = 0; - - TAILQ_FOREACH(dr, &pci_driver_list, next) { - if (!pci_driver_supports_device(dr, dev)) - continue; - - rc = pci_probe_device(dr, dev); - if (rc < 0) - /* negative value is an error */ - return -1; - if (rc > 0) - /* positive value means device is blacklisted */ - continue; - return 0; - } - return 1; -} - -/* - * If vendor/device ID match, call the devuninit() function of all - * registered driver for the given device. Return -1 if initialization - * failed, return 1 if no driver is found for this device. - */ -static int -pci_detach_all_drivers(struct rte_pci_device *dev) +static struct rte_pci_driver * +pci_find_driver(struct rte_pci_device *dev) { - struct rte_pci_driver *dr = NULL; - int rc = 0; + struct rte_pci_driver *dr; TAILQ_FOREACH(dr, &pci_driver_list, next) { - if (!pci_driver_supports_device(dr, dev)) - continue; - - rc = pci_detach_device(dr, dev); - if (rc < 0) - /* negative value is an error */ - return -1; - return 0; + if (pci_driver_supports_device(dr, dev)) + break; } - return 1; + return dr; } /* @@ -338,8 +299,8 @@ pci_detach_all_drivers(struct rte_pci_device *dev) int rte_eal_pci_probe_one(const struct rte_pci_addr *addr) { - struct rte_pci_device *dev = NULL; - int ret = 0; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; if (addr == NULL) return -1; @@ -348,8 +309,11 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr) if (!dev) goto err_return; - ret = pci_probe_all_drivers(dev); - if (ret < 0) + dr = pci_find_driver(dev); + if (!dr) + goto err_return; + + if (pci_probe_device(dr, dev) < 0) goto err_return; return 0; @@ -367,8 +331,8 @@ err_return: int rte_eal_pci_detach(const struct rte_pci_addr *addr) { - struct rte_pci_device *dev = NULL; - int ret = 0; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; if (addr == NULL) return -1; @@ -377,8 +341,11 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr) if (!dev) goto err_return; - ret = pci_detach_all_drivers(dev); - if (ret < 0) + dr = pci_find_driver(dev); + if (!dr) + goto err_return; + + if (pci_detach_device(dr, dev) < 0) goto err_return; TAILQ_REMOVE(&pci_device_list, dev, next); @@ -399,28 +366,33 @@ err_return: int rte_eal_pci_probe(void) { - struct rte_pci_device *dev = NULL; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; struct rte_devargs *devargs; int probe_all = 0; - int ret = 0; if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) == 0) probe_all = 1; TAILQ_FOREACH(dev, &pci_device_list, next) { + /* no driver available */ + dr = pci_find_driver(dev); + if (!dr) + continue; + /* set devargs in PCI structure */ devargs = pci_devargs_lookup(dev); if (devargs != NULL) dev->devargs = devargs; - /* probe all or only whitelisted devices */ - if (probe_all) - ret = pci_probe_all_drivers(dev); - else if (devargs != NULL && - devargs->type == RTE_DEVTYPE_WHITELISTED_PCI) - ret = pci_probe_all_drivers(dev); - if (ret < 0) + /* skip if not probing all and device is not whitelisted */ + if (!probe_all && + (devargs == NULL || + devargs->type != RTE_DEVTYPE_WHITELISTED_PCI)) + continue; + + if (pci_probe_device(dr, dev) < 0) rte_exit(EXIT_FAILURE, "Requested device " PCI_PRI_FMT " cannot be used\n", dev->addr.domain, dev->addr.bus, dev->addr.devid, dev->addr.function); -- 1.9.1