1b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/****************************************************************************** 2b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 3b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 4b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 5b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * This program is free software; you can redistribute it and/or modify it 6b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * under the terms of version 2 of the GNU General Public License as 7b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * published by the Free Software Foundation. 8b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 9b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 10b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * more details. 13b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 14b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ******************************************************************************/ 15b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#define _OS_INTFS_C_ 16b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 17b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <osdep_service.h> 18b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <drv_types.h> 19b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <xmit_osdep.h> 20b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <recv_osdep.h> 21b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <hal_intf.h> 22b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#include <rtw_version.h> 23b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 2403722621d2d2313a068aa06b21bcc32fafa4b527Jes Sorensen#include <rtl8723a_hal.h> 2503722621d2d2313a068aa06b21bcc32fafa4b527Jes Sorensen 26b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_LICENSE("GPL"); 27b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_DESCRIPTION("Realtek Wireless Lan Driver"); 28b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_AUTHOR("Realtek Semiconductor Corp."); 29b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>"); 30b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@redhat.com>"); 31b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_VERSION(DRIVERVERSION); 320c248b621b8b87a456558509d1cfc0d96d2d6860Jes SorensenMODULE_FIRMWARE("rtlwifi/rtl8723aufw_A.bin"); 330c248b621b8b87a456558509d1cfc0d96d2d6860Jes SorensenMODULE_FIRMWARE("rtlwifi/rtl8723aufw_B.bin"); 340c248b621b8b87a456558509d1cfc0d96d2d6860Jes SorensenMODULE_FIRMWARE("rtlwifi/rtl8723aufw_B_NoBT.bin"); 35b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 36b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* module param defaults */ 37b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_chip_version = 0x00; 38b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_rfintfs = HWPI; 39b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_debug = 1; 40b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 41b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_channel = 1;/* ad-hoc support requirement */ 42b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_wireless_mode = WIRELESS_11BG_24N; 43b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_vrtl_carrier_sense = AUTO_VCS; 44b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_vcs_type = RTS_CTS;/* */ 45b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_rts_thresh = 2347;/* */ 46b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_frag_thresh = 2346;/* */ 47b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */ 48b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_scan_mode = 1;/* active, passive */ 49b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_adhoc_tx_pwr = 1; 50b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_soft_ap; 51b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_power_mgnt = 1; 52b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_ips_mode = IPS_NORMAL; 53b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 54b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_smart_ps = 2; 55b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 56b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_ips_mode, int, 0644); 57b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode"); 58b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 59b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_long_retry_lmt = 7; 60b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_short_retry_lmt = 7; 61b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_busy_thresh = 40; 62b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_ack_policy = NORMAL_ACK; 63b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 64b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_acm_method;/* 0:By SW 1:By HW. */ 65b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 66b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_wmm_enable = 1;/* default is set to enable the wmm. */ 67b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_uapsd_enable; 68b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 6976dc444185adc5f2a12dc713a337274593c76333Jes Sorensenstatic int rtw_ht_enable = 1; 70b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g */ 7176dc444185adc5f2a12dc713a337274593c76333Jes Sorensenstatic int rtw_cbw40_enable = 3; 7276dc444185adc5f2a12dc713a337274593c76333Jes Sorensenstatic int rtw_ampdu_enable = 1;/* for enable tx_ampdu */ 73b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 74b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 2.4GHZ for IOT issue with bufflao's AP at 5GHZ 75b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger */ 76b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_rx_stbc = 1; 77b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto */ 78b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 79b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* Use 2 path Tx to transmit MCS0~7 and legacy mode */ 80b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_lowrate_two_xmit = 1; 81b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 82b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* int rf_config = RF_1T2R; 1T2R */ 83b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_rf_config = RF_819X_MAX_TYPE; /* auto */ 84b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_low_power; 85b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_wifi_spec; 86b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; 87b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 88b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#ifdef CONFIG_8723AU_BT_COEXIST 89b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_btcoex_enable = 1; 90b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_bt_iso = 2;/* 0:Low, 1:High, 2:From Efuse */ 91b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy */ 92b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_bt_sco = 3; 93b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ 94b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_bt_ampdu = 1 ; 95b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#endif 96b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 97b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */ 98b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_AcceptAddbaReq = true; 99b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 100b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_antdiv_cfg = 2; /* 0:OFF , 1:ON, 2:decide by Efuse config */ 101b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_antdiv_type; /* 0:decide by efuse */ 102b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 103b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_enusbss;/* 0:disable, 1:enable */ 104b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 105b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_hwpdn_mode = 2;/* 0:disable, 1:enable, 2: by EFUSE config */ 106b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 107b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_hwpwrp_detect; /* HW power ping detect 0:disable , 1:enable */ 108b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 109b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_hw_wps_pbc = 1; 110b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 111b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_80211d; 112b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 113b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_regulatory_id = 0xff;/* Regulatory tab id, 0xff = follow efuse's setting */ 114b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 115b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_regulatory_id, int, 0644); 116b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 117b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic char *ifname = "wlan%d"; 118b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(ifname, charp, 0644); 119b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(ifname, "The default name to allocate for first interface"); 120b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 121b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic char *if2name = "wlan%d"; 122b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(if2name, charp, 0644); 123b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(if2name, "The default name to allocate for second interface"); 124b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 125b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_channel_plan, int, 0644); 126b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_chip_version, int, 0644); 127b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_rfintfs, int, 0644); 128b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_channel, int, 0644); 129b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_wmm_enable, int, 0644); 130b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_vrtl_carrier_sense, int, 0644); 131b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_vcs_type, int, 0644); 132b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_busy_thresh, int, 0644); 13376dc444185adc5f2a12dc713a337274593c76333Jes Sorensenmodule_param(rtw_ht_enable, int, 0644); 13476dc444185adc5f2a12dc713a337274593c76333Jes Sorensenmodule_param(rtw_cbw40_enable, int, 0644); 13576dc444185adc5f2a12dc713a337274593c76333Jes Sorensenmodule_param(rtw_ampdu_enable, int, 0644); 136b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_rx_stbc, int, 0644); 137b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_ampdu_amsdu, int, 0644); 138b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 139b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_lowrate_two_xmit, int, 0644); 140b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 141b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_rf_config, int, 0644); 142b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_power_mgnt, int, 0644); 143b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_smart_ps, int, 0644); 144b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_low_power, int, 0644); 145b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_wifi_spec, int, 0644); 146b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 147b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_antdiv_cfg, int, 0644); 148b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 149b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_enusbss, int, 0644); 150b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_hwpdn_mode, int, 0644); 151b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_hwpwrp_detect, int, 0644); 152b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 153b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_hw_wps_pbc, int, 0644); 154b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 155b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic uint rtw_max_roaming_times = 2; 156b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_max_roaming_times, uint, 0644); 157b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try"); 158b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 159b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_80211d, int, 0644); 160b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism"); 161b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 162b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#ifdef CONFIG_8723AU_BT_COEXIST 163b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_btcoex_enable, int, 0644); 164b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(rtw_btcoex_enable, "Enable BT co-existence mechanism"); 165b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#endif 166b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 167b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic uint rtw_notch_filter; 168b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param(rtw_notch_filter, uint, 0644); 169b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P"); 170b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingermodule_param_named(debug, rtw_debug, int, 0444); 171b1925ad84625302fac456d8671b2acafcabf57f5Larry FingerMODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)"); 172b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 173b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int netdev_close(struct net_device *pnetdev); 174b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 1759e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensenstatic int loadparam(struct rtw_adapter *padapter, struct net_device *pnetdev) 176b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 177b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct registry_priv *registry_par = &padapter->registrypriv; 1789e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensen int status = _SUCCESS; 179b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 180b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger GlobalDebugLevel23A = rtw_debug; 181b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->chip_version = (u8)rtw_chip_version; 182b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->rfintfs = (u8)rtw_rfintfs; 183b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger memcpy(registry_par->ssid.ssid, "ANY", 3); 184b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->ssid.ssid_len = 3; 185b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->channel = (u8)rtw_channel; 186b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->wireless_mode = (u8)rtw_wireless_mode; 187b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense; 188b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->vcs_type = (u8)rtw_vcs_type; 189b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->rts_thresh = (u16)rtw_rts_thresh; 190b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->frag_thresh = (u16)rtw_frag_thresh; 191b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->preamble = (u8)rtw_preamble; 192b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->scan_mode = (u8)rtw_scan_mode; 193b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; 194b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->soft_ap = (u8)rtw_soft_ap; 195b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->smart_ps = (u8)rtw_smart_ps; 196b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->power_mgnt = (u8)rtw_power_mgnt; 197b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->ips_mode = (u8)rtw_ips_mode; 198b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; 199b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; 200b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->busy_thresh = (u16)rtw_busy_thresh; 201b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->ack_policy = (u8)rtw_ack_policy; 202b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->acm_method = (u8)rtw_acm_method; 203b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* UAPSD */ 204b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->wmm_enable = (u8)rtw_wmm_enable; 205b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->uapsd_enable = (u8)rtw_uapsd_enable; 20676dc444185adc5f2a12dc713a337274593c76333Jes Sorensen registry_par->ht_enable = (u8)rtw_ht_enable; 20776dc444185adc5f2a12dc713a337274593c76333Jes Sorensen registry_par->cbw40_enable = (u8)rtw_cbw40_enable; 20876dc444185adc5f2a12dc713a337274593c76333Jes Sorensen registry_par->ampdu_enable = (u8)rtw_ampdu_enable; 209b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->rx_stbc = (u8)rtw_rx_stbc; 210b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu; 211b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit; 212b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->rf_config = (u8)rtw_rf_config; 213b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->low_power = (u8)rtw_low_power; 214b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->wifi_spec = (u8)rtw_wifi_spec; 215b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->channel_plan = (u8)rtw_channel_plan; 216b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#ifdef CONFIG_8723AU_BT_COEXIST 217b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->btcoex = (u8)rtw_btcoex_enable; 218b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->bt_iso = (u8)rtw_bt_iso; 219b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->bt_sco = (u8)rtw_bt_sco; 220b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->bt_ampdu = (u8)rtw_bt_ampdu; 221b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger#endif 222b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; 223b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; 224b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->antdiv_type = (u8)rtw_antdiv_type; 225b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 226b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* 0:disable, 1:enable, 2:by EFUSE config */ 227b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode; 228b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* 0:disable, 1:enable */ 229b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect; 230b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; 231b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->max_roaming_times = (u8)rtw_max_roaming_times; 232b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->enable80211d = (u8)rtw_80211d; 233b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger snprintf(registry_par->ifname, 16, "%s", ifname); 234b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger snprintf(registry_par->if2name, 16, "%s", if2name); 235b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->notch_filter = (u8)rtw_notch_filter; 236b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger registry_par->regulatory_tid = (u8)rtw_regulatory_id; 237b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return status; 238b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 239b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 240b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) 241b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 242b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter = netdev_priv(pnetdev); 243b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct sockaddr *addr = p; 244b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 245b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!padapter->bup) 246b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ether_addr_copy(padapter->eeprompriv.mac_addr, addr->sa_data); 247b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return 0; 248b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 249b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 250b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) 251b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 252b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter = netdev_priv(pnetdev); 253b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct xmit_priv *pxmitpriv = &padapter->xmitpriv; 254b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct recv_priv *precvpriv = &padapter->recvpriv; 255b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 256b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.tx_packets = pxmitpriv->tx_pkts; 257b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.rx_packets = precvpriv->rx_pkts; 258b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.tx_dropped = pxmitpriv->tx_drop; 259b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.rx_dropped = precvpriv->rx_drop; 260b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.tx_bytes = pxmitpriv->tx_bytes; 261b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stats.rx_bytes = precvpriv->rx_bytes; 262b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 263b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return &padapter->stats; 264b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 265b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 266b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* 267b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * AC to queue mapping 268b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * 269b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * AC_VO -> queue 0 270b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * AC_VI -> queue 1 271b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * AC_BE -> queue 2 272b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * AC_BK -> queue 3 273b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger */ 274b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 }; 275b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 276b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger/* Given a data frame determine the 802.1p/1d tag to use. */ 277e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensenstatic u32 rtw_classify8021d(struct sk_buff *skb) 278b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 279e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen u32 dscp; 280b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 281b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* skb->priority values from 256->263 are magic values to 282b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * directly indicate a specific 802.1d priority. This is used 283b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * to allow 802.1d priority to be passed directly in from VLAN 284b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger * tags, etc. 285b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger */ 286b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (skb->priority >= 256 && skb->priority <= 263) 287b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return skb->priority - 256; 288b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger switch (skb->protocol) { 289b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger case htons(ETH_P_IP): 290b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger dscp = ip_hdr(skb)->tos & 0xfc; 291b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger break; 292b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger default: 293b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return 0; 294b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 295b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return dscp >> 5; 296b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 297b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 298b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, 299b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger void *accel_priv, 300b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger select_queue_fallback_t fallback) 301b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 302b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter = netdev_priv(dev); 303b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 304b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 305b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger skb->priority = rtw_classify8021d(skb); 306b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 307b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (pmlmepriv->acm_mask != 0) 308b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger skb->priority = qos_acm23a(pmlmepriv->acm_mask, skb->priority); 309b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return rtw_1d_to_queue[skb->priority]; 310b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 311b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 312b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingeru16 rtw_recv_select_queue23a(struct sk_buff *skb) 313b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 314b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct iphdr *piphdr; 31573302d7f7420f359a74f9b7dca37f2484a69371fLarry Finger struct ethhdr *eth = (struct ethhdr *)skb->data; 316b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger unsigned int dscp; 31773302d7f7420f359a74f9b7dca37f2484a69371fLarry Finger u16 eth_type = get_unaligned_be16(ð->h_proto); 318b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger u32 priority; 319b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger u8 *pdata = skb->data; 320b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 321b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger switch (eth_type) { 32273302d7f7420f359a74f9b7dca37f2484a69371fLarry Finger case ETH_P_IP: 323b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger piphdr = (struct iphdr *)(pdata + ETH_HLEN); 324b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger dscp = piphdr->tos & 0xfc; 325b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger priority = dscp >> 5; 326b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger break; 327b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger default: 328b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger priority = 0; 329b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 330b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return rtw_1d_to_queue[priority]; 331b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 332b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 333b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic const struct net_device_ops rtw_netdev_ops = { 334b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_open = netdev_open23a, 335b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_stop = netdev_close, 336b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_start_xmit = rtw_xmit23a_entry23a, 337b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_select_queue = rtw_select_queue, 338b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_set_mac_address = rtw_net_set_mac_address, 339b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .ndo_get_stats = rtw_net_get_stats, 340b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger}; 341b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 342b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerint rtw_init_netdev23a_name23a(struct net_device *pnetdev, const char *ifname) 343b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 344b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (dev_alloc_name(pnetdev, ifname) < 0) { 345b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 346b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("dev_alloc_name, fail!\n")); 347b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 348b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_carrier_off(pnetdev); 349b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return 0; 350b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 351b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 352b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic const struct device_type wlan_type = { 353b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger .name = "wlan", 354b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger}; 355b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 356b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstruct net_device *rtw_init_netdev23a(struct rtw_adapter *old_padapter) 357b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 358b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter; 359b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct net_device *pnetdev; 360b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 361b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+init_net_dev\n")); 362b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 363b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pnetdev = alloc_etherdev_mq(sizeof(struct rtw_adapter), 4); 364b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!pnetdev) 365b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return NULL; 366b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 367b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pnetdev->dev.type = &wlan_type; 368b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter = netdev_priv(pnetdev); 369b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->pnetdev = pnetdev; 370b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 371b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("register rtw_netdev_ops to netdev_ops\n"); 372b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pnetdev->netdev_ops = &rtw_netdev_ops; 373b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 374b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */ 375b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 376b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* step 2. */ 377b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger loadparam(padapter, pnetdev); 378b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return pnetdev; 379b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 380b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 3819e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensenstatic int rtw_init_default_value(struct rtw_adapter *padapter) 382b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 383b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct registry_priv *pregistrypriv = &padapter->registrypriv; 384b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct xmit_priv *pxmitpriv = &padapter->xmitpriv; 385b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 386b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct security_priv *psecuritypriv = &padapter->securitypriv; 3879e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensen int ret = _SUCCESS; 388b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 389b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* xmit_priv */ 390b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; 391b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pxmitpriv->vcs = pregistrypriv->vcs_type; 392b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pxmitpriv->vcs_type = pregistrypriv->vcs_type; 393b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; */ 394b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pxmitpriv->frag_len = pregistrypriv->frag_thresh; 395b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 396b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* mlme_priv */ 397b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ 398b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pmlmepriv->scan_mode = SCAN_ACTIVE; 399b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 400b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* ht_priv */ 401b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */ 402b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 403b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* security_priv */ 4049216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen psecuritypriv->binstallGrpkey = 0; 405b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 406b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* open system */ 407b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; 4089e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen psecuritypriv->dot11PrivacyAlgrthm = 0; 409b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 410b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger psecuritypriv->dot11PrivacyKeyIndex = 0; 411b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 4129e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen psecuritypriv->dot118021XGrpPrivacy = 0; 413b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger psecuritypriv->dot118021XGrpKeyid = 1; 414b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 415b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; 416b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; 417b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 418b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* registry_priv */ 419b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_init_registrypriv_dev_network23a(padapter); 420b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_update_registrypriv_dev_network23a(padapter); 421b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 422b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* hal_priv */ 42303722621d2d2313a068aa06b21bcc32fafa4b527Jes Sorensen rtl8723a_init_default_value(padapter); 424b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 425b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* misc. */ 426b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bReadPortCancel = false; 427b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bWritePortCancel = false; 428b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return ret; 429b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 430b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 4319e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensenint rtw_reset_drv_sw23a(struct rtw_adapter *padapter) 432b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 433b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 434b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; 435b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 436b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* hal_priv */ 43703722621d2d2313a068aa06b21bcc32fafa4b527Jes Sorensen rtl8723a_init_default_value(padapter); 438b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bReadPortCancel = false; 439b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bWritePortCancel = false; 440b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ 441b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 442b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->xmitpriv.tx_pkts = 0; 443b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->recvpriv.rx_pkts = 0; 444b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 445b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pmlmepriv->LinkDetectInfo.bBusyTraffic = false; 446b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 447b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); 448b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 449b7c19c276a230aee012ba7adef036689633c4cd8Jes Sorensen rtw_sreset_reset_value(padapter); 450b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pwrctrlpriv->pwr_state_check_cnts = 0; 451b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 452b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* mlmeextpriv */ 453b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE; 454b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 455b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_set_signal_stat_timer(&padapter->recvpriv); 456e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen return _SUCCESS; 457b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 458b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 4599e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensenint rtw_init_drv_sw23a(struct rtw_adapter *padapter) 460b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 4619e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensen int ret8 = _SUCCESS; 462b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 463b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_init_drv_sw23a\n")); 464b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 465e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen if (rtw_init_cmd_priv23a(&padapter->cmdpriv) == _FAIL) { 466b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 467b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("\n Can't init cmd_priv\n")); 468b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 469b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 470b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 471b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 472b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->cmdpriv.padapter = padapter; 473b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 474b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (rtw_init_evt_priv23a(&padapter->evtpriv) == _FAIL) { 475b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 476b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("\n Can't init evt_priv\n")); 477b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 478b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 479b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 480b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 481b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (rtw_init_mlme_priv23a(padapter) == _FAIL) { 482b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 483b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("\n Can't init mlme_priv\n")); 484b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 485b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 486b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 487b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 488b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 489b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (init_mlme_ext_priv23a(padapter) == _FAIL) { 490b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 491b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("\n Can't init mlme_ext_priv\n")); 492b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 493b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 494b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 495b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 496b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (_rtw_init_xmit_priv23a(&padapter->xmitpriv, padapter) == _FAIL) { 497b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("Can't _rtw_init_xmit_priv23a\n"); 498b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 499b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 500b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 501b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 502b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (_rtw_init_recv_priv23a(&padapter->recvpriv, padapter) == _FAIL) { 503b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("Can't _rtw_init_recv_priv23a\n"); 504b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 505b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 506b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 507b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 508b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (_rtw_init_sta_priv23a(&padapter->stapriv) == _FAIL) { 509b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("Can't _rtw_init_sta_priv23a\n"); 510b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = _FAIL; 511b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 512b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 513b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 514b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->stapriv.padapter = padapter; 515b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->setband = GHZ24_50; 516b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_init_bcmc_stainfo23a(padapter); 517b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 518b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_init_pwrctrl_priv23a(padapter); 519b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 520b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret8 = rtw_init_default_value(padapter); 521b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 5228289d35730a8a5250cafb2c4922f9d3491e097b6Jes Sorensen rtl8723a_init_dm_priv(padapter); 523b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 524b7c19c276a230aee012ba7adef036689633c4cd8Jes Sorensen rtw_sreset_init(padapter); 525b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 526b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerexit: 527b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 528b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_init_drv_sw23a\n")); 529b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return ret8; 530b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 531b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 532b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingervoid rtw_cancel_all_timer23a(struct rtw_adapter *padapter) 533b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 534e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen RT_TRACE(_module_os_intfs_c_, _drv_info_, 535e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("+rtw_cancel_all_timer23a\n")); 536b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 537b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->mlmepriv.assoc_timer); 538b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, 539e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("%s:cancel association timer complete!\n", __func__)); 540b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 541b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->mlmepriv.scan_to_timer); 542b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, 543e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("%s:cancel scan_to_timer!\n", __func__)); 544b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 545b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->mlmepriv.dynamic_chk_timer); 546b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, 547e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("%s:cancel dynamic_chk_timer!\n", __func__)); 548b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 549b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, 550e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("%s:cancel DeInitSwLeds!\n", __func__)); 551b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 552b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer); 553b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 554b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->mlmepriv.set_scan_deny_timer); 555b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_clear_scan_deny(padapter); 556b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, 557e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen ("%s:cancel set_scan_deny_timer!\n", __func__)); 558b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 559b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger del_timer_sync(&padapter->recvpriv.signal_stat_timer); 560b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 561b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 5629e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensenint rtw_free_drv_sw23a(struct rtw_adapter *padapter) 563b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 564b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw23a")); 565b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 566b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger free_mlme_ext_priv23a(&padapter->mlmeextpriv); 567b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 568b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_free_evt_priv23a(&padapter->evtpriv); 569b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 570b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_free_mlme_priv23a(&padapter->mlmepriv); 571b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 572b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger _rtw_free_xmit_priv23a(&padapter->xmitpriv); 573b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 574e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen /* will free bcmc_stainfo here */ 575e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen _rtw_free_sta_priv23a(&padapter->stapriv); 576b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 577b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger _rtw_free_recv_priv23a(&padapter->recvpriv); 578b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 579b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_free_pwrctrl_priv(padapter); 580b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 581db20a02baf6bb95bdb6e0b048f4fb28e830edc8bJes Sorensen kfree(padapter->HalData); 582db20a02baf6bb95bdb6e0b048f4fb28e830edc8bJes Sorensen padapter->HalData = NULL; 583b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 584b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_free_drv_sw23a\n")); 585b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return _SUCCESS; 586b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 587b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 588b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int _rtw_drv_register_netdev(struct rtw_adapter *padapter, char *name) 589b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 590b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct net_device *pnetdev = padapter->pnetdev; 591b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int ret = _SUCCESS; 592b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 593b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* alloc netdev name */ 594b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_init_netdev23a_name23a(pnetdev, name); 595b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 596b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ether_addr_copy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr); 597b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 598b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* Tell the network stack we exist */ 599b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (register_netdev(pnetdev)) { 600a790d58e6832262692416d41af99670b7aa1dca4Jes Sorensen DBG_8723A("%s(%s): Failed!\n", __func__, pnetdev->name); 601b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret = _FAIL; 602b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto error_register_netdev; 603b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 604b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("%s, MAC Address (if%d) = " MAC_FMT "\n", __func__, 605b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger (padapter->iface_id + 1), MAC_ARG(pnetdev->dev_addr)); 606b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return ret; 607b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 608b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingererror_register_netdev: 609b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 610b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (padapter->iface_id > IFACE_ID0) { 611b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_free_drv_sw23a(padapter); 612b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 613b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger free_netdev(pnetdev); 614b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 615b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return ret; 616b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 617b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 618b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerint rtw_drv_register_netdev(struct rtw_adapter *if1) 619b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 620b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct dvobj_priv *dvobj = if1->dvobj; 621b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int i, status = _SUCCESS; 622b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 623e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen if (dvobj->iface_nums >= IFACE_ID_MAX) { 624e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen status = _FAIL; /* -EINVAL */ 625e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen goto exit; 626e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen } 627e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen 628e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen for (i = 0; i < dvobj->iface_nums; i++) { 629e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen struct rtw_adapter *padapter = dvobj->padapters[i]; 630e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen 631e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen if (padapter) { 632e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen char *name; 633e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen 634e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen if (padapter->iface_id == IFACE_ID0) 635e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen name = if1->registrypriv.ifname; 636e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen else if (padapter->iface_id == IFACE_ID1) 637e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen name = if1->registrypriv.if2name; 638e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen else 639e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen name = "wlan%d"; 640e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen status = _rtw_drv_register_netdev(padapter, name); 641e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen if (status != _SUCCESS) 642e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen break; 643b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 644b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 645e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen 646e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensenexit: 647b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return status; 648b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 649b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 650b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerint netdev_open23a(struct net_device *pnetdev) 651b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 652b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter = netdev_priv(pnetdev); 653b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct pwrctrl_priv *pwrctrlpriv; 654b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int ret = 0; 6559e2d06661a55ac8486cdb8e2bd9358755d2f703cJes Sorensen int status; 656b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 657b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+871x_drv - dev_open\n")); 658b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("+871x_drv - drv_open, bup =%d\n", padapter->bup); 659b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 660b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger mutex_lock(&adapter_to_dvobj(padapter)->hw_init_mutex); 661b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 662b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger pwrctrlpriv = &padapter->pwrctrlpriv; 663b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 664b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!padapter->bup) { 665b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bDriverStopped = false; 666b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bSurpriseRemoved = false; 667b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bCardDisableWOHSM = false; 668b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 669dc20d1da78a631b1c823b6cebbf8f659d0faac1dJes Sorensen status = rtl8723au_hal_init(padapter); 670b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (status == _FAIL) { 671b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 672b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("rtl871x_hal_init(): Can't init h/w!\n")); 673b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto netdev_open23a_error; 674b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 675b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 676b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("MAC Address = "MAC_FMT"\n", 677b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger MAC_ARG(pnetdev->dev_addr)); 678b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 679b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (init_hw_mlme_ext23a(padapter) == _FAIL) { 680b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("can't init mlme_ext_priv\n"); 681b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto netdev_open23a_error; 682b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 683b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 684596f85adaac5259b2019d41a0e34292efe8df511Jes Sorensen rtl8723au_inirp_init(padapter); 685b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 686b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_cfg80211_init_wiphy(padapter); 687b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 688b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_led_control(padapter, LED_CTL_NO_LINK); 689b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 690b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bup = true; 691b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 692b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->net_closed = false; 693b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 694b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger mod_timer(&padapter->mlmepriv.dynamic_chk_timer, 695b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger jiffies + msecs_to_jiffies(2000)); 696b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 697b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->pwrctrlpriv.bips_processing = false; 698b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); 699b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 700b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* netif_carrier_on(pnetdev);call this func when 701b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw23a_joinbss_event_cb return success */ 702b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!rtw_netif_queue_stopped(pnetdev)) 703b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_tx_start_all_queues(pnetdev); 704b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger else 705b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_tx_wake_all_queues(pnetdev); 706b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 707b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-871x_drv - dev_open\n")); 708b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("-871x_drv - drv_open, bup =%d\n", padapter->bup); 709b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerexit: 710b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger mutex_unlock(&adapter_to_dvobj(padapter)->hw_init_mutex); 711b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return ret; 712b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 713b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingernetdev_open23a_error: 714b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bup = false; 715b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 716b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_carrier_off(pnetdev); 717b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_tx_stop_all_queues(pnetdev); 718b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 719b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 720b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("-871x_drv - dev_open, fail!\n")); 721b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("-871x_drv - drv_open fail, bup =%d\n", padapter->bup); 722b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 723b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ret = -1; 724b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto exit; 725b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 726b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 727e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensenstatic int ips_netdrv_open(struct rtw_adapter *padapter) 728b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 729b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int status = _SUCCESS; 730b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 731b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->net_closed = false; 732b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("===> %s.........\n", __func__); 733b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 734b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bDriverStopped = false; 735b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bSurpriseRemoved = false; 736b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bCardDisableWOHSM = false; 737b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 738dc20d1da78a631b1c823b6cebbf8f659d0faac1dJes Sorensen status = rtl8723au_hal_init(padapter); 739b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (status == _FAIL) { 740b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_err_, 741b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger ("ips_netdrv_open(): Can't init h/w!\n")); 742b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger goto netdev_open23a_error; 743b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 744b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 745596f85adaac5259b2019d41a0e34292efe8df511Jes Sorensen rtl8723au_inirp_init(padapter); 746b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 747b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); 748b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger mod_timer(&padapter->mlmepriv.dynamic_chk_timer, 749b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger jiffies + msecs_to_jiffies(5000)); 750b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 751b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return _SUCCESS; 752b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 753b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingernetdev_open23a_error: 754b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* padapter->bup = false; */ 755b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("-ips_netdrv_open - drv_open failure, bup =%d\n", 756b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bup); 757b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 758b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return _FAIL; 759b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 760b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 761b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerint rtw_ips_pwr_up23a(struct rtw_adapter *padapter) 762b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 763b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int result; 764b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger unsigned long start_time = jiffies; 765b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 766b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("===> rtw_ips_pwr_up23a..............\n"); 767b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_reset_drv_sw23a(padapter); 768b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 769b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger result = ips_netdrv_open(padapter); 770b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 771b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_led_control(padapter, LED_CTL_NO_LINK); 772b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 773b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("<=== rtw_ips_pwr_up23a.............. in %dms\n", 774b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger jiffies_to_msecs(jiffies - start_time)); 775b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return result; 776b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 777b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 778b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingervoid rtw_ips_pwr_down23a(struct rtw_adapter *padapter) 779b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 780b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger unsigned long start_time = jiffies; 781b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 782b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("===> rtw_ips_pwr_down23a...................\n"); 783b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 784b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bCardDisableWOHSM = true; 785b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->net_closed = true; 786b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 787b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_led_control(padapter, LED_CTL_POWER_OFF); 788b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 789b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_ips_dev_unload23a(padapter); 790b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->bCardDisableWOHSM = false; 791b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("<=== rtw_ips_pwr_down23a..................... in %dms\n", 792b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger jiffies_to_msecs(jiffies - start_time)); 793b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 794b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 795b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingervoid rtw_ips_dev_unload23a(struct rtw_adapter *padapter) 796b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 797763b4247cafdb978630d4da7ff48c8113c7d961eJes Sorensen rtl8723a_fifo_cleanup(padapter); 798b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 799596f85adaac5259b2019d41a0e34292efe8df511Jes Sorensen rtl8723a_usb_intf_stop(padapter); 800b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 801b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s5. */ 802b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!padapter->bSurpriseRemoved) 803dc20d1da78a631b1c823b6cebbf8f659d0faac1dJes Sorensen rtl8723au_hal_deinit(padapter); 804b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 805b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 806b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerint pm_netdev_open23a(struct net_device *pnetdev, u8 bnormal) 807b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 808b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger int status; 809b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 810b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (bnormal) 811b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger status = netdev_open23a(pnetdev); 812b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger else 813b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger status = (_SUCCESS == ips_netdrv_open(netdev_priv(pnetdev))) ? 814b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger (0) : (-1); 815b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 816b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return status; 817b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 818b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 819b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingerstatic int netdev_close(struct net_device *pnetdev) 820b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 821b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger struct rtw_adapter *padapter = netdev_priv(pnetdev); 822b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 823b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+871x_drv - drv_close\n")); 824b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 825b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->net_closed = true; 826b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 827b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) { 828e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen DBG_8723A("(2)871x_drv - drv_close, bup =%d, " 829e6ac6eb2aef4a78f21e433d5ce657334d0f77ec5Jes Sorensen "hw_init_completed =%d\n", padapter->bup, 830b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger padapter->hw_init_completed); 831b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 832b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s1. */ 833b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (pnetdev) { 834b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger if (!rtw_netif_queue_stopped(pnetdev)) 835b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger netif_tx_stop_all_queues(pnetdev); 836b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 837b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 838b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s2. */ 839b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger LeaveAllPowerSaveMode23a(padapter); 840b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_disassoc_cmd23a(padapter, 500, false); 841b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s2-2. indicate disconnect to os */ 842b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_indicate_disconnect23a(padapter); 843b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s2-3. */ 844b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_free_assoc_resources23a(padapter, 1); 845b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* s2-4. */ 846528e5c1dc78b9b4429f06d148014c048538019b5Jes Sorensen rtw_free_network_queue23a(padapter); 847b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger /* Close LED */ 848b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_led_control(padapter, LED_CTL_POWER_OFF); 849b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger } 850b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 851b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger rtw_scan_abort23a(padapter); 852b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 853b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-871x_drv - drv_close\n")); 854b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger DBG_8723A("-871x_drv - drv_close, bup =%d\n", padapter->bup); 855b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 856b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger return 0; 857b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 858b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger 859b1925ad84625302fac456d8671b2acafcabf57f5Larry Fingervoid rtw_ndev_destructor(struct net_device *ndev) 860b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger{ 861a790d58e6832262692416d41af99670b7aa1dca4Jes Sorensen DBG_8723A("%s(%s)\n", __func__, ndev->name); 862b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger kfree(ndev->ieee80211_ptr); 863b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger free_netdev(ndev); 864b1925ad84625302fac456d8671b2acafcabf57f5Larry Finger} 865633dd914ca2b94e91e453d033724d805d286394aJes Sorensen 866633dd914ca2b94e91e453d033724d805d286394aJes Sorensenvoid _rtw_init_queue23a(struct rtw_queue *pqueue) 867633dd914ca2b94e91e453d033724d805d286394aJes Sorensen{ 868633dd914ca2b94e91e453d033724d805d286394aJes Sorensen INIT_LIST_HEAD(&pqueue->queue); 869633dd914ca2b94e91e453d033724d805d286394aJes Sorensen spin_lock_init(&pqueue->lock); 870633dd914ca2b94e91e453d033724d805d286394aJes Sorensen} 871