From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@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 <dev@dpdk.org>; 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)" <sachin.saxena@oss.nxp.com>
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>
Content-Transfer-Encoding: 8bit
Content-Type: text/plain
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: <VI1PR04MB69734665FCC4E556FA831007A2240@VI1PR04MB6973.eurprd04.prod.outlook.com>
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 <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

From: Rohit Raj <rohit.raj@nxp.com>

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 <sachin.saxena@oss.nxp.com>
Signed-off-by: Rohit Raj <rohit.raj@nxp.com>
---
 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 <fcntl.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#include <rte_ethdev.h>
 
 #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 <compat.h>
+#include <rte_ethdev.h>
 
 /* 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");
-- 
2.28.0