X-Git-Url: http://plrg.eecs.uci.edu/git/?p=firefly-linux-kernel-4.4.55.git;a=blobdiff_plain;f=drivers%2Fnet%2Fwireless%2Frockchip_wlan%2Frkwifi%2Fbcmdhd%2Fdhd_linux.c;h=9daa6e2c76a11cd61310493154c6857528f05fe0;hp=29c5a0e831dbcfb147e2f03a03b1ecf731029371;hb=b3cc5f24d3608b440a1b5801da084d38879c8be8;hpb=504990202432113cb29513925cd89762e6d390d2 diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c old mode 100755 new mode 100644 index 29c5a0e831db..9daa6e2c76a1 --- a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c @@ -81,6 +81,9 @@ #include #include #include +#ifdef WL_ESCAN +#include +#endif #include #ifdef CONFIG_HAS_WAKELOCK #include @@ -5714,17 +5717,35 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) goto done; } ioc.cmd = compat_ioc.cmd; - ioc.buf = compat_ptr(compat_ioc.buf); - ioc.len = compat_ioc.len; - ioc.set = compat_ioc.set; - ioc.used = compat_ioc.used; - ioc.needed = compat_ioc.needed; - /* To differentiate between wl and dhd read 4 more byes */ - if ((copy_from_user(&ioc.driver, (char *)ifr->ifr_data + sizeof(compat_wl_ioctl_t), - sizeof(uint)) != 0)) { - ret = BCME_BADADDR; - goto done; - } + if (ioc.cmd & WLC_SPEC_FLAG) { + memset(&ioc, 0, sizeof(ioc)); + /* Copy the ioc control structure part of ioctl request */ + if (copy_from_user(&ioc, ifr->ifr_data, sizeof(wl_ioctl_t))) { + ret = BCME_BADADDR; + goto done; + } + ioc.cmd &= ~WLC_SPEC_FLAG; /* Clear the FLAG */ + + /* To differentiate between wl and dhd read 4 more byes */ + if ((copy_from_user(&ioc.driver, (char *)ifr->ifr_data + sizeof(wl_ioctl_t), + sizeof(uint)) != 0)) { + ret = BCME_BADADDR; + goto done; + } + + } else { /* ioc.cmd & WLC_SPEC_FLAG */ + ioc.buf = compat_ptr(compat_ioc.buf); + ioc.len = compat_ioc.len; + ioc.set = compat_ioc.set; + ioc.used = compat_ioc.used; + ioc.needed = compat_ioc.needed; + /* To differentiate between wl and dhd read 4 more byes */ + if ((copy_from_user(&ioc.driver, (char *)ifr->ifr_data + sizeof(compat_wl_ioctl_t), + sizeof(uint)) != 0)) { + ret = BCME_BADADDR; + goto done; + } + } /* ioc.cmd & WLC_SPEC_FLAG */ } else #endif /* CONFIG_COMPAT */ { @@ -5733,7 +5754,9 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) ret = BCME_BADADDR; goto done; } - +#ifdef CONFIG_COMPAT + ioc.cmd &= ~WLC_SPEC_FLAG; /* make sure it was clear when it isn't a compat task*/ +#endif /* To differentiate between wl and dhd read 4 more byes */ if ((copy_from_user(&ioc.driver, (char *)ifr->ifr_data + sizeof(wl_ioctl_t), sizeof(uint)) != 0)) { @@ -7221,6 +7244,9 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) } dhd_state |= DHD_ATTACH_STATE_WL_ATTACH; } +#ifdef WL_ESCAN + wl_escan_attach(net, (void *)&dhd->pub); +#endif #endif /* defined(WL_WIRELESS_EXT) */ #ifdef SHOW_LOGTRACE @@ -8792,6 +8818,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #ifdef WLTDLS setbit(eventmask, WLC_E_TDLS_PEER_EVENT); #endif /* WLTDLS */ +#ifdef WL_ESCAN + setbit(eventmask, WLC_E_ESCAN_RESULT); +#endif #ifdef WL_CFG80211 setbit(eventmask, WLC_E_ESCAN_RESULT); setbit(eventmask, WLC_E_AP_STARTED); @@ -9663,6 +9692,9 @@ void dhd_detach(dhd_pub_t *dhdp) /* Detatch and unlink in the iw */ wl_iw_detach(); } +#ifdef WL_ESCAN + wl_escan_detach(); +#endif #endif /* defined(WL_WIRELESS_EXT) */ /* delete all interfaces, start with virtual */ @@ -9939,7 +9971,7 @@ dhd_module_cleanup(void) printf("%s: Exit\n", __FUNCTION__); } -static void __exit +static void dhd_module_exit(void) { dhd_buzzz_detach(); @@ -9947,11 +9979,11 @@ dhd_module_exit(void) unregister_reboot_notifier(&dhd_reboot_notifier); } -static int __init +static int dhd_module_init(void) { int err; - int retry = POWERUP_MAX_RETRY; + int retry = 0; printf("%s: in\n", __FUNCTION__); @@ -10010,7 +10042,37 @@ dhd_reboot_callback(struct notifier_block *this, unsigned long code, void *unuse return NOTIFY_DONE; } +static int wifi_init_thread(void *data) +{ + dhd_module_init(); + + return 0; +} +int rockchip_wifi_init_module_rkwifi(void) +{ + struct task_struct *kthread = NULL; + + kthread = kthread_run(wifi_init_thread, NULL, "wifi_init_thread"); + if (IS_ERR(kthread)) + pr_err("create wifi_init_thread failed.\n"); + + return 0; +} + +void rockchip_wifi_exit_module_rkwifi(void) +{ + dhd_module_exit(); +} + +#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP +late_initcall(rockchip_wifi_init_module_rkwifi); +module_exit(rockchip_wifi_exit_module_rkwifi); +#else +module_init(rockchip_wifi_init_module_rkwifi); +module_exit(rockchip_wifi_exit_module_rkwifi); +#endif +#if 0 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) #if defined(CONFIG_DEFERRED_INITCALLS) #if defined(CONFIG_MACH_UNIVERSAL7420) || defined(CONFIG_SOC_EXYNOS8890) || \ @@ -10032,6 +10094,7 @@ module_init(dhd_module_init); module_exit(dhd_module_exit); +#endif /* * OS specific functions required to implement DHD driver in OS independent way */ @@ -12405,7 +12468,7 @@ bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret) net = dhd_idx2net(dhdp, ifidx); if (!net) { DHD_ERROR(("%s : Invalid index : %d\n", __FUNCTION__, ifidx)); - return -EINVAL; + return FALSE; } return dhd_check_hang(net, dhdp, ret);