Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/os_dep/linux/rtw_proc.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2019 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
*****************************************************************************/
15
16
#include <linux/ctype.h> /* tolower() */
17
#include <drv_types.h>
18
#include <hal_data.h>
19
#include "rtw_proc.h"
20
#include <rtw_btcoex.h>
21
22
#ifdef CONFIG_PROC_DEBUG
23
24
static struct proc_dir_entry *rtw_proc = NULL;
25
26
inline struct proc_dir_entry *get_rtw_drv_proc(void)
27
{
28
return rtw_proc;
29
}
30
31
#define RTW_PROC_NAME DRV_NAME
32
33
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
34
#define file_inode(file) ((file)->f_dentry->d_inode)
35
#endif
36
37
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
38
#define PDE_DATA(inode) PDE((inode))->data
39
#define proc_get_parent_data(inode) PDE((inode))->parent->data
40
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))
41
#define PDE_DATA(inode) pde_data(inode)
42
#endif
43
44
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24))
45
#define get_proc_net proc_net
46
#else
47
#define get_proc_net init_net.proc_net
48
#endif
49
50
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
51
int single_open_size(struct file *file, int (*show)(struct seq_file *, void *),
52
void *data, size_t size)
53
{
54
char *buf = kmalloc(size, GFP_KERNEL);
55
int ret;
56
if (!buf)
57
return -ENOMEM;
58
ret = single_open(file, show, data);
59
if (ret) {
60
kfree(buf);
61
return ret;
62
}
63
((struct seq_file *)file->private_data)->buf = buf;
64
((struct seq_file *)file->private_data)->size = size;
65
return 0;
66
}
67
#endif
68
69
inline struct proc_dir_entry *rtw_proc_create_dir(const char *name, struct proc_dir_entry *parent, void *data)
70
{
71
struct proc_dir_entry *entry;
72
73
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
74
entry = proc_mkdir_data(name, S_IRUGO | S_IXUGO, parent, data);
75
#else
76
/* entry = proc_mkdir_mode(name, S_IRUGO|S_IXUGO, parent); */
77
entry = proc_mkdir(name, parent);
78
if (entry)
79
entry->data = data;
80
#endif
81
82
return entry;
83
}
84
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
85
inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent,
86
const struct proc_ops *fops, void * data)
87
#else
88
inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent,
89
const struct file_operations *fops, void * data)
90
#endif
91
{
92
struct proc_dir_entry *entry;
93
94
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26))
95
entry = proc_create_data(name, S_IFREG | S_IRUGO | S_IWUGO, parent, fops, data);
96
#else
97
entry = create_proc_entry(name, S_IFREG | S_IRUGO | S_IWUGO, parent);
98
if (entry) {
99
entry->data = data;
100
entry->proc_fops = fops;
101
}
102
#endif
103
104
return entry;
105
}
106
107
static int proc_get_dummy(struct seq_file *m, void *v)
108
{
109
return 0;
110
}
111
112
static int proc_get_drv_version(struct seq_file *m, void *v)
113
{
114
dump_drv_version(m);
115
return 0;
116
}
117
118
static int proc_get_log_level(struct seq_file *m, void *v)
119
{
120
dump_log_level(m);
121
return 0;
122
}
123
124
static int proc_get_drv_cfg(struct seq_file *m, void *v)
125
{
126
dump_drv_cfg(m);
127
return 0;
128
}
129
130
static ssize_t proc_set_log_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
131
{
132
char tmp[32];
133
int log_level;
134
135
if (count < 1)
136
return -EINVAL;
137
138
if (count > sizeof(tmp)) {
139
rtw_warn_on(1);
140
return -EFAULT;
141
}
142
143
#ifdef CONFIG_RTW_DEBUG
144
if (buffer && !copy_from_user(tmp, buffer, count)) {
145
146
int num = sscanf(tmp, "%d ", &log_level);
147
148
if (num == 1 &&
149
log_level >= _DRV_NONE_ && log_level <= _DRV_MAX_) {
150
rtw_drv_log_level = log_level;
151
printk("rtw_drv_log_level:%d\n", rtw_drv_log_level);
152
}
153
} else
154
return -EFAULT;
155
#else
156
printk("CONFIG_RTW_DEBUG is disabled\n");
157
#endif
158
159
return count;
160
}
161
162
#ifdef DBG_MEM_ALLOC
163
static int proc_get_mstat(struct seq_file *m, void *v)
164
{
165
rtw_mstat_dump(m);
166
return 0;
167
}
168
#endif /* DBG_MEM_ALLOC */
169
170
static int proc_get_country_chplan_map(struct seq_file *m, void *v)
171
{
172
dump_country_chplan_map(m);
173
return 0;
174
}
175
176
static int proc_get_chplan_id_list(struct seq_file *m, void *v)
177
{
178
dump_chplan_id_list(m);
179
return 0;
180
}
181
182
static int proc_get_chplan_test(struct seq_file *m, void *v)
183
{
184
dump_chplan_test(m);
185
return 0;
186
}
187
188
static int proc_get_chplan_ver(struct seq_file *m, void *v)
189
{
190
dump_chplan_ver(m);
191
return 0;
192
}
193
194
#ifdef RTW_HALMAC
195
extern void rtw_halmac_get_version(char *str, u32 len);
196
197
static int proc_get_halmac_info(struct seq_file *m, void *v)
198
{
199
char ver[30] = {0};
200
201
202
rtw_halmac_get_version(ver, 30);
203
RTW_PRINT_SEL(m, "version: %s\n", ver);
204
205
return 0;
206
}
207
#endif
208
209
/*
210
* rtw_drv_proc:
211
* init/deinit when register/unregister driver
212
*/
213
const struct rtw_proc_hdl drv_proc_hdls[] = {
214
RTW_PROC_HDL_SSEQ("ver_info", proc_get_drv_version, NULL),
215
RTW_PROC_HDL_SSEQ("log_level", proc_get_log_level, proc_set_log_level),
216
RTW_PROC_HDL_SSEQ("drv_cfg", proc_get_drv_cfg, NULL),
217
#ifdef DBG_MEM_ALLOC
218
RTW_PROC_HDL_SSEQ("mstat", proc_get_mstat, NULL),
219
#endif /* DBG_MEM_ALLOC */
220
RTW_PROC_HDL_SSEQ("country_chplan_map", proc_get_country_chplan_map, NULL),
221
RTW_PROC_HDL_SSEQ("chplan_id_list", proc_get_chplan_id_list, NULL),
222
RTW_PROC_HDL_SSEQ("chplan_test", proc_get_chplan_test, NULL),
223
RTW_PROC_HDL_SSEQ("chplan_ver", proc_get_chplan_ver, NULL),
224
#ifdef RTW_HALMAC
225
RTW_PROC_HDL_SSEQ("halmac_info", proc_get_halmac_info, NULL),
226
#endif /* RTW_HALMAC */
227
};
228
229
const int drv_proc_hdls_num = sizeof(drv_proc_hdls) / sizeof(struct rtw_proc_hdl);
230
231
static int rtw_drv_proc_open(struct inode *inode, struct file *file)
232
{
233
/* struct net_device *dev = proc_get_parent_data(inode); */
234
ssize_t index = (ssize_t)PDE_DATA(inode);
235
const struct rtw_proc_hdl *hdl = drv_proc_hdls + index;
236
void *private = NULL;
237
238
if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
239
int res = seq_open(file, hdl->u.seq_op);
240
241
if (res == 0)
242
((struct seq_file *)file->private_data)->private = private;
243
244
return res;
245
} else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
246
int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
247
248
return single_open(file, show, private);
249
} else if (hdl->type == RTW_PROC_HDL_TYPE_SZSEQ) {
250
int (*show)(struct seq_file *, void *) = hdl->u.sz.show ? hdl->u.sz.show : proc_get_dummy;
251
252
return single_open_size(file, show, private, hdl->u.sz.size);
253
} else {
254
return -EROFS;
255
}
256
}
257
258
static ssize_t rtw_drv_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
259
{
260
ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
261
const struct rtw_proc_hdl *hdl = drv_proc_hdls + index;
262
ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
263
264
if (write)
265
return write(file, buffer, count, pos, NULL);
266
267
return -EROFS;
268
}
269
270
static const struct rtw_proc_ops rtw_drv_proc_seq_fops = {
271
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
272
.proc_open = rtw_drv_proc_open,
273
.proc_read = seq_read,
274
.proc_lseek = seq_lseek,
275
.proc_release = seq_release,
276
.proc_write = rtw_drv_proc_write,
277
#else
278
.owner = THIS_MODULE,
279
.open = rtw_drv_proc_open,
280
.read = seq_read,
281
.llseek = seq_lseek,
282
.release = seq_release,
283
.write = rtw_drv_proc_write,
284
#endif
285
};
286
287
static const struct rtw_proc_ops rtw_drv_proc_sseq_fops = {
288
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
289
.proc_open = rtw_drv_proc_open,
290
.proc_read = seq_read,
291
.proc_lseek = seq_lseek,
292
.proc_release = single_release,
293
.proc_write = rtw_drv_proc_write,
294
#else
295
.owner = THIS_MODULE,
296
.open = rtw_drv_proc_open,
297
.read = seq_read,
298
.llseek = seq_lseek,
299
.release = single_release,
300
.write = rtw_drv_proc_write,
301
#endif
302
};
303
304
int rtw_drv_proc_init(void)
305
{
306
int ret = _FAIL;
307
ssize_t i;
308
struct proc_dir_entry *entry = NULL;
309
310
if (rtw_proc != NULL) {
311
rtw_warn_on(1);
312
goto exit;
313
}
314
315
rtw_proc = rtw_proc_create_dir(RTW_PROC_NAME, get_proc_net, NULL);
316
317
if (rtw_proc == NULL) {
318
rtw_warn_on(1);
319
goto exit;
320
}
321
322
for (i = 0; i < drv_proc_hdls_num; i++) {
323
if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
324
entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_seq_fops, (void *)i);
325
else if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ ||
326
drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SZSEQ)
327
entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_sseq_fops, (void *)i);
328
else
329
entry = NULL;
330
331
if (!entry) {
332
rtw_warn_on(1);
333
goto exit;
334
}
335
}
336
337
ret = _SUCCESS;
338
339
exit:
340
return ret;
341
}
342
343
void rtw_drv_proc_deinit(void)
344
{
345
int i;
346
347
if (rtw_proc == NULL)
348
return;
349
350
for (i = 0; i < drv_proc_hdls_num; i++)
351
remove_proc_entry(drv_proc_hdls[i].name, rtw_proc);
352
353
remove_proc_entry(RTW_PROC_NAME, get_proc_net);
354
rtw_proc = NULL;
355
}
356
357
#ifndef RTW_SEQ_FILE_TEST
358
#define RTW_SEQ_FILE_TEST 0
359
#endif
360
361
#if RTW_SEQ_FILE_TEST
362
#define RTW_SEQ_FILE_TEST_SHOW_LIMIT 300
363
static void *proc_start_seq_file_test(struct seq_file *m, loff_t *pos)
364
{
365
struct net_device *dev = m->private;
366
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
367
368
RTW_PRINT(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
369
if (*pos >= RTW_SEQ_FILE_TEST_SHOW_LIMIT) {
370
RTW_PRINT(FUNC_ADPT_FMT" pos:%llu, out of range return\n", FUNC_ADPT_ARG(adapter), *pos);
371
return NULL;
372
}
373
374
RTW_PRINT(FUNC_ADPT_FMT" return pos:%lld\n", FUNC_ADPT_ARG(adapter), *pos);
375
return pos;
376
}
377
void proc_stop_seq_file_test(struct seq_file *m, void *v)
378
{
379
struct net_device *dev = m->private;
380
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
381
382
RTW_PRINT(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
383
}
384
385
void *proc_next_seq_file_test(struct seq_file *m, void *v, loff_t *pos)
386
{
387
struct net_device *dev = m->private;
388
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
389
390
(*pos)++;
391
if (*pos >= RTW_SEQ_FILE_TEST_SHOW_LIMIT) {
392
RTW_PRINT(FUNC_ADPT_FMT" pos:%lld, out of range return\n", FUNC_ADPT_ARG(adapter), *pos);
393
return NULL;
394
}
395
396
RTW_PRINT(FUNC_ADPT_FMT" return pos:%lld\n", FUNC_ADPT_ARG(adapter), *pos);
397
return pos;
398
}
399
400
static int proc_get_seq_file_test(struct seq_file *m, void *v)
401
{
402
struct net_device *dev = m->private;
403
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
404
405
u32 pos = *((loff_t *)(v));
406
RTW_PRINT(FUNC_ADPT_FMT" pos:%d\n", FUNC_ADPT_ARG(adapter), pos);
407
RTW_PRINT_SEL(m, FUNC_ADPT_FMT" pos:%d\n", FUNC_ADPT_ARG(adapter), pos);
408
return 0;
409
}
410
411
struct seq_operations seq_file_test = {
412
.start = proc_start_seq_file_test,
413
.stop = proc_stop_seq_file_test,
414
.next = proc_next_seq_file_test,
415
.show = proc_get_seq_file_test,
416
};
417
#endif /* RTW_SEQ_FILE_TEST */
418
419
#ifdef CONFIG_SDIO_HCI
420
static int proc_get_sd_f0_reg_dump(struct seq_file *m, void *v)
421
{
422
struct net_device *dev = m->private;
423
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
424
425
sd_f0_reg_dump(m, adapter);
426
427
return 0;
428
}
429
430
static int proc_get_sdio_local_reg_dump(struct seq_file *m, void *v)
431
{
432
struct net_device *dev = m->private;
433
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
434
435
sdio_local_reg_dump(m, adapter);
436
437
return 0;
438
}
439
static int proc_get_sdio_card_info(struct seq_file *m, void *v)
440
{
441
struct net_device *dev = m->private;
442
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
443
444
dump_sdio_card_info(m, adapter_to_dvobj(adapter));
445
446
return 0;
447
}
448
449
#ifdef DBG_SDIO
450
static int proc_get_sdio_dbg(struct seq_file *m, void *v)
451
{
452
struct net_device *dev;
453
struct _ADAPTER *a;
454
struct dvobj_priv *d;
455
struct sdio_data *sdio;
456
457
458
dev = m->private;
459
a = (struct _ADAPTER *)rtw_netdev_priv(dev);
460
d = adapter_to_dvobj(a);
461
sdio = &d->intf_data;
462
463
dump_sdio_card_info(m, d);
464
465
RTW_PRINT_SEL(m, "CMD52 error cnt: %d\n", sdio->cmd52_err_cnt);
466
RTW_PRINT_SEL(m, "CMD53 error cnt: %d\n", sdio->cmd53_err_cnt);
467
468
#if (DBG_SDIO >= 3)
469
RTW_PRINT_SEL(m, "dbg: %s\n", sdio->dbg_enable?"enable":"disable");
470
RTW_PRINT_SEL(m, "err_stop: %s\n", sdio->err_stop?"enable":"disable");
471
RTW_PRINT_SEL(m, "err_test: %s\n", sdio->err_test?"enable":"disable");
472
RTW_PRINT_SEL(m, "err_test_triggered: %s\n",
473
sdio->err_test_triggered?"yes":"no");
474
#endif /* DBG_SDIO >= 3 */
475
476
#if (DBG_SDIO >= 2)
477
RTW_PRINT_SEL(m, "I/O error dump mark: %d\n", sdio->reg_dump_mark);
478
if (sdio->reg_dump_mark) {
479
if (sdio->dbg_msg)
480
RTW_PRINT_SEL(m, "debug messages: %s\n", sdio->dbg_msg);
481
if (sdio->reg_mac)
482
RTW_BUF_DUMP_SEL(_DRV_ALWAYS_, m, "MAC register:",
483
_TRUE, sdio->reg_mac, 0x800);
484
if (sdio->reg_mac_ext)
485
RTW_BUF_DUMP_SEL(_DRV_ALWAYS_, m, "MAC EXT register:",
486
_TRUE, sdio->reg_mac_ext, 0x800);
487
if (sdio->reg_local)
488
RTW_BUF_DUMP_SEL(_DRV_ALWAYS_, m, "SDIO Local register:",
489
_TRUE, sdio->reg_local, 0x100);
490
if (sdio->reg_cia)
491
RTW_BUF_DUMP_SEL(_DRV_ALWAYS_, m, "SDIO CIA register:",
492
_TRUE, sdio->reg_cia, 0x200);
493
}
494
#endif /* DBG_SDIO >= 2 */
495
496
return 0;
497
}
498
499
#if (DBG_SDIO >= 2)
500
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
501
#define strnicmp strncasecmp
502
#endif /* Linux kernel >= 4.0.0 */
503
void rtw_sdio_dbg_reg_free(struct dvobj_priv *d);
504
#endif /* DBG_SDIO >= 2 */
505
506
ssize_t proc_set_sdio_dbg(struct file *file, const char __user *buffer,
507
size_t count, loff_t *pos, void *data)
508
{
509
#if (DBG_SDIO >= 2)
510
struct net_device *dev = data;
511
struct dvobj_priv *d;
512
struct _ADAPTER *a;
513
struct sdio_data *sdio;
514
char tmp[32], cmd[32] = {0};
515
int num;
516
517
518
if (count < 1)
519
return -EFAULT;
520
521
if (count > sizeof(tmp)) {
522
rtw_warn_on(1);
523
return -EFAULT;
524
}
525
526
a = (struct _ADAPTER *)rtw_netdev_priv(dev);
527
d = adapter_to_dvobj(a);
528
sdio = &d->intf_data;
529
530
if (buffer && !copy_from_user(tmp, buffer, count)) {
531
num = sscanf(tmp, "%s", cmd);
532
533
if (num >= 1) {
534
if (strnicmp(cmd, "reg_reset", 10) == 0) {
535
sdio->reg_dump_mark = 0;
536
goto exit;
537
}
538
if (strnicmp(cmd, "reg_free", 9) == 0) {
539
rtw_sdio_dbg_reg_free(d);
540
sdio->reg_dump_mark = 0;
541
goto exit;
542
}
543
#if (DBG_SDIO >= 3)
544
if (strnicmp(cmd, "dbg_enable", 11) == 0) {
545
sdio->dbg_enable = 1;
546
goto exit;
547
}
548
if (strnicmp(cmd, "dbg_disable", 12) == 0) {
549
sdio->dbg_enable = 0;
550
goto exit;
551
}
552
if (strnicmp(cmd, "err_stop", 9) == 0) {
553
sdio->err_stop = 1;
554
goto exit;
555
}
556
if (strnicmp(cmd, "err_stop_disable", 16) == 0) {
557
sdio->err_stop = 0;
558
goto exit;
559
}
560
if (strnicmp(cmd, "err_test", 9) == 0) {
561
sdio->err_test_triggered = 0;
562
sdio->err_test = 1;
563
goto exit;
564
}
565
#endif /* DBG_SDIO >= 3 */
566
}
567
568
return -EINVAL;
569
}
570
571
exit:
572
#endif /* DBG_SDIO >= 2 */
573
return count;
574
}
575
#endif /* DBG_SDIO */
576
#endif /* CONFIG_SDIO_HCI */
577
578
static int proc_get_fw_info(struct seq_file *m, void *v)
579
{
580
struct net_device *dev = m->private;
581
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
582
583
rtw_dump_fw_info(m, adapter);
584
return 0;
585
}
586
static int proc_get_mac_reg_dump(struct seq_file *m, void *v)
587
{
588
struct net_device *dev = m->private;
589
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
590
591
mac_reg_dump(m, adapter);
592
593
return 0;
594
}
595
596
static int proc_get_bb_reg_dump(struct seq_file *m, void *v)
597
{
598
struct net_device *dev = m->private;
599
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
600
601
bb_reg_dump(m, adapter);
602
603
return 0;
604
}
605
606
static int proc_get_bb_reg_dump_ex(struct seq_file *m, void *v)
607
{
608
struct net_device *dev = m->private;
609
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
610
611
bb_reg_dump_ex(m, adapter);
612
613
return 0;
614
}
615
616
static int proc_get_rf_reg_dump(struct seq_file *m, void *v)
617
{
618
struct net_device *dev = m->private;
619
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
620
621
rf_reg_dump(m, adapter);
622
623
return 0;
624
}
625
626
#ifdef CONFIG_RTW_LED
627
int proc_get_led_config(struct seq_file *m, void *v)
628
{
629
struct net_device *dev = m->private;
630
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
631
632
dump_led_config(m, adapter);
633
634
return 0;
635
}
636
637
ssize_t proc_set_led_config(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
638
{
639
struct net_device *dev = data;
640
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
641
642
char tmp[32];
643
u8 strategy;
644
u8 iface_en_mask;
645
646
if (count < 1)
647
return -EFAULT;
648
649
if (count > sizeof(tmp)) {
650
rtw_warn_on(1);
651
return -EFAULT;
652
}
653
654
if (buffer && !copy_from_user(tmp, buffer, count)) {
655
656
int num = sscanf(tmp, "%hhu %hhx", &strategy, &iface_en_mask);
657
658
if (num >= 1)
659
rtw_led_set_strategy(adapter, strategy);
660
if (num >= 2)
661
rtw_led_set_iface_en_mask(adapter, iface_en_mask);
662
}
663
664
return count;
665
}
666
#endif /* CONFIG_RTW_LED */
667
668
#ifdef CONFIG_AP_MODE
669
int proc_get_aid_status(struct seq_file *m, void *v)
670
{
671
struct net_device *dev = m->private;
672
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
673
674
dump_aid_status(m, adapter);
675
676
return 0;
677
}
678
679
ssize_t proc_set_aid_status(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
680
{
681
struct net_device *dev = data;
682
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
683
struct sta_priv *stapriv = &adapter->stapriv;
684
685
char tmp[32];
686
u8 rr;
687
u16 started_aid;
688
689
if (count < 1)
690
return -EFAULT;
691
692
if (count > sizeof(tmp)) {
693
rtw_warn_on(1);
694
return -EFAULT;
695
}
696
697
if (buffer && !copy_from_user(tmp, buffer, count)) {
698
699
int num = sscanf(tmp, "%hhu %hu", &rr, &started_aid);
700
701
if (num >= 1)
702
stapriv->rr_aid = rr ? 1 : 0;
703
if (num >= 2) {
704
started_aid = started_aid % (stapriv->max_aid + 1);
705
stapriv->started_aid = started_aid ? started_aid : 1;
706
}
707
}
708
709
return count;
710
}
711
#endif /* CONFIG_AP_MODE */
712
713
static int proc_get_dump_tx_rate_bmp(struct seq_file *m, void *v)
714
{
715
struct net_device *dev = m->private;
716
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
717
718
dump_tx_rate_bmp(m, adapter_to_dvobj(adapter));
719
720
return 0;
721
}
722
723
static int proc_get_dump_adapters_status(struct seq_file *m, void *v)
724
{
725
struct net_device *dev = m->private;
726
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
727
728
dump_adapters_status(m, adapter_to_dvobj(adapter));
729
730
return 0;
731
}
732
733
#ifdef CONFIG_RTW_CUSTOMER_STR
734
static int proc_get_customer_str(struct seq_file *m, void *v)
735
{
736
struct net_device *dev = m->private;
737
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
738
u8 cstr[RTW_CUSTOMER_STR_LEN];
739
740
rtw_ps_deny(adapter, PS_DENY_IOCTL);
741
if (rtw_pwr_wakeup(adapter) == _FAIL)
742
goto exit;
743
744
if (rtw_hal_customer_str_read(adapter, cstr) != _SUCCESS)
745
goto exit;
746
747
RTW_PRINT_SEL(m, RTW_CUSTOMER_STR_FMT"\n", RTW_CUSTOMER_STR_ARG(cstr));
748
749
exit:
750
rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
751
return 0;
752
}
753
#endif /* CONFIG_RTW_CUSTOMER_STR */
754
755
#ifdef CONFIG_SCAN_BACKOP
756
static int proc_get_backop_flags_sta(struct seq_file *m, void *v)
757
{
758
struct net_device *dev = m->private;
759
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
760
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
761
762
RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_sta(mlmeext));
763
764
return 0;
765
}
766
767
static ssize_t proc_set_backop_flags_sta(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
768
{
769
struct net_device *dev = data;
770
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
771
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
772
773
char tmp[32];
774
u8 flags;
775
776
if (count < 1)
777
return -EFAULT;
778
779
if (count > sizeof(tmp)) {
780
rtw_warn_on(1);
781
return -EFAULT;
782
}
783
784
if (buffer && !copy_from_user(tmp, buffer, count)) {
785
786
int num = sscanf(tmp, "%hhx", &flags);
787
788
if (num == 1)
789
mlmeext_assign_scan_backop_flags_sta(mlmeext, flags);
790
}
791
792
return count;
793
}
794
795
#ifdef CONFIG_AP_MODE
796
static int proc_get_backop_flags_ap(struct seq_file *m, void *v)
797
{
798
struct net_device *dev = m->private;
799
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
800
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
801
802
RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_ap(mlmeext));
803
804
return 0;
805
}
806
807
static ssize_t proc_set_backop_flags_ap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
808
{
809
struct net_device *dev = data;
810
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
811
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
812
813
char tmp[32];
814
u8 flags;
815
816
if (count < 1)
817
return -EFAULT;
818
819
if (count > sizeof(tmp)) {
820
rtw_warn_on(1);
821
return -EFAULT;
822
}
823
824
if (buffer && !copy_from_user(tmp, buffer, count)) {
825
826
int num = sscanf(tmp, "%hhx", &flags);
827
828
if (num == 1)
829
mlmeext_assign_scan_backop_flags_ap(mlmeext, flags);
830
}
831
832
return count;
833
}
834
#endif /* CONFIG_AP_MODE */
835
836
#ifdef CONFIG_RTW_MESH
837
static int proc_get_backop_flags_mesh(struct seq_file *m, void *v)
838
{
839
struct net_device *dev = m->private;
840
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
841
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
842
843
RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_mesh(mlmeext));
844
845
return 0;
846
}
847
848
static ssize_t proc_set_backop_flags_mesh(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
849
{
850
struct net_device *dev = data;
851
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
852
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
853
854
char tmp[32];
855
u8 flags;
856
857
if (count < 1)
858
return -EFAULT;
859
860
if (count > sizeof(tmp)) {
861
rtw_warn_on(1);
862
return -EFAULT;
863
}
864
865
if (buffer && !copy_from_user(tmp, buffer, count)) {
866
867
int num = sscanf(tmp, "%hhx", &flags);
868
869
if (num == 1)
870
mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags);
871
}
872
873
return count;
874
}
875
#endif /* CONFIG_RTW_MESH */
876
877
#endif /* CONFIG_SCAN_BACKOP */
878
879
#if defined(CONFIG_LPS_PG) && defined(CONFIG_RTL8822C)
880
static int proc_get_lps_pg_debug(struct seq_file *m, void *v)
881
{
882
struct net_device *dev = m->private;
883
_adapter *adapter = rtw_netdev_priv(dev);
884
struct dm_struct *dm = adapter_to_phydm(adapter);
885
886
rtw_run_in_thread_cmd(adapter, ((void *)(odm_lps_pg_debug_8822c)), dm);
887
888
return 0;
889
}
890
#endif
891
892
/* gpio setting */
893
#ifdef CONFIG_GPIO_API
894
static ssize_t proc_set_config_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
895
{
896
struct net_device *dev = data;
897
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
898
char tmp[32] = {0};
899
int num = 0, gpio_pin = 0, gpio_mode = 0; /* gpio_mode:0 input 1:output; */
900
901
if (count < 2)
902
return -EFAULT;
903
904
if (count > sizeof(tmp)) {
905
rtw_warn_on(1);
906
return -EFAULT;
907
}
908
909
if (buffer && !copy_from_user(tmp, buffer, count)) {
910
num = sscanf(tmp, "%d %d", &gpio_pin, &gpio_mode);
911
RTW_INFO("num=%d gpio_pin=%d mode=%d\n", num, gpio_pin, gpio_mode);
912
padapter->pre_gpio_pin = gpio_pin;
913
914
if (gpio_mode == 0 || gpio_mode == 1)
915
rtw_hal_config_gpio(padapter, gpio_pin, gpio_mode);
916
}
917
return count;
918
919
}
920
static ssize_t proc_set_gpio_output_value(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
921
{
922
struct net_device *dev = data;
923
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
924
char tmp[32] = {0};
925
int num = 0, gpio_pin = 0, pin_mode = 0; /* pin_mode: 1 high 0:low */
926
927
if (count < 2)
928
return -EFAULT;
929
930
if (count > sizeof(tmp)) {
931
rtw_warn_on(1);
932
return -EFAULT;
933
}
934
935
if (buffer && !copy_from_user(tmp, buffer, count)) {
936
num = sscanf(tmp, "%d %d", &gpio_pin, &pin_mode);
937
RTW_INFO("num=%d gpio_pin=%d pin_high=%d\n", num, gpio_pin, pin_mode);
938
padapter->pre_gpio_pin = gpio_pin;
939
940
if (pin_mode == 0 || pin_mode == 1)
941
rtw_hal_set_gpio_output_value(padapter, gpio_pin, pin_mode);
942
}
943
return count;
944
}
945
static int proc_get_gpio(struct seq_file *m, void *v)
946
{
947
u8 gpioreturnvalue = 0;
948
struct net_device *dev = m->private;
949
950
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
951
if (!padapter)
952
return -EFAULT;
953
gpioreturnvalue = rtw_hal_get_gpio(padapter, padapter->pre_gpio_pin);
954
RTW_PRINT_SEL(m, "get_gpio %d:%d\n", padapter->pre_gpio_pin, gpioreturnvalue);
955
956
return 0;
957
958
}
959
static ssize_t proc_set_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
960
{
961
struct net_device *dev = data;
962
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
963
char tmp[32] = {0};
964
int num = 0, gpio_pin = 0;
965
966
if (count < 1)
967
return -EFAULT;
968
969
if (count > sizeof(tmp)) {
970
rtw_warn_on(1);
971
return -EFAULT;
972
}
973
974
if (buffer && !copy_from_user(tmp, buffer, count)) {
975
num = sscanf(tmp, "%d", &gpio_pin);
976
RTW_INFO("num=%d gpio_pin=%d\n", num, gpio_pin);
977
padapter->pre_gpio_pin = gpio_pin;
978
979
}
980
return count;
981
}
982
#endif
983
984
static ssize_t proc_set_rx_info_msg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
985
{
986
987
struct net_device *dev = data;
988
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
989
struct recv_priv *precvpriv = &(padapter->recvpriv);
990
char tmp[32] = {0};
991
int phy_info_flag = 0;
992
993
if (!padapter)
994
return -EFAULT;
995
996
if (count < 1) {
997
RTW_INFO("argument size is less than 1\n");
998
return -EFAULT;
999
}
1000
1001
if (count > sizeof(tmp)) {
1002
rtw_warn_on(1);
1003
return -EFAULT;
1004
}
1005
1006
if (buffer && !copy_from_user(tmp, buffer, count)) {
1007
int num = sscanf(tmp, "%d", &phy_info_flag);
1008
1009
if (num == 1)
1010
precvpriv->store_law_data_flag = (BOOLEAN) phy_info_flag;
1011
1012
/*RTW_INFO("precvpriv->store_law_data_flag = %d\n",( BOOLEAN )(precvpriv->store_law_data_flag));*/
1013
}
1014
return count;
1015
}
1016
static int proc_get_rx_info_msg(struct seq_file *m, void *v)
1017
{
1018
struct net_device *dev = m->private;
1019
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1020
1021
rtw_hal_set_odm_var(padapter, HAL_ODM_RX_Dframe_INFO, m, _FALSE);
1022
return 0;
1023
}
1024
static int proc_get_tx_info_msg(struct seq_file *m, void *v)
1025
{
1026
_irqL irqL;
1027
struct net_device *dev = m->private;
1028
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1029
struct sta_info *psta;
1030
u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1031
u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
1032
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1033
struct sta_priv *pstapriv = &padapter->stapriv;
1034
int i;
1035
_list *plist, *phead;
1036
u8 current_rate_id = 0, current_sgi = 0;
1037
1038
char *BW, *status;
1039
1040
_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
1041
1042
if (MLME_IS_STA(padapter))
1043
status = "station mode";
1044
else if (MLME_IS_AP(padapter))
1045
status = "AP mode";
1046
else if (MLME_IS_MESH(padapter))
1047
status = "mesh mode";
1048
else
1049
status = " ";
1050
_RTW_PRINT_SEL(m, "status=%s\n", status);
1051
for (i = 0; i < NUM_STA; i++) {
1052
phead = &(pstapriv->sta_hash[i]);
1053
plist = get_next(phead);
1054
1055
while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
1056
1057
psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
1058
1059
plist = get_next(plist);
1060
1061
if ((_rtw_memcmp(psta->cmn.mac_addr, bc_addr, ETH_ALEN) != _TRUE)
1062
&& (_rtw_memcmp(psta->cmn.mac_addr, null_addr, ETH_ALEN) != _TRUE)
1063
&& (_rtw_memcmp(psta->cmn.mac_addr, adapter_mac_addr(padapter), ETH_ALEN) != _TRUE)) {
1064
1065
switch (psta->cmn.bw_mode) {
1066
1067
case CHANNEL_WIDTH_20:
1068
BW = "20M";
1069
break;
1070
1071
case CHANNEL_WIDTH_40:
1072
BW = "40M";
1073
break;
1074
1075
case CHANNEL_WIDTH_80:
1076
BW = "80M";
1077
break;
1078
1079
case CHANNEL_WIDTH_160:
1080
BW = "160M";
1081
break;
1082
1083
default:
1084
BW = "";
1085
break;
1086
}
1087
current_rate_id = rtw_get_current_tx_rate(adapter, psta);
1088
current_sgi = rtw_get_current_tx_sgi(adapter, psta);
1089
1090
RTW_PRINT_SEL(m, "==============================\n");
1091
_RTW_PRINT_SEL(m, "macaddr=" MAC_FMT"\n", MAC_ARG(psta->cmn.mac_addr));
1092
_RTW_PRINT_SEL(m, "Tx_Data_Rate=%s\n", HDATA_RATE(current_rate_id));
1093
_RTW_PRINT_SEL(m, "BW=%s,sgi=%u\n", BW, current_sgi);
1094
1095
}
1096
}
1097
}
1098
1099
_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
1100
1101
return 0;
1102
1103
}
1104
1105
1106
static int proc_get_linked_info_dump(struct seq_file *m, void *v)
1107
{
1108
struct net_device *dev = m->private;
1109
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1110
if (padapter)
1111
RTW_PRINT_SEL(m, "linked_info_dump :%s\n", (padapter->bLinkInfoDump) ? "enable" : "disable");
1112
1113
return 0;
1114
}
1115
1116
1117
static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1118
{
1119
struct net_device *dev = data;
1120
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1121
1122
char tmp[32] = {0};
1123
int mode = 0, pre_mode = 0;
1124
int num = 0;
1125
1126
if (count < 1)
1127
return -EFAULT;
1128
1129
if (count > sizeof(tmp)) {
1130
rtw_warn_on(1);
1131
return -EFAULT;
1132
}
1133
1134
pre_mode = padapter->bLinkInfoDump;
1135
RTW_INFO("pre_mode=%d\n", pre_mode);
1136
1137
if (buffer && !copy_from_user(tmp, buffer, count)) {
1138
1139
num = sscanf(tmp, "%d ", &mode);
1140
RTW_INFO("num=%d mode=%d\n", num, mode);
1141
1142
if (num != 1) {
1143
RTW_INFO("argument number is wrong\n");
1144
return -EFAULT;
1145
}
1146
1147
if (mode == 1 || (mode == 0 && pre_mode == 1)) /* not consider pwr_saving 0: */
1148
padapter->bLinkInfoDump = mode;
1149
1150
else if ((mode == 2) || (mode == 0 && pre_mode == 2)) { /* consider power_saving */
1151
/* RTW_INFO("linked_info_dump =%s\n", (padapter->bLinkInfoDump)?"enable":"disable") */
1152
linked_info_dump(padapter, mode);
1153
}
1154
}
1155
return count;
1156
}
1157
1158
1159
static int proc_get_sta_tp_dump(struct seq_file *m, void *v)
1160
{
1161
struct net_device *dev = m->private;
1162
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1163
1164
if (padapter)
1165
RTW_PRINT_SEL(m, "sta_tp_dump :%s\n", (padapter->bsta_tp_dump) ? "enable" : "disable");
1166
1167
return 0;
1168
}
1169
1170
static ssize_t proc_set_sta_tp_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1171
{
1172
struct net_device *dev = data;
1173
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1174
1175
char tmp[32] = {0};
1176
int mode = 0;
1177
int num = 0;
1178
1179
if (count < 1)
1180
return -EFAULT;
1181
1182
if (count > sizeof(tmp)) {
1183
rtw_warn_on(1);
1184
return -EFAULT;
1185
}
1186
1187
if (buffer && !copy_from_user(tmp, buffer, count)) {
1188
1189
num = sscanf(tmp, "%d ", &mode);
1190
1191
if (num != 1) {
1192
RTW_INFO("argument number is wrong\n");
1193
return -EFAULT;
1194
}
1195
if (padapter)
1196
padapter->bsta_tp_dump = mode;
1197
}
1198
return count;
1199
}
1200
1201
static int proc_get_sta_tp_info(struct seq_file *m, void *v)
1202
{
1203
struct net_device *dev = m->private;
1204
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1205
1206
if (padapter)
1207
rtw_sta_traffic_info(m, padapter);
1208
1209
return 0;
1210
}
1211
1212
static int proc_get_turboedca_ctrl(struct seq_file *m, void *v)
1213
{
1214
struct net_device *dev = m->private;
1215
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1216
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
1217
1218
if (hal_data) {
1219
1220
u32 edca_param;
1221
1222
if (hal_data->dis_turboedca == 0)
1223
RTW_PRINT_SEL(m, "Turbo-EDCA : %s\n", "Enable");
1224
else
1225
RTW_PRINT_SEL(m, "Turbo-EDCA : %s, mode=%d, edca_param_mode=0x%x\n", "Disable", hal_data->dis_turboedca, hal_data->edca_param_mode);
1226
1227
1228
rtw_hal_get_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
1229
1230
_RTW_PRINT_SEL(m, "PARAM_BE:0x%x\n", edca_param);
1231
1232
}
1233
1234
return 0;
1235
}
1236
1237
static ssize_t proc_set_turboedca_ctrl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1238
{
1239
struct net_device *dev = data;
1240
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1241
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
1242
char tmp[32] = {0};
1243
int mode = 0, num = 0;
1244
u32 param_mode = 0;
1245
1246
if (count < 1)
1247
return -EFAULT;
1248
1249
if (count > sizeof(tmp))
1250
return -EFAULT;
1251
1252
if (buffer && !copy_from_user(tmp, buffer, count)) {
1253
1254
num = sscanf(tmp, "%d %x", &mode, &param_mode);
1255
1256
if (num < 1 || num > 2) {
1257
RTW_INFO("argument number is wrong\n");
1258
return -EFAULT;
1259
}
1260
1261
/* 0: enable turboedca,
1262
1: disable turboedca,
1263
2: disable turboedca and setting EDCA parameter based on the input parameter
1264
> 2 : currently reset to 0 */
1265
1266
if (mode > 2)
1267
mode = 0;
1268
1269
hal_data->dis_turboedca = mode;
1270
1271
hal_data->edca_param_mode = 0; /* init. value */
1272
1273
RTW_INFO("dis_turboedca mode = 0x%x\n", hal_data->dis_turboedca);
1274
1275
if (num == 2) {
1276
1277
hal_data->edca_param_mode = param_mode;
1278
1279
RTW_INFO("param_mode = 0x%x\n", param_mode);
1280
}
1281
1282
}
1283
1284
return count;
1285
1286
}
1287
1288
static int proc_get_mac_qinfo(struct seq_file *m, void *v)
1289
{
1290
struct net_device *dev = m->private;
1291
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1292
1293
rtw_hal_get_hwreg(adapter, HW_VAR_DUMP_MAC_QUEUE_INFO, (u8 *)m);
1294
1295
return 0;
1296
}
1297
1298
int proc_get_wifi_spec(struct seq_file *m, void *v)
1299
{
1300
struct net_device *dev = m->private;
1301
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1302
struct registry_priv *pregpriv = &padapter->registrypriv;
1303
1304
RTW_PRINT_SEL(m, "wifi_spec=%d\n", pregpriv->wifi_spec);
1305
return 0;
1306
}
1307
1308
static int proc_get_chan_plan(struct seq_file *m, void *v)
1309
{
1310
struct net_device *dev = m->private;
1311
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1312
1313
dump_cur_chset(m, adapter_to_rfctl(adapter));
1314
return 0;
1315
}
1316
1317
static ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1318
{
1319
struct net_device *dev = data;
1320
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1321
char tmp[32];
1322
u8 chan_plan = RTW_CHPLAN_UNSPECIFIED;
1323
1324
if (!padapter)
1325
return -EFAULT;
1326
1327
if (count < 1) {
1328
RTW_INFO("argument size is less than 1\n");
1329
return -EFAULT;
1330
}
1331
1332
if (count > sizeof(tmp)) {
1333
rtw_warn_on(1);
1334
return -EFAULT;
1335
}
1336
1337
if (buffer && !copy_from_user(tmp, buffer, count)) {
1338
int num = sscanf(tmp, "%hhx", &chan_plan);
1339
if (num != 1)
1340
return count;
1341
}
1342
1343
rtw_set_channel_plan(padapter, chan_plan);
1344
1345
return count;
1346
}
1347
1348
static int proc_get_country_code(struct seq_file *m, void *v)
1349
{
1350
struct net_device *dev = m->private;
1351
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1352
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1353
1354
if (rfctl->country_ent)
1355
dump_country_chplan(m, rfctl->country_ent);
1356
else
1357
RTW_PRINT_SEL(m, "unspecified\n");
1358
1359
return 0;
1360
}
1361
1362
static ssize_t proc_set_country_code(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1363
{
1364
struct net_device *dev = data;
1365
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1366
char tmp[32];
1367
char alpha2[2];
1368
int num;
1369
1370
if (count < 1)
1371
return -EFAULT;
1372
1373
if (count > sizeof(tmp)) {
1374
rtw_warn_on(1);
1375
return -EFAULT;
1376
}
1377
1378
if (!buffer || copy_from_user(tmp, buffer, count))
1379
goto exit;
1380
1381
num = sscanf(tmp, "%c%c", &alpha2[0], &alpha2[1]);
1382
if (num != 2)
1383
return count;
1384
1385
rtw_set_country(padapter, alpha2);
1386
1387
exit:
1388
return count;
1389
}
1390
1391
#if CONFIG_RTW_MACADDR_ACL
1392
static int proc_get_macaddr_acl(struct seq_file *m, void *v)
1393
{
1394
struct net_device *dev = m->private;
1395
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1396
1397
dump_macaddr_acl(m, adapter);
1398
return 0;
1399
}
1400
1401
ssize_t proc_set_macaddr_acl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1402
{
1403
struct net_device *dev = data;
1404
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1405
char tmp[17 * NUM_ACL + 32] = {0};
1406
u8 period;
1407
char cmd[32];
1408
u8 mode;
1409
u8 addr[ETH_ALEN];
1410
1411
#define MAC_ACL_CMD_MODE 0
1412
#define MAC_ACL_CMD_ADD 1
1413
#define MAC_ACL_CMD_DEL 2
1414
#define MAC_ACL_CMD_CLR 3
1415
#define MAC_ACL_CMD_NUM 4
1416
1417
static const char * const mac_acl_cmd_str[] = {
1418
"mode",
1419
"add",
1420
"del",
1421
"clr",
1422
};
1423
u8 cmd_id = MAC_ACL_CMD_NUM;
1424
1425
if (count < 1)
1426
return -EFAULT;
1427
1428
if (count > sizeof(tmp)) {
1429
rtw_warn_on(1);
1430
return -EFAULT;
1431
}
1432
1433
if (buffer && !copy_from_user(tmp, buffer, count)) {
1434
/*
1435
* <period> mode <mode> <macaddr> [<macaddr>]
1436
* <period> mode <mode>
1437
* <period> add <macaddr> [<macaddr>]
1438
* <period> del <macaddr> [<macaddr>]
1439
* <period> clr
1440
*/
1441
char *c, *next;
1442
int i;
1443
u8 is_bcast;
1444
1445
next = tmp;
1446
c = strsep(&next, " \t");
1447
if (!c || sscanf(c, "%hhu", &period) != 1)
1448
goto exit;
1449
1450
if (period >= RTW_ACL_PERIOD_NUM) {
1451
RTW_WARN(FUNC_ADPT_FMT" invalid period:%u", FUNC_ADPT_ARG(adapter), period);
1452
goto exit;
1453
}
1454
1455
c = strsep(&next, " \t");
1456
if (!c || sscanf(c, "%s", cmd) != 1)
1457
goto exit;
1458
1459
for (i = 0; i < MAC_ACL_CMD_NUM; i++)
1460
if (strcmp(mac_acl_cmd_str[i], cmd) == 0)
1461
cmd_id = i;
1462
1463
switch (cmd_id) {
1464
case MAC_ACL_CMD_MODE:
1465
c = strsep(&next, " \t");
1466
if (!c || sscanf(c, "%hhu", &mode) != 1)
1467
goto exit;
1468
1469
if (mode >= RTW_ACL_MODE_MAX) {
1470
RTW_WARN(FUNC_ADPT_FMT" invalid mode:%u", FUNC_ADPT_ARG(adapter), mode);
1471
goto exit;
1472
}
1473
break;
1474
1475
case MAC_ACL_CMD_ADD:
1476
case MAC_ACL_CMD_DEL:
1477
break;
1478
1479
case MAC_ACL_CMD_CLR:
1480
/* clear settings */
1481
rtw_macaddr_acl_clear(adapter, period);
1482
goto exit;
1483
1484
default:
1485
RTW_WARN(FUNC_ADPT_FMT" invalid cmd:\"%s\"", FUNC_ADPT_ARG(adapter), cmd);
1486
goto exit;
1487
}
1488
1489
/* check for macaddr list */
1490
c = strsep(&next, " \t");
1491
if (!c && cmd_id == MAC_ACL_CMD_MODE) {
1492
/* set mode only */
1493
rtw_set_macaddr_acl(adapter, period, mode);
1494
goto exit;
1495
}
1496
1497
if (cmd_id == MAC_ACL_CMD_MODE) {
1498
/* set mode and entire macaddr list */
1499
rtw_macaddr_acl_clear(adapter, period);
1500
rtw_set_macaddr_acl(adapter, period, mode);
1501
}
1502
1503
while (c != NULL) {
1504
if (sscanf(c, MAC_SFMT, MAC_SARG(addr)) != 6)
1505
break;
1506
1507
is_bcast = is_broadcast_mac_addr(addr);
1508
if (is_bcast
1509
|| rtw_check_invalid_mac_address(addr, 0) == _FALSE
1510
) {
1511
if (cmd_id == MAC_ACL_CMD_DEL) {
1512
rtw_acl_remove_sta(adapter, period, addr);
1513
if (is_bcast)
1514
break;
1515
} else if (!is_bcast)
1516
rtw_acl_add_sta(adapter, period, addr);
1517
}
1518
1519
c = strsep(&next, " \t");
1520
}
1521
}
1522
1523
exit:
1524
return count;
1525
}
1526
#endif /* CONFIG_RTW_MACADDR_ACL */
1527
1528
#if CONFIG_RTW_PRE_LINK_STA
1529
static int proc_get_pre_link_sta(struct seq_file *m, void *v)
1530
{
1531
struct net_device *dev = m->private;
1532
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1533
1534
dump_pre_link_sta_ctl(m, &adapter->stapriv);
1535
return 0;
1536
}
1537
1538
ssize_t proc_set_pre_link_sta(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1539
{
1540
struct net_device *dev = data;
1541
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1542
struct mlme_priv *mlme = &adapter->mlmepriv;
1543
struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
1544
char tmp[17 * RTW_PRE_LINK_STA_NUM + 32] = {0};
1545
char arg0[16] = {0};
1546
u8 addr[ETH_ALEN];
1547
1548
#define PRE_LINK_STA_CMD_RESET 0
1549
#define PRE_LINK_STA_CMD_ADD 1
1550
#define PRE_LINK_STA_CMD_DEL 2
1551
#define PRE_LINK_STA_CMD_NUM 3
1552
1553
static const char * const pre_link_sta_cmd_str[] = {
1554
"reset",
1555
"add",
1556
"del"
1557
};
1558
u8 cmd_id = PRE_LINK_STA_CMD_NUM;
1559
1560
if (count < 1)
1561
return -EFAULT;
1562
1563
if (count > sizeof(tmp)) {
1564
rtw_warn_on(1);
1565
return -EFAULT;
1566
}
1567
1568
if (buffer && !copy_from_user(tmp, buffer, count)) {
1569
/* cmd [<macaddr>] */
1570
char *c, *next;
1571
int i;
1572
1573
next = tmp;
1574
c = strsep(&next, " \t");
1575
1576
if (sscanf(c, "%s", arg0) != 1)
1577
goto exit;
1578
1579
for (i = 0; i < PRE_LINK_STA_CMD_NUM; i++)
1580
if (strcmp(pre_link_sta_cmd_str[i], arg0) == 0)
1581
cmd_id = i;
1582
1583
switch (cmd_id) {
1584
case PRE_LINK_STA_CMD_RESET:
1585
rtw_pre_link_sta_ctl_reset(&adapter->stapriv);
1586
goto exit;
1587
case PRE_LINK_STA_CMD_ADD:
1588
case PRE_LINK_STA_CMD_DEL:
1589
break;
1590
default:
1591
goto exit;
1592
}
1593
1594
/* macaddr list */
1595
c = strsep(&next, " \t");
1596
while (c != NULL) {
1597
if (sscanf(c, MAC_SFMT, MAC_SARG(addr)) != 6)
1598
break;
1599
1600
if (rtw_check_invalid_mac_address(addr, 0) == _FALSE) {
1601
if (cmd_id == PRE_LINK_STA_CMD_ADD)
1602
rtw_pre_link_sta_add(&adapter->stapriv, addr);
1603
else
1604
rtw_pre_link_sta_del(&adapter->stapriv, addr);
1605
}
1606
1607
c = strsep(&next, " \t");
1608
}
1609
}
1610
1611
exit:
1612
return count;
1613
}
1614
#endif /* CONFIG_RTW_PRE_LINK_STA */
1615
1616
static int proc_get_ch_sel_policy(struct seq_file *m, void *v)
1617
{
1618
struct net_device *dev = m->private;
1619
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1620
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1621
1622
RTW_PRINT_SEL(m, "%-16s\n", "same_band_prefer");
1623
1624
RTW_PRINT_SEL(m, "%16u\n", rfctl->ch_sel_same_band_prefer);
1625
1626
return 0;
1627
}
1628
1629
static ssize_t proc_set_ch_sel_policy(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1630
{
1631
struct net_device *dev = data;
1632
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1633
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1634
char tmp[32];
1635
u8 sb_prefer;
1636
int num;
1637
1638
if (count < 1)
1639
return -EFAULT;
1640
1641
if (count > sizeof(tmp)) {
1642
rtw_warn_on(1);
1643
return -EFAULT;
1644
}
1645
1646
if (!buffer || copy_from_user(tmp, buffer, count))
1647
goto exit;
1648
1649
num = sscanf(tmp, "%hhu", &sb_prefer);
1650
if (num >= 1)
1651
rfctl->ch_sel_same_band_prefer = sb_prefer;
1652
1653
exit:
1654
return count;
1655
}
1656
1657
#ifdef CONFIG_DFS_MASTER
1658
static int proc_get_dfs_test_case(struct seq_file *m, void *v)
1659
{
1660
struct net_device *dev = m->private;
1661
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1662
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1663
1664
RTW_PRINT_SEL(m, "%-24s %-19s\n", "radar_detect_trigger_non", "choose_dfs_ch_first");
1665
RTW_PRINT_SEL(m, "%24hhu %19hhu\n"
1666
, rfctl->dbg_dfs_radar_detect_trigger_non
1667
, rfctl->dbg_dfs_choose_dfs_ch_first
1668
);
1669
1670
return 0;
1671
}
1672
1673
static ssize_t proc_set_dfs_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1674
{
1675
struct net_device *dev = data;
1676
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1677
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1678
char tmp[32];
1679
u8 radar_detect_trigger_non;
1680
u8 choose_dfs_ch_first;
1681
1682
if (count < 1)
1683
return -EFAULT;
1684
1685
if (count > sizeof(tmp)) {
1686
rtw_warn_on(1);
1687
return -EFAULT;
1688
}
1689
1690
if (buffer && !copy_from_user(tmp, buffer, count)) {
1691
int num = sscanf(tmp, "%hhu %hhu", &radar_detect_trigger_non, &choose_dfs_ch_first);
1692
1693
if (num >= 1)
1694
rfctl->dbg_dfs_radar_detect_trigger_non = radar_detect_trigger_non;
1695
if (num >= 2)
1696
rfctl->dbg_dfs_choose_dfs_ch_first = choose_dfs_ch_first;
1697
}
1698
1699
return count;
1700
}
1701
1702
ssize_t proc_set_update_non_ocp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1703
{
1704
struct net_device *dev = data;
1705
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1706
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1707
char tmp[32];
1708
u8 ch, bw = CHANNEL_WIDTH_20, offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1709
int ms = -1;
1710
1711
if (count < 1)
1712
return -EFAULT;
1713
1714
if (count > sizeof(tmp)) {
1715
rtw_warn_on(1);
1716
return -EFAULT;
1717
}
1718
1719
if (buffer && !copy_from_user(tmp, buffer, count)) {
1720
1721
int num = sscanf(tmp, "%hhu %hhu %hhu %d", &ch, &bw, &offset, &ms);
1722
1723
if (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))
1724
goto exit;
1725
1726
if (bw == CHANNEL_WIDTH_20)
1727
rtw_chset_update_non_ocp_ms(rfctl->channel_set
1728
, ch, bw, HAL_PRIME_CHNL_OFFSET_DONT_CARE, ms);
1729
else
1730
rtw_chset_update_non_ocp_ms(rfctl->channel_set
1731
, ch, bw, offset, ms);
1732
}
1733
1734
exit:
1735
return count;
1736
}
1737
1738
ssize_t proc_set_radar_detect(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1739
{
1740
struct net_device *dev = data;
1741
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1742
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1743
char tmp[32];
1744
u8 fake_radar_detect_cnt = 0;
1745
1746
if (count < 1)
1747
return -EFAULT;
1748
1749
if (count > sizeof(tmp)) {
1750
rtw_warn_on(1);
1751
return -EFAULT;
1752
}
1753
1754
if (buffer && !copy_from_user(tmp, buffer, count)) {
1755
1756
int num = sscanf(tmp, "%hhu", &fake_radar_detect_cnt);
1757
1758
if (num < 1)
1759
goto exit;
1760
1761
rfctl->dbg_dfs_fake_radar_detect_cnt = fake_radar_detect_cnt;
1762
}
1763
1764
exit:
1765
return count;
1766
}
1767
1768
static int proc_get_dfs_ch_sel_d_flags(struct seq_file *m, void *v)
1769
{
1770
struct net_device *dev = m->private;
1771
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1772
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1773
1774
RTW_PRINT_SEL(m, "0x%02x\n", rfctl->dfs_ch_sel_d_flags);
1775
1776
return 0;
1777
}
1778
1779
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)
1780
{
1781
struct net_device *dev = data;
1782
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1783
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1784
char tmp[32];
1785
u8 d_flags;
1786
int num;
1787
1788
if (count < 1)
1789
return -EFAULT;
1790
1791
if (count > sizeof(tmp)) {
1792
rtw_warn_on(1);
1793
return -EFAULT;
1794
}
1795
1796
if (!buffer || copy_from_user(tmp, buffer, count))
1797
goto exit;
1798
1799
num = sscanf(tmp, "%hhx", &d_flags);
1800
if (num != 1)
1801
goto exit;
1802
1803
rfctl->dfs_ch_sel_d_flags = d_flags;
1804
1805
exit:
1806
return count;
1807
}
1808
1809
#ifdef CONFIG_DFS_SLAVE_WITH_RADAR_DETECT
1810
static int proc_get_dfs_slave_with_rd(struct seq_file *m, void *v)
1811
{
1812
struct net_device *dev = m->private;
1813
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1814
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1815
1816
RTW_PRINT_SEL(m, "%u\n", rfctl->dfs_slave_with_rd);
1817
1818
return 0;
1819
}
1820
1821
static ssize_t proc_set_dfs_slave_with_rd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1822
{
1823
struct net_device *dev = data;
1824
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1825
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
1826
char tmp[32];
1827
u8 rd;
1828
int num;
1829
1830
if (count < 1)
1831
return -EFAULT;
1832
1833
if (count > sizeof(tmp)) {
1834
rtw_warn_on(1);
1835
return -EFAULT;
1836
}
1837
1838
if (!buffer || copy_from_user(tmp, buffer, count))
1839
goto exit;
1840
1841
num = sscanf(tmp, "%hhu", &rd);
1842
if (num != 1)
1843
goto exit;
1844
1845
rd = rd ? 1 : 0;
1846
1847
if (rfctl->dfs_slave_with_rd != rd) {
1848
rfctl->dfs_slave_with_rd = rd;
1849
rtw_dfs_rd_en_decision_cmd(adapter);
1850
}
1851
1852
exit:
1853
return count;
1854
}
1855
#endif /* CONFIG_DFS_SLAVE_WITH_RADAR_DETECT */
1856
#endif /* CONFIG_DFS_MASTER */
1857
1858
#ifdef CONFIG_80211N_HT
1859
int proc_get_rx_ampdu_size_limit(struct seq_file *m, void *v)
1860
{
1861
struct net_device *dev = m->private;
1862
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1863
1864
dump_regsty_rx_ampdu_size_limit(m, adapter);
1865
1866
return 0;
1867
}
1868
1869
ssize_t proc_set_rx_ampdu_size_limit(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1870
{
1871
struct net_device *dev = data;
1872
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1873
struct registry_priv *regsty = adapter_to_regsty(adapter);
1874
char tmp[32];
1875
u8 nss;
1876
u8 limit_by_bw[4] = {0xFF};
1877
1878
if (count < 1)
1879
return -EFAULT;
1880
1881
if (count > sizeof(tmp)) {
1882
rtw_warn_on(1);
1883
return -EFAULT;
1884
}
1885
1886
if (buffer && !copy_from_user(tmp, buffer, count)) {
1887
int i;
1888
int num = sscanf(tmp, "%hhu %hhu %hhu %hhu %hhu"
1889
, &nss, &limit_by_bw[0], &limit_by_bw[1], &limit_by_bw[2], &limit_by_bw[3]);
1890
1891
if (num < 2)
1892
goto exit;
1893
if (nss == 0 || nss > 4)
1894
goto exit;
1895
1896
for (i = 0; i < num - 1; i++)
1897
regsty->rx_ampdu_sz_limit_by_nss_bw[nss - 1][i] = limit_by_bw[i];
1898
1899
rtw_rx_ampdu_apply(adapter);
1900
}
1901
1902
exit:
1903
return count;
1904
}
1905
#endif /* CONFIG_80211N_HT */
1906
1907
static int proc_get_rx_chk_limit(struct seq_file *m, void *v)
1908
{
1909
struct net_device *dev = m->private;
1910
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1911
1912
RTW_PRINT_SEL(m, "Rx chk limit : %d\n", rtw_get_rx_chk_limit(padapter));
1913
1914
return 0;
1915
}
1916
1917
static ssize_t proc_set_rx_chk_limit(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1918
{
1919
char tmp[32];
1920
struct net_device *dev = data;
1921
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1922
int rx_chk_limit;
1923
1924
if (count < 1) {
1925
RTW_INFO("argument size is less than 1\n");
1926
return -EFAULT;
1927
}
1928
1929
if (count > sizeof(tmp)) {
1930
rtw_warn_on(1);
1931
return -EFAULT;
1932
}
1933
1934
if (buffer && !copy_from_user(tmp, buffer, count)) {
1935
int num = sscanf(tmp, "%d", &rx_chk_limit);
1936
1937
rtw_set_rx_chk_limit(padapter, rx_chk_limit);
1938
}
1939
1940
return count;
1941
}
1942
1943
static int proc_get_udpport(struct seq_file *m, void *v)
1944
{
1945
struct net_device *dev = m->private;
1946
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1947
struct recv_priv *precvpriv = &(padapter->recvpriv);
1948
1949
RTW_PRINT_SEL(m, "%d\n", precvpriv->sink_udpport);
1950
return 0;
1951
}
1952
static ssize_t proc_set_udpport(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
1953
{
1954
struct net_device *dev = data;
1955
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1956
struct recv_priv *precvpriv = &(padapter->recvpriv);
1957
int sink_udpport = 0;
1958
char tmp[32];
1959
1960
1961
if (!padapter)
1962
return -EFAULT;
1963
1964
if (count < 1) {
1965
RTW_INFO("argument size is less than 1\n");
1966
return -EFAULT;
1967
}
1968
1969
if (count > sizeof(tmp)) {
1970
rtw_warn_on(1);
1971
return -EFAULT;
1972
}
1973
1974
if (buffer && !copy_from_user(tmp, buffer, count)) {
1975
1976
int num = sscanf(tmp, "%d", &sink_udpport);
1977
1978
if (num != 1) {
1979
RTW_INFO("invalid input parameter number!\n");
1980
return count;
1981
}
1982
1983
}
1984
precvpriv->sink_udpport = sink_udpport;
1985
1986
return count;
1987
1988
}
1989
1990
static int proc_get_mi_ap_bc_info(struct seq_file *m, void *v)
1991
{
1992
struct net_device *dev = m->private;
1993
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
1994
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1995
struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1996
u8 i;
1997
1998
for (i = 0; i < dvobj->iface_nums; i++)
1999
RTW_PRINT_SEL(m, "iface_id:%d, mac_id && sec_cam_id = %d\n", i, macid_ctl->iface_bmc[i]);
2000
2001
return 0;
2002
}
2003
static int proc_get_macid_info(struct seq_file *m, void *v)
2004
{
2005
struct net_device *dev = m->private;
2006
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2007
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2008
struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
2009
u8 i;
2010
u8 null_addr[ETH_ALEN] = {0};
2011
u8 *macaddr;
2012
2013
RTW_PRINT_SEL(m, "max_num:%u\n", macid_ctl->num);
2014
RTW_PRINT_SEL(m, "\n");
2015
2016
RTW_PRINT_SEL(m, "used:\n");
2017
dump_macid_map(m, &macid_ctl->used, macid_ctl->num);
2018
RTW_PRINT_SEL(m, "\n");
2019
2020
RTW_PRINT_SEL(m, "%-3s %-3s %-5s %-4s %-17s %-6s %-3s"
2021
, "id", "bmc", "ifbmp", "ch_g", "macaddr", "bw", "vht");
2022
2023
if (GET_HAL_TX_NSS(adapter) > 2)
2024
_RTW_PRINT_SEL(m, " %-10s", "rate_bmp1");
2025
2026
_RTW_PRINT_SEL(m, " %-10s %s\n", "rate_bmp0", "status");
2027
2028
for (i = 0; i < macid_ctl->num; i++) {
2029
if (rtw_macid_is_used(macid_ctl, i)
2030
|| macid_ctl->h2c_msr[i]
2031
) {
2032
if (macid_ctl->sta[i])
2033
macaddr = macid_ctl->sta[i]->cmn.mac_addr;
2034
else
2035
macaddr = null_addr;
2036
2037
RTW_PRINT_SEL(m, "%3u %3u 0x%02x %4d "MAC_FMT" %6s %3u"
2038
, i
2039
, rtw_macid_is_bmc(macid_ctl, i)
2040
, rtw_macid_get_iface_bmp(macid_ctl, i)
2041
, rtw_macid_get_ch_g(macid_ctl, i)
2042
, MAC_ARG(macaddr)
2043
, ch_width_str(macid_ctl->bw[i])
2044
, macid_ctl->vht_en[i]
2045
);
2046
2047
if (GET_HAL_TX_NSS(adapter) > 2)
2048
_RTW_PRINT_SEL(m, " 0x%08X", macid_ctl->rate_bmp1[i]);
2049
2050
_RTW_PRINT_SEL(m, " 0x%08X "H2C_MSR_FMT" %s\n"
2051
, macid_ctl->rate_bmp0[i]
2052
, H2C_MSR_ARG(&macid_ctl->h2c_msr[i])
2053
, rtw_macid_is_used(macid_ctl, i) ? "" : "[unused]"
2054
);
2055
}
2056
}
2057
RTW_PRINT_SEL(m, "\n");
2058
2059
for (i = 0; i < H2C_MSR_ROLE_MAX; i++) {
2060
if (macid_ctl->op_num[i]) {
2061
RTW_PRINT_SEL(m, "%-5s op_num:%u\n"
2062
, h2c_msr_role_str(i), macid_ctl->op_num[i]);
2063
}
2064
}
2065
2066
return 0;
2067
}
2068
2069
static int proc_get_sec_cam(struct seq_file *m, void *v)
2070
{
2071
struct net_device *dev = m->private;
2072
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2073
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2074
struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
2075
2076
RTW_PRINT_SEL(m, "sec_cap:0x%02x\n", cam_ctl->sec_cap);
2077
RTW_PRINT_SEL(m, "flags:0x%08x\n", cam_ctl->flags);
2078
RTW_PRINT_SEL(m, "\n");
2079
2080
RTW_PRINT_SEL(m, "max_num:%u\n", cam_ctl->num);
2081
RTW_PRINT_SEL(m, "used:\n");
2082
dump_sec_cam_map(m, &cam_ctl->used, cam_ctl->num);
2083
RTW_PRINT_SEL(m, "\n");
2084
2085
RTW_PRINT_SEL(m, "reg_scr:0x%04x\n", rtw_read16(adapter, 0x680));
2086
RTW_PRINT_SEL(m, "\n");
2087
2088
dump_sec_cam(m, adapter);
2089
2090
return 0;
2091
}
2092
2093
static ssize_t proc_set_sec_cam(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2094
{
2095
struct net_device *dev = data;
2096
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2097
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2098
struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
2099
char tmp[32] = {0};
2100
char cmd[4];
2101
u8 id_1 = 0, id_2 = 0;
2102
2103
if (count > sizeof(tmp)) {
2104
rtw_warn_on(1);
2105
return -EFAULT;
2106
}
2107
2108
if (buffer && !copy_from_user(tmp, buffer, count)) {
2109
2110
/* c <id_1>: clear specific cam entry */
2111
/* wfc <id_1>: write specific cam entry from cam cache */
2112
/* sw <id_1> <id_2>: sec_cam 1/2 swap */
2113
2114
int num = sscanf(tmp, "%s %hhu %hhu", cmd, &id_1, &id_2);
2115
2116
if (num < 2)
2117
return count;
2118
2119
if ((id_1 >= cam_ctl->num) || (id_2 >= cam_ctl->num)) {
2120
RTW_ERR(FUNC_ADPT_FMT" invalid id_1:%u id_2:%u\n", FUNC_ADPT_ARG(adapter), id_1, id_2);
2121
return count;
2122
}
2123
2124
if (strcmp("c", cmd) == 0) {
2125
_clear_cam_entry(adapter, id_1);
2126
adapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */
2127
} else if (strcmp("wfc", cmd) == 0)
2128
write_cam_from_cache(adapter, id_1);
2129
else if (strcmp("sw", cmd) == 0)
2130
rtw_sec_cam_swap(adapter, id_1, id_2);
2131
else if (strcmp("cdk", cmd) == 0)
2132
rtw_clean_dk_section(adapter);
2133
#ifdef DBG_SEC_CAM_MOVE
2134
else if (strcmp("sgd", cmd) == 0)
2135
rtw_hal_move_sta_gk_to_dk(adapter);
2136
else if (strcmp("rsd", cmd) == 0)
2137
rtw_hal_read_sta_dk_key(adapter, id_1);
2138
#endif
2139
}
2140
2141
return count;
2142
}
2143
2144
static int proc_get_sec_cam_cache(struct seq_file *m, void *v)
2145
{
2146
struct net_device *dev = m->private;
2147
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2148
2149
dump_sec_cam_cache(m, adapter);
2150
return 0;
2151
}
2152
2153
static ssize_t proc_set_change_bss_chbw(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2154
{
2155
struct net_device *dev = data;
2156
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2157
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2158
int i;
2159
char tmp[32];
2160
s16 ch;
2161
s8 bw = REQ_BW_NONE, offset = REQ_OFFSET_NONE;
2162
u8 ifbmp = 0;
2163
2164
if (count < 1)
2165
return -EFAULT;
2166
2167
if (count > sizeof(tmp)) {
2168
rtw_warn_on(1);
2169
return -EFAULT;
2170
}
2171
2172
if (buffer && !copy_from_user(tmp, buffer, count)) {
2173
2174
int num = sscanf(tmp, "%hd %hhd %hhd %hhx", &ch, &bw, &offset, &ifbmp);
2175
2176
if (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))
2177
goto exit;
2178
2179
if (num < 4)
2180
ifbmp = BIT(adapter->iface_id);
2181
else
2182
ifbmp &= (1 << dvobj->iface_nums) - 1;
2183
2184
for (i = 0; i < dvobj->iface_nums; i++) {
2185
if (!(ifbmp & BIT(i)) || !dvobj->padapters[i])
2186
continue;
2187
2188
if (!CHK_MLME_STATE(dvobj->padapters[i], WIFI_AP_STATE | WIFI_MESH_STATE)
2189
|| !MLME_IS_ASOC(dvobj->padapters[i]))
2190
ifbmp &= ~BIT(i);
2191
}
2192
2193
if (ifbmp)
2194
rtw_change_bss_chbw_cmd(adapter, RTW_CMDF_WAIT_ACK, ifbmp, 0, ch, bw, offset);
2195
}
2196
2197
exit:
2198
return count;
2199
}
2200
2201
#if CONFIG_TX_AC_LIFETIME
2202
static int proc_get_tx_aclt_force_val(struct seq_file *m, void *v)
2203
{
2204
struct net_device *dev = m->private;
2205
_adapter *adapter = rtw_netdev_priv(dev);
2206
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2207
2208
dump_tx_aclt_force_val(m, dvobj);
2209
2210
return 0;
2211
}
2212
2213
static ssize_t proc_set_tx_aclt_force_val(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2214
{
2215
struct net_device *dev = data;
2216
_adapter *adapter = rtw_netdev_priv(dev);
2217
char tmp[32] = {0};
2218
2219
if (count > sizeof(tmp)) {
2220
rtw_warn_on(1);
2221
return -EFAULT;
2222
}
2223
2224
if (buffer && !copy_from_user(tmp, buffer, count)) {
2225
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2226
struct tx_aclt_conf_t input;
2227
int num = sscanf(tmp, "%hhx %u %u", &input.en, &input.vo_vi, &input.be_bk);
2228
2229
if (num < 1)
2230
return count;
2231
2232
rtw_hal_set_tx_aclt_force_val(adapter, &input, num);
2233
rtw_run_in_thread_cmd(adapter, ((void *)(rtw_hal_update_tx_aclt)), adapter);
2234
}
2235
2236
return count;
2237
}
2238
2239
static int proc_get_tx_aclt_flags(struct seq_file *m, void *v)
2240
{
2241
struct net_device *dev = m->private;
2242
_adapter *adapter = rtw_netdev_priv(dev);
2243
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2244
2245
RTW_PRINT_SEL(m, "0x%02x\n", dvobj->tx_aclt_flags);
2246
2247
return 0;
2248
}
2249
2250
static ssize_t proc_set_tx_aclt_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2251
{
2252
struct net_device *dev = data;
2253
_adapter *adapter = rtw_netdev_priv(dev);
2254
char tmp[32] = {0};
2255
2256
if (count > sizeof(tmp)) {
2257
rtw_warn_on(1);
2258
return -EFAULT;
2259
}
2260
2261
if (buffer && !copy_from_user(tmp, buffer, count)) {
2262
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2263
u8 flags;
2264
int num = sscanf(tmp, "%hhx", &flags);
2265
2266
if (num < 1)
2267
return count;
2268
2269
if (dvobj->tx_aclt_flags == flags)
2270
return count;
2271
2272
dvobj->tx_aclt_flags = flags;
2273
2274
rtw_run_in_thread_cmd(adapter, ((void *)(rtw_hal_update_tx_aclt)), adapter);
2275
}
2276
2277
return count;
2278
}
2279
2280
static int proc_get_tx_aclt_confs(struct seq_file *m, void *v)
2281
{
2282
struct net_device *dev = m->private;
2283
_adapter *adapter = rtw_netdev_priv(dev);
2284
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2285
2286
RTW_PRINT_SEL(m, "flags:0x%02x\n", dvobj->tx_aclt_flags);
2287
dump_tx_aclt_confs(m, dvobj);
2288
2289
return 0;
2290
}
2291
2292
static ssize_t proc_set_tx_aclt_confs(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2293
{
2294
struct net_device *dev = data;
2295
_adapter *adapter = rtw_netdev_priv(dev);
2296
char tmp[32] = {0};
2297
2298
if (count > sizeof(tmp)) {
2299
rtw_warn_on(1);
2300
return -EFAULT;
2301
}
2302
2303
if (buffer && !copy_from_user(tmp, buffer, count)) {
2304
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2305
u8 id;
2306
struct tx_aclt_conf_t input;
2307
int num = sscanf(tmp, "%hhu %hhx %u %u", &id, &input.en, &input.vo_vi, &input.be_bk);
2308
2309
if (num < 2)
2310
return count;
2311
2312
rtw_hal_set_tx_aclt_conf(adapter, id, &input, num - 1);
2313
rtw_run_in_thread_cmd(adapter, ((void *)(rtw_hal_update_tx_aclt)), adapter);
2314
}
2315
2316
return count;
2317
}
2318
#endif /* CONFIG_TX_AC_LIFETIME */
2319
2320
static int proc_get_tx_bw_mode(struct seq_file *m, void *v)
2321
{
2322
struct net_device *dev = m->private;
2323
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2324
2325
RTW_PRINT_SEL(m, "0x%02x\n", adapter->driver_tx_bw_mode);
2326
RTW_PRINT_SEL(m, "2.4G:%s\n", ch_width_str(ADAPTER_TX_BW_2G(adapter)));
2327
RTW_PRINT_SEL(m, "5G:%s\n", ch_width_str(ADAPTER_TX_BW_5G(adapter)));
2328
2329
return 0;
2330
}
2331
2332
static void rtw_set_tx_bw_mode(struct _ADAPTER *adapter, u8 bw_mode)
2333
{
2334
struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);
2335
struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl;
2336
u8 update = _FALSE;
2337
2338
if ((MLME_STATE(adapter) & WIFI_ASOC_STATE)
2339
&& ((mlmeext->cur_channel <= 14 && BW_MODE_2G(bw_mode) != ADAPTER_TX_BW_2G(adapter))
2340
|| (mlmeext->cur_channel >= 36 && BW_MODE_5G(bw_mode) != ADAPTER_TX_BW_5G(adapter)))
2341
) {
2342
/* RA mask update needed */
2343
update = _TRUE;
2344
}
2345
adapter->driver_tx_bw_mode = bw_mode;
2346
2347
if (update == _TRUE) {
2348
struct sta_info *sta;
2349
int i;
2350
2351
for (i = 0; i < MACID_NUM_SW_LIMIT; i++) {
2352
sta = macid_ctl->sta[i];
2353
if (sta && !is_broadcast_mac_addr(sta->cmn.mac_addr))
2354
rtw_dm_ra_mask_wk_cmd(adapter, (u8 *)sta);
2355
}
2356
}
2357
}
2358
2359
static ssize_t proc_set_tx_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2360
{
2361
struct net_device *dev = data;
2362
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2363
char tmp[32];
2364
u8 bw_mode;
2365
2366
if (count < 1)
2367
return -EFAULT;
2368
2369
if (count > sizeof(tmp)) {
2370
rtw_warn_on(1);
2371
return -EFAULT;
2372
}
2373
2374
if (buffer && !copy_from_user(tmp, buffer, count)) {
2375
2376
int num = sscanf(tmp, "%hhx", &bw_mode);
2377
2378
if (num < 1 || bw_mode == adapter->driver_tx_bw_mode)
2379
goto exit;
2380
2381
rtw_set_tx_bw_mode(adapter, bw_mode);
2382
}
2383
2384
exit:
2385
return count;
2386
}
2387
2388
static int proc_get_hal_txpwr_info(struct seq_file *m, void *v)
2389
{
2390
#ifndef CONFIG_USE_TSSI
2391
struct net_device *dev = m->private;
2392
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2393
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
2394
struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
2395
2396
if (hal_is_band_support(adapter, BAND_ON_2_4G))
2397
dump_hal_txpwr_info_2g(m, adapter, hal_spec->rfpath_num_2g, hal_data->max_tx_cnt);
2398
2399
#ifdef CONFIG_IEEE80211_BAND_5GHZ
2400
if (hal_is_band_support(adapter, BAND_ON_5G))
2401
dump_hal_txpwr_info_5g(m, adapter, hal_spec->rfpath_num_5g, hal_data->max_tx_cnt);
2402
#endif
2403
#endif
2404
return 0;
2405
}
2406
2407
static int proc_get_target_tx_power(struct seq_file *m, void *v)
2408
{
2409
struct net_device *dev = m->private;
2410
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2411
2412
dump_target_tx_power(m, adapter);
2413
2414
return 0;
2415
}
2416
2417
static int proc_get_tx_power_by_rate(struct seq_file *m, void *v)
2418
{
2419
struct net_device *dev = m->private;
2420
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2421
2422
dump_tx_power_by_rate(m, adapter);
2423
2424
return 0;
2425
}
2426
2427
#if CONFIG_TXPWR_LIMIT
2428
static int proc_get_tx_power_limit(struct seq_file *m, void *v)
2429
{
2430
struct net_device *dev = m->private;
2431
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2432
2433
dump_txpwr_lmt(m, adapter);
2434
2435
return 0;
2436
}
2437
#endif /* CONFIG_TXPWR_LIMIT */
2438
2439
static int proc_get_tx_power_ext_info(struct seq_file *m, void *v)
2440
{
2441
struct net_device *dev = m->private;
2442
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2443
2444
dump_tx_power_ext_info(m, adapter);
2445
2446
return 0;
2447
}
2448
2449
static ssize_t proc_set_tx_power_ext_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2450
{
2451
struct net_device *dev = data;
2452
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2453
2454
char tmp[32] = {0};
2455
char cmd[16] = {0};
2456
2457
if (count > sizeof(tmp)) {
2458
rtw_warn_on(1);
2459
return -EFAULT;
2460
}
2461
2462
if (buffer && !copy_from_user(tmp, buffer, count)) {
2463
2464
int num = sscanf(tmp, "%s", cmd);
2465
2466
if (num < 1)
2467
return count;
2468
2469
#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
2470
phy_free_filebuf_mask(adapter, LOAD_BB_PG_PARA_FILE | LOAD_RF_TXPWR_LMT_PARA_FILE);
2471
#endif
2472
2473
rtw_ps_deny(adapter, PS_DENY_IOCTL);
2474
if (rtw_pwr_wakeup(adapter) == _FALSE)
2475
goto clear_ps_deny;
2476
2477
if (strcmp("default", cmd) == 0)
2478
rtw_run_in_thread_cmd(adapter, ((void *)(phy_reload_default_tx_power_ext_info)), adapter);
2479
else
2480
rtw_run_in_thread_cmd(adapter, ((void *)(phy_reload_tx_power_ext_info)), adapter);
2481
2482
clear_ps_deny:
2483
rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
2484
}
2485
2486
return count;
2487
}
2488
2489
static void *proc_start_tx_power_idx(struct seq_file *m, loff_t *pos)
2490
{
2491
u8 path = ((*pos) & 0xFF00) >> 8;
2492
2493
if (path >= RF_PATH_MAX)
2494
return NULL;
2495
2496
return pos;
2497
}
2498
static void proc_stop_tx_power_idx(struct seq_file *m, void *v)
2499
{
2500
}
2501
2502
static void *proc_next_tx_power_idx(struct seq_file *m, void *v, loff_t *pos)
2503
{
2504
u8 path = ((*pos) & 0xFF00) >> 8;
2505
u8 rs = *pos & 0xFF;
2506
2507
rs++;
2508
if (rs >= RATE_SECTION_NUM) {
2509
rs = 0;
2510
path++;
2511
}
2512
2513
if (path >= RF_PATH_MAX)
2514
return NULL;
2515
2516
*pos = (path << 8) | rs;
2517
2518
return pos;
2519
}
2520
2521
static int proc_get_tx_power_idx(struct seq_file *m, void *v)
2522
{
2523
struct net_device *dev = m->private;
2524
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2525
u32 pos = *((loff_t *)(v));
2526
u8 path = (pos & 0xFF00) >> 8;
2527
u8 rs = pos & 0xFF;
2528
2529
if (0)
2530
RTW_INFO("%s path=%u, rs=%u\n", __func__, path, rs);
2531
2532
if (path == RF_PATH_A && rs == CCK)
2533
dump_tx_power_idx_title(m, adapter);
2534
dump_tx_power_idx_by_path_rs(m, adapter, path, rs);
2535
2536
return 0;
2537
}
2538
2539
static struct seq_operations seq_ops_tx_power_idx = {
2540
.start = proc_start_tx_power_idx,
2541
.stop = proc_stop_tx_power_idx,
2542
.next = proc_next_tx_power_idx,
2543
.show = proc_get_tx_power_idx,
2544
};
2545
2546
#ifdef CONFIG_RF_POWER_TRIM
2547
static int proc_get_kfree_flag(struct seq_file *m, void *v)
2548
{
2549
struct net_device *dev = m->private;
2550
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2551
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2552
2553
RTW_PRINT_SEL(m, "0x%02x\n", kfree_data->flag);
2554
2555
return 0;
2556
}
2557
2558
static ssize_t proc_set_kfree_flag(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2559
{
2560
struct net_device *dev = data;
2561
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2562
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2563
char tmp[32] = {0};
2564
u8 flag;
2565
2566
if (count > sizeof(tmp)) {
2567
rtw_warn_on(1);
2568
return -EFAULT;
2569
}
2570
2571
if (buffer && !copy_from_user(tmp, buffer, count)) {
2572
2573
int num = sscanf(tmp, "%hhx", &flag);
2574
2575
if (num < 1)
2576
return count;
2577
2578
kfree_data->flag = flag;
2579
}
2580
2581
return count;
2582
}
2583
2584
static int proc_get_kfree_bb_gain(struct seq_file *m, void *v)
2585
{
2586
struct net_device *dev = m->private;
2587
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2588
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
2589
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2590
u8 i, j;
2591
2592
for (i = 0; i < BB_GAIN_NUM; i++) {
2593
2594
if (i == 0)
2595
_RTW_PRINT_SEL(m, "2G: ");
2596
#ifdef CONFIG_IEEE80211_BAND_5GHZ
2597
switch (i) {
2598
case 1:
2599
_RTW_PRINT_SEL(m, "5GLB1: ");
2600
break;
2601
case 2:
2602
_RTW_PRINT_SEL(m, "5GLB2: ");
2603
break;
2604
case 3:
2605
_RTW_PRINT_SEL(m, "5GMB1: ");
2606
break;
2607
case 4:
2608
_RTW_PRINT_SEL(m, "5GMB2: ");
2609
break;
2610
case 5:
2611
_RTW_PRINT_SEL(m, "5GHB: ");
2612
break;
2613
}
2614
#endif
2615
for (j = 0; j < hal_data->NumTotalRFPath; j++)
2616
_RTW_PRINT_SEL(m, "%d ", kfree_data->bb_gain[i][j]);
2617
_RTW_PRINT_SEL(m, "\n");
2618
}
2619
2620
return 0;
2621
}
2622
2623
static ssize_t proc_set_kfree_bb_gain(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2624
{
2625
struct net_device *dev = data;
2626
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2627
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2628
char tmp[BB_GAIN_NUM * RF_PATH_MAX] = {0};
2629
u8 chidx;
2630
s8 bb_gain[BB_GAIN_NUM];
2631
char ch_band_Group[6];
2632
2633
if (count > sizeof(tmp)) {
2634
rtw_warn_on(1);
2635
return -EFAULT;
2636
}
2637
2638
if (buffer && !copy_from_user(tmp, buffer, count)) {
2639
char *c, *next;
2640
int i = 0;
2641
2642
next = tmp;
2643
c = strsep(&next, " \t");
2644
2645
if (sscanf(c, "%s", ch_band_Group) != 1) {
2646
RTW_INFO("Error Head Format, channel Group select\n,Please input:\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\n");
2647
return count;
2648
}
2649
if (strcmp("2G", ch_band_Group) == 0)
2650
chidx = BB_GAIN_2G;
2651
#ifdef CONFIG_IEEE80211_BAND_5GHZ
2652
else if (strcmp("5GLB1", ch_band_Group) == 0)
2653
chidx = BB_GAIN_5GLB1;
2654
else if (strcmp("5GLB2", ch_band_Group) == 0)
2655
chidx = BB_GAIN_5GLB2;
2656
else if (strcmp("5GMB1", ch_band_Group) == 0)
2657
chidx = BB_GAIN_5GMB1;
2658
else if (strcmp("5GMB2", ch_band_Group) == 0)
2659
chidx = BB_GAIN_5GMB2;
2660
else if (strcmp("5GHB", ch_band_Group) == 0)
2661
chidx = BB_GAIN_5GHB;
2662
#endif /*CONFIG_IEEE80211_BAND_5GHZ*/
2663
else {
2664
RTW_INFO("Error Head Format, channel Group select\n,Please input:\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\n");
2665
return count;
2666
}
2667
c = strsep(&next, " \t");
2668
2669
while (c != NULL) {
2670
if (sscanf(c, "%hhx", &bb_gain[i]) != 1)
2671
break;
2672
2673
kfree_data->bb_gain[chidx][i] = bb_gain[i];
2674
RTW_INFO("%s,kfree_data->bb_gain[%d][%d]=%x\n", __func__, chidx, i, kfree_data->bb_gain[chidx][i]);
2675
2676
c = strsep(&next, " \t");
2677
i++;
2678
}
2679
2680
}
2681
2682
return count;
2683
2684
}
2685
2686
static int proc_get_kfree_thermal(struct seq_file *m, void *v)
2687
{
2688
struct net_device *dev = m->private;
2689
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2690
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2691
2692
_RTW_PRINT_SEL(m, "%d\n", kfree_data->thermal);
2693
2694
return 0;
2695
}
2696
2697
static ssize_t proc_set_kfree_thermal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2698
{
2699
struct net_device *dev = data;
2700
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
2701
struct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);
2702
char tmp[32] = {0};
2703
s8 thermal;
2704
2705
if (count > sizeof(tmp)) {
2706
rtw_warn_on(1);
2707
return -EFAULT;
2708
}
2709
2710
if (buffer && !copy_from_user(tmp, buffer, count)) {
2711
2712
int num = sscanf(tmp, "%hhd", &thermal);
2713
2714
if (num < 1)
2715
return count;
2716
2717
kfree_data->thermal = thermal;
2718
}
2719
2720
return count;
2721
}
2722
2723
static ssize_t proc_set_tx_gain_offset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2724
{
2725
struct net_device *dev = data;
2726
_adapter *adapter;
2727
char tmp[32] = {0};
2728
u8 rf_path;
2729
s8 offset;
2730
2731
adapter = (_adapter *)rtw_netdev_priv(dev);
2732
if (!adapter)
2733
return -EFAULT;
2734
2735
if (count > sizeof(tmp)) {
2736
rtw_warn_on(1);
2737
return -EFAULT;
2738
}
2739
2740
if (buffer && !copy_from_user(tmp, buffer, count)) {
2741
int num = sscanf(tmp, "%hhu %hhd", &rf_path, &offset);
2742
2743
if (num < 2)
2744
return count;
2745
2746
RTW_INFO("write rf_path:%u tx gain offset:%d\n", rf_path, offset);
2747
rtw_rf_set_tx_gain_offset(adapter, rf_path, offset);
2748
}
2749
2750
return count;
2751
}
2752
#endif /* CONFIG_RF_POWER_TRIM */
2753
2754
#ifdef CONFIG_BT_COEXIST
2755
ssize_t proc_set_btinfo_evt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2756
{
2757
struct net_device *dev = data;
2758
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
2759
char tmp[32];
2760
u8 btinfo[8];
2761
2762
if (count < 6)
2763
return -EFAULT;
2764
2765
if (count > sizeof(tmp)) {
2766
rtw_warn_on(1);
2767
return -EFAULT;
2768
}
2769
2770
if (buffer && !copy_from_user(tmp, buffer, count)) {
2771
int num = 0;
2772
2773
_rtw_memset(btinfo, 0, 8);
2774
2775
num = sscanf(tmp, "%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx"
2776
, &btinfo[0], &btinfo[1], &btinfo[2], &btinfo[3]
2777
, &btinfo[4], &btinfo[5], &btinfo[6], &btinfo[7]);
2778
2779
if (num < 6)
2780
return -EINVAL;
2781
2782
btinfo[1] = num - 2;
2783
2784
rtw_btinfo_cmd(padapter, btinfo, btinfo[1] + 2);
2785
}
2786
2787
return count;
2788
}
2789
2790
static u8 btreg_read_type = 0;
2791
static u16 btreg_read_addr = 0;
2792
static int btreg_read_error = 0;
2793
static u8 btreg_write_type = 0;
2794
static u16 btreg_write_addr = 0;
2795
static int btreg_write_error = 0;
2796
2797
static u8 *btreg_type[] = {
2798
"rf",
2799
"modem",
2800
"bluewize",
2801
"vendor",
2802
"le"
2803
};
2804
2805
static int btreg_parse_str(char const *input, u8 *type, u16 *addr, u16 *val)
2806
{
2807
u32 num;
2808
u8 str[80] = {0};
2809
u8 t = 0;
2810
u32 a, v;
2811
u8 i, n;
2812
2813
2814
num = sscanf(input, "%s %x %x", str, &a, &v);
2815
if (num < 2) {
2816
RTW_INFO("%s: INVALID input!(%s)\n", __FUNCTION__, input);
2817
return -EINVAL;
2818
}
2819
if ((num < 3) && val) {
2820
RTW_INFO("%s: INVALID input!(%s)\n", __FUNCTION__, input);
2821
return -EINVAL;
2822
}
2823
2824
n = sizeof(btreg_type) / sizeof(btreg_type[0]);
2825
for (i = 0; i < n; i++) {
2826
if (!strcasecmp(str, btreg_type[i])) {
2827
t = i;
2828
break;
2829
}
2830
}
2831
if (i == n) {
2832
RTW_INFO("%s: unknown type(%s)!\n", __FUNCTION__, str);
2833
return -EINVAL;
2834
}
2835
2836
switch (t) {
2837
case 0:
2838
/* RF */
2839
if (a & 0xFFFFFF80) {
2840
RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
2841
__FUNCTION__, a, btreg_type[t], t);
2842
return -EINVAL;
2843
}
2844
break;
2845
case 1:
2846
/* Modem */
2847
if (a & 0xFFFFFE00) {
2848
RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
2849
__FUNCTION__, a, btreg_type[t], t);
2850
return -EINVAL;
2851
}
2852
break;
2853
default:
2854
/* Others(Bluewize, Vendor, LE) */
2855
if (a & 0xFFFFF000) {
2856
RTW_INFO("%s: INVALID address(0x%X) for type %s(%d)!\n",
2857
__FUNCTION__, a, btreg_type[t], t);
2858
return -EINVAL;
2859
}
2860
break;
2861
}
2862
2863
if (val) {
2864
if (v & 0xFFFF0000) {
2865
RTW_INFO("%s: INVALID value(0x%x)!\n", __FUNCTION__, v);
2866
return -EINVAL;
2867
}
2868
*val = (u16)v;
2869
}
2870
2871
*type = (u8)t;
2872
*addr = (u16)a;
2873
2874
return 0;
2875
}
2876
2877
int proc_get_btreg_read(struct seq_file *m, void *v)
2878
{
2879
struct net_device *dev;
2880
PADAPTER padapter;
2881
u16 ret;
2882
u32 data;
2883
2884
2885
if (btreg_read_error)
2886
return btreg_read_error;
2887
2888
dev = m->private;
2889
padapter = (PADAPTER)rtw_netdev_priv(dev);
2890
2891
ret = rtw_btcoex_btreg_read(padapter, btreg_read_type, btreg_read_addr, &data);
2892
if (CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
2893
RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X = 0x%08x\n", btreg_type[btreg_read_type], btreg_read_addr, data);
2894
else
2895
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);
2896
2897
return 0;
2898
}
2899
2900
ssize_t proc_set_btreg_read(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2901
{
2902
struct net_device *dev = data;
2903
PADAPTER padapter;
2904
u8 tmp[80] = {0};
2905
u32 num;
2906
int err;
2907
2908
2909
padapter = (PADAPTER)rtw_netdev_priv(dev);
2910
2911
if (NULL == buffer) {
2912
RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
2913
FUNC_ADPT_ARG(padapter));
2914
err = -EFAULT;
2915
goto exit;
2916
}
2917
2918
if (count < 1) {
2919
RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
2920
FUNC_ADPT_ARG(padapter));
2921
err = -EFAULT;
2922
goto exit;
2923
}
2924
2925
num = count;
2926
if (num > (sizeof(tmp) - 1))
2927
num = (sizeof(tmp) - 1);
2928
2929
if (copy_from_user(tmp, buffer, num)) {
2930
RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
2931
FUNC_ADPT_ARG(padapter));
2932
err = -EFAULT;
2933
goto exit;
2934
}
2935
/* [Coverity] sure tmp end with '\0'(string terminal) */
2936
tmp[sizeof(tmp) - 1] = 0;
2937
2938
err = btreg_parse_str(tmp, &btreg_read_type, &btreg_read_addr, NULL);
2939
if (err)
2940
goto exit;
2941
2942
RTW_INFO(FUNC_ADPT_FMT ": addr=(%s)0x%X\n",
2943
FUNC_ADPT_ARG(padapter), btreg_type[btreg_read_type], btreg_read_addr);
2944
2945
exit:
2946
btreg_read_error = err;
2947
2948
return count;
2949
}
2950
2951
int proc_get_btreg_write(struct seq_file *m, void *v)
2952
{
2953
struct net_device *dev;
2954
PADAPTER padapter;
2955
u16 ret;
2956
u32 data;
2957
2958
2959
if (btreg_write_error < 0)
2960
return btreg_write_error;
2961
else if (btreg_write_error > 0) {
2962
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);
2963
return 0;
2964
}
2965
2966
dev = m->private;
2967
padapter = (PADAPTER)rtw_netdev_priv(dev);
2968
2969
ret = rtw_btcoex_btreg_read(padapter, btreg_write_type, btreg_write_addr, &data);
2970
if (CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
2971
RTW_PRINT_SEL(m, "BTREG read: (%s)0x%04X = 0x%08x\n", btreg_type[btreg_write_type], btreg_write_addr, data);
2972
else
2973
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);
2974
2975
return 0;
2976
}
2977
2978
ssize_t proc_set_btreg_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
2979
{
2980
struct net_device *dev = data;
2981
PADAPTER padapter;
2982
u8 tmp[80] = {0};
2983
u32 num;
2984
u16 val;
2985
u16 ret;
2986
int err;
2987
2988
2989
padapter = (PADAPTER)rtw_netdev_priv(dev);
2990
2991
if (NULL == buffer) {
2992
RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
2993
FUNC_ADPT_ARG(padapter));
2994
err = -EFAULT;
2995
goto exit;
2996
}
2997
2998
if (count < 1) {
2999
RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
3000
FUNC_ADPT_ARG(padapter));
3001
err = -EFAULT;
3002
goto exit;
3003
}
3004
3005
num = count;
3006
if (num > (sizeof(tmp) - 1))
3007
num = (sizeof(tmp) - 1);
3008
3009
if (copy_from_user(tmp, buffer, num)) {
3010
RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
3011
FUNC_ADPT_ARG(padapter));
3012
err = -EFAULT;
3013
goto exit;
3014
}
3015
3016
err = btreg_parse_str(tmp, &btreg_write_type, &btreg_write_addr, &val);
3017
if (err)
3018
goto exit;
3019
3020
RTW_INFO(FUNC_ADPT_FMT ": Set (%s)0x%X = 0x%x\n",
3021
FUNC_ADPT_ARG(padapter), btreg_type[btreg_write_type], btreg_write_addr, val);
3022
3023
ret = rtw_btcoex_btreg_write(padapter, btreg_write_type, btreg_write_addr, val);
3024
if (!CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS))
3025
err = ret;
3026
3027
exit:
3028
btreg_write_error = err;
3029
3030
return count;
3031
}
3032
3033
int proc_get_btc_reduce_wl_txpwr(struct seq_file *m, void *v)
3034
{
3035
struct net_device *dev;
3036
PADAPTER padapter;
3037
u8 data;
3038
3039
dev = m->private;
3040
padapter = (PADAPTER)rtw_netdev_priv(dev);
3041
3042
data = rtw_btcoex_get_reduce_wl_txpwr(padapter);
3043
RTW_PRINT_SEL(m, "BTC reduce WL TxPwr = %d dB\n", data);
3044
3045
return 0;
3046
}
3047
3048
ssize_t proc_set_btc_reduce_wl_txpwr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3049
{
3050
struct net_device *dev = data;
3051
PADAPTER padapter;
3052
HAL_DATA_TYPE *hal_data;
3053
u8 tmp[80] = {0};
3054
u32 val = 0;
3055
u32 num;
3056
3057
padapter = (PADAPTER)rtw_netdev_priv(dev);
3058
hal_data = GET_HAL_DATA(padapter);
3059
3060
/* RTW_INFO("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); */
3061
3062
if (NULL == buffer) {
3063
RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
3064
FUNC_ADPT_ARG(padapter));
3065
3066
return -EFAULT;
3067
}
3068
3069
if (count < 1) {
3070
RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
3071
FUNC_ADPT_ARG(padapter));
3072
3073
return -EFAULT;
3074
}
3075
3076
num = count;
3077
if (num > (sizeof(tmp) - 1))
3078
num = (sizeof(tmp) - 1);
3079
3080
if (copy_from_user(tmp, buffer, num)) {
3081
RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
3082
FUNC_ADPT_ARG(padapter));
3083
3084
return -EFAULT;
3085
}
3086
3087
num = sscanf(tmp, "%d", &val);
3088
3089
if ((IS_HARDWARE_TYPE_8822C(padapter)) && (hal_data->EEPROMBluetoothCoexist == _TRUE))
3090
rtw_btc_reduce_wl_txpwr_cmd(padapter, val);
3091
3092
return count;
3093
}
3094
3095
#endif /* CONFIG_BT_COEXIST */
3096
3097
#ifdef CONFIG_MBSSID_CAM
3098
int proc_get_mbid_cam_cache(struct seq_file *m, void *v)
3099
{
3100
struct net_device *dev = m->private;
3101
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3102
3103
rtw_mbid_cam_cache_dump(m, __func__, adapter);
3104
rtw_mbid_cam_dump(m, __func__, adapter);
3105
return 0;
3106
}
3107
#endif /* CONFIG_MBSSID_CAM */
3108
3109
int proc_get_mac_addr(struct seq_file *m, void *v)
3110
{
3111
struct net_device *dev = m->private;
3112
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3113
3114
rtw_hal_dump_macaddr(m, adapter);
3115
return 0;
3116
}
3117
3118
static int proc_get_skip_band(struct seq_file *m, void *v)
3119
{
3120
struct net_device *dev = m->private;
3121
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3122
int bandskip;
3123
3124
bandskip = RTW_GET_SCAN_BAND_SKIP(adapter);
3125
RTW_PRINT_SEL(m, "bandskip:0x%02x\n", bandskip);
3126
return 0;
3127
}
3128
3129
static ssize_t proc_set_skip_band(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3130
{
3131
struct net_device *dev = data;
3132
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3133
char tmp[6];
3134
u8 skip_band;
3135
3136
if (count < 1)
3137
return -EFAULT;
3138
3139
if (count > sizeof(tmp)) {
3140
rtw_warn_on(1);
3141
return -EFAULT;
3142
}
3143
if (buffer && !copy_from_user(tmp, buffer, count)) {
3144
3145
int num = sscanf(tmp, "%hhu", &skip_band);
3146
3147
if (num < 1)
3148
return -EINVAL;
3149
3150
if (1 == skip_band)
3151
RTW_SET_SCAN_BAND_SKIP(padapter, BAND_24G);
3152
else if (2 == skip_band)
3153
RTW_SET_SCAN_BAND_SKIP(padapter, BAND_5G);
3154
else if (3 == skip_band)
3155
RTW_CLR_SCAN_BAND_SKIP(padapter, BAND_24G);
3156
else if (4 == skip_band)
3157
RTW_CLR_SCAN_BAND_SKIP(padapter, BAND_5G);
3158
}
3159
return count;
3160
3161
}
3162
3163
#ifdef CONFIG_RTW_ACS
3164
static int proc_get_chan_info(struct seq_file *m, void *v)
3165
{
3166
struct net_device *dev = m->private;
3167
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3168
3169
rtw_acs_chan_info_dump(m, adapter);
3170
return 0;
3171
}
3172
3173
static int proc_get_best_chan(struct seq_file *m, void *v)
3174
{
3175
struct net_device *dev = m->private;
3176
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3177
3178
if (IS_ACS_ENABLE(adapter))
3179
rtw_acs_info_dump(m, adapter);
3180
else
3181
_RTW_PRINT_SEL(m,"ACS disabled\n");
3182
return 0;
3183
}
3184
3185
static ssize_t proc_set_acs(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3186
{
3187
#ifdef CONFIG_RTW_ACS_DBG
3188
struct net_device *dev = data;
3189
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3190
char tmp[32];
3191
u8 acs_state = 0;
3192
u16 scan_ch_ms= 0, acs_scan_ch_ms = 0;
3193
u8 scan_type = SCAN_ACTIVE, igi= 0, bw = 0;
3194
u8 acs_scan_type = SCAN_ACTIVE, acs_igi= 0, acs_bw = 0;
3195
3196
if (count < 1)
3197
return -EFAULT;
3198
3199
if (count > sizeof(tmp)) {
3200
rtw_warn_on(1);
3201
return -EFAULT;
3202
}
3203
if (buffer && !copy_from_user(tmp, buffer, count)) {
3204
3205
int num = sscanf(tmp, "%hhu %hhu %hu %hhx %hhu",
3206
&acs_state, &scan_type, &scan_ch_ms, &igi, &bw);
3207
3208
if (num < 1)
3209
return -EINVAL;
3210
3211
if (acs_state)
3212
rtw_acs_start(padapter);
3213
else
3214
rtw_acs_stop(padapter);
3215
num = num -1;
3216
3217
if(num) {
3218
if (num-- > 0)
3219
acs_scan_type = scan_type;
3220
if (num-- > 0)
3221
acs_scan_ch_ms = scan_ch_ms;
3222
if (num-- > 0)
3223
acs_igi = igi;
3224
if (num-- > 0)
3225
acs_bw = bw;
3226
rtw_acs_adv_setting(padapter, acs_scan_type, acs_scan_ch_ms, acs_igi, acs_bw);
3227
}
3228
}
3229
#endif /*CONFIG_RTW_ACS_DBG*/
3230
return count;
3231
}
3232
#endif /*CONFIG_RTW_ACS*/
3233
3234
#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
3235
static int proc_get_nm(struct seq_file *m, void *v)
3236
{
3237
struct net_device *dev = m->private;
3238
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3239
3240
rtw_noise_info_dump(m, adapter);
3241
return 0;
3242
}
3243
3244
static ssize_t proc_set_nm(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3245
{
3246
struct net_device *dev = data;
3247
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3248
char tmp[32];
3249
u8 nm_state = 0;
3250
3251
if (count < 1)
3252
return -EFAULT;
3253
3254
if (count > sizeof(tmp)) {
3255
rtw_warn_on(1);
3256
return -EFAULT;
3257
}
3258
if (buffer && !copy_from_user(tmp, buffer, count)) {
3259
3260
int num = sscanf(tmp, "%hhu", &nm_state);
3261
3262
if (num < 1)
3263
return -EINVAL;
3264
3265
if (nm_state)
3266
rtw_nm_enable(padapter);
3267
else
3268
rtw_nm_disable(padapter);
3269
3270
}
3271
return count;
3272
}
3273
#endif /*CONFIG_RTW_ACS*/
3274
3275
static int proc_get_hal_spec(struct seq_file *m, void *v)
3276
{
3277
struct net_device *dev = m->private;
3278
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3279
3280
dump_hal_spec(m, adapter);
3281
return 0;
3282
}
3283
3284
static int proc_get_hal_trx_mode(struct seq_file *m, void *v)
3285
{
3286
struct net_device *dev = m->private;
3287
_adapter *adapter = rtw_netdev_priv(dev);
3288
3289
dump_hal_trx_mode(m, adapter);
3290
return 0;
3291
}
3292
3293
static int proc_get_phy_cap(struct seq_file *m, void *v)
3294
{
3295
struct net_device *dev = m->private;
3296
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3297
3298
rtw_dump_phy_cap(m, adapter);
3299
#ifdef CONFIG_80211N_HT
3300
rtw_dump_drv_phy_cap(m, adapter);
3301
rtw_get_dft_phy_cap(m, adapter);
3302
#endif /* CONFIG_80211N_HT */
3303
return 0;
3304
}
3305
3306
#ifdef CONFIG_SUPPORT_TRX_SHARED
3307
#include "../../hal/hal_halmac.h"
3308
static int proc_get_trx_share_mode(struct seq_file *m, void *v)
3309
{
3310
struct net_device *dev = m->private;
3311
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3312
3313
dump_trx_share_mode(m, adapter);
3314
return 0;
3315
}
3316
#endif
3317
3318
static int proc_dump_rsvd_page(struct seq_file *m, void *v)
3319
{
3320
struct net_device *dev = m->private;
3321
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3322
3323
rtw_dump_rsvd_page(m, adapter, adapter->rsvd_page_offset, adapter->rsvd_page_num);
3324
return 0;
3325
}
3326
static ssize_t proc_set_rsvd_page_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3327
{
3328
struct net_device *dev = data;
3329
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3330
char tmp[32];
3331
u8 page_offset, page_num;
3332
3333
if (count < 2)
3334
return -EFAULT;
3335
3336
if (count > sizeof(tmp)) {
3337
rtw_warn_on(1);
3338
return -EFAULT;
3339
}
3340
if (buffer && !copy_from_user(tmp, buffer, count)) {
3341
3342
int num = sscanf(tmp, "%hhu %hhu", &page_offset, &page_num);
3343
3344
if (num < 2)
3345
return -EINVAL;
3346
padapter->rsvd_page_offset = page_offset;
3347
padapter->rsvd_page_num = page_num;
3348
}
3349
return count;
3350
}
3351
3352
#ifdef CONFIG_SUPPORT_FIFO_DUMP
3353
static int proc_dump_fifo(struct seq_file *m, void *v)
3354
{
3355
struct net_device *dev = m->private;
3356
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3357
3358
rtw_dump_fifo(m, adapter, adapter->fifo_sel, adapter->fifo_addr, adapter->fifo_size);
3359
return 0;
3360
}
3361
static ssize_t proc_set_fifo_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3362
{
3363
struct net_device *dev = data;
3364
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3365
char tmp[32];
3366
u8 fifo_sel = 0;
3367
u32 fifo_addr = 0;
3368
u32 fifo_size = 0;
3369
3370
if (count < 3)
3371
return -EFAULT;
3372
3373
if (count > sizeof(tmp)) {
3374
rtw_warn_on(1);
3375
return -EFAULT;
3376
}
3377
if (buffer && !copy_from_user(tmp, buffer, count)) {
3378
3379
int num = sscanf(tmp, "%hhu %x %d", &fifo_sel, &fifo_addr, &fifo_size);
3380
3381
if (num < 3)
3382
return -EINVAL;
3383
3384
padapter->fifo_sel = fifo_sel;
3385
padapter->fifo_addr = fifo_addr;
3386
padapter->fifo_size = fifo_size;
3387
}
3388
return count;
3389
}
3390
#endif
3391
3392
#ifdef CONFIG_WOW_PATTERN_HW_CAM
3393
int proc_dump_pattern_cam(struct seq_file *m, void *v)
3394
{
3395
struct net_device *dev = m->private;
3396
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3397
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
3398
int i;
3399
struct rtl_wow_pattern context;
3400
3401
for (i = 0 ; i < pwrpriv->wowlan_pattern_idx; i++) {
3402
rtw_wow_pattern_read_cam_ent(padapter, i, &context);
3403
rtw_dump_wow_pattern(m, &context, i);
3404
}
3405
3406
return 0;
3407
}
3408
#endif
3409
3410
static int proc_get_napi_info(struct seq_file *m, void *v)
3411
{
3412
struct net_device *dev = m->private;
3413
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3414
struct registry_priv *pregistrypriv = &adapter->registrypriv;
3415
u8 napi = 0, gro = 0;
3416
u32 weight = 0;
3417
struct dvobj_priv *d;
3418
d = adapter_to_dvobj(adapter);
3419
3420
3421
#ifdef CONFIG_RTW_NAPI
3422
if (pregistrypriv->en_napi) {
3423
napi = 1;
3424
weight = RTL_NAPI_WEIGHT;
3425
}
3426
3427
#ifdef CONFIG_RTW_GRO
3428
if (pregistrypriv->en_gro)
3429
gro = 1;
3430
#endif /* CONFIG_RTW_GRO */
3431
#endif /* CONFIG_RTW_NAPI */
3432
3433
if (napi) {
3434
RTW_PRINT_SEL(m, "NAPI enable, weight=%d\n", weight);
3435
#ifdef CONFIG_RTW_NAPI_DYNAMIC
3436
RTW_PRINT_SEL(m, "Dynamaic NAPI mechanism is on, current NAPI %s\n",
3437
d->en_napi_dynamic ? "enable" : "disable");
3438
RTW_PRINT_SEL(m, "Dynamaic NAPI info:\n"
3439
"\ttcp_rx_threshold = %d Mbps\n"
3440
"\tcur_rx_tp = %d Mbps\n",
3441
pregistrypriv->napi_threshold,
3442
d->traffic_stat.cur_rx_tp);
3443
#endif /* CONFIG_RTW_NAPI_DYNAMIC */
3444
} else {
3445
RTW_PRINT_SEL(m, "NAPI disable\n");
3446
}
3447
RTW_PRINT_SEL(m, "GRO %s\n", gro?"enable":"disable");
3448
3449
return 0;
3450
3451
}
3452
3453
#ifdef CONFIG_RTW_NAPI_DYNAMIC
3454
static ssize_t proc_set_napi_th(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3455
{
3456
struct net_device *dev = data;
3457
struct _ADAPTER *adapter = (struct _ADAPTER *)rtw_netdev_priv(dev);
3458
struct registry_priv *registry = &adapter->registrypriv;
3459
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
3460
PADAPTER iface = NULL;
3461
char tmp[32] = {0};
3462
int thrshld = 0;
3463
int num = 0, i = 0;
3464
3465
3466
if (count < 1)
3467
return -EFAULT;
3468
3469
if (count > sizeof(tmp)) {
3470
rtw_warn_on(1);
3471
return -EFAULT;
3472
}
3473
3474
RTW_INFO("%s: Last threshold = %d Mbps\n", __FUNCTION__, registry->napi_threshold);
3475
3476
3477
for (i = 0; i < dvobj->iface_nums; i++) {
3478
iface = dvobj->padapters[i];
3479
if (iface) {
3480
if (buffer && !copy_from_user(tmp, buffer, count)) {
3481
registry = &iface->registrypriv;
3482
num = sscanf(tmp, "%d", &thrshld);
3483
if (num > 0) {
3484
if (thrshld > 0)
3485
registry->napi_threshold = thrshld;
3486
}
3487
}
3488
}
3489
}
3490
RTW_INFO("%s: New threshold = %d Mbps\n", __FUNCTION__, registry->napi_threshold);
3491
RTW_INFO("%s: Current RX throughput = %d Mbps\n",
3492
__FUNCTION__, adapter_to_dvobj(adapter)->traffic_stat.cur_rx_tp);
3493
3494
return count;
3495
}
3496
#endif /* CONFIG_RTW_NAPI_DYNAMIC */
3497
3498
3499
ssize_t proc_set_dynamic_agg_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3500
{
3501
struct net_device *dev = data;
3502
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3503
char tmp[32];
3504
int enable = 0, i = 0;
3505
3506
if (count > sizeof(tmp)) {
3507
rtw_warn_on(1);
3508
return -EFAULT;
3509
}
3510
3511
if (buffer && !copy_from_user(tmp, buffer, count)) {
3512
3513
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
3514
PADAPTER iface = NULL;
3515
int num = sscanf(tmp, "%d", &enable);
3516
3517
if (num != 1) {
3518
RTW_INFO("invalid parameter!\n");
3519
return count;
3520
}
3521
3522
RTW_INFO("dynamic_agg_enable:%d\n", enable);
3523
3524
for (i = 0; i < dvobj->iface_nums; i++) {
3525
iface = dvobj->padapters[i];
3526
if (iface)
3527
iface->registrypriv.dynamic_agg_enable = enable;
3528
}
3529
3530
}
3531
3532
return count;
3533
3534
}
3535
3536
static int proc_get_dynamic_agg_enable(struct seq_file *m, void *v)
3537
{
3538
struct net_device *dev = m->private;
3539
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3540
struct registry_priv *pregistrypriv = &adapter->registrypriv;
3541
3542
RTW_PRINT_SEL(m, "dynamic_agg_enable:%d\n", pregistrypriv->dynamic_agg_enable);
3543
3544
return 0;
3545
}
3546
3547
#ifdef CONFIG_RTW_MESH
3548
static int proc_get_mesh_peer_sel_policy(struct seq_file *m, void *v)
3549
{
3550
struct net_device *dev = m->private;
3551
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3552
3553
dump_mesh_peer_sel_policy(m, adapter);
3554
3555
return 0;
3556
}
3557
3558
#if CONFIG_RTW_MESH_ACNODE_PREVENT
3559
static int proc_get_mesh_acnode_prevent(struct seq_file *m, void *v)
3560
{
3561
struct net_device *dev = m->private;
3562
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3563
3564
if (MLME_IS_MESH(adapter))
3565
dump_mesh_acnode_prevent_settings(m, adapter);
3566
3567
return 0;
3568
}
3569
3570
static ssize_t proc_set_mesh_acnode_prevent(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3571
{
3572
struct net_device *dev = data;
3573
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3574
char tmp[32];
3575
3576
if (count < 1)
3577
return -EFAULT;
3578
3579
if (count > sizeof(tmp)) {
3580
rtw_warn_on(1);
3581
return -EFAULT;
3582
}
3583
3584
if (buffer && !copy_from_user(tmp, buffer, count)) {
3585
struct mesh_peer_sel_policy *peer_sel_policy = &adapter->mesh_cfg.peer_sel_policy;
3586
u8 enable;
3587
u32 conf_timeout_ms;
3588
u32 notify_timeout_ms;
3589
int num = sscanf(tmp, "%hhu %u %u", &enable, &conf_timeout_ms, &notify_timeout_ms);
3590
3591
if (num >= 1)
3592
peer_sel_policy->acnode_prevent = enable;
3593
if (num >= 2)
3594
peer_sel_policy->acnode_conf_timeout_ms = conf_timeout_ms;
3595
if (num >= 3)
3596
peer_sel_policy->acnode_notify_timeout_ms = notify_timeout_ms;
3597
}
3598
3599
return count;
3600
}
3601
#endif /* CONFIG_RTW_MESH_ACNODE_PREVENT */
3602
3603
#if CONFIG_RTW_MESH_OFFCH_CAND
3604
static int proc_get_mesh_offch_cand(struct seq_file *m, void *v)
3605
{
3606
struct net_device *dev = m->private;
3607
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3608
3609
if (MLME_IS_MESH(adapter))
3610
dump_mesh_offch_cand_settings(m, adapter);
3611
3612
return 0;
3613
}
3614
3615
static ssize_t proc_set_mesh_offch_cand(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3616
{
3617
struct net_device *dev = data;
3618
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3619
char tmp[32];
3620
3621
if (count < 1)
3622
return -EFAULT;
3623
3624
if (count > sizeof(tmp)) {
3625
rtw_warn_on(1);
3626
return -EFAULT;
3627
}
3628
3629
if (buffer && !copy_from_user(tmp, buffer, count)) {
3630
struct mesh_peer_sel_policy *peer_sel_policy = &adapter->mesh_cfg.peer_sel_policy;
3631
u8 enable;
3632
u32 find_int_ms;
3633
int num = sscanf(tmp, "%hhu %u", &enable, &find_int_ms);
3634
3635
if (num >= 1)
3636
peer_sel_policy->offch_cand = enable;
3637
if (num >= 2)
3638
peer_sel_policy->offch_find_int_ms = find_int_ms;
3639
}
3640
3641
return count;
3642
}
3643
#endif /* CONFIG_RTW_MESH_OFFCH_CAND */
3644
3645
#if CONFIG_RTW_MESH_PEER_BLACKLIST
3646
static int proc_get_mesh_peer_blacklist(struct seq_file *m, void *v)
3647
{
3648
struct net_device *dev = m->private;
3649
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3650
3651
if (MLME_IS_MESH(adapter)) {
3652
dump_mesh_peer_blacklist_settings(m, adapter);
3653
if (MLME_IS_ASOC(adapter))
3654
dump_mesh_peer_blacklist(m, adapter);
3655
}
3656
3657
return 0;
3658
}
3659
3660
static ssize_t proc_set_mesh_peer_blacklist(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3661
{
3662
struct net_device *dev = data;
3663
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3664
char tmp[32];
3665
3666
if (count < 1)
3667
return -EFAULT;
3668
3669
if (count > sizeof(tmp)) {
3670
rtw_warn_on(1);
3671
return -EFAULT;
3672
}
3673
3674
if (buffer && !copy_from_user(tmp, buffer, count)) {
3675
struct mesh_peer_sel_policy *peer_sel_policy = &adapter->mesh_cfg.peer_sel_policy;
3676
u32 conf_timeout_ms;
3677
u32 blacklist_timeout_ms;
3678
int num = sscanf(tmp, "%u %u", &conf_timeout_ms, &blacklist_timeout_ms);
3679
3680
if (num >= 1)
3681
peer_sel_policy->peer_conf_timeout_ms = conf_timeout_ms;
3682
if (num >= 2)
3683
peer_sel_policy->peer_blacklist_timeout_ms = blacklist_timeout_ms;
3684
}
3685
3686
return count;
3687
}
3688
#endif /* CONFIG_RTW_MESH_PEER_BLACKLIST */
3689
3690
#if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST
3691
static int proc_get_mesh_cto_mgate_require(struct seq_file *m, void *v)
3692
{
3693
struct net_device *dev = m->private;
3694
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3695
3696
if (MLME_IS_MESH(adapter))
3697
RTW_PRINT_SEL(m, "%u\n", adapter->mesh_cfg.peer_sel_policy.cto_mgate_require);
3698
3699
return 0;
3700
}
3701
3702
static ssize_t proc_set_mesh_cto_mgate_require(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3703
{
3704
struct net_device *dev = data;
3705
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3706
char tmp[32];
3707
3708
if (count < 1)
3709
return -EFAULT;
3710
3711
if (count > sizeof(tmp)) {
3712
rtw_warn_on(1);
3713
return -EFAULT;
3714
}
3715
3716
if (buffer && !copy_from_user(tmp, buffer, count)) {
3717
struct mesh_peer_sel_policy *peer_sel_policy = &adapter->mesh_cfg.peer_sel_policy;
3718
u8 require;
3719
int num = sscanf(tmp, "%hhu", &require);
3720
3721
if (num >= 1) {
3722
peer_sel_policy->cto_mgate_require = require;
3723
#if CONFIG_RTW_MESH_CTO_MGATE_CARRIER
3724
if (rtw_mesh_cto_mgate_required(adapter))
3725
rtw_netif_carrier_off(adapter->pnetdev);
3726
else
3727
rtw_netif_carrier_on(adapter->pnetdev);
3728
#endif
3729
}
3730
}
3731
3732
return count;
3733
}
3734
3735
static int proc_get_mesh_cto_mgate_blacklist(struct seq_file *m, void *v)
3736
{
3737
struct net_device *dev = m->private;
3738
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3739
3740
if (MLME_IS_MESH(adapter)) {
3741
dump_mesh_cto_mgate_blacklist_settings(m, adapter);
3742
if (MLME_IS_ASOC(adapter))
3743
dump_mesh_cto_mgate_blacklist(m, adapter);
3744
}
3745
3746
return 0;
3747
}
3748
3749
static ssize_t proc_set_mesh_cto_mgate_blacklist(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3750
{
3751
struct net_device *dev = data;
3752
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3753
char tmp[32];
3754
3755
if (count < 1)
3756
return -EFAULT;
3757
3758
if (count > sizeof(tmp)) {
3759
rtw_warn_on(1);
3760
return -EFAULT;
3761
}
3762
3763
if (buffer && !copy_from_user(tmp, buffer, count)) {
3764
struct mesh_peer_sel_policy *peer_sel_policy = &adapter->mesh_cfg.peer_sel_policy;
3765
u32 conf_timeout_ms;
3766
u32 blacklist_timeout_ms;
3767
int num = sscanf(tmp, "%u %u", &conf_timeout_ms, &blacklist_timeout_ms);
3768
3769
if (num >= 1)
3770
peer_sel_policy->cto_mgate_conf_timeout_ms = conf_timeout_ms;
3771
if (num >= 2)
3772
peer_sel_policy->cto_mgate_blacklist_timeout_ms = blacklist_timeout_ms;
3773
}
3774
3775
return count;
3776
}
3777
#endif /* CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST */
3778
3779
static int proc_get_mesh_networks(struct seq_file *m, void *v)
3780
{
3781
struct net_device *dev = m->private;
3782
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3783
3784
dump_mesh_networks(m, adapter);
3785
3786
return 0;
3787
}
3788
3789
static int proc_get_mesh_plink_ctl(struct seq_file *m, void *v)
3790
{
3791
struct net_device *dev = m->private;
3792
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3793
3794
if (MLME_IS_MESH(adapter))
3795
dump_mesh_plink_ctl(m, adapter);
3796
3797
return 0;
3798
}
3799
3800
static int proc_get_mesh_mpath(struct seq_file *m, void *v)
3801
{
3802
struct net_device *dev = m->private;
3803
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3804
3805
if (MLME_IS_MESH(adapter) && MLME_IS_ASOC(adapter))
3806
dump_mpath(m, adapter);
3807
3808
return 0;
3809
}
3810
3811
static int proc_get_mesh_mpp(struct seq_file *m, void *v)
3812
{
3813
struct net_device *dev = m->private;
3814
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3815
3816
if (MLME_IS_MESH(adapter) && MLME_IS_ASOC(adapter))
3817
dump_mpp(m, adapter);
3818
3819
return 0;
3820
}
3821
3822
static int proc_get_mesh_known_gates(struct seq_file *m, void *v)
3823
{
3824
struct net_device *dev = m->private;
3825
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3826
3827
if (MLME_IS_MESH(adapter))
3828
dump_known_gates(m, adapter);
3829
3830
return 0;
3831
}
3832
3833
#if CONFIG_RTW_MESH_DATA_BMC_TO_UC
3834
static int proc_get_mesh_b2u_flags(struct seq_file *m, void *v)
3835
{
3836
struct net_device *dev = m->private;
3837
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3838
3839
if (MLME_IS_MESH(adapter))
3840
dump_mesh_b2u_flags(m, adapter);
3841
3842
return 0;
3843
}
3844
3845
static ssize_t proc_set_mesh_b2u_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3846
{
3847
struct net_device *dev = data;
3848
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3849
char tmp[32];
3850
3851
if (count < 1)
3852
return -EFAULT;
3853
3854
if (count > sizeof(tmp)) {
3855
rtw_warn_on(1);
3856
return -EFAULT;
3857
}
3858
3859
if (buffer && !copy_from_user(tmp, buffer, count)) {
3860
struct rtw_mesh_cfg *mcfg = &adapter->mesh_cfg;
3861
u8 msrc, mfwd;
3862
int num = sscanf(tmp, "%hhx %hhx", &msrc, &mfwd);
3863
3864
if (num >= 1)
3865
mcfg->b2u_flags_msrc = msrc;
3866
if (num >= 2)
3867
mcfg->b2u_flags_mfwd = mfwd;
3868
}
3869
3870
return count;
3871
}
3872
#endif /* CONFIG_RTW_MESH_DATA_BMC_TO_UC */
3873
3874
static int proc_get_mesh_stats(struct seq_file *m, void *v)
3875
{
3876
struct net_device *dev = m->private;
3877
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3878
3879
if (MLME_IS_MESH(adapter))
3880
dump_mesh_stats(m, adapter);
3881
3882
return 0;
3883
}
3884
3885
static int proc_get_mesh_gate_timeout(struct seq_file *m, void *v)
3886
{
3887
struct net_device *dev = m->private;
3888
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3889
3890
if (MLME_IS_MESH(adapter))
3891
RTW_PRINT_SEL(m, "%u factor\n",
3892
adapter->mesh_cfg.path_gate_timeout_factor);
3893
3894
return 0;
3895
}
3896
3897
static ssize_t proc_set_mesh_gate_timeout(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
3898
{
3899
struct net_device *dev = data;
3900
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3901
char tmp[32];
3902
3903
if (count < 1)
3904
return -EFAULT;
3905
3906
if (count > sizeof(tmp)) {
3907
rtw_warn_on(1);
3908
return -EFAULT;
3909
}
3910
3911
if (buffer && !copy_from_user(tmp, buffer, count)) {
3912
struct rtw_mesh_cfg *mcfg = &adapter->mesh_cfg;
3913
u32 timeout;
3914
int num = sscanf(tmp, "%u", &timeout);
3915
3916
if (num < 1)
3917
goto exit;
3918
3919
mcfg->path_gate_timeout_factor = timeout;
3920
}
3921
3922
exit:
3923
return count;
3924
}
3925
3926
static int proc_get_mesh_gate_state(struct seq_file *m, void *v)
3927
{
3928
struct net_device *dev = m->private;
3929
_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
3930
struct rtw_mesh_cfg *mcfg = &adapter->mesh_cfg;
3931
u8 cto_mgate = 0;
3932
3933
if (MLME_IS_MESH(adapter)) {
3934
if (rtw_mesh_is_primary_gate(adapter))
3935
RTW_PRINT_SEL(m, "PG\n");
3936
else if (mcfg->dot11MeshGateAnnouncementProtocol)
3937
RTW_PRINT_SEL(m, "G\n");
3938
else if (rtw_mesh_gate_num(adapter))
3939
RTW_PRINT_SEL(m, "C\n");
3940
else
3941
RTW_PRINT_SEL(m, "N\n");
3942
}
3943
3944
return 0;
3945
}
3946
3947
static int proc_get_peer_alive_based_preq(struct seq_file *m, void *v)
3948
{
3949
struct net_device *dev = m->private;
3950
struct _ADAPTER *adapter= (_adapter *)rtw_netdev_priv(dev);
3951
struct registry_priv *rp = &adapter->registrypriv;
3952
3953
RTW_PRINT_SEL(m, "peer_alive_based_preq = %u\n",
3954
rp->peer_alive_based_preq);
3955
3956
return 0;
3957
}
3958
3959
static ssize_t
3960
proc_set_peer_alive_based_preq(struct file *file, const char __user *buffer,
3961
size_t count, loff_t *pos, void *data)
3962
{
3963
struct net_device *dev = data;
3964
struct _ADAPTER *adapter = (_adapter *)rtw_netdev_priv(dev);
3965
struct registry_priv *rp = &adapter->registrypriv;
3966
char tmp[8];
3967
int num = 0;
3968
u8 enable = 0;
3969
3970
if (count > sizeof(tmp)) {
3971
rtw_warn_on(1);
3972
return -EFAULT;
3973
}
3974
3975
if (!buffer || copy_from_user(tmp, buffer, count))
3976
goto exit;
3977
3978
num = sscanf(tmp, "%hhu", &enable);
3979
if (num != 1) {
3980
RTW_ERR("%s: invalid parameter!\n", __FUNCTION__);
3981
goto exit;
3982
}
3983
3984
if (enable > 1) {
3985
RTW_ERR("%s: invalid value!\n", __FUNCTION__);
3986
goto exit;
3987
}
3988
rp->peer_alive_based_preq = enable;
3989
3990
exit:
3991
return count;
3992
}
3993
#endif /* CONFIG_RTW_MESH */
3994
3995
static int proc_get_scan_deny(struct seq_file *m, void *v)
3996
{
3997
struct net_device *dev = m->private;
3998
struct _ADAPTER *adapter= (_adapter *)rtw_netdev_priv(dev);
3999
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4000
4001
RTW_PRINT_SEL(m, "scan_deny is %s\n", (dvobj->scan_deny == _TRUE) ? "enable":"disable");
4002
4003
return 0;
4004
}
4005
4006
static ssize_t proc_set_scan_deny(struct file *file, const char __user *buffer,
4007
size_t count, loff_t *pos, void *data)
4008
{
4009
struct net_device *dev = data;
4010
struct _ADAPTER *adapter = (_adapter *)rtw_netdev_priv(dev);
4011
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4012
char tmp[8];
4013
int num = 0;
4014
int enable = 0;
4015
4016
if (count > sizeof(tmp)) {
4017
rtw_warn_on(1);
4018
return -EFAULT;
4019
}
4020
4021
if (!buffer || copy_from_user(tmp, buffer, count))
4022
goto exit;
4023
4024
num = sscanf(tmp, "%d", &enable);
4025
if (num != 1) {
4026
RTW_ERR("%s: invalid parameter!\n", __FUNCTION__);
4027
goto exit;
4028
}
4029
4030
dvobj->scan_deny = enable ? _TRUE : _FALSE;
4031
4032
RTW_PRINT("%s: scan_deny is %s\n",
4033
__FUNCTION__, (dvobj->scan_deny == _TRUE) ? "enable":"disable");
4034
4035
exit:
4036
return count;
4037
}
4038
4039
#ifdef CONFIG_RTW_TPT_MODE
4040
static int proc_get_tpt_mode(struct seq_file *m, void *v)
4041
{
4042
struct net_device *dev = m->private;
4043
struct _ADAPTER *adapter= (_adapter *)rtw_netdev_priv(dev);
4044
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4045
4046
RTW_PRINT_SEL(m, "current tpt_mode = %d\n", dvobj->tpt_mode);
4047
4048
return 0;
4049
}
4050
4051
static void tpt_mode_default(struct _ADAPTER *adapter)
4052
{
4053
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4054
4055
/* 1. disable scan deny */
4056
dvobj->scan_deny = _FALSE;
4057
4058
/* 2. back to original LPS mode */
4059
#ifdef CONFIG_LPS
4060
rtw_pm_set_lps(adapter, adapter->registrypriv.power_mgnt);
4061
#endif
4062
4063
/* 3. back to original 2.4 tx bw mode */
4064
rtw_set_tx_bw_mode(adapter, adapter->registrypriv.tx_bw_mode);
4065
}
4066
4067
static void rtw_tpt_mode(struct _ADAPTER *adapter)
4068
{
4069
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4070
4071
if (dvobj->tpt_mode > 0) {
4072
4073
/* when enable each tpt mode
4074
1. scan deny
4075
2. disable LPS */
4076
4077
dvobj->scan_deny = _TRUE;
4078
4079
#ifdef CONFIG_LPS
4080
rtw_pm_set_lps(adapter, PS_MODE_ACTIVE);
4081
#endif
4082
4083
}
4084
4085
switch (dvobj->tpt_mode) {
4086
case 0: /* default mode */
4087
tpt_mode_default(adapter);
4088
break;
4089
case 1: /* High TP*/
4090
/*tpt_mode1(adapter);*/
4091
dvobj->edca_be_ul = 0x5e431c;
4092
dvobj->edca_be_dl = 0x00431c;
4093
break;
4094
case 2: /* noise */
4095
/* tpt_mode2(adapter); */
4096
dvobj->edca_be_ul = 0x00431c;
4097
dvobj->edca_be_dl = 0x00431c;
4098
4099
rtw_set_tx_bw_mode(adapter, 0x20); /* for 2.4g, fixed tx_bw_mode to 20Mhz */
4100
break;
4101
case 3: /* long distance */
4102
/* tpt_mode3(adapter); */
4103
dvobj->edca_be_ul = 0x00431c;
4104
dvobj->edca_be_dl = 0x00431c;
4105
4106
rtw_set_tx_bw_mode(adapter, 0x20); /* for 2.4g, fixed tx_bw_mode to 20Mhz */
4107
break;
4108
case 4: /* noise + long distance */
4109
/* tpt_mode4(adapter); */
4110
dvobj->edca_be_ul = 0x00431c;
4111
dvobj->edca_be_dl = 0x00431c;
4112
4113
rtw_set_tx_bw_mode(adapter, 0x20); /* for 2.4g, fixed tx_bw_mode to 20Mhz */
4114
break;
4115
default: /* default mode */
4116
tpt_mode_default(adapter);
4117
break;
4118
}
4119
4120
}
4121
4122
static ssize_t proc_set_tpt_mode(struct file *file, const char __user *buffer,
4123
size_t count, loff_t *pos, void *data)
4124
{
4125
struct net_device *dev = data;
4126
struct _ADAPTER *adapter = (_adapter *)rtw_netdev_priv(dev);
4127
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4128
char tmp[32];
4129
int num = 0;
4130
int mode = 0;
4131
4132
#define MAX_TPT_MODE_NUM 4
4133
4134
if (count > sizeof(tmp)) {
4135
rtw_warn_on(1);
4136
return -EFAULT;
4137
}
4138
4139
if (!buffer || copy_from_user(tmp, buffer, count))
4140
goto exit;
4141
4142
num = sscanf(tmp, "%d", &mode);
4143
if (num != 1) {
4144
RTW_ERR("%s: invalid parameter!\n", __FUNCTION__);
4145
goto exit;
4146
}
4147
4148
if (mode > MAX_TPT_MODE_NUM )
4149
mode = 0;
4150
4151
RTW_PRINT("%s: previous mode = %d\n",
4152
__FUNCTION__, dvobj->tpt_mode);
4153
4154
RTW_PRINT("%s: enabled mode = %d\n",
4155
__FUNCTION__, mode);
4156
4157
dvobj->tpt_mode = mode;
4158
4159
rtw_tpt_mode(adapter);
4160
4161
exit:
4162
return count;
4163
4164
}
4165
#endif /* CONFIG_RTW_TPT_MODE */
4166
4167
int proc_get_cur_beacon_keys(struct seq_file *m, void *v)
4168
{
4169
struct net_device *dev = m->private;
4170
_adapter *adapter = rtw_netdev_priv(dev);
4171
struct mlme_priv *mlme = &adapter->mlmepriv;
4172
4173
rtw_dump_bcn_keys(m, &mlme->cur_beacon_keys);
4174
4175
return 0;
4176
}
4177
4178
/*
4179
* rtw_adapter_proc:
4180
* init/deinit when register/unregister net_device
4181
*/
4182
const struct rtw_proc_hdl adapter_proc_hdls[] = {
4183
#if RTW_SEQ_FILE_TEST
4184
RTW_PROC_HDL_SEQ("seq_file_test", &seq_file_test, NULL),
4185
#endif
4186
RTW_PROC_HDL_SSEQ("write_reg", NULL, proc_set_write_reg),
4187
RTW_PROC_HDL_SSEQ("read_reg", proc_get_read_reg, proc_set_read_reg),
4188
RTW_PROC_HDL_SSEQ("tx_rate_bmp", proc_get_dump_tx_rate_bmp, NULL),
4189
RTW_PROC_HDL_SSEQ("adapters_status", proc_get_dump_adapters_status, NULL),
4190
#ifdef CONFIG_RTW_CUSTOMER_STR
4191
RTW_PROC_HDL_SSEQ("customer_str", proc_get_customer_str, NULL),
4192
#endif
4193
RTW_PROC_HDL_SSEQ("fwstate", proc_get_fwstate, NULL),
4194
RTW_PROC_HDL_SSEQ("sec_info", proc_get_sec_info, NULL),
4195
RTW_PROC_HDL_SSEQ("mlmext_state", proc_get_mlmext_state, NULL),
4196
RTW_PROC_HDL_SSEQ("qos_option", proc_get_qos_option, NULL),
4197
RTW_PROC_HDL_SSEQ("ht_option", proc_get_ht_option, NULL),
4198
RTW_PROC_HDL_SSEQ("rf_info", proc_get_rf_info, NULL),
4199
RTW_PROC_HDL_SSEQ("scan_param", proc_get_scan_param, proc_set_scan_param),
4200
RTW_PROC_HDL_SSEQ("scan_abort", proc_get_scan_abort, NULL),
4201
#ifdef CONFIG_SCAN_BACKOP
4202
RTW_PROC_HDL_SSEQ("backop_flags_sta", proc_get_backop_flags_sta, proc_set_backop_flags_sta),
4203
#ifdef CONFIG_AP_MODE
4204
RTW_PROC_HDL_SSEQ("backop_flags_ap", proc_get_backop_flags_ap, proc_set_backop_flags_ap),
4205
#endif
4206
#ifdef CONFIG_RTW_MESH
4207
RTW_PROC_HDL_SSEQ("backop_flags_mesh", proc_get_backop_flags_mesh, proc_set_backop_flags_mesh),
4208
#endif
4209
#endif
4210
#ifdef CONFIG_RTW_REPEATER_SON
4211
RTW_PROC_HDL_SSEQ("rson_data", proc_get_rson_data, proc_set_rson_data),
4212
#endif
4213
RTW_PROC_HDL_SSEQ("survey_info", proc_get_survey_info, proc_set_survey_info),
4214
RTW_PROC_HDL_SSEQ("ap_info", proc_get_ap_info, NULL),
4215
#ifdef ROKU_PRIVATE
4216
RTW_PROC_HDL_SSEQ("infra_ap", proc_get_infra_ap, NULL),
4217
#endif /* ROKU_PRIVATE */
4218
RTW_PROC_HDL_SSEQ("trx_info", proc_get_trx_info, proc_reset_trx_info),
4219
RTW_PROC_HDL_SSEQ("tx_power_offset", proc_get_tx_power_offset, proc_set_tx_power_offset),
4220
RTW_PROC_HDL_SSEQ("rate_ctl", proc_get_rate_ctl, proc_set_rate_ctl),
4221
RTW_PROC_HDL_SSEQ("bw_ctl", proc_get_bw_ctl, proc_set_bw_ctl),
4222
RTW_PROC_HDL_SSEQ("mac_qinfo", proc_get_mac_qinfo, NULL),
4223
RTW_PROC_HDL_SSEQ("macid_info", proc_get_macid_info, NULL),
4224
RTW_PROC_HDL_SSEQ("bcmc_info", proc_get_mi_ap_bc_info, NULL),
4225
RTW_PROC_HDL_SSEQ("sec_cam", proc_get_sec_cam, proc_set_sec_cam),
4226
RTW_PROC_HDL_SSEQ("sec_cam_cache", proc_get_sec_cam_cache, NULL),
4227
RTW_PROC_HDL_SSEQ("ps_dbg_info", proc_get_ps_dbg_info, proc_set_ps_dbg_info),
4228
RTW_PROC_HDL_SSEQ("wifi_spec", proc_get_wifi_spec, NULL),
4229
#ifdef CONFIG_LAYER2_ROAMING
4230
RTW_PROC_HDL_SSEQ("roam_flags", proc_get_roam_flags, proc_set_roam_flags),
4231
RTW_PROC_HDL_SSEQ("roam_param", proc_get_roam_param, proc_set_roam_param),
4232
RTW_PROC_HDL_SSEQ("roam_tgt_addr", NULL, proc_set_roam_tgt_addr),
4233
#endif /* CONFIG_LAYER2_ROAMING */
4234
4235
#ifdef CONFIG_RTW_80211R
4236
RTW_PROC_HDL_SSEQ("ft_flags", proc_get_ft_flags, proc_set_ft_flags),
4237
#endif
4238
4239
#ifdef CONFIG_SDIO_HCI
4240
RTW_PROC_HDL_SSEQ("sd_f0_reg_dump", proc_get_sd_f0_reg_dump, NULL),
4241
RTW_PROC_HDL_SSEQ("sdio_local_reg_dump", proc_get_sdio_local_reg_dump, NULL),
4242
RTW_PROC_HDL_SSEQ("sdio_card_info", proc_get_sdio_card_info, NULL),
4243
#ifdef DBG_SDIO
4244
RTW_PROC_HDL_SSEQ("sdio_dbg", proc_get_sdio_dbg, proc_set_sdio_dbg),
4245
#endif /* DBG_SDIO */
4246
#endif /* CONFIG_SDIO_HCI */
4247
4248
RTW_PROC_HDL_SSEQ("fwdl_test_case", NULL, proc_set_fwdl_test_case),
4249
RTW_PROC_HDL_SSEQ("del_rx_ampdu_test_case", NULL, proc_set_del_rx_ampdu_test_case),
4250
RTW_PROC_HDL_SSEQ("wait_hiq_empty", NULL, proc_set_wait_hiq_empty),
4251
RTW_PROC_HDL_SSEQ("sta_linking_test", NULL, proc_set_sta_linking_test),
4252
#ifdef CONFIG_AP_MODE
4253
RTW_PROC_HDL_SSEQ("ap_linking_test", NULL, proc_set_ap_linking_test),
4254
#endif
4255
4256
RTW_PROC_HDL_SSEQ("mac_reg_dump", proc_get_mac_reg_dump, NULL),
4257
RTW_PROC_HDL_SSEQ("bb_reg_dump", proc_get_bb_reg_dump, NULL),
4258
RTW_PROC_HDL_SSEQ("bb_reg_dump_ex", proc_get_bb_reg_dump_ex, NULL),
4259
RTW_PROC_HDL_SSEQ("rf_reg_dump", proc_get_rf_reg_dump, NULL),
4260
4261
#ifdef CONFIG_RTW_LED
4262
RTW_PROC_HDL_SSEQ("led_config", proc_get_led_config, proc_set_led_config),
4263
#endif
4264
4265
#ifdef CONFIG_AP_MODE
4266
RTW_PROC_HDL_SSEQ("aid_status", proc_get_aid_status, proc_set_aid_status),
4267
RTW_PROC_HDL_SSEQ("all_sta_info", proc_get_all_sta_info, NULL),
4268
RTW_PROC_HDL_SSEQ("bmc_tx_rate", proc_get_bmc_tx_rate, proc_set_bmc_tx_rate),
4269
#endif /* CONFIG_AP_MODE */
4270
4271
#ifdef DBG_MEMORY_LEAK
4272
RTW_PROC_HDL_SSEQ("_malloc_cnt", proc_get_malloc_cnt, NULL),
4273
#endif /* DBG_MEMORY_LEAK */
4274
4275
#ifdef CONFIG_FIND_BEST_CHANNEL
4276
RTW_PROC_HDL_SSEQ("best_channel", proc_get_best_channel, proc_set_best_channel),
4277
#endif
4278
4279
RTW_PROC_HDL_SSEQ("rx_signal", proc_get_rx_signal, proc_set_rx_signal),
4280
RTW_PROC_HDL_SSEQ("rx_chk_limit", proc_get_rx_chk_limit, proc_set_rx_chk_limit),
4281
RTW_PROC_HDL_SSEQ("hw_info", proc_get_hw_status, proc_set_hw_status),
4282
RTW_PROC_HDL_SSEQ("mac_rptbuf", proc_get_mac_rptbuf, NULL),
4283
#ifdef CONFIG_80211N_HT
4284
RTW_PROC_HDL_SSEQ("ht_enable", proc_get_ht_enable, proc_set_ht_enable),
4285
RTW_PROC_HDL_SSEQ("bw_mode", proc_get_bw_mode, proc_set_bw_mode),
4286
RTW_PROC_HDL_SSEQ("ampdu_enable", proc_get_ampdu_enable, proc_set_ampdu_enable),
4287
RTW_PROC_HDL_SSEQ("rx_ampdu", proc_get_rx_ampdu, proc_set_rx_ampdu),
4288
RTW_PROC_HDL_SSEQ("rx_ampdu_size_limit", proc_get_rx_ampdu_size_limit, proc_set_rx_ampdu_size_limit),
4289
RTW_PROC_HDL_SSEQ("rx_ampdu_factor", proc_get_rx_ampdu_factor, proc_set_rx_ampdu_factor),
4290
RTW_PROC_HDL_SSEQ("rx_ampdu_density", proc_get_rx_ampdu_density, proc_set_rx_ampdu_density),
4291
RTW_PROC_HDL_SSEQ("tx_ampdu_density", proc_get_tx_ampdu_density, proc_set_tx_ampdu_density),
4292
RTW_PROC_HDL_SSEQ("tx_max_agg_num", proc_get_tx_max_agg_num, proc_set_tx_max_agg_num),
4293
#ifdef CONFIG_TX_AMSDU
4294
RTW_PROC_HDL_SSEQ("tx_amsdu", proc_get_tx_amsdu, proc_set_tx_amsdu),
4295
RTW_PROC_HDL_SSEQ("tx_amsdu_rate", proc_get_tx_amsdu_rate, proc_set_tx_amsdu_rate),
4296
#endif
4297
#endif /* CONFIG_80211N_HT */
4298
4299
RTW_PROC_HDL_SSEQ("en_fwps", proc_get_en_fwps, proc_set_en_fwps),
4300
4301
/* RTW_PROC_HDL_SSEQ("path_rssi", proc_get_two_path_rssi, NULL),
4302
* RTW_PROC_HDL_SSEQ("rssi_disp",proc_get_rssi_disp, proc_set_rssi_disp), */
4303
4304
#ifdef CONFIG_BT_COEXIST
4305
RTW_PROC_HDL_SSEQ("btcoex_dbg", proc_get_btcoex_dbg, proc_set_btcoex_dbg),
4306
RTW_PROC_HDL_SSEQ("btcoex", proc_get_btcoex_info, NULL),
4307
RTW_PROC_HDL_SSEQ("btinfo_evt", NULL, proc_set_btinfo_evt),
4308
RTW_PROC_HDL_SSEQ("btreg_read", proc_get_btreg_read, proc_set_btreg_read),
4309
RTW_PROC_HDL_SSEQ("btreg_write", proc_get_btreg_write, proc_set_btreg_write),
4310
RTW_PROC_HDL_SSEQ("btc_reduce_wl_txpwr", proc_get_btc_reduce_wl_txpwr, proc_set_btc_reduce_wl_txpwr),
4311
#ifdef CONFIG_RF4CE_COEXIST
4312
RTW_PROC_HDL_SSEQ("rf4ce_state", proc_get_rf4ce_state, proc_set_rf4ce_state),
4313
#endif
4314
#endif /* CONFIG_BT_COEXIST */
4315
4316
#if defined(DBG_CONFIG_ERROR_DETECT)
4317
RTW_PROC_HDL_SSEQ("sreset", proc_get_sreset, proc_set_sreset),
4318
#endif /* DBG_CONFIG_ERROR_DETECT */
4319
RTW_PROC_HDL_SSEQ("trx_info_debug", proc_get_trx_info_debug, NULL),
4320
4321
#ifdef CONFIG_HUAWEI_PROC
4322
RTW_PROC_HDL_SSEQ("huawei_trx_info", proc_get_huawei_trx_info, NULL),
4323
#endif
4324
RTW_PROC_HDL_SSEQ("linked_info_dump", proc_get_linked_info_dump, proc_set_linked_info_dump),
4325
RTW_PROC_HDL_SSEQ("sta_tp_dump", proc_get_sta_tp_dump, proc_set_sta_tp_dump),
4326
RTW_PROC_HDL_SSEQ("sta_tp_info", proc_get_sta_tp_info, NULL),
4327
RTW_PROC_HDL_SSEQ("dis_turboedca", proc_get_turboedca_ctrl, proc_set_turboedca_ctrl),
4328
RTW_PROC_HDL_SSEQ("tx_info_msg", proc_get_tx_info_msg, NULL),
4329
RTW_PROC_HDL_SSEQ("rx_info_msg", proc_get_rx_info_msg, proc_set_rx_info_msg),
4330
4331
#if defined(CONFIG_LPS_PG) && defined(CONFIG_RTL8822C)
4332
RTW_PROC_HDL_SSEQ("lps_pg_debug", proc_get_lps_pg_debug, NULL),
4333
#endif
4334
4335
#ifdef CONFIG_GPIO_API
4336
RTW_PROC_HDL_SSEQ("gpio_info", proc_get_gpio, proc_set_gpio),
4337
RTW_PROC_HDL_SSEQ("gpio_set_output_value", NULL, proc_set_gpio_output_value),
4338
RTW_PROC_HDL_SSEQ("gpio_set_direction", NULL, proc_set_config_gpio),
4339
#endif
4340
4341
#ifdef CONFIG_DBG_COUNTER
4342
RTW_PROC_HDL_SSEQ("rx_logs", proc_get_rx_logs, NULL),
4343
RTW_PROC_HDL_SSEQ("tx_logs", proc_get_tx_logs, NULL),
4344
RTW_PROC_HDL_SSEQ("int_logs", proc_get_int_logs, NULL),
4345
#endif
4346
4347
#ifdef CONFIG_DBG_RF_CAL
4348
RTW_PROC_HDL_SSEQ("iqk", proc_get_iqk_info, proc_set_iqk),
4349
RTW_PROC_HDL_SSEQ("lck", proc_get_lck_info, proc_set_lck),
4350
#endif
4351
4352
#ifdef CONFIG_PCI_HCI
4353
RTW_PROC_HDL_SSEQ("rx_ring", proc_get_rx_ring, NULL),
4354
RTW_PROC_HDL_SSEQ("tx_ring", proc_get_tx_ring, NULL),
4355
#ifdef DBG_TXBD_DESC_DUMP
4356
RTW_PROC_HDL_SSEQ("tx_ring_ext", proc_get_tx_ring_ext, proc_set_tx_ring_ext),
4357
#endif
4358
RTW_PROC_HDL_SSEQ("pci_aspm", proc_get_pci_aspm, NULL),
4359
4360
RTW_PROC_HDL_SSEQ("pci_conf_space", proc_get_pci_conf_space, proc_set_pci_conf_space),
4361
4362
RTW_PROC_HDL_SSEQ("pci_bridge_conf_space", proc_get_pci_bridge_conf_space, proc_set_pci_bridge_conf_space),
4363
4364
#endif
4365
4366
#ifdef CONFIG_WOWLAN
4367
RTW_PROC_HDL_SSEQ("wow_pattern_info", proc_get_pattern_info, proc_set_pattern_info),
4368
RTW_PROC_HDL_SSEQ("wow_wakeup_event", proc_get_wakeup_event,
4369
proc_set_wakeup_event),
4370
RTW_PROC_HDL_SSEQ("wowlan_last_wake_reason", proc_get_wakeup_reason, NULL),
4371
#ifdef CONFIG_WOW_PATTERN_HW_CAM
4372
RTW_PROC_HDL_SSEQ("wow_pattern_cam", proc_dump_pattern_cam, NULL),
4373
#endif
4374
#endif
4375
4376
#ifdef CONFIG_GPIO_WAKEUP
4377
RTW_PROC_HDL_SSEQ("wowlan_gpio_info", proc_get_wowlan_gpio_info, proc_set_wowlan_gpio_info),
4378
#endif
4379
#ifdef CONFIG_P2P_WOWLAN
4380
RTW_PROC_HDL_SSEQ("p2p_wowlan_info", proc_get_p2p_wowlan_info, NULL),
4381
#endif
4382
RTW_PROC_HDL_SSEQ("country_code", proc_get_country_code, proc_set_country_code),
4383
RTW_PROC_HDL_SSEQ("chan_plan", proc_get_chan_plan, proc_set_chan_plan),
4384
#if CONFIG_RTW_MACADDR_ACL
4385
RTW_PROC_HDL_SSEQ("macaddr_acl", proc_get_macaddr_acl, proc_set_macaddr_acl),
4386
#endif
4387
#if CONFIG_RTW_PRE_LINK_STA
4388
RTW_PROC_HDL_SSEQ("pre_link_sta", proc_get_pre_link_sta, proc_set_pre_link_sta),
4389
#endif
4390
RTW_PROC_HDL_SSEQ("ch_sel_policy", proc_get_ch_sel_policy, proc_set_ch_sel_policy),
4391
#ifdef CONFIG_DFS_MASTER
4392
RTW_PROC_HDL_SSEQ("dfs_test_case", proc_get_dfs_test_case, proc_set_dfs_test_case),
4393
RTW_PROC_HDL_SSEQ("update_non_ocp", NULL, proc_set_update_non_ocp),
4394
RTW_PROC_HDL_SSEQ("radar_detect", NULL, proc_set_radar_detect),
4395
RTW_PROC_HDL_SSEQ("dfs_ch_sel_d_flags", proc_get_dfs_ch_sel_d_flags, proc_set_dfs_ch_sel_d_flags),
4396
#ifdef CONFIG_DFS_SLAVE_WITH_RADAR_DETECT
4397
RTW_PROC_HDL_SSEQ("dfs_slave_with_rd", proc_get_dfs_slave_with_rd, proc_set_dfs_slave_with_rd),
4398
#endif
4399
#endif
4400
#ifdef CONFIG_BCN_CNT_CONFIRM_HDL
4401
RTW_PROC_HDL_SSEQ("new_bcn_max", proc_get_new_bcn_max, proc_set_new_bcn_max),
4402
#endif
4403
RTW_PROC_HDL_SSEQ("sink_udpport", proc_get_udpport, proc_set_udpport),
4404
#ifdef DBG_RX_COUNTER_DUMP
4405
RTW_PROC_HDL_SSEQ("dump_rx_cnt_mode", proc_get_rx_cnt_dump, proc_set_rx_cnt_dump),
4406
#endif
4407
RTW_PROC_HDL_SSEQ("change_bss_chbw", NULL, proc_set_change_bss_chbw),
4408
#if CONFIG_TX_AC_LIFETIME
4409
RTW_PROC_HDL_SSEQ("tx_aclt_force_val", proc_get_tx_aclt_force_val, proc_set_tx_aclt_force_val),
4410
RTW_PROC_HDL_SSEQ("tx_aclt_flags", proc_get_tx_aclt_flags, proc_set_tx_aclt_flags),
4411
RTW_PROC_HDL_SSEQ("tx_aclt_confs", proc_get_tx_aclt_confs, proc_set_tx_aclt_confs),
4412
#endif
4413
RTW_PROC_HDL_SSEQ("tx_bw_mode", proc_get_tx_bw_mode, proc_set_tx_bw_mode),
4414
RTW_PROC_HDL_SSEQ("hal_txpwr_info", proc_get_hal_txpwr_info, NULL),
4415
RTW_PROC_HDL_SSEQ("target_tx_power", proc_get_target_tx_power, NULL),
4416
RTW_PROC_HDL_SSEQ("tx_power_by_rate", proc_get_tx_power_by_rate, NULL),
4417
#if CONFIG_TXPWR_LIMIT
4418
RTW_PROC_HDL_SSEQ("tx_power_limit", proc_get_tx_power_limit, NULL),
4419
#endif
4420
RTW_PROC_HDL_SSEQ("tx_power_ext_info", proc_get_tx_power_ext_info, proc_set_tx_power_ext_info),
4421
RTW_PROC_HDL_SEQ("tx_power_idx", &seq_ops_tx_power_idx, NULL),
4422
#ifdef CONFIG_RF_POWER_TRIM
4423
RTW_PROC_HDL_SSEQ("tx_gain_offset", NULL, proc_set_tx_gain_offset),
4424
RTW_PROC_HDL_SSEQ("kfree_flag", proc_get_kfree_flag, proc_set_kfree_flag),
4425
RTW_PROC_HDL_SSEQ("kfree_bb_gain", proc_get_kfree_bb_gain, proc_set_kfree_bb_gain),
4426
RTW_PROC_HDL_SSEQ("kfree_thermal", proc_get_kfree_thermal, proc_set_kfree_thermal),
4427
#endif
4428
#ifdef CONFIG_POWER_SAVING
4429
RTW_PROC_HDL_SSEQ("ps_info", proc_get_ps_info, proc_set_ps_info),
4430
#ifdef CONFIG_WMMPS_STA
4431
RTW_PROC_HDL_SSEQ("wmmps_info", proc_get_wmmps_info, proc_set_wmmps_info),
4432
#endif /* CONFIG_WMMPS_STA */
4433
#endif
4434
#ifdef CONFIG_TDLS
4435
RTW_PROC_HDL_SSEQ("tdls_info", proc_get_tdls_info, NULL),
4436
RTW_PROC_HDL_SSEQ("tdls_enable", proc_get_tdls_enable, proc_set_tdls_enable),
4437
#endif
4438
RTW_PROC_HDL_SSEQ("monitor", proc_get_monitor, proc_set_monitor),
4439
4440
#ifdef CONFIG_RTW_ACS
4441
RTW_PROC_HDL_SSEQ("acs", proc_get_best_chan, proc_set_acs),
4442
RTW_PROC_HDL_SSEQ("chan_info", proc_get_chan_info, NULL),
4443
#endif
4444
4445
#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
4446
RTW_PROC_HDL_SSEQ("noise_monitor", proc_get_nm, proc_set_nm),
4447
#endif
4448
4449
#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
4450
RTW_PROC_HDL_SSEQ("rtkm_info", proc_get_rtkm_info, NULL),
4451
#endif
4452
RTW_PROC_HDL_SSEQ("efuse_map", proc_get_efuse_map, NULL),
4453
#ifdef CONFIG_IEEE80211W
4454
RTW_PROC_HDL_SSEQ("11w_tx_sa_query", proc_get_tx_sa_query, proc_set_tx_sa_query),
4455
RTW_PROC_HDL_SSEQ("11w_tx_deauth", proc_get_tx_deauth, proc_set_tx_deauth),
4456
RTW_PROC_HDL_SSEQ("11w_tx_auth", proc_get_tx_auth, proc_set_tx_auth),
4457
#endif /* CONFIG_IEEE80211W */
4458
4459
#ifdef CONFIG_CUSTOMER01_SMART_ANTENNA
4460
RTW_PROC_HDL_SSEQ("pathb_phase", proc_get_pathb_phase, proc_set_pathb_phase),
4461
#endif
4462
4463
#ifdef CONFIG_MBSSID_CAM
4464
RTW_PROC_HDL_SSEQ("mbid_cam", proc_get_mbid_cam_cache, NULL),
4465
#endif
4466
RTW_PROC_HDL_SSEQ("mac_addr", proc_get_mac_addr, NULL),
4467
RTW_PROC_HDL_SSEQ("skip_band", proc_get_skip_band, proc_set_skip_band),
4468
RTW_PROC_HDL_SSEQ("hal_spec", proc_get_hal_spec, NULL),
4469
RTW_PROC_HDL_SSEQ("hal_trx_mode", proc_get_hal_trx_mode, NULL),
4470
4471
RTW_PROC_HDL_SSEQ("rx_stat", proc_get_rx_stat, NULL),
4472
4473
RTW_PROC_HDL_SSEQ("tx_stat", proc_get_tx_stat, NULL),
4474
/**** PHY Capability ****/
4475
RTW_PROC_HDL_SSEQ("phy_cap", proc_get_phy_cap, NULL),
4476
#ifdef CONFIG_80211N_HT
4477
RTW_PROC_HDL_SSEQ("rx_stbc", proc_get_rx_stbc, proc_set_rx_stbc),
4478
RTW_PROC_HDL_SSEQ("stbc_cap", proc_get_stbc_cap, proc_set_stbc_cap),
4479
RTW_PROC_HDL_SSEQ("ldpc_cap", proc_get_ldpc_cap, proc_set_ldpc_cap),
4480
#endif /* CONFIG_80211N_HT */
4481
#ifdef CONFIG_BEAMFORMING
4482
RTW_PROC_HDL_SSEQ("txbf_cap", proc_get_txbf_cap, proc_set_txbf_cap),
4483
#endif
4484
4485
#ifdef CONFIG_SUPPORT_TRX_SHARED
4486
RTW_PROC_HDL_SSEQ("trx_share_mode", proc_get_trx_share_mode, NULL),
4487
#endif
4488
RTW_PROC_HDL_SSEQ("napi_info", proc_get_napi_info, NULL),
4489
#ifdef CONFIG_RTW_NAPI_DYNAMIC
4490
RTW_PROC_HDL_SSEQ("napi_th", proc_get_napi_info, proc_set_napi_th),
4491
#endif /* CONFIG_RTW_NAPI_DYNAMIC */
4492
4493
RTW_PROC_HDL_SSEQ("rsvd_page", proc_dump_rsvd_page, proc_set_rsvd_page_info),
4494
4495
#ifdef CONFIG_SUPPORT_FIFO_DUMP
4496
RTW_PROC_HDL_SSEQ("fifo_dump", proc_dump_fifo, proc_set_fifo_info),
4497
#endif
4498
RTW_PROC_HDL_SSEQ("fw_info", proc_get_fw_info, NULL),
4499
4500
#ifdef DBG_XMIT_BLOCK
4501
RTW_PROC_HDL_SSEQ("xmit_block", proc_get_xmit_block, proc_set_xmit_block),
4502
#endif
4503
4504
RTW_PROC_HDL_SSEQ("ack_timeout", proc_get_ack_timeout, proc_set_ack_timeout),
4505
4506
RTW_PROC_HDL_SSEQ("dynamic_agg_enable", proc_get_dynamic_agg_enable, proc_set_dynamic_agg_enable),
4507
RTW_PROC_HDL_SSEQ("fw_offload", proc_get_fw_offload, proc_set_fw_offload),
4508
4509
#ifdef CONFIG_RTW_MESH
4510
#if CONFIG_RTW_MESH_ACNODE_PREVENT
4511
RTW_PROC_HDL_SSEQ("mesh_acnode_prevent", proc_get_mesh_acnode_prevent, proc_set_mesh_acnode_prevent),
4512
#endif
4513
#if CONFIG_RTW_MESH_OFFCH_CAND
4514
RTW_PROC_HDL_SSEQ("mesh_offch_cand", proc_get_mesh_offch_cand, proc_set_mesh_offch_cand),
4515
#endif
4516
#if CONFIG_RTW_MESH_PEER_BLACKLIST
4517
RTW_PROC_HDL_SSEQ("mesh_peer_blacklist", proc_get_mesh_peer_blacklist, proc_set_mesh_peer_blacklist),
4518
#endif
4519
#if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST
4520
RTW_PROC_HDL_SSEQ("mesh_cto_mgate_require", proc_get_mesh_cto_mgate_require, proc_set_mesh_cto_mgate_require),
4521
RTW_PROC_HDL_SSEQ("mesh_cto_mgate_blacklist", proc_get_mesh_cto_mgate_blacklist, proc_set_mesh_cto_mgate_blacklist),
4522
#endif
4523
RTW_PROC_HDL_SSEQ("mesh_peer_sel_policy", proc_get_mesh_peer_sel_policy, NULL),
4524
RTW_PROC_HDL_SSEQ("mesh_networks", proc_get_mesh_networks, NULL),
4525
RTW_PROC_HDL_SSEQ("mesh_plink_ctl", proc_get_mesh_plink_ctl, NULL),
4526
RTW_PROC_HDL_SSEQ("mesh_mpath", proc_get_mesh_mpath, NULL),
4527
RTW_PROC_HDL_SSEQ("mesh_mpp", proc_get_mesh_mpp, NULL),
4528
RTW_PROC_HDL_SSEQ("mesh_known_gates", proc_get_mesh_known_gates, NULL),
4529
#if CONFIG_RTW_MESH_DATA_BMC_TO_UC
4530
RTW_PROC_HDL_SSEQ("mesh_b2u_flags", proc_get_mesh_b2u_flags, proc_set_mesh_b2u_flags),
4531
#endif
4532
RTW_PROC_HDL_SSEQ("mesh_stats", proc_get_mesh_stats, NULL),
4533
RTW_PROC_HDL_SSEQ("mesh_gate_timeout_factor", proc_get_mesh_gate_timeout, proc_set_mesh_gate_timeout),
4534
RTW_PROC_HDL_SSEQ("mesh_gate_state", proc_get_mesh_gate_state, NULL),
4535
RTW_PROC_HDL_SSEQ("mesh_peer_alive_based_preq", proc_get_peer_alive_based_preq, proc_set_peer_alive_based_preq),
4536
#endif
4537
#ifdef CONFIG_FW_HANDLE_TXBCN
4538
RTW_PROC_HDL_SSEQ("fw_tbtt_rpt", proc_get_fw_tbtt_rpt, proc_set_fw_tbtt_rpt),
4539
#endif
4540
#ifdef CONFIG_LPS_CHK_BY_TP
4541
RTW_PROC_HDL_SSEQ("lps_chk_tp", proc_get_lps_chk_tp, proc_set_lps_chk_tp),
4542
#endif
4543
#ifdef CONFIG_SUPPORT_STATIC_SMPS
4544
RTW_PROC_HDL_SSEQ("smps", proc_get_smps, proc_set_smps),
4545
#endif
4546
4547
RTW_PROC_HDL_SSEQ("scan_deny", proc_get_scan_deny, proc_set_scan_deny),
4548
#ifdef CONFIG_RTW_TPT_MODE
4549
RTW_PROC_HDL_SSEQ("tpt_mode", proc_get_tpt_mode, proc_set_tpt_mode),
4550
#endif
4551
4552
#ifdef CONFIG_CTRL_TXSS_BY_TP
4553
RTW_PROC_HDL_SSEQ("txss_tp", proc_get_txss_tp, proc_set_txss_tp),
4554
#ifdef DBG_CTRL_TXSS
4555
RTW_PROC_HDL_SSEQ("txss_ctrl", proc_get_txss_ctrl, proc_set_txss_ctrl),
4556
#endif
4557
#endif
4558
4559
RTW_PROC_HDL_SSEQ("cur_beacon_keys", proc_get_cur_beacon_keys, NULL),
4560
};
4561
4562
const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);
4563
4564
static int rtw_adapter_proc_open(struct inode *inode, struct file *file)
4565
{
4566
ssize_t index = (ssize_t)PDE_DATA(inode);
4567
const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index;
4568
void *private = proc_get_parent_data(inode);
4569
4570
if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
4571
int res = seq_open(file, hdl->u.seq_op);
4572
4573
if (res == 0)
4574
((struct seq_file *)file->private_data)->private = private;
4575
4576
return res;
4577
} else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
4578
int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
4579
4580
return single_open(file, show, private);
4581
} else if (hdl->type == RTW_PROC_HDL_TYPE_SZSEQ) {
4582
int (*show)(struct seq_file *, void *) = hdl->u.sz.show ? hdl->u.sz.show : proc_get_dummy;
4583
4584
return single_open_size(file, show, private, hdl->u.sz.size);
4585
} else {
4586
return -EROFS;
4587
}
4588
}
4589
4590
static ssize_t rtw_adapter_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
4591
{
4592
ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
4593
const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index;
4594
ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
4595
4596
if (write)
4597
return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
4598
4599
return -EROFS;
4600
}
4601
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4602
static const struct proc_ops rtw_adapter_proc_seq_fops = {
4603
//.owner = THIS_MODULE,
4604
.proc_open = rtw_adapter_proc_open,
4605
.proc_read = seq_read,
4606
.proc_lseek = seq_lseek,
4607
.proc_release = seq_release,
4608
.proc_write = rtw_adapter_proc_write,
4609
};
4610
#else
4611
static const struct file_operations rtw_adapter_proc_seq_fops = {
4612
.owner = THIS_MODULE,
4613
.open = rtw_adapter_proc_open,
4614
.read = seq_read,
4615
.llseek = seq_lseek,
4616
.release = seq_release,
4617
.write = rtw_adapter_proc_write,
4618
};
4619
#endif
4620
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4621
static const struct proc_ops rtw_adapter_proc_sseq_fops = {
4622
//.owner = THIS_MODULE,
4623
.proc_open = rtw_adapter_proc_open,
4624
.proc_read = seq_read,
4625
.proc_lseek = seq_lseek,
4626
.proc_release = single_release,
4627
.proc_write = rtw_adapter_proc_write,
4628
};
4629
#else
4630
static const struct file_operations rtw_adapter_proc_sseq_fops = {
4631
.owner = THIS_MODULE,
4632
.open = rtw_adapter_proc_open,
4633
.read = seq_read,
4634
.llseek = seq_lseek,
4635
.release = single_release,
4636
.write = rtw_adapter_proc_write,
4637
};
4638
#endif
4639
int proc_get_odm_adaptivity(struct seq_file *m, void *v)
4640
{
4641
struct net_device *dev = m->private;
4642
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
4643
4644
rtw_odm_adaptivity_parm_msg(m, padapter);
4645
4646
return 0;
4647
}
4648
4649
ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
4650
{
4651
struct net_device *dev = data;
4652
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
4653
char tmp[32];
4654
u32 th_l2h_ini;
4655
s8 th_edcca_hl_diff;
4656
4657
if (count < 1)
4658
return -EFAULT;
4659
4660
if (count > sizeof(tmp)) {
4661
rtw_warn_on(1);
4662
return -EFAULT;
4663
}
4664
4665
if (buffer && !copy_from_user(tmp, buffer, count)) {
4666
4667
int num = sscanf(tmp, "%x %hhd", &th_l2h_ini, &th_edcca_hl_diff);
4668
4669
if (num != 2)
4670
return count;
4671
4672
rtw_odm_adaptivity_parm_set(padapter, (s8)th_l2h_ini, th_edcca_hl_diff);
4673
}
4674
4675
return count;
4676
}
4677
4678
static char *phydm_msg = NULL;
4679
#define PHYDM_MSG_LEN 80*24*4
4680
4681
int proc_get_phydm_cmd(struct seq_file *m, void *v)
4682
{
4683
struct net_device *netdev;
4684
PADAPTER padapter;
4685
struct dm_struct *phydm;
4686
4687
4688
netdev = m->private;
4689
padapter = (PADAPTER)rtw_netdev_priv(netdev);
4690
phydm = adapter_to_phydm(padapter);
4691
4692
if (NULL == phydm_msg) {
4693
phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
4694
if (NULL == phydm_msg)
4695
return -ENOMEM;
4696
4697
phydm_cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN);
4698
}
4699
4700
_RTW_PRINT_SEL(m, "%s\n", phydm_msg);
4701
4702
rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
4703
phydm_msg = NULL;
4704
4705
return 0;
4706
}
4707
4708
ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
4709
{
4710
struct net_device *netdev;
4711
PADAPTER padapter;
4712
struct dm_struct *phydm;
4713
char tmp[64] = {0};
4714
4715
4716
netdev = (struct net_device *)data;
4717
padapter = (PADAPTER)rtw_netdev_priv(netdev);
4718
phydm = adapter_to_phydm(padapter);
4719
4720
if (count < 1)
4721
return -EFAULT;
4722
4723
if (count > sizeof(tmp))
4724
return -EFAULT;
4725
4726
if (buffer && !copy_from_user(tmp, buffer, count)) {
4727
if (NULL == phydm_msg) {
4728
phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
4729
if (NULL == phydm_msg)
4730
return -ENOMEM;
4731
} else
4732
_rtw_memset(phydm_msg, 0, PHYDM_MSG_LEN);
4733
4734
phydm_cmd(phydm, tmp, count, 1, phydm_msg, PHYDM_MSG_LEN);
4735
4736
if (strlen(phydm_msg) == 0) {
4737
rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
4738
phydm_msg = NULL;
4739
}
4740
}
4741
4742
return count;
4743
}
4744
4745
/*
4746
* rtw_odm_proc:
4747
* init/deinit when register/unregister net_device, along with rtw_adapter_proc
4748
*/
4749
const struct rtw_proc_hdl odm_proc_hdls[] = {
4750
RTW_PROC_HDL_SSEQ("adaptivity", proc_get_odm_adaptivity, proc_set_odm_adaptivity),
4751
RTW_PROC_HDL_SZSEQ("cmd", proc_get_phydm_cmd, proc_set_phydm_cmd, PHYDM_MSG_LEN),
4752
};
4753
4754
const int odm_proc_hdls_num = sizeof(odm_proc_hdls) / sizeof(struct rtw_proc_hdl);
4755
4756
static int rtw_odm_proc_open(struct inode *inode, struct file *file)
4757
{
4758
ssize_t index = (ssize_t)PDE_DATA(inode);
4759
const struct rtw_proc_hdl *hdl = odm_proc_hdls + index;
4760
void *private = proc_get_parent_data(inode);
4761
4762
if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
4763
int res = seq_open(file, hdl->u.seq_op);
4764
4765
if (res == 0)
4766
((struct seq_file *)file->private_data)->private = private;
4767
4768
return res;
4769
} else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
4770
int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
4771
4772
return single_open(file, show, private);
4773
} else if (hdl->type == RTW_PROC_HDL_TYPE_SZSEQ) {
4774
int (*show)(struct seq_file *, void *) = hdl->u.sz.show ? hdl->u.sz.show : proc_get_dummy;
4775
4776
return single_open_size(file, show, private, hdl->u.sz.size);
4777
} else {
4778
return -EROFS;
4779
}
4780
}
4781
4782
static ssize_t rtw_odm_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
4783
{
4784
ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
4785
const struct rtw_proc_hdl *hdl = odm_proc_hdls + index;
4786
ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
4787
4788
if (write)
4789
return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
4790
4791
return -EROFS;
4792
}
4793
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4794
static const struct proc_ops rtw_odm_proc_seq_fops = {
4795
// .owner = THIS_MODULE,
4796
.proc_open = rtw_odm_proc_open,
4797
.proc_read = seq_read,
4798
.proc_lseek = seq_lseek,
4799
.proc_release = seq_release,
4800
.proc_write = rtw_odm_proc_write,
4801
};
4802
#else
4803
static const struct file_operations rtw_odm_proc_seq_fops = {
4804
.owner = THIS_MODULE,
4805
.open = rtw_odm_proc_open,
4806
.read = seq_read,
4807
.llseek = seq_lseek,
4808
.release = seq_release,
4809
.write = rtw_odm_proc_write,
4810
};
4811
#endif
4812
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4813
static const struct proc_ops rtw_odm_proc_sseq_fops = {
4814
//.owner = THIS_MODULE,
4815
.proc_open = rtw_odm_proc_open,
4816
.proc_read = seq_read,
4817
.proc_lseek = seq_lseek,
4818
.proc_release = single_release,
4819
.proc_write = rtw_odm_proc_write,
4820
};
4821
#else
4822
static const struct file_operations rtw_odm_proc_sseq_fops = {
4823
.owner = THIS_MODULE,
4824
.open = rtw_odm_proc_open,
4825
.read = seq_read,
4826
.llseek = seq_lseek,
4827
.release = single_release,
4828
.write = rtw_odm_proc_write,
4829
};
4830
#endif
4831
struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev)
4832
{
4833
struct proc_dir_entry *dir_odm = NULL;
4834
struct proc_dir_entry *entry = NULL;
4835
_adapter *adapter = rtw_netdev_priv(dev);
4836
ssize_t i;
4837
4838
if (adapter->dir_dev == NULL) {
4839
rtw_warn_on(1);
4840
goto exit;
4841
}
4842
4843
if (adapter->dir_odm != NULL) {
4844
rtw_warn_on(1);
4845
goto exit;
4846
}
4847
4848
dir_odm = rtw_proc_create_dir("odm", adapter->dir_dev, dev);
4849
if (dir_odm == NULL) {
4850
rtw_warn_on(1);
4851
goto exit;
4852
}
4853
4854
adapter->dir_odm = dir_odm;
4855
4856
for (i = 0; i < odm_proc_hdls_num; i++) {
4857
if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
4858
entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_seq_fops, (void *)i);
4859
else if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ ||
4860
odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SZSEQ)
4861
entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_sseq_fops, (void *)i);
4862
else
4863
entry = NULL;
4864
4865
if (!entry) {
4866
rtw_warn_on(1);
4867
goto exit;
4868
}
4869
}
4870
4871
exit:
4872
return dir_odm;
4873
}
4874
4875
void rtw_odm_proc_deinit(_adapter *adapter)
4876
{
4877
struct proc_dir_entry *dir_odm = NULL;
4878
int i;
4879
4880
dir_odm = adapter->dir_odm;
4881
4882
if (dir_odm == NULL) {
4883
rtw_warn_on(1);
4884
return;
4885
}
4886
4887
for (i = 0; i < odm_proc_hdls_num; i++)
4888
remove_proc_entry(odm_proc_hdls[i].name, dir_odm);
4889
4890
remove_proc_entry("odm", adapter->dir_dev);
4891
4892
adapter->dir_odm = NULL;
4893
4894
if (phydm_msg) {
4895
rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
4896
phydm_msg = NULL;
4897
}
4898
}
4899
4900
#ifdef CONFIG_MCC_MODE
4901
/*
4902
* rtw_mcc_proc:
4903
* init/deinit when register/unregister net_device, along with rtw_adapter_proc
4904
*/
4905
const struct rtw_proc_hdl mcc_proc_hdls[] = {
4906
RTW_PROC_HDL_SSEQ("mcc_info", proc_get_mcc_info, NULL),
4907
RTW_PROC_HDL_SSEQ("mcc_enable", proc_get_mcc_info, proc_set_mcc_enable),
4908
RTW_PROC_HDL_SSEQ("mcc_duration", proc_get_mcc_info, proc_set_mcc_duration),
4909
#ifdef CONFIG_MCC_PHYDM_OFFLOAD
4910
RTW_PROC_HDL_SSEQ("mcc_phydm_offload", proc_get_mcc_info, proc_set_mcc_phydm_offload_enable),
4911
#endif
4912
RTW_PROC_HDL_SSEQ("mcc_single_tx_criteria", proc_get_mcc_info, proc_set_mcc_single_tx_criteria),
4913
RTW_PROC_HDL_SSEQ("mcc_ap_bw20_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw20_target_tp),
4914
RTW_PROC_HDL_SSEQ("mcc_ap_bw40_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw40_target_tp),
4915
RTW_PROC_HDL_SSEQ("mcc_ap_bw80_target_tp", proc_get_mcc_info, proc_set_mcc_ap_bw80_target_tp),
4916
RTW_PROC_HDL_SSEQ("mcc_sta_bw20_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw20_target_tp),
4917
RTW_PROC_HDL_SSEQ("mcc_sta_bw40_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw40_target_tp),
4918
RTW_PROC_HDL_SSEQ("mcc_sta_bw80_target_tp", proc_get_mcc_info, proc_set_mcc_sta_bw80_target_tp),
4919
RTW_PROC_HDL_SSEQ("mcc_policy_table", proc_get_mcc_policy_table, NULL),
4920
};
4921
4922
const int mcc_proc_hdls_num = sizeof(mcc_proc_hdls) / sizeof(struct rtw_proc_hdl);
4923
4924
static int rtw_mcc_proc_open(struct inode *inode, struct file *file)
4925
{
4926
ssize_t index = (ssize_t)PDE_DATA(inode);
4927
const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index;
4928
void *private = proc_get_parent_data(inode);
4929
4930
if (hdl->type == RTW_PROC_HDL_TYPE_SEQ) {
4931
int res = seq_open(file, hdl->u.seq_op);
4932
4933
if (res == 0)
4934
((struct seq_file *)file->private_data)->private = private;
4935
4936
return res;
4937
} else if (hdl->type == RTW_PROC_HDL_TYPE_SSEQ) {
4938
int (*show)(struct seq_file *, void *) = hdl->u.show ? hdl->u.show : proc_get_dummy;
4939
4940
return single_open(file, show, private);
4941
} else if (hdl->type == RTW_PROC_HDL_TYPE_SZSEQ) {
4942
int (*show)(struct seq_file *, void *) = hdl->u.sz.show ? hdl->u.sz.show : proc_get_dummy;
4943
4944
return single_open_size(file, show, private, hdl->u.sz.size);
4945
} else {
4946
return -EROFS;
4947
}
4948
}
4949
4950
static ssize_t rtw_mcc_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
4951
{
4952
ssize_t index = (ssize_t)PDE_DATA(file_inode(file));
4953
const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index;
4954
ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;
4955
4956
if (write)
4957
return write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);
4958
4959
return -EROFS;
4960
}
4961
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4962
static const struct proc_ops rtw_mcc_proc_seq_fops = {
4963
//.owner = THIS_MODULE,
4964
.proc_open = rtw_mcc_proc_open,
4965
.proc_read = seq_read,
4966
.proc_lseek = seq_lseek,
4967
.proc_release = seq_release,
4968
.proc_write = rtw_mcc_proc_write,
4969
};
4970
#else
4971
static const struct file_operations rtw_mcc_proc_seq_fops = {
4972
.owner = THIS_MODULE,
4973
.open = rtw_mcc_proc_open,
4974
.read = seq_read,
4975
.llseek = seq_lseek,
4976
.release = seq_release,
4977
.write = rtw_mcc_proc_write,
4978
};
4979
#endif
4980
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
4981
static const struct proc_ops rtw_mcc_proc_sseq_fops = {
4982
//.owner = THIS_MODULE,
4983
.proc_open = rtw_mcc_proc_open,
4984
.proc_read = seq_read,
4985
.proc_lseek = seq_lseek,
4986
.proc_release = single_release,
4987
.proc_write = rtw_mcc_proc_write,
4988
};
4989
#else
4990
static const struct file_operations rtw_mcc_proc_sseq_fops = {
4991
.owner = THIS_MODULE,
4992
.open = rtw_mcc_proc_open,
4993
.read = seq_read,
4994
.llseek = seq_lseek,
4995
.release = single_release,
4996
.write = rtw_mcc_proc_write,
4997
};
4998
#endif
4999
struct proc_dir_entry *rtw_mcc_proc_init(struct net_device *dev)
5000
{
5001
struct proc_dir_entry *dir_mcc = NULL;
5002
struct proc_dir_entry *entry = NULL;
5003
_adapter *adapter = rtw_netdev_priv(dev);
5004
ssize_t i;
5005
5006
if (adapter->dir_dev == NULL) {
5007
rtw_warn_on(1);
5008
goto exit;
5009
}
5010
5011
if (adapter->dir_mcc != NULL) {
5012
rtw_warn_on(1);
5013
goto exit;
5014
}
5015
5016
dir_mcc = rtw_proc_create_dir("mcc", adapter->dir_dev, dev);
5017
if (dir_mcc == NULL) {
5018
rtw_warn_on(1);
5019
goto exit;
5020
}
5021
5022
adapter->dir_mcc = dir_mcc;
5023
5024
for (i = 0; i < mcc_proc_hdls_num; i++) {
5025
if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
5026
entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_seq_fops, (void *)i);
5027
else if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ ||
5028
mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SZSEQ)
5029
entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_sseq_fops, (void *)i);
5030
else
5031
entry = NULL;
5032
5033
if (!entry) {
5034
rtw_warn_on(1);
5035
goto exit;
5036
}
5037
}
5038
5039
exit:
5040
return dir_mcc;
5041
}
5042
5043
void rtw_mcc_proc_deinit(_adapter *adapter)
5044
{
5045
struct proc_dir_entry *dir_mcc = NULL;
5046
int i;
5047
5048
dir_mcc = adapter->dir_mcc;
5049
5050
if (dir_mcc == NULL) {
5051
rtw_warn_on(1);
5052
return;
5053
}
5054
5055
for (i = 0; i < mcc_proc_hdls_num; i++)
5056
remove_proc_entry(mcc_proc_hdls[i].name, dir_mcc);
5057
5058
remove_proc_entry("mcc", adapter->dir_dev);
5059
5060
adapter->dir_mcc = NULL;
5061
}
5062
#endif /* CONFIG_MCC_MODE */
5063
5064
struct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev)
5065
{
5066
struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
5067
struct proc_dir_entry *dir_dev = NULL;
5068
struct proc_dir_entry *entry = NULL;
5069
_adapter *adapter = rtw_netdev_priv(dev);
5070
ssize_t i;
5071
5072
if (drv_proc == NULL) {
5073
rtw_warn_on(1);
5074
goto exit;
5075
}
5076
5077
if (adapter->dir_dev != NULL) {
5078
rtw_warn_on(1);
5079
goto exit;
5080
}
5081
5082
dir_dev = rtw_proc_create_dir(dev->name, drv_proc, dev);
5083
if (dir_dev == NULL) {
5084
rtw_warn_on(1);
5085
goto exit;
5086
}
5087
5088
adapter->dir_dev = dir_dev;
5089
5090
for (i = 0; i < adapter_proc_hdls_num; i++) {
5091
if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ)
5092
entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_seq_fops, (void *)i);
5093
else if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ ||
5094
adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SZSEQ)
5095
entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_sseq_fops, (void *)i);
5096
else
5097
entry = NULL;
5098
5099
if (!entry) {
5100
rtw_warn_on(1);
5101
goto exit;
5102
}
5103
}
5104
5105
rtw_odm_proc_init(dev);
5106
5107
#ifdef CONFIG_MCC_MODE
5108
rtw_mcc_proc_init(dev);
5109
#endif /* CONFIG_MCC_MODE */
5110
5111
exit:
5112
return dir_dev;
5113
}
5114
5115
void rtw_adapter_proc_deinit(struct net_device *dev)
5116
{
5117
struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
5118
struct proc_dir_entry *dir_dev = NULL;
5119
_adapter *adapter = rtw_netdev_priv(dev);
5120
int i;
5121
5122
dir_dev = adapter->dir_dev;
5123
5124
if (dir_dev == NULL) {
5125
rtw_warn_on(1);
5126
return;
5127
}
5128
5129
for (i = 0; i < adapter_proc_hdls_num; i++)
5130
remove_proc_entry(adapter_proc_hdls[i].name, dir_dev);
5131
5132
rtw_odm_proc_deinit(adapter);
5133
5134
#ifdef CONFIG_MCC_MODE
5135
rtw_mcc_proc_deinit(adapter);
5136
#endif /* CONFIG_MCC_MODE */
5137
5138
remove_proc_entry(dev->name, drv_proc);
5139
5140
adapter->dir_dev = NULL;
5141
}
5142
5143
void rtw_adapter_proc_replace(struct net_device *dev)
5144
{
5145
struct proc_dir_entry *drv_proc = get_rtw_drv_proc();
5146
struct proc_dir_entry *dir_dev = NULL;
5147
_adapter *adapter = rtw_netdev_priv(dev);
5148
int i;
5149
5150
dir_dev = adapter->dir_dev;
5151
5152
if (dir_dev == NULL) {
5153
rtw_warn_on(1);
5154
return;
5155
}
5156
5157
for (i = 0; i < adapter_proc_hdls_num; i++)
5158
remove_proc_entry(adapter_proc_hdls[i].name, dir_dev);
5159
5160
rtw_odm_proc_deinit(adapter);
5161
5162
#ifdef CONFIG_MCC_MODE
5163
rtw_mcc_proc_deinit(adapter);
5164
#endif /* CONIG_MCC_MODE */
5165
5166
remove_proc_entry(adapter->old_ifname, drv_proc);
5167
5168
adapter->dir_dev = NULL;
5169
5170
rtw_adapter_proc_init(dev);
5171
5172
}
5173
5174
#endif /* CONFIG_PROC_DEBUG */
5175
5176