net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / os_dep / linux / rtw_proc.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2013 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
21 #include <linux/ctype.h>        /* tolower() */
22 #include <drv_types.h>
23 #include <hal_data.h>
24 #include "rtw_proc.h"
25 #ifdef CONFIG_BT_COEXIST
26 #include <rtw_btcoex.h>
27 #endif
28
29 #ifdef CONFIG_PROC_DEBUG
30
31 static struct proc_dir_entry *rtw_proc = NULL;
32
33 inline struct proc_dir_entry *get_rtw_drv_proc(void)
34 {
35         return rtw_proc;
36 }
37
38 #define RTW_PROC_NAME DRV_NAME
39
40 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
41 #define file_inode(file) ((file)->f_dentry->d_inode)
42 #endif
43
44 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
45 #define PDE_DATA(inode) PDE((inode))->data
46 #define proc_get_parent_data(inode) PDE((inode))->parent->data
47 #endif
48
49 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24))
50 #define get_proc_net proc_net
51 #else
52 #define get_proc_net init_net.proc_net
53 #endif
54
55 inline struct proc_dir_entry *rtw_proc_create_dir(const char *name, struct proc_dir_entry *parent, void *data)
56 {
57         struct proc_dir_entry *entry;
58
59 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
60         entry = proc_mkdir_data(name, S_IRUGO | S_IXUGO, parent, data);
61 #else
62         /* entry = proc_mkdir_mode(name, S_IRUGO|S_IXUGO, parent); */
63         entry = proc_mkdir(name, parent);
64         if (entry)
65                 entry->data = data;
66 #endif
67
68         return entry;
69 }
70
71 inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent,
72         const struct file_operations *fops, void * data)
73 {
74         struct proc_dir_entry *entry;
75
76 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26))
77         entry = proc_create_data(name,  S_IFREG | S_IRUGO | S_IWUGO, parent, fops, data);
78 #else
79         entry = create_proc_entry(name, S_IFREG | S_IRUGO | S_IWUGO, parent);
80         if (entry) {
81                 entry->data = data;
82                 entry->proc_fops = fops;
83         }
84 #endif
85
86         return entry;
87 }
88
89 static int proc_get_dummy(struct seq_file *m, void *v)
90 {
91         return 0;
92 }
93
94 static int proc_get_drv_version(struct seq_file *m, void *v)
95 {
96         dump_drv_version(m);
97         return 0;
98 }
99
100 static int proc_get_log_level(struct seq_file *m, void *v)
101 {
102         dump_log_level(m);
103         return 0;
104 }
105
106 static int proc_get_drv_cfg(struct seq_file *m, void *v)
107 {
108         dump_drv_cfg(m);
109         return 0;
110 }
111
112 static ssize_t proc_set_log_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
113 {
114         char tmp[32];
115         int log_level;
116
117         if (count < 1)
118                 return -EINVAL;
119
120         if (count > sizeof(tmp)) {
121                 rtw_warn_on(1);
122                 return -EFAULT;
123         }
124
125 #ifdef CONFIG_RTW_DEBUG
126         if (buffer && !copy_from_user(tmp, buffer, count)) {
127
128                 int num = sscanf(tmp, "%d ", &log_level);
129
130                 if (log_level >= _DRV_NONE_ && log_level <= _DRV_MAX_) {
131                         rtw_drv_log_level = log_level;
132                         printk("rtw_drv_log_level:%d\n", rtw_drv_log_level);
133                 }
134         } else
135                 return -EFAULT;
136 #else
137         printk("CONFIG_RTW_DEBUG is disabled\n");
138 #endif
139
140         return count;
141 }
142
143 #ifdef DBG_MEM_ALLOC
144 static int proc_get_mstat(struct seq_file *m, void *v)
145 {
146         rtw_mstat_dump(m);
147         return 0;
148 }
149 #endif /* DBG_MEM_ALLOC */
150
151 static int proc_get_country_chplan_map(struct seq_file *m, void *v)
152 {
153         dump_country_chplan_map(m);
154         return 0;
155 }
156
157 static int proc_get_chplan_id_list(struct seq_file *m, void *v)
158 {
159         dump_chplan_id_list(m);
160         return 0;
161 }
162
163 static int proc_get_chplan_test(struct seq_file *m, void *v)
164 {
165         dump_chplan_test(m);
166         return 0;
167 }
168
169 /*
170 * rtw_drv_proc:
171 * init/deinit when register/unregister driver
172 */
173 const struct rtw_proc_hdl drv_proc_hdls[] = {
174         RTW_PROC_HDL_SSEQ("ver_info", proc_get_drv_version, NULL),
175         RTW_PROC_HDL_SSEQ("log_level", proc_get_log_level, proc_set_log_level),
176         RTW_PROC_HDL_SSEQ("drv_cfg", proc_get_drv_cfg, NULL),
177 #ifdef DBG_MEM_ALLOC
178         RTW_PROC_HDL_SSEQ("mstat", proc_get_mstat, NULL),
179 #endif /* DBG_MEM_ALLOC */
180         RTW_PROC_HDL_SSEQ("country_chplan_map", proc_get_country_chplan_map, NULL),
181         RTW_PROC_HDL_SSEQ("chplan_id_list", proc_get_chplan_id_list, NULL),
182         RTW_PROC_HDL_SSEQ("chplan_test", proc_get_chplan_test, NULL),
183 };
184
185 const int drv_proc_hdls_num = sizeof(drv_proc_hdls) / sizeof(struct rtw_proc_hdl);
186
187 static int rtw_drv_proc_open(struct inode *inode, struct file *file)
188 {
189         /* struct net_device *dev = proc_get_parent_data(inode); */
190         ssize_t index = (ssize_t)PDE_DATA(inode);
191         const struct rtw_proc_hdl *hdl = drv_proc_hdls + index;
192         void *private = NULL;
193
194         if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
195                 int res = seq_open(file, hdl->u.seq_op);
196
197                 if (res == 0)
198                         ((struct seq_file *)file->private_data)->private = private;
199
200                 return res;
201         } else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
202                 int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
203
204                 return single_open(file, show, private);
205         } else {
206                 return -EROFS;
207         }
208 }
209
210 static ssize_t rtw_drv_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
211 {
212         ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
213         const struct rtw_proc_hdl *hdl = drv_proc_hdls + index;
214         ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
215
216         if (write)
217                 return write(file, buffer, count, pos, NULL);
218
219         return -EROFS;
220 }
221
222 static const struct file_operations rtw_drv_proc_seq_fops = {
223         .owner = THIS_MODULE,
224         .open = rtw_drv_proc_open,
225         .read = seq_read,
226         .llseek = seq_lseek,
227         .release = seq_release,
228         .write = rtw_drv_proc_write,
229 };
230
231 static const struct file_operations rtw_drv_proc_sseq_fops = {
232         .owner = THIS_MODULE,
233         .open = rtw_drv_proc_open,
234         .read = seq_read,
235         .llseek = seq_lseek,
236         .release = single_release,
237         .write = rtw_drv_proc_write,
238 };
239
240 int rtw_drv_proc_init(void)
241 {
242         int ret = _FAIL;
243         ssize_t i;
244         struct proc_dir_entry *entry = NULL;
245
246         if (rtw_proc != NULL) {
247                 rtw_warn_on(1);
248                 goto exit;
249         }
250
251         rtw_proc = rtw_proc_create_dir(RTW_PROC_NAME, get_proc_net, NULL);
252
253         if (rtw_proc == NULL) {
254                 rtw_warn_on(1);
255                 goto exit;
256         }
257
258         for (i = 0; i < drv_proc_hdls_num; i++) {
259                 if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
260                         entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_seq_fops, (void *)i);
261                 else if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ)
262                         entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_sseq_fops, (void *)i);
263                 else
264                         entry = NULL;
265
266                 if (!entry) {
267                         rtw_warn_on(1);
268                         goto exit;
269                 }
270         }
271
272         ret = _SUCCESS;
273
274 exit:
275         return ret;
276 }
277
278 void rtw_drv_proc_deinit(void)
279 {
280         int i;
281
282         if (rtw_proc == NULL)
283                 return;
284
285         for (i = 0; i < drv_proc_hdls_num; i++)
286                 remove_proc_entry(drv_proc_hdls[i].name, rtw_proc);
287
288         remove_proc_entry(RTW_PROC_NAME, get_proc_net);
289         rtw_proc = NULL;
290 }
291
292 #ifndef RTW_SEQ_FILE_TEST
293 #define RTW_SEQ_FILE_TEST 0
294 #endif
295
296 #if RTW_SEQ_FILE_TEST
297 #define RTW_SEQ_FILE_TEST_SHOW_LIMIT 300
298 static void *proc_start_seq_file_test(struct seq_file *m, loff_t *pos)
299 {
300         struct net_device *dev = m->private;
301         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
302
303         RTW_PRINT(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
304         if (*pos >= RTW_SEQ_FILE_TEST_SHOW_LIMIT) {
305                 RTW_PRINT(FUNC_ADPT_FMT" pos:%llu, out of range return\n", FUNC_ADPT_ARG(adapter), *pos);
306                 return NULL;
307         }
308
309         RTW_PRINT(FUNC_ADPT_FMT" return pos:%lld\n", FUNC_ADPT_ARG(adapter), *pos);
310         return pos;
311 }
312 void proc_stop_seq_file_test(struct seq_file *m, void *v)
313 {
314         struct net_device *dev = m->private;
315         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
316
317         RTW_PRINT(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
318 }
319
320 void *proc_next_seq_file_test(struct seq_file *m, void *v, loff_t *pos)
321 {
322         struct net_device *dev = m->private;
323         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
324
325         (*pos)++;
326         if (*pos >= RTW_SEQ_FILE_TEST_SHOW_LIMIT) {
327                 RTW_PRINT(FUNC_ADPT_FMT" pos:%lld, out of range return\n", FUNC_ADPT_ARG(adapter), *pos);
328                 return NULL;
329         }
330
331         RTW_PRINT(FUNC_ADPT_FMT" return pos:%lld\n", FUNC_ADPT_ARG(adapter), *pos);
332         return pos;
333 }
334
335 static int proc_get_seq_file_test(struct seq_file *m, void *v)
336 {
337         struct net_device *dev = m->private;
338         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
339
340         u32 pos = *((loff_t *)(v));
341         RTW_PRINT(FUNC_ADPT_FMT" pos:%d\n", FUNC_ADPT_ARG(adapter), pos);
342         RTW_PRINT_SEL(m, FUNC_ADPT_FMT" pos:%d\n", FUNC_ADPT_ARG(adapter), pos);
343         return 0;
344 }
345
346 struct seq_operations seq_file_test = {
347         .start = proc_start_seq_file_test,
348         .stop  = proc_stop_seq_file_test,
349         .next  = proc_next_seq_file_test,
350         .show  = proc_get_seq_file_test,
351 };
352 #endif /* RTW_SEQ_FILE_TEST */
353
354 #ifdef CONFIG_SDIO_HCI
355 static int proc_get_sd_f0_reg_dump(struct seq_file *m, void *v)
356 {
357         struct net_device *dev = m->private;
358         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
359
360         sd_f0_reg_dump(m, adapter);
361
362         return 0;
363 }
364
365 static int proc_get_sdio_local_reg_dump(struct seq_file *m, void *v)
366 {
367         struct net_device *dev = m->private;
368         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
369
370         sdio_local_reg_dump(m, adapter);
371
372         return 0;
373 }
374 #endif /* CONFIG_SDIO_HCI */
375
376 static int proc_get_mac_reg_dump(struct seq_file *m, void *v)
377 {
378         struct net_device *dev = m->private;
379         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
380
381         mac_reg_dump(m, adapter);
382
383         return 0;
384 }
385
386 static int proc_get_bb_reg_dump(struct seq_file *m, void *v)
387 {
388         struct net_device *dev = m->private;
389         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
390
391         bb_reg_dump(m, adapter);
392
393         return 0;
394 }
395
396 static int proc_get_rf_reg_dump(struct seq_file *m, void *v)
397 {
398         struct net_device *dev = m->private;
399         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
400
401         rf_reg_dump(m, adapter);
402
403         return 0;
404 }
405
406 static int proc_get_dump_tx_rate_bmp(struct seq_file *m, void *v)
407 {
408         struct net_device *dev = m->private;
409         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
410
411         dump_tx_rate_bmp(m, adapter_to_dvobj(adapter));
412
413         return 0;
414 }
415
416 static int proc_get_dump_adapters_status(struct seq_file *m, void *v)
417 {
418         struct net_device *dev = m->private;
419         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
420
421         dump_adapters_status(m, adapter_to_dvobj(adapter));
422
423         return 0;
424 }
425
426 #ifdef CONFIG_RTW_CUSTOMER_STR
427 static int proc_get_customer_str(struct seq_file *m, void *v)
428 {
429         struct net_device *dev = m->private;
430         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
431         u8 cstr[RTW_CUSTOMER_STR_LEN];
432
433         if (rtw_hal_customer_str_read(adapter, cstr) != _SUCCESS)
434                 goto exit;
435
436         RTW_PRINT_SEL(m, RTW_CUSTOMER_STR_FMT"\n", RTW_CUSTOMER_STR_ARG(cstr));
437
438 exit:
439         return 0;
440 }
441 #endif /* CONFIG_RTW_CUSTOMER_STR */
442
443 /* gpio setting */
444 #ifdef CONFIG_GPIO_API
445 static ssize_t proc_set_config_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
446 {
447         struct net_device *dev = data;
448         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
449         char tmp[32] = {0};
450         int num = 0, gpio_pin = 0, gpio_mode = 0; /* gpio_mode:0 input  1:output; */
451
452         if (count < 2)
453                 return -EFAULT;
454
455         if (count > sizeof(tmp)) {
456                 rtw_warn_on(1);
457                 return -EFAULT;
458         }
459
460         if (buffer && !copy_from_user(tmp, buffer, count)) {
461                 num     = sscanf(tmp, "%d %d", &gpio_pin, &gpio_mode);
462                 RTW_INFO("num=%d gpio_pin=%d mode=%d\n", num, gpio_pin, gpio_mode);
463                 padapter->pre_gpio_pin = gpio_pin;
464
465                 if (gpio_mode == 0 || gpio_mode == 1)
466                         rtw_hal_config_gpio(padapter, gpio_pin, gpio_mode);
467         }
468         return count;
469
470 }
471 static ssize_t proc_set_gpio_output_value(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
472 {
473         struct net_device *dev = data;
474         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
475         char tmp[32] = {0};
476         int num = 0, gpio_pin = 0, pin_mode = 0; /* pin_mode: 1 high         0:low */
477
478         if (count < 2)
479                 return -EFAULT;
480
481         if (count > sizeof(tmp)) {
482                 rtw_warn_on(1);
483                 return -EFAULT;
484         }
485
486         if (buffer && !copy_from_user(tmp, buffer, count)) {
487                 num     = sscanf(tmp, "%d %d", &gpio_pin, &pin_mode);
488                 RTW_INFO("num=%d gpio_pin=%d pin_high=%d\n", num, gpio_pin, pin_mode);
489                 padapter->pre_gpio_pin = gpio_pin;
490
491                 if (pin_mode == 0 || pin_mode == 1)
492                         rtw_hal_set_gpio_output_value(padapter, gpio_pin, pin_mode);
493         }
494         return count;
495 }
496 static int proc_get_gpio(struct seq_file *m, void *v)
497 {
498         u8 gpioreturnvalue = 0;
499         struct net_device *dev = m->private;
500
501         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
502         if (!padapter)
503                 return -EFAULT;
504         gpioreturnvalue = rtw_hal_get_gpio(padapter, padapter->pre_gpio_pin);
505         RTW_PRINT_SEL(m, "get_gpio %d:%d\n", padapter->pre_gpio_pin, gpioreturnvalue);
506
507         return 0;
508
509 }
510 static ssize_t proc_set_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
511 {
512         struct net_device *dev = data;
513         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
514         char tmp[32] = {0};
515         int num = 0, gpio_pin = 0;
516
517         if (count < 1)
518                 return -EFAULT;
519
520         if (count > sizeof(tmp)) {
521                 rtw_warn_on(1);
522                 return -EFAULT;
523         }
524
525         if (buffer && !copy_from_user(tmp, buffer, count)) {
526                 num     = sscanf(tmp, "%d", &gpio_pin);
527                 RTW_INFO("num=%d gpio_pin=%d\n", num, gpio_pin);
528                 padapter->pre_gpio_pin = gpio_pin;
529
530         }
531         return count;
532 }
533 #endif
534 static ssize_t proc_set_rx_info_msg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
535 {
536
537         struct net_device *dev = data;
538         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
539         struct recv_priv *precvpriv = &(padapter->recvpriv);
540         char tmp[32] = {0};
541         int phy_info_flag = 0;
542
543         if (!padapter)
544                 return -EFAULT;
545
546         if (count < 1) {
547                 RTW_INFO("argument size is less than 1\n");
548                 return -EFAULT;
549         }
550
551         if (count > sizeof(tmp)) {
552                 rtw_warn_on(1);
553                 return -EFAULT;
554         }
555
556         if (buffer && !copy_from_user(tmp, buffer, count)) {
557                 int num = sscanf(tmp, "%d", &phy_info_flag);
558
559                 precvpriv->store_law_data_flag = (BOOLEAN) phy_info_flag;
560
561                 /*RTW_INFO("precvpriv->store_law_data_flag = %d\n",( BOOLEAN )(precvpriv->store_law_data_flag));*/
562         }
563         return count;
564 }
565 static int proc_get_rx_info_msg(struct seq_file *m, void *v)
566 {
567         struct net_device *dev = m->private;
568         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
569
570         rtw_hal_set_odm_var(padapter, HAL_ODM_RX_Dframe_INFO, m, _FALSE);
571         return 0;
572 }
573 static int proc_get_tx_info_msg(struct seq_file *m, void *v)
574 {
575         _irqL irqL;
576         struct net_device *dev = m->private;
577         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
578         struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
579         struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
580         struct sta_info *psta;
581         u8 bc_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
582         u8 null_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
583         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
584         struct sta_priv *pstapriv = &padapter->stapriv;
585         int i;
586         _list   *plist, *phead;
587         u8 current_rate_id = 0, current_sgi = 0;
588
589         char *BW, *status;
590
591         _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
592
593         if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE))
594                 status = "station mode";
595         else if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE))
596                 status = "AP mode";
597         else
598                 status = " ";
599         _RTW_PRINT_SEL(m, "status=%s\n", status);
600         for (i = 0; i < NUM_STA; i++) {
601                 phead = &(pstapriv->sta_hash[i]);
602                 plist = get_next(phead);
603
604                 while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
605
606                         psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
607
608                         plist = get_next(plist);
609
610                         if ((_rtw_memcmp(psta->hwaddr, bc_addr, 6)  !=  _TRUE)
611                                 && (_rtw_memcmp(psta->hwaddr, null_addr, 6) != _TRUE)
612                                 && (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), 6) != _TRUE)) {
613
614                                 switch (psta->bw_mode) {
615
616                                 case CHANNEL_WIDTH_20:
617                                         BW = "20M";
618                                         break;
619
620                                 case CHANNEL_WIDTH_40:
621                                         BW = "40M";
622                                         break;
623
624                                 case CHANNEL_WIDTH_80:
625                                         BW = "80M";
626                                         break;
627
628                                 case CHANNEL_WIDTH_160:
629                                         BW = "160M";
630                                         break;
631
632                                 default:
633                                         BW = "";
634                                         break;
635                                 }
636                                 current_rate_id = rtw_get_current_tx_rate(adapter, psta->mac_id);
637                                 current_sgi = rtw_get_current_tx_sgi(adapter, psta->mac_id);
638
639                                 RTW_PRINT_SEL(m, "==============================\n");
640                                 _RTW_PRINT_SEL(m, "macaddr=" MAC_FMT"\n", MAC_ARG(psta->hwaddr));
641                                 _RTW_PRINT_SEL(m, "Tx_Data_Rate=%s\n", HDATA_RATE(current_rate_id));
642                                 _RTW_PRINT_SEL(m, "BW=%s,sgi=%u\n", BW, current_sgi);
643
644                         }
645                 }
646         }
647
648         _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
649
650         return 0;
651
652 }
653
654
655 static int proc_get_linked_info_dump(struct seq_file *m, void *v)
656 {
657         struct net_device *dev = m->private;
658         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
659         if (padapter)
660                 RTW_PRINT_SEL(m, "linked_info_dump :%s\n", (padapter->bLinkInfoDump) ? "enable" : "disable");
661
662         return 0;
663 }
664
665
666 static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
667 {
668         struct net_device *dev = data;
669         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
670
671         char tmp[32] = {0};
672         int mode = 0, pre_mode = 0;
673         int num = 0;
674
675         if (count < 1)
676                 return -EFAULT;
677
678         if (count > sizeof(tmp)) {
679                 rtw_warn_on(1);
680                 return -EFAULT;
681         }
682
683         pre_mode = padapter->bLinkInfoDump;
684         RTW_INFO("pre_mode=%d\n", pre_mode);
685
686         if (buffer && !copy_from_user(tmp, buffer, count)) {
687
688                 num     = sscanf(tmp, "%d ", &mode);
689                 RTW_INFO("num=%d mode=%d\n", num, mode);
690
691                 if (num != 1) {
692                         RTW_INFO("argument number is wrong\n");
693                         return -EFAULT;
694                 }
695
696                 if (mode == 1 || (mode == 0 && pre_mode == 1)) /* not consider pwr_saving 0: */
697                         padapter->bLinkInfoDump = mode;
698
699                 else if ((mode == 2) || (mode == 0 && pre_mode == 2)) { /* consider power_saving */
700                         /* RTW_INFO("linked_info_dump =%s\n", (padapter->bLinkInfoDump)?"enable":"disable") */
701                         linked_info_dump(padapter, mode);
702                 }
703         }
704         return count;
705 }
706
707 static int proc_get_mac_qinfo(struct seq_file *m, void *v)
708 {
709         struct net_device *dev = m->private;
710         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
711
712         rtw_hal_get_hwreg(adapter, HW_VAR_DUMP_MAC_QUEUE_INFO, (u8 *)m);
713
714         return 0;
715 }
716
717 int proc_get_wifi_spec(struct seq_file *m, void *v)
718 {
719         struct net_device *dev = m->private;
720         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
721         struct registry_priv    *pregpriv = &padapter->registrypriv;
722
723         RTW_PRINT_SEL(m, "wifi_spec=%d\n", pregpriv->wifi_spec);
724         return 0;
725 }
726
727 static int proc_get_chan_plan(struct seq_file *m, void *v)
728 {
729         struct net_device *dev = m->private;
730         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
731
732         dump_cur_chset(m, adapter);
733
734         return 0;
735 }
736
737 static ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
738 {
739         struct net_device *dev = data;
740         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
741         char tmp[32];
742         u8 chan_plan = RTW_CHPLAN_MAX;
743
744         if (!padapter)
745                 return -EFAULT;
746
747         if (count < 1) {
748                 RTW_INFO("argument size is less than 1\n");
749                 return -EFAULT;
750         }
751
752         if (count > sizeof(tmp)) {
753                 rtw_warn_on(1);
754                 return -EFAULT;
755         }
756
757         if (buffer && !copy_from_user(tmp, buffer, count)) {
758                 int num = sscanf(tmp, "%hhx", &chan_plan);
759                 if (num !=  1)
760                         return count;
761         }
762
763         rtw_set_channel_plan(padapter, chan_plan);
764
765         return count;
766 }
767
768 static int proc_get_country_code(struct seq_file *m, void *v)
769 {
770         struct net_device *dev = m->private;
771         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
772
773         if (adapter->mlmepriv.country_ent)
774                 dump_country_chplan(m, adapter->mlmepriv.country_ent);
775         else
776                 RTW_PRINT_SEL(m, "unspecified\n");
777
778         return 0;
779 }
780
781 static ssize_t proc_set_country_code(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
782 {
783         struct net_device *dev = data;
784         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
785         char tmp[32];
786         char alpha2[2];
787         int num;
788
789         if (count < 1)
790                 return -EFAULT;
791
792         if (count > sizeof(tmp)) {
793                 rtw_warn_on(1);
794                 return -EFAULT;
795         }
796
797         if (!buffer || copy_from_user(tmp, buffer, count))
798                 goto exit;
799
800         num = sscanf(tmp, "%c%c", &alpha2[0], &alpha2[1]);
801         if (num !=      2)
802                 return count;
803
804         rtw_set_country(padapter, alpha2);
805
806 exit:
807         return count;
808 }
809
810 #if CONFIG_RTW_MACADDR_ACL
811 static int proc_get_macaddr_acl(struct seq_file *m, void *v)
812 {
813         struct net_device *dev = m->private;
814         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
815
816         dump_macaddr_acl(m, adapter);
817         return 0;
818 }
819
820 ssize_t proc_set_macaddr_acl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
821 {
822         struct net_device *dev = data;
823         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
824         struct mlme_priv *mlme = &adapter->mlmepriv;
825         struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
826         char tmp[17 * NUM_ACL + 32] = {0};
827         u8 mode;
828         u8 addr[ETH_ALEN];
829
830         if (count < 1)
831                 return -EFAULT;
832
833         if (count > sizeof(tmp)) {
834                 rtw_warn_on(1);
835                 return -EFAULT;
836         }
837
838         if (buffer && !copy_from_user(tmp, buffer, count)) {
839                 /* mode [<macaddr>] */
840                 char *c, *next;
841
842                 next = tmp;
843                 c = strsep(&next, " \t");
844
845                 if (sscanf(c, "%hhu", &mode) != 1)
846                         return count;
847
848                 if (mode >= RTW_ACL_MODE_MAX)
849                         mode = RTW_ACL_MODE_DISABLED;
850
851                 rtw_set_macaddr_acl(adapter, RTW_ACL_MODE_DISABLED); /* deinit first */
852                 if (mode == RTW_ACL_MODE_DISABLED)
853                         return count;
854
855                 rtw_set_macaddr_acl(adapter, mode);
856
857                 /* macaddr list */
858                 c = strsep(&next, " \t");
859                 while (c != NULL) {
860                         if (sscanf(c, MAC_SFMT, MAC_SARG(addr)) != 6)
861                                 break;
862
863                         if (rtw_check_invalid_mac_address(addr, 0) == _FALSE)
864                                 rtw_acl_add_sta(adapter, addr);
865
866                         c = strsep(&next, " \t");
867                 }
868
869         }
870
871 exit:
872         return count;
873 }
874 #endif /* CONFIG_RTW_MACADDR_ACL */
875
876 #ifdef CONFIG_DFS_MASTER
877 ssize_t proc_set_update_non_ocp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
878 {
879         struct net_device *dev = data;
880         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
881         struct mlme_priv *mlme = &adapter->mlmepriv;
882         struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
883         char tmp[32];
884         u8 ch, bw = CHANNEL_WIDTH_20, offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
885         int ms = -1;
886
887         if (count < 1)
888                 return -EFAULT;
889
890         if (count > sizeof(tmp)) {
891                 rtw_warn_on(1);
892                 return -EFAULT;
893         }
894
895         if (buffer && !copy_from_user(tmp, buffer, count)) {
896
897                 int num = sscanf(tmp, "%hhu %hhu %hhu %d", &ch, &bw, &offset, &ms);
898
899                 if (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))
900                         goto exit;
901
902                 if (bw == CHANNEL_WIDTH_20)
903                         rtw_chset_update_non_ocp_ms(mlmeext->channel_set
904                                 , ch, bw, HAL_PRIME_CHNL_OFFSET_DONT_CARE, ms);
905                 else
906                         rtw_chset_update_non_ocp_ms(mlmeext->channel_set
907                                 , ch, bw, offset, ms);
908         }
909
910 exit:
911         return count;
912 }
913
914 ssize_t proc_set_radar_detect(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
915 {
916         struct net_device *dev = data;
917         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
918         struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
919         char tmp[32];
920         u8 fake_radar_detect_cnt = 0;
921
922         if (count < 1)
923                 return -EFAULT;
924
925         if (count > sizeof(tmp)) {
926                 rtw_warn_on(1);
927                 return -EFAULT;
928         }
929
930         if (buffer && !copy_from_user(tmp, buffer, count)) {
931
932                 int num = sscanf(tmp, "%hhu", &fake_radar_detect_cnt);
933
934                 if (num < 1)
935                         goto exit;
936
937                 rfctl->dbg_dfs_master_fake_radar_detect_cnt = fake_radar_detect_cnt;
938         }
939
940 exit:
941         return count;
942 }
943
944 static int proc_get_dfs_ch_sel_d_flags(struct seq_file *m, void *v)
945 {
946         struct net_device *dev = m->private;
947         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
948         struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
949
950         RTW_PRINT_SEL(m, "0x%02x\n", rfctl->dfs_ch_sel_d_flags);
951
952         return 0;
953 }
954
955 static ssize_t proc_set_dfs_ch_sel_d_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
956 {
957         struct net_device *dev = data;
958         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
959         struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
960         char tmp[32];
961         u8 d_flags;
962         int num;
963
964         if (count < 1)
965                 return -EFAULT;
966
967         if (count > sizeof(tmp)) {
968                 rtw_warn_on(1);
969                 return -EFAULT;
970         }
971
972         if (!buffer || copy_from_user(tmp, buffer, count))
973                 goto exit;
974
975         num = sscanf(tmp, "%hhx", &d_flags);
976         if (num !=      1)
977                 goto exit;
978
979         rfctl->dfs_ch_sel_d_flags = d_flags;
980
981 exit:
982         return count;
983 }
984 #endif /* CONFIG_DFS_MASTER */
985
986 static int proc_get_udpport(struct seq_file *m, void *v)
987 {
988         struct net_device *dev = m->private;
989         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
990         struct recv_priv *precvpriv = &(padapter->recvpriv);
991
992         RTW_PRINT_SEL(m, "%d\n", precvpriv->sink_udpport);
993         return 0;
994 }
995 static ssize_t proc_set_udpport(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
996 {
997         struct net_device *dev = data;
998         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
999         struct recv_priv *precvpriv = &(padapter->recvpriv);
1000         int sink_udpport = 0;
1001         char tmp[32];
1002
1003
1004         if (!padapter)
1005                 return -EFAULT;
1006
1007         if (count < 1) {
1008                 RTW_INFO("argument size is less than 1\n");
1009                 return -EFAULT;
1010         }
1011
1012         if (count > sizeof(tmp)) {
1013                 rtw_warn_on(1);
1014                 return -EFAULT;
1015         }
1016
1017         if (buffer && !copy_from_user(tmp, buffer, count)) {
1018
1019                 int num = sscanf(tmp, "%d", &sink_udpport);
1020
1021                 if (num !=  1) {
1022                         RTW_INFO("invalid input parameter number!\n");
1023                         return count;
1024                 }
1025
1026         }
1027         precvpriv->sink_udpport = sink_udpport;
1028
1029         return count;
1030
1031 }
1032
1033 static int proc_get_mi_ap_bc_info(struct seq_file *m, void *v)
1034 {
1035         struct net_device *dev = m->private;
1036         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1037         struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1038         struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1039         u8 i;
1040
1041         for (i = 0; i < dvobj->iface_nums; i++)
1042                 RTW_PRINT_SEL(m, "iface_id:%d, mac_id && sec_cam_id = %d\n", i, macid_ctl->iface_bmc[i]);
1043
1044         return 0;
1045 }
1046 static int proc_get_macid_info(struct seq_file *m, void *v)
1047 {
1048         struct net_device *dev = m->private;
1049         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1050         struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1051         struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1052         u8 chip_type = rtw_get_chip_type(adapter);
1053         u8 i;
1054         u8 null_addr[ETH_ALEN] = {0};
1055         u8 *macaddr;
1056
1057         RTW_PRINT_SEL(m, "max_num:%u\n", macid_ctl->num);
1058         RTW_PRINT_SEL(m, "\n");
1059
1060         RTW_PRINT_SEL(m, "used:\n");
1061         dump_macid_map(m, &macid_ctl->used, macid_ctl->num);
1062         RTW_PRINT_SEL(m, "\n");
1063
1064         RTW_PRINT_SEL(m, "%-3s %-3s %-4s %-4s %-17s %-6s %-3s"
1065                 , "id", "bmc", "if_g", "ch_g", "macaddr", "bw", "vht");
1066
1067         if (chip_type == RTL8814A)
1068                 _RTW_PRINT_SEL(m, " %-10s", "rate_bmp1");
1069
1070         _RTW_PRINT_SEL(m, " %-10s %s\n", "rate_bmp0", "status");
1071
1072         for (i = 0; i < macid_ctl->num; i++) {
1073                 if (rtw_macid_is_used(macid_ctl, i)
1074                         || macid_ctl->h2c_msr[i]
1075                 ) {
1076                         if (macid_ctl->sta[i])
1077                                 macaddr = macid_ctl->sta[i]->hwaddr;
1078                         else
1079                                 macaddr = null_addr;
1080
1081                         RTW_PRINT_SEL(m, "%3u %3u %4d %4d "MAC_FMT" %6s %3u"
1082                                 , i
1083                                 , rtw_macid_is_bmc(macid_ctl, i)
1084                                 , rtw_macid_get_if_g(macid_ctl, i)
1085                                 , rtw_macid_get_ch_g(macid_ctl, i)
1086                                 , MAC_ARG(macaddr)
1087                                 , ch_width_str(macid_ctl->bw[i])
1088                                 , macid_ctl->vht_en[i]
1089                         );
1090
1091                         if (chip_type == RTL8814A)
1092                                 _RTW_PRINT_SEL(m, " 0x%08X", macid_ctl->rate_bmp1[i]);
1093
1094                         _RTW_PRINT_SEL(m, " 0x%08X "H2C_MSR_FMT" %s\n"
1095                                 , macid_ctl->rate_bmp0[i]
1096                                 , H2C_MSR_ARG(&macid_ctl->h2c_msr[i])
1097                                 , rtw_macid_is_used(macid_ctl, i) ? "" : "[unused]"
1098                         );
1099                 }
1100         }
1101
1102         return 0;
1103 }
1104
1105 static int proc_get_sec_cam(struct seq_file *m, void *v)
1106 {
1107         struct net_device *dev = m->private;
1108         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1109         struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1110         struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
1111
1112         RTW_PRINT_SEL(m, "sec_cap:0x%02x\n", cam_ctl->sec_cap);
1113         RTW_PRINT_SEL(m, "flags:0x%08x\n", cam_ctl->flags);
1114         RTW_PRINT_SEL(m, "\n");
1115
1116         RTW_PRINT_SEL(m, "max_num:%u\n", cam_ctl->num);
1117         RTW_PRINT_SEL(m, "used:\n");
1118         dump_sec_cam_map(m, &cam_ctl->used, cam_ctl->num);
1119         RTW_PRINT_SEL(m, "\n");
1120
1121         RTW_PRINT_SEL(m, "reg_scr:0x%04x\n", rtw_read16(adapter, 0x680));
1122         RTW_PRINT_SEL(m, "\n");
1123
1124         dump_sec_cam(m, adapter);
1125
1126         return 0;
1127 }
1128
1129 static ssize_t proc_set_sec_cam(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1130 {
1131         struct net_device *dev = data;
1132         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1133         struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1134         struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
1135         char tmp[32] = {0};
1136         char cmd[4];
1137         u8 id_1 = 0, id_2 = 0;
1138
1139         if (count > sizeof(tmp)) {
1140                 rtw_warn_on(1);
1141                 return -EFAULT;
1142         }
1143
1144         if (buffer && !copy_from_user(tmp, buffer, count)) {
1145
1146                 /* c <id_1>: clear specific cam entry */
1147                 /* wfc <id_1>: write specific cam entry from cam cache */
1148                 /* sw <id_1> <id_2>: sec_cam 1/2 swap */
1149
1150                 int num = sscanf(tmp, "%s %hhu %hhu", cmd, &id_1, &id_2);
1151
1152                 if (num < 2)
1153                         return count;
1154
1155                 if ((id_1 >= cam_ctl->num) || (id_2 >= cam_ctl->num)) {
1156                         RTW_ERR(FUNC_ADPT_FMT" invalid id_1:%u id_2:%u\n", FUNC_ADPT_ARG(adapter), id_1, id_2);
1157                         return count;
1158                 }
1159
1160                 if (strcmp("c", cmd) == 0) {
1161                         _clear_cam_entry(adapter, id_1);
1162                         adapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */
1163                 } else if (strcmp("wfc", cmd) == 0)
1164                         write_cam_from_cache(adapter, id_1);
1165                 else if (strcmp("sw", cmd) == 0)
1166                         rtw_sec_cam_swap(adapter, id_1, id_2);
1167                 else if (strcmp("cdk", cmd) == 0)
1168                         rtw_clean_dk_section(adapter);
1169 #ifdef DBG_SEC_CAM_MOVE
1170                 else if (strcmp("sgd", cmd) == 0)
1171                         rtw_hal_move_sta_gk_to_dk(adapter);
1172                 else if (strcmp("rsd", cmd) == 0)
1173                         rtw_hal_read_sta_dk_key(adapter, id_1);
1174 #endif
1175         }
1176
1177         return count;
1178 }
1179
1180 static int proc_get_sec_cam_cache(struct seq_file *m, void *v)
1181 {
1182         struct net_device *dev = m->private;
1183         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1184
1185         dump_sec_cam_cache(m, adapter);
1186         return 0;
1187 }
1188
1189 static ssize_t proc_set_change_bss_chbw(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1190 {
1191         struct net_device *dev = data;
1192         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1193         struct mlme_priv *mlme = &(adapter->mlmepriv);
1194         struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);
1195         char tmp[32];
1196         s16 ch;
1197         s8 bw = -1, offset = -1;
1198
1199         if (count < 1)
1200                 return -EFAULT;
1201
1202         if (count > sizeof(tmp)) {
1203                 rtw_warn_on(1);
1204                 return -EFAULT;
1205         }
1206
1207         if (buffer && !copy_from_user(tmp, buffer, count)) {
1208
1209                 int num = sscanf(tmp, "%hd %hhd %hhd", &ch, &bw, &offset);
1210
1211                 if (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))
1212                         goto exit;
1213
1214                 if (check_fwstate(mlme, WIFI_AP_STATE) && check_fwstate(mlme, WIFI_ASOC_STATE))
1215                         rtw_change_bss_chbw_cmd(adapter, RTW_CMDF_WAIT_ACK, ch, bw, offset);
1216         }
1217
1218 exit:
1219         return count;
1220 }
1221
1222 #ifdef CONFIG_80211N_HT
1223 static int proc_get_tx_bw_mode(struct seq_file *m, void *v)
1224 {
1225         struct net_device *dev = m->private;
1226         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1227
1228         RTW_PRINT_SEL(m, "0x%02x\n", adapter->driver_tx_bw_mode);
1229         RTW_PRINT_SEL(m, "2.4G:%s\n", ch_width_str(ADAPTER_TX_BW_2G(adapter)));
1230         RTW_PRINT_SEL(m, "5G:%s\n", ch_width_str(ADAPTER_TX_BW_5G(adapter)));
1231
1232         return 0;
1233 }
1234
1235 static ssize_t proc_set_tx_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1236 {
1237         struct net_device *dev = data;
1238         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1239         struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl;
1240         struct mlme_priv *mlme = &(adapter->mlmepriv);
1241         struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);
1242         char tmp[32];
1243         u8 bw_mode;
1244
1245         if (count < 1)
1246                 return -EFAULT;
1247
1248         if (count > sizeof(tmp)) {
1249                 rtw_warn_on(1);
1250                 return -EFAULT;
1251         }
1252
1253         if (buffer && !copy_from_user(tmp, buffer, count)) {
1254
1255                 u8 update = _FALSE;
1256                 int num = sscanf(tmp, "%hhx", &bw_mode);
1257
1258                 if (num < 1 || bw_mode == adapter->driver_tx_bw_mode)
1259                         goto exit;
1260
1261                 if ((MLME_STATE(adapter) & WIFI_ASOC_STATE)
1262                         && ((mlmeext->cur_channel <= 14 && BW_MODE_2G(bw_mode) != ADAPTER_TX_BW_2G(adapter))
1263                                 || (mlmeext->cur_channel >= 36 && BW_MODE_5G(bw_mode) != ADAPTER_TX_BW_5G(adapter)))
1264                 ) {
1265                         /* RA mask update needed */
1266                         update = _TRUE;
1267                 }
1268                 adapter->driver_tx_bw_mode = bw_mode;
1269
1270                 if (update == _TRUE) {
1271                         struct sta_info *sta;
1272                         int i;
1273
1274                         for (i = 0; i < MACID_NUM_SW_LIMIT; i++) {
1275                                 sta = macid_ctl->sta[i];
1276                                 if (sta && !is_broadcast_mac_addr(sta->hwaddr))
1277                                         rtw_dm_ra_mask_wk_cmd(adapter, (u8 *)sta);
1278                         }
1279                 }
1280         }
1281
1282 exit:
1283         return count;
1284 }
1285 #endif /* CONFIG_80211N_HT */
1286
1287 static int proc_get_hal_txpwr_info(struct seq_file *m, void *v)
1288 {
1289         struct net_device *dev = m->private;
1290         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1291         struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
1292
1293         if (hal_is_band_support(adapter, BAND_ON_2_4G))
1294                 dump_hal_txpwr_info_2g(m, adapter, hal_spec->rfpath_num_2g, hal_spec->max_tx_cnt);
1295
1296 #ifdef CONFIG_IEEE80211_BAND_5GHZ
1297         if (hal_is_band_support(adapter, BAND_ON_5G))
1298                 dump_hal_txpwr_info_5g(m, adapter, hal_spec->rfpath_num_5g, hal_spec->max_tx_cnt);
1299 #endif
1300
1301         return 0;
1302 }
1303
1304 static int proc_get_target_tx_power(struct seq_file *m, void *v)
1305 {
1306         struct net_device *dev = m->private;
1307         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1308
1309         dump_target_tx_power(m, adapter);
1310
1311         return 0;
1312 }
1313
1314 static int proc_get_tx_power_by_rate(struct seq_file *m, void *v)
1315 {
1316         struct net_device *dev = m->private;
1317         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1318
1319         dump_tx_power_by_rate(m, adapter);
1320
1321         return 0;
1322 }
1323
1324 static int proc_get_tx_power_limit(struct seq_file *m, void *v)
1325 {
1326         struct net_device *dev = m->private;
1327         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1328
1329         dump_tx_power_limit(m, adapter);
1330
1331         return 0;
1332 }
1333
1334 static int proc_get_tx_power_ext_info(struct seq_file *m, void *v)
1335 {
1336         struct net_device *dev = m->private;
1337         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1338
1339         dump_tx_power_ext_info(m, adapter);
1340
1341         return 0;
1342 }
1343
1344 static ssize_t proc_set_tx_power_ext_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1345 {
1346         struct net_device *dev = data;
1347         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1348
1349         char tmp[32] = {0};
1350         char cmd[16] = {0};
1351
1352         if (count > sizeof(tmp)) {
1353                 rtw_warn_on(1);
1354                 return -EFAULT;
1355         }
1356
1357         if (buffer && !copy_from_user(tmp, buffer, count)) {
1358
1359                 int num = sscanf(tmp, "%s", cmd);
1360
1361                 if (num < 1)
1362                         return count;
1363
1364                 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
1365                 phy_free_filebuf_mask(adapter, LOAD_BB_PG_PARA_FILE | LOAD_RF_TXPWR_LMT_PARA_FILE);
1366                 #endif
1367
1368                 rtw_ps_deny(adapter, PS_DENY_IOCTL);
1369                 LeaveAllPowerSaveModeDirect(adapter);
1370
1371                 if (strcmp("default", cmd) == 0)
1372                         rtw_run_in_thread_cmd(adapter, ((void *)(phy_reload_default_tx_power_ext_info)), adapter);
1373                 else
1374                         rtw_run_in_thread_cmd(adapter, ((void *)(phy_reload_tx_power_ext_info)), adapter);
1375
1376                 rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
1377         }
1378
1379         return count;
1380 }
1381
1382 static void *proc_start_tx_power_idx(struct seq_file *m, loff_t *pos)
1383 {
1384         struct net_device *dev = m->private;
1385         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1386         u8 path = ((*pos) & 0xFF00) >> 8;
1387         u8 rs = *pos & 0xFF;
1388
1389         if (path >= RF_PATH_MAX)
1390                 return NULL;
1391
1392         return pos;
1393 }
1394 static void proc_stop_tx_power_idx(struct seq_file *m, void *v)
1395 {
1396         struct net_device *dev = m->private;
1397         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1398 }
1399
1400 static void *proc_next_tx_power_idx(struct seq_file *m, void *v, loff_t *pos)
1401 {
1402         struct net_device *dev = m->private;
1403         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1404         u8 path = ((*pos) & 0xFF00) >> 8;
1405         u8 rs = *pos & 0xFF;
1406
1407         rs++;
1408         if (rs >= RATE_SECTION_NUM) {
1409                 rs = 0;
1410                 path++;
1411         }
1412
1413         if (path >= RF_PATH_MAX)
1414                 return NULL;
1415
1416         *pos = (path << 8) | rs;
1417
1418         return pos;
1419 }
1420
1421 static int proc_get_tx_power_idx(struct seq_file *m, void *v)
1422 {
1423         struct net_device *dev = m->private;
1424         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1425         u32 pos = *((loff_t *)(v));
1426         u8 path = (pos & 0xFF00) >> 8;
1427         u8 rs = pos & 0xFF;
1428
1429         if (0)
1430                 RTW_INFO("%s path=%u, rs=%u\n", __func__, path, rs);
1431
1432         if (path == RF_PATH_A && rs == CCK)
1433                 dump_tx_power_idx_title(m, adapter);
1434         dump_tx_power_idx_by_path_rs(m, adapter, path, rs);
1435
1436         return 0;
1437 }
1438
1439 static struct seq_operations seq_ops_tx_power_idx = {
1440         .start = proc_start_tx_power_idx,
1441         .stop  = proc_stop_tx_power_idx,
1442         .next  = proc_next_tx_power_idx,
1443         .show  = proc_get_tx_power_idx,
1444 };
1445
1446 #ifdef CONFIG_RF_POWER_TRIM
1447 static int proc_get_kfree_flag(struct seq_file *m, void *v)
1448 {
1449         struct net_device *dev = m->private;
1450         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1451         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1452
1453         RTW_PRINT_SEL(m, "0x%02x\n", kfree_data->flag);
1454
1455         return 0;
1456 }
1457
1458 static ssize_t proc_set_kfree_flag(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1459 {
1460         struct net_device *dev = data;
1461         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1462         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1463         char tmp[32] = {0};
1464         u8 flag;
1465
1466         if (count > sizeof(tmp)) {
1467                 rtw_warn_on(1);
1468                 return -EFAULT;
1469         }
1470
1471         if (buffer && !copy_from_user(tmp, buffer, count)) {
1472
1473                 int num = sscanf(tmp, "%hhx", &flag);
1474
1475                 if (num < 1)
1476                         return count;
1477
1478                 kfree_data->flag = flag;
1479         }
1480
1481         return count;
1482 }
1483
1484 static int proc_get_kfree_bb_gain(struct seq_file *m, void *v)
1485 {
1486         struct net_device *dev = m->private;
1487         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1488         HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1489         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1490         u8 i, j;
1491
1492         for (i = 0; i < BB_GAIN_NUM; i++) {
1493                 if (i == 0)
1494                         _RTW_PRINT_SEL(m, "2G: ");
1495                 else if (i == 1)
1496                         _RTW_PRINT_SEL(m, "5GLB1: ");
1497                 else if (i == 2)
1498                         _RTW_PRINT_SEL(m, "5GLB2: ");
1499                 else if (i == 3)
1500                         _RTW_PRINT_SEL(m, "5GMB1: ");
1501                 else if (i == 4)
1502                         _RTW_PRINT_SEL(m, "5GMB2: ");
1503                 else if (i == 5)
1504                         _RTW_PRINT_SEL(m, "5GHB: ");
1505
1506                 for (j = 0; j < hal_data->NumTotalRFPath; j++)
1507                         _RTW_PRINT_SEL(m, "%d ", kfree_data->bb_gain[i][j]);
1508                 _RTW_PRINT_SEL(m, "\n");
1509         }
1510
1511         return 0;
1512 }
1513
1514 static ssize_t proc_set_kfree_bb_gain(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1515 {
1516         struct net_device *dev = data;
1517         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1518         HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1519         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1520         char tmp[BB_GAIN_NUM * RF_PATH_MAX] = {0};
1521         u8 path, chidx;
1522         s8 bb_gain[BB_GAIN_NUM];
1523         char ch_band_Group[6];
1524
1525         if (count > sizeof(tmp)) {
1526                 rtw_warn_on(1);
1527                 return -EFAULT;
1528         }
1529
1530         if (buffer && !copy_from_user(tmp, buffer, count)) {
1531                 char *c, *next;
1532                 int i = 0;
1533
1534                 next = tmp;
1535                 c = strsep(&next, " \t");
1536
1537                 if (sscanf(c, "%s", ch_band_Group) != 1) {
1538                         RTW_INFO("Error Head Format, channel Group select\n,Please input:\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\n");
1539                         return count;
1540                 }
1541                 if (strcmp("2G", ch_band_Group) == 0)
1542                         chidx = BB_GAIN_2G;
1543 #ifdef CONFIG_IEEE80211_BAND_5GHZ
1544                 else if (strcmp("5GLB1", ch_band_Group) == 0)
1545                         chidx = BB_GAIN_5GLB1;
1546                 else if (strcmp("5GLB2", ch_band_Group) == 0)
1547                         chidx = BB_GAIN_5GLB2;
1548                 else if (strcmp("5GMB1", ch_band_Group) == 0)
1549                         chidx = BB_GAIN_5GMB1;
1550                 else if (strcmp("5GMB2", ch_band_Group) == 0)
1551                         chidx = BB_GAIN_5GMB2;
1552                 else if (strcmp("5GHB", ch_band_Group) == 0)
1553                         chidx = BB_GAIN_5GHB;
1554 #endif /*CONFIG_IEEE80211_BAND_5GHZ*/
1555                 else {
1556                         RTW_INFO("Error Head Format, channel Group select\n,Please input:\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\n");
1557                         return count;
1558                 }
1559                 c = strsep(&next, " \t");
1560
1561                 while (c != NULL) {
1562                         if (sscanf(c, "%hhx", &bb_gain[i]) != 1)
1563                                 break;
1564
1565                         kfree_data->bb_gain[chidx][i] = bb_gain[i];
1566                         RTW_INFO("%s,kfree_data->bb_gain[%d][%d]=%x\n", __func__, chidx, i, kfree_data->bb_gain[chidx][i]);
1567
1568                         c = strsep(&next, " \t");
1569                         i++;
1570                 }
1571
1572         }
1573
1574         return count;
1575
1576 }
1577
1578 static int proc_get_kfree_thermal(struct seq_file *m, void *v)
1579 {
1580         struct net_device *dev = m->private;
1581         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1582         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1583
1584         _RTW_PRINT_SEL(m, "%d\n", kfree_data->thermal);
1585
1586         return 0;
1587 }
1588
1589 static ssize_t proc_set_kfree_thermal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1590 {
1591         struct net_device *dev = data;
1592         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1593         struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
1594         char tmp[32] = {0};
1595         s8 thermal;
1596
1597         if (count > sizeof(tmp)) {
1598                 rtw_warn_on(1);
1599                 return -EFAULT;
1600         }
1601
1602         if (buffer && !copy_from_user(tmp, buffer, count)) {
1603
1604                 int num = sscanf(tmp, "%hhd", &thermal);
1605
1606                 if (num < 1)
1607                         return count;
1608
1609                 kfree_data->thermal = thermal;
1610         }
1611
1612         return count;
1613 }
1614
1615 static ssize_t proc_set_tx_gain_offset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1616 {
1617         struct net_device *dev = data;
1618         _adapter *adapter;
1619         char tmp[32] = {0};
1620         u8 rf_path;
1621         s8 offset;
1622
1623         adapter = (_adapter *)rtw_netdev_priv(dev);
1624         if (!adapter)
1625                 return -EFAULT;
1626
1627         if (count > sizeof(tmp)) {
1628                 rtw_warn_on(1);
1629                 return -EFAULT;
1630         }
1631
1632         if (buffer && !copy_from_user(tmp, buffer, count)) {
1633                 u8 write_value;
1634                 int num = sscanf(tmp, "%hhu %hhd", &rf_path, &offset);
1635
1636                 if (num < 2)
1637                         return count;
1638
1639                 RTW_INFO("write rf_path:%u tx gain offset:%d\n", rf_path, offset);
1640                 rtw_rf_set_tx_gain_offset(adapter, rf_path, offset);
1641         }
1642
1643         return count;
1644 }
1645 #endif /* CONFIG_RF_POWER_TRIM */
1646
1647 #ifdef CONFIG_BT_COEXIST
1648 ssize_t proc_set_btinfo_evt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1649 {
1650         struct net_device *dev = data;
1651         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1652         char tmp[32];
1653         u8 btinfo[8];
1654
1655         if (count < 6)
1656                 return -EFAULT;
1657
1658         if (count > sizeof(tmp)) {
1659                 rtw_warn_on(1);
1660                 return -EFAULT;
1661         }
1662
1663         if (buffer && !copy_from_user(tmp, buffer, count)) {
1664                 int num = 0;
1665
1666                 _rtw_memset(btinfo, 0, 8);
1667
1668                 num = sscanf(tmp, "%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx"
1669                         , &btinfo[0], &btinfo[1], &btinfo[2], &btinfo[3]
1670                         , &btinfo[4], &btinfo[5], &btinfo[6], &btinfo[7]);
1671
1672                 if (num < 6)
1673                         return -EINVAL;
1674
1675                 btinfo[1] = num - 2;
1676
1677                 rtw_btinfo_cmd(padapter, btinfo, btinfo[1] + 2);
1678         }
1679
1680         return count;
1681 }
1682
1683 static u8 btreg_read_type = 0;
1684 static u16 btreg_read_addr = 0;
1685 static int btreg_read_error = 0;
1686 static u8 btreg_write_type = 0;
1687 static u16 btreg_write_addr = 0;
1688 static int btreg_write_error = 0;
1689
1690 static u8 *btreg_type[] = {
1691         "rf",
1692         "modem",
1693         "bluewize",
1694         "vendor",
1695         "le"
1696 };
1697
1698 static int btreg_parse_str(char const *input, u8 *type, u16 *addr, u16 *val)
1699 {
1700         u32 num;
1701         u8 str[80] = {0};
1702         u8 t = 0;
1703         u32 a, v;
1704         u8 i, n;
1705         u8 *p;
1706
1707
1708         num = sscanf(input, "%s %x %x", str, &a, &v);
1709         if (num < 2) {
1710                 RTW_INFO("%s: INVALID input!(%s)\n", __FUNCTION__, input);
1711                 return -EINVAL;
1712         }
1713         if ((num < 3) && val) {
1714                 RTW_INFO("%s: INVALID input!(%s)\n", __FUNCTION__, input);
1715                 return -EINVAL;
1716         }
1717
1718         /* convert to lower case for following type compare */
1719         p = str;
1720         for (; *p; ++p)
1721                 *p = tolower(*p);
1722         n = sizeof(btreg_type) / sizeof(btreg_type[0]);
1723         for (i = 0; i < n; i++) {
1724                 if (!strcmp(str, btreg_type[i])) {
1725                         t = i;
1726                         break;
1727                 }
1728         }
1729         if (i == n) {
1730                 RTW_INFO("%s: unknown type(%s)!\n", __FUNCTION__, str);
1731                 return -EINVAL;
1732         }
1733
1734         switch (t) {
1735         case 0:
1736                 /* RF */
1737                 if (a & 0xFFFFFF80) {
1738                         RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
1739                                  __FUNCTION__, a, btreg_type[t], t);
1740                         return -EINVAL;
1741                 }
1742                 break;
1743         case 1:
1744                 /* Modem */
1745                 if (a & 0xFFFFFE00) {
1746                         RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
1747                                  __FUNCTION__, a, btreg_type[t], t);
1748                         return -EINVAL;
1749                 }
1750                 break;
1751         default:
1752                 /* Others(Bluewize, Vendor, LE) */
1753                 if (a & 0xFFFFF000) {
1754                         RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
1755                                  __FUNCTION__, a, btreg_type[t], t);
1756                         return -EINVAL;
1757                 }
1758                 break;
1759         }
1760
1761         if (val) {
1762                 if (v & 0xFFFF0000) {
1763                         RTW_INFO("%s: INVALID value(0x%x)!\n", __FUNCTION__, v);
1764                         return -EINVAL;
1765                 }
1766                 *val = (u16)v;
1767         }
1768
1769         *type = (u8)t;
1770         *addr = (u16)a;
1771
1772         return 0;
1773 }
1774
1775 int proc_get_btreg_read(struct seq_file *m, void *v)
1776 {
1777         struct net_device *dev;
1778         PADAPTER padapter;
1779         u16 ret;
1780         u32 data;
1781
1782
1783         if (btreg_read_error)
1784                 return btreg_read_error;
1785
1786         dev = m->private;
1787         padapter = (PADAPTER)rtw_netdev_priv(dev);
1788
1789         ret = rtw_btcoex_btreg_read(padapter, btreg_read_type, btreg_read_addr, &data);
1790         if (CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
1791                 RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X = 0x%08x\n", btreg_type[btreg_read_type], btreg_read_addr, data);
1792         else
1793                 RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X read fail. error code = 0x%04x.\n", btreg_type[btreg_read_type], btreg_read_addr, ret);
1794
1795         return 0;
1796 }
1797
1798 ssize_t proc_set_btreg_read(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1799 {
1800         struct net_device *dev = data;
1801         PADAPTER padapter;
1802         u8 tmp[80] = {0};
1803         u32 num;
1804         int err;
1805
1806
1807         padapter = (PADAPTER)rtw_netdev_priv(dev);
1808
1809         if (NULL == buffer) {
1810                 RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
1811                          FUNC_ADPT_ARG(padapter));
1812                 err = -EFAULT;
1813                 goto exit;
1814         }
1815
1816         if (count < 1) {
1817                 RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
1818                          FUNC_ADPT_ARG(padapter));
1819                 err = -EFAULT;
1820                 goto exit;
1821         }
1822
1823         num = count;
1824         if (num > (sizeof(tmp) - 1))
1825                 num = (sizeof(tmp) - 1);
1826
1827         if (copy_from_user(tmp, buffer, num)) {
1828                 RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
1829                          FUNC_ADPT_ARG(padapter));
1830                 err = -EFAULT;
1831                 goto exit;
1832         }
1833         /* [Coverity] sure tmp end with '\0'(string terminal) */
1834         tmp[sizeof(tmp) - 1] = 0;
1835
1836         err = btreg_parse_str(tmp, &btreg_read_type, &btreg_read_addr, NULL);
1837         if (err)
1838                 goto exit;
1839
1840         RTW_INFO(FUNC_ADPT_FMT ": addr=(%s)0x%X\n",
1841                 FUNC_ADPT_ARG(padapter), btreg_type[btreg_read_type], btreg_read_addr);
1842
1843 exit:
1844         btreg_read_error = err;
1845
1846         return count;
1847 }
1848
1849 int proc_get_btreg_write(struct seq_file *m, void *v)
1850 {
1851         struct net_device *dev;
1852         PADAPTER padapter;
1853         u16 ret;
1854         u32 data;
1855
1856
1857         if (btreg_write_error < 0)
1858                 return btreg_write_error;
1859         else if (btreg_write_error > 0) {
1860                 RTW_PRINT_SEL(m, "BTREG write: (%s)0x%04X write fail. error code = 0x%04x.\n", btreg_type[btreg_write_type], btreg_write_addr, btreg_write_error);
1861                 return 0;
1862         }
1863
1864         dev = m->private;
1865         padapter = (PADAPTER)rtw_netdev_priv(dev);
1866
1867         ret = rtw_btcoex_btreg_read(padapter, btreg_write_type, btreg_write_addr, &data);
1868         if (CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
1869                 RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X = 0x%08x\n", btreg_type[btreg_write_type], btreg_write_addr, data);
1870         else
1871                 RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X read fail. error code = 0x%04x.\n", btreg_type[btreg_write_type], btreg_write_addr, ret);
1872
1873         return 0;
1874 }
1875
1876 ssize_t proc_set_btreg_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1877 {
1878         struct net_device *dev = data;
1879         PADAPTER padapter;
1880         u8 tmp[80] = {0};
1881         u32 num;
1882         u16 val;
1883         u16 ret;
1884         int err;
1885
1886
1887         padapter = (PADAPTER)rtw_netdev_priv(dev);
1888
1889         if (NULL == buffer) {
1890                 RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
1891                          FUNC_ADPT_ARG(padapter));
1892                 err = -EFAULT;
1893                 goto exit;
1894         }
1895
1896         if (count < 1) {
1897                 RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
1898                          FUNC_ADPT_ARG(padapter));
1899                 err = -EFAULT;
1900                 goto exit;
1901         }
1902
1903         num = count;
1904         if (num > (sizeof(tmp) - 1))
1905                 num = (sizeof(tmp) - 1);
1906
1907         if (copy_from_user(tmp, buffer, num)) {
1908                 RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
1909                          FUNC_ADPT_ARG(padapter));
1910                 err = -EFAULT;
1911                 goto exit;
1912         }
1913
1914         err = btreg_parse_str(tmp, &btreg_write_type, &btreg_write_addr, &val);
1915         if (err)
1916                 goto exit;
1917
1918         RTW_INFO(FUNC_ADPT_FMT ": Set (%s)0x%X = 0x%x\n",
1919                 FUNC_ADPT_ARG(padapter), btreg_type[btreg_write_type], btreg_write_addr, val);
1920
1921         ret = rtw_btcoex_btreg_write(padapter, btreg_write_type, btreg_write_addr, val);
1922         if (!CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
1923                 err = ret;
1924
1925 exit:
1926         btreg_write_error = err;
1927
1928         return count;
1929 }
1930 #endif /* CONFIG_BT_COEXIST */
1931
1932 #ifdef CONFIG_MBSSID_CAM
1933 int proc_get_mbid_cam_cache(struct seq_file *m, void *v)
1934 {
1935         struct net_device *dev = m->private;
1936         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1937
1938         rtw_mbid_cam_cache_dump(m, __func__, adapter);
1939         rtw_mbid_cam_dump(m, __func__, adapter);
1940         return 0;
1941 }
1942 #endif /* CONFIG_MBSSID_CAM */
1943
1944 int proc_get_mac_addr(struct seq_file *m, void *v)
1945 {
1946         struct net_device *dev = m->private;
1947         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1948
1949         rtw_hal_dump_macaddr(m, adapter);
1950         return 0;
1951 }
1952
1953 static int proc_get_skip_band(struct seq_file *m, void *v)
1954 {
1955         struct net_device *dev = m->private;
1956         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1957         int bandskip;
1958
1959         bandskip = RTW_GET_SCAN_BAND_SKIP(adapter);
1960         RTW_PRINT_SEL(m, "bandskip:0x%02x\n", bandskip);
1961         return 0;
1962 }
1963
1964 static ssize_t proc_set_skip_band(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1965 {
1966         struct net_device *dev = data;
1967         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1968         char tmp[6];
1969         u8 skip_band;
1970
1971         if (count < 1)
1972                 return -EFAULT;
1973
1974         if (count > sizeof(tmp)) {
1975                 rtw_warn_on(1);
1976                 return -EFAULT;
1977         }
1978         if (buffer && !copy_from_user(tmp, buffer, count)) {
1979
1980                 int num = sscanf(tmp, "%hhu", &skip_band);
1981
1982                 if (num < 1)
1983                         return -EINVAL;
1984
1985                 if (1 == skip_band)
1986                         RTW_SET_SCAN_BAND_SKIP(padapter, BAND_24G);
1987                 else if (2 == skip_band)
1988                         RTW_SET_SCAN_BAND_SKIP(padapter, BAND_5G);
1989                 else if (3 == skip_band)
1990                         RTW_CLR_SCAN_BAND_SKIP(padapter, BAND_24G);
1991                 else if (4 == skip_band)
1992                         RTW_CLR_SCAN_BAND_SKIP(padapter, BAND_5G);
1993         }
1994         return count;
1995
1996 }
1997
1998 #ifdef CONFIG_AUTO_CHNL_SEL_NHM
1999 static int proc_get_best_chan(struct seq_file *m, void *v)
2000 {
2001         struct net_device *dev = m->private;
2002         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2003         u8 best_24g_ch = 0, best_5g_ch = 0;
2004
2005         rtw_hal_get_odm_var(adapter, HAL_ODM_AUTO_CHNL_SEL, &(best_24g_ch), &(best_5g_ch));
2006
2007         RTW_PRINT_SEL(m, "Best 2.4G CH:%u\n", best_24g_ch);
2008         RTW_PRINT_SEL(m, "Best 5G CH:%u\n", best_5g_ch);
2009         return 0;
2010 }
2011
2012 static ssize_t  proc_set_acs(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2013 {
2014         struct net_device *dev = data;
2015         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2016         char tmp[32];
2017         u8 acs_satae = 0;
2018
2019         if (count < 1)
2020                 return -EFAULT;
2021
2022         if (count > sizeof(tmp)) {
2023                 rtw_warn_on(1);
2024                 return -EFAULT;
2025         }
2026         if (buffer && !copy_from_user(tmp, buffer, count)) {
2027
2028                 int num = sscanf(tmp, "%hhu", &acs_satae);
2029
2030                 if (num < 1)
2031                         return -EINVAL;
2032
2033                 if (1 == acs_satae)
2034                         rtw_acs_start(padapter, _TRUE);
2035                 else
2036                         rtw_acs_start(padapter, _FALSE);
2037
2038         }
2039         return count;
2040 }
2041 #endif
2042
2043 static int proc_get_hal_spec(struct seq_file *m, void *v)
2044 {
2045         struct net_device *dev = m->private;
2046         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2047
2048         dump_hal_spec(m, adapter);
2049         return 0;
2050 }
2051
2052 #ifdef CONFIG_SUPPORT_TRX_SHARED
2053 #include "../../hal/hal_halmac.h"
2054 static int proc_get_trx_share_mode(struct seq_file *m, void *v)
2055 {
2056         struct net_device *dev = m->private;
2057         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2058
2059         dump_trx_share_mode(m, adapter);
2060         return 0;
2061 }
2062 #endif
2063
2064 static int proc_get_napi_info(struct seq_file *m, void *v)
2065 {
2066         struct net_device *dev = m->private;
2067         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2068         struct registry_priv *pregistrypriv = &adapter->registrypriv;
2069         u8 napi = 0, gro = 0;
2070         u32 weight = 0;
2071
2072
2073 #ifdef CONFIG_RTW_NAPI
2074         if (pregistrypriv->en_napi) {
2075                 napi = 1;
2076                 weight = RTL_NAPI_WEIGHT;
2077         }
2078
2079 #ifdef CONFIG_RTW_GRO
2080         if (pregistrypriv->en_gro)
2081                 gro = 1;
2082 #endif /* CONFIG_RTW_GRO */
2083 #endif /* CONFIG_RTW_NAPI */
2084
2085         if (napi)
2086                 RTW_PRINT_SEL(m, "NAPI enable, weight=%d\n", weight);
2087         else
2088                 RTW_PRINT_SEL(m, "NAPI disable\n");
2089         RTW_PRINT_SEL(m, "GRO %s\n", gro?"enable":"disable");
2090
2091         return 0;
2092 }
2093
2094 /*
2095 * rtw_adapter_proc:
2096 * init/deinit when register/unregister net_device
2097 */
2098 const struct rtw_proc_hdl adapter_proc_hdls[] = {
2099 #if RTW_SEQ_FILE_TEST
2100         RTW_PROC_HDL_SEQ("seq_file_test", &seq_file_test, NULL),
2101 #endif
2102         RTW_PROC_HDL_SSEQ("write_reg", NULL, proc_set_write_reg),
2103         RTW_PROC_HDL_SSEQ("read_reg", proc_get_read_reg, proc_set_read_reg),
2104         RTW_PROC_HDL_SSEQ("tx_rate_bmp", proc_get_dump_tx_rate_bmp, NULL),
2105         RTW_PROC_HDL_SSEQ("adapters_status", proc_get_dump_adapters_status, NULL),
2106 #ifdef CONFIG_RTW_CUSTOMER_STR
2107         RTW_PROC_HDL_SSEQ("customer_str", proc_get_customer_str, NULL),
2108 #endif
2109         RTW_PROC_HDL_SSEQ("fwstate", proc_get_fwstate, NULL),
2110         RTW_PROC_HDL_SSEQ("sec_info", proc_get_sec_info, NULL),
2111         RTW_PROC_HDL_SSEQ("mlmext_state", proc_get_mlmext_state, NULL),
2112         RTW_PROC_HDL_SSEQ("qos_option", proc_get_qos_option, NULL),
2113         RTW_PROC_HDL_SSEQ("ht_option", proc_get_ht_option, NULL),
2114         RTW_PROC_HDL_SSEQ("rf_info", proc_get_rf_info, NULL),
2115         RTW_PROC_HDL_SSEQ("scan_param", proc_get_scan_param, proc_set_scan_param),
2116         RTW_PROC_HDL_SSEQ("scan_abort", proc_get_scan_abort, NULL),
2117 #ifdef CONFIG_SCAN_BACKOP
2118         RTW_PROC_HDL_SSEQ("backop_flags_sta", proc_get_backop_flags_sta, proc_set_backop_flags_sta),
2119         RTW_PROC_HDL_SSEQ("backop_flags_ap", proc_get_backop_flags_ap, proc_set_backop_flags_ap),
2120 #endif
2121         RTW_PROC_HDL_SSEQ("survey_info", proc_get_survey_info, proc_set_survey_info),
2122         RTW_PROC_HDL_SSEQ("ap_info", proc_get_ap_info, NULL),
2123         RTW_PROC_HDL_SSEQ("trx_info", proc_get_trx_info, proc_reset_trx_info),
2124         RTW_PROC_HDL_SSEQ("rate_ctl", proc_get_rate_ctl, proc_set_rate_ctl),
2125         RTW_PROC_HDL_SSEQ("bw_ctl", proc_get_bw_ctl, proc_set_bw_ctl),
2126         RTW_PROC_HDL_SSEQ("dis_pwt_ctl", proc_get_dis_pwt, proc_set_dis_pwt),
2127         RTW_PROC_HDL_SSEQ("mac_qinfo", proc_get_mac_qinfo, NULL),
2128         RTW_PROC_HDL_SSEQ("macid_info", proc_get_macid_info, NULL),
2129         RTW_PROC_HDL_SSEQ("bcmc_info", proc_get_mi_ap_bc_info, NULL),
2130         RTW_PROC_HDL_SSEQ("sec_cam", proc_get_sec_cam, proc_set_sec_cam),
2131         RTW_PROC_HDL_SSEQ("sec_cam_cache", proc_get_sec_cam_cache, NULL),
2132         RTW_PROC_HDL_SSEQ("suspend_info", proc_get_suspend_resume_info, NULL),
2133         RTW_PROC_HDL_SSEQ("wifi_spec", proc_get_wifi_spec, NULL),
2134 #ifdef CONFIG_LAYER2_ROAMING
2135         RTW_PROC_HDL_SSEQ("roam_flags", proc_get_roam_flags, proc_set_roam_flags),
2136         RTW_PROC_HDL_SSEQ("roam_param", proc_get_roam_param, proc_set_roam_param),
2137         RTW_PROC_HDL_SSEQ("roam_tgt_addr", NULL, proc_set_roam_tgt_addr),
2138 #endif /* CONFIG_LAYER2_ROAMING */
2139
2140 #ifdef CONFIG_RTW_80211R
2141         RTW_PROC_HDL_SSEQ("ft_flags", proc_get_ft_flags, proc_set_ft_flags),
2142 #endif
2143
2144 #ifdef CONFIG_SDIO_HCI
2145         RTW_PROC_HDL_SSEQ("sd_f0_reg_dump", proc_get_sd_f0_reg_dump, NULL),
2146         RTW_PROC_HDL_SSEQ("sdio_local_reg_dump", proc_get_sdio_local_reg_dump, NULL),
2147 #endif /* CONFIG_SDIO_HCI */
2148
2149         RTW_PROC_HDL_SSEQ("fwdl_test_case", NULL, proc_set_fwdl_test_case),
2150         RTW_PROC_HDL_SSEQ("del_rx_ampdu_test_case", NULL, proc_set_del_rx_ampdu_test_case),
2151         RTW_PROC_HDL_SSEQ("wait_hiq_empty", NULL, proc_set_wait_hiq_empty),
2152
2153         RTW_PROC_HDL_SSEQ("mac_reg_dump", proc_get_mac_reg_dump, NULL),
2154         RTW_PROC_HDL_SSEQ("bb_reg_dump", proc_get_bb_reg_dump, NULL),
2155         RTW_PROC_HDL_SSEQ("rf_reg_dump", proc_get_rf_reg_dump, NULL),
2156
2157 #ifdef CONFIG_AP_MODE
2158         RTW_PROC_HDL_SSEQ("all_sta_info", proc_get_all_sta_info, NULL),
2159 #endif /* CONFIG_AP_MODE */
2160
2161 #ifdef DBG_MEMORY_LEAK
2162         RTW_PROC_HDL_SSEQ("_malloc_cnt", proc_get_malloc_cnt, NULL),
2163 #endif /* DBG_MEMORY_LEAK */
2164
2165 #ifdef CONFIG_FIND_BEST_CHANNEL
2166         RTW_PROC_HDL_SSEQ("best_channel", proc_get_best_channel, proc_set_best_channel),
2167 #endif
2168
2169         RTW_PROC_HDL_SSEQ("rx_signal", proc_get_rx_signal, proc_set_rx_signal),
2170         RTW_PROC_HDL_SSEQ("hw_info", proc_get_hw_status, proc_set_hw_status),
2171
2172 #ifdef CONFIG_80211N_HT
2173         RTW_PROC_HDL_SSEQ("ht_enable", proc_get_ht_enable, proc_set_ht_enable),
2174         RTW_PROC_HDL_SSEQ("bw_mode", proc_get_bw_mode, proc_set_bw_mode),
2175         RTW_PROC_HDL_SSEQ("ampdu_enable", proc_get_ampdu_enable, proc_set_ampdu_enable),
2176         RTW_PROC_HDL_SSEQ("rx_stbc", proc_get_rx_stbc, proc_set_rx_stbc),
2177         RTW_PROC_HDL_SSEQ("rx_ampdu", proc_get_rx_ampdu, proc_set_rx_ampdu),
2178         RTW_PROC_HDL_SSEQ("rx_ampdu_factor", proc_get_rx_ampdu_factor, proc_set_rx_ampdu_factor),
2179         RTW_PROC_HDL_SSEQ("rx_ampdu_density", proc_get_rx_ampdu_density, proc_set_rx_ampdu_density),
2180         RTW_PROC_HDL_SSEQ("tx_ampdu_density", proc_get_tx_ampdu_density, proc_set_tx_ampdu_density),
2181 #endif /* CONFIG_80211N_HT */
2182
2183         RTW_PROC_HDL_SSEQ("en_fwps", proc_get_en_fwps, proc_set_en_fwps),
2184         RTW_PROC_HDL_SSEQ("mac_rptbuf", proc_get_mac_rptbuf, NULL),
2185
2186         /* RTW_PROC_HDL_SSEQ("path_rssi", proc_get_two_path_rssi, NULL),
2187         *       RTW_PROC_HDL_SSEQ("rssi_disp",proc_get_rssi_disp, proc_set_rssi_disp), */
2188
2189 #ifdef CONFIG_BT_COEXIST
2190         RTW_PROC_HDL_SSEQ("btcoex_dbg", proc_get_btcoex_dbg, proc_set_btcoex_dbg),
2191         RTW_PROC_HDL_SSEQ("btcoex", proc_get_btcoex_info, NULL),
2192         RTW_PROC_HDL_SSEQ("btinfo_evt", NULL, proc_set_btinfo_evt),
2193         RTW_PROC_HDL_SSEQ("btreg_read", proc_get_btreg_read, proc_set_btreg_read),
2194         RTW_PROC_HDL_SSEQ("btreg_write", proc_get_btreg_write, proc_set_btreg_write),
2195 #endif /* CONFIG_BT_COEXIST */
2196
2197 #if defined(DBG_CONFIG_ERROR_DETECT)
2198         RTW_PROC_HDL_SSEQ("sreset", proc_get_sreset, proc_set_sreset),
2199 #endif /* DBG_CONFIG_ERROR_DETECT */
2200         RTW_PROC_HDL_SSEQ("trx_info_debug", proc_get_trx_info_debug, NULL),
2201         RTW_PROC_HDL_SSEQ("linked_info_dump", proc_get_linked_info_dump, proc_set_linked_info_dump),
2202         RTW_PROC_HDL_SSEQ("tx_info_msg", proc_get_tx_info_msg, NULL),
2203         RTW_PROC_HDL_SSEQ("rx_info_msg", proc_get_rx_info_msg, proc_set_rx_info_msg),
2204 #ifdef CONFIG_GPIO_API
2205         RTW_PROC_HDL_SSEQ("gpio_info", proc_get_gpio, proc_set_gpio),
2206         RTW_PROC_HDL_SSEQ("gpio_set_output_value", NULL, proc_set_gpio_output_value),
2207         RTW_PROC_HDL_SSEQ("gpio_set_direction", NULL, proc_set_config_gpio),
2208 #endif
2209
2210 #ifdef CONFIG_DBG_COUNTER
2211         RTW_PROC_HDL_SSEQ("rx_logs", proc_get_rx_logs, NULL),
2212         RTW_PROC_HDL_SSEQ("tx_logs", proc_get_tx_logs, NULL),
2213         RTW_PROC_HDL_SSEQ("int_logs", proc_get_int_logs, NULL),
2214 #endif
2215
2216 #ifdef CONFIG_PCI_HCI
2217         RTW_PROC_HDL_SSEQ("rx_ring", proc_get_rx_ring, NULL),
2218         RTW_PROC_HDL_SSEQ("tx_ring", proc_get_tx_ring, NULL),
2219 #endif
2220
2221 #ifdef CONFIG_WOWLAN
2222         RTW_PROC_HDL_SSEQ("wow_pattern_info", proc_get_pattern_info, proc_set_pattern_info),
2223         RTW_PROC_HDL_SSEQ("wowlan_last_wake_reason", proc_get_wakeup_reason, NULL),
2224 #endif
2225
2226 #ifdef CONFIG_GPIO_WAKEUP
2227         RTW_PROC_HDL_SSEQ("wowlan_gpio_info", proc_get_wowlan_gpio_info, proc_set_wowlan_gpio_info),
2228 #endif
2229 #ifdef CONFIG_P2P_WOWLAN
2230         RTW_PROC_HDL_SSEQ("p2p_wowlan_info", proc_get_p2p_wowlan_info, NULL),
2231 #endif
2232         RTW_PROC_HDL_SSEQ("country_code", proc_get_country_code, proc_set_country_code),
2233         RTW_PROC_HDL_SSEQ("chan_plan", proc_get_chan_plan, proc_set_chan_plan),
2234 #if CONFIG_RTW_MACADDR_ACL
2235         RTW_PROC_HDL_SSEQ("macaddr_acl", proc_get_macaddr_acl, proc_set_macaddr_acl),
2236 #endif
2237 #ifdef CONFIG_DFS_MASTER
2238         RTW_PROC_HDL_SSEQ("dfs_master_test_case", proc_get_dfs_master_test_case, proc_set_dfs_master_test_case),
2239         RTW_PROC_HDL_SSEQ("update_non_ocp", NULL, proc_set_update_non_ocp),
2240         RTW_PROC_HDL_SSEQ("radar_detect", NULL, proc_set_radar_detect),
2241         RTW_PROC_HDL_SSEQ("dfs_ch_sel_d_flags", proc_get_dfs_ch_sel_d_flags, proc_set_dfs_ch_sel_d_flags),
2242 #endif
2243         RTW_PROC_HDL_SSEQ("new_bcn_max", proc_get_new_bcn_max, proc_set_new_bcn_max),
2244         RTW_PROC_HDL_SSEQ("sink_udpport", proc_get_udpport, proc_set_udpport),
2245 #ifdef DBG_RX_COUNTER_DUMP
2246         RTW_PROC_HDL_SSEQ("dump_rx_cnt_mode", proc_get_rx_cnt_dump, proc_set_rx_cnt_dump),
2247 #endif
2248         RTW_PROC_HDL_SSEQ("change_bss_chbw", NULL, proc_set_change_bss_chbw),
2249 #ifdef CONFIG_80211N_HT
2250         RTW_PROC_HDL_SSEQ("tx_bw_mode", proc_get_tx_bw_mode, proc_set_tx_bw_mode),
2251 #endif /* CONFIG_80211N_HT */
2252         RTW_PROC_HDL_SSEQ("hal_txpwr_info", proc_get_hal_txpwr_info, NULL),
2253         RTW_PROC_HDL_SSEQ("target_tx_power", proc_get_target_tx_power, NULL),
2254         RTW_PROC_HDL_SSEQ("tx_power_by_rate", proc_get_tx_power_by_rate, NULL),
2255         RTW_PROC_HDL_SSEQ("tx_power_limit", proc_get_tx_power_limit, NULL),
2256         RTW_PROC_HDL_SSEQ("tx_power_ext_info", proc_get_tx_power_ext_info, proc_set_tx_power_ext_info),
2257         RTW_PROC_HDL_SEQ("tx_power_idx", &seq_ops_tx_power_idx, NULL),
2258 #ifdef CONFIG_RF_POWER_TRIM
2259         RTW_PROC_HDL_SSEQ("tx_gain_offset", NULL, proc_set_tx_gain_offset),
2260         RTW_PROC_HDL_SSEQ("kfree_flag", proc_get_kfree_flag, proc_set_kfree_flag),
2261         RTW_PROC_HDL_SSEQ("kfree_bb_gain", proc_get_kfree_bb_gain, proc_set_kfree_bb_gain),
2262         RTW_PROC_HDL_SSEQ("kfree_thermal", proc_get_kfree_thermal, proc_set_kfree_thermal),
2263 #endif
2264 #ifdef CONFIG_POWER_SAVING
2265         RTW_PROC_HDL_SSEQ("ps_info", proc_get_ps_info, NULL),
2266 #endif
2267 #ifdef CONFIG_TDLS
2268         RTW_PROC_HDL_SSEQ("tdls_info", proc_get_tdls_info, NULL),
2269 #endif
2270         RTW_PROC_HDL_SSEQ("monitor", proc_get_monitor, proc_set_monitor),
2271
2272 #ifdef CONFIG_AUTO_CHNL_SEL_NHM
2273         RTW_PROC_HDL_SSEQ("acs", proc_get_best_chan, proc_set_acs),
2274 #endif
2275 #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
2276         RTW_PROC_HDL_SSEQ("rtkm_info", proc_get_rtkm_info, NULL),
2277 #endif
2278         RTW_PROC_HDL_SSEQ("efuse_map", proc_get_efuse_map, NULL),
2279 #ifdef CONFIG_IEEE80211W
2280         RTW_PROC_HDL_SSEQ("11w_tx_sa_query", proc_get_tx_sa_query, proc_set_tx_sa_query),
2281         RTW_PROC_HDL_SSEQ("11w_tx_deauth", proc_get_tx_deauth, proc_set_tx_deauth),
2282         RTW_PROC_HDL_SSEQ("11w_tx_auth", proc_get_tx_auth, proc_set_tx_auth),
2283 #endif /* CONFIG_IEEE80211W */
2284
2285 #ifdef CONFIG_MBSSID_CAM
2286         RTW_PROC_HDL_SSEQ("mbid_cam", proc_get_mbid_cam_cache, NULL),
2287 #endif
2288         RTW_PROC_HDL_SSEQ("mac_addr", proc_get_mac_addr, NULL),
2289         RTW_PROC_HDL_SSEQ("skip_band", proc_get_skip_band, proc_set_skip_band),
2290         RTW_PROC_HDL_SSEQ("hal_spec", proc_get_hal_spec, NULL),
2291 #ifdef CONFIG_SUPPORT_TRX_SHARED
2292         RTW_PROC_HDL_SSEQ("trx_share_mode", proc_get_trx_share_mode, NULL),
2293 #endif
2294         RTW_PROC_HDL_SSEQ("napi_info", proc_get_napi_info, NULL),
2295 };
2296
2297 const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);
2298
2299 static int rtw_adapter_proc_open(struct inode *inode, struct file *file)
2300 {
2301         ssize_t index = (ssize_t)PDE_DATA(inode);
2302         const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index;
2303         void *private = proc_get_parent_data(inode);
2304
2305         if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
2306                 int res = seq_open(file, hdl->u.seq_op);
2307
2308                 if (res == 0)
2309                         ((struct seq_file *)file->private_data)->private = private;
2310
2311                 return res;
2312         } else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
2313                 int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
2314
2315                 return single_open(file, show, private);
2316         } else {
2317                 return -EROFS;
2318         }
2319 }
2320
2321 static ssize_t rtw_adapter_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
2322 {
2323         ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
2324         const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index;
2325         ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
2326
2327         if (write)
2328                 return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
2329
2330         return -EROFS;
2331 }
2332
2333 static const struct file_operations rtw_adapter_proc_seq_fops = {
2334         .owner = THIS_MODULE,
2335         .open = rtw_adapter_proc_open,
2336         .read = seq_read,
2337         .llseek = seq_lseek,
2338         .release = seq_release,
2339         .write = rtw_adapter_proc_write,
2340 };
2341
2342 static const struct file_operations rtw_adapter_proc_sseq_fops = {
2343         .owner = THIS_MODULE,
2344         .open = rtw_adapter_proc_open,
2345         .read = seq_read,
2346         .llseek = seq_lseek,
2347         .release = single_release,
2348         .write = rtw_adapter_proc_write,
2349 };
2350
2351 int proc_get_odm_dbg_comp(struct seq_file *m, void *v)
2352 {
2353         struct net_device *dev = m->private;
2354         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2355
2356         rtw_odm_dbg_comp_msg(m, adapter);
2357
2358         return 0;
2359 }
2360
2361 ssize_t proc_set_odm_dbg_comp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2362 {
2363         struct net_device *dev = data;
2364         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2365         char tmp[32];
2366
2367         u64 dbg_comp;
2368
2369         if (count < 1)
2370                 return -EFAULT;
2371
2372         if (count > sizeof(tmp)) {
2373                 rtw_warn_on(1);
2374                 return -EFAULT;
2375         }
2376
2377         if (buffer && !copy_from_user(tmp, buffer, count)) {
2378
2379                 int num = sscanf(tmp, "%llx", &dbg_comp);
2380
2381                 if (num != 1)
2382                         return count;
2383
2384                 rtw_odm_dbg_comp_set(adapter, dbg_comp);
2385         }
2386
2387         return count;
2388 }
2389
2390 int proc_get_odm_dbg_level(struct seq_file *m, void *v)
2391 {
2392         struct net_device *dev = m->private;
2393         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2394
2395         rtw_odm_dbg_level_msg(m, adapter);
2396
2397         return 0;
2398 }
2399
2400 ssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2401 {
2402         struct net_device *dev = data;
2403         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2404         char tmp[32];
2405
2406         u32 dbg_level;
2407
2408         if (count < 1)
2409                 return -EFAULT;
2410
2411         if (count > sizeof(tmp)) {
2412                 rtw_warn_on(1);
2413                 return -EFAULT;
2414         }
2415
2416         if (buffer && !copy_from_user(tmp, buffer, count)) {
2417
2418                 int num = sscanf(tmp, "%u", &dbg_level);
2419
2420                 if (num != 1)
2421                         return count;
2422
2423                 rtw_odm_dbg_level_set(adapter, dbg_level);
2424         }
2425
2426         return count;
2427 }
2428
2429 int proc_get_odm_ability(struct seq_file *m, void *v)
2430 {
2431         struct net_device *dev = m->private;
2432         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2433
2434         rtw_odm_ability_msg(m, adapter);
2435
2436         return 0;
2437 }
2438
2439 ssize_t proc_set_odm_ability(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2440 {
2441         struct net_device *dev = data;
2442         _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2443         char tmp[32];
2444
2445         u32 ability;
2446
2447         if (count < 1)
2448                 return -EFAULT;
2449
2450         if (count > sizeof(tmp)) {
2451                 rtw_warn_on(1);
2452                 return -EFAULT;
2453         }
2454
2455         if (buffer && !copy_from_user(tmp, buffer, count)) {
2456
2457                 int num = sscanf(tmp, "%x", &ability);
2458
2459                 if (num != 1)
2460                         return count;
2461
2462                 rtw_odm_ability_set(adapter, ability);
2463         }
2464
2465         return count;
2466 }
2467
2468 int proc_get_odm_force_igi_lb(struct seq_file *m, void *v)
2469 {
2470         struct net_device *dev = m->private;
2471         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2472
2473         RTW_PRINT_SEL(m, "force_igi_lb:0x%02x\n", rtw_odm_get_force_igi_lb(padapter));
2474
2475         return 0;
2476 }
2477
2478 ssize_t proc_set_odm_force_igi_lb(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2479 {
2480         struct net_device *dev = data;
2481         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2482         char tmp[32];
2483         u8 force_igi_lb;
2484
2485         if (count < 1)
2486                 return -EFAULT;
2487
2488         if (count > sizeof(tmp)) {
2489                 rtw_warn_on(1);
2490                 return -EFAULT;
2491         }
2492
2493         if (buffer && !copy_from_user(tmp, buffer, count)) {
2494
2495                 int num = sscanf(tmp, "%hhx", &force_igi_lb);
2496
2497                 if (num != 1)
2498                         return count;
2499
2500                 rtw_odm_set_force_igi_lb(padapter, force_igi_lb);
2501         }
2502
2503         return count;
2504 }
2505
2506 int proc_get_odm_adaptivity(struct seq_file *m, void *v)
2507 {
2508         struct net_device *dev = m->private;
2509         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2510
2511         rtw_odm_adaptivity_parm_msg(m, padapter);
2512
2513         return 0;
2514 }
2515
2516 ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2517 {
2518         struct net_device *dev = data;
2519         _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2520         char tmp[32];
2521         u32 TH_L2H_ini;
2522         u32 TH_L2H_ini_mode2;
2523         s8 TH_EDCCA_HL_diff;
2524         s8 TH_EDCCA_HL_diff_mode2;
2525         u8 EDCCA_enable;
2526
2527         if (count < 1)
2528                 return -EFAULT;
2529
2530         if (count > sizeof(tmp)) {
2531                 rtw_warn_on(1);
2532                 return -EFAULT;
2533         }
2534
2535         if (buffer && !copy_from_user(tmp, buffer, count)) {
2536
2537                 int num = sscanf(tmp, "%x %hhd %x %hhd %hhu", &TH_L2H_ini, &TH_EDCCA_HL_diff, &TH_L2H_ini_mode2, &TH_EDCCA_HL_diff_mode2, &EDCCA_enable);
2538
2539                 if (num != 5)
2540                         return count;
2541
2542                 rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)TH_L2H_ini_mode2, TH_EDCCA_HL_diff_mode2, EDCCA_enable);
2543         }
2544
2545         return count;
2546 }
2547
2548 static char *phydm_msg = NULL;
2549 #define PHYDM_MSG_LEN   80*24
2550
2551 int proc_get_phydm_cmd(struct seq_file *m, void *v)
2552 {
2553         struct net_device *netdev;
2554         PADAPTER padapter;
2555         PHAL_DATA_TYPE pHalData;
2556         PDM_ODM_T phydm;
2557
2558
2559         netdev = m->private;
2560         padapter = (PADAPTER)rtw_netdev_priv(netdev);
2561         pHalData = GET_HAL_DATA(padapter);
2562         phydm = &pHalData->odmpriv;
2563
2564         if (NULL == phydm_msg) {
2565                 phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
2566                 if (NULL == phydm_msg)
2567                         return -ENOMEM;
2568
2569                 phydm_cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN);
2570         }
2571
2572         _RTW_PRINT_SEL(m, "%s\n", phydm_msg);
2573
2574         rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
2575         phydm_msg = NULL;
2576
2577         return 0;
2578 }
2579
2580 ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2581 {
2582         struct net_device *netdev;
2583         PADAPTER padapter;
2584         PHAL_DATA_TYPE pHalData;
2585         PDM_ODM_T phydm;
2586         char tmp[64] = {0};
2587
2588
2589         netdev = (struct net_device *)data;
2590         padapter = (PADAPTER)rtw_netdev_priv(netdev);
2591         pHalData = GET_HAL_DATA(padapter);
2592         phydm = &pHalData->odmpriv;
2593
2594         if (count < 1)
2595                 return -EFAULT;
2596
2597         if (count > sizeof(tmp))
2598                 return -EFAULT;
2599
2600         if (buffer && !copy_from_user(tmp, buffer, count)) {
2601                 if (NULL == phydm_msg) {
2602                         phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
2603                         if (NULL == phydm_msg)
2604                                 return -ENOMEM;
2605                 } else
2606                         _rtw_memset(phydm_msg, 0, PHYDM_MSG_LEN);
2607
2608                 phydm_cmd(phydm, tmp, count, 1, phydm_msg, PHYDM_MSG_LEN);
2609
2610                 if (strlen(phydm_msg) == 0) {
2611                         rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
2612                         phydm_msg = NULL;
2613                 }
2614         }
2615
2616         return count;
2617 }
2618
2619 /*
2620 * rtw_odm_proc:
2621 * init/deinit when register/unregister net_device, along with rtw_adapter_proc
2622 */
2623 const struct rtw_proc_hdl odm_proc_hdls[] = {
2624         RTW_PROC_HDL_SSEQ("dbg_comp", proc_get_odm_dbg_comp, proc_set_odm_dbg_comp),
2625         RTW_PROC_HDL_SSEQ("dbg_level", proc_get_odm_dbg_level, proc_set_odm_dbg_level),
2626         RTW_PROC_HDL_SSEQ("ability", proc_get_odm_ability, proc_set_odm_ability),
2627         RTW_PROC_HDL_SSEQ("adaptivity", proc_get_odm_adaptivity, proc_set_odm_adaptivity),
2628         RTW_PROC_HDL_SSEQ("force_igi_lb", proc_get_odm_force_igi_lb, proc_set_odm_force_igi_lb),
2629         RTW_PROC_HDL_SSEQ("cmd", proc_get_phydm_cmd, proc_set_phydm_cmd),
2630 };
2631
2632 const int odm_proc_hdls_num = sizeof(odm_proc_hdls) / sizeof(struct rtw_proc_hdl);
2633
2634 static int rtw_odm_proc_open(struct inode *inode, struct file *file)
2635 {
2636         ssize_t index = (ssize_t)PDE_DATA(inode);
2637         const struct rtw_proc_hdl *hdl = odm_proc_hdls + index;
2638         void *private = proc_get_parent_data(inode);
2639
2640         if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
2641                 int res = seq_open(file, hdl->u.seq_op);
2642
2643                 if (res == 0)
2644                         ((struct seq_file *)file->private_data)->private = private;
2645
2646                 return res;
2647         } else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
2648                 int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
2649
2650                 return single_open(file, show, private);
2651         } else {
2652                 return -EROFS;
2653         }
2654 }
2655
2656 static ssize_t rtw_odm_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
2657 {
2658         ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
2659         const struct rtw_proc_hdl *hdl = odm_proc_hdls + index;
2660         ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
2661
2662         if (write)
2663                 return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
2664
2665         return -EROFS;
2666 }
2667
2668 static const struct file_operations rtw_odm_proc_seq_fops = {
2669         .owner = THIS_MODULE,
2670         .open = rtw_odm_proc_open,
2671         .read = seq_read,
2672         .llseek = seq_lseek,
2673         .release = seq_release,
2674         .write = rtw_odm_proc_write,
2675 };
2676
2677 static const struct file_operations rtw_odm_proc_sseq_fops = {
2678         .owner = THIS_MODULE,
2679         .open = rtw_odm_proc_open,
2680         .read = seq_read,
2681         .llseek = seq_lseek,
2682         .release = single_release,
2683         .write = rtw_odm_proc_write,
2684 };
2685
2686 struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev)
2687 {
2688         struct proc_dir_entry *dir_odm = NULL;
2689         struct proc_dir_entry *entry = NULL;
2690         _adapter        *adapter = rtw_netdev_priv(dev);
2691         ssize_t i;
2692
2693         if (adapter->dir_dev == NULL) {
2694                 rtw_warn_on(1);
2695                 goto exit;
2696         }
2697
2698         if (adapter->dir_odm != NULL) {
2699                 rtw_warn_on(1);
2700                 goto exit;
2701         }
2702
2703         dir_odm = rtw_proc_create_dir("odm", adapter->dir_dev, dev);
2704         if (dir_odm == NULL) {
2705                 rtw_warn_on(1);
2706                 goto exit;
2707         }
2708
2709         adapter->dir_odm = dir_odm;
2710
2711         for (i = 0; i < odm_proc_hdls_num; i++) {
2712                 if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
2713                         entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_seq_fops, (void *)i);
2714                 else if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ)
2715                         entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_sseq_fops, (void *)i);
2716                 else
2717                         entry = NULL;
2718
2719                 if (!entry) {
2720                         rtw_warn_on(1);
2721                         goto exit;
2722                 }
2723         }
2724
2725 exit:
2726         return dir_odm;
2727 }
2728
2729 void rtw_odm_proc_deinit(_adapter       *adapter)
2730 {
2731         struct proc_dir_entry *dir_odm = NULL;
2732         int i;
2733
2734         dir_odm = adapter->dir_odm;
2735
2736         if (dir_odm == NULL) {
2737                 rtw_warn_on(1);
2738                 return;
2739         }
2740
2741         for (i = 0; i < odm_proc_hdls_num; i++)
2742                 remove_proc_entry(odm_proc_hdls[i].name, dir_odm);
2743
2744         remove_proc_entry("odm", adapter->dir_dev);
2745
2746         adapter->dir_odm = NULL;
2747
2748         if (phydm_msg) {
2749                 rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
2750                 phydm_msg = NULL;
2751         }
2752 }
2753
2754 #ifdef CONFIG_MCC_MODE
2755 /*
2756 * rtw_mcc_proc:
2757 * init/deinit when register/unregister net_device, along with rtw_adapter_proc
2758 */
2759 const struct rtw_proc_hdl mcc_proc_hdls[] = {
2760         RTW_PROC_HDL_SSEQ("mcc_info", proc_get_mcc_info, NULL),
2761         RTW_PROC_HDL_SSEQ("mcc_enable", proc_get_mcc_info, proc_set_mcc_enable),
2762         RTW_PROC_HDL_SSEQ("mcc_single_tx_criteria", proc_get_mcc_info, proc_set_mcc_single_tx_criteria),
2763         RTW_PROC_HDL_SSEQ("mcc_ap_bw20_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw20_target_tp),
2764         RTW_PROC_HDL_SSEQ("mcc_ap_bw40_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw40_target_tp),
2765         RTW_PROC_HDL_SSEQ("mcc_ap_bw80_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw80_target_tp),
2766         RTW_PROC_HDL_SSEQ("mcc_sta_bw20_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw20_target_tp),
2767         RTW_PROC_HDL_SSEQ("mcc_sta_bw40_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw40_target_tp),
2768         RTW_PROC_HDL_SSEQ("mcc_sta_bw80_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw80_target_tp),
2769 };
2770
2771 const int mcc_proc_hdls_num = sizeof(mcc_proc_hdls) / sizeof(struct rtw_proc_hdl);
2772
2773 static int rtw_mcc_proc_open(struct inode *inode, struct file *file)
2774 {
2775         ssize_t index = (ssize_t)PDE_DATA(inode);
2776         const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index;
2777         void *private = proc_get_parent_data(inode);
2778
2779         if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
2780                 int res = seq_open(file, hdl->u.seq_op);
2781
2782                 if (res == 0)
2783                         ((struct seq_file *)file->private_data)->private = private;
2784
2785                 return res;
2786         } else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
2787                 int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
2788
2789                 return single_open(file, show, private);
2790         } else {
2791                 return -EROFS;
2792         }
2793 }
2794
2795 static ssize_t rtw_mcc_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
2796 {
2797         ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
2798         const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index;
2799         ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
2800
2801         if (write)
2802                 return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
2803
2804         return -EROFS;
2805 }
2806
2807 static const struct file_operations rtw_mcc_proc_seq_fops = {
2808         .owner = THIS_MODULE,
2809         .open = rtw_mcc_proc_open,
2810         .read = seq_read,
2811         .llseek = seq_lseek,
2812         .release = seq_release,
2813         .write = rtw_mcc_proc_write,
2814 };
2815
2816 static const struct file_operations rtw_mcc_proc_sseq_fops = {
2817         .owner = THIS_MODULE,
2818         .open = rtw_mcc_proc_open,
2819         .read = seq_read,
2820         .llseek = seq_lseek,
2821         .release = single_release,
2822         .write = rtw_mcc_proc_write,
2823 };
2824
2825 struct proc_dir_entry *rtw_mcc_proc_init(struct net_device *dev)
2826 {
2827         struct proc_dir_entry *dir_mcc = NULL;
2828         struct proc_dir_entry *entry = NULL;
2829         _adapter        *adapter = rtw_netdev_priv(dev);
2830         ssize_t i;
2831
2832         if (adapter->dir_dev == NULL) {
2833                 rtw_warn_on(1);
2834                 goto exit;
2835         }
2836
2837         if (adapter->dir_mcc != NULL) {
2838                 rtw_warn_on(1);
2839                 goto exit;
2840         }
2841
2842         dir_mcc = rtw_proc_create_dir("mcc", adapter->dir_dev, dev);
2843         if (dir_mcc == NULL) {
2844                 rtw_warn_on(1);
2845                 goto exit;
2846         }
2847
2848         adapter->dir_mcc = dir_mcc;
2849
2850         for (i = 0; i < mcc_proc_hdls_num; i++) {
2851                 if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
2852                         entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_seq_fops, (void *)i);
2853                 else if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ)
2854                         entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_sseq_fops, (void *)i);
2855                 else
2856                         entry = NULL;
2857
2858                 if (!entry) {
2859                         rtw_warn_on(1);
2860                         goto exit;
2861                 }
2862         }
2863
2864 exit:
2865         return dir_mcc;
2866 }
2867
2868 void rtw_mcc_proc_deinit(_adapter       *adapter)
2869 {
2870         struct proc_dir_entry *dir_mcc = NULL;
2871         int i;
2872
2873         dir_mcc = adapter->dir_mcc;
2874
2875         if (dir_mcc == NULL) {
2876                 rtw_warn_on(1);
2877                 return;
2878         }
2879
2880         for (i = 0; i < mcc_proc_hdls_num; i++)
2881                 remove_proc_entry(mcc_proc_hdls[i].name, dir_mcc);
2882
2883         remove_proc_entry("mcc", adapter->dir_dev);
2884
2885         adapter->dir_mcc = NULL;
2886 }
2887 #endif /* CONFIG_MCC_MODE */
2888
2889 struct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev)
2890 {
2891         struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
2892         struct proc_dir_entry *dir_dev = NULL;
2893         struct proc_dir_entry *entry = NULL;
2894         _adapter *adapter = rtw_netdev_priv(dev);
2895         u8 rf_type;
2896         ssize_t i;
2897
2898         if (drv_proc == NULL) {
2899                 rtw_warn_on(1);
2900                 goto exit;
2901         }
2902
2903         if (adapter->dir_dev != NULL) {
2904                 rtw_warn_on(1);
2905                 goto exit;
2906         }
2907
2908         dir_dev = rtw_proc_create_dir(dev->name, drv_proc, dev);
2909         if (dir_dev == NULL) {
2910                 rtw_warn_on(1);
2911                 goto exit;
2912         }
2913
2914         adapter->dir_dev = dir_dev;
2915
2916         for (i = 0; i < adapter_proc_hdls_num; i++) {
2917                 if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
2918                         entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_seq_fops, (void *)i);
2919                 else if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ)
2920                         entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_sseq_fops, (void *)i);
2921                 else
2922                         entry = NULL;
2923
2924                 if (!entry) {
2925                         rtw_warn_on(1);
2926                         goto exit;
2927                 }
2928         }
2929
2930         rtw_odm_proc_init(dev);
2931
2932 #ifdef CONFIG_MCC_MODE
2933         rtw_mcc_proc_init(dev);
2934 #endif /* CONFIG_MCC_MODE */
2935
2936 exit:
2937         return dir_dev;
2938 }
2939
2940 void rtw_adapter_proc_deinit(struct net_device *dev)
2941 {
2942         struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
2943         struct proc_dir_entry *dir_dev = NULL;
2944         _adapter *adapter = rtw_netdev_priv(dev);
2945         int i;
2946
2947         dir_dev = adapter->dir_dev;
2948
2949         if (dir_dev == NULL) {
2950                 rtw_warn_on(1);
2951                 return;
2952         }
2953
2954         for (i = 0; i < adapter_proc_hdls_num; i++)
2955                 remove_proc_entry(adapter_proc_hdls[i].name, dir_dev);
2956
2957         rtw_odm_proc_deinit(adapter);
2958
2959 #ifdef CONFIG_MCC_MODE
2960         rtw_mcc_proc_deinit(adapter);
2961 #endif /* CONFIG_MCC_MODE */
2962
2963         remove_proc_entry(dev->name, drv_proc);
2964
2965         adapter->dir_dev = NULL;
2966 }
2967
2968 void rtw_adapter_proc_replace(struct net_device *dev)
2969 {
2970         struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
2971         struct proc_dir_entry *dir_dev = NULL;
2972         _adapter *adapter = rtw_netdev_priv(dev);
2973         int i;
2974
2975         dir_dev = adapter->dir_dev;
2976
2977         if (dir_dev == NULL) {
2978                 rtw_warn_on(1);
2979                 return;
2980         }
2981
2982         for (i = 0; i < adapter_proc_hdls_num; i++)
2983                 remove_proc_entry(adapter_proc_hdls[i].name, dir_dev);
2984
2985         rtw_odm_proc_deinit(adapter);
2986
2987 #ifdef CONFIG_MCC_MODE
2988         rtw_mcc_proc_deinit(adapter);
2989 #endif /* CONIG_MCC_MODE */
2990
2991         remove_proc_entry(adapter->old_ifname, drv_proc);
2992
2993         adapter->dir_dev = NULL;
2994
2995         rtw_adapter_proc_init(dev);
2996
2997 }
2998
2999 #endif /* CONFIG_PROC_DEBUG */