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 <anc...@xiaomi.com> 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 <anc...@xiaomi.com> --- 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)