From 7d5518f87b19e46f5ce36deb40b9cd6c192f8dfc Mon Sep 17 00:00:00 2001 From: Alex Zhao Date: Thu, 6 May 2021 19:39:26 +0800 Subject: [PATCH] net: rockchip_wlan: cywdhd: update version to 1.363.125.19-20210427 1. Add to support Low Power Solution. 2. Fix that system can't suspend in Android. 3. Fix that the SSID list will be shown very slowly when disable/enable wifi in Android. Signed-off-by: Alex Zhao Change-Id: Ib0f9387e670cb2cb4aca9e2279f76f24dec3aa99 --- .../rockchip_wlan/cywdhd/bcmdhd/dhd.h | 3 +++ .../rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c | 22 +++++++++++++++++-- .../rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c | 5 +++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h index f1e96da2ccee..2d27fbfeca86 100644 --- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h +++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h @@ -400,6 +400,9 @@ typedef struct dhd_pub { /* Internal dhd items */ bool up; /* Driver up/down (to OS) */ +#ifdef WL_CFG80211 + spinlock_t up_lock; /* Synchronization with CFG80211 down */ +#endif bool txoff; /* Transmit flow-controlled */ bool dongle_reset; /* TRUE = DEVRESET put dongle into reset */ enum dhd_bus_state busstate; diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c index e388efabbc41..0779e21d13d2 100644 --- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c @@ -6257,6 +6257,9 @@ static int dhd_stop(struct net_device *net) { int ifidx = 0; +#ifdef WL_CFG80211 + unsigned long flags = 0; +#endif dhd_info_t *dhd = DHD_DEV_INFO(net); DHD_OS_WAKE_LOCK(&dhd->pub); DHD_PERIM_LOCK(&dhd->pub); @@ -6280,7 +6283,13 @@ dhd_stop(struct net_device *net) /* Set state and stop OS transmissions */ netif_stop_queue(net); +#ifdef WL_CFG80211 + spin_lock_irqsave(&dhd->pub.up_lock, flags); dhd->pub.up = 0; + spin_unlock_irqrestore(&dhd->pub.up_lock, flags); +#else + dhd->pub.up = 0; +#endif #ifdef WL_CFG80211 if (ifidx == 0) { @@ -7543,6 +7552,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) dhd_state |= DHD_ATTACH_STATE_PROT_ATTACH; #ifdef WL_CFG80211 + spin_lock_init(&dhd->pub.up_lock); /* Attach and link in the cfg80211 */ if (unlikely(wl_cfg80211_attach(net, &dhd->pub))) { DHD_ERROR(("wl_cfg80211_attach failed\n")); @@ -11024,6 +11034,9 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, uint16 pktlen, wl_event_msg_t *event, void **data) { int bcmerror = 0; +#ifdef WL_CFG80211 + unsigned long flags = 0; +#endif /* WL_CFG80211 */ ASSERT(dhd != NULL); #ifdef SHOW_LOGTRACE @@ -11055,8 +11068,13 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, uint16 pktlen, #ifdef WL_CFG80211 ASSERT(dhd->iflist[*ifidx] != NULL); ASSERT(dhd->iflist[*ifidx]->net != NULL); - if (dhd->iflist[*ifidx]->net) - wl_cfg80211_event(dhd->iflist[*ifidx]->net, event, *data); + if (dhd->iflist[*ifidx]->net) { + spin_lock_irqsave(&dhd->pub.up_lock, flags); + if (dhd->pub.up) { + wl_cfg80211_event(dhd->iflist[*ifidx]->net, event, *data); + } + spin_unlock_irqrestore(&dhd->pub.up_lock, flags); + } #endif /* defined(WL_CFG80211) */ return (bcmerror); diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c index 0228c2c08fbc..b69ad33e32d4 100644 --- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c @@ -11265,6 +11265,7 @@ void wl_terminate_event_handler(void) if (cfg) { wl_destroy_event_handler(cfg); + wl_flush_eq(cfg); } } @@ -12673,7 +12674,7 @@ static s32 wl_event_handler(void *data) while (down_interruptible (&tsk->sema) == 0) { SMP_RD_BARRIER_DEPENDS(); if (tsk->terminated) { - DHD_EVENT_WAKE_LOCK(cfg->pub); + DHD_EVENT_WAKE_UNLOCK(cfg->pub); break; } while ((e = wl_deq_event(cfg))) { @@ -12707,7 +12708,7 @@ static s32 wl_event_handler(void *data) fail: wl_put_event(e); } - DHD_EVENT_WAKE_LOCK(cfg->pub); + DHD_EVENT_WAKE_UNLOCK(cfg->pub); } WL_ERR(("was terminated\n")); complete_and_exit(&tsk->completed, 0);