diff --git a/ports/stm32/eth.c b/ports/stm32/eth.c
index 665495c17429c473ead1da1836f4927b333ac148..6a1ef99afa3bab61b625fd7079ada0ce0589d4f9 100644
--- a/ports/stm32/eth.c
+++ b/ports/stm32/eth.c
@@ -107,7 +107,6 @@ typedef struct _eth_dma_t {
 } eth_dma_t;
 
 typedef struct _eth_t {
-    mod_network_nic_type_t base;
     uint32_t trace_flags;
     struct netif netif;
     struct dhcp dhcp_struct;
diff --git a/ports/stm32/modnetwork.c b/ports/stm32/modnetwork.c
index 9d97ad4a0ebf9e1bef9a7837c19792f14eebac17..460f47257bac39fd5e68694ffe15d86f8565d1f7 100644
--- a/ports/stm32/modnetwork.c
+++ b/ports/stm32/modnetwork.c
@@ -55,15 +55,11 @@ u32_t sys_now(void) {
 }
 
 STATIC void pyb_lwip_poll(void) {
-    // Poll all the NICs for incoming data
-    for (struct netif *netif = netif_list; netif != NULL; netif = netif->next) {
-        if (netif->flags & NETIF_FLAG_LINK_UP) {
-            mod_network_nic_type_t *nic = netif->state;
-            if (nic->poll_callback) {
-                nic->poll_callback(nic, netif);
-            }
-        }
-    }
+    #if MICROPY_PY_WIZNET5K
+    // Poll the NIC for incoming data
+    wiznet5k_poll();
+    #endif
+
     // Run the lwIP internal updates
     sys_check_timeouts();
 }
diff --git a/ports/stm32/modnetwork.h b/ports/stm32/modnetwork.h
index 41a0017dab0076ef83cf901b65786b7ee3bad2f5..0b6d0c4a7fbcf8dfac6c2e714e958f34efa86e0e 100644
--- a/ports/stm32/modnetwork.h
+++ b/ports/stm32/modnetwork.h
@@ -39,17 +39,14 @@
 
 struct netif;
 
-typedef struct _mod_network_nic_type_t {
-    mp_obj_base_t base;
-    void (*poll_callback)(void *data, struct netif *netif);
-} mod_network_nic_type_t;
-
 extern const mp_obj_type_t network_lan_type;
 extern const mp_obj_type_t mod_network_nic_type_wiznet5k;
 
 void mod_network_lwip_poll_wrapper(uint32_t ticks_ms);
 mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args);
 
+void wiznet5k_poll(void);
+
 #else
 
 struct _mod_network_socket_obj_t;
diff --git a/ports/stm32/network_wiznet5k.c b/ports/stm32/network_wiznet5k.c
index 3bbe639acc31635926a24bfb2c7321139b886d03..796b5551a797c1bd5ed04c7d06c95a4b129290cd 100644
--- a/ports/stm32/network_wiznet5k.c
+++ b/ports/stm32/network_wiznet5k.c
@@ -48,7 +48,7 @@
 // Wiznet5k Ethernet driver in MACRAW mode
 
 typedef struct _wiznet5k_obj_t {
-    mod_network_nic_type_t base;
+    mp_obj_base_t base;
     mp_uint_t cris_state;
     const spi_t *spi;
     mp_hal_pin_obj_t cs;
@@ -63,7 +63,6 @@ typedef struct _wiznet5k_obj_t {
 STATIC wiznet5k_obj_t wiznet5k_obj;
 
 STATIC void wiznet5k_lwip_init(wiznet5k_obj_t *self);
-STATIC void wiznet5k_lwip_poll(void *self_in, struct netif *netif);
 
 STATIC void wiz_cris_enter(void) {
     wiznet5k_obj.cris_state = MICROPY_BEGIN_ATOMIC_SECTION();
@@ -176,7 +175,7 @@ STATIC uint16_t wiznet5k_recv_ethernet(wiznet5k_obj_t *self) {
     uint16_t port;
     int ret = WIZCHIP_EXPORT(recvfrom)(0, self->eth_frame, 1514, ip, &port);
     if (ret <= 0) {
-        printf("wiznet5k_lwip_poll: fatal error len=%u ret=%d\n", len, ret);
+        printf("wiznet5k_poll: fatal error len=%u ret=%d\n", len, ret);
         netif_set_link_down(&self->netif);
         netif_set_down(&self->netif);
         return 0;
@@ -237,8 +236,11 @@ STATIC void wiznet5k_lwip_init(wiznet5k_obj_t *self) {
     self->netif.flags &= ~NETIF_FLAG_UP;
 }
 
-STATIC void wiznet5k_lwip_poll(void *self_in, struct netif *netif) {
-    wiznet5k_obj_t *self = self_in;
+void wiznet5k_poll(void) {
+    wiznet5k_obj_t *self = &wiznet5k_obj;
+    if (!(self->netif.flags & NETIF_FLAG_LINK_UP)) {
+        return;
+    }
     uint16_t len;
     while ((len = wiznet5k_recv_ethernet(self)) > 0) {
         if (self->trace_flags & TRACE_ETH_RX) {
@@ -267,7 +269,7 @@ STATIC mp_obj_t wiznet5k_make_new(const mp_obj_type_t *type, size_t n_args, size
     mp_hal_pin_obj_t rst = pin_find(args[2]);
 
     // Access the existing object, if it has been constructed with the same hardware interface
-    if (wiznet5k_obj.base.base.type == &mod_network_nic_type_wiznet5k) {
+    if (wiznet5k_obj.base.type == &mod_network_nic_type_wiznet5k) {
         if (!(wiznet5k_obj.spi == spi && wiznet5k_obj.cs == cs && wiznet5k_obj.rst == rst
             && wiznet5k_obj.netif.flags != 0)) {
             wiznet5k_deinit();
@@ -275,8 +277,7 @@ STATIC mp_obj_t wiznet5k_make_new(const mp_obj_type_t *type, size_t n_args, size
     }
 
     // Init the wiznet5k object
-    wiznet5k_obj.base.base.type = &mod_network_nic_type_wiznet5k;
-    wiznet5k_obj.base.poll_callback = wiznet5k_lwip_poll;
+    wiznet5k_obj.base.type = &mod_network_nic_type_wiznet5k;
     wiznet5k_obj.cris_state = 0;
     wiznet5k_obj.spi = spi;
     wiznet5k_obj.cs = cs;