[go: nahoru, domu]

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(&eth->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