This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new e498e5308a wireless/bcm43xxx: handle disassoc correctly
e498e5308a is described below
commit e498e5308aaf10f8da7b2a593a55dd14ae58159d
Author: chao.an <[email protected]>
AuthorDate: Sat Jun 18 17:12:55 2022 +0800
wireless/bcm43xxx: handle disassoc correctly
1. use WLC_DISASSOC to deal disconnect event
2. carrier net device status
Signed-off-by: chao.an <[email protected]>
---
drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c | 52 +++++++++++++++++------
drivers/wireless/ieee80211/bcm43xxx/bcmf_ioctl.h | 1 +
2 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c
b/drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c
index 721336b645..2c0d5c8d80 100644
--- a/drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c
+++ b/drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c
@@ -612,10 +612,15 @@ void bcmf_wl_auth_event_handler(FAR struct bcmf_dev_s
*priv,
{
/* Auth complete */
- priv->auth_status = OK;
+ netdev_carrier_on(&priv->bc_dev);
+ priv->auth_status = OK;
nxsem_post(&priv->auth_signal);
}
+ else if (type == WLC_E_DISASSOC)
+ {
+ netdev_carrier_off(&priv->bc_dev);
+ }
}
/* bcmf_wl_scan_event_handler must run at high priority else
@@ -1364,6 +1369,7 @@ int bcmf_wl_set_bssid(FAR struct bcmf_dev_s *priv, struct
iwreq *iwr)
{
uint32_t out_len;
int interface;
+ int infra = 0;
int ap = 0;
int ret;
@@ -1379,10 +1385,18 @@ int bcmf_wl_set_bssid(FAR struct bcmf_dev_s *priv,
struct iwreq *iwr)
(uint8_t *)&ap, &out_len);
if (ret == OK)
{
- out_len = sizeof(struct ether_addr);
- ret = bcmf_cdc_ioctl(priv, interface, true,
- (ap ? WLC_SET_BSSID : WLC_REASSOC),
- (uint8_t *)iwr->u.ap_addr.sa_data, &out_len);
+ out_len = sizeof(infra);
+ ret = bcmf_cdc_ioctl(priv, interface, false, WLC_GET_INFRA,
+ (uint8_t *)&infra, &out_len);
+
+ if (ret == OK)
+ {
+ out_len = sizeof(struct ether_addr);
+ ret = bcmf_cdc_ioctl(priv, interface, true,
+ ((ap || !infra) ? WLC_SET_BSSID :
+ WLC_REASSOC),
+ (uint8_t *)iwr->u.ap_addr.sa_data, &out_len);
+ }
}
return ret;
@@ -1605,6 +1619,7 @@ int bcmf_wl_set_ssid(FAR struct bcmf_dev_s *priv, struct
iwreq *iwr)
int interface;
uint32_t out_len;
wlc_ssid_t ssid;
+ scb_val_t scbval;
interface = bcmf_wl_get_interface(priv, iwr);
@@ -1613,16 +1628,29 @@ int bcmf_wl_set_ssid(FAR struct bcmf_dev_s *priv,
struct iwreq *iwr)
return -EINVAL;
}
- ssid.ssid_len = iwr->u.essid.length;
- memcpy(ssid.SSID, iwr->u.essid.pointer, iwr->u.essid.length);
+ if (iwr->u.essid.flags)
+ {
+ ssid.ssid_len = iwr->u.essid.length;
+ memcpy(ssid.SSID, iwr->u.essid.pointer, iwr->u.essid.length);
- /* Configure AP SSID and trig authentication request */
+ /* Configure AP SSID and trig authentication request */
- out_len = sizeof(ssid);
- if (bcmf_cdc_ioctl(priv, interface, true,
- WLC_SET_SSID, (uint8_t *)&ssid, &out_len))
+ out_len = sizeof(ssid);
+ ret = bcmf_cdc_ioctl(priv, interface, true,
+ WLC_SET_SSID, (uint8_t *)&ssid, &out_len);
+ if (ret < 0)
+ {
+ wlerr("Associate request failure\n");
+ return ret;
+ }
+ }
+ else
{
- return -EIO;
+ out_len = sizeof(scbval);
+ memset(&scbval, 0x0, out_len);
+
+ return bcmf_cdc_ioctl(priv, interface, true,
+ WLC_DISASSOC, (uint8_t *)&scbval, &out_len);
}
ret = bcmf_sem_wait(&priv->auth_signal, BCMF_AUTH_TIMEOUT_MS);
diff --git a/drivers/wireless/ieee80211/bcm43xxx/bcmf_ioctl.h
b/drivers/wireless/ieee80211/bcm43xxx/bcmf_ioctl.h
index 959fb294c0..ed0710fdc4 100644
--- a/drivers/wireless/ieee80211/bcm43xxx/bcmf_ioctl.h
+++ b/drivers/wireless/ieee80211/bcm43xxx/bcmf_ioctl.h
@@ -581,6 +581,7 @@ typedef struct
{
uint32_t val;
struct ether_addr ea;
+ uint16_t pad;
} scb_val_t;
#define BCM_MAC_STATUS_INDICATION (0x40010200L)