This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new b8c1ce45e6 refactor(esp32-qemu-openeth): use lower half driver
interface
b8c1ce45e6 is described below
commit b8c1ce45e66fbc299bee6f55e452f084fa4c37d6
Author: Marco Casaroli <[email protected]>
AuthorDate: Mon Jul 1 14:25:22 2024 +0000
refactor(esp32-qemu-openeth): use lower half driver interface
This current driver does not handle well netpkts used in the
write buffers.
I learned about this document:
https://github.com/apache/nuttx/blob/master/Documentation/components/net/netdriver.rst
After I ported and contributed the original driver.
However from the document, I understand these types of drivers are
simpler to implement and I could simplify the driver and handle
correctly the TCP write buffers.
---
arch/xtensa/src/esp32/Kconfig | 7 -
arch/xtensa/src/esp32/esp32_openeth.c | 500 +++++++---------------------------
2 files changed, 96 insertions(+), 411 deletions(-)
diff --git a/arch/xtensa/src/esp32/Kconfig b/arch/xtensa/src/esp32/Kconfig
index 587a27bbd0..a3f62ea313 100644
--- a/arch/xtensa/src/esp32/Kconfig
+++ b/arch/xtensa/src/esp32/Kconfig
@@ -265,13 +265,6 @@ config ESP32_OPENETH_DMA_RX_BUFFER_NUM
---help---
Number of DMA receive buffers, each buffer is 1600 bytes.
-config ESP32_OPENETH_DMA_TX_BUFFER_NUM
- int "Number of Ethernet DMA Tx buffers"
- range 1 64
- default 1
- ---help---
- Number of DMA transmit buffers, each buffer is 1600 bytes.
-
endif # ESP32_OPENETH
config ESP32_I2C
diff --git a/arch/xtensa/src/esp32/esp32_openeth.c
b/arch/xtensa/src/esp32/esp32_openeth.c
index 2f157992d2..b4dad22cd9 100644
--- a/arch/xtensa/src/esp32/esp32_openeth.c
+++ b/arch/xtensa/src/esp32/esp32_openeth.c
@@ -24,30 +24,11 @@
#include <nuttx/config.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <syslog.h>
#include <debug.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-
-#include <nuttx/arch.h>
-#include <nuttx/irq.h>
#include <nuttx/kmalloc.h>
-#include <nuttx/wqueue.h>
-#include <nuttx/net/netconfig.h>
-#include <nuttx/net/ip.h>
-#include <nuttx/net/netdev.h>
#include <netinet/if_ether.h>
-
-#ifdef CONFIG_NET_PKT
-#include <nuttx/net/pkt.h>
-#endif
+#include <nuttx/net/netdev_lowerhalf.h>
#include "hardware/esp32_soc.h"
#include "esp32_irq.h"
@@ -58,18 +39,13 @@
* Pre-processor Definitions
****************************************************************************/
-/* We need to have the work queue to handle interrupts */
-
-#if !defined(CONFIG_SCHED_WORKQUEUE)
-#error Worker thread support is required (CONFIG_SCHED_WORKQUEUE)
-#endif
-
/* These are the register definitions for the OpenCores Ethernet MAC. */
/* DMA buffers configuration */
#define DMA_BUF_SIZE 1600
#define RX_BUF_COUNT CONFIG_ESP32_OPENETH_DMA_RX_BUFFER_NUM
-#define TX_BUF_COUNT CONFIG_ESP32_OPENETH_DMA_TX_BUFFER_NUM
+/* Only need 1 TX buf because packets are transmitted immediately */
+#define TX_BUF_COUNT 1
/* This driver uses the interrupt source number of the internal EMAC
* of the ESP32 chip, and uses the same register address base. This of
@@ -102,59 +78,13 @@
#define OPENETH_INT_BUSY BIT(4)
/* OPENETH_INT_RXB: Frame received */
#define OPENETH_INT_RXB BIT(2)
-/* OPENETH_INT_TXB: Frame transmitted */
-#define OPENETH_INT_TXB BIT(0)
-
-/* IPGT, IPGR1, IPGR2 registers are not implemented in QEMU,
- * hence not used here
- */
-#define OPENETH_PACKETLEN_REG (OPENETH_BASE + 0x18)
-/* OPENETH_MINFL: minimum frame length */
-#define OPENETH_MINFL_S 16
-#define OPENETH_MINFL_V 0xffff
-#define OPENETH_MINFL_M (OPENETH_MINFL_V << OPENETH_MINFL_S)
-/* OPENETH_MAXFL: maximum frame length */
-#define OPENETH_MAXFL_S 0
-#define OPENETH_MAXFL_V 0xffff
-#define OPENETH_MAXFL_M (OPENETH_MAXFL_V << OPENETH_MAXFL_S)
-
/* COLLCONF is not implemented in QEMU */
#define OPENETH_TX_BD_NUM_REG (OPENETH_BASE + 0x20)
-/* CTRLMODER, MIIMODER are not implemented in QEMU */
-#define OPENETH_MIICOMMAND_REG (OPENETH_BASE + 0x2c)
-/* OPENETH_WCTRLDATA: write control data */
-#define OPENETH_WCTRLDATA BIT(2)
-/* OPENETH_RSTAT: read status */
-#define OPENETH_RSTAT BIT(1)
-/* OPENETH_SCANSTAT: scan status */
-#define OPENETH_SCANSTAT BIT(0)
-
-#define OPENETH_MIIADDRESS_REG (OPENETH_BASE + 0x30)
-/* OPENETH_RGAD: register address */
-#define OPENETH_RGAD_S 8
-#define OPENETH_RGAD_V 0x1f
-#define OPENETH_RGAD_M (OPENETH_RGAD_V << OPENETH_RGAD_S)
-/* OPENETH_FIAD: PHY address */
-#define OPENETH_FIAD_S 0
-#define OPENETH_FIAD_V 0x1f
-#define OPENETH_FIAD_N (OPENETH_FIAD_V << OPENETH_FIAD_S)
-
-#define OPENETH_MIITX_DATA_REG (OPENETH_BASE + 0x34)
-#define OPENETH_MIIRX_DATA_REG (OPENETH_BASE + 0x38)
-#define OPENETH_MII_DATA_MASK 0xffff
-
-#define OPENETH_MIISTATUS_REG (OPENETH_BASE + 0x3c)
-/* OPENETH_LINKFAIL: link is down */
-#define OPENETH_LINKFAIL BIT(0)
-
/* OPENETH_MAC_ADDR0_REG: bytes 2-5 of the MAC address (byte 5 in LSB) */
#define OPENETH_MAC_ADDR0_REG (OPENETH_BASE + 0x40)
/* OPENETH_MAC_ADDR1_REG: bytes 0-1 of the MAC address (byte 1 in LSB) */
#define OPENETH_MAC_ADDR1_REG (OPENETH_BASE + 0x44)
-#define OPENETH_HASH0_ADR_REG (OPENETH_BASE + 0x48)
-#define OPENETH_HASH1_ADR_REG (OPENETH_BASE + 0x4c)
-
/* Location of the DMA descriptors */
#define OPENETH_DESC_BASE (OPENETH_BASE + 0x400)
/* Total number of (TX + RX) DMA descriptors */
@@ -164,27 +94,16 @@
* Private Types
****************************************************************************/
-/* The lo_driver_s encapsulates all state information for a single hardware
- * interface
- */
-
-struct openeth_driver_s
+struct openeth_priv_s
{
- struct work_s openeth_work; /* For deferring poll work to the work queue */
+ struct netdev_lowerhalf_s dev;
int cpuint; /* EMAC interrupt ID */
int cur_rx_desc;
int cur_tx_desc;
- uint8_t addr[6];
uint8_t *rx_buf[RX_BUF_COUNT];
uint8_t *tx_buf[TX_BUF_COUNT];
-
- struct work_s rxwork; /* For deferring RX work to the work queue */
-
- /* This holds the information visible to the NuttX network */
-
- struct net_driver_s dev; /* Interface understood by the network */
};
/* Structures describing TX and RX descriptors. */
@@ -236,27 +155,29 @@ static_assert(sizeof(openeth_rx_desc_t) == 8,
"incorrect size of openeth_rx_desc_t");
/****************************************************************************
- * Private Data
+ * Private Function Prototypes
****************************************************************************/
-static struct openeth_driver_s g_openeth;
+/* NuttX callback functions */
+
+static int openeth_ifup(struct netdev_lowerhalf_s *dev);
+static int openeth_ifdown(struct netdev_lowerhalf_s *dev);
+static int openeth_transmit(struct netdev_lowerhalf_s *dev, netpkt_t *pkt);
+static netpkt_t *openeth_receive(struct netdev_lowerhalf_s *dev);
/****************************************************************************
- * Private Function Prototypes
+ * Private Data
****************************************************************************/
-/* NuttX callback functions */
+static struct openeth_priv_s g_openeth;
-static int openeth_ifup(FAR struct net_driver_s *dev);
-static int openeth_ifdown(FAR struct net_driver_s *dev);
-static int openeth_txavail(FAR struct net_driver_s *dev);
-#ifdef CONFIG_NET_MCASTGROUP
-static int openeth_addmac(FAR struct net_driver_s *dev,
- FAR const uint8_t *mac);
-static int openeth_rmmac(FAR struct net_driver_s *dev,
- FAR const uint8_t *mac);
-#endif
-static int openeth_transmit(FAR struct net_driver_s *dev);
+static const struct netdev_ops_s g_ops =
+{
+ .ifup = openeth_ifup,
+ .ifdown = openeth_ifdown,
+ .transmit = openeth_transmit,
+ .receive = openeth_receive,
+};
/****************************************************************************
* Private Functions
@@ -317,129 +238,58 @@ static inline void openeth_set_tx_desc_cnt(int
tx_desc_cnt)
REG_WRITE(OPENETH_TX_BD_NUM_REG, tx_desc_cnt);
}
-/****************************************************************************
- * Function: openeth_rx_interrupt_work
- *
- * Description:
- * Perform interrupt related work from the worker thread
- *
- * Input Parameters:
- * arg - The argument passed when work_queue() was called.
- *
- * Returned Value:
- * 0 on success
- *
- * Assumptions:
- * Ethernet interrupts are disabled
- *
- ****************************************************************************/
-
-static void openeth_rx_interrupt_work(void *arg)
+static IRAM_ATTR int openeth_isr_handler(int irq, void *context, void *arg)
{
- struct openeth_driver_s *priv = (struct openeth_driver_s *)arg;
- struct net_driver_s *dev = &priv->dev;
+ FAR struct netdev_lowerhalf_s *dev = &g_openeth.dev;
- net_lock();
+ uint32_t status = REG_READ(OPENETH_INT_SOURCE_REG);
- uint8_t *buffer = NULL;
- uint32_t length = 0;
+ if (status & OPENETH_INT_RXB)
+ {
+ netdev_lower_rxready(dev);
+ }
- while (1)
+ if (status & OPENETH_INT_BUSY)
+ {
+ ninfo("RX frame dropped (0x%x)", status);
+ }
+
+ /* Clear interrupt */
+
+ REG_WRITE(OPENETH_INT_SOURCE_REG, status);
+
+ return 0;
+}
+
+static FAR netpkt_t *openeth_receive(FAR struct netdev_lowerhalf_s *dev)
+{
+ FAR netpkt_t *pkt = netpkt_alloc(dev, NETPKT_RX);
+
+ struct openeth_priv_s *priv = &g_openeth;
+
+ if (pkt)
{
openeth_rx_desc_t *desc_ptr = openeth_rx_desc(priv->cur_rx_desc);
openeth_rx_desc_t desc_val = *desc_ptr;
- if (!desc_val.len)
- break;
ninfo("desc %d (%p) e=%d len=%d wr=%d",
priv->cur_rx_desc, desc_ptr, desc_val.e, desc_val.len, desc_val.wr);
+
if (desc_val.e)
{
- nerr("ERROR %d", desc_val.e);
+ ninfo("descriptor is not owned by HW (e=%d)", desc_val.e);
goto err;
}
- /* We don't need to copy this anywere. We can just feed it
- * to the stack from where it is
- */
-
- priv->dev.d_buf = desc_val.rxpnt;
- priv->dev.d_len = desc_val.len;
- struct eth_hdr_s *eth_hdr = (struct eth_hdr_s *)desc_val.rxpnt;
-
- #ifdef CONFIG_NET_PKT
- /* When packet sockets are enabled, feed the frame into the packet tap
- */
-
- pkt_input(&priv->dev);
- #endif
-
- /* We only accept IP packets of the configured type and ARP packets
- */
-
- #ifdef CONFIG_NET_IPv4
- if (eth_hdr->type == HTONS(ETHTYPE_IP))
- {
- /* Receive an IPv4 packet from the network device */
-
- ipv4_input(&priv->dev);
-
- /* If the above function invocation resulted in data that should be
- * sent out on the network, the field d_len will set to a value > 0
- */
-
- if (priv->dev.d_len > 0)
- {
- /* And send the packet */
-
- openeth_transmit(&priv->dev);
- }
- }
- else
- #endif
- #ifdef CONFIG_NET_IPv6
- if (eth_hdr->type == HTONS(ETHTYPE_IP6))
+ if (!desc_val.len)
{
- /* Give the IPv6 packet to the network layer */
-
- ipv6_input(&priv->dev);
-
- /* If the above function invocation resulted in data that should be
- * sent out on the network, the field d_len will set to a value > 0
- */
-
- if (priv->dev.d_len > 0)
- {
- /* And send the packet */
-
- openeth_transmit(&priv->dev);
- }
+ nerr("ERROR desc_val.len is zero");
+ goto err;
}
- else
- #endif
- #ifdef CONFIG_NET_ARP
- if (eth_hdr->type == HTONS(ETHTYPE_ARP))
- {
- /* Handle ARP packet */
-
- arp_input(&priv->dev);
- /* If the above function invocation resulted in data that should be
- * sent out on the network, the field d_len will set to a value > 0
- */
+ netpkt_copyin(dev, pkt, desc_val.rxpnt, desc_val.len, 0);
- if (priv->dev.d_len > 0)
- {
- /* And send the packet */
-
- openeth_transmit(&priv->dev);
- }
- }
- else
- #endif
- {
- nerr("ERROR: Dropped, Unknown type: %04x\n", eth_hdr->type);
- }
+ /* Free up the descriptor */
desc_val.e = 1;
desc_val.len = 0;
@@ -448,32 +298,11 @@ static void openeth_rx_interrupt_work(void *arg)
priv->cur_rx_desc = (priv->cur_rx_desc + 1) % RX_BUF_COUNT;
}
-err:
-
- net_unlock();
-}
-
-static IRAM_ATTR int openeth_isr_handler(int irq, void *context, void *arg)
-{
- struct openeth_driver_s *priv = (struct openeth_driver_s *)arg;
-
- uint32_t status = REG_READ(OPENETH_INT_SOURCE_REG);
-
- if (status & OPENETH_INT_RXB)
- {
- work_queue(LPWORK, &priv->rxwork, openeth_rx_interrupt_work, priv, 0);
- }
-
- if (status & OPENETH_INT_BUSY)
- {
- ninfo("RX frame dropped (0x%x)", status);
- }
-
- /* Clear interrupt */
+ return pkt;
- REG_WRITE(OPENETH_INT_SOURCE_REG, status);
-
- return 0;
+err:
+ netpkt_free(dev, pkt, NETPKT_RX);
+ return NULL;
}
/****************************************************************************
@@ -493,11 +322,9 @@ static IRAM_ATTR int openeth_isr_handler(int irq, void
*context, void *arg)
*
****************************************************************************/
-static int openeth_ifup(FAR struct net_driver_s *dev)
+static int openeth_ifup(FAR struct netdev_lowerhalf_s *dev)
{
irqstate_t flags;
- FAR struct openeth_driver_s *priv =
- (FAR struct openeth_driver_s *)dev->d_private;
/* Disable the Ethernet interrupt */
@@ -509,7 +336,7 @@ static int openeth_ifup(FAR struct net_driver_s *dev)
leave_critical_section(flags);
- netdev_carrier_on(dev);
+ netdev_lower_carrier_on(dev);
return OK;
}
@@ -530,11 +357,9 @@ static int openeth_ifup(FAR struct net_driver_s *dev)
*
****************************************************************************/
-static int openeth_ifdown(FAR struct net_driver_s *dev)
+static int openeth_ifdown(FAR struct netdev_lowerhalf_s *dev)
{
irqstate_t flags;
- FAR struct openeth_driver_s *priv =
- (FAR struct openeth_driver_s *)dev->d_private;
/* Disable the Ethernet interrupt */
@@ -546,172 +371,41 @@ static int openeth_ifdown(FAR struct net_driver_s *dev)
leave_critical_section(flags);
- netdev_carrier_off(dev);
+ netdev_lower_carrier_off(dev);
return OK;
}
-static int openeth_transmit(FAR struct net_driver_s *dev)
+static int openeth_transmit(FAR struct netdev_lowerhalf_s *dev,
+ FAR netpkt_t *pkt)
{
- FAR struct openeth_driver_s *priv =
- (FAR struct openeth_driver_s *)dev->d_private;
-
- int ret = 0;
- uint8_t *buf = priv->dev.d_buf;
- uint16_t length = priv->dev.d_len;
+ FAR struct openeth_priv_s *priv = (FAR struct openeth_priv_s *)dev;
+ unsigned int len = netpkt_getdatalen(dev, pkt);
- if (!buf)
- {
- nerr("can't set buf to null");
- goto err;
- }
+ /* In QEMU, there never is a TX operation in progress */
- if (!length)
- {
- nerr("buf length can't be zero");
- goto err;
- }
+ /* Copyout the L2 data and transmit. */
- if (length >= DMA_BUF_SIZE * TX_BUF_COUNT)
- {
- nerr("insufficient TX buffer size");
- goto err;
- }
+ netpkt_copyout(dev, priv->tx_buf[priv->cur_tx_desc], pkt, len, 0);
- uint32_t bytes_remaining = length;
+ /* Do Transmit */
- /* In QEMU, there never is a TX operation in progress,
- * so start with descriptor 0.
- */
+ openeth_tx_desc_t *desc_ptr = openeth_tx_desc(priv->cur_tx_desc);
+ openeth_tx_desc_t desc_val = *desc_ptr;
- while (bytes_remaining > 0)
- {
- uint32_t will_write = MIN(bytes_remaining, DMA_BUF_SIZE);
+ desc_val.wr = (priv->cur_tx_desc == TX_BUF_COUNT - 1);
+ desc_val.len = len;
+ desc_val.rd = 1;
+ *desc_ptr = desc_val;
- memcpy(priv->tx_buf[priv->cur_tx_desc], buf, will_write);
- openeth_tx_desc_t *desc_ptr = openeth_tx_desc(priv->cur_tx_desc);
- openeth_tx_desc_t desc_val = *desc_ptr;
- desc_val.wr = (priv->cur_tx_desc == TX_BUF_COUNT - 1);
- desc_val.len = will_write;
- desc_val.rd = 1;
+ /* Free the buffer and notify the upper layer */
- /* TXEN is already set, and this triggers a TX operation
- * for the descriptor
- */
+ netpkt_free(dev, pkt, NETPKT_TX);
+ netdev_lower_txdone(dev);
- ninfo("desc %d (%p) len=%d wr=%d",
- priv->cur_tx_desc, desc_ptr, will_write, desc_val.wr);
- *desc_ptr = desc_val;
- bytes_remaining -= will_write;
- buf += will_write;
- priv->cur_tx_desc = (priv->cur_tx_desc + 1) % TX_BUF_COUNT;
- }
-
- priv->dev.d_buf = NULL;
- priv->dev.d_len = 0;
return OK;
-
-err:
- return ERROR;
}
-/****************************************************************************
- * Name: openeth_txavail
- *
- * Description:
- * Driver callback invoked when new TX data is available. This is a
- * stimulus perform an out-of-cycle poll and, thereby, reduce the TX
- * latency.
- *
- * Input Parameters:
- * dev - Reference to the NuttX driver state structure
- *
- * Returned Value:
- * None
- *
- * Assumptions:
- * Called in normal user mode
- *
- ****************************************************************************/
-
-static int openeth_txavail(FAR struct net_driver_s *dev)
-{
- if (IFF_IS_UP(dev->d_flags))
- {
- /* In QEMU, the MAC is always available */
-
- net_lock();
-
- /* poll the network for new XMIT data */
-
- devif_poll(dev, openeth_transmit);
-
- net_unlock();
- }
-
- return 0;
-}
-
-/****************************************************************************
- * Name: openeth_addmac
- *
- * Description:
- * NuttX Callback: Add the specified MAC address to the hardware multicast
- * address filtering
- *
- * Input Parameters:
- * dev - Reference to the NuttX driver state structure
- * mac - The MAC address to be added
- *
- * Returned Value:
- * None
- *
- * Assumptions:
- * The default option can allow EMAC receive all multicast frame.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_NET_MCASTGROUP
-static int openeth_addmac(FAR struct net_driver_s *dev,
- FAR const uint8_t *mac)
-{
- ninfo("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
- mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-
- return 0;
-}
-#endif
-
-/****************************************************************************
- * Name: openeth_rmmac
- *
- * Description:
- * NuttX Callback: Remove the specified MAC address from the hardware
- * multicast address filtering
- *
- * Input Parameters:
- * dev - Reference to the NuttX driver state structure
- * mac - The MAC address to be removed
- *
- * Returned Value:
- * None
- *
- * Assumptions:
- * The default option can allow EMAC receive all multicast frame.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_NET_MCASTGROUP
-static int openeth_rmmac(FAR struct net_driver_s *dev,
- FAR const uint8_t *mac)
-{
- ninfo("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
- mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-
- return 0;
-}
-#endif
-
static int openeth_set_addr(uint8_t *addr)
{
ninfo("set mac\n");
@@ -745,7 +439,7 @@ err:
****************************************************************************/
/****************************************************************************
- * Name: openeth_initialize
+ * Name: esp32_openeth_initialize
*
* Description:
* Initialize the openeth driver
@@ -761,7 +455,8 @@ err:
int esp32_openeth_initialize(void)
{
int ret;
- FAR struct openeth_driver_s *priv;
+ FAR struct openeth_priv_s *priv = &g_openeth;
+ FAR struct netdev_lowerhalf_s *dev = &priv->dev;
/* Sanity check */
@@ -772,21 +467,14 @@ int esp32_openeth_initialize(void)
abort();
}
- /* Get the interface structure associated with this interface number. */
+ /* Initialize the driver structure */
- priv = &g_openeth;
+ memset(priv, 0, sizeof(struct openeth_priv_s));
- /* Initialize the driver structure */
+ dev->ops = &g_ops;
- memset(priv, 0, sizeof(struct openeth_driver_s));
- priv->dev.d_ifup = openeth_ifup; /* I/F up (new IP address) callback */
- priv->dev.d_ifdown = openeth_ifdown; /* I/F down callback */
- priv->dev.d_txavail = openeth_txavail; /* New TX data callback */
-#ifdef CONFIG_NET_MCASTGROUP
- priv->dev.d_addmac = openeth_addmac; /* Add multicast MAC address */
- priv->dev.d_rmmac = openeth_rmmac; /* Remove multicast MAC address */
-#endif
- priv->dev.d_private = priv; /* Used to recover private state from dev */
+ dev->quota[NETPKT_TX] = TX_BUF_COUNT;
+ dev->quota[NETPKT_RX] = RX_BUF_COUNT;
/* Allocate DMA buffers */
@@ -837,9 +525,9 @@ int esp32_openeth_initialize(void)
openeth_reset();
openeth_set_tx_desc_cnt(TX_BUF_COUNT);
- memcpy(priv->dev.d_mac.ether.ether_addr_octet,
+ memcpy(priv->dev.netdev.d_mac.ether.ether_addr_octet,
"\x00\x02\x03\x04\x05\x06\x07\x08", ETH_ALEN);
- openeth_set_addr(priv->dev.d_mac.ether.ether_addr_octet);
+ openeth_set_addr(priv->dev.netdev.d_mac.ether.ether_addr_octet);
/* Attach the interrupt */
@@ -849,12 +537,16 @@ int esp32_openeth_initialize(void)
* performed.
*/
- netdev_register(&priv->dev, NET_LL_ETHERNET);
+ ret = netdev_lower_register(dev, NET_LL_ETHERNET);
+ if (ret)
+ {
+ nerr("ERROR: netdev_lower_register\n");
+ goto err;
+ }
/* Put the network in the UP state */
- IFF_SET_UP(priv->dev.d_flags);
- return openeth_ifup(&priv->dev);
+ return openeth_ifup(dev);
err:
nerr("Failed initializing ret = %d", ret);