From patchwork Thu Sep 24 04:02:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sachin Saxena (OSS)" X-Patchwork-Id: 78635 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4A130A04B1; Thu, 24 Sep 2020 06:03:24 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1412D1DD2C; Thu, 24 Sep 2020 06:02:47 +0200 (CEST) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70084.outbound.protection.outlook.com [40.107.7.84]) by dpdk.org (Postfix) with ESMTP id 759791DD24 for ; Thu, 24 Sep 2020 06:02:33 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fiH39yQjVre6wCX0PWm8CfR0ijAmIkU3a+y8I4AkHXU8uB5Wox1/n55vvL3XxGn9Rof+N9n8b367FU0+3GCtiFTXOYpTKtks1+trMF+w9Ov2F2gwQUT3+vd0qnIr1FELrl8t8RyMFtIHC9uCQbKVQxmVdmgcCljTfyBx9hH/RP+BYVBZqwoRddOHCKLV5dkJtsEXxL79GwHJeb6IjIxKBdPIc1BWVQ1kLRuabasJkncngggXu46wWMhNdwE+ycDsorIm2SSKATuZZ9U5D2SjRPNZly2OAzNHP21XieNFHWPuNzUbAEhu5PcGKKtL2G9fEgu1iKxOyiqzhCqLl8xqxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/yYfzcXOnjDq0H4ThxGWaC6OqVuwPUknydcIC8WXVBk=; b=gGFrw8jcDplou297JyfTajBvJ6yB4guHRFiD3juxJCerrdmg+UxCJ+/X7Cy6w8Cx32GpYcEaBoU8N/ZahCpxjhAMTgQVtfh4JsEoLb8RQ7yzDrLwt1Fddx6xf/XTZ6utTsD4erFBw1/FMGnecj9FONfd8/Pzs+nvl60p5vkbXDki/H93mCiWS+Q2xeYJD8dniqCBZNsCWi/Foa4YMv/8RDE/aq0PVeIn3Tt+xfH4TA3Viwi04y7MyROqRU57XOIys00hd/v3Dp5Wb3l18Xhg7JLp+nBHLKpXYdOndo2fld5cC60YM189QbjnMZXLosWjWsb5Tw3NyWf0zj+18ksg4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/yYfzcXOnjDq0H4ThxGWaC6OqVuwPUknydcIC8WXVBk=; b=ipfpF9vMeMmqSAChb/frthn0lQfzS86StcY8jYL95aJ2x8KmT6rM4YA0hIV11HundBpA9sycEZBDMPvfgbVwmwvkohWnadQEqNQQRQooM55n0XmzkLkPcCk/rGP+OqwsLXyFcnRc5zzMuXC2MjWFMLfpDpaVzucK3wcDQJ1RuRU= Authentication-Results: dpdk.org; dkim=none (message not signed) header.d=none;dpdk.org; dmarc=none action=none header.from=oss.nxp.com; Received: from VI1PR04MB5837.eurprd04.prod.outlook.com (2603:10a6:803:ec::28) by VI1PR04MB5839.eurprd04.prod.outlook.com (2603:10a6:803:e0::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3391.11; Thu, 24 Sep 2020 04:02:32 +0000 Received: from VI1PR04MB5837.eurprd04.prod.outlook.com ([fe80::cc01:9fe2:2544:8a4b]) by VI1PR04MB5837.eurprd04.prod.outlook.com ([fe80::cc01:9fe2:2544:8a4b%7]) with mapi id 15.20.3391.013; Thu, 24 Sep 2020 04:02:31 +0000 From: "Sachin Saxena (OSS)" To: dev@dpdk.org, ferruh.yigit@intel.com Date: Thu, 24 Sep 2020 09:32:09 +0530 Message-Id: <20200924040209.32719-7-sachin.saxena@oss.nxp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200924040209.32719-1-sachin.saxena@oss.nxp.com> References: <20200911083520.24020-1-sachin.saxena@oss.nxp.com> <20200924040209.32719-1-sachin.saxena@oss.nxp.com> X-ClientProxiedBy: SG2PR02CA0010.apcprd02.prod.outlook.com (2603:1096:3:17::22) To VI1PR04MB5837.eurprd04.prod.outlook.com (2603:10a6:803:ec::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from lsv03161.swis.in-blr01.nxp.com (14.142.151.118) by SG2PR02CA0010.apcprd02.prod.outlook.com (2603:1096:3:17::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.3412.22 via Frontend Transport; Thu, 24 Sep 2020 04:02:30 +0000 X-Mailer: git-send-email 2.28.0 X-Originating-IP: [14.142.151.118] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: a13b07c3-020b-47e1-000c-08d8603ea925 X-MS-TrafficTypeDiagnostic: VI1PR04MB5839: X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:127; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8hwxk5a5pFi5mry8quOGpcKmsTmJYFk7gWvVGvX/feUsdegO4rFfjnWnxgr70KBjfpbD1iN3Och+LqIkahUptQXVFOg86kNZ/WJ/T2We6KqIyiLQgv2CzNbF+J7N0W6NsWgsdrVzfRKGwZNVh1ywAP/l0mOrIIb+CyKwKmLgKU+wr3NLiIvAdf2rqkNGoFS74prpSktoToet/Ya8t7VZO/ZzNg+7rvVNVYSk7RJBSB5g9qBjoKxAOunDCuaNzYwuE0qmfDNQy6ks6Rs35PoB/8klcv+W/ml3N+O9GSyZqQhqkdqGjKMYZhhDygSyiN454mltYXQ0+RyVGX4TFvivDdqSWGWQut9vgmDHWY7/0WV+L0vKiGHaRVe0E7E+fOuf X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5837.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(396003)(366004)(346002)(136003)(376002)(39860400002)(2616005)(16526019)(83380400001)(186003)(6666004)(478600001)(26005)(316002)(6486002)(8936002)(1006002)(6512007)(66556008)(55236004)(66946007)(52116002)(1076003)(956004)(86362001)(2906002)(66476007)(8676002)(6506007)(30864003)(5660300002)(110426005); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: +c8lyf2s/o3U3bw7NUWWaI5bFOYeWVsIdFTO5XFlg9akCDt5fxOKeA9a48AZlSidbogXJ1lBqMhlcImiNmOaK+m3Rc/FIlGAzuUFkvGx6phTVEeNFe2uL8z6i9hBkvcmYIn3JcuIl6TJWrDCc0vjA7yjoJIphhGnZ6IgnlO5aPiPCY18ONit890Dmpw4cFfgexqH8x5NnTmRZkRUZ2sPA64Rhu7rHWzo260GSc0h7iJWZXK/zWXkQ3Kj+1G2+IIVFJyDyK3PG///qEwpBkuoGxdoFd0kH0MARbgELnTyOuVnEL3AkPB5FMLoHdflntBHNKcA2L8tMHonwDa+mWf68rXPww27mpZ9CqMIxCzTlvr32nzZiQqKRuDqCILP54ApZCSqhP3rYLBbGqCOSxLas3CczdsOjD1VVgrfxf+F2M+vQq2bD9xwpO3ERilWrZ09s79XFRzmhJudLlynz4ldw9hMNB7IzdcXEG6uup4tkqUgD/2QM0KIbksulp+HJtC+FUMWfnDftRXku9biWG1G6g1BbzY5of56ucx4AJUgN/zJ5vZNfds4YycXwJepAjfY/foalLLRC8rsKyKap3+caGpqRY1Uw3rPufrKCDar3HONtPTLy1x3LUpetXAYv0ZOz/K4S9nQg3EHux3f8bcNMg== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: a13b07c3-020b-47e1-000c-08d8603ea925 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5837.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2020 04:02:31.7636 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /DNJZy4hG8Wqb5w7gTpSqSsV+CProEHzHZYQmKlAVhMQYdpbZEmytyngTNRS6m2wr0mRW9JHZzv0sNBVp1d9oA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB5839 Subject: [dpdk-dev] [PATCH v3 6/6] bus/dpaa: enhance link status support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Rohit Raj This patch adds support to get/set link speed, duplex and autoneg mode status from/to PHY. Enahnce device capabilities to advertise all supported link speeds according to mac type. Also enables fallback support for get link status api where kernel support is missing. Signed-off-by: Sachin Saxena Signed-off-by: Rohit Raj --- drivers/bus/dpaa/base/qbman/process.c | 123 +++++++++++++++++++--- drivers/bus/dpaa/include/process.h | 34 +++++- drivers/bus/dpaa/rte_bus_dpaa_version.map | 3 + drivers/net/dpaa/dpaa_ethdev.c | 113 ++++++++++++++++---- 4 files changed, 241 insertions(+), 32 deletions(-) diff --git a/drivers/bus/dpaa/base/qbman/process.c b/drivers/bus/dpaa/base/qbman/process.c index 6f7e37957..9bc92681c 100644 --- a/drivers/bus/dpaa/base/qbman/process.c +++ b/drivers/bus/dpaa/base/qbman/process.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "process.h" @@ -341,30 +342,78 @@ int dpaa_intr_disable(char *if_name) return 0; } +#define DPAA_IOCTL_GET_IOCTL_VERSION \ + _IOR(DPAA_IOCTL_MAGIC, 0x14, int) + +int dpaa_get_ioctl_version_number(void) +{ + int version_num, ret = check_fd(); + + if (ret) + return ret; + + ret = ioctl(fd, DPAA_IOCTL_GET_IOCTL_VERSION, &version_num); + if (ret) { + if (errno == EINVAL) { + version_num = 1; + } else { + printf("Failed to get ioctl version number\n"); + version_num = -1; + } + } + + return version_num; +} + #define DPAA_IOCTL_GET_LINK_STATUS \ _IOWR(DPAA_IOCTL_MAGIC, 0x10, struct usdpaa_ioctl_link_status_args) -int dpaa_get_link_status(char *if_name) +#define DPAA_IOCTL_GET_LINK_STATUS_OLD \ + _IOWR(DPAA_IOCTL_MAGIC, 0x10, struct usdpaa_ioctl_link_status_args_old) + + +int dpaa_get_link_status(char *if_name, struct rte_eth_link *link) { - int ret = check_fd(); - struct usdpaa_ioctl_link_status_args args; + int ioctl_version, ret = check_fd(); if (ret) return ret; - strcpy(args.if_name, if_name); - args.link_status = 0; + ioctl_version = dpaa_get_ioctl_version_number(); - ret = ioctl(fd, DPAA_IOCTL_GET_LINK_STATUS, &args); - if (ret) { - if (errno == EINVAL) - printf("Failed to get link status: Not Supported\n"); - else + if (ioctl_version == 2) { + struct usdpaa_ioctl_link_status_args args; + + strcpy(args.if_name, if_name); + + ret = ioctl(fd, DPAA_IOCTL_GET_LINK_STATUS, &args); + if (ret) { printf("Failed to get link status\n"); - return ret; + return ret; + } + + link->link_status = args.link_status; + link->link_speed = args.link_speed; + link->link_duplex = args.link_duplex; + link->link_autoneg = args.link_autoneg; + } else { + struct usdpaa_ioctl_link_status_args_old args; + + strcpy(args.if_name, if_name); + + ret = ioctl(fd, DPAA_IOCTL_GET_LINK_STATUS_OLD, &args); + if (ret) { + if (errno == EINVAL) + printf("Get link status: Not Supported\n"); + else + printf("Failed to get link status\n"); + return ret; + } + + link->link_status = args.link_status; } - return args.link_status; + return 0; } #define DPAA_IOCTL_UPDATE_LINK_STATUS \ @@ -393,3 +442,53 @@ int dpaa_update_link_status(char *if_name, int link_status) return 0; } + +#define DPAA_IOCTL_UPDATE_LINK_SPEED \ + _IOW(DPAA_IOCTL_MAGIC, 0x12, struct usdpaa_ioctl_update_link_speed) + +int dpaa_update_link_speed(char *if_name, int link_speed, int link_duplex) +{ + struct usdpaa_ioctl_update_link_speed args; + int ret; + + ret = check_fd(); + if (ret) + return ret; + + strcpy(args.if_name, if_name); + args.link_speed = link_speed; + args.link_duplex = link_duplex; + + ret = ioctl(fd, DPAA_IOCTL_UPDATE_LINK_SPEED, &args); + if (ret) { + if (errno == EINVAL) + printf("Failed to set link speed: Not Supported\n"); + else + printf("Failed to set link speed\n"); + return ret; + } + + return ret; +} + +#define DPAA_IOCTL_RESTART_LINK_AUTONEG \ + _IOW(DPAA_IOCTL_MAGIC, 0x13, char *) + +int dpaa_restart_link_autoneg(char *if_name) +{ + int ret = check_fd(); + + if (ret) + return ret; + + ret = ioctl(fd, DPAA_IOCTL_RESTART_LINK_AUTONEG, &if_name); + if (ret) { + if (errno == EINVAL) + printf("Failed to restart autoneg: Not Supported\n"); + else + printf("Failed to restart autoneg\n"); + return ret; + } + + return ret; +} diff --git a/drivers/bus/dpaa/include/process.h b/drivers/bus/dpaa/include/process.h index f52ea1635..be52e6f72 100644 --- a/drivers/bus/dpaa/include/process.h +++ b/drivers/bus/dpaa/include/process.h @@ -10,6 +10,7 @@ #define __PROCESS_H #include +#include /* The process device underlies process-wide user/kernel interactions, such as * mapping dma_mem memory and providing accompanying ioctl()s. (This isn't used @@ -86,10 +87,25 @@ int dpaa_intr_enable(char *if_name, int efd); __rte_internal int dpaa_intr_disable(char *if_name); +struct usdpaa_ioctl_link_status_args_old { + /* network device node name */ + char if_name[IF_NAME_MAX_LEN]; + /* link status(ETH_LINK_UP/DOWN) */ + int link_status; +}; + struct usdpaa_ioctl_link_status_args { /* network device node name */ char if_name[IF_NAME_MAX_LEN]; + /* link status(ETH_LINK_UP/DOWN) */ int link_status; + /* link speed (ETH_SPEED_NUM_)*/ + int link_speed; + /* link duplex (ETH_LINK_[HALF/FULL]_DUPLEX)*/ + int link_duplex; + /* link autoneg (ETH_LINK_AUTONEG/FIXED)*/ + int link_autoneg; + }; struct usdpaa_ioctl_update_link_status_args { @@ -99,10 +115,24 @@ struct usdpaa_ioctl_update_link_status_args { int link_status; }; -__rte_internal -int dpaa_get_link_status(char *if_name); +struct usdpaa_ioctl_update_link_speed { + /* network device node name*/ + char if_name[IF_NAME_MAX_LEN]; + /* link speed (ETH_SPEED_NUM_)*/ + int link_speed; + /* link duplex (ETH_LINK_[HALF/FULL]_DUPLEX)*/ + int link_duplex; +}; +__rte_internal +int dpaa_get_link_status(char *if_name, struct rte_eth_link *link); __rte_internal int dpaa_update_link_status(char *if_name, int link_status); +__rte_internal +int dpaa_update_link_speed(char *if_name, int speed, int duplex); +__rte_internal +int dpaa_restart_link_autoneg(char *if_name); +__rte_internal +int dpaa_get_ioctl_version_number(void); #endif /* __PROCESS_H */ diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map index f6028b82d..9bd260121 100644 --- a/drivers/bus/dpaa/rte_bus_dpaa_version.map +++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map @@ -8,10 +8,13 @@ INTERNAL { bman_query_free_buffers; bman_release; bman_thread_irq; + dpaa_get_ioctl_version_number; dpaa_get_eth_port_cfg; dpaa_get_qm_channel_caam; dpaa_get_qm_channel_pool; dpaa_get_link_status; + dpaa_restart_link_autoneg; + dpaa_update_link_speed; dpaa_intr_disable; dpaa_intr_enable; dpaa_svr_family; diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index a07d7cefe..edd63b0d2 100644 --- a/drivers/net/dpaa/dpaa_ethdev.c +++ b/drivers/net/dpaa/dpaa_ethdev.c @@ -205,10 +205,12 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev) uint64_t rx_offloads = eth_conf->rxmode.offloads; uint64_t tx_offloads = eth_conf->txmode.offloads; struct rte_device *rdev = dev->device; + struct rte_eth_link *link = &dev->data->dev_link; struct rte_dpaa_device *dpaa_dev; struct fman_if *fif = dev->process_private; struct __fman_if *__fif; struct rte_intr_handle *intr_handle; + int speed, duplex; int ret; PMD_INIT_FUNC_TRACE(); @@ -292,6 +294,60 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev) dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC; } } + + /* Wait for link status to get updated */ + if (!link->link_status) + sleep(1); + + /* Configure link only if link is UP*/ + if (link->link_status) { + if (eth_conf->link_speeds == ETH_LINK_SPEED_AUTONEG) { + /* Start autoneg only if link is not in autoneg mode */ + if (!link->link_autoneg) + dpaa_restart_link_autoneg(__fif->node_name); + } else if (eth_conf->link_speeds & ETH_LINK_SPEED_FIXED) { + switch (eth_conf->link_speeds & ~ETH_LINK_SPEED_FIXED) { + case ETH_LINK_SPEED_10M_HD: + speed = ETH_SPEED_NUM_10M; + duplex = ETH_LINK_HALF_DUPLEX; + break; + case ETH_LINK_SPEED_10M: + speed = ETH_SPEED_NUM_10M; + duplex = ETH_LINK_FULL_DUPLEX; + break; + case ETH_LINK_SPEED_100M_HD: + speed = ETH_SPEED_NUM_100M; + duplex = ETH_LINK_HALF_DUPLEX; + break; + case ETH_LINK_SPEED_100M: + speed = ETH_SPEED_NUM_100M; + duplex = ETH_LINK_FULL_DUPLEX; + break; + case ETH_LINK_SPEED_1G: + speed = ETH_SPEED_NUM_1G; + duplex = ETH_LINK_FULL_DUPLEX; + break; + case ETH_LINK_SPEED_2_5G: + speed = ETH_SPEED_NUM_2_5G; + duplex = ETH_LINK_FULL_DUPLEX; + break; + case ETH_LINK_SPEED_10G: + speed = ETH_SPEED_NUM_10G; + duplex = ETH_LINK_FULL_DUPLEX; + break; + default: + speed = ETH_SPEED_NUM_NONE; + duplex = ETH_LINK_FULL_DUPLEX; + break; + } + /* Set link speed */ + dpaa_update_link_speed(__fif->node_name, speed, duplex); + } else { + /* Manual autoneg - custom advertisement speed. */ + printf("Custom Advertisement speeds not supported\n"); + } + } + return 0; } @@ -377,6 +433,7 @@ static void dpaa_eth_dev_close(struct rte_eth_dev *dev) struct rte_device *rdev = dev->device; struct rte_dpaa_device *dpaa_dev; struct rte_intr_handle *intr_handle; + struct rte_eth_link *link = &dev->data->dev_link; PMD_INIT_FUNC_TRACE(); @@ -386,6 +443,10 @@ static void dpaa_eth_dev_close(struct rte_eth_dev *dev) dpaa_eth_dev_stop(dev); + /* Reset link to autoneg */ + if (link->link_status && !link->link_autoneg) + dpaa_restart_link_autoneg(__fif->node_name); + if (intr_handle && intr_handle->fd && dev->data->dev_conf.intr_conf.lsc != 0) { dpaa_intr_disable(__fif->node_name); @@ -446,12 +507,24 @@ static int dpaa_eth_dev_info(struct rte_eth_dev *dev, dev_info->flow_type_rss_offloads = DPAA_RSS_OFFLOAD_ALL; if (fif->mac_type == fman_mac_1g) { - dev_info->speed_capa = ETH_LINK_SPEED_1G; + dev_info->speed_capa = ETH_LINK_SPEED_10M_HD + | ETH_LINK_SPEED_10M + | ETH_LINK_SPEED_100M_HD + | ETH_LINK_SPEED_100M + | ETH_LINK_SPEED_1G; } else if (fif->mac_type == fman_mac_2_5g) { - dev_info->speed_capa = ETH_LINK_SPEED_1G + dev_info->speed_capa = ETH_LINK_SPEED_10M_HD + | ETH_LINK_SPEED_10M + | ETH_LINK_SPEED_100M_HD + | ETH_LINK_SPEED_100M + | ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G; } else if (fif->mac_type == fman_mac_10g) { - dev_info->speed_capa = ETH_LINK_SPEED_1G + dev_info->speed_capa = ETH_LINK_SPEED_10M_HD + | ETH_LINK_SPEED_10M + | ETH_LINK_SPEED_100M_HD + | ETH_LINK_SPEED_100M + | ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G | ETH_LINK_SPEED_10G; } else { @@ -548,31 +621,35 @@ static int dpaa_eth_link_update(struct rte_eth_dev *dev, struct rte_eth_link *link = &dev->data->dev_link; struct fman_if *fif = dev->process_private; struct __fman_if *__fif = container_of(fif, struct __fman_if, __if); - int ret; + int ret, ioctl_version; PMD_INIT_FUNC_TRACE(); - if (fif->mac_type == fman_mac_1g) - link->link_speed = ETH_SPEED_NUM_1G; - else if (fif->mac_type == fman_mac_2_5g) - link->link_speed = ETH_SPEED_NUM_2_5G; - else if (fif->mac_type == fman_mac_10g) - link->link_speed = ETH_SPEED_NUM_10G; - else - DPAA_PMD_ERR("invalid link_speed: %s, %d", - dpaa_intf->name, fif->mac_type); + ioctl_version = dpaa_get_ioctl_version_number(); + if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) { - ret = dpaa_get_link_status(__fif->node_name); - if (ret < 0) + ret = dpaa_get_link_status(__fif->node_name, link); + if (ret) return ret; - link->link_status = ret; } else { link->link_status = dpaa_intf->valid; } - link->link_duplex = ETH_LINK_FULL_DUPLEX; - link->link_autoneg = ETH_LINK_AUTONEG; + if (ioctl_version < 2) { + link->link_duplex = ETH_LINK_FULL_DUPLEX; + link->link_autoneg = ETH_LINK_AUTONEG; + + if (fif->mac_type == fman_mac_1g) + link->link_speed = ETH_SPEED_NUM_1G; + else if (fif->mac_type == fman_mac_2_5g) + link->link_speed = ETH_SPEED_NUM_2_5G; + else if (fif->mac_type == fman_mac_10g) + link->link_speed = ETH_SPEED_NUM_10G; + else + DPAA_PMD_ERR("invalid link_speed: %s, %d", + dpaa_intf->name, fif->mac_type); + } DPAA_PMD_INFO("Port %d Link is %s\n", dev->data->port_id, link->link_status ? "Up" : "Down");