From patchwork Fri Sep 11 08:35:18 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: 77366 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 81D48A04B5; Fri, 11 Sep 2020 10:36:36 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 66F991C123; Fri, 11 Sep 2020 10:35:47 +0200 (CEST) Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40057.outbound.protection.outlook.com [40.107.4.57]) by dpdk.org (Postfix) with ESMTP id D798B1C12B for ; Fri, 11 Sep 2020 10:35:45 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eDp23f47YyxlKM4KWu8up+vX/9ON/YQCXNh+6t4xvrFW1RamG5TWIN/xyCYxQkIZVPdteTJ98IKIGsiMRSxoWazUhgkY9s1wjINxUYKun8rt/k3CnhpuIhIyeWjwK3ntTgEOUa8pdjafpuJvUBpPFXhQ8CQhPwMD7KoEWXKyyvQ0Sk1RAaCXsAtEebLjtEn0BE/hWeKjRdBp3OtJ/ipTCkDuUS3reTV8vv2ZYXY1KIkVYr09cTfL34D/KtpY54i5PYnP+hDaK66NQoRlPMG9NPXXjb9LMXRSzu100hPod/eJSu3MRBzMrSOfWG7H8iE5wha12NMNkX0AgA7VGhIxeg== 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=d1yFhLjkKclDELl0WoGehJkqe8y7gKlPUPlGYPhZsqc=; b=FId2gv7svlO+EA2k/m6KcIxzVAPm7GGc0SS3Bz/zVTWlO4Cwx1K6/LJn0si0KWYIssSVM0dm/h6FXDaiZIvc4bRE7kWRG5hc3BRzPxTqGRS4SxNMqb6QNQzLzXTqJvyb/HyFFcsMQlGp1c+Vjsa1qJXPqOiqaHHwUvgIIplido4JwBF0CqB/zj3p0Xfu/mCsRG7ymREyLDHgAiDOfvJcPu79JGUnOWg7N5G6ZM9tWIpDxstG0gDX94VybdMo+etmLEu1Dkp9SQhZn7S7cGlnPBxYG2O9OetbmHpLlT6OQwH/fc8yPnLGdMkU2s2iz5zSoaP0kZE5J5S1hkyjAOrORw== 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=d1yFhLjkKclDELl0WoGehJkqe8y7gKlPUPlGYPhZsqc=; b=WoYUcQ2Beiwh2wFRPsE2N4wrYhbi5lWcs7Kz7NaR25jj0LuHQKV+l3EI6DkMgfIHNJBfXCJGX6lhne1M9gjZobZ5sjGcihOM9uU/tY6crfcWrzM11dETnnQ7TXDLIcAuHlPxtQTbWAUORRhvTnoM+MbCn85vtRc+P5dYWOuOSIQ= 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 VI1PR04MB6973.eurprd04.prod.outlook.com (2603:10a6:803:13d::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3370.16; Fri, 11 Sep 2020 08:35:45 +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.3348.019; Fri, 11 Sep 2020 08:35:45 +0000 From: "Sachin Saxena (OSS)" To: dev@dpdk.org, ferruh.yigit@intel.com Date: Fri, 11 Sep 2020 14:05:18 +0530 Message-Id: <20200911083520.24020-7-sachin.saxena@oss.nxp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200911083520.24020-1-sachin.saxena@oss.nxp.com> References: <20200911083520.24020-1-sachin.saxena@oss.nxp.com> X-ClientProxiedBy: SG2PR04CA0178.apcprd04.prod.outlook.com (2603:1096:4:14::16) 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 SG2PR04CA0178.apcprd04.prod.outlook.com (2603:1096:4:14::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.3370.16 via Frontend Transport; Fri, 11 Sep 2020 08:35:43 +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: 954679d5-ff42-4153-1dda-08d8562dacaf X-MS-TrafficTypeDiagnostic: VI1PR04MB6973: X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-Transport-Forked: 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: HGzqxN11COsdhRr3XHX2gWQhAVHMhJt4EmyTsAwbOuErcDvSBRUArlPIjoXs1ClhsBpSPAbhS+PqzTXmWtqAbsK3DqTe5NtepZzcWtKiVN+s5gXvr6Vqa5nILlFskdNT4NGpetL30ke4B0VSdlQxbC/Uj6xNppbzNNGxxsD70cFV+ZFZjc+J+ODRHdg/s83OV+1WaQuVdb24feCUEjE/KwY/C34NghjlAEBm9numtxV28YDxr60jepUTPpiachEI+iZhQlpm0zgc4RaAjzfZgm8sdsZmuKPsEWtMz9lJTE6FqYQpwvGF7kM4ZMFGuZN7htLFgw8wL3AZvL7lJJogwS+RsYj+g1oLkaxRnPNEhRlp0MKnN8x+aoPnh7DHFOAC 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)(346002)(376002)(136003)(396003)(39860400002)(366004)(52116002)(86362001)(1076003)(66556008)(66946007)(2906002)(66476007)(8936002)(5660300002)(83380400001)(316002)(30864003)(8676002)(2616005)(956004)(6512007)(16526019)(186003)(6486002)(1006002)(6666004)(26005)(6506007)(478600001)(55236004)(110426005); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: fRmyB/JdRMdPcxb28x78R7drgQm4yo11gevO7RH7lSdT25+wFle8D52DsGFrXreDVFpv9zWw3TlemVbStPT1KXN65xc/ubQWLDB7BT8FQbOoEOlLey3FtViD+XQ0Swls9sUOFkrIryKlLv41reJiqlORvzmRRsCf10ivOTQ0lhOO3bC37dVy7+Ddi417RBFyIKBmC/FKnJkeG+X7zUiVYx5lqRQPKgBEE28hODYtlXCzxgeRFEZhRIpjWzjkwsd3Aa0VOZY7ADuh5iYi7gBqqXgKqMXJcS2HwWiPoDpce527GZje7u3uXRoSkUE2ac1b8m1FrePC+TwuXicw9Ow6s84CbxMLfYiUrEN+LGWOJXJHMUZwTFYFc2Kf19t9AO6P1DSKS+fGJpn2O8VVYt7/4HNoYZgtYQdUs4KgQ7sy72Zz1PmaWfq40B/sWFrWrGFHE+qWJMokWmjhnS4lldDExEDQ9rXYmCSC9ZIT7cxmrTr7pfPp60uA8aYONmMcKW4khagZwa56GXyt7LLik61o0GICjZ+wwJjGnBvaKVhAB02DNS8FLCdBrzyPcXMN/aTasSqf3eBxaGLp0XkELDR9oYBvDqJvRfnCXJ/uKDIn5F7UGuQByBo4K+JuEXxvd76NwgKdK2Z17QFAbp7MUspAaA== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 954679d5-ff42-4153-1dda-08d8562dacaf X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5837.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2020 08:35:44.8736 (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: 2rA/V04Jhnmh/RUl3HiHAIBgNoR/GnqvRlrBfKBirsJeuqpZj1QvqBhbc9p1zoIGu2Ln83YUQ/SbSkyLyDxuoQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB6973 Subject: [dpdk-dev] [PATCH v2 6/8] 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 5b97b6eb2..26436e9fe 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 d5eeb280a..66bb6eb00 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");