From 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 07:44:59 +0000
Subject: [PATCH] gmac get mac form eeprom
---
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