summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRongjun Chen <rongjun.chen@amlogic.com>2018-05-28 13:48:19 +0800
committerYang Xu <yang.xu@amlogic.com>2018-06-05 03:35:35 -0700
commit1ebe56b2e3bc8a838695ba731b2f75a52bd0225f (patch)
tree2c0c86ead39943513b076796f900f8ca59ada83d
parent50b757175c150166bb653dd99295f67a66a486d9 (diff)
downloaddhd-driver-1ebe56b2e3bc8a838695ba731b2f75a52bd0225f.tar.gz
wifi: fix wifi_driect cts fail & some panic issue
PD# 167139 fix cts fail and some panic issue Change-Id: I55c10a60464f7dccd2428e03a6f05e8bc8633f95 Signed-off-by: Rongjun Chen <rongjun.chen@amlogic.com>
-rw-r--r--bcmdhd.1.579.77.41.1.cn/dhd_linux.c8
-rw-r--r--bcmdhd.1.579.77.41.1.cn/wl_cfg80211.c71
-rw-r--r--bcmdhd.1.579.77.41.1.cn/wl_linux_mon.c4
3 files changed, 37 insertions, 46 deletions
diff --git a/bcmdhd.1.579.77.41.1.cn/dhd_linux.c b/bcmdhd.1.579.77.41.1.cn/dhd_linux.c
index 0f39328..2bf3709 100644
--- a/bcmdhd.1.579.77.41.1.cn/dhd_linux.c
+++ b/bcmdhd.1.579.77.41.1.cn/dhd_linux.c
@@ -9226,7 +9226,11 @@ dhd_allocate_if(dhd_pub_t *dhdpub, int ifidx, const char *name,
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) */
}
#else
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
ifp->net->destructor = free_netdev;
+#else
+ ifp->net->needs_free_netdev = true;
+#endif
#endif /* WL_CFG80211 */
strncpy(ifp->name, ifp->net->name, IFNAMSIZ);
ifp->name[IFNAMSIZ - 1] = '\0';
@@ -19843,8 +19847,8 @@ static void dhd_sysfs_exit(dhd_info_t *dhd)
DHD_ERROR(("%s(): dhd is NULL \r\n", __FUNCTION__));
return;
}
-
- if (&dhd->dhd_kobj != NULL)
+ /* Releae the kobject */
+ if (dhd->dhd_kobj.state_initialized)
kobject_put(&dhd->dhd_kobj);
}
diff --git a/bcmdhd.1.579.77.41.1.cn/wl_cfg80211.c b/bcmdhd.1.579.77.41.1.cn/wl_cfg80211.c
index c46d30c..d926602 100644
--- a/bcmdhd.1.579.77.41.1.cn/wl_cfg80211.c
+++ b/bcmdhd.1.579.77.41.1.cn/wl_cfg80211.c
@@ -9545,7 +9545,7 @@ wl_cfg80211_del_station(
} else {
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) */
#endif /* CUSTOM_BLOCK_DEAUTH_AT_EAP_FAILURE */
- dhd_wait_pend8021x(dev);
+// dhd_wait_pend8021x(dev);
scb_val.val = DOT11_RC_DEAUTH_LEAVING;
err = wldev_ioctl_set(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val,
sizeof(scb_val_t));
@@ -14420,6 +14420,7 @@ static s32 wl_create_event_handler(struct bcm_cfg80211 *cfg)
}
if (!cfg->event_workq) {
+ WL_ERR(("event_workq alloc_workqueue failed\n"));
ret = -ENOMEM;
} else {
INIT_WORK(&cfg->event_work, wl_event_handler);
@@ -15630,20 +15631,21 @@ static s32 wl_init_priv(struct bcm_cfg80211 *cfg)
init_waitqueue_head(&cfg->netif_change_event);
init_completion(&cfg->send_af_done);
init_completion(&cfg->iface_disable);
- wl_init_eq(cfg);
- err = wl_init_priv_mem(cfg);
- if (err)
- return err;
- if (wl_create_event_handler(cfg))
- return -ENOMEM;
- wl_init_event_handler(cfg);
mutex_init(&cfg->usr_sync);
mutex_init(&cfg->event_sync);
mutex_init(&cfg->scan_complete);
mutex_init(&cfg->if_sync);
+ mutex_init(&cfg->pm_sync);
#ifdef WLTDLS
mutex_init(&cfg->tdls_sync);
#endif /* WLTDLS */
+ wl_init_eq(cfg);
+ err = wl_init_priv_mem(cfg);
+ if (err)
+ return err;
+ if (wl_create_event_handler(cfg))
+ return -ENOMEM;
+ wl_init_event_handler(cfg);
err = wl_init_scan(cfg);
if (err)
return err;
@@ -15670,9 +15672,11 @@ static void wl_deinit_priv(struct bcm_cfg80211 *cfg)
wl_destroy_event_handler(cfg);
wl_flush_eq(cfg);
wl_link_down(cfg);
- del_timer_sync(&cfg->scan_timeout);
+ if (cfg->scan_timeout.function)
+ del_timer_sync(&cfg->scan_timeout);
#ifdef DHD_LOSSLESS_ROAMING
- del_timer_sync(&cfg->roam_timeout);
+ if (cfg->roam_timeout.function)
+ del_timer_sync(&cfg->roam_timeout);
#endif
wl_deinit_priv_mem(cfg);
if (wl_cfg80211_netdev_notifier_registered) {
@@ -15783,7 +15787,7 @@ struct bcm_cfg80211 *wl_get_cfg(struct net_device *ndev)
{
struct wireless_dev *wdev = ndev->ieee80211_ptr;
- if (!wdev)
+ if (!wdev || !wdev->wiphy)
return NULL;
return wiphy_priv(wdev->wiphy);
@@ -15832,14 +15836,14 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *context)
SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
wdev->netdev = ndev;
cfg->state_notifier = wl_notifier_change_state;
- err = wl_alloc_netinfo(cfg, ndev, wdev, wdev->iftype, PM_ENABLE, 0);
+ err = wl_init_priv(cfg);
if (err) {
- WL_ERR(("Failed to alloc net_info (%d)\n", err));
+ WL_ERR(("Failed to init iwm_priv (%d)\n", err));
goto cfg80211_attach_out;
}
- err = wl_init_priv(cfg);
+ err = wl_alloc_netinfo(cfg, ndev, wdev, wdev->iftype, PM_ENABLE, 0);
if (err) {
- WL_ERR(("Failed to init iwm_priv (%d)\n", err));
+ WL_ERR(("Failed to alloc net_info (%d)\n", err));
goto cfg80211_attach_out;
}
@@ -15884,7 +15888,6 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *context)
#endif
INIT_DELAYED_WORK(&cfg->pm_enable_work, wl_cfg80211_work_handler);
- mutex_init(&cfg->pm_sync);
#if defined(STAT_REPORT)
err = wl_attach_stat_report(cfg);
@@ -15895,8 +15898,7 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *context)
return err;
cfg80211_attach_out:
- wl_setup_rfkill(cfg, FALSE);
- wl_free_wdev(cfg);
+ wl_cfg80211_detach(cfg);
return err;
}
@@ -16693,12 +16695,14 @@ static s32 __wl_cfg80211_up(struct bcm_cfg80211 *cfg)
WL_DBG(("In\n"));
- err = wl_create_event_handler(cfg);
- if (err) {
- WL_ERR(("wl_create_event_handler failed\n"));
- return err;
+ if (!dhd_download_fw_on_driverload) {
+ err = wl_create_event_handler(cfg);
+ if (err) {
+ WL_ERR(("wl_create_event_handler failed\n"));
+ return err;
+ }
+ wl_init_event_handler(cfg);
}
- wl_init_event_handler(cfg);
err = dhd_config_dongle(cfg);
if (unlikely(err))
@@ -16726,19 +16730,7 @@ static s32 __wl_cfg80211_up(struct bcm_cfg80211 *cfg)
return err;
}
}
- if (!dhd_download_fw_on_driverload) {
- err = wl_create_event_handler(cfg);
- if (err) {
- WL_ERR(("wl_create_event_handler failed\n"));
- return err;
- }
- wl_init_event_handler(cfg);
- }
- err = wl_init_scan(cfg);
- if (err) {
- WL_ERR(("wl_init_scan failed\n"));
- return err;
- }
+
#ifdef DHD_LOSSLESS_ROAMING
if (timer_pending(&cfg->roam_timeout)) {
del_timer_sync(&cfg->roam_timeout);
@@ -17082,17 +17074,12 @@ int wl_cfg80211_hang(struct net_device *dev, u16 reason)
s32 wl_cfg80211_down(struct net_device *dev)
{
+ struct bcm_cfg80211 *cfg = wl_get_cfg(dev);
s32 err = 0;
- struct bcm_cfg80211 *cfg = NULL;
- if (dev == NULL)
- return err;
-
- cfg = wl_get_cfg(dev);
WL_DBG(("In\n"));
if (cfg == NULL)
return err;
-
mutex_lock(&cfg->usr_sync);
#if defined(RSSIAVG)
wl_free_rssi_cache(&g_rssi_cache_ctrl);
diff --git a/bcmdhd.1.579.77.41.1.cn/wl_linux_mon.c b/bcmdhd.1.579.77.41.1.cn/wl_linux_mon.c
index e90fa5d..75a417b 100644
--- a/bcmdhd.1.579.77.41.1.cn/wl_linux_mon.c
+++ b/bcmdhd.1.579.77.41.1.cn/wl_linux_mon.c
@@ -388,8 +388,8 @@ int dhd_monitor_uninit(void)
{
int i;
struct net_device *ndev;
- mutex_lock(&g_monitor.lock);
if (g_monitor.monitor_state != MONITOR_STATE_DEINIT) {
+ mutex_lock(&g_monitor.lock);
for (i = 0; i < DHD_MAX_IFS; i++) {
ndev = g_monitor.mon_if[i].mon_ndev;
if (ndev) {
@@ -400,7 +400,7 @@ int dhd_monitor_uninit(void)
}
}
g_monitor.monitor_state = MONITOR_STATE_DEINIT;
+ mutex_unlock(&g_monitor.lock);
}
- mutex_unlock(&g_monitor.lock);
return 0;
}