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