[go: nahoru, domu]

15adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger/******************************************************************************
25adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
35adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
45adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
55adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * This program is free software; you can redistribute it and/or modify it
65adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * under the terms of version 2 of the GNU General Public License as
75adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * published by the Free Software Foundation.
85adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
95adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * more details.
135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * You should have received a copy of the GNU General Public License along with
155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * this program; if not, write to the Free Software Foundation, Inc.,
165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger ******************************************************************************/
205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#define _OS_INTFS_C_
215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <osdep_service.h>
230a95a7f4482c96ec5d02fee1aa8d40a390a6503enavin patidar#include <osdep_intf.h>
245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <drv_types.h>
255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <xmit_osdep.h>
265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <recv_osdep.h>
275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <hal_intf.h>
285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <rtw_ioctl.h>
29d6c28c23f89b00a01b34670f0f1ddcdc2e0bca67navin patidar#include <rtl8188e_hal.h>
305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#include <usb_hal.h>
325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_LICENSE("GPL");
345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_DESCRIPTION("Realtek Wireless Lan Driver");
355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_AUTHOR("Realtek Semiconductor Corp.");
365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_VERSION(DRIVERVERSION);
375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger/* module param defaults */
415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_chip_version = 0x00;
425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_rfintfs = HWPI;
435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_lbkmode;/* RTL8712_AIR_TRX; */
445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_network_mode = Ndis802_11IBSS;/* Ndis802_11Infrastructure; infra, ad-hoc, auto */
455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_channel = 1;/* ad-hoc support requirement */
465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_wireless_mode = WIRELESS_11BG_24N;
475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_vrtl_carrier_sense = AUTO_VCS;
485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_vcs_type = RTS_CTS;/*  */
495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_rts_thresh = 2347;/*  */
505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_frag_thresh = 2346;/*  */
515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */
525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_scan_mode = 1;/* active, passive */
535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_adhoc_tx_pwr = 1;
545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_soft_ap;
555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_power_mgnt = 1;
565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_ips_mode = IPS_NORMAL;
575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_smart_ps = 2;
595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_ips_mode, int, 0644);
615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode");
625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_debug = 1;
645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_radio_enable = 1;
655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_long_retry_lmt = 7;
665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_short_retry_lmt = 7;
675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_busy_thresh = 40;
685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_ack_policy = NORMAL_ACK;
695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_software_encrypt;
715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_software_decrypt;
725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_acm_method;/*  0:By SW 1:By HW. */
745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_wmm_enable = 1;/*  default is set to enable the wmm. */
765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_enable;
775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_max_sp = NO_LIMIT;
785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_acbk_en;
795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_acbe_en;
805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_acvi_en;
815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_uapsd_acvo_en;
825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
83987bc3fed6e35aab00b9cef6d92607236ce719c3Jes Sorensenstatic int rtw_ht_enable = 1;
84987bc3fed6e35aab00b9cef6d92607236ce719c3Jes Sorensenstatic int rtw_cbw40_enable = 3; /*  0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
85987bc3fed6e35aab00b9cef6d92607236ce719c3Jes Sorensenstatic int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_rx_stbc = 1;/*  0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */
875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_ampdu_amsdu;/*  0: disabled, 1:enabled, 2:auto */
885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_lowrate_two_xmit = 1;/* Use 2 path Tx to transmit MCS0~7 and legacy mode */
905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_rf_config = RF_819X_MAX_TYPE;  /* auto */
925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_low_power;
935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_wifi_spec;
945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX;
955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_AcceptAddbaReq = true;/*  0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */
965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_antdiv_cfg = 2; /*  0:OFF , 1:ON, 2:decide by Efuse config */
985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_antdiv_type; /* 0:decide by efuse  1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2:  for 88EE, 1Tx and 2Rx are diversity.(2 Ant, Tx and RxCG are both on aux port, RxCS is on main port), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) */
995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_enusbss;/* 0:disable, 1:enable */
1015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_hwpdn_mode = 2;/* 0:disable, 1:enable, 2: by EFUSE config */
1035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_hwpwrp_detect; /* HW power  ping detect 0:disable , 1:enable */
1055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_hw_wps_pbc = 1;
1075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint rtw_mc2u_disable;
1095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_80211d;
1115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic char *ifname = "wlan%d";
1135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(ifname, charp, 0644);
1145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(ifname, "The default name to allocate for first interface");
1155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic char *if2name = "wlan%d";
1175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(if2name, charp, 0644);
1185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(if2name, "The default name to allocate for second interface");
1195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerchar *rtw_initmac;  /*  temp mac address if users want to use instead of the mac address in Efuse */
1215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_initmac, charp, 0644);
1235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_channel_plan, int, 0644);
1245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_chip_version, int, 0644);
1255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_rfintfs, int, 0644);
1265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_lbkmode, int, 0644);
1275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_network_mode, int, 0644);
1285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_channel, int, 0644);
1295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_wmm_enable, int, 0644);
1305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_vrtl_carrier_sense, int, 0644);
1315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_vcs_type, int, 0644);
1325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_busy_thresh, int, 0644);
1335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_ht_enable, int, 0644);
1345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_cbw40_enable, int, 0644);
1355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_ampdu_enable, int, 0644);
1365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_rx_stbc, int, 0644);
1375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_ampdu_amsdu, int, 0644);
1385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_lowrate_two_xmit, int, 0644);
1395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_rf_config, int, 0644);
1405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_power_mgnt, int, 0644);
1415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_smart_ps, int, 0644);
1425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_low_power, int, 0644);
1435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_wifi_spec, int, 0644);
1445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_antdiv_cfg, int, 0644);
1455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_antdiv_type, int, 0644);
1465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_enusbss, int, 0644);
1475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_hwpdn_mode, int, 0644);
1485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_hwpwrp_detect, int, 0644);
1495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_hw_wps_pbc, int, 0644);
1505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic uint rtw_max_roaming_times = 2;
1525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_max_roaming_times, uint, 0644);
1535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try");
1545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_fw_iol = 1;/*  0:Disable, 1:enable, 2:by usb speed */
1565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_fw_iol, int, 0644);
1575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(rtw_fw_iol, "FW IOL");
1585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_mc2u_disable, int, 0644);
1605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_80211d, int, 0644);
1625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism");
1635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic uint rtw_notch_filter = RTW_NOTCH_FILTER;
1655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param(rtw_notch_filter, uint, 0644);
1665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
1675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingermodule_param_named(debug, rtw_debug, int, 0444);
1685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry FingerMODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)");
1695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger/* dummy routines */
1715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_proc_remove_one(struct net_device *dev)
1725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
1735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
1745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_proc_init_one(struct net_device *dev)
1765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
1775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
1785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#if 0	/* TODO: Convert these to /sys */
1805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_proc_init_one(struct net_device *dev)
1815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
1825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct proc_dir_entry *dir_dev = NULL;
1835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct proc_dir_entry *entry = NULL;
1845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter	*padapter = rtw_netdev_priv(dev);
1855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8 rf_type;
1865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (rtw_proc == NULL) {
1885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		memcpy(rtw_proc_name, DRV_NAME, sizeof(DRV_NAME));
1895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_proc = create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net);
1915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (rtw_proc == NULL) {
1925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			DBG_88E(KERN_ERR "Unable to create rtw_proc directory\n");
1935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			return;
1945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
1955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev);
1975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (!entry) {
1985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("Unable to create_proc_read_entry!\n");
1995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			return;
2005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
2015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->dir_dev == NULL) {
2045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->dir_dev = create_proc_entry(dev->name,
2055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					  S_IFDIR | S_IRUGO | S_IXUGO,
2065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					  rtw_proc);
2075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		dir_dev = padapter->dir_dev;
2085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (dir_dev == NULL) {
2095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			if (rtw_proc_cnt == 0) {
2105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				if (rtw_proc) {
2115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					remove_proc_entry(rtw_proc_name, init_net.proc_net);
2125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					rtw_proc = NULL;
2135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				}
2145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			}
2155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("Unable to create dir_dev directory\n");
2175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			return;
2185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
2195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	} else {
2205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_proc_cnt++;
2245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO,
2265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_write_reg, dev);
2275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_write_reg;
2325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO,
2345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_read_reg, dev);
2355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_read_reg;
2405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO,
2435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_fwstate, dev);
2445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO,
2505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_sec_info, dev);
2515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO,
2575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_mlmext_state, dev);
2585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO,
2645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_qos_option, dev);
2655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO,
2715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_ht_option, dev);
2725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO,
2785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rf_info, dev);
2795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO,
2855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_ap_info, dev);
2865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO,
2925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_getstruct adapter_state, dev);
2935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
2945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
2955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
2965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
2975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
2985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO,
2995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_trx_info, dev);
3005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("mac_reg_dump1", S_IFREG | S_IRUGO,
3065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_mac_reg_dump1, dev);
3075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("mac_reg_dump2", S_IFREG | S_IRUGO,
3135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_mac_reg_dump2, dev);
3145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("mac_reg_dump3", S_IFREG | S_IRUGO,
3205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_mac_reg_dump3, dev);
3215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("bb_reg_dump1", S_IFREG | S_IRUGO,
3275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_bb_reg_dump1, dev);
3285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("bb_reg_dump2", S_IFREG | S_IRUGO,
3345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_bb_reg_dump2, dev);
3355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("bb_reg_dump3", S_IFREG | S_IRUGO,
3415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_bb_reg_dump3, dev);
3425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rf_reg_dump1", S_IFREG | S_IRUGO,
3485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rf_reg_dump1, dev);
3495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rf_reg_dump2", S_IFREG | S_IRUGO,
3555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rf_reg_dump2, dev);
3565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
3625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) {
3635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		entry = create_proc_read_entry("rf_reg_dump3", S_IFREG | S_IRUGO,
3645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					   dir_dev, proc_get_rf_reg_dump3, dev);
3655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (!entry) {
3665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("Unable to create_proc_read_entry!\n");
3675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			return;
3685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
3695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		entry = create_proc_read_entry("rf_reg_dump4", S_IFREG | S_IRUGO,
3715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					   dir_dev, proc_get_rf_reg_dump4, dev);
3725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (!entry) {
3735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("Unable to create_proc_read_entry!\n");
3745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			return;
3755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
3765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#ifdef CONFIG_88EU_AP_MODE
3795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO,
3815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_all_sta_info, dev);
3825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#endif
3875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO,
3895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_best_channel, dev);
3905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
3935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
3945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
3955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO,
3965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rx_signal, dev);
3975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
3985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
3995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_rx_signal;
4025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("ht_enable", S_IFREG | S_IRUGO,
4035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_ht_enable, dev);
4045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_ht_enable;
4095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("cbw40_enable", S_IFREG | S_IRUGO,
4115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_cbw40_enable, dev);
4125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_cbw40_enable;
4175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("ampdu_enable", S_IFREG | S_IRUGO,
4195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_ampdu_enable, dev);
4205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_ampdu_enable;
4255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rx_stbc", S_IFREG | S_IRUGO,
4275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rx_stbc, dev);
4285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_rx_stbc;
4335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("path_rssi", S_IFREG | S_IRUGO,
4355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger					dir_dev, proc_get_two_path_rssi, dev);
4365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry = create_proc_read_entry("rssi_disp", S_IFREG | S_IRUGO,
4415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger				   dir_dev, proc_get_rssi_disp, dev);
4425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!entry) {
4435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("Unable to create_proc_read_entry!\n");
4445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
4465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	entry->write_proc = proc_set_rssi_disp;
4475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
4485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_proc_remove_one(struct net_device *dev)
4505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
4515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct proc_dir_entry *dir_dev = NULL;
4525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter	*padapter = rtw_netdev_priv(dev);
4535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8 rf_type;
4545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	dir_dev = padapter->dir_dev;
4565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->dir_dev = NULL;
4575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (dir_dev) {
4595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("write_reg", dir_dev);
4605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("read_reg", dir_dev);
4615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("fwstate", dir_dev);
4625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("sec_info", dir_dev);
4635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("mlmext_state", dir_dev);
4645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("qos_option", dir_dev);
4655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("ht_option", dir_dev);
4665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rf_info", dir_dev);
4675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("ap_info", dir_dev);
4685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("adapter_state", dir_dev);
4695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("trx_info", dir_dev);
4705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("mac_reg_dump1", dir_dev);
4715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("mac_reg_dump2", dir_dev);
4725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("mac_reg_dump3", dir_dev);
4735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("bb_reg_dump1", dir_dev);
4745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("bb_reg_dump2", dir_dev);
4755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("bb_reg_dump3", dir_dev);
4765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rf_reg_dump1", dir_dev);
4775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rf_reg_dump2", dir_dev);
4785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
4795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) {
4805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			remove_proc_entry("rf_reg_dump3", dir_dev);
4815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			remove_proc_entry("rf_reg_dump4", dir_dev);
4825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
4835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#ifdef CONFIG_88EU_AP_MODE
4845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("all_sta_info", dir_dev);
4855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#endif
4865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
4875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("best_channel", dir_dev);
4885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rx_signal", dir_dev);
4895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("cbw40_enable", dir_dev);
4905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("ht_enable", dir_dev);
4915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("ampdu_enable", dir_dev);
4925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rx_stbc", dir_dev);
4935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("path_rssi", dir_dev);
4945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry("rssi_disp", dir_dev);
4955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		remove_proc_entry(dev->name, rtw_proc);
4965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		dir_dev = NULL;
4975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	} else {
4985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return;
4995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
5005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_proc_cnt--;
5015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (rtw_proc_cnt == 0) {
5035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (rtw_proc) {
5045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			remove_proc_entry("ver_info", rtw_proc);
5055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			remove_proc_entry(rtw_proc_name, init_net.proc_net);
5075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			rtw_proc = NULL;
5085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
5095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
5105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
5115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger#endif
5125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic uint loadparam(struct adapter *padapter,  struct  net_device *pnetdev)
5145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
5155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	uint status = _SUCCESS;
5165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct registry_priv  *registry_par = &padapter->registrypriv;
5175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	GlobalDebugLevel = rtw_debug;
5205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->chip_version = (u8)rtw_chip_version;
5215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->rfintfs = (u8)rtw_rfintfs;
5225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->lbkmode = (u8)rtw_lbkmode;
5235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->network_mode  = (u8)rtw_network_mode;
5245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	memcpy(registry_par->ssid.Ssid, "ANY", 3);
5265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ssid.SsidLength = 3;
5275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->channel = (u8)rtw_channel;
5295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->wireless_mode = (u8)rtw_wireless_mode;
5305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;
5315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->vcs_type = (u8)rtw_vcs_type;
5325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->rts_thresh = (u16)rtw_rts_thresh;
5335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->frag_thresh = (u16)rtw_frag_thresh;
5345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->preamble = (u8)rtw_preamble;
5355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->scan_mode = (u8)rtw_scan_mode;
5365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr;
5375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->soft_ap =  (u8)rtw_soft_ap;
5385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->smart_ps =  (u8)rtw_smart_ps;
5395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->power_mgnt = (u8)rtw_power_mgnt;
5405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ips_mode = (u8)rtw_ips_mode;
5415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->radio_enable = (u8)rtw_radio_enable;
5425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;
5435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;
5445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->busy_thresh = (u16)rtw_busy_thresh;
5455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ack_policy = (u8)rtw_ack_policy;
5460cccd45f0ac066d11d5ae3e64afb7e70c621ffd1navin patidar	registry_par->mp_mode = 0;
5475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->software_encrypt = (u8)rtw_software_encrypt;
5485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->software_decrypt = (u8)rtw_software_decrypt;
5495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->acm_method = (u8)rtw_acm_method;
5505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 /* UAPSD */
5525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->wmm_enable = (u8)rtw_wmm_enable;
5535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_enable = (u8)rtw_uapsd_enable;
5545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp;
5555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en;
5565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en;
5575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en;
5585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en;
5595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ht_enable = (u8)rtw_ht_enable;
5615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->cbw40_enable = (u8)rtw_cbw40_enable;
5625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ampdu_enable = (u8)rtw_ampdu_enable;
5635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->rx_stbc = (u8)rtw_rx_stbc;
5645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;
5655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;
5665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->rf_config = (u8)rtw_rf_config;
5675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->low_power = (u8)rtw_low_power;
5685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->wifi_spec = (u8)rtw_wifi_spec;
5695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->channel_plan = (u8)rtw_channel_plan;
5705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;
5715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;
5725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->antdiv_type = (u8)rtw_antdiv_type;
5735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable, 1:enable, 2:by EFUSE config */
5745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable, 1:enable */
5755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;
5765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->max_roaming_times = (u8)rtw_max_roaming_times;
5785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->fw_iol = rtw_fw_iol;
5805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->enable80211d = (u8)rtw_80211d;
5825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	snprintf(registry_par->ifname, 16, "%s", ifname);
5835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	snprintf(registry_par->if2name, 16, "%s", if2name);
5845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	registry_par->notch_filter = (u8)rtw_notch_filter;
5855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return status;
5865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
5875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int rtw_net_set_mac_address(struct net_device *pnetdev, void *p)
5895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
5905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
5915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct sockaddr *addr = p;
5925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!padapter->bup)
5945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN);
5955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return 0;
5975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
5985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
5995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)
6005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
6015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
6025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
6035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct recv_priv *precvpriv = &(padapter->recvpriv);
6045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.tx_packets = pxmitpriv->tx_pkts;/* pxmitpriv->tx_pkts++; */
6065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.rx_packets = precvpriv->rx_pkts;/* precvpriv->rx_pkts++; */
6075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.tx_dropped = pxmitpriv->tx_drop;
6085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.rx_dropped = precvpriv->rx_drop;
6095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.tx_bytes = pxmitpriv->tx_bytes;
6105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stats.rx_bytes = precvpriv->rx_bytes;
6115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return &padapter->stats;
6125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
6135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger/*
6155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * AC to queue mapping
6165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger *
6175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * AC_VO -> queue 0
6185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * AC_VI -> queue 1
6195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * AC_BE -> queue 2
6205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger * AC_BK -> queue 3
6215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger */
6225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };
6235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger/* Given a data frame determine the 802.1p/1d tag to use. */
6255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic unsigned int rtw_classify8021d(struct sk_buff *skb)
6265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
6275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	unsigned int dscp;
6285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* skb->priority values from 256->263 are magic values to
6305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 * directly indicate a specific 802.1d priority.  This is used
6315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 * to allow 802.1d priority to be passed directly in from VLAN
6325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 * tags, etc.
6335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 */
6345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (skb->priority >= 256 && skb->priority <= 263)
6355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return skb->priority - 256;
6365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	switch (skb->protocol) {
6385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	case htons(ETH_P_IP):
6395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		dscp = ip_hdr(skb)->tos & 0xfc;
6405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		break;
6415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	default:
6425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return 0;
6435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
6445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return dscp >> 5;
6465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
6475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
648f663dd9aaf9ed124f25f0f8452edf238f087ad50Jason Wangstatic u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb,
64999932d4fc03a13bb3e94938fe25458fabc8f2fc3Daniel Borkmann			    void *accel_priv, select_queue_fallback_t fallback)
6505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
6515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter	*padapter = rtw_netdev_priv(dev);
6525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
6535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	skb->priority = rtw_classify8021d(skb);
6555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (pmlmepriv->acm_mask != 0)
6575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);
6585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return rtw_1d_to_queue[skb->priority];
6605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
6615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingeru16 rtw_recv_select_queue(struct sk_buff *skb)
6635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
6645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct iphdr *piphdr;
6655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	unsigned int dscp;
6665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	__be16	eth_type;
6675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u32 priority;
6685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8 *pdata = skb->data;
6695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	memcpy(&eth_type, pdata+(ETH_ALEN<<1), 2);
6715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	switch (eth_type) {
6735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	case htons(ETH_P_IP):
6745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		piphdr = (struct iphdr *)(pdata+ETH_HLEN);
6755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		dscp = piphdr->tos & 0xfc;
6765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		priority = dscp >> 5;
6775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		break;
6785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	default:
6795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		priority = 0;
6805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
6815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return rtw_1d_to_queue[priority];
6835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
6845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic const struct net_device_ops rtw_netdev_ops = {
6865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_open = netdev_open,
6875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_stop = netdev_close,
6885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_start_xmit = rtw_xmit_entry,
6895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_select_queue	= rtw_select_queue,
6905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_set_mac_address = rtw_net_set_mac_address,
6915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_get_stats = rtw_net_get_stats,
6925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	.ndo_do_ioctl = rtw_ioctl,
6935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger};
6945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
6955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
6965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
6975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (dev_alloc_name(pnetdev, ifname) < 0)
6985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		RT_TRACE(_module_os_intfs_c_, _drv_err_, ("dev_alloc_name, fail!\n"));
6995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	netif_carrier_off(pnetdev);
7015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return 0;
7025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
7035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7040d1206be229697f897f00822bc142e66da731417Larry Fingerstatic const struct device_type wlan_type = {
7050d1206be229697f897f00822bc142e66da731417Larry Finger	.name = "wlan",
7060d1206be229697f897f00822bc142e66da731417Larry Finger};
7070d1206be229697f897f00822bc142e66da731417Larry Finger
7085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstruct net_device *rtw_init_netdev(struct adapter *old_padapter)
7095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
7105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter;
7110fb7778790811d1d838e57891ba320a0011e8ff6navin patidar	struct net_device *pnetdev = NULL;
7125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+init_net_dev\n"));
7145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (old_padapter != NULL)
7165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(struct adapter), (void *)old_padapter);
7175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!pnetdev)
7195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		return NULL;
7205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7210d1206be229697f897f00822bc142e66da731417Larry Finger	pnetdev->dev.type = &wlan_type;
7225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter = rtw_netdev_priv(pnetdev);
7235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->pnetdev = pnetdev;
7245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("register rtw_netdev_ops to netdev_ops\n");
7255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pnetdev->netdev_ops = &rtw_netdev_ops;
7265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */
7275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;
7285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* step 2. */
7305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	loadparam(padapter, pnetdev);
7315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return pnetdev;
7335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
7345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingeru32 rtw_start_drv_threads(struct adapter *padapter)
7365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
7375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u32 _status = _SUCCESS;
7385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_start_drv_threads\n"));
7405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD");
7425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (IS_ERR(padapter->cmdThread))
7435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		_status = _FAIL;
7445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	else
7455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		_rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); /* wait for cmd_thread to run */
7465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return _status;
7485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
7495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_stop_drv_threads(struct adapter *padapter)
7515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
7525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_stop_drv_threads\n"));
7535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* Below is to termindate rtw_cmd_thread & event_thread... */
7552ca4ab5324062e70393e9a37a8db1ea94d6e2f99Larry Finger	up(&padapter->cmdpriv.cmd_queue_sema);
7565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->cmdThread)
7575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		_rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema);
7585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
7605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic u8 rtw_init_default_value(struct adapter *padapter)
7625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
7635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8 ret  = _SUCCESS;
7645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct registry_priv *pregistrypriv = &padapter->registrypriv;
7655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct xmit_priv	*pxmitpriv = &padapter->xmitpriv;
7665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
7675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct security_priv *psecuritypriv = &padapter->securitypriv;
7685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* xmit_priv */
7705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
7715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pxmitpriv->vcs = pregistrypriv->vcs_type;
7725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pxmitpriv->vcs_type = pregistrypriv->vcs_type;
7735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pxmitpriv->frag_len = pregistrypriv->frag_thresh;
7745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* mlme_priv */
7765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pmlmepriv->scan_interval = SCAN_INTERVAL;/*  30*2 sec = 60sec */
7775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pmlmepriv->scan_mode = SCAN_ACTIVE;
7785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* ht_priv */
7805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */
7815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* security_priv */
7835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->binstallGrpkey = _FAIL;
7845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt;
7855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt;
7865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */
7875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
7885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->dot11PrivacyKeyIndex = 0;
7895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
7905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->dot118021XGrpKeyid = 1;
7915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
7925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;
7935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* registry_priv */
7955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_init_registrypriv_dev_network(padapter);
7965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_update_registrypriv_dev_network(padapter);
7975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
7985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* hal_priv */
7995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_def_value_init(padapter);
8005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* misc. */
8025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bReadPortCancel = false;
8035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bWritePortCancel = false;
8045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bRxRSSIDisplay = 0;
8055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bNotifyChannelChange = 0;
8065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return ret;
8075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
8085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingeru8 rtw_reset_drv_sw(struct adapter *padapter)
8105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
8115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8	ret8 = _SUCCESS;
8125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
8135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
8145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* hal_priv */
8165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_def_value_init(padapter);
8175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bReadPortCancel = false;
8185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bWritePortCancel = false;
8195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bRxRSSIDisplay = 0;
8205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pmlmepriv->scan_interval = SCAN_INTERVAL;/*  30*2 sec = 60sec */
8215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->xmitpriv.tx_pkts = 0;
8235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->recvpriv.rx_pkts = 0;
8245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pmlmepriv->LinkDetectInfo.bBusyTraffic = false;
8265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING);
8286c9118340953ffcd95d937eb43b564d8716bfd88navin patidar	rtw_hal_sreset_init(padapter);
8295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	pwrctrlpriv->pwr_state_check_cnts = 0;
8305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* mlmeextpriv */
8325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE;
8335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_set_signal_stat_timer(&padapter->recvpriv);
8355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return ret8;
8375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
8385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingeru8 rtw_init_drv_sw(struct adapter *padapter)
8405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
8415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	u8	ret8 = _SUCCESS;
8425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_init_drv_sw\n"));
8455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) {
8475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init cmd_priv\n"));
8485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->cmdpriv.padapter = padapter;
8535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (rtw_init_mlme_priv(padapter) == _FAIL) {
8555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_priv\n"));
8565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (init_mlme_ext_priv(padapter) == _FAIL) {
8615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_ext_priv\n"));
8625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) {
8675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		DBG_88E("Can't _rtw_init_xmit_priv\n");
8685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) {
8735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		DBG_88E("Can't _rtw_init_recv_priv\n");
8745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) {
8795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		DBG_88E("Can't _rtw_init_sta_priv\n");
8805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		ret8 = _FAIL;
8815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto exit;
8825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
8835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->stapriv.padapter = padapter;
8855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_init_bcmc_stainfo(padapter);
8875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_init_pwrctrl_priv(padapter);
8895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	ret8 = rtw_init_default_value(padapter);
8915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_dm_init(padapter);
8935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_sw_led_init(padapter);
8945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_sreset_init(padapter);
8965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
897f214e521d9aff1284d40d604186ae085d68e27c2Larry Finger	spin_lock_init(&padapter->br_ext_lock);
8985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
8995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerexit:
9005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_init_drv_sw\n"));
9015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return ret8;
9045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
9055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_cancel_all_timer(struct adapter *padapter)
9075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
9085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_cancel_all_timer\n"));
9095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
910c495fc9eba67ca2c009fef7a02ae0da1aa17b9a7navin patidar	del_timer_sync(&padapter->mlmepriv.assoc_timer);
9115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel association timer complete!\n"));
9125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
913c495fc9eba67ca2c009fef7a02ae0da1aa17b9a7navin patidar	del_timer_sync(&padapter->mlmepriv.scan_to_timer);
9145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel scan_to_timer!\n"));
9155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
916c495fc9eba67ca2c009fef7a02ae0da1aa17b9a7navin patidar	del_timer_sync(&padapter->mlmepriv.dynamic_chk_timer);
9175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel dynamic_chk_timer!\n"));
9185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/*  cancel sw led timer */
9205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_sw_led_deinit(padapter);
9215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel DeInitSwLeds!\n"));
9225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
923c495fc9eba67ca2c009fef7a02ae0da1aa17b9a7navin patidar	del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer);
9245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
925c495fc9eba67ca2c009fef7a02ae0da1aa17b9a7navin patidar	del_timer_sync(&padapter->recvpriv.signal_stat_timer);
9265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
9275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingeru8 rtw_free_drv_sw(struct adapter *padapter)
9295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
9305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw"));
9315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	free_mlme_ext_priv(&padapter->mlmeextpriv);
9335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_free_mlme_priv(&padapter->mlmepriv);
9355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_rtw_free_xmit_priv(&padapter->xmitpriv);
9365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */
9385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_rtw_free_recv_priv(&padapter->recvpriv);
9405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_free_data(padapter);
9425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("<== rtw_free_drv_sw\n"));
9445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* free the old_pnetdev */
9465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->rereg_nd_name_priv.old_pnetdev) {
9475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		free_netdev(padapter->rereg_nd_name_priv.old_pnetdev);
9485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->rereg_nd_name_priv.old_pnetdev = NULL;
9495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
9505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
951fc8b5ae9aa4ac551a8e33a2ac617c4e2fc102225navin patidar	mutex_destroy(&padapter->hw_init_mutex);
952fc8b5ae9aa4ac551a8e33a2ac617c4e2fc102225navin patidar
9535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_free_drv_sw\n"));
9545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return _SUCCESS;
9565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
9575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint _netdev_open(struct net_device *pnetdev)
9595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
9605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	uint status;
9615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
9625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
9635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - dev_open\n"));
9655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("+88eu_drv - drv_open, bup =%d\n", padapter->bup);
9665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (pwrctrlpriv->ps_flag) {
9685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->net_closed = false;
9695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto netdev_open_normal_process;
9705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
9715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9725adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!padapter->bup) {
9735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->bDriverStopped = false;
9745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->bSurpriseRemoved = false;
9755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		status = rtw_hal_init(padapter);
9775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (status == _FAIL) {
9785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			RT_TRACE(_module_os_intfs_c_, _drv_err_, ("rtl88eu_hal_init(): Can't init h/w!\n"));
9795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			goto netdev_open_error;
9805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
9815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		pr_info("MAC Address = %pM\n", pnetdev->dev_addr);
9835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		status = rtw_start_drv_threads(padapter);
9855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (status == _FAIL) {
9865adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("Initialize driver software resource Failed!\n");
9875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			goto netdev_open_error;
9885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
9895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (init_hw_mlme_ext(padapter) == _FAIL) {
9915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			pr_info("can't init mlme_ext_priv\n");
9925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			goto netdev_open_error;
9935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
9945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (padapter->intf_start)
9955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			padapter->intf_start(padapter);
9965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_proc_init_one(pnetdev);
9975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
9985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_led_control(padapter, LED_CTL_NO_LINK);
9995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->bup = true;
10015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
10025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->net_closed = false;
10035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
10055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->pwrctrlpriv.bips_processing = false;
10075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
10085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!rtw_netif_queue_stopped(pnetdev))
1010778869739199349df533b053beb4cf5fb02c3492navin patidar		netif_tx_start_all_queues(pnetdev);
10115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	else
1012457c7b6a4d8c69fc6cf83c45ab1f7fbfa3d5a48anavin patidar		netif_tx_wake_all_queues(pnetdev);
10135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingernetdev_open_normal_process:
10155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - dev_open\n"));
10165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("-88eu_drv - drv_open, bup =%d\n", padapter->bup);
10175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return 0;
10185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingernetdev_open_error:
10205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bup = false;
10215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	netif_carrier_off(pnetdev);
1022945c097243b85001bd1c3c90a41e92bce623daf5navin patidar	netif_tx_stop_all_queues(pnetdev);
10235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_err_, ("-88eu_drv - dev_open, fail!\n"));
10245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("-88eu_drv - drv_open fail, bup =%d\n", padapter->bup);
10255adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return -1;
10265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
10275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint netdev_open(struct net_device *pnetdev)
10295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
10305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	int ret;
10315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
10325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1033fc8b5ae9aa4ac551a8e33a2ac617c4e2fc102225navin patidar	_enter_critical_mutex(&padapter->hw_init_mutex, NULL);
10345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	ret = _netdev_open(pnetdev);
1035fc8b5ae9aa4ac551a8e33a2ac617c4e2fc102225navin patidar	mutex_unlock(&padapter->hw_init_mutex);
10365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return ret;
10375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
10385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerstatic int  ips_netdrv_open(struct adapter *padapter)
10405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
10415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	int status = _SUCCESS;
10425adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->net_closed = false;
10435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("===> %s.........\n", __func__);
10445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bDriverStopped = false;
10465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->bSurpriseRemoved = false;
10475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	status = rtw_hal_init(padapter);
10495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (status == _FAIL) {
10505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		RT_TRACE(_module_os_intfs_c_, _drv_err_, ("ips_netdrv_open(): Can't init h/w!\n"));
10515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		goto netdev_open_error;
10525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
10535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->intf_start)
10555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->intf_start(padapter);
10565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
10585adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 5000);
10595adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10605adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	 return _SUCCESS;
10615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingernetdev_open_error:
10635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("-ips_netdrv_open - drv_open failure, bup =%d\n", padapter->bup);
10645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10655adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return _FAIL;
10665adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
10675adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10685adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10695adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint rtw_ips_pwr_up(struct adapter *padapter)
10705adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
10715adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	int result;
1072c01fb49636b65ceea513c00966c58b8bdb095c8fLarry Finger	u32 start_time = jiffies;
10735adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("===>  rtw_ips_pwr_up..............\n");
10745adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_reset_drv_sw(padapter);
10755adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10765adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	result = ips_netdrv_open(padapter);
10775adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10785adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_led_control(padapter, LED_CTL_NO_LINK);
10795adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10805adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("<===  rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time));
10815adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return result;
10825adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
10835adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10845adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_ips_pwr_down(struct adapter *padapter)
10855adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
1086c01fb49636b65ceea513c00966c58b8bdb095c8fLarry Finger	u32 start_time = jiffies;
10875adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("===> rtw_ips_pwr_down...................\n");
10885adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10895adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->net_closed = true;
10905adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10915adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_led_control(padapter, LED_CTL_POWER_OFF);
10925adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10935adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_ips_dev_unload(padapter);
10945adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));
10955adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
10965adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
10975adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingervoid rtw_ips_dev_unload(struct adapter *padapter)
10985adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
10995adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("====> %s...\n", __func__);
11005adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11015adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, NULL);
11025adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11035adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->intf_stop)
11045adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		padapter->intf_stop(padapter);
11055adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11065adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	/* s5. */
11075adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (!padapter->bSurpriseRemoved)
11085adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_hal_deinit(padapter);
11095adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
11105adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11115adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint pm_netdev_open(struct net_device *pnetdev, u8 bnormal)
11125adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
11135adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	int status;
11145adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11155adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (bnormal)
11165adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		status = netdev_open(pnetdev);
11175adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	else
11185adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		status =  (_SUCCESS == ips_netdrv_open((struct adapter *)rtw_netdev_priv(pnetdev))) ? (0) : (-1);
11195adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return status;
11205adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
11215adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11225adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Fingerint netdev_close(struct net_device *pnetdev)
11235adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger{
11245adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
1125d6c28c23f89b00a01b34670f0f1ddcdc2e0bca67navin patidar	struct hal_data_8188e *rtlhal = GET_HAL_DATA(padapter);
11265adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11275adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - drv_close\n"));
11285adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11295adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->pwrctrlpriv.bInternalAutoSuspend) {
11305adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (padapter->pwrctrlpriv.rf_pwrstate == rf_off)
11315adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			padapter->pwrctrlpriv.ps_flag = true;
11325adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
11335adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	padapter->net_closed = true;
11345adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11355adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) {
11365adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		DBG_88E("(2)88eu_drv - drv_close, bup =%d, hw_init_completed =%d\n",
11375adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			padapter->bup, padapter->hw_init_completed);
11385adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11395adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/* s1. */
11405adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		if (pnetdev) {
11415adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger			if (!rtw_netif_queue_stopped(pnetdev))
1142945c097243b85001bd1c3c90a41e92bce623daf5navin patidar				netif_tx_stop_all_queues(pnetdev);
11435adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		}
11445adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
11455adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/* s2. */
11465adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		LeaveAllPowerSaveMode(padapter);
11475adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_disassoc_cmd(padapter, 500, false);
11485adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/* s2-2.  indicate disconnect to os */
11495adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_indicate_disconnect(padapter);
11505adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/* s2-3. */
11515adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_free_assoc_resources(padapter, 1);
11525adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/* s2-4. */
11535adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_free_network_queue(padapter, true);
11545adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		/*  Close LED */
11555adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger		rtw_led_control(padapter, LED_CTL_POWER_OFF);
11565adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	}
11575adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger
1158d6c28c23f89b00a01b34670f0f1ddcdc2e0bca67navin patidar	kfree(rtlhal->pfirmware);
1159d6c28c23f89b00a01b34670f0f1ddcdc2e0bca67navin patidar	rtlhal->pfirmware = NULL;
116060800abdc147ba034204408cc4745d66e1ffbb8eStas Sergeev
11615adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - drv_close\n"));
11625adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup);
11635adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger	return 0;
11645adef66acf73705ae95ea0b1e6b5fc7f17d82d30Larry Finger}
1165