You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/08/05 14:21:42 UTC

[incubator-nuttx] branch master updated: drivers/net: make sure that net driver d_buf is 16-bit aligned

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new b3cd9090d1 drivers/net: make sure that net driver d_buf is 16-bit aligned
b3cd9090d1 is described below

commit b3cd9090d1a10a8d739b2fe23fff9a0845b4e603
Author: Petro Karashchenko <pe...@gmail.com>
AuthorDate: Thu Aug 4 19:47:53 2022 +0200

    drivers/net: make sure that net driver d_buf is 16-bit aligned
    
    Signed-off-by: Petro Karashchenko <pe...@gmail.com>
---
 arch/arm/src/c5471/c5471_ethernet.c           |   5 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_ethernet.c |   9 +-
 arch/arm/src/tiva/lm/lm3s_ethernet.c          |  21 +--
 arch/hc/src/m9s12/m9s12_ethernet.c            |   7 +-
 arch/misoc/src/common/misoc_net.c             |   5 +-
 arch/risc-v/src/mpfs/mpfs_ethernet.c          |   5 +-
 arch/z80/src/ez80/ez80_emac.c                 |  62 ++++----
 drivers/net/Kconfig                           |   2 +-
 drivers/net/dm90x0.c                          |  20 +--
 drivers/net/enc28j60.c                        |  24 ++--
 drivers/net/encx24j600.c                      |  25 ++--
 drivers/net/ftmac100.c                        |  21 +--
 drivers/net/lan91c111.c                       |  28 ++--
 drivers/net/skeleton.c                        |  22 +--
 drivers/net/w5500.c                           | 194 ++++++++++++--------------
 drivers/usbhost/usbhost_cdcmbim.c             |   6 +-
 net/pkt/pkt_input.c                           |   4 +-
 17 files changed, 237 insertions(+), 223 deletions(-)

diff --git a/arch/arm/src/c5471/c5471_ethernet.c b/arch/arm/src/c5471/c5471_ethernet.c
index ce49f0c840..36a33897c8 100644
--- a/arch/arm/src/c5471/c5471_ethernet.c
+++ b/arch/arm/src/c5471/c5471_ethernet.c
@@ -284,7 +284,8 @@
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint8_t g_pktbuf[CONFIG_C5471_NET_NINTERFACES]
+                       [MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
 
 /* The c5471_driver_s encapsulates all state information for a single c5471
  * hardware interface
@@ -2389,7 +2390,7 @@ void arm_netinitialize(void)
 
   memset(g_c5471, 0,
     CONFIG_C5471_NET_NINTERFACES * sizeof(struct c5471_driver_s));
-  g_c5471[0].c_dev.d_buf     = g_pktbuf;        /* Single packet buffer */
+  g_c5471[0].c_dev.d_buf     = g_pktbuf[0];     /* Single packet buffer */
   g_c5471[0].c_dev.d_ifup    = c5471_ifup;      /* I/F down callback */
   g_c5471[0].c_dev.d_ifdown  = c5471_ifdown;    /* I/F up (new IP address) callback */
   g_c5471[0].c_dev.d_txavail = c5471_txavail;   /* New TX data callback */
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_ethernet.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_ethernet.c
index 77fc01e4eb..18143c4209 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_ethernet.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_ethernet.c
@@ -308,7 +308,7 @@ struct lpc17_40_driver_s
 
 /* A single packet buffer per interface is used */
 
-static uint8_t g_pktbuf[PKTBUF_SIZE * CONFIG_LPC17_40_NINTERFACES];
+static uint8_t g_pktbuf[CONFIG_LPC17_40_NINTERFACES][PKTBUF_SIZE];
 
 /* Array of ethernet driver status structures */
 
@@ -3149,7 +3149,6 @@ static inline int lpc17_40_ethinitialize(int intf)
 #endif
 {
   struct lpc17_40_driver_s *priv;
-  uint8_t *pktbuf;
   uint32_t regval;
   int ret;
   int i;
@@ -3172,14 +3171,10 @@ static inline int lpc17_40_ethinitialize(int intf)
 
   lpc17_40_showpins();
 
-  /* Select the packet buffer */
-
-  pktbuf = &g_pktbuf[PKTBUF_SIZE * intf];
-
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct lpc17_40_driver_s));
-  priv->lp_dev.d_buf     = pktbuf;             /* Single packet buffer */
+  priv->lp_dev.d_buf     = g_pktbuf[intf];     /* Single packet buffer */
   priv->lp_dev.d_ifup    = lpc17_40_ifup;      /* I/F down callback */
   priv->lp_dev.d_ifdown  = lpc17_40_ifdown;    /* I/F up (new IP address) callback */
   priv->lp_dev.d_txavail = lpc17_40_txavail;   /* New TX data callback */
diff --git a/arch/arm/src/tiva/lm/lm3s_ethernet.c b/arch/arm/src/tiva/lm/lm3s_ethernet.c
index 0933e1944e..5b545d51ed 100644
--- a/arch/arm/src/tiva/lm/lm3s_ethernet.c
+++ b/arch/arm/src/tiva/lm/lm3s_ethernet.c
@@ -199,7 +199,8 @@ struct tiva_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint8_t g_pktbuf[TIVA_NETHCONTROLLERS]
+                       [MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
 
 /* Ethernet peripheral state */
 
@@ -1605,20 +1606,20 @@ static inline int tiva_ethinitialize(int intf)
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct tiva_driver_s));
-  priv->ld_dev.d_buf     = g_pktbuf;      /* Single packet buffer */
-  priv->ld_dev.d_ifup    = tiva_ifup;     /* I/F down callback */
-  priv->ld_dev.d_ifdown  = tiva_ifdown;   /* I/F up (new IP address) callback */
-  priv->ld_dev.d_txavail = tiva_txavail;  /* New TX data callback */
+  priv->ld_dev.d_buf     = g_pktbuf[intf]; /* Single packet buffer */
+  priv->ld_dev.d_ifup    = tiva_ifup;      /* I/F down callback */
+  priv->ld_dev.d_ifdown  = tiva_ifdown;    /* I/F up (new IP address) callback */
+  priv->ld_dev.d_txavail = tiva_txavail;   /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  priv->ld_dev.d_addmac  = tiva_addmac;   /* Add multicast MAC address */
-  priv->ld_dev.d_rmmac   = tiva_rmmac;    /* Remove multicast MAC address */
+  priv->ld_dev.d_addmac  = tiva_addmac;    /* Add multicast MAC address */
+  priv->ld_dev.d_rmmac   = tiva_rmmac;     /* Remove multicast MAC address */
 #endif
-  priv->ld_dev.d_private = priv;          /* Used to recover private state from dev */
+  priv->ld_dev.d_private = priv;           /* Used to recover private state from dev */
 
 #if TIVA_NETHCONTROLLERS > 1
 # error "A mechanism to associate base address an IRQ with an interface is needed"
-  priv->ld_base          = ??;            /* Ethernet controller base address */
-  priv->ld_irq           = ??;            /* Ethernet controller IRQ number */
+  priv->ld_base          = ??;             /* Ethernet controller base address */
+  priv->ld_irq           = ??;             /* Ethernet controller IRQ number */
 #endif
 
 #ifdef CONFIG_TIVA_BOARDMAC
diff --git a/arch/hc/src/m9s12/m9s12_ethernet.c b/arch/hc/src/m9s12/m9s12_ethernet.c
index 6d4362deed..71dd60776f 100644
--- a/arch/hc/src/m9s12/m9s12_ethernet.c
+++ b/arch/hc/src/m9s12/m9s12_ethernet.c
@@ -89,7 +89,8 @@ struct emac_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint8_t g_pktbuf[CONFIG_HCS12_NINTERFACES]
+                       [MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
 
 /* Driver state structure */
 
@@ -693,7 +694,7 @@ int emac_initialize(int intf)
 
   /* Get the interface structure associated with this interface number. */
 
-  DEBUGASSERT(inf <  CONFIG_HCS12_NINTERFACES);
+  DEBUGASSERT(inf < CONFIG_HCS12_NINTERFACES);
   priv = &g_emac[intf];
 
   /* Check if a Ethernet chip is recognized at its I/O base */
@@ -710,7 +711,7 @@ int emac_initialize(int intf)
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct emac_driver_s));
-  priv->d_dev.d_buf     = g_pktbuf;      /* Single packet buffer */
+  priv->d_dev.d_buf     = g_pktbuf[inf]; /* Single packet buffer */
   priv->d_dev.d_ifup    = emac_ifup;     /* I/F down callback */
   priv->d_dev.d_ifdown  = emac_ifdown;   /* I/F up (new IP address) callback */
   priv->d_dev.d_txavail = emac_txavail;  /* New TX data callback */
diff --git a/arch/misoc/src/common/misoc_net.c b/arch/misoc/src/common/misoc_net.c
index 505f897dc0..ba91f8ba59 100644
--- a/arch/misoc/src/common/misoc_net.c
+++ b/arch/misoc/src/common/misoc_net.c
@@ -116,7 +116,8 @@ struct misoc_net_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint8_t g_pktbuf[CONFIG_MISOC_NET_NINTERFACES]
+                       [MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
 
 /* Driver state structure */
 
@@ -1092,7 +1093,7 @@ int misoc_net_initialize(int intf)
   priv->tx_buf  = priv->tx0_buf;
   priv->tx_slot = 0;
 
-  priv->misoc_net_dev.d_buf     = g_pktbuf;           /* Single packet buffer */
+  priv->misoc_net_dev.d_buf     = g_pktbuf[intf];     /* Single packet buffer */
   priv->misoc_net_dev.d_ifup    = misoc_net_ifup;     /* I/F up (new IP address) callback */
   priv->misoc_net_dev.d_ifdown  = misoc_net_ifdown;   /* I/F down callback */
   priv->misoc_net_dev.d_txavail = misoc_net_txavail;  /* New TX data callback */
diff --git a/arch/risc-v/src/mpfs/mpfs_ethernet.c b/arch/risc-v/src/mpfs/mpfs_ethernet.c
index 0bcee6e2f0..24beddd763 100644
--- a/arch/risc-v/src/mpfs/mpfs_ethernet.c
+++ b/arch/risc-v/src/mpfs/mpfs_ethernet.c
@@ -210,7 +210,8 @@ struct gmac_txdesc_s
 #endif
 };
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint8_t g_pktbuf[MPFS_NETHERNET]
+                       [MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
 
 #if defined(CONFIG_MPFS_GMAC_PREALLOCATE)
 static uint8_t g_txbuffer[CONFIG_MPFS_ETHMAC_NTXBUFFERS * GMAC_TX_UNITSIZE]
@@ -3554,7 +3555,7 @@ int mpfs_ethinitialize(int intf)
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct mpfs_ethmac_s));
-  priv->dev.d_buf     = g_pktbuf;       /* Single packet buffer */
+  priv->dev.d_buf     = g_pktbuf[intf]; /* Single packet buffer */
   priv->dev.d_ifup    = mpfs_ifup;      /* I/F up (new IP address) callback */
   priv->dev.d_ifdown  = mpfs_ifdown;    /* I/F down callback */
   priv->dev.d_txavail = mpfs_txavail;   /* New TX data callback */
diff --git a/arch/z80/src/ez80/ez80_emac.c b/arch/z80/src/ez80/ez80_emac.c
index ab6212e671..140e66edcb 100644
--- a/arch/z80/src/ez80/ez80_emac.c
+++ b/arch/z80/src/ez80/ez80_emac.c
@@ -378,17 +378,17 @@ static int  ez80emac_miiconfigure(FAR struct ez80emac_driver_s *priv);
 /* Multi-cast filtering */
 
 #ifdef CONFIG_EZ80_MCFILTER
-static void ez80emac_machash(FAR uint8_t *mac, int *ndx, int *bitno)
+static void ez80emac_machash(FAR uint8_t *mac, FAR int *ndx, FAR int *bitno);
 #endif
 
 /* TX/RX logic */
 
-static int  ez80emac_transmit(struct ez80emac_driver_s *priv);
-static int  ez80emac_txpoll(struct net_driver_s *dev);
+static int  ez80emac_transmit(FAR struct ez80emac_driver_s *priv);
+static int  ez80emac_txpoll(FAR struct net_driver_s *dev);
 
 static inline FAR struct ez80emac_desc_s *ez80emac_rwp(void);
 static inline FAR struct ez80emac_desc_s *ez80emac_rrp(void);
-static int  ez80emac_receive(struct ez80emac_driver_s *priv);
+static int  ez80emac_receive(FAR struct ez80emac_driver_s *priv);
 
 /* Interrupt handling */
 
@@ -411,16 +411,16 @@ static void ez80emac_txtimeout_expiry(wdparm_t arg);
 
 /* NuttX callback functions */
 
-static int  ez80emac_ifup(struct net_driver_s *dev);
-static int  ez80emac_ifdown(struct net_driver_s *dev);
+static int  ez80emac_ifup(FAR struct net_driver_s *dev);
+static int  ez80emac_ifdown(FAR struct net_driver_s *dev);
 
 static void ez80emac_txavail_work(FAR void *arg);
-static int  ez80emac_txavail(struct net_driver_s *dev);
+static int  ez80emac_txavail(FAR struct net_driver_s *dev);
 
 #ifdef CONFIG_NET_MCASTGROUP
-static int ez80emac_addmac(struct net_driver_s *dev,
+static int ez80emac_addmac(FAR struct net_driver_s *dev,
              FAR const uint8_t *mac);
-static int ez80emac_rmmac(struct net_driver_s *dev,
+static int ez80emac_rmmac(FAR struct net_driver_s *dev,
              FAR const uint8_t *mac);
 #endif
 
@@ -944,7 +944,7 @@ static int ez80emac_miiconfigure(FAR struct ez80emac_driver_s *priv)
  ****************************************************************************/
 
 #ifdef CONFIG_EZ80_MCFILTER
-static void ez80emac_machash(FAR uint8_t *mac, int *ndx, int *bitno)
+static void ez80emac_machash(FAR uint8_t *mac, FAR int *ndx, FAR int *bitno)
 {
   uint32_t hash;
   uint32_t crc32;
@@ -1021,14 +1021,14 @@ static void ez80emac_machash(FAR uint8_t *mac, int *ndx, int *bitno)
  *
  ****************************************************************************/
 
-static int ez80emac_transmit(struct ez80emac_driver_s *priv)
+static int ez80emac_transmit(FAR struct ez80emac_driver_s *priv)
 {
   FAR struct ez80emac_desc_s *txdesc;
   FAR struct ez80emac_desc_s *txnext;
-  uint8_t   *psrc;
-  uint8_t   *pdest;
-  uint24_t   len;
-  irqstate_t flags;
+  FAR uint8_t *psrc;
+  FAR uint8_t *pdest;
+  uint24_t     len;
+  irqstate_t   flags;
 
   /* Careful:  This function can be called from outside of the interrupt
    * handler and, therefore, may be suspended when debug output is generated!
@@ -1057,11 +1057,11 @@ static int ez80emac_transmit(struct ez80emac_driver_s *priv)
   txdesc = priv->txnext;
 
   len    = EMAC_PKTBUF_ALIGN(priv->dev.d_len + SIZEOF_EMACSDESC);
-  txnext = (FAR struct ez80emac_desc_s *)((uint8_t *)txdesc + len);
+  txnext = (FAR struct ez80emac_desc_s *)((FAR uint8_t *)txdesc + len);
 
   /* Handle wraparound to the beginning of the TX region */
 
-  if ((uint8_t *)txnext + SIZEOF_EMACSDESC >= (uint8_t *)priv->rxstart)
+  if ((uint8_t *)txnext + SIZEOF_EMACSDESC >= (FAR uint8_t *)priv->rxstart)
     {
       txnext = (FAR struct ez80emac_desc_s *)
         ((FAR uint8_t *)priv->txstart +
@@ -1078,8 +1078,8 @@ static int ez80emac_transmit(struct ez80emac_driver_s *priv)
    */
 
   psrc            = priv->dev.d_buf;
-  pdest           = (uint8_t *)txdesc + SIZEOF_EMACSDESC;
-  len             = (uint8_t *)priv->rxstart - pdest;
+  pdest           = (FAR uint8_t *)txdesc + SIZEOF_EMACSDESC;
+  len             = (FAR uint8_t *)priv->rxstart - pdest;
   if (len >= priv->dev.d_len)
     {
       /* The entire packet will fit into the EMAC SRAM without wrapping */
@@ -1264,15 +1264,15 @@ static inline FAR struct ez80emac_desc_s *ez80emac_rrp(void)
  *
  ****************************************************************************/
 
-static int ez80emac_receive(struct ez80emac_driver_s *priv)
+static int ez80emac_receive(FAR struct ez80emac_driver_s *priv)
 {
   FAR struct ez80emac_desc_s *rxdesc = priv->rxnext;
   FAR struct ez80emac_desc_s *rwp;
-  uint8_t *psrc;
-  uint8_t *pdest;
-  int     pktlen;
-  int     npackets;
-  uint8_t pktgood;
+  FAR uint8_t *psrc;
+  FAR uint8_t *pdest;
+  int          pktlen;
+  int          npackets;
+  uint8_t      pktgood;
 
   /* The RRP register points to where the next Receive packet is read from.
    * The read-only EMAC Receive Write Pointer (RWP) register reports the
@@ -2080,7 +2080,7 @@ static int ez80emac_ifup(FAR struct net_driver_s *dev)
  *
  ****************************************************************************/
 
-static int ez80emac_ifdown(struct net_driver_s *dev)
+static int ez80emac_ifdown(FAR struct net_driver_s *dev)
 {
   FAR struct ez80emac_driver_s *priv =
     (FAR struct ez80emac_driver_s *)dev->d_private;
@@ -2205,7 +2205,8 @@ static int ez80emac_txavail(FAR struct net_driver_s *dev)
  ****************************************************************************/
 
 #ifdef CONFIG_NET_MCASTGROUP
-static int ez80emac_addmac(struct net_driver_s *dev, FAR const uint8_t *mac)
+static int ez80emac_addmac(FAR struct net_driver_s *dev,
+                           FAR const uint8_t *mac)
 {
   FAR struct ez80emac_driver_s *priv =
     (FAR struct ez80emac_driver_s *)dev->d_private;
@@ -2237,7 +2238,8 @@ static int ez80emac_addmac(struct net_driver_s *dev, FAR const uint8_t *mac)
  ****************************************************************************/
 
 #ifdef CONFIG_NET_MCASTGROUP
-static int ez80emac_rmmac(struct net_driver_s *dev, FAR const uint8_t *mac)
+static int ez80emac_rmmac(FAR struct net_driver_s *dev,
+                          FAR const uint8_t *mac)
 {
   FAR struct ez80emac_driver_s *priv =
     (FAR struct ez80emac_driver_s *)dev->d_private;
@@ -2266,7 +2268,7 @@ static int ez80emac_rmmac(struct net_driver_s *dev, FAR const uint8_t *mac)
 
 static int ez80_emacinitialize(void)
 {
-  struct ez80emac_driver_s *priv = &g_emac;
+  FAR struct ez80emac_driver_s *priv = &g_emac;
   uint24_t addr;
   uint8_t regval;
   int ret;
@@ -2494,7 +2496,7 @@ errout:
 
 int up_netinitialize(void)
 {
-  struct ez80emac_driver_s *priv = &g_emac;
+  FAR struct ez80emac_driver_s *priv = &g_emac;
   int ret;
 
   /* Disable all interrupts */
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 2d9d1e54e3..fa72a3f543 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -260,7 +260,7 @@ menuconfig ENCX24J600
 
 if ENCX24J600
 
-config ENC28J60_NINTERFACES
+config ENCX24J600_NINTERFACES
 	int "Number of physical ENCX24J600"
 	default 1
 	range 1 1
diff --git a/drivers/net/dm90x0.c b/drivers/net/dm90x0.c
index dc8221e5bd..5c69905ee1 100644
--- a/drivers/net/dm90x0.c
+++ b/drivers/net/dm90x0.c
@@ -273,6 +273,10 @@
 
 #define DM6X_TXTIMEOUT (60*CLK_TCK)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of Ethernet header */
 
 #define BUF ((FAR struct eth_hdr_s *)priv->dm_dev.d_buf)
@@ -323,7 +327,7 @@ struct dm9x_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_DM9X_NINTERFACES][(PKTBUF_SIZE + 1) / 2];
 
 /* At present, only a single DM90x0 device is supported. */
 
@@ -1866,15 +1870,15 @@ int dm9x_initialize(void)
   /* Initialize the driver structure */
 
   memset(g_dm9x, 0, CONFIG_DM9X_NINTERFACES*sizeof(struct dm9x_driver_s));
-  g_dm9x[0].dm_dev.d_buf     = g_pktbuf;      /* Single packet buffer */
-  g_dm9x[0].dm_dev.d_ifup    = dm9x_ifup;     /* I/F down callback */
-  g_dm9x[0].dm_dev.d_ifdown  = dm9x_ifdown;   /* I/F up (new IP address) callback */
-  g_dm9x[0].dm_dev.d_txavail = dm9x_txavail;  /* New TX data callback */
+  g_dm9x[0].dm_dev.d_buf     = (FAR uint8_t *)g_pktbuf[0]; /* Single packet buffer */
+  g_dm9x[0].dm_dev.d_ifup    = dm9x_ifup;                  /* I/F down callback */
+  g_dm9x[0].dm_dev.d_ifdown  = dm9x_ifdown;                /* I/F up (new IP address) callback */
+  g_dm9x[0].dm_dev.d_txavail = dm9x_txavail;               /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  g_dm9x[0].dm_dev.d_addmac  = dm9x_addmac;   /* Add multicast MAC address */
-  g_dm9x[0].dm_dev.d_rmmac   = dm9x_rmmac;    /* Remove multicast MAC address */
+  g_dm9x[0].dm_dev.d_addmac  = dm9x_addmac;                /* Add multicast MAC address */
+  g_dm9x[0].dm_dev.d_rmmac   = dm9x_rmmac;                 /* Remove multicast MAC address */
 #endif
-  g_dm9x[0].dm_dev.d_private = g_dm9x;        /* Used to recover private state from dev */
+  g_dm9x[0].dm_dev.d_private = g_dm9x;                     /* Used to recover private state from dev */
 
   /* Read the MAC address */
 
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
index 2c4a776388..326b5254fb 100644
--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -175,6 +175,10 @@
 #define enc_bfsgreg(priv,ctrlreg,setbits) \
   enc_wrgreg2(priv, ENC_BFS | GETADDR(ctrlreg), setbits)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of Ethernet header */
 
 #define BUF ((FAR struct eth_hdr_s *)priv->dev.d_buf)
@@ -250,7 +254,7 @@ struct enc_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_ENC28J60_NINTERFACES][(PKTBUF_SIZE + 1) / 2];
 
 /* Driver status structure */
 
@@ -2528,17 +2532,17 @@ int enc_initialize(FAR struct spi_dev_s *spi,
   memset(g_enc28j60, 0,
          CONFIG_ENC28J60_NINTERFACES * sizeof(struct enc_driver_s));
 
-  priv->dev.d_buf     = g_pktbuf;     /* Single packet buffer */
-  priv->dev.d_ifup    = enc_ifup;     /* I/F down callback */
-  priv->dev.d_ifdown  = enc_ifdown;   /* I/F up (new IP address) callback */
-  priv->dev.d_txavail = enc_txavail;  /* New TX data callback */
+  priv->dev.d_buf     = (FAR uint8_t *)g_pktbuf[devno]; /* Single packet buffer */
+  priv->dev.d_ifup    = enc_ifup;                       /* I/F down callback */
+  priv->dev.d_ifdown  = enc_ifdown;                     /* I/F up (new IP address) callback */
+  priv->dev.d_txavail = enc_txavail;                    /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  priv->dev.d_addmac  = enc_addmac;   /* Add multicast MAC address */
-  priv->dev.d_rmmac   = enc_rmmac;    /* Remove multicast MAC address */
+  priv->dev.d_addmac  = enc_addmac;                     /* Add multicast MAC address */
+  priv->dev.d_rmmac   = enc_rmmac;                      /* Remove multicast MAC address */
 #endif
-  priv->dev.d_private = priv;         /* Used to recover private state from dev */
-  priv->spi           = spi;          /* Save the SPI instance */
-  priv->lower         = lower;        /* Save the low-level MCU interface */
+  priv->dev.d_private = priv;                           /* Used to recover private state from dev */
+  priv->spi           = spi;                            /* Save the SPI instance */
+  priv->lower         = lower;                          /* Save the low-level MCU interface */
 
   /* The interface should be in the down state.  However, this function is
    * called too early in initialization to perform the ENC28J60 reset in
diff --git a/drivers/net/encx24j600.c b/drivers/net/encx24j600.c
index 1923b11105..8b567c7fb0 100644
--- a/drivers/net/encx24j600.c
+++ b/drivers/net/encx24j600.c
@@ -158,6 +158,10 @@
 
 #define ENC_NTXDESCR ((PKTMEM_RX_START - PKTMEM_START) / PKTMEM_ALIGNED_BUFSIZE)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of Ethernet header */
 
 #define BUF ((FAR struct eth_hdr_s *)priv->dev.d_buf)
@@ -253,7 +257,8 @@ struct enc_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_ENCX24J600_NINTERFACES]
+                        [(PKTBUF_SIZE + 1) / 2];
 
 /* Driver status structure */
 
@@ -2711,17 +2716,17 @@ int enc_initialize(FAR struct spi_dev_s *spi,
   memset(g_encx24j600, 0,
          CONFIG_ENCX24J600_NINTERFACES * sizeof(struct enc_driver_s));
 
-  priv->dev.d_buf     = g_pktbuf;     /* Single packet buffer */
-  priv->dev.d_ifup    = enc_ifup;     /* I/F up (new IP address) callback */
-  priv->dev.d_ifdown  = enc_ifdown;   /* I/F down callback */
-  priv->dev.d_txavail = enc_txavail;  /* New TX data callback */
+  priv->dev.d_buf     = (FAR uint8_t *)g_pktbuf[devno]; /* Single packet buffer */
+  priv->dev.d_ifup    = enc_ifup;                       /* I/F up (new IP address) callback */
+  priv->dev.d_ifdown  = enc_ifdown;                     /* I/F down callback */
+  priv->dev.d_txavail = enc_txavail;                    /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  priv->dev.d_addmac  = enc_addmac;   /* Add multicast MAC address */
-  priv->dev.d_rmmac   = enc_rmmac;    /* Remove multicast MAC address */
+  priv->dev.d_addmac  = enc_addmac;                     /* Add multicast MAC address */
+  priv->dev.d_rmmac   = enc_rmmac;                      /* Remove multicast MAC address */
 #endif
-  priv->dev.d_private = priv;         /* Used to recover private state from dev */
-  priv->spi           = spi;          /* Save the SPI instance */
-  priv->lower         = lower;        /* Save the low-level MCU interface */
+  priv->dev.d_private = priv;                           /* Used to recover private state from dev */
+  priv->spi           = spi;                            /* Save the SPI instance */
+  priv->lower         = lower;                          /* Save the low-level MCU interface */
 
   /* The interface should be in the down state.  However, this function is
    * called too early in initialization to perform the ENCX24J600 reset in
diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c
index f6607b9464..a93b82230a 100644
--- a/drivers/net/ftmac100.c
+++ b/drivers/net/ftmac100.c
@@ -85,6 +85,10 @@
 
 #define FTMAC100_TXTIMEOUT (60*CLK_TCK)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of the Ethernet
  * header.
  */
@@ -171,7 +175,8 @@ struct ftmac100_driver_s
 
 /* A single packet buffer is used */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_FTMAC100_NINTERFACES]
+                        [(PKTBUF_SIZE + 1) / 2];
 
 /* Driver state structure. */
 
@@ -1488,15 +1493,15 @@ int ftmac100_initialize(int intf)
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct ftmac100_driver_s));
-  priv->ft_dev.d_buf     = g_pktbuf;          /* Single packet buffer */
-  priv->ft_dev.d_ifup    = ftmac100_ifup;     /* I/F up (new IP address) callback */
-  priv->ft_dev.d_ifdown  = ftmac100_ifdown;   /* I/F down callback */
-  priv->ft_dev.d_txavail = ftmac100_txavail;  /* New TX data callback */
+  priv->ft_dev.d_buf     = (FAR uint8_t *)g_pktbuf[intf]; /* Single packet buffer */
+  priv->ft_dev.d_ifup    = ftmac100_ifup;                 /* I/F up (new IP address) callback */
+  priv->ft_dev.d_ifdown  = ftmac100_ifdown;               /* I/F down callback */
+  priv->ft_dev.d_txavail = ftmac100_txavail;              /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  priv->ft_dev.d_addmac  = ftmac100_addmac;   /* Add multicast MAC address */
-  priv->ft_dev.d_rmmac   = ftmac100_rmmac;    /* Remove multicast MAC address */
+  priv->ft_dev.d_addmac  = ftmac100_addmac;               /* Add multicast MAC address */
+  priv->ft_dev.d_rmmac   = ftmac100_rmmac;                /* Remove multicast MAC address */
 #endif
-  priv->ft_dev.d_private = g_ftmac100;        /* Used to recover private state from dev */
+  priv->ft_dev.d_private = g_ftmac100;                    /* Used to recover private state from dev */
   priv->iobase           = CONFIG_FTMAC100_BASE;
 
   /* Put the interface in the down state.  This usually amounts to resetting
diff --git a/drivers/net/lan91c111.c b/drivers/net/lan91c111.c
index 8587b026ab..9f1fa75908 100644
--- a/drivers/net/lan91c111.c
+++ b/drivers/net/lan91c111.c
@@ -81,12 +81,12 @@
 
 struct lan91c111_driver_s
 {
-  uintptr_t base;                         /* Base address */
-  int       irq;                          /* IRQ number */
-  uint16_t  bank;                         /* Current bank */
-  struct work_s irqwork;                  /* For deferring interrupt work to the work queue */
-  struct work_s pollwork;                 /* For deferring poll work to the work queue */
-  uint8_t pktbuf[MAX_NETDEV_PKTSIZE + 4]; /* +4 due to getregs32/putregs32 */
+  uintptr_t base;                                     /* Base address */
+  int       irq;                                      /* IRQ number */
+  struct work_s irqwork;                              /* For deferring interrupt work to the work queue */
+  struct work_s pollwork;                             /* For deferring poll work to the work queue */
+  uint16_t  bank;                                     /* Current bank */
+  uint16_t  pktbuf[(MAX_NETDEV_PKTSIZE + 4 + 1) / 2]; /* +4 due to getregs32/putregs32 */
 
   /* This holds the information visible to the NuttX network */
 
@@ -1493,18 +1493,18 @@ int lan91c111_initialize(uintptr_t base, int irq)
 
   /* Initialize the driver structure */
 
-  dev->d_buf     = priv->pktbuf;      /* Single packet buffer */
-  dev->d_ifup    = lan91c111_ifup;    /* I/F up (new IP address) callback */
-  dev->d_ifdown  = lan91c111_ifdown;  /* I/F down callback */
-  dev->d_txavail = lan91c111_txavail; /* New TX data callback */
+  dev->d_buf     = (FAR uint8_t *)priv->pktbuf; /* Single packet buffer */
+  dev->d_ifup    = lan91c111_ifup;              /* I/F up (new IP address) callback */
+  dev->d_ifdown  = lan91c111_ifdown;            /* I/F down callback */
+  dev->d_txavail = lan91c111_txavail;           /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  dev->d_addmac  = lan91c111_addmac;  /* Add multicast MAC address */
-  dev->d_rmmac   = lan91c111_rmmac;   /* Remove multicast MAC address */
+  dev->d_addmac  = lan91c111_addmac;            /* Add multicast MAC address */
+  dev->d_rmmac   = lan91c111_rmmac;             /* Remove multicast MAC address */
 #endif
 #ifdef CONFIG_NETDEV_IOCTL
-  dev->d_ioctl   = lan91c111_ioctl;   /* Handle network IOCTL commands */
+  dev->d_ioctl   = lan91c111_ioctl;             /* Handle network IOCTL commands */
 #endif
-  dev->d_private = priv;              /* Used to recover private state from dev */
+  dev->d_private = priv;                        /* Used to recover private state from dev */
 
   /* Put the interface in the down state. This usually amounts to resetting
    * the device and/or calling lan91c111_ifdown().
diff --git a/drivers/net/skeleton.c b/drivers/net/skeleton.c
index 11a0e08c9a..1225d60138 100644
--- a/drivers/net/skeleton.c
+++ b/drivers/net/skeleton.c
@@ -80,6 +80,10 @@
 
 #define SKELETON_TXTIMEOUT (60*CLK_TCK)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of Ethernet header */
 
 #define BUF ((FAR struct eth_hdr_s *)priv->sk_dev.d_buf)
@@ -124,7 +128,7 @@ struct skel_driver_s
  * allocated dynamically in cases where more than one are needed.
  */
 
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_SKELETON_NINTERFACES][(PKTBUF_SIZE + 1) / 2];
 
 /* Driver state structure */
 
@@ -1070,18 +1074,18 @@ int skel_initialize(int intf)
   /* Initialize the driver structure */
 
   memset(priv, 0, sizeof(struct skel_driver_s));
-  priv->sk_dev.d_buf     = g_pktbuf;      /* Single packet buffer */
-  priv->sk_dev.d_ifup    = skel_ifup;     /* I/F up (new IP address) callback */
-  priv->sk_dev.d_ifdown  = skel_ifdown;   /* I/F down callback */
-  priv->sk_dev.d_txavail = skel_txavail;  /* New TX data callback */
+  priv->sk_dev.d_buf     = (FAR uint8_t *)g_pktbuf[intf]; /* Single packet buffer */
+  priv->sk_dev.d_ifup    = skel_ifup;                     /* I/F up (new IP address) callback */
+  priv->sk_dev.d_ifdown  = skel_ifdown;                   /* I/F down callback */
+  priv->sk_dev.d_txavail = skel_txavail;                  /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  priv->sk_dev.d_addmac  = skel_addmac;   /* Add multicast MAC address */
-  priv->sk_dev.d_rmmac   = skel_rmmac;    /* Remove multicast MAC address */
+  priv->sk_dev.d_addmac  = skel_addmac;                   /* Add multicast MAC address */
+  priv->sk_dev.d_rmmac   = skel_rmmac;                    /* Remove multicast MAC address */
 #endif
 #ifdef CONFIG_NETDEV_IOCTL
-  priv->sk_dev.d_ioctl   = skel_ioctl;    /* Handle network IOCTL commands */
+  priv->sk_dev.d_ioctl   = skel_ioctl;                    /* Handle network IOCTL commands */
 #endif
-  priv->sk_dev.d_private = g_skel;        /* Used to recover private state from dev */
+  priv->sk_dev.d_private = g_skel;                        /* Used to recover private state from dev */
 
   /* Put the interface in the down state.  This usually amounts to resetting
    * the device and/or calling skel_ifdown().
diff --git a/drivers/net/w5500.c b/drivers/net/w5500.c
index 53cf3c1422..4c0cf76cea 100644
--- a/drivers/net/w5500.c
+++ b/drivers/net/w5500.c
@@ -80,7 +80,7 @@
  */
 
 #ifndef CONFIG_NET_W5500_NINTERFACES
-# define CONFIG_NET_W5500_NINTERFACES 1
+#  define CONFIG_NET_W5500_NINTERFACES 1
 #endif
 
 /* TX timeout = 1 minute
@@ -89,9 +89,13 @@
 
 #define W5500_TXTIMEOUT (60 * CLK_TCK)
 
+/* Packet buffer size */
+
+#define PKTBUF_SIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE)
+
 /* This is a helper pointer for accessing the contents of Ethernet header */
 
-#define ETH_HDR ((FAR struct eth_hdr_s *)self->sk_dev.d_buf)
+#define BUF ((FAR struct eth_hdr_s *)self->w_dev.d_buf)
 
 /* Number of Ethernet frame transmission buffers maintained in W5500's 16 KiB
  * Tx RAM.  A maximum size is conservatively assumed per Ethernet frame in
@@ -357,10 +361,10 @@
 
 struct w5500_driver_s
 {
-  bool sk_bifup;               /* true:ifup false:ifdown */
-  struct wdog_s sk_txtimeout;  /* TX timeout timer */
-  struct work_s sk_irqwork;    /* For deferring interrupt work to the work queue */
-  struct work_s sk_pollwork;   /* For deferring poll work to the work queue */
+  bool w_bifup;               /* true:ifup false:ifdown */
+  struct wdog_s w_txtimeout;  /* TX timeout timer */
+  struct work_s w_irqwork;    /* For deferring interrupt work to the work queue */
+  struct work_s w_pollwork;   /* For deferring poll work to the work queue */
 
   /* Ethernet frame transmission buffer management */
 
@@ -375,30 +379,17 @@ struct w5500_driver_s
 
   /* This holds the information visible to the NuttX network */
 
-  struct net_driver_s sk_dev;  /* Interface understood by the network */
+  struct net_driver_s w_dev;  /* Interface understood by the network */
 };
 
 /****************************************************************************
  * Private Data
  ****************************************************************************/
 
-/* These statically allocated structures would mean that only a single
- * instance of the device could be supported.  In order to support multiple
- * devices instances, this data would have to be allocated dynamically.
- */
+/* A single packet buffer is used */
 
-/* A single packet buffer per device is used in this example.  There might
- * be multiple packet buffers in a more complex, pipelined design.  Many
- * contemporary Ethernet interfaces, for example,  use multiple, linked DMA
- * descriptors in rings to implement such a pipeline.  This example assumes
- * much simpler hardware that simply handles one packet at a time.
- *
- * NOTE that if CONFIG_NET_W5500_NINTERFACES were greater than 1, you would
- * need a minimum on one packet buffer per instance.  Much better to be
- * allocated dynamically in cases where more than one are needed.
- */
-
-static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
+static uint16_t g_pktbuf[CONFIG_NET_W5500_NINTERFACES]
+                        [(PKTBUF_SIZE + 1) / 2];
 
 /* Driver state structure */
 
@@ -415,7 +406,7 @@ static int  w5500_txpoll(FAR struct net_driver_s *dev);
 
 /* Interrupt handling */
 
-static void w5500_reply(struct w5500_driver_s *priv);
+static void w5500_reply(FAR struct w5500_driver_s *priv);
 static void w5500_receive(FAR struct w5500_driver_s *priv);
 static void w5500_txdone(FAR struct w5500_driver_s *priv);
 
@@ -554,7 +545,7 @@ static void w5500_unlock(FAR struct w5500_driver_s *self)
 static void w5500_read(FAR struct w5500_driver_s *self,
                        uint8_t                   block_select_bits,
                        uint16_t                  offset,
-                       void                      *buffer,
+                       FAR void                  *buffer,
                        uint16_t                  len)
 {
   uint8_t addr_cntl[3];
@@ -588,7 +579,7 @@ static void w5500_read(FAR struct w5500_driver_s *self,
 static void w5500_write(FAR struct w5500_driver_s *self,
                         uint8_t                   block_select_bits,
                         off_t                     offset,
-                        const void                *data,
+                        FAR const void            *data,
                         size_t                    len)
 {
   uint8_t addr_cntl[3];
@@ -862,11 +853,11 @@ static uint16_t w5500_txbuf_copy(FAR struct w5500_driver_s *self)
   w5500_write(self,
               W5500_BSB_SOCKET_TX_BUFFER(0),
               offset,
-              self->sk_dev.d_buf,
-              self->sk_dev.d_len);
+              self->w_dev.d_buf,
+              self->w_dev.d_len);
 
   self->txbuf_wrptr = (self->txbuf_wrptr + 1) % (NUM_TXBUFS + 1);
-  self->txbuf_offset[self->txbuf_wrptr] = offset + self->sk_dev.d_len;
+  self->txbuf_offset[self->txbuf_wrptr] = offset + self->w_dev.d_len;
 
   return self->txbuf_offset[self->txbuf_wrptr];
 }
@@ -920,7 +911,7 @@ static bool w5500_txbuf_next(FAR struct w5500_driver_s *self)
 
   /* (Re-)start the TX timeout watchdog timer */
 
-  wd_start(&self->sk_txtimeout,
+  wd_start(&self->w_txtimeout,
            W5500_TXTIMEOUT,
            w5500_txtimeout_expiry,
            (wdparm_t)self);
@@ -943,7 +934,7 @@ static void w5500_fence(FAR struct w5500_driver_s *self)
 {
   self->lower->enable(self->lower, false);
   w5500_reset(self, true);  /* Reset and keep reset asserted */
-  self->sk_bifup = false;
+  self->w_bifup = false;
 }
 
 /****************************************************************************
@@ -976,8 +967,8 @@ static int w5500_unfence(FAR struct w5500_driver_s *self)
   w5500_write(self,
               W5500_BSB_COMMON_REGS,
               W5500_SHAR0, /* Source Hardware Address Register */
-              self->sk_dev.d_mac.ether.ether_addr_octet,
-              sizeof(self->sk_dev.d_mac.ether.ether_addr_octet));
+              self->w_dev.d_mac.ether.ether_addr_octet,
+              sizeof(self->w_dev.d_mac.ether.ether_addr_octet));
 
   /* Configure socket 0 for raw MAC access with MAC filtering enabled. */
 
@@ -1116,13 +1107,13 @@ static void w5500_transmit(FAR struct w5500_driver_s *self)
   if (!w5500_txbuf_numfree(self))
     {
       ninfo("Dropping Tx packet due to no buffer available.\n");
-      NETDEV_TXERRORS(self->sk_dev);
+      NETDEV_TXERRORS(self->w_dev);
       return;
     }
 
   /* Increment statistics */
 
-  NETDEV_TXPACKETS(self->sk_dev);
+  NETDEV_TXPACKETS(self->w_dev);
 
   /* Copy packet data to TX buffer */
 
@@ -1158,12 +1149,12 @@ static void w5500_transmit(FAR struct w5500_driver_s *self)
 
       /* Setup the TX timeout watchdog (perhaps restarting the timer) */
 
-      wd_start(&self->sk_txtimeout, W5500_TXTIMEOUT,
+      wd_start(&self->w_txtimeout, W5500_TXTIMEOUT,
                w5500_txtimeout_expiry, (wdparm_t)self);
     }
 
 #ifdef CONFIG_DEBUG_NET_INFO
-  ninfodumpbuffer("Transmitted:", self->sk_dev.d_buf, self->sk_dev.d_len);
+  ninfodumpbuffer("Transmitted:", self->w_dev.d_buf, self->w_dev.d_len);
 #endif
 }
 
@@ -1199,23 +1190,23 @@ static int w5500_txpoll(FAR struct net_driver_s *dev)
    * the field d_len is set to a value > 0.
    */
 
-  if (self->sk_dev.d_len > 0)
+  if (self->w_dev.d_len > 0)
     {
       /* Look up the destination MAC address and add it to the Ethernet
        * header.
        */
 
 #ifdef CONFIG_NET_IPv4
-      if (IFF_IS_IPv4(self->sk_dev.d_flags))
+      if (IFF_IS_IPv4(self->w_dev.d_flags))
         {
-          arp_out(&self->sk_dev);
+          arp_out(&self->w_dev);
         }
 #endif /* CONFIG_NET_IPv4 */
 
 #ifdef CONFIG_NET_IPv6
-      if (IFF_IS_IPv6(self->sk_dev.d_flags))
+      if (IFF_IS_IPv6(self->w_dev.d_flags))
         {
-          neighbor_out(&self->sk_dev);
+          neighbor_out(&self->w_dev);
         }
 #endif /* CONFIG_NET_IPv6 */
 
@@ -1224,7 +1215,7 @@ static int w5500_txpoll(FAR struct net_driver_s *dev)
        * don't attempt to put it on the wire.
        */
 
-      if (!devif_loopback(&self->sk_dev))
+      if (!devif_loopback(&self->w_dev))
         {
           /* Send the packet */
 
@@ -1267,27 +1258,27 @@ static int w5500_txpoll(FAR struct net_driver_s *dev)
  *
  ****************************************************************************/
 
-static void w5500_reply(struct w5500_driver_s *self)
+static void w5500_reply(FAR struct w5500_driver_s *self)
 {
   /* If the packet dispatch resulted in data that should be sent out on the
    * network, the field d_len will set to a value > 0.
    */
 
-  if (self->sk_dev.d_len > 0)
+  if (self->w_dev.d_len > 0)
     {
       /* Update the Ethernet header with the correct MAC address */
 
 #ifdef CONFIG_NET_IPv4
-      if (IFF_IS_IPv4(self->sk_dev.d_flags))
+      if (IFF_IS_IPv4(self->w_dev.d_flags))
         {
-          arp_out(&self->sk_dev);
+          arp_out(&self->w_dev);
         }
 #endif
 
 #ifdef CONFIG_NET_IPv6
-      if (IFF_IS_IPv6(self->sk_dev.d_flags))
+      if (IFF_IS_IPv6(self->w_dev.d_flags))
         {
-          neighbor_out(&self->sk_dev);
+          neighbor_out(&self->w_dev);
         }
 #endif
 
@@ -1382,19 +1373,19 @@ static void w5500_receive(FAR struct w5500_driver_s *self)
                 s0_rx_rsr);
         }
 
-      self->sk_dev.d_len = pktlen - sizeof(pktlen);
+      self->w_dev.d_len = pktlen - sizeof(pktlen);
 
-      /* Copy the data data from the hardware to priv->sk_dev.d_buf.  Set
-       * amount of data in priv->sk_dev.d_len
+      /* Copy the data data from the hardware to priv->w_dev.d_buf.  Set
+       * amount of data in priv->w_dev.d_len
        */
 
-      if (self->sk_dev.d_len <= CONFIG_NET_ETH_PKTSIZE)
+      if (self->w_dev.d_len <= CONFIG_NET_ETH_PKTSIZE)
         {
           w5500_read(self,
                      W5500_BSB_SOCKET_RX_BUFFER(0),
                      s0_rx_rd + sizeof(pktlen),
-                     self->sk_dev.d_buf,
-                     self->sk_dev.d_len);
+                     self->w_dev.d_buf,
+                     self->w_dev.d_len);
         }
 
       /* Acknowledge data reception to W5500 */
@@ -1411,41 +1402,41 @@ static void w5500_receive(FAR struct w5500_driver_s *self)
 
       /* Check for errors and update statistics */
 
-      if (self->sk_dev.d_len > CONFIG_NET_ETH_PKTSIZE ||
-          self->sk_dev.d_len < ETH_HDRLEN)
+      if (self->w_dev.d_len > CONFIG_NET_ETH_PKTSIZE ||
+          self->w_dev.d_len < ETH_HDRLEN)
         {
-          nerr("Bad packet size dropped (%"PRIu16")\n", self->sk_dev.d_len);
-          self->sk_dev.d_len = 0;
+          nerr("Bad packet size dropped (%"PRIu16")\n", self->w_dev.d_len);
+          self->w_dev.d_len = 0;
           NETDEV_RXERRORS(&priv->dev);
           continue;
         }
 
 #ifdef CONFIG_DEBUG_NET_INFO
       ninfodumpbuffer("Received Packet:",
-                      self->sk_dev.d_buf,
-                      self->sk_dev.d_len);
+                      self->w_dev.d_buf,
+                      self->w_dev.d_len);
 #endif
 
 #ifdef CONFIG_NET_PKT
       /* When packet sockets are enabled, feed the frame into the tap */
 
-      pkt_input(&self->sk_dev);
+      pkt_input(&self->w_dev);
 #endif
 
 #ifdef CONFIG_NET_IPv4
       /* Check for an IPv4 packet */
 
-      if (ETH_HDR->type == HTONS(ETHTYPE_IP))
+      if (BUF->type == HTONS(ETHTYPE_IP))
         {
           ninfo("IPv4 frame\n");
-          NETDEV_RXIPV4(&self->sk_dev);
+          NETDEV_RXIPV4(&self->w_dev);
 
           /* Handle ARP on input, then dispatch IPv4 packet to the network
            * layer.
            */
 
-          arp_ipin(&self->sk_dev);
-          ipv4_input(&self->sk_dev);
+          arp_ipin(&self->w_dev);
+          ipv4_input(&self->w_dev);
 
           /* Check for a reply to the IPv4 packet */
 
@@ -1456,14 +1447,14 @@ static void w5500_receive(FAR struct w5500_driver_s *self)
 #ifdef CONFIG_NET_IPv6
       /* Check for an IPv6 packet */
 
-      if (ETH_HDR->type == HTONS(ETHTYPE_IP6))
+      if (BUF->type == HTONS(ETHTYPE_IP6))
         {
           ninfo("IPv6 frame\n");
-          NETDEV_RXIPV6(&self->sk_dev);
+          NETDEV_RXIPV6(&self->w_dev);
 
           /* Dispatch IPv6 packet to the network layer */
 
-          ipv6_input(&self->sk_dev);
+          ipv6_input(&self->w_dev);
 
           /* Check for a reply to the IPv6 packet */
 
@@ -1474,21 +1465,21 @@ static void w5500_receive(FAR struct w5500_driver_s *self)
 #ifdef CONFIG_NET_ARP
       /* Check for an ARP packet */
 
-      if (ETH_HDR->type == HTONS(ETHTYPE_ARP))
+      if (BUF->type == HTONS(ETHTYPE_ARP))
         {
           ninfo("ARP frame\n");
 
           /* Dispatch ARP packet to the network layer */
 
-          arp_arpin(&self->sk_dev);
-          NETDEV_RXARP(&self->sk_dev);
+          arp_arpin(&self->w_dev);
+          NETDEV_RXARP(&self->w_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 (self->sk_dev.d_len > 0)
+          if (self->w_dev.d_len > 0)
             {
               w5500_transmit(self);
             }
@@ -1498,7 +1489,7 @@ static void w5500_receive(FAR struct w5500_driver_s *self)
         {
           ninfo("Dropped frame\n");
 
-          NETDEV_RXDROPPED(&self->sk_dev);
+          NETDEV_RXDROPPED(&self->w_dev);
         }
     }
   while (true); /* While there are more packets to be processed */
@@ -1530,7 +1521,7 @@ static void w5500_txdone(FAR struct w5500_driver_s *self)
 {
   /* Check for errors and update statistics */
 
-  NETDEV_TXDONE(self->sk_dev);
+  NETDEV_TXDONE(self->w_dev);
 
   /* Check if there are pending transmissions. */
 
@@ -1542,7 +1533,7 @@ static void w5500_txdone(FAR struct w5500_driver_s *self)
        * and disable further Tx interrupts.
        */
 
-      wd_cancel(&self->sk_txtimeout);
+      wd_cancel(&self->w_txtimeout);
 
       /* And disable further TX interrupts. */
 
@@ -1553,7 +1544,7 @@ static void w5500_txdone(FAR struct w5500_driver_s *self)
 
   /* In any event, poll the network for new TX data */
 
-  devif_poll(&self->sk_dev, w5500_txpoll);
+  devif_poll(&self->w_dev, w5500_txpoll);
 }
 
 /****************************************************************************
@@ -1710,7 +1701,7 @@ static int w5500_interrupt(int irq, FAR void *context, FAR void *arg)
 
   /* Schedule to perform the interrupt processing on the worker thread. */
 
-  work_queue(ETHWORK, &self->sk_irqwork, w5500_interrupt_work, self, 0);
+  work_queue(ETHWORK, &self->w_irqwork, w5500_interrupt_work, self, 0);
   return OK;
 }
 
@@ -1742,7 +1733,7 @@ static void w5500_txtimeout_work(FAR void *arg)
 
   /* Increment statistics and dump debug info */
 
-  NETDEV_TXTIMEOUTS(self->sk_dev);
+  NETDEV_TXTIMEOUTS(self->w_dev);
 
   /* Then reset the hardware */
 
@@ -1752,7 +1743,7 @@ static void w5500_txtimeout_work(FAR void *arg)
 
       /* Then poll the network for new XMIT data */
 
-      devif_poll(&self->sk_dev, w5500_txpoll);
+      devif_poll(&self->w_dev, w5500_txpoll);
     }
 
   net_unlock();
@@ -1790,7 +1781,7 @@ static void w5500_txtimeout_expiry(wdparm_t arg)
 
   /* Schedule to perform the TX timeout processing on the worker thread. */
 
-  work_queue(ETHWORK, &self->sk_irqwork, w5500_txtimeout_work, self, 0);
+  work_queue(ETHWORK, &self->w_irqwork, w5500_txtimeout_work, self, 0);
 }
 
 /****************************************************************************
@@ -1848,7 +1839,7 @@ static int w5500_ifup(FAR struct net_driver_s *dev)
 
   /* Enable the Ethernet interrupt */
 
-  self->sk_bifup = true;
+  self->w_bifup = true;
   self->lower->enable(self->lower, true);
 
   return OK;
@@ -1884,7 +1875,7 @@ static int w5500_ifdown(FAR struct net_driver_s *dev)
 
   /* Cancel the TX timeout timer */
 
-  wd_cancel(&self->sk_txtimeout);
+  wd_cancel(&self->w_txtimeout);
 
   /* Put the EMAC in its reset, non-operational state.  This should be
    * a known configuration that will guarantee the w5500_ifup() always
@@ -1895,7 +1886,7 @@ static int w5500_ifdown(FAR struct net_driver_s *dev)
 
   /* Mark the device "down" */
 
-  self->sk_bifup = false;
+  self->w_bifup = false;
   leave_critical_section(flags);
   return OK;
 }
@@ -1931,13 +1922,13 @@ static void w5500_txavail_work(FAR void *arg)
 
   /* Ignore the notification if the interface is not yet up */
 
-  if (priv->sk_bifup)
+  if (priv->w_bifup)
     {
       /* Check if there is room in the hardware to hold another packet. */
 
       /* If so, then poll the network for new XMIT data */
 
-      devif_poll(&priv->sk_dev, w5500_txpoll);
+      devif_poll(&priv->w_dev, w5500_txpoll);
     }
 
   net_unlock();
@@ -1972,11 +1963,11 @@ static int w5500_txavail(FAR struct net_driver_s *dev)
    * availability action.
    */
 
-  if (work_available(&priv->sk_pollwork))
+  if (work_available(&priv->w_pollwork))
     {
       /* Schedule to serialize the poll on the worker thread. */
 
-      work_queue(ETHWORK, &priv->sk_pollwork, w5500_txavail_work, priv, 0);
+      work_queue(ETHWORK, &priv->w_pollwork, w5500_txavail_work, priv, 0);
     }
 
   return OK;
@@ -2131,11 +2122,10 @@ static void w5500_ipv6multicast(FAR struct w5500_driver_s *priv)
 
 #ifdef CONFIG_NETDEV_IOCTL
 static int w5500_ioctl(FAR struct net_driver_s *dev, int cmd,
-                      unsigned long arg)
+                       unsigned long arg)
 {
   FAR struct w5500_driver_s *priv =
     (FAR struct w5500_driver_s *)dev->d_private;
-  int ret;
 
   /* Decode and dispatch the driver-specific IOCTL command */
 
@@ -2200,30 +2190,30 @@ int w5500_initialize(FAR struct spi_dev_s *spi_dev,
   /* Initialize the driver structure */
 
   memset(self, 0, sizeof(struct w5500_driver_s));
-  self->sk_dev.d_buf     = g_pktbuf;       /* Single packet buffer */
-  self->sk_dev.d_ifup    = w5500_ifup;     /* I/F up (new IP address) callback */
-  self->sk_dev.d_ifdown  = w5500_ifdown;   /* I/F down callback */
-  self->sk_dev.d_txavail = w5500_txavail;  /* New TX data callback */
+  self->w_dev.d_buf     = (FAR uint8_t *)g_pktbuf[devno]; /* Single packet buffer */
+  self->w_dev.d_ifup    = w5500_ifup;                     /* I/F up (new IP address) callback */
+  self->w_dev.d_ifdown  = w5500_ifdown;                   /* I/F down callback */
+  self->w_dev.d_txavail = w5500_txavail;                  /* New TX data callback */
 #ifdef CONFIG_NET_MCASTGROUP
-  self->sk_dev.d_addmac  = w5500_addmac;   /* Add multicast MAC address */
-  self->sk_dev.d_rmmac   = w5500_rmmac;    /* Remove multicast MAC address */
+  self->w_dev.d_addmac  = w5500_addmac;                   /* Add multicast MAC address */
+  self->w_dev.d_rmmac   = w5500_rmmac;                    /* Remove multicast MAC address */
 #endif
 #ifdef CONFIG_NETDEV_IOCTL
-  self->sk_dev.d_ioctl   = w5500_ioctl;    /* Handle network IOCTL commands */
+  self->w_dev.d_ioctl   = w5500_ioctl;                    /* Handle network IOCTL commands */
 #endif
-  self->sk_dev.d_private = g_w5500;        /* Used to recover private state from dev */
-  self->spi_dev          = spi_dev;        /* SPI hardware interconnect */
-  self->lower            = lower;          /* Low-level MCU specific support */
+  self->w_dev.d_private = g_w5500;                        /* Used to recover private state from dev */
+  self->spi_dev         = spi_dev;                        /* SPI hardware interconnect */
+  self->lower           = lower;                          /* Low-level MCU specific support */
 
   /* Put the interface in the down state.  This usually amounts to resetting
    * the device and/or calling w5500_ifdown().
    */
 
-  w5500_ifdown(&self->sk_dev);
+  w5500_ifdown(&self->w_dev);
 
   /* Register the device with the OS so that socket IOCTLs can be performed */
 
-  netdev_register(&self->sk_dev, NET_LL_ETHERNET);
+  netdev_register(&self->w_dev, NET_LL_ETHERNET);
   return OK;
 }
 
diff --git a/drivers/usbhost/usbhost_cdcmbim.c b/drivers/usbhost/usbhost_cdcmbim.c
index 2aeeb9b39b..c7e1c7c528 100644
--- a/drivers/usbhost/usbhost_cdcmbim.c
+++ b/drivers/usbhost/usbhost_cdcmbim.c
@@ -229,7 +229,7 @@ struct usbhost_cdcmbim_s
 
   bool                    bifup;        /* true:ifup false:ifdown */
   struct net_driver_s     netdev;       /* Interface understood by the network */
-  uint8_t                 txpktbuf[MAX_NETDEV_PKTSIZE];
+  uint16_t                txpktbuf[(MAX_NETDEV_PKTSIZE + 1) / 2];
 };
 
 /****************************************************************************
@@ -2331,7 +2331,7 @@ static int cdcmbim_txpoll(struct net_driver_s *dev)
    * the field d_len is set to a value > 0.
    */
 
-  DEBUGASSERT(priv->netdev.d_buf == priv->txpktbuf);
+  DEBUGASSERT(priv->netdev.d_buf == (FAR uint8_t *)priv->txpktbuf);
 
   usbhost_takesem(&priv->exclsem);
 
@@ -2460,7 +2460,7 @@ static void cdcmbim_txavail_work(void *arg)
 
   net_lock();
 
-  priv->netdev.d_buf = priv->txpktbuf;
+  priv->netdev.d_buf = (FAR uint8_t *)priv->txpktbuf;
 
   if (priv->bifup)
     {
diff --git a/net/pkt/pkt_input.c b/net/pkt/pkt_input.c
index 21638cead1..d84946be51 100644
--- a/net/pkt/pkt_input.c
+++ b/net/pkt/pkt_input.c
@@ -39,7 +39,7 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
-#define PKTBUF ((FAR struct eth_hdr_s *)&dev->d_buf)
+#define PKTBUF ((FAR struct eth_hdr_s *)dev->d_buf)
 
 /****************************************************************************
  * Public Functions
@@ -68,7 +68,7 @@
 int pkt_input(struct net_driver_s *dev)
 {
   FAR struct pkt_conn_s *conn;
-  FAR struct eth_hdr_s  *pbuf = (FAR struct eth_hdr_s *)dev->d_buf;
+  FAR struct eth_hdr_s  *pbuf = PKTBUF;
   int ret = OK;
 
   conn = pkt_active(pbuf);