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
+151 -9
View File
@@ -65,7 +65,11 @@ CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_GRAPHICS is not set # CONFIG_DEBUG_GRAPHICS is not set
# CONFIG_DEBUG_LIB is not set # CONFIG_DEBUG_LIB is not set
# CONFIG_DEBUG_MM 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 # CONFIG_DEBUG_SCHED is not set
# #
@@ -78,10 +82,7 @@ CONFIG_DEBUG_INFO=y
# #
# CONFIG_DEBUG_LEDS is not set # CONFIG_DEBUG_LEDS is not set
# CONFIG_DEBUG_GPIO is not set # CONFIG_DEBUG_GPIO is not set
CONFIG_DEBUG_MEMCARD=y # CONFIG_DEBUG_MEMCARD is not set
CONFIG_DEBUG_MEMCARD_ERROR=y
CONFIG_DEBUG_MEMCARD_WARN=y
CONFIG_DEBUG_MEMCARD_INFO=y
# CONFIG_DEBUG_TIMER is not set # CONFIG_DEBUG_TIMER is not set
# CONFIG_DEBUG_WATCHDOG is not set # CONFIG_DEBUG_WATCHDOG is not set
CONFIG_ARCH_HAVE_STACKCHECK=y CONFIG_ARCH_HAVE_STACKCHECK=y
@@ -859,6 +860,26 @@ CONFIG_SDIO_BLOCKSETUP=y
# CONFIG_MODEM is not set # CONFIG_MODEM is not set
# CONFIG_MTD is not set # CONFIG_MTD is not set
# CONFIG_EEPROM 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_PIPES is not set
# CONFIG_PM is not set # CONFIG_PM is not set
# CONFIG_POWER is not set # CONFIG_POWER is not set
@@ -926,6 +947,8 @@ CONFIG_DRIVERS_IEEE80211=y
CONFIG_IEEE80211_BROADCOM_FULLMAC=y CONFIG_IEEE80211_BROADCOM_FULLMAC=y
CONFIG_IEEE80211_BROADCOM_BCM43362=y CONFIG_IEEE80211_BROADCOM_BCM43362=y
CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO=y CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO=y
CONFIG_IEEE80211_BROADCOM_HPWORK=y
CONFIG_IEEE80211_BROADCOM_NINTERFACES=1
# CONFIG_WL_NRF24L01 is not set # CONFIG_WL_NRF24L01 is not set
# CONFIG_DRIVERS_CONTACTLESS is not set # CONFIG_DRIVERS_CONTACTLESS is not set
@@ -946,9 +969,100 @@ CONFIG_SYSLOG_CONSOLE=y
# #
# Networking Support # Networking Support
# #
# CONFIG_ARCH_HAVE_NET is not set CONFIG_ARCH_HAVE_NET=y
# CONFIG_ARCH_HAVE_PHY is not set # 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 # Crypto API
@@ -986,6 +1100,7 @@ CONFIG_FS_PROCFS=y
# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set # CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set
# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set # CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set
# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS 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 # CONFIG_FS_UNIONFS is not set
# #
@@ -1109,9 +1224,8 @@ CONFIG_ARCH_HAVE_TLS=y
# #
# Network-Related Options # Network-Related Options
# #
# CONFIG_LIBC_IPv4_ADDRCONV is not set
# CONFIG_LIBC_IPv6_ADDRCONV is not set # CONFIG_LIBC_IPv6_ADDRCONV is not set
# CONFIG_LIBC_NETDB is not set CONFIG_LIBC_NETDB=y
# #
# NETDB Support # NETDB Support
@@ -1259,6 +1373,7 @@ CONFIG_EXAMPLES_NSH=y
# CONFIG_NETUTILS_ESP8266 is not set # CONFIG_NETUTILS_ESP8266 is not set
# CONFIG_NETUTILS_FTPC is not set # CONFIG_NETUTILS_FTPC is not set
# CONFIG_NETUTILS_JSON is not set # CONFIG_NETUTILS_JSON is not set
CONFIG_NETUTILS_NETLIB=y
# CONFIG_NETUTILS_SMTP is not set # CONFIG_NETUTILS_SMTP is not set
# #
@@ -1285,6 +1400,7 @@ CONFIG_NSH_BUILTIN_APPS=y
# Disable Individual commands # Disable Individual commands
# #
# CONFIG_NSH_DISABLE_ADDROUTE is not set # CONFIG_NSH_DISABLE_ADDROUTE is not set
# CONFIG_NSH_DISABLE_ARP is not set
# CONFIG_NSH_DISABLE_BASENAME is not set # CONFIG_NSH_DISABLE_BASENAME is not set
# CONFIG_NSH_DISABLE_CAT is not set # CONFIG_NSH_DISABLE_CAT is not set
# CONFIG_NSH_DISABLE_CD is not set # CONFIG_NSH_DISABLE_CD is not set
@@ -1358,6 +1474,26 @@ CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_CONSOLE=y CONFIG_NSH_CONSOLE=y
# CONFIG_NSH_ALTCONDEV is not set # CONFIG_NSH_ALTCONDEV is not set
CONFIG_NSH_ARCHINIT=y 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_LOGIN is not set
# CONFIG_NSH_CONSOLE_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_HEX2BIN is not set
# CONFIG_SYSTEM_HEXED is not set # CONFIG_SYSTEM_HEXED is not set
# CONFIG_SYSTEM_INSTALL is not set # CONFIG_SYSTEM_INSTALL is not set
# CONFIG_SYSTEM_NETDB is not set
# CONFIG_SYSTEM_RAMTEST is not set # CONFIG_SYSTEM_RAMTEST is not set
CONFIG_READLINE_HAVE_EXTMATCH=y CONFIG_READLINE_HAVE_EXTMATCH=y
CONFIG_SYSTEM_READLINE=y CONFIG_SYSTEM_READLINE=y
@@ -1387,3 +1524,8 @@ CONFIG_READLINE_ECHO=y
# CONFIG_SYSTEM_UBLOXMODEM is not set # CONFIG_SYSTEM_UBLOXMODEM is not set
# CONFIG_SYSTEM_VI is not set # CONFIG_SYSTEM_VI is not set
# CONFIG_SYSTEM_ZMODEM is not set # CONFIG_SYSTEM_ZMODEM is not set
#
# Wireless Libraries and NSH Add-Ons
#
# CONFIG_WIRELESS_WAPI is not set
+1
View File
@@ -44,6 +44,7 @@ ifeq ($(CONFIG_IEEE80211_BROADCOM_FULLMAC),y)
CSRCS += bcmf_driver.c CSRCS += bcmf_driver.c
CSRCS += bcmf_cdc.c CSRCS += bcmf_cdc.c
CSRCS += bcmf_utils.c CSRCS += bcmf_utils.c
CSRCS += bcmf_netdev.c
ifeq ($(CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO),y) ifeq ($(CONFIG_IEEE80211_BROADCOM_FULLMAC_SDIO),y)
CSRCS += mmc_sdio.c CSRCS += mmc_sdio.c
+2 -2
View File
@@ -65,9 +65,9 @@ const struct bcmf_sdio_chip bcmf_43362_config_sdio = {
// TODO find something smarter than using image_len references // 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, .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 .nvram_image_size = (unsigned int*)&bcm43362_nvram_image_len
}; };
+60 -76
View File
@@ -45,6 +45,8 @@
#include <debug.h> #include <debug.h>
#include <errno.h> #include <errno.h>
#include <net/ethernet.h>
#include <nuttx/kmalloc.h> #include <nuttx/kmalloc.h>
#include "bcmf_driver.h" #include "bcmf_driver.h"
@@ -64,11 +66,6 @@
#define WL_SCAN_UNASSOC_TIME 40 #define WL_SCAN_UNASSOC_TIME 40
#define WL_SCAN_PASSIVE_TIME 120 #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 * Private Types
****************************************************************************/ ****************************************************************************/
@@ -80,6 +77,11 @@
static FAR struct bcmf_dev_s* bcmf_allocate_device(void); static FAR struct bcmf_dev_s* bcmf_allocate_device(void);
static void bcmf_free_device(FAR struct bcmf_dev_s *priv); 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 #if 0
static int bcmf_run_escan(FAR struct bcmf_dev_s *priv); static int bcmf_run_escan(FAR struct bcmf_dev_s *priv);
#endif #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", wlinfo("MAC address updated %02X:%02X:%02X:%02X:%02X:%02X\n",
addr[0], addr[1], addr[2], addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]); 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; 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, 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) 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 bcmf_dongle_initialize(FAR struct bcmf_dev_s *priv)
{ {
int ret; int ret;
uint32_t out_len;
uint32_t value;
ret = bcmf_wl_enable(priv, true); ret = bcmf_wl_enable(priv, true);
if (ret) if (ret)
@@ -236,36 +217,6 @@ int bcmf_dongle_initialize(FAR struct bcmf_dev_s *priv)
return ret; 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 // FIXME remove
#if 0 #if 0
/* Try scan */ /* Try scan */
@@ -330,14 +281,10 @@ int bcmf_run_escan(FAR struct bcmf_dev_s *priv)
} }
#endif #endif
/**************************************************************************** int bcmf_driver_initialize(FAR struct bcmf_dev_s *priv)
* Public Functions
****************************************************************************/
int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
{ {
int ret; int ret;
uint32_t out_len; uint32_t out_len, value;
uint8_t tmp_buf[64]; uint8_t tmp_buf[64];
/* Disable TX Gloming feature */ /* Disable TX Gloming feature */
@@ -352,22 +299,35 @@ int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
return -EIO; return -EIO;
} }
/* Query MAC address */ /* FIXME disable power save mode */
out_len = 6; out_len = 4;
ret = bcmf_cdc_iovar_request(priv, CHIP_STA_INTERFACE, false, value = 0;
IOVAR_STR_CUR_ETHERADDR, tmp_buf, ret = bcmf_cdc_ioctl(priv, CHIP_STA_INTERFACE, true,
&out_len); WLC_SET_PM, (uint8_t*)&value, &out_len);
if (ret != OK) 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", out_len = 4;
tmp_buf[0], tmp_buf[1], tmp_buf[2], value = GMODE_AUTO;
tmp_buf[3], tmp_buf[4], tmp_buf[5]); 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 */ /* Query firmware version string */
@@ -402,11 +362,16 @@ int bcmf_wl_initialize(FAR struct bcmf_dev_s *priv)
{ {
return -EIO; 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 bcmf_sdio_initialize(int minor, FAR struct sdio_dev_s *dev)
{ {
int ret; int ret;
@@ -431,9 +396,28 @@ int bcmf_sdio_initialize(int minor, FAR struct sdio_dev_s *dev)
/* Bus initialized, register network driver */ /* Bus initialized, register network driver */
return bcmf_wl_initialize(priv); return bcmf_driver_initialize(priv);
exit_free_device: exit_free_device:
bcmf_free_device(priv); bcmf_free_device(priv);
return ret; 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;
} }
+21 -15
View File
@@ -40,11 +40,15 @@
#include <stdint.h> #include <stdint.h>
#include <semaphore.h> #include <semaphore.h>
#define BCMF_STATUS_BUS_UP (1<<0) /* Chip is flashed and running */ #include <nuttx/net/netdev.h>
#define BCMF_STATUS_READY (1<<1) /* Chip is ready to receive requests */ #include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#define BCMF_STATUS_SLEEP (1<<2) /* Chip is in low power mode */ /* Chip interfaces */
#define BCMF_STATUS_WAIT_CONTROL (1<<3) /* Waiting for control response */
#define CHIP_STA_INTERFACE 0
#define CHIP_AP_INTERFACE 1
#define CHIP_P2P_INTERFACE 2
struct bcmf_bus_dev_s; struct bcmf_bus_dev_s;
struct bcmf_frame_s; struct bcmf_frame_s;
@@ -53,7 +57,18 @@ struct bcmf_frame_s;
struct bcmf_dev_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 // FIXME use mutex instead of semaphore
sem_t control_mutex; /* Cannot handle multiple control requests */ 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 */ uint16_t control_rxdata_len; /* Received control frame out buffer length */
uint8_t *control_rxdata; /* Received control frame out buffer */ uint8_t *control_rxdata; /* Received control frame out buffer */
uint32_t control_status; /* Last received frame status */ uint32_t control_status; /* Last received frame status */
uint8_t mac_addr[6]; /* Current mac address */
}; };
/* Default bus interface structure */ /* Default bus interface structure */
@@ -89,13 +102,6 @@ struct bcmf_frame_s {
unsigned int len; /* Frame buffer size */ unsigned int len; /* Frame buffer size */
}; };
/* Notify driver frame is available */ int bcmf_wl_enable(FAR struct bcmf_dev_s *priv, bool enable);
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);
#endif /* __DRIVERS_WIRELESS_IEEE80211_BCMF_DRIVER_H */ #endif /* __DRIVERS_WIRELESS_IEEE80211_BCMF_DRIVER_H */
+1 -1
View File
@@ -49,7 +49,7 @@ extern "C" {
typedef uint16_t wl_chanspec_t; typedef uint16_t wl_chanspec_t;
typedef uint16_t chanspec_t; typedef uint16_t chanspec_t;
#define ETHER_ADDR_LEN 6 #define ETHER_ADDR_LEN 6
typedef struct ether_addr typedef struct ether_addr_dup
{ {
uint8_t octet[ETHER_ADDR_LEN]; uint8_t octet[ETHER_ADDR_LEN];
} wl_ether_addr_t; } wl_ether_addr_t;
+61 -62
View File
@@ -61,6 +61,10 @@
# include <nuttx/net/pkt.h> # include <nuttx/net/pkt.h>
#endif #endif
#include "bcmf_driver.h"
#include "bcmf_cdc.h"
#include "bcmf_ioctl.h"
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
@@ -108,23 +112,6 @@
* Private Types * 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 * Private Data
****************************************************************************/ ****************************************************************************/
@@ -144,23 +131,19 @@ struct bcmf_driver_s
static uint8_t g_pktbuf[MAX_NET_DEV_MTU + CONFIG_NET_GUARDSIZE]; 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 * Private Function Prototypes
****************************************************************************/ ****************************************************************************/
/* Common TX logic */ /* 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); static int bcmf_txpoll(FAR struct net_driver_s *dev);
/* Interrupt handling */ /* Interrupt handling */
static void bcmf_receive(FAR struct bcmf_driver_s *priv); static void bcmf_receive(FAR struct bcmf_dev_s *priv);
static void bcmf_txdone(FAR struct bcmf_driver_s *priv); static void bcmf_txdone(FAR struct bcmf_dev_s *priv);
static void bcmf_interrupt_work(FAR void *arg); static void bcmf_interrupt_work(FAR void *arg);
static int bcmf_interrupt(int irq, FAR void *context, 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); FAR const uint8_t *mac);
#endif #endif
#ifdef CONFIG_NET_ICMPv6 #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
#endif #endif
#ifdef CONFIG_NETDEV_IOCTL #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 /* 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 * 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) 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, /* If the polling resulted in data that should be sent out on the network,
* the field d_len is set to a value > 0. * 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 do
{ {
@@ -453,7 +436,7 @@ static void bcmf_receive(FAR struct bcmf_driver_s *priv)
NETDEV_RXDROPPED(&priv->bc_dev); 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; int delay;
@@ -515,7 +498,7 @@ static void bcmf_txdone(FAR struct bcmf_driver_s *priv)
static void bcmf_interrupt_work(FAR void *arg) 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. /* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work * 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) 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); 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) 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. /* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work * 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, ...) 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 /* Disable further Ethernet interrupts. This will prevent some race
* conditions with interrupt work. There is still a potential 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) 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. /* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work * 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, ...) 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. */ /* 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) 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 #ifdef CONFIG_NET_IPv4
ninfo("Bringing up: %d.%d.%d.%d\n", 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) 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; irqstate_t flags;
/* Disable the hardware interrupt */ /* 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) 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. /* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work * 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) 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 /* Is our single work structure available? It may not be if there are
* pending interrupt actions and we will have to ignore the Tx * 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) #if defined(CONFIG_NET_IGMP) || defined(CONFIG_NET_ICMPv6)
static int bcmf_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) 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 */ /* 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 #ifdef CONFIG_NET_IGMP
static int bcmf_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) 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 */ /* 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 #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; FAR struct net_driver_s *dev;
uint16_t tmp16; 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, static int bcmf_ioctl(FAR struct net_driver_s *dev, int cmd,
unsigned long arg) 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; int ret;
/* Decode and dispatch the driver-specific IOCTL command */ /* 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 * Name: bcmf_netdev_register
* *
* Description: * Description:
* Initialize the Broadcom 43362 controller and driver * Register a network driver and set Broadcom chip in a proper state
* *
* Parameters: * Parameters:
* intf - In the case where there are multiple EMACs, this value * priv - Broadcom driver device
* identifies which EMAC is to be initialized.
* *
* Returned Value: * Returned Value:
* OK on success; Negated errno on failure. * 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); memset(&priv->bc_dev, 0, sizeof(priv->bc_dev));
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));
priv->bc_dev.d_buf = g_pktbuf; /* Single packet buffer */ 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_ifup = bcmf_ifup; /* I/F up (new IP address) callback */
priv->bc_dev.d_ifdown = bcmf_ifdown; /* I/F down 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 #ifdef CONFIG_NETDEV_IOCTL
priv->bc_dev.d_ioctl = bcmf_ioctl; /* Handle network IOCTL commands */ priv->bc_dev.d_ioctl = bcmf_ioctl; /* Handle network IOCTL commands */
#endif #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 */ /* 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(). * 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 */ /* Register the device with the OS so that socket IOCTLs can be performed */