blob: db5c952ac8520679294a8cafac4384d9d412d19a [file] [log] [blame]
Larry Finger06a05882013-08-21 22:33:44 -05001/******************************************************************************
2 *
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
Larry Finger06a05882013-08-21 22:33:44 -050014 ******************************************************************************/
15#define _RTW_DEBUG_C_
16
17#include <rtw_debug.h>
navin patidare73fd152014-06-11 22:51:40 +053018#include <usb_ops_linux.h>
Larry Finger06a05882013-08-21 22:33:44 -050019
20int proc_get_drv_version(char *page, char **start,
21 off_t offset, int count,
22 int *eof, void *data)
23{
24 int len = 0;
25
26 len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION);
27
28 *eof = 1;
29 return len;
30}
31
32int proc_get_write_reg(char *page, char **start,
33 off_t offset, int count,
34 int *eof, void *data)
35{
36 *eof = 1;
37 return 0;
38}
39
40int proc_set_write_reg(struct file *file, const char __user *buffer,
41 unsigned long count, void *data)
42{
Tapasweni Pathak60c89912014-10-30 17:03:08 +053043 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -050044 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
45 char tmp[32];
46 u32 addr, val, len;
47
48 if (count < 3) {
49 DBG_88E("argument size is less than 3\n");
50 return -EFAULT;
51 }
52
53 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
54 int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
55
56 if (num != 3) {
57 DBG_88E("invalid write_reg parameter!\n");
58 return count;
59 }
60 switch (len) {
61 case 1:
navin patidare76484d2014-06-11 22:51:33 +053062 usb_write8(padapter, addr, (u8)val);
Larry Finger06a05882013-08-21 22:33:44 -050063 break;
64 case 2:
navin patidar9764ed02014-06-11 22:51:32 +053065 usb_write16(padapter, addr, (u16)val);
Larry Finger06a05882013-08-21 22:33:44 -050066 break;
67 case 4:
navin patidarfc158072014-06-11 22:51:31 +053068 usb_write32(padapter, addr, val);
Larry Finger06a05882013-08-21 22:33:44 -050069 break;
70 default:
71 DBG_88E("error write length =%d", len);
72 break;
73 }
74 }
75 return count;
76}
77
78static u32 proc_get_read_addr = 0xeeeeeeee;
79static u32 proc_get_read_len = 0x4;
80
81int proc_get_read_reg(char *page, char **start,
82 off_t offset, int count,
83 int *eof, void *data)
84{
85 struct net_device *dev = data;
86 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
87
88 int len = 0;
89
90 if (proc_get_read_addr == 0xeeeeeeee) {
91 *eof = 1;
92 return len;
93 }
94
95 switch (proc_get_read_len) {
96 case 1:
navin patidarc7b2e992014-06-11 22:51:36 +053097 len += snprintf(page + len, count - len, "usb_read8(0x%x)=0x%x\n", proc_get_read_addr, usb_read8(padapter, proc_get_read_addr));
Larry Finger06a05882013-08-21 22:33:44 -050098 break;
99 case 2:
navin patidar551a3972014-06-11 22:51:35 +0530100 len += snprintf(page + len, count - len, "usb_read16(0x%x)=0x%x\n", proc_get_read_addr, usb_read16(padapter, proc_get_read_addr));
Larry Finger06a05882013-08-21 22:33:44 -0500101 break;
102 case 4:
navin patidar99ecfb02014-06-11 22:51:34 +0530103 len += snprintf(page + len, count - len, "usb_read32(0x%x)=0x%x\n", proc_get_read_addr, usb_read32(padapter, proc_get_read_addr));
Larry Finger06a05882013-08-21 22:33:44 -0500104 break;
105 default:
106 len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len);
107 break;
108 }
109
110 *eof = 1;
111 return len;
112}
113
114int proc_set_read_reg(struct file *file, const char __user *buffer,
115 unsigned long count, void *data)
116{
117 char tmp[16];
118 u32 addr, len;
119
120 if (count < 2) {
121 DBG_88E("argument size is less than 2\n");
122 return -EFAULT;
123 }
124
125 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
126 int num = sscanf(tmp, "%x %x", &addr, &len);
127
128 if (num != 2) {
129 DBG_88E("invalid read_reg parameter!\n");
130 return count;
131 }
132
133 proc_get_read_addr = addr;
134
135 proc_get_read_len = len;
136 }
137
138 return count;
139}
140
141int proc_get_fwstate(char *page, char **start,
142 off_t offset, int count,
143 int *eof, void *data)
144{
145 struct net_device *dev = data;
146 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
Chris Elliott5fa0e062015-12-07 22:02:27 +0000147 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
Larry Finger06a05882013-08-21 22:33:44 -0500148
149 int len = 0;
150
151 len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv));
152
153 *eof = 1;
154 return len;
155}
156
157int proc_get_sec_info(char *page, char **start,
158 off_t offset, int count,
159 int *eof, void *data)
160{
161 struct net_device *dev = data;
162 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
163 struct security_priv *psecuritypriv = &padapter->securitypriv;
164
165 int len = 0;
166
167 len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
168 psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
169 psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
170
171 *eof = 1;
172 return len;
173}
174
175int proc_get_mlmext_state(char *page, char **start,
176 off_t offset, int count,
177 int *eof, void *data)
178{
179 struct net_device *dev = data;
180 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
181 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
Chris Elliott5fa0e062015-12-07 22:02:27 +0000182 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
Larry Finger06a05882013-08-21 22:33:44 -0500183
184 int len = 0;
185
186 len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
187
188 *eof = 1;
189 return len;
190}
191
192int proc_get_qos_option(char *page, char **start,
193 off_t offset, int count,
194 int *eof, void *data)
195{
196 struct net_device *dev = data;
197 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
Chris Elliott5fa0e062015-12-07 22:02:27 +0000198 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
Larry Finger06a05882013-08-21 22:33:44 -0500199
200 int len = 0;
201
202 len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);
203
204 *eof = 1;
205 return len;
206}
207
208int proc_get_ht_option(char *page, char **start,
209 off_t offset, int count,
210 int *eof, void *data)
211{
212 struct net_device *dev = data;
213 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
Chris Elliott5fa0e062015-12-07 22:02:27 +0000214 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
Larry Finger06a05882013-08-21 22:33:44 -0500215
216 int len = 0;
Dave Perezbe3d2e02015-07-29 21:50:30 -0400217
Larry Finger06a05882013-08-21 22:33:44 -0500218 len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);
219 *eof = 1;
220 return len;
221}
222
223int proc_get_rf_info(char *page, char **start,
224 off_t offset, int count,
225 int *eof, void *data)
226{
227 struct net_device *dev = data;
228 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
229 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
230 int len = 0;
231
Masanari Iida40a46d82014-02-27 20:13:43 +0900232 len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offset=%d\n",
Larry Finger06a05882013-08-21 22:33:44 -0500233 pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
234 *eof = 1;
235 return len;
236}
237
238int proc_get_ap_info(char *page, char **start,
239 off_t offset, int count,
240 int *eof, void *data)
241{
242 struct sta_info *psta;
243 struct net_device *dev = data;
244 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
Chris Elliott5fa0e062015-12-07 22:02:27 +0000245 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
Larry Finger06a05882013-08-21 22:33:44 -0500246 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
Chris Elliott5fa0e062015-12-07 22:02:27 +0000247 struct wlan_network *cur_network = &pmlmepriv->cur_network;
Larry Finger06a05882013-08-21 22:33:44 -0500248 struct sta_priv *pstapriv = &padapter->stapriv;
249 int len = 0;
250
251 psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
252 if (psta) {
253 int i;
254 struct recv_reorder_ctrl *preorder_ctrl;
255
256 len += snprintf(page + len, count - len, "SSID=%s\n", cur_network->network.Ssid.Ssid);
257 len += snprintf(page + len, count - len, "sta's macaddr:%pM\n", psta->hwaddr);
258 len += snprintf(page + len, count - len, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
259 len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
260 len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
261 len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
262 len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
263 len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
264 len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
265
266 for (i = 0; i < 16; i++) {
267 preorder_ctrl = &psta->recvreorder_ctrl[i];
268 if (preorder_ctrl->enable)
269 len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
270 }
271 } else {
272 len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr: %pM\n", cur_network->network.MacAddress);
273 }
274
275 *eof = 1;
276 return len;
277}
278
279int proc_get_adapter_state(char *page, char **start,
280 off_t offset, int count,
281 int *eof, void *data)
282{
283 struct net_device *dev = data;
284 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
285 int len = 0;
286
287 len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n",
288 padapter->bSurpriseRemoved, padapter->bDriverStopped);
289
290 *eof = 1;
291 return len;
292}
293
294int proc_get_trx_info(char *page, char **start,
295 off_t offset, int count,
296 int *eof, void *data)
297{
298 struct net_device *dev = data;
299 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
300 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
301 struct recv_priv *precvpriv = &padapter->recvpriv;
302 int len = 0;
303
304 len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d, free_ext_xmitbuf_cnt=%d, free_recvframe_cnt=%d\n",
305 pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmit_extbuf_cnt, precvpriv->free_recvframe_cnt);
306 len += snprintf(page + len, count - len, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt);
307
308 *eof = 1;
309 return len;
310}
311
312int proc_get_mac_reg_dump1(char *page, char **start,
313 off_t offset, int count,
314 int *eof, void *data)
315{
316 struct net_device *dev = data;
317 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
318 int len = 0;
319 int i, j = 1;
320
321 len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
322
323 for (i = 0x0; i < 0x300; i += 4) {
324 if (j%4 == 1)
325 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530326 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500327 if ((j++)%4 == 0)
328 len += snprintf(page + len, count - len, "\n");
329 }
330
331 *eof = 1;
332 return len;
333}
334
335int proc_get_mac_reg_dump2(char *page, char **start,
336 off_t offset, int count,
337 int *eof, void *data)
338{
339 struct net_device *dev = data;
340 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
341 int len = 0;
342 int i, j = 1;
343
344 len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
345 memset(page, 0, count);
346 for (i = 0x300; i < 0x600; i += 4) {
347 if (j%4 == 1)
348 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530349 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500350 if ((j++)%4 == 0)
351 len += snprintf(page + len, count - len, "\n");
352 }
353
354 *eof = 1;
355 return len;
356}
357
358int proc_get_mac_reg_dump3(char *page, char **start,
359 off_t offset, int count,
360 int *eof, void *data)
361{
362 struct net_device *dev = data;
363 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
364 int len = 0;
365 int i, j = 1;
366
367 len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
368
369 for (i = 0x600; i < 0x800; i += 4) {
370 if (j%4 == 1)
371 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530372 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500373 if ((j++)%4 == 0)
374 len += snprintf(page + len, count - len, "\n");
375 }
376
377 *eof = 1;
378 return len;
379}
380
381int proc_get_bb_reg_dump1(char *page, char **start,
382 off_t offset, int count,
383 int *eof, void *data)
384{
385 struct net_device *dev = data;
386 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
387 int len = 0;
388 int i, j = 1;
389
390 len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
391 for (i = 0x800; i < 0xB00; i += 4) {
392 if (j%4 == 1)
393 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530394 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500395 if ((j++)%4 == 0)
396 len += snprintf(page + len, count - len, "\n");
397 }
398 *eof = 1;
399 return len;
400}
401
402int proc_get_bb_reg_dump2(char *page, char **start,
403 off_t offset, int count,
404 int *eof, void *data)
405{
406 struct net_device *dev = data;
407 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
408 int len = 0;
409 int i, j = 1;
410
411 len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
412 for (i = 0xB00; i < 0xE00; i += 4) {
413 if (j%4 == 1)
414 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530415 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500416 if ((j++)%4 == 0)
417 len += snprintf(page + len, count - len, "\n");
418 }
419 *eof = 1;
420 return len;
421}
422
423int proc_get_bb_reg_dump3(char *page, char **start,
424 off_t offset, int count,
425 int *eof, void *data)
426{
427 struct net_device *dev = data;
428 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
429 int len = 0;
430 int i, j = 1;
431
432 len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
433 for (i = 0xE00; i < 0x1000; i += 4) {
434 if (j%4 == 1)
435 len += snprintf(page + len, count - len, "0x%02x", i);
navin patidar99ecfb02014-06-11 22:51:34 +0530436 len += snprintf(page + len, count - len, " 0x%08x ", usb_read32(padapter, i));
Larry Finger06a05882013-08-21 22:33:44 -0500437 if ((j++)%4 == 0)
438 len += snprintf(page + len, count - len, "\n");
439 }
440 *eof = 1;
441 return len;
442}
443
444int proc_get_rf_reg_dump1(char *page, char **start,
445 off_t offset, int count,
446 int *eof, void *data)
447{
448 struct net_device *dev = data;
449 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
450 int len = 0;
451 int i, j = 1, path;
452 u32 value;
453
454 len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
455 path = 1;
456 len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path);
457 for (i = 0; i < 0xC0; i++) {
458 value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
459 if (j%4 == 1)
460 len += snprintf(page + len, count - len, "0x%02x ", i);
461 len += snprintf(page + len, count - len, " 0x%08x ", value);
462 if ((j++)%4 == 0)
463 len += snprintf(page + len, count - len, "\n");
464 }
465 *eof = 1;
466 return len;
467}
468
469int proc_get_rf_reg_dump2(char *page, char **start,
470 off_t offset, int count,
471 int *eof, void *data)
472{
473 struct net_device *dev = data;
474 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
475 int len = 0;
476 int i, j = 1, path;
477 u32 value;
478
479 len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
480 path = 1;
481 len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path);
482 for (i = 0xC0; i < 0x100; i++) {
483 value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
484 if (j%4 == 1)
485 len += snprintf(page + len, count - len, "0x%02x ", i);
486 len += snprintf(page + len, count - len, " 0x%08x ", value);
487 if ((j++)%4 == 0)
488 len += snprintf(page + len, count - len, "\n");
489 }
490 *eof = 1;
491 return len;
492}
493
494int proc_get_rf_reg_dump3(char *page, char **start,
495 off_t offset, int count,
496 int *eof, void *data)
497{
498 struct net_device *dev = data;
499 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
500 int len = 0;
501 int i, j = 1, path;
502 u32 value;
503
504 len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
505 path = 2;
506 len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path);
507 for (i = 0; i < 0xC0; i++) {
508 value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
509 if (j%4 == 1)
510 len += snprintf(page + len, count - len, "0x%02x ", i);
511 len += snprintf(page + len, count - len, " 0x%08x ", value);
512 if ((j++)%4 == 0)
513 len += snprintf(page + len, count - len, "\n");
514 }
515
516 *eof = 1;
517 return len;
518}
519
520
521int proc_get_rf_reg_dump4(char *page, char **start,
522 off_t offset, int count,
523 int *eof, void *data)
524{
525 struct net_device *dev = data;
526 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
527 int len = 0;
528 int i, j = 1, path;
529 u32 value;
530
531 len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
532 path = 2;
533 len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path);
534 for (i = 0xC0; i < 0x100; i++) {
535 value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
536 if (j%4 == 1)
537 len += snprintf(page + len, count - len, "0x%02x ", i);
538 len += snprintf(page + len, count - len, " 0x%08x ", value);
539 if ((j++)%4 == 0)
540 len += snprintf(page + len, count - len, "\n");
541 }
542 *eof = 1;
543 return len;
544}
545
546
547
548int proc_get_rx_signal(char *page, char **start,
549 off_t offset, int count,
550 int *eof, void *data)
551{
552 struct net_device *dev = data;
553 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
554 int len = 0;
555
556 len = snprintf(page + len, count,
557 "rssi:%d\n"
558 "rxpwdb:%d\n"
559 "signal_strength:%u\n"
560 "signal_qual:%u\n"
561 "noise:%u\n",
562 padapter->recvpriv.rssi,
563 padapter->recvpriv.rxpwdb,
564 padapter->recvpriv.signal_strength,
565 padapter->recvpriv.signal_qual,
566 padapter->recvpriv.noise
567 );
568
569 *eof = 1;
570 return len;
571}
572
573int proc_set_rx_signal(struct file *file, const char __user *buffer,
574 unsigned long count, void *data)
575{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530576 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500577 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
578 char tmp[32];
579 u32 is_signal_dbg;
580 s32 signal_strength;
581
582 if (count < 1)
583 return -EFAULT;
584
585 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
586 int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
Dave Perezbe3d2e02015-07-29 21:50:30 -0400587
Larry Finger06a05882013-08-21 22:33:44 -0500588 is_signal_dbg = is_signal_dbg == 0 ? 0 : 1;
589 if (is_signal_dbg && num != 2)
590 return count;
591
Ivan Safonov66eaaf42015-10-27 22:15:31 +0700592 signal_strength = clamp(signal_strength, 0, 100);
Larry Finger06a05882013-08-21 22:33:44 -0500593
594 padapter->recvpriv.is_signal_dbg = is_signal_dbg;
595 padapter->recvpriv.signal_strength_dbg = signal_strength;
596
597 if (is_signal_dbg)
598 DBG_88E("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
599 else
600 DBG_88E("set %s\n", "HW_SIGNAL_STRENGTH");
601 }
602 return count;
603}
604
605int proc_get_ht_enable(char *page, char **start,
606 off_t offset, int count,
607 int *eof, void *data)
608{
609 struct net_device *dev = data;
610 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
611 struct registry_priv *pregpriv = &padapter->registrypriv;
612 int len = 0;
613
614 if (pregpriv)
615 len += snprintf(page + len, count - len,
616 "%d\n",
617 pregpriv->ht_enable
618 );
619 *eof = 1;
620 return len;
621}
622
623int proc_set_ht_enable(struct file *file, const char __user *buffer,
624 unsigned long count, void *data)
625{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530626 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500627 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
628 struct registry_priv *pregpriv = &padapter->registrypriv;
629 char tmp[32];
630 s32 mode = 0;
631
632 if (count < 1)
633 return -EFAULT;
634
635 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
636 if (pregpriv) {
637 pregpriv->ht_enable = mode;
638 pr_info("ht_enable=%d\n", pregpriv->ht_enable);
639 }
640 }
641
642 return count;
643}
644
645int proc_get_cbw40_enable(char *page, char **start,
646 off_t offset, int count,
647 int *eof, void *data)
648{
649 struct net_device *dev = data;
650 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
651 struct registry_priv *pregpriv = &padapter->registrypriv;
652
653 int len = 0;
654
655 if (pregpriv)
656 len += snprintf(page + len, count - len,
657 "%d\n",
658 pregpriv->cbw40_enable
659 );
660
661 *eof = 1;
662 return len;
663}
664
665int proc_set_cbw40_enable(struct file *file, const char __user *buffer,
666 unsigned long count, void *data)
667{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530668 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500669 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
670 struct registry_priv *pregpriv = &padapter->registrypriv;
671 char tmp[32];
672 s32 mode = 0;
673
674 if (count < 1)
675 return -EFAULT;
676
677 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
678 if (pregpriv) {
679 pregpriv->cbw40_enable = mode;
680 pr_info("cbw40_enable=%d\n", mode);
681 }
682 }
683 return count;
684}
685
686int proc_get_ampdu_enable(char *page, char **start,
687 off_t offset, int count,
688 int *eof, void *data)
689{
690 struct net_device *dev = data;
691 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
692 struct registry_priv *pregpriv = &padapter->registrypriv;
693
694 int len = 0;
695
696 if (pregpriv)
697 len += snprintf(page + len, count - len,
698 "%d\n",
699 pregpriv->ampdu_enable
700 );
701
702 *eof = 1;
703 return len;
704}
705
706int proc_set_ampdu_enable(struct file *file, const char __user *buffer,
707 unsigned long count, void *data)
708{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530709 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500710 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
711 struct registry_priv *pregpriv = &padapter->registrypriv;
712 char tmp[32];
713 s32 mode = 0;
714
715 if (count < 1)
716 return -EFAULT;
717
718 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
719 if (pregpriv) {
720 pregpriv->ampdu_enable = mode;
721 pr_info("ampdu_enable=%d\n", mode);
722 }
723 }
724 return count;
725}
726
727int proc_get_two_path_rssi(char *page, char **start,
728 off_t offset, int count,
729 int *eof, void *data)
730{
731 struct net_device *dev = data;
732 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
733
734 int len = 0;
735
736 if (padapter)
737 len += snprintf(page + len, count - len,
738 "%d %d\n",
739 padapter->recvpriv.RxRssi[0],
740 padapter->recvpriv.RxRssi[1]
741 );
742
743 *eof = 1;
744 return len;
745}
746
747int proc_get_rx_stbc(char *page, char **start,
748 off_t offset, int count,
749 int *eof, void *data)
750{
751 struct net_device *dev = data;
752 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
753 struct registry_priv *pregpriv = &padapter->registrypriv;
754
755 int len = 0;
756
757 if (pregpriv)
758 len += snprintf(page + len, count - len,
759 "%d\n",
760 pregpriv->rx_stbc
761 );
762
763 *eof = 1;
764 return len;
765}
766
767int proc_set_rx_stbc(struct file *file, const char __user *buffer,
768 unsigned long count, void *data)
769{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530770 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500771 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
772 struct registry_priv *pregpriv = &padapter->registrypriv;
773 char tmp[32];
774 u32 mode = 0;
775
776 if (count < 1)
777 return -EFAULT;
778
779 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
780 if (pregpriv) {
781 pregpriv->rx_stbc = mode;
Elena Oat1bdbd752014-03-18 20:22:18 +0200782 netdev_info(dev, "rx_stbc=%d\n", mode);
Larry Finger06a05882013-08-21 22:33:44 -0500783 }
784 }
785 return count;
786}
787
788int proc_get_rssi_disp(char *page, char **start,
789 off_t offset, int count,
790 int *eof, void *data)
791{
792 *eof = 1;
793 return 0;
794}
795
796int proc_set_rssi_disp(struct file *file, const char __user *buffer,
797 unsigned long count, void *data)
798{
Tapasweni Pathak60c89912014-10-30 17:03:08 +0530799 struct net_device *dev = data;
Larry Finger06a05882013-08-21 22:33:44 -0500800 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
801 char tmp[32];
802 u32 enable = 0;
803
804 if (count < 1) {
805 DBG_88E("argument size is less than 1\n");
806 return -EFAULT;
807 }
808
809 if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
810 int num = sscanf(tmp, "%x", &enable);
811
812 if (num != 1) {
813 DBG_88E("invalid set_rssi_disp parameter!\n");
814 return count;
815 }
816
817 if (enable) {
818 DBG_88E("Turn On Rx RSSI Display Function\n");
Elena Oat2275d2b2014-03-19 14:47:52 +0200819 padapter->bRxRSSIDisplay = enable;
Larry Finger06a05882013-08-21 22:33:44 -0500820 } else {
821 DBG_88E("Turn Off Rx RSSI Display Function\n");
822 padapter->bRxRSSIDisplay = 0;
823 }
824 }
825 return count;
826}
827
828#ifdef CONFIG_88EU_AP_MODE
829
830int proc_get_all_sta_info(char *page, char **start,
831 off_t offset, int count,
832 int *eof, void *data)
833{
Larry Finger06a05882013-08-21 22:33:44 -0500834 struct sta_info *psta;
835 struct net_device *dev = data;
836 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
837 struct sta_priv *pstapriv = &padapter->stapriv;
838 int i, j;
839 struct list_head *plist, *phead;
840 struct recv_reorder_ctrl *preorder_ctrl;
841 int len = 0;
842
843
844 len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
845
Larry Finger7057dcb2013-12-19 22:38:34 -0600846 spin_lock_bh(&pstapriv->sta_hash_lock);
Larry Finger06a05882013-08-21 22:33:44 -0500847
848 for (i = 0; i < NUM_STA; i++) {
Chris Elliott5fa0e062015-12-07 22:02:27 +0000849 phead = &pstapriv->sta_hash[i];
Larry Fingerc44e5e32014-02-09 15:15:58 -0600850 plist = phead->next;
Larry Finger06a05882013-08-21 22:33:44 -0500851
navin patidar84660702014-06-22 13:49:32 +0530852 while (phead != plist) {
Larry Fingerbea88102014-02-09 15:15:57 -0600853 psta = container_of(plist, struct sta_info, hash_list);
Larry Finger06a05882013-08-21 22:33:44 -0500854
Larry Fingerc44e5e32014-02-09 15:15:58 -0600855 plist = plist->next;
Larry Finger06a05882013-08-21 22:33:44 -0500856
857 len += snprintf(page + len, count - len, "sta's macaddr: %pM\n", psta->hwaddr);
858 len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
859 len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
860 len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
861 len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
862 len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
863 len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
864 len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len);
865 len += snprintf(page + len, count - len, "capability=0x%x\n", psta->capability);
866 len += snprintf(page + len, count - len, "flags=0x%x\n", psta->flags);
867 len += snprintf(page + len, count - len, "wpa_psk=0x%x\n", psta->wpa_psk);
868 len += snprintf(page + len, count - len, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
869 len += snprintf(page + len, count - len, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
870 len += snprintf(page + len, count - len, "qos_info=0x%x\n", psta->qos_info);
871 len += snprintf(page + len, count - len, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
872
873 for (j = 0; j < 16; j++) {
874 preorder_ctrl = &psta->recvreorder_ctrl[j];
875 if (preorder_ctrl->enable)
876 len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
877 }
878 }
879 }
Larry Fingere02bcf62013-12-19 22:38:35 -0600880 spin_unlock_bh(&pstapriv->sta_hash_lock);
Larry Finger06a05882013-08-21 22:33:44 -0500881
882 *eof = 1;
883 return len;
884}
885#endif
886
887int proc_get_best_channel(char *page, char **start,
888 off_t offset, int count,
889 int *eof, void *data)
890{
891 struct net_device *dev = data;
892 struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
893 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
894 int len = 0;
895 u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
896
897 for (i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) {
898 if (pmlmeext->channel_set[i].ChannelNum == 1)
899 index_24G = i;
900 if (pmlmeext->channel_set[i].ChannelNum == 36)
901 index_5G = i;
902 }
903
904 for (i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) {
905 /* 2.4G */
906 if (pmlmeext->channel_set[i].ChannelNum == 6) {
907 if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) {
908 index_24G = i;
909 best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
910 }
911 }
912
913 /* 5G */
914 if (pmlmeext->channel_set[i].ChannelNum >= 36 &&
915 pmlmeext->channel_set[i].ChannelNum < 140) {
Mayank Bareja4e0fa712015-08-03 11:23:01 +0000916 /* Find primary channel */
Larry Finger06a05882013-08-21 22:33:44 -0500917 if (((pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0) &&
918 (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
919 index_5G = i;
920 best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
921 }
922 }
923
924 if (pmlmeext->channel_set[i].ChannelNum >= 149 &&
925 pmlmeext->channel_set[i].ChannelNum < 165) {
Mayank Bareja4e0fa712015-08-03 11:23:01 +0000926 /* find primary channel */
Larry Finger06a05882013-08-21 22:33:44 -0500927 if (((pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0) &&
928 (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
929 index_5G = i;
930 best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
931 }
932 }
933 /* debug */
934 len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n",
935 pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);
936 }
937
938 len += snprintf(page + len, count - len, "best_channel_5G = %d\n", best_channel_5G);
939 len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G);
940
941 *eof = 1;
942 return len;
943}