X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fbsdapp%2Feal%2Feal_pci.c;h=5457a21b6cb624324c0baf54848a1da32be476c0;hb=ff708facfcbf42f3dcb3c62d82ecd93e7b8c2506;hp=2bbbeb03fd404bdc3b46e9febc07092a53d22c8c;hpb=6f41fe75e2dd8dd38f7bea7b9501edd4f9b72fa5;p=dpdk.git diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index 2bbbeb03fd..5457a21b6c 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -58,7 +58,6 @@ #include #include #include -#include #include #include #include @@ -156,10 +155,6 @@ fail: return NULL; } -#ifndef OFF_MAX -#define OFF_MAX ((uint64_t)(off_t)-1) -#endif - static int pci_uio_map_secondary(struct rte_pci_device *dev) { @@ -187,7 +182,7 @@ pci_uio_map_secondary(struct rte_pci_device *dev) } RTE_LOG(ERR, EAL, "Cannot find resource for device\n"); - return -1; + return 1; } /* map the PCI resource of a PCI device in virtual memory */ @@ -274,23 +269,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) return (0); } -/* parse the "resource" sysfs file */ -#define IORESOURCE_MEM 0x00000200 - -/* Compare two PCI device addresses. */ -static int -pci_addr_comparison(struct rte_pci_addr *addr, struct rte_pci_addr *addr2) -{ - uint64_t dev_addr = (addr->domain << 24) + (addr->bus << 16) + (addr->devid << 8) + addr->function; - uint64_t dev_addr2 = (addr2->domain << 24) + (addr2->bus << 16) + (addr2->devid << 8) + addr2->function; - - if (dev_addr > dev_addr2) - return 1; - else - return 0; -} - - /* Scan one pci sysfs entry, and fill the devices list from it. */ static int pci_scan_one(int dev_pci_fd, struct pci_conf *conf) @@ -363,13 +341,24 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf) } else { struct rte_pci_device *dev2 = NULL; + int ret; TAILQ_FOREACH(dev2, &pci_device_list, next) { - if (pci_addr_comparison(&dev->addr, &dev2->addr)) + ret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr); + if (ret > 0) continue; - else { + else if (ret < 0) { TAILQ_INSERT_BEFORE(dev2, dev, next); return 0; + } else { /* already registered */ + /* update pt_driver */ + dev2->pt_driver = dev->pt_driver; + dev2->max_vfs = dev->max_vfs; + memmove(dev2->mem_resource, + dev->mem_resource, + sizeof(dev->mem_resource)); + free(dev); + return 0; } } TAILQ_INSERT_TAIL(&pci_device_list, dev, next); @@ -389,7 +378,7 @@ skipdev: static int pci_scan(void) { - int fd = -1; + int fd; unsigned dev_count = 0; struct pci_conf matches[16]; struct pci_conf_io conf_io = { @@ -503,7 +492,7 @@ rte_eal_pci_init(void) { TAILQ_INIT(&pci_driver_list); TAILQ_INIT(&pci_device_list); - uio_res_list = RTE_TAILQ_RESERVE_BY_IDX(RTE_TAILQ_PCI, uio_res_list); + uio_res_list = RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_PCI, uio_res_list); /* for debug purposes, PCI can be disabled */ if (internal_config.no_pci)