linux/drivers/staging/rtl8188eu/os_dep/os_intfs.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17 *
  18 *
  19 ******************************************************************************/
  20#define _OS_INTFS_C_
  21
  22#include <osdep_service.h>
  23#include <drv_types.h>
  24#include <xmit_osdep.h>
  25#include <recv_osdep.h>
  26#include <hal_intf.h>
  27#include <rtw_ioctl.h>
  28#include <rtw_version.h>
  29
  30#include <usb_osintf.h>
  31#include <usb_hal.h>
  32#include <rtw_br_ext.h>
  33
  34MODULE_LICENSE("GPL");
  35MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
  36MODULE_AUTHOR("Realtek Semiconductor Corp.");
  37MODULE_VERSION(DRIVERVERSION);
  38
  39#define CONFIG_BR_EXT_BRNAME "br0"
  40#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
  41
  42/* module param defaults */
  43static int rtw_chip_version = 0x00;
  44static int rtw_rfintfs = HWPI;
  45static int rtw_lbkmode;/* RTL8712_AIR_TRX; */
  46static int rtw_network_mode = Ndis802_11IBSS;/* Ndis802_11Infrastructure; infra, ad-hoc, auto */
  47static int rtw_channel = 1;/* ad-hoc support requirement */
  48static int rtw_wireless_mode = WIRELESS_11BG_24N;
  49static int rtw_vrtl_carrier_sense = AUTO_VCS;
  50static int rtw_vcs_type = RTS_CTS;/*  */
  51static int rtw_rts_thresh = 2347;/*  */
  52static int rtw_frag_thresh = 2346;/*  */
  53static int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */
  54static int rtw_scan_mode = 1;/* active, passive */
  55static int rtw_adhoc_tx_pwr = 1;
  56static int rtw_soft_ap;
  57static int rtw_power_mgnt = 1;
  58static int rtw_ips_mode = IPS_NORMAL;
  59
  60static int rtw_smart_ps = 2;
  61
  62module_param(rtw_ips_mode, int, 0644);
  63MODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode");
  64
  65static int rtw_debug = 1;
  66static int rtw_radio_enable = 1;
  67static int rtw_long_retry_lmt = 7;
  68static int rtw_short_retry_lmt = 7;
  69static int rtw_busy_thresh = 40;
  70static int rtw_ack_policy = NORMAL_ACK;
  71
  72static int rtw_mp_mode;
  73
  74static int rtw_software_encrypt;
  75static int rtw_software_decrypt;
  76
  77static int rtw_acm_method;/*  0:By SW 1:By HW. */
  78
  79static int rtw_wmm_enable = 1;/*  default is set to enable the wmm. */
  80static int rtw_uapsd_enable;
  81static int rtw_uapsd_max_sp = NO_LIMIT;
  82static int rtw_uapsd_acbk_en;
  83static int rtw_uapsd_acbe_en;
  84static int rtw_uapsd_acvi_en;
  85static int rtw_uapsd_acvo_en;
  86
  87int rtw_ht_enable = 1;
  88int rtw_cbw40_enable = 3; /*  0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
  89int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
  90static 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 */
  91static int rtw_ampdu_amsdu;/*  0: disabled, 1:enabled, 2:auto */
  92
  93static int rtw_lowrate_two_xmit = 1;/* Use 2 path Tx to transmit MCS0~7 and legacy mode */
  94
  95static int rtw_rf_config = RF_819X_MAX_TYPE;  /* auto */
  96static int rtw_low_power;
  97static int rtw_wifi_spec;
  98static int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX;
  99static int rtw_AcceptAddbaReq = true;/*  0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */
 100
 101static int rtw_antdiv_cfg = 2; /*  0:OFF , 1:ON, 2:decide by Efuse config */
 102static 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) */
 103
 104static int rtw_enusbss;/* 0:disable, 1:enable */
 105
 106static int rtw_hwpdn_mode = 2;/* 0:disable, 1:enable, 2: by EFUSE config */
 107
 108static int rtw_hwpwrp_detect; /* HW power  ping detect 0:disable , 1:enable */
 109
 110static int rtw_hw_wps_pbc = 1;
 111
 112int rtw_mc2u_disable;
 113
 114static int rtw_80211d;
 115
 116static char *ifname = "wlan%d";
 117module_param(ifname, charp, 0644);
 118MODULE_PARM_DESC(ifname, "The default name to allocate for first interface");
 119
 120static char *if2name = "wlan%d";
 121module_param(if2name, charp, 0644);
 122MODULE_PARM_DESC(if2name, "The default name to allocate for second interface");
 123
 124char *rtw_initmac;  /*  temp mac address if users want to use instead of the mac address in Efuse */
 125
 126module_param(rtw_initmac, charp, 0644);
 127module_param(rtw_channel_plan, int, 0644);
 128module_param(rtw_chip_version, int, 0644);
 129module_param(rtw_rfintfs, int, 0644);
 130module_param(rtw_lbkmode, int, 0644);
 131module_param(rtw_network_mode, int, 0644);
 132module_param(rtw_channel, int, 0644);
 133module_param(rtw_mp_mode, int, 0644);
 134module_param(rtw_wmm_enable, int, 0644);
 135module_param(rtw_vrtl_carrier_sense, int, 0644);
 136module_param(rtw_vcs_type, int, 0644);
 137module_param(rtw_busy_thresh, int, 0644);
 138module_param(rtw_ht_enable, int, 0644);
 139module_param(rtw_cbw40_enable, int, 0644);
 140module_param(rtw_ampdu_enable, int, 0644);
 141module_param(rtw_rx_stbc, int, 0644);
 142module_param(rtw_ampdu_amsdu, int, 0644);
 143module_param(rtw_lowrate_two_xmit, int, 0644);
 144module_param(rtw_rf_config, int, 0644);
 145module_param(rtw_power_mgnt, int, 0644);
 146module_param(rtw_smart_ps, int, 0644);
 147module_param(rtw_low_power, int, 0644);
 148module_param(rtw_wifi_spec, int, 0644);
 149module_param(rtw_antdiv_cfg, int, 0644);
 150module_param(rtw_antdiv_type, int, 0644);
 151module_param(rtw_enusbss, int, 0644);
 152module_param(rtw_hwpdn_mode, int, 0644);
 153module_param(rtw_hwpwrp_detect, int, 0644);
 154module_param(rtw_hw_wps_pbc, int, 0644);
 155
 156static uint rtw_max_roaming_times = 2;
 157module_param(rtw_max_roaming_times, uint, 0644);
 158MODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try");
 159
 160static int rtw_fw_iol = 1;/*  0:Disable, 1:enable, 2:by usb speed */
 161module_param(rtw_fw_iol, int, 0644);
 162MODULE_PARM_DESC(rtw_fw_iol, "FW IOL");
 163
 164module_param(rtw_mc2u_disable, int, 0644);
 165
 166module_param(rtw_80211d, int, 0644);
 167MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism");
 168
 169static uint rtw_notch_filter = RTW_NOTCH_FILTER;
 170module_param(rtw_notch_filter, uint, 0644);
 171MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
 172module_param_named(debug, rtw_debug, int, 0444);
 173MODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)");
 174
 175/* dummy routines */
 176void rtw_proc_remove_one(struct net_device *dev)
 177{
 178}
 179
 180void rtw_proc_init_one(struct net_device *dev)
 181{
 182}
 183
 184#if 0   /* TODO: Convert these to /sys */
 185void rtw_proc_init_one(struct net_device *dev)
 186{
 187        struct proc_dir_entry *dir_dev = NULL;
 188        struct proc_dir_entry *entry = NULL;
 189        struct adapter  *padapter = rtw_netdev_priv(dev);
 190        u8 rf_type;
 191
 192        if (rtw_proc == NULL) {
 193                memcpy(rtw_proc_name, DRV_NAME, sizeof(DRV_NAME));
 194
 195                rtw_proc = create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net);
 196                if (rtw_proc == NULL) {
 197                        DBG_88E(KERN_ERR "Unable to create rtw_proc directory\n");
 198                        return;
 199                }
 200
 201                entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev);
 202                if (!entry) {
 203                        pr_info("Unable to create_proc_read_entry!\n");
 204                        return;
 205                }
 206        }
 207
 208        if (padapter->dir_dev == NULL) {
 209                padapter->dir_dev = create_proc_entry(dev->name,
 210                                          S_IFDIR | S_IRUGO | S_IXUGO,
 211                                          rtw_proc);
 212                dir_dev = padapter->dir_dev;
 213                if (dir_dev == NULL) {
 214                        if (rtw_proc_cnt == 0) {
 215                                if (rtw_proc) {
 216                                        remove_proc_entry(rtw_proc_name, init_net.proc_net);
 217                                        rtw_proc = NULL;
 218                                }
 219                        }
 220
 221                        pr_info("Unable to create dir_dev directory\n");
 222                        return;
 223                }
 224        } else {
 225                return;
 226        }
 227
 228        rtw_proc_cnt++;
 229
 230        entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO,
 231                                   dir_dev, proc_get_write_reg, dev);
 232        if (!entry) {
 233                pr_info("Unable to create_proc_read_entry!\n");
 234                return;
 235        }
 236        entry->write_proc = proc_set_write_reg;
 237
 238        entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO,
 239                                   dir_dev, proc_get_read_reg, dev);
 240        if (!entry) {
 241                pr_info("Unable to create_proc_read_entry!\n");
 242                return;
 243        }
 244        entry->write_proc = proc_set_read_reg;
 245
 246
 247        entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO,
 248                                   dir_dev, proc_get_fwstate, dev);
 249        if (!entry) {
 250                pr_info("Unable to create_proc_read_entry!\n");
 251                return;
 252        }
 253
 254        entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO,
 255                                   dir_dev, proc_get_sec_info, dev);
 256        if (!entry) {
 257                pr_info("Unable to create_proc_read_entry!\n");
 258                return;
 259        }
 260
 261        entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO,
 262                                   dir_dev, proc_get_mlmext_state, dev);
 263        if (!entry) {
 264                pr_info("Unable to create_proc_read_entry!\n");
 265                return;
 266        }
 267
 268        entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO,
 269                                   dir_dev, proc_get_qos_option, dev);
 270        if (!entry) {
 271                pr_info("Unable to create_proc_read_entry!\n");
 272                return;
 273        }
 274
 275        entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO,
 276                                   dir_dev, proc_get_ht_option, dev);
 277        if (!entry) {
 278                pr_info("Unable to create_proc_read_entry!\n");
 279                return;
 280        }
 281
 282        entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO,
 283                                   dir_dev, proc_get_rf_info, dev);
 284        if (!entry) {
 285                pr_info("Unable to create_proc_read_entry!\n");
 286                return;
 287        }
 288
 289        entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO,
 290                                   dir_dev, proc_get_ap_info, dev);
 291        if (!entry) {
 292                pr_info("Unable to create_proc_read_entry!\n");
 293                return;
 294        }
 295
 296        entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO,
 297                                   dir_dev, proc_getstruct adapter_state, dev);
 298        if (!entry) {
 299                pr_info("Unable to create_proc_read_entry!\n");
 300                return;
 301        }
 302
 303        entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO,
 304                                   dir_dev, proc_get_trx_info, dev);
 305        if (!entry) {
 306                pr_info("Unable to create_proc_read_entry!\n");
 307                return;
 308        }
 309
 310        entry = create_proc_read_entry("mac_reg_dump1", S_IFREG | S_IRUGO,
 311                                   dir_dev, proc_get_mac_reg_dump1, dev);
 312        if (!entry) {
 313                pr_info("Unable to create_proc_read_entry!\n");
 314                return;
 315        }
 316
 317        entry = create_proc_read_entry("mac_reg_dump2", S_IFREG | S_IRUGO,
 318                                   dir_dev, proc_get_mac_reg_dump2, dev);
 319        if (!entry) {
 320                pr_info("Unable to create_proc_read_entry!\n");
 321                return;
 322        }
 323
 324        entry = create_proc_read_entry("mac_reg_dump3", S_IFREG | S_IRUGO,
 325                                   dir_dev, proc_get_mac_reg_dump3, dev);
 326        if (!entry) {
 327                pr_info("Unable to create_proc_read_entry!\n");
 328                return;
 329        }
 330
 331        entry = create_proc_read_entry("bb_reg_dump1", S_IFREG | S_IRUGO,
 332                                   dir_dev, proc_get_bb_reg_dump1, dev);
 333        if (!entry) {
 334                pr_info("Unable to create_proc_read_entry!\n");
 335                return;
 336        }
 337
 338        entry = create_proc_read_entry("bb_reg_dump2", S_IFREG | S_IRUGO,
 339                                   dir_dev, proc_get_bb_reg_dump2, dev);
 340        if (!entry) {
 341                pr_info("Unable to create_proc_read_entry!\n");
 342                return;
 343        }
 344
 345        entry = create_proc_read_entry("bb_reg_dump3", S_IFREG | S_IRUGO,
 346                                   dir_dev, proc_get_bb_reg_dump3, dev);
 347        if (!entry) {
 348                pr_info("Unable to create_proc_read_entry!\n");
 349                return;
 350        }
 351
 352        entry = create_proc_read_entry("rf_reg_dump1", S_IFREG | S_IRUGO,
 353                                   dir_dev, proc_get_rf_reg_dump1, dev);
 354        if (!entry) {
 355                pr_info("Unable to create_proc_read_entry!\n");
 356                return;
 357        }
 358
 359        entry = create_proc_read_entry("rf_reg_dump2", S_IFREG | S_IRUGO,
 360                                   dir_dev, proc_get_rf_reg_dump2, dev);
 361        if (!entry) {
 362                pr_info("Unable to create_proc_read_entry!\n");
 363                return;
 364        }
 365
 366        rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 367        if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) {
 368                entry = create_proc_read_entry("rf_reg_dump3", S_IFREG | S_IRUGO,
 369                                           dir_dev, proc_get_rf_reg_dump3, dev);
 370                if (!entry) {
 371                        pr_info("Unable to create_proc_read_entry!\n");
 372                        return;
 373                }
 374
 375                entry = create_proc_read_entry("rf_reg_dump4", S_IFREG | S_IRUGO,
 376                                           dir_dev, proc_get_rf_reg_dump4, dev);
 377                if (!entry) {
 378                        pr_info("Unable to create_proc_read_entry!\n");
 379                        return;
 380                }
 381        }
 382
 383#ifdef CONFIG_88EU_AP_MODE
 384
 385        entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO,
 386                                   dir_dev, proc_get_all_sta_info, dev);
 387        if (!entry) {
 388                pr_info("Unable to create_proc_read_entry!\n");
 389                return;
 390        }
 391#endif
 392
 393        entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO,
 394                                   dir_dev, proc_get_best_channel, dev);
 395        if (!entry) {
 396                pr_info("Unable to create_proc_read_entry!\n");
 397                return;
 398        }
 399
 400        entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO,
 401                                   dir_dev, proc_get_rx_signal, dev);
 402        if (!entry) {
 403                pr_info("Unable to create_proc_read_entry!\n");
 404                return;
 405        }
 406        entry->write_proc = proc_set_rx_signal;
 407        entry = create_proc_read_entry("ht_enable", S_IFREG | S_IRUGO,
 408                                   dir_dev, proc_get_ht_enable, dev);
 409        if (!entry) {
 410                pr_info("Unable to create_proc_read_entry!\n");
 411                return;
 412        }
 413        entry->write_proc = proc_set_ht_enable;
 414
 415        entry = create_proc_read_entry("cbw40_enable", S_IFREG | S_IRUGO,
 416                                   dir_dev, proc_get_cbw40_enable, dev);
 417        if (!entry) {
 418                pr_info("Unable to create_proc_read_entry!\n");
 419                return;
 420        }
 421        entry->write_proc = proc_set_cbw40_enable;
 422
 423        entry = create_proc_read_entry("ampdu_enable", S_IFREG | S_IRUGO,
 424                                   dir_dev, proc_get_ampdu_enable, dev);
 425        if (!entry) {
 426                pr_info("Unable to create_proc_read_entry!\n");
 427                return;
 428        }
 429        entry->write_proc = proc_set_ampdu_enable;
 430
 431        entry = create_proc_read_entry("rx_stbc", S_IFREG | S_IRUGO,
 432                                   dir_dev, proc_get_rx_stbc, dev);
 433        if (!entry) {
 434                pr_info("Unable to create_proc_read_entry!\n");
 435                return;
 436        }
 437        entry->write_proc = proc_set_rx_stbc;
 438
 439        entry = create_proc_read_entry("path_rssi", S_IFREG | S_IRUGO,
 440                                        dir_dev, proc_get_two_path_rssi, dev);
 441        if (!entry) {
 442                pr_info("Unable to create_proc_read_entry!\n");
 443                return;
 444        }
 445        entry = create_proc_read_entry("rssi_disp", S_IFREG | S_IRUGO,
 446                                   dir_dev, proc_get_rssi_disp, dev);
 447        if (!entry) {
 448                pr_info("Unable to create_proc_read_entry!\n");
 449                return;
 450        }
 451        entry->write_proc = proc_set_rssi_disp;
 452}
 453
 454void rtw_proc_remove_one(struct net_device *dev)
 455{
 456        struct proc_dir_entry *dir_dev = NULL;
 457        struct adapter  *padapter = rtw_netdev_priv(dev);
 458        u8 rf_type;
 459
 460        dir_dev = padapter->dir_dev;
 461        padapter->dir_dev = NULL;
 462
 463        if (dir_dev) {
 464                remove_proc_entry("write_reg", dir_dev);
 465                remove_proc_entry("read_reg", dir_dev);
 466                remove_proc_entry("fwstate", dir_dev);
 467                remove_proc_entry("sec_info", dir_dev);
 468                remove_proc_entry("mlmext_state", dir_dev);
 469                remove_proc_entry("qos_option", dir_dev);
 470                remove_proc_entry("ht_option", dir_dev);
 471                remove_proc_entry("rf_info", dir_dev);
 472                remove_proc_entry("ap_info", dir_dev);
 473                remove_proc_entry("adapter_state", dir_dev);
 474                remove_proc_entry("trx_info", dir_dev);
 475                remove_proc_entry("mac_reg_dump1", dir_dev);
 476                remove_proc_entry("mac_reg_dump2", dir_dev);
 477                remove_proc_entry("mac_reg_dump3", dir_dev);
 478                remove_proc_entry("bb_reg_dump1", dir_dev);
 479                remove_proc_entry("bb_reg_dump2", dir_dev);
 480                remove_proc_entry("bb_reg_dump3", dir_dev);
 481                remove_proc_entry("rf_reg_dump1", dir_dev);
 482                remove_proc_entry("rf_reg_dump2", dir_dev);
 483                rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 484                if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) {
 485                        remove_proc_entry("rf_reg_dump3", dir_dev);
 486                        remove_proc_entry("rf_reg_dump4", dir_dev);
 487                }
 488#ifdef CONFIG_88EU_AP_MODE
 489                remove_proc_entry("all_sta_info", dir_dev);
 490#endif
 491
 492                remove_proc_entry("best_channel", dir_dev);
 493                remove_proc_entry("rx_signal", dir_dev);
 494                remove_proc_entry("cbw40_enable", dir_dev);
 495                remove_proc_entry("ht_enable", dir_dev);
 496                remove_proc_entry("ampdu_enable", dir_dev);
 497                remove_proc_entry("rx_stbc", dir_dev);
 498                remove_proc_entry("path_rssi", dir_dev);
 499                remove_proc_entry("rssi_disp", dir_dev);
 500                remove_proc_entry(dev->name, rtw_proc);
 501                dir_dev = NULL;
 502        } else {
 503                return;
 504        }
 505        rtw_proc_cnt--;
 506
 507        if (rtw_proc_cnt == 0) {
 508                if (rtw_proc) {
 509                        remove_proc_entry("ver_info", rtw_proc);
 510
 511                        remove_proc_entry(rtw_proc_name, init_net.proc_net);
 512                        rtw_proc = NULL;
 513                }
 514        }
 515}
 516#endif
 517
 518static uint loadparam(struct adapter *padapter,  struct  net_device *pnetdev)
 519{
 520        uint status = _SUCCESS;
 521        struct registry_priv  *registry_par = &padapter->registrypriv;
 522
 523
 524        GlobalDebugLevel = rtw_debug;
 525        registry_par->chip_version = (u8)rtw_chip_version;
 526        registry_par->rfintfs = (u8)rtw_rfintfs;
 527        registry_par->lbkmode = (u8)rtw_lbkmode;
 528        registry_par->network_mode  = (u8)rtw_network_mode;
 529
 530        memcpy(registry_par->ssid.Ssid, "ANY", 3);
 531        registry_par->ssid.SsidLength = 3;
 532
 533        registry_par->channel = (u8)rtw_channel;
 534        registry_par->wireless_mode = (u8)rtw_wireless_mode;
 535        registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;
 536        registry_par->vcs_type = (u8)rtw_vcs_type;
 537        registry_par->rts_thresh = (u16)rtw_rts_thresh;
 538        registry_par->frag_thresh = (u16)rtw_frag_thresh;
 539        registry_par->preamble = (u8)rtw_preamble;
 540        registry_par->scan_mode = (u8)rtw_scan_mode;
 541        registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr;
 542        registry_par->soft_ap =  (u8)rtw_soft_ap;
 543        registry_par->smart_ps =  (u8)rtw_smart_ps;
 544        registry_par->power_mgnt = (u8)rtw_power_mgnt;
 545        registry_par->ips_mode = (u8)rtw_ips_mode;
 546        registry_par->radio_enable = (u8)rtw_radio_enable;
 547        registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;
 548        registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;
 549        registry_par->busy_thresh = (u16)rtw_busy_thresh;
 550        registry_par->ack_policy = (u8)rtw_ack_policy;
 551        registry_par->mp_mode = (u8)rtw_mp_mode;
 552        registry_par->software_encrypt = (u8)rtw_software_encrypt;
 553        registry_par->software_decrypt = (u8)rtw_software_decrypt;
 554        registry_par->acm_method = (u8)rtw_acm_method;
 555
 556         /* UAPSD */
 557        registry_par->wmm_enable = (u8)rtw_wmm_enable;
 558        registry_par->uapsd_enable = (u8)rtw_uapsd_enable;
 559        registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp;
 560        registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en;
 561        registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en;
 562        registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en;
 563        registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en;
 564
 565        registry_par->ht_enable = (u8)rtw_ht_enable;
 566        registry_par->cbw40_enable = (u8)rtw_cbw40_enable;
 567        registry_par->ampdu_enable = (u8)rtw_ampdu_enable;
 568        registry_par->rx_stbc = (u8)rtw_rx_stbc;
 569        registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;
 570        registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;
 571        registry_par->rf_config = (u8)rtw_rf_config;
 572        registry_par->low_power = (u8)rtw_low_power;
 573        registry_par->wifi_spec = (u8)rtw_wifi_spec;
 574        registry_par->channel_plan = (u8)rtw_channel_plan;
 575        registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;
 576        registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;
 577        registry_par->antdiv_type = (u8)rtw_antdiv_type;
 578        registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable, 1:enable, 2:by EFUSE config */
 579        registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable, 1:enable */
 580        registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;
 581
 582        registry_par->max_roaming_times = (u8)rtw_max_roaming_times;
 583
 584        registry_par->fw_iol = rtw_fw_iol;
 585
 586        registry_par->enable80211d = (u8)rtw_80211d;
 587        snprintf(registry_par->ifname, 16, "%s", ifname);
 588        snprintf(registry_par->if2name, 16, "%s", if2name);
 589        registry_par->notch_filter = (u8)rtw_notch_filter;
 590        return status;
 591}
 592
 593static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p)
 594{
 595        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
 596        struct sockaddr *addr = p;
 597
 598        if (!padapter->bup)
 599                memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN);
 600
 601        return 0;
 602}
 603
 604static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)
 605{
 606        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
 607        struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
 608        struct recv_priv *precvpriv = &(padapter->recvpriv);
 609
 610        padapter->stats.tx_packets = pxmitpriv->tx_pkts;/* pxmitpriv->tx_pkts++; */
 611        padapter->stats.rx_packets = precvpriv->rx_pkts;/* precvpriv->rx_pkts++; */
 612        padapter->stats.tx_dropped = pxmitpriv->tx_drop;
 613        padapter->stats.rx_dropped = precvpriv->rx_drop;
 614        padapter->stats.tx_bytes = pxmitpriv->tx_bytes;
 615        padapter->stats.rx_bytes = precvpriv->rx_bytes;
 616        return &padapter->stats;
 617}
 618
 619/*
 620 * AC to queue mapping
 621 *
 622 * AC_VO -> queue 0
 623 * AC_VI -> queue 1
 624 * AC_BE -> queue 2
 625 * AC_BK -> queue 3
 626 */
 627static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };
 628
 629/* Given a data frame determine the 802.1p/1d tag to use. */
 630static unsigned int rtw_classify8021d(struct sk_buff *skb)
 631{
 632        unsigned int dscp;
 633
 634        /* skb->priority values from 256->263 are magic values to
 635         * directly indicate a specific 802.1d priority.  This is used
 636         * to allow 802.1d priority to be passed directly in from VLAN
 637         * tags, etc.
 638         */
 639        if (skb->priority >= 256 && skb->priority <= 263)
 640                return skb->priority - 256;
 641
 642        switch (skb->protocol) {
 643        case htons(ETH_P_IP):
 644                dscp = ip_hdr(skb)->tos & 0xfc;
 645                break;
 646        default:
 647                return 0;
 648        }
 649
 650        return dscp >> 5;
 651}
 652
 653static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb,
 654                            void *accel_priv, select_queue_fallback_t fallback)
 655{
 656        struct adapter  *padapter = rtw_netdev_priv(dev);
 657        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 658
 659        skb->priority = rtw_classify8021d(skb);
 660
 661        if (pmlmepriv->acm_mask != 0)
 662                skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);
 663
 664        return rtw_1d_to_queue[skb->priority];
 665}
 666
 667u16 rtw_recv_select_queue(struct sk_buff *skb)
 668{
 669        struct iphdr *piphdr;
 670        unsigned int dscp;
 671        __be16  eth_type;
 672        u32 priority;
 673        u8 *pdata = skb->data;
 674
 675        memcpy(&eth_type, pdata+(ETH_ALEN<<1), 2);
 676
 677        switch (eth_type) {
 678        case htons(ETH_P_IP):
 679                piphdr = (struct iphdr *)(pdata+ETH_HLEN);
 680                dscp = piphdr->tos & 0xfc;
 681                priority = dscp >> 5;
 682                break;
 683        default:
 684                priority = 0;
 685        }
 686
 687        return rtw_1d_to_queue[priority];
 688}
 689
 690static const struct net_device_ops rtw_netdev_ops = {
 691        .ndo_open = netdev_open,
 692        .ndo_stop = netdev_close,
 693        .ndo_start_xmit = rtw_xmit_entry,
 694        .ndo_select_queue       = rtw_select_queue,
 695        .ndo_set_mac_address = rtw_net_set_mac_address,
 696        .ndo_get_stats = rtw_net_get_stats,
 697        .ndo_do_ioctl = rtw_ioctl,
 698};
 699
 700int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
 701{
 702        if (dev_alloc_name(pnetdev, ifname) < 0)
 703                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("dev_alloc_name, fail!\n"));
 704
 705        netif_carrier_off(pnetdev);
 706        return 0;
 707}
 708
 709static const struct device_type wlan_type = {
 710        .name = "wlan",
 711};
 712
 713struct net_device *rtw_init_netdev(struct adapter *old_padapter)
 714{
 715        struct adapter *padapter;
 716        struct net_device *pnetdev;
 717
 718        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+init_net_dev\n"));
 719
 720        if (old_padapter != NULL)
 721                pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(struct adapter), (void *)old_padapter);
 722        else
 723                pnetdev = rtw_alloc_etherdev(sizeof(struct adapter));
 724
 725        if (!pnetdev)
 726                return NULL;
 727
 728        pnetdev->dev.type = &wlan_type;
 729        padapter = rtw_netdev_priv(pnetdev);
 730        padapter->pnetdev = pnetdev;
 731        DBG_88E("register rtw_netdev_ops to netdev_ops\n");
 732        pnetdev->netdev_ops = &rtw_netdev_ops;
 733        pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */
 734        pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;
 735
 736        /* step 2. */
 737        loadparam(padapter, pnetdev);
 738
 739        return pnetdev;
 740}
 741
 742u32 rtw_start_drv_threads(struct adapter *padapter)
 743{
 744        u32 _status = _SUCCESS;
 745
 746        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_start_drv_threads\n"));
 747
 748        padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD");
 749        if (IS_ERR(padapter->cmdThread))
 750                _status = _FAIL;
 751        else
 752                _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); /* wait for cmd_thread to run */
 753
 754        rtw_hal_start_thread(padapter);
 755        return _status;
 756}
 757
 758void rtw_stop_drv_threads(struct adapter *padapter)
 759{
 760        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_stop_drv_threads\n"));
 761
 762        /* Below is to termindate rtw_cmd_thread & event_thread... */
 763        up(&padapter->cmdpriv.cmd_queue_sema);
 764        if (padapter->cmdThread)
 765                _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema);
 766
 767        rtw_hal_stop_thread(padapter);
 768}
 769
 770static u8 rtw_init_default_value(struct adapter *padapter)
 771{
 772        u8 ret  = _SUCCESS;
 773        struct registry_priv *pregistrypriv = &padapter->registrypriv;
 774        struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
 775        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 776        struct security_priv *psecuritypriv = &padapter->securitypriv;
 777
 778        /* xmit_priv */
 779        pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
 780        pxmitpriv->vcs = pregistrypriv->vcs_type;
 781        pxmitpriv->vcs_type = pregistrypriv->vcs_type;
 782        pxmitpriv->frag_len = pregistrypriv->frag_thresh;
 783
 784        /* mlme_priv */
 785        pmlmepriv->scan_interval = SCAN_INTERVAL;/*  30*2 sec = 60sec */
 786        pmlmepriv->scan_mode = SCAN_ACTIVE;
 787
 788        /* ht_priv */
 789        pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */
 790
 791        /* security_priv */
 792        psecuritypriv->binstallGrpkey = _FAIL;
 793        psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt;
 794        psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt;
 795        psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */
 796        psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
 797        psecuritypriv->dot11PrivacyKeyIndex = 0;
 798        psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
 799        psecuritypriv->dot118021XGrpKeyid = 1;
 800        psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
 801        psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;
 802
 803        /* registry_priv */
 804        rtw_init_registrypriv_dev_network(padapter);
 805        rtw_update_registrypriv_dev_network(padapter);
 806
 807        /* hal_priv */
 808        rtw_hal_def_value_init(padapter);
 809
 810        /* misc. */
 811        padapter->bReadPortCancel = false;
 812        padapter->bWritePortCancel = false;
 813        padapter->bRxRSSIDisplay = 0;
 814        padapter->bNotifyChannelChange = 0;
 815#ifdef CONFIG_88EU_P2P
 816        padapter->bShowGetP2PState = 1;
 817#endif
 818        return ret;
 819}
 820
 821u8 rtw_reset_drv_sw(struct adapter *padapter)
 822{
 823        u8      ret8 = _SUCCESS;
 824        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 825        struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
 826
 827        /* hal_priv */
 828        rtw_hal_def_value_init(padapter);
 829        padapter->bReadPortCancel = false;
 830        padapter->bWritePortCancel = false;
 831        padapter->bRxRSSIDisplay = 0;
 832        pmlmepriv->scan_interval = SCAN_INTERVAL;/*  30*2 sec = 60sec */
 833
 834        padapter->xmitpriv.tx_pkts = 0;
 835        padapter->recvpriv.rx_pkts = 0;
 836
 837        pmlmepriv->LinkDetectInfo.bBusyTraffic = false;
 838
 839        _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING);
 840
 841        rtw_hal_sreset_reset_value(padapter);
 842        pwrctrlpriv->pwr_state_check_cnts = 0;
 843
 844        /* mlmeextpriv */
 845        padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE;
 846
 847        rtw_set_signal_stat_timer(&padapter->recvpriv);
 848
 849        return ret8;
 850}
 851
 852u8 rtw_init_drv_sw(struct adapter *padapter)
 853{
 854        u8      ret8 = _SUCCESS;
 855
 856
 857        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_init_drv_sw\n"));
 858
 859        if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) {
 860                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init cmd_priv\n"));
 861                ret8 = _FAIL;
 862                goto exit;
 863        }
 864
 865        padapter->cmdpriv.padapter = padapter;
 866
 867        if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) {
 868                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init evt_priv\n"));
 869                ret8 = _FAIL;
 870                goto exit;
 871        }
 872
 873        if (rtw_init_mlme_priv(padapter) == _FAIL) {
 874                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_priv\n"));
 875                ret8 = _FAIL;
 876                goto exit;
 877        }
 878
 879#ifdef CONFIG_88EU_P2P
 880        rtw_init_wifidirect_timers(padapter);
 881        init_wifidirect_info(padapter, P2P_ROLE_DISABLE);
 882        reset_global_wifidirect_info(padapter);
 883#endif /* CONFIG_88EU_P2P */
 884
 885        if (init_mlme_ext_priv(padapter) == _FAIL) {
 886                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("\n Can't init mlme_ext_priv\n"));
 887                ret8 = _FAIL;
 888                goto exit;
 889        }
 890
 891        if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) {
 892                DBG_88E("Can't _rtw_init_xmit_priv\n");
 893                ret8 = _FAIL;
 894                goto exit;
 895        }
 896
 897        if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) {
 898                DBG_88E("Can't _rtw_init_recv_priv\n");
 899                ret8 = _FAIL;
 900                goto exit;
 901        }
 902
 903        if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) {
 904                DBG_88E("Can't _rtw_init_sta_priv\n");
 905                ret8 = _FAIL;
 906                goto exit;
 907        }
 908
 909        padapter->stapriv.padapter = padapter;
 910
 911        rtw_init_bcmc_stainfo(padapter);
 912
 913        rtw_init_pwrctrl_priv(padapter);
 914
 915        if (init_mp_priv(padapter) == _FAIL)
 916                DBG_88E("%s: initialize MP private data Fail!\n", __func__);
 917
 918        ret8 = rtw_init_default_value(padapter);
 919
 920        rtw_hal_dm_init(padapter);
 921        rtw_hal_sw_led_init(padapter);
 922
 923        rtw_hal_sreset_init(padapter);
 924
 925        spin_lock_init(&padapter->br_ext_lock);
 926
 927exit:
 928        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_init_drv_sw\n"));
 929
 930
 931        return ret8;
 932}
 933
 934void rtw_cancel_all_timer(struct adapter *padapter)
 935{
 936        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+rtw_cancel_all_timer\n"));
 937
 938        _cancel_timer_ex(&padapter->mlmepriv.assoc_timer);
 939        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel association timer complete!\n"));
 940
 941        _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);
 942        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel scan_to_timer!\n"));
 943
 944        _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer);
 945        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel dynamic_chk_timer!\n"));
 946
 947        /*  cancel sw led timer */
 948        rtw_hal_sw_led_deinit(padapter);
 949        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("rtw_cancel_all_timer:cancel DeInitSwLeds!\n"));
 950
 951        _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer);
 952
 953        _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);
 954        /* cancel dm timer */
 955        rtw_hal_dm_deinit(padapter);
 956}
 957
 958u8 rtw_free_drv_sw(struct adapter *padapter)
 959{
 960        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw"));
 961
 962        /* we can call rtw_p2p_enable here, but: */
 963        /*  1. rtw_p2p_enable may have IO operation */
 964        /*  2. rtw_p2p_enable is bundled with wext interface */
 965        #ifdef CONFIG_88EU_P2P
 966        {
 967                struct wifidirect_info *pwdinfo = &padapter->wdinfo;
 968                if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
 969                        _cancel_timer_ex(&pwdinfo->find_phase_timer);
 970                        _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer);
 971                        _cancel_timer_ex(&pwdinfo->pre_tx_scan_timer);
 972                        rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
 973                }
 974        }
 975        #endif
 976
 977        free_mlme_ext_priv(&padapter->mlmeextpriv);
 978
 979        rtw_free_cmd_priv(&padapter->cmdpriv);
 980
 981        rtw_free_evt_priv(&padapter->evtpriv);
 982
 983        rtw_free_mlme_priv(&padapter->mlmepriv);
 984        _rtw_free_xmit_priv(&padapter->xmitpriv);
 985
 986        _rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */
 987
 988        _rtw_free_recv_priv(&padapter->recvpriv);
 989
 990        rtw_hal_free_data(padapter);
 991
 992        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("<== rtw_free_drv_sw\n"));
 993
 994        /* free the old_pnetdev */
 995        if (padapter->rereg_nd_name_priv.old_pnetdev) {
 996                free_netdev(padapter->rereg_nd_name_priv.old_pnetdev);
 997                padapter->rereg_nd_name_priv.old_pnetdev = NULL;
 998        }
 999
1000        /*  clear pbuddystruct adapter to avoid access wrong pointer. */
1001        if (padapter->pbuddy_adapter != NULL)
1002                padapter->pbuddy_adapter->pbuddy_adapter = NULL;
1003
1004        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_free_drv_sw\n"));
1005
1006        return _SUCCESS;
1007}
1008
1009void netdev_br_init(struct net_device *netdev)
1010{
1011        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(netdev);
1012
1013        rcu_read_lock();
1014
1015        if (rcu_dereference(adapter->pnetdev->rx_handler_data)) {
1016                struct net_device *br_netdev;
1017                struct net *devnet = NULL;
1018
1019                devnet = dev_net(netdev);
1020                br_netdev = dev_get_by_name(devnet, CONFIG_BR_EXT_BRNAME);
1021                if (br_netdev) {
1022                        memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);
1023                        dev_put(br_netdev);
1024                } else {
1025                        pr_info("%s()-%d: dev_get_by_name(%s) failed!",
1026                                __func__, __LINE__, CONFIG_BR_EXT_BRNAME);
1027                }
1028        }
1029        adapter->ethBrExtInfo.addPPPoETag = 1;
1030
1031        rcu_read_unlock();
1032}
1033
1034int _netdev_open(struct net_device *pnetdev)
1035{
1036        uint status;
1037        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
1038        struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
1039
1040        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - dev_open\n"));
1041        DBG_88E("+88eu_drv - drv_open, bup =%d\n", padapter->bup);
1042
1043        if (pwrctrlpriv->ps_flag) {
1044                padapter->net_closed = false;
1045                goto netdev_open_normal_process;
1046        }
1047
1048        if (!padapter->bup) {
1049                padapter->bDriverStopped = false;
1050                padapter->bSurpriseRemoved = false;
1051                padapter->bCardDisableWOHSM = false;
1052
1053                status = rtw_hal_init(padapter);
1054                if (status == _FAIL) {
1055                        RT_TRACE(_module_os_intfs_c_, _drv_err_, ("rtl88eu_hal_init(): Can't init h/w!\n"));
1056                        goto netdev_open_error;
1057                }
1058
1059                pr_info("MAC Address = %pM\n", pnetdev->dev_addr);
1060
1061                status = rtw_start_drv_threads(padapter);
1062                if (status == _FAIL) {
1063                        pr_info("Initialize driver software resource Failed!\n");
1064                        goto netdev_open_error;
1065                }
1066
1067                if (init_hw_mlme_ext(padapter) == _FAIL) {
1068                        pr_info("can't init mlme_ext_priv\n");
1069                        goto netdev_open_error;
1070                }
1071                if (padapter->intf_start)
1072                        padapter->intf_start(padapter);
1073                rtw_proc_init_one(pnetdev);
1074
1075                rtw_led_control(padapter, LED_CTL_NO_LINK);
1076
1077                padapter->bup = true;
1078        }
1079        padapter->net_closed = false;
1080
1081        _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
1082
1083        padapter->pwrctrlpriv.bips_processing = false;
1084        rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
1085
1086        if (!rtw_netif_queue_stopped(pnetdev))
1087                rtw_netif_start_queue(pnetdev);
1088        else
1089                rtw_netif_wake_queue(pnetdev);
1090
1091        netdev_br_init(pnetdev);
1092
1093netdev_open_normal_process:
1094        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - dev_open\n"));
1095        DBG_88E("-88eu_drv - drv_open, bup =%d\n", padapter->bup);
1096        return 0;
1097
1098netdev_open_error:
1099        padapter->bup = false;
1100        netif_carrier_off(pnetdev);
1101        rtw_netif_stop_queue(pnetdev);
1102        RT_TRACE(_module_os_intfs_c_, _drv_err_, ("-88eu_drv - dev_open, fail!\n"));
1103        DBG_88E("-88eu_drv - drv_open fail, bup =%d\n", padapter->bup);
1104        return -1;
1105}
1106
1107int netdev_open(struct net_device *pnetdev)
1108{
1109        int ret;
1110        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
1111
1112        _enter_critical_mutex(padapter->hw_init_mutex, NULL);
1113        ret = _netdev_open(pnetdev);
1114        mutex_unlock(padapter->hw_init_mutex);
1115        return ret;
1116}
1117
1118static int  ips_netdrv_open(struct adapter *padapter)
1119{
1120        int status = _SUCCESS;
1121        padapter->net_closed = false;
1122        DBG_88E("===> %s.........\n", __func__);
1123
1124        padapter->bDriverStopped = false;
1125        padapter->bSurpriseRemoved = false;
1126        padapter->bCardDisableWOHSM = false;
1127
1128        status = rtw_hal_init(padapter);
1129        if (status == _FAIL) {
1130                RT_TRACE(_module_os_intfs_c_, _drv_err_, ("ips_netdrv_open(): Can't init h/w!\n"));
1131                goto netdev_open_error;
1132        }
1133
1134        if (padapter->intf_start)
1135                padapter->intf_start(padapter);
1136
1137        rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
1138        _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 5000);
1139
1140         return _SUCCESS;
1141
1142netdev_open_error:
1143        DBG_88E("-ips_netdrv_open - drv_open failure, bup =%d\n", padapter->bup);
1144
1145        return _FAIL;
1146}
1147
1148
1149int rtw_ips_pwr_up(struct adapter *padapter)
1150{
1151        int result;
1152        u32 start_time = jiffies;
1153        DBG_88E("===>  rtw_ips_pwr_up..............\n");
1154        rtw_reset_drv_sw(padapter);
1155
1156        result = ips_netdrv_open(padapter);
1157
1158        rtw_led_control(padapter, LED_CTL_NO_LINK);
1159
1160        DBG_88E("<===  rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time));
1161        return result;
1162}
1163
1164void rtw_ips_pwr_down(struct adapter *padapter)
1165{
1166        u32 start_time = jiffies;
1167        DBG_88E("===> rtw_ips_pwr_down...................\n");
1168
1169        padapter->bCardDisableWOHSM = true;
1170        padapter->net_closed = true;
1171
1172        rtw_led_control(padapter, LED_CTL_POWER_OFF);
1173
1174        rtw_ips_dev_unload(padapter);
1175        padapter->bCardDisableWOHSM = false;
1176        DBG_88E("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));
1177}
1178
1179void rtw_ips_dev_unload(struct adapter *padapter)
1180{
1181        DBG_88E("====> %s...\n", __func__);
1182
1183        rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, NULL);
1184
1185        if (padapter->intf_stop)
1186                padapter->intf_stop(padapter);
1187
1188        /* s5. */
1189        if (!padapter->bSurpriseRemoved)
1190                rtw_hal_deinit(padapter);
1191}
1192
1193int pm_netdev_open(struct net_device *pnetdev, u8 bnormal)
1194{
1195        int status;
1196
1197        if (bnormal)
1198                status = netdev_open(pnetdev);
1199        else
1200                status =  (_SUCCESS == ips_netdrv_open((struct adapter *)rtw_netdev_priv(pnetdev))) ? (0) : (-1);
1201        return status;
1202}
1203
1204int netdev_close(struct net_device *pnetdev)
1205{
1206        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
1207        struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1208
1209        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - drv_close\n"));
1210
1211        if (padapter->pwrctrlpriv.bInternalAutoSuspend) {
1212                if (padapter->pwrctrlpriv.rf_pwrstate == rf_off)
1213                        padapter->pwrctrlpriv.ps_flag = true;
1214        }
1215        padapter->net_closed = true;
1216
1217        if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) {
1218                DBG_88E("(2)88eu_drv - drv_close, bup =%d, hw_init_completed =%d\n",
1219                        padapter->bup, padapter->hw_init_completed);
1220
1221                /* s1. */
1222                if (pnetdev) {
1223                        if (!rtw_netif_queue_stopped(pnetdev))
1224                                rtw_netif_stop_queue(pnetdev);
1225                }
1226
1227                /* s2. */
1228                LeaveAllPowerSaveMode(padapter);
1229                rtw_disassoc_cmd(padapter, 500, false);
1230                /* s2-2.  indicate disconnect to os */
1231                rtw_indicate_disconnect(padapter);
1232                /* s2-3. */
1233                rtw_free_assoc_resources(padapter, 1);
1234                /* s2-4. */
1235                rtw_free_network_queue(padapter, true);
1236                /*  Close LED */
1237                rtw_led_control(padapter, LED_CTL_POWER_OFF);
1238        }
1239
1240        nat25_db_cleanup(padapter);
1241
1242#ifdef CONFIG_88EU_P2P
1243        rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
1244#endif /* CONFIG_88EU_P2P */
1245
1246        kfree(dvobj->firmware.szFwBuffer);
1247        dvobj->firmware.szFwBuffer = NULL;
1248
1249        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - drv_close\n"));
1250        DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup);
1251        return 0;
1252}
1253