diff --git a/cpu/esp32/esp-wifi/esp_wifi_netdev.c b/cpu/esp32/esp-wifi/esp_wifi_netdev.c
index 8516cab0cd7be5bd54394764332c067af154eede..46619f4ae558e56c80066a14d410b2215248188c 100644
--- a/cpu/esp32/esp-wifi/esp_wifi_netdev.c
+++ b/cpu/esp32/esp-wifi/esp_wifi_netdev.c
@@ -144,6 +144,21 @@ static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *
             _esp_wifi_dev.event = SYSTEM_EVENT_ETH_DISCONNECTED;
             _esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
 
+            /* call disconnect to reset internal state */
+            result = esp_wifi_disconnect();
+            if (result != ESP_OK) {
+                LOG_TAG_ERROR("esp_wifi", "esp_wifi_disconnect failed with "
+                             "return value %d\n", result);
+                return result;
+            }
+
+            /* try to reconnect */
+            result = esp_wifi_connect();
+            if (result != ESP_OK) {
+               LOG_TAG_ERROR("esp_wifi", "esp_wifi_connect failed with "
+                             "return value %d\n", result);
+            }
+
             break;
 
         default:
@@ -313,6 +328,7 @@ static int _esp_wifi_send(netdev_t *netdev, const iolist_t *iolist)
     }
 
     mutex_unlock(&dev->dev_lock);
+
     return ret;
 }