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