Path: blob/master/ALFA-W1F1/RTL8814AU/os_dep/linux/os_intfs.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _OS_INTFS_C_1516#include <drv_types.h>17#include <hal_data.h>1819MODULE_LICENSE("GPL");20MODULE_DESCRIPTION("Realtek Wireless Lan Driver");21MODULE_AUTHOR("Realtek Semiconductor Corp.");22MODULE_VERSION(DRIVERVERSION);2324/* module param defaults */25int rtw_chip_version = 0x00;26int rtw_rfintfs = HWPI;27int rtw_lbkmode = 0;/* RTL8712_AIR_TRX; */28#ifdef DBG_LA_MODE29int rtw_la_mode_en=0;30module_param(rtw_la_mode_en, int, 0644);31#endif32int rtw_network_mode = Ndis802_11IBSS;/* Ndis802_11Infrastructure; */ /* infra, ad-hoc, auto */33/* NDIS_802_11_SSID ssid; */34int rtw_channel = 1;/* ad-hoc support requirement */35int rtw_wireless_mode = WIRELESS_MODE_MAX;36module_param(rtw_wireless_mode, int, 0644);37int rtw_vrtl_carrier_sense = AUTO_VCS;38int rtw_vcs_type = RTS_CTS;39int rtw_rts_thresh = 2347;40int rtw_frag_thresh = 2346;41int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */42int rtw_scan_mode = 1;/* active, passive */43/* int smart_ps = 1; */44#ifdef CONFIG_POWER_SAVING45/* IPS configuration */46int rtw_ips_mode = RTW_IPS_MODE;4748/* LPS configuration */49/* RTW_LPS_MODE=0:disable, 1:LPS , 2:LPS with clock gating, 3: power gating */50#if (RTW_LPS_MODE > 0)51int rtw_power_mgnt = PS_MODE_MAX;5253#ifdef CONFIG_USB_HCI54int rtw_lps_level = LPS_NORMAL; /*USB default LPS level*/55#else /*SDIO,PCIE*/56int rtw_lps_level = (RTW_LPS_MODE - 1);57#endif/*CONFIG_USB_HCI*/58#else59int rtw_power_mgnt = PS_MODE_ACTIVE;60int rtw_lps_level = LPS_NORMAL;61#endif6263int rtw_lps_chk_by_tp = 1;6465/* WOW LPS configuration */66#ifdef CONFIG_WOWLAN67/* RTW_WOW_LPS_MODE=0:disable, 1:LPS , 2:LPS with clock gating, 3: power gating */68#if (RTW_WOW_LPS_MODE > 0)69int rtw_wow_power_mgnt = PS_MODE_MAX;70int rtw_wow_lps_level = (RTW_WOW_LPS_MODE - 1);71#else72int rtw_wow_power_mgnt = PS_MODE_ACTIVE;73int rtw_wow_lps_level = LPS_NORMAL;74#endif75#endif /* CONFIG_WOWLAN */7677#else /* !CONFIG_POWER_SAVING */78int rtw_ips_mode = IPS_NONE;79int rtw_power_mgnt = PS_MODE_ACTIVE;80int rtw_lps_level = LPS_NORMAL;81int rtw_lps_chk_by_tp = 0;82#ifdef CONFIG_WOWLAN83int rtw_wow_power_mgnt = PS_MODE_ACTIVE;84int rtw_wow_lps_level = LPS_NORMAL;85#endif /* CONFIG_WOWLAN */86#endif /* CONFIG_POWER_SAVING */8788#ifdef CONFIG_NARROWBAND_SUPPORTING89int rtw_nb_config = CONFIG_NB_VALUE;90module_param(rtw_nb_config, int, 0644);91MODULE_PARM_DESC(rtw_nb_config, "5M/10M/Normal bandwidth configuration");92#endif9394module_param(rtw_ips_mode, int, 0644);95MODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode");9697module_param(rtw_lps_level, int, 0644);98MODULE_PARM_DESC(rtw_lps_level, "The default LPS level");99100#ifdef CONFIG_LPS_1T1R101int rtw_lps_1t1r = RTW_LPS_1T1R;102module_param(rtw_lps_1t1r, int, 0644);103MODULE_PARM_DESC(rtw_lps_1t1r, "The default LPS 1T1R setting");104#endif105106module_param(rtw_lps_chk_by_tp, int, 0644);107108#ifdef CONFIG_WOWLAN109module_param(rtw_wow_power_mgnt, int, 0644);110MODULE_PARM_DESC(rtw_wow_power_mgnt, "The default WOW LPS mode");111module_param(rtw_wow_lps_level, int, 0644);112MODULE_PARM_DESC(rtw_wow_lps_level, "The default WOW LPS level");113#ifdef CONFIG_LPS_1T1R114int rtw_wow_lps_1t1r = RTW_WOW_LPS_1T1R;115module_param(rtw_wow_lps_1t1r, int, 0644);116MODULE_PARM_DESC(rtw_wow_lps_1t1r, "The default WOW LPS 1T1R setting");117#endif118#endif /* CONFIG_WOWLAN */119120/* LPS:121* rtw_smart_ps = 0 => TX: pwr bit = 1, RX: PS_Poll122* rtw_smart_ps = 1 => TX: pwr bit = 0, RX: PS_Poll123* rtw_smart_ps = 2 => TX: pwr bit = 0, RX: NullData with pwr bit = 0124*/125int rtw_smart_ps = 2;126127int rtw_max_bss_cnt = 0;128module_param(rtw_max_bss_cnt, int, 0644);129#ifdef CONFIG_WMMPS_STA130/* WMMPS:131* rtw_smart_ps = 0 => Only for fw test132* rtw_smart_ps = 1 => Refer to Beacon's TIM Bitmap133* rtw_smart_ps = 2 => Don't refer to Beacon's TIM Bitmap134*/135int rtw_wmm_smart_ps = 2;136#endif /* CONFIG_WMMPS_STA */137138int rtw_check_fw_ps = 1;139140#ifdef CONFIG_TX_EARLY_MODE141int rtw_early_mode = 1;142#endif143144#ifdef CONFIG_SW_LED145int rtw_led_ctrl = 1; // default to normal blink146#endif147148int rtw_usb_rxagg_mode = 2;/* RX_AGG_DMA=1, RX_AGG_USB=2 */149module_param(rtw_usb_rxagg_mode, int, 0644);150151int rtw_dynamic_agg_enable = 1;152module_param(rtw_dynamic_agg_enable, int, 0644);153154/* set log level when inserting driver module, default log level is _DRV_INFO_ = 4,155* please refer to "How_to_set_driver_debug_log_level.doc" to set the available level.156*/157#ifdef CONFIG_RTW_DEBUG158#ifdef RTW_LOG_LEVEL159uint rtw_drv_log_level = (uint)RTW_LOG_LEVEL; /* from Makefile */160#else161uint rtw_drv_log_level = _DRV_INFO_;162#endif163module_param(rtw_drv_log_level, uint, 0644);164MODULE_PARM_DESC(rtw_drv_log_level, "set log level when insert driver module, default log level is _DRV_INFO_ = 4");165#endif166int rtw_radio_enable = 1;167int rtw_long_retry_lmt = 7;168int rtw_short_retry_lmt = 7;169int rtw_busy_thresh = 40;170/* int qos_enable = 0; */ /* * */171int rtw_ack_policy = NORMAL_ACK;172173int rtw_mp_mode = 0;174175#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTW_CUSTOMER_STR)176uint rtw_mp_customer_str = 0;177module_param(rtw_mp_customer_str, uint, 0644);178MODULE_PARM_DESC(rtw_mp_customer_str, "Whether or not to enable customer str support on MP mode");179#endif180181int rtw_software_encrypt = 0;182int rtw_software_decrypt = 0;183184int rtw_acm_method = 0;/* 0:By SW 1:By HW. */185186int rtw_wmm_enable = 1;/* default is set to enable the wmm. */187188#ifdef CONFIG_WMMPS_STA189/* uapsd (unscheduled automatic power-save delivery) = a kind of wmmps */190/* 0: NO_LIMIT, 1: TWO_MSDU, 2: FOUR_MSDU, 3: SIX_MSDU */191int rtw_uapsd_max_sp = NO_LIMIT;192/* BIT0: AC_VO UAPSD, BIT1: AC_VI UAPSD, BIT2: AC_BK UAPSD, BIT3: AC_BE UAPSD */193int rtw_uapsd_ac_enable = 0x0;194#endif /* CONFIG_WMMPS_STA */195196#if defined(CONFIG_RTL8814A)197int rtw_pwrtrim_enable = 2; /* disable kfree , rename to power trim disable */198#elif defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C)199/*PHYDM API, must enable by default*/200int rtw_pwrtrim_enable = 1;201#else202int rtw_pwrtrim_enable = 0; /* Default Enable power trim by efuse config */203#endif204205#if CONFIG_TX_AC_LIFETIME206uint rtw_tx_aclt_flags = CONFIG_TX_ACLT_FLAGS;207module_param(rtw_tx_aclt_flags, uint, 0644);208MODULE_PARM_DESC(rtw_tx_aclt_flags, "device TX AC queue packet lifetime control flags");209210static uint rtw_tx_aclt_conf_default[3] = CONFIG_TX_ACLT_CONF_DEFAULT;211static uint rtw_tx_aclt_conf_default_num = 0;212module_param_array(rtw_tx_aclt_conf_default, uint, &rtw_tx_aclt_conf_default_num, 0644);213MODULE_PARM_DESC(rtw_tx_aclt_conf_default, "device TX AC queue lifetime config for default status");214215#ifdef CONFIG_TX_MCAST2UNI216static uint rtw_tx_aclt_conf_ap_m2u[3] = CONFIG_TX_ACLT_CONF_AP_M2U;217static uint rtw_tx_aclt_conf_ap_m2u_num = 0;218module_param_array(rtw_tx_aclt_conf_ap_m2u, uint, &rtw_tx_aclt_conf_ap_m2u_num, 0644);219MODULE_PARM_DESC(rtw_tx_aclt_conf_ap_m2u, "device TX AC queue lifetime config for AP mode M2U status");220#endif221222#ifdef CONFIG_RTW_MESH223static uint rtw_tx_aclt_conf_mesh[3] = CONFIG_TX_ACLT_CONF_MESH;224static uint rtw_tx_aclt_conf_mesh_num = 0;225module_param_array(rtw_tx_aclt_conf_mesh, uint, &rtw_tx_aclt_conf_mesh_num, 0644);226MODULE_PARM_DESC(rtw_tx_aclt_conf_mesh, "device TX AC queue lifetime config for MESH status");227#endif228#endif /* CONFIG_TX_AC_LIFETIME */229230uint rtw_tx_bw_mode = 0x21;231module_param(rtw_tx_bw_mode, uint, 0644);232MODULE_PARM_DESC(rtw_tx_bw_mode, "The max tx bw for 2.4G and 5G. format is the same as rtw_bw_mode");233234#ifdef CONFIG_FW_HANDLE_TXBCN235uint rtw_tbtt_rpt = 0; /*ROOT AP - BIT0, VAP1 - BIT1, VAP2 - BIT2, VAP3 - VAP3, FW report TBTT INT by C2H*/236module_param(rtw_tbtt_rpt, uint, 0644);237#endif238239#ifdef CONFIG_80211N_HT240int rtw_ht_enable = 1;241/* 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160MHz, 4: 80+80MHz242* 2.4G use bit 0 ~ 3, 5G use bit 4 ~ 7243* 0x21 means enable 2.4G 40MHz & 5G 80MHz */244#ifdef CONFIG_RTW_CUSTOMIZE_BWMODE245int rtw_bw_mode = CONFIG_RTW_CUSTOMIZE_BWMODE;246#else247int rtw_bw_mode = 0x21;248#endif249int rtw_ampdu_enable = 1;/* for enable tx_ampdu , */ /* 0: disable, 0x1:enable */250int rtw_rx_stbc = 1;/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */251#if (defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8814B) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C)) && defined(CONFIG_PCI_HCI)252int rtw_rx_ampdu_amsdu = 2;/* 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on */253#elif ((defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C)) && defined(CONFIG_SDIO_HCI))254int rtw_rx_ampdu_amsdu = 1;255#else256int rtw_rx_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on */257#endif258/*259* 2: Follow the AMSDU filed in ADDBA Resp. (Deault)260* 0: Force the AMSDU filed in ADDBA Resp. to be disabled.261* 1: Force the AMSDU filed in ADDBA Resp. to be enabled.262*/263int rtw_tx_ampdu_amsdu = 2;264265static uint rtw_rx_ampdu_sz_limit_1ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_1SS;266static uint rtw_rx_ampdu_sz_limit_1ss_num = 0;267module_param_array(rtw_rx_ampdu_sz_limit_1ss, uint, &rtw_rx_ampdu_sz_limit_1ss_num, 0644);268MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_1ss, "RX AMPDU size limit for 1SS link of each BW, 0xFF: no limitation");269270static uint rtw_rx_ampdu_sz_limit_2ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_2SS;271static uint rtw_rx_ampdu_sz_limit_2ss_num = 0;272module_param_array(rtw_rx_ampdu_sz_limit_2ss, uint, &rtw_rx_ampdu_sz_limit_2ss_num, 0644);273MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_2ss, "RX AMPDU size limit for 2SS link of each BW, 0xFF: no limitation");274275static uint rtw_rx_ampdu_sz_limit_3ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_3SS;276static uint rtw_rx_ampdu_sz_limit_3ss_num = 0;277module_param_array(rtw_rx_ampdu_sz_limit_3ss, uint, &rtw_rx_ampdu_sz_limit_3ss_num, 0644);278MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_3ss, "RX AMPDU size limit for 3SS link of each BW, 0xFF: no limitation");279280static uint rtw_rx_ampdu_sz_limit_4ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_4SS;281static uint rtw_rx_ampdu_sz_limit_4ss_num = 0;282module_param_array(rtw_rx_ampdu_sz_limit_4ss, uint, &rtw_rx_ampdu_sz_limit_4ss_num, 0644);283MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_4ss, "RX AMPDU size limit for 4SS link of each BW, 0xFF: no limitation");284285/* Short GI support Bit Map286* BIT0 - 20MHz, 0: non-support, 1: support287* BIT1 - 40MHz, 0: non-support, 1: support288* BIT2 - 80MHz, 0: non-support, 1: support289* BIT3 - 160MHz, 0: non-support, 1: support */290int rtw_short_gi = 0xf;291/* BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx */292int rtw_ldpc_cap = 0x33;293/* BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx */294int rtw_stbc_cap = 0x13;295296/*297* BIT0: Enable VHT SU Beamformer298* BIT1: Enable VHT SU Beamformee299* BIT2: Enable VHT MU Beamformer, depend on VHT SU Beamformer300* BIT3: Enable VHT MU Beamformee, depend on VHT SU Beamformee301* BIT4: Enable HT Beamformer302* BIT5: Enable HT Beamformee303*/304int rtw_beamform_cap = BIT(1) | BIT(3);305int rtw_bfer_rf_number = 0; /*BeamformerCapRfNum Rf path number, 0 for auto, others for manual*/306int rtw_bfee_rf_number = 0; /*BeamformeeCapRfNum Rf path number, 0 for auto, others for manual*/307308#endif /* CONFIG_80211N_HT */309310#ifdef CONFIG_80211AC_VHT311int rtw_vht_enable = 1; /* 0:disable, 1:enable, 2:force auto enable */312module_param(rtw_vht_enable, int, 0644);313314int rtw_ampdu_factor = 7;315316uint rtw_vht_rx_mcs_map = 0xaaaa;317module_param(rtw_vht_rx_mcs_map, uint, 0644);318MODULE_PARM_DESC(rtw_vht_rx_mcs_map, "VHT RX MCS map");319#endif /* CONFIG_80211AC_VHT */320321int rtw_lowrate_two_xmit = 1;/* Use 2 path Tx to transmit MCS0~7 and legacy mode */322323324/* 0: not check in watch dog, 1: check in watch dog */325int rtw_check_hw_status = 0;326327int rtw_low_power = 0;328int rtw_wifi_spec = 0;329330#ifdef CONFIG_SPECIAL_RF_PATH /* configure Nss/xTxR IC to 1ss/1T1R */331int rtw_rf_path = RF_1T1R;332int rtw_tx_nss = 1;333int rtw_rx_nss = 1;334#elif defined(CONFIG_CUSTOMER01_SMART_ANTENNA)335int rtw_rf_path = RF_2T2R;336int rtw_tx_nss = 1;337int rtw_rx_nss = 1;338#else339int rtw_rf_path = RF_TYPE_MAX;340int rtw_tx_nss = 0;341int rtw_rx_nss = 0;342#endif343module_param(rtw_rf_path, int, 0644);344module_param(rtw_tx_nss, int, 0644);345module_param(rtw_rx_nss, int, 0644);346347char rtw_country_unspecified[] = {0xFF, 0xFF, 0x00};348char *rtw_country_code = rtw_country_unspecified;349module_param(rtw_country_code, charp, 0644);350MODULE_PARM_DESC(rtw_country_code, "The default country code (in alpha2)");351352int rtw_channel_plan = CONFIG_RTW_CHPLAN;353module_param(rtw_channel_plan, int, 0644);354MODULE_PARM_DESC(rtw_channel_plan, "The default chplan ID when rtw_alpha2 is not specified or valid");355356static uint rtw_excl_chs[MAX_CHANNEL_NUM] = CONFIG_RTW_EXCL_CHS;357static int rtw_excl_chs_num = 0;358module_param_array(rtw_excl_chs, uint, &rtw_excl_chs_num, 0644);359MODULE_PARM_DESC(rtw_excl_chs, "exclusive channel array");360361/*if concurrent softap + p2p(GO) is needed, this param lets p2p response full channel list.362But Softap must be SHUT DOWN once P2P decide to set up connection and become a GO.*/363#ifdef CONFIG_FULL_CH_IN_P2P_HANDSHAKE364int rtw_full_ch_in_p2p_handshake = 1; /* reply full channel list*/365#else366int rtw_full_ch_in_p2p_handshake = 0; /* reply only softap channel*/367#endif368369#ifdef CONFIG_BT_COEXIST370int rtw_btcoex_enable = 2;371module_param(rtw_btcoex_enable, int, 0644);372MODULE_PARM_DESC(rtw_btcoex_enable, "BT co-existence on/off, 0:off, 1:on, 2:by efuse");373374int rtw_ant_num = 0;375module_param(rtw_ant_num, int, 0644);376MODULE_PARM_DESC(rtw_ant_num, "Antenna number setting, 0:by efuse");377378int rtw_bt_iso = 2;/* 0:Low, 1:High, 2:From Efuse */379int rtw_bt_sco = 3;/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy */380int rtw_bt_ampdu = 1 ; /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */381#endif /* CONFIG_BT_COEXIST */382383int rtw_AcceptAddbaReq = _TRUE;/* 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */384385int rtw_antdiv_cfg = 2; /* 0:OFF , 1:ON, 2:decide by Efuse config */386int rtw_antdiv_type = 0387; /* 0:decide by efuse 1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2: for 88EE, 1Tx and 2Rx are diversity.( 2 Ant, Tx and RxCG are both on aux port, RxCS is on main port ), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) */388389int rtw_drv_ant_band_switch = 1; /* 0:OFF , 1:ON, Driver control antenna band switch*/390391int rtw_single_ant_path; /*0:main ant , 1:aux ant , Fixed single antenna path, default main ant*/392393/* 0: doesn't switch, 1: switch from usb2.0 to usb 3.0 2: switch from usb3.0 to usb 2.0 */394int rtw_switch_usb_mode = 0;395396#ifdef CONFIG_USB_AUTOSUSPEND397int rtw_enusbss = 1;/* 0:disable,1:enable */398#else399int rtw_enusbss = 0;/* 0:disable,1:enable */400#endif401402int rtw_hwpdn_mode = 2; /* 0:disable,1:enable,2: by EFUSE config */403404#ifdef CONFIG_HW_PWRP_DETECTION405int rtw_hwpwrp_detect = 1;406#else407int rtw_hwpwrp_detect = 0; /* HW power ping detect 0:disable , 1:enable */408#endif409410#ifdef CONFIG_USB_HCI411int rtw_hw_wps_pbc = 1;412#else413int rtw_hw_wps_pbc = 0;414#endif415416#ifdef CONFIG_TX_MCAST2UNI417int rtw_mc2u_disable = 0;418#endif /* CONFIG_TX_MCAST2UNI */419420#ifdef CONFIG_80211D421int rtw_80211d = 0;422#endif423424#ifdef CONFIG_PCI_ASPM425/* CLK_REQ:BIT0 L0s:BIT1 ASPM_L1:BIT2 L1Off:BIT3*/426int rtw_pci_aspm_enable = 0x5;427#else428int rtw_pci_aspm_enable;429#endif430431/*432* BIT [15:12] mask of ps mode433* BIT [11:8] val of ps mode434* BIT [7:4] mask of perf mode435* BIT [3:0] val of perf mode436*437* L0s:BIT[+0] L1:BIT[+1]438*439* 0x0030: change value only if perf mode440* 0x3300: change value only if ps mode441* 0x3330: change value in both perf and ps mode442*/443#ifdef CONFIG_PCI_DYNAMIC_ASPM444#ifdef CONFIG_PCI_ASPM445int rtw_pci_dynamic_aspm_linkctrl = 0x3330;446#else447int rtw_pci_dynamic_aspm_linkctrl = 0x0030;448#endif449#else450int rtw_pci_dynamic_aspm_linkctrl = 0x0000;451#endif452module_param(rtw_pci_dynamic_aspm_linkctrl, int, 0644);453454#ifdef CONFIG_QOS_OPTIMIZATION455int rtw_qos_opt_enable = 1; /* 0: disable,1:enable */456#else457int rtw_qos_opt_enable = 0; /* 0: disable,1:enable */458#endif459module_param(rtw_qos_opt_enable, int, 0644);460461#ifdef CONFIG_RTW_ACS462int rtw_acs_auto_scan = 0; /*0:disable, 1:enable*/463module_param(rtw_acs_auto_scan, int, 0644);464465int rtw_acs = 1;466module_param(rtw_acs, int, 0644);467#endif468469#ifdef CONFIG_BACKGROUND_NOISE_MONITOR470int rtw_nm = 1;/*noise monitor*/471module_param(rtw_nm, int, 0644);472#endif473474char *ifname = "wlan%d";475module_param(ifname, charp, 0644);476MODULE_PARM_DESC(ifname, "The default name to allocate for first interface");477478#ifdef CONFIG_PLATFORM_ANDROID479char *if2name = "p2p%d";480#else /* CONFIG_PLATFORM_ANDROID */481char *if2name = "wlan%d";482#endif /* CONFIG_PLATFORM_ANDROID */483module_param(if2name, charp, 0644);484MODULE_PARM_DESC(if2name, "The default name to allocate for second interface");485486char *rtw_initmac = 0; /* temp mac address if users want to use instead of the mac address in Efuse */487488#ifdef CONFIG_CONCURRENT_MODE489490#if (CONFIG_IFACE_NUMBER > 2)491int rtw_virtual_iface_num = CONFIG_IFACE_NUMBER - 1;492module_param(rtw_virtual_iface_num, int, 0644);493#else494int rtw_virtual_iface_num = 1;495#endif496497#endif498#ifdef CONFIG_AP_MODE499u8 rtw_bmc_tx_rate = MGN_UNKNOWN;500#endif501#ifdef RTW_WOW_STA_MIX502int rtw_wowlan_sta_mix_mode = 1;503#else504int rtw_wowlan_sta_mix_mode = 0;505#endif506module_param(rtw_wowlan_sta_mix_mode, int, 0644);507module_param(rtw_pwrtrim_enable, int, 0644);508module_param(rtw_initmac, charp, 0644);509module_param(rtw_chip_version, int, 0644);510module_param(rtw_rfintfs, int, 0644);511module_param(rtw_lbkmode, int, 0644);512module_param(rtw_network_mode, int, 0644);513module_param(rtw_channel, int, 0644);514module_param(rtw_mp_mode, int, 0644);515module_param(rtw_wmm_enable, int, 0644);516#ifdef CONFIG_WMMPS_STA517module_param(rtw_uapsd_max_sp, int, 0644);518module_param(rtw_uapsd_ac_enable, int, 0644);519module_param(rtw_wmm_smart_ps, int, 0644);520#endif /* CONFIG_WMMPS_STA */521module_param(rtw_vrtl_carrier_sense, int, 0644);522module_param(rtw_vcs_type, int, 0644);523module_param(rtw_busy_thresh, int, 0644);524525#ifdef CONFIG_80211N_HT526module_param(rtw_ht_enable, int, 0644);527module_param(rtw_bw_mode, int, 0644);528module_param(rtw_ampdu_enable, int, 0644);529module_param(rtw_rx_stbc, int, 0644);530module_param(rtw_rx_ampdu_amsdu, int, 0644);531module_param(rtw_tx_ampdu_amsdu, int, 0644);532#endif /* CONFIG_80211N_HT */533534#ifdef CONFIG_BEAMFORMING535module_param(rtw_beamform_cap, int, 0644);536#endif537module_param(rtw_lowrate_two_xmit, int, 0644);538539module_param(rtw_power_mgnt, int, 0644);540module_param(rtw_smart_ps, int, 0644);541module_param(rtw_low_power, int, 0644);542module_param(rtw_wifi_spec, int, 0644);543544module_param(rtw_full_ch_in_p2p_handshake, int, 0644);545module_param(rtw_antdiv_cfg, int, 0644);546module_param(rtw_antdiv_type, int, 0644);547548module_param(rtw_drv_ant_band_switch, int, 0644);549module_param(rtw_single_ant_path, int, 0644);550551module_param(rtw_switch_usb_mode, int, 0644);552553module_param(rtw_enusbss, int, 0644);554module_param(rtw_hwpdn_mode, int, 0644);555module_param(rtw_hwpwrp_detect, int, 0644);556557module_param(rtw_hw_wps_pbc, int, 0644);558module_param(rtw_check_hw_status, int, 0644);559560#ifdef CONFIG_PCI_HCI561module_param(rtw_pci_aspm_enable, int, 0644);562#endif563564#ifdef CONFIG_TX_EARLY_MODE565module_param(rtw_early_mode, int, 0644);566#endif567568#ifdef CONFIG_SW_LED569module_param(rtw_led_ctrl, int, 0644);570MODULE_PARM_DESC(rtw_led_ctrl,"Led Control: 0=Always off, 1=Normal blink, 2=Always on");571#endif572573#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE574char *rtw_adaptor_info_caching_file_path = "/data/misc/wifi/rtw_cache";575module_param(rtw_adaptor_info_caching_file_path, charp, 0644);576MODULE_PARM_DESC(rtw_adaptor_info_caching_file_path, "The path of adapter info cache file");577#endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */578579#ifdef CONFIG_LAYER2_ROAMING580uint rtw_max_roaming_times = 2;581module_param(rtw_max_roaming_times, uint, 0644);582MODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try");583#endif /* CONFIG_LAYER2_ROAMING */584585#ifdef CONFIG_IOL586int rtw_fw_iol = 1;587module_param(rtw_fw_iol, int, 0644);588MODULE_PARM_DESC(rtw_fw_iol, "FW IOL. 0:Disable, 1:enable, 2:by usb speed");589#endif /* CONFIG_IOL */590591#ifdef CONFIG_FILE_FWIMG592char *rtw_fw_file_path = "/system/etc/firmware/rtlwifi/FW_NIC.BIN";593module_param(rtw_fw_file_path, charp, 0644);594MODULE_PARM_DESC(rtw_fw_file_path, "The path of fw image");595596char *rtw_fw_wow_file_path = "/system/etc/firmware/rtlwifi/FW_WoWLAN.BIN";597module_param(rtw_fw_wow_file_path, charp, 0644);598MODULE_PARM_DESC(rtw_fw_wow_file_path, "The path of fw for Wake on Wireless image");599600#ifdef CONFIG_MP_INCLUDED601char *rtw_fw_mp_bt_file_path = "";602module_param(rtw_fw_mp_bt_file_path, charp, 0644);603MODULE_PARM_DESC(rtw_fw_mp_bt_file_path, "The path of fw for MP-BT image");604#endif /* CONFIG_MP_INCLUDED */605#endif /* CONFIG_FILE_FWIMG */606607#ifdef CONFIG_TX_MCAST2UNI608module_param(rtw_mc2u_disable, int, 0644);609#endif /* CONFIG_TX_MCAST2UNI */610611#ifdef CONFIG_80211D612module_param(rtw_80211d, int, 0644);613MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism");614#endif615616#ifdef CONFIG_ADVANCE_OTA617/* BIT(0): OTA continuous rotated test within low RSSI,1R CCA in path B618BIT(1) & BIT(2): OTA continuous rotated test with low high RSSI */619/* Experimental environment: shielding room with half of absorber and 2~3 rotation per minute */620int rtw_advnace_ota;621module_param(rtw_advnace_ota, int, 0644);622#endif623624uint rtw_notch_filter = RTW_NOTCH_FILTER;625module_param(rtw_notch_filter, uint, 0644);626MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");627628uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;629module_param(rtw_hiq_filter, uint, 0644);630MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");631632uint rtw_adaptivity_en = CONFIG_RTW_ADAPTIVITY_EN;633module_param(rtw_adaptivity_en, uint, 0644);634MODULE_PARM_DESC(rtw_adaptivity_en, "0:disable, 1:enable");635636uint rtw_adaptivity_mode = CONFIG_RTW_ADAPTIVITY_MODE;637module_param(rtw_adaptivity_mode, uint, 0644);638MODULE_PARM_DESC(rtw_adaptivity_mode, "0:normal, 1:carrier sense");639640int rtw_adaptivity_th_l2h_ini = CONFIG_RTW_ADAPTIVITY_TH_L2H_INI;641module_param(rtw_adaptivity_th_l2h_ini, int, 0644);642MODULE_PARM_DESC(rtw_adaptivity_th_l2h_ini, "th_l2h_ini for Adaptivity");643644int rtw_adaptivity_th_edcca_hl_diff = CONFIG_RTW_ADAPTIVITY_TH_EDCCA_HL_DIFF;645module_param(rtw_adaptivity_th_edcca_hl_diff, int, 0644);646MODULE_PARM_DESC(rtw_adaptivity_th_edcca_hl_diff, "th_edcca_hl_diff for Adaptivity");647648#ifdef CONFIG_DFS_MASTER649uint rtw_dfs_region_domain = CONFIG_RTW_DFS_REGION_DOMAIN;650module_param(rtw_dfs_region_domain, uint, 0644);651MODULE_PARM_DESC(rtw_dfs_region_domain, "0:UNKNOWN, 1:FCC, 2:MKK, 3:ETSI");652#endif653654uint rtw_amplifier_type_2g = CONFIG_RTW_AMPLIFIER_TYPE_2G;655module_param(rtw_amplifier_type_2g, uint, 0644);656MODULE_PARM_DESC(rtw_amplifier_type_2g, "BIT3:2G ext-PA, BIT4:2G ext-LNA");657658uint rtw_amplifier_type_5g = CONFIG_RTW_AMPLIFIER_TYPE_5G;659module_param(rtw_amplifier_type_5g, uint, 0644);660MODULE_PARM_DESC(rtw_amplifier_type_5g, "BIT6:5G ext-PA, BIT7:5G ext-LNA");661662uint rtw_RFE_type = CONFIG_RTW_RFE_TYPE;663module_param(rtw_RFE_type, uint, 0644);664MODULE_PARM_DESC(rtw_RFE_type, "default init value:64");665666uint rtw_powertracking_type = 64;667module_param(rtw_powertracking_type, uint, 0644);668MODULE_PARM_DESC(rtw_powertracking_type, "default init value:64");669670uint rtw_GLNA_type = CONFIG_RTW_GLNA_TYPE;671module_param(rtw_GLNA_type, uint, 0644);672MODULE_PARM_DESC(rtw_GLNA_type, "default init value:0");673674uint rtw_TxBBSwing_2G = 0xFF;675module_param(rtw_TxBBSwing_2G, uint, 0644);676MODULE_PARM_DESC(rtw_TxBBSwing_2G, "default init value:0xFF");677678uint rtw_TxBBSwing_5G = 0xFF;679module_param(rtw_TxBBSwing_5G, uint, 0644);680MODULE_PARM_DESC(rtw_TxBBSwing_5G, "default init value:0xFF");681682uint rtw_OffEfuseMask = 0;683module_param(rtw_OffEfuseMask, uint, 0644);684MODULE_PARM_DESC(rtw_OffEfuseMask, "default open Efuse Mask value:0");685686uint rtw_FileMaskEfuse = 0;687module_param(rtw_FileMaskEfuse, uint, 0644);688MODULE_PARM_DESC(rtw_FileMaskEfuse, "default drv Mask Efuse value:0");689690uint rtw_rxgain_offset_2g = 0;691module_param(rtw_rxgain_offset_2g, uint, 0644);692MODULE_PARM_DESC(rtw_rxgain_offset_2g, "default RF Gain 2G Offset value:0");693694uint rtw_rxgain_offset_5gl = 0;695module_param(rtw_rxgain_offset_5gl, uint, 0644);696MODULE_PARM_DESC(rtw_rxgain_offset_5gl, "default RF Gain 5GL Offset value:0");697698uint rtw_rxgain_offset_5gm = 0;699module_param(rtw_rxgain_offset_5gm, uint, 0644);700MODULE_PARM_DESC(rtw_rxgain_offset_5gm, "default RF Gain 5GM Offset value:0");701702uint rtw_rxgain_offset_5gh = 0;703module_param(rtw_rxgain_offset_5gh, uint, 0644);704MODULE_PARM_DESC(rtw_rxgain_offset_5gm, "default RF Gain 5GL Offset value:0");705706uint rtw_pll_ref_clk_sel = CONFIG_RTW_PLL_REF_CLK_SEL;707module_param(rtw_pll_ref_clk_sel, uint, 0644);708MODULE_PARM_DESC(rtw_pll_ref_clk_sel, "force pll_ref_clk_sel, 0xF:use autoload value");709710int rtw_tx_pwr_by_rate = CONFIG_TXPWR_BY_RATE_EN;711module_param(rtw_tx_pwr_by_rate, int, 0644);712MODULE_PARM_DESC(rtw_tx_pwr_by_rate, "0:Disable, 1:Enable, 2: Depend on efuse");713714#if CONFIG_TXPWR_LIMIT715int rtw_tx_pwr_lmt_enable = CONFIG_TXPWR_LIMIT_EN;716module_param(rtw_tx_pwr_lmt_enable, int, 0644);717MODULE_PARM_DESC(rtw_tx_pwr_lmt_enable, "0:Disable, 1:Enable, 2: Depend on efuse");718#endif719720static int rtw_target_tx_pwr_2g_a[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_A;721static int rtw_target_tx_pwr_2g_a_num = 0;722module_param_array(rtw_target_tx_pwr_2g_a, int, &rtw_target_tx_pwr_2g_a_num, 0644);723MODULE_PARM_DESC(rtw_target_tx_pwr_2g_a, "2.4G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined");724725static int rtw_target_tx_pwr_2g_b[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_B;726static int rtw_target_tx_pwr_2g_b_num = 0;727module_param_array(rtw_target_tx_pwr_2g_b, int, &rtw_target_tx_pwr_2g_b_num, 0644);728MODULE_PARM_DESC(rtw_target_tx_pwr_2g_b, "2.4G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined");729730static int rtw_target_tx_pwr_2g_c[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_C;731static int rtw_target_tx_pwr_2g_c_num = 0;732module_param_array(rtw_target_tx_pwr_2g_c, int, &rtw_target_tx_pwr_2g_c_num, 0644);733MODULE_PARM_DESC(rtw_target_tx_pwr_2g_c, "2.4G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined");734735static int rtw_target_tx_pwr_2g_d[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_D;736static int rtw_target_tx_pwr_2g_d_num = 0;737module_param_array(rtw_target_tx_pwr_2g_d, int, &rtw_target_tx_pwr_2g_d_num, 0644);738MODULE_PARM_DESC(rtw_target_tx_pwr_2g_d, "2.4G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined");739740#ifdef CONFIG_IEEE80211_BAND_5GHZ741static int rtw_target_tx_pwr_5g_a[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_A;742static int rtw_target_tx_pwr_5g_a_num = 0;743module_param_array(rtw_target_tx_pwr_5g_a, int, &rtw_target_tx_pwr_5g_a_num, 0644);744MODULE_PARM_DESC(rtw_target_tx_pwr_5g_a, "5G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined");745746static int rtw_target_tx_pwr_5g_b[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_B;747static int rtw_target_tx_pwr_5g_b_num = 0;748module_param_array(rtw_target_tx_pwr_5g_b, int, &rtw_target_tx_pwr_5g_b_num, 0644);749MODULE_PARM_DESC(rtw_target_tx_pwr_5g_b, "5G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined");750751static int rtw_target_tx_pwr_5g_c[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_C;752static int rtw_target_tx_pwr_5g_c_num = 0;753module_param_array(rtw_target_tx_pwr_5g_c, int, &rtw_target_tx_pwr_5g_c_num, 0644);754MODULE_PARM_DESC(rtw_target_tx_pwr_5g_c, "5G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined");755756static int rtw_target_tx_pwr_5g_d[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_D;757static int rtw_target_tx_pwr_5g_d_num = 0;758module_param_array(rtw_target_tx_pwr_5g_d, int, &rtw_target_tx_pwr_5g_d_num, 0644);759MODULE_PARM_DESC(rtw_target_tx_pwr_5g_d, "5G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined");760#endif /* CONFIG_IEEE80211_BAND_5GHZ */761762#ifdef CONFIG_RTW_TX_NPATH_EN763/*0:disable ,1: 2path*/764int rtw_tx_npath_enable = 1;765module_param(rtw_tx_npath_enable, int, 0644);766MODULE_PARM_DESC(rtw_tx_npath_enable, "0:Disable, 1:TX-2PATH");767#endif768769#ifdef CONFIG_RTW_PATH_DIV770/*0:disable ,1: path diversity*/771int rtw_path_div_enable = 1;772module_param(rtw_path_div_enable, int, 0644);773MODULE_PARM_DESC(rtw_path_div_enable, "0:Disable, 1:Enable path diversity");774#endif775776777int rtw_tsf_update_pause_factor = CONFIG_TSF_UPDATE_PAUSE_FACTOR;778module_param(rtw_tsf_update_pause_factor, int, 0644);779MODULE_PARM_DESC(rtw_tsf_update_pause_factor, "num of bcn intervals to stay TSF update pause status");780781int rtw_tsf_update_restore_factor = CONFIG_TSF_UPDATE_RESTORE_FACTOR;782module_param(rtw_tsf_update_restore_factor, int, 0644);783MODULE_PARM_DESC(rtw_tsf_update_restore_factor, "num of bcn intervals to stay TSF update restore status");784785#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE786char *rtw_phy_file_path = REALTEK_CONFIG_PATH;787module_param(rtw_phy_file_path, charp, 0644);788MODULE_PARM_DESC(rtw_phy_file_path, "The path of phy parameter");789/* PHY FILE Bit Map790* BIT0 - MAC, 0: non-support, 1: support791* BIT1 - BB, 0: non-support, 1: support792* BIT2 - BB_PG, 0: non-support, 1: support793* BIT3 - BB_MP, 0: non-support, 1: support794* BIT4 - RF, 0: non-support, 1: support795* BIT5 - RF_TXPWR_TRACK, 0: non-support, 1: support796* BIT6 - RF_TXPWR_LMT, 0: non-support, 1: support */797int rtw_load_phy_file = (BIT2 | BIT6);798module_param(rtw_load_phy_file, int, 0644);799MODULE_PARM_DESC(rtw_load_phy_file, "PHY File Bit Map");800int rtw_decrypt_phy_file = 0;801module_param(rtw_decrypt_phy_file, int, 0644);802MODULE_PARM_DESC(rtw_decrypt_phy_file, "Enable Decrypt PHY File");803#endif804805#ifdef CONFIG_SUPPORT_TRX_SHARED806#ifdef DFT_TRX_SHARE_MODE807int rtw_trx_share_mode = DFT_TRX_SHARE_MODE;808#else809int rtw_trx_share_mode = 0;810#endif811module_param(rtw_trx_share_mode, int, 0644);812MODULE_PARM_DESC(rtw_trx_share_mode, "TRx FIFO Shared");813#endif814815#ifdef CONFIG_DYNAMIC_SOML816uint rtw_dynamic_soml_en = 1;817module_param(rtw_dynamic_soml_en, int, 0644);818MODULE_PARM_DESC(rtw_dynamic_soml_en, "0: disable, 1: enable with default param, 2: enable with specified param.");819820uint rtw_dynamic_soml_train_num = 0;821module_param(rtw_dynamic_soml_train_num, int, 0644);822MODULE_PARM_DESC(rtw_dynamic_soml_train_num, "SOML training number");823824uint rtw_dynamic_soml_interval = 0;825module_param(rtw_dynamic_soml_interval, int, 0644);826MODULE_PARM_DESC(rtw_dynamic_soml_interval, "SOML training interval");827828uint rtw_dynamic_soml_period = 0;829module_param(rtw_dynamic_soml_period, int, 0644);830MODULE_PARM_DESC(rtw_dynamic_soml_period, "SOML training period");831832uint rtw_dynamic_soml_delay = 0;833module_param(rtw_dynamic_soml_delay, int, 0644);834MODULE_PARM_DESC(rtw_dynamic_soml_delay, "SOML training delay");835#endif836837uint rtw_phydm_ability = 0xffffffff;838module_param(rtw_phydm_ability, uint, 0644);839840uint rtw_halrf_ability = 0xffffffff;841module_param(rtw_halrf_ability, uint, 0644);842843#ifdef CONFIG_RTW_MESH844uint rtw_peer_alive_based_preq = 1;845module_param(rtw_peer_alive_based_preq, uint, 0644);846MODULE_PARM_DESC(rtw_peer_alive_based_preq,847"On demand PREQ will reference peer alive status. 0: Off, 1: On");848#endif849850int _netdev_open(struct net_device *pnetdev);851int netdev_open(struct net_device *pnetdev);852static int netdev_close(struct net_device *pnetdev);853#ifdef CONFIG_PLATFORM_INTEL_BYT854extern int rtw_sdio_set_power(int on);855#endif /* CONFIG_PLATFORM_INTEL_BYT */856857#ifdef CONFIG_MCC_MODE858/* enable MCC mode or not */859int rtw_en_mcc = 1;860/* can referece following value before insmod driver */861int rtw_mcc_ap_bw20_target_tx_tp = MCC_AP_BW20_TARGET_TX_TP;862int rtw_mcc_ap_bw40_target_tx_tp = MCC_AP_BW40_TARGET_TX_TP;863int rtw_mcc_ap_bw80_target_tx_tp = MCC_AP_BW80_TARGET_TX_TP;864int rtw_mcc_sta_bw20_target_tx_tp = MCC_STA_BW20_TARGET_TX_TP;865int rtw_mcc_sta_bw40_target_tx_tp = MCC_STA_BW40_TARGET_TX_TP;866int rtw_mcc_sta_bw80_target_tx_tp = MCC_STA_BW80_TARGET_TX_TP;867int rtw_mcc_single_tx_cri = MCC_SINGLE_TX_CRITERIA;868int rtw_mcc_policy_table_idx = 0;869int rtw_mcc_duration = 0;870int rtw_mcc_enable_runtime_duration = 1;871#ifdef CONFIG_MCC_PHYDM_OFFLOAD872int rtw_mcc_phydm_offload = 1;873#else874int rtw_mcc_phydm_offload = 0;875#endif876module_param(rtw_en_mcc, int, 0644);877module_param(rtw_mcc_single_tx_cri, int, 0644);878module_param(rtw_mcc_ap_bw20_target_tx_tp, int, 0644);879module_param(rtw_mcc_ap_bw40_target_tx_tp, int, 0644);880module_param(rtw_mcc_ap_bw80_target_tx_tp, int, 0644);881module_param(rtw_mcc_sta_bw20_target_tx_tp, int, 0644);882module_param(rtw_mcc_sta_bw40_target_tx_tp, int, 0644);883module_param(rtw_mcc_sta_bw80_target_tx_tp, int, 0644);884module_param(rtw_mcc_policy_table_idx, int, 0644);885module_param(rtw_mcc_duration, int, 0644);886module_param(rtw_mcc_phydm_offload, int, 0644);887#endif /*CONFIG_MCC_MODE */888889#ifdef CONFIG_RTW_NAPI890/*following setting should define NAPI in Makefile891enable napi only = 1, disable napi = 0*/892int rtw_en_napi = 1;893module_param(rtw_en_napi, int, 0644);894#ifdef CONFIG_RTW_NAPI_DYNAMIC895int rtw_napi_threshold = 100; /* unit: Mbps */896module_param(rtw_napi_threshold, int, 0644);897#endif /* CONFIG_RTW_NAPI_DYNAMIC */898#ifdef CONFIG_RTW_GRO899/*following setting should define GRO in Makefile900enable gro = 1, disable gro = 0*/901int rtw_en_gro = 1;902module_param(rtw_en_gro, int, 0644);903#endif /* CONFIG_RTW_GRO */904#endif /* CONFIG_RTW_NAPI */905906#ifdef RTW_IQK_FW_OFFLOAD907int rtw_iqk_fw_offload = 1;908#else909int rtw_iqk_fw_offload;910#endif /* RTW_IQK_FW_OFFLOAD */911module_param(rtw_iqk_fw_offload, int, 0644);912913#ifdef RTW_CHANNEL_SWITCH_OFFLOAD914int rtw_ch_switch_offload = 0;915#else916int rtw_ch_switch_offload;917#endif /* RTW_CHANNEL_SWITCH_OFFLOAD */918module_param(rtw_ch_switch_offload, int, 0644);919920#ifdef CONFIG_TDLS921int rtw_en_tdls = 1;922module_param(rtw_en_tdls, int, 0644);923#endif924925#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT926int rtw_fw_param_init = 1;927module_param(rtw_fw_param_init, int, 0644);928#endif929930#ifdef CONFIG_TDMADIG931int rtw_tdmadig_en = 1;932/*9331:MODE_PERFORMANCE9342:MODE_COVERAGE935*/936int rtw_tdmadig_mode = 1;937int rtw_dynamic_tdmadig = 0;938module_param(rtw_tdmadig_en, int, 0644);939module_param(rtw_tdmadig_mode, int, 0644);940module_param(rtw_dynamic_tdmadig, int, 0644);941#endif/*CONFIG_TDMADIG*/942943#ifdef CONFIG_WOWLAN944/*945* bit[0]: magic packet wake up946* bit[1]: unucast packet(HW/FW unuicast)947* bit[2]: deauth wake up948*/949uint rtw_wakeup_event = RTW_WAKEUP_EVENT;950module_param(rtw_wakeup_event, uint, 0644);951/*952* 0: common WOWLAN953* bit[0]: disable BB RF954* bit[1]: For wireless remote controller with or without connection955*/956uint rtw_suspend_type = RTW_SUSPEND_TYPE;957module_param(rtw_suspend_type, uint, 0644);958#endif959960#if CONFIG_TX_AC_LIFETIME961static void rtw_regsty_load_tx_ac_lifetime(struct registry_priv *regsty)962{963int i, j;964struct tx_aclt_conf_t *conf;965uint *parm;966967regsty->tx_aclt_flags = (u8)rtw_tx_aclt_flags;968969for (i = 0; i < TX_ACLT_CONF_NUM; i++) {970conf = ®sty->tx_aclt_confs[i];971if (i == TX_ACLT_CONF_DEFAULT)972parm = rtw_tx_aclt_conf_default;973#ifdef CONFIG_TX_MCAST2UNI974else if (i == TX_ACLT_CONF_AP_M2U)975parm = rtw_tx_aclt_conf_ap_m2u;976#endif977#ifdef CONFIG_RTW_MESH978else if (i == TX_ACLT_CONF_MESH)979parm = rtw_tx_aclt_conf_mesh;980#endif981else982parm = NULL;983984if (parm) {985conf->en = parm[0] & 0xF;986conf->vo_vi = parm[1];987conf->be_bk = parm[2];988}989}990}991#endif992993void rtw_regsty_load_target_tx_power(struct registry_priv *regsty)994{995int path, rs;996int *target_tx_pwr;997998for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {999if (path == RF_PATH_A)1000target_tx_pwr = rtw_target_tx_pwr_2g_a;1001else if (path == RF_PATH_B)1002target_tx_pwr = rtw_target_tx_pwr_2g_b;1003else if (path == RF_PATH_C)1004target_tx_pwr = rtw_target_tx_pwr_2g_c;1005else if (path == RF_PATH_D)1006target_tx_pwr = rtw_target_tx_pwr_2g_d;10071008for (rs = CCK; rs < RATE_SECTION_NUM; rs++)1009regsty->target_tx_pwr_2g[path][rs] = target_tx_pwr[rs];1010}10111012#ifdef CONFIG_IEEE80211_BAND_5GHZ1013for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {1014if (path == RF_PATH_A)1015target_tx_pwr = rtw_target_tx_pwr_5g_a;1016else if (path == RF_PATH_B)1017target_tx_pwr = rtw_target_tx_pwr_5g_b;1018else if (path == RF_PATH_C)1019target_tx_pwr = rtw_target_tx_pwr_5g_c;1020else if (path == RF_PATH_D)1021target_tx_pwr = rtw_target_tx_pwr_5g_d;10221023for (rs = OFDM; rs < RATE_SECTION_NUM; rs++)1024regsty->target_tx_pwr_5g[path][rs - 1] = target_tx_pwr[rs - 1];1025}1026#endif /* CONFIG_IEEE80211_BAND_5GHZ */1027}10281029inline void rtw_regsty_load_excl_chs(struct registry_priv *regsty)1030{1031int i;1032int ch_num = 0;10331034for (i = 0; i < MAX_CHANNEL_NUM; i++)1035if (((u8)rtw_excl_chs[i]) != 0)1036regsty->excl_chs[ch_num++] = (u8)rtw_excl_chs[i];10371038if (ch_num < MAX_CHANNEL_NUM)1039regsty->excl_chs[ch_num] = 0;1040}10411042#ifdef CONFIG_80211N_HT1043inline void rtw_regsty_init_rx_ampdu_sz_limit(struct registry_priv *regsty)1044{1045int i, j;1046uint *sz_limit;10471048for (i = 0; i < 4; i++) {1049if (i == 0)1050sz_limit = rtw_rx_ampdu_sz_limit_1ss;1051else if (i == 1)1052sz_limit = rtw_rx_ampdu_sz_limit_2ss;1053else if (i == 2)1054sz_limit = rtw_rx_ampdu_sz_limit_3ss;1055else if (i == 3)1056sz_limit = rtw_rx_ampdu_sz_limit_4ss;10571058for (j = 0; j < 4; j++)1059regsty->rx_ampdu_sz_limit_by_nss_bw[i][j] = sz_limit[j];1060}1061}1062#endif /* CONFIG_80211N_HT */10631064uint loadparam(_adapter *padapter)1065{1066uint status = _SUCCESS;1067struct registry_priv *registry_par = &padapter->registrypriv;106810691070#ifdef CONFIG_RTW_DEBUG1071if (rtw_drv_log_level >= _DRV_MAX_)1072rtw_drv_log_level = _DRV_DEBUG_;1073#endif10741075registry_par->chip_version = (u8)rtw_chip_version;1076registry_par->rfintfs = (u8)rtw_rfintfs;1077registry_par->lbkmode = (u8)rtw_lbkmode;1078/* registry_par->hci = (u8)hci; */1079registry_par->network_mode = (u8)rtw_network_mode;10801081_rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3);1082registry_par->ssid.SsidLength = 3;10831084registry_par->channel = (u8)rtw_channel;1085#ifdef CONFIG_NARROWBAND_SUPPORTING1086if (rtw_nb_config != RTW_NB_CONFIG_NONE)1087rtw_wireless_mode &= ~WIRELESS_11B;1088#endif1089registry_par->wireless_mode = (u8)rtw_wireless_mode;10901091if (IsSupported24G(registry_par->wireless_mode) && (!is_supported_5g(registry_par->wireless_mode))1092&& (registry_par->channel > 14))1093registry_par->channel = 1;1094else if (is_supported_5g(registry_par->wireless_mode) && (!IsSupported24G(registry_par->wireless_mode))1095&& (registry_par->channel <= 14))1096registry_par->channel = 36;10971098registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;1099registry_par->vcs_type = (u8)rtw_vcs_type;1100registry_par->rts_thresh = (u16)rtw_rts_thresh;1101registry_par->frag_thresh = (u16)rtw_frag_thresh;1102registry_par->preamble = (u8)rtw_preamble;1103registry_par->scan_mode = (u8)rtw_scan_mode;1104registry_par->smart_ps = (u8)rtw_smart_ps;1105registry_par->check_fw_ps = (u8)rtw_check_fw_ps;1106#ifdef CONFIG_TDMADIG1107registry_par->tdmadig_en = (u8)rtw_tdmadig_en;1108registry_par->tdmadig_mode = (u8)rtw_tdmadig_mode;1109registry_par->tdmadig_dynamic = (u8) rtw_dynamic_tdmadig;1110registry_par->power_mgnt = PS_MODE_ACTIVE;1111registry_par->ips_mode = IPS_NONE;1112#else1113registry_par->power_mgnt = (u8)rtw_power_mgnt;1114registry_par->ips_mode = (u8)rtw_ips_mode;1115#endif/*CONFIG_TDMADIG*/1116registry_par->lps_level = (u8)rtw_lps_level;1117#ifdef CONFIG_LPS_1T1R1118registry_par->lps_1t1r = (u8)(rtw_lps_1t1r ? 1 : 0);1119#endif1120registry_par->lps_chk_by_tp = (u8)rtw_lps_chk_by_tp;1121#ifdef CONFIG_WOWLAN1122registry_par->wow_power_mgnt = (u8)rtw_wow_power_mgnt;1123registry_par->wow_lps_level = (u8)rtw_wow_lps_level;1124#ifdef CONFIG_LPS_1T1R1125registry_par->wow_lps_1t1r = (u8)(rtw_wow_lps_1t1r ? 1 : 0);1126#endif1127#endif /* CONFIG_WOWLAN */1128registry_par->radio_enable = (u8)rtw_radio_enable;1129registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;1130registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;1131registry_par->busy_thresh = (u16)rtw_busy_thresh;1132registry_par->max_bss_cnt = (u16)rtw_max_bss_cnt;1133/* registry_par->qos_enable = (u8)rtw_qos_enable; */1134registry_par->ack_policy = (u8)rtw_ack_policy;1135registry_par->mp_mode = (u8)rtw_mp_mode;1136#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTW_CUSTOMER_STR)1137registry_par->mp_customer_str = (u8)rtw_mp_customer_str;1138#endif1139registry_par->software_encrypt = (u8)rtw_software_encrypt;1140registry_par->software_decrypt = (u8)rtw_software_decrypt;11411142registry_par->acm_method = (u8)rtw_acm_method;1143registry_par->usb_rxagg_mode = (u8)rtw_usb_rxagg_mode;1144registry_par->dynamic_agg_enable = (u8)rtw_dynamic_agg_enable;11451146/* WMM */1147registry_par->wmm_enable = (u8)rtw_wmm_enable;11481149#ifdef CONFIG_WMMPS_STA1150/* UAPSD */1151registry_par->uapsd_max_sp_len= (u8)rtw_uapsd_max_sp;1152registry_par->uapsd_ac_enable = (u8)rtw_uapsd_ac_enable;1153registry_par->wmm_smart_ps = (u8)rtw_wmm_smart_ps;1154#endif /* CONFIG_WMMPS_STA */11551156registry_par->RegPwrTrimEnable = (u8)rtw_pwrtrim_enable;11571158#if CONFIG_TX_AC_LIFETIME1159rtw_regsty_load_tx_ac_lifetime(registry_par);1160#endif11611162registry_par->tx_bw_mode = (u8)rtw_tx_bw_mode;11631164#ifdef CONFIG_80211N_HT1165registry_par->ht_enable = (u8)rtw_ht_enable;1166if (registry_par->ht_enable && is_supported_ht(registry_par->wireless_mode)) {1167#ifdef CONFIG_NARROWBAND_SUPPORTING1168if (rtw_nb_config != RTW_NB_CONFIG_NONE)1169rtw_bw_mode = 0;1170#endif1171registry_par->bw_mode = (u8)rtw_bw_mode;1172registry_par->ampdu_enable = (u8)rtw_ampdu_enable;1173registry_par->rx_stbc = (u8)rtw_rx_stbc;1174registry_par->rx_ampdu_amsdu = (u8)rtw_rx_ampdu_amsdu;1175registry_par->tx_ampdu_amsdu = (u8)rtw_tx_ampdu_amsdu;1176registry_par->short_gi = (u8)rtw_short_gi;1177registry_par->ldpc_cap = (u8)rtw_ldpc_cap;1178#if defined(CONFIG_CUSTOMER01_SMART_ANTENNA)1179rtw_stbc_cap = 0x0;1180#endif1181#ifdef CONFIG_RTW_TX_NPATH_EN1182registry_par->tx_npath = (u8)rtw_tx_npath_enable;1183#endif1184#ifdef CONFIG_RTW_PATH_DIV1185registry_par->path_div = (u8)rtw_path_div_enable;1186#endif1187registry_par->stbc_cap = (u8)rtw_stbc_cap;1188registry_par->beamform_cap = (u8)rtw_beamform_cap;1189registry_par->beamformer_rf_num = (u8)rtw_bfer_rf_number;1190registry_par->beamformee_rf_num = (u8)rtw_bfee_rf_number;1191rtw_regsty_init_rx_ampdu_sz_limit(registry_par);1192}1193#endif1194#ifdef DBG_LA_MODE1195registry_par->la_mode_en = (u8)rtw_la_mode_en;1196#endif1197#ifdef CONFIG_NARROWBAND_SUPPORTING1198registry_par->rtw_nb_config = (u8)rtw_nb_config;1199#endif12001201#ifdef CONFIG_80211AC_VHT1202registry_par->vht_enable = (u8)rtw_vht_enable;1203registry_par->ampdu_factor = (u8)rtw_ampdu_factor;1204registry_par->vht_rx_mcs_map[0] = (u8)(rtw_vht_rx_mcs_map & 0xFF);1205registry_par->vht_rx_mcs_map[1] = (u8)((rtw_vht_rx_mcs_map & 0xFF00) >> 8);1206#endif12071208#ifdef CONFIG_TX_EARLY_MODE1209registry_par->early_mode = (u8)rtw_early_mode;1210#endif1211#ifdef CONFIG_SW_LED1212registry_par->led_ctrl = (u8)rtw_led_ctrl;1213#endif1214registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;1215registry_par->rf_path = (u8)rtw_rf_path; /*rf_config/rtw_rf_config*/1216registry_par->tx_nss = (u8)rtw_tx_nss;1217registry_par->rx_nss = (u8)rtw_rx_nss;1218registry_par->low_power = (u8)rtw_low_power;12191220registry_par->check_hw_status = (u8)rtw_check_hw_status;12211222registry_par->wifi_spec = (u8)rtw_wifi_spec;12231224if (strlen(rtw_country_code) != 21225|| is_alpha(rtw_country_code[0]) == _FALSE1226|| is_alpha(rtw_country_code[1]) == _FALSE1227) {1228if (rtw_country_code != rtw_country_unspecified)1229RTW_ERR("%s discard rtw_country_code not in alpha2\n", __func__);1230_rtw_memset(registry_par->alpha2, 0xFF, 2);1231} else1232_rtw_memcpy(registry_par->alpha2, rtw_country_code, 2);12331234registry_par->channel_plan = (u8)rtw_channel_plan;1235rtw_regsty_load_excl_chs(registry_par);12361237registry_par->full_ch_in_p2p_handshake = (u8)rtw_full_ch_in_p2p_handshake;1238#ifdef CONFIG_BT_COEXIST1239registry_par->btcoex = (u8)rtw_btcoex_enable;1240registry_par->bt_iso = (u8)rtw_bt_iso;1241registry_par->bt_sco = (u8)rtw_bt_sco;1242registry_par->bt_ampdu = (u8)rtw_bt_ampdu;1243registry_par->ant_num = (u8)rtw_ant_num;1244registry_par->single_ant_path = (u8) rtw_single_ant_path;1245#endif12461247registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;12481249registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;1250registry_par->antdiv_type = (u8)rtw_antdiv_type;12511252registry_par->drv_ant_band_switch = (u8) rtw_drv_ant_band_switch;12531254registry_par->switch_usb_mode = (u8)rtw_switch_usb_mode;12551256#ifdef CONFIG_AUTOSUSPEND1257registry_par->usbss_enable = (u8)rtw_enusbss;/* 0:disable,1:enable */1258#endif1259#ifdef SUPPORT_HW_RFOFF_DETECTED1260registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable,1:enable,2:by EFUSE config */1261registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable,1:enable */1262#endif12631264registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;12651266#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE1267snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s", rtw_adaptor_info_caching_file_path);1268registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX - 1] = 0;1269#endif12701271#ifdef CONFIG_LAYER2_ROAMING1272registry_par->max_roaming_times = (u8)rtw_max_roaming_times;1273#endif12741275#ifdef CONFIG_IOL1276registry_par->fw_iol = rtw_fw_iol;1277#endif12781279#ifdef CONFIG_80211D1280registry_par->enable80211d = (u8)rtw_80211d;1281#endif12821283snprintf(registry_par->ifname, 16, "%s", ifname);1284snprintf(registry_par->if2name, 16, "%s", if2name);12851286registry_par->notch_filter = (u8)rtw_notch_filter;12871288#ifdef CONFIG_CONCURRENT_MODE1289registry_par->virtual_iface_num = (u8)rtw_virtual_iface_num;1290#endif1291registry_par->pll_ref_clk_sel = (u8)rtw_pll_ref_clk_sel;12921293#if CONFIG_TXPWR_LIMIT1294registry_par->RegEnableTxPowerLimit = (u8)rtw_tx_pwr_lmt_enable;1295#endif1296registry_par->RegEnableTxPowerByRate = (u8)rtw_tx_pwr_by_rate;12971298rtw_regsty_load_target_tx_power(registry_par);12991300registry_par->tsf_update_pause_factor = (u8)rtw_tsf_update_pause_factor;1301registry_par->tsf_update_restore_factor = (u8)rtw_tsf_update_restore_factor;13021303registry_par->TxBBSwing_2G = (s8)rtw_TxBBSwing_2G;1304registry_par->TxBBSwing_5G = (s8)rtw_TxBBSwing_5G;1305registry_par->bEn_RFE = 1;1306registry_par->RFE_Type = (u8)rtw_RFE_type;1307registry_par->PowerTracking_Type = (u8)rtw_powertracking_type;1308registry_par->AmplifierType_2G = (u8)rtw_amplifier_type_2g;1309registry_par->AmplifierType_5G = (u8)rtw_amplifier_type_5g;1310registry_par->GLNA_Type = (u8)rtw_GLNA_type;1311#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE1312registry_par->load_phy_file = (u8)rtw_load_phy_file;1313registry_par->RegDecryptCustomFile = (u8)rtw_decrypt_phy_file;1314#endif1315registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;13161317registry_par->hiq_filter = (u8)rtw_hiq_filter;13181319registry_par->adaptivity_en = (u8)rtw_adaptivity_en;1320registry_par->adaptivity_mode = (u8)rtw_adaptivity_mode;1321registry_par->adaptivity_th_l2h_ini = (s8)rtw_adaptivity_th_l2h_ini;1322registry_par->adaptivity_th_edcca_hl_diff = (s8)rtw_adaptivity_th_edcca_hl_diff;13231324#ifdef CONFIG_DYNAMIC_SOML1325registry_par->dyn_soml_en = (u8)rtw_dynamic_soml_en;1326registry_par->dyn_soml_train_num = (u8)rtw_dynamic_soml_train_num;1327registry_par->dyn_soml_interval = (u8)rtw_dynamic_soml_interval;1328registry_par->dyn_soml_period = (u8)rtw_dynamic_soml_period;1329registry_par->dyn_soml_delay = (u8)rtw_dynamic_soml_delay;1330#endif13311332registry_par->boffefusemask = (u8)rtw_OffEfuseMask;1333registry_par->bFileMaskEfuse = (u8)rtw_FileMaskEfuse;1334registry_par->bBTFileMaskEfuse = (u8)rtw_FileMaskEfuse;13351336#ifdef CONFIG_RTW_ACS1337registry_par->acs_mode = (u8)rtw_acs;1338registry_par->acs_auto_scan = (u8)rtw_acs_auto_scan;1339#endif1340#ifdef CONFIG_BACKGROUND_NOISE_MONITOR1341registry_par->nm_mode = (u8)rtw_nm;1342#endif1343registry_par->reg_rxgain_offset_2g = (u32) rtw_rxgain_offset_2g;1344registry_par->reg_rxgain_offset_5gl = (u32) rtw_rxgain_offset_5gl;1345registry_par->reg_rxgain_offset_5gm = (u32) rtw_rxgain_offset_5gm;1346registry_par->reg_rxgain_offset_5gh = (u32) rtw_rxgain_offset_5gh;13471348#ifdef CONFIG_DFS_MASTER1349registry_par->dfs_region_domain = (u8)rtw_dfs_region_domain;1350#endif13511352#ifdef CONFIG_MCC_MODE1353registry_par->en_mcc = (u8)rtw_en_mcc;1354registry_par->rtw_mcc_ap_bw20_target_tx_tp = (u32)rtw_mcc_ap_bw20_target_tx_tp;1355registry_par->rtw_mcc_ap_bw40_target_tx_tp = (u32)rtw_mcc_ap_bw40_target_tx_tp;1356registry_par->rtw_mcc_ap_bw80_target_tx_tp = (u32)rtw_mcc_ap_bw80_target_tx_tp;1357registry_par->rtw_mcc_sta_bw20_target_tx_tp = (u32)rtw_mcc_sta_bw20_target_tx_tp;1358registry_par->rtw_mcc_sta_bw40_target_tx_tp = (u32)rtw_mcc_sta_bw40_target_tx_tp;1359registry_par->rtw_mcc_sta_bw80_target_tx_tp = (u32)rtw_mcc_sta_bw80_target_tx_tp;1360registry_par->rtw_mcc_single_tx_cri = (u32)rtw_mcc_single_tx_cri;1361registry_par->rtw_mcc_policy_table_idx = rtw_mcc_policy_table_idx;1362registry_par->rtw_mcc_duration = (u8)rtw_mcc_duration;1363registry_par->rtw_mcc_enable_runtime_duration = rtw_mcc_enable_runtime_duration;1364registry_par->rtw_mcc_phydm_offload = rtw_mcc_phydm_offload;1365#endif /*CONFIG_MCC_MODE */13661367#ifdef CONFIG_WOWLAN1368registry_par->wakeup_event = rtw_wakeup_event;1369registry_par->suspend_type = rtw_suspend_type;1370#endif13711372#ifdef CONFIG_SUPPORT_TRX_SHARED1373registry_par->trx_share_mode = rtw_trx_share_mode;1374#endif1375registry_par->wowlan_sta_mix_mode = rtw_wowlan_sta_mix_mode;13761377#ifdef CONFIG_PCI_HCI1378registry_par->pci_aspm_config = rtw_pci_aspm_enable;1379registry_par->pci_dynamic_aspm_linkctrl = rtw_pci_dynamic_aspm_linkctrl;1380#endif13811382#ifdef CONFIG_RTW_NAPI1383registry_par->en_napi = (u8)rtw_en_napi;1384#ifdef CONFIG_RTW_NAPI_DYNAMIC1385registry_par->napi_threshold = (u32)rtw_napi_threshold;1386#endif /* CONFIG_RTW_NAPI_DYNAMIC */1387#ifdef CONFIG_RTW_GRO1388registry_par->en_gro = (u8)rtw_en_gro;1389if (!registry_par->en_napi && registry_par->en_gro) {1390registry_par->en_gro = 0;1391RTW_WARN("Disable GRO because NAPI is not enabled\n");1392}1393#endif /* CONFIG_RTW_GRO */1394#endif /* CONFIG_RTW_NAPI */13951396registry_par->iqk_fw_offload = (u8)rtw_iqk_fw_offload;1397registry_par->ch_switch_offload = (u8)rtw_ch_switch_offload;13981399#ifdef CONFIG_TDLS1400registry_par->en_tdls = rtw_en_tdls;1401#endif14021403#ifdef CONFIG_ADVANCE_OTA1404registry_par->adv_ota = rtw_advnace_ota;1405#endif1406#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT1407registry_par->fw_param_init = rtw_fw_param_init;1408#endif1409#ifdef CONFIG_AP_MODE1410registry_par->bmc_tx_rate = rtw_bmc_tx_rate;1411#endif1412#ifdef CONFIG_FW_HANDLE_TXBCN1413registry_par->fw_tbtt_rpt = rtw_tbtt_rpt;1414#endif1415registry_par->phydm_ability = rtw_phydm_ability;1416registry_par->halrf_ability = rtw_halrf_ability;1417#ifdef CONFIG_RTW_MESH1418registry_par->peer_alive_based_preq = rtw_peer_alive_based_preq;1419#endif1420return status;1421}14221423/**1424* rtw_net_set_mac_address1425* This callback function is used for the Media Access Control address1426* of each net_device needs to be changed.1427*1428* Arguments:1429* @pnetdev: net_device pointer.1430* @addr: new MAC address.1431*1432* Return:1433* ret = 0: Permit to change net_device's MAC address.1434* ret = -1 (Default): Operation not permitted.1435*1436* Auther: Arvin Liu1437* Date: 2015/05/291438*/1439static int rtw_net_set_mac_address(struct net_device *pnetdev, void *addr)1440{1441_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);1442struct mlme_priv *pmlmepriv = &padapter->mlmepriv;1443struct sockaddr *sa = (struct sockaddr *)addr;1444int ret = -1;14451446/* only the net_device is in down state to permit modifying mac addr */1447if ((pnetdev->flags & IFF_UP) == _TRUE) {1448RTW_INFO(FUNC_ADPT_FMT": The net_device's is not in down state\n"1449, FUNC_ADPT_ARG(padapter));14501451return ret;1452}14531454/* if the net_device is linked, it's not permit to modify mac addr */1455if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) ||1456check_fwstate(pmlmepriv, _FW_LINKED) ||1457check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {1458RTW_INFO(FUNC_ADPT_FMT": The net_device's is not idle currently\n"1459, FUNC_ADPT_ARG(padapter));14601461return ret;1462}14631464/* check whether the input mac address is valid to permit modifying mac addr */1465if (rtw_check_invalid_mac_address(sa->sa_data, _FALSE) == _TRUE) {1466RTW_INFO(FUNC_ADPT_FMT": Invalid Mac Addr for "MAC_FMT"\n"1467, FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));14681469return ret;1470}14711472_rtw_memcpy(adapter_mac_addr(padapter), sa->sa_data, ETH_ALEN); /* set mac addr to adapter */1473#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))1474eth_hw_addr_set(pnetdev, sa->sa_data);1475#else1476_rtw_memcpy(pnetdev->dev_addr, sa->sa_data, ETH_ALEN); /* set mac addr to net_device */1477#endif14781479#if 01480if (rtw_is_hw_init_completed(padapter)) {1481rtw_ps_deny(padapter, PS_DENY_IOCTL);1482LeaveAllPowerSaveModeDirect(padapter); /* leave PS mode for guaranteeing to access hw register successfully */14831484#ifdef CONFIG_MI_WITH_MBSSID_CAM1485rtw_hal_change_macaddr_mbid(padapter, sa->sa_data);1486#else1487rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, sa->sa_data); /* set mac addr to mac register */1488#endif14891490rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);1491}1492#else1493rtw_ps_deny(padapter, PS_DENY_IOCTL);1494LeaveAllPowerSaveModeDirect(padapter); /* leave PS mode for guaranteeing to access hw register successfully */1495#ifdef CONFIG_MI_WITH_MBSSID_CAM1496rtw_hal_change_macaddr_mbid(padapter, sa->sa_data);1497#else1498rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, sa->sa_data); /* set mac addr to mac register */1499#endif1500rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);1501#endif15021503RTW_INFO(FUNC_ADPT_FMT": Set Mac Addr to "MAC_FMT" Successfully\n"1504, FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));15051506ret = 0;15071508return ret;1509}15101511static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)1512{1513_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);1514struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);1515struct recv_priv *precvpriv = &(padapter->recvpriv);15161517padapter->stats.tx_packets = pxmitpriv->tx_pkts;/* pxmitpriv->tx_pkts++; */1518padapter->stats.rx_packets = precvpriv->rx_pkts;/* precvpriv->rx_pkts++; */1519padapter->stats.tx_dropped = pxmitpriv->tx_drop;1520padapter->stats.rx_dropped = precvpriv->rx_drop;1521padapter->stats.tx_bytes = pxmitpriv->tx_bytes;1522padapter->stats.rx_bytes = precvpriv->rx_bytes;15231524return &padapter->stats;1525}15261527#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))1528/*1529* AC to queue mapping1530*1531* AC_VO -> queue 01532* AC_VI -> queue 11533* AC_BE -> queue 21534* AC_BK -> queue 31535*/1536static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };15371538/* Given a data frame determine the 802.1p/1d tag to use. */1539unsigned int rtw_classify8021d(struct sk_buff *skb)1540{1541unsigned int dscp;15421543/* skb->priority values from 256->263 are magic values to1544* directly indicate a specific 802.1d priority. This is used1545* to allow 802.1d priority to be passed directly in from VLAN1546* tags, etc.1547*/1548if (skb->priority >= 256 && skb->priority <= 263)1549return skb->priority - 256;15501551switch (skb->protocol) {1552case htons(ETH_P_IP):1553dscp = ip_hdr(skb)->tos & 0xfc;1554break;1555default:1556return 0;1557}15581559return dscp >> 5;1560}156115621563static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb1564#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)1565#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)1566, struct net_device *sb_dev1567#else1568, void *accel_priv1569#endif1570#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)))1571, select_queue_fallback_t fallback1572#endif1573#endif1574)1575{1576_adapter *padapter = rtw_netdev_priv(dev);1577struct mlme_priv *pmlmepriv = &padapter->mlmepriv;15781579skb->priority = rtw_classify8021d(skb);15801581if (pmlmepriv->acm_mask != 0)1582skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);15831584return rtw_1d_to_queue[skb->priority];1585}15861587u16 rtw_recv_select_queue(struct sk_buff *skb)1588{1589struct iphdr *piphdr;1590unsigned int dscp;1591u16 eth_type;1592u32 priority;1593u8 *pdata = skb->data;15941595_rtw_memcpy(ð_type, pdata + (ETH_ALEN << 1), 2);15961597switch (eth_type) {1598case htons(ETH_P_IP):15991600piphdr = (struct iphdr *)(pdata + ETH_HLEN);16011602dscp = piphdr->tos & 0xfc;16031604priority = dscp >> 5;16051606break;1607default:1608priority = 0;1609}16101611return rtw_1d_to_queue[priority];16121613}16141615#endif16161617static u8 is_rtw_ndev(struct net_device *ndev)1618{1619#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))1620return ndev->netdev_ops1621&& ndev->netdev_ops->ndo_do_ioctl1622&& ndev->netdev_ops->ndo_do_ioctl == rtw_ioctl;1623#else1624return ndev->do_ioctl1625&& ndev->do_ioctl == rtw_ioctl;1626#endif1627}16281629static int rtw_ndev_notifier_call(struct notifier_block *nb, unsigned long state, void *ptr)1630{1631struct net_device *ndev;16321633if (ptr == NULL)1634return NOTIFY_DONE;16351636#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))1637ndev = netdev_notifier_info_to_dev(ptr);1638#else1639ndev = ptr;1640#endif16411642if (ndev == NULL)1643return NOTIFY_DONE;16441645if (!is_rtw_ndev(ndev))1646return NOTIFY_DONE;16471648RTW_INFO(FUNC_NDEV_FMT" state:%lu\n", FUNC_NDEV_ARG(ndev), state);16491650switch (state) {1651case NETDEV_CHANGENAME:1652rtw_adapter_proc_replace(ndev);1653break;1654#ifdef CONFIG_NEW_NETDEV_HDL1655case NETDEV_PRE_UP :1656{1657_adapter *adapter = rtw_netdev_priv(ndev);16581659rtw_pwr_wakeup(adapter);1660}1661break;1662#endif1663}16641665return NOTIFY_DONE;1666}16671668static struct notifier_block rtw_ndev_notifier = {1669.notifier_call = rtw_ndev_notifier_call,1670};16711672int rtw_ndev_notifier_register(void)1673{1674return register_netdevice_notifier(&rtw_ndev_notifier);1675}16761677void rtw_ndev_notifier_unregister(void)1678{1679unregister_netdevice_notifier(&rtw_ndev_notifier);1680}16811682int rtw_ndev_init(struct net_device *dev)1683{1684_adapter *adapter = rtw_netdev_priv(dev);16851686RTW_PRINT(FUNC_ADPT_FMT" if%d mac_addr="MAC_FMT"\n"1687, FUNC_ADPT_ARG(adapter), (adapter->iface_id + 1), MAC_ARG(dev->dev_addr));1688strncpy(adapter->old_ifname, dev->name, IFNAMSIZ);1689adapter->old_ifname[IFNAMSIZ - 1] = '\0';1690rtw_adapter_proc_init(dev);16911692return 0;1693}16941695void rtw_ndev_uninit(struct net_device *dev)1696{1697_adapter *adapter = rtw_netdev_priv(dev);16981699RTW_PRINT(FUNC_ADPT_FMT" if%d\n"1700, FUNC_ADPT_ARG(adapter), (adapter->iface_id + 1));1701rtw_adapter_proc_deinit(dev);1702}17031704#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))1705static const struct net_device_ops rtw_netdev_ops = {1706.ndo_init = rtw_ndev_init,1707.ndo_uninit = rtw_ndev_uninit,1708.ndo_open = netdev_open,1709.ndo_stop = netdev_close,1710.ndo_start_xmit = rtw_xmit_entry,1711#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))1712.ndo_select_queue = rtw_select_queue,1713#endif1714.ndo_set_mac_address = rtw_net_set_mac_address,1715.ndo_get_stats = rtw_net_get_stats,1716.ndo_do_ioctl = rtw_ioctl,1717};1718#endif17191720int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)1721{1722#ifdef CONFIG_EASY_REPLACEMENT1723_adapter *padapter = rtw_netdev_priv(pnetdev);1724struct net_device *TargetNetdev = NULL;1725_adapter *TargetAdapter = NULL;17261727if (padapter->bDongle == 1) {1728TargetNetdev = rtw_get_same_net_ndev_by_name(pnetdev, "wlan0");1729if (TargetNetdev) {1730RTW_INFO("Force onboard module driver disappear !!!\n");1731TargetAdapter = rtw_netdev_priv(TargetNetdev);1732TargetAdapter->DriverState = DRIVER_DISAPPEAR;17331734padapter->pid[0] = TargetAdapter->pid[0];1735padapter->pid[1] = TargetAdapter->pid[1];1736padapter->pid[2] = TargetAdapter->pid[2];17371738dev_put(TargetNetdev);1739unregister_netdev(TargetNetdev);17401741padapter->DriverState = DRIVER_REPLACE_DONGLE;1742}1743}1744#endif /* CONFIG_EASY_REPLACEMENT */17451746if (dev_alloc_name(pnetdev, ifname) < 0)1747RTW_ERR("dev_alloc_name, fail!\n");17481749rtw_netif_carrier_off(pnetdev);1750/* rtw_netif_stop_queue(pnetdev); */17511752return 0;1753}17541755void rtw_hook_if_ops(struct net_device *ndev)1756{1757#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))1758ndev->netdev_ops = &rtw_netdev_ops;1759#else1760ndev->init = rtw_ndev_init;1761ndev->uninit = rtw_ndev_uninit;1762ndev->open = netdev_open;1763ndev->stop = netdev_close;1764ndev->hard_start_xmit = rtw_xmit_entry;1765ndev->set_mac_address = rtw_net_set_mac_address;1766ndev->get_stats = rtw_net_get_stats;1767ndev->do_ioctl = rtw_ioctl;1768#endif1769}17701771#ifdef CONFIG_CONCURRENT_MODE1772static void rtw_hook_vir_if_ops(struct net_device *ndev);1773#endif1774struct net_device *rtw_init_netdev(_adapter *old_padapter)1775{1776_adapter *padapter;1777struct net_device *pnetdev;17781779if (old_padapter != NULL) {1780rtw_os_ndev_free(old_padapter);1781pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter);1782} else1783pnetdev = rtw_alloc_etherdev(sizeof(_adapter));17841785if (!pnetdev)1786return NULL;17871788padapter = rtw_netdev_priv(pnetdev);1789padapter->pnetdev = pnetdev;17901791#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)1792SET_MODULE_OWNER(pnetdev);1793#endif17941795rtw_hook_if_ops(pnetdev);1796#ifdef CONFIG_CONCURRENT_MODE1797if (!is_primary_adapter(padapter))1798rtw_hook_vir_if_ops(pnetdev);1799#endif /* CONFIG_CONCURRENT_MODE */180018011802#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX1803pnetdev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);1804#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)1805pnetdev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);1806#endif1807#endif18081809#ifdef CONFIG_RTW_NETIF_SG1810pnetdev->features |= NETIF_F_SG;1811#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)1812pnetdev->hw_features |= NETIF_F_SG;1813#endif1814#endif18151816if ((pnetdev->features & NETIF_F_SG) && (pnetdev->features & NETIF_F_IP_CSUM)) {1817pnetdev->features |= (NETIF_F_TSO | NETIF_F_GSO);1818#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)1819pnetdev->hw_features |= (NETIF_F_TSO | NETIF_F_GSO);1820#endif1821}1822/* pnetdev->tx_timeout = NULL; */1823pnetdev->watchdog_timeo = HZ * 3; /* 3 second timeout */18241825#ifdef CONFIG_WIRELESS_EXT1826pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;1827#endif18281829#ifdef WIRELESS_SPY1830/* priv->wireless_data.spy_data = &priv->spy_data; */1831/* pnetdev->wireless_data = &priv->wireless_data; */1832#endif18331834return pnetdev;1835}18361837int rtw_os_ndev_alloc(_adapter *adapter)1838{1839int ret = _FAIL;1840struct net_device *ndev = NULL;18411842ndev = rtw_init_netdev(adapter);1843if (ndev == NULL) {1844rtw_warn_on(1);1845goto exit;1846}1847#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)1848SET_NETDEV_DEV(ndev, dvobj_to_dev(adapter_to_dvobj(adapter)));1849#endif18501851#ifdef CONFIG_PCI_HCI1852if (adapter_to_dvobj(adapter)->bdma64)1853ndev->features |= NETIF_F_HIGHDMA;1854ndev->irq = adapter_to_dvobj(adapter)->irq;1855#endif18561857#if defined(CONFIG_IOCTL_CFG80211)1858if (rtw_cfg80211_ndev_res_alloc(adapter) != _SUCCESS) {1859rtw_warn_on(1);1860goto free_ndev;1861}1862#endif18631864ret = _SUCCESS;18651866free_ndev:1867if (ret != _SUCCESS && ndev)1868rtw_free_netdev(ndev);1869exit:1870return ret;1871}18721873void rtw_os_ndev_free(_adapter *adapter)1874{1875#if defined(CONFIG_IOCTL_CFG80211)1876rtw_cfg80211_ndev_res_free(adapter);1877#endif18781879/* free the old_pnetdev */1880if (adapter->rereg_nd_name_priv.old_pnetdev) {1881rtw_free_netdev(adapter->rereg_nd_name_priv.old_pnetdev);1882adapter->rereg_nd_name_priv.old_pnetdev = NULL;1883}18841885if (adapter->pnetdev) {1886rtw_free_netdev(adapter->pnetdev);1887adapter->pnetdev = NULL;1888}1889}18901891int rtw_os_ndev_register(_adapter *adapter, const char *name)1892{1893struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);1894int ret = _SUCCESS;1895struct net_device *ndev = adapter->pnetdev;1896u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);18971898#ifdef CONFIG_RTW_NAPI1899#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))1900netif_napi_add_weight(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);1901#else1902netif_napi_add(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);1903#endif1904#endif /* CONFIG_RTW_NAPI */19051906#if defined(CONFIG_IOCTL_CFG80211)1907if (rtw_cfg80211_ndev_res_register(adapter) != _SUCCESS) {1908rtw_warn_on(1);1909ret = _FAIL;1910goto exit;1911}1912#endif1913#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_PCI_HCI)1914ndev->gro_flush_timeout = 100000;1915#endif1916/* alloc netdev name */1917rtw_init_netdev_name(ndev, name);19181919#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))1920eth_hw_addr_set(ndev, adapter_mac_addr(adapter));1921#else1922_rtw_memcpy(ndev->dev_addr, adapter_mac_addr(adapter), ETH_ALEN);1923#endif19241925#ifdef CONFIG_NET_NS1926dev_net_set(ndev, wiphy_net(adapter_to_wiphy(adapter)));1927#endif //CONFIG_NET_NS192819291930/* Tell the network stack we exist */19311932if (rtnl_lock_needed)1933ret = (register_netdev(ndev) == 0) ? _SUCCESS : _FAIL;1934else1935ret = (register_netdevice(ndev) == 0) ? _SUCCESS : _FAIL;19361937if (ret == _SUCCESS)1938adapter->registered = 1;1939else1940RTW_INFO(FUNC_NDEV_FMT" if%d Failed!\n", FUNC_NDEV_ARG(ndev), (adapter->iface_id + 1));19411942#if defined(CONFIG_IOCTL_CFG80211)1943if (ret != _SUCCESS) {1944rtw_cfg80211_ndev_res_unregister(adapter);1945#if !defined(RTW_SINGLE_WIPHY)1946rtw_wiphy_unregister(adapter_to_wiphy(adapter));1947#endif1948}1949#endif19501951exit:1952#ifdef CONFIG_RTW_NAPI1953if (ret != _SUCCESS)1954netif_napi_del(&adapter->napi);1955#endif /* CONFIG_RTW_NAPI */19561957return ret;1958}19591960void rtw_os_ndev_unregister(_adapter *adapter)1961{1962struct net_device *netdev = NULL;19631964if (adapter == NULL || adapter->registered == 0)1965return;19661967adapter->ndev_unregistering = 1;19681969netdev = adapter->pnetdev;19701971if ((adapter->DriverState != DRIVER_DISAPPEAR) && netdev) {1972struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);1973u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);19741975if (rtnl_lock_needed)1976unregister_netdev(netdev);1977else1978unregister_netdevice(netdev);1979}19801981#if defined(CONFIG_IOCTL_CFG80211)1982rtw_cfg80211_ndev_res_unregister(adapter);1983#endif19841985#if defined(CONFIG_IOCTL_CFG80211) && !defined(RTW_SINGLE_WIPHY)1986#ifdef CONFIG_RFKILL_POLL1987rtw_cfg80211_deinit_rfkill(adapter_to_wiphy(adapter));1988#endif1989rtw_wiphy_unregister(adapter_to_wiphy(adapter));1990#endif19911992#ifdef CONFIG_RTW_NAPI1993if (adapter->napi_state == NAPI_ENABLE) {1994napi_disable(&adapter->napi);1995adapter->napi_state = NAPI_DISABLE;1996}1997netif_napi_del(&adapter->napi);1998#endif /* CONFIG_RTW_NAPI */19992000adapter->registered = 0;2001adapter->ndev_unregistering = 0;2002}20032004/**2005* rtw_os_ndev_init - Allocate and register OS layer net device and relating structures for @adapter2006* @adapter: the adapter on which this function applies2007* @name: the requesting net device name2008*2009* Returns:2010* _SUCCESS or _FAIL2011*/2012int rtw_os_ndev_init(_adapter *adapter, const char *name)2013{2014int ret = _FAIL;20152016if (rtw_os_ndev_alloc(adapter) != _SUCCESS)2017goto exit;20182019if (rtw_os_ndev_register(adapter, name) != _SUCCESS)2020goto os_ndev_free;20212022ret = _SUCCESS;20232024os_ndev_free:2025if (ret != _SUCCESS)2026rtw_os_ndev_free(adapter);2027exit:2028return ret;2029}20302031/**2032* rtw_os_ndev_deinit - Unregister and free OS layer net device and relating structures for @adapter2033* @adapter: the adapter on which this function applies2034*/2035void rtw_os_ndev_deinit(_adapter *adapter)2036{2037rtw_os_ndev_unregister(adapter);2038rtw_os_ndev_free(adapter);2039}20402041int rtw_os_ndevs_alloc(struct dvobj_priv *dvobj)2042{2043int i, status = _SUCCESS;2044_adapter *adapter;20452046#if defined(CONFIG_IOCTL_CFG80211)2047if (rtw_cfg80211_dev_res_alloc(dvobj) != _SUCCESS) {2048rtw_warn_on(1);2049status = _FAIL;2050goto exit;2051}2052#endif20532054for (i = 0; i < dvobj->iface_nums; i++) {20552056if (i >= CONFIG_IFACE_NUMBER) {2057RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);2058rtw_warn_on(1);2059continue;2060}20612062adapter = dvobj->padapters[i];2063if (adapter && !adapter->pnetdev) {20642065#ifdef CONFIG_RTW_DYNAMIC_NDEV2066if (!is_primary_adapter(adapter))2067continue;2068#endif20692070status = rtw_os_ndev_alloc(adapter);2071if (status != _SUCCESS) {2072rtw_warn_on(1);2073break;2074}2075}2076}20772078if (status != _SUCCESS) {2079for (; i >= 0; i--) {2080adapter = dvobj->padapters[i];2081if (adapter && adapter->pnetdev)2082rtw_os_ndev_free(adapter);2083}2084}20852086#if defined(CONFIG_IOCTL_CFG80211)2087if (status != _SUCCESS)2088rtw_cfg80211_dev_res_free(dvobj);2089#endif2090exit:2091return status;2092}20932094void rtw_os_ndevs_free(struct dvobj_priv *dvobj)2095{2096int i;2097_adapter *adapter = NULL;20982099for (i = 0; i < dvobj->iface_nums; i++) {21002101if (i >= CONFIG_IFACE_NUMBER) {2102RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);2103rtw_warn_on(1);2104continue;2105}21062107adapter = dvobj->padapters[i];21082109if (adapter == NULL)2110continue;21112112rtw_os_ndev_free(adapter);2113}21142115#if defined(CONFIG_IOCTL_CFG80211)2116rtw_cfg80211_dev_res_free(dvobj);2117#endif2118}21192120u32 rtw_start_drv_threads(_adapter *padapter)2121{2122u32 _status = _SUCCESS;21232124RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));21252126#ifdef CONFIG_XMIT_THREAD_MODE2127#if defined(CONFIG_SDIO_HCI)2128if (is_primary_adapter(padapter))2129#endif2130{2131if (padapter->xmitThread == NULL) {2132RTW_INFO(FUNC_ADPT_FMT " start RTW_XMIT_THREAD\n", FUNC_ADPT_ARG(padapter));2133padapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, "RTW_XMIT_THREAD");2134if (IS_ERR(padapter->xmitThread)) {2135padapter->xmitThread = NULL;2136_status = _FAIL;2137}2138}2139}2140#endif /* #ifdef CONFIG_XMIT_THREAD_MODE */21412142#ifdef CONFIG_RECV_THREAD_MODE2143if (is_primary_adapter(padapter)) {2144if (padapter->recvThread == NULL) {2145RTW_INFO(FUNC_ADPT_FMT " start RTW_RECV_THREAD\n", FUNC_ADPT_ARG(padapter));2146padapter->recvThread = kthread_run(rtw_recv_thread, padapter, "RTW_RECV_THREAD");2147if (IS_ERR(padapter->recvThread)) {2148padapter->recvThread = NULL;2149_status = _FAIL;2150}2151}2152}2153#endif21542155if (is_primary_adapter(padapter)) {2156if (padapter->cmdThread == NULL) {2157RTW_INFO(FUNC_ADPT_FMT " start RTW_CMD_THREAD\n", FUNC_ADPT_ARG(padapter));2158padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD");2159if (IS_ERR(padapter->cmdThread)) {2160padapter->cmdThread = NULL;2161_status = _FAIL;2162}2163else2164_rtw_down_sema(&padapter->cmdpriv.start_cmdthread_sema); /* wait for cmd_thread to run */2165}2166}216721682169#ifdef CONFIG_EVENT_THREAD_MODE2170if (padapter->evtThread == NULL) {2171RTW_INFO(FUNC_ADPT_FMT " start RTW_EVENT_THREAD\n", FUNC_ADPT_ARG(padapter));2172padapter->evtThread = kthread_run(event_thread, padapter, "RTW_EVENT_THREAD");2173if (IS_ERR(padapter->evtThread)) {2174padapter->evtThread = NULL;2175_status = _FAIL;2176}2177}2178#endif21792180rtw_hal_start_thread(padapter);2181return _status;21822183}21842185void rtw_stop_drv_threads(_adapter *padapter)2186{2187RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));2188if (is_primary_adapter(padapter))2189rtw_stop_cmd_thread(padapter);21902191#ifdef CONFIG_EVENT_THREAD_MODE2192if (padapter->evtThread) {2193_rtw_up_sema(&padapter->evtpriv.evt_notify);2194rtw_thread_stop(padapter->evtThread);2195padapter->evtThread = NULL;2196}2197#endif21982199#ifdef CONFIG_XMIT_THREAD_MODE2200/* Below is to termindate tx_thread... */2201#if defined(CONFIG_SDIO_HCI)2202/* Only wake-up primary adapter */2203if (is_primary_adapter(padapter))2204#endif /*SDIO_HCI */2205{2206if (padapter->xmitThread) {2207_rtw_up_sema(&padapter->xmitpriv.xmit_sema);2208rtw_thread_stop(padapter->xmitThread);2209padapter->xmitThread = NULL;2210}2211}2212#endif22132214#ifdef CONFIG_RECV_THREAD_MODE2215if (is_primary_adapter(padapter) && padapter->recvThread) {2216/* Below is to termindate rx_thread... */2217_rtw_up_sema(&padapter->recvpriv.recv_sema);2218rtw_thread_stop(padapter->recvThread);2219padapter->recvThread = NULL;2220}2221#endif22222223rtw_hal_stop_thread(padapter);2224}22252226u8 rtw_init_default_value(_adapter *padapter)2227{2228u8 ret = _SUCCESS;2229struct registry_priv *pregistrypriv = &padapter->registrypriv;2230struct xmit_priv *pxmitpriv = &padapter->xmitpriv;2231struct security_priv *psecuritypriv = &padapter->securitypriv;22322233/* xmit_priv */2234pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;2235pxmitpriv->vcs = pregistrypriv->vcs_type;2236pxmitpriv->vcs_type = pregistrypriv->vcs_type;2237/* pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; */2238pxmitpriv->frag_len = pregistrypriv->frag_thresh;22392240/* security_priv */2241/* rtw_get_encrypt_decrypt_from_registrypriv(padapter); */2242psecuritypriv->binstallGrpkey = _FAIL;2243#ifdef CONFIG_GTK_OL2244psecuritypriv->binstallKCK_KEK = _FAIL;2245#endif /* CONFIG_GTK_OL */2246psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt;2247psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt;22482249psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */2250psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;22512252psecuritypriv->dot11PrivacyKeyIndex = 0;22532254psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;2255psecuritypriv->dot118021XGrpKeyid = 1;22562257psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;2258psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;2259#ifdef CONFIG_CONCURRENT_MODE2260psecuritypriv->dot118021x_bmc_cam_id = INVALID_SEC_MAC_CAM_ID;2261#endif226222632264/* pwrctrl_priv */226522662267/* registry_priv */2268rtw_init_registrypriv_dev_network(padapter);2269rtw_update_registrypriv_dev_network(padapter);227022712272/* hal_priv */2273rtw_hal_def_value_init(padapter);22742275#ifdef CONFIG_MCC_MODE2276/* MCC parameter */2277rtw_hal_mcc_parameter_init(padapter);2278#endif /* CONFIG_MCC_MODE */22792280/* misc. */2281RTW_ENABLE_FUNC(padapter, DF_RX_BIT);2282RTW_ENABLE_FUNC(padapter, DF_TX_BIT);2283padapter->bLinkInfoDump = 0;2284padapter->bNotifyChannelChange = _FALSE;2285#ifdef CONFIG_P2P2286padapter->bShowGetP2PState = 1;2287#endif22882289/* for debug purpose */2290padapter->fix_rate = 0xFF;2291padapter->data_fb = 0;2292padapter->fix_bw = 0xFF;2293padapter->power_offset = 0;2294padapter->rsvd_page_offset = 0;2295padapter->rsvd_page_num = 0;2296#ifdef CONFIG_AP_MODE2297padapter->bmc_tx_rate = pregistrypriv->bmc_tx_rate;2298#endif2299padapter->driver_tx_bw_mode = pregistrypriv->tx_bw_mode;23002301padapter->driver_ampdu_spacing = 0xFF;2302padapter->driver_rx_ampdu_factor = 0xFF;2303padapter->driver_rx_ampdu_spacing = 0xFF;2304padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;2305padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;2306#ifdef CONFIG_TX_AMSDU2307padapter->tx_amsdu = 2;2308padapter->tx_amsdu_rate = 400;2309#endif2310padapter->driver_tx_max_agg_num = 0xFF;2311#ifdef DBG_RX_COUNTER_DUMP2312padapter->dump_rx_cnt_mode = 0;2313padapter->drv_rx_cnt_ok = 0;2314padapter->drv_rx_cnt_crcerror = 0;2315padapter->drv_rx_cnt_drop = 0;2316#endif2317#ifdef CONFIG_RTW_NAPI2318padapter->napi_state = NAPI_DISABLE;2319#endif23202321#ifdef CONFIG_RTW_ACS2322if (pregistrypriv->acs_mode)2323rtw_acs_start(padapter);2324else2325rtw_acs_stop(padapter);2326#endif2327#ifdef CONFIG_BACKGROUND_NOISE_MONITOR2328if (pregistrypriv->nm_mode)2329rtw_nm_enable(padapter);2330else2331rtw_nm_disable(padapter);2332#endif2333return ret;2334}2335#ifdef CONFIG_CLIENT_PORT_CFG2336extern void rtw_clt_port_init(struct clt_port_t *cltp);2337extern void rtw_clt_port_deinit(struct clt_port_t *cltp);2338#endif23392340struct dvobj_priv *devobj_init(void)2341{2342struct dvobj_priv *pdvobj = NULL;23432344pdvobj = (struct dvobj_priv *)rtw_zmalloc(sizeof(*pdvobj));2345if (pdvobj == NULL)2346return NULL;23472348_rtw_mutex_init(&pdvobj->hw_init_mutex);2349_rtw_mutex_init(&pdvobj->h2c_fwcmd_mutex);2350_rtw_mutex_init(&pdvobj->setch_mutex);2351_rtw_mutex_init(&pdvobj->setbw_mutex);2352_rtw_mutex_init(&pdvobj->rf_read_reg_mutex);2353_rtw_mutex_init(&pdvobj->ioctrl_mutex);2354#ifdef CONFIG_SDIO_INDIRECT_ACCESS2355_rtw_mutex_init(&pdvobj->sd_indirect_access_mutex);2356#endif2357#ifdef CONFIG_SYSON_INDIRECT_ACCESS2358_rtw_mutex_init(&pdvobj->syson_indirect_access_mutex);2359#endif2360#ifdef CONFIG_RTW_CUSTOMER_STR2361_rtw_mutex_init(&pdvobj->customer_str_mutex);2362_rtw_memset(pdvobj->customer_str, 0xFF, RTW_CUSTOMER_STR_LEN);2363#endif2364#ifdef CONFIG_PROTSEL_PORT2365_rtw_mutex_init(&pdvobj->protsel_port.mutex);2366#endif2367#ifdef CONFIG_PROTSEL_ATIMDTIM2368_rtw_mutex_init(&pdvobj->protsel_atimdtim.mutex);2369#endif2370#ifdef CONFIG_PROTSEL_MACSLEEP2371_rtw_mutex_init(&pdvobj->protsel_macsleep.mutex);2372#endif23732374pdvobj->processing_dev_remove = _FALSE;23752376ATOMIC_SET(&pdvobj->disable_func, 0);23772378rtw_macid_ctl_init(&pdvobj->macid_ctl);2379#ifdef CONFIG_CLIENT_PORT_CFG2380rtw_clt_port_init(&pdvobj->clt_port);2381#endif2382_rtw_spinlock_init(&pdvobj->cam_ctl.lock);2383_rtw_mutex_init(&pdvobj->cam_ctl.sec_cam_access_mutex);2384#if defined(RTK_129X_PLATFORM) && defined(CONFIG_PCI_HCI)2385_rtw_spinlock_init(&pdvobj->io_reg_lock);2386#endif2387#ifdef CONFIG_MBSSID_CAM2388rtw_mbid_cam_init(pdvobj);2389#endif23902391#ifdef CONFIG_AP_MODE2392#ifdef CONFIG_SUPPORT_MULTI_BCN2393pdvobj->nr_ap_if = 0;2394pdvobj->inter_bcn_space = DEFAULT_BCN_INTERVAL; /* default value is equal to the default beacon_interval (100ms) */2395_rtw_init_queue(&pdvobj->ap_if_q);2396pdvobj->vap_map = 0;2397#endif /*CONFIG_SUPPORT_MULTI_BCN*/2398#ifdef CONFIG_SWTIMER_BASED_TXBCN2399rtw_init_timer(&(pdvobj->txbcn_timer), NULL, tx_beacon_timer_handlder, pdvobj);2400#endif2401#endif24022403rtw_init_timer(&(pdvobj->dynamic_chk_timer), NULL, rtw_dynamic_check_timer_handlder, pdvobj);2404rtw_init_timer(&(pdvobj->periodic_tsf_update_end_timer), NULL, rtw_hal_periodic_tsf_update_end_timer_hdl, pdvobj);24052406#ifdef CONFIG_MCC_MODE2407_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_mutex));2408_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_tsf_req_mutex));2409_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_dbg_reg_mutex));2410_rtw_spinlock_init(&pdvobj->mcc_objpriv.mcc_lock);2411#endif /* CONFIG_MCC_MODE */24122413#ifdef CONFIG_RTW_NAPI_DYNAMIC2414pdvobj->en_napi_dynamic = 0;2415#endif /* CONFIG_RTW_NAPI_DYNAMIC */241624172418#ifdef CONFIG_RTW_TPT_MODE2419pdvobj->tpt_mode = 0;2420pdvobj->edca_be_ul = 0x5ea42b;2421pdvobj->edca_be_dl = 0x00a42b;2422#endif2423pdvobj->scan_deny = _FALSE;24242425return pdvobj;24262427}24282429void devobj_deinit(struct dvobj_priv *pdvobj)2430{2431if (!pdvobj)2432return;24332434/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */2435#if defined(CONFIG_IOCTL_CFG80211)2436rtw_cfg80211_dev_res_free(pdvobj);2437#endif24382439#ifdef CONFIG_MCC_MODE2440_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_mutex));2441_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_tsf_req_mutex));2442_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_dbg_reg_mutex));2443_rtw_spinlock_free(&pdvobj->mcc_objpriv.mcc_lock);2444#endif /* CONFIG_MCC_MODE */24452446_rtw_mutex_free(&pdvobj->hw_init_mutex);2447_rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex);24482449#ifdef CONFIG_RTW_CUSTOMER_STR2450_rtw_mutex_free(&pdvobj->customer_str_mutex);2451#endif2452#ifdef CONFIG_PROTSEL_PORT2453_rtw_mutex_free(&pdvobj->protsel_port.mutex);2454#endif2455#ifdef CONFIG_PROTSEL_ATIMDTIM2456_rtw_mutex_free(&pdvobj->protsel_atimdtim.mutex);2457#endif2458#ifdef CONFIG_PROTSEL_MACSLEEP2459_rtw_mutex_free(&pdvobj->protsel_macsleep.mutex);2460#endif24612462_rtw_mutex_free(&pdvobj->setch_mutex);2463_rtw_mutex_free(&pdvobj->setbw_mutex);2464_rtw_mutex_free(&pdvobj->rf_read_reg_mutex);2465_rtw_mutex_free(&pdvobj->ioctrl_mutex);2466#ifdef CONFIG_SDIO_INDIRECT_ACCESS2467_rtw_mutex_free(&pdvobj->sd_indirect_access_mutex);2468#endif2469#ifdef CONFIG_SYSON_INDIRECT_ACCESS2470_rtw_mutex_free(&pdvobj->syson_indirect_access_mutex);2471#endif24722473rtw_macid_ctl_deinit(&pdvobj->macid_ctl);2474#ifdef CONFIG_CLIENT_PORT_CFG2475rtw_clt_port_deinit(&pdvobj->clt_port);2476#endif24772478_rtw_spinlock_free(&pdvobj->cam_ctl.lock);2479_rtw_mutex_free(&pdvobj->cam_ctl.sec_cam_access_mutex);24802481#if defined(RTK_129X_PLATFORM) && defined(CONFIG_PCI_HCI)2482_rtw_spinlock_free(&pdvobj->io_reg_lock);2483#endif2484#ifdef CONFIG_MBSSID_CAM2485rtw_mbid_cam_deinit(pdvobj);2486#endif2487#ifdef CONFIG_SUPPORT_MULTI_BCN2488_rtw_spinlock_free(&(pdvobj->ap_if_q.lock));2489#endif2490rtw_mfree((u8 *)pdvobj, sizeof(*pdvobj));2491}24922493inline u8 rtw_rtnl_lock_needed(struct dvobj_priv *dvobj)2494{2495if (dvobj->rtnl_lock_holder && dvobj->rtnl_lock_holder == current)2496return 0;2497return 1;2498}24992500#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))2501static inline int rtnl_is_locked(void)2502{2503#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 17))2504if (unlikely(rtnl_trylock())) {2505rtnl_unlock();2506#else2507if (unlikely(down_trylock(&rtnl_sem) == 0)) {2508up(&rtnl_sem);2509#endif2510return 0;2511}2512return 1;2513}2514#endif25152516inline void rtw_set_rtnl_lock_holder(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl)2517{2518rtw_warn_on(!rtnl_is_locked());25192520if (!thd_hdl || rtnl_is_locked())2521dvobj->rtnl_lock_holder = thd_hdl;25222523if (dvobj->rtnl_lock_holder && 0)2524RTW_INFO("rtnl_lock_holder: %s:%d\n", current->comm, current->pid);2525}25262527u8 rtw_reset_drv_sw(_adapter *padapter)2528{2529u8 ret8 = _SUCCESS;2530struct mlme_priv *pmlmepriv = &padapter->mlmepriv;2531struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);25322533/* hal_priv */2534rtw_hal_def_value_init(padapter);25352536RTW_ENABLE_FUNC(padapter, DF_RX_BIT);2537RTW_ENABLE_FUNC(padapter, DF_TX_BIT);25382539padapter->bLinkInfoDump = 0;25402541padapter->xmitpriv.tx_pkts = 0;2542padapter->recvpriv.rx_pkts = 0;25432544pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;25452546/* pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE; */2547pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;2548pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;25492550_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING);25512552#ifdef CONFIG_AUTOSUSPEND2553#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34))2554adapter_to_dvobj(padapter)->pusbdev->autosuspend_disabled = 1;/* autosuspend disabled by the user */2555#endif2556#endif25572558#ifdef DBG_CONFIG_ERROR_DETECT2559if (is_primary_adapter(padapter))2560rtw_hal_sreset_reset_value(padapter);2561#endif2562pwrctrlpriv->pwr_state_check_cnts = 0;25632564/* mlmeextpriv */2565mlmeext_set_scan_state(&padapter->mlmeextpriv, SCAN_DISABLE);25662567#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS2568rtw_set_signal_stat_timer(&padapter->recvpriv);2569#endif25702571return ret8;2572}257325742575u8 rtw_init_drv_sw(_adapter *padapter)2576{2577u8 ret8 = _SUCCESS;25782579#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI2580struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);2581#endif25822583#if defined(CONFIG_AP_MODE) && defined(CONFIG_SUPPORT_MULTI_BCN)2584_rtw_init_listhead(&padapter->list);2585#ifdef CONFIG_FW_HANDLE_TXBCN2586padapter->vap_id = CONFIG_LIMITED_AP_NUM;2587if (is_primary_adapter(padapter))2588adapter_to_dvobj(padapter)->vap_tbtt_rpt_map = adapter_to_regsty(padapter)->fw_tbtt_rpt;2589#endif2590#endif25912592#ifdef CONFIG_CLIENT_PORT_CFG2593padapter->client_id = MAX_CLIENT_PORT_NUM;2594padapter->client_port = CLT_PORT_INVALID;2595#endif25962597if (is_primary_adapter(padapter)) {2598struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);2599struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);26002601dvobj->macid_ctl.num = rtw_min(hal_spec->macid_num, MACID_NUM_SW_LIMIT);26022603dvobj->cam_ctl.sec_cap = hal_spec->sec_cap;2604dvobj->cam_ctl.num = rtw_min(hal_spec->sec_cam_ent_num, SEC_CAM_ENT_NUM_SW_LIMIT);26052606#if CONFIG_TX_AC_LIFETIME2607{2608struct registry_priv *regsty = adapter_to_regsty(padapter);2609int i;26102611dvobj->tx_aclt_flags = regsty->tx_aclt_flags;2612for (i = 0; i < TX_ACLT_CONF_NUM; i++) {2613dvobj->tx_aclt_confs[i].en = regsty->tx_aclt_confs[i].en;2614dvobj->tx_aclt_confs[i].vo_vi2615= regsty->tx_aclt_confs[i].vo_vi / (hal_spec->tx_aclt_unit_factor * 32);2616if (dvobj->tx_aclt_confs[i].vo_vi > 0xFFFF)2617dvobj->tx_aclt_confs[i].vo_vi = 0xFFFF;2618dvobj->tx_aclt_confs[i].be_bk2619= regsty->tx_aclt_confs[i].be_bk / (hal_spec->tx_aclt_unit_factor * 32);2620if (dvobj->tx_aclt_confs[i].be_bk > 0xFFFF)2621dvobj->tx_aclt_confs[i].be_bk = 0xFFFF;2622}26232624dvobj->tx_aclt_force_val.en = 0xFF;2625}2626#endif2627}26282629ret8 = rtw_init_default_value(padapter);26302631if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) {2632ret8 = _FAIL;2633goto exit;2634}26352636padapter->cmdpriv.padapter = padapter;26372638if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) {2639ret8 = _FAIL;2640goto exit;2641}26422643if (is_primary_adapter(padapter))2644rtw_rfctl_init(padapter);26452646if (is_primary_adapter(padapter)) {2647if (rtw_hal_rfpath_init(padapter) == _FAIL) {2648ret8 = _FAIL;2649goto exit;2650}2651if (rtw_hal_trxnss_init(padapter) == _FAIL) {2652ret8 = _FAIL;2653goto exit;2654}2655}26562657if (rtw_init_mlme_priv(padapter) == _FAIL) {2658ret8 = _FAIL;2659goto exit;2660}26612662#ifdef CONFIG_P2P2663rtw_init_wifidirect_timers(padapter);2664init_wifidirect_info(padapter, P2P_ROLE_DISABLE);2665reset_global_wifidirect_info(padapter);2666#ifdef CONFIG_IOCTL_CFG802112667rtw_init_cfg80211_wifidirect_info(padapter);2668#endif2669#ifdef CONFIG_WFD2670if (rtw_init_wifi_display_info(padapter) == _FAIL)2671RTW_ERR("Can't init init_wifi_display_info\n");2672#endif2673#endif /* CONFIG_P2P */26742675if (init_mlme_ext_priv(padapter) == _FAIL) {2676ret8 = _FAIL;2677goto exit;2678}26792680#ifdef CONFIG_TDLS2681if (rtw_init_tdls_info(padapter) == _FAIL) {2682RTW_INFO("Can't rtw_init_tdls_info\n");2683ret8 = _FAIL;2684goto exit;2685}2686#endif /* CONFIG_TDLS */26872688#ifdef CONFIG_RTW_MESH2689rtw_mesh_cfg_init(padapter);2690#endif26912692if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) {2693RTW_INFO("Can't _rtw_init_xmit_priv\n");2694ret8 = _FAIL;2695goto exit;2696}26972698if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) {2699RTW_INFO("Can't _rtw_init_recv_priv\n");2700ret8 = _FAIL;2701goto exit;2702}2703/* add for CONFIG_IEEE80211W, none 11w also can use */2704_rtw_spinlock_init(&padapter->security_key_mutex);27052706/* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */2707/* _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); */27082709if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) {2710RTW_INFO("Can't _rtw_init_sta_priv\n");2711ret8 = _FAIL;2712goto exit;2713}27142715padapter->setband = WIFI_FREQUENCY_BAND_AUTO;2716padapter->fix_rate = 0xFF;2717padapter->power_offset = 0;2718padapter->rsvd_page_offset = 0;2719padapter->rsvd_page_num = 0;27202721padapter->data_fb = 0;2722padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;2723padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;2724#ifdef DBG_RX_COUNTER_DUMP2725padapter->dump_rx_cnt_mode = 0;2726padapter->drv_rx_cnt_ok = 0;2727padapter->drv_rx_cnt_crcerror = 0;2728padapter->drv_rx_cnt_drop = 0;2729#endif2730rtw_init_bcmc_stainfo(padapter);27312732rtw_init_pwrctrl_priv(padapter);27332734/* _rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv)); */ /* move to mlme_priv */27352736#ifdef CONFIG_MP_INCLUDED2737if (init_mp_priv(padapter) == _FAIL)2738RTW_INFO("%s: initialize MP private data Fail!\n", __func__);2739#endif27402741rtw_hal_dm_init(padapter);2742#ifdef CONFIG_RTW_SW_LED2743rtw_hal_sw_led_init(padapter);2744#endif2745#ifdef DBG_CONFIG_ERROR_DETECT2746rtw_hal_sreset_init(padapter);2747#endif27482749#ifdef CONFIG_WAPI_SUPPORT2750padapter->WapiSupport = true; /* set true temp, will revise according to Efuse or Registry value later. */2751rtw_wapi_init(padapter);2752#endif27532754#ifdef CONFIG_BR_EXT2755_rtw_spinlock_init(&padapter->br_ext_lock);2756#endif /* CONFIG_BR_EXT */27572758#ifdef CONFIG_BEAMFORMING2759#ifdef RTW_BEAMFORMING_VERSION_22760rtw_bf_init(padapter);2761#endif /* RTW_BEAMFORMING_VERSION_2 */2762#endif /* CONFIG_BEAMFORMING */27632764#ifdef CONFIG_RTW_REPEATER_SON2765init_rtw_rson_data(adapter_to_dvobj(padapter));2766#endif27672768#ifdef CONFIG_RTW_80211K2769rtw_init_rm(padapter);2770#endif27712772#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI2773memset(pwdev_priv->pno_mac_addr, 0xFF, ETH_ALEN);2774#endif27752776exit:2777277827792780return ret8;27812782}27832784#ifdef CONFIG_WOWLAN2785void rtw_cancel_dynamic_chk_timer(_adapter *padapter)2786{2787_cancel_timer_ex(&adapter_to_dvobj(padapter)->dynamic_chk_timer);2788}2789#endif27902791void rtw_cancel_all_timer(_adapter *padapter)2792{27932794_cancel_timer_ex(&padapter->mlmepriv.assoc_timer);27952796_cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);27972798#ifdef CONFIG_DFS_MASTER2799_cancel_timer_ex(&adapter_to_rfctl(padapter)->radar_detect_timer);2800#endif28012802_cancel_timer_ex(&adapter_to_dvobj(padapter)->dynamic_chk_timer);2803_cancel_timer_ex(&adapter_to_dvobj(padapter)->periodic_tsf_update_end_timer);2804#ifdef CONFIG_RTW_SW_LED2805/* cancel sw led timer */2806rtw_hal_sw_led_deinit(padapter);2807#endif2808_cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_state_check_timer));28092810#ifdef CONFIG_TX_AMSDU2811_cancel_timer_ex(&padapter->xmitpriv.amsdu_bk_timer);2812_cancel_timer_ex(&padapter->xmitpriv.amsdu_be_timer);2813_cancel_timer_ex(&padapter->xmitpriv.amsdu_vo_timer);2814_cancel_timer_ex(&padapter->xmitpriv.amsdu_vi_timer);2815#endif28162817#ifdef CONFIG_IOCTL_CFG802112818#ifdef CONFIG_P2P2819_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);2820#endif /* CONFIG_P2P */2821#endif /* CONFIG_IOCTL_CFG80211 */28222823#ifdef CONFIG_SET_SCAN_DENY_TIMER2824_cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer);2825rtw_clear_scan_deny(padapter);2826#endif28272828#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS2829_cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);2830#endif28312832#ifdef CONFIG_LPS_RPWM_TIMER2833_cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_rpwm_timer));2834#endif /* CONFIG_LPS_RPWM_TIMER */28352836/* cancel dm timer */2837rtw_hal_dm_deinit(padapter);28382839#ifdef CONFIG_PLATFORM_FS_MX612840msleep(50);2841#endif2842}28432844u8 rtw_free_drv_sw(_adapter *padapter)2845{28462847#ifdef CONFIG_WAPI_SUPPORT2848rtw_wapi_free(padapter);2849#endif28502851/* we can call rtw_p2p_enable here, but: */2852/* 1. rtw_p2p_enable may have IO operation */2853/* 2. rtw_p2p_enable is bundled with wext interface */2854#ifdef CONFIG_P2P2855{2856struct wifidirect_info *pwdinfo = &padapter->wdinfo;2857if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {2858_cancel_timer_ex(&pwdinfo->find_phase_timer);2859_cancel_timer_ex(&pwdinfo->restore_p2p_state_timer);2860_cancel_timer_ex(&pwdinfo->pre_tx_scan_timer);2861#ifdef CONFIG_CONCURRENT_MODE2862_cancel_timer_ex(&pwdinfo->ap_p2p_switch_timer);2863#endif /* CONFIG_CONCURRENT_MODE */2864rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);2865}2866}2867#endif2868/* add for CONFIG_IEEE80211W, none 11w also can use */2869_rtw_spinlock_free(&padapter->security_key_mutex);28702871#ifdef CONFIG_BR_EXT2872_rtw_spinlock_free(&padapter->br_ext_lock);2873#endif /* CONFIG_BR_EXT */28742875free_mlme_ext_priv(&padapter->mlmeextpriv);28762877#ifdef CONFIG_TDLS2878/* rtw_free_tdls_info(&padapter->tdlsinfo); */2879#endif /* CONFIG_TDLS */28802881#ifdef CONFIG_RTW_80211K2882rtw_free_rm_priv(padapter);2883#endif28842885rtw_free_cmd_priv(&padapter->cmdpriv);28862887rtw_free_evt_priv(&padapter->evtpriv);28882889rtw_free_mlme_priv(&padapter->mlmepriv);28902891if (is_primary_adapter(padapter))2892rtw_rfctl_deinit(padapter);28932894/* free_io_queue(padapter); */28952896_rtw_free_xmit_priv(&padapter->xmitpriv);28972898_rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */28992900_rtw_free_recv_priv(&padapter->recvpriv);29012902rtw_free_pwrctrl_priv(padapter);29032904/* rtw_mfree((void *)padapter, sizeof (padapter)); */29052906rtw_hal_free_data(padapter);29072908return _SUCCESS;29092910}2911void rtw_intf_start(_adapter *adapter)2912{2913if (adapter->intf_start)2914adapter->intf_start(adapter);2915}2916void rtw_intf_stop(_adapter *adapter)2917{2918if (adapter->intf_stop)2919adapter->intf_stop(adapter);2920}29212922#ifdef CONFIG_CONCURRENT_MODE2923#ifndef CONFIG_NEW_NETDEV_HDL2924int _netdev_vir_if_open(struct net_device *pnetdev)2925{2926_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);2927_adapter *primary_padapter = GET_PRIMARY_ADAPTER(padapter);29282929RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);29302931if (!primary_padapter)2932goto _netdev_virtual_iface_open_error;29332934#ifdef CONFIG_PLATFORM_INTEL_BYT2935if (padapter->bup == _FALSE) {2936u8 mac[ETH_ALEN];29372938/* get mac address from primary_padapter */2939if (primary_padapter->bup == _FALSE)2940rtw_macaddr_cfg(adapter_mac_addr(primary_padapter), get_hal_mac_addr(primary_padapter));29412942_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);29432944/*2945* If the BIT1 is 0, the address is universally administered.2946* If it is 1, the address is locally administered2947*/2948mac[0] |= BIT(1);29492950_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);29512952#ifdef CONFIG_MI_WITH_MBSSID_CAM2953rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));2954#endif2955rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));2956_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);2957}2958#endif /*CONFIG_PLATFORM_INTEL_BYT*/29592960if (primary_padapter->bup == _FALSE || !rtw_is_hw_init_completed(primary_padapter))2961_netdev_open(primary_padapter->pnetdev);29622963if (padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&2964rtw_is_hw_init_completed(primary_padapter)) {2965#if 0 /*#ifdef CONFIG_MI_WITH_MBSSID_CAM*/2966rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, adapter_mac_addr(padapter)); /* set mac addr to mac register */2967#endif29682969}29702971if (padapter->bup == _FALSE) {2972if (rtw_start_drv_threads(padapter) == _FAIL)2973goto _netdev_virtual_iface_open_error;2974}29752976#ifdef CONFIG_RTW_NAPI2977if (padapter->napi_state == NAPI_DISABLE) {2978napi_enable(&padapter->napi);2979padapter->napi_state = NAPI_ENABLE;2980}2981#endif29822983#ifdef CONFIG_IOCTL_CFG802112984rtw_cfg80211_init_wiphy(padapter);2985rtw_cfg80211_init_wdev_data(padapter);2986#endif29872988padapter->bup = _TRUE;29892990padapter->net_closed = _FALSE;29912992rtw_netif_wake_queue(pnetdev);29932994RTW_INFO(FUNC_NDEV_FMT" (bup=%d) exit\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);29952996return 0;29972998_netdev_virtual_iface_open_error:29993000padapter->bup = _FALSE;30013002#ifdef CONFIG_RTW_NAPI3003if(padapter->napi_state == NAPI_ENABLE) {3004napi_disable(&padapter->napi);3005padapter->napi_state = NAPI_DISABLE;3006}3007#endif30083009rtw_netif_carrier_off(pnetdev);3010rtw_netif_stop_queue(pnetdev);30113012return -1;30133014}30153016int netdev_vir_if_open(struct net_device *pnetdev)3017{3018int ret;3019_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);30203021_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);3022ret = _netdev_vir_if_open(pnetdev);3023_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);30243025#ifdef CONFIG_AUTO_AP_MODE3026/* if(padapter->iface_id == 2) */3027/* rtw_start_auto_ap(padapter); */3028#endif30293030return ret;3031}30323033static int netdev_vir_if_close(struct net_device *pnetdev)3034{3035_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);3036struct mlme_priv *pmlmepriv = &padapter->mlmepriv;30373038RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);3039padapter->net_closed = _TRUE;3040pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;30413042if (pnetdev)3043rtw_netif_stop_queue(pnetdev);30443045#ifdef CONFIG_P2P3046if (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))3047rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);3048#endif30493050#ifdef CONFIG_IOCTL_CFG802113051rtw_scan_abort(padapter);3052rtw_cfg80211_wait_scan_req_empty(padapter, 200);3053adapter_wdev_data(padapter)->bandroid_scan = _FALSE;3054#endif30553056return 0;3057}3058#endif /*#ifndef CONFIG_NEW_NETDEV_HDL*/30593060#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))3061static const struct net_device_ops rtw_netdev_vir_if_ops = {3062.ndo_init = rtw_ndev_init,3063.ndo_uninit = rtw_ndev_uninit,3064#ifdef CONFIG_NEW_NETDEV_HDL3065.ndo_open = netdev_open,3066.ndo_stop = netdev_close,3067#else3068.ndo_open = netdev_vir_if_open,3069.ndo_stop = netdev_vir_if_close,3070#endif3071.ndo_start_xmit = rtw_xmit_entry,3072.ndo_set_mac_address = rtw_net_set_mac_address,3073.ndo_get_stats = rtw_net_get_stats,3074.ndo_do_ioctl = rtw_ioctl,3075#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))3076.ndo_select_queue = rtw_select_queue,3077#endif3078};3079#endif30803081static void rtw_hook_vir_if_ops(struct net_device *ndev)3082{3083#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))3084ndev->netdev_ops = &rtw_netdev_vir_if_ops;3085#else3086ndev->init = rtw_ndev_init;3087ndev->uninit = rtw_ndev_uninit;3088#ifdef CONFIG_NEW_NETDEV_HDL3089ndev->open = netdev_open;3090ndev->stop = netdev_close;3091#else3092ndev->open = netdev_vir_if_open;3093ndev->stop = netdev_vir_if_close;3094#endif30953096ndev->set_mac_address = rtw_net_set_mac_address;3097#endif3098}3099_adapter *rtw_drv_add_vir_if(_adapter *primary_padapter,3100void (*set_intf_ops)(_adapter *primary_padapter, struct _io_ops *pops))3101{3102int res = _FAIL;3103_adapter *padapter = NULL;3104struct dvobj_priv *pdvobjpriv;3105u8 mac[ETH_ALEN];31063107/****** init adapter ******/3108padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));3109if (padapter == NULL)3110goto exit;31113112if (loadparam(padapter) != _SUCCESS)3113goto free_adapter;31143115_rtw_memcpy(padapter, primary_padapter, sizeof(_adapter));31163117/* */3118padapter->bup = _FALSE;3119padapter->net_closed = _TRUE;3120padapter->dir_dev = NULL;3121padapter->dir_odm = NULL;31223123/*set adapter_type/iface type*/3124padapter->isprimary = _FALSE;3125padapter->adapter_type = VIRTUAL_ADAPTER;31263127#ifdef CONFIG_MI_WITH_MBSSID_CAM3128padapter->hw_port = HW_PORT0;3129#else3130padapter->hw_port = HW_PORT1;3131#endif313231333134/****** hook vir if into dvobj ******/3135pdvobjpriv = adapter_to_dvobj(padapter);3136padapter->iface_id = pdvobjpriv->iface_nums;3137pdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;31383139padapter->intf_start = primary_padapter->intf_start;3140padapter->intf_stop = primary_padapter->intf_stop;31413142/* step init_io_priv */3143if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {3144goto free_adapter;3145}31463147/*init drv data*/3148if (rtw_init_drv_sw(padapter) != _SUCCESS)3149goto free_drv_sw;315031513152/*get mac address from primary_padapter*/3153_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);31543155/*3156* If the BIT1 is 0, the address is universally administered.3157* If it is 1, the address is locally administered3158*/3159mac[0] |= BIT(1);3160if (padapter->iface_id > IFACE_ID1)3161mac[4] ^= BIT(padapter->iface_id);31623163_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);3164/* update mac-address to mbsid-cam cache*/3165#ifdef CONFIG_MI_WITH_MBSSID_CAM3166rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));3167#endif3168RTW_INFO("%s if%d mac_addr : "MAC_FMT"\n", __func__, padapter->iface_id + 1, MAC_ARG(adapter_mac_addr(padapter)));3169#ifdef CONFIG_P2P3170rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));3171#endif31723173rtw_led_set_ctl_en_mask_virtual(padapter);3174rtw_led_set_iface_en(padapter, 1);31753176res = _SUCCESS;31773178free_drv_sw:3179if (res != _SUCCESS && padapter)3180rtw_free_drv_sw(padapter);3181free_adapter:3182if (res != _SUCCESS && padapter) {3183rtw_vmfree((u8 *)padapter, sizeof(*padapter));3184padapter = NULL;3185}3186exit:3187return padapter;3188}31893190void rtw_drv_stop_vir_if(_adapter *padapter)3191{3192struct net_device *pnetdev = NULL;3193struct mlme_priv *pmlmepriv = &padapter->mlmepriv;31943195if (padapter == NULL)3196return;3197RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));31983199pnetdev = padapter->pnetdev;32003201if (check_fwstate(pmlmepriv, _FW_LINKED))3202rtw_disassoc_cmd(padapter, 0, RTW_CMDF_DIRECTLY);32033204#ifdef CONFIG_AP_MODE3205if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {3206free_mlme_ap_info(padapter);3207#ifdef CONFIG_HOSTAPD_MLME3208hostapd_mode_unload(padapter);3209#endif3210}3211#endif32123213if (padapter->bup == _TRUE) {3214#ifdef CONFIG_XMIT_ACK3215if (padapter->xmitpriv.ack_tx)3216rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);3217#endif32183219rtw_intf_stop(padapter);3220#ifndef CONFIG_NEW_NETDEV_HDL3221rtw_stop_drv_threads(padapter);3222#endif3223padapter->bup = _FALSE;3224}3225#ifdef CONFIG_NEW_NETDEV_HDL3226rtw_stop_drv_threads(padapter);3227#endif3228/* cancel timer after thread stop */3229rtw_cancel_all_timer(padapter);3230}32313232void rtw_drv_free_vir_if(_adapter *padapter)3233{3234if (padapter == NULL)3235return;32363237RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));3238rtw_free_drv_sw(padapter);32393240/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */3241rtw_os_ndev_free(padapter);32423243rtw_vmfree((u8 *)padapter, sizeof(_adapter));3244}324532463247void rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj)3248{3249int i;32503251for (i = VIF_START_ID; i < dvobj->iface_nums; i++)3252rtw_drv_stop_vir_if(dvobj->padapters[i]);3253}32543255void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj)3256{3257int i;32583259for (i = VIF_START_ID; i < dvobj->iface_nums; i++)3260rtw_drv_free_vir_if(dvobj->padapters[i]);3261}326232633264#endif /*end of CONFIG_CONCURRENT_MODE*/32653266/* IPv4, IPv6 IP addr notifier */3267static int rtw_inetaddr_notifier_call(struct notifier_block *nb,3268unsigned long action, void *data)3269{3270struct in_ifaddr *ifa = (struct in_ifaddr *)data;3271struct net_device *ndev;3272struct mlme_ext_priv *pmlmeext = NULL;3273struct mlme_ext_info *pmlmeinfo = NULL;3274_adapter *adapter = NULL;32753276if (!ifa || !ifa->ifa_dev || !ifa->ifa_dev->dev)3277return NOTIFY_DONE;32783279ndev = ifa->ifa_dev->dev;32803281if (!is_rtw_ndev(ndev))3282return NOTIFY_DONE;32833284adapter = (_adapter *)rtw_netdev_priv(ifa->ifa_dev->dev);32853286if (adapter == NULL)3287return NOTIFY_DONE;32883289pmlmeext = &adapter->mlmeextpriv;3290pmlmeinfo = &pmlmeext->mlmext_info;32913292switch (action) {3293case NETDEV_UP:3294_rtw_memcpy(pmlmeinfo->ip_addr, &ifa->ifa_address,3295RTW_IP_ADDR_LEN);3296RTW_DBG("%s[%s]: up IP: %pI4\n", __func__,3297ifa->ifa_label, pmlmeinfo->ip_addr);3298break;3299case NETDEV_DOWN:3300_rtw_memset(pmlmeinfo->ip_addr, 0, RTW_IP_ADDR_LEN);3301RTW_DBG("%s[%s]: down IP: %pI4\n", __func__,3302ifa->ifa_label, pmlmeinfo->ip_addr);3303break;3304default:3305RTW_DBG("%s: default action\n", __func__);3306break;3307}3308return NOTIFY_DONE;3309}33103311#ifdef CONFIG_IPV63312static int rtw_inet6addr_notifier_call(struct notifier_block *nb,3313unsigned long action, void *data)3314{3315struct inet6_ifaddr *inet6_ifa = data;3316struct net_device *ndev;3317struct pwrctrl_priv *pwrctl = NULL;3318struct mlme_ext_priv *pmlmeext = NULL;3319struct mlme_ext_info *pmlmeinfo = NULL;3320_adapter *adapter = NULL;33213322if (!inet6_ifa || !inet6_ifa->idev || !inet6_ifa->idev->dev)3323return NOTIFY_DONE;33243325ndev = inet6_ifa->idev->dev;33263327if (!is_rtw_ndev(ndev))3328return NOTIFY_DONE;33293330adapter = (_adapter *)rtw_netdev_priv(inet6_ifa->idev->dev);33313332if (adapter == NULL)3333return NOTIFY_DONE;33343335pmlmeext = &adapter->mlmeextpriv;3336pmlmeinfo = &pmlmeext->mlmext_info;3337pwrctl = adapter_to_pwrctl(adapter);33383339pmlmeext = &adapter->mlmeextpriv;3340pmlmeinfo = &pmlmeext->mlmext_info;33413342switch (action) {3343case NETDEV_UP:3344#ifdef CONFIG_WOWLAN3345pwrctl->wowlan_ns_offload_en = _TRUE;3346#endif3347_rtw_memcpy(pmlmeinfo->ip6_addr, &inet6_ifa->addr,3348RTW_IPv6_ADDR_LEN);3349RTW_DBG("%s: up IPv6 addrs: %pI6\n", __func__,3350pmlmeinfo->ip6_addr);3351break;3352case NETDEV_DOWN:3353#ifdef CONFIG_WOWLAN3354pwrctl->wowlan_ns_offload_en = _FALSE;3355#endif3356_rtw_memset(pmlmeinfo->ip6_addr, 0, RTW_IPv6_ADDR_LEN);3357RTW_DBG("%s: down IPv6 addrs: %pI6\n", __func__,3358pmlmeinfo->ip6_addr);3359break;3360default:3361RTW_DBG("%s: default action\n", __func__);3362break;3363}3364return NOTIFY_DONE;3365}3366#endif33673368static struct notifier_block rtw_inetaddr_notifier = {3369.notifier_call = rtw_inetaddr_notifier_call3370};33713372#ifdef CONFIG_IPV63373static struct notifier_block rtw_inet6addr_notifier = {3374.notifier_call = rtw_inet6addr_notifier_call3375};3376#endif33773378void rtw_inetaddr_notifier_register(void)3379{3380RTW_INFO("%s\n", __func__);3381register_inetaddr_notifier(&rtw_inetaddr_notifier);3382#ifdef CONFIG_IPV63383register_inet6addr_notifier(&rtw_inet6addr_notifier);3384#endif3385}33863387void rtw_inetaddr_notifier_unregister(void)3388{3389RTW_INFO("%s\n", __func__);3390unregister_inetaddr_notifier(&rtw_inetaddr_notifier);3391#ifdef CONFIG_IPV63392unregister_inet6addr_notifier(&rtw_inet6addr_notifier);3393#endif3394}33953396int rtw_os_ndevs_register(struct dvobj_priv *dvobj)3397{3398int i, status = _SUCCESS;3399struct registry_priv *regsty = dvobj_to_regsty(dvobj);3400_adapter *adapter;34013402#if defined(CONFIG_IOCTL_CFG80211)3403if (rtw_cfg80211_dev_res_register(dvobj) != _SUCCESS) {3404rtw_warn_on(1);3405status = _FAIL;3406goto exit;3407}3408#endif34093410for (i = 0; i < dvobj->iface_nums; i++) {34113412if (i >= CONFIG_IFACE_NUMBER) {3413RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);3414rtw_warn_on(1);3415continue;3416}34173418adapter = dvobj->padapters[i];3419if (adapter) {3420char *name;34213422#ifdef CONFIG_RTW_DYNAMIC_NDEV3423if (!is_primary_adapter(adapter))3424continue;3425#endif34263427if (adapter->iface_id == IFACE_ID0)3428name = regsty->ifname;3429else if (adapter->iface_id == IFACE_ID1)3430name = regsty->if2name;3431else3432name = "wlan%d";34333434status = rtw_os_ndev_register(adapter, name);34353436if (status != _SUCCESS) {3437rtw_warn_on(1);3438break;3439}3440}3441}34423443if (status != _SUCCESS) {3444for (; i >= 0; i--) {3445adapter = dvobj->padapters[i];3446if (adapter)3447rtw_os_ndev_unregister(adapter);3448}3449}34503451#if defined(CONFIG_IOCTL_CFG80211)3452if (status != _SUCCESS)3453rtw_cfg80211_dev_res_unregister(dvobj);3454#endif3455exit:3456return status;3457}34583459void rtw_os_ndevs_unregister(struct dvobj_priv *dvobj)3460{3461int i;3462_adapter *adapter = NULL;34633464for (i = 0; i < dvobj->iface_nums; i++) {3465adapter = dvobj->padapters[i];34663467if (adapter == NULL)3468continue;34693470rtw_os_ndev_unregister(adapter);3471}34723473#if defined(CONFIG_IOCTL_CFG80211)3474rtw_cfg80211_dev_res_unregister(dvobj);3475#endif3476}34773478/**3479* rtw_os_ndevs_init - Allocate and register OS layer net devices and relating structures for @dvobj3480* @dvobj: the dvobj on which this function applies3481*3482* Returns:3483* _SUCCESS or _FAIL3484*/3485int rtw_os_ndevs_init(struct dvobj_priv *dvobj)3486{3487int ret = _FAIL;34883489if (rtw_os_ndevs_alloc(dvobj) != _SUCCESS)3490goto exit;34913492if (rtw_os_ndevs_register(dvobj) != _SUCCESS)3493goto os_ndevs_free;34943495ret = _SUCCESS;34963497os_ndevs_free:3498if (ret != _SUCCESS)3499rtw_os_ndevs_free(dvobj);3500exit:3501return ret;3502}35033504/**3505* rtw_os_ndevs_deinit - Unregister and free OS layer net devices and relating structures for @dvobj3506* @dvobj: the dvobj on which this function applies3507*/3508void rtw_os_ndevs_deinit(struct dvobj_priv *dvobj)3509{3510rtw_os_ndevs_unregister(dvobj);3511rtw_os_ndevs_free(dvobj);3512}35133514#ifdef CONFIG_BR_EXT3515void netdev_br_init(struct net_device *netdev)3516{3517_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);35183519#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))3520rcu_read_lock();3521#endif35223523/* if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) */3524{3525/* struct net_bridge *br = netdev->br_port->br; */ /* ->dev->dev_addr; */3526#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))3527if (netdev->br_port)3528#else3529if (rcu_dereference(adapter->pnetdev->rx_handler_data))3530#endif3531{3532struct net_device *br_netdev;35333534br_netdev = rtw_get_bridge_ndev_by_name(CONFIG_BR_EXT_BRNAME);3535if (br_netdev) {3536memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);3537dev_put(br_netdev);3538RTW_INFO(FUNC_NDEV_FMT" bind bridge dev "NDEV_FMT"("MAC_FMT")\n"3539, FUNC_NDEV_ARG(netdev), NDEV_ARG(br_netdev), MAC_ARG(br_netdev->dev_addr));3540} else {3541RTW_INFO(FUNC_NDEV_FMT" can't get bridge dev by name \"%s\"\n"3542, FUNC_NDEV_ARG(netdev), CONFIG_BR_EXT_BRNAME);3543}3544}35453546adapter->ethBrExtInfo.addPPPoETag = 1;3547}35483549#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))3550rcu_read_unlock();3551#endif3552}3553#endif /* CONFIG_BR_EXT */35543555#ifdef CONFIG_NEW_NETDEV_HDL3556int _netdev_open(struct net_device *pnetdev)3557{3558uint status;3559_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);3560struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);35613562RTW_INFO(FUNC_NDEV_FMT" start\n", FUNC_NDEV_ARG(pnetdev));35633564#ifdef CONFIG_AUTOSUSPEND3565if (pwrctrlpriv->ps_flag == _TRUE) {3566padapter->net_closed = _FALSE;3567goto netdev_open_normal_process;3568}3569#endif /*CONFIG_AUTOSUSPEND*/35703571if (!rtw_is_hw_init_completed(padapter)) { // ips3572rtw_clr_surprise_removed(padapter);3573rtw_clr_drv_stopped(padapter);3574RTW_ENABLE_FUNC(padapter, DF_RX_BIT);3575RTW_ENABLE_FUNC(padapter, DF_TX_BIT);3576status = rtw_hal_init(padapter);3577if (status == _FAIL)3578goto netdev_open_error;3579rtw_led_control(padapter, LED_CTL_NO_LINK);3580#ifndef RTW_HALMAC3581status = rtw_mi_start_drv_threads(padapter);3582if (status == _FAIL) {3583RTW_ERR(FUNC_NDEV_FMT "Initialize driver thread failed!\n", FUNC_NDEV_ARG(pnetdev));3584goto netdev_open_error;3585}35863587rtw_intf_start(GET_PRIMARY_ADAPTER(padapter));3588#endif /* !RTW_HALMAC */35893590{3591#ifdef CONFIG_BT_COEXIST_SOCKET_TRX3592_adapter *prim_adpt = GET_PRIMARY_ADAPTER(padapter);35933594if (prim_adpt && (_TRUE == prim_adpt->EEPROMBluetoothCoexist)) {3595rtw_btcoex_init_socket(prim_adpt);3596prim_adpt->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04;3597rtw_btcoex_SetHciVersion(prim_adpt, 0x04);3598}3599#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */36003601_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);36023603#ifndef CONFIG_IPS_CHECK_IN_WD3604rtw_set_pwr_state_check_timer(pwrctrlpriv);3605#endif /*CONFIG_IPS_CHECK_IN_WD*/3606}36073608}36093610/*if (padapter->bup == _FALSE) */3611{3612rtw_hal_iface_init(padapter);36133614#ifdef CONFIG_RTW_NAPI3615if(padapter->napi_state == NAPI_DISABLE) {3616napi_enable(&padapter->napi);3617padapter->napi_state = NAPI_ENABLE;3618}3619#endif36203621#ifdef CONFIG_IOCTL_CFG802113622rtw_cfg80211_init_wiphy(padapter);3623rtw_cfg80211_init_wdev_data(padapter);3624#endif3625rtw_netif_carrier_on(pnetdev); /* call this func when rtw_joinbss_event_callback return success */3626rtw_netif_wake_queue(pnetdev);36273628#ifdef CONFIG_BR_EXT3629if (is_primary_adapter(padapter))3630netdev_br_init(pnetdev);3631#endif /* CONFIG_BR_EXT */363236333634padapter->bup = _TRUE;3635padapter->net_closed = _FALSE;3636padapter->netif_up = _TRUE;3637pwrctrlpriv->bips_processing = _FALSE;3638}36393640#ifdef CONFIG_AUTOSUSPEND3641netdev_open_normal_process:3642#endif3643RTW_INFO(FUNC_NDEV_FMT" Success (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);3644return 0;36453646netdev_open_error:3647padapter->bup = _FALSE;36483649#ifdef CONFIG_RTW_NAPI3650if(padapter->napi_state == NAPI_ENABLE) {3651napi_disable(&padapter->napi);3652padapter->napi_state = NAPI_DISABLE;3653}3654#endif36553656rtw_netif_carrier_off(pnetdev);3657rtw_netif_stop_queue(pnetdev);36583659RTW_ERR(FUNC_NDEV_FMT" Failed!! (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);36603661return -1;36623663}36643665#else3666int _netdev_open(struct net_device *pnetdev)3667{3668uint status;3669_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);3670struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);3671#ifdef CONFIG_BT_COEXIST_SOCKET_TRX3672HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);3673#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */367436753676RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);36773678padapter->netif_up = _TRUE;36793680#ifdef CONFIG_PLATFORM_INTEL_BYT3681rtw_sdio_set_power(1);3682#endif /* CONFIG_PLATFORM_INTEL_BYT */36833684#ifdef CONFIG_AUTOSUSPEND3685if (pwrctrlpriv->ps_flag == _TRUE) {3686padapter->net_closed = _FALSE;3687goto netdev_open_normal_process;3688}3689#endif36903691if (padapter->bup == _FALSE) {3692#ifdef CONFIG_PLATFORM_INTEL_BYT3693rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter));3694#ifdef CONFIG_MI_WITH_MBSSID_CAM3695rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));3696#endif3697rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));3698_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);3699#endif /* CONFIG_PLATFORM_INTEL_BYT */37003701rtw_clr_surprise_removed(padapter);3702rtw_clr_drv_stopped(padapter);37033704status = rtw_hal_init(padapter);3705if (status == _FAIL) {3706goto netdev_open_error;3707}3708#if 0/*#ifdef CONFIG_MI_WITH_MBSSID_CAM*/3709rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, adapter_mac_addr(padapter)); /* set mac addr to mac register */3710#endif37113712RTW_INFO("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));37133714#ifndef RTW_HALMAC3715status = rtw_start_drv_threads(padapter);3716if (status == _FAIL) {3717RTW_INFO("Initialize driver software resource Failed!\n");3718goto netdev_open_error;3719}3720#endif /* !RTW_HALMAC */37213722#ifdef CONFIG_RTW_NAPI3723if(padapter->napi_state == NAPI_DISABLE) {3724napi_enable(&padapter->napi);3725padapter->napi_state = NAPI_ENABLE;3726}3727#endif37283729#ifndef RTW_HALMAC3730rtw_intf_start(padapter);3731#endif /* !RTW_HALMAC */37323733#ifdef CONFIG_IOCTL_CFG802113734rtw_cfg80211_init_wiphy(padapter);3735rtw_cfg80211_init_wdev_data(padapter);3736#endif37373738rtw_led_control(padapter, LED_CTL_NO_LINK);37393740padapter->bup = _TRUE;3741pwrctrlpriv->bips_processing = _FALSE;37423743#ifdef CONFIG_PLATFORM_INTEL_BYT3744#ifdef CONFIG_BT_COEXIST3745rtw_btcoex_IpsNotify(padapter, IPS_NONE);3746#endif /* CONFIG_BT_COEXIST */3747#endif /* CONFIG_PLATFORM_INTEL_BYT */3748}3749padapter->net_closed = _FALSE;37503751_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);37523753#ifndef CONFIG_IPS_CHECK_IN_WD3754rtw_set_pwr_state_check_timer(pwrctrlpriv);3755#endif37563757rtw_netif_carrier_on(pnetdev); /* call this func when rtw_joinbss_event_callback return success */3758rtw_netif_wake_queue(pnetdev);37593760#ifdef CONFIG_BR_EXT3761netdev_br_init(pnetdev);3762#endif /* CONFIG_BR_EXT */37633764#ifdef CONFIG_BT_COEXIST_SOCKET_TRX3765if (is_primary_adapter(padapter) && (_TRUE == pHalData->EEPROMBluetoothCoexist)) {3766rtw_btcoex_init_socket(padapter);3767padapter->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04;3768rtw_btcoex_SetHciVersion(padapter, 0x04);3769} else3770RTW_INFO("CONFIG_BT_COEXIST: VIRTUAL_ADAPTER\n");3771#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */37723773#ifdef CONFIG_AUTOSUSPEND3774netdev_open_normal_process:3775#endif37763777#ifdef CONFIG_CONCURRENT_MODE3778{3779_adapter *sec_adapter = adapter_to_dvobj(padapter)->padapters[IFACE_ID1];37803781#ifndef CONFIG_RTW_DYNAMIC_NDEV3782if (sec_adapter && (sec_adapter->bup == _FALSE))3783_netdev_vir_if_open(sec_adapter->pnetdev);3784#endif3785}3786#endif37873788#ifdef CONFIG_RTW_CFGVEDNOR_LLSTATS3789pwrctrlpriv->radio_on_start_time = rtw_get_current_time();3790pwrctrlpriv->pwr_saving_start_time = rtw_get_current_time();3791pwrctrlpriv->pwr_saving_time = 0;3792pwrctrlpriv->on_time = 0;3793pwrctrlpriv->tx_time = 0;3794pwrctrlpriv->rx_time = 0;3795#endif /* CONFIG_RTW_CFGVEDNOR_LLSTATS */37963797RTW_INFO("-871x_drv - drv_open, bup=%d\n", padapter->bup);37983799return 0;38003801netdev_open_error:38023803padapter->bup = _FALSE;38043805#ifdef CONFIG_RTW_NAPI3806if(padapter->napi_state == NAPI_ENABLE) {3807napi_disable(&padapter->napi);3808padapter->napi_state = NAPI_DISABLE;3809}3810#endif38113812rtw_netif_carrier_off(pnetdev);3813rtw_netif_stop_queue(pnetdev);38143815RTW_INFO("-871x_drv - drv_open fail, bup=%d\n", padapter->bup);38163817return -1;38183819}3820#endif3821int netdev_open(struct net_device *pnetdev)3822{3823int ret = _FALSE;3824_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);3825struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);38263827if (pwrctrlpriv->bInSuspend == _TRUE) {3828RTW_INFO(" [WARN] "ADPT_FMT" %s failed, bInSuspend=%d\n", ADPT_ARG(padapter), __func__, pwrctrlpriv->bInSuspend);3829return 0;3830}38313832_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);3833#ifdef CONFIG_NEW_NETDEV_HDL3834ret = _netdev_open(pnetdev);3835#else3836if (is_primary_adapter(padapter))3837ret = _netdev_open(pnetdev);3838#ifdef CONFIG_CONCURRENT_MODE3839else3840ret = _netdev_vir_if_open(pnetdev);3841#endif3842#endif3843_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);384438453846#ifdef CONFIG_AUTO_AP_MODE3847if (padapter->iface_id == IFACE_ID2)3848rtw_start_auto_ap(padapter);3849#endif38503851return ret;3852}38533854#ifdef CONFIG_IPS3855int ips_netdrv_open(_adapter *padapter)3856{3857int status = _SUCCESS;3858/* struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); */38593860padapter->net_closed = _FALSE;38613862RTW_INFO("===> %s.........\n", __FUNCTION__);386338643865rtw_clr_drv_stopped(padapter);3866/* padapter->bup = _TRUE; */3867#ifdef CONFIG_NEW_NETDEV_HDL3868if (!rtw_is_hw_init_completed(padapter)) {3869status = rtw_hal_init(padapter);3870if (status == _FAIL) {3871goto netdev_open_error;3872}3873rtw_mi_hal_iface_init(padapter);3874}3875#else3876status = rtw_hal_init(padapter);3877if (status == _FAIL) {3878goto netdev_open_error;3879}3880#endif3881#if 03882rtw_mi_set_mac_addr(padapter);3883#endif3884#ifndef RTW_HALMAC3885rtw_intf_start(padapter);3886#endif /* !RTW_HALMAC */38873888#ifndef CONFIG_IPS_CHECK_IN_WD3889rtw_set_pwr_state_check_timer(adapter_to_pwrctl(padapter));3890#endif3891_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);38923893return _SUCCESS;38943895netdev_open_error:3896/* padapter->bup = _FALSE; */3897RTW_INFO("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup);38983899return _FAIL;3900}39013902int rtw_ips_pwr_up(_adapter *padapter)3903{3904int result;3905#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)3906#ifdef DBG_CONFIG_ERROR_DETECT3907PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);3908struct sreset_priv *psrtpriv = &pHalData->srestpriv;3909#endif/* #ifdef DBG_CONFIG_ERROR_DETECT */3910#endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */3911systime start_time = rtw_get_current_time();3912RTW_INFO("===> rtw_ips_pwr_up..............\n");39133914#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)3915#ifdef DBG_CONFIG_ERROR_DETECT3916if (psrtpriv->silent_reset_inprogress == _TRUE)3917#endif/* #ifdef DBG_CONFIG_ERROR_DETECT */3918#endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */3919rtw_reset_drv_sw(padapter);39203921result = ips_netdrv_open(padapter);39223923rtw_led_control(padapter, LED_CTL_NO_LINK);39243925RTW_INFO("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time));3926return result;39273928}39293930void rtw_ips_pwr_down(_adapter *padapter)3931{3932systime start_time = rtw_get_current_time();3933RTW_INFO("===> rtw_ips_pwr_down...................\n");39343935padapter->net_closed = _TRUE;39363937rtw_ips_dev_unload(padapter);3938RTW_INFO("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));3939}3940#endif3941void rtw_ips_dev_unload(_adapter *padapter)3942{3943#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)3944#ifdef DBG_CONFIG_ERROR_DETECT3945PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);3946struct sreset_priv *psrtpriv = &pHalData->srestpriv;3947#endif/* #ifdef DBG_CONFIG_ERROR_DETECT */3948#endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */3949RTW_INFO("====> %s...\n", __FUNCTION__);395039513952#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)3953#ifdef DBG_CONFIG_ERROR_DETECT3954if (psrtpriv->silent_reset_inprogress == _TRUE)3955#endif /* #ifdef DBG_CONFIG_ERROR_DETECT */3956#endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */3957{3958rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);3959rtw_intf_stop(padapter);3960}39613962if (!rtw_is_surprise_removed(padapter))3963rtw_hal_deinit(padapter);39643965}3966#ifdef CONFIG_NEW_NETDEV_HDL3967int _pm_netdev_open(_adapter *padapter)3968{3969uint status;3970struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);3971struct net_device *pnetdev = padapter->pnetdev;39723973RTW_INFO(FUNC_NDEV_FMT" start\n", FUNC_NDEV_ARG(pnetdev));39743975#ifdef CONFIG_AUTOSUSPEND3976if (pwrctrlpriv->ps_flag == _TRUE) {3977padapter->net_closed = _FALSE;3978goto netdev_open_normal_process;3979}3980#endif /*CONFIG_AUTOSUSPEND*/39813982if (!rtw_is_hw_init_completed(padapter)) { // ips3983rtw_clr_surprise_removed(padapter);3984rtw_clr_drv_stopped(padapter);3985status = rtw_hal_init(padapter);3986if (status == _FAIL)3987goto netdev_open_error;3988rtw_led_control(padapter, LED_CTL_NO_LINK);3989#ifndef RTW_HALMAC3990status = rtw_mi_start_drv_threads(padapter);3991if (status == _FAIL) {3992RTW_ERR(FUNC_NDEV_FMT "Initialize driver thread failed!\n", FUNC_NDEV_ARG(pnetdev));3993goto netdev_open_error;3994}39953996rtw_intf_start(GET_PRIMARY_ADAPTER(padapter));3997#endif /* !RTW_HALMAC */39983999{4000_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);40014002#ifndef CONFIG_IPS_CHECK_IN_WD4003rtw_set_pwr_state_check_timer(pwrctrlpriv);4004#endif /*CONFIG_IPS_CHECK_IN_WD*/4005}40064007}40084009/*if (padapter->bup == _FALSE) */4010{4011rtw_hal_iface_init(padapter);40124013padapter->bup = _TRUE;4014padapter->net_closed = _FALSE;4015padapter->netif_up = _TRUE;4016pwrctrlpriv->bips_processing = _FALSE;4017}40184019#ifdef CONFIG_AUTOSUSPEND4020netdev_open_normal_process:4021#endif4022RTW_INFO(FUNC_NDEV_FMT" Success (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);4023return 0;40244025netdev_open_error:4026padapter->bup = _FALSE;40274028rtw_netif_carrier_off(pnetdev);4029rtw_netif_stop_queue(pnetdev);40304031RTW_ERR(FUNC_NDEV_FMT" Failed!! (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);40324033return -1;40344035}4036int _mi_pm_netdev_open(struct net_device *pnetdev)4037{4038int i;4039int status = 0;4040_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);4041_adapter *iface;4042struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);40434044for (i = 0; i < dvobj->iface_nums; i++) {4045iface = dvobj->padapters[i];4046if (iface->netif_up) {4047status = _pm_netdev_open(iface);4048if (status == -1) {4049RTW_ERR("%s failled\n", __func__);4050break;4051}4052}4053}40544055return status;4056}4057#endif /*CONFIG_NEW_NETDEV_HDL*/4058int pm_netdev_open(struct net_device *pnetdev, u8 bnormal)4059{4060int status = 0;40614062_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);40634064if (_TRUE == bnormal) {4065_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);4066#ifdef CONFIG_NEW_NETDEV_HDL4067status = _mi_pm_netdev_open(pnetdev);4068#else4069status = _netdev_open(pnetdev);4070#endif4071_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);4072}4073#ifdef CONFIG_IPS4074else4075status = (_SUCCESS == ips_netdrv_open(padapter)) ? (0) : (-1);4076#endif40774078return status;4079}4080#ifdef CONFIG_CLIENT_PORT_CFG4081extern void rtw_hw_client_port_release(_adapter *adapter);4082#endif4083static int netdev_close(struct net_device *pnetdev)4084{4085_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);4086struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);4087struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4088#ifdef CONFIG_BT_COEXIST_SOCKET_TRX4089HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);4090#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */40914092RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);4093#ifndef CONFIG_PLATFORM_INTEL_BYT4094#ifdef CONFIG_AUTOSUSPEND4095if (pwrctl->bInternalAutoSuspend == _TRUE) {4096/* rtw_pwr_wakeup(padapter); */4097if (pwrctl->rf_pwrstate == rf_off)4098pwrctl->ps_flag = _TRUE;4099}4100#endif4101padapter->net_closed = _TRUE;4102padapter->netif_up = _FALSE;4103pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;41044105#ifdef CONFIG_CLIENT_PORT_CFG4106if (MLME_IS_STA(padapter))4107rtw_hw_client_port_release(padapter);4108#endif4109/* if (!rtw_is_hw_init_completed(padapter)) {4110RTW_INFO("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%s\n", padapter->bup, rtw_is_hw_init_completed(padapter)?"_TRUE":"_FALSE");41114112rtw_set_drv_stopped(padapter);41134114rtw_dev_unload(padapter);4115}4116else*/4117if (pwrctl->rf_pwrstate == rf_on) {4118RTW_INFO("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%s\n", padapter->bup, rtw_is_hw_init_completed(padapter) ? "_TRUE" : "_FALSE");41194120/* s1. */4121if (pnetdev)4122rtw_netif_stop_queue(pnetdev);41234124#ifndef CONFIG_ANDROID4125/* s2. */4126LeaveAllPowerSaveMode(padapter);4127rtw_disassoc_cmd(padapter, 500, RTW_CMDF_WAIT_ACK);4128/* s2-2. indicate disconnect to os */4129rtw_indicate_disconnect(padapter, 0, _FALSE);4130/* s2-3. */4131rtw_free_assoc_resources_cmd(padapter, _TRUE, RTW_CMDF_WAIT_ACK);4132/* s2-4. */4133rtw_free_network_queue(padapter, _TRUE);4134#endif4135}41364137#ifdef CONFIG_BR_EXT4138/* if (OPMODE & (WIFI_STATION_STATE | WIFI_ADHOC_STATE)) */4139{4140/* void nat25_db_cleanup(_adapter *priv); */4141nat25_db_cleanup(padapter);4142}4143#endif /* CONFIG_BR_EXT */41444145#ifdef CONFIG_P2P4146if (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))4147rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);4148#endif /* CONFIG_P2P */41494150rtw_scan_abort(padapter); /* stop scanning process before wifi is going to down */4151#ifdef CONFIG_IOCTL_CFG802114152rtw_cfg80211_wait_scan_req_empty(padapter, 200);4153adapter_wdev_data(padapter)->bandroid_scan = _FALSE;4154/* padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; */ /* set this at the end */4155#endif /* CONFIG_IOCTL_CFG80211 */41564157#ifdef CONFIG_WAPI_SUPPORT4158rtw_wapi_disable_tx(padapter);4159#endif4160#ifdef CONFIG_BT_COEXIST_SOCKET_TRX4161if (is_primary_adapter(padapter) && (_TRUE == pHalData->EEPROMBluetoothCoexist))4162rtw_btcoex_close_socket(padapter);4163else4164RTW_INFO("CONFIG_BT_COEXIST: VIRTUAL_ADAPTER\n");4165#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */4166#else /* !CONFIG_PLATFORM_INTEL_BYT */41674168if (pwrctl->bInSuspend == _TRUE) {4169RTW_INFO("+871x_drv - drv_close, bInSuspend=%d\n", pwrctl->bInSuspend);4170return 0;4171}41724173rtw_scan_abort(padapter); /* stop scanning process before wifi is going to down */4174#ifdef CONFIG_IOCTL_CFG802114175rtw_cfg80211_wait_scan_req_empty(padapter, 200);4176#endif41774178RTW_INFO("netdev_close, bips_processing=%d\n", pwrctl->bips_processing);4179while (pwrctl->bips_processing == _TRUE) /* waiting for ips_processing done before call rtw_dev_unload() */4180rtw_msleep_os(1);41814182rtw_dev_unload(padapter);4183rtw_sdio_set_power(0);41844185#endif /* !CONFIG_PLATFORM_INTEL_BYT */41864187RTW_INFO("-871x_drv - drv_close, bup=%d\n", padapter->bup);41884189return 0;41904191}41924193int pm_netdev_close(struct net_device *pnetdev, u8 bnormal)4194{4195int status = 0;41964197status = netdev_close(pnetdev);41984199return status;4200}42014202void rtw_ndev_destructor(struct net_device *ndev)4203{4204RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));42054206#ifdef CONFIG_IOCTL_CFG802114207if (ndev->ieee80211_ptr)4208rtw_mfree((u8 *)ndev->ieee80211_ptr, sizeof(struct wireless_dev));4209#endif4210free_netdev(ndev);4211}42124213#ifdef CONFIG_ARP_KEEP_ALIVE4214struct route_info {4215struct in_addr dst_addr;4216struct in_addr src_addr;4217struct in_addr gateway;4218unsigned int dev_index;4219};42204221static void parse_routes(struct nlmsghdr *nl_hdr, struct route_info *rt_info)4222{4223struct rtmsg *rt_msg;4224struct rtattr *rt_attr;4225int rt_len;42264227rt_msg = (struct rtmsg *) NLMSG_DATA(nl_hdr);4228if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN))4229return;42304231rt_attr = (struct rtattr *) RTM_RTA(rt_msg);4232rt_len = RTM_PAYLOAD(nl_hdr);42334234for (; RTA_OK(rt_attr, rt_len); rt_attr = RTA_NEXT(rt_attr, rt_len)) {4235switch (rt_attr->rta_type) {4236case RTA_OIF:4237rt_info->dev_index = *(int *) RTA_DATA(rt_attr);4238break;4239case RTA_GATEWAY:4240rt_info->gateway.s_addr = *(u_int *) RTA_DATA(rt_attr);4241break;4242case RTA_PREFSRC:4243rt_info->src_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);4244break;4245case RTA_DST:4246rt_info->dst_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);4247break;4248}4249}4250}42514252static int route_dump(u32 *gw_addr , int *gw_index)4253{4254int err = 0;4255struct socket *sock;4256struct {4257struct nlmsghdr nlh;4258struct rtgenmsg g;4259} req;4260struct msghdr msg;4261struct iovec iov;4262struct sockaddr_nl nladdr;4263#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4264mm_segment_t oldfs;4265#endif4266char *pg;4267int size = 0;42684269err = sock_create(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE, &sock);4270if (err) {4271printk(": Could not create a datagram socket, error = %d\n", -ENXIO);4272return err;4273}42744275memset(&nladdr, 0, sizeof(nladdr));4276nladdr.nl_family = AF_NETLINK;42774278req.nlh.nlmsg_len = sizeof(req);4279req.nlh.nlmsg_type = RTM_GETROUTE;4280req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;4281req.nlh.nlmsg_pid = 0;4282req.g.rtgen_family = AF_INET;42834284iov.iov_base = &req;4285iov.iov_len = sizeof(req);42864287msg.msg_name = &nladdr;4288msg.msg_namelen = sizeof(nladdr);4289#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))4290/* referece:sock_xmit in kernel code4291* WRITE for sock_sendmsg, READ for sock_recvmsg4292* third parameter for msg_iovlen4293* last parameter for iov_len4294*/4295iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));4296#else4297msg.msg_iov = &iov;4298msg.msg_iovlen = 1;4299#endif4300msg.msg_control = NULL;4301msg.msg_controllen = 0;4302msg.msg_flags = MSG_DONTWAIT;43034304#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4305oldfs = get_fs();4306set_fs(KERNEL_DS);4307#endif4308#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))4309err = sock_sendmsg(sock, &msg);4310#else4311err = sock_sendmsg(sock, &msg, sizeof(req));4312#endif4313#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4314set_fs(oldfs);4315#endif43164317if (err < 0)4318goto out_sock;43194320pg = (char *) __get_free_page(GFP_KERNEL);4321if (pg == NULL) {4322err = -ENOMEM;4323goto out_sock;4324}43254326#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)4327restart:4328#endif43294330for (;;) {4331struct nlmsghdr *h;43324333iov.iov_base = pg;4334iov.iov_len = PAGE_SIZE;43354336#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))4337iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE);4338#endif43394340#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4341oldfs = get_fs();4342set_fs(KERNEL_DS);4343#endif4344#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))4345err = sock_recvmsg(sock, &msg, MSG_DONTWAIT);4346#else4347err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);4348#endif4349#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4350set_fs(oldfs);4351#endif43524353if (err < 0)4354goto out_sock_pg;43554356if (msg.msg_flags & MSG_TRUNC) {4357err = -ENOBUFS;4358goto out_sock_pg;4359}43604361h = (struct nlmsghdr *) pg;43624363while (NLMSG_OK(h, err)) {4364struct route_info rt_info;4365if (h->nlmsg_type == NLMSG_DONE) {4366err = 0;4367goto done;4368}43694370if (h->nlmsg_type == NLMSG_ERROR) {4371struct nlmsgerr *errm = (struct nlmsgerr *) NLMSG_DATA(h);4372err = errm->error;4373printk("NLMSG error: %d\n", errm->error);4374goto done;4375}43764377if (h->nlmsg_type == RTM_GETROUTE)4378printk("RTM_GETROUTE: NLMSG: %d\n", h->nlmsg_type);4379if (h->nlmsg_type != RTM_NEWROUTE) {4380printk("NLMSG: %d\n", h->nlmsg_type);4381err = -EINVAL;4382goto done;4383}43844385memset(&rt_info, 0, sizeof(struct route_info));4386parse_routes(h, &rt_info);4387if (!rt_info.dst_addr.s_addr && rt_info.gateway.s_addr && rt_info.dev_index) {4388*gw_addr = rt_info.gateway.s_addr;4389*gw_index = rt_info.dev_index;43904391}4392h = NLMSG_NEXT(h, err);4393}43944395if (err) {4396printk("!!!Remnant of size %d %d %d\n", err, h->nlmsg_len, h->nlmsg_type);4397err = -EINVAL;4398break;4399}4400}44014402done:4403#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)4404if (!err && req.g.rtgen_family == AF_INET) {4405req.g.rtgen_family = AF_INET6;44064407iov.iov_base = &req;4408iov.iov_len = sizeof(req);44094410msg.msg_name = &nladdr;4411msg.msg_namelen = sizeof(nladdr);4412#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))4413iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));4414#else4415msg.msg_iov = &iov;4416msg.msg_iovlen = 1;4417#endif4418msg.msg_control = NULL;4419msg.msg_controllen = 0;4420msg.msg_flags = MSG_DONTWAIT;44214422#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4423oldfs = get_fs();4424set_fs(KERNEL_DS);4425#endif4426#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))4427err = sock_sendmsg(sock, &msg);4428#else4429err = sock_sendmsg(sock, &msg, sizeof(req));4430#endif4431#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))4432set_fs(oldfs);4433#endif44344435if (err > 0)4436goto restart;4437}4438#endif44394440out_sock_pg:4441free_page((unsigned long) pg);44424443out_sock:4444sock_release(sock);4445return err;4446}44474448static int arp_query(unsigned char *haddr, u32 paddr,4449struct net_device *dev)4450{4451struct neighbour *neighbor_entry;4452int ret = 0;44534454neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);44554456if (neighbor_entry != NULL) {4457neighbor_entry->used = jiffies;4458if (neighbor_entry->nud_state & NUD_VALID) {4459_rtw_memcpy(haddr, neighbor_entry->ha, dev->addr_len);4460ret = 1;4461}4462neigh_release(neighbor_entry);4463}4464return ret;4465}44664467static int get_defaultgw(u32 *ip_addr , char mac[])4468{4469int gw_index = 0; /* oif device index */4470struct net_device *gw_dev = NULL; /* oif device */44714472route_dump(ip_addr, &gw_index);44734474if (!(*ip_addr) || !gw_index) {4475/* RTW_INFO("No default GW\n"); */4476return -1;4477}44784479gw_dev = dev_get_by_index(&init_net, gw_index);44804481if (gw_dev == NULL) {4482/* RTW_INFO("get Oif Device Fail\n"); */4483return -1;4484}44854486if (!arp_query(mac, *ip_addr, gw_dev)) {4487/* RTW_INFO( "arp query failed\n"); */4488dev_put(gw_dev);4489return -1;44904491}4492dev_put(gw_dev);44934494return 0;4495}44964497int rtw_gw_addr_query(_adapter *padapter)4498{4499struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4500struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);4501u32 gw_addr = 0; /* default gw address */4502unsigned char gw_mac[32] = {0}; /* default gw mac */4503int i;4504int res;45054506res = get_defaultgw(&gw_addr, gw_mac);4507if (!res) {4508pmlmepriv->gw_ip[0] = gw_addr & 0xff;4509pmlmepriv->gw_ip[1] = (gw_addr & 0xff00) >> 8;4510pmlmepriv->gw_ip[2] = (gw_addr & 0xff0000) >> 16;4511pmlmepriv->gw_ip[3] = (gw_addr & 0xff000000) >> 24;4512_rtw_memcpy(pmlmepriv->gw_mac_addr, gw_mac, ETH_ALEN);4513RTW_INFO("%s Gateway Mac:\t" MAC_FMT "\n", __FUNCTION__, MAC_ARG(pmlmepriv->gw_mac_addr));4514RTW_INFO("%s Gateway IP:\t" IP_FMT "\n", __FUNCTION__, IP_ARG(pmlmepriv->gw_ip));4515} else4516RTW_INFO("Get Gateway IP/MAC fail!\n");45174518return res;4519}4520#endif45214522void rtw_dev_unload(PADAPTER padapter)4523{4524struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);4525struct dvobj_priv *pobjpriv = padapter->dvobj;4526struct debug_priv *pdbgpriv = &pobjpriv->drv_dbg;4527struct cmd_priv *pcmdpriv = &padapter->cmdpriv;45284529if (padapter->bup == _TRUE) {4530RTW_INFO("==> "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));45314532#ifdef CONFIG_WOWLAN4533#ifdef CONFIG_GPIO_WAKEUP4534/*default wake up pin change to BT*/4535RTW_INFO("%s:default wake up pin change to BT\n", __FUNCTION__);4536rtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _FALSE);4537#endif /* CONFIG_GPIO_WAKEUP */4538#endif /* CONFIG_WOWLAN */45394540rtw_set_drv_stopped(padapter);4541#ifdef CONFIG_XMIT_ACK4542if (padapter->xmitpriv.ack_tx)4543rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);4544#endif45454546rtw_intf_stop(padapter);45474548#ifdef CONFIG_AUTOSUSPEND4549if (!pwrctl->bInternalAutoSuspend)4550#endif4551{4552rtw_stop_drv_threads(padapter);45534554if (ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _TRUE) {4555RTW_ERR("cmd_thread not stop !!\n");4556rtw_warn_on(1);4557}4558}4559/* check the status of IPS */4560if (rtw_hal_check_ips_status(padapter) == _TRUE || pwrctl->rf_pwrstate == rf_off) { /* check HW status and SW state */4561RTW_PRINT("%s: driver in IPS-FWLPS\n", __func__);4562pdbgpriv->dbg_dev_unload_inIPS_cnt++;4563} else4564RTW_PRINT("%s: driver not in IPS\n", __func__);45654566if (!rtw_is_surprise_removed(padapter)) {4567#ifdef CONFIG_BT_COEXIST4568rtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);4569#endif4570#ifdef CONFIG_WOWLAN4571if (pwrctl->bSupportRemoteWakeup == _TRUE &&4572pwrctl->wowlan_mode == _TRUE)4573RTW_PRINT("%s bSupportRemoteWakeup==_TRUE do not run rtw_hal_deinit()\n", __FUNCTION__);4574else4575#endif4576{4577/* amy modify 20120221 for power seq is different between driver open and ips */4578rtw_hal_deinit(padapter);4579}4580rtw_set_surprise_removed(padapter);4581}45824583padapter->bup = _FALSE;45844585RTW_INFO("<== "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));4586} else {4587RTW_INFO("%s: bup==_FALSE\n", __FUNCTION__);4588}4589rtw_cancel_all_timer(padapter);4590}45914592int rtw_suspend_free_assoc_resource(_adapter *padapter)4593{4594struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4595#ifdef CONFIG_P2P4596struct wifidirect_info *pwdinfo = &padapter->wdinfo;4597#endif /* CONFIG_P2P */45984599RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));46004601if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {4602if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)4603&& check_fwstate(pmlmepriv, _FW_LINKED)4604#ifdef CONFIG_P2P4605&& (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)4606#if defined(CONFIG_IOCTL_CFG80211) && RTW_P2P_GROUP_INTERFACE4607|| rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)4608#endif4609)4610#endif /* CONFIG_P2P */4611) {4612RTW_INFO("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n", __FUNCTION__,4613pmlmepriv->cur_network.network.Ssid.Ssid,4614MAC_ARG(pmlmepriv->cur_network.network.MacAddress),4615pmlmepriv->cur_network.network.Ssid.SsidLength,4616pmlmepriv->assoc_ssid.SsidLength);4617rtw_set_to_roam(padapter, 1);4618}4619}46204621if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)) {4622rtw_disassoc_cmd(padapter, 0, RTW_CMDF_DIRECTLY);4623/* s2-2. indicate disconnect to os */4624rtw_indicate_disconnect(padapter, 0, _FALSE);4625}4626#ifdef CONFIG_AP_MODE4627else if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter))4628rtw_sta_flush(padapter, _TRUE);4629#endif46304631/* s2-3. */4632rtw_free_assoc_resources(padapter, _TRUE);46334634/* s2-4. */4635#ifdef CONFIG_AUTOSUSPEND4636if (is_primary_adapter(padapter) && (!adapter_to_pwrctl(padapter)->bInternalAutoSuspend))4637#endif4638rtw_free_network_queue(padapter, _TRUE);46394640if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {4641RTW_PRINT("%s: fw_under_survey\n", __func__);4642rtw_indicate_scan_done(padapter, 1);4643clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);4644}46454646if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {4647RTW_PRINT("%s: fw_under_linking\n", __FUNCTION__);4648rtw_indicate_disconnect(padapter, 0, _FALSE);4649}46504651RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));4652return _SUCCESS;4653}46544655#ifdef CONFIG_WOWLAN4656int rtw_suspend_wow(_adapter *padapter)4657{4658u8 ch, bw, offset;4659struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4660struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4661struct wowlan_ioctl_param poidparam;4662int ret = _SUCCESS;46634664RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));466546664667RTW_INFO("wowlan_mode: %d\n", pwrpriv->wowlan_mode);4668RTW_INFO("wowlan_pno_enable: %d\n", pwrpriv->wowlan_pno_enable);4669#ifdef CONFIG_P2P_WOWLAN4670RTW_INFO("wowlan_p2p_enable: %d\n", pwrpriv->wowlan_p2p_enable);4671#endif46724673if (pwrpriv->wowlan_mode == _TRUE) {4674rtw_mi_netif_stop_queue(padapter);4675#ifdef CONFIG_CONCURRENT_MODE4676rtw_mi_buddy_netif_carrier_off(padapter);4677#endif46784679/* 0. Power off LED */4680rtw_led_control(padapter, LED_CTL_POWER_OFF);46814682#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)4683/* 2.only for SDIO disable interrupt */4684rtw_intf_stop(padapter);46854686/* 2.1 clean interrupt */4687rtw_hal_clear_interrupt(padapter);4688#endif /* CONFIG_SDIO_HCI */46894690/* 1. stop thread */4691rtw_set_drv_stopped(padapter); /*for stop thread*/4692rtw_mi_stop_drv_threads(padapter);46934694rtw_clr_drv_stopped(padapter); /*for 32k command*/46954696/* #ifdef CONFIG_LPS */4697/* rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN"); */4698/* #endif */46994700#ifdef CONFIG_SDIO_HCI4701/* 2.2 free irq */4702#if !(CONFIG_RTW_SDIO_KEEP_IRQ)4703sdio_free_irq(adapter_to_dvobj(padapter));4704#endif4705#endif/*CONFIG_SDIO_HCI*/47064707#ifdef CONFIG_RUNTIME_PORT_SWITCH4708if (rtw_port_switch_chk(padapter)) {4709RTW_INFO(" ### PORT SWITCH ###\n");4710rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);4711}4712#endif47134714rtw_wow_lps_level_decide(padapter, _TRUE);4715poidparam.subcode = WOWLAN_ENABLE;4716rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);4717if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {4718if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)4719&& check_fwstate(pmlmepriv, _FW_LINKED)) {4720RTW_INFO("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n", __FUNCTION__,4721pmlmepriv->cur_network.network.Ssid.Ssid,4722MAC_ARG(pmlmepriv->cur_network.network.MacAddress),4723pmlmepriv->cur_network.network.Ssid.SsidLength,4724pmlmepriv->assoc_ssid.SsidLength);47254726rtw_set_to_roam(padapter, 0);4727}4728}47294730RTW_PRINT("%s: wowmode suspending\n", __func__);47314732if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {4733RTW_PRINT("%s: fw_under_survey\n", __func__);4734rtw_indicate_scan_done(padapter, 1);4735clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);4736}47374738#if 14739if (rtw_mi_check_status(padapter, MI_LINKED)) {4740ch = rtw_mi_get_union_chan(padapter);4741bw = rtw_mi_get_union_bw(padapter);4742offset = rtw_mi_get_union_offset(padapter);4743RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",4744FUNC_ADPT_ARG(padapter), ch, bw, offset);4745set_channel_bwmode(padapter, ch, offset, bw);4746}4747#else4748if (rtw_mi_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {4749RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",4750FUNC_ADPT_ARG(padapter), ch, bw, offset);4751set_channel_bwmode(padapter, ch, offset, bw);4752rtw_mi_update_union_chan_inf(padapter, ch, offset, bw);4753}4754#endif4755#ifdef CONFIG_CONCURRENT_MODE4756rtw_mi_buddy_suspend_free_assoc_resource(padapter);4757#endif47584759#ifdef CONFIG_BT_COEXIST4760rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT);4761#endif47624763if (pwrpriv->wowlan_pno_enable) {4764RTW_PRINT("%s: pno: %d\n", __func__,4765pwrpriv->wowlan_pno_enable);4766#ifdef CONFIG_FWLPS_IN_IPS4767rtw_set_fw_in_ips_mode(padapter, _TRUE);4768#endif4769}4770#ifdef CONFIG_LPS4771else {4772if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {4773rtw_set_ps_mode(padapter, pwrpriv->wowlan_power_mgmt, 0, 0, "WOWLAN");4774}4775}4776#endif /* #ifdef CONFIG_LPS */47774778} else4779RTW_PRINT("%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode);4780RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));4781return ret;4782}4783#endif /* #ifdef CONFIG_WOWLAN */47844785#ifdef CONFIG_AP_WOWLAN4786int rtw_suspend_ap_wow(_adapter *padapter)4787{4788u8 ch, bw, offset;4789struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4790struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4791struct wowlan_ioctl_param poidparam;4792int ret = _SUCCESS;47934794RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));47954796pwrpriv->wowlan_ap_mode = _TRUE;47974798RTW_INFO("wowlan_ap_mode: %d\n", pwrpriv->wowlan_ap_mode);47994800rtw_mi_netif_stop_queue(padapter);48014802/* 0. Power off LED */4803rtw_led_control(padapter, LED_CTL_POWER_OFF);4804#ifdef CONFIG_SDIO_HCI4805/* 2.only for SDIO disable interrupt*/4806rtw_intf_stop(padapter);48074808/* 2.1 clean interrupt */4809rtw_hal_clear_interrupt(padapter);4810#endif /* CONFIG_SDIO_HCI */48114812/* 1. stop thread */4813rtw_set_drv_stopped(padapter); /*for stop thread*/4814rtw_mi_stop_drv_threads(padapter);4815rtw_clr_drv_stopped(padapter); /*for 32k command*/48164817#ifdef CONFIG_SDIO_HCI4818/* 2.2 free irq */4819#if !(CONFIG_RTW_SDIO_KEEP_IRQ)4820sdio_free_irq(adapter_to_dvobj(padapter));4821#endif4822#endif/*CONFIG_SDIO_HCI*/48234824#ifdef CONFIG_RUNTIME_PORT_SWITCH4825if (rtw_port_switch_chk(padapter)) {4826RTW_INFO(" ### PORT SWITCH ###\n");4827rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);4828}4829#endif48304831rtw_wow_lps_level_decide(padapter, _TRUE);4832poidparam.subcode = WOWLAN_AP_ENABLE;4833rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);48344835RTW_PRINT("%s: wowmode suspending\n", __func__);4836#if 14837if (rtw_mi_check_status(padapter, MI_LINKED)) {4838ch = rtw_mi_get_union_chan(padapter);4839bw = rtw_mi_get_union_bw(padapter);4840offset = rtw_mi_get_union_offset(padapter);4841RTW_INFO("back to linked/linking union - ch:%u, bw:%u, offset:%u\n", ch, bw, offset);4842set_channel_bwmode(padapter, ch, offset, bw);4843}4844#else4845if (rtw_mi_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {4846RTW_INFO("back to linked/linking union - ch:%u, bw:%u, offset:%u\n", ch, bw, offset);4847set_channel_bwmode(padapter, ch, offset, bw);4848rtw_mi_update_union_chan_inf(padapter, ch, offset, bw);4849}4850#endif48514852/*FOR ONE AP - TODO :Multi-AP*/4853{4854int i;4855_adapter *iface;4856struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);48574858for (i = 0; i < dvobj->iface_nums; i++) {4859iface = dvobj->padapters[i];4860if ((iface) && rtw_is_adapter_up(iface)) {4861if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE | WIFI_MESH_STATE) == _FALSE)4862rtw_suspend_free_assoc_resource(iface);4863}4864}48654866}48674868#ifdef CONFIG_BT_COEXIST4869rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT);4870#endif48714872#ifdef CONFIG_LPS4873if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {4874rtw_set_ps_mode(padapter, pwrpriv->wowlan_power_mgmt, 0, 0, "AP-WOWLAN");4875}4876#endif48774878RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));4879return ret;4880}4881#endif /* #ifdef CONFIG_AP_WOWLAN */488248834884int rtw_suspend_normal(_adapter *padapter)4885{4886int ret = _SUCCESS;48874888RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));48894890#ifdef CONFIG_BT_COEXIST4891rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND);4892#endif4893rtw_mi_netif_caroff_qstop(padapter);48944895rtw_mi_suspend_free_assoc_resource(padapter);48964897rtw_led_control(padapter, LED_CTL_POWER_OFF);48984899if ((rtw_hal_check_ips_status(padapter) == _TRUE)4900|| (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))4901RTW_PRINT("%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);490249034904#ifdef CONFIG_CONCURRENT_MODE4905rtw_set_drv_stopped(padapter); /*for stop thread*/4906rtw_stop_cmd_thread(padapter);4907rtw_drv_stop_vir_ifaces(adapter_to_dvobj(padapter));4908#endif4909rtw_dev_unload(padapter);49104911#ifdef CONFIG_SDIO_HCI4912sdio_deinit(adapter_to_dvobj(padapter));49134914#if !(CONFIG_RTW_SDIO_KEEP_IRQ)4915sdio_free_irq(adapter_to_dvobj(padapter));4916#endif4917#endif /*CONFIG_SDIO_HCI*/49184919RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));4920return ret;4921}49224923int rtw_suspend_common(_adapter *padapter)4924{4925struct dvobj_priv *dvobj = padapter->dvobj;4926struct debug_priv *pdbgpriv = &dvobj->drv_dbg;4927struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);4928#ifdef CONFIG_WOWLAN4929struct mlme_priv *pmlmepriv = &padapter->mlmepriv;4930#endif49314932int ret = 0;4933systime start_time = rtw_get_current_time();49344935RTW_PRINT(" suspend start\n");4936RTW_INFO("==> %s (%s:%d)\n", __FUNCTION__, current->comm, current->pid);49374938pdbgpriv->dbg_suspend_cnt++;49394940pwrpriv->bInSuspend = _TRUE;49414942while (pwrpriv->bips_processing == _TRUE)4943rtw_msleep_os(1);49444945#ifdef CONFIG_IOL_READ_EFUSE_MAP4946if (!padapter->bup) {4947u8 bMacPwrCtrlOn = _FALSE;4948rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);4949if (bMacPwrCtrlOn)4950rtw_hal_power_off(padapter);4951}4952#endif49534954if ((!padapter->bup) || RTW_CANNOT_RUN(padapter)) {4955RTW_INFO("%s bup=%d bDriverStopped=%s bSurpriseRemoved = %s\n", __func__4956, padapter->bup4957, rtw_is_drv_stopped(padapter) ? "True" : "False"4958, rtw_is_surprise_removed(padapter) ? "True" : "False");4959pdbgpriv->dbg_suspend_error_cnt++;4960goto exit;4961}4962rtw_ps_deny(padapter, PS_DENY_SUSPEND);49634964rtw_mi_cancel_all_timer(padapter);4965LeaveAllPowerSaveModeDirect(padapter);49664967rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);49684969if (rtw_mi_check_status(padapter, MI_AP_MODE) == _FALSE) {4970#ifdef CONFIG_WOWLAN4971if (check_fwstate(pmlmepriv, _FW_LINKED) || WOWLAN_IS_STA_MIX_MODE(padapter))4972pwrpriv->wowlan_mode = _TRUE;4973else if (pwrpriv->wowlan_pno_enable == _TRUE)4974pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;49754976#ifdef CONFIG_P2P_WOWLAN4977if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE) || P2P_ROLE_DISABLE != padapter->wdinfo.role)4978pwrpriv->wowlan_p2p_mode = _TRUE;4979if (_TRUE == pwrpriv->wowlan_p2p_mode)4980pwrpriv->wowlan_mode |= pwrpriv->wowlan_p2p_mode;4981#endif /* CONFIG_P2P_WOWLAN */49824983if (pwrpriv->wowlan_mode == _TRUE)4984rtw_suspend_wow(padapter);4985else4986#endif /* CONFIG_WOWLAN */4987rtw_suspend_normal(padapter);4988} else if (rtw_mi_check_status(padapter, MI_AP_MODE)) {4989#ifdef CONFIG_AP_WOWLAN4990rtw_suspend_ap_wow(padapter);4991#else4992rtw_suspend_normal(padapter);4993#endif /*CONFIG_AP_WOWLAN*/4994}499549964997RTW_PRINT("rtw suspend success in %d ms\n",4998rtw_get_passing_time_ms(start_time));49995000exit:5001RTW_INFO("<=== %s return %d.............. in %dms\n", __FUNCTION__5002, ret, rtw_get_passing_time_ms(start_time));50035004return ret;5005}50065007#ifdef CONFIG_WOWLAN5008int rtw_resume_process_wow(_adapter *padapter)5009{5010struct mlme_priv *pmlmepriv = &padapter->mlmepriv;5011struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;5012struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);5013struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);5014struct dvobj_priv *psdpriv = padapter->dvobj;5015struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;5016struct wowlan_ioctl_param poidparam;5017struct sta_info *psta = NULL;5018struct registry_priv *registry_par = &padapter->registrypriv;5019int ret = _SUCCESS;50205021RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));50225023if (padapter) {5024pwrpriv = adapter_to_pwrctl(padapter);5025} else {5026pdbgpriv->dbg_resume_error_cnt++;5027ret = -1;5028goto exit;5029}50305031if (RTW_CANNOT_RUN(padapter)) {5032RTW_INFO("%s pdapter %p bDriverStopped %s bSurpriseRemoved %s\n"5033, __func__, padapter5034, rtw_is_drv_stopped(padapter) ? "True" : "False"5035, rtw_is_surprise_removed(padapter) ? "True" : "False");5036goto exit;5037}50385039pwrpriv->wowlan_in_resume = _TRUE;5040#ifdef CONFIG_PNO_SUPPORT5041#ifdef CONFIG_FWLPS_IN_IPS5042if (pwrpriv->wowlan_pno_enable)5043rtw_set_fw_in_ips_mode(padapter, _FALSE);5044#endif /* CONFIG_FWLPS_IN_IPS */5045#endif/* CONFIG_PNO_SUPPORT */50465047if (pwrpriv->wowlan_mode == _TRUE) {5048#ifdef CONFIG_LPS5049if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {5050rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");5051rtw_wow_lps_level_decide(padapter, _FALSE);5052}5053#endif /* CONFIG_LPS */50545055pwrpriv->bFwCurrentInPSMode = _FALSE;50565057#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)5058rtw_mi_intf_stop(padapter);5059rtw_hal_clear_interrupt(padapter);5060#endif50615062#ifdef CONFIG_SDIO_HCI5063#if !(CONFIG_RTW_SDIO_KEEP_IRQ)5064if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {5065ret = -1;5066goto exit;5067}5068#endif5069#endif/*CONFIG_SDIO_HCI*/50705071/* Disable WOW, set H2C command */5072poidparam.subcode = WOWLAN_DISABLE;5073rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);50745075#ifdef CONFIG_CONCURRENT_MODE5076rtw_mi_buddy_reset_drv_sw(padapter);5077#endif50785079psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));5080if (psta)5081set_sta_rate(padapter, psta);508250835084rtw_clr_drv_stopped(padapter);5085RTW_INFO("%s: wowmode resuming, DriverStopped:%s\n", __func__, rtw_is_drv_stopped(padapter) ? "True" : "False");50865087rtw_mi_start_drv_threads(padapter);50885089rtw_mi_intf_start(padapter);50905091if(registry_par->suspend_type == FW_IPS_DISABLE_BBRF && !check_fwstate(pmlmepriv, _FW_LINKED)) {5092if (!rtw_is_surprise_removed(padapter)) {5093rtw_hal_deinit(padapter);5094rtw_hal_init(padapter);5095}5096RTW_INFO("FW_IPS_DISABLE_BBRF hal deinit, hal init \n");5097}50985099#ifdef CONFIG_CONCURRENT_MODE5100rtw_mi_buddy_netif_carrier_on(padapter);5101#endif51025103/* start netif queue */5104rtw_mi_netif_wake_queue(padapter);51055106} else51075108RTW_PRINT("%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode);51095110if (padapter->pid[1] != 0) {5111RTW_INFO("pid[1]:%d\n", padapter->pid[1]);5112rtw_signal_process(padapter->pid[1], SIGUSR2);5113}51145115if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {5116if (pwrpriv->wowlan_wake_reason == FW_DECISION_DISCONNECT ||5117pwrpriv->wowlan_wake_reason == RX_DISASSOC||5118pwrpriv->wowlan_wake_reason == RX_DEAUTH) {51195120RTW_INFO("%s: disconnect reason: %02x\n", __func__,5121pwrpriv->wowlan_wake_reason);5122rtw_indicate_disconnect(padapter, 0, _FALSE);51235124rtw_sta_media_status_rpt(padapter,5125rtw_get_stainfo(&padapter->stapriv,5126get_bssid(&padapter->mlmepriv)), 0);51275128rtw_free_assoc_resources(padapter, _TRUE);5129pmlmeinfo->state = WIFI_FW_NULL_STATE;51305131} else {5132RTW_INFO("%s: do roaming\n", __func__);5133rtw_roaming(padapter, NULL);5134}5135}51365137if (pwrpriv->wowlan_mode == _TRUE) {5138pwrpriv->bips_processing = _FALSE;5139_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);5140#ifndef CONFIG_IPS_CHECK_IN_WD5141rtw_set_pwr_state_check_timer(pwrpriv);5142#endif5143} else5144RTW_PRINT("do not reset timer\n");51455146pwrpriv->wowlan_mode = _FALSE;51475148/* Power On LED */5149#ifdef CONFIG_RTW_SW_LED51505151if (pwrpriv->wowlan_wake_reason == RX_DISASSOC||5152pwrpriv->wowlan_wake_reason == RX_DEAUTH||5153pwrpriv->wowlan_wake_reason == FW_DECISION_DISCONNECT)5154rtw_led_control(padapter, LED_CTL_NO_LINK);5155else5156rtw_led_control(padapter, LED_CTL_LINK);5157#endif5158/* clean driver side wake up reason. */5159pwrpriv->wowlan_last_wake_reason = pwrpriv->wowlan_wake_reason;5160pwrpriv->wowlan_wake_reason = 0;51615162#ifdef CONFIG_BT_COEXIST5163rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);5164#endif /* CONFIG_BT_COEXIST */51655166exit:5167RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));5168return ret;5169}5170#endif /* #ifdef CONFIG_WOWLAN */51715172#ifdef CONFIG_AP_WOWLAN5173int rtw_resume_process_ap_wow(_adapter *padapter)5174{5175struct mlme_priv *pmlmepriv = &padapter->mlmepriv;5176struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);5177struct dvobj_priv *psdpriv = padapter->dvobj;5178struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;5179struct wowlan_ioctl_param poidparam;5180struct sta_info *psta = NULL;5181int ret = _SUCCESS;5182u8 ch, bw, offset;51835184RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));51855186if (padapter) {5187pwrpriv = adapter_to_pwrctl(padapter);5188} else {5189pdbgpriv->dbg_resume_error_cnt++;5190ret = -1;5191goto exit;5192}519351945195#ifdef CONFIG_LPS5196if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {5197rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "AP-WOWLAN");5198rtw_wow_lps_level_decide(padapter, _FALSE);5199}5200#endif /* CONFIG_LPS */52015202pwrpriv->bFwCurrentInPSMode = _FALSE;52035204rtw_hal_disable_interrupt(padapter);52055206rtw_hal_clear_interrupt(padapter);52075208#ifdef CONFIG_SDIO_HCI5209#if !(CONFIG_RTW_SDIO_KEEP_IRQ)5210if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {5211ret = -1;5212goto exit;5213}5214#endif5215#endif/*CONFIG_SDIO_HCI*/5216/* Disable WOW, set H2C command */5217poidparam.subcode = WOWLAN_AP_DISABLE;5218rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);5219pwrpriv->wowlan_ap_mode = _FALSE;52205221rtw_clr_drv_stopped(padapter);5222RTW_INFO("%s: wowmode resuming, DriverStopped:%s\n", __func__, rtw_is_drv_stopped(padapter) ? "True" : "False");52235224rtw_mi_start_drv_threads(padapter);52255226#if 15227if (rtw_mi_check_status(padapter, MI_LINKED)) {5228ch = rtw_mi_get_union_chan(padapter);5229bw = rtw_mi_get_union_bw(padapter);5230offset = rtw_mi_get_union_offset(padapter);5231RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", FUNC_ADPT_ARG(padapter), ch, bw, offset);5232set_channel_bwmode(padapter, ch, offset, bw);5233}5234#else5235if (rtw_mi_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {5236RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", FUNC_ADPT_ARG(padapter), ch, bw, offset);5237set_channel_bwmode(padapter, ch, offset, bw);5238rtw_mi_update_union_chan_inf(padapter, ch, offset, bw);5239}5240#endif52415242/*FOR ONE AP - TODO :Multi-AP*/5243{5244int i;5245_adapter *iface;5246struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);52475248for (i = 0; i < dvobj->iface_nums; i++) {5249iface = dvobj->padapters[i];5250if ((iface) && rtw_is_adapter_up(iface)) {5251if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE | WIFI_MESH_STATE | _FW_LINKED))5252rtw_reset_drv_sw(iface);5253}5254}52555256}5257rtw_mi_intf_start(padapter);52585259/* start netif queue */5260rtw_mi_netif_wake_queue(padapter);52615262if (padapter->pid[1] != 0) {5263RTW_INFO("pid[1]:%d\n", padapter->pid[1]);5264rtw_signal_process(padapter->pid[1], SIGUSR2);5265}52665267#ifdef CONFIG_RESUME_IN_WORKQUEUE5268/* rtw_unlock_suspend(); */5269#endif /* CONFIG_RESUME_IN_WORKQUEUE */52705271pwrpriv->bips_processing = _FALSE;5272_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);5273#ifndef CONFIG_IPS_CHECK_IN_WD5274rtw_set_pwr_state_check_timer(pwrpriv);5275#endif5276/* clean driver side wake up reason. */5277pwrpriv->wowlan_wake_reason = 0;52785279#ifdef CONFIG_BT_COEXIST5280rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);5281#endif /* CONFIG_BT_COEXIST */52825283/* Power On LED */5284#ifdef CONFIG_RTW_SW_LED52855286rtw_led_control(padapter, LED_CTL_LINK);5287#endif5288exit:5289RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));5290return ret;5291}5292#endif /* #ifdef CONFIG_APWOWLAN */52935294void rtw_mi_resume_process_normal(_adapter *padapter)5295{5296int i;5297_adapter *iface;5298struct mlme_priv *pmlmepriv;5299struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);53005301for (i = 0; i < dvobj->iface_nums; i++) {5302iface = dvobj->padapters[i];5303if ((iface) && rtw_is_adapter_up(iface)) {5304pmlmepriv = &iface->mlmepriv;53055306if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {5307RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));53085309if (rtw_chk_roam_flags(iface, RTW_ROAM_ON_RESUME))5310rtw_roaming(iface, NULL);53115312} else if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {5313RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(iface), MLME_IS_AP(iface) ? "AP" : "MESH");5314rtw_ap_restore_network(iface);5315} else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))5316RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));5317else5318RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));5319}5320}5321}53225323int rtw_resume_process_normal(_adapter *padapter)5324{5325struct net_device *pnetdev;5326struct pwrctrl_priv *pwrpriv;5327struct dvobj_priv *psdpriv;5328struct debug_priv *pdbgpriv;53295330int ret = _SUCCESS;53315332if (!padapter) {5333ret = -1;5334goto exit;5335}53365337pnetdev = padapter->pnetdev;5338pwrpriv = adapter_to_pwrctl(padapter);5339psdpriv = padapter->dvobj;5340pdbgpriv = &psdpriv->drv_dbg;53415342RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));53435344#ifdef CONFIG_SDIO_HCI5345/* interface init */5346if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) {5347ret = -1;5348goto exit;5349}5350#endif/*CONFIG_SDIO_HCI*/53515352rtw_clr_surprise_removed(padapter);5353rtw_hal_disable_interrupt(padapter);53545355#ifdef CONFIG_SDIO_HCI5356#if !(CONFIG_RTW_SDIO_KEEP_IRQ)5357if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {5358ret = -1;5359goto exit;5360}5361#endif5362#endif/*CONFIG_SDIO_HCI*/53635364rtw_mi_reset_drv_sw(padapter);53655366pwrpriv->bkeepfwalive = _FALSE;53675368RTW_INFO("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive);5369if (pm_netdev_open(pnetdev, _TRUE) != 0) {5370ret = -1;5371pdbgpriv->dbg_resume_error_cnt++;5372goto exit;5373}53745375rtw_mi_netif_caron_qstart(padapter);53765377if (padapter->pid[1] != 0) {5378RTW_INFO("pid[1]:%d\n", padapter->pid[1]);5379rtw_signal_process(padapter->pid[1], SIGUSR2);5380}53815382#ifdef CONFIG_BT_COEXIST5383rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);5384#endif /* CONFIG_BT_COEXIST */53855386rtw_mi_resume_process_normal(padapter);53875388#ifdef CONFIG_RESUME_IN_WORKQUEUE5389/* rtw_unlock_suspend(); */5390#endif /* CONFIG_RESUME_IN_WORKQUEUE */5391RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));53925393exit:5394return ret;5395}53965397int rtw_resume_common(_adapter *padapter)5398{5399int ret = 0;5400systime start_time = rtw_get_current_time();5401struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);54025403if (pwrpriv == NULL)5404return 0;54055406if (pwrpriv->bInSuspend == _FALSE)5407return 0;54085409RTW_PRINT("resume start\n");5410RTW_INFO("==> %s (%s:%d)\n", __FUNCTION__, current->comm, current->pid);54115412if (rtw_mi_check_status(padapter, MI_AP_MODE) == _FALSE) {5413#ifdef CONFIG_WOWLAN5414if (pwrpriv->wowlan_mode == _TRUE)5415rtw_resume_process_wow(padapter);5416else5417#endif5418rtw_resume_process_normal(padapter);54195420} else if (rtw_mi_check_status(padapter, MI_AP_MODE)) {5421#ifdef CONFIG_AP_WOWLAN5422rtw_resume_process_ap_wow(padapter);5423#else5424rtw_resume_process_normal(padapter);5425#endif /* CONFIG_AP_WOWLAN */5426}54275428pwrpriv->bInSuspend = _FALSE;5429pwrpriv->wowlan_in_resume = _FALSE;54305431RTW_PRINT("%s:%d in %d ms\n", __FUNCTION__ , ret,5432rtw_get_passing_time_ms(start_time));543354345435return ret;5436}54375438#ifdef CONFIG_GPIO_API5439u8 rtw_get_gpio(struct net_device *netdev, u8 gpio_num)5440{5441_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);5442return rtw_hal_get_gpio(adapter, gpio_num);5443}5444EXPORT_SYMBOL(rtw_get_gpio);54455446int rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, bool isHigh)5447{5448u8 direction = 0;5449u8 res = -1;5450_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);5451return rtw_hal_set_gpio_output_value(adapter, gpio_num, isHigh);5452}5453EXPORT_SYMBOL(rtw_set_gpio_output_value);54545455int rtw_config_gpio(struct net_device *netdev, u8 gpio_num, bool isOutput)5456{5457_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);5458return rtw_hal_config_gpio(adapter, gpio_num, isOutput);5459}5460EXPORT_SYMBOL(rtw_config_gpio);5461int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level))5462{5463_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);5464return rtw_hal_register_gpio_interrupt(adapter, gpio_num, callback);5465}5466EXPORT_SYMBOL(rtw_register_gpio_interrupt);54675468int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num)5469{5470_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);5471return rtw_hal_disable_gpio_interrupt(adapter, gpio_num);5472}5473EXPORT_SYMBOL(rtw_disable_gpio_interrupt);54745475#endif /* #ifdef CONFIG_GPIO_API */54765477#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE54785479int rtw_vendor_ie_get_api(struct net_device *dev, int ie_num, char *extra,5480u16 extra_len)5481{5482int ret = 0;54835484ret = rtw_vendor_ie_get_raw_data(dev, ie_num, extra, extra_len);5485return ret;5486}5487EXPORT_SYMBOL(rtw_vendor_ie_get_api);54885489int rtw_vendor_ie_set_api(struct net_device *dev, char *extra)5490{5491return rtw_vendor_ie_set(dev, NULL, NULL, extra);5492}5493EXPORT_SYMBOL(rtw_vendor_ie_set_api);54945495#endif549654975498