bcmf: register network driver + update defconfig file

This commit is contained in:
Simon Piriou 2017-04-24 20:04:47 +02:00
parent d72f36948e
commit a23ac02959
7 changed files with 297 additions and 165 deletions

View File

@ -65,7 +65,11 @@ CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_GRAPHICS is not set
# CONFIG_DEBUG_LIB is not set
# CONFIG_DEBUG_MM is not set
# CONFIG_DEBUG_WIRELESS is not set
# CONFIG_DEBUG_NET is not set
CONFIG_DEBUG_WIRELESS=y
CONFIG_DEBUG_WIRELESS_ERROR=y
CONFIG_DEBUG_WIRELESS_WARN=y
CONFIG_DEBUG_WIRELESS_INFO=y
# CONFIG_DEBUG_SCHED is not set
#
@ -78,10 +82,7 @@ CONFIG_DEBUG_INFO=y
#
# CONFIG_DEBUG_LEDS is not set
# CONFIG_DEBUG_GPIO is not set
CONFIG_DEBUG_MEMCARD=y
CONFIG_DEBUG_MEMCARD_ERROR=y
CONFIG_DEBUG_MEMCARD_WARN=y
CONFIG_DEBUG_MEMCARD_INFO=y
# CONFIG_DEBUG_MEMCARD is not set
# CONFIG_DEBUG_TIMER is not set
# CONFIG_DEBUG_WATCHDOG is not set
CONFIG_ARCH_HAVE_STACKCHECK=y
@ -859,6 +860,26 @@ CONFIG_SDIO_BLOCKSETUP=y
# CONFIG_MODEM is not set
# CONFIG_MTD is not set
# CONFIG_EEPROM is not set
CONFIG_NETDEVICES=y
#
# General Ethernet MAC Driver Options
#
# CONFIG_NETDEV_LOOPBACK is not set
# CONFIG_NETDEV_MULTINIC is not set
# CONFIG_ARCH_HAVE_NETDEV_STATISTICS is not set
CONFIG_NETDEV_LATEINIT=y
# CONFIG_NET_DUMPPACKET is not set
#
# External Ethernet MAC Device Support
#
# CONFIG_NET_DM90x0 is not set
# CONFIG_NET_CS89x0 is not set
# CONFIG_ENC28J60 is not set
# CONFIG_ENCX24J600 is not set
# CONFIG_NET_SLIP is not set
# CONFIG_NET_FTMAC100 is not set
# CONFIG_PIPES is not set
# CONFIG_PM is not set
# CONFIG_POWER is not set
@ -926,6 +947,8 @@ CONFIG_DRIVERS_IEEE80211=y
CONFIG_IEEE80211_BROADCOM_FULLMAC=y
CONFIG_IEEE80211_BROADCOM_BCM43362=y
CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO=y
CONFIG_IEEE80211_BROADCOM_HPWORK=y
CONFIG_IEEE80211_BROADCOM_NINTERFACES=1
# CONFIG_WL_NRF24L01 is not set
# CONFIG_DRIVERS_CONTACTLESS is not set
@ -946,9 +969,100 @@ CONFIG_SYSLOG_CONSOLE=y
#
# Networking Support
#
# CONFIG_ARCH_HAVE_NET is not set
CONFIG_ARCH_HAVE_NET=y
# CONFIG_ARCH_HAVE_PHY is not set
# CONFIG_NET is not set
CONFIG_NET=y
# CONFIG_NET_PROMISCUOUS is not set
#
# Driver buffer configuration
#
CONFIG_NET_ETH_MTU=590
CONFIG_NET_GUARDSIZE=2
#
# Data link support
#
# CONFIG_NET_MULTILINK is not set
# CONFIG_NET_USER_DEVFMT is not set
CONFIG_NET_ETHERNET=y
# CONFIG_NET_LOOPBACK is not set
# CONFIG_NET_TUN is not set
# CONFIG_NET_USRSOCK is not set
#
# Network Device Operations
#
# CONFIG_NETDEV_IOCTL is not set
# CONFIG_NETDEV_PHY_IOCTL is not set
# CONFIG_NETDEV_WIRELESS_IOCTL is not set
#
# Internet Protocol Selection
#
CONFIG_NET_IPv4=y
# CONFIG_NET_IPv6 is not set
#
# Socket Support
#
CONFIG_NSOCKET_DESCRIPTORS=8
CONFIG_NET_NACTIVESOCKETS=16
# CONFIG_NET_SOCKOPTS is not set
#
# Raw Socket Support
#
# CONFIG_NET_PKT is not set
#
# Unix Domain Socket Support
#
# CONFIG_NET_LOCAL is not set
#
# TCP/IP Networking
#
# CONFIG_NET_TCP is not set
# CONFIG_NET_TCP_NO_STACK is not set
#
# UDP Networking
#
# CONFIG_NET_UDP is not set
# CONFIG_NET_UDP_NO_STACK is not set
#
# ICMP Networking Support
#
# CONFIG_NET_ICMP is not set
#
# IGMPv2 Client Support
#
# CONFIG_NET_IGMP is not set
#
# ARP Configuration
#
CONFIG_NET_ARP=y
CONFIG_NET_ARPTAB_SIZE=16
CONFIG_NET_ARP_MAXAGE=120
# CONFIG_NET_ARP_IPIN is not set
# CONFIG_NET_ARP_SEND is not set
#
# User-space networking stack API
#
# CONFIG_NET_ARCH_INCR32 is not set
# CONFIG_NET_ARCH_CHKSUM is not set
# CONFIG_NET_STATISTICS is not set
#
# Routing Table Configuration
#
# CONFIG_NET_ROUTE is not set
CONFIG_NET_HOSTNAME=""
#
# Crypto API
@ -986,6 +1100,7 @@ CONFIG_FS_PROCFS=y
# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set
# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set
# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS is not set
# CONFIG_FS_PROCFS_EXCLUDE_NET is not set
# CONFIG_FS_UNIONFS is not set
#
@ -1109,9 +1224,8 @@ CONFIG_ARCH_HAVE_TLS=y
#
# Network-Related Options
#
# CONFIG_LIBC_IPv4_ADDRCONV is not set
# CONFIG_LIBC_IPv6_ADDRCONV is not set
# CONFIG_LIBC_NETDB is not set
CONFIG_LIBC_NETDB=y
#
# NETDB Support
@ -1259,6 +1373,7 @@ CONFIG_EXAMPLES_NSH=y
# CONFIG_NETUTILS_ESP8266 is not set
# CONFIG_NETUTILS_FTPC is not set
# CONFIG_NETUTILS_JSON is not set
CONFIG_NETUTILS_NETLIB=y
# CONFIG_NETUTILS_SMTP is not set
#
@ -1285,6 +1400,7 @@ CONFIG_NSH_BUILTIN_APPS=y
# Disable Individual commands
#
# CONFIG_NSH_DISABLE_ADDROUTE is not set
# CONFIG_NSH_DISABLE_ARP is not set
# CONFIG_NSH_DISABLE_BASENAME is not set
# CONFIG_NSH_DISABLE_CAT is not set
# CONFIG_NSH_DISABLE_CD is not set
@ -1358,6 +1474,26 @@ CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_CONSOLE=y
# CONFIG_NSH_ALTCONDEV is not set
CONFIG_NSH_ARCHINIT=y
#
# Networking Configuration
#
CONFIG_NSH_NETINIT=y
# CONFIG_NSH_NETINIT_THREAD is not set
# CONFIG_NSH_NETINIT_DEBUG is not set
#
# IP Address Configuration
#
#
# IPv4 Addresses
#
CONFIG_NSH_IPADDR=0x0a000002
CONFIG_NSH_DRIPADDR=0x0a000001
CONFIG_NSH_NETMASK=0xffffff00
# CONFIG_NSH_NOMAC is not set
CONFIG_NSH_MAX_ROUNDTRIP=20
# CONFIG_NSH_LOGIN is not set
# CONFIG_NSH_CONSOLE_LOGIN is not set
@ -1375,6 +1511,7 @@ CONFIG_NSH_ARCHINIT=y
# CONFIG_SYSTEM_HEX2BIN is not set
# CONFIG_SYSTEM_HEXED is not set
# CONFIG_SYSTEM_INSTALL is not set
# CONFIG_SYSTEM_NETDB is not set
# CONFIG_SYSTEM_RAMTEST is not set
CONFIG_READLINE_HAVE_EXTMATCH=y
CONFIG_SYSTEM_READLINE=y
@ -1387,3 +1524,8 @@ CONFIG_READLINE_ECHO=y
# CONFIG_SYSTEM_UBLOXMODEM is not set
# CONFIG_SYSTEM_VI is not set
# CONFIG_SYSTEM_ZMODEM is not set
#
# Wireless Libraries and NSH Add-Ons
#
# CONFIG_WIRELESS_WAPI is not set

View File

@ -44,6 +44,7 @@ ifeq ($(CONFIG_IEEE80211_BROADCOM_FULLMAC),y)
CSRCS += bcmf_driver.c
CSRCS += bcmf_cdc.c
CSRCS += bcmf_utils.c
CSRCS += bcmf_netdev.c
ifeq ($(CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO),y)
CSRCS += mmc_sdio.c

View File

@ -65,9 +65,9 @@ const struct bcmf_sdio_chip bcmf_43362_config_sdio = {
// TODO find something smarter than using image_len references
.firmware_image = bcm43362_firmware_image,
.firmware_image = (uint8_t*)bcm43362_firmware_image,
.firmware_image_size = (unsigned int*)&bcm43362_firmware_image_len,
.nvram_image = bcm43362_nvram_image,
.nvram_image = (uint8_t*)bcm43362_nvram_image,
.nvram_image_size = (unsigned int*)&bcm43362_nvram_image_len
};

View File

@ -45,6 +45,8 @@
#include <debug.h>
#include <errno.h>
#include <net/ethernet.h>
#include <nuttx/kmalloc.h>
#include "bcmf_driver.h"
@ -64,11 +66,6 @@
#define WL_SCAN_UNASSOC_TIME 40
#define WL_SCAN_PASSIVE_TIME 120
/* Chip interfaces */
#define CHIP_STA_INTERFACE 0
#define CHIP_AP_INTERFACE 1
#define CHIP_P2P_INTERFACE 2
/****************************************************************************
* Private Types
****************************************************************************/
@ -80,6 +77,11 @@
static FAR struct bcmf_dev_s* bcmf_allocate_device(void);
static void bcmf_free_device(FAR struct bcmf_dev_s *priv);
static int bcmf_driver_initialize(FAR struct bcmf_dev_s *priv);
// FIXME add bcmf_netdev.h file
int bcmf_netdev_register(FAR struct bcmf_dev_s *priv);
#if 0
static int bcmf_run_escan(FAR struct bcmf_dev_s *priv);
#endif
@ -154,30 +156,11 @@ int bcmf_wl_set_mac_address(FAR struct bcmf_dev_s *priv, uint8_t *addr)
wlinfo("MAC address updated %02X:%02X:%02X:%02X:%02X:%02X\n",
addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]);
memcpy(priv->mac_addr, addr, 6);
memcpy(priv->bc_dev.d_mac.ether.ether_addr_octet, addr, ETHER_ADDR_LEN);
return OK;
}
int bcmf_wl_enable(FAR struct bcmf_dev_s *priv, bool enable)
{
int ret;
uint32_t out_len;
/* TODO chek device state */
out_len = 0;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
enable ? WLC_UP : WLC_DOWN, NULL, &out_len);
if (ret == OK)
{
/* TODO update device state */
}
return ret;
}
int bcmf_dongle_scantime(FAR struct bcmf_dev_s *priv, int32_t scan_assoc_time,
int32_t scan_unassoc_time, int32_t scan_passive_time)
{
@ -220,8 +203,6 @@ int bcmf_dongle_scantime(FAR struct bcmf_dev_s *priv, int32_t scan_assoc_time,
int bcmf_dongle_initialize(FAR struct bcmf_dev_s *priv)
{
int ret;
uint32_t out_len;
uint32_t value;
ret = bcmf_wl_enable(priv, true);
if (ret)
@ -236,36 +217,6 @@ int bcmf_dongle_initialize(FAR struct bcmf_dev_s *priv)
return ret;
}
/* FIXME disable power save mode */
out_len = 4;
value = 0;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
WLC_SET_PM, (uint8_t*)&value, &out_len);
if (ret != OK)
{
return ret;
}
/* Set the GMode */
out_len = 4;
value = GMODE_AUTO;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
WLC_SET_GMODE, (uint8_t*)&value, &out_len);
if (ret != OK)
{
return ret;
}
/* TODO configure roaming if needed. Disable for now */
out_len = 4;
value = 1;
ret = bcmf_cdc_iovar_request(priv, CHIP_STA_INTERFACE, true,
IOVAR_STR_ROAM_OFF, (uint8_t*)&value,
&out_len);
// FIXME remove
#if 0
/* Try scan */
@ -330,14 +281,10 @@ int bcmf_run_escan(FAR struct bcmf_dev_s *priv)
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
int bcmf_driver_initialize(FAR struct bcmf_dev_s *priv)
{
int ret;
uint32_t out_len;
uint32_t out_len, value;
uint8_t tmp_buf[64];
/* Disable TX Gloming feature */
@ -352,22 +299,35 @@ int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
return -EIO;
}
/* Query MAC address */
/* FIXME disable power save mode */
out_len = 6;
ret = bcmf_cdc_iovar_request(priv, CHIP_STA_INTERFACE, false,
IOVAR_STR_CUR_ETHERADDR, tmp_buf,
&out_len);
out_len = 4;
value = 0;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
WLC_SET_PM, (uint8_t*)&value, &out_len);
if (ret != OK)
{
return -EIO;
return ret;
}
memcpy(priv->mac_addr, tmp_buf, 6);
/* Set the GMode to auto */
wlinfo("MAC address is %02X:%02X:%02X:%02X:%02X:%02X\n",
tmp_buf[0], tmp_buf[1], tmp_buf[2],
tmp_buf[3], tmp_buf[4], tmp_buf[5]);
out_len = 4;
value = GMODE_AUTO;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
WLC_SET_GMODE, (uint8_t*)&value, &out_len);
if (ret != OK)
{
return ret;
}
/* TODO configure roaming if needed. Disable for now */
out_len = 4;
value = 1;
ret = bcmf_cdc_iovar_request(priv, CHIP_STA_INTERFACE, true,
IOVAR_STR_ROAM_OFF, (uint8_t*)&value,
&out_len);
/* Query firmware version string */
@ -402,11 +362,16 @@ int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
{
return -EIO;
}
// TODO Create a wlan device name and register network driver
return bcmf_dongle_initialize(priv);
/* Register network driver */
return bcmf_netdev_register(priv);
}
/****************************************************************************
* Public Functions
****************************************************************************/
int bcmf_sdio_initialize(int minor, FAR struct sdio_dev_s *dev)
{
int ret;
@ -431,9 +396,28 @@ int bcmf_sdio_initialize(int minor, FAR struct sdio_dev_s *dev)
/* Bus initialized, register network driver */
return bcmf_wl_initialize(priv);
return bcmf_driver_initialize(priv);
exit_free_device:
bcmf_free_device(priv);
return ret;
}
int bcmf_wl_enable(FAR struct bcmf_dev_s *priv, bool enable)
{
int ret;
uint32_t out_len;
/* TODO chek device state */
out_len = 0;
ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
enable ? WLC_UP : WLC_DOWN, NULL, &out_len);
if (ret == OK)
{
/* TODO update device state */
}
return ret;
}

View File

@ -40,11 +40,15 @@
#include <stdint.h>
#include <semaphore.h>
#define BCMF_STATUS_BUS_UP (1<<0) /* Chip is flashed and running */
#define BCMF_STATUS_READY (1<<1) /* Chip is ready to receive requests */
#include <nuttx/net/netdev.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#define BCMF_STATUS_SLEEP (1<<2) /* Chip is in low power mode */
#define BCMF_STATUS_WAIT_CONTROL (1<<3) /* Waiting for control response */
/* Chip interfaces */
#define CHIP_STA_INTERFACE 0
#define CHIP_AP_INTERFACE 1
#define CHIP_P2P_INTERFACE 2
struct bcmf_bus_dev_s;
struct bcmf_frame_s;
@ -53,7 +57,18 @@ struct bcmf_frame_s;
struct bcmf_dev_s
{
FAR struct bcmf_bus_dev_s *bus; /* Bus interface structure */
FAR struct bcmf_bus_dev_s *bus; /* Bus interface structure */
bool bc_bifup; /* true:ifup false:ifdown */
WDOG_ID bc_txpoll; /* TX poll timer */
WDOG_ID bc_txtimeout; /* TX timeout timer */
struct work_s bc_irqwork; /* For deferring interrupt work to the work queue */
struct work_s bc_pollwork; /* For deferring poll work to the work queue */
/* This holds the information visible to the NuttX network */
struct net_driver_s bc_dev; /* Network interface structure */
// FIXME use mutex instead of semaphore
sem_t control_mutex; /* Cannot handle multiple control requests */
@ -62,8 +77,6 @@ struct bcmf_dev_s
uint16_t control_rxdata_len; /* Received control frame out buffer length */
uint8_t *control_rxdata; /* Received control frame out buffer */
uint32_t control_status; /* Last received frame status */
uint8_t mac_addr[6]; /* Current mac address */
};
/* Default bus interface structure */
@ -89,13 +102,6 @@ struct bcmf_frame_s {
unsigned int len; /* Frame buffer size */
};
/* Notify driver frame is available */
void bcmf_notify_rxframe(FAR struct bcmf_dev_s *priv,
struct bcmf_frame_s *frame);
/* Notify driver bus is ready */
int brcmf_bus_start(FAR struct bcmf_dev_s *priv);
int bcmf_wl_enable(FAR struct bcmf_dev_s *priv, bool enable);
#endif /* __DRIVERS_WIRELESS_IEEE80211_BCMF_DRIVER_H */

View File

@ -49,7 +49,7 @@ extern "C" {
typedef uint16_t wl_chanspec_t;
typedef uint16_t chanspec_t;
#define ETHER_ADDR_LEN 6
typedef struct ether_addr
typedef struct ether_addr_dup
{
uint8_t octet[ETHER_ADDR_LEN];
} wl_ether_addr_t;

View File

@ -61,6 +61,10 @@
# include <nuttx/net/pkt.h>
#endif
#include "bcmf_driver.h"
#include "bcmf_cdc.h"
#include "bcmf_ioctl.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
@ -108,23 +112,6 @@
* Private Types
****************************************************************************/
/* The bcmf_driver_s encapsulates all state information for a single hardware
* interface
*/
struct bcmf_driver_s
{
bool bc_bifup; /* true:ifup false:ifdown */
WDOG_ID bc_txpoll; /* TX poll timer */
WDOG_ID bc_txtimeout; /* TX timeout timer */
struct work_s bc_irqwork; /* For deferring interupt work to the work queue */
struct work_s bc_pollwork; /* For deferring poll work to the work queue */
/* This holds the information visible to the NuttX network */
struct net_driver_s bc_dev; /* Interface understood by the network */
};
/****************************************************************************
* Private Data
****************************************************************************/
@ -144,23 +131,19 @@ struct bcmf_driver_s
static uint8_t g_pktbuf[MAX_NET_DEV_MTU + CONFIG_NET_GUARDSIZE];
/* Driver state structure */
static struct bcmf_driver_s g_bcmf_interface[CONFIG_IEEE80211_BROADCOM_NINTERFACES];
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/* Common TX logic */
static int bcmf_transmit(FAR struct bcmf_driver_s *priv);
static int bcmf_transmit(FAR struct bcmf_dev_s *priv);
static int bcmf_txpoll(FAR struct net_driver_s *dev);
/* Interrupt handling */
static void bcmf_receive(FAR struct bcmf_driver_s *priv);
static void bcmf_txdone(FAR struct bcmf_driver_s *priv);
static void bcmf_receive(FAR struct bcmf_dev_s *priv);
static void bcmf_txdone(FAR struct bcmf_dev_s *priv);
static void bcmf_interrupt_work(FAR void *arg);
static int bcmf_interrupt(int irq, FAR void *context, FAR void *arg);
@ -189,7 +172,7 @@ static int bcmf_rmmac(FAR struct net_driver_s *dev,
FAR const uint8_t *mac);
#endif
#ifdef CONFIG_NET_ICMPv6
static void bcmf_ipv6multicast(FAR struct bcmf_driver_s *priv);
static void bcmf_ipv6multicast(FAR struct bcmf_dev_s *priv);
#endif
#endif
#ifdef CONFIG_NETDEV_IOCTL
@ -220,7 +203,7 @@ static int bcmf_ioctl(FAR struct net_driver_s *dev, int cmd,
*
****************************************************************************/
static int bcmf_transmit(FAR struct bcmf_driver_s *priv)
static int bcmf_transmit(FAR struct bcmf_dev_s *priv)
{
/* Verify that the hardware is ready to send another packet. If we get
* here, then we are committed to sending a packet; Higher level logic
@ -268,7 +251,7 @@ static int bcmf_transmit(FAR struct bcmf_driver_s *priv)
static int bcmf_txpoll(FAR struct net_driver_s *dev)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
/* If the polling resulted in data that should be sent out on the network,
* the field d_len is set to a value > 0.
@ -331,7 +314,7 @@ static int bcmf_txpoll(FAR struct net_driver_s *dev)
*
****************************************************************************/
static void bcmf_receive(FAR struct bcmf_driver_s *priv)
static void bcmf_receive(FAR struct bcmf_dev_s *priv)
{
do
{
@ -453,7 +436,7 @@ static void bcmf_receive(FAR struct bcmf_driver_s *priv)
NETDEV_RXDROPPED(&priv->bc_dev);
}
}
while (); /* While there are more packets to be processed */
while (1); /* While there are more packets to be processed */
}
/****************************************************************************
@ -473,7 +456,7 @@ static void bcmf_receive(FAR struct bcmf_driver_s *priv)
*
****************************************************************************/
static void bcmf_txdone(FAR struct bcmf_driver_s *priv)
static void bcmf_txdone(FAR struct bcmf_dev_s *priv)
{
int delay;
@ -515,7 +498,7 @@ static void bcmf_txdone(FAR struct bcmf_driver_s *priv)
static void bcmf_interrupt_work(FAR void *arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
@ -566,7 +549,7 @@ static void bcmf_interrupt_work(FAR void *arg)
static int bcmf_interrupt(int irq, FAR void *context, FAR void *arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
DEBUGASSERT(priv != NULL);
@ -612,7 +595,7 @@ static int bcmf_interrupt(int irq, FAR void *context, FAR void *arg)
static void bcmf_txtimeout_work(FAR void *arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
@ -655,7 +638,7 @@ static void bcmf_txtimeout_work(FAR void *arg)
static void bcmf_txtimeout_expiry(int argc, wdparm_t arg, ...)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Disable further Ethernet interrupts. This will prevent some race
* conditions with interrupt work. There is still a potential race
@ -685,7 +668,7 @@ static void bcmf_txtimeout_expiry(int argc, wdparm_t arg, ...)
*
****************************************************************************/
static inline void bcmf_poll_process(FAR struct bcmf_driver_s *priv)
static inline void bcmf_poll_process(FAR struct bcmf_dev_s *priv)
{
}
@ -708,7 +691,7 @@ static inline void bcmf_poll_process(FAR struct bcmf_driver_s *priv)
static void bcmf_poll_work(FAR void *arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
@ -758,7 +741,7 @@ static void bcmf_poll_work(FAR void *arg)
static void bcmf_poll_expiry(int argc, wdparm_t arg, ...)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
@ -784,7 +767,7 @@ static void bcmf_poll_expiry(int argc, wdparm_t arg, ...)
static int bcmf_ifup(FAR struct net_driver_s *dev)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
#ifdef CONFIG_NET_IPv4
ninfo("Bringing up: %d.%d.%d.%d\n",
@ -838,7 +821,7 @@ static int bcmf_ifup(FAR struct net_driver_s *dev)
static int bcmf_ifdown(FAR struct net_driver_s *dev)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
irqstate_t flags;
/* Disable the hardware interrupt */
@ -882,7 +865,7 @@ static int bcmf_ifdown(FAR struct net_driver_s *dev)
static void bcmf_txavail_work(FAR void *arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)arg;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
@ -927,7 +910,7 @@ static void bcmf_txavail_work(FAR void *arg)
static int bcmf_txavail(FAR struct net_driver_s *dev)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
/* Is our single work structure available? It may not be if there are
* pending interrupt actions and we will have to ignore the Tx
@ -965,7 +948,7 @@ static int bcmf_txavail(FAR struct net_driver_s *dev)
#if defined(CONFIG_NET_IGMP) || defined(CONFIG_NET_ICMPv6)
static int bcmf_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
/* Add the MAC address to the hardware multicast routing table */
@ -994,7 +977,7 @@ static int bcmf_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac)
#ifdef CONFIG_NET_IGMP
static int bcmf_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
/* Add the MAC address to the hardware multicast routing table */
@ -1019,7 +1002,7 @@ static int bcmf_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac)
****************************************************************************/
#ifdef CONFIG_NET_ICMPv6
static void bcmf_ipv6multicast(FAR struct bcmf_driver_s *priv)
static void bcmf_ipv6multicast(FAR struct bcmf_dev_s *priv)
{
FAR struct net_driver_s *dev;
uint16_t tmp16;
@ -1098,7 +1081,7 @@ static void bcmf_ipv6multicast(FAR struct bcmf_driver_s *priv)
static int bcmf_ioctl(FAR struct net_driver_s *dev, int cmd,
unsigned long arg)
{
FAR struct bcmf_driver_s *priv = (FAR struct bcmf_driver_s *)dev->d_private;
FAR struct bcmf_dev_s *priv = (FAR struct bcmf_dev_s *)dev->d_private;
int ret;
/* Decode and dispatch the driver-specific IOCTL command */
@ -1124,11 +1107,10 @@ static int bcmf_ioctl(FAR struct net_driver_s *dev, int cmd,
* Name: bcmf_netdev_register
*
* Description:
* Initialize the Broadcom 43362 controller and driver
* Register a network driver and set Broadcom chip in a proper state
*
* Parameters:
* intf - In the case where there are multiple EMACs, this value
* identifies which EMAC is to be initialized.
* priv - Broadcom driver device
*
* Returned Value:
* OK on success; Negated errno on failure.
@ -1137,21 +1119,14 @@ static int bcmf_ioctl(FAR struct net_driver_s *dev, int cmd,
*
****************************************************************************/
int bcmf_netdev_register(int intf)
int bcmf_netdev_register(FAR struct bcmf_dev_s *priv)
{
FAR struct bcmf_driver_s *priv;
int ret;
uint32_t out_len;
/* Get the interface structure associated with this interface number. */
/* Initialize network driver structure */
DEBUGASSERT(intf < CONFIG_IEEE80211_BROADCOM_NINTERFACES);
priv = &g_bcmf_interface[intf];
/* Attach the IRQ to the driver */
#warning Missing logic
/* Initialize the driver structure */
memset(priv, 0, sizeof(struct bcmf_driver_s));
memset(&priv->bc_dev, 0, sizeof(priv->bc_dev));
priv->bc_dev.d_buf = g_pktbuf; /* Single packet buffer */
priv->bc_dev.d_ifup = bcmf_ifup; /* I/F up (new IP address) callback */
priv->bc_dev.d_ifdown = bcmf_ifdown; /* I/F down callback */
@ -1163,7 +1138,7 @@ int bcmf_netdev_register(int intf)
#ifdef CONFIG_NETDEV_IOCTL
priv->bc_dev.d_ioctl = bcmf_ioctl; /* Handle network IOCTL commands */
#endif
priv->bc_dev.d_private = (FAR void *)g_bcmf_interface; /* Used to recover private state from dev */
priv->bc_dev.d_private = (FAR void *)priv; /* Used to recover private state from dev */
/* Create a watchdog for timing polling for and timing of transmisstions */
@ -1176,7 +1151,31 @@ int bcmf_netdev_register(int intf)
* the device and/or calling bcmf_ifdown().
*/
/* Read the MAC address from the hardware into priv->bc_dev.d_mac.ether.ether_addr_octet */
ret = bcmf_wl_enable(priv, false);
if (ret != OK)
{
return -EIO;
}
/* Query MAC address */
out_len = ETHER_ADDR_LEN;
ret = bcmf_cdc_iovar_request(priv, CHIP_STA_INTERFACE, false,
IOVAR_STR_CUR_ETHERADDR,
priv->bc_dev.d_mac.ether.ether_addr_octet,
&out_len);
if (ret != OK)
{
return -EIO;
}
wlinfo("MAC address is %02X:%02X:%02X:%02X:%02X:%02X\n",
priv->bc_dev.d_mac.ether.ether_addr_octet[0],
priv->bc_dev.d_mac.ether.ether_addr_octet[1],
priv->bc_dev.d_mac.ether.ether_addr_octet[2],
priv->bc_dev.d_mac.ether.ether_addr_octet[3],
priv->bc_dev.d_mac.ether.ether_addr_octet[4],
priv->bc_dev.d_mac.ether.ether_addr_octet[5]);
/* Register the device with the OS so that socket IOCTLs can be performed */