From 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 13 May 2024 10:30:14 +0000
Subject: [PATCH] modify sin led gpio

---
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c |  656 +++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 389 insertions(+), 267 deletions(-)

diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
old mode 100644
new mode 100755
index 57d93cf..6377495
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
@@ -65,11 +65,9 @@
 #include <asm/uaccess.h>
 #include <asm/unaligned.h>
 #include <dhd_linux_priv.h>
-#ifdef BCMPCIE
-#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(BCMPCIE)
 #include <rk_dhd_pcie_linux.h>
-#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */
-#endif /* BCMPCIE */
+#endif /* CUSTOMER_HW_ROCKCHIP && BCMPCIE */
 
 #include <epivers.h>
 #include <bcmutils.h>
@@ -372,6 +370,7 @@
 static void dhd_hang_process(struct work_struct *work_data);
 #endif /* OEM_ANDROID */
 MODULE_LICENSE("GPL and additional rights");
+MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
 
 #if defined(MULTIPLE_SUPPLICANT)
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25))
@@ -1147,16 +1146,9 @@
 	dhd_pub_t *dhd = &dhdinfo->pub;
 	struct dhd_conf *conf = dhd->conf;
 	int suspend_mode = conf->suspend_mode;
-#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
-	int wowl_dngldown = 0;
-#endif
 
 	BCM_REFERENCE(dhdinfo);
 	BCM_REFERENCE(suspend);
-
-#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
-	wowl_dngldown = dhd_conf_wowl_dngldown(dhd);
-#endif
 
 	switch (action) {
 	case PM_HIBERNATION_PREPARE:
@@ -1189,9 +1181,6 @@
 			dhd_conf_set_suspend_resume(dhd, suspend);
 		DHD_OS_WAKE_LOCK_RESTORE(dhd);
 	} else {
-#ifdef BCMDBUS
-		if (dhd->busstate == DHD_BUS_DATA) {
-#endif
 		if (suspend_mode == PM_NOTIFIER || suspend_mode == SUSPEND_MODE_2)
 			dhd_conf_set_suspend_resume(dhd, suspend);
 #if defined(SUPPORT_P2P_GO_PS) && defined(PROP_TXSTATUS)
@@ -1199,20 +1188,6 @@
 #endif /* defined(SUPPORT_P2P_GO_PS) && defined(PROP_TXSTATUS) */
 		if (suspend_mode == PM_NOTIFIER)
 			dhd_suspend_resume_helper(dhdinfo, suspend, 0);
-#ifdef BCMDBUS
-		} else {
-#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
-			if (wowl_dngldown) {
-				printf("%s: reset power\n", __FUNCTION__);
-				dhd_wifi_platform_set_power(dhd, FALSE);
-				dhd_wifi_platform_set_power(dhd, TRUE);
-			} else
-#endif
-			{
-				printf("%s: skip resume since bus suspeneded\n", __FUNCTION__);
-			}
-		}
-#endif
 	}
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \
@@ -3566,9 +3541,6 @@
 		return;
 	}
 
-#ifdef DHD_NOTIFY_MAC_CHANGED
-	rtnl_lock();
-#endif /* DHD_NOTIFY_MAC_CHANGED */
 	dhd_net_if_lock_local(dhd);
 	DHD_OS_WAKE_LOCK(&dhd->pub);
 
@@ -3583,17 +3555,22 @@
 
 	ifp->set_macaddress = FALSE;
 
+#ifdef DHD_NOTIFY_MAC_CHANGED
+	rtnl_lock();
+#endif /* DHD_NOTIFY_MAC_CHANGED */
+
 	if (_dhd_set_mac_address(dhd, ifp->idx, ifp->mac_addr, TRUE) == 0)
 		DHD_INFO(("%s: MACID is overwritten\n",	__FUNCTION__));
 	else
 		DHD_ERROR(("%s: _dhd_set_mac_address() failed\n", __FUNCTION__));
 
-done:
-	DHD_OS_WAKE_UNLOCK(&dhd->pub);
-	dhd_net_if_unlock_local(dhd);
 #ifdef DHD_NOTIFY_MAC_CHANGED
 	rtnl_unlock();
 #endif /* DHD_NOTIFY_MAC_CHANGED */
+
+done:
+	DHD_OS_WAKE_UNLOCK(&dhd->pub);
+	dhd_net_if_unlock_local(dhd);
 }
 
 static void
@@ -4432,13 +4409,24 @@
 #endif
 	/* Make sure there's enough room for any header */
 #if !defined(BCM_ROUTER_DHD)
-	if (skb_cow(skb, (dhd->pub.hdrlen + htsfdlystat_sz))) {
-		DHD_ERROR(("%s: skb_cow failed\n",
-		           dhd_ifname(&dhd->pub, ifidx)));
+	if (skb_headroom(skb) < dhd->pub.hdrlen + htsfdlystat_sz) {
+		struct sk_buff *skb2;
+
+		DHD_INFO(("%s: insufficient headroom\n",
+		          dhd_ifname(&dhd->pub, ifidx)));
+		dhd->pub.tx_realloc++;
+
 		bcm_object_trace_opr(skb, BCM_OBJDBG_REMOVE, __FUNCTION__, __LINE__);
-		dev_kfree_skb_any(skb);
-		ret = -ENOMEM;
-		goto done;
+		skb2 = skb_realloc_headroom(skb, dhd->pub.hdrlen + htsfdlystat_sz);
+
+		dev_kfree_skb(skb);
+		if ((skb = skb2) == NULL) {
+			DHD_ERROR(("%s: skb_realloc_headroom failed\n",
+			           dhd_ifname(&dhd->pub, ifidx)));
+			ret = -ENOMEM;
+			goto done;
+		}
+		bcm_object_trace_opr(skb, BCM_OBJDBG_ADD_PKT, __FUNCTION__, __LINE__);
 	}
 #endif /* !BCM_ROUTER_DHD */
 
@@ -4772,11 +4760,6 @@
 static void
 __dhd_txflowcontrol(dhd_pub_t *dhdp, struct net_device *net, bool state)
 {
-
-	if (net->reg_state != NETREG_REGISTERED) {
-		return;
-	}
-
 	if (state == ON) {
 		if (!netif_queue_stopped(net)) {
 			DHD_INFO(("%s: Stop Netif Queue\n", __FUNCTION__));
@@ -8713,6 +8696,16 @@
 }
 #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */
 
+#ifdef CONFIG_HAS_WAKELOCK
+#define dhd_wake_lock_unlock_destroy(wlock) \
+{ \
+	if (dhd_wake_lock_active(wlock)) { \
+		dhd_wake_unlock(wlock); \
+	} \
+	dhd_wake_lock_destroy(wlock); \
+}
+#endif /* CONFIG_HAS_WAKELOCK */
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) && defined(DHD_TCP_LIMIT_OUTPUT)
 #define DHD_TCP_LIMIT_OUTPUT_BYTES (4 * 1024 * 1024)
 #ifndef TCP_DEFAULT_LIMIT_OUTPUT
@@ -8782,7 +8775,7 @@
 
 #if defined(WL_STATIC_IF) && defined(WL_CFG80211)
 	/* If static if is operational, don't reset the chip */
-	if ((!dhd->pub.hang_was_sent) && wl_cfg80211_static_if_active(cfg)) {
+	if (wl_cfg80211_static_if_active(cfg)) {
 		WL_MSG(net->name, "static if operational. skip chip reset.\n");
 		skip_reset = true;
 		wl_cfg80211_sta_ifdown(net);
@@ -8790,7 +8783,7 @@
 	}
 #endif /* WL_STATIC_IF && WL_CFG80211 */
 #ifdef DHD_NOTIFY_MAC_CHANGED
-	if (!dhd->pub.hang_was_sent && dhd->pub.skip_dhd_stop) {
+	if (dhd->pub.skip_dhd_stop) {
 		WL_MSG(net->name, "skip chip reset.\n");
 		skip_reset = true;
 #if defined(WL_CFG80211)
@@ -9084,14 +9077,14 @@
 {
 	struct file *fp;
 	const char *clm = VENDOR_PATH CONFIG_BCMDHD_CLM_PATH;
+	fp = filp_open(clm, O_RDONLY, 0);
 
-	fp = dhd_filp_open(clm, O_RDONLY, 0);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("%s: filp_open(%s) failed(%d) schedule wl_accel_work\n",
 				__FUNCTION__, clm, (int)IS_ERR(fp)));
 		return FALSE;
 	}
-	dhd_filp_close(fp, NULL);
+	filp_close(fp, NULL);
 
 	return TRUE;
 }
@@ -10446,13 +10439,8 @@
 #endif /* DHDTCPACK_SUPPRESS && BCMPCIE */
 				if (need_rtnl_lock)
 					unregister_netdev(ifp->net);
-				else {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) && defined(WL_CFG80211)
-					cfg80211_unregister_netdevice(ifp->net);
-#else
+				else
 					unregister_netdevice(ifp->net);
-#endif
-				}
 #if defined(WLDWDS) && defined(WL_EXT_IAPSTA)
 				if (ifp->dwds) {
 					wl_ext_iapsta_dettach_dwds_netdev(ifp->net, ifidx, ifp->bssidx);
@@ -10591,7 +10579,7 @@
 	if (!fp || !buf || buflen == 0)
 		return -1;
 
-	if (dhd_vfs_write((struct file *)fp, buf, buflen, &wr_posn) < 0)
+	if (vfs_write((struct file *)fp, buf, buflen, &wr_posn) < 0)
 		return -1;
 
 	*posn = wr_posn;
@@ -10607,7 +10595,7 @@
 	if (!file || !buf)
 		return -1;
 
-	return dhd_vfs_read(filep, buf, size, &filep->f_pos);
+	return vfs_read(filep, buf, size, &filep->f_pos);
 }
 
 int
@@ -10623,6 +10611,135 @@
 	return 0;
 }
 
+static int
+dhd_init_logstrs_array(osl_t *osh, dhd_event_log_t *temp)
+{
+	struct file *filep = NULL;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	struct kstat stat;
+	mm_segment_t fs;
+	int error = 0;
+#endif
+	char *raw_fmts =  NULL;
+	int logstrs_size = 0;
+
+	if (control_logtrace != LOGTRACE_PARSED_FMT) {
+		DHD_ERROR_NO_HW4(("%s : turned off logstr parsing\n", __FUNCTION__));
+		return BCME_ERROR;
+	}
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	fs = get_fs();
+	set_fs(KERNEL_DS);
+#endif
+
+	filep = filp_open(logstrs_path, O_RDONLY, 0);
+
+	if (IS_ERR(filep)) {
+		DHD_ERROR_NO_HW4(("%s: Failed to open the file %s \n", __FUNCTION__, logstrs_path));
+		goto fail;
+	}
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	error = vfs_stat(logstrs_path, &stat);
+	if (error) {
+		DHD_ERROR_NO_HW4(("%s: Failed to stat file %s \n", __FUNCTION__, logstrs_path));
+		goto fail;
+	}
+	logstrs_size = (int) stat.size;
+#else
+	logstrs_size = dhd_os_get_image_size(filep);
+#endif
+
+	if (logstrs_size == 0) {
+		DHD_ERROR(("%s: return as logstrs_size is 0\n", __FUNCTION__));
+		goto fail1;
+	}
+
+	if (temp->raw_fmts != NULL) {
+		raw_fmts = temp->raw_fmts;	/* reuse already malloced raw_fmts */
+	} else {
+		raw_fmts = MALLOC(osh, logstrs_size);
+		if (raw_fmts == NULL) {
+			DHD_ERROR(("%s: Failed to allocate memory \n", __FUNCTION__));
+			goto fail;
+		}
+	}
+
+	if (vfs_read(filep, raw_fmts, logstrs_size, &filep->f_pos) !=	logstrs_size) {
+		DHD_ERROR_NO_HW4(("%s: Failed to read file %s\n", __FUNCTION__, logstrs_path));
+		goto fail;
+	}
+
+	if (dhd_parse_logstrs_file(osh, raw_fmts, logstrs_size, temp)
+				== BCME_OK) {
+		filp_close(filep, NULL);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+		set_fs(fs);
+#endif
+		return BCME_OK;
+	}
+
+fail:
+	if (raw_fmts) {
+		MFREE(osh, raw_fmts, logstrs_size);
+	}
+	if (temp->fmts != NULL) {
+		MFREE(osh, temp->fmts, temp->num_fmts * sizeof(char *));
+	}
+
+fail1:
+	if (!IS_ERR(filep))
+		filp_close(filep, NULL);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	set_fs(fs);
+#endif
+	temp->fmts = NULL;
+	temp->raw_fmts = NULL;
+
+	return BCME_ERROR;
+}
+
+static int
+dhd_read_map(osl_t *osh, char *fname, uint32 *ramstart, uint32 *rodata_start,
+		uint32 *rodata_end)
+{
+	struct file *filep = NULL;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	mm_segment_t fs;
+#endif
+	int err = BCME_ERROR;
+
+	if (fname == NULL) {
+		DHD_ERROR(("%s: ERROR fname is NULL \n", __FUNCTION__));
+		return BCME_ERROR;
+	}
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	fs = get_fs();
+	set_fs(KERNEL_DS);
+#endif
+
+	filep = filp_open(fname, O_RDONLY, 0);
+	if (IS_ERR(filep)) {
+		DHD_ERROR_NO_HW4(("%s: Failed to open %s \n",  __FUNCTION__, fname));
+		goto fail;
+	}
+
+	if ((err = dhd_parse_map_file(osh, filep, ramstart,
+			rodata_start, rodata_end)) < 0)
+		goto fail;
+
+fail:
+	if (!IS_ERR(filep))
+		filp_close(filep, NULL);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
+	set_fs(fs);
+#endif
+
+	return err;
+}
 #ifdef DHD_COREDUMP
 #define PC_FOUND_BIT 0x01
 #define LR_FOUND_BIT 0x02
@@ -10682,8 +10799,8 @@
 	set_fs(KERNEL_DS);
 #endif
 
-	filep = dhd_filp_open(fname, O_RDONLY, 0);
-	if (IS_ERR(filep) || (filep == NULL)) {
+	filep = filp_open(fname, O_RDONLY, 0);
+	if (IS_ERR(filep)) {
 		DHD_ERROR(("%s: Failed to open %s \n",  __FUNCTION__, fname));
 		goto fail;
 	}
@@ -10845,7 +10962,7 @@
 	}
 #else
 	if (!IS_ERR(filep))
-		dhd_filp_close(filep, NULL);
+		filp_close(filep, NULL);
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
 	set_fs(fs);
@@ -11220,8 +11337,8 @@
 	set_fs(KERNEL_DS);
 #endif
 
-	filep = dhd_filp_open(str_file, O_RDONLY, 0);
-	if (IS_ERR(filep) || (filep == NULL)) {
+	filep = filp_open(str_file, O_RDONLY, 0);
+	if (IS_ERR(filep)) {
 		DHD_ERROR(("%s: Failed to open the file %s \n",  __FUNCTION__, str_file));
 		goto fail;
 	}
@@ -11258,7 +11375,7 @@
 		}
 	}
 
-	error = dhd_vfs_read(filep, raw_fmts, logstrs_size, (&filep->f_pos));
+	error = vfs_read(filep, raw_fmts, logstrs_size, (&filep->f_pos));
 	if (error != logstrs_size) {
 		DHD_ERROR(("%s: %s read failed %d \n", __FUNCTION__, str_file, error));
 		goto fail;
@@ -11276,7 +11393,7 @@
 		temp->rom_rodata_end = rodata_end;
 	}
 
-	dhd_filp_close(filep, NULL);
+	filp_close(filep, NULL);
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
 	set_fs(fs);
 #endif
@@ -11290,7 +11407,7 @@
 
 fail1:
 	if (!IS_ERR(filep))
-		dhd_filp_close(filep, NULL);
+		filp_close(filep, NULL);
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
 	set_fs(fs);
@@ -11652,7 +11769,9 @@
 	dhd->wakelock_counter = 0;
 	/* wakelocks prevent a system from going into a low power state */
 #ifdef CONFIG_HAS_WAKELOCK
-	dhd_wake_lock_init(dhd->wl_wdwake, dhd_bus_to_dev(bus), "wlan_wd_wake");
+	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
+	dhd_wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake");
+	dhd_wake_lock_init(&dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake");
 #endif /* CONFIG_HAS_WAKELOCK */
 
 #if defined(OEM_ANDROID)
@@ -11698,12 +11817,6 @@
 		goto fail;
 	}
 #endif /* WL_EVENT */
-#ifdef WL_TIMER
-	if (wl_timer_attach(net) != 0) {
-		DHD_ERROR(("wl_ext_timer_attach failed\n"));
-		goto fail;
-	}
-#endif /* WL_TIMER */
 #ifdef WL_ESCAN
 	/* Attach and link in the escan */
 	if (wl_escan_attach(net) != 0) {
@@ -11866,6 +11979,13 @@
 	}
 #endif /* DHD_PCIE_RUNTIMEPM */
 
+#ifdef SHOW_LOGTRACE
+	skb_queue_head_init(&dhd->evt_trace_queue);
+
+	/* Create ring proc entries */
+	dhd_dbg_ring_proc_create(&dhd->pub);
+#endif /* SHOW_LOGTRACE */
+
 #ifdef BTLOG
 	skb_queue_head_init(&dhd->bt_log_queue);
 #endif /* BTLOG */
@@ -11897,13 +12017,6 @@
 		}
 	}
 #endif /* !BCMDBUS */
-
-#ifdef SHOW_LOGTRACE
-	skb_queue_head_init(&dhd->evt_trace_queue);
-
-	/* Create ring proc entries */
-	dhd_dbg_ring_proc_create(&dhd->pub);
-#endif /* SHOW_LOGTRACE */
 
 	dhd_state |= DHD_ATTACH_STATE_THREADS_CREATED;
 
@@ -12788,12 +12901,10 @@
 	dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE);
 #endif /* BT_OVER_PCIE */
 
-#ifdef BCMPCIE
-#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(BCMPCIE)
 	if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION))
 		rk_dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE);
 #endif /* CUSTOMER_HW_ROCKCHIP && BCMPCIE */
-#endif /* BCMPCIE */
 
 #if defined(CONFIG_ARCH_EXYNOS) && defined(BCMPCIE)
 #if !defined(CONFIG_SOC_EXYNOS8890) && !defined(SUPPORT_EXYNOS7420)
@@ -13351,7 +13462,7 @@
 
 	old_fs = get_fs();
 	set_fs(get_ds());
-	if ((ret = dhd_vfs_stat(config_path, &stat))) {
+	if ((ret = vfs_stat(config_path, &stat))) {
 		set_fs(old_fs);
 		printk(KERN_ERR "%s: Failed to get information (%d)\n",
 			config_path, ret);
@@ -13814,8 +13925,12 @@
 	else {
 		bcmstrtok(&ptr, "\n", 0);
 		/* Print fw version info */
+		DHD_ERROR(("Firmware version = %s\n", buf));
 		strncpy(fw_version, buf, FW_VER_STR_LEN);
 		fw_version[FW_VER_STR_LEN-1] = '\0';
+#if defined(BCMSDIO) || defined(BCMPCIE)
+		dhd_set_version_info(dhd, buf);
+#endif /* BCMSDIO || BCMPCIE */
 	}
 
 	/* query for 'wlc_ver' to get version info from firmware */
@@ -13830,12 +13945,14 @@
 		dhd->wlc_ver_major = wlc_ver.wlc_ver_major;
 		dhd->wlc_ver_minor = wlc_ver.wlc_ver_minor;
 	}
+#ifdef BOARD_HIKEY
 	/* Set op_mode as MFG_MODE if WLTEST is present in "wl ver" */
 	if (strstr(fw_version, "WLTEST") != NULL) {
 		DHD_ERROR(("%s: wl ver has WLTEST, setting op_mode as DHD_FLAG_MFG_MODE\n",
 			__FUNCTION__));
 		op_mode = DHD_FLAG_MFG_MODE;
 	}
+#endif /* BOARD_HIKEY */
 	/* get a capabilities from firmware */
 	ret = dhd_get_fw_capabilities(dhd);
 
@@ -13992,7 +14109,6 @@
 
 	DHD_ERROR(("Firmware up: op_mode=0x%04x, MAC="MACDBG"\n",
 		dhd->op_mode, MAC2STRDBG(dhd->mac.octet)));
-	dhd_set_version_info(dhd, fw_version);
 #if defined(DHD_BLOB_EXISTENCE_CHECK)
 	if (!dhd->is_blob)
 #endif /* DHD_BLOB_EXISTENCE_CHECK */
@@ -14185,10 +14301,6 @@
 	dhd_update_flow_prio_map(dhd, DHD_FLOW_PRIO_LLR_MAP);
 #endif /* defined(BCMPCIE) && defined(EAPOL_PKT_PRIO) */
 
-#if defined(BCMSDIO) && defined(DHD_LOSSLESS_ROAMING)
-	dhd_update_sdio_data_prio_map(dhd);
-#endif /* BCMSDIO && DHD_LOSSLESS_ROAMING */
-
 #ifdef ARP_OFFLOAD_SUPPORT
 	DHD_ERROR(("arp_enable:%d arp_ol:%d\n",
 		dhd->arpoe_enable, dhd->arpol_configured));
@@ -14200,64 +14312,60 @@
 	 */
 #ifdef PKT_FILTER_SUPPORT
 	/* Setup default defintions for pktfilter , enable in suspend */
-	if (dhd_master_mode) {
-		dhd->pktfilter_count = 6;
-		dhd->pktfilter[DHD_BROADCAST_FILTER_NUM] = NULL;
-		if (!FW_SUPPORTED(dhd, pf6)) {
-			dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = NULL;
-			dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = NULL;
-		} else {
-			/* Immediately pkt filter TYPE 6 Discard IPv4/IPv6 Multicast Packet */
-			dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = DISCARD_IPV4_MCAST;
-			dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = DISCARD_IPV6_MCAST;
-		}
-		/* apply APP pktfilter */
-		dhd->pktfilter[DHD_ARP_FILTER_NUM] = "105 0 0 12 0xFFFF 0x0806";
+	dhd->pktfilter_count = 6;
+	dhd->pktfilter[DHD_BROADCAST_FILTER_NUM] = NULL;
+	if (!FW_SUPPORTED(dhd, pf6)) {
+		dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = NULL;
+		dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = NULL;
+	} else {
+		/* Immediately pkt filter TYPE 6 Discard IPv4/IPv6 Multicast Packet */
+		dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = DISCARD_IPV4_MCAST;
+		dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = DISCARD_IPV6_MCAST;
+	}
+	/* apply APP pktfilter */
+	dhd->pktfilter[DHD_ARP_FILTER_NUM] = "105 0 0 12 0xFFFF 0x0806";
 
 #ifdef BLOCK_IPV6_PACKET
-		/* Setup filter to allow only IPv4 unicast frames */
-		dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 "
-			HEX_PREF_STR UNI_FILTER_STR ZERO_ADDR_STR ETHER_TYPE_STR IPV6_FILTER_STR
-			" "
-			HEX_PREF_STR ZERO_ADDR_STR ZERO_ADDR_STR ETHER_TYPE_STR ZERO_TYPE_STR;
+	/* Setup filter to allow only IPv4 unicast frames */
+	dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 "
+		HEX_PREF_STR UNI_FILTER_STR ZERO_ADDR_STR ETHER_TYPE_STR IPV6_FILTER_STR
+		" "
+		HEX_PREF_STR ZERO_ADDR_STR ZERO_ADDR_STR ETHER_TYPE_STR ZERO_TYPE_STR;
 #else
-		/* Setup filter to allow only unicast */
-		dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 0x01 0x00";
+	/* Setup filter to allow only unicast */
+	dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 0x01 0x00";
 #endif /* BLOCK_IPV6_PACKET */
 
 #ifdef PASS_IPV4_SUSPEND
-		/* XXX customer want to get IPv4 multicast packets */
-		dhd->pktfilter[DHD_MDNS_FILTER_NUM] = "104 0 0 0 0xFFFFFF 0x01005E";
+	/* XXX customer want to get IPv4 multicast packets */
+	dhd->pktfilter[DHD_MDNS_FILTER_NUM] = "104 0 0 0 0xFFFFFF 0x01005E";
 #else
-		/* Add filter to pass multicastDNS packet and NOT filter out as Broadcast */
-		dhd->pktfilter[DHD_MDNS_FILTER_NUM] = NULL;
+	/* Add filter to pass multicastDNS packet and NOT filter out as Broadcast */
+	dhd->pktfilter[DHD_MDNS_FILTER_NUM] = NULL;
 #endif /* PASS_IPV4_SUSPEND */
-		if (FW_SUPPORTED(dhd, pf6)) {
-			/* Immediately pkt filter TYPE 6 Dicard Broadcast IP packet */
-			dhd->pktfilter[DHD_IP4BCAST_DROP_FILTER_NUM] = DISCARD_IPV4_BCAST;
-			/* Immediately pkt filter TYPE 6 Dicard Cisco STP packet */
-			dhd->pktfilter[DHD_LLC_STP_DROP_FILTER_NUM] = DISCARD_LLC_STP;
-			/* Immediately pkt filter TYPE 6 Dicard Cisco XID protocol */
-			dhd->pktfilter[DHD_LLC_XID_DROP_FILTER_NUM] = DISCARD_LLC_XID;
-			/* Immediately pkt filter TYPE 6 Dicard NETBIOS packet(port 137) */
-			dhd->pktfilter[DHD_UDPNETBIOS_DROP_FILTER_NUM] = DISCARD_UDPNETBIOS;
-			dhd->pktfilter_count = 11;
-		}
+	if (FW_SUPPORTED(dhd, pf6)) {
+		/* Immediately pkt filter TYPE 6 Dicard Broadcast IP packet */
+		dhd->pktfilter[DHD_IP4BCAST_DROP_FILTER_NUM] = DISCARD_IPV4_BCAST;
+		/* Immediately pkt filter TYPE 6 Dicard Cisco STP packet */
+		dhd->pktfilter[DHD_LLC_STP_DROP_FILTER_NUM] = DISCARD_LLC_STP;
+		/* Immediately pkt filter TYPE 6 Dicard Cisco XID protocol */
+		dhd->pktfilter[DHD_LLC_XID_DROP_FILTER_NUM] = DISCARD_LLC_XID;
+		/* Immediately pkt filter TYPE 6 Dicard NETBIOS packet(port 137) */
+		dhd->pktfilter[DHD_UDPNETBIOS_DROP_FILTER_NUM] = DISCARD_UDPNETBIOS;
+		dhd->pktfilter_count = 11;
+	}
 
 #ifdef GAN_LITE_NAT_KEEPALIVE_FILTER
-		dhd->pktfilter_count = 4;
-		/* Setup filter to block broadcast and NAT Keepalive packets */
-		/* discard all broadcast packets */
-		dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 0xffffff 0xffffff";
-		/* discard NAT Keepalive packets */
-		dhd->pktfilter[DHD_BROADCAST_FILTER_NUM] = "102 0 0 36 0xffffffff 0x11940009";
-		/* discard NAT Keepalive packets */
-		dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = "104 0 0 38 0xffffffff 0x11940009";
-		dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = NULL;
+	dhd->pktfilter_count = 4;
+	/* Setup filter to block broadcast and NAT Keepalive packets */
+	/* discard all broadcast packets */
+	dhd->pktfilter[DHD_UNICAST_FILTER_NUM] = "100 0 0 0 0xffffff 0xffffff";
+	/* discard NAT Keepalive packets */
+	dhd->pktfilter[DHD_BROADCAST_FILTER_NUM] = "102 0 0 36 0xffffffff 0x11940009";
+	/* discard NAT Keepalive packets */
+	dhd->pktfilter[DHD_MULTICAST4_FILTER_NUM] = "104 0 0 38 0xffffffff 0x11940009";
+	dhd->pktfilter[DHD_MULTICAST6_FILTER_NUM] = NULL;
 #endif /* GAN_LITE_NAT_KEEPALIVE_FILTER */
-	} else
-		dhd_conf_discard_pkt_filter(dhd);
-	dhd_conf_add_pkt_filter(dhd);
 
 #if defined(SOFTAP)
 	if (ap_fw_loaded) {
@@ -14499,7 +14607,6 @@
 	dhd_set_bandlock(dhd);
 
 done:
-	dhd_conf_postinit_ioctls(dhd);
 	if (iov_buf) {
 		MFREE(dhd->osh, iov_buf, WLC_IOCTL_SMLEN);
 	}
@@ -14768,12 +14875,14 @@
 		fw_version[FW_VER_STR_LEN-1] = '\0';
 	}
 
+#ifdef BOARD_HIKEY
 	/* Set op_mode as MFG_MODE if WLTEST is present in "wl ver" */
 	if (strstr(fw_version, "WLTEST") != NULL) {
 		DHD_ERROR(("%s: wl ver has WLTEST, setting op_mode as DHD_FLAG_MFG_MODE\n",
 			__FUNCTION__));
 		op_mode = DHD_FLAG_MFG_MODE;
 	}
+#endif /* BOARD_HIKEY */
 
 	if ((!op_mode && dhd_get_fw_mode(dhd->info) == DHD_FLAG_MFG_MODE) ||
 		(op_mode == DHD_FLAG_MFG_MODE)) {
@@ -15329,7 +15438,7 @@
 	}
 
 #else /* OEM_ANDROID */
-	if ((ret = dhd_apply_default_clm(dhd, dhd->clm_path)) < 0) {
+	if ((ret = dhd_apply_default_clm(dhd, clm_path)) < 0) {
 		DHD_ERROR(("%s: CLM set failed. Abort initialization.\n", __FUNCTION__));
 		goto done;
 	}
@@ -15721,10 +15830,6 @@
 	dhd_update_flow_prio_map(dhd, DHD_FLOW_PRIO_LLR_MAP);
 #endif /* defined(BCMPCIE) && defined(EAPOL_PKT_PRIO) */
 
-#if defined(BCMSDIO) && defined(DHD_LOSSLESS_ROAMING)
-	dhd_update_sdio_data_prio_map(dhd);
-#endif /* BCMSDIO && DHD_LOSSLESS_ROAMING */
-
 #ifdef RSSI_MONITOR_SUPPORT
 	setbit(mask, WLC_E_RSSI_LQM);
 #endif /* RSSI_MONITOR_SUPPORT */
@@ -15762,9 +15867,6 @@
 	setbit(mask, WLC_E_DELTS_IND);
 #endif /* WL_BCNRECV */
 	setbit(mask, WLC_E_COUNTRY_CODE_CHANGED);
-#if defined(WL_TWT) || defined(WL_TWT_HAL_IF)
-	setbit(mask, WLC_E_TWT);
-#endif /* WL_TWT || WL_TWT_HAL_IF */
 
 	/* Write updated Event mask */
 	eventmask_msg->ver = EVENTMSGS_VER;
@@ -17269,9 +17371,6 @@
 #ifdef WL_ESCAN
 	wl_escan_detach(dev);
 #endif /* WL_ESCAN */
-#ifdef WL_TIMER
-	wl_timer_dettach(dhdp);
-#endif /* WL_TIMER */
 #ifdef WL_EVENT
 	wl_ext_event_dettach(dhdp);
 #endif /* WL_EVENT */
@@ -17545,7 +17644,9 @@
 	DHD_TRACE(("wd wakelock count:%d\n", dhd->wakelock_wd_counter));
 #ifdef CONFIG_HAS_WAKELOCK
 	dhd->wakelock_wd_counter = 0;
-	dhd_wake_lock_destroy(dhd->wl_wdwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_wdwake);
+	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
+	dhd_wake_lock_unlock_destroy(&dhd->wl_wifi);
 #endif /* CONFIG_HAS_WAKELOCK */
 	if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) {
 		DHD_OS_WAKE_LOCK_DESTROY(dhd);
@@ -18425,7 +18526,7 @@
 		/* convert to BCME_NOTFOUND error for error handling */
 		ret = BCME_NOTFOUND;
 	} else
-		DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size));
+		 DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size));
 
 	return ret;
 }
@@ -18443,14 +18544,14 @@
 	struct file *fp;
 	int size;
 
-	fp = dhd_filp_open(filename, O_RDONLY, 0);
+	fp = filp_open(filename, O_RDONLY, 0);
 	/*
-	 * 2.6.11 (FC4) supports dhd_filp_open() but later revs don't?
+	 * 2.6.11 (FC4) supports filp_open() but later revs don't?
 	 * Alternative:
 	 * fp = open_namei(AT_FDCWD, filename, O_RD, 0);
 	 * ???
 	 */
-	 if (IS_ERR(fp) || (fp == NULL)) {
+	 if (IS_ERR(fp)) {
 		 fp = NULL;
 		 goto err;
 	 }
@@ -18461,7 +18562,7 @@
 		 goto err;
 	 }
 
-	 size = dhd_i_size_read(file_inode(fp));
+	 size = i_size_read(file_inode(fp));
 	 if (size <= 0) {
 		 DHD_ERROR(("%s: %s file size invalid %d\n", __FUNCTION__, filename, size));
 		 fp = NULL;
@@ -18485,8 +18586,8 @@
 		return 0;
 	}
 
-	size = dhd_i_size_read(file_inode(fp));
-	rdlen = dhd_kernel_read_compat(fp, fp->f_pos, buf, MIN(len, size));
+	size = i_size_read(file_inode(fp));
+	rdlen = kernel_read_compat(fp, fp->f_pos, buf, MIN(len, size));
 
 	if (len >= size && size != rdlen) {
 		return -EIO;
@@ -18511,7 +18612,7 @@
 	if (!image)
 		return 0;
 
-	rd_len = dhd_kernel_read_compat(fp, fp->f_pos, str, len);
+	rd_len = kernel_read_compat(fp, fp->f_pos, str, len);
 	str_end = strnchr(str, len, '\n');
 	if (str_end == NULL) {
 		goto err;
@@ -18536,7 +18637,7 @@
 		return 0;
 	}
 
-	size = dhd_i_size_read(file_inode(fp));
+	size = i_size_read(file_inode(fp));
 
 	return size;
 }
@@ -18545,7 +18646,7 @@
 dhd_os_close_image1(dhd_pub_t *pub, void *image)
 {
 	if (image) {
-		dhd_filp_close((struct file *)image, NULL);
+		filp_close((struct file *)image, NULL);
 	}
 }
 
@@ -20888,14 +20989,14 @@
 #endif
 
 	/* open file to write */
-	fp = dhd_filp_open(file_name, flags, 0664);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(file_name, flags, 0664);
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("open file error, err = %ld\n", PTR_ERR(fp)));
 		goto exit;
 	}
 
 	/* Write buf to file */
-	ret = dhd_vfs_write(fp, buf, size, &pos);
+	ret = vfs_write(fp, buf, size, &pos);
 	if (ret < 0) {
 		DHD_ERROR(("write file error, err = %d\n", ret));
 		goto exit;
@@ -20903,7 +21004,7 @@
 
 	/* Sync file from filesystem to physical media */
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
-	ret = dhd_vfs_fsync(fp, 0);
+	ret = vfs_fsync(fp, 0);
 #else
 	ret = vfs_fsync(fp, fp->f_path.dentry, 0);
 #endif
@@ -20916,7 +21017,7 @@
 exit:
 	/* close file before return */
 	if (!IS_ERR(fp))
-		dhd_filp_close(fp, current->files);
+		filp_close(fp, current->files);
 
 	/* restore previous address limit */
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
@@ -21108,14 +21209,14 @@
 	 */
 	file_mode = O_CREAT | O_WRONLY | O_SYNC;
 	{
-		struct file *fp = dhd_filp_open(memdump_path, file_mode, 0664);
+		struct file *fp = filp_open(memdump_path, file_mode, 0664);
 		/* Check if it is live Brix image having /installmedia, else use /data */
-		if (IS_ERR(fp) || (fp == NULL)) {
+		if (IS_ERR(fp)) {
 			DHD_ERROR(("open file %s, try /data/\n", memdump_path));
 			snprintf(memdump_path, sizeof(memdump_path), "%s%s_%s_" "%s",
 				"/data/", fname, memdump_type,  dhd->debug_dump_time_str);
 		} else {
-			dhd_filp_close(fp, NULL);
+			filp_close(fp, NULL);
 		}
 	}
 #else
@@ -21153,15 +21254,11 @@
 		ret = dhd->wakelock_rx_timeout_enable > dhd->wakelock_ctrl_timeout_enable ?
 			dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable;
 #ifdef CONFIG_HAS_WAKELOCK
-#ifdef DHD_DEBUG_WAKE_LOCK
-		printf("%s: rx_timeout=%dms, ctrl_timeout=%dms\n", __FUNCTION__,
-		dhd->wakelock_rx_timeout_enable, dhd->wakelock_ctrl_timeout_enable);
-#endif
 		if (dhd->wakelock_rx_timeout_enable)
-			dhd_wake_lock_timeout(dhd->wl_rxwake,
+			dhd_wake_lock_timeout(&dhd->wl_rxwake,
 				msecs_to_jiffies(dhd->wakelock_rx_timeout_enable));
 		if (dhd->wakelock_ctrl_timeout_enable)
-			dhd_wake_lock_timeout(dhd->wl_ctrlwake,
+			dhd_wake_lock_timeout(&dhd->wl_ctrlwake,
 				msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable));
 #endif
 		dhd->wakelock_rx_timeout_enable = 0;
@@ -21218,8 +21315,8 @@
 		DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags);
 		dhd->wakelock_ctrl_timeout_enable = 0;
 #ifdef CONFIG_HAS_WAKELOCK
-		if (dhd_wake_lock_active(dhd->wl_ctrlwake))
-			dhd_wake_unlock(dhd->wl_ctrlwake);
+		if (dhd_wake_lock_active(&dhd->wl_ctrlwake))
+			dhd_wake_unlock(&dhd->wl_ctrlwake);
 #endif
 		DHD_WAKE_SPIN_UNLOCK(&dhd->wakelock_spinlock, flags);
 	}
@@ -21453,7 +21550,7 @@
 		DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags);
 		if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-			dhd_wake_lock(dhd->wl_wifi);
+			dhd_wake_lock(&dhd->wl_wifi);
 #elif defined(BCMSDIO)
 			dhd_bus_dev_pm_stay_awake(pub);
 #endif
@@ -21477,7 +21574,7 @@
 
 	if (dhd) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_lock(dhd->wl_evtwake);
+		dhd_wake_lock(&dhd->wl_evtwake);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_stay_awake(pub);
 #endif
@@ -21491,7 +21588,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(dhd->wl_pmwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(&dhd->wl_pmwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21503,7 +21600,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(dhd->wl_txflwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(&dhd->wl_txflwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21515,7 +21612,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(dhd->wl_nanwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(&dhd->wl_nanwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21549,7 +21646,7 @@
 #endif /* DHD_TRACE_WAKE_LOCK */
 			if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-				dhd_wake_unlock(dhd->wl_wifi);
+				dhd_wake_unlock(&dhd->wl_wifi);
 #elif defined(BCMSDIO)
 				dhd_bus_dev_pm_relax(pub);
 #endif
@@ -21567,7 +21664,7 @@
 
 	if (dhd) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_unlock(dhd->wl_evtwake);
+		dhd_wake_unlock(&dhd->wl_evtwake);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_relax(pub);
 #endif
@@ -21581,8 +21678,8 @@
 
 	if (dhd) {
 		/* if wl_pmwake is active, unlock it */
-		if (dhd_wake_lock_active(dhd->wl_pmwake)) {
-			dhd_wake_unlock(dhd->wl_pmwake);
+		if (dhd_wake_lock_active(&dhd->wl_pmwake)) {
+			dhd_wake_unlock(&dhd->wl_pmwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21595,8 +21692,8 @@
 
 	if (dhd) {
 		/* if wl_txflwake is active, unlock it */
-		if (dhd_wake_lock_active(dhd->wl_txflwake)) {
-			dhd_wake_unlock(dhd->wl_txflwake);
+		if (dhd_wake_lock_active(&dhd->wl_txflwake)) {
+			dhd_wake_unlock(&dhd->wl_txflwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21609,8 +21706,8 @@
 
 	if (dhd) {
 		/* if wl_nanwake is active, unlock it */
-		if (dhd_wake_lock_active(dhd->wl_nanwake)) {
-			dhd_wake_unlock(dhd->wl_nanwake);
+		if (dhd_wake_lock_active(&dhd->wl_nanwake)) {
+			dhd_wake_unlock(&dhd->wl_nanwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21635,8 +21732,8 @@
 
 #ifdef CONFIG_HAS_WAKELOCK
 	c = dhd->wakelock_counter;
-	l1 = dhd_wake_lock_active(dhd->wl_wifi);
-	l2 = dhd_wake_lock_active(dhd->wl_wdwake);
+	l1 = dhd_wake_lock_active(&dhd->wl_wifi);
+	l2 = dhd_wake_lock_active(&dhd->wl_wdwake);
 	lock_active = (l1 || l2);
 	/* Indicate to the SD Host to avoid going to suspend if internal locks are up */
 	if (lock_active) {
@@ -21679,20 +21776,20 @@
 
 #ifdef CONFIG_HAS_WAKELOCK
 	c = dhd->wakelock_counter;
-	l1 = dhd_wake_lock_active(dhd->wl_wifi);
-	l2 = dhd_wake_lock_active(dhd->wl_wdwake);
-	l3 = dhd_wake_lock_active(dhd->wl_rxwake);
-	l4 = dhd_wake_lock_active(dhd->wl_ctrlwake);
-	l7 = dhd_wake_lock_active(dhd->wl_evtwake);
+	l1 = dhd_wake_lock_active(&dhd->wl_wifi);
+	l2 = dhd_wake_lock_active(&dhd->wl_wdwake);
+	l3 = dhd_wake_lock_active(&dhd->wl_rxwake);
+	l4 = dhd_wake_lock_active(&dhd->wl_ctrlwake);
+	l7 = dhd_wake_lock_active(&dhd->wl_evtwake);
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	l5 = dhd_wake_lock_active(dhd->wl_intrwake);
+	l5 = dhd_wake_lock_active(&dhd->wl_intrwake);
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	l6 = dhd_wake_lock_active(dhd->wl_scanwake);
+	l6 = dhd_wake_lock_active(&dhd->wl_scanwake);
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	l8 = dhd_wake_lock_active(dhd->wl_pmwake);
-	l9 = dhd_wake_lock_active(dhd->wl_txflwake);
-	l10 = dhd_wake_lock_active(dhd->wl_nanwake);
+	l8 = dhd_wake_lock_active(&dhd->wl_pmwake);
+	l9 = dhd_wake_lock_active(&dhd->wl_txflwake);
+	l10 = dhd_wake_lock_active(&dhd->wl_nanwake);
 	lock_active = (l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 || l9 || l10);
 
 	/* Indicate to the Host to avoid going to suspend if internal locks are up */
@@ -21732,7 +21829,7 @@
 		if (dhd->wakelock_wd_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
 			/* if wakelock_wd_counter was never used : lock it at once */
-			dhd_wake_lock(dhd->wl_wdwake);
+			dhd_wake_lock(&dhd->wl_wdwake);
 #endif
 		}
 		dhd->wakelock_wd_counter++;
@@ -21754,7 +21851,7 @@
 			dhd->wakelock_wd_counter = 0;
 			if (!dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-				dhd_wake_unlock(dhd->wl_wdwake);
+				dhd_wake_unlock(&dhd->wl_wdwake);
 #endif
 			}
 		}
@@ -21767,13 +21864,16 @@
 void
 dhd_os_oob_irq_wake_lock_timeout(dhd_pub_t *pub, int val)
 {
-#ifdef CONFIG_HAS_WAKELOCK
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(dhd->wl_intrwake, msecs_to_jiffies(val));
-	}
+#ifdef CONFIG_HAS_WAKELOCK
+		dhd_wake_lock_timeout(&dhd->wl_intrwake, msecs_to_jiffies(val));
+#else
+		printk("%s: =========\n",__FUNCTION__);
+		wake_lock_timeout(&dhd->rx_wakelock, 5*HZ);
 #endif /* CONFIG_HAS_WAKELOCK */
+	}
 }
 
 void
@@ -21784,8 +21884,8 @@
 
 	if (dhd) {
 		/* if wl_intrwake is active, unlock it */
-		if (dhd_wake_lock_active(dhd->wl_intrwake)) {
-			dhd_wake_unlock(dhd->wl_intrwake);
+		if (dhd_wake_lock_active(&dhd->wl_intrwake)) {
+			dhd_wake_unlock(&dhd->wl_intrwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21800,7 +21900,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(dhd->wl_scanwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(&dhd->wl_scanwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
 }
@@ -21813,8 +21913,8 @@
 
 	if (dhd) {
 		/* if wl_scanwake is active, unlock it */
-		if (dhd_wake_lock_active(dhd->wl_scanwake)) {
-			dhd_wake_unlock(dhd->wl_scanwake);
+		if (dhd_wake_lock_active(&dhd->wl_scanwake)) {
+			dhd_wake_unlock(&dhd->wl_scanwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21880,13 +21980,13 @@
 
 	if (dhd->wakelock_before_waive == 0 && dhd->wakelock_counter > 0) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_lock(dhd->wl_wifi);
+		dhd_wake_lock(&dhd->wl_wifi);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_stay_awake(&dhd->pub);
 #endif
 	} else if (dhd->wakelock_before_waive > 0 && dhd->wakelock_counter == 0) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_unlock(dhd->wl_wifi);
+		dhd_wake_unlock(&dhd->wl_wifi);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_relax(&dhd->pub);
 #endif
@@ -21906,23 +22006,24 @@
 	dhd->wakelock_ctrl_timeout_enable = 0;
 	/* wakelocks prevent a system from going into a low power state */
 #ifdef CONFIG_HAS_WAKELOCK
-	dhd_wake_lock_init(dhd->wl_wifi, dhd_bus_to_dev(dhd->pub.bus), "wlan_wake");
-	dhd_wake_lock_init(dhd->wl_rxwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_rx_wake");
-	dhd_wake_lock_init(dhd->wl_ctrlwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_ctrl_wake");
-	dhd_wake_lock_init(dhd->wl_evtwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_evt_wake");
-	dhd_wake_lock_init(dhd->wl_pmwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_pm_wake");
-	dhd_wake_lock_init(dhd->wl_txflwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_txfl_wake");
+	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
+	dhd_wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake");
+	dhd_wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake");
+	dhd_wake_lock_init(&dhd->wl_evtwake, WAKE_LOCK_SUSPEND, "wlan_evt_wake");
+	dhd_wake_lock_init(&dhd->wl_pmwake, WAKE_LOCK_SUSPEND, "wlan_pm_wake");
+	dhd_wake_lock_init(&dhd->wl_txflwake, WAKE_LOCK_SUSPEND, "wlan_txfl_wake");
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	dhd_wake_lock_init(dhd->wl_intrwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_oob_irq_wake");
+	dhd_wake_lock_init(&dhd->wl_intrwake, WAKE_LOCK_SUSPEND, "wlan_oob_irq_wake");
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	dhd_wake_lock_init(dhd->wl_scanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_scan_wake");
+	dhd_wake_lock_init(&dhd->wl_scanwake, WAKE_LOCK_SUSPEND, "wlan_scan_wake");
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	dhd_wake_lock_init(dhd->wl_nanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_nan_wake");
+	dhd_wake_lock_init(&dhd->wl_nanwake, WAKE_LOCK_SUSPEND, "wlan_nan_wake");
 #endif /* CONFIG_HAS_WAKELOCK */
 #ifdef DHD_TRACE_WAKE_LOCK
 	dhd_wk_lock_trace_init(dhd);
 #endif /* DHD_TRACE_WAKE_LOCK */
+	wake_lock_init(&dhd->rx_wakelock, WAKE_LOCK_SUSPEND, "wlan_rx_wakelock");
 }
 
 void dhd_os_wake_lock_destroy(struct dhd_info *dhd)
@@ -21932,19 +22033,19 @@
 	dhd->wakelock_counter = 0;
 	dhd->wakelock_rx_timeout_enable = 0;
 	dhd->wakelock_ctrl_timeout_enable = 0;
-	dhd_wake_lock_destroy(dhd->wl_wifi);
-	dhd_wake_lock_destroy(dhd->wl_rxwake);
-	dhd_wake_lock_destroy(dhd->wl_ctrlwake);
-	dhd_wake_lock_destroy(dhd->wl_evtwake);
-	dhd_wake_lock_destroy(dhd->wl_pmwake);
-	dhd_wake_lock_destroy(dhd->wl_txflwake);
+	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
+	dhd_wake_lock_unlock_destroy(&dhd->wl_rxwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_ctrlwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_evtwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_pmwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_txflwake);
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	dhd_wake_lock_destroy(dhd->wl_intrwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_intrwake);
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	dhd_wake_lock_destroy(dhd->wl_scanwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_scanwake);
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	dhd_wake_lock_destroy(dhd->wl_nanwake);
+	dhd_wake_lock_unlock_destroy(&dhd->wl_nanwake);
 #ifdef DHD_TRACE_WAKE_LOCK
 	dhd_wk_lock_trace_deinit(dhd);
 #endif /* DHD_TRACE_WAKE_LOCK */
@@ -21955,6 +22056,7 @@
 		while (dhd_os_wake_unlock(&dhd->pub));
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
+	wake_lock_destroy(&dhd->rx_wakelock);
 }
 
 bool dhd_os_check_if_up(dhd_pub_t *pub)
@@ -22479,8 +22581,8 @@
 	loff_t pos = 0;
 
 	/* Read memdump info from the file */
-	fp = dhd_filp_open(filepath, file_mode, 0);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(filepath, file_mode, 0);
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("%s: File [%s] doesn't exist\n", __FUNCTION__, filepath));
 #if defined(CONFIG_X86) && defined(OEM_ANDROID)
 		/* Check if it is Live Brix Image */
@@ -22490,8 +22592,8 @@
 		/* Try if it is Installed Brix Image */
 		filepath = RNDINFO_INST".in";
 		DHD_ERROR(("%s: Try File [%s]\n", __FUNCTION__, filepath));
-		fp = dhd_filp_open(filepath, file_mode, 0);
-		if (IS_ERR(fp) || (fp == NULL)) {
+		fp = filp_open(filepath, file_mode, 0);
+		if (IS_ERR(fp)) {
 			DHD_ERROR(("%s: File [%s] doesn't exist\n", __FUNCTION__, filepath));
 			goto err1;
 		}
@@ -22504,7 +22606,7 @@
 	set_fs(KERNEL_DS);
 
 	/* Handle success case */
-	ret = dhd_vfs_read(fp, (char *)&dhd->rnd_len, sizeof(dhd->rnd_len), &pos);
+	ret = vfs_read(fp, (char *)&dhd->rnd_len, sizeof(dhd->rnd_len), &pos);
 	if (ret < 0) {
 		DHD_ERROR(("%s: rnd_len read error, ret=%d\n", __FUNCTION__, ret));
 		goto err2;
@@ -22516,14 +22618,14 @@
 		goto err2;
 	}
 
-	ret = dhd_vfs_read(fp, (char *)dhd->rnd_buf, dhd->rnd_len, &pos);
+	ret = vfs_read(fp, (char *)dhd->rnd_buf, dhd->rnd_len, &pos);
 	if (ret < 0) {
 		DHD_ERROR(("%s: rnd_buf read error, ret=%d\n", __FUNCTION__, ret));
 		goto err3;
 	}
 
 	set_fs(old_fs);
-	dhd_filp_close(fp, NULL);
+	filp_close(fp, NULL);
 
 	DHD_ERROR(("%s: RND read from %s\n", __FUNCTION__, filepath));
 	return BCME_OK;
@@ -22533,7 +22635,7 @@
 	dhd->rnd_buf = NULL;
 err2:
 	set_fs(old_fs);
-	dhd_filp_close(fp, NULL);
+	filp_close(fp, NULL);
 err1:
 	return BCME_ERROR;
 }
@@ -22549,8 +22651,8 @@
 	loff_t pos = 0;
 
 	/* Read memdump info from the file */
-	fp = dhd_filp_open(filepath, file_mode, 0664);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(filepath, file_mode, 0664);
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("%s: File [%s] doesn't exist\n", __FUNCTION__, filepath));
 #if defined(CONFIG_X86) && defined(OEM_ANDROID)
 		/* Check if it is Live Brix Image */
@@ -22560,8 +22662,8 @@
 		/* Try if it is Installed Brix Image */
 		filepath = RNDINFO_INST".out";
 		DHD_ERROR(("%s: Try File [%s]\n", __FUNCTION__, filepath));
-		fp = dhd_filp_open(filepath, file_mode, 0664);
-		if (IS_ERR(fp) || (fp == NULL)) {
+		fp = filp_open(filepath, file_mode, 0664);
+		if (IS_ERR(fp)) {
 			DHD_ERROR(("%s: File [%s] doesn't exist\n", __FUNCTION__, filepath));
 			goto err1;
 		}
@@ -22574,26 +22676,26 @@
 	set_fs(KERNEL_DS);
 
 	/* Handle success case */
-	ret = dhd_vfs_write(fp, (char *)&rnd_len, sizeof(rnd_len), &pos);
+	ret = vfs_write(fp, (char *)&rnd_len, sizeof(rnd_len), &pos);
 	if (ret < 0) {
 		DHD_ERROR(("%s: rnd_len write error, ret=%d\n", __FUNCTION__, ret));
 		goto err2;
 	}
 
-	ret = dhd_vfs_write(fp, (char *)rnd_buf, rnd_len, &pos);
+	ret = vfs_write(fp, (char *)rnd_buf, rnd_len, &pos);
 	if (ret < 0) {
 		DHD_ERROR(("%s: rnd_buf write error, ret=%d\n", __FUNCTION__, ret));
 		goto err2;
 	}
 
 	set_fs(old_fs);
-	dhd_filp_close(fp, NULL);
+	filp_close(fp, NULL);
 	DHD_ERROR(("%s: RND written to %s\n", __FUNCTION__, filepath));
 	return BCME_OK;
 
 err2:
 	set_fs(old_fs);
-	dhd_filp_close(fp, NULL);
+	filp_close(fp, NULL);
 err1:
 	return BCME_ERROR;
 
@@ -24511,8 +24613,8 @@
 	else
 		file_mode = O_CREAT | O_RDWR | O_SYNC;
 
-	fp = dhd_filp_open(dump_path, file_mode, 0664);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(dump_path, file_mode, 0664);
+	if (IS_ERR(fp)) {
 		/* If android installed image, try '/data' directory */
 #if defined(CONFIG_X86) && defined(OEM_ANDROID)
 		DHD_ERROR(("%s: File open error on Installed android image, trying /data...\n",
@@ -24523,8 +24625,8 @@
 				sizeof(dump_path) - strlen(dump_path),
 				"_%s", dhdp->debug_dump_time_str);
 		}
-		fp = dhd_filp_open(dump_path, file_mode, 0664);
-		if (IS_ERR(fp) || (fp == NULL)) {
+		fp = filp_open(dump_path, file_mode, 0664);
+		if (IS_ERR(fp)) {
 			ret = PTR_ERR(fp);
 			DHD_ERROR(("open file error, err = %d\n", ret));
 			goto exit2;
@@ -24538,7 +24640,7 @@
 	}
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
-	ret = dhd_vfs_stat(dump_path, &stat);
+	ret = vfs_stat(dump_path, &stat);
 	if (ret < 0) {
 		DHD_ERROR(("file stat error, err = %d\n", ret));
 		goto exit2;
@@ -24707,7 +24809,7 @@
 
 exit2:
 	if (!IS_ERR(fp) && fp != NULL) {
-		dhd_filp_close(fp, NULL);
+		filp_close(fp, NULL);
 		DHD_ERROR(("%s: Finished writing log dump to file - '%s' \n",
 				__FUNCTION__, dump_path));
 	}
@@ -24742,7 +24844,7 @@
 	int ret = BCME_OK;
 
 	if (fp) {
-		ret = dhd_vfs_write(fp, mem_buf, buf_len, (loff_t *)pos);
+		ret = vfs_write(fp, mem_buf, buf_len, (loff_t *)pos);
 		if (ret < 0) {
 			DHD_ERROR(("write file error, err = %d\n", ret));
 			goto exit;
@@ -26643,8 +26745,8 @@
 	struct file *fp;
 	char *filepath = VENDOR_PATH CONFIG_BCMDHD_CLM_PATH;
 
-	fp = dhd_filp_open(filepath, O_RDONLY, 0);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(filepath, O_RDONLY, 0);
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("%s: ----- blob file doesn't exist (%s) -----\n", __FUNCTION__,
 			filepath));
 		dhdp->is_blob = FALSE;
@@ -26656,7 +26758,7 @@
 #else
 		BCM_REFERENCE(fw_path);
 #endif /* SKIP_CONCATE_BLOB */
-		dhd_filp_close(fp, NULL);
+		filp_close(fp, NULL);
 	}
 }
 #endif /* DHD_BLOB_EXISTENCE_CHECK */
@@ -26813,14 +26915,14 @@
 #endif
 
 	/* File is always created. */
-	fp = dhd_filp_open(filepath, O_RDWR | O_CREAT, 0664);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(filepath, O_RDWR | O_CREAT, 0664);
+	if (IS_ERR(fp)) {
 		DHD_ERROR(("%s: Couldn't open file '%s' err %ld\n",
 			__FUNCTION__, filepath, PTR_ERR(fp)));
 		ret = BCME_ERROR;
 	} else {
 		if (fp->f_mode & FMODE_WRITE) {
-			ret = dhd_vfs_write(fp, buf, buf_len, &fp->f_pos);
+			ret = vfs_write(fp, buf, buf_len, &fp->f_pos);
 			if (ret < 0) {
 				DHD_ERROR(("%s: Couldn't write file '%s'\n",
 					__FUNCTION__, filepath));
@@ -26829,7 +26931,7 @@
 				ret = BCME_OK;
 			}
 		}
-		dhd_filp_close(fp, NULL);
+		filp_close(fp, NULL);
 	}
 
 	/* restore previous address limit */
@@ -26855,8 +26957,8 @@
 	set_fs(KERNEL_DS);
 #endif
 
-	fp = dhd_filp_open(filepath, O_RDONLY, 0);
-	if (IS_ERR(fp) || (fp == NULL)) {
+	fp = filp_open(filepath, O_RDONLY, 0);
+	if (IS_ERR(fp)) {
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
 		set_fs(old_fs);
 #endif
@@ -26864,8 +26966,8 @@
 		return BCME_ERROR;
 	}
 
-	ret = dhd_kernel_read_compat(fp, 0, buf, buf_len);
-	dhd_filp_close(fp, NULL);
+	ret = kernel_read_compat(fp, 0, buf, buf_len);
+	filp_close(fp, NULL);
 
 	/* restore previous address limit */
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
@@ -27172,7 +27274,15 @@
 dhd_get_random_bytes(uint8 *buf, uint len)
 {
 #ifdef BCMPCIE
-	get_random_bytes(buf, len);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
+	int rndlen = get_random_bytes_arch(buf, len);
+	if (rndlen != len) {
+		bzero(buf, len);
+		get_random_bytes(buf, len);
+	}
+#else
+	get_random_bytes_arch(buf, len);
+#endif
 #endif /* BCMPCIE */
 	return BCME_OK;
 }
@@ -29657,15 +29767,27 @@
 }
 /* END of DHD RING */
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0))
+#define DHD_VFS_INODE(dir) (dir->d_inode)
+#else
+#define DHD_VFS_INODE(dir) d_inode(dir)
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0))
+#define DHD_VFS_UNLINK(dir, b, c) vfs_unlink(DHD_VFS_INODE(dir), b)
+#else
+#define DHD_VFS_UNLINK(dir, b, c) vfs_unlink(DHD_VFS_INODE(dir), b, c)
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0) */
+
 #if ((defined DHD_DUMP_MNGR) || (defined DNGL_AXI_ERROR_LOGGING))
 int
 dhd_file_delete(char *path)
 {
-	struct path file_path = {.dentry = 0};
+	struct path file_path;
 	int err;
 	struct dentry *dir;
 
-	err = dhd_kern_path(path, 0, &file_path);
+	err = kern_path(path, 0, &file_path);
 
 	if (err < 0) {
 		DHD_ERROR(("Failed to get kern-path delete file: %s error: %d\n", path, err));

--
Gitblit v1.6.2