1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
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.
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
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
19 * The full GNU General Public License is included in this distribution in the
20 * file called LICENSE.
22 * Contact Information:
23 * wlanfae <wlanfae@realtek.com>
24 ******************************************************************************/
25 #include "rtl_debug.h"
28 #include "rtl8192c/r8192C_phy.h"
29 #include "rtl8192c/r8192C_phyreg.h"
30 #include "rtl8192c/r8192C_rtl6052.h"
31 #include "rtl8192c/r8192C_Efuse.h"
32 #elif defined RTL8192SE
33 #include "rtl8192s/r8192S_phy.h"
34 #include "rtl8192s/r8192S_phyreg.h"
35 #include "rtl8192s/r8192S_rtl6052.h"
36 #include "rtl8192s/r8192S_Efuse.h"
38 #include "rtl8192e/r8192E_phy.h"
39 #include "rtl8192e/r8192E_phyreg.h"
40 #include "rtl8192e/r8190P_rtl8256.h" /* RTL8225 Radio frontend */
41 #include "rtl8192e/r8192E_cmdpkt.h"
44 #ifdef _RTL8192_EXT_PATCH_
45 #include "../../mshclass/msh_class.h"
47 /* this is only for debugging */
48 void print_buffer(u32 *buffer, int len)
53 printk("ASCII BUFFER DUMP (len: %x):\n",len);
58 printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
66 /* this is only for debug */
67 void dump_eprom(struct net_device *dev)
71 for (i = 0; i < 0xff; i++) {
72 RT_TRACE(COMP_INIT, "EEPROM addr %x : %x", i, eprom_read(dev,i));
76 /* this is only for debug */
77 void rtl8192_dump_reg(struct net_device *dev)
83 RT_TRACE(COMP_INIT, "Dumping NIC register map");
85 for (n = 0; n <= max; ) {
86 printk( "\nD: %2x> ", n);
87 for (i = 0; i < 16 && n <= max; i++, n++)
88 printk("%2x ", read_nic_byte(dev, n));
94 void rtl8192ce_dump_tx_desc(tx_desc *pDesc)
97 RTPRINT(FTX, TX_DESC, ("DW 0 =========\r\n"));
98 RTPRINT(FTX, TX_DESC, ("Own = %d\n", pDesc->OWN));
99 RTPRINT(FTX, TX_DESC, ("GF = %d\n", pDesc->GF));
100 RTPRINT(FTX, TX_DESC, ("LINIP = %d\n", pDesc->LINIP));
101 RTPRINT(FTX, TX_DESC, ("FS = %d\n", pDesc->FirstSeg));
102 RTPRINT(FTX, TX_DESC, ("LS = %d\n", pDesc->LastSeg));
103 RTPRINT(FTX, TX_DESC, ("Offset = %d\n", pDesc->Offset));
104 RTPRINT(FTX, TX_DESC, ("PktSize = %d\r\n", pDesc->PktSize));
106 RTPRINT(FTX, TX_DESC, ("DW 1 ==========\r\n"));
107 RTPRINT(FTX, TX_DESC, ("PKTOFFSET = %d\n", pDesc->PktOffset));
108 RTPRINT(FTX, TX_DESC, ("HTC = %d\n", pDesc->HTC));
109 RTPRINT(FTX, TX_DESC, ("SecType = %d\n", pDesc->SecType));
110 RTPRINT(FTX, TX_DESC, ("EnDescID = %d\n", pDesc->EnDescID));
111 RTPRINT(FTX, TX_DESC, ("NoACM = %d\n", pDesc->NOACM));
112 RTPRINT(FTX, TX_DESC, ("QueueSelect = %d\n", pDesc->QueueSel));
113 RTPRINT(FTX, TX_DESC, ("PIFS = %d\n", pDesc->PIFS));
114 RTPRINT(FTX, TX_DESC, ("MoreFrag = %d\n", pDesc->MoreFrag));
115 RTPRINT(FTX, TX_DESC, ("MacID = %d\r\n", pDesc->MacID));
117 RTPRINT(FTX, TX_DESC, ("DW 2 ==========\r\n"));
118 RTPRINT(FTX, TX_DESC, ("BK = %d\n", pDesc->Bk));
119 RTPRINT(FTX, TX_DESC, ("AGG_EN = %d\n", pDesc->AggEn));
120 RTPRINT(FTX, TX_DESC, ("Data Retry CNT = %d\n", pDesc->DATARC));
121 RTPRINT(FTX, TX_DESC, ("RTS Retry CNT = %d\n", pDesc->RTSRC));
122 RTPRINT(FTX, TX_DESC, ("TSFL = %d\n", pDesc->TSFL));
123 RTPRINT(FTX, TX_DESC, ("RetryLmtEn = %d\n", pDesc->RetryLmtEn));
124 RTPRINT(FTX, TX_DESC, ("DataRetryLmt = %d\r\n", pDesc->TxRetryLmt));
126 RTPRINT(FTX, TX_DESC, ("DW 3 ==========\r\n"));
127 RTPRINT(FTX, TX_DESC, ("Seq = %d\n", pDesc->Seq));
128 RTPRINT(FTX, TX_DESC, ("TailPage = %d\n", pDesc->TailPage));
129 RTPRINT(FTX, TX_DESC, ("NextHeadPage = %d\r\n", pDesc->NextHeadPage));
131 RTPRINT(FTX, TX_DESC, ("DW 4 ==========\r\n"));
132 RTPRINT(FTX, TX_DESC, ("UserRate = %d\n", pDesc->UserRate));
133 RTPRINT(FTX, TX_DESC, ("RTS STBC = %d\n", pDesc->RTSSTBC));
134 RTPRINT(FTX, TX_DESC, ("RTSSC = %d\n", pDesc->RTSSC));
135 RTPRINT(FTX, TX_DESC, ("STBC = %d\n", pDesc->STBC));
136 RTPRINT(FTX, TX_DESC, ("TXSC = %d\n", pDesc->TxSc));
137 RTPRINT(FTX, TX_DESC, ("TxBw = %d\n", pDesc->TxBW));
138 RTPRINT(FTX, TX_DESC, ("TxShort = %d\n", pDesc->TxShort));
139 RTPRINT(FTX, TX_DESC, ("RTSEn = %d\n", pDesc->RTSEn));
140 RTPRINT(FTX, TX_DESC, ("CTS2Self = %d\n", pDesc->CTS2Self));
141 RTPRINT(FTX, TX_DESC, ("RTSRateFBLmt = %d\n", pDesc->RTSRateFBLmt));
142 RTPRINT(FTX, TX_DESC, ("DisRTSFB = %d\n", pDesc->DisRTSFB));
143 RTPRINT(FTX, TX_DESC, ("RTSRate = %d\r\n", pDesc->RTSRate));
145 RTPRINT(FTX, TX_DESC, ("DW 5 ==========\r\n"));
146 RTPRINT(FTX, TX_DESC, ("TxAGC = %d\n", pDesc->TXAGCA));
147 RTPRINT(FTX, TX_DESC, ("TxAGC = %d\n", pDesc->TXAGCB));
148 RTPRINT(FTX, TX_DESC, ("DataRateFBLmt = %d\n", pDesc->TxRateFBLmt));
149 RTPRINT(FTX, TX_DESC, ("Disable Feedback = %d\n", pDesc->DisDataFB));
150 RTPRINT(FTX, TX_DESC, ("TX_Rate = %d\n", pDesc->TxRate));
151 RTPRINT(FTX, TX_DESC, ("PktID = %d\r\n", pDesc->PktID));
153 RTPRINT(FTX, TX_DESC, ("DW 6 ==========\r\n"));
155 RTPRINT(FTX, TX_DESC, ("DW 7-9 ==========\r\n"));
156 RTPRINT(FTX, TX_DESC, ("TxBufferSize = %d\r\n", pDesc->TxBufferSize));
158 RTPRINT(FTX, TX_DESC, ("PhyAddressLow = %08x\n", pDesc->TxBuffAddr));
160 RTPRINT(FTX, TX_DESC, ("NextDescAddress= %08X\n", pDesc->NextDescAddress));
162 u32* desc = (u32*)pDesc;
164 printk("#########################\n");
166 printk("#########>%x\n", desc[i]);
168 printk("#########################\n\n");
174 void rtl8192se_dump_tx_desc(tx_desc* pDesc)
176 printk("DW 0 =========\r\n");
177 printk("Own = %d\n", pDesc->OWN);
178 printk("GF = %d\n", pDesc->GF);
179 printk("LINIP = %d\n", pDesc->LINIP);
180 printk("FS = %d\n", pDesc->FirstSeg);
181 printk("LS = %d\n", pDesc->LastSeg);
182 printk("Offset = %d\n", pDesc->Offset);
183 printk("PktSize = %d\r\n", pDesc->PktSize);
185 printk("DW 1 ==========\r\n");
186 printk("HWPC = %d\n", pDesc->HWPC);
187 printk("PKTOFFSET = %d\n", pDesc->PktOffset);
188 printk("WDS = %d\n", pDesc->WDS);
189 printk("HTC = %d\n", pDesc->HTC);
190 printk("SecType = %d\n", pDesc->SecType);
191 printk("EnDescID = %d\n", pDesc->EnDescID);
192 printk("PktType = %d\n", pDesc->PktType);
193 printk("OUI = %d\n", pDesc->OUI);
194 printk("SecKeyId = %d\n", pDesc->KeyID);
195 printk("NonQos = %d\n", pDesc->NonQos);
196 printk("NoACM = %d\n", pDesc->NoACM);
197 printk("AckPolicy = %d\n", pDesc->AckPolicy);
198 printk("QueueSelect = %d\n", pDesc->QueueSel);
199 printk("PIFS = %d\n", pDesc->PIFS);
200 printk("MoreFrag = %d\n", pDesc->MoreFrag);
201 printk("MoreData = %d\n", pDesc->MoreData);
202 printk("MacID = %d\r\n", pDesc->MacID);
204 printk("DW 2 ==========\r\n");
205 printk("OwnMAC = %d\n", pDesc->OwnMAC);
206 printk("BK = %d\n", pDesc->BK);
207 printk("AGG_EN = %d\n", pDesc->AggEn);
208 printk("Data Retry CNT = %d\n", pDesc->DATARC);
209 printk("RTS Retry CNT = %d\n", pDesc->RTSRC);
210 printk("TSFL = %d\n", pDesc->TSFL);
211 printk("RetryLmtEn = %d\n", pDesc->RetryLmtEn);
212 printk("DataRetryLmt = %d\r\n", pDesc->DataRetryLmt);
214 printk("DW 3 ==========\r\n");
215 printk("Frag = %d\n", pDesc->Frag);
216 printk("Seq = %d\n", pDesc->Seq);
217 printk("TailPage = %d\n", pDesc->TailPage);
218 printk("NextHeadPage = %d\r\n", pDesc->NextHeadPage);
220 printk("DW 4 ==========\r\n");
221 printk("UserRate = %d\n", pDesc->UserRate);
222 printk("RTS STBC = %d\n", pDesc->RTSSTBC);
223 printk("RTSSC = %d\n", pDesc->RTSSC);
224 printk("RTSBW = %d\n", pDesc->RTSBW);
225 printk("RTSShort = %d\n", pDesc->RTSShort);
226 printk("RTSHT = %d\n", pDesc->RTSHT);
227 printk("RD = %d\n", pDesc->RD);
228 printk("STBC = %d\n", pDesc->STBC);
229 printk("TXSC = %d\n", pDesc->TXSC);
230 printk("TxBw = %d\n", pDesc->TxBw);
231 printk("TxShort = %d\n", pDesc->TxShort);
232 printk("TXHT = %d\n", pDesc->TXHT);
233 printk("RaBRSRID = %d\n", pDesc->RaBRSRID);
234 printk("RTSEn = %d\n", pDesc->RTSEn);
235 printk("CTS2Self = %d\n", pDesc->CTS2Self);
236 printk("RTSRateFBLmt = %d\n", pDesc->RTSRateFBLmt);
237 printk("DisRTSFB = %d\n", pDesc->DisRTSFB);
238 printk("RTSRate = %d\r\n", pDesc->RTSRate);
240 printk("DW 5 ==========\r\n");
241 printk("TxAGC = %d\n", pDesc->TxAGC);
242 printk("DataRateFBLmt = %d\n", pDesc->DataRateFBLmt);
243 printk("Disable Feedback = %d\n", pDesc->DISFB);
244 printk("TX_Rate = %d\n", pDesc->TxRate);
245 printk("PktID = %d\r\n", pDesc->PktID);
247 printk("DW 6 ==========\r\n");
248 printk("TCPChkSum = %d\n", pDesc->TCPChkSum);
249 printk("IPChkSum = %d\r\n", pDesc->IPChkSum);
251 printk("DW 7-9 ==========\r\n");
252 printk("TCPEn = %d\n", pDesc->TCPEn);
253 printk("IPHdrOffset = %d\n", pDesc->IPHdrOffset);
254 printk("TxBufferSize = %d\r\n", pDesc->TxBufferSize);
256 printk("PhyAddressLow = %08x\n", pDesc->TxBuffAddr);
258 printk("NextDescAddress= %08X\n", pDesc->NextDescAddress);
262 #ifdef CONFIG_RTLWIFI_DEBUGFS
263 /* debugfs related stuff */
264 static struct dentry *rtl_debugfs_root;
265 static int rtl_dbgfs_open(struct inode *inode, struct file *file)
267 file->private_data = inode->i_private;
271 static ssize_t rtl_dbgfs_register_write(struct file *file,
272 const char __user *user_buf,
276 struct r8192_priv *priv = (struct r8192_priv *)file->private_data;
281 memset(buf, 0, sizeof(buf));
282 buf_size = min(count, sizeof(buf) - 1);
283 if (copy_from_user(buf, user_buf, buf_size))
286 if (sscanf(buf, "%x,%x", &type, &offset ) == 2) {
287 priv->debug->hw_type = type;
288 priv->debug->hw_offset = offset;
290 priv->debug->hw_type = 0;
291 priv->debug->hw_offset = 0;
297 void rtl_hardware_grab(struct net_device *dev)
299 struct r8192_priv *priv = rtllib_priv(dev);
302 u32 mask = RF_CHANGE_BY_HW|RF_CHANGE_BY_PS|RF_CHANGE_BY_IPS;
304 priv->debug->hw_holding = true;
306 rtllib_ips_leave_wq(dev);
309 if ((priv->rtllib->RfOffReason & mask)) {
315 } while (t < timeout);
320 static ssize_t rtl_dbgfs_register_read(struct file *file,
321 char __user *user_buf,
325 struct r8192_priv *priv = (struct r8192_priv *)file->private_data;
326 struct net_device *dev = priv->rtllib->dev;
334 rtl_hardware_grab(dev);
336 if(!priv->debug->hw_type) {
337 page_no = (priv->debug->hw_offset > 0x0f)? 0x0f: priv->debug->hw_offset;
339 if(page_no >= 0x08 ) {
340 len += snprintf(buf + len, count - len,
341 "\n#################### BB page- %x##################\n ", page_no);
344 len += snprintf(buf + len, count - len, "\nD: %2x > ",n);
345 for(i=0;i<4 && n<=max;n+=4,i++)
346 len += snprintf(buf + len, count - len,
347 "%8.8x ",rtl8192_QueryBBReg(dev,(page_no << 8|n),
354 len += snprintf(buf + len,count - len,
355 "\n#################### MAC page- %x##################\n ", page_no);
357 len += snprintf(buf + len, count - len, "\nD: %2x > ",n);
358 for(i=0;i<16 && n<=max;i++,n++)
359 len += snprintf(buf + len, count - len,
360 "%2.2x ",read_nic_byte(dev,((page_no<<8)|n)));
364 path = (priv->debug->hw_offset < RF90_PATH_MAX)? priv->debug->hw_offset:(RF90_PATH_MAX - 1);
365 len += snprintf(buf + len, count - len,
366 "\n#################### RF-PATH-%x ##################\n ", 0x0a+path);
368 len += snprintf(buf+ len, count - len, "\nD: %2x > ",n);
369 for(i=0;i<4 && n<=max;n+=4,i++)
370 len += snprintf(buf + len, count - len,
371 "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)path,\
376 priv->debug->hw_holding = false;
378 len += snprintf(buf + len, count - len, "\n");
379 ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
383 static const struct file_operations rtl_register_debug = {
384 .read = rtl_dbgfs_register_read,
385 .write = rtl_dbgfs_register_write,
386 .open = rtl_dbgfs_open,
390 int rtl_debug_module_init(struct r8192_priv *priv, const char *name)
395 if (!rtl_debugfs_root)
398 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
399 debug = kzalloc(sizeof(rtl_fs_debug), GFP_KERNEL);
401 rtl_fs_debug = kmalloc(sizeof(*rtl_fs_debug), GFP_KERNEL);
402 memset(rtl_fs_debug,0,sizeof(*rtl_fs_debug));
411 debug->dir_drv = debugfs_create_dir(name, rtl_debugfs_root);
412 if (!debug->dir_drv ) {
417 debug->debug_register = debugfs_create_file("debug_register", S_IRUGO,
418 debug->dir_drv, priv, &rtl_register_debug);
419 if(!debug->debug_register) {
426 RT_TRACE(COMP_DBG, "Can't open the debugfs directory\n");
427 rtl_debug_module_remove(priv);
432 void rtl_debug_module_remove(struct r8192_priv *priv)
436 debugfs_remove(priv->debug->debug_register);
437 debugfs_remove(priv->debug->dir_drv);
442 int rtl_create_debugfs_root(void)
444 rtl_debugfs_root = debugfs_create_dir(DRV_NAME, NULL);
445 if (!rtl_debugfs_root)
451 void rtl_remove_debugfs_root(void)
453 debugfs_remove(rtl_debugfs_root);
454 rtl_debugfs_root = NULL;
458 /****************************************************************************
459 -----------------------------PROCFS STUFF-------------------------
460 *****************************************************************************/
461 /*This part is related to PROC, which will record some statistics. */
462 static struct proc_dir_entry *rtl8192_proc = NULL;
464 static int proc_get_stats_ap(char *page, char **start,
465 off_t offset, int count,
466 int *eof, void *data)
468 struct net_device *dev = data;
469 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
470 struct rtllib_device *ieee = priv->rtllib;
471 struct rtllib_network *target;
475 list_for_each_entry(target, &ieee->network_list, list) {
477 len += snprintf(page + len, count - len,
478 "%s ", target->ssid);
480 if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
481 len += snprintf(page + len, count - len,
485 len += snprintf(page + len, count - len,
495 static int proc_get_registers_0(char *page, char **start,
496 off_t offset, int count,
497 int *eof, void *data)
499 struct net_device *dev = data;
508 /* This dump the current register page */
509 if(!IS_BB_REG_OFFSET_92S(page0)){
510 len += snprintf(page + len, count - len,
511 "\n####################page %x##################\n ", (page0>>8));
514 len += snprintf(page + len, count - len,
516 for(i=0;i<16 && n<=max;i++,n++)
517 len += snprintf(page + len, count - len,
518 "%2.2x ",read_nic_byte(dev,(page0|n)));
523 len += snprintf(page + len, count - len,
524 "\n####################page %x##################\n ", (page0>>8));
527 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
528 for(i=0;i<16 && n<=max;n++,i++)
529 len += snprintf(page + len, count - len,
530 "%2.2x ",read_nic_byte(dev,(page0|n)));
533 len += snprintf(page + len, count - len,"\n");
538 static int proc_get_registers_1(char *page, char **start,
539 off_t offset, int count,
540 int *eof, void *data)
542 struct net_device *dev = data;
550 /* This dump the current register page */
551 len += snprintf(page + len, count - len,
552 "\n####################page %x##################\n ", (page0>>8));
555 len += snprintf(page + len, count - len,
557 for(i=0;i<16 && n<=max;i++,n++)
558 len += snprintf(page + len, count - len,
559 "%2.2x ",read_nic_byte(dev,(page0|n)));
561 len += snprintf(page + len, count - len,"\n");
566 static int proc_get_registers_2(char *page, char **start,
567 off_t offset, int count,
568 int *eof, void *data)
570 struct net_device *dev = data;
578 /* This dump the current register page */
579 len += snprintf(page + len, count - len,
580 "\n####################page %x##################\n ", (page0>>8));
583 len += snprintf(page + len, count - len,
585 for(i=0;i<16 && n<=max;i++,n++)
586 len += snprintf(page + len, count - len,
587 "%2.2x ",read_nic_byte(dev,(page0|n)));
589 len += snprintf(page + len, count - len,"\n");
594 static int proc_get_registers_3(char *page, char **start,
595 off_t offset, int count,
596 int *eof, void *data)
598 struct net_device *dev = data;
606 /* This dump the current register page */
607 len += snprintf(page + len, count - len,
608 "\n####################page %x##################\n ", (page0>>8));
611 len += snprintf(page + len, count - len,
613 for(i=0;i<16 && n<=max;i++,n++)
614 len += snprintf(page + len, count - len,
615 "%2.2x ",read_nic_byte(dev,(page0|n)));
617 len += snprintf(page + len, count - len,"\n");
622 static int proc_get_registers_4(char *page, char **start,
623 off_t offset, int count,
624 int *eof, void *data)
626 struct net_device *dev = data;
634 /* This dump the current register page */
635 len += snprintf(page + len, count - len,
636 "\n####################page %x##################\n ", (page0>>8));
639 len += snprintf(page + len, count - len,
641 for(i=0;i<16 && n<=max;i++,n++)
642 len += snprintf(page + len, count - len,
643 "%2.2x ",read_nic_byte(dev,(page0|n)));
645 len += snprintf(page + len, count - len,"\n");
650 static int proc_get_registers_5(char *page, char **start,
651 off_t offset, int count,
652 int *eof, void *data)
654 struct net_device *dev = data;
662 /* This dump the current register page */
663 len += snprintf(page + len, count - len,
664 "\n####################page %x##################\n ", (page0>>8));
667 len += snprintf(page + len, count - len,
669 for(i=0;i<16 && n<=max;i++,n++)
670 len += snprintf(page + len, count - len,
671 "%2.2x ",read_nic_byte(dev,(page0|n)));
673 len += snprintf(page + len, count - len,"\n");
678 static int proc_get_registers_6(char *page, char **start,
679 off_t offset, int count,
680 int *eof, void *data)
682 struct net_device *dev = data;
690 /* This dump the current register page */
691 len += snprintf(page + len, count - len,
692 "\n####################page %x##################\n ", (page0>>8));
695 len += snprintf(page + len, count - len,
697 for(i=0;i<16 && n<=max;i++,n++)
698 len += snprintf(page + len, count - len,
699 "%2.2x ",read_nic_byte(dev,(page0|n)));
701 len += snprintf(page + len, count - len,"\n");
706 static int proc_get_registers_7(char *page, char **start,
707 off_t offset, int count,
708 int *eof, void *data)
710 struct net_device *dev = data;
718 /* This dump the current register page */
719 len += snprintf(page + len, count - len,
720 "\n####################page %x##################\n ", (page0>>8));
723 len += snprintf(page + len, count - len,
725 for(i=0;i<16 && n<=max;i++,n++)
726 len += snprintf(page + len, count - len,
727 "%2.2x ",read_nic_byte(dev,(page0|n)));
729 len += snprintf(page + len, count - len,"\n");
734 static int proc_get_registers_8(char *page, char **start,
735 off_t offset, int count,
736 int *eof, void *data)
738 struct net_device *dev = data;
746 /* This dump the current register page */
747 len += snprintf(page + len, count - len,
748 "\n####################page %x##################\n ", (page0>>8));
751 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
752 for(i=0;i<4 && n<=max;n+=4,i++)
753 len += snprintf(page + len, count - len,
754 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
756 len += snprintf(page + len, count - len,"\n");
761 static int proc_get_registers_9(char *page, char **start,
762 off_t offset, int count,
763 int *eof, void *data)
765 struct net_device *dev = data;
773 /* This dump the current register page */
774 len += snprintf(page + len, count - len,
775 "\n####################page %x##################\n ", (page0>>8));
778 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
779 for(i=0;i<4 && n<=max;n+=4,i++)
780 len += snprintf(page + len, count - len,
781 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
783 len += snprintf(page + len, count - len,"\n");
787 static int proc_get_registers_a(char *page, char **start,
788 off_t offset, int count,
789 int *eof, void *data)
791 struct net_device *dev = data;
799 /* This dump the current register page */
800 len += snprintf(page + len, count - len,
801 "\n####################page %x##################\n ", (page0>>8));
804 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
805 for(i=0;i<4 && n<=max;n+=4,i++)
806 len += snprintf(page + len, count - len,
807 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
809 len += snprintf(page + len, count - len,"\n");
813 static int proc_get_registers_b(char *page, char **start,
814 off_t offset, int count,
815 int *eof, void *data)
817 struct net_device *dev = data;
825 /* This dump the current register page */
826 len += snprintf(page + len, count - len,
827 "\n####################page %x##################\n ", (page0>>8));
830 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
831 for(i=0;i<4 && n<=max;n+=4,i++)
832 len += snprintf(page + len, count - len,
833 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
835 len += snprintf(page + len, count - len,"\n");
839 static int proc_get_registers_c(char *page, char **start,
840 off_t offset, int count,
841 int *eof, void *data)
843 struct net_device *dev = data;
851 /* This dump the current register page */
852 len += snprintf(page + len, count - len,
853 "\n####################page %x##################\n ", (page0>>8));
856 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
857 for(i=0;i<4 && n<=max;n+=4,i++)
858 len += snprintf(page + len, count - len,
859 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
861 len += snprintf(page + len, count - len,"\n");
865 static int proc_get_registers_d(char *page, char **start,
866 off_t offset, int count,
867 int *eof, void *data)
869 struct net_device *dev = data;
877 /* This dump the current register page */
878 len += snprintf(page + len, count - len,
879 "\n####################page %x##################\n ", (page0>>8));
882 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
883 for(i=0;i<4 && n<=max;n+=4,i++)
884 len += snprintf(page + len, count - len,
885 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
887 len += snprintf(page + len, count - len,"\n");
891 static int proc_get_registers_e(char *page, char **start,
892 off_t offset, int count,
893 int *eof, void *data)
895 struct net_device *dev = data;
903 /* This dump the current register page */
904 len += snprintf(page + len, count - len,
905 "\n####################page %x##################\n ", (page0>>8));
908 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
909 for(i=0;i<4 && n<=max;n+=4,i++)
910 len += snprintf(page + len, count - len,
911 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
913 len += snprintf(page + len, count - len,"\n");
918 static int proc_get_reg_rf_a(char *page, char **start,
919 off_t offset, int count,
920 int *eof, void *data)
922 struct net_device *dev = data;
929 /* This dump the current register page */
930 len += snprintf(page + len, count - len,
931 "\n#################### RF-A ##################\n ");
934 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
935 for(i=0;i<4 && n<=max;n+=4,i++)
936 len += snprintf(page + len, count - len,
937 "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,n, bMaskDWord));
939 len += snprintf(page + len, count - len,"\n");
944 static int proc_get_reg_rf_b(char *page, char **start,
945 off_t offset, int count,
946 int *eof, void *data)
948 struct net_device *dev = data;
955 /* This dump the current register page */
956 len += snprintf(page + len, count - len,
957 "\n#################### RF-B ##################\n ");
960 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
961 for(i=0;i<4 && n<=max;n+=4,i++)
962 len += snprintf(page + len, count - len,
963 "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_B, n, bMaskDWord));
965 len += snprintf(page + len, count - len,"\n");
970 static int proc_get_reg_rf_c(char *page, char **start,
971 off_t offset, int count,
972 int *eof, void *data)
974 struct net_device *dev = data;
981 /* This dump the current register page */
982 len += snprintf(page + len, count - len,
983 "\n#################### RF-C ##################\n ");
986 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
987 for(i=0;i<4 && n<=max;n+=4,i++)
988 len += snprintf(page + len, count - len,
989 "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_C, n, bMaskDWord));
991 len += snprintf(page + len, count - len,"\n");
996 static int proc_get_reg_rf_d(char *page, char **start,
997 off_t offset, int count,
998 int *eof, void *data)
1000 struct net_device *dev = data;
1007 /* This dump the current register page */
1008 len += snprintf(page + len, count - len,
1009 "\n#################### RF-D ##################\n ");
1012 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
1013 for(i=0;i<4 && n<=max;n+=4,i++)
1014 len += snprintf(page + len, count - len,
1015 "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_D, n, bMaskDWord));
1017 len += snprintf(page + len, count - len,"\n");
1022 static int proc_get_cam_register(char *page, char **start,
1023 off_t offset, int count,
1024 int *eof, void *data)
1026 struct net_device *dev = data;
1027 u32 target_command=0;
1028 u32 target_content=0;
1034 /* This dump the current register page */
1035 len += snprintf(page + len, count - len,
1036 "\n#################### SECURITY CAM ##################\n ");
1037 for(j=0; j<TOTAL_CAM_ENTRY; j++)
1041 len += snprintf(page + len, count - len, "\nD: %2x > ",j);
1042 for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
1044 target_command= entry_i+CAM_CONTENT_COUNT*j;
1045 target_command= target_command | BIT31;
1049 ulStatus = read_nic_dword(dev, RWCAM);
1050 if(ulStatus & BIT31){
1057 write_nic_dword(dev, RWCAM, target_command);
1058 target_content = read_nic_dword(dev, RCAMO);
1059 len += snprintf(page + len, count - len,"%8.8x ",target_content);
1063 len += snprintf(page + len, count - len,"\n");
1068 static int proc_get_stats_tx(char *page, char **start,
1069 off_t offset, int count,
1070 int *eof, void *data)
1072 struct net_device *dev = data;
1073 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1077 len += snprintf(page + len, count - len,
1078 "TX VI priority ok int: %lu\n"
1079 "TX VO priority ok int: %lu\n"
1080 "TX BE priority ok int: %lu\n"
1081 "TX BK priority ok int: %lu\n"
1082 "TX MANAGE priority ok int: %lu\n"
1083 "TX BEACON priority ok int: %lu\n"
1084 "TX BEACON priority error int: %lu\n"
1085 "TX CMDPKT priority ok int: %lu\n"
1086 "TX queue stopped?: %d\n"
1087 "TX fifo overflow: %lu\n"
1088 "TX total data packets %lu\n"
1089 "TX total data bytes :%lu\n",
1090 priv->stats.txviokint,
1091 priv->stats.txvookint,
1092 priv->stats.txbeokint,
1093 priv->stats.txbkokint,
1094 priv->stats.txmanageokint,
1095 priv->stats.txbeaconokint,
1096 priv->stats.txbeaconerr,
1097 priv->stats.txcmdpktokint,
1098 netif_queue_stopped(dev),
1099 priv->stats.txoverflow,
1100 priv->rtllib->stats.tx_packets,
1101 priv->rtllib->stats.tx_bytes
1112 static int proc_get_stats_rx(char *page, char **start,
1113 off_t offset, int count,
1114 int *eof, void *data)
1116 struct net_device *dev = data;
1117 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1121 len += snprintf(page + len, count - len,
1123 "RX data crc err: %lu\n"
1124 "RX mgmt crc err: %lu\n"
1125 "RX desc err: %lu\n"
1126 "RX rx overflow error: %lu\n",
1128 priv->stats.rxdatacrcerr,
1129 priv->stats.rxmgmtcrcerr,
1131 priv->stats.rxoverflow);
1137 void rtl8192_proc_module_init(void)
1139 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
1140 #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
1141 rtl8192_proc=create_proc_entry(DRV_NAME, S_IFDIR, proc_net);
1143 rtl8192_proc=create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
1148 void rtl8192_proc_module_remove(void)
1150 #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
1151 remove_proc_entry(DRV_NAME, proc_net);
1153 remove_proc_entry(DRV_NAME, init_net.proc_net);
1158 void rtl8192_proc_remove_one(struct net_device *dev)
1160 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1162 printk("dev name %s\n",dev->name);
1164 if (priv->dir_dev) {
1165 remove_proc_entry("stats-tx", priv->dir_dev);
1166 remove_proc_entry("stats-rx", priv->dir_dev);
1167 remove_proc_entry("stats-ap", priv->dir_dev);
1168 remove_proc_entry("registers-0", priv->dir_dev);
1169 remove_proc_entry("registers-1", priv->dir_dev);
1170 remove_proc_entry("registers-2", priv->dir_dev);
1171 remove_proc_entry("registers-3", priv->dir_dev);
1172 remove_proc_entry("registers-4", priv->dir_dev);
1173 remove_proc_entry("registers-5", priv->dir_dev);
1174 remove_proc_entry("registers-6", priv->dir_dev);
1175 remove_proc_entry("registers-7", priv->dir_dev);
1176 remove_proc_entry("registers-8", priv->dir_dev);
1177 remove_proc_entry("registers-9", priv->dir_dev);
1178 remove_proc_entry("registers-a", priv->dir_dev);
1179 remove_proc_entry("registers-b", priv->dir_dev);
1180 remove_proc_entry("registers-c", priv->dir_dev);
1181 remove_proc_entry("registers-d", priv->dir_dev);
1182 remove_proc_entry("registers-e", priv->dir_dev);
1183 remove_proc_entry("RF-A", priv->dir_dev);
1184 remove_proc_entry("RF-B", priv->dir_dev);
1185 remove_proc_entry("RF-C", priv->dir_dev);
1186 remove_proc_entry("RF-D", priv->dir_dev);
1187 remove_proc_entry("SEC-CAM", priv->dir_dev);
1188 #ifdef _RTL8192_EXT_PATCH_
1189 remove_proc_entry("ra0", rtl8192_proc);
1191 remove_proc_entry("wlan0", rtl8192_proc);
1193 priv->dir_dev = NULL;
1198 void rtl8192_proc_init_one(struct net_device *dev)
1200 struct proc_dir_entry *e;
1201 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1202 priv->dir_dev = create_proc_entry(dev->name,
1203 S_IFDIR | S_IRUGO | S_IXUGO,
1205 if (!priv->dir_dev) {
1206 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
1210 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
1211 priv->dir_dev, proc_get_stats_rx, dev);
1214 RT_TRACE(COMP_ERR,"Unable to initialize "
1215 "/proc/net/rtl8192/%s/stats-rx\n",
1220 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
1221 priv->dir_dev, proc_get_stats_tx, dev);
1224 RT_TRACE(COMP_ERR, "Unable to initialize "
1225 "/proc/net/rtl8192/%s/stats-tx\n",
1229 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
1230 priv->dir_dev, proc_get_stats_ap, dev);
1233 RT_TRACE(COMP_ERR, "Unable to initialize "
1234 "/proc/net/rtl8192/%s/stats-ap\n",
1238 e = create_proc_read_entry("registers-0", S_IFREG | S_IRUGO,
1239 priv->dir_dev, proc_get_registers_0, dev);
1241 RT_TRACE(COMP_ERR, "Unable to initialize "
1242 "/proc/net/rtl8192/%s/registers-0\n",
1245 e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
1246 priv->dir_dev, proc_get_registers_1, dev);
1248 RT_TRACE(COMP_ERR, "Unable to initialize "
1249 "/proc/net/rtl8192/%s/registers-1\n",
1252 e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
1253 priv->dir_dev, proc_get_registers_2, dev);
1255 RT_TRACE(COMP_ERR, "Unable to initialize "
1256 "/proc/net/rtl8192/%s/registers-2\n",
1259 e = create_proc_read_entry("registers-3", S_IFREG | S_IRUGO,
1260 priv->dir_dev, proc_get_registers_3, dev);
1262 RT_TRACE(COMP_ERR, "Unable to initialize "
1263 "/proc/net/rtl8192/%s/registers-3\n",
1266 e = create_proc_read_entry("registers-4", S_IFREG | S_IRUGO,
1267 priv->dir_dev, proc_get_registers_4, dev);
1269 RT_TRACE(COMP_ERR, "Unable to initialize "
1270 "/proc/net/rtl8192/%s/registers-4\n",
1273 e = create_proc_read_entry("registers-5", S_IFREG | S_IRUGO,
1274 priv->dir_dev, proc_get_registers_5, dev);
1276 RT_TRACE(COMP_ERR, "Unable to initialize "
1277 "/proc/net/rtl8192/%s/registers-5\n",
1280 e = create_proc_read_entry("registers-6", S_IFREG | S_IRUGO,
1281 priv->dir_dev, proc_get_registers_6, dev);
1283 RT_TRACE(COMP_ERR, "Unable to initialize "
1284 "/proc/net/rtl8192/%s/registers-6\n",
1287 e = create_proc_read_entry("registers-7", S_IFREG | S_IRUGO,
1288 priv->dir_dev, proc_get_registers_7, dev);
1290 RT_TRACE(COMP_ERR, "Unable to initialize "
1291 "/proc/net/rtl8192/%s/registers-7\n",
1294 e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
1295 priv->dir_dev, proc_get_registers_8, dev);
1297 RT_TRACE(COMP_ERR, "Unable to initialize "
1298 "/proc/net/rtl8192/%s/registers-8\n",
1301 e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
1302 priv->dir_dev, proc_get_registers_9, dev);
1304 RT_TRACE(COMP_ERR, "Unable to initialize "
1305 "/proc/net/rtl8192/%s/registers-9\n",
1308 e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
1309 priv->dir_dev, proc_get_registers_a, dev);
1311 RT_TRACE(COMP_ERR, "Unable to initialize "
1312 "/proc/net/rtl8192/%s/registers-a\n",
1315 e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
1316 priv->dir_dev, proc_get_registers_b, dev);
1318 RT_TRACE(COMP_ERR, "Unable to initialize "
1319 "/proc/net/rtl8192/%s/registers-b\n",
1322 e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
1323 priv->dir_dev, proc_get_registers_c, dev);
1325 RT_TRACE(COMP_ERR, "Unable to initialize "
1326 "/proc/net/rtl8192/%s/registers-c\n",
1329 e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
1330 priv->dir_dev, proc_get_registers_d, dev);
1332 RT_TRACE(COMP_ERR, "Unable to initialize "
1333 "/proc/net/rtl8192/%s/registers-d\n",
1336 e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
1337 priv->dir_dev, proc_get_registers_e, dev);
1339 RT_TRACE(COMP_ERR, "Unable to initialize "
1340 "/proc/net/rtl8192/%s/registers-e\n",
1343 e = create_proc_read_entry("RF-A", S_IFREG | S_IRUGO,
1344 priv->dir_dev, proc_get_reg_rf_a, dev);
1346 RT_TRACE(COMP_ERR, "Unable to initialize "
1347 "/proc/net/rtl8192/%s/RF-A\n",
1350 e = create_proc_read_entry("RF-B", S_IFREG | S_IRUGO,
1351 priv->dir_dev, proc_get_reg_rf_b, dev);
1353 RT_TRACE(COMP_ERR, "Unable to initialize "
1354 "/proc/net/rtl8192/%s/RF-B\n",
1357 e = create_proc_read_entry("RF-C", S_IFREG | S_IRUGO,
1358 priv->dir_dev, proc_get_reg_rf_c, dev);
1360 RT_TRACE(COMP_ERR, "Unable to initialize "
1361 "/proc/net/rtl8192/%s/RF-C\n",
1364 e = create_proc_read_entry("RF-D", S_IFREG | S_IRUGO,
1365 priv->dir_dev, proc_get_reg_rf_d, dev);
1367 RT_TRACE(COMP_ERR, "Unable to initialize "
1368 "/proc/net/rtl8192/%s/RF-D\n",
1371 e = create_proc_read_entry("SEC-CAM", S_IFREG | S_IRUGO,
1372 priv->dir_dev, proc_get_cam_register, dev);
1374 RT_TRACE(COMP_ERR, "Unable to initialize "
1375 "/proc/net/rtl8192/%s/SEC-CAM\n",
1378 #ifdef _RTL8192_EXT_PATCH_
1379 if( priv->mshobj && priv->mshobj->ext_patch_create_proc )
1380 priv->mshobj->ext_patch_create_proc(priv);