From 52b4df496a7c8bf8e18b9f980e04e92b0560b275 Mon Sep 17 00:00:00 2001
From: Paolo Messina <ppescher@hotmail.com>
Date: Thu, 15 Dec 2022 12:12:46 +0100
Subject: [PATCH] Fix ETH link status, missing duplex mode, IDF version check

---
 libraries/Ethernet/src/ETH.cpp | 15 +++++++--------
 libraries/Ethernet/src/ETH.h   |  1 -
 2 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp
index db664473c67..a9be448e6ac 100644
--- a/libraries/Ethernet/src/ETH.cpp
+++ b/libraries/Ethernet/src/ETH.cpp
@@ -220,9 +220,6 @@ ETHClass::ETHClass()
      ,eth_handle(NULL)
 #endif
      ,started(false)
-#if ESP_IDF_VERSION_MAJOR > 3
-     ,eth_link(ETH_LINK_DOWN)
-#endif
 {
 }
 
@@ -534,8 +531,10 @@ bool ETHClass::setHostname(const char * hostname)
 
 bool ETHClass::fullDuplex()
 {
-#ifdef ESP_IDF_VERSION_MAJOR
-    return true;//todo: do not see an API for this
+#if ESP_IDF_VERSION_MAJOR > 3
+    eth_duplex_t link_duplex;
+    esp_eth_ioctl(eth_handle, ETH_CMD_G_DUPLEX_MODE, &link_duplex);
+    return (link_duplex == ETH_DUPLEX_FULL);
 #else
     return eth_config.phy_get_duplex_mode();
 #endif
@@ -543,8 +542,8 @@ bool ETHClass::fullDuplex()
 
 bool ETHClass::linkUp()
 {
-#ifdef ESP_IDF_VERSION_MAJOR
-    return eth_link == ETH_LINK_UP;
+#if ESP_IDF_VERSION_MAJOR > 3
+    return WiFiGenericClass::getStatusBits() & ETH_CONNECTED_BIT;
 #else
     return eth_config.phy_check_link();
 #endif
@@ -552,7 +551,7 @@ bool ETHClass::linkUp()
 
 uint8_t ETHClass::linkSpeed()
 {
-#ifdef ESP_IDF_VERSION_MAJOR
+#if ESP_IDF_VERSION_MAJOR > 3
     eth_speed_t link_speed;
     esp_eth_ioctl(eth_handle, ETH_CMD_G_SPEED, &link_speed);
     return (link_speed == ETH_SPEED_10M)?10:100;
diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h
index 647b59848d6..7fc14f59cb3 100644
--- a/libraries/Ethernet/src/ETH.h
+++ b/libraries/Ethernet/src/ETH.h
@@ -65,7 +65,6 @@ class ETHClass {
 
     protected:
         bool started;
-        eth_link_t eth_link;
         static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
 #else
         bool started;