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