diff --git a/cpu/esp32/esp-wifi/esp_wifi_netdev.c b/cpu/esp32/esp-wifi/esp_wifi_netdev.c
index dfe2b5451e293977c455a29eb82f7a303b1246a9..8516cab0cd7be5bd54394764332c067af154eede 100644
--- a/cpu/esp32/esp-wifi/esp_wifi_netdev.c
+++ b/cpu/esp32/esp-wifi/esp_wifi_netdev.c
@@ -122,18 +122,28 @@ static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *
 
         case SYSTEM_EVENT_STA_CONNECTED:
             DEBUG("%s WiFi connected\n", __func__);
+
+            /* register RX callback function */
+            esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, _esp_wifi_rx_cb);
+
             _esp_wifi_dev.connected = true;
             _esp_wifi_dev.event = SYSTEM_EVENT_ETH_CONNECTED;
             _esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
+
             break;
 
         case SYSTEM_EVENT_STA_DISCONNECTED:
             DEBUG("%s WiFi disconnected from ssid %s, reason %d\n", __func__,
                   event->event_info.disconnected.ssid,
                   event->event_info.disconnected.reason);
+
+            /* unregister RX callback function */
+            esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, NULL);
+
             _esp_wifi_dev.connected = false;
             _esp_wifi_dev.event = SYSTEM_EVENT_ETH_DISCONNECTED;
             _esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
+
             break;
 
         default: