From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0073.outbound.protection.outlook.com [104.47.36.73]) by dpdk.org (Postfix) with ESMTP id 1C9024AAD for ; Fri, 15 Jul 2016 11:44:27 +0200 (CEST) Received: from BY2PR03CA073.namprd03.prod.outlook.com (10.141.249.46) by CO2PR03MB2406.namprd03.prod.outlook.com (10.166.93.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.528.16; Fri, 15 Jul 2016 09:44:25 +0000 Received: from BY2FFO11FD040.protection.gbl (2a01:111:f400:7c0c::176) by BY2PR03CA073.outlook.office365.com (2a01:111:e400:2c5d::46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.528.16 via Frontend Transport; Fri, 15 Jul 2016 09:44:26 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; rehivetech.com; dkim=none (message not signed) header.d=none;rehivetech.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD040.mail.protection.outlook.com (10.1.14.225) with Microsoft SMTP Server (TLS) id 15.1.534.7 via Frontend Transport; Fri, 15 Jul 2016 09:44:25 +0000 Received: from [10.232.14.199] (Tophie.ap.freescale.net [10.232.14.199]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u6F9iL8U000670; Fri, 15 Jul 2016 02:44:22 -0700 To: Jan Viktorin References: <1466510566-9240-1-git-send-email-shreyansh.jain@nxp.com> <1468303282-2806-1-git-send-email-shreyansh.jain@nxp.com> <1468303282-2806-14-git-send-email-shreyansh.jain@nxp.com> <20160714190114.755c3de8@jvn> CC: , , From: Shreyansh jain Message-ID: <5788B09B.9090607@nxp.com> Date: Fri, 15 Jul 2016 15:14:59 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <20160714190114.755c3de8@jvn> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-EOPAttributedMessage: 0 X-Matching-Connectors: 131130494652189266; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(377454003)(24454002)(15650500001)(83506001)(59896002)(2950100001)(87266999)(76176999)(65816999)(85426001)(8676002)(54356999)(64126003)(93886004)(230700001)(110136002)(50986999)(106466001)(36756003)(8936002)(356003)(4326007)(189998001)(2906002)(575784001)(19580405001)(105606002)(586003)(4001350100001)(305945005)(7846002)(81166006)(81156014)(86362001)(77096005)(68736007)(47776003)(19580395003)(6806005)(65806001)(80316001)(23746002)(33656002)(65956001)(92566002)(104016004)(87936001)(50466002)(97736004); DIR:OUT; SFP:1101; SCL:1; SRVR:CO2PR03MB2406; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD040; 1:fDZH2VDsqUeBvsGSGMEllO3u67XI72DS6ja8dop1c4UbyJ+yanuUwIvTfZ0ZBPWGrm4yL7ZPAxH7atF8jNO89YfLaDwzdgrZhQxWJp5rB9OuLcyVOsDfISlZk55MhdB1Lfj0Exz1De5Wi7MRgfOna7nHpFMfd9VVpAeZFyh2gVCUvtbHxnr9SwIepoJDuHigBTMXDUZppAPxKzQSvfSnLQMKfT80Wz/BzKlsF/aPiAsAo03KoU3FWbYVCm/lIMPNjMhWaFOi9OUxgSSI/lFekNmv8rz9jVZLhj/9vVDmbFtAMUSvkiqCSqR0yFRjlpf0yN22EAl/sk6devSpJtbpXc240pbOxfF5v3IaxaGR9yYEUhutBYJSdWTrGOLeOmCtiTQpk6PyNAzzp0kIsyztOb6y9sw+6aJs80DMZUjpdgf04jgjliS5TQgMPFq4zA5RUIF+hyKf0vM5XUHPv8ryw/EU9TgUKcfQRPzlTZuqLdVvrBkJJr2WMF0nLqvht2/AjzuvxDK6A1dnQOZlVZ5jZO8sqBbXzrWjHOYZZmdoBpJv1LTsOX+Ziy9zttoS2Kflty1WfXLxWmFITJhqUT9ypQ== X-MS-Office365-Filtering-Correlation-Id: cfc503ab-7ad6-4470-0a52-08d3ac949b6e X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2406; 2:8ujwy11aKPeZCpPl1WjbBWR46Mv0Y2TeE32Hzmg/1CREMPAfxx5rWbNL71Lw7A+INlt64CqtiLMocH4vzfququrSEldtSnACehRW02iBe4ARf0VCAznKfeYGMUM/EPalqAiMf7KU9KHO9csnkaac5bRWVrOGRN9gccckL+s+5ZrTOd8nahcwtNLnPVtE7UKK; 3:REy4GAjYjyIPtEkUxXbPo1L8ISJAiiyHaFHuseXthoeeraCq4OKdaC+9yxKCwiv0PKundHkfekxS4Vb8AwABLVbH0tqMJlnj87Dt0TD9JkKHaNTgIYCiet/Ql2xZVf+LPA4PU5DU6iptTAzvpYwNOuVHdEfPOmdxFFk0QAC+wQpxqJHoBd162HVpVmlZXyoZMV86scDuiqYN98uBle890CbOqq6oLCoSovOB9MW6kV0= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CO2PR03MB2406; X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2406; 25:1XYApNyda85IfSANEcHBdmz1DcZj96FhYcJ73xpr0uQ5nW7XKKcO8ZVlA0QdPojwHXzuDPq/KbJPehhUqo5VMxAcgIAijdCwajUHIGXA8I8HSBE8W1rmY1KBGY6s7y/qQLRuTXSh967TQK+gaq7XWyKNp/Lc/9ZNuxXgZXHvHWE1SIAVeA4RDtbfeikiFAlTX7nInFu1/XqPyoGC5hII9zBDDTK7qB+iob5y0d6ABGMrRyEYwHNwGCnzlstPnbon9ZP7w+OOpxTi4Dg5oi2YLnrvVcLyfXnhr1lk1Ivg9N736EzghQbQUbclQTubioiXV3fLfrTrdZf/teI2YEMHWAkMhMKE6jvjxahtLsGo+LgEPslm6Ohy9or63u0MQpC6t6RDiqgHWVQ2qxDjZpk1+xcKsRUFjSBYo5l2w+09xn0e504cTQk5O6z5qMKVpDmlN8eSldD9lVe2WQm+x1eleqFK+ihlpeAH/BPNOkpT9iRtvK+D2kU0tewndCrv6czYcT9FeD1lK5d5CfcjzY2+NVc2FyC/S2feflfuPMRjWSVCNgfrauxw3uorM+Ymiauszn+yQVJexoY0fUaTvUJfRxEmYEVAApqWtO8qYXFDNdc/1P2hquEOEKkpeOgEtmH7SSQqp1w5HLaAfKM56xuHzuuWsW8upl7kjb/geEXeCpkli+INYTvV0tzpDPrz6U/jB33fHpYl18GY9r0KGdb4icOscfAcgO8SPnubnfkod7E=; 31:e9EF0IKbCZoW6BEkeIcSKVNQKxJPvEmaJcI8RIWpSbuUyH/j0JOUJTfVBt5dbLrYIiMSWagGvbTuuPnm6JvsN6aNS640VhJ32PF9UNUzzvEo/eLIfoAxQutbnEAuEDiGGu2Xk96wQYYGM7fFTVcaAFCHwOhLtTv0AzUc+Wa8Kba2vqMePDr3mJgzqeGwVJvevnAncNGzZ6639hq4TFdtbg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13018025)(13017025)(13024025)(13015025)(13023025)(8121501046)(5005006)(3002001)(10201501046)(6055026); SRVR:CO2PR03MB2406; BCL:0; PCL:0; RULEID:(400006); SRVR:CO2PR03MB2406; X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2406; 4:VH+5K0YSP6yy0IalSYkt1VVAGgdV2aDR/W9lam7mgiebwsRsTBLsXIAyjQ0GzSYKD/dQLOIaJDd39cL3hOGvC353m7nt6VXav+pTfJodPP3S9ObUMZJrXZepjWT2sa+3WqmBfBkxXQZnCPTCg8Vp1CyH2lV4b8JjmQyUtlGQgQg8uemH5EFIJO4NvvUBNNHdOYc7vB64sWSu0AxpL2j2sePQw/zw5R+cLFB5uxTxTzuIaG9j4k4ioZ8QnG91i/ahYdBgKZaiQWw4xMerLRGYJmJmKNvvuxMvUfj+Cvx2FprFOYmPyn9XlMJmSf0b1ofs4h10GcB2gA+XO3LxZA1caotws3BND73ieeE4jWyd57eeaMKfRAg0Ck7xKvsu3is7AR71QIaeDKioYZ56SF+CxSszgTTLzzWhFHkDTKq+Dh1nD7vgt9jlH0XjLKa6cPPZtIC1HEoGdBjj4Ku7mHqdCCrTy6EO5t8M90C/pcFATz6JGshljj9Ae6YZfn1/WP1WBU6LDaHfRlMUviX+v4nMRg== X-Forefront-PRVS: 00046D390F X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1; CO2PR03MB2406; 23:AOp6av6LCthqvJMEhqx+XK9krbikaJMuQGh9E?= =?Windows-1252?Q?S1YtwHi3BuKnniYiFESFSZ3QAAzWHK0q8JK8M/xSMucV2y7DvF+Vmt6S?= =?Windows-1252?Q?fc0oH+I2E8CEwPPnGpBKEZZ00J9DtrC5bJfy5yFGpspynW4T4Df+NMUl?= =?Windows-1252?Q?4jKv/M8yVY4KmgDNIjVaeDgemAG5hKyIgpNe88fb6CmU+xywb5CLdRbQ?= =?Windows-1252?Q?TvV0OVPuGFICaK6aMirCwMMbC0CDqvDoEjKkrAuKE+ZGsyPw1EezwnFU?= =?Windows-1252?Q?KAQ41z22hDwdKv2iZoI+tBPE1DarAdKsrzxZQphcz+9LS3vrpDJzixry?= =?Windows-1252?Q?8AqAOM/KKAxyl5qJSACIIXm7Wde3bWHiBhXZrnSnMaDJOQvleckDgGVm?= =?Windows-1252?Q?ustWUmFyvfh0+w9cFwYy1B4YNQ/oaZk1DGAjzlvAZgf0hryoDsQpt5Fj?= =?Windows-1252?Q?0e2dNx9xcfy4hIqeNDtCPTzJlKa0w6IHu5uIomrovPrxIIKE/Ppz9P/J?= =?Windows-1252?Q?nFmlzA1yDjAlobnXqfhFZsmzbjXVHz260MhhDiNMJt7Xd7cHoTskdlgz?= =?Windows-1252?Q?adgBzi3ulwpj04fIRF8ut50yEKBAOi+C7QK5T/ick3bytFJYihiPd6fX?= =?Windows-1252?Q?1kmfvjyirbLas+d7XeVIO7OXiXBXv1BJ/NU6oKbNNvZrt1mfUHqZ1sTU?= =?Windows-1252?Q?Y7hXgGoohXMkaEdB/ef3mA5e0m5C/6oxszrM+DRTh/XZjNlp7GNqLSga?= =?Windows-1252?Q?cGGZQIRoQXj1kV9HNbjEytzDBlfcI3eU9ZP0Nq7Pla6AuTFFKr9nlQSR?= =?Windows-1252?Q?vT6DV/fExq5JQGyg6bM5YyY7i7RW3nmQ9n8jOMB7x4mG7CHvB40hxqBH?= =?Windows-1252?Q?XOADhE3IGAS/FpbX9ILQ6GdbYyMzd0LyeQbRFygyGajZNi4Oawt/G3EC?= =?Windows-1252?Q?6NS8Kg84bPGbfffO69JPPZUcKYkvt09qlmx36BeMx8d7yVJIDlqXF48O?= =?Windows-1252?Q?sQQholARqPF/hL4DGn/QSBx8pyfD+KaGAbF8EM+trqNgk6c9JRPaN07G?= =?Windows-1252?Q?f90UImrteHQmVFS8L6n6IP3Aw/WL/1UG2DflePPBYhI2JloSGlHlEfkd?= =?Windows-1252?Q?O/ESpkydNn0nXioYf/dLaGLe7iiKUQK1GKr+aWkNC5Q2eFIWj4Naeibz?= =?Windows-1252?Q?mR0LIRhY1f2PHHj3IEQkjodkFxyanCbMZdbEvzMytWhhbUZHS/ssnn/G?= =?Windows-1252?Q?1IMX9YWnGGrL7YM79M4ZxAG0bx0s1cCn3Wx6c5Xa3iwmGaRLV/e/yXFp?= =?Windows-1252?Q?CJEM8YOuGzveCoA0k/2joYDh5Po45QavPE96zX3v4/XbXQd7slczHilN?= =?Windows-1252?Q?+8RRjns+SJekKyOrjhv8AVdhN8J5qJSELiggn4qYFzS4sKW0bLvNiI54?= =?Windows-1252?Q?e+aZxHSJcu4qAVtT9lHPW83CfJWPycyfyfN+m+vSw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2406; 6:r7D+5Y2yzYxX6DsooRybv+WELpnmvqUThlp2BXCXyWcqni3ZVGxtdFZRKIFICEIb01dvR31gTDKohW3W8rn3DDlU4WlD+scEaCLZLjdfnjFV/ftQ5Df6dKEK43vXMZ63gCrRvzp/qriQXYjBRsgfGeEO5sLEczTyLICVe+VSm+4Pc/rQb970+2ttXzLrWEtiuJZe0u+NUih+MZKYCLnKYCLPQzveKGQsyrYoG4KLxJjDXhrZD9WD8B9vn8WckfcFVd/aiJuSW/uqVjJuMKyWgQeHUZxP43su/vNYO32oauo=; 5:k4oYIt7ttnXrVwvGL6R2VRCyExxK6jC3zeAI7lAtnMzJoiuYo2vRfPgnqo8a5jEaOANVA8WjjST0J9EFhKZKKD72zGjnLlppKVrTZXt5gbqQgDno2b52aWQhlKxC9ocmcoFo4hBZIFMOBluou+kPMT5ey+JPWMwGvCRYbOJH+cg=; 24:MBitzUi4dCpuqRpl4t8QkdAaek7TXc7GADupdK/fIgztjnEHT9ltA7JPn6mwwnJ2K8qb8087IjJ2CX34r/oSCAjt8uWKJxxZl+JNKrHxgEA=; 7:WFpxAoa5PSw2m6CexRIlXPaKQYc/bzan552+9Mwbw72bvYucRv3RjH7MDTu4N2xOR0Z/z7iYNYPwIiQjJbG93idTs+stVk+uCP2Z/hmvz5CGSkiSoEL9TImaNu38Wwi6tiapJoSFW/NoZBPTLEaw7FT5cuJ1datATid9RLWQPpuN57xioyjcdTwOg0a2R2jXpFFJ/P6w1t9Nq4txQKCVQ7Muexui7S90uPO9BAXGVyme8GUoJnbnOFgs8hRHX2uv SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jul 2016 09:44:25.0317 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR03MB2406 Subject: Re: [dpdk-dev] [PATCH v6 13/17] pci: add a helper to update a device 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, 15 Jul 2016 09:44:27 -0000 On Thursday 14 July 2016 10:31 PM, Jan Viktorin wrote: > On Tue, 12 Jul 2016 11:31:18 +0530 > Shreyansh Jain wrote: > >> This helper updates a pci device object with latest information it can >> find. >> It will be used mainly for hotplug code. >> >> Signed-off-by: David Marchand >> Signed-off-by: Shreyansh Jain >> --- >> lib/librte_eal/bsdapp/eal/eal_pci.c | 49 +++++++++++++++++++++++++++++++++ >> lib/librte_eal/common/eal_common_pci.c | 2 -- >> lib/librte_eal/common/eal_private.h | 13 +++++++++ >> lib/librte_eal/common/include/rte_pci.h | 3 ++ >> lib/librte_eal/linuxapp/eal/eal_pci.c | 13 +++++++++ >> 5 files changed, 78 insertions(+), 2 deletions(-) >> >> diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c >> index a73cbb0..1d91c78 100644 >> --- a/lib/librte_eal/bsdapp/eal/eal_pci.c >> +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c >> @@ -406,6 +406,55 @@ error: >> return -1; >> } >> >> +int >> +pci_update_device(const struct rte_pci_addr *addr) >> +{ >> + int fd; >> + struct pci_conf matches[2]; >> + struct pci_match_conf match = { >> + .pc_sel = { >> + .pc_domain = addr->domain, >> + .pc_bus = addr->bus, >> + .pc_dev = addr->devid, >> + .pc_func = addr->function, >> + }, >> + }; >> + struct pci_conf_io conf_io = { >> + .pat_buf_len = 0, >> + .num_patterns = 1, >> + .patterns = &match, >> + .match_buf_len = sizeof(matches), >> + .matches = &matches[0], >> + }; >> + >> + fd = open("/dev/pci", O_RDONLY); >> + if (fd < 0) { >> + RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__); >> + goto error; >> + } >> + >> + if (ioctl(fd, PCIOCGETCONF, &conf_io) < 0) { >> + RTE_LOG(ERR, EAL, "%s(): error with ioctl on /dev/pci: %s\n", >> + __func__, strerror(errno)); >> + goto error; >> + } >> + >> + if (conf_io.num_matches != 1) >> + goto error; >> + >> + if (pci_scan_one(fd, &matches[0]) < 0) >> + goto error; >> + >> + close(fd); >> + >> + return 0; >> + >> +error: >> + if (fd >= 0) >> + close(fd); >> + return -1; >> +} >> + >> /* Read PCI config space. */ >> int rte_eal_pci_read_config(const struct rte_pci_device *dev, >> void *buf, size_t len, off_t offset) >> diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c >> index 6a0f6ac..58f0c74 100644 >> --- a/lib/librte_eal/common/eal_common_pci.c >> +++ b/lib/librte_eal/common/eal_common_pci.c >> @@ -87,8 +87,6 @@ struct pci_driver_list pci_driver_list = >> struct pci_device_list pci_device_list = >> TAILQ_HEAD_INITIALIZER(pci_device_list); >> >> -#define SYSFS_PCI_DEVICES "/sys/bus/pci/devices" >> - > > Is this delete correct? The SYSFS_PCI_DEVICES was moved here from > rte_pci.h. A relict of some rebase? My miss - I had though of using pci_get_sysfs_path post v5, (as you have mentioned below) but while re-creating the patches I missed out. > >> const char *pci_get_sysfs_path(void) >> { >> const char *path = NULL; >> diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h >> index 06a68f6..b8ff9c5 100644 >> --- a/lib/librte_eal/common/eal_private.h >> +++ b/lib/librte_eal/common/eal_private.h >> @@ -152,6 +152,19 @@ struct rte_pci_driver; >> struct rte_pci_device; >> >> /** >> + * Update a pci device object by asking the kernel for the latest information. >> + * >> + * This function is private to EAL. >> + * >> + * @param addr >> + * The PCI Bus-Device-Function address to look for >> + * @return >> + * - 0 on success. >> + * - negative on error. >> + */ >> +int pci_update_device(const struct rte_pci_addr *addr); >> + >> +/** >> * Unbind kernel driver for this device >> * >> * This function is private to EAL. >> diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h >> index 06508fa..5c2062c 100644 >> --- a/lib/librte_eal/common/include/rte_pci.h >> +++ b/lib/librte_eal/common/include/rte_pci.h >> @@ -107,6 +107,9 @@ const char *pci_get_sysfs_path(void); >> /** Nb. of values in PCI resource format. */ >> #define PCI_RESOURCE_FMT_NVAL 3 >> >> +/** Default sysfs path for PCI device search. */ >> +#define SYSFS_PCI_DEVICES "/sys/bus/pci/devices" >> + > > Why adding SYSFS_PCI_DEVICES here? The pci_get_sysfs_path is used for > this purpose. Again, a rebase issue? Once pci_get_sysfs_path is used, this change would be redundant. > >> /** >> * A structure describing a PCI resource. >> */ >> diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c >> index f0215ee..8f3ef20 100644 >> --- a/lib/librte_eal/linuxapp/eal/eal_pci.c >> +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c >> @@ -417,6 +417,19 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus, >> return 0; >> } >> >> +int >> +pci_update_device(const struct rte_pci_addr *addr) >> +{ >> + char filename[PATH_MAX]; >> + >> + snprintf(filename, sizeof(filename), "%s/" PCI_PRI_FMT, >> + SYSFS_PCI_DEVICES, addr->domain, addr->bus, addr->devid, > > Use pci_get_sysfs_path here. My miss. I will change this. > >> + addr->function); >> + >> + return pci_scan_one(filename, addr->domain, addr->bus, addr->devid, >> + addr->function); >> +} >> + >> /* >> * split up a pci address into its constituent parts. >> */ > > >