From 92210b28421c53a3fe5045ddbbe62166c98e1701 Mon Sep 17 00:00:00 2001
From: Davide Mor <davide.mor@skywarder.eu>
Date: Sat, 17 May 2025 15:10:38 +0200
Subject: [PATCH] [wiz5500] Added separate variable for INTn handler, to allow
 for proper synchronization

---
 src/shared/drivers/WIZ5500/WIZ5500.cpp | 9 ++++++---
 src/shared/drivers/WIZ5500/WIZ5500.h   | 3 +++
 src/tests/drivers/test-wiz5500.cpp     | 1 -
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/shared/drivers/WIZ5500/WIZ5500.cpp b/src/shared/drivers/WIZ5500/WIZ5500.cpp
index 5019835e2..d3a9a38f3 100644
--- a/src/shared/drivers/WIZ5500/WIZ5500.cpp
+++ b/src/shared/drivers/WIZ5500/WIZ5500.cpp
@@ -127,14 +127,16 @@ void Wiz5500::reset()
 
 void Wiz5500::handleINTn()
 {
-    if (interrupt_service_thread)
+    if (intn_thread)
     {
-        interrupt_service_thread->IRQwakeup();
-        if (interrupt_service_thread->IRQgetPriority() >
+        intn_thread->IRQwakeup();
+        if (intn_thread->IRQgetPriority() >
             miosix::Thread::IRQgetCurrentThread()->IRQgetPriority())
         {
             miosix::Scheduler::IRQfindNextThread();
         }
+
+        intn_thread = nullptr;
     }
 }
 
@@ -443,6 +445,7 @@ TimedWaitResult Wiz5500::waitForINTn(Lock<FastMutex>& l, long long until)
 
     Unlock<FastMutex> ul(l);
     FastInterruptDisableLock il;
+    intn_thread = Thread::IRQgetCurrentThread();
     while (intn.value() != 0 && result == TimedWaitResult::NoTimeout)
     {
         long long now = getTime();
diff --git a/src/shared/drivers/WIZ5500/WIZ5500.h b/src/shared/drivers/WIZ5500/WIZ5500.h
index 50dd23927..bdc4172a4 100644
--- a/src/shared/drivers/WIZ5500/WIZ5500.h
+++ b/src/shared/drivers/WIZ5500/WIZ5500.h
@@ -275,7 +275,10 @@ private:
     void spiWriteIp(uint8_t block, uint16_t address, WizIp data);
     void spiWriteMac(uint8_t block, uint16_t address, WizMac data);
 
+    // Thread currently servicing interrupts
     miosix::Thread* interrupt_service_thread = nullptr;
+    // Thread currently waiting for an INTn
+    miosix::Thread* intn_thread = nullptr;
 
     struct ThreadWaitInfo
     {
diff --git a/src/tests/drivers/test-wiz5500.cpp b/src/tests/drivers/test-wiz5500.cpp
index 4c37f5f13..432407ef0 100644
--- a/src/tests/drivers/test-wiz5500.cpp
+++ b/src/tests/drivers/test-wiz5500.cpp
@@ -290,7 +290,6 @@ int main()
             std::cout << ip << ":" << port << std::endl;
         });
 
-    
     wiz->setOnIpConflict([]() { printf("[wiz5500] Ip conflict\n"); });
 
     wiz->setGatewayIp({192, 168, 1, 1});
-- 
GitLab