static int WIFI_open(struct inode *inode, struct file *file) { WIFI_INFO_FUNC("%s: major %d minor %d (pid %d)\n", __func__, imajor(inode), iminor(inode), current->pid ); //TODO //Disable EINT(external interrupt), and set the GPIO to EINT mode. #if 1 /* turn on WIFI */ if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { WIFI_WARN_FUNC("WMT turn on WIFI fail!\n"); return -ENODEV; }else{ retflag = 0; WIFI_INFO_FUNC("WMT register WIFI rst cb!\n"); } #endif return 0; }
ssize_t WIFI_write(struct file * filp, const char __user * buf, size_t count, loff_t * f_pos) { int retval = -EIO; char local[4] = { 0 }; static int opened = 0; down(&wr_mtx); if (count > 0) { if (0 == copy_from_user(local, buf, (count > 4) ? 4 : count)) { WIFI_INFO_FUNC("WIFI_write %c\n", local[0]); if (local[0] == '0' && opened == 1) { /* TODO */ /* Configure the EINT pin to GPIO mode. */ if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_WIFI)) { WIFI_INFO_FUNC ("WMT turn off WIFI fail!\n"); } else { WIFI_INFO_FUNC ("WMT turn off WIFI OK!\n"); opened = 0; retval = count; } } else if (local[0] == '1') { /* TODO */ /* Disable EINT(external interrupt), and set the GPIO to EINT mode. */ if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { WIFI_WARN_FUNC ("WMT turn on WIFI fail!\n"); } else { opened = 1; retval = count; WIFI_INFO_FUNC ("WMT turn on WIFI success!\n"); } } } } up(&wr_mtx); return retval; }
/*-----------------------------------------------------------------*/ INT32 wifi_reset_end(ENUM_RESET_STATUS_T status) { struct net_device *netdev = NULL; PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; INT32 wait_cnt = 0; INT32 ret = -1; if (status == RESET_FAIL) { /* whole chip reset fail, donot recover WIFI */ ret = 0; up(&wr_mtx); } else if (status == RESET_SUCCESS) { WIFI_WARN_FUNC("WIFI state recovering...\n"); if (powered == 1) { /* WIFI is on before whole chip reset, reopen it now */ if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { WIFI_ERR_FUNC("WMT turn on WIFI fail!\n"); goto done; } else { WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); } if (pf_set_p2p_mode == NULL) { WIFI_ERR_FUNC("Set p2p mode handler is NULL\n"); goto done; } netdev = dev_get_by_name(&init_net, ifname); while (netdev == NULL && wait_cnt < 10) { WIFI_ERR_FUNC("Fail to get %s net device, sleep 300ms\n", ifname); msleep(300); wait_cnt ++; netdev = dev_get_by_name(&init_net, ifname); } if (wait_cnt >= 10) { WIFI_ERR_FUNC("Get %s net device timeout\n", ifname); goto done; } if (wlan_mode == WLAN_MODE_STA_P2P){ p2pmode.u4Enable = 1; p2pmode.u4Mode = 0; if (pf_set_p2p_mode(netdev, p2pmode) != 0){ WIFI_ERR_FUNC("Set wlan mode fail\n"); } else{ WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_STA_P2P); ret = 0; } } else if (wlan_mode == WLAN_MODE_AP){ p2pmode.u4Enable = 1; p2pmode.u4Mode = 1; if (pf_set_p2p_mode(netdev, p2pmode) != 0){ WIFI_ERR_FUNC("Set wlan mode fail\n"); } else{ WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_AP); ret = 0; } } done: if (netdev != NULL){ dev_put(netdev); } } else { /* WIFI is off before whole chip reset, do nothing */ ret = 0; } up(&wr_mtx); } return ret; }
ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { int retval = -EIO; char local[12] = {0}; static int opened = 0; int ret = -1; struct net_device *netdev = NULL; PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; int wait_cnt = 0; down(&wr_mtx); if (count <= 0) { WIFI_INFO_FUNC("WIFI_write invalid param \n"); goto done; } if (0 == copy_from_user(local, buf, (count > sizeof(local)) ? sizeof(local) : count)) { /*mtk80707 rollback aosp hal*/ local[11] = 0; WIFI_INFO_FUNC("WIFI_write %s\n", local); if (local[0] == '0' && opened == 1) { //TODO //Configure the EINT pin to GPIO mode. p2pmode.u4Enable = 0; p2pmode.u4Mode = 0; /*IF power off already*/ if (power_state == 0) { WIFI_INFO_FUNC("WMT turn off WIFI OK!\n"); opened = 0; retval = count; wlan_mode = WLAN_MODE_HALT; goto done; } if (flagIsIFchanged==1) { netdev = dev_get_by_name(&init_net, WLAN_LEG_IFACE_NAME);} else {netdev = dev_get_by_name(&init_net, WLAN_IFACE_NAME);} while (netdev == NULL && wait_cnt < 10) { WIFI_WARN_FUNC("WMT fail to get wlan0 net device, sleep 300ms\n"); msleep(300); wait_cnt ++; if (flagIsIFchanged==1) { netdev = dev_get_by_name(&init_net, WLAN_LEG_IFACE_NAME);} else { netdev = dev_get_by_name(&init_net, WLAN_IFACE_NAME);} } if (wait_cnt >= 10) { WIFI_WARN_FUNC("WMT get wlan0 net device time out\n"); goto done; } if (pf_set_p2p_mode) { ret = pf_set_p2p_mode(netdev, p2pmode); if (ret != 0) { WIFI_WARN_FUNC("WMT trun off p2p & ap mode ret = %d", ret); goto done; } //msleep(300); } dev_put(netdev); netdev = NULL; if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_WIFI)) { WIFI_INFO_FUNC("WMT turn off WIFI fail!\n"); } else { WIFI_INFO_FUNC("WMT turn off WIFI OK!\n"); opened = 0; retval = count; wlan_mode = WLAN_MODE_HALT; power_state = 0; flagIsIFchanged=0; PowerOnIFname = 0; } } else if (local[0] == '1') { //TODO //Disable EINT(external interrupt), and set the GPIO to EINT mode. if (power_state == 1){ WIFI_INFO_FUNC("WIFI is already on!\n"); retval = count; } else { pf_set_p2p_mode = NULL; if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { WIFI_WARN_FUNC("WMT turn on WIFI fail!\n"); } else { opened = 1; retval = count; WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); wlan_mode = WLAN_MODE_HALT; power_state = 1; //msleep(300); } } } else if (local[0] == 'S' || local[0] == 'P' || local[0] == 'A') { p2pmode.u4Enable = 1; p2pmode.u4Mode = 0; ret = -1; if (power_state ==0) { WIFI_INFO_FUNC("Turn on WIFI first if WIFI is off\n"); if(local[0] == 'A') { PowerOnIFname = 1; //legacy_wlan0 printk("change PoweronIFname\n"); } pf_set_p2p_mode = NULL; if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { WIFI_WARN_FUNC("WMT turn on WIFI fail!\n"); } else { opened = 1; retval = count; WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); wlan_mode = WLAN_MODE_HALT; power_state = 1; if (local[0] == 'A'){ flagIsIFchanged=1;} } } if (flagIsIFchanged==1) {netdev = dev_get_by_name(&init_net, WLAN_LEG_IFACE_NAME); } else { netdev = dev_get_by_name(&init_net, WLAN_IFACE_NAME); if (local[0] == 'A'&&netdev!=NULL) { rtnl_lock(); ret = dev_change_name(netdev,WLAN_LEG_IFACE_NAME); rtnl_unlock(); flagIsIFchanged=1; printk("change_leagcy_name, ret = %d",ret); } } while (netdev == NULL && wait_cnt < 10) { WIFI_WARN_FUNC("WMT fail to get wlan0 net device, sleep 300ms\n"); msleep(300); wait_cnt ++; if (flagIsIFchanged==1) {netdev = dev_get_by_name(&init_net, WLAN_LEG_IFACE_NAME);} else { netdev = dev_get_by_name(&init_net, WLAN_IFACE_NAME); if (local[0] == 'A'&&netdev!=NULL) { rtnl_lock(); ret = dev_change_name(netdev,WLAN_LEG_IFACE_NAME); rtnl_unlock(); flagIsIFchanged=1; printk("change_leagcy_name, ret = %d",ret); } } } if (wait_cnt >= 10) { WIFI_WARN_FUNC("WMT get wlan0 net device time out\n"); goto done; } if (pf_set_p2p_mode == NULL) { WIFI_INFO_FUNC("set p2p handler is NULL\n"); goto done; } if (wlan_mode == WLAN_MODE_AP&&(local[0] == 'S' || local[0] == 'P') ) { p2pmode.u4Enable = 0; p2pmode.u4Mode = 0; ret = pf_set_p2p_mode(netdev, p2pmode); // msleep(300); WIFI_INFO_FUNC("success to turn off p2p/AP mode\n"); } p2pmode.u4Enable = 1; p2pmode.u4Mode = 0; ret = -1; if (local[0] == 'A') { p2pmode.u4Mode = 1; } ret = pf_set_p2p_mode(netdev, p2pmode); //msleep(300); dev_put(netdev); netdev = NULL; WIFI_INFO_FUNC("WMT WIFI set p2p mode ret=%d\n", ret); if (ret == 0 && (local[0] == 'S' || local[0] == 'P')) { WIFI_INFO_FUNC("wlan mode %d --> %d\n", wlan_mode, WLAN_MODE_STA_P2P); wlan_mode = WLAN_MODE_STA_P2P; retval = count; } else if (ret == 0 && local[0] == 'A') { WIFI_INFO_FUNC("wlan mode %d --> %d\n", wlan_mode, WLAN_MODE_AP); wlan_mode = WLAN_MODE_AP; retval = count; } else { WIFI_INFO_FUNC("fail to set wlan mode\n"); } } } done: up(&wr_mtx); if (netdev != NULL) { dev_put(netdev); } return (retval); }