72cad7378d2c9fd850bf7ecbe233c93f6d5d4577
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / core / rtw_debug.c
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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define _RTW_DEBUG_C_
21
22 #include <drv_types.h>
23
24 u32 GlobalDebugLevel = _drv_err_;
25
26 #ifdef CONFIG_DEBUG_RTL871X
27
28         u64 GlobalDebugComponents = \
29                         _module_rtl871x_xmit_c_ |
30                         _module_xmit_osdep_c_ |
31                         _module_rtl871x_recv_c_ |
32                         _module_recv_osdep_c_ |
33                         _module_rtl871x_mlme_c_ |
34                         _module_mlme_osdep_c_ |
35                         _module_rtl871x_sta_mgt_c_ |
36                         _module_rtl871x_cmd_c_ |
37                         _module_cmd_osdep_c_ |
38                         _module_rtl871x_io_c_ |
39                         _module_io_osdep_c_ |
40                         _module_os_intfs_c_|
41                         _module_rtl871x_security_c_|
42                         _module_rtl871x_eeprom_c_|
43                         _module_hal_init_c_|
44                         _module_hci_hal_init_c_|
45                         _module_rtl871x_ioctl_c_|
46                         _module_rtl871x_ioctl_set_c_|
47                         _module_rtl871x_ioctl_query_c_|
48                         _module_rtl871x_pwrctrl_c_|
49                         _module_hci_intfs_c_|
50                         _module_hci_ops_c_|
51                         _module_hci_ops_os_c_|
52                         _module_rtl871x_ioctl_os_c|
53                         _module_rtl8712_cmd_c_|
54                         _module_hal_xmit_c_|
55                         _module_rtl8712_recv_c_ |
56                         _module_mp_ |
57                         _module_efuse_;
58
59 #endif /* CONFIG_DEBUG_RTL871X */
60
61 #include <rtw_version.h>
62
63 void dump_drv_version(void *sel)
64 {
65         DBG_871X_SEL_NL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION);
66         DBG_871X_SEL_NL(sel, "build time: %s %s\n", __DATE__, __TIME__);
67 }
68
69 void dump_log_level(void *sel)
70 {
71         DBG_871X_SEL_NL(sel, "log_level:%d\n", GlobalDebugLevel);
72 }
73
74 #ifdef CONFIG_SDIO_HCI
75 void sd_f0_reg_dump(void *sel, _adapter *adapter)
76 {
77         int i;
78
79         for(i=0x0;i<=0xff;i++)
80         {       
81                 if(i%16==0)
82                         DBG_871X_SEL_NL(sel, "0x%02x ",i);
83
84                 DBG_871X_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i));
85
86                 if(i%16==15)
87                         DBG_871X_SEL(sel, "\n");
88                 else if(i%8==7)
89                         DBG_871X_SEL(sel, "\t");
90         }
91 }
92 #endif /* CONFIG_SDIO_HCI */
93
94 void mac_reg_dump(void *sel, _adapter *adapter)
95 {
96         int i, j = 1;
97
98         DBG_871X_SEL_NL(sel, "======= MAC REG =======\n");
99
100         for(i=0x0;i<0x800;i+=4)
101         {
102                 if(j%4==1)
103                         DBG_871X_SEL_NL(sel, "0x%03x",i);
104                 DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter,i));
105                 if((j++)%4 == 0)
106                         DBG_871X_SEL(sel, "\n");
107         }
108 }
109
110 void bb_reg_dump(void *sel, _adapter *adapter)
111 {
112         int i, j = 1;
113
114         DBG_871X_SEL_NL(sel, "======= BB REG =======\n");
115         for(i=0x800;i<0x1000;i+=4)
116         {
117                 if(j%4==1)
118                         DBG_871X_SEL_NL(sel, "0x%03x",i);
119                 DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter,i));
120                 if((j++)%4 == 0)
121                         DBG_871X_SEL(sel, "\n");
122         }
123 }
124
125 void rf_reg_dump(void *sel, _adapter *adapter)
126 {
127         int i, j = 1, path;
128         u32 value;
129         u8 rf_type = 0;
130         u8 path_nums = 0;
131
132         rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
133         if((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type ))
134                 path_nums = 1;
135         else
136                 path_nums = 2;
137
138         DBG_871X_SEL_NL(sel, "======= RF REG =======\n");
139
140         for (path=0;path<path_nums;path++) {
141                 DBG_871X_SEL_NL(sel, "RF_Path(%x)\n",path);
142                 for (i=0;i<0x100;i++) {
143                         //value = PHY_QueryRFReg(adapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
144                         value = rtw_hal_read_rfreg(adapter, path, i, 0xffffffff);
145                         if(j%4==1)
146                                 DBG_871X_SEL_NL(sel, "0x%02x ",i);
147                         DBG_871X_SEL(sel, " 0x%08x ",value);
148                         if((j++)%4==0)
149                                 DBG_871X_SEL(sel, "\n");
150                 }
151         }
152 }
153
154 static u8 fwdl_test_chksum_fail = 0;
155 static u8 fwdl_test_wintint_rdy_fail = 0;
156
157 bool rtw_fwdl_test_trigger_chksum_fail()
158 {
159         if (fwdl_test_chksum_fail) {
160                 DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger chksum_fail\n");
161                 fwdl_test_chksum_fail--;
162                 return _TRUE;
163         }
164         return _FALSE;
165 }
166
167 bool rtw_fwdl_test_trigger_wintint_rdy_fail()
168 {
169         if (fwdl_test_wintint_rdy_fail) {
170                 DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger wintint_rdy_fail\n");
171                 fwdl_test_wintint_rdy_fail--;
172                 return _TRUE;
173         }
174         return _FALSE;
175 }
176
177 static u32 g_wait_hiq_empty_ms = 0;
178
179 u32 rtw_get_wait_hiq_empty_ms()
180 {
181         return g_wait_hiq_empty_ms;
182 }
183
184 void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt)
185 {
186         struct recv_priv *precvpriv = &(adapter->recvpriv);
187         if( precvpriv->sink_udpport > 0)
188         {
189                 if(*((u16*)((pkt->data)+0x24)) == cpu_to_be16(precvpriv->sink_udpport))
190                 {
191                         precvpriv->pre_rtp_rxseq= precvpriv->cur_rtp_rxseq;
192                         precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16*)((pkt->data)+0x2C)));
193                         if( precvpriv->pre_rtp_rxseq+1 != precvpriv->cur_rtp_rxseq)
194                                 DBG_871X("%s : RTP Seq num from %d to %d\n",__FUNCTION__,precvpriv->pre_rtp_rxseq,precvpriv->cur_rtp_rxseq);
195                 }
196         }
197 }
198
199 #ifdef CONFIG_PROC_DEBUG
200 ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
201 {
202         struct net_device *dev = data;
203         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
204         char tmp[32];
205         u32 addr, val, len;
206
207         if (count < 3)
208         {
209                 DBG_871X("argument size is less than 3\n");
210                 return -EFAULT;
211         }       
212
213         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
214
215                 int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
216
217                 if (num !=  3) {
218                         DBG_871X("invalid write_reg parameter!\n");
219                         return count;
220                 }
221
222                 switch(len)
223                 {
224                         case 1:
225                                 rtw_write8(padapter, addr, (u8)val);                            
226                                 break;
227                         case 2:
228                                 rtw_write16(padapter, addr, (u16)val);                          
229                                 break;
230                         case 4:
231                                 rtw_write32(padapter, addr, val);                               
232                                 break;
233                         default:
234                                 DBG_871X("error write length=%d", len);
235                                 break;
236                 }                       
237                 
238         }
239         
240         return count;
241         
242 }
243
244 static u32 proc_get_read_addr=0xeeeeeeee;
245 static u32 proc_get_read_len=0x4;
246
247 int proc_get_read_reg(struct seq_file *m, void *v)
248 {
249         struct net_device *dev = m->private;
250         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
251
252         if (proc_get_read_addr==0xeeeeeeee) {
253                 DBG_871X_SEL_NL(m, "address not initialized\n");
254                 return 0;
255         }       
256
257         switch(proc_get_read_len)
258         {
259                 case 1:                 
260                         DBG_871X_SEL_NL(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));
261                         break;
262                 case 2:
263                         DBG_871X_SEL_NL(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));
264                         break;
265                 case 4:
266                         DBG_871X_SEL_NL(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));
267                         break;
268                 default:
269                         DBG_871X_SEL_NL(m, "error read length=%d\n", proc_get_read_len);
270                         break;
271         }
272
273         return 0;
274 }
275
276 ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
277 {
278         struct net_device *dev = data;
279         char tmp[16];
280         u32 addr, len;
281
282         if (count < 2)
283         {
284                 DBG_871X("argument size is less than 2\n");
285                 return -EFAULT;
286         }       
287
288         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
289
290                 int num = sscanf(tmp, "%x %x", &addr, &len);
291
292                 if (num !=  2) {
293                         DBG_871X("invalid read_reg parameter!\n");
294                         return count;
295                 }
296
297                 proc_get_read_addr = addr;
298                 
299                 proc_get_read_len = len;
300         }
301         
302         return count;
303
304 }
305
306 int proc_get_fwstate(struct seq_file *m, void *v)
307 {
308         struct net_device *dev = m->private;
309         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
310         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
311
312         DBG_871X_SEL_NL(m, "fwstate=0x%x\n", get_fwstate(pmlmepriv));
313
314         return 0;
315 }
316
317 int proc_get_sec_info(struct seq_file *m, void *v)
318 {
319         struct net_device *dev = m->private;
320         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
321         struct security_priv *sec = &padapter->securitypriv;
322
323         DBG_871X_SEL_NL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", 
324                                                 sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,
325                                                 sec->ndisauthtype, sec->ndisencryptstatus);
326
327         DBG_871X_SEL_NL(m, "hw_decrypted=%d\n", sec->hw_decrypted);
328
329 #ifdef DBG_SW_SEC_CNT
330         DBG_871X_SEL_NL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"
331                 , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
332         DBG_871X_SEL_NL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"
333                 , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
334
335         DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"
336                 , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);  
337         DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"
338                 , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
339
340         DBG_871X_SEL_NL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"
341                 , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
342         DBG_871X_SEL_NL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"
343                 , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
344 #endif /* DBG_SW_SEC_CNT */
345
346         return 0;
347 }
348
349 int proc_get_mlmext_state(struct seq_file *m, void *v)
350 {
351         struct net_device *dev = m->private;
352         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
353         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
354         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
355
356         DBG_871X_SEL_NL(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
357
358         return 0;
359 }
360
361 #ifdef CONFIG_LAYER2_ROAMING
362 int proc_get_roam_flags(struct seq_file *m, void *v)
363 {
364         struct net_device *dev = m->private;
365         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
366
367         DBG_871X_SEL_NL(m, "0x%02x\n", rtw_roam_flags(adapter));
368
369         return 0;
370 }
371
372 ssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
373 {
374         struct net_device *dev = data;
375         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
376
377         char tmp[32];
378         u8 flags;
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", &flags);
386
387                 if (num == 1)
388                         rtw_assign_roam_flags(adapter, flags);
389         }
390         
391         return count;
392         
393 }
394
395 int proc_get_roam_param(struct seq_file *m, void *v)
396 {
397         struct net_device *dev = m->private;
398         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
399         struct mlme_priv *mlme = &adapter->mlmepriv;
400
401         DBG_871X_SEL_NL(m, "%12s %12s %11s\n", "rssi_diff_th", "scanr_exp_ms", "scan_int_ms");
402         DBG_871X_SEL_NL(m, "%-12u %-12u %-11u\n"
403                 , mlme->roam_rssi_diff_th
404                 , mlme->roam_scanr_exp_ms
405                 , mlme->roam_scan_int_ms
406         );
407
408         return 0;
409 }
410
411 ssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
412 {
413         struct net_device *dev = data;
414         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
415         struct mlme_priv *mlme = &adapter->mlmepriv;
416
417         char tmp[32];
418         u8 rssi_diff_th;
419         u32 scanr_exp_ms;
420         u32 scan_int_ms;
421
422         if (count < 1)
423                 return -EFAULT;
424
425         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
426
427                 int num = sscanf(tmp, "%hhu %u %u", &rssi_diff_th, &scanr_exp_ms, &scan_int_ms);
428
429                 if (num >= 1)
430                         mlme->roam_rssi_diff_th = rssi_diff_th;
431                 if (num >= 2)
432                         mlme->roam_scanr_exp_ms = scanr_exp_ms;
433                 if (num >= 3)
434                         mlme->roam_scan_int_ms = scan_int_ms;
435         }
436         
437         return count;
438         
439 }
440
441 ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
442 {
443         struct net_device *dev = data;
444         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
445
446         char tmp[32];
447         u8 addr[ETH_ALEN];
448
449         if (count < 1)
450                 return -EFAULT;
451
452         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
453
454                 int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr+1, addr+2, addr+3, addr+4, addr+5);
455                 if (num == 6)
456                         _rtw_memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN);
457
458                 DBG_871X("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr));
459         }
460
461         return count;
462 }
463 #endif /* CONFIG_LAYER2_ROAMING */
464
465 int proc_get_qos_option(struct seq_file *m, void *v)
466 {
467         struct net_device *dev = m->private;
468         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
469         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
470
471         DBG_871X_SEL_NL(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);
472
473         return 0;
474 }
475
476 int proc_get_ht_option(struct seq_file *m, void *v)
477 {
478         struct net_device *dev = m->private;
479         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
480         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
481         
482 #ifdef CONFIG_80211N_HT
483         DBG_871X_SEL_NL(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);
484 #endif //CONFIG_80211N_HT
485
486         return 0;
487 }
488
489 int proc_get_rf_info(struct seq_file *m, void *v)
490 {
491         struct net_device *dev = m->private;
492         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
493         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;     
494
495         DBG_871X_SEL_NL(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", 
496                                         pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
497         
498         DBG_871X_SEL_NL(m, "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n", 
499                                         rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter),  rtw_get_oper_choffset(padapter));
500
501         return 0;
502 }
503
504 int proc_get_survey_info(struct seq_file *m, void *v)
505 {
506         _irqL irqL;
507         struct net_device *dev = m->private;
508         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
509         struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
510         _queue  *queue  = &(pmlmepriv->scanned_queue);
511         struct wlan_network     *pnetwork = NULL;
512         _list   *plist, *phead;
513         s32 notify_signal;
514         s16 notify_noise = 0;
515         u16  index = 0;
516
517         _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);    
518         phead = get_list_head(queue);
519         if(!phead)
520                 return 0;
521         plist = get_next(phead);
522         if (!plist)
523                 return 0;
524
525         DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
526         while(1)
527         {
528                 if (rtw_end_of_queue_search(phead,plist)== _TRUE)
529                         break;
530
531                 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
532                 if (!pnetwork)
533                         break;
534         
535                 if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
536                         is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
537                         notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm
538                 } else {
539                         notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
540                 }
541
542                 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
543                 rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));
544                 #endif
545         
546                 DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %4d  %5d  %s\n", 
547                         ++index,
548                         MAC_ARG(pnetwork->network.MacAddress), 
549                         pnetwork->network.Configuration.DSConfig,
550                         (int)pnetwork->network.Rssi,
551                         notify_signal,
552                         notify_noise,
553                         rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
554                         //translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
555                         pnetwork->network.Ssid.Ssid);
556                 plist = get_next(plist);
557         }
558         _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
559
560         return 0;
561 }
562
563 int proc_get_ap_info(struct seq_file *m, void *v)
564 {
565         struct net_device *dev = m->private;
566         struct sta_info *psta;
567         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
568         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
569         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
570         struct wlan_network *cur_network = &(pmlmepriv->cur_network);
571         struct sta_priv *pstapriv = &padapter->stapriv;
572
573         psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
574         if(psta)
575         {
576                 int i;
577                 struct recv_reorder_ctrl *preorder_ctrl;
578                                         
579                 DBG_871X_SEL_NL(m, "SSID=%s\n", cur_network->network.Ssid.Ssid);                
580                 DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
581                 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);          
582                 DBG_871X_SEL_NL(m, "wireless_mode=0x%x, rtsen=%d, cts2slef=%d\n", psta->wireless_mode, psta->rtsen, psta->cts2self);
583                 DBG_871X_SEL_NL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
584 #ifdef CONFIG_80211N_HT
585                 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);           
586                 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);
587                 DBG_871X_SEL_NL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);   
588                 DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
589                 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);
590 #endif //CONFIG_80211N_HT
591 #ifdef CONFIG_80211AC_VHT
592                 DBG_871X_SEL_NL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m);
593                 DBG_871X_SEL_NL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap);
594                 DBG_871X_SEL_NL(m, "vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\n", *(u16*)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len);
595 #endif
596                                         
597                 for(i=0;i<16;i++)
598                 {                                                       
599                         preorder_ctrl = &psta->recvreorder_ctrl[i];
600                         if(preorder_ctrl->enable)
601                         {
602                                 DBG_871X_SEL_NL(m, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
603                         }
604                 }       
605                                                         
606         }
607         else
608         {                                                       
609                 DBG_871X_SEL_NL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
610         }
611
612         return 0;
613 }
614
615 int proc_get_adapter_state(struct seq_file *m, void *v)
616 {
617         struct net_device *dev = m->private;
618         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
619
620 #ifdef CONFIG_CONCURRENT_MODE
621         DBG_871X_SEL_NL(m, "name=%s, iface_type=%d, bSurpriseRemoved=%d, bDriverStopped=%d\n",
622                                         dev->name, padapter->iface_type,
623                                         padapter->bSurpriseRemoved, padapter->bDriverStopped);
624 #else
625         DBG_871X_SEL_NL(m, "name=%s, bSurpriseRemoved=%d, bDriverStopped=%d\n",
626                                         dev->name, padapter->bSurpriseRemoved, padapter->bDriverStopped);
627 #endif
628
629         return 0;
630 }
631         
632 int proc_get_trx_info(struct seq_file *m, void *v)
633 {
634         struct net_device *dev = m->private;
635         int i;
636         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
637         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
638         struct recv_priv  *precvpriv = &padapter->recvpriv;
639         struct hw_xmit *phwxmit;
640
641         dump_os_queue(m, padapter);
642
643         DBG_871X_SEL_NL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n"
644                 , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);
645         DBG_871X_SEL_NL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n"
646                 , pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt);
647         DBG_871X_SEL_NL(m, "free_recvframe_cnt=%d\n"
648                 , precvpriv->free_recvframe_cnt);
649
650         for(i = 0; i < 4; i++) 
651         {
652                 phwxmit = pxmitpriv->hwxmits + i;
653                 DBG_871X_SEL_NL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt);
654         }
655
656 #ifdef CONFIG_USB_HCI
657         DBG_871X_SEL_NL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));
658 #endif
659
660         return 0;
661 }
662
663 int proc_get_dis_pwt(struct seq_file *m, void *v)
664 {
665         struct net_device *dev = m->private;
666         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
667         u8 dis_pwt = 0;
668         rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
669         DBG_871X_SEL_NL(m, " Tx Power training mode:%s \n",(dis_pwt==_TRUE)?"Disable":"Enable");
670         return 0;
671 }
672 ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
673 {
674         struct net_device *dev = data;
675         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
676         char tmp[4]={0};
677         u8 dis_pwt = 0;
678         
679         if (count < 1)
680                 return -EFAULT;
681         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
682
683                 int num = sscanf(tmp, "%hhx", &dis_pwt);
684                 DBG_871X("Set Tx Power training mode:%s \n",(dis_pwt==_TRUE)?"Disable":"Enable");
685                 
686                 if (num >= 1)
687                         rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
688         }
689
690         return count;
691         
692 }
693
694 int proc_get_rate_ctl(struct seq_file *m, void *v)
695 {
696         struct net_device *dev = m->private;
697         int i;
698         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
699         u8 data_rate = 0, sgi=0, data_fb = 0;
700                 
701         if (adapter->fix_rate != 0xff) {
702                 data_rate = adapter->fix_rate & 0x7F;
703                 sgi = adapter->fix_rate >>7;
704                 data_fb = adapter->data_fb?1:0;
705                 DBG_871X_SEL_NL(m, "FIXED %s%s%s\n"
706                         , HDATA_RATE(data_rate)
707                         , sgi?" SGI":" LGI"
708                         , data_fb?" FB":""
709                 );
710                 DBG_871X_SEL_NL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb);
711         } else {
712                 DBG_871X_SEL_NL(m, "RA\n");
713         }
714
715         return 0;
716 }
717
718 ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
719 {
720         struct net_device *dev = data;
721         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
722         char tmp[32];
723         u8 fix_rate;
724         u8 data_fb;
725
726         if (count < 1)
727                 return -EFAULT;
728
729         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
730
731                 int num = sscanf(tmp, "%hhx %hhu", &fix_rate, &data_fb);
732
733                 if (num >= 1)
734                         adapter->fix_rate = fix_rate;
735                 if (num >= 2)
736                         adapter->data_fb = data_fb?1:0;
737         }
738
739         return count;
740 }
741
742 ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
743 {
744         struct net_device *dev = data;
745         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
746         char tmp[32];
747
748         if (count < 1)
749                 return -EFAULT;
750
751         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
752                 int num = sscanf(tmp, "%hhu %hhu", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);
753         }
754
755         return count;
756 }
757
758 ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
759 {
760         struct net_device *dev = data;
761         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
762         char tmp[32];
763
764         if (count < 1)
765                 return -EFAULT;
766
767         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
768                 int num = sscanf(tmp, "%u", &g_wait_hiq_empty_ms);
769         }
770
771         return count;
772 }
773
774 int proc_get_suspend_resume_info(struct seq_file *m, void *v)
775 {
776         struct net_device *dev = m->private;
777         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
778         struct dvobj_priv *dvobj = padapter->dvobj;
779         struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
780
781         DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt);
782         DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_cnt);
783         DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_error_cnt=%d\n",pdbgpriv->dbg_sdio_alloc_irq_error_cnt);
784         DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt);
785         DBG_871X_SEL_NL(m, "dbg_sdio_init_error_cnt=%d\n",pdbgpriv->dbg_sdio_init_error_cnt);
786         DBG_871X_SEL_NL(m, "dbg_sdio_deinit_error_cnt=%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt);
787         DBG_871X_SEL_NL(m, "dbg_suspend_error_cnt=%d\n", pdbgpriv->dbg_suspend_error_cnt);
788         DBG_871X_SEL_NL(m, "dbg_suspend_cnt=%d\n",pdbgpriv->dbg_suspend_cnt);
789         DBG_871X_SEL_NL(m, "dbg_resume_cnt=%d\n", pdbgpriv->dbg_resume_cnt);
790         DBG_871X_SEL_NL(m, "dbg_resume_error_cnt=%d\n", pdbgpriv->dbg_resume_error_cnt);
791         DBG_871X_SEL_NL(m, "dbg_deinit_fail_cnt=%d\n",pdbgpriv->dbg_deinit_fail_cnt);
792         DBG_871X_SEL_NL(m, "dbg_carddisable_cnt=%d\n", pdbgpriv->dbg_carddisable_cnt);
793         DBG_871X_SEL_NL(m, "dbg_ps_insuspend_cnt=%d\n",pdbgpriv->dbg_ps_insuspend_cnt);
794         DBG_871X_SEL_NL(m, "dbg_dev_unload_inIPS_cnt=%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt);
795         DBG_871X_SEL_NL(m, "dbg_scan_pwr_state_cnt=%d\n", pdbgpriv->dbg_scan_pwr_state_cnt);
796         DBG_871X_SEL_NL(m, "dbg_downloadfw_pwr_state_cnt=%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt);
797         DBG_871X_SEL_NL(m, "dbg_carddisable_error_cnt=%d\n", pdbgpriv->dbg_carddisable_error_cnt);
798         DBG_871X_SEL_NL(m, "dbg_fw_read_ps_state_fail_cnt=%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt);
799         DBG_871X_SEL_NL(m, "dbg_leave_ips_fail_cnt=%d\n", pdbgpriv->dbg_leave_ips_fail_cnt);
800         DBG_871X_SEL_NL(m, "dbg_leave_lps_fail_cnt=%d\n", pdbgpriv->dbg_leave_lps_fail_cnt);
801         DBG_871X_SEL_NL(m, "dbg_h2c_leave32k_fail_cnt=%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt);
802         DBG_871X_SEL_NL(m, "dbg_diswow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt);
803         DBG_871X_SEL_NL(m, "dbg_enwow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt);
804         DBG_871X_SEL_NL(m, "dbg_ips_drvopen_fail_cnt=%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt);
805         DBG_871X_SEL_NL(m, "dbg_poll_fail_cnt=%d\n", pdbgpriv->dbg_poll_fail_cnt);
806         DBG_871X_SEL_NL(m, "dbg_rpwm_toogle_cnt=%d\n", pdbgpriv->dbg_rpwm_toogle_cnt);
807         DBG_871X_SEL_NL(m, "dbg_rpwm_timeout_fail_cnt=%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt);
808         DBG_871X_SEL_NL(m, "dbg_sreset_cnt=%d\n", pdbgpriv->dbg_sreset_cnt);
809
810         return 0;
811 }
812
813 #ifdef CONFIG_DBG_COUNTER
814
815 int proc_get_rx_logs(struct seq_file *m, void *v)
816 {
817         struct net_device *dev = m->private;
818         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
819         struct rx_logs *rx_logs = &padapter->rx_logs;
820
821         DBG_871X_SEL_NL(m, 
822                 "intf_rx=%d\n"
823                 "intf_rx_err_recvframe=%d\n"
824                 "intf_rx_err_skb=%d\n"
825                 "intf_rx_report=%d\n"
826                 "core_rx=%d\n"
827                 "core_rx_pre=%d\n"
828                 "core_rx_pre_ver_err=%d\n"
829                 "core_rx_pre_mgmt=%d\n"
830                 "core_rx_pre_mgmt_err_80211w=%d\n"
831                 "core_rx_pre_mgmt_err=%d\n"
832                 "core_rx_pre_ctrl=%d\n"
833                 "core_rx_pre_ctrl_err=%d\n"
834                 "core_rx_pre_data=%d\n"
835                 "core_rx_pre_data_wapi_seq_err=%d\n"
836                 "core_rx_pre_data_wapi_key_err=%d\n"
837                 "core_rx_pre_data_handled=%d\n"
838                 "core_rx_pre_data_err=%d\n"
839                 "core_rx_pre_data_unknown=%d\n"
840                 "core_rx_pre_unknown=%d\n"
841                 "core_rx_enqueue=%d\n"
842                 "core_rx_dequeue=%d\n"
843                 "core_rx_post=%d\n"
844                 "core_rx_post_decrypt=%d\n"
845                 "core_rx_post_decrypt_wep=%d\n"
846                 "core_rx_post_decrypt_tkip=%d\n"
847                 "core_rx_post_decrypt_aes=%d\n"
848                 "core_rx_post_decrypt_wapi=%d\n"
849                 "core_rx_post_decrypt_hw=%d\n"
850                 "core_rx_post_decrypt_unknown=%d\n"
851                 "core_rx_post_decrypt_err=%d\n"
852                 "core_rx_post_defrag_err=%d\n"
853                 "core_rx_post_portctrl_err=%d\n"
854                 "core_rx_post_indicate=%d\n"
855                 "core_rx_post_indicate_in_oder=%d\n"
856                 "core_rx_post_indicate_reoder=%d\n"
857                 "core_rx_post_indicate_err=%d\n"
858                 "os_indicate=%d\n"
859                 "os_indicate_ap_mcast=%d\n"
860                 "os_indicate_ap_forward=%d\n"
861                 "os_indicate_ap_self=%d\n"
862                 "os_indicate_err=%d\n"
863                 "os_netif_ok=%d\n"
864                 "os_netif_err=%d\n",
865                 rx_logs->intf_rx,
866                 rx_logs->intf_rx_err_recvframe,
867                 rx_logs->intf_rx_err_skb,
868                 rx_logs->intf_rx_report,
869                 rx_logs->core_rx,
870                 rx_logs->core_rx_pre,
871                 rx_logs->core_rx_pre_ver_err,
872                 rx_logs->core_rx_pre_mgmt,
873                 rx_logs->core_rx_pre_mgmt_err_80211w,
874                 rx_logs->core_rx_pre_mgmt_err,
875                 rx_logs->core_rx_pre_ctrl,
876                 rx_logs->core_rx_pre_ctrl_err,
877                 rx_logs->core_rx_pre_data,
878                 rx_logs->core_rx_pre_data_wapi_seq_err,
879                 rx_logs->core_rx_pre_data_wapi_key_err,
880                 rx_logs->core_rx_pre_data_handled,
881                 rx_logs->core_rx_pre_data_err,
882                 rx_logs->core_rx_pre_data_unknown,
883                 rx_logs->core_rx_pre_unknown,
884                 rx_logs->core_rx_enqueue,
885                 rx_logs->core_rx_dequeue,
886                 rx_logs->core_rx_post,
887                 rx_logs->core_rx_post_decrypt,
888                 rx_logs->core_rx_post_decrypt_wep,
889                 rx_logs->core_rx_post_decrypt_tkip,
890                 rx_logs->core_rx_post_decrypt_aes,
891                 rx_logs->core_rx_post_decrypt_wapi,
892                 rx_logs->core_rx_post_decrypt_hw,
893                 rx_logs->core_rx_post_decrypt_unknown,
894                 rx_logs->core_rx_post_decrypt_err,
895                 rx_logs->core_rx_post_defrag_err,
896                 rx_logs->core_rx_post_portctrl_err,
897                 rx_logs->core_rx_post_indicate,
898                 rx_logs->core_rx_post_indicate_in_oder,
899                 rx_logs->core_rx_post_indicate_reoder,
900                 rx_logs->core_rx_post_indicate_err,
901                 rx_logs->os_indicate,
902                 rx_logs->os_indicate_ap_mcast,
903                 rx_logs->os_indicate_ap_forward,
904                 rx_logs->os_indicate_ap_self,
905                 rx_logs->os_indicate_err,
906                 rx_logs->os_netif_ok,
907                 rx_logs->os_netif_err
908         );
909
910         return 0;
911 }
912
913 int proc_get_tx_logs(struct seq_file *m, void *v)
914 {
915         struct net_device *dev = m->private;
916         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
917         struct tx_logs *tx_logs = &padapter->tx_logs;
918         
919         DBG_871X_SEL_NL(m,
920                 "os_tx=%d\n"
921                 "os_tx_err_up=%d\n"
922                 "os_tx_err_xmit=%d\n"
923                 "os_tx_m2u=%d\n"
924                 "os_tx_m2u_ignore_fw_linked=%d\n"
925                 "os_tx_m2u_ignore_self=%d\n"
926                 "os_tx_m2u_entry=%d\n"
927                 "os_tx_m2u_entry_err_xmit=%d\n"
928                 "os_tx_m2u_entry_err_skb=%d\n"
929                 "os_tx_m2u_stop=%d\n"
930                 "core_tx=%d\n"
931                 "core_tx_err_pxmitframe=%d\n"
932                 "core_tx_err_brtx=%d\n"
933                 "core_tx_upd_attrib=%d\n"
934                 "core_tx_upd_attrib_adhoc=%d\n"
935                 "core_tx_upd_attrib_sta=%d\n"
936                 "core_tx_upd_attrib_ap=%d\n"
937                 "core_tx_upd_attrib_unknown=%d\n"
938                 "core_tx_upd_attrib_dhcp=%d\n"
939                 "core_tx_upd_attrib_icmp=%d\n"
940                 "core_tx_upd_attrib_active=%d\n"
941                 "core_tx_upd_attrib_err_ucast_sta=%d\n"
942                 "core_tx_upd_attrib_err_ucast_ap_link=%d\n"
943                 "core_tx_upd_attrib_err_sta=%d\n"
944                 "core_tx_upd_attrib_err_link=%d\n"
945                 "core_tx_upd_attrib_err_sec=%d\n"
946                 "core_tx_ap_enqueue_warn_fwstate=%d\n"
947                 "core_tx_ap_enqueue_warn_sta=%d\n"
948                 "core_tx_ap_enqueue_warn_nosta=%d\n"
949                 "core_tx_ap_enqueue_warn_link=%d\n"
950                 "core_tx_ap_enqueue_warn_trigger=%d\n"
951                 "core_tx_ap_enqueue_mcast=%d\n"
952                 "core_tx_ap_enqueue_ucast=%d\n"
953                 "core_tx_ap_enqueue=%d\n"
954                 "intf_tx=%d\n"
955                 "intf_tx_pending_ac=%d\n"
956                 "intf_tx_pending_fw_under_survey=%d\n"
957                 "intf_tx_pending_fw_under_linking=%d\n"
958                 "intf_tx_pending_xmitbuf=%d\n"
959                 "intf_tx_enqueue=%d\n"
960                 "core_tx_enqueue=%d\n"
961                 "core_tx_enqueue_class=%d\n"
962                 "core_tx_enqueue_class_err_sta=%d\n"
963                 "core_tx_enqueue_class_err_nosta=%d\n"
964                 "core_tx_enqueue_class_err_fwlink=%d\n"
965                 "intf_tx_direct=%d\n"
966                 "intf_tx_direct_err_coalesce=%d\n"
967                 "intf_tx_dequeue=%d\n"
968                 "intf_tx_dequeue_err_coalesce=%d\n"
969                 "intf_tx_dump_xframe=%d\n"
970                 "intf_tx_dump_xframe_err_txdesc=%d\n"
971                 "intf_tx_dump_xframe_err_port=%d\n",
972                 tx_logs->os_tx,
973                 tx_logs->os_tx_err_up,
974                 tx_logs->os_tx_err_xmit,
975                 tx_logs->os_tx_m2u,
976                 tx_logs->os_tx_m2u_ignore_fw_linked,
977                 tx_logs->os_tx_m2u_ignore_self,
978                 tx_logs->os_tx_m2u_entry,
979                 tx_logs->os_tx_m2u_entry_err_xmit,
980                 tx_logs->os_tx_m2u_entry_err_skb,
981                 tx_logs->os_tx_m2u_stop,
982                 tx_logs->core_tx,
983                 tx_logs->core_tx_err_pxmitframe,
984                 tx_logs->core_tx_err_brtx,
985                 tx_logs->core_tx_upd_attrib,
986                 tx_logs->core_tx_upd_attrib_adhoc,
987                 tx_logs->core_tx_upd_attrib_sta,
988                 tx_logs->core_tx_upd_attrib_ap,
989                 tx_logs->core_tx_upd_attrib_unknown,
990                 tx_logs->core_tx_upd_attrib_dhcp,
991                 tx_logs->core_tx_upd_attrib_icmp,
992                 tx_logs->core_tx_upd_attrib_active,
993                 tx_logs->core_tx_upd_attrib_err_ucast_sta,
994                 tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
995                 tx_logs->core_tx_upd_attrib_err_sta,
996                 tx_logs->core_tx_upd_attrib_err_link,
997                 tx_logs->core_tx_upd_attrib_err_sec,
998                 tx_logs->core_tx_ap_enqueue_warn_fwstate,
999                 tx_logs->core_tx_ap_enqueue_warn_sta,
1000                 tx_logs->core_tx_ap_enqueue_warn_nosta,
1001                 tx_logs->core_tx_ap_enqueue_warn_link,
1002                 tx_logs->core_tx_ap_enqueue_warn_trigger,
1003                 tx_logs->core_tx_ap_enqueue_mcast,
1004                 tx_logs->core_tx_ap_enqueue_ucast,
1005                 tx_logs->core_tx_ap_enqueue,
1006                 tx_logs->intf_tx,
1007                 tx_logs->intf_tx_pending_ac,
1008                 tx_logs->intf_tx_pending_fw_under_survey,
1009                 tx_logs->intf_tx_pending_fw_under_linking,
1010                 tx_logs->intf_tx_pending_xmitbuf,
1011                 tx_logs->intf_tx_enqueue,
1012                 tx_logs->core_tx_enqueue,
1013                 tx_logs->core_tx_enqueue_class,
1014                 tx_logs->core_tx_enqueue_class_err_sta,
1015                 tx_logs->core_tx_enqueue_class_err_nosta,
1016                 tx_logs->core_tx_enqueue_class_err_fwlink,
1017                 tx_logs->intf_tx_direct,
1018                 tx_logs->intf_tx_direct_err_coalesce,
1019                 tx_logs->intf_tx_dequeue,
1020                 tx_logs->intf_tx_dequeue_err_coalesce,
1021                 tx_logs->intf_tx_dump_xframe,
1022                 tx_logs->intf_tx_dump_xframe_err_txdesc,
1023                 tx_logs->intf_tx_dump_xframe_err_port
1024         );
1025
1026         return 0;
1027 }
1028
1029 int proc_get_int_logs(struct seq_file *m, void *v)
1030 {
1031         struct net_device *dev = m->private;
1032         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1033
1034         DBG_871X_SEL_NL(m,
1035                 "all=%d\n"
1036                 "err=%d\n"
1037                 "tbdok=%d\n"
1038                 "tbder=%d\n"
1039                 "bcnderr=%d\n"
1040                 "bcndma=%d\n"
1041                 "bcndma_e=%d\n"
1042                 "rx=%d\n"
1043                 "rx_rdu=%d\n"
1044                 "rx_fovw=%d\n"
1045                 "txfovw=%d\n"
1046                 "mgntok=%d\n"
1047                 "highdok=%d\n"
1048                 "bkdok=%d\n"
1049                 "bedok=%d\n"
1050                 "vidok=%d\n"
1051                 "vodok=%d\n",
1052                 padapter->int_logs.all,
1053                 padapter->int_logs.err,
1054                 padapter->int_logs.tbdok,
1055                 padapter->int_logs.tbder,
1056                 padapter->int_logs.bcnderr,
1057                 padapter->int_logs.bcndma,
1058                 padapter->int_logs.bcndma_e,
1059                 padapter->int_logs.rx,
1060                 padapter->int_logs.rx_rdu,
1061                 padapter->int_logs.rx_fovw,
1062                 padapter->int_logs.txfovw,
1063                 padapter->int_logs.mgntok,
1064                 padapter->int_logs.highdok,
1065                 padapter->int_logs.bkdok,
1066                 padapter->int_logs.bedok,
1067                 padapter->int_logs.vidok,
1068                 padapter->int_logs.vodok
1069         );
1070
1071         return 0;
1072 }
1073
1074 #endif // CONFIG_DBG_COUNTER
1075
1076 int proc_get_hw_status(struct seq_file *m, void *v)
1077 {
1078         struct net_device *dev = m->private;
1079         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1080         struct dvobj_priv *dvobj = padapter->dvobj;
1081         struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
1082
1083         DBG_871X_SEL_NL(m, "RX FIFO full count: last_time=%lld, current_time=%lld, differential=%lld\n"
1084         , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
1085
1086         return 0;
1087 }
1088
1089 int proc_get_rx_signal(struct seq_file *m, void *v)
1090 {
1091         struct net_device *dev = m->private;
1092         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1093         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1094
1095         DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi);
1096         //DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
1097         DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
1098         DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
1099         DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise);
1100         rtw_odm_get_perpkt_rssi(m,padapter);
1101         #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1102         rtw_get_raw_rssi_info(m,padapter);
1103         #endif
1104         return 0;
1105 }
1106
1107 ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1108 {
1109         struct net_device *dev = data;
1110         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1111         char tmp[32];
1112         u32 is_signal_dbg, signal_strength;
1113
1114         if (count < 1)
1115                 return -EFAULT;
1116
1117         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1118
1119                 int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
1120
1121                 is_signal_dbg = is_signal_dbg==0?0:1;
1122                 
1123                 if(is_signal_dbg && num!=2)
1124                         return count;
1125                         
1126                 signal_strength = signal_strength>100?100:signal_strength;
1127
1128                 padapter->recvpriv.is_signal_dbg = is_signal_dbg;
1129                 padapter->recvpriv.signal_strength_dbg=signal_strength;
1130
1131                 if(is_signal_dbg)
1132                         DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
1133                 else
1134                         DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH");
1135                 
1136         }
1137         
1138         return count;
1139         
1140 }
1141 #ifdef CONFIG_80211N_HT
1142
1143 int proc_get_ht_enable(struct seq_file *m, void *v)
1144 {
1145         struct net_device *dev = m->private;
1146         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1147         struct registry_priv    *pregpriv = &padapter->registrypriv;
1148
1149         if(pregpriv)
1150                 DBG_871X_SEL_NL(m, "%d\n", pregpriv->ht_enable);
1151
1152         return 0;
1153 }
1154
1155 ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1156 {
1157         struct net_device *dev = data;
1158         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1159         struct registry_priv    *pregpriv = &padapter->registrypriv;
1160         char tmp[32];
1161         u32 mode;
1162
1163         if (count < 1)
1164                 return -EFAULT;
1165
1166         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1167
1168                 int num = sscanf(tmp, "%d ", &mode);
1169
1170                 if( pregpriv && mode < 2 )
1171                 {
1172                         pregpriv->ht_enable= mode;
1173                         DBG_871X("ht_enable=%d\n", pregpriv->ht_enable);
1174                 }
1175         }
1176         
1177         return count;
1178         
1179 }
1180
1181 int proc_get_bw_mode(struct seq_file *m, void *v)
1182 {
1183         struct net_device *dev = m->private;
1184         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1185         struct registry_priv    *pregpriv = &padapter->registrypriv;
1186
1187         if(pregpriv)
1188                 DBG_871X_SEL_NL(m, "0x%02x\n", pregpriv->bw_mode);
1189
1190         return 0;
1191 }
1192
1193 ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1194 {
1195         struct net_device *dev = data;
1196         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1197         struct registry_priv    *pregpriv = &padapter->registrypriv;
1198         char tmp[32];
1199         u32 mode;
1200
1201         if (count < 1)
1202                 return -EFAULT;
1203
1204         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1205
1206                 int num = sscanf(tmp, "%d ", &mode);
1207
1208                 if( pregpriv &&  mode < 2 )
1209                 {
1210
1211                         pregpriv->bw_mode = mode;
1212                         printk("bw_mode=%d\n", mode);
1213
1214                 }
1215         }
1216         
1217         return count;
1218         
1219 }
1220
1221 int proc_get_ampdu_enable(struct seq_file *m, void *v)
1222 {
1223         struct net_device *dev = m->private;
1224         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1225         struct registry_priv    *pregpriv = &padapter->registrypriv;
1226
1227         if(pregpriv)
1228                 DBG_871X_SEL_NL(m, "%d\n", pregpriv->ampdu_enable);
1229
1230         return 0;
1231 }
1232
1233 ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1234 {
1235         struct net_device *dev = data;
1236         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1237         struct registry_priv    *pregpriv = &padapter->registrypriv;
1238         char tmp[32];
1239         u32 mode;
1240
1241         if (count < 1)
1242                 return -EFAULT;
1243
1244         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1245
1246                 int num = sscanf(tmp, "%d ", &mode);
1247
1248                 if( pregpriv && mode < 3 )
1249                 {
1250                         pregpriv->ampdu_enable= mode;
1251                         printk("ampdu_enable=%d\n", mode);
1252                 }
1253
1254         }
1255         
1256         return count;
1257         
1258 }
1259
1260 int proc_get_rx_ampdu(struct seq_file *m, void *v)
1261 {
1262         struct net_device *dev = m->private;
1263         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1264         struct registry_priv    *pregpriv = &padapter->registrypriv;
1265         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
1266         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
1267
1268         if(pregpriv)
1269                 DBG_871X_SEL_NL(m,
1270                         "bAcceptAddbaReq = %d , 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.\n", pmlmeinfo->bAcceptAddbaReq
1271                         );
1272
1273         return 0;
1274 }
1275
1276 ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1277 {
1278         struct net_device *dev = data;
1279         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1280         struct registry_priv    *pregpriv = &padapter->registrypriv;
1281         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
1282         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
1283         char tmp[32];
1284         u32 mode;
1285
1286         if (count < 1)
1287                 return -EFAULT;
1288
1289         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1290
1291                 int num = sscanf(tmp, "%d ", &mode);
1292
1293                 if( pregpriv && mode < 2 )
1294                 {
1295                         pmlmeinfo->bAcceptAddbaReq = mode;
1296                         DBG_871X("pmlmeinfo->bAcceptAddbaReq=%d \n",pmlmeinfo->bAcceptAddbaReq);
1297                         if(mode == 0)
1298                         {
1299                                 //tear down Rx AMPDU
1300                                 send_delba(padapter, 0, get_my_bssid(&(pmlmeinfo->network)));// recipient
1301                         }
1302                 }
1303
1304         }
1305
1306         return count;
1307 }
1308 int proc_get_rx_ampdu_factor(struct seq_file *m, void *v)
1309 {
1310         struct net_device *dev = m->private;
1311         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1312
1313
1314         if(padapter)
1315         {
1316                 DBG_871X_SEL_NL(m,"rx ampdu factor = %x\n",padapter->driver_rx_ampdu_factor);
1317         }
1318         
1319         return 0;
1320 }
1321
1322 ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer
1323                                  , size_t count, loff_t *pos, void *data)
1324 {
1325         struct net_device *dev = data;
1326         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1327         char tmp[32];
1328         u32 factor;
1329
1330         if (count < 1)
1331                 return -EFAULT;
1332
1333         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
1334         {
1335
1336                 int num = sscanf(tmp, "%d ", &factor);
1337
1338                 if( padapter && (num == 1) )
1339                 {
1340                         DBG_871X("padapter->driver_rx_ampdu_factor = %x\n", factor);
1341
1342                         if(factor  > 0x03)
1343                                 padapter->driver_rx_ampdu_factor = 0xFF;
1344                         else
1345                                 padapter->driver_rx_ampdu_factor = factor;                      
1346                 }
1347         }
1348
1349         return count;
1350 }
1351
1352 int proc_get_rx_ampdu_density(struct seq_file *m, void *v)
1353 {
1354         struct net_device *dev = m->private;
1355         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1356
1357
1358         if(padapter)
1359         {
1360                 DBG_871X_SEL_NL(m,"rx ampdu densityg = %x\n",padapter->driver_rx_ampdu_spacing);
1361         }
1362
1363         return 0;
1364 }
1365
1366 ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1367 {
1368         struct net_device *dev = data;
1369         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1370         char tmp[32];
1371         u32 density;
1372
1373         if (count < 1)
1374                 return -EFAULT;
1375
1376         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
1377         {
1378
1379                 int num = sscanf(tmp, "%d ", &density);
1380
1381                 if( padapter && (num == 1) )
1382                 {
1383                         DBG_871X("padapter->driver_rx_ampdu_spacing = %x\n", density);
1384
1385                         if(density > 0x07)
1386                                 padapter->driver_rx_ampdu_spacing = 0xFF;
1387                         else
1388                                 padapter->driver_rx_ampdu_spacing = density;
1389                 }
1390         }
1391
1392         return count;
1393 }
1394
1395 int proc_get_tx_ampdu_density(struct seq_file *m, void *v)
1396 {
1397         struct net_device *dev = m->private;
1398         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1399
1400
1401         if(padapter)
1402         {
1403                 DBG_871X_SEL_NL(m,"tx ampdu density = %x\n",padapter->driver_ampdu_spacing);
1404         }
1405
1406         return 0;
1407 }
1408
1409 ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1410 {
1411         struct net_device *dev = data;
1412         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1413         char tmp[32];
1414         u32 density;
1415
1416         if (count < 1)
1417                 return -EFAULT;
1418
1419         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
1420         {
1421
1422                 int num = sscanf(tmp, "%d ", &density);
1423
1424                 if( padapter && (num == 1) )
1425                 {
1426                         DBG_871X("padapter->driver_ampdu_spacing = %x\n", density);
1427
1428                         if(density > 0x07)
1429                                 padapter->driver_ampdu_spacing = 0xFF;
1430                         else
1431                                 padapter->driver_ampdu_spacing = density;
1432                 }
1433         }
1434
1435         return count;
1436 }
1437 #endif //CONFIG_80211N_HT
1438
1439 int proc_get_en_fwps(struct seq_file *m, void *v)
1440 {
1441         struct net_device *dev = m->private;
1442         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1443         struct registry_priv    *pregpriv = &padapter->registrypriv;
1444         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
1445         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
1446
1447         if(pregpriv)
1448                 DBG_871X_SEL_NL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n"
1449                         , pregpriv->check_fw_ps);
1450
1451         return 0;
1452 }
1453
1454 ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1455 {
1456         struct net_device *dev = data;
1457         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1458         struct registry_priv    *pregpriv = &padapter->registrypriv;
1459         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
1460         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
1461         char tmp[32];
1462         u32 mode;
1463
1464         if (count < 1)
1465                 return -EFAULT;
1466
1467         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
1468
1469                 int num = sscanf(tmp, "%d ", &mode);
1470
1471                 if( pregpriv &&  mode < 2 )
1472                 {
1473                         pregpriv->check_fw_ps = mode;
1474                         DBG_871X("pregpriv->check_fw_ps=%d \n",pregpriv->check_fw_ps);
1475                 }
1476
1477         }
1478
1479         return count;
1480 }
1481
1482 /*
1483 int proc_get_two_path_rssi(struct seq_file *m, void *v)
1484 {
1485         struct net_device *dev = m->private;
1486         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1487
1488         if(padapter)
1489                 DBG_871X_SEL_NL(m, "%d %d\n",
1490                         padapter->recvpriv.RxRssi[0], padapter->recvpriv.RxRssi[1]);
1491
1492         return 0;
1493 }
1494 */
1495 #ifdef CONFIG_80211N_HT
1496 int proc_get_rx_stbc(struct seq_file *m, void *v)
1497 {
1498         struct net_device *dev = m->private;
1499         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1500         struct registry_priv    *pregpriv = &padapter->registrypriv;
1501
1502         if(pregpriv)
1503                 DBG_871X_SEL_NL(m, "%d\n", pregpriv->rx_stbc);
1504
1505         return 0;
1506 }
1507
1508 ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1509 {
1510         struct net_device *dev = data;
1511         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1512         struct registry_priv    *pregpriv = &padapter->registrypriv;
1513         char tmp[32];
1514         u32 mode;
1515
1516         if (count < 1)
1517                 return -EFAULT;
1518
1519         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1520
1521                 int num = sscanf(tmp, "%d ", &mode);
1522
1523                 if( pregpriv && (mode == 0 || mode == 1|| mode == 2|| mode == 3))
1524                 {
1525                         pregpriv->rx_stbc= mode;
1526                         printk("rx_stbc=%d\n", mode);
1527                 }
1528         }
1529         
1530         return count;
1531         
1532 }
1533 #endif //CONFIG_80211N_HT
1534
1535 /*int proc_get_rssi_disp(struct seq_file *m, void *v)
1536 {
1537         struct net_device *dev = m->private;
1538         return 0;
1539 }
1540 */
1541
1542 /*ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1543 {
1544         struct net_device *dev = data;
1545         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1546         char tmp[32];
1547         u32 enable=0;
1548
1549         if (count < 1)
1550         {
1551                 DBG_8192C("argument size is less than 1\n");
1552                 return -EFAULT;
1553         }       
1554
1555         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1556
1557                 int num = sscanf(tmp, "%x", &enable);
1558
1559                 if (num !=  1) {
1560                         DBG_8192C("invalid set_rssi_disp parameter!\n");
1561                         return count;
1562                 }
1563                 
1564                 if(enable)
1565                 {                       
1566                         DBG_8192C("Linked info Function Enable\n");
1567                         padapter->bLinkInfoDump = enable ;                      
1568                 }
1569                 else
1570                 {
1571                         DBG_8192C("Linked info Function Disable\n");
1572                         padapter->bLinkInfoDump = 0 ;
1573                 }
1574         
1575         }
1576         
1577         return count;
1578         
1579 }       
1580
1581 */              
1582 #ifdef CONFIG_AP_MODE
1583
1584 int proc_get_all_sta_info(struct seq_file *m, void *v)
1585 {
1586         struct net_device *dev = m->private;
1587         _irqL irqL;
1588         struct sta_info *psta;
1589         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1590         struct sta_priv *pstapriv = &padapter->stapriv;
1591         int i, j;
1592         _list   *plist, *phead;
1593         struct recv_reorder_ctrl *preorder_ctrl;
1594
1595         DBG_871X_SEL_NL(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
1596
1597         _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
1598
1599         for(i=0; i< NUM_STA; i++)
1600         {
1601                 phead = &(pstapriv->sta_hash[i]);
1602                 plist = get_next(phead);
1603                 
1604                 while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
1605                 {
1606                         psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
1607
1608                         plist = get_next(plist);
1609
1610                         //if(extra_arg == psta->aid)
1611                         {
1612                                 DBG_871X_SEL_NL(m, "==============================\n");
1613                                 DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
1614                                 DBG_871X_SEL_NL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
1615                                 DBG_871X_SEL_NL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
1616 #ifdef CONFIG_80211N_HT
1617                                 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);   
1618                                 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);
1619                                 DBG_871X_SEL_NL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);                                                                   
1620                                 DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
1621 #endif //CONFIG_80211N_HT
1622                                 DBG_871X_SEL_NL(m, "sleepq_len=%d\n", psta->sleepq_len);
1623                                 DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);
1624                                 DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);
1625                                 DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);
1626                                 DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);
1627
1628                                 DBG_871X_SEL_NL(m, "capability=0x%x\n", psta->capability);
1629                                 DBG_871X_SEL_NL(m, "flags=0x%x\n", psta->flags);
1630                                 DBG_871X_SEL_NL(m, "wpa_psk=0x%x\n", psta->wpa_psk);
1631                                 DBG_871X_SEL_NL(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
1632                                 DBG_871X_SEL_NL(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
1633                                 DBG_871X_SEL_NL(m, "qos_info=0x%x\n", psta->qos_info);
1634                                 DBG_871X_SEL_NL(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
1635                                                                 
1636                                 for(j=0;j<16;j++)
1637                                 {                                                       
1638                                         preorder_ctrl = &psta->recvreorder_ctrl[j];
1639                                         if(preorder_ctrl->enable)
1640                                         {
1641                                                 DBG_871X_SEL_NL(m, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
1642                                         }
1643                                 }
1644
1645 #ifdef CONFIG_TDLS
1646                                 DBG_871X_SEL_NL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state);
1647                                 DBG_871X_SEL_NL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime);
1648                                 DBG_871X_SEL_NL(m, "rx_data_pkts=%llu\n", psta->sta_stats.rx_data_pkts);
1649                                 DBG_871X_SEL_NL(m, "rx_bytes=%llu\n", psta->sta_stats.rx_bytes);
1650                                 DBG_871X_SEL_NL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts);
1651                                 DBG_871X_SEL_NL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes);
1652 #endif //CONFIG_TDLS
1653                                 DBG_871X_SEL_NL(m, "==============================\n");
1654                         }
1655
1656                 }
1657
1658         }
1659
1660         _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
1661
1662         return 0;
1663 }
1664         
1665 #endif          
1666
1667 #ifdef DBG_MEMORY_LEAK
1668 #include <asm/atomic.h>
1669 extern atomic_t _malloc_cnt;;
1670 extern atomic_t _malloc_size;;
1671
1672 int proc_get_malloc_cnt(struct seq_file *m, void *v)
1673 {
1674         DBG_871X_SEL_NL(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt));
1675         DBG_871X_SEL_NL(m, "_malloc_size=%d\n", atomic_read(&_malloc_size));
1676
1677         return 0;
1678 }
1679 #endif /* DBG_MEMORY_LEAK */
1680
1681 #ifdef CONFIG_FIND_BEST_CHANNEL
1682 int proc_get_best_channel(struct seq_file *m, void *v)
1683 {
1684         struct net_device *dev = m->private;
1685         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1686         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1687         u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
1688
1689         for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
1690                 if ( pmlmeext->channel_set[i].ChannelNum == 1)
1691                         index_24G = i;
1692                 if ( pmlmeext->channel_set[i].ChannelNum == 36)
1693                         index_5G = i;
1694         }       
1695         
1696         for (i=0; (i < MAX_CHANNEL_NUM) && (pmlmeext->channel_set[i].ChannelNum !=0) ; i++) {
1697                 // 2.4G
1698                 if ( pmlmeext->channel_set[i].ChannelNum == 6 ) {
1699                         if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {
1700                                 index_24G = i;
1701                                 best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
1702                         }
1703                 }
1704
1705                 // 5G
1706                 if ( pmlmeext->channel_set[i].ChannelNum >= 36
1707                         && pmlmeext->channel_set[i].ChannelNum < 140 ) {
1708                          // Find primary channel
1709                         if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)
1710                                 && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
1711                                 index_5G = i;
1712                                 best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
1713                         }
1714                 }
1715
1716                 if ( pmlmeext->channel_set[i].ChannelNum >= 149
1717                         && pmlmeext->channel_set[i].ChannelNum < 165) {
1718                          // find primary channel
1719                         if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)
1720                                 && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
1721                                 index_5G = i;
1722                                 best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
1723                         }
1724                 }
1725 #if 1 // debug
1726                 DBG_871X_SEL_NL(m, "The rx cnt of channel %3d = %d\n", 
1727                                         pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);
1728 #endif
1729         }
1730         
1731         DBG_871X_SEL_NL(m, "best_channel_5G = %d\n", best_channel_5G);
1732         DBG_871X_SEL_NL(m, "best_channel_24G = %d\n", best_channel_24G);
1733
1734         return 0;
1735 }
1736
1737 ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1738 {
1739         struct net_device *dev = data;
1740         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1741         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1742         char tmp[32];
1743
1744         if(count < 1)
1745                 return -EFAULT;
1746
1747         if(buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
1748         {
1749                 int i;
1750                 for(i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++)
1751                 {
1752                         pmlmeext->channel_set[i].rx_count = 0;
1753                 }
1754
1755                 DBG_871X("set %s\n", "Clean Best Channel Count");
1756         }
1757
1758         return count;
1759 }
1760 #endif /* CONFIG_FIND_BEST_CHANNEL */
1761
1762 #ifdef CONFIG_BT_COEXIST
1763 int proc_get_btcoex_dbg(struct seq_file *m, void *v)
1764 {
1765         struct net_device *dev = m->private;
1766         PADAPTER padapter;
1767         char buf[512] = {0};
1768         padapter = (PADAPTER)rtw_netdev_priv(dev);
1769
1770         rtw_btcoex_GetDBG(padapter, buf, 512);
1771
1772         DBG_871X_SEL(m, "%s", buf);
1773
1774         return 0;
1775 }
1776
1777 ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1778 {
1779         struct net_device *dev = data;
1780         PADAPTER padapter;
1781         u8 tmp[80] = {0};
1782         u32 module[2] = {0};
1783         u32 num;
1784
1785         padapter = (PADAPTER)rtw_netdev_priv(dev);
1786
1787 //      DBG_871X("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
1788
1789         if (NULL == buffer)
1790         {
1791                 DBG_871X(FUNC_ADPT_FMT ": input buffer is NULL!\n",
1792                         FUNC_ADPT_ARG(padapter));
1793                 
1794                 return -EFAULT;
1795         }
1796
1797         if (count < 1)
1798         {
1799                 DBG_871X(FUNC_ADPT_FMT ": input length is 0!\n",
1800                         FUNC_ADPT_ARG(padapter));
1801
1802                 return -EFAULT;
1803         }
1804
1805         num = count;
1806         if (num > (sizeof(tmp) - 1))
1807                 num = (sizeof(tmp) - 1);
1808
1809         if (copy_from_user(tmp, buffer, num))
1810         {
1811                 DBG_871X(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
1812                         FUNC_ADPT_ARG(padapter));
1813
1814                 return -EFAULT;
1815         }
1816
1817         num = sscanf(tmp, "%x %x", module, module+1);
1818         if (1 == num)
1819         {
1820                 if (0 == module[0])
1821                         _rtw_memset(module, 0, sizeof(module));
1822                 else
1823                         _rtw_memset(module, 0xFF, sizeof(module));
1824         }
1825         else if (2 != num)
1826         {
1827                 DBG_871X(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n",
1828                         FUNC_ADPT_ARG(padapter), tmp);
1829
1830                 if (0 == num)
1831                         return -EFAULT;
1832         }
1833
1834         DBG_871X(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n",
1835                 FUNC_ADPT_ARG(padapter), module[0], module[1]);
1836         rtw_btcoex_SetDBG(padapter, module);
1837
1838         return count;
1839 }
1840
1841 int proc_get_btcoex_info(struct seq_file *m, void *v)
1842 {
1843         struct net_device *dev = m->private;
1844         PADAPTER padapter;
1845         const u32 bufsize = 30*100;
1846         u8 *pbuf = NULL;
1847
1848         padapter = (PADAPTER)rtw_netdev_priv(dev);
1849
1850         pbuf = rtw_zmalloc(bufsize);
1851         if (NULL == pbuf) {
1852                 return -ENOMEM;
1853         }
1854
1855         rtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);
1856
1857         DBG_871X_SEL(m, "%s\n", pbuf);
1858         
1859         rtw_mfree(pbuf, bufsize);
1860
1861         return 0;
1862 }
1863 #endif /* CONFIG_BT_COEXIST */
1864
1865 #if defined(DBG_CONFIG_ERROR_DETECT)
1866 int proc_get_sreset(struct seq_file *m, void *v)
1867 {
1868         struct net_device *dev = m->private;
1869         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1870         struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1871
1872         return 0;
1873 }
1874
1875 ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1876 {
1877         struct net_device *dev = data;
1878         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1879         char tmp[32];
1880         s32 trigger_point;
1881
1882         if (count < 1)
1883                 return -EFAULT;
1884
1885         if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
1886
1887                 int num = sscanf(tmp, "%d", &trigger_point);
1888
1889                 if (trigger_point == SRESET_TGP_NULL)
1890                         rtw_hal_sreset_reset(padapter);
1891                 else
1892                         sreset_set_trigger_point(padapter, trigger_point);
1893         }
1894         
1895         return count;
1896         
1897 }
1898 #endif /* DBG_CONFIG_ERROR_DETECT */
1899
1900 #ifdef CONFIG_PCI_HCI
1901
1902 int proc_get_rx_ring(struct seq_file *m, void *v)
1903 {
1904         _irqL irqL;
1905         struct net_device *dev = m->private;
1906         _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
1907         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
1908         struct recv_priv *precvpriv = &padapter->recvpriv;
1909         struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];
1910         int i, j;
1911
1912         DBG_871X_SEL_NL(m, "rx ring (%p)\n", rx_ring);
1913         DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) rx_ring->dma);
1914         DBG_871X_SEL_NL(m, "  idx: %d\n", rx_ring->idx);
1915
1916         _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
1917         for (i=0; i<precvpriv->rxringcount; i++)
1918         {
1919                 struct recv_stat *entry = &rx_ring->desc[i];
1920                 struct sk_buff *skb = rx_ring->rx_buf[i];
1921
1922                 DBG_871X_SEL_NL(m, "  desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",
1923                         i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));
1924
1925                 for (j=0; j<sizeof(*entry)/4; j++)
1926                 {
1927                         if ((j % 4) == 0)
1928                                 DBG_871X_SEL_NL(m, "  0x%03x", j);
1929
1930                         DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[j]);
1931
1932                         if ((j % 4) == 3)
1933                                 DBG_871X_SEL_NL(m, "\n");
1934                 }
1935         }
1936         _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
1937
1938         return 0;
1939 }
1940
1941 int proc_get_tx_ring(struct seq_file *m, void *v)
1942 {
1943         _irqL irqL;
1944         struct net_device *dev = m->private;
1945         _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
1946         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
1947         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1948         int i, j, k;
1949
1950         _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
1951         for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++)
1952         {
1953                 struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];
1954
1955                 DBG_871X_SEL_NL(m, "tx ring[%d] (%p)\n", i, tx_ring);
1956                 DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) tx_ring->dma);
1957                 DBG_871X_SEL_NL(m, "  idx: %d\n", tx_ring->idx);
1958                 DBG_871X_SEL_NL(m, "  entries: %d\n", tx_ring->entries);
1959 //              DBG_871X_SEL_NL(m, "  queue: %d\n", tx_ring->queue);
1960                 DBG_871X_SEL_NL(m, "  qlen: %d\n", tx_ring->qlen);
1961
1962                 for (j=0; j < pxmitpriv->txringcount[i]; j++)
1963                 {
1964                         struct tx_desc *entry = &tx_ring->desc[j];
1965
1966                         DBG_871X_SEL_NL(m, "  desc[%03d]: %p\n", j, entry);
1967                         for (k=0; k < sizeof(*entry)/4; k++)
1968                         {
1969                                 if ((k % 4) == 0)
1970                                         DBG_871X_SEL_NL(m, "  0x%03x", k);
1971
1972                                 DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[k]);
1973
1974                                 if ((k % 4) == 3)
1975                                         DBG_871X_SEL_NL(m, "\n");
1976                         }
1977                 }
1978         }
1979         _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
1980
1981         return 0;
1982 }
1983 #endif
1984
1985 #ifdef CONFIG_P2P_WOWLAN
1986 int proc_get_p2p_wowlan_info(struct seq_file *m, void *v)
1987 {
1988         struct net_device *dev = m->private;
1989         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1990         struct wifidirect_info  *pwdinfo = &( padapter->wdinfo );
1991         struct p2p_wowlan_info   peerinfo = pwdinfo->p2p_wow_info;
1992         if(_TRUE == peerinfo.is_trigger)
1993         {
1994                 DBG_871X_SEL_NL(m,"is_trigger: TRUE\n");
1995                 switch(peerinfo.wowlan_recv_frame_type)
1996                 {
1997                         case P2P_WOWLAN_RECV_NEGO_REQ:
1998                                 DBG_871X_SEL_NL(m,"Frame Type: Nego Request\n");
1999                                 break;
2000                         case P2P_WOWLAN_RECV_INVITE_REQ:
2001                                 DBG_871X_SEL_NL(m,"Frame Type: Invitation Request\n");
2002                                 break;
2003                         case P2P_WOWLAN_RECV_PROVISION_REQ:
2004                                 DBG_871X_SEL_NL(m,"Frame Type: Provision Request\n");
2005                                 break;
2006                         default:
2007                                 break;
2008                 }
2009                 DBG_871X_SEL_NL(m,"Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr));
2010                 DBG_871X_SEL_NL(m,"Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig);
2011                 DBG_871X_SEL_NL(m,"Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent);
2012                 DBG_871X_SEL_NL(m,"Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type);
2013         }
2014         else
2015         {
2016                 DBG_871X_SEL_NL(m,"is_trigger: False\n");
2017         }
2018         return 0;
2019 }
2020 #endif /* CONFIG_P2P_WOWLAN */
2021
2022 int proc_get_new_bcn_max(struct seq_file *m, void *v)
2023 {
2024         extern int new_bcn_max;
2025
2026         DBG_871X_SEL_NL(m, "%d", new_bcn_max);
2027         return 0;
2028 }
2029
2030 ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2031 {
2032         char tmp[32];
2033         extern int new_bcn_max;
2034
2035         if(count < 1)
2036                 return -EFAULT;
2037
2038         if(buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
2039                 sscanf(tmp, "%d ", &new_bcn_max);
2040
2041         return count;
2042 }
2043 #endif
2044