linux/drivers/staging/rtl8723bs/core/rtw_debug.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2007 - 2012 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 ******************************************************************************/
  15#define _RTW_DEBUG_C_
  16
  17#include <drv_types.h>
  18#include <rtw_debug.h>
  19
  20u32 GlobalDebugLevel = _drv_err_;
  21
  22#ifdef DEBUG_RTL871X
  23
  24        u64 GlobalDebugComponents = \
  25                        _module_rtl871x_xmit_c_ |
  26                        _module_xmit_osdep_c_ |
  27                        _module_rtl871x_recv_c_ |
  28                        _module_recv_osdep_c_ |
  29                        _module_rtl871x_mlme_c_ |
  30                        _module_mlme_osdep_c_ |
  31                        _module_rtl871x_sta_mgt_c_ |
  32                        _module_rtl871x_cmd_c_ |
  33                        _module_cmd_osdep_c_ |
  34                        _module_rtl871x_io_c_ |
  35                        _module_io_osdep_c_ |
  36                        _module_os_intfs_c_|
  37                        _module_rtl871x_security_c_|
  38                        _module_rtl871x_eeprom_c_|
  39                        _module_hal_init_c_|
  40                        _module_hci_hal_init_c_|
  41                        _module_rtl871x_ioctl_c_|
  42                        _module_rtl871x_ioctl_set_c_|
  43                        _module_rtl871x_ioctl_query_c_|
  44                        _module_rtl871x_pwrctrl_c_|
  45                        _module_hci_intfs_c_|
  46                        _module_hci_ops_c_|
  47                        _module_hci_ops_os_c_|
  48                        _module_rtl871x_ioctl_os_c|
  49                        _module_rtl8712_cmd_c_|
  50                        _module_hal_xmit_c_|
  51                        _module_rtl8712_recv_c_ |
  52                        _module_mp_ |
  53                        _module_efuse_;
  54
  55#endif /* DEBUG_RTL871X */
  56
  57#include <rtw_version.h>
  58
  59void dump_drv_version(void *sel)
  60{
  61        DBG_871X_SEL_NL(sel, "%s %s\n", "rtl8723bs", DRIVERVERSION);
  62}
  63
  64void dump_log_level(void *sel)
  65{
  66        DBG_871X_SEL_NL(sel, "log_level:%d\n", GlobalDebugLevel);
  67}
  68
  69void sd_f0_reg_dump(void *sel, struct adapter *adapter)
  70{
  71        int i;
  72
  73        for (i = 0x0; i <= 0xff; i++) {
  74                if (i%16 == 0)
  75                        DBG_871X_SEL_NL(sel, "0x%02x ", i);
  76
  77                DBG_871X_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i));
  78
  79                if (i%16 == 15)
  80                        DBG_871X_SEL(sel, "\n");
  81                else if (i%8 == 7)
  82                        DBG_871X_SEL(sel, "\t");
  83        }
  84}
  85
  86void mac_reg_dump(void *sel, struct adapter *adapter)
  87{
  88        int i, j = 1;
  89
  90        DBG_871X_SEL_NL(sel, "======= MAC REG =======\n");
  91
  92        for (i = 0x0; i < 0x800; i += 4) {
  93                if (j%4 == 1)
  94                        DBG_871X_SEL_NL(sel, "0x%03x", i);
  95                DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  96                if ((j++)%4 == 0)
  97                        DBG_871X_SEL(sel, "\n");
  98        }
  99}
 100
 101void bb_reg_dump(void *sel, struct adapter *adapter)
 102{
 103        int i, j = 1;
 104
 105        DBG_871X_SEL_NL(sel, "======= BB REG =======\n");
 106        for (i = 0x800; i < 0x1000 ; i += 4) {
 107                if (j%4 == 1)
 108                        DBG_871X_SEL_NL(sel, "0x%03x", i);
 109                DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
 110                if ((j++)%4 == 0)
 111                        DBG_871X_SEL(sel, "\n");
 112        }
 113}
 114
 115void rf_reg_dump(void *sel, struct adapter *adapter)
 116{
 117        int i, j = 1, path;
 118        u32 value;
 119        u8 rf_type = 0;
 120        u8 path_nums = 0;
 121
 122        rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 123        if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type))
 124                path_nums = 1;
 125        else
 126                path_nums = 2;
 127
 128        DBG_871X_SEL_NL(sel, "======= RF REG =======\n");
 129
 130        for (path = 0; path < path_nums; path++) {
 131                DBG_871X_SEL_NL(sel, "RF_Path(%x)\n", path);
 132                for (i = 0; i < 0x100; i++) {
 133                        value = rtw_hal_read_rfreg(adapter, path, i, 0xffffffff);
 134                        if (j%4 == 1)
 135                                DBG_871X_SEL_NL(sel, "0x%02x ", i);
 136                        DBG_871X_SEL(sel, " 0x%08x ", value);
 137                        if ((j++)%4 == 0)
 138                                DBG_871X_SEL(sel, "\n");
 139                }
 140        }
 141}
 142
 143#ifdef PROC_DEBUG
 144ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 145{
 146        struct net_device *dev = data;
 147        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 148        char tmp[32];
 149        u32 addr, val, len;
 150
 151        if (count < 3) {
 152                DBG_871X("argument size is less than 3\n");
 153                return -EFAULT;
 154        }
 155
 156        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 157
 158                int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
 159
 160                if (num !=  3) {
 161                        DBG_871X("invalid write_reg parameter!\n");
 162                        return count;
 163                }
 164
 165                switch (len) {
 166                case 1:
 167                        rtw_write8(padapter, addr, (u8)val);
 168                        break;
 169                case 2:
 170                        rtw_write16(padapter, addr, (u16)val);
 171                        break;
 172                case 4:
 173                        rtw_write32(padapter, addr, val);
 174                        break;
 175                default:
 176                        DBG_871X("error write length =%d", len);
 177                        break;
 178                }
 179
 180        }
 181
 182        return count;
 183
 184}
 185
 186static u32 proc_get_read_addr = 0xeeeeeeee;
 187static u32 proc_get_read_len = 0x4;
 188
 189int proc_get_read_reg(struct seq_file *m, void *v)
 190{
 191        struct net_device *dev = m->private;
 192        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 193
 194        if (proc_get_read_addr == 0xeeeeeeee) {
 195                DBG_871X_SEL_NL(m, "address not initialized\n");
 196                return 0;
 197        }
 198
 199        switch (proc_get_read_len) {
 200        case 1:
 201                DBG_871X_SEL_NL(m, "rtw_read8(0x%x) = 0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));
 202                break;
 203        case 2:
 204                DBG_871X_SEL_NL(m, "rtw_read16(0x%x) = 0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));
 205                break;
 206        case 4:
 207                DBG_871X_SEL_NL(m, "rtw_read32(0x%x) = 0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));
 208                break;
 209        default:
 210                DBG_871X_SEL_NL(m, "error read length =%d\n", proc_get_read_len);
 211                break;
 212        }
 213
 214        return 0;
 215}
 216
 217ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 218{
 219        char tmp[16];
 220        u32 addr, len;
 221
 222        if (count < 2) {
 223                DBG_871X("argument size is less than 2\n");
 224                return -EFAULT;
 225        }
 226
 227        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 228
 229                int num = sscanf(tmp, "%x %x", &addr, &len);
 230
 231                if (num !=  2) {
 232                        DBG_871X("invalid read_reg parameter!\n");
 233                        return count;
 234                }
 235
 236                proc_get_read_addr = addr;
 237
 238                proc_get_read_len = len;
 239        }
 240
 241        return count;
 242
 243}
 244
 245int proc_get_fwstate(struct seq_file *m, void *v)
 246{
 247        struct net_device *dev = m->private;
 248        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 249        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 250
 251        DBG_871X_SEL_NL(m, "fwstate = 0x%x\n", get_fwstate(pmlmepriv));
 252
 253        return 0;
 254}
 255
 256int proc_get_sec_info(struct seq_file *m, void *v)
 257{
 258        struct net_device *dev = m->private;
 259        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 260        struct security_priv *sec = &padapter->securitypriv;
 261
 262        DBG_871X_SEL_NL(m, "auth_alg = 0x%x, enc_alg = 0x%x, auth_type = 0x%x, enc_type = 0x%x\n",
 263                                                sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,
 264                                                sec->ndisauthtype, sec->ndisencryptstatus);
 265
 266        DBG_871X_SEL_NL(m, "hw_decrypted =%d\n", sec->hw_decrypted);
 267
 268#ifdef DBG_SW_SEC_CNT
 269        DBG_871X_SEL_NL(m, "wep_sw_enc_cnt =%llu, %llu, %llu\n"
 270                , sec->wep_sw_enc_cnt_bc, sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
 271        DBG_871X_SEL_NL(m, "wep_sw_dec_cnt =%llu, %llu, %llu\n"
 272                , sec->wep_sw_dec_cnt_bc, sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
 273
 274        DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt =%llu, %llu, %llu\n"
 275                , sec->tkip_sw_enc_cnt_bc, sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);
 276        DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt =%llu, %llu, %llu\n"
 277                , sec->tkip_sw_dec_cnt_bc, sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
 278
 279        DBG_871X_SEL_NL(m, "aes_sw_enc_cnt =%llu, %llu, %llu\n"
 280                , sec->aes_sw_enc_cnt_bc, sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
 281        DBG_871X_SEL_NL(m, "aes_sw_dec_cnt =%llu, %llu, %llu\n"
 282                , sec->aes_sw_dec_cnt_bc, sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
 283#endif /* DBG_SW_SEC_CNT */
 284
 285        return 0;
 286}
 287
 288int proc_get_mlmext_state(struct seq_file *m, void *v)
 289{
 290        struct net_device *dev = m->private;
 291        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 292        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 293        struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
 294
 295        DBG_871X_SEL_NL(m, "pmlmeinfo->state = 0x%x\n", pmlmeinfo->state);
 296
 297        return 0;
 298}
 299
 300int proc_get_roam_flags(struct seq_file *m, void *v)
 301{
 302        struct net_device *dev = m->private;
 303        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 304
 305        DBG_871X_SEL_NL(m, "0x%02x\n", rtw_roam_flags(adapter));
 306
 307        return 0;
 308}
 309
 310ssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 311{
 312        struct net_device *dev = data;
 313        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 314
 315        char tmp[32];
 316        u8 flags;
 317
 318        if (count < 1)
 319                return -EFAULT;
 320
 321        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 322
 323                int num = sscanf(tmp, "%hhx", &flags);
 324
 325                if (num == 1)
 326                        rtw_assign_roam_flags(adapter, flags);
 327        }
 328
 329        return count;
 330
 331}
 332
 333int proc_get_roam_param(struct seq_file *m, void *v)
 334{
 335        struct net_device *dev = m->private;
 336        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 337        struct mlme_priv *mlme = &adapter->mlmepriv;
 338
 339        DBG_871X_SEL_NL(m, "%12s %12s %11s\n", "rssi_diff_th", "scanr_exp_ms", "scan_int_ms");
 340        DBG_871X_SEL_NL(m, "%-12u %-12u %-11u\n"
 341                , mlme->roam_rssi_diff_th
 342                , mlme->roam_scanr_exp_ms
 343                , mlme->roam_scan_int_ms
 344        );
 345
 346        return 0;
 347}
 348
 349ssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 350{
 351        struct net_device *dev = data;
 352        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 353        struct mlme_priv *mlme = &adapter->mlmepriv;
 354
 355        char tmp[32];
 356        u8 rssi_diff_th;
 357        u32 scanr_exp_ms;
 358        u32 scan_int_ms;
 359
 360        if (count < 1)
 361                return -EFAULT;
 362
 363        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 364
 365                int num = sscanf(tmp, "%hhu %u %u", &rssi_diff_th, &scanr_exp_ms, &scan_int_ms);
 366
 367                if (num >= 1)
 368                        mlme->roam_rssi_diff_th = rssi_diff_th;
 369                if (num >= 2)
 370                        mlme->roam_scanr_exp_ms = scanr_exp_ms;
 371                if (num >= 3)
 372                        mlme->roam_scan_int_ms = scan_int_ms;
 373        }
 374
 375        return count;
 376
 377}
 378
 379ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 380{
 381        struct net_device *dev = data;
 382        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 383
 384        char tmp[32];
 385        u8 addr[ETH_ALEN];
 386
 387        if (count < 1)
 388                return -EFAULT;
 389
 390        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 391
 392                int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr+1, addr+2, addr+3, addr+4, addr+5);
 393                if (num == 6)
 394                        memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN);
 395
 396                DBG_871X("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr));
 397        }
 398
 399        return count;
 400}
 401
 402int proc_get_qos_option(struct seq_file *m, void *v)
 403{
 404        struct net_device *dev = m->private;
 405        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 406        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 407
 408        DBG_871X_SEL_NL(m, "qos_option =%d\n", pmlmepriv->qospriv.qos_option);
 409
 410        return 0;
 411}
 412
 413int proc_get_ht_option(struct seq_file *m, void *v)
 414{
 415        struct net_device *dev = m->private;
 416        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 417        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 418
 419        DBG_871X_SEL_NL(m, "ht_option =%d\n", pmlmepriv->htpriv.ht_option);
 420
 421        return 0;
 422}
 423
 424int proc_get_rf_info(struct seq_file *m, void *v)
 425{
 426        struct net_device *dev = m->private;
 427        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 428        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 429
 430        DBG_871X_SEL_NL(m, "cur_ch =%d, cur_bw =%d, cur_ch_offet =%d\n",
 431                                        pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
 432
 433        DBG_871X_SEL_NL(m, "oper_ch =%d, oper_bw =%d, oper_ch_offet =%d\n",
 434                                        rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter),  rtw_get_oper_choffset(padapter));
 435
 436        return 0;
 437}
 438
 439int proc_get_survey_info(struct seq_file *m, void *v)
 440{
 441        struct net_device *dev = m->private;
 442        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 443        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 444        struct __queue  *queue  = &(pmlmepriv->scanned_queue);
 445        struct wlan_network     *pnetwork = NULL;
 446        struct list_head        *plist, *phead;
 447        s32 notify_signal;
 448        s16 notify_noise = 0;
 449        u16  index = 0;
 450
 451        spin_lock_bh(&(pmlmepriv->scanned_queue.lock));
 452        phead = get_list_head(queue);
 453        plist = phead ? get_next(phead) : NULL;
 454        if ((!phead) || (!plist)) {
 455                spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
 456                return 0;
 457        }
 458
 459        DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n", "index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
 460        while (1) {
 461                if (phead == plist)
 462                        break;
 463
 464                pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
 465
 466                if (!pnetwork)
 467                        break;
 468
 469                if (check_fwstate(pmlmepriv, _FW_LINKED) == true &&
 470                        is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
 471                        notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);/*dbm*/
 472                } else {
 473                        notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);/*dbm*/
 474                }
 475
 476                #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
 477                rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &(pnetwork->network.Configuration.DSConfig), &(notify_noise));
 478                #endif
 479
 480                DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %4d  %5d  %s\n",
 481                        ++index,
 482                        MAC_ARG(pnetwork->network.MacAddress),
 483                        pnetwork->network.Configuration.DSConfig,
 484                        (int)pnetwork->network.Rssi,
 485                        notify_signal,
 486                        notify_noise,
 487                        jiffies_to_msecs(jiffies - pnetwork->last_scanned),
 488                        /*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),*/
 489                        pnetwork->network.Ssid.Ssid);
 490                plist = get_next(plist);
 491        }
 492        spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
 493
 494        return 0;
 495}
 496
 497int proc_get_ap_info(struct seq_file *m, void *v)
 498{
 499        struct net_device *dev = m->private;
 500        struct sta_info *psta;
 501        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 502        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 503        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 504        struct wlan_network *cur_network = &(pmlmepriv->cur_network);
 505        struct sta_priv *pstapriv = &padapter->stapriv;
 506
 507        psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
 508        if (psta) {
 509                int i;
 510                struct recv_reorder_ctrl *preorder_ctrl;
 511
 512                DBG_871X_SEL_NL(m, "SSID =%s\n", cur_network->network.Ssid.Ssid);
 513                DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
 514                DBG_871X_SEL_NL(m, "cur_channel =%d, cur_bwmode =%d, cur_ch_offset =%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
 515                DBG_871X_SEL_NL(m, "wireless_mode = 0x%x, rtsen =%d, cts2slef =%d\n", psta->wireless_mode, psta->rtsen, psta->cts2self);
 516                DBG_871X_SEL_NL(m, "state = 0x%x, aid =%d, macid =%d, raid =%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
 517                DBG_871X_SEL_NL(m, "qos_en =%d, ht_en =%d, init_rate =%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
 518                DBG_871X_SEL_NL(m, "bwmode =%d, ch_offset =%d, sgi_20m =%d, sgi_40m =%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);
 519                DBG_871X_SEL_NL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
 520                DBG_871X_SEL_NL(m, "agg_enable_bitmap =%x, candidate_tid_bitmap =%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
 521                DBG_871X_SEL_NL(m, "ldpc_cap = 0x%x, stbc_cap = 0x%x, beamform_cap = 0x%x\n", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap);
 522
 523                for (i = 0; i < 16; i++) {
 524                        preorder_ctrl = &psta->recvreorder_ctrl[i];
 525                        if (preorder_ctrl->enable) {
 526                                DBG_871X_SEL_NL(m, "tid =%d, indicate_seq =%d\n", i, preorder_ctrl->indicate_seq);
 527                        }
 528                }
 529
 530        } else{
 531                DBG_871X_SEL_NL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
 532        }
 533
 534        return 0;
 535}
 536
 537int proc_get_adapter_state(struct seq_file *m, void *v)
 538{
 539        struct net_device *dev = m->private;
 540        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 541
 542        DBG_871X_SEL_NL(m, "name =%s, bSurpriseRemoved =%d, bDriverStopped =%d\n",
 543                                        dev->name, padapter->bSurpriseRemoved, padapter->bDriverStopped);
 544
 545        return 0;
 546}
 547
 548int proc_get_trx_info(struct seq_file *m, void *v)
 549{
 550        struct net_device *dev = m->private;
 551        int i;
 552        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 553        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
 554        struct recv_priv  *precvpriv = &padapter->recvpriv;
 555        struct hw_xmit *phwxmit;
 556
 557        DBG_871X_SEL_NL(m, "free_xmitbuf_cnt =%d, free_xmitframe_cnt =%d\n"
 558                , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);
 559        DBG_871X_SEL_NL(m, "free_ext_xmitbuf_cnt =%d, free_xframe_ext_cnt =%d\n"
 560                , pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt);
 561        DBG_871X_SEL_NL(m, "free_recvframe_cnt =%d\n"
 562                , precvpriv->free_recvframe_cnt);
 563
 564        for (i = 0; i < 4; i++) {
 565                phwxmit = pxmitpriv->hwxmits + i;
 566                DBG_871X_SEL_NL(m, "%d, hwq.accnt =%d\n", i, phwxmit->accnt);
 567        }
 568
 569        return 0;
 570}
 571
 572int proc_get_rate_ctl(struct seq_file *m, void *v)
 573{
 574        struct net_device *dev = m->private;
 575        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 576
 577        if (adapter->fix_rate != 0xff) {
 578                DBG_871X_SEL_NL(m, "FIX\n");
 579                DBG_871X_SEL_NL(m, "0x%02x\n", adapter->fix_rate);
 580        } else {
 581                DBG_871X_SEL_NL(m, "RA\n");
 582        }
 583
 584        return 0;
 585}
 586
 587ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 588{
 589        struct net_device *dev = data;
 590        struct adapter *adapter = (struct adapter *)rtw_netdev_priv(dev);
 591        char tmp[32];
 592        u8 fix_rate;
 593
 594        if (count < 1)
 595                return -EFAULT;
 596
 597        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 598
 599                int num = sscanf(tmp, "%hhx", &fix_rate);
 600
 601                if (num >= 1)
 602                        adapter->fix_rate = fix_rate;
 603        }
 604
 605        return count;
 606}
 607
 608ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 609{
 610        char tmp[32];
 611
 612        if (count < 1)
 613                return -EFAULT;
 614
 615        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 616                sscanf(tmp, "%hhu %hhu", &g_fwdl_chksum_fail, &g_fwdl_wintint_rdy_fail);
 617        }
 618
 619        return count;
 620}
 621
 622ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 623{
 624        char tmp[32];
 625
 626        if (count < 1)
 627                return -EFAULT;
 628
 629        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 630                sscanf(tmp, "%u", &g_wait_hiq_empty);
 631        }
 632
 633        return count;
 634}
 635
 636int proc_get_suspend_resume_info(struct seq_file *m, void *v)
 637{
 638        struct net_device *dev = m->private;
 639        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 640        struct dvobj_priv *dvobj = padapter->dvobj;
 641        struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
 642
 643        DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_cnt =%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt);
 644        DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_cnt =%d\n", pdbgpriv->dbg_sdio_free_irq_cnt);
 645        DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_error_cnt =%d\n", pdbgpriv->dbg_sdio_alloc_irq_error_cnt);
 646        DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_error_cnt =%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt);
 647        DBG_871X_SEL_NL(m, "dbg_sdio_init_error_cnt =%d\n", pdbgpriv->dbg_sdio_init_error_cnt);
 648        DBG_871X_SEL_NL(m, "dbg_sdio_deinit_error_cnt =%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt);
 649        DBG_871X_SEL_NL(m, "dbg_suspend_error_cnt =%d\n", pdbgpriv->dbg_suspend_error_cnt);
 650        DBG_871X_SEL_NL(m, "dbg_suspend_cnt =%d\n", pdbgpriv->dbg_suspend_cnt);
 651        DBG_871X_SEL_NL(m, "dbg_resume_cnt =%d\n", pdbgpriv->dbg_resume_cnt);
 652        DBG_871X_SEL_NL(m, "dbg_resume_error_cnt =%d\n", pdbgpriv->dbg_resume_error_cnt);
 653        DBG_871X_SEL_NL(m, "dbg_deinit_fail_cnt =%d\n", pdbgpriv->dbg_deinit_fail_cnt);
 654        DBG_871X_SEL_NL(m, "dbg_carddisable_cnt =%d\n", pdbgpriv->dbg_carddisable_cnt);
 655        DBG_871X_SEL_NL(m, "dbg_ps_insuspend_cnt =%d\n", pdbgpriv->dbg_ps_insuspend_cnt);
 656        DBG_871X_SEL_NL(m, "dbg_dev_unload_inIPS_cnt =%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt);
 657        DBG_871X_SEL_NL(m, "dbg_scan_pwr_state_cnt =%d\n", pdbgpriv->dbg_scan_pwr_state_cnt);
 658        DBG_871X_SEL_NL(m, "dbg_downloadfw_pwr_state_cnt =%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt);
 659        DBG_871X_SEL_NL(m, "dbg_carddisable_error_cnt =%d\n", pdbgpriv->dbg_carddisable_error_cnt);
 660        DBG_871X_SEL_NL(m, "dbg_fw_read_ps_state_fail_cnt =%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt);
 661        DBG_871X_SEL_NL(m, "dbg_leave_ips_fail_cnt =%d\n", pdbgpriv->dbg_leave_ips_fail_cnt);
 662        DBG_871X_SEL_NL(m, "dbg_leave_lps_fail_cnt =%d\n", pdbgpriv->dbg_leave_lps_fail_cnt);
 663        DBG_871X_SEL_NL(m, "dbg_h2c_leave32k_fail_cnt =%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt);
 664        DBG_871X_SEL_NL(m, "dbg_diswow_dload_fw_fail_cnt =%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt);
 665        DBG_871X_SEL_NL(m, "dbg_enwow_dload_fw_fail_cnt =%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt);
 666        DBG_871X_SEL_NL(m, "dbg_ips_drvopen_fail_cnt =%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt);
 667        DBG_871X_SEL_NL(m, "dbg_poll_fail_cnt =%d\n", pdbgpriv->dbg_poll_fail_cnt);
 668        DBG_871X_SEL_NL(m, "dbg_rpwm_toogle_cnt =%d\n", pdbgpriv->dbg_rpwm_toogle_cnt);
 669        DBG_871X_SEL_NL(m, "dbg_rpwm_timeout_fail_cnt =%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt);
 670
 671        return 0;
 672}
 673
 674#ifdef CONFIG_DBG_COUNTER
 675
 676int proc_get_rx_logs(struct seq_file *m, void *v)
 677{
 678        struct net_device *dev = m->private;
 679        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 680        struct rx_logs *rx_logs = &padapter->rx_logs;
 681
 682        DBG_871X_SEL_NL(m,
 683                "intf_rx =%d\n"
 684                "intf_rx_err_recvframe =%d\n"
 685                "intf_rx_err_skb =%d\n"
 686                "intf_rx_report =%d\n"
 687                "core_rx =%d\n"
 688                "core_rx_pre =%d\n"
 689                "core_rx_pre_ver_err =%d\n"
 690                "core_rx_pre_mgmt =%d\n"
 691                "core_rx_pre_mgmt_err_80211w =%d\n"
 692                "core_rx_pre_mgmt_err =%d\n"
 693                "core_rx_pre_ctrl =%d\n"
 694                "core_rx_pre_ctrl_err =%d\n"
 695                "core_rx_pre_data =%d\n"
 696                "core_rx_pre_data_wapi_seq_err =%d\n"
 697                "core_rx_pre_data_wapi_key_err =%d\n"
 698                "core_rx_pre_data_handled =%d\n"
 699                "core_rx_pre_data_err =%d\n"
 700                "core_rx_pre_data_unknown =%d\n"
 701                "core_rx_pre_unknown =%d\n"
 702                "core_rx_enqueue =%d\n"
 703                "core_rx_dequeue =%d\n"
 704                "core_rx_post =%d\n"
 705                "core_rx_post_decrypt =%d\n"
 706                "core_rx_post_decrypt_wep =%d\n"
 707                "core_rx_post_decrypt_tkip =%d\n"
 708                "core_rx_post_decrypt_aes =%d\n"
 709                "core_rx_post_decrypt_wapi =%d\n"
 710                "core_rx_post_decrypt_hw =%d\n"
 711                "core_rx_post_decrypt_unknown =%d\n"
 712                "core_rx_post_decrypt_err =%d\n"
 713                "core_rx_post_defrag_err =%d\n"
 714                "core_rx_post_portctrl_err =%d\n"
 715                "core_rx_post_indicate =%d\n"
 716                "core_rx_post_indicate_in_oder =%d\n"
 717                "core_rx_post_indicate_reoder =%d\n"
 718                "core_rx_post_indicate_err =%d\n"
 719                "os_indicate =%d\n"
 720                "os_indicate_ap_mcast =%d\n"
 721                "os_indicate_ap_forward =%d\n"
 722                "os_indicate_ap_self =%d\n"
 723                "os_indicate_err =%d\n"
 724                "os_netif_ok =%d\n"
 725                "os_netif_err =%d\n",
 726                rx_logs->intf_rx,
 727                rx_logs->intf_rx_err_recvframe,
 728                rx_logs->intf_rx_err_skb,
 729                rx_logs->intf_rx_report,
 730                rx_logs->core_rx,
 731                rx_logs->core_rx_pre,
 732                rx_logs->core_rx_pre_ver_err,
 733                rx_logs->core_rx_pre_mgmt,
 734                rx_logs->core_rx_pre_mgmt_err_80211w,
 735                rx_logs->core_rx_pre_mgmt_err,
 736                rx_logs->core_rx_pre_ctrl,
 737                rx_logs->core_rx_pre_ctrl_err,
 738                rx_logs->core_rx_pre_data,
 739                rx_logs->core_rx_pre_data_wapi_seq_err,
 740                rx_logs->core_rx_pre_data_wapi_key_err,
 741                rx_logs->core_rx_pre_data_handled,
 742                rx_logs->core_rx_pre_data_err,
 743                rx_logs->core_rx_pre_data_unknown,
 744                rx_logs->core_rx_pre_unknown,
 745                rx_logs->core_rx_enqueue,
 746                rx_logs->core_rx_dequeue,
 747                rx_logs->core_rx_post,
 748                rx_logs->core_rx_post_decrypt,
 749                rx_logs->core_rx_post_decrypt_wep,
 750                rx_logs->core_rx_post_decrypt_tkip,
 751                rx_logs->core_rx_post_decrypt_aes,
 752                rx_logs->core_rx_post_decrypt_wapi,
 753                rx_logs->core_rx_post_decrypt_hw,
 754                rx_logs->core_rx_post_decrypt_unknown,
 755                rx_logs->core_rx_post_decrypt_err,
 756                rx_logs->core_rx_post_defrag_err,
 757                rx_logs->core_rx_post_portctrl_err,
 758                rx_logs->core_rx_post_indicate,
 759                rx_logs->core_rx_post_indicate_in_oder,
 760                rx_logs->core_rx_post_indicate_reoder,
 761                rx_logs->core_rx_post_indicate_err,
 762                rx_logs->os_indicate,
 763                rx_logs->os_indicate_ap_mcast,
 764                rx_logs->os_indicate_ap_forward,
 765                rx_logs->os_indicate_ap_self,
 766                rx_logs->os_indicate_err,
 767                rx_logs->os_netif_ok,
 768                rx_logs->os_netif_err
 769        );
 770
 771        return 0;
 772}
 773
 774int proc_get_tx_logs(struct seq_file *m, void *v)
 775{
 776        struct net_device *dev = m->private;
 777        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 778        struct tx_logs *tx_logs = &padapter->tx_logs;
 779
 780        DBG_871X_SEL_NL(m,
 781                "os_tx =%d\n"
 782                "os_tx_err_up =%d\n"
 783                "os_tx_err_xmit =%d\n"
 784                "os_tx_m2u =%d\n"
 785                "os_tx_m2u_ignore_fw_linked =%d\n"
 786                "os_tx_m2u_ignore_self =%d\n"
 787                "os_tx_m2u_entry =%d\n"
 788                "os_tx_m2u_entry_err_xmit =%d\n"
 789                "os_tx_m2u_entry_err_skb =%d\n"
 790                "os_tx_m2u_stop =%d\n"
 791                "core_tx =%d\n"
 792                "core_tx_err_pxmitframe =%d\n"
 793                "core_tx_err_brtx =%d\n"
 794                "core_tx_upd_attrib =%d\n"
 795                "core_tx_upd_attrib_adhoc =%d\n"
 796                "core_tx_upd_attrib_sta =%d\n"
 797                "core_tx_upd_attrib_ap =%d\n"
 798                "core_tx_upd_attrib_unknown =%d\n"
 799                "core_tx_upd_attrib_dhcp =%d\n"
 800                "core_tx_upd_attrib_icmp =%d\n"
 801                "core_tx_upd_attrib_active =%d\n"
 802                "core_tx_upd_attrib_err_ucast_sta =%d\n"
 803                "core_tx_upd_attrib_err_ucast_ap_link =%d\n"
 804                "core_tx_upd_attrib_err_sta =%d\n"
 805                "core_tx_upd_attrib_err_link =%d\n"
 806                "core_tx_upd_attrib_err_sec =%d\n"
 807                "core_tx_ap_enqueue_warn_fwstate =%d\n"
 808                "core_tx_ap_enqueue_warn_sta =%d\n"
 809                "core_tx_ap_enqueue_warn_nosta =%d\n"
 810                "core_tx_ap_enqueue_warn_link =%d\n"
 811                "core_tx_ap_enqueue_warn_trigger =%d\n"
 812                "core_tx_ap_enqueue_mcast =%d\n"
 813                "core_tx_ap_enqueue_ucast =%d\n"
 814                "core_tx_ap_enqueue =%d\n"
 815                "intf_tx =%d\n"
 816                "intf_tx_pending_ac =%d\n"
 817                "intf_tx_pending_fw_under_survey =%d\n"
 818                "intf_tx_pending_fw_under_linking =%d\n"
 819                "intf_tx_pending_xmitbuf =%d\n"
 820                "intf_tx_enqueue =%d\n"
 821                "core_tx_enqueue =%d\n"
 822                "core_tx_enqueue_class =%d\n"
 823                "core_tx_enqueue_class_err_sta =%d\n"
 824                "core_tx_enqueue_class_err_nosta =%d\n"
 825                "core_tx_enqueue_class_err_fwlink =%d\n"
 826                "intf_tx_direct =%d\n"
 827                "intf_tx_direct_err_coalesce =%d\n"
 828                "intf_tx_dequeue =%d\n"
 829                "intf_tx_dequeue_err_coalesce =%d\n"
 830                "intf_tx_dump_xframe =%d\n"
 831                "intf_tx_dump_xframe_err_txdesc =%d\n"
 832                "intf_tx_dump_xframe_err_port =%d\n",
 833                tx_logs->os_tx,
 834                tx_logs->os_tx_err_up,
 835                tx_logs->os_tx_err_xmit,
 836                tx_logs->os_tx_m2u,
 837                tx_logs->os_tx_m2u_ignore_fw_linked,
 838                tx_logs->os_tx_m2u_ignore_self,
 839                tx_logs->os_tx_m2u_entry,
 840                tx_logs->os_tx_m2u_entry_err_xmit,
 841                tx_logs->os_tx_m2u_entry_err_skb,
 842                tx_logs->os_tx_m2u_stop,
 843                tx_logs->core_tx,
 844                tx_logs->core_tx_err_pxmitframe,
 845                tx_logs->core_tx_err_brtx,
 846                tx_logs->core_tx_upd_attrib,
 847                tx_logs->core_tx_upd_attrib_adhoc,
 848                tx_logs->core_tx_upd_attrib_sta,
 849                tx_logs->core_tx_upd_attrib_ap,
 850                tx_logs->core_tx_upd_attrib_unknown,
 851                tx_logs->core_tx_upd_attrib_dhcp,
 852                tx_logs->core_tx_upd_attrib_icmp,
 853                tx_logs->core_tx_upd_attrib_active,
 854                tx_logs->core_tx_upd_attrib_err_ucast_sta,
 855                tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
 856                tx_logs->core_tx_upd_attrib_err_sta,
 857                tx_logs->core_tx_upd_attrib_err_link,
 858                tx_logs->core_tx_upd_attrib_err_sec,
 859                tx_logs->core_tx_ap_enqueue_warn_fwstate,
 860                tx_logs->core_tx_ap_enqueue_warn_sta,
 861                tx_logs->core_tx_ap_enqueue_warn_nosta,
 862                tx_logs->core_tx_ap_enqueue_warn_link,
 863                tx_logs->core_tx_ap_enqueue_warn_trigger,
 864                tx_logs->core_tx_ap_enqueue_mcast,
 865                tx_logs->core_tx_ap_enqueue_ucast,
 866                tx_logs->core_tx_ap_enqueue,
 867                tx_logs->intf_tx,
 868                tx_logs->intf_tx_pending_ac,
 869                tx_logs->intf_tx_pending_fw_under_survey,
 870                tx_logs->intf_tx_pending_fw_under_linking,
 871                tx_logs->intf_tx_pending_xmitbuf,
 872                tx_logs->intf_tx_enqueue,
 873                tx_logs->core_tx_enqueue,
 874                tx_logs->core_tx_enqueue_class,
 875                tx_logs->core_tx_enqueue_class_err_sta,
 876                tx_logs->core_tx_enqueue_class_err_nosta,
 877                tx_logs->core_tx_enqueue_class_err_fwlink,
 878                tx_logs->intf_tx_direct,
 879                tx_logs->intf_tx_direct_err_coalesce,
 880                tx_logs->intf_tx_dequeue,
 881                tx_logs->intf_tx_dequeue_err_coalesce,
 882                tx_logs->intf_tx_dump_xframe,
 883                tx_logs->intf_tx_dump_xframe_err_txdesc,
 884                tx_logs->intf_tx_dump_xframe_err_port
 885        );
 886
 887        return 0;
 888}
 889
 890int proc_get_int_logs(struct seq_file *m, void *v)
 891{
 892        struct net_device *dev = m->private;
 893        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 894
 895        DBG_871X_SEL_NL(m,
 896                "all =%d\n"
 897                "err =%d\n"
 898                "tbdok =%d\n"
 899                "tbder =%d\n"
 900                "bcnderr =%d\n"
 901                "bcndma =%d\n"
 902                "bcndma_e =%d\n"
 903                "rx =%d\n"
 904                "rx_rdu =%d\n"
 905                "rx_fovw =%d\n"
 906                "txfovw =%d\n"
 907                "mgntok =%d\n"
 908                "highdok =%d\n"
 909                "bkdok =%d\n"
 910                "bedok =%d\n"
 911                "vidok =%d\n"
 912                "vodok =%d\n",
 913                padapter->int_logs.all,
 914                padapter->int_logs.err,
 915                padapter->int_logs.tbdok,
 916                padapter->int_logs.tbder,
 917                padapter->int_logs.bcnderr,
 918                padapter->int_logs.bcndma,
 919                padapter->int_logs.bcndma_e,
 920                padapter->int_logs.rx,
 921                padapter->int_logs.rx_rdu,
 922                padapter->int_logs.rx_fovw,
 923                padapter->int_logs.txfovw,
 924                padapter->int_logs.mgntok,
 925                padapter->int_logs.highdok,
 926                padapter->int_logs.bkdok,
 927                padapter->int_logs.bedok,
 928                padapter->int_logs.vidok,
 929                padapter->int_logs.vodok
 930        );
 931
 932        return 0;
 933}
 934
 935#endif /* CONFIG_DBG_COUNTER*/
 936
 937int proc_get_rx_signal(struct seq_file *m, void *v)
 938{
 939        struct net_device *dev = m->private;
 940        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 941
 942        DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi);
 943        /*DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);*/
 944        DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
 945        DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
 946        DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise);
 947        rtw_odm_get_perpkt_rssi(m, padapter);
 948        #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
 949        rtw_get_raw_rssi_info(m, padapter);
 950        #endif
 951        return 0;
 952}
 953
 954
 955int proc_get_hw_status(struct seq_file *m, void *v)
 956{
 957        struct net_device *dev = m->private;
 958        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 959        struct dvobj_priv *dvobj = padapter->dvobj;
 960        struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
 961
 962        DBG_871X_SEL_NL(m, "RX FIFO full count: last_time =%lld, current_time =%lld, differential =%lld\n"
 963        , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
 964
 965        return 0;
 966}
 967
 968ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 969{
 970        struct net_device *dev = data;
 971        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
 972        char tmp[32];
 973        u32 is_signal_dbg, signal_strength;
 974
 975        if (count < 1)
 976                return -EFAULT;
 977
 978        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 979
 980                int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
 981
 982                is_signal_dbg = is_signal_dbg == 0?0:1;
 983
 984                if (is_signal_dbg && num != 2)
 985                        return count;
 986
 987                signal_strength = signal_strength > 100?100:signal_strength;
 988
 989                padapter->recvpriv.is_signal_dbg = is_signal_dbg;
 990                padapter->recvpriv.signal_strength_dbg =  signal_strength;
 991
 992                if (is_signal_dbg)
 993                        DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
 994                else
 995                        DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH");
 996
 997        }
 998
 999        return count;
1000
1001}
1002
1003int proc_get_ht_enable(struct seq_file *m, void *v)
1004{
1005        struct net_device *dev = m->private;
1006        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1007        struct registry_priv *pregpriv = &padapter->registrypriv;
1008
1009        if (pregpriv)
1010                DBG_871X_SEL_NL(m, "%d\n", pregpriv->ht_enable);
1011
1012        return 0;
1013}
1014
1015ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1016{
1017        struct net_device *dev = data;
1018        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1019        struct registry_priv *pregpriv = &padapter->registrypriv;
1020        char tmp[32];
1021        u32 mode;
1022
1023        if (count < 1)
1024                return -EFAULT;
1025
1026        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1027                sscanf(tmp, "%d ", &mode);
1028
1029                if (pregpriv && mode < 2) {
1030                        pregpriv->ht_enable = mode;
1031                        printk("ht_enable =%d\n", pregpriv->ht_enable);
1032                }
1033        }
1034
1035        return count;
1036
1037}
1038
1039int proc_get_bw_mode(struct seq_file *m, void *v)
1040{
1041        struct net_device *dev = m->private;
1042        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1043        struct registry_priv *pregpriv = &padapter->registrypriv;
1044
1045        if (pregpriv)
1046                DBG_871X_SEL_NL(m, "0x%02x\n", pregpriv->bw_mode);
1047
1048        return 0;
1049}
1050
1051ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1052{
1053        struct net_device *dev = data;
1054        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1055        struct registry_priv *pregpriv = &padapter->registrypriv;
1056        char tmp[32];
1057        u32 mode;
1058
1059        if (count < 1)
1060                return -EFAULT;
1061
1062        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1063                sscanf(tmp, "%d ", &mode);
1064
1065                if (pregpriv &&  mode < 2) {
1066
1067                        pregpriv->bw_mode = mode;
1068                        printk("bw_mode =%d\n", mode);
1069
1070                }
1071        }
1072
1073        return count;
1074
1075}
1076
1077int proc_get_ampdu_enable(struct seq_file *m, void *v)
1078{
1079        struct net_device *dev = m->private;
1080        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1081        struct registry_priv *pregpriv = &padapter->registrypriv;
1082
1083        if (pregpriv)
1084                DBG_871X_SEL_NL(m, "%d\n", pregpriv->ampdu_enable);
1085
1086        return 0;
1087}
1088
1089ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1090{
1091        struct net_device *dev = data;
1092        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1093        struct registry_priv *pregpriv = &padapter->registrypriv;
1094        char tmp[32];
1095        u32 mode;
1096
1097        if (count < 1)
1098                return -EFAULT;
1099
1100        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1101
1102                sscanf(tmp, "%d ", &mode);
1103
1104                if (pregpriv && mode < 3) {
1105                        pregpriv->ampdu_enable = mode;
1106                        printk("ampdu_enable =%d\n", mode);
1107                }
1108
1109        }
1110
1111        return count;
1112
1113}
1114
1115int proc_get_rx_ampdu(struct seq_file *m, void *v)
1116{
1117        struct net_device *dev = m->private;
1118        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1119        struct registry_priv *pregpriv = &padapter->registrypriv;
1120        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1121        struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1122
1123        if (pregpriv)
1124                DBG_871X_SEL_NL(m,
1125                        "accept_addba_req = %d , 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.\n",
1126                        pmlmeinfo->accept_addba_req
1127                        );
1128
1129        return 0;
1130}
1131
1132ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1133{
1134        struct net_device *dev = data;
1135        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1136        struct registry_priv *pregpriv = &padapter->registrypriv;
1137        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1138        struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1139        char tmp[32];
1140        u32 mode;
1141
1142        if (count < 1)
1143                return -EFAULT;
1144
1145        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1146
1147                sscanf(tmp, "%d ", &mode);
1148
1149                if (pregpriv && mode < 2) {
1150                        pmlmeinfo->accept_addba_req = mode;
1151                        DBG_871X("pmlmeinfo->accept_addba_req =%d\n",
1152                                 pmlmeinfo->accept_addba_req);
1153                        if (mode == 0) {
1154                                /*tear down Rx AMPDU*/
1155                                send_delba(padapter, 0, get_my_bssid(&(pmlmeinfo->network)));/* recipient*/
1156                        }
1157                }
1158
1159        }
1160
1161        return count;
1162}
1163
1164int proc_get_en_fwps(struct seq_file *m, void *v)
1165{
1166        struct net_device *dev = m->private;
1167        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1168        struct registry_priv *pregpriv = &padapter->registrypriv;
1169
1170        if (pregpriv)
1171                DBG_871X_SEL_NL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n"
1172                        , pregpriv->check_fw_ps);
1173
1174        return 0;
1175}
1176
1177ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1178{
1179        struct net_device *dev = data;
1180        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1181        struct registry_priv *pregpriv = &padapter->registrypriv;
1182        char tmp[32];
1183        u32 mode;
1184
1185        if (count < 1)
1186                return -EFAULT;
1187
1188        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1189                sscanf(tmp, "%d ", &mode);
1190
1191                if (pregpriv && mode < 2) {
1192                        pregpriv->check_fw_ps = mode;
1193                        DBG_871X("pregpriv->check_fw_ps =%d\n", pregpriv->check_fw_ps);
1194                }
1195        }
1196        return count;
1197}
1198
1199int proc_get_rx_stbc(struct seq_file *m, void *v)
1200{
1201        struct net_device *dev = m->private;
1202        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1203        struct registry_priv *pregpriv = &padapter->registrypriv;
1204
1205        if (pregpriv)
1206                DBG_871X_SEL_NL(m, "%d\n", pregpriv->rx_stbc);
1207
1208        return 0;
1209}
1210
1211ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1212{
1213        struct net_device *dev = data;
1214        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1215        struct registry_priv *pregpriv = &padapter->registrypriv;
1216        char tmp[32];
1217        u32 mode;
1218
1219        if (count < 1)
1220                return -EFAULT;
1221
1222        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1223                sscanf(tmp, "%d ", &mode);
1224
1225                if (pregpriv && (mode == 0 || mode == 1 ||
1226                    mode == 2 || mode == 3)) {
1227                        pregpriv->rx_stbc = mode;
1228                        printk("rx_stbc =%d\n", mode);
1229                }
1230        }
1231
1232        return count;
1233
1234}
1235
1236int proc_get_rssi_disp(struct seq_file *m, void *v)
1237{
1238        return 0;
1239}
1240
1241ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1242{
1243        struct net_device *dev = data;
1244        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1245        char tmp[32];
1246        u32 enable = 0;
1247
1248        if (count < 1) {
1249                DBG_8192C("argument size is less than 1\n");
1250                return -EFAULT;
1251        }
1252
1253        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1254                int num = sscanf(tmp, "%x", &enable);
1255
1256                if (num !=  1) {
1257                        DBG_8192C("invalid set_rssi_disp parameter!\n");
1258                        return count;
1259                }
1260
1261                if (enable) {
1262                        DBG_8192C("Linked info Function Enable\n");
1263                        padapter->bLinkInfoDump = enable;
1264                } else {
1265                        DBG_8192C("Linked info Function Disable\n");
1266                        padapter->bLinkInfoDump = 0;
1267                }
1268        }
1269        return count;
1270}
1271
1272int proc_get_all_sta_info(struct seq_file *m, void *v)
1273{
1274        struct net_device *dev = m->private;
1275        struct sta_info *psta;
1276        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
1277        struct sta_priv *pstapriv = &padapter->stapriv;
1278        int i, j;
1279        struct list_head        *plist, *phead;
1280        struct recv_reorder_ctrl *preorder_ctrl;
1281
1282        DBG_871X_SEL_NL(m, "sta_dz_bitmap = 0x%x, tim_bitmap = 0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
1283
1284        spin_lock_bh(&pstapriv->sta_hash_lock);
1285
1286        for (i = 0; i < NUM_STA; i++) {
1287                phead = &(pstapriv->sta_hash[i]);
1288                plist = get_next(phead);
1289
1290                while (phead != plist) {
1291                        psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
1292
1293                        plist = get_next(plist);
1294
1295                        DBG_871X_SEL_NL(m, "==============================\n");
1296                        DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n",
1297                                        MAC_ARG(psta->hwaddr));
1298                        DBG_871X_SEL_NL(m, "rtsen =%d, cts2slef =%d\n",
1299                                        psta->rtsen, psta->cts2self);
1300                        DBG_871X_SEL_NL(m, "state = 0x%x, aid =%d, macid =%d, raid =%d\n",
1301                                        psta->state, psta->aid, psta->mac_id,
1302                                        psta->raid);
1303                        DBG_871X_SEL_NL(m, "qos_en =%d, ht_en =%d, init_rate =%d\n",
1304                                        psta->qos_option,
1305                                        psta->htpriv.ht_option,
1306                                        psta->init_rate);
1307                        DBG_871X_SEL_NL(m, "bwmode =%d, ch_offset =%d, sgi_20m =%d, sgi_40m =%d\n",
1308                                        psta->bw_mode, psta->htpriv.ch_offset,
1309                                        psta->htpriv.sgi_20m,
1310                                        psta->htpriv.sgi_40m);
1311                        DBG_871X_SEL_NL(m, "ampdu_enable = %d\n",
1312                                        psta->htpriv.ampdu_enable);
1313                        DBG_871X_SEL_NL(m, "agg_enable_bitmap =%x, candidate_tid_bitmap =%x\n",
1314                                        psta->htpriv.agg_enable_bitmap,
1315                                        psta->htpriv.candidate_tid_bitmap);
1316                        DBG_871X_SEL_NL(m, "sleepq_len =%d\n",
1317                                        psta->sleepq_len);
1318                        DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt =%d\n",
1319                                        psta->sta_xmitpriv.vo_q.qcnt);
1320                        DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt =%d\n",
1321                                        psta->sta_xmitpriv.vi_q.qcnt);
1322                        DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt =%d\n",
1323                                        psta->sta_xmitpriv.be_q.qcnt);
1324                        DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt =%d\n",
1325                                        psta->sta_xmitpriv.bk_q.qcnt);
1326
1327                        DBG_871X_SEL_NL(m, "capability = 0x%x\n",
1328                                        psta->capability);
1329                        DBG_871X_SEL_NL(m, "flags = 0x%x\n", psta->flags);
1330                        DBG_871X_SEL_NL(m, "wpa_psk = 0x%x\n", psta->wpa_psk);
1331                        DBG_871X_SEL_NL(m, "wpa2_group_cipher = 0x%x\n",
1332                                        psta->wpa2_group_cipher);
1333                        DBG_871X_SEL_NL(m, "wpa2_pairwise_cipher = 0x%x\n",
1334                                        psta->wpa2_pairwise_cipher);
1335                        DBG_871X_SEL_NL(m, "qos_info = 0x%x\n", psta->qos_info);
1336                        DBG_871X_SEL_NL(m, "dot118021XPrivacy = 0x%x\n",
1337                                        psta->dot118021XPrivacy);
1338
1339                        for (j = 0; j < 16; j++) {
1340                                preorder_ctrl = &psta->recvreorder_ctrl[j];
1341                                if (preorder_ctrl->enable)
1342                                        DBG_871X_SEL_NL(m, "tid =%d, indicate_seq =%d\n",
1343                                                        j, preorder_ctrl->indicate_seq);
1344                        }
1345                        DBG_871X_SEL_NL(m, "==============================\n");
1346                }
1347        }
1348
1349        spin_unlock_bh(&pstapriv->sta_hash_lock);
1350
1351        return 0;
1352}
1353
1354int proc_get_btcoex_dbg(struct seq_file *m, void *v)
1355{
1356        struct net_device *dev = m->private;
1357        struct adapter *padapter;
1358        char buf[512] = {0};
1359        padapter = (struct adapter *)rtw_netdev_priv(dev);
1360
1361        rtw_btcoex_GetDBG(padapter, buf, 512);
1362
1363        DBG_871X_SEL(m, "%s", buf);
1364
1365        return 0;
1366}
1367
1368ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1369{
1370        struct net_device *dev = data;
1371        struct adapter *padapter;
1372        u8 tmp[80] = {0};
1373        u32 module[2] = {0};
1374        u32 num;
1375
1376        padapter = (struct adapter *)rtw_netdev_priv(dev);
1377
1378/*      DBG_871X("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));*/
1379
1380        if (NULL == buffer) {
1381                DBG_871X(FUNC_ADPT_FMT ": input buffer is NULL!\n",
1382                        FUNC_ADPT_ARG(padapter));
1383
1384                return -EFAULT;
1385        }
1386
1387        if (count < 1) {
1388                DBG_871X(FUNC_ADPT_FMT ": input length is 0!\n",
1389                        FUNC_ADPT_ARG(padapter));
1390
1391                return -EFAULT;
1392        }
1393
1394        num = count;
1395        if (num > (sizeof(tmp) - 1))
1396                num = (sizeof(tmp) - 1);
1397
1398        if (copy_from_user(tmp, buffer, num)) {
1399                DBG_871X(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
1400                        FUNC_ADPT_ARG(padapter));
1401
1402                return -EFAULT;
1403        }
1404
1405        num = sscanf(tmp, "%x %x", module, module+1);
1406        if (1 == num) {
1407                if (0 == module[0])
1408                        memset(module, 0, sizeof(module));
1409                else
1410                        memset(module, 0xFF, sizeof(module));
1411        } else if (2 != num) {
1412                DBG_871X(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n",
1413                        FUNC_ADPT_ARG(padapter), tmp);
1414
1415                if (0 == num)
1416                        return -EFAULT;
1417        }
1418
1419        DBG_871X(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n",
1420                FUNC_ADPT_ARG(padapter), module[0], module[1]);
1421        rtw_btcoex_SetDBG(padapter, module);
1422
1423        return count;
1424}
1425
1426int proc_get_btcoex_info(struct seq_file *m, void *v)
1427{
1428        struct net_device *dev = m->private;
1429        struct adapter *padapter;
1430        const u32 bufsize = 30*100;
1431        u8 *pbuf = NULL;
1432
1433        padapter = (struct adapter *)rtw_netdev_priv(dev);
1434
1435        pbuf = rtw_zmalloc(bufsize);
1436        if (NULL == pbuf) {
1437                return -ENOMEM;
1438        }
1439
1440        rtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);
1441
1442        DBG_871X_SEL(m, "%s\n", pbuf);
1443
1444        kfree(pbuf);
1445
1446        return 0;
1447}
1448
1449#endif
1450