mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
bcmf: register network driver + update defconfig file
This commit is contained in:
+151
-9
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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,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 */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user