From patchwork Mon Aug 1 10:45:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shreyansh Jain X-Patchwork-Id: 15083 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 880E05A54; Mon, 1 Aug 2016 12:45:31 +0200 (CEST) Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0062.outbound.protection.outlook.com [104.47.42.62]) by dpdk.org (Postfix) with ESMTP id 8EAC85953 for ; Mon, 1 Aug 2016 12:45:29 +0200 (CEST) Received: from BN3PR0301CA0020.namprd03.prod.outlook.com (10.160.180.158) by CY1PR0301MB2058.namprd03.prod.outlook.com (10.164.2.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 1 Aug 2016 10:45:27 +0000 Received: from BN1AFFO11FD021.protection.gbl (2a01:111:f400:7c10::198) by BN3PR0301CA0020.outlook.office365.com (2a01:111:e400:4000::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15 via Frontend Transport; Mon, 1 Aug 2016 10:45:27 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; 6wind.com; dkim=none (message not signed) header.d=none; 6wind.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 BN1AFFO11FD021.mail.protection.outlook.com (10.58.52.81) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.549.5 via Frontend Transport; Mon, 1 Aug 2016 10:45:27 +0000 Received: from Tophie.ap.freescale.net (Tophie.ap.freescale.net [10.232.14.199]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u71Aibjw018422; Mon, 1 Aug 2016 03:45:25 -0700 From: Shreyansh Jain To: CC: , , David Marchand Date: Mon, 1 Aug 2016 16:15:31 +0530 Message-ID: <1470048332-27318-17-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1470048332-27318-1-git-send-email-shreyansh.jain@nxp.com> References: <1466510566-9240-1-git-send-email-shreyansh.jain@nxp.com> <1470048332-27318-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131145219280566350; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(105606002)(8676002)(2906002)(5003940100001)(586003)(4326007)(97736004)(189998001)(81156014)(110136002)(77096005)(5890100001)(50226002)(81166006)(92566002)(104016004)(2950100001)(68736007)(8936002)(11100500001)(19580395003)(19580405001)(229853001)(87936001)(50466002)(47776003)(2351001)(356003)(50986999)(76176999)(36756003)(305945005)(48376002)(7846002)(106466001)(85426001)(86362001)(33646002)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB2058; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD021; 1:9+3APqKL9d/OUZaDmqYCNt8la/x+x10r0OrxDfu88dj296INqsUSPR3RLPi5CSDNSvM6qCaIA/yAT3mXMplXKaMh+QY+NKiJxmq+8iiRqS7VSmlrYVoPD4TKDsmn3LYSHs46qOE1jB3y9QsK49uZZnS2b0qj1PXdlQd/hNFIfsI3xQ3wJuhzec7Xlxq1ueLrpsDAnYFqEdlJY7GBWKwqOMINBn7zUeQ7OML7WAdTpirL96nCrUo0yY+vYhQZMG5+bCt6iSVJSxe9iw/8H7Zoa82PzgJK2Hu+TZO5GkkFWZvHDeCbs0QOH3yCmgoAExTwzLiB3SM9j1Yz6zS234n0omhwtwUtsVe5pDboBRRk6UqPBRJCoY0XuSEd1wjjK2RzofEKrUZl5VBUtpM0zkf8OtyvlZ+SuiRqKAWRAPz1G+L8R3+/7KnI2zf0nnGSzp7zmwaaOJSaBLM345nqqE5eHmd8f8e3SpxjdAkrbmwkHL/TKGUnwlq+QTEPOuYToBcERDsGvUO0iAylswq13A8a8hKE20whlqJw0/Qnbh7Qi3l8+uby/zB4pZ/sqCAPg/V2RLVt4K7BJPe3Pc3L5vCH2iMfmWeGBoV4MKbG1Ux5ED4n5BmTKlLghQTLJ7O50Gyn MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 096aa6bf-8772-49ad-16ee-08d3b9f8f3aa X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2058; 2:cYQy+BwxM/0vMaL7qB/yho2xB9EieQ/tIuS2fVFGNnIr8q/hyQ3nEwHRHVVq2wGPNhptMr+kDRx5hn9XXTuen2LCTzR1wh/FlRLDXAnNBO1jMHP65/m0jT1JeCIO5fGoWUlXNs2GddaWV4wWeaJwhdeUQf9DL8qI8n038xWkXanvtCOolsMPgnx/HA0t0oxP; 3:MFoP/0qGW3mFa2Zz/trDRBo2tPIHIKhzhtGXiEuVFH1zFqKnqF3CuhrEihFD2BpJfZyMxC6OKy9H/CfYND0NatsBdvFNEl1cmrUYQgu0biEkfZcrE0GAnu7hRbJYvBdqP/kjzIQKzsLcb5BpUD05wDDWIAZx15GKH5uL4yz7RFig7H6s0GoIMJkhPrvaA5iCTO+t/0n+jSPExdFCkliErs0LpbQV0tBPA0ORJwqFdrI=; 25:lluzB0tPUJM/t4JZ1ZPB/RaNi9IWS1G+wGnp2Kb6LLAd6Z9WG7FKrITds5KtyBiJTLtqky3sb0FrPjI+rw0SCOlQcKbXM7sRQtk/spuzupdPhCrYitaaeNL4Ez9zVF7sSMDk8A6cyJj7W4Kn2sX9Ofto7Mr3sgd49yPWsijRtwWn3opK1B36ZMlwsCl0zNvuS7C2Sta9uAG+BxQGTluS52rXvTvDfXaCnj5TSZGcTLPXftFAJ7tBRj4Bw5rL2kVCxWJVabrlwgirB3dthGDG+QSno5Pu8V4+VxFKfs+jzqxc+T7k39IOP71DR6HOrwgGopOkSpVTyBRZHJmibmW2Ghotm5D7bFuzYs9M1IcjKdmuI552Ft5uoc8boT1R56w5s4kWBUmYXvqeh8ED/jOrMSB+JxoJsEZWL0Epnrq4ihg= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB2058; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2058; 31:tpabYbeXF/I6mmCahvOeNeOus0X1x/L0NNdEUu51qIhOt/dN9+r9ulpkwgAaxt1VJE2b2fBtdnuu0DfbnIg4Pmgh7oyHbzo6CYYfRt1vD+/75ocEJThKpLUZXYqJLm7K44hjDWdYQ+NrINCpE9Yrl1cUM0RN7TUfHhE1rpkEcis2six0u5mFI/PuESW+EvbtnWafZVnF8th/uxDpwYl1zg==; 4:cJkp8CI3IngQP1iYBq/HLBW+f8yaIn8+BtQNvDpGhRod5UXEbdmL8dHhg+sbg1Tay7yEJjpIPHnmn0ZTlXWvq4XzJzPLkLfJJezddhaXXESYyw2MJsuQKP76KIk5+21Wkp+Athl1z2CWCX+/rIM09XhlkUU5TCXj8Coh5o2wi556W8lHkbFYFaeRNKAXKsdU0YNtlizUDWPdSBaVjzH1D1s/mTmOrvoJDM7eYno4MT1geTnWE+OvOcbYOfTE8wF8T7vEJ4ZvPbGIFS1FyzEDlK9m+o8o0MqGTQ9pAE8ON7mWmz1jG+qV2+eOjDkeKaU7xzn067EEXTtX43a5KRQWOLgxNge9is1VkfH/3ZVVa7Qj2hy4rj2+RkJvvh3mMTzPegChHox6DfENTsGre6NuijJWk8QAkb2pMIwSN7lPAs6WoI5otzt13Qmx5hSTlNeFxwDYqGNoIrPrU8QRfkypBZkGweJpJ5756C3atrG4F1sqmOpItZhlw3jWIHQPbhB8qVr/NeroCaGFXzJZtBpzXo3lRBYNQ7PR/e4a7QOELQuh0JWqFWf4mWBsorgB/VTu X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397)(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13023025)(13024025)(13015025)(13018025)(13017025)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:CY1PR0301MB2058; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR0301MB2058; X-Forefront-PRVS: 0021920B5A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB2058; 23:0/+GA9yAZ0Bbkmahxg6xJkIcL7OnGlHuMMLicbN?= =?us-ascii?Q?N6IwLaB6dRK95cqolBQzSucA61V7iBdMyvdNATyHaG2zFXguMWWmFnCZnt9d?= =?us-ascii?Q?Lr8YK6OuDCUxKSMAF7l/vikLvQcHUXUXF0eqvmt7umanhkNGPGoid7cLuYGK?= =?us-ascii?Q?2AgaVqPh0tiOVQD8T4bnXPjexaoN/YmyNMKlTesJM2wDXU0knPxM291HacYx?= =?us-ascii?Q?UK8xvyRPFeNG/lA5OfUJrsuSn47ipyf/9h7LGBDKERIqx5GXvpODx2pfqZH5?= =?us-ascii?Q?iw1mxMYjItyaeLn19yPEGZHjHWxOYEHJ551zknHBU/vSAZKnsznpN0lhe91p?= =?us-ascii?Q?8ArzUGDC9IRW07esCQl9C8n1KPF0YJYA9QqjsT9pG72MDqGWZu3hH1vGbZJ6?= =?us-ascii?Q?xtPIeFIPSuzdQHkevv4rD0UGHIv1Xvfw0IbcKsLL7b1Nhk3tMQ+2b6sqAswD?= =?us-ascii?Q?mWJaqU1xEmwqDn1x5a4Qg+BV1kHm1HTp5cwAjuMohPituVdGvZYYMOcTlDLO?= =?us-ascii?Q?FX9U8FFkvj+J7ilREpsuc9cl88xxi1OATT8lORD6jZZgs7nSEVuZmHfRJPjW?= =?us-ascii?Q?0kxJ3r3eHQHalXn6/LPjuwYiDEY9IRRpvwZ+pt9HVhUv++AwRQHH3LEjo/5A?= =?us-ascii?Q?h42b/p7l+rtn4MwaI8PggqWFlPNkhz3tgtauo1BudIEKvU5VnKlkzvDN79lO?= =?us-ascii?Q?dr8AE4gNzNdXgat6Q2GPZnXk41841x32GRI1bWXhSF+3GEYhmoBsLKpZ5TQ2?= =?us-ascii?Q?cauLwuThgMT0PEwxynIdywmJrLmFIHwJ7xHnpMaj/u6PYiYXNbmatDnW8MoY?= =?us-ascii?Q?+7vHOyFlfI6ggZbKrFblkLtp1hJhzKNqCPNk3IjBY9YN77Gp/odtzf8M3YjR?= =?us-ascii?Q?mGkJnlrUFkE9soC/L42JTX+V2gNkAmipEfs1pnHbUWspamNui7/O/58g+YaX?= =?us-ascii?Q?0D+CaWLH9cwGqHv1Wd3VZsZRUAmLNLwjgDWuBqXxngGqSTd4mykTBo3nsljT?= =?us-ascii?Q?vuMNnQ5XQci/vwtz7wX/5FnXVsKBwpctria7JWqFbLqUwCkvZOnOa7+axx9w?= =?us-ascii?Q?S6O+QCjepWVgsC6OBNZDx/HVHIAVJGpgXLU7iOO9IZW6+qhISrlfPbYSDXLm?= =?us-ascii?Q?pVj7oFiVrKZjoIQlYVaGduqpUXAGUkcYyUKfu2/gRvCa0RGhXjhB9fHmuFbi?= =?us-ascii?Q?LCDcTxYG9Sz8l9cbLs4kJewI3ShQNb+Wz4KhVG43V91KBHP7lSzLVGG65SQ?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2058; 6:Gh2EJKe1w7UYla2yilKdPNTaK/V3yNp6VxLj8pYWTj/nh6nlAYs60HRROlb7cmDtMsBUmEuzENNRf1nkWmNqiFNJx6X0TDt34kMm6Or9KhiGyfw6rZ+q1aWRKrdLBC1WHtsKxaLCXLA2aaGQ/zOmOG8sEhM6LokUGb/6Bj34/Myx04U8nY4B61gTqXO6PYZVGJsy4Ke0X6IjzcLZMC2aL/BweIEBrngx4wT23SqbnebF6ZMnrHNOJMHFc531Z0hXxKNlW6U6/fzUnlm0r6VNvbN7I2S78x6Qi6gQO02qRks=; 5:KDcu8T2Sh+H0lxhRo90yufAm50jGesl2qC58DGn1ercl3oPmx97wgqDbW8HKEtHSzRZsYMBvTMIT1F6Y5UKqSLifQDggJUffb4dUlkOrJxjz66pKXl+WUjkOKQo31en5TwYax62ARL1gd8yVbMOYRLKFLEkQ5tFGzF/0LkhPqgE=; 24:nWXZbhA+B9P0bPLOOAH1nyqkLHJ2LIIeMfWGQtUZ66+1JcHcbx79F65klqfe7cbrwy2NsGDoqKpH2CBBBVK8YSUq5ZlYogn8p6a9cC99EZ8=; 7:9VoTNNs6zsxJHPGr+/cOa8yT8ZT/XGaYYeiRa5hatTWHAMi3F8f9rTg0uSlKkO+R0x3/41COQUV6/Bf/2txdeVb8yoN2f+qq/eRKPK1JOlvQduts1OyVcMkZ2bFVR6fDETT74S3qnlW21iHYJozt/uO3XDqPRU7wLz3i+aIlnXIIsksJFzwXckMEmBIKpOgPZwu/5RtRQWxyDoHCZVsgjuMOHkDctP9wlfAaDUEer/gowRNSFSTKGU+5T5NaGN+Z SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Aug 2016 10:45:27.8694 (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: CY1PR0301MB2058 Subject: [dpdk-dev] [PATCH v7 16/17] ethdev: convert to eal hotplug 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Remove bus logic from ethdev hotplug by using eal for this. Current api is preserved: - the last port that has been created is tracked to return it to the application when attaching, - the internal device name is reused when detaching. We can not get rid of ethdev hotplug yet since we still need some mechanism to inform applications of port creation/removal to substitute for ethdev hotplug api. dev_type field in struct rte_eth_dev and rte_eth_dev_allocate are kept as is, but this information is not needed anymore and is removed in the following commit. Signed-off-by: David Marchand Signed-off-by: Shreyansh Jain --- lib/librte_ether/rte_ethdev.c | 208 +++++++----------------------------------- 1 file changed, 34 insertions(+), 174 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index fdeac86..86c9d1a 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -72,6 +72,7 @@ static const char *MZ_RTE_ETH_DEV_DATA = "rte_eth_dev_data"; struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS]; static struct rte_eth_dev_data *rte_eth_dev_data; +static uint8_t eth_dev_last_created_port; static uint8_t nb_ports; /* spinlock for eth device callbacks */ @@ -216,6 +217,7 @@ rte_eth_dev_allocate(const char *name, enum rte_eth_dev_type type) eth_dev->data->port_id = port_id; eth_dev->attached = DEV_ATTACHED; eth_dev->dev_type = type; + eth_dev_last_created_port = port_id; nb_ports++; return eth_dev; } @@ -347,27 +349,6 @@ rte_eth_dev_count(void) return nb_ports; } -static enum rte_eth_dev_type -rte_eth_dev_get_device_type(uint8_t port_id) -{ - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, RTE_ETH_DEV_UNKNOWN); - return rte_eth_devices[port_id].dev_type; -} - -static int -rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) -{ - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); - - if (addr == NULL) { - RTE_PMD_DEBUG_TRACE("Null pointer is specified\n"); - return -EINVAL; - } - - *addr = rte_eth_devices[port_id].pci_dev->addr; - return 0; -} - int rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) { @@ -413,34 +394,6 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) } static int -rte_eth_dev_get_port_by_addr(const struct rte_pci_addr *addr, uint8_t *port_id) -{ - int i; - struct rte_pci_device *pci_dev = NULL; - - if (addr == NULL) { - RTE_PMD_DEBUG_TRACE("Null pointer is specified\n"); - return -EINVAL; - } - - *port_id = RTE_MAX_ETHPORTS; - - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { - - pci_dev = rte_eth_devices[i].pci_dev; - - if (pci_dev && - !rte_eal_compare_pci_addr(&pci_dev->addr, addr)) { - - *port_id = i; - - return 0; - } - } - return -ENODEV; -} - -static int rte_eth_dev_is_detachable(uint8_t port_id) { uint32_t dev_flags; @@ -465,124 +418,46 @@ rte_eth_dev_is_detachable(uint8_t port_id) return 1; } -/* attach the new physical device, then store port_id of the device */ -static int -rte_eth_dev_attach_pdev(struct rte_pci_addr *addr, uint8_t *port_id) -{ - /* Invoke probe func of the driver can handle the new device. */ - if (rte_eal_pci_probe_one(addr)) - goto err; - - if (rte_eth_dev_get_port_by_addr(addr, port_id)) - goto err; - - return 0; -err: - return -1; -} - -/* detach the new physical device, then store pci_addr of the device */ -static int -rte_eth_dev_detach_pdev(uint8_t port_id, struct rte_pci_addr *addr) -{ - struct rte_pci_addr freed_addr; - struct rte_pci_addr vp; - - /* get pci address by port id */ - if (rte_eth_dev_get_addr_by_port(port_id, &freed_addr)) - goto err; - - /* Zeroed pci addr means the port comes from virtual device */ - vp.domain = vp.bus = vp.devid = vp.function = 0; - if (rte_eal_compare_pci_addr(&vp, &freed_addr) == 0) - goto err; - - /* invoke devuninit func of the pci driver, - * also remove the device from pci_device_list */ - if (rte_eal_pci_detach(&freed_addr)) - goto err; - - *addr = freed_addr; - return 0; -err: - return -1; -} - -/* attach the new virtual device, then store port_id of the device */ -static int -rte_eth_dev_attach_vdev(const char *vdevargs, uint8_t *port_id) -{ - char *name = NULL, *args = NULL; - int ret = -1; - - /* parse vdevargs, then retrieve device name and args */ - if (rte_eal_parse_devargs_str(vdevargs, &name, &args)) - goto end; - - /* walk around dev_driver_list to find the driver of the device, - * then invoke probe function of the driver. - * rte_eal_vdev_init() updates port_id allocated after - * initialization. - */ - if (rte_eal_vdev_init(name, args)) - goto end; - - if (rte_eth_dev_get_port_by_name(name, port_id)) - goto end; - - ret = 0; -end: - free(name); - free(args); - - return ret; -} - -/* detach the new virtual device, then store the name of the device */ -static int -rte_eth_dev_detach_vdev(uint8_t port_id, char *vdevname) -{ - char name[RTE_ETH_NAME_MAX_LEN]; - - /* get device name by port id */ - if (rte_eth_dev_get_name_by_port(port_id, name)) - goto err; - /* walk around dev_driver_list to find the driver of the device, - * then invoke uninit function of the driver */ - if (rte_eal_vdev_uninit(name)) - goto err; - - strncpy(vdevname, name, sizeof(name)); - return 0; -err: - return -1; -} - /* attach the new device, then store port_id of the device */ int rte_eth_dev_attach(const char *devargs, uint8_t *port_id) { - struct rte_pci_addr addr; int ret = -1; + int current = eth_dev_last_created_port; + char *name = NULL; + char *args = NULL; if ((devargs == NULL) || (port_id == NULL)) { ret = -EINVAL; goto err; } - if (eal_parse_pci_DomBDF(devargs, &addr) == 0) { - ret = rte_eth_dev_attach_pdev(&addr, port_id); - if (ret < 0) - goto err; - } else { - ret = rte_eth_dev_attach_vdev(devargs, port_id); - if (ret < 0) - goto err; + /* parse devargs, then retrieve device name and args */ + if (rte_eal_parse_devargs_str(devargs, &name, &args)) + goto err; + + ret = rte_eal_dev_attach(name, args); + if (ret < 0) + goto err; + + /* no point looking at eth_dev_last_created_port if no port exists */ + if (!nb_ports) { + RTE_LOG(ERR, EAL, "No ports founds for device (%s)\n", name); + ret = -1; + goto err; + } + /* if nothing happened, there is a bug here, since some driver told us + * it did attach a device, but did not create a port */ + if (current == eth_dev_last_created_port) { + ret = -1; + goto err; } + *port_id = eth_dev_last_created_port; + ret = 0; - return 0; err: - RTE_LOG(ERR, EAL, "Driver, cannot attach the device\n"); + free(name); + free(args); return ret; } @@ -590,7 +465,6 @@ err: int rte_eth_dev_detach(uint8_t port_id, char *name) { - struct rte_pci_addr addr; int ret = -1; if (name == NULL) { @@ -598,33 +472,19 @@ rte_eth_dev_detach(uint8_t port_id, char *name) goto err; } - /* check whether the driver supports detach feature, or not */ + /* FIXME: move this to eal, once device flags are relocated there */ if (rte_eth_dev_is_detachable(port_id)) goto err; - if (rte_eth_dev_get_device_type(port_id) == RTE_ETH_DEV_PCI) { - ret = rte_eth_dev_get_addr_by_port(port_id, &addr); - if (ret < 0) - goto err; - - ret = rte_eth_dev_detach_pdev(port_id, &addr); - if (ret < 0) - goto err; - - snprintf(name, RTE_ETH_NAME_MAX_LEN, - "%04x:%02x:%02x.%d", - addr.domain, addr.bus, - addr.devid, addr.function); - } else { - ret = rte_eth_dev_detach_vdev(port_id, name); - if (ret < 0) - goto err; - } + snprintf(name, sizeof(rte_eth_devices[port_id].data->name), + "%s", rte_eth_devices[port_id].data->name); + ret = rte_eal_dev_detach(name); + if (ret < 0) + goto err; return 0; err: - RTE_LOG(ERR, EAL, "Driver, cannot detach the device\n"); return ret; }