1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3 *
4 * Based on the r8180 driver, which is:
5 * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 *
19 * The full GNU General Public License is included in this distribution in the
20 * file called LICENSE.
21 *
22 * Contact Information:
23 * wlanfae <wlanfae@realtek.com>
24 ******************************************************************************/
25 #include "rtl_core.h"
26 #include "r8192E_phy.h"
27 #include "r8192E_phyreg.h"
28 #include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
29 #include "r8192E_cmdpkt.h"
30
31 /****************************************************************************
32 -----------------------------PROCFS STUFF-------------------------
33 *****************************************************************************/
34 /*This part is related to PROC, which will record some statistics. */
35 static struct proc_dir_entry *rtl8192_proc;
36
proc_get_stats_ap(char * page,char ** start,off_t offset,int count,int * eof,void * data)37 static int proc_get_stats_ap(char *page, char **start,
38 off_t offset, int count,
39 int *eof, void *data)
40 {
41 struct net_device *dev = data;
42 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
43 struct rtllib_device *ieee = priv->rtllib;
44 struct rtllib_network *target;
45 int len = 0;
46
47 list_for_each_entry(target, &ieee->network_list, list) {
48
49 len += snprintf(page + len, count - len,
50 "%s ", target->ssid);
51
52 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
53 len += snprintf(page + len, count - len,
54 "WPA\n");
55 else
56 len += snprintf(page + len, count - len,
57 "non_WPA\n");
58
59 }
60
61 *eof = 1;
62 return len;
63 }
64
proc_get_registers_0(char * page,char ** start,off_t offset,int count,int * eof,void * data)65 static int proc_get_registers_0(char *page, char **start,
66 off_t offset, int count,
67 int *eof, void *data)
68 {
69 struct net_device *dev = data;
70
71 int len = 0;
72 int i, n, page0;
73
74 int max = 0xff;
75 page0 = 0x000;
76
77 len += snprintf(page + len, count - len,
78 "\n####################page %x##################\n ",
79 (page0>>8));
80 len += snprintf(page + len, count - len,
81 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
82 "0C 0D 0E 0F");
83 for (n = 0; n <= max;) {
84 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
85 for (i = 0; i < 16 && n <= max; n++, i++)
86 len += snprintf(page + len, count - len,
87 "%2.2x ", read_nic_byte(dev,
88 (page0 | n)));
89 }
90 len += snprintf(page + len, count - len, "\n");
91 *eof = 1;
92 return len;
93
94 }
proc_get_registers_1(char * page,char ** start,off_t offset,int count,int * eof,void * data)95 static int proc_get_registers_1(char *page, char **start,
96 off_t offset, int count,
97 int *eof, void *data)
98 {
99 struct net_device *dev = data;
100
101 int len = 0;
102 int i, n, page0;
103
104 int max = 0xff;
105 page0 = 0x100;
106
107 /* This dump the current register page */
108 len += snprintf(page + len, count - len,
109 "\n####################page %x##################\n ",
110 (page0>>8));
111 len += snprintf(page + len, count - len,
112 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
113 "0C 0D 0E 0F");
114 for (n = 0; n <= max;) {
115 len += snprintf(page + len, count - len,
116 "\nD: %2x > ", n);
117 for (i = 0; i < 16 && n <= max; i++, n++)
118 len += snprintf(page + len, count - len,
119 "%2.2x ", read_nic_byte(dev,
120 (page0 | n)));
121 }
122 len += snprintf(page + len, count - len, "\n");
123 *eof = 1;
124 return len;
125
126 }
proc_get_registers_2(char * page,char ** start,off_t offset,int count,int * eof,void * data)127 static int proc_get_registers_2(char *page, char **start,
128 off_t offset, int count,
129 int *eof, void *data)
130 {
131 struct net_device *dev = data;
132
133 int len = 0;
134 int i, n, page0;
135
136 int max = 0xff;
137 page0 = 0x200;
138
139 /* This dump the current register page */
140 len += snprintf(page + len, count - len,
141 "\n####################page %x##################\n ",
142 (page0 >> 8));
143 len += snprintf(page + len, count - len,
144 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C "
145 "0D 0E 0F");
146 for (n = 0; n <= max;) {
147 len += snprintf(page + len, count - len,
148 "\nD: %2x > ", n);
149 for (i = 0; i < 16 && n <= max; i++, n++)
150 len += snprintf(page + len, count - len,
151 "%2.2x ", read_nic_byte(dev,
152 (page0 | n)));
153 }
154 len += snprintf(page + len, count - len, "\n");
155 *eof = 1;
156 return len;
157
158 }
proc_get_registers_3(char * page,char ** start,off_t offset,int count,int * eof,void * data)159 static int proc_get_registers_3(char *page, char **start,
160 off_t offset, int count,
161 int *eof, void *data)
162 {
163 struct net_device *dev = data;
164
165 int len = 0;
166 int i, n, page0;
167
168 int max = 0xff;
169 page0 = 0x300;
170
171 /* This dump the current register page */
172 len += snprintf(page + len, count - len,
173 "\n####################page %x##################\n ",
174 (page0>>8));
175 len += snprintf(page + len, count - len,
176 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
177 "0C 0D 0E 0F");
178 for (n = 0; n <= max;) {
179 len += snprintf(page + len, count - len,
180 "\nD: %2x > ", n);
181 for (i = 0; i < 16 && n <= max; i++, n++)
182 len += snprintf(page + len, count - len,
183 "%2.2x ", read_nic_byte(dev,
184 (page0 | n)));
185 }
186 len += snprintf(page + len, count - len, "\n");
187 *eof = 1;
188 return len;
189
190 }
proc_get_registers_4(char * page,char ** start,off_t offset,int count,int * eof,void * data)191 static int proc_get_registers_4(char *page, char **start,
192 off_t offset, int count,
193 int *eof, void *data)
194 {
195 struct net_device *dev = data;
196
197 int len = 0;
198 int i, n, page0;
199
200 int max = 0xff;
201 page0 = 0x400;
202
203 /* This dump the current register page */
204 len += snprintf(page + len, count - len,
205 "\n####################page %x##################\n ",
206 (page0>>8));
207 len += snprintf(page + len, count - len,
208 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
209 "0C 0D 0E 0F");
210 for (n = 0; n <= max;) {
211 len += snprintf(page + len, count - len,
212 "\nD: %2x > ", n);
213 for (i = 0; i < 16 && n <= max; i++, n++)
214 len += snprintf(page + len, count - len,
215 "%2.2x ", read_nic_byte(dev,
216 (page0 | n)));
217 }
218 len += snprintf(page + len, count - len, "\n");
219 *eof = 1;
220 return len;
221
222 }
proc_get_registers_5(char * page,char ** start,off_t offset,int count,int * eof,void * data)223 static int proc_get_registers_5(char *page, char **start,
224 off_t offset, int count,
225 int *eof, void *data)
226 {
227 struct net_device *dev = data;
228
229 int len = 0;
230 int i, n, page0;
231
232 int max = 0xff;
233 page0 = 0x500;
234
235 /* This dump the current register page */
236 len += snprintf(page + len, count - len,
237 "\n####################page %x##################\n ",
238 (page0 >> 8));
239 len += snprintf(page + len, count - len,
240 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
241 "0C 0D 0E 0F");
242 for (n = 0; n <= max;) {
243 len += snprintf(page + len, count - len,
244 "\nD: %2x > ", n);
245 for (i = 0; i < 16 && n <= max; i++, n++)
246 len += snprintf(page + len, count - len,
247 "%2.2x ", read_nic_byte(dev,
248 (page0 | n)));
249 }
250 len += snprintf(page + len, count - len, "\n");
251 *eof = 1;
252 return len;
253
254 }
proc_get_registers_6(char * page,char ** start,off_t offset,int count,int * eof,void * data)255 static int proc_get_registers_6(char *page, char **start,
256 off_t offset, int count,
257 int *eof, void *data)
258 {
259 struct net_device *dev = data;
260
261 int len = 0;
262 int i, n, page0;
263
264 int max = 0xff;
265 page0 = 0x600;
266
267 /* This dump the current register page */
268 len += snprintf(page + len, count - len,
269 "\n####################page %x##################\n ",
270 (page0>>8));
271 len += snprintf(page + len, count - len,
272 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
273 "0C 0D 0E 0F");
274 for (n = 0; n <= max;) {
275 len += snprintf(page + len, count - len,
276 "\nD: %2x > ", n);
277 for (i = 0; i < 16 && n <= max; i++, n++)
278 len += snprintf(page + len, count - len,
279 "%2.2x ", read_nic_byte(dev,
280 (page0 | n)));
281 }
282 len += snprintf(page + len, count - len, "\n");
283 *eof = 1;
284 return len;
285
286 }
proc_get_registers_7(char * page,char ** start,off_t offset,int count,int * eof,void * data)287 static int proc_get_registers_7(char *page, char **start,
288 off_t offset, int count,
289 int *eof, void *data)
290 {
291 struct net_device *dev = data;
292
293 int len = 0;
294 int i, n, page0;
295
296 int max = 0xff;
297 page0 = 0x700;
298
299 /* This dump the current register page */
300 len += snprintf(page + len, count - len,
301 "\n####################page %x##################\n ",
302 (page0 >> 8));
303 len += snprintf(page + len, count - len,
304 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C "
305 "0D 0E 0F");
306 for (n = 0; n <= max;) {
307 len += snprintf(page + len, count - len,
308 "\nD: %2x > ", n);
309 for (i = 0; i < 16 && n <= max; i++, n++)
310 len += snprintf(page + len, count - len,
311 "%2.2x ", read_nic_byte(dev,
312 (page0 | n)));
313 }
314 len += snprintf(page + len, count - len, "\n");
315 *eof = 1;
316 return len;
317
318 }
proc_get_registers_8(char * page,char ** start,off_t offset,int count,int * eof,void * data)319 static int proc_get_registers_8(char *page, char **start,
320 off_t offset, int count,
321 int *eof, void *data)
322 {
323 struct net_device *dev = data;
324
325 int len = 0;
326 int i, n, page0;
327
328 int max = 0xff;
329 page0 = 0x800;
330
331 /* This dump the current register page */
332 len += snprintf(page + len, count - len,
333 "\n####################page %x##################\n",
334 (page0 >> 8));
335 for (n = 0; n <= max;) {
336 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
337 for (i = 0; i < 4 && n <= max; n += 4, i++)
338 len += snprintf(page + len, count - len,
339 "%8.8x ", rtl8192_QueryBBReg(dev,
340 (page0 | n), bMaskDWord));
341 }
342 len += snprintf(page + len, count - len, "\n");
343 *eof = 1;
344 return len;
345
346 }
proc_get_registers_9(char * page,char ** start,off_t offset,int count,int * eof,void * data)347 static int proc_get_registers_9(char *page, char **start,
348 off_t offset, int count,
349 int *eof, void *data)
350 {
351 struct net_device *dev = data;
352
353 int len = 0;
354 int i, n, page0;
355
356 int max = 0xff;
357 page0 = 0x900;
358
359 /* This dump the current register page */
360 len += snprintf(page + len, count - len,
361 "\n####################page %x##################\n",
362 (page0>>8));
363 for (n = 0; n <= max;) {
364 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
365 for (i = 0; i < 4 && n <= max; n += 4, i++)
366 len += snprintf(page + len, count - len,
367 "%8.8x ", rtl8192_QueryBBReg(dev,
368 (page0 | n), bMaskDWord));
369 }
370 len += snprintf(page + len, count - len, "\n");
371 *eof = 1;
372 return len;
373 }
proc_get_registers_a(char * page,char ** start,off_t offset,int count,int * eof,void * data)374 static int proc_get_registers_a(char *page, char **start,
375 off_t offset, int count,
376 int *eof, void *data)
377 {
378 struct net_device *dev = data;
379
380 int len = 0;
381 int i, n, page0;
382
383 int max = 0xff;
384 page0 = 0xa00;
385
386 /* This dump the current register page */
387 len += snprintf(page + len, count - len,
388 "\n####################page %x##################\n",
389 (page0>>8));
390 for (n = 0; n <= max;) {
391 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
392 for (i = 0; i < 4 && n <= max; n += 4, i++)
393 len += snprintf(page + len, count - len,
394 "%8.8x ", rtl8192_QueryBBReg(dev,
395 (page0 | n), bMaskDWord));
396 }
397 len += snprintf(page + len, count - len, "\n");
398 *eof = 1;
399 return len;
400 }
proc_get_registers_b(char * page,char ** start,off_t offset,int count,int * eof,void * data)401 static int proc_get_registers_b(char *page, char **start,
402 off_t offset, int count,
403 int *eof, void *data)
404 {
405 struct net_device *dev = data;
406
407 int len = 0;
408 int i, n, page0;
409
410 int max = 0xff;
411 page0 = 0xb00;
412
413 /* This dump the current register page */
414 len += snprintf(page + len, count - len,
415 "\n####################page %x##################\n",
416 (page0 >> 8));
417 for (n = 0; n <= max;) {
418 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
419 for (i = 0; i < 4 && n <= max; n += 4, i++)
420 len += snprintf(page + len, count - len,
421 "%8.8x ", rtl8192_QueryBBReg(dev,
422 (page0 | n), bMaskDWord));
423 }
424 len += snprintf(page + len, count - len, "\n");
425 *eof = 1;
426 return len;
427 }
proc_get_registers_c(char * page,char ** start,off_t offset,int count,int * eof,void * data)428 static int proc_get_registers_c(char *page, char **start,
429 off_t offset, int count,
430 int *eof, void *data)
431 {
432 struct net_device *dev = data;
433
434 int len = 0;
435 int i, n, page0;
436
437 int max = 0xff;
438 page0 = 0xc00;
439
440 /* This dump the current register page */
441 len += snprintf(page + len, count - len,
442 "\n####################page %x##################\n",
443 (page0>>8));
444 for (n = 0; n <= max;) {
445 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
446 for (i = 0; i < 4 && n <= max; n += 4, i++)
447 len += snprintf(page + len, count - len,
448 "%8.8x ", rtl8192_QueryBBReg(dev,
449 (page0 | n), bMaskDWord));
450 }
451 len += snprintf(page + len, count - len, "\n");
452 *eof = 1;
453 return len;
454 }
proc_get_registers_d(char * page,char ** start,off_t offset,int count,int * eof,void * data)455 static int proc_get_registers_d(char *page, char **start,
456 off_t offset, int count,
457 int *eof, void *data)
458 {
459 struct net_device *dev = data;
460
461 int len = 0;
462 int i, n, page0;
463
464 int max = 0xff;
465 page0 = 0xd00;
466
467 /* This dump the current register page */
468 len += snprintf(page + len, count - len,
469 "\n####################page %x##################\n",
470 (page0>>8));
471 for (n = 0; n <= max;) {
472 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
473 for (i = 0; i < 4 && n <= max; n += 4, i++)
474 len += snprintf(page + len, count - len,
475 "%8.8x ", rtl8192_QueryBBReg(dev,
476 (page0 | n), bMaskDWord));
477 }
478 len += snprintf(page + len, count - len, "\n");
479 *eof = 1;
480 return len;
481 }
proc_get_registers_e(char * page,char ** start,off_t offset,int count,int * eof,void * data)482 static int proc_get_registers_e(char *page, char **start,
483 off_t offset, int count,
484 int *eof, void *data)
485 {
486 struct net_device *dev = data;
487
488 int len = 0;
489 int i, n, page0;
490
491 int max = 0xff;
492 page0 = 0xe00;
493
494 /* This dump the current register page */
495 len += snprintf(page + len, count - len,
496 "\n####################page %x##################\n",
497 (page0>>8));
498 for (n = 0; n <= max;) {
499 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
500 for (i = 0; i < 4 && n <= max; n += 4, i++)
501 len += snprintf(page + len, count - len,
502 "%8.8x ", rtl8192_QueryBBReg(dev,
503 (page0 | n), bMaskDWord));
504 }
505 len += snprintf(page + len, count - len, "\n");
506 *eof = 1;
507 return len;
508 }
509
proc_get_reg_rf_a(char * page,char ** start,off_t offset,int count,int * eof,void * data)510 static int proc_get_reg_rf_a(char *page, char **start,
511 off_t offset, int count,
512 int *eof, void *data)
513 {
514 struct net_device *dev = data;
515
516 int len = 0;
517 int i, n;
518
519 int max = 0xff;
520
521 /* This dump the current register page */
522 len += snprintf(page + len, count - len,
523 "\n#################### RF-A ##################\n ");
524 for (n = 0; n <= max;) {
525 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
526 for (i = 0; i < 4 && n <= max; n += 4, i++)
527 len += snprintf(page + len, count - len,
528 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
529 (enum rf90_radio_path)RF90_PATH_A, n,
530 bMaskDWord));
531 }
532 len += snprintf(page + len, count - len, "\n");
533 *eof = 1;
534 return len;
535 }
536
proc_get_reg_rf_b(char * page,char ** start,off_t offset,int count,int * eof,void * data)537 static int proc_get_reg_rf_b(char *page, char **start,
538 off_t offset, int count,
539 int *eof, void *data)
540 {
541 struct net_device *dev = data;
542
543 int len = 0;
544 int i, n;
545
546 int max = 0xff;
547
548 /* This dump the current register page */
549 len += snprintf(page + len, count - len,
550 "\n#################### RF-B ##################\n ");
551 for (n = 0; n <= max;) {
552 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
553 for (i = 0; i < 4 && n <= max; n += 4, i++)
554 len += snprintf(page + len, count - len,
555 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
556 (enum rf90_radio_path)RF90_PATH_B, n,
557 bMaskDWord));
558 }
559 len += snprintf(page + len, count - len, "\n");
560 *eof = 1;
561 return len;
562 }
563
proc_get_reg_rf_c(char * page,char ** start,off_t offset,int count,int * eof,void * data)564 static int proc_get_reg_rf_c(char *page, char **start,
565 off_t offset, int count,
566 int *eof, void *data)
567 {
568 struct net_device *dev = data;
569
570 int len = 0;
571 int i, n;
572
573 int max = 0xff;
574
575 /* This dump the current register page */
576 len += snprintf(page + len, count - len,
577 "\n#################### RF-C ##################\n");
578 for (n = 0; n <= max;) {
579 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
580 for (i = 0; i < 4 && n <= max; n += 4, i++)
581 len += snprintf(page + len, count - len,
582 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
583 (enum rf90_radio_path)RF90_PATH_C, n,
584 bMaskDWord));
585 }
586 len += snprintf(page + len, count - len, "\n");
587 *eof = 1;
588 return len;
589 }
590
proc_get_reg_rf_d(char * page,char ** start,off_t offset,int count,int * eof,void * data)591 static int proc_get_reg_rf_d(char *page, char **start,
592 off_t offset, int count,
593 int *eof, void *data)
594 {
595 struct net_device *dev = data;
596
597 int len = 0;
598 int i, n;
599
600 int max = 0xff;
601
602 /* This dump the current register page */
603 len += snprintf(page + len, count - len,
604 "\n#################### RF-D ##################\n ");
605 for (n = 0; n <= max;) {
606 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
607 for (i = 0; i < 4 && n <= max; n += 4, i++)
608 len += snprintf(page + len, count - len,
609 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
610 (enum rf90_radio_path)RF90_PATH_D, n,
611 bMaskDWord));
612 }
613 len += snprintf(page + len, count - len, "\n");
614 *eof = 1;
615 return len;
616 }
617
proc_get_cam_register_1(char * page,char ** start,off_t offset,int count,int * eof,void * data)618 static int proc_get_cam_register_1(char *page, char **start,
619 off_t offset, int count,
620 int *eof, void *data)
621 {
622 struct net_device *dev = data;
623 u32 target_command = 0;
624 u32 target_content = 0;
625 u8 entry_i = 0;
626 u32 ulStatus;
627 int len = 0;
628 int i = 100, j = 0;
629
630 /* This dump the current register page */
631 len += snprintf(page + len, count - len,
632 "\n#################### SECURITY CAM (0-10) ######"
633 "############\n ");
634 for (j = 0; j < 11; j++) {
635 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
636 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
637 target_command = entry_i+CAM_CONTENT_COUNT*j;
638 target_command = target_command | BIT31;
639
640 while ((i--) >= 0) {
641 ulStatus = read_nic_dword(dev, RWCAM);
642 if (ulStatus & BIT31)
643 continue;
644 else
645 break;
646 }
647 write_nic_dword(dev, RWCAM, target_command);
648 target_content = read_nic_dword(dev, RCAMO);
649 len += snprintf(page + len, count - len, "%8.8x ",
650 target_content);
651 }
652 }
653
654 len += snprintf(page + len, count - len, "\n");
655 *eof = 1;
656 return len;
657 }
658
proc_get_cam_register_2(char * page,char ** start,off_t offset,int count,int * eof,void * data)659 static int proc_get_cam_register_2(char *page, char **start,
660 off_t offset, int count,
661 int *eof, void *data)
662 {
663 struct net_device *dev = data;
664 u32 target_command = 0;
665 u32 target_content = 0;
666 u8 entry_i = 0;
667 u32 ulStatus;
668 int len = 0;
669 int i = 100, j = 0;
670
671 /* This dump the current register page */
672 len += snprintf(page + len, count - len,
673 "\n#################### SECURITY CAM (11-21) "
674 "##################\n ");
675 for (j = 11; j < 22; j++) {
676 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
677 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
678 target_command = entry_i + CAM_CONTENT_COUNT * j;
679 target_command = target_command | BIT31;
680
681 while ((i--) >= 0) {
682 ulStatus = read_nic_dword(dev, RWCAM);
683 if (ulStatus & BIT31)
684 continue;
685 else
686 break;
687 }
688 write_nic_dword(dev, RWCAM, target_command);
689 target_content = read_nic_dword(dev, RCAMO);
690 len += snprintf(page + len, count - len, "%8.8x ",
691 target_content);
692 }
693 }
694
695 len += snprintf(page + len, count - len, "\n");
696 *eof = 1;
697 return len;
698 }
699
proc_get_cam_register_3(char * page,char ** start,off_t offset,int count,int * eof,void * data)700 static int proc_get_cam_register_3(char *page, char **start,
701 off_t offset, int count,
702 int *eof, void *data)
703 {
704 struct net_device *dev = data;
705 u32 target_command = 0;
706 u32 target_content = 0;
707 u8 entry_i = 0;
708 u32 ulStatus;
709 int len = 0;
710 int i = 100, j = 0;
711
712 /* This dump the current register page */
713 len += snprintf(page + len, count - len,
714 "\n#################### SECURITY CAM (22-31) ######"
715 "############\n ");
716 for (j = 22; j < TOTAL_CAM_ENTRY; j++) {
717 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
718 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
719 target_command = entry_i + CAM_CONTENT_COUNT * j;
720 target_command = target_command | BIT31;
721
722 while ((i--) >= 0) {
723 ulStatus = read_nic_dword(dev, RWCAM);
724 if (ulStatus & BIT31)
725 continue;
726 else
727 break;
728 }
729 write_nic_dword(dev, RWCAM, target_command);
730 target_content = read_nic_dword(dev, RCAMO);
731 len += snprintf(page + len, count - len, "%8.8x ",
732 target_content);
733 }
734 }
735
736 len += snprintf(page + len, count - len, "\n");
737 *eof = 1;
738 return len;
739 }
proc_get_stats_tx(char * page,char ** start,off_t offset,int count,int * eof,void * data)740 static int proc_get_stats_tx(char *page, char **start,
741 off_t offset, int count,
742 int *eof, void *data)
743 {
744 struct net_device *dev = data;
745 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
746
747 int len = 0;
748
749 len += snprintf(page + len, count - len,
750 "TX VI priority ok int: %lu\n"
751 "TX VO priority ok int: %lu\n"
752 "TX BE priority ok int: %lu\n"
753 "TX BK priority ok int: %lu\n"
754 "TX MANAGE priority ok int: %lu\n"
755 "TX BEACON priority ok int: %lu\n"
756 "TX BEACON priority error int: %lu\n"
757 "TX CMDPKT priority ok int: %lu\n"
758 "TX queue stopped?: %d\n"
759 "TX fifo overflow: %lu\n"
760 "TX total data packets %lu\n"
761 "TX total data bytes :%lu\n",
762 priv->stats.txviokint,
763 priv->stats.txvookint,
764 priv->stats.txbeokint,
765 priv->stats.txbkokint,
766 priv->stats.txmanageokint,
767 priv->stats.txbeaconokint,
768 priv->stats.txbeaconerr,
769 priv->stats.txcmdpktokint,
770 netif_queue_stopped(dev),
771 priv->stats.txoverflow,
772 priv->rtllib->stats.tx_packets,
773 priv->rtllib->stats.tx_bytes
774
775
776 );
777
778 *eof = 1;
779 return len;
780 }
781
782
783
proc_get_stats_rx(char * page,char ** start,off_t offset,int count,int * eof,void * data)784 static int proc_get_stats_rx(char *page, char **start,
785 off_t offset, int count,
786 int *eof, void *data)
787 {
788 struct net_device *dev = data;
789 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
790
791 int len = 0;
792
793 len += snprintf(page + len, count - len,
794 "RX packets: %lu\n"
795 "RX data crc err: %lu\n"
796 "RX mgmt crc err: %lu\n"
797 "RX desc err: %lu\n"
798 "RX rx overflow error: %lu\n",
799 priv->stats.rxint,
800 priv->stats.rxdatacrcerr,
801 priv->stats.rxmgmtcrcerr,
802 priv->stats.rxrdu,
803 priv->stats.rxoverflow);
804
805 *eof = 1;
806 return len;
807 }
808
rtl8192_proc_module_init(void)809 void rtl8192_proc_module_init(void)
810 {
811 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
812 rtl8192_proc = create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
813 }
814
815
rtl8192_proc_module_remove(void)816 void rtl8192_proc_module_remove(void)
817 {
818 remove_proc_entry(DRV_NAME, init_net.proc_net);
819 }
820
821
rtl8192_proc_remove_one(struct net_device * dev)822 void rtl8192_proc_remove_one(struct net_device *dev)
823 {
824 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
825
826 printk(KERN_INFO "dev name %s\n", dev->name);
827
828 if (priv->dir_dev) {
829 remove_proc_entry("stats-tx", priv->dir_dev);
830 remove_proc_entry("stats-rx", priv->dir_dev);
831 remove_proc_entry("stats-ap", priv->dir_dev);
832 remove_proc_entry("registers-0", priv->dir_dev);
833 remove_proc_entry("registers-1", priv->dir_dev);
834 remove_proc_entry("registers-2", priv->dir_dev);
835 remove_proc_entry("registers-3", priv->dir_dev);
836 remove_proc_entry("registers-4", priv->dir_dev);
837 remove_proc_entry("registers-5", priv->dir_dev);
838 remove_proc_entry("registers-6", priv->dir_dev);
839 remove_proc_entry("registers-7", priv->dir_dev);
840 remove_proc_entry("registers-8", priv->dir_dev);
841 remove_proc_entry("registers-9", priv->dir_dev);
842 remove_proc_entry("registers-a", priv->dir_dev);
843 remove_proc_entry("registers-b", priv->dir_dev);
844 remove_proc_entry("registers-c", priv->dir_dev);
845 remove_proc_entry("registers-d", priv->dir_dev);
846 remove_proc_entry("registers-e", priv->dir_dev);
847 remove_proc_entry("RF-A", priv->dir_dev);
848 remove_proc_entry("RF-B", priv->dir_dev);
849 remove_proc_entry("RF-C", priv->dir_dev);
850 remove_proc_entry("RF-D", priv->dir_dev);
851 remove_proc_entry("SEC-CAM-1", priv->dir_dev);
852 remove_proc_entry("SEC-CAM-2", priv->dir_dev);
853 remove_proc_entry("SEC-CAM-3", priv->dir_dev);
854 remove_proc_entry("wlan0", rtl8192_proc);
855 priv->dir_dev = NULL;
856 }
857 }
858
859
rtl8192_proc_init_one(struct net_device * dev)860 void rtl8192_proc_init_one(struct net_device *dev)
861 {
862 struct proc_dir_entry *e;
863 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
864
865 priv->dir_dev = create_proc_entry(dev->name,
866 S_IFDIR | S_IRUGO | S_IXUGO,
867 rtl8192_proc);
868 if (!priv->dir_dev) {
869 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192"
870 "/%s\n", dev->name);
871 return;
872 }
873 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
874 priv->dir_dev, proc_get_stats_rx, dev);
875
876 if (!e)
877 RT_TRACE(COMP_ERR, "Unable to initialize "
878 "/proc/net/rtl8192/%s/stats-rx\n",
879 dev->name);
880
881 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
882 priv->dir_dev, proc_get_stats_tx, dev);
883
884 if (!e)
885 RT_TRACE(COMP_ERR, "Unable to initialize "
886 "/proc/net/rtl8192/%s/stats-tx\n",
887 dev->name);
888
889 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
890 priv->dir_dev, proc_get_stats_ap, dev);
891
892 if (!e)
893 RT_TRACE(COMP_ERR, "Unable to initialize "
894 "/proc/net/rtl8192/%s/stats-ap\n",
895 dev->name);
896
897 e = create_proc_read_entry("registers-0", S_IFREG | S_IRUGO,
898 priv->dir_dev, proc_get_registers_0, dev);
899 if (!e)
900 RT_TRACE(COMP_ERR, "Unable to initialize "
901 "/proc/net/rtl8192/%s/registers-0\n",
902 dev->name);
903 e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
904 priv->dir_dev, proc_get_registers_1, dev);
905 if (!e)
906 RT_TRACE(COMP_ERR, "Unable to initialize "
907 "/proc/net/rtl8192/%s/registers-1\n",
908 dev->name);
909 e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
910 priv->dir_dev, proc_get_registers_2, dev);
911 if (!e)
912 RT_TRACE(COMP_ERR, "Unable to initialize "
913 "/proc/net/rtl8192/%s/registers-2\n",
914 dev->name);
915 e = create_proc_read_entry("registers-3", S_IFREG | S_IRUGO,
916 priv->dir_dev, proc_get_registers_3, dev);
917 if (!e)
918 RT_TRACE(COMP_ERR, "Unable to initialize "
919 "/proc/net/rtl8192/%s/registers-3\n",
920 dev->name);
921 e = create_proc_read_entry("registers-4", S_IFREG | S_IRUGO,
922 priv->dir_dev, proc_get_registers_4, dev);
923 if (!e)
924 RT_TRACE(COMP_ERR, "Unable to initialize "
925 "/proc/net/rtl8192/%s/registers-4\n",
926 dev->name);
927 e = create_proc_read_entry("registers-5", S_IFREG | S_IRUGO,
928 priv->dir_dev, proc_get_registers_5, dev);
929 if (!e)
930 RT_TRACE(COMP_ERR, "Unable to initialize "
931 "/proc/net/rtl8192/%s/registers-5\n",
932 dev->name);
933 e = create_proc_read_entry("registers-6", S_IFREG | S_IRUGO,
934 priv->dir_dev, proc_get_registers_6, dev);
935 if (!e)
936 RT_TRACE(COMP_ERR, "Unable to initialize "
937 "/proc/net/rtl8192/%s/registers-6\n",
938 dev->name);
939 e = create_proc_read_entry("registers-7", S_IFREG | S_IRUGO,
940 priv->dir_dev, proc_get_registers_7, dev);
941 if (!e)
942 RT_TRACE(COMP_ERR, "Unable to initialize "
943 "/proc/net/rtl8192/%s/registers-7\n",
944 dev->name);
945 e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
946 priv->dir_dev, proc_get_registers_8, dev);
947 if (!e)
948 RT_TRACE(COMP_ERR, "Unable to initialize "
949 "/proc/net/rtl8192/%s/registers-8\n",
950 dev->name);
951 e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
952 priv->dir_dev, proc_get_registers_9, dev);
953 if (!e)
954 RT_TRACE(COMP_ERR, "Unable to initialize "
955 "/proc/net/rtl8192/%s/registers-9\n",
956 dev->name);
957 e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
958 priv->dir_dev, proc_get_registers_a, dev);
959 if (!e)
960 RT_TRACE(COMP_ERR, "Unable to initialize "
961 "/proc/net/rtl8192/%s/registers-a\n",
962 dev->name);
963 e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
964 priv->dir_dev, proc_get_registers_b, dev);
965 if (!e)
966 RT_TRACE(COMP_ERR, "Unable to initialize "
967 "/proc/net/rtl8192/%s/registers-b\n",
968 dev->name);
969 e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
970 priv->dir_dev, proc_get_registers_c, dev);
971 if (!e)
972 RT_TRACE(COMP_ERR, "Unable to initialize "
973 "/proc/net/rtl8192/%s/registers-c\n",
974 dev->name);
975 e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
976 priv->dir_dev, proc_get_registers_d, dev);
977 if (!e)
978 RT_TRACE(COMP_ERR, "Unable to initialize "
979 "/proc/net/rtl8192/%s/registers-d\n",
980 dev->name);
981 e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
982 priv->dir_dev, proc_get_registers_e, dev);
983 if (!e)
984 RT_TRACE(COMP_ERR, "Unable to initialize "
985 "/proc/net/rtl8192/%s/registers-e\n",
986 dev->name);
987 e = create_proc_read_entry("RF-A", S_IFREG | S_IRUGO,
988 priv->dir_dev, proc_get_reg_rf_a, dev);
989 if (!e)
990 RT_TRACE(COMP_ERR, "Unable to initialize "
991 "/proc/net/rtl8192/%s/RF-A\n",
992 dev->name);
993 e = create_proc_read_entry("RF-B", S_IFREG | S_IRUGO,
994 priv->dir_dev, proc_get_reg_rf_b, dev);
995 if (!e)
996 RT_TRACE(COMP_ERR, "Unable to initialize "
997 "/proc/net/rtl8192/%s/RF-B\n",
998 dev->name);
999 e = create_proc_read_entry("RF-C", S_IFREG | S_IRUGO,
1000 priv->dir_dev, proc_get_reg_rf_c, dev);
1001 if (!e)
1002 RT_TRACE(COMP_ERR, "Unable to initialize "
1003 "/proc/net/rtl8192/%s/RF-C\n",
1004 dev->name);
1005 e = create_proc_read_entry("RF-D", S_IFREG | S_IRUGO,
1006 priv->dir_dev, proc_get_reg_rf_d, dev);
1007 if (!e)
1008 RT_TRACE(COMP_ERR, "Unable to initialize "
1009 "/proc/net/rtl8192/%s/RF-D\n",
1010 dev->name);
1011 e = create_proc_read_entry("SEC-CAM-1", S_IFREG | S_IRUGO,
1012 priv->dir_dev, proc_get_cam_register_1, dev);
1013 if (!e)
1014 RT_TRACE(COMP_ERR, "Unable to initialize "
1015 "/proc/net/rtl8192/%s/SEC-CAM-1\n",
1016 dev->name);
1017 e = create_proc_read_entry("SEC-CAM-2", S_IFREG | S_IRUGO,
1018 priv->dir_dev, proc_get_cam_register_2, dev);
1019 if (!e)
1020 RT_TRACE(COMP_ERR, "Unable to initialize "
1021 "/proc/net/rtl8192/%s/SEC-CAM-2\n",
1022 dev->name);
1023 e = create_proc_read_entry("SEC-CAM-3", S_IFREG | S_IRUGO,
1024 priv->dir_dev, proc_get_cam_register_3, dev);
1025 if (!e)
1026 RT_TRACE(COMP_ERR, "Unable to initialize "
1027 "/proc/net/rtl8192/%s/SEC-CAM-3\n",
1028 dev->name);
1029 }
1030