2 This is part of rtl818x pci OpenSource driver - v 0.1
3 Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
4 Released under the terms of GPL (General Public License)
6 Parts of this driver are based on the GPL part of the official
9 Parts of this driver are based on the rtl8180 driver skeleton
10 from Patric Schenke & Andres Salomon.
12 Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver.
14 Parts of BB/RF code are derived from David Young rtl8180 netbsd driver.
16 RSSI calc function from 'The Deuce'
18 Some ideas borrowed from the 8139too.c driver included in linux kernel.
20 We (I?) want to thanks the Authors of those projecs and also the
21 Ndiswrapper's project Authors.
23 A big big thanks goes also to Realtek corp. for their help in my attempt to
24 add RTL8185 and RTL8225 support, and to David Young also.
27 #undef RX_DONT_PASS_UL
30 #include <linux/syscalls.h>
31 //#include <linux/fcntl.h>
32 //#include <asm/uaccess.h>
35 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
36 #include "r8180_93cx6.h" /* Card EEPROM */
42 #include "ieee80211/dot11d.h"
44 #ifndef PCI_VENDOR_ID_BELKIN
45 #define PCI_VENDOR_ID_BELKIN 0x1799
47 #ifndef PCI_VENDOR_ID_DLINK
48 #define PCI_VENDOR_ID_DLINK 0x1186
51 static struct pci_device_id rtl8180_pci_id_tbl[] __devinitdata = {
53 .vendor = PCI_VENDOR_ID_REALTEK,
56 .subvendor = PCI_ANY_ID,
57 .subdevice = PCI_ANY_ID,
70 static char* ifname = "wlan%d";
71 static int hwseqnum = 0;
72 //static char* ifname = "ath%d";
74 static int channels = 0x3fff;
76 #define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
77 #define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
78 MODULE_LICENSE("GPL");
79 MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl);
80 MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
81 MODULE_DESCRIPTION("Linux driver for Realtek RTL8180 / RTL8185 WiFi cards");
86 MODULE_PARM(ifname, "s");
87 MODULE_PARM_DESC(devname," Net interface name, wlan%d=default");
89 MODULE_PARM(hwseqnum,"i");
90 MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
92 MODULE_PARM(hwwep,"i");
93 MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
95 MODULE_PARM(channels,"i");
96 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
99 module_param(ifname, charp, S_IRUGO|S_IWUSR );
100 module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
101 module_param(hwwep,int, S_IRUGO|S_IWUSR);
102 module_param(channels,int, S_IRUGO|S_IWUSR);
104 MODULE_PARM_DESC(devname," Net interface name, wlan%d=default");
105 //MODULE_PARM_DESC(devname," Net interface name, ath%d=default");
106 MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
107 MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
108 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
111 static int __devinit rtl8180_pci_probe(struct pci_dev *pdev,
112 const struct pci_device_id *id);
114 static void __devexit rtl8180_pci_remove(struct pci_dev *pdev);
116 static void rtl8180_shutdown (struct pci_dev *pdev)
118 struct net_device *dev = pci_get_drvdata(pdev);
119 if (dev->netdev_ops->ndo_stop)
120 dev->netdev_ops->ndo_stop(dev);
121 pci_disable_device(pdev);
124 static struct pci_driver rtl8180_pci_driver = {
125 .name = RTL8180_MODULE_NAME, /* Driver name */
126 .id_table = rtl8180_pci_id_tbl, /* PCI_ID table */
127 .probe = rtl8180_pci_probe, /* probe fn */
128 .remove = __devexit_p(rtl8180_pci_remove),/* remove fn */
129 .suspend = rtl8180_suspend, /* PM suspend fn */
130 .resume = rtl8180_resume, /* PM resume fn */
131 .shutdown = rtl8180_shutdown,
137 u8 read_nic_byte(struct net_device *dev, int x)
139 return 0xff&readb((u8*)dev->mem_start +x);
142 u32 read_nic_dword(struct net_device *dev, int x)
144 return readl((u8*)dev->mem_start +x);
147 u16 read_nic_word(struct net_device *dev, int x)
149 return readw((u8*)dev->mem_start +x);
152 void write_nic_byte(struct net_device *dev, int x,u8 y)
154 writeb(y,(u8*)dev->mem_start +x);
158 void write_nic_dword(struct net_device *dev, int x,u32 y)
160 writel(y,(u8*)dev->mem_start +x);
164 void write_nic_word(struct net_device *dev, int x,u16 y)
166 writew(y,(u8*)dev->mem_start +x);
175 inline void force_pci_posting(struct net_device *dev)
177 read_nic_byte(dev,EPROM_CMD);
182 irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs);
183 void set_nic_rxring(struct net_device *dev);
184 void set_nic_txring(struct net_device *dev);
185 static struct net_device_stats *rtl8180_stats(struct net_device *dev);
186 void rtl8180_commit(struct net_device *dev);
187 void rtl8180_start_tx_beacon(struct net_device *dev);
189 /****************************************************************************
190 -----------------------------PROCFS STUFF-------------------------
191 *****************************************************************************/
193 static struct proc_dir_entry *rtl8180_proc = NULL;
195 static int proc_get_registers(char *page, char **start,
196 off_t offset, int count,
197 int *eof, void *data)
199 struct net_device *dev = data;
200 // struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
207 /* This dump the current register page */
210 //printk( "\nD: %2x> ", n);
211 len += snprintf(page + len, count - len,
214 for(i=0;i<16 && n<=max;i++,n++)
215 len += snprintf(page + len, count - len,
216 "%2x ",read_nic_byte(dev,n));
218 // printk("%2x ",read_nic_byte(dev,n));
220 len += snprintf(page + len, count - len,"\n");
229 int get_curr_tx_free_desc(struct net_device *dev, int priority);
231 static int proc_get_stats_hw(char *page, char **start,
232 off_t offset, int count,
233 int *eof, void *data)
235 //struct net_device *dev = data;
236 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
245 static int proc_get_stats_rx(char *page, char **start,
246 off_t offset, int count,
247 int *eof, void *data)
249 struct net_device *dev = data;
250 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
254 len += snprintf(page + len, count - len,
255 /* "RX descriptor not available: %lu\n"
256 "RX incomplete (missing last descriptor): %lu\n"
258 //"RX descriptor pointer reset: %lu\n"
259 "RX descriptor pointer lost: %lu\n"
260 //"RX pointer workaround: %lu\n"
261 "RX error int: %lu\n"
262 "RX fifo overflow: %lu\n"
266 "RX DMA fail: %lu\n",
268 priv->stats.rxnolast,
269 priv->stats.rxnodata,
270 //priv->stats.rxreset,
271 priv->stats.rxnopointer,
272 //priv->stats.rxwrkaround,
274 priv->stats.rxoverflow,
276 priv->ieee80211->stats.rx_packets,
277 priv->ieee80211->stats.rx_bytes,
278 priv->stats.rxdmafail */
281 "RX CRC Error(0-500): %lu\n"
282 "RX CRC Error(500-1000): %lu\n"
283 "RX CRC Error(>1000): %lu\n"
284 "RX ICV Error: %lu\n",
287 priv->stats.rxcrcerrmin,
288 priv->stats.rxcrcerrmid,
289 priv->stats.rxcrcerrmax,
297 static int proc_get_stats_tx(char *page, char **start,
298 off_t offset, int count,
299 int *eof, void *data)
301 struct net_device *dev = data;
302 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
305 unsigned long totalOK;
307 totalOK=priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint;
308 len += snprintf(page + len, count - len,
309 /* "TX normal priority ok int: %lu\n"
310 "TX normal priority error int: %lu\n"
311 "TX high priority ok int: %lu\n"
312 "TX high priority failed error int: %lu\n"
313 "TX low priority ok int: %lu\n"
314 "TX low priority failed error int: %lu\n"
317 "TX queue resume: %lu\n"
318 "TX queue stopped?: %d\n"
319 "TX fifo overflow: %lu\n"
320 //"SW TX stop: %lu\n"
321 //"SW TX wake: %lu\n"
323 "TX beacon aborted: %lu\n",
324 priv->stats.txnpokint,
326 priv->stats.txhpokint,
328 priv->stats.txlpokint,
330 priv->ieee80211->stats.tx_bytes,
331 priv->ieee80211->stats.tx_packets,
332 priv->stats.txresumed,
333 netif_queue_stopped(dev),
334 priv->stats.txoverflow,
335 //priv->ieee80211->ieee_stats.swtxstop,
336 //priv->ieee80211->ieee_stats.swtxawake,
337 priv->stats.txbeacon,
338 priv->stats.txbeaconerr */
342 "TX beacon OK: %lu\n"
343 "TX beacon error: %lu\n",
345 priv->stats.txnperr+priv->stats.txhperr+priv->stats.txlperr,
347 priv->stats.txbeacon,
348 priv->stats.txbeaconerr
355 void rtl8180_proc_module_init(void)
357 DMESG("Initializing proc filesystem");
358 rtl8180_proc=create_proc_entry(RTL8180_MODULE_NAME, S_IFDIR, init_net.proc_net);
362 void rtl8180_proc_module_remove(void)
364 remove_proc_entry(RTL8180_MODULE_NAME, init_net.proc_net);
368 void rtl8180_proc_remove_one(struct net_device *dev)
370 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
372 remove_proc_entry("stats-hw", priv->dir_dev);
373 remove_proc_entry("stats-tx", priv->dir_dev);
374 remove_proc_entry("stats-rx", priv->dir_dev);
375 // remove_proc_entry("stats-ieee", priv->dir_dev);
376 // remove_proc_entry("stats-ap", priv->dir_dev);
377 remove_proc_entry("registers", priv->dir_dev);
378 remove_proc_entry(dev->name, rtl8180_proc);
379 priv->dir_dev = NULL;
384 void rtl8180_proc_init_one(struct net_device *dev)
386 struct proc_dir_entry *e;
387 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
388 priv->dir_dev = rtl8180_proc;
389 if (!priv->dir_dev) {
390 DMESGE("Unable to initialize /proc/net/r8180/%s\n",
395 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO,
396 priv->dir_dev, proc_get_stats_hw, dev);
399 DMESGE("Unable to initialize "
400 "/proc/net/r8180/%s/stats-hw\n",
404 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
405 priv->dir_dev, proc_get_stats_rx, dev);
408 DMESGE("Unable to initialize "
409 "/proc/net/r8180/%s/stats-rx\n",
414 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
415 priv->dir_dev, proc_get_stats_tx, dev);
418 DMESGE("Unable to initialize "
419 "/proc/net/r8180/%s/stats-tx\n",
423 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
424 priv->dir_dev, proc_get_registers, dev);
427 DMESGE("Unable to initialize "
428 "/proc/net/r8180/%s/registers\n",
432 /****************************************************************************
433 -----------------------------MISC STUFF-------------------------
434 *****************************************************************************/
436 FIXME: check if we can use some standard already-existent
437 data type+functions in kernel
440 short buffer_add(struct buffer **buffer, u32 *buf, dma_addr_t dma,
441 struct buffer **bufferhead)
447 *buffer = kmalloc(sizeof(struct buffer),GFP_KERNEL);
449 if (*buffer == NULL) {
450 DMESGE("Failed to kmalloc head of TX/RX struct");
453 (*buffer)->next=*buffer;
456 if(bufferhead !=NULL)
457 (*bufferhead) = (*buffer);
462 while(tmp->next!=(*buffer)) tmp=tmp->next;
463 if ((tmp->next= kmalloc(sizeof(struct buffer),GFP_KERNEL)) == NULL){
464 DMESGE("Failed to kmalloc TX/RX struct");
469 tmp->next->next=*buffer;
475 void buffer_free(struct net_device *dev,struct buffer **buffer,int len,short
479 struct buffer *tmp,*next;
480 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
481 struct pci_dev *pdev=priv->pdev;
484 if(! *buffer) return;
486 /*for(tmp=*buffer; tmp->next != *buffer; tmp=tmp->next)
493 pci_free_consistent(pdev,len,
496 pci_unmap_single(pdev, tmp->dma,
497 len,PCI_DMA_FROMDEVICE);
503 while(next != *buffer);
509 void print_buffer(u32 *buffer, int len)
512 u8 *buf =(u8*)buffer;
514 printk("ASCII BUFFER DUMP (len: %x):\n",len);
519 printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
522 printk("%02x",buf[i]);
528 int get_curr_tx_free_desc(struct net_device *dev, int priority)
530 struct r8180_priv *priv = ieee80211_priv(dev);
536 case MANAGE_PRIORITY:
537 head = priv->txmapringhead;
538 tail = priv->txmapringtail;
541 head = priv->txbkpringhead;
542 tail = priv->txbkpringtail;
545 head = priv->txbepringhead;
546 tail = priv->txbepringtail;
549 head = priv->txvipringhead;
550 tail = priv->txvipringtail;
553 head = priv->txvopringhead;
554 tail = priv->txvopringtail;
557 head = priv->txhpringhead;
558 tail = priv->txhpringtail;
564 //DMESG("%x %x", head, tail);
566 /* FIXME FIXME FIXME FIXME */
569 ret = priv->txringcount - (tail - head)/8;
571 ret = (head - tail)/8;
573 if(ret > priv->txringcount ) DMESG("BUG");
578 short check_nic_enought_desc(struct net_device *dev, int priority)
580 struct r8180_priv *priv = ieee80211_priv(dev);
581 struct ieee80211_device *ieee = netdev_priv(dev);
583 int requiredbyte, required;
584 requiredbyte = priv->ieee80211->fts + sizeof(struct ieee80211_header_data);
586 if(ieee->current_network.QoS_Enable) {
590 required = requiredbyte / (priv->txbuffsize-4);
591 if (requiredbyte % priv->txbuffsize) required++;
592 /* for now we keep two free descriptor as a safety boundary
593 * between the tail and the head
596 return (required+2 < get_curr_tx_free_desc(dev,priority));
599 void fix_tx_fifo(struct net_device *dev)
601 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
605 for (tmp=priv->txmapring, i=0;
606 i < priv->txringcount;
608 *tmp = *tmp &~ (1<<31);
611 for (tmp=priv->txbkpring, i=0;
612 i < priv->txringcount;
614 *tmp = *tmp &~ (1<<31);
617 for (tmp=priv->txbepring, i=0;
618 i < priv->txringcount;
620 *tmp = *tmp &~ (1<<31);
622 for (tmp=priv->txvipring, i=0;
623 i < priv->txringcount;
625 *tmp = *tmp &~ (1<<31);
628 for (tmp=priv->txvopring, i=0;
629 i < priv->txringcount;
631 *tmp = *tmp &~ (1<<31);
634 for (tmp=priv->txhpring, i=0;
635 i < priv->txringcount;
637 *tmp = *tmp &~ (1<<31);
640 for (tmp=priv->txbeaconring, i=0;
641 i < priv->txbeaconcount;
643 *tmp = *tmp &~ (1<<31);
646 priv->txmapringtail = priv->txmapring;
647 priv->txmapringhead = priv->txmapring;
648 priv->txmapbufstail = priv->txmapbufs;
650 priv->txbkpringtail = priv->txbkpring;
651 priv->txbkpringhead = priv->txbkpring;
652 priv->txbkpbufstail = priv->txbkpbufs;
654 priv->txbepringtail = priv->txbepring;
655 priv->txbepringhead = priv->txbepring;
656 priv->txbepbufstail = priv->txbepbufs;
658 priv->txvipringtail = priv->txvipring;
659 priv->txvipringhead = priv->txvipring;
660 priv->txvipbufstail = priv->txvipbufs;
662 priv->txvopringtail = priv->txvopring;
663 priv->txvopringhead = priv->txvopring;
664 priv->txvopbufstail = priv->txvopbufs;
666 priv->txhpringtail = priv->txhpring;
667 priv->txhpringhead = priv->txhpring;
668 priv->txhpbufstail = priv->txhpbufs;
670 priv->txbeaconringtail = priv->txbeaconring;
671 priv->txbeaconbufstail = priv->txbeaconbufs;
674 ieee80211_reset_queue(priv->ieee80211);
675 priv->ack_tx_to_ieee = 0;
679 void fix_rx_fifo(struct net_device *dev)
681 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
683 struct buffer *rxbuf;
686 rx_desc_size = 8; // 4*8 = 32 bytes
688 for (tmp=priv->rxring, rxbuf=priv->rxbufferhead;
689 (tmp < (priv->rxring)+(priv->rxringcount)*rx_desc_size);
690 tmp+=rx_desc_size,rxbuf=rxbuf->next){
691 *(tmp+2) = rxbuf->dma;
693 *tmp=*tmp | priv->rxbuffersize;
697 priv->rxringtail=priv->rxring;
698 priv->rxbuffer=priv->rxbufferhead;
699 priv->rx_skb_complete=1;
704 /****************************************************************************
705 ------------------------------HW STUFF---------------------------
706 *****************************************************************************/
708 unsigned char QUALITY_MAP[] = {
709 0x64, 0x64, 0x64, 0x63, 0x63, 0x62, 0x62, 0x61,
710 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 0x5d, 0x5c,
711 0x5b, 0x5a, 0x59, 0x57, 0x56, 0x54, 0x52, 0x4f,
712 0x4c, 0x49, 0x45, 0x41, 0x3c, 0x37, 0x31, 0x29,
713 0x24, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
714 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x20,
715 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e,
716 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x19, 0x19,
717 0x18, 0x17, 0x16, 0x15, 0x14, 0x12, 0x11, 0x0f,
718 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x01, 0x00
721 unsigned char STRENGTH_MAP[] = {
722 0x64, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e,
723 0x5d, 0x5c, 0x5b, 0x5a, 0x57, 0x54, 0x52, 0x50,
724 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x41, 0x3f,
725 0x3c, 0x3a, 0x37, 0x36, 0x36, 0x1c, 0x1c, 0x1b,
726 0x1b, 0x1a, 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17,
727 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13,
728 0x13, 0x12, 0x12, 0x11, 0x11, 0x10, 0x10, 0x0f,
729 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b,
730 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07,
731 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00
734 void rtl8180_RSSI_calc(struct net_device *dev, u8 *rssi, u8 *qual){
735 //void Mlme_UpdateRssiSQ(struct net_device *dev, u8 *rssi, u8 *qual){
736 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
747 _rssi = 0; // avoid gcc complains..
750 temp = QUALITY_MAP[q];
762 switch(priv->rf_chip){
766 if ( !lsb || !(temp2 <= 0x3c) ) {
769 temp2 = 100 * temp2 / 0x3c;
771 *rssi = temp2 & 0xff;
772 _rssi = temp2 & 0xff;
774 case RFCHIPID_INTERSIL:
785 if ( temp2 <= 0x3e0000 ) {
786 if ( temp2 < 0xffef0000 )
800 temp3 = temp3 / 0x6d;
802 _rssi = temp3 & 0xff;
803 *rssi = temp3 & 0xff;
808 if ( ! lsb || !(temp2 <= 0x3c) ){
811 temp2 = (100 * temp2) / 0x3c;
813 *rssi = temp2 & 0xff;
814 _rssi = temp2 & 0xff;
816 case RFCHIPID_PHILIPS:
817 if( orig_qual <= 0x4e ){
818 _rssi = STRENGTH_MAP[orig_qual];
841 *rssi = temp2 & 0xff;
842 _rssi = temp2 & 0xff;
858 void rtl8180_irq_enable(struct net_device *dev)
860 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
861 priv->irq_enabled = 1;
863 write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\
864 INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\
865 INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\
866 INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT);
868 write_nic_word(dev,INTA_MASK, priv->irq_mask);
872 void rtl8180_irq_disable(struct net_device *dev)
874 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
876 write_nic_dword(dev,IMR,0);
877 force_pci_posting(dev);
878 priv->irq_enabled = 0;
882 void rtl8180_set_mode(struct net_device *dev,int mode)
885 ecmd=read_nic_byte(dev, EPROM_CMD);
886 ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
887 ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
888 ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
889 ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
890 write_nic_byte(dev, EPROM_CMD, ecmd);
893 void rtl8180_adapter_start(struct net_device *dev);
894 void rtl8180_beacon_tx_enable(struct net_device *dev);
896 void rtl8180_update_msr(struct net_device *dev)
898 struct r8180_priv *priv = ieee80211_priv(dev);
902 msr = read_nic_byte(dev, MSR);
903 msr &= ~ MSR_LINK_MASK;
905 rxconf=read_nic_dword(dev,RX_CONF);
907 if(priv->ieee80211->state == IEEE80211_LINKED)
909 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
910 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
911 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
912 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
913 else if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
914 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
916 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
917 rxconf |= (1<<RX_CHECK_BSSID_SHIFT);
920 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
921 rxconf &= ~(1<<RX_CHECK_BSSID_SHIFT);
924 write_nic_byte(dev, MSR, msr);
925 write_nic_dword(dev, RX_CONF, rxconf);
931 void rtl8180_set_chan(struct net_device *dev,short ch)
933 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
935 if((ch > 14) || (ch < 1))
937 printk("In %s: Invalid chnanel %d\n", __func__, ch);
942 //printk("in %s:channel is %d\n",__func__,ch);
943 priv->rf_set_chan(dev,priv->chan);
948 void rtl8180_rx_enable(struct net_device *dev)
952 /* for now we accept data, management & ctl frame*/
953 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
955 rxconf=read_nic_dword(dev,RX_CONF);
956 rxconf = rxconf &~ MAC_FILTER_MASK;
957 rxconf = rxconf | (1<<ACCEPT_MNG_FRAME_SHIFT);
958 rxconf = rxconf | (1<<ACCEPT_DATA_FRAME_SHIFT);
959 rxconf = rxconf | (1<<ACCEPT_BCAST_FRAME_SHIFT);
960 rxconf = rxconf | (1<<ACCEPT_MCAST_FRAME_SHIFT);
961 // rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
962 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
964 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
965 dev->flags & IFF_PROMISC){
966 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
968 rxconf = rxconf | (1<<ACCEPT_NICMAC_FRAME_SHIFT);
969 if(priv->card_8185 == 0)
970 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
973 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
974 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
975 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
978 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
979 rxconf = rxconf | (1<<ACCEPT_CTL_FRAME_SHIFT);
980 rxconf = rxconf | (1<<ACCEPT_ICVERR_FRAME_SHIFT);
981 rxconf = rxconf | (1<<ACCEPT_PWR_FRAME_SHIFT);
984 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
985 rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
987 //if(!priv->card_8185){
988 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
989 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
992 rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
993 rxconf = rxconf &~ MAX_RX_DMA_MASK;
994 rxconf = rxconf | (MAX_RX_DMA_2048<<MAX_RX_DMA_SHIFT);
996 //if(!priv->card_8185)
997 rxconf = rxconf | RCR_ONLYERLPKT;
999 rxconf = rxconf &~ RCR_CS_MASK;
1000 if(!priv->card_8185)
1001 rxconf |= (priv->rcr_csense<<RCR_CS_SHIFT);
1002 // rxconf &=~ 0xfff00000;
1003 // rxconf |= 0x90100000;//9014f76f;
1004 write_nic_dword(dev, RX_CONF, rxconf);
1008 cmd=read_nic_byte(dev,CMD);
1009 write_nic_byte(dev,CMD,cmd | (1<<CMD_RX_ENABLE_SHIFT));
1011 /* In rtl8139 driver seems that DMA threshold has to be written
1012 * after enabling RX, so we rewrite RX_CONFIG register
1015 // write_nic_dword(dev, RX_CONF, rxconf);
1020 void set_nic_txring(struct net_device *dev)
1022 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1023 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1025 write_nic_dword(dev, TX_MANAGEPRIORITY_RING_ADDR, priv->txmapringdma);
1026 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1027 write_nic_dword(dev, TX_BKPRIORITY_RING_ADDR, priv->txbkpringdma);
1028 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1029 write_nic_dword(dev, TX_BEPRIORITY_RING_ADDR, priv->txbepringdma);
1030 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1031 write_nic_dword(dev, TX_VIPRIORITY_RING_ADDR, priv->txvipringdma);
1032 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1033 write_nic_dword(dev, TX_VOPRIORITY_RING_ADDR, priv->txvopringdma);
1034 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1035 write_nic_dword(dev, TX_HIGHPRIORITY_RING_ADDR, priv->txhpringdma);
1036 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
1038 write_nic_dword(dev, TX_BEACON_RING_ADDR, priv->txbeaconringdma);
1042 void rtl8180_conttx_enable(struct net_device *dev)
1045 txconf = read_nic_dword(dev,TX_CONF);
1046 txconf = txconf &~ TX_LOOPBACK_MASK;
1047 txconf = txconf | (TX_LOOPBACK_CONTINUE <<TX_LOOPBACK_SHIFT);
1048 write_nic_dword(dev,TX_CONF,txconf);
1052 void rtl8180_conttx_disable(struct net_device *dev)
1055 txconf = read_nic_dword(dev,TX_CONF);
1056 txconf = txconf &~ TX_LOOPBACK_MASK;
1057 txconf = txconf | (TX_LOOPBACK_NONE <<TX_LOOPBACK_SHIFT);
1058 write_nic_dword(dev,TX_CONF,txconf);
1062 void rtl8180_tx_enable(struct net_device *dev)
1068 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1069 txconf= read_nic_dword(dev,TX_CONF);
1072 if(priv->card_8185){
1075 byte = read_nic_byte(dev,CW_CONF);
1076 byte &= ~(1<<CW_CONF_PERPACKET_CW_SHIFT);
1077 byte &= ~(1<<CW_CONF_PERPACKET_RETRY_SHIFT);
1078 write_nic_byte(dev, CW_CONF, byte);
1080 tx_agc_ctl = read_nic_byte(dev, TX_AGC_CTL);
1081 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_GAIN_SHIFT);
1082 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT);
1083 tx_agc_ctl |=(1<<TX_AGC_CTL_FEEDBACK_ANT);
1084 write_nic_byte(dev, TX_AGC_CTL, tx_agc_ctl);
1086 write_nic_word(dev, 0x5e, 0x01);
1087 force_pci_posting(dev);
1089 write_nic_word(dev, 0xfe, 0x10);
1090 force_pci_posting(dev);
1092 write_nic_word(dev, 0x5e, 0x00);
1093 force_pci_posting(dev);
1096 write_nic_byte(dev, 0xec, 0x3f); /* Disable early TX */
1099 if(priv->card_8185){
1101 txconf = txconf &~ (1<<TCR_PROBE_NOTIMESTAMP_SHIFT);
1106 txconf= txconf &~ (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
1108 txconf= txconf | (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
1111 txconf = txconf &~ TX_LOOPBACK_MASK;
1112 txconf = txconf | (TX_LOOPBACK_NONE <<TX_LOOPBACK_SHIFT);
1113 txconf = txconf &~ TCR_DPRETRY_MASK;
1114 txconf = txconf &~ TCR_RTSRETRY_MASK;
1115 txconf = txconf | (priv->retry_data<<TX_DPRETRY_SHIFT);
1116 txconf = txconf | (priv->retry_rts<<TX_RTSRETRY_SHIFT);
1117 txconf = txconf &~ (1<<TX_NOCRC_SHIFT);
1119 if(priv->card_8185){
1120 if(priv->hw_plcp_len)
1121 txconf = txconf &~ TCR_PLCP_LEN;
1123 txconf = txconf | TCR_PLCP_LEN;
1125 txconf = txconf &~ TCR_SAT;
1127 txconf = txconf &~ TCR_MXDMA_MASK;
1128 txconf = txconf | (TCR_MXDMA_2048<<TCR_MXDMA_SHIFT);
1129 txconf = txconf | TCR_CWMIN;
1130 txconf = txconf | TCR_DISCW;
1132 // if(priv->ieee80211->hw_wep)
1133 // txconf=txconf &~ (1<<TX_NOICV_SHIFT);
1135 txconf=txconf | (1<<TX_NOICV_SHIFT);
1137 write_nic_dword(dev,TX_CONF,txconf);
1142 cmd=read_nic_byte(dev,CMD);
1143 write_nic_byte(dev,CMD,cmd | (1<<CMD_TX_ENABLE_SHIFT));
1146 write_nic_dword(dev,TX_CONF,txconf);
1149 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
1150 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
1151 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
1156 void rtl8180_beacon_tx_enable(struct net_device *dev)
1158 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1160 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
1161 priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_BQ);
1162 write_nic_byte(dev,TPPollStop, priv->dma_poll_mask);
1163 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
1167 void rtl8180_beacon_tx_disable(struct net_device *dev)
1169 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1171 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
1172 priv->dma_poll_stop_mask |= TPPOLLSTOP_BQ;
1173 write_nic_byte(dev,TPPollStop, priv->dma_poll_stop_mask);
1174 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
1179 void rtl8180_rtx_disable(struct net_device *dev)
1182 struct r8180_priv *priv = ieee80211_priv(dev);
1184 cmd=read_nic_byte(dev,CMD);
1185 write_nic_byte(dev, CMD, cmd &~ \
1186 ((1<<CMD_RX_ENABLE_SHIFT)|(1<<CMD_TX_ENABLE_SHIFT)));
1187 force_pci_posting(dev);
1189 /*while (read_nic_byte(dev,CMD) & (1<<CMD_RX_ENABLE_SHIFT))
1193 if(!priv->rx_skb_complete)
1194 dev_kfree_skb_any(priv->rx_skb);
1197 short alloc_tx_desc_ring(struct net_device *dev, int bufsize, int count,
1203 dma_addr_t dma_desc, dma_tmp;
1204 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1205 struct pci_dev *pdev = priv->pdev;
1208 if((bufsize & 0xfff) != bufsize) {
1209 DMESGE ("TX buffer allocation too large");
1212 desc = (u32*)pci_alloc_consistent(pdev,
1213 sizeof(u32)*8*count+256, &dma_desc);
1214 if(desc==NULL) return -1;
1215 if(dma_desc & 0xff){
1218 * descriptor's buffer must be 256 byte aligned
1219 * we shouldn't be here, since we set DMA mask !
1221 WARN(1, "DMA buffer is not aligned\n");
1224 for (i=0;i<count;i++)
1226 buf = (void*)pci_alloc_consistent(pdev,bufsize,&dma_tmp);
1227 if (buf == NULL) return -ENOMEM;
1230 case TX_MANAGEPRIORITY_RING_ADDR:
1231 if(-1 == buffer_add(&(priv->txmapbufs),buf,dma_tmp,NULL)){
1232 DMESGE("Unable to allocate mem for buffer NP");
1237 case TX_BKPRIORITY_RING_ADDR:
1238 if(-1 == buffer_add(&(priv->txbkpbufs),buf,dma_tmp,NULL)){
1239 DMESGE("Unable to allocate mem for buffer LP");
1243 case TX_BEPRIORITY_RING_ADDR:
1244 if(-1 == buffer_add(&(priv->txbepbufs),buf,dma_tmp,NULL)){
1245 DMESGE("Unable to allocate mem for buffer NP");
1250 case TX_VIPRIORITY_RING_ADDR:
1251 if(-1 == buffer_add(&(priv->txvipbufs),buf,dma_tmp,NULL)){
1252 DMESGE("Unable to allocate mem for buffer LP");
1256 case TX_VOPRIORITY_RING_ADDR:
1257 if(-1 == buffer_add(&(priv->txvopbufs),buf,dma_tmp,NULL)){
1258 DMESGE("Unable to allocate mem for buffer NP");
1262 case TX_HIGHPRIORITY_RING_ADDR:
1263 if(-1 == buffer_add(&(priv->txhpbufs),buf,dma_tmp,NULL)){
1264 DMESGE("Unable to allocate mem for buffer HP");
1268 case TX_BEACON_RING_ADDR:
1269 if(-1 == buffer_add(&(priv->txbeaconbufs),buf,dma_tmp,NULL)){
1270 DMESGE("Unable to allocate mem for buffer BP");
1275 *tmp = *tmp &~ (1<<31); // descriptor empty, owned by the drv
1276 *(tmp+2) = (u32)dma_tmp;
1280 *(tmp+4) = (u32)dma_desc+((i+1)*8*4);
1282 *(tmp+4) = (u32)dma_desc;
1288 case TX_MANAGEPRIORITY_RING_ADDR:
1289 priv->txmapringdma=dma_desc;
1290 priv->txmapring=desc;
1293 case TX_BKPRIORITY_RING_ADDR:
1294 priv->txbkpringdma=dma_desc;
1295 priv->txbkpring=desc;
1298 case TX_BEPRIORITY_RING_ADDR:
1299 priv->txbepringdma=dma_desc;
1300 priv->txbepring=desc;
1303 case TX_VIPRIORITY_RING_ADDR:
1304 priv->txvipringdma=dma_desc;
1305 priv->txvipring=desc;
1308 case TX_VOPRIORITY_RING_ADDR:
1309 priv->txvopringdma=dma_desc;
1310 priv->txvopring=desc;
1313 case TX_HIGHPRIORITY_RING_ADDR:
1314 priv->txhpringdma=dma_desc;
1315 priv->txhpring=desc;
1318 case TX_BEACON_RING_ADDR:
1319 priv->txbeaconringdma=dma_desc;
1320 priv->txbeaconring=desc;
1329 void free_tx_desc_rings(struct net_device *dev)
1332 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1333 struct pci_dev *pdev=priv->pdev;
1334 int count = priv->txringcount;
1336 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1337 priv->txmapring, priv->txmapringdma);
1338 buffer_free(dev,&(priv->txmapbufs),priv->txbuffsize,1);
1340 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1341 priv->txbkpring, priv->txbkpringdma);
1342 buffer_free(dev,&(priv->txbkpbufs),priv->txbuffsize,1);
1344 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1345 priv->txbepring, priv->txbepringdma);
1346 buffer_free(dev,&(priv->txbepbufs),priv->txbuffsize,1);
1348 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1349 priv->txvipring, priv->txvipringdma);
1350 buffer_free(dev,&(priv->txvipbufs),priv->txbuffsize,1);
1352 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1353 priv->txvopring, priv->txvopringdma);
1354 buffer_free(dev,&(priv->txvopbufs),priv->txbuffsize,1);
1356 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1357 priv->txhpring, priv->txhpringdma);
1358 buffer_free(dev,&(priv->txhpbufs),priv->txbuffsize,1);
1360 count = priv->txbeaconcount;
1361 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1362 priv->txbeaconring, priv->txbeaconringdma);
1363 buffer_free(dev,&(priv->txbeaconbufs),priv->txbuffsize,1);
1366 void free_rx_desc_ring(struct net_device *dev)
1368 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1369 struct pci_dev *pdev = priv->pdev;
1371 int count = priv->rxringcount;
1373 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
1374 priv->rxring, priv->rxringdma);
1376 buffer_free(dev,&(priv->rxbuffer),priv->rxbuffersize,0);
1380 short alloc_rx_desc_ring(struct net_device *dev, u16 bufsize, int count)
1385 dma_addr_t dma_desc,dma_tmp;
1386 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1387 struct pci_dev *pdev=priv->pdev;
1391 rx_desc_size = 8; // 4*8 = 32 bytes
1393 if((bufsize & 0xfff) != bufsize){
1394 DMESGE ("RX buffer allocation too large");
1398 desc = (u32*)pci_alloc_consistent(pdev,sizeof(u32)*rx_desc_size*count+256,
1401 if(dma_desc & 0xff){
1404 * descriptor's buffer must be 256 byte aligned
1405 * should never happen since we specify the DMA mask
1407 WARN(1, "DMA buffer is not aligned\n");
1411 priv->rxringdma=dma_desc;
1414 for (i=0;i<count;i++){
1416 if ((buf= kmalloc(bufsize * sizeof(u8),GFP_ATOMIC)) == NULL){
1417 DMESGE("Failed to kmalloc RX buffer");
1421 dma_tmp = pci_map_single(pdev,buf,bufsize * sizeof(u8),
1422 PCI_DMA_FROMDEVICE);
1424 //buf = (void*)pci_alloc_consistent(pdev,bufsize,&dma_tmp);
1425 if(-1 == buffer_add(&(priv->rxbuffer), buf,dma_tmp,
1426 &(priv->rxbufferhead))){
1427 DMESGE("Unable to allocate mem RX buf");
1430 *tmp = 0; //zero pads the header of the descriptor
1431 *tmp = *tmp |( bufsize&0xfff);
1432 *(tmp+2) = (u32)dma_tmp;
1433 *tmp = *tmp |(1<<31); // descriptor void, owned by the NIC
1435 tmp=tmp+rx_desc_size;
1438 *(tmp-rx_desc_size) = *(tmp-rx_desc_size) | (1<<30); // this is the last descriptor
1444 void set_nic_rxring(struct net_device *dev)
1447 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1449 //rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1451 pgreg=read_nic_byte(dev, PGSELECT);
1452 write_nic_byte(dev, PGSELECT, pgreg &~ (1<<PGSELECT_PG_SHIFT));
1454 //rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1456 write_nic_dword(dev, RXRING_ADDR,priv->rxringdma);
1460 void rtl8180_reset(struct net_device *dev)
1462 //u32 txconf = 0x80e00707; //FIXME: Make me understandable
1465 //write_nic_dword(dev,TX_CONF,txconf);
1467 rtl8180_irq_disable(dev);
1469 cr=read_nic_byte(dev,CMD);
1471 cr = cr | (1<<CMD_RST_SHIFT);
1472 write_nic_byte(dev,CMD,cr);
1474 force_pci_posting(dev);
1478 if(read_nic_byte(dev,CMD) & (1<<CMD_RST_SHIFT))
1479 DMESGW("Card reset timeout!");
1481 DMESG("Card successfully reset");
1483 //#ifndef CONFIG_RTL8185B
1484 rtl8180_set_mode(dev,EPROM_CMD_LOAD);
1485 force_pci_posting(dev);
1490 inline u16 ieeerate2rtlrate(int rate)
1523 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540,720};
1524 inline u16 rtl8180_rate2rate(short rate)
1526 if (rate >12) return 10;
1527 return rtl_rate[rate];
1529 inline u8 rtl8180_IsWirelessBMode(u16 rate)
1531 if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1535 u16 N_DBPSOfRate(u16 DataRate);
1539 u8 bManagementFrame,
1547 if( rtl8180_IsWirelessBMode(DataRate) )
1549 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1551 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1555 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1557 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1559 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1560 N_DBPS = N_DBPSOfRate(DataRate);
1561 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1562 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1563 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1567 u16 N_DBPSOfRate(u16 DataRate)
1615 // For Netgear case, they want good-looking singal strength.
1616 // 2004.12.05, by rcnjko.
1619 NetgearSignalStrengthTranslate(
1626 // Step 1. Scale mapping.
1627 if(CurrSS >= 71 && CurrSS <= 100)
1629 RetSS = 90 + ((CurrSS - 70) / 3);
1631 else if(CurrSS >= 41 && CurrSS <= 70)
1633 RetSS = 78 + ((CurrSS - 40) / 3);
1635 else if(CurrSS >= 31 && CurrSS <= 40)
1637 RetSS = 66 + (CurrSS - 30);
1639 else if(CurrSS >= 21 && CurrSS <= 30)
1641 RetSS = 54 + (CurrSS - 20);
1643 else if(CurrSS >= 5 && CurrSS <= 20)
1645 RetSS = 42 + (((CurrSS - 5) * 2) / 3);
1647 else if(CurrSS == 4)
1651 else if(CurrSS == 3)
1655 else if(CurrSS == 2)
1659 else if(CurrSS == 1)
1667 //RT_TRACE(COMP_DBG, DBG_LOUD, ("##### After Mapping: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
1669 // Step 2. Smoothing.
1672 RetSS = ((LastSS * 5) + (RetSS)+ 5) / 6;
1674 //RT_TRACE(COMP_DBG, DBG_LOUD, ("$$$$$ After Smoothing: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
1680 // Translate 0-100 signal strength index into dBm.
1684 u8 SignalStrengthIndex // 0-100 index.
1687 long SignalPower; // in dBm.
1689 // Translate to dBm (x=0.5y-95).
1690 SignalPower = (long)((SignalStrengthIndex + 1) >> 1);
1697 // Perform signal smoothing for dynamic mechanism.
1698 // This is different with PerformSignalSmoothing8185 in smoothing fomula.
1699 // No dramatic adjustion is apply because dynamic mechanism need some degree
1700 // of correctness. Ported from 8187B.
1701 // 2007-02-26, by Bruce.
1704 PerformUndecoratedSignalSmoothing8185(
1705 struct r8180_priv *priv,
1711 // Determin the current packet is CCK rate.
1712 priv->bCurCCKPkt = bCckRate;
1714 if(priv->UndecoratedSmoothedSS >= 0)
1716 priv->UndecoratedSmoothedSS = ( (priv->UndecoratedSmoothedSS * 5) + (priv->SignalStrength * 10) ) / 6;
1720 priv->UndecoratedSmoothedSS = priv->SignalStrength * 10;
1723 priv->UndercorateSmoothedRxPower = ( (priv->UndercorateSmoothedRxPower * 50) + (priv->RxPower* 11)) / 60;
1725 // printk("Sommthing SignalSterngth (%d) => UndecoratedSmoothedSS (%d)\n", priv->SignalStrength, priv->UndecoratedSmoothedSS);
1726 // printk("Sommthing RxPower (%d) => UndecoratedRxPower (%d)\n", priv->RxPower, priv->UndercorateSmoothedRxPower);
1728 //if(priv->CurCCKRSSI >= 0 && bCckRate)
1731 priv->CurCCKRSSI = priv->RSSI;
1735 priv->CurCCKRSSI = 0;
1738 // Boundary checking.
1739 // TODO: The overflow condition does happen, if we want to fix,
1740 // we shall recalculate thresholds first.
1741 if(priv->UndecoratedSmoothedSS > 100)
1743 // printk("UndecoratedSmoothedSS(%d) overflow, SignalStrength(%d)\n", priv->UndecoratedSmoothedSS, priv->SignalStrength);
1745 if(priv->UndecoratedSmoothedSS < 0)
1747 // printk("UndecoratedSmoothedSS(%d) underflow, SignalStrength(%d)\n", priv->UndecoratedSmoothedSS, priv->SignalStrength);
1754 /* This is rough RX isr handling routine*/
1755 void rtl8180_rx(struct net_device *dev)
1757 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1758 struct sk_buff *tmp_skb;
1760 //struct sk_buff *skb;
1764 unsigned char quality, signal;
1775 u8 LNA_gain[4]={02, 17, 29, 39};
1777 struct ieee80211_hdr *hdr;//by amy
1779 u8 bHwError = 0,bCRC = 0,bICV = 0;
1783 bool bCckRate = false;
1785 long SignalStrengthIndex = 0;//+by amy 080312
1786 // u8 SignalStrength = 0;
1787 struct ieee80211_rx_stats stats = {
1791 // .mac_time = jiffies,
1792 .freq = IEEE80211_24GHZ_BAND,
1795 stats.nic_type = NIC_8185B;
1798 //printk("receive frame!%d\n",count++);
1799 //if (!priv->rxbuffer) DMESG ("EE: NIC RX ack, but RX queue corrupted!");
1802 if ((*(priv->rxringtail)) & (1<<31)) {
1804 /* we have got an RX int, but the descriptor
1805 * we are pointing is empty*/
1807 priv->stats.rxnodata++;
1808 priv->ieee80211->stats.rx_errors++;
1810 /* if (! *(priv->rxring) & (1<<31)) {
1812 priv->stats.rxreset++;
1813 priv->rxringtail=priv->rxring;
1814 priv->rxbuffer=priv->rxbufferhead;
1819 tmp = priv->rxringtail;
1821 if(tmp == priv->rxring)
1822 //tmp = priv->rxring + (priv->rxringcount )*rx_desc_size; xiong-2006-11-15
1823 tmp = priv->rxring + (priv->rxringcount - 1)*rx_desc_size;
1825 tmp -= rx_desc_size;
1827 if(! (*tmp & (1<<31)))
1829 }while(tmp != priv->rxring);
1831 if(tmp2) priv->rxringtail = tmp2;
1835 /* while there are filled descriptors */
1836 while(!(*(priv->rxringtail) & (1<<31))){
1837 if(*(priv->rxringtail) & (1<<26))
1838 DMESGW("RX buffer overflow");
1839 if(*(priv->rxringtail) & (1<<12))
1840 priv->stats.rxicverr++;
1842 if(*(priv->rxringtail) & (1<<27)){
1843 priv->stats.rxdmafail++;
1844 //DMESG("EE: RX DMA FAILED at buffer pointed by descriptor %x",(u32)priv->rxringtail);
1848 pci_dma_sync_single_for_cpu(priv->pdev,
1849 priv->rxbuffer->dma,
1850 priv->rxbuffersize * \
1852 PCI_DMA_FROMDEVICE);
1854 first = *(priv->rxringtail) & (1<<29) ? 1:0;
1855 if(first) priv->rx_prevlen=0;
1857 last = *(priv->rxringtail) & (1<<28) ? 1:0;
1859 lastlen=((*priv->rxringtail) &0xfff);
1861 /* if the last descriptor (that should
1862 * tell us the total packet len) tell
1863 * us something less than the descriptors
1864 * len we had until now, then there is some
1866 * workaround to prevent kernel panic
1868 if(lastlen < priv->rx_prevlen)
1871 len=lastlen-priv->rx_prevlen;
1873 if(*(priv->rxringtail) & (1<<13)) {
1874 //lastlen=((*priv->rxringtail) &0xfff);
1875 if ((*(priv->rxringtail) & 0xfff) <500)
1876 priv->stats.rxcrcerrmin++;
1877 else if ((*(priv->rxringtail) & 0x0fff) >1000)
1878 priv->stats.rxcrcerrmax++;
1880 priv->stats.rxcrcerrmid++;
1885 len = priv->rxbuffersize;
1889 padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1891 padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1899 priv->rx_prevlen+=len;
1901 if(priv->rx_prevlen > MAX_FRAG_THRESHOLD + 100){
1902 /* HW is probably passing several buggy frames
1903 * without FD or LD flag set.
1904 * Throw this garbage away to prevent skb
1907 if(!priv->rx_skb_complete)
1908 dev_kfree_skb_any(priv->rx_skb);
1909 priv->rx_skb_complete = 1;
1912 signal=(unsigned char)(((*(priv->rxringtail+3))& (0x00ff0000))>>16);
1913 signal=(signal&0xfe)>>1; // Modify by hikaru 6.6
1915 quality=(unsigned char)((*(priv->rxringtail+3)) & (0xff));
1917 stats.mac_time[0] = *(priv->rxringtail+1);
1918 stats.mac_time[1] = *(priv->rxringtail+2);
1919 rxpower =((char)(((*(priv->rxringtail+4))& (0x00ff0000))>>16))/2 - 42;
1920 RSSI = ((u8)(((*(priv->rxringtail+3)) & (0x0000ff00))>> 8)) & (0x7f);
1922 rate=((*(priv->rxringtail)) &
1923 ((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20;
1925 stats.rate = rtl8180_rate2rate(rate);
1927 Antenna = (((*(priv->rxringtail +3))& (0x00008000)) == 0 )? 0:1 ;
1928 // printk("in rtl8180_rx():Antenna is %d\n",Antenna);
1929 //by amy for antenna
1930 if(!rtl8180_IsWirelessBMode(stats.rate))
1933 RxAGC_dBm = rxpower+1; //bias
1937 RxAGC_dBm = signal;//bit 0 discard
1939 LNA = (u8) (RxAGC_dBm & 0x60 ) >> 5 ; //bit 6~ bit 5
1940 BB = (u8) (RxAGC_dBm & 0x1F); // bit 4 ~ bit 0
1942 RxAGC_dBm = -( LNA_gain[LNA] + (BB *2) ); //Pin_11b=-(LNA_gain+BB_gain) (dBm)
1944 RxAGC_dBm +=4; //bias
1947 if(RxAGC_dBm & 0x80) //absolute value
1948 RXAGC= ~(RxAGC_dBm)+1;
1949 bCckRate = rtl8180_IsWirelessBMode(stats.rate);
1950 // Translate RXAGC into 1-100.
1951 if(!rtl8180_IsWirelessBMode(stats.rate))
1957 RXAGC=(90-RXAGC)*100/65;
1965 RXAGC=(95-RXAGC)*100/65;
1967 priv->SignalStrength = (u8)RXAGC;
1968 priv->RecvSignalPower = RxAGC_dBm ; // It can use directly by SD3 CMLin
1969 priv->RxPower = rxpower;
1972 // SQ translation formular is provided by SD3 DZ. 2006.06.27, by rcnjko.
1974 quality = 1;//0; //0 will cause epc to show signal zero , walk aroud now;
1975 else if(quality < 27)
1978 quality = 127 - quality;
1979 priv->SignalQuality = quality;
1980 if(!priv->card_8185)
1981 printk("check your card type\n");
1983 stats.signal = (u8)quality;//priv->wstats.qual.level = priv->SignalStrength;
1984 stats.signalstrength = RXAGC;
1985 if(stats.signalstrength > 100)
1986 stats.signalstrength = 100;
1987 stats.signalstrength = (stats.signalstrength * 70)/100 + 30;
1988 // printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength);
1989 stats.rssi = priv->wstats.qual.qual = priv->SignalQuality;
1990 stats.noise = priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual;
1992 bHwError = (((*(priv->rxringtail))& (0x00000fff)) == 4080)| (((*(priv->rxringtail))& (0x04000000)) != 0 )
1993 | (((*(priv->rxringtail))& (0x08000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x10000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x20000000)) != 0 );
1994 bCRC = ((*(priv->rxringtail)) & (0x00002000)) >> 13;
1995 bICV = ((*(priv->rxringtail)) & (0x00001000)) >> 12;
1996 hdr = (struct ieee80211_hdr *)priv->rxbuffer->buf;
1997 fc = le16_to_cpu(hdr->frame_ctl);
1998 type = WLAN_FC_GET_TYPE(fc);
2000 if((IEEE80211_FTYPE_CTL != type) &&
2001 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
2002 && (!bHwError) && (!bCRC)&& (!bICV))
2005 // Perform signal smoothing for dynamic mechanism on demand.
2006 // This is different with PerformSignalSmoothing8185 in smoothing fomula.
2007 // No dramatic adjustion is apply because dynamic mechanism need some degree
2008 // of correctness. 2007.01.23, by shien chang.
2009 PerformUndecoratedSignalSmoothing8185(priv,bCckRate);
2011 // For good-looking singal strength.
2013 SignalStrengthIndex = NetgearSignalStrengthTranslate(
2014 priv->LastSignalStrengthInPercent,
2015 priv->SignalStrength);
2017 priv->LastSignalStrengthInPercent = SignalStrengthIndex;
2018 priv->Stats_SignalStrength = TranslateToDbm8185((u8)SignalStrengthIndex);
2020 // We need more correct power of received packets and the "SignalStrength" of RxStats is beautified,
2021 // so we record the correct power here.
2023 priv->Stats_SignalQuality =(long) (priv->Stats_SignalQuality * 5 + (long)priv->SignalQuality + 5) / 6;
2024 priv->Stats_RecvSignalPower = (long)(priv->Stats_RecvSignalPower * 5 + priv->RecvSignalPower -1) / 6;
2026 // Figure out which antenna that received the lasted packet.
2027 priv->LastRxPktAntenna = Antenna ? 1 : 0; // 0: aux, 1: main.
2029 SwAntennaDiversityRxOk8185(dev, priv->SignalStrength);
2032 //by amy for antenna
2041 if(!priv->rx_skb_complete){
2042 /* seems that HW sometimes fails to reiceve and
2043 doesn't provide the last descriptor */
2044 dev_kfree_skb_any(priv->rx_skb);
2045 priv->stats.rxnolast++;
2047 /* support for prism header has been originally added by Christian */
2048 if(priv->prism_hdr && priv->ieee80211->iw_mode == IW_MODE_MONITOR){
2051 priv->rx_skb = dev_alloc_skb(len+2);
2052 if( !priv->rx_skb) goto drop;
2055 priv->rx_skb_complete=0;
2056 priv->rx_skb->dev=dev;
2058 /* if we are here we should have already RXed
2060 * If we get here and the skb is not allocated then
2061 * we have just throw out garbage (skb not allocated)
2062 * and we are still rxing garbage....
2064 if(!priv->rx_skb_complete){
2066 tmp_skb= dev_alloc_skb(priv->rx_skb->len +len+2);
2068 if(!tmp_skb) goto drop;
2072 memcpy(skb_put(tmp_skb,priv->rx_skb->len),
2076 dev_kfree_skb_any(priv->rx_skb);
2078 priv->rx_skb=tmp_skb;
2082 if(!priv->rx_skb_complete) {
2084 memcpy(skb_put(priv->rx_skb,len),
2085 (((unsigned char *)priv->rxbuffer->buf) + 2),len);
2087 memcpy(skb_put(priv->rx_skb,len),
2088 priv->rxbuffer->buf,len);
2092 if(last && !priv->rx_skb_complete){
2093 if(priv->rx_skb->len > 4)
2094 skb_trim(priv->rx_skb,priv->rx_skb->len-4);
2095 #ifndef RX_DONT_PASS_UL
2096 if(!ieee80211_rx(priv->ieee80211,
2097 priv->rx_skb, &stats)){
2098 #endif // RX_DONT_PASS_UL
2100 dev_kfree_skb_any(priv->rx_skb);
2101 #ifndef RX_DONT_PASS_UL
2104 priv->rx_skb_complete=1;
2109 pci_dma_sync_single_for_device(priv->pdev,
2110 priv->rxbuffer->dma,
2111 priv->rxbuffersize * \
2113 PCI_DMA_FROMDEVICE);
2116 drop: // this is used when we have not enought mem
2118 /* restore the descriptor */
2119 *(priv->rxringtail+2)=priv->rxbuffer->dma;
2120 *(priv->rxringtail)=*(priv->rxringtail) &~ 0xfff;
2121 *(priv->rxringtail)=
2122 *(priv->rxringtail) | priv->rxbuffersize;
2124 *(priv->rxringtail)=
2125 *(priv->rxringtail) | (1<<31);
2130 //unsigned long flags;
2131 //spin_lock_irqsave(&priv->irq_lock,flags);
2133 priv->rxringtail+=rx_desc_size;
2134 if(priv->rxringtail >=
2135 (priv->rxring)+(priv->rxringcount )*rx_desc_size)
2136 priv->rxringtail=priv->rxring;
2138 //spin_unlock_irqrestore(&priv->irq_lock,flags);
2141 priv->rxbuffer=(priv->rxbuffer->next);
2147 // if(get_curr_tx_free_desc(dev,priority))
2148 // ieee80211_sta_ps_sleep(priv->ieee80211, &tmp, &tmp2);
2155 void rtl8180_dma_kick(struct net_device *dev, int priority)
2157 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2159 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2166 write_nic_byte(dev,TX_DMA_POLLING,
2167 (1<< TX_DMA_POLLING_LOWPRIORITY_SHIFT) |
2168 priv->dma_poll_mask);
2173 write_nic_byte(dev,TX_DMA_POLLING,
2174 (1<< TX_DMA_POLLING_NORMPRIORITY_SHIFT) |
2175 priv->dma_poll_mask);
2180 write_nic_byte(dev,TX_DMA_POLLING,
2181 (1<< TX_DMA_POLLING_HIPRIORITY_SHIFT) |
2182 priv->dma_poll_mask);
2187 write_nic_byte(dev, TX_DMA_POLLING,
2188 (1 << (priority + 1)) | priv->dma_poll_mask);
2189 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
2191 force_pci_posting(dev);
2194 void rtl8180_data_hard_stop(struct net_device *dev)
2196 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2198 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2199 priv->dma_poll_stop_mask |= TPPOLLSTOP_AC_VIQ;
2200 write_nic_byte(dev,TPPollStop, priv->dma_poll_stop_mask);
2201 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
2205 void rtl8180_data_hard_resume(struct net_device *dev)
2207 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2209 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2210 priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_AC_VIQ);
2211 write_nic_byte(dev,TPPollStop, priv->dma_poll_stop_mask);
2212 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
2216 /* this function TX data frames when the ieee80211 stack requires this.
2217 * It checks also if we need to stop the ieee tx queue, eventually do it
2219 void rtl8180_hard_data_xmit(struct sk_buff *skb,struct net_device *dev, int
2222 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2224 struct ieee80211_hdr_3addr *h = (struct ieee80211_hdr_3addr *) skb->data;
2225 short morefrag = (h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS;
2226 unsigned long flags;
2228 //static int count = 0;
2230 mode = priv->ieee80211->iw_mode;
2232 rate = ieeerate2rtlrate(rate);
2234 * This function doesn't require lock because we make
2235 * sure it's called with the tx_lock already acquired.
2236 * this come from the kernel's hard_xmit callback (trought
2237 * the ieee stack, or from the try_wake_queue (again trought
2240 priority = AC2Q(skb->priority);
2241 spin_lock_irqsave(&priv->tx_lock,flags);
2243 if(priv->ieee80211->bHwRadioOff)
2245 spin_unlock_irqrestore(&priv->tx_lock,flags);
2250 //printk(KERN_WARNING "priority = %d@%d\n", priority, count++);
2251 if (!check_nic_enought_desc(dev, priority)){
2252 //DMESG("Error: no descriptor left by previous TX (avail %d) ",
2253 // get_curr_tx_free_desc(dev, priority));
2254 DMESGW("Error: no descriptor left by previous TX (avail %d) ",
2255 get_curr_tx_free_desc(dev, priority));
2256 //printk(KERN_WARNING "==============================================================> \n");
2257 ieee80211_stop_queue(priv->ieee80211);
2259 rtl8180_tx(dev, skb->data, skb->len, priority, morefrag,0,rate);
2260 if (!check_nic_enought_desc(dev, priority))
2261 ieee80211_stop_queue(priv->ieee80211);
2263 //dev_kfree_skb_any(skb);
2264 spin_unlock_irqrestore(&priv->tx_lock,flags);
2268 /* This is a rough attempt to TX a frame
2269 * This is called by the ieee 80211 stack to TX management frames.
2270 * If the ring is full packet are dropped (for data frame the queue
2271 * is stopped before this can happen). For this reason it is better
2272 * if the descriptors are larger than the largest management frame
2273 * we intend to TX: i'm unsure what the HW does if it will not found
2274 * the last fragment of a frame because it has been dropped...
2275 * Since queues for Management and Data frames are different we
2276 * might use a different lock than tx_lock (for example mgmt_tx_lock)
2278 /* these function may loops if invoked with 0 descriptors or 0 len buffer*/
2279 int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
2281 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2283 unsigned long flags;
2287 priority = MANAGE_PRIORITY;
2289 spin_lock_irqsave(&priv->tx_lock,flags);
2291 if(priv->ieee80211->bHwRadioOff)
2293 spin_unlock_irqrestore(&priv->tx_lock,flags);
2295 dev_kfree_skb_any(skb);
2296 return NETDEV_TX_OK;
2299 rtl8180_tx(dev, skb->data, skb->len, priority,
2300 0, 0,ieeerate2rtlrate(priv->ieee80211->basic_rate));
2302 priv->ieee80211->stats.tx_bytes+=skb->len;
2303 priv->ieee80211->stats.tx_packets++;
2304 spin_unlock_irqrestore(&priv->tx_lock,flags);
2306 dev_kfree_skb_any(skb);
2307 return NETDEV_TX_OK;
2310 // longpre 144+48 shortpre 72+24
2311 u16 rtl8180_len2duration(u32 len, short rate,short* ext)
2320 duration = ((len+4)<<4) /0x2;
2321 drift = ((len+4)<<4) % 0x2;
2322 if(drift ==0 ) break;
2328 duration = ((len+4)<<4) /0x4;
2329 drift = ((len+4)<<4) % 0x4;
2330 if(drift ==0 ) break;
2336 duration = ((len+4)<<4) /0xb;
2337 drift = ((len+4)<<4) % 0xb;
2346 duration = ((len+4)<<4) /0x16;
2347 drift = ((len+4)<<4) % 0x16;
2361 void rtl8180_prepare_beacon(struct net_device *dev)
2364 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2366 struct sk_buff *skb;
2368 u16 word = read_nic_word(dev, BcnItv);
2369 word &= ~BcnItv_BcnItv; // clear Bcn_Itv
2370 word |= cpu_to_le16(priv->ieee80211->current_network.beacon_interval);//0x64;
2371 write_nic_word(dev, BcnItv, word);
2374 skb = ieee80211_get_beacon(priv->ieee80211);
2376 rtl8180_tx(dev,skb->data,skb->len,BEACON_PRIORITY,
2377 0,0,ieeerate2rtlrate(priv->ieee80211->basic_rate));
2378 dev_kfree_skb_any(skb);
2382 /* This function do the real dirty work: it enqueues a TX command
2383 * descriptor in the ring buffer, copyes the frame in a TX buffer
2384 * and kicks the NIC to ensure it does the DMA transfer.
2386 short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority,
2387 short morefrag, short descfrag, int rate)
2389 struct r8180_priv *priv = ieee80211_priv(dev);
2390 u32 *tail,*temp_tail;
2401 struct buffer* buflist;
2402 //unsigned long flags;
2403 struct ieee80211_hdr_3addr *frag_hdr = (struct ieee80211_hdr_3addr *)txbuf;
2405 u8 bUseShortPreamble = 0;
2409 //u8 RetryLimit = 0;
2412 u16 ThisFrameTime = 0;
2413 u16 TxDescDuration = 0;
2414 u8 ownbit_flag = false; //added by david woo for sync Tx, 2007.12.14
2417 case MANAGE_PRIORITY:
2418 tail=priv->txmapringtail;
2419 begin=priv->txmapring;
2420 buflist = priv->txmapbufstail;
2421 count = priv->txringcount;
2425 tail=priv->txbkpringtail;
2426 begin=priv->txbkpring;
2427 buflist = priv->txbkpbufstail;
2428 count = priv->txringcount;
2432 tail=priv->txbepringtail;
2433 begin=priv->txbepring;
2434 buflist = priv->txbepbufstail;
2435 count = priv->txringcount;
2439 tail=priv->txvipringtail;
2440 begin=priv->txvipring;
2441 buflist = priv->txvipbufstail;
2442 count = priv->txringcount;
2446 tail=priv->txvopringtail;
2447 begin=priv->txvopring;
2448 buflist = priv->txvopbufstail;
2449 count = priv->txringcount;
2453 tail=priv->txhpringtail;
2454 begin=priv->txhpring;
2455 buflist = priv->txhpbufstail;
2456 count = priv->txringcount;
2459 case BEACON_PRIORITY:
2460 tail=priv->txbeaconringtail;
2461 begin=priv->txbeaconring;
2462 buflist = priv->txbeaconbufstail;
2463 count = priv->txbeaconcount;
2471 //printk("in rtl8180_tx(): rate is %d\n",priv->ieee80211->rate);
2473 memcpy(&dest, frag_hdr->addr1, ETH_ALEN);
2474 if (is_multicast_ether_addr(dest) ||
2475 is_broadcast_ether_addr(dest))
2482 ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate), 0, bUseShortPreamble);
2483 TxDescDuration = ThisFrameTime;
2484 } else {// Unicast packet
2488 //YJ,add,080828,for Keep alive
2489 priv->NumTxUnicast++;
2491 // Figure out ACK rate according to BSS basic rate and Tx rate, 2006.03.08 by rcnjko.
2492 //AckRate = ComputeAckRate( pMgntInfo->mBrates, (u1Byte)(pTcb->DataRate) );
2493 // Figure out ACK time according to the AckRate and assume long preamble is used on receiver, 2006.03.08, by rcnjko.
2494 //AckTime = ComputeTxTime( sAckCtsLng/8, AckRate, FALSE, FALSE);
2495 //For simplicity, just use the 1M basic rate
2496 //AckTime = ComputeTxTime(14, 540,0, 0); // AckCTSLng = 14 use 1M bps send
2497 AckTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send
2498 //AckTime = ComputeTxTime(14, 2,false, false); // AckCTSLng = 14 use 1M bps send
2500 if ( ((len + sCrcLng) > priv->rts) && priv->rts )
2502 u16 RtsTime, CtsTime;
2507 // Rate and time required for RTS.
2508 RtsTime = ComputeTxTime( sAckCtsLng/8,priv->ieee80211->basic_rate, 0, 0);
2509 // Rate and time required for CTS.
2510 CtsTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send
2512 // Figure out time required to transmit this frame.
2513 ThisFrameTime = ComputeTxTime(len + sCrcLng,
2514 rtl8180_rate2rate(rate),
2518 // RTS-CTS-ThisFrame-ACK.
2519 RtsDur = CtsTime + ThisFrameTime + AckTime + 3*aSifsTime;
2521 TxDescDuration = RtsTime + RtsDur;
2523 else {// Normal case.
2528 ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate), 0, bUseShortPreamble);
2529 TxDescDuration = ThisFrameTime + aSifsTime + AckTime;
2532 if(!(frag_hdr->frame_ctl & IEEE80211_FCTL_MOREFRAGS)) { //no more fragment
2534 Duration = aSifsTime + AckTime;
2535 } else { // One or more fragments remained.
2537 NextFragTime = ComputeTxTime( len + sCrcLng, //pretend following packet length equal current packet
2538 rtl8180_rate2rate(rate),
2540 bUseShortPreamble );
2542 //ThisFrag-ACk-NextFrag-ACK.
2543 Duration = NextFragTime + 3*aSifsTime + 2*AckTime;
2546 } // End of Unicast packet
2548 frag_hdr->duration_id = Duration;
2551 buflen=priv->txbuffsize;
2554 //printk("================================>buflen = %d, remain = %d!\n", buflen,remain);
2558 DMESGE("TX buffer error, cannot TX frames. pri %d.", priority);
2559 //spin_unlock_irqrestore(&priv->tx_lock,flags);
2564 if( (*tail & (1<<31)) && (priority != BEACON_PRIORITY)){
2566 DMESGW("No more TX desc, returning %x of %x",
2568 priv->stats.txrdu++;
2569 // spin_unlock_irqrestore(&priv->tx_lock,flags);
2575 *tail= 0; // zeroes header
2582 if(priv->card_8185){
2583 //FIXME: this should be triggered by HW encryption parameters.
2584 *tail |= (1<<15); //no encrypt
2585 // *tail |= (1<<30); //raise int when completed
2587 // *tail = *tail | (1<<16);
2588 if(remain==len && !descfrag) {
2589 ownbit_flag = false; //added by david woo,2007.12.14
2590 *tail = *tail| (1<<29) ; //fist segment of the packet
2591 *tail = *tail |(len);
2596 for(i=0;i<buflen&& remain >0;i++,remain--){
2597 ((u8*)buf)[i]=txbuf[i]; //copy data into descriptor pointed DMAble buffer
2598 if(remain == 4 && i+4 >= buflen) break;
2599 /* ensure the last desc has at least 4 bytes payload */
2603 *(tail+3)=*(tail+3) &~ 0xfff;
2604 *(tail+3)=*(tail+3) | i; // buffer lenght
2605 // Use short preamble or not
2606 if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE)
2607 if (priv->plcp_preamble_mode==1 && rate!=0) // short mode now, not long!
2608 // *tail |= (1<<16); // enable short preamble mode.
2614 if(bRTSEnable) //rts enable
2616 *tail |= ((ieeerate2rtlrate(priv->ieee80211->basic_rate))<<19);//RTS RATE
2617 *tail |= (1<<23);//rts enable
2618 *(tail+1) |=(RtsDur&0xffff);//RTS Duration
2620 *(tail+3) |= ((TxDescDuration&0xffff)<<16); //DURATION
2621 // *(tail+3) |= (0xe6<<16);
2622 *(tail+5) |= (11<<8);//(priv->retry_data<<8); //retry lim ;
2624 *tail = *tail | ((rate&0xf) << 24);
2625 //DMESG("rate %d",rate);
2627 if(priv->card_8185){
2631 /* hw_plcp_len is not used for rtl8180 chip */
2633 if(priv->card_8185 == 0 || !priv->hw_plcp_len){
2635 duration = rtl8180_len2duration(len,
2638 *(tail+1) = *(tail+1) | ((duration & 0x7fff)<<16);
2639 if(ext) *(tail+1) = *(tail+1) |(1<<31); //plcp length extension
2642 if(morefrag) *tail = (*tail) | (1<<17); // more fragment
2643 if(!remain) *tail = (*tail) | (1<<28); // last segment of frame
2645 *(tail+5) = *(tail+5)|(2<<27);
2646 *(tail+7) = *(tail+7)|(1<<4);
2651 *tail = *tail | (1<<31); // descriptor ready to be txed
2654 if((tail - begin)/8 == count-1)
2660 buflist=buflist->next;
2665 case MANAGE_PRIORITY:
2666 priv->txmapringtail=tail;
2667 priv->txmapbufstail=buflist;
2671 priv->txbkpringtail=tail;
2672 priv->txbkpbufstail=buflist;
2676 priv->txbepringtail=tail;
2677 priv->txbepbufstail=buflist;
2681 priv->txvipringtail=tail;
2682 priv->txvipbufstail=buflist;
2686 priv->txvopringtail=tail;
2687 priv->txvopbufstail=buflist;
2691 priv->txhpringtail=tail;
2692 priv->txhpbufstail = buflist;
2695 case BEACON_PRIORITY:
2696 /* the HW seems to be happy with the 1st
2697 * descriptor filled and the 2nd empty...
2698 * So always update descriptor 1 and never
2701 // priv->txbeaconringtail=tail;
2702 // priv->txbeaconbufstail=buflist;
2708 //rtl8180_dma_kick(dev,priority);
2710 *temp_tail = *temp_tail | (1<<31); // descriptor ready to be txed
2711 rtl8180_dma_kick(dev,priority);
2712 //spin_unlock_irqrestore(&priv->tx_lock,flags);
2719 void rtl8180_irq_rx_tasklet(struct r8180_priv * priv);
2722 void rtl8180_link_change(struct net_device *dev)
2724 struct r8180_priv *priv = ieee80211_priv(dev);
2725 u16 beacon_interval;
2727 struct ieee80211_network *net = &priv->ieee80211->current_network;
2728 // rtl8180_adapter_start(dev);
2729 rtl8180_update_msr(dev);
2732 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2734 write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]);
2735 write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]);
2738 beacon_interval = read_nic_dword(dev,BEACON_INTERVAL);
2739 beacon_interval &= ~ BEACON_INTERVAL_MASK;
2740 beacon_interval |= net->beacon_interval;
2741 write_nic_dword(dev, BEACON_INTERVAL, beacon_interval);
2743 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2747 u16 atim = read_nic_dword(dev,ATIM);
2748 u16 = u16 &~ ATIM_MASK;
2749 u16 = u16 | beacon->atim;
2753 rtl8180_set_chan(dev, priv->chan);
2758 void rtl8180_rq_tx_ack(struct net_device *dev){
2760 struct r8180_priv *priv = ieee80211_priv(dev);
2761 // printk("====================>%s\n",__func__);
2762 write_nic_byte(dev,CONFIG4,read_nic_byte(dev,CONFIG4)|CONFIG4_PWRMGT);
2763 priv->ack_tx_to_ieee = 1;
2766 short rtl8180_is_tx_queue_empty(struct net_device *dev){
2768 struct r8180_priv *priv = ieee80211_priv(dev);
2771 for (d = priv->txmapring;
2772 d < priv->txmapring + priv->txringcount;d+=8)
2773 if(*d & (1<<31)) return 0;
2775 for (d = priv->txbkpring;
2776 d < priv->txbkpring + priv->txringcount;d+=8)
2777 if(*d & (1<<31)) return 0;
2779 for (d = priv->txbepring;
2780 d < priv->txbepring + priv->txringcount;d+=8)
2781 if(*d & (1<<31)) return 0;
2783 for (d = priv->txvipring;
2784 d < priv->txvipring + priv->txringcount;d+=8)
2785 if(*d & (1<<31)) return 0;
2787 for (d = priv->txvopring;
2788 d < priv->txvopring + priv->txringcount;d+=8)
2789 if(*d & (1<<31)) return 0;
2791 for (d = priv->txhpring;
2792 d < priv->txhpring + priv->txringcount;d+=8)
2793 if(*d & (1<<31)) return 0;
2796 /* FIXME FIXME 5msecs is random */
2797 #define HW_WAKE_DELAY 5
2799 void rtl8180_hw_wakeup(struct net_device *dev)
2801 unsigned long flags;
2803 struct r8180_priv *priv = ieee80211_priv(dev);
2805 spin_lock_irqsave(&priv->ps_lock,flags);
2806 //DMESG("Waken up!");
2807 write_nic_byte(dev,CONFIG4,read_nic_byte(dev,CONFIG4)&~CONFIG4_PWRMGT);
2810 priv->rf_wakeup(dev);
2811 // mdelay(HW_WAKE_DELAY);
2812 spin_unlock_irqrestore(&priv->ps_lock,flags);
2815 void rtl8180_hw_sleep_down(struct net_device *dev)
2817 unsigned long flags;
2819 struct r8180_priv *priv = ieee80211_priv(dev);
2821 spin_lock_irqsave(&priv->ps_lock,flags);
2825 priv->rf_sleep(dev);
2826 spin_unlock_irqrestore(&priv->ps_lock,flags);
2830 void rtl8180_hw_sleep(struct net_device *dev, u32 th, u32 tl)
2833 struct r8180_priv *priv = ieee80211_priv(dev);
2836 unsigned long flags;
2838 spin_lock_irqsave(&priv->ps_lock,flags);
2840 /* Writing HW register with 0 equals to disable
2841 * the timer, that is not really what we want
2843 tl -= MSECS(4+16+7);
2845 //if(tl == 0) tl = 1;
2847 /* FIXME HACK FIXME HACK */
2848 // force_pci_posting(dev);
2851 // rb = read_nic_dword(dev, TSFTR);
2853 /* If the interval in witch we are requested to sleep is too
2854 * short then give up and remain awake
2856 if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
2857 ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
2858 spin_unlock_irqrestore(&priv->ps_lock,flags);
2859 printk("too short to sleep\n");
2863 // write_nic_dword(dev, TimerInt, tl);
2864 // rb = read_nic_dword(dev, TSFTR);
2866 u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
2870 priv->DozePeriodInPast2Sec += jiffies_to_msecs(tmp);
2872 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp); //as tl may be less than rb
2874 /* if we suspect the TimerInt is gone beyond tl
2875 * while setting it, then give up
2878 if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
2879 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
2880 spin_unlock_irqrestore(&priv->ps_lock,flags);
2884 // if(priv->rf_sleep)
2885 // priv->rf_sleep(dev);
2887 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq);
2888 spin_unlock_irqrestore(&priv->ps_lock,flags);
2892 //void rtl8180_wmm_param_update(struct net_device *dev,u8 *ac_param)
2893 void rtl8180_wmm_param_update(struct work_struct * work)
2895 struct ieee80211_device * ieee = container_of(work, struct ieee80211_device,wmm_param_update_wq);
2896 //struct r8180_priv *priv = (struct r8180_priv*)(ieee->priv);
2897 struct net_device *dev = ieee->dev;
2898 u8 *ac_param = (u8 *)(ieee->current_network.wmm_param);
2899 u8 mode = ieee->current_network.mode;
2905 if(!ieee->current_network.QoS_Enable){
2906 //legacy ac_xx_param update
2907 AcParam.longData = 0;
2908 AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
2909 AcParam.f.AciAifsn.f.ACM = 0;
2910 AcParam.f.Ecw.f.ECWmin = 3; // Follow 802.11 CWmin.
2911 AcParam.f.Ecw.f.ECWmax = 7; // Follow 802.11 CWmax.
2912 AcParam.f.TXOPLimit = 0;
2913 for(eACI = 0; eACI < AC_MAX; eACI++){
2914 AcParam.f.AciAifsn.f.ACI = (u8)eACI;
2918 pAcParam = (PAC_PARAM)(&AcParam);
2919 // Retrive paramters to udpate.
2920 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN *(((mode&IEEE_G) == IEEE_G)?9:20) + aSifsTime;
2921 u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit))<<AC_PARAM_TXOP_LIMIT_OFFSET)|
2922 (((u32)(pAcParam->f.Ecw.f.ECWmax))<<AC_PARAM_ECW_MAX_OFFSET)|
2923 (((u32)(pAcParam->f.Ecw.f.ECWmin))<<AC_PARAM_ECW_MIN_OFFSET)|
2924 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2927 write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2931 write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2935 write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2939 write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2943 printk(KERN_WARNING "SetHwReg8185():invalid ACI: %d!\n", eACI);
2951 for(i = 0; i < AC_MAX; i++){
2952 //AcParam.longData = 0;
2953 pAcParam = (AC_PARAM * )ac_param;
2959 // Retrive paramters to udpate.
2960 eACI = pAcParam->f.AciAifsn.f.ACI;
2961 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2962 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G)?9:20) + aSifsTime;
2963 u4bAcParam = ( (((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
2964 (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
2965 (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
2966 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2970 write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2974 write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2978 write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2982 write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2986 printk(KERN_WARNING "SetHwReg8185(): invalid ACI: %d !\n", eACI);
2990 ac_param += (sizeof(AC_PARAM));
2994 void rtl8180_tx_irq_wq(struct work_struct *work);
2995 void rtl8180_restart_wq(struct work_struct *work);
2996 //void rtl8180_rq_tx_ack(struct work_struct *work);
2997 void rtl8180_watch_dog_wq(struct work_struct *work);
2998 void rtl8180_hw_wakeup_wq(struct work_struct *work);
2999 void rtl8180_hw_sleep_wq(struct work_struct *work);
3000 void rtl8180_sw_antenna_wq(struct work_struct *work);
3001 void rtl8180_watch_dog(struct net_device *dev);
3003 void watch_dog_adaptive(unsigned long data)
3005 struct r8180_priv* priv = ieee80211_priv((struct net_device *)data);
3006 // DMESG("---->watch_dog_adaptive()\n");
3009 DMESG("<----watch_dog_adaptive():driver is not up!\n");
3013 // queue_work(priv->ieee80211->wq,&priv->ieee80211->watch_dog_wq);
3016 // Tx High Power Mechanism.
3018 if(CheckHighPower((struct net_device *)data))
3020 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->tx_pw_wq);
3024 // Tx Power Tracking on 87SE.
3026 //if( priv->bTxPowerTrack ) //lzm mod 080826
3027 if( CheckTxPwrTracking((struct net_device *)data));
3028 TxPwrTracking87SE((struct net_device *)data);
3031 // Perform DIG immediately.
3033 if(CheckDig((struct net_device *)data) == true)
3035 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_dig_wq);
3040 rtl8180_watch_dog((struct net_device *)data);
3043 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->GPIOChangeRFWorkItem);
3045 priv->watch_dog_timer.expires = jiffies + MSECS(IEEE80211_WATCH_DOG_TIME);
3046 add_timer(&priv->watch_dog_timer);
3047 // DMESG("<----watch_dog_adaptive()\n");
3051 static CHANNEL_LIST ChannelPlan[] = {
3052 {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, //FCC
3053 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
3054 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
3055 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //Spain. Change to ETSI.
3056 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //France. Change to ETSI.
3057 {{14,36,40,44,48,52,56,60,64},9}, //MKK
3058 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14, 36,40,44,48,52,56,60,64},22},//MKK1
3059 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //Israel.
3060 {{1,2,3,4,5,6,7,8,9,10,11,12,13,34,38,42,46},17}, // For 11a , TELEC
3061 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, //For Global Domain. 1-11:active scan, 12-14 passive scan. //+YJ, 080626
3062 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13} //world wide 13: ch1~ch11 active scan, ch12~13 passive //lzm add 080826
3065 static void rtl8180_set_channel_map(u8 channel_plan, struct ieee80211_device *ieee)
3070 ieee->MinPassiveChnlNum=MAX_CHANNEL_NUMBER+1;
3071 ieee->IbssStartChnl=0;
3073 switch (channel_plan)
3075 case COUNTRY_CODE_FCC:
3076 case COUNTRY_CODE_IC:
3077 case COUNTRY_CODE_ETSI:
3078 case COUNTRY_CODE_SPAIN:
3079 case COUNTRY_CODE_FRANCE:
3080 case COUNTRY_CODE_MKK:
3081 case COUNTRY_CODE_MKK1:
3082 case COUNTRY_CODE_ISRAEL:
3083 case COUNTRY_CODE_TELEC:
3086 ieee->bGlobalDomain = false;
3087 if (ChannelPlan[channel_plan].Len != 0){
3088 // Clear old channel map
3089 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
3090 // Set new channel map
3091 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
3093 if(ChannelPlan[channel_plan].Channel[i] <= 14)
3094 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
3099 case COUNTRY_CODE_GLOBAL_DOMAIN:
3101 GET_DOT11D_INFO(ieee)->bEnabled = 0;
3103 ieee->bGlobalDomain = true;
3106 case COUNTRY_CODE_WORLD_WIDE_13_INDEX://lzm add 080826
3108 ieee->MinPassiveChnlNum=12;
3109 ieee->IbssStartChnl= 10;
3115 ieee->bGlobalDomain = false;
3116 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
3119 GET_DOT11D_INFO(ieee)->channel_map[i] = 1;
3126 //Add for RF power on power off by lizhaoming 080512
3127 void GPIOChangeRFWorkItemCallBack(struct work_struct *work);
3130 static void rtl8180_statistics_init(struct Stats *pstats)
3132 memset(pstats, 0, sizeof(struct Stats));
3134 static void rtl8180_link_detect_init(plink_detect_t plink_detect)
3136 memset(plink_detect, 0, sizeof(link_detect_t));
3137 plink_detect->SlotNum = DEFAULT_SLOT_NUM;
3141 short rtl8180_init(struct net_device *dev)
3143 struct r8180_priv *priv = ieee80211_priv(dev);
3152 priv->channel_plan = eprom_read(dev, EEPROM_COUNTRY_CODE>>1) & 0xFF;
3153 if(priv->channel_plan > COUNTRY_CODE_GLOBAL_DOMAIN){
3154 printk("rtl8180_init:Error channel plan! Set to default.\n");
3155 priv->channel_plan = 0;
3157 //priv->channel_plan = 9; //Global Domain
3159 DMESG("Channel plan is %d\n",priv->channel_plan);
3160 rtl8180_set_channel_map(priv->channel_plan, priv->ieee80211);
3162 //memcpy(priv->stats,0,sizeof(struct Stats));
3164 //FIXME: these constants are placed in a bad pleace.
3165 priv->txbuffsize = 2048;//1024;
3166 priv->txringcount = 32;//32;
3167 priv->rxbuffersize = 2048;//1024;
3168 priv->rxringcount = 64;//32;
3169 priv->txbeaconcount = 2;
3170 priv->rx_skb_complete = 1;
3171 //priv->txnp_pending.ispending=0;
3172 /* ^^ the SKB does not containt a partial RXed
3176 priv->RegThreeWireMode = HW_THREE_WIRE_SI;
3178 //Add for RF power on power off by lizhaoming 080512
3179 priv->RFChangeInProgress = false;
3180 priv->SetRFPowerStateInProgress = false;
3181 priv->RFProgType = 0;
3182 priv->bInHctTest = false;
3184 priv->irq_enabled=0;
3186 //YJ,modified,080828
3187 rtl8180_statistics_init(&priv->stats);
3188 rtl8180_link_detect_init(&priv->link_detect);
3189 //YJ,modified,080828,end
3192 priv->ack_tx_to_ieee = 0;
3193 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3194 priv->ieee80211->iw_mode = IW_MODE_INFRA;
3195 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
3196 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
3197 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;
3198 priv->ieee80211->active_scan = 1;
3199 priv->ieee80211->rate = 110; //11 mbps
3200 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION;
3201 priv->ieee80211->host_encrypt = 1;
3202 priv->ieee80211->host_decrypt = 1;
3203 priv->ieee80211->sta_wake_up = rtl8180_hw_wakeup;
3204 priv->ieee80211->ps_request_tx_ack = rtl8180_rq_tx_ack;
3205 priv->ieee80211->enter_sleep_state = rtl8180_hw_sleep;
3206 priv->ieee80211->ps_is_queue_empty = rtl8180_is_tx_queue_empty;
3208 priv->hw_wep = hwwep;
3211 priv->retry_rts = DEFAULT_RETRY_RTS;
3212 priv->retry_data = DEFAULT_RETRY_DATA;
3213 priv->RFChangeInProgress = false;
3214 priv->SetRFPowerStateInProgress = false;
3215 priv->RFProgType = 0;
3216 priv->bInHctTest = false;
3217 priv->bInactivePs = true;//false;
3218 priv->ieee80211->bInactivePs = priv->bInactivePs;
3219 priv->bSwRfProcessing = false;
3220 priv->eRFPowerState = eRfOff;
3221 priv->RfOffReason = 0;
3222 priv->LedStrategy = SW_LED_MODE0;
3223 //priv->NumRxOkInPeriod = 0; //YJ,del,080828
3224 //priv->NumTxOkInPeriod = 0; //YJ,del,080828
3225 priv->TxPollingTimes = 0;//lzm add 080826
3226 priv->bLeisurePs = true;
3227 priv->dot11PowerSaveMode = eActive;
3228 //by amy for antenna
3229 priv->AdMinCheckPeriod = 5;
3230 priv->AdMaxCheckPeriod = 10;
3231 // Lower signal strength threshold to fit the HW participation in antenna diversity. +by amy 080312
3232 priv->AdMaxRxSsThreshold = 30;//60->30
3233 priv->AdRxSsThreshold = 20;//50->20
3234 priv->AdCheckPeriod = priv->AdMinCheckPeriod;
3235 priv->AdTickCount = 0;
3236 priv->AdRxSignalStrength = -1;
3237 priv->RegSwAntennaDiversityMechanism = 0;
3238 priv->RegDefaultAntenna = 0;
3239 priv->SignalStrength = 0;
3240 priv->AdRxOkCnt = 0;
3241 priv->CurrAntennaIndex = 0;
3242 priv->AdRxSsBeforeSwitched = 0;
3243 init_timer(&priv->SwAntennaDiversityTimer);
3244 priv->SwAntennaDiversityTimer.data = (unsigned long)dev;
3245 priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback;
3246 //by amy for antenna
3248 priv->bDigMechanism = 1;
3249 priv->InitialGain = 6;
3250 priv->bXtalCalibration = false;
3251 priv->XtalCal_Xin = 0;
3252 priv->XtalCal_Xout = 0;
3253 priv->bTxPowerTrack = false;
3254 priv->ThermalMeter = 0;
3255 priv->FalseAlarmRegValue = 0;
3256 priv->RegDigOfdmFaUpTh = 0xc; // Upper threhold of OFDM false alarm, which is used in DIG.
3257 priv->DIG_NumberFallbackVote = 0;
3258 priv->DIG_NumberUpgradeVote = 0;
3259 priv->LastSignalStrengthInPercent = 0;
3260 priv->Stats_SignalStrength = 0;
3261 priv->LastRxPktAntenna = 0;
3262 priv->SignalQuality = 0; // in 0-100 index.
3263 priv->Stats_SignalQuality = 0;
3264 priv->RecvSignalPower = 0; // in dBm.
3265 priv->Stats_RecvSignalPower = 0;
3266 priv->AdMainAntennaRxOkCnt = 0;
3267 priv->AdAuxAntennaRxOkCnt = 0;
3268 priv->bHWAdSwitched = false;
3269 priv->bRegHighPowerMechanism = true;
3270 priv->RegHiPwrUpperTh = 77;
3271 priv->RegHiPwrLowerTh = 75;
3272 priv->RegRSSIHiPwrUpperTh = 70;
3273 priv->RegRSSIHiPwrLowerTh = 20;
3274 priv->bCurCCKPkt = false;
3275 priv->UndecoratedSmoothedSS = -1;
3276 priv->bToUpdateTxPwr = false;
3277 priv->CurCCKRSSI = 0;
3281 priv->NumTxOkTotal = 0;
3282 priv->NumTxUnicast = 0;
3283 priv->keepAliveLevel = DEFAULT_KEEP_ALIVE_LEVEL;
3284 priv->PowerProfile = POWER_PROFILE_AC;
3286 //by amy for rate adaptive
3287 priv->CurrRetryCnt=0;
3288 priv->LastRetryCnt=0;
3289 priv->LastTxokCnt=0;
3290 priv->LastRxokCnt=0;
3291 priv->LastRetryRate=0;
3294 priv->CurrRetryRate=0;
3295 priv->TryupingCount=0;
3296 priv->TryupingCountNoData=0;
3297 priv->TryDownCountLowData=0;
3298 priv->LastTxOKBytes=0;
3299 priv->LastFailTxRate=0;
3300 priv->LastFailTxRateSS=0;
3301 priv->FailTxRateCount=0;
3302 priv->LastTxThroughput=0;
3303 priv->NumTxOkBytesTotal=0;
3304 priv->ForcedDataRate = 0;
3305 priv->RegBModeGainStage = 1;
3307 //by amy for rate adaptive
3309 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
3310 spin_lock_init(&priv->irq_lock);
3311 spin_lock_init(&priv->irq_th_lock);
3312 spin_lock_init(&priv->tx_lock);
3313 spin_lock_init(&priv->ps_lock);
3314 spin_lock_init(&priv->rf_ps_lock);
3315 sema_init(&priv->wx_sem,1);
3316 sema_init(&priv->rf_state,1);
3317 INIT_WORK(&priv->reset_wq,(void*) rtl8180_restart_wq);
3318 INIT_WORK(&priv->tx_irq_wq,(void*) rtl8180_tx_irq_wq);
3319 INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8180_hw_wakeup_wq);
3320 INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8180_hw_sleep_wq);
3321 //INIT_DELAYED_WORK(&priv->ieee80211->watch_dog_wq,(void*) rtl8180_watch_dog_wq);
3322 //INIT_DELAYED_WORK(&priv->ieee80211->sw_antenna_wq,(void*) rtl8180_sw_antenna_wq);
3323 INIT_WORK(&priv->ieee80211->wmm_param_update_wq,(void*) rtl8180_wmm_param_update);
3324 INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,(void*)rtl8180_rate_adapter);//+by amy 080312
3325 INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,(void*)rtl8180_hw_dig_wq);//+by amy 080312
3326 INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,(void*)rtl8180_tx_pw_wq);//+by amy 080312
3328 //add for RF power on power off by lizhaoming 080512
3329 INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,(void*) GPIOChangeRFWorkItemCallBack);
3330 //INIT_WORK(&priv->reset_wq,(void*) rtl8180_restart_wq,dev);
3332 tasklet_init(&priv->irq_rx_tasklet,
3333 (void(*)(unsigned long)) rtl8180_irq_rx_tasklet,
3334 (unsigned long)priv);
3336 init_timer(&priv->watch_dog_timer);
3337 priv->watch_dog_timer.data = (unsigned long)dev;
3338 priv->watch_dog_timer.function = watch_dog_adaptive;
3342 //by amy for rate adaptive
3343 init_timer(&priv->rateadapter_timer);
3344 priv->rateadapter_timer.data = (unsigned long)dev;
3345 priv->rateadapter_timer.function = timer_rate_adaptive;
3346 priv->RateAdaptivePeriod= RATE_ADAPTIVE_TIMER_PERIOD;
3347 priv->bEnhanceTxPwr=false;
3348 //by amy for rate adaptive
3350 //priv->ieee80211->func =
3351 // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL);
3352 //memset(priv->ieee80211->func, 0,
3353 // sizeof(struct ieee80211_helper_functions));
3355 priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit;
3356 priv->ieee80211->set_chan = rtl8180_set_chan;
3357 priv->ieee80211->link_change = rtl8180_link_change;
3358 priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit;
3359 priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop;
3360 priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume;
3362 priv->ieee80211->init_wmmparam_flag = 0;
3364 priv->ieee80211->start_send_beacons = rtl8180_start_tx_beacon;
3365 priv->ieee80211->stop_send_beacons = rtl8180_beacon_tx_disable;
3366 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
3368 priv->MWIEnable = 0;
3370 priv->ShortRetryLimit = 7;
3371 priv->LongRetryLimit = 7;
3372 priv->EarlyRxThreshold = 7;
3374 priv->CSMethod = (0x01 << 29);
3376 priv->TransmitConfig =
3377 1<<TCR_DurProcMode_OFFSET | //for RTL8185B, duration setting by HW
3378 (7<<TCR_MXDMA_OFFSET) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
3379 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | // Short retry limit
3380 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
3381 (0 ? TCR_SAT : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
3383 priv->ReceiveConfig =
3385 RCR_AMF | RCR_ADF | //accept management/data
3386 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
3387 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
3388 //RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
3389 (7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
3390 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
3391 (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
3393 priv->IntrMask = IMR_TMGDOK | IMR_TBDER | IMR_THPDER |
3394 IMR_THPDER | IMR_THPDOK |
3395 IMR_TVODER | IMR_TVODOK |
3396 IMR_TVIDER | IMR_TVIDOK |
3397 IMR_TBEDER | IMR_TBEDOK |
3398 IMR_TBKDER | IMR_TBKDOK |
3399 IMR_RDU | // To handle the defragmentation not enough Rx descriptors case. Annie, 2006-03-27.
3401 IMR_RQoSOK; // <NOTE> ROK and RQoSOK are mutually exclusive, so, we must handle RQoSOK interrupt to receive QoS frames, 2005.12.09, by rcnjko.
3403 priv->InitialGain = 6;
3405 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT;
3407 switch (hw_version){
3408 case HW_VERID_R8185B_B:
3409 priv->card_8185 = VERSION_8187S_C;
3410 DMESG("MAC controller is a RTL8187SE b/g");
3413 case HW_VERID_R8185_ABC:
3414 DMESG("MAC controller is a RTL8185 b/g");
3415 priv->card_8185 = 1;
3416 /* you should not find a card with 8225 PHY ver < C*/
3420 case HW_VERID_R8185_D:
3421 DMESG("MAC controller is a RTL8185 b/g (V. D)");
3422 priv->card_8185 = 2;
3423 /* you should not find a card with 8225 PHY ver < C*/
3427 case HW_VERID_R8180_ABCD:
3428 DMESG("MAC controller is a RTL8180");
3429 priv->card_8185 = 0;
3432 case HW_VERID_R8180_F:
3433 DMESG("MAC controller is a RTL8180 (v. F)");
3434 priv->card_8185 = 0;
3438 DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version);
3439 priv->card_8185 = 0;
3443 if(priv->card_8185){
3444 priv->ieee80211->modulation |= IEEE80211_OFDM_MODULATION;
3445 priv->ieee80211->short_slot = 1;
3447 /* you should not found any 8185 Ver B Card */
3448 priv->card_8185_Bversion = 0;
3451 priv->card_type = PCI;
3452 DMESG("This is a PCI NIC");
3453 priv->enable_gpio0 = 0;
3455 //by amy for antenna
3456 usValue = eprom_read(dev, EEPROM_SW_REVD_OFFSET);
3457 DMESG("usValue is 0x%x\n",usValue);
3458 //3Read AntennaDiversity
3459 // SW Antenna Diversity.
3460 if( (usValue & EEPROM_SW_AD_MASK) != EEPROM_SW_AD_ENABLE )
3462 priv->EEPROMSwAntennaDiversity = false;
3463 //printk("EEPROM Disable SW Antenna Diversity\n");
3467 priv->EEPROMSwAntennaDiversity = true;
3468 //printk("EEPROM Enable SW Antenna Diversity\n");
3470 // Default Antenna to use.
3471 if( (usValue & EEPROM_DEF_ANT_MASK) != EEPROM_DEF_ANT_1 )
3473 priv->EEPROMDefaultAntenna1 = false;
3474 //printk("EEPROM Default Antenna 0\n");
3478 priv->EEPROMDefaultAntenna1 = true;
3479 //printk("EEPROM Default Antenna 1\n");
3483 // Antenna diversity mechanism. Added by Roger, 2007.11.05.
3485 if( priv->RegSwAntennaDiversityMechanism == 0 ) // Auto
3486 {// 0: default from EEPROM.
3487 priv->bSwAntennaDiverity = priv->EEPROMSwAntennaDiversity;
3490 {// 1:disable antenna diversity, 2: enable antenna diversity.
3491 priv->bSwAntennaDiverity = ((priv->RegSwAntennaDiversityMechanism == 1)? false : true);
3493 //printk("bSwAntennaDiverity = %d\n", priv->bSwAntennaDiverity);
3497 // Default antenna settings. Added by Roger, 2007.11.05.
3499 if( priv->RegDefaultAntenna == 0)
3500 {// 0: default from EEPROM.
3501 priv->bDefaultAntenna1 = priv->EEPROMDefaultAntenna1;
3504 {// 1: main, 2: aux.
3505 priv->bDefaultAntenna1 = ((priv->RegDefaultAntenna== 2) ? true : false);
3507 //printk("bDefaultAntenna1 = %d\n", priv->bDefaultAntenna1);
3508 //by amy for antenna
3509 /* rtl8185 can calc plcp len in HW.*/
3510 priv->hw_plcp_len = 1;
3512 priv->plcp_preamble_mode = 2;
3513 /*the eeprom type is stored in RCR register bit #6 */
3514 if (RCR_9356SEL & read_nic_dword(dev, RCR)){
3515 priv->epromtype=EPROM_93c56;
3516 //DMESG("Reported EEPROM chip is a 93c56 (2Kbit)");
3518 priv->epromtype=EPROM_93c46;
3519 //DMESG("Reported EEPROM chip is a 93c46 (1Kbit)");
3522 dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff;
3523 dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8;
3524 dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff;
3525 dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8;
3526 dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff;
3527 dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8;
3528 //DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr));
3531 for(i=1,j=0; i<14; i+=2,j++){
3533 word = eprom_read(dev,EPROM_TXPW_CH1_2 + j);
3534 priv->chtxpwr[i]=word & 0xff;
3535 priv->chtxpwr[i+1]=(word & 0xff00)>>8;
3537 if(priv->card_8185){
3538 for(i=1,j=0; i<14; i+=2,j++){
3540 word = eprom_read(dev,EPROM_TXPW_OFDM_CH1_2 + j);
3541 priv->chtxpwr_ofdm[i]=word & 0xff;
3542 priv->chtxpwr_ofdm[i+1]=(word & 0xff00)>>8;
3546 //3Read crystal calibtration and thermal meter indication on 87SE.
3548 // By SD3 SY's request. Added by Roger, 2007.12.11.
3550 tmpu16 = eprom_read(dev, EEPROM_RSV>>1);
3552 //printk("ReadAdapterInfo8185(): EEPROM_RSV(%04x)\n", tmpu16);
3554 // Crystal calibration for Xin and Xout resp.
3555 priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK; // 0~7.5pF
3556 priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK)>>4; // 0~7.5pF
3557 if((tmpu16 & EEPROM_XTAL_CAL_ENABLE)>>12)
3558 priv->bXtalCalibration = true;
3560 // Thermal meter reference indication.
3561 priv->ThermalMeter = (u8)((tmpu16 & EEPROM_THERMAL_METER_MASK)>>8);
3562 if((tmpu16 & EEPROM_THERMAL_METER_ENABLE)>>13)
3563 priv->bTxPowerTrack = true;
3566 word = eprom_read(dev,EPROM_TXPW_BASE);
3567 priv->cck_txpwr_base = word & 0xf;
3568 priv->ofdm_txpwr_base = (word>>4) & 0xf;
3570 version = eprom_read(dev,EPROM_VERSION);
3571 DMESG("EEPROM version %x",version);
3572 if( (!priv->card_8185) && version < 0x0101){
3573 DMESG ("EEPROM version too old, assuming defaults");
3574 DMESG ("If you see this message *plase* send your \
3575 DMESG output to andreamrl@tiscali.it THANKS");
3579 priv->cs_treshold=0xc;
3581 priv->rf_chip=RFCHIPID_PHILIPS;
3583 if(!priv->card_8185){
3584 u8 rfparam = eprom_read(dev,RF_PARAM);
3585 DMESG("RfParam: %x",rfparam);
3587 priv->digphy = rfparam & (1<<RF_PARAM_DIGPHY_SHIFT) ? 0:1;
3588 priv->antb = rfparam & (1<<RF_PARAM_ANTBDEFAULT_SHIFT) ? 1:0;
3590 priv->rcr_csense = (rfparam & RF_PARAM_CARRIERSENSE_MASK) >>
3591 RF_PARAM_CARRIERSENSE_SHIFT;
3594 (read_nic_byte(dev,CONFIG2)&(1<<CONFIG2_ANTENNA_SHIFT)) ? 1:0;
3596 priv->rcr_csense = 3;
3599 priv->cs_treshold = (eprom_read(dev,ENERGY_TRESHOLD)&0xff00) >>8;
3601 priv->rf_chip = 0xff & eprom_read(dev,RFCHIPID);
3604 priv->rf_chip = RF_ZEBRA4;
3605 priv->rf_sleep = rtl8225z4_rf_sleep;
3606 priv->rf_wakeup = rtl8225z4_rf_wakeup;
3607 //DMESG("Card reports RF frontend Realtek 8225z2");
3608 //DMESGW("This driver has EXPERIMENTAL support for this chipset.");
3609 //DMESGW("use it with care and at your own risk and");
3610 DMESGW("**PLEASE** REPORT SUCCESSFUL/UNSUCCESSFUL TO Realtek!");
3612 priv->rf_close = rtl8225z2_rf_close;
3613 priv->rf_init = rtl8225z2_rf_init;
3614 priv->rf_set_chan = rtl8225z2_rf_set_chan;
3615 priv->rf_set_sens = NULL;
3616 //priv->rf_sleep = rtl8225_rf_sleep;
3617 //priv->rf_wakeup = rtl8225_rf_wakeup;
3621 if(!priv->card_8185){
3623 DMESG ("Antenna B is default antenna");
3625 DMESG ("Antenna A is default antenna");
3628 DMESG ("Antenna diversity is enabled");
3630 DMESG("Antenna diversity is disabled");
3632 DMESG("Carrier sense %d",priv->rcr_csense);
3635 if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount))
3638 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3639 TX_MANAGEPRIORITY_RING_ADDR))
3642 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3643 TX_BKPRIORITY_RING_ADDR))
3646 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3647 TX_BEPRIORITY_RING_ADDR))
3650 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3651 TX_VIPRIORITY_RING_ADDR))
3654 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3655 TX_VOPRIORITY_RING_ADDR))
3658 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
3659 TX_HIGHPRIORITY_RING_ADDR))
3662 if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txbeaconcount,
3663 TX_BEACON_RING_ADDR))
3667 //priv->beacon_buf=NULL;
3669 if(!priv->card_8185){
3671 if(read_nic_byte(dev, CONFIG0) & (1<<CONFIG0_WEP40_SHIFT))
3672 DMESG ("40-bit WEP is supported in hardware");
3674 DMESG ("40-bit WEP is NOT supported in hardware");
3676 if(read_nic_byte(dev,CONFIG0) & (1<<CONFIG0_WEP104_SHIFT))
3677 DMESG ("104-bit WEP is supported in hardware");
3679 DMESG ("104-bit WEP is NOT supported in hardware");
3681 #if !defined(SA_SHIRQ)
3682 if(request_irq(dev->irq, (void *)rtl8180_interrupt, IRQF_SHARED, dev->name, dev)){
3684 if(request_irq(dev->irq, (void *)rtl8180_interrupt, SA_SHIRQ, dev->name, dev)){
3686 DMESGE("Error allocating IRQ %d",dev->irq);
3690 DMESG("IRQ %d",dev->irq);
3698 void rtl8180_no_hw_wep(struct net_device *dev)
3700 struct r8180_priv *priv = ieee80211_priv(dev);
3702 if(!priv->card_8185)
3706 security = read_nic_byte(dev, SECURITY);
3707 security &=~(1<<SECURITY_WEP_TX_ENABLE_SHIFT);
3708 security &=~(1<<SECURITY_WEP_RX_ENABLE_SHIFT);
3710 write_nic_byte(dev, SECURITY, security);
3717 write_nic_dword(dev,TX_CONF,read_nic_dword(dev,TX_CONF) |
3718 (1<<TX_NOICV_SHIFT) );
3720 // priv->ieee80211->hw_wep=0;
3724 void rtl8180_set_hw_wep(struct net_device *dev)
3726 struct r8180_priv *priv = ieee80211_priv(dev);
3731 pgreg=read_nic_byte(dev, PGSELECT);
3732 write_nic_byte(dev, PGSELECT, pgreg &~ (1<<PGSELECT_PG_SHIFT));
3734 key0_word4 = read_nic_dword(dev, KEY0+4+4+4);
3735 key0_word4 &= ~ 0xff;
3736 key0_word4 |= priv->key0[3]& 0xff;
3737 write_nic_dword(dev,KEY0,(priv->key0[0]));
3738 write_nic_dword(dev,KEY0+4,(priv->key0[1]));
3739 write_nic_dword(dev,KEY0+4+4,(priv->key0[2]));
3740 write_nic_dword(dev,KEY0+4+4+4,(key0_word4));
3743 TX_CONF,read_nic_dword(dev,TX_CONF) &~(1<<TX_NOICV_SHIFT));
3746 security = read_nic_byte(dev,SECURITY);
3747 security |= (1<<SECURITY_WEP_TX_ENABLE_SHIFT);
3748 security |= (1<<SECURITY_WEP_RX_ENABLE_SHIFT);
3749 security &= ~ SECURITY_ENCRYP_MASK;
3750 security |= (SECURITY_ENCRYP_104<<SECURITY_ENCRYP_SHIFT);
3752 write_nic_byte(dev, SECURITY, security);
3754 DMESG("key %x %x %x %x",read_nic_dword(dev,KEY0+4+4+4),
3755 read_nic_dword(dev,KEY0+4+4),read_nic_dword(dev,KEY0+4),
3756 read_nic_dword(dev,KEY0));
3758 //priv->ieee80211->hw_wep=1;
3762 void rtl8185_rf_pins_enable(struct net_device *dev)
3765 // tmp = read_nic_word(dev, RFPinsEnable);
3766 write_nic_word(dev, RFPinsEnable, 0x1fff);// | tmp);
3767 // write_nic_word(dev, RFPinsEnable,7 | tmp);
3771 void rtl8185_set_anaparam2(struct net_device *dev, u32 a)
3775 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
3777 conf3 = read_nic_byte(dev, CONFIG3);
3778 write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
3779 write_nic_dword(dev, ANAPARAM2, a);
3781 conf3 = read_nic_byte(dev, CONFIG3);
3782 write_nic_byte(dev, CONFIG3, conf3 &~(1<<CONFIG3_ANAPARAM_W_SHIFT));
3783 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
3788 void rtl8180_set_anaparam(struct net_device *dev, u32 a)
3792 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
3794 conf3 = read_nic_byte(dev, CONFIG3);
3795 write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
3796 write_nic_dword(dev, ANAPARAM, a);
3798 conf3 = read_nic_byte(dev, CONFIG3);
3799 write_nic_byte(dev, CONFIG3, conf3 &~(1<<CONFIG3_ANAPARAM_W_SHIFT));
3800 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
3804 void rtl8185_tx_antenna(struct net_device *dev, u8 ant)
3806 write_nic_byte(dev, TX_ANTENNA, ant);
3807 force_pci_posting(dev);
3812 void rtl8185_write_phy(struct net_device *dev, u8 adr, u32 data)
3820 phyw= ((data<<8) | adr);
3822 // Note that, we must write 0xff7c after 0x7d-0x7f to write BB register.
3823 write_nic_byte(dev, 0x7f, ((phyw & 0xff000000) >> 24));
3824 write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16));
3825 write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8));
3826 write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) ));
3828 /* this is ok to fail when we write AGC table. check for AGC table might be
3829 * done by masking with 0x7f instead of 0xff
3831 //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data,adr);
3835 inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data)
3838 rtl8185_write_phy(dev, adr, data);
3842 void write_phy_cck (struct net_device *dev, u8 adr, u32 data)
3845 rtl8185_write_phy(dev, adr, data | 0x10000);
3850 * I hope this is enougth
3853 void write_phy(struct net_device *dev, u8 adr, u8 data)
3860 phy |= 0x80; /* this should enable writing */
3863 //PHY_ADR, PHY_R and PHY_W are contig and treated as one dword
3864 write_nic_dword(dev,PHY_ADR, phy);
3869 write_nic_dword(dev,PHY_ADR, phy);
3870 for(i=0;i<MAX_PHY;i++){
3871 phy=read_nic_dword(dev,PHY_ADR);
3872 phy= phy & 0xff0000;
3874 if(phy == data){ //SUCCESS!
3875 force_pci_posting(dev);
3876 mdelay(3); //random value
3879 force_pci_posting(dev);
3880 mdelay(3); //random value
3883 DMESGW ("Phy writing %x %x failed!", adr,data);
3886 void rtl8185_set_rate(struct net_device *dev)
3890 int basic_rate,min_rr_rate,max_rr_rate;
3892 // struct r8180_priv *priv = ieee80211_priv(dev);
3894 //if (ieee80211_is_54g(priv->ieee80211->current_network) &&
3895 // priv->ieee80211->state == IEEE80211_LINKED){
3896 basic_rate = ieeerate2rtlrate(240);
3897 min_rr_rate = ieeerate2rtlrate(60);
3898 max_rr_rate = ieeerate2rtlrate(240);
3902 // basic_rate = ieeerate2rtlrate(20);
3903 // min_rr_rate = ieeerate2rtlrate(10);
3904 // max_rr_rate = ieeerate2rtlrate(110);
3907 write_nic_byte(dev, RESP_RATE,
3908 max_rr_rate<<MAX_RESP_RATE_SHIFT| min_rr_rate<<MIN_RESP_RATE_SHIFT);
3910 word = read_nic_word(dev, BRSR);
3911 word &= ~BRSR_MBR_8185;
3914 for(i=0;i<=basic_rate;i++)
3917 write_nic_word(dev, BRSR, word);
3918 //DMESG("RR:%x BRSR: %x", read_nic_byte(dev,RESP_RATE),read_nic_word(dev,BRSR));
3923 void rtl8180_adapter_start(struct net_device *dev)
3925 struct r8180_priv *priv = ieee80211_priv(dev);
3931 rtl8180_rtx_disable(dev);
3934 /* seems that 0xffff or 0xafff will cause
3935 * HW interrupt line crash
3938 //priv->irq_mask = 0xafff;
3939 // priv->irq_mask = 0x4fcf;
3941 /* enable beacon timeout, beacon TX ok and err
3942 * LP tx ok and err, HP TX ok and err, NP TX ok and err,
3943 * RX ok and ERR, and GP timer */
3944 priv->irq_mask = 0x6fcf;
3946 priv->dma_poll_mask = 0;
3948 rtl8180_beacon_tx_disable(dev);
3950 if(priv->card_type == CARDBUS ){
3951 config3=read_nic_byte(dev, CONFIG3);
3952 write_nic_byte(dev,CONFIG3,config3 | CONFIG3_FuncRegEn);
3953 write_nic_word(dev,FEMR, FEMR_INTR | FEMR_WKUP | FEMR_GWAKE |
3954 read_nic_word(dev, FEMR));
3956 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
3957 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
3958 write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
3959 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
3961 rtl8180_update_msr(dev);
3963 if(!priv->card_8185){
3964 anaparam = eprom_read(dev,EPROM_ANAPARAM_ADDRLWORD);
3965 anaparam |= eprom_read(dev,EPROM_ANAPARAM_ADDRHWORD)<<16;
3967 rtl8180_set_anaparam(dev,anaparam);
3969 /* These might be unnecessary since we do in rx_enable / tx_enable */
3972 /*set_nic_rxring(dev);
3973 set_nic_txring(dev);*/
3975 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
3978 The following is very strange. seems to be that 1 means test mode,
3979 but we need to acknolwledges the nic when a packet is ready
3980 altought we set it to 0
3984 CONFIG2, read_nic_byte(dev,CONFIG2) &~\
3985 (1<<CONFIG2_DMA_POLLING_MODE_SHIFT));
3986 //^the nic isn't in test mode
3989 CONFIG2, read_nic_byte(dev,CONFIG2)|(1<<4));
3991 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
3993 write_nic_dword(dev,INT_TIMEOUT,0);
3995 if(!priv->card_8185)
3998 experimental - this might be needed to calibrate AGC,
3999 anyway it shouldn't hurt
4001 write_nic_byte(dev, CONFIG5,
4002 read_nic_byte(dev, CONFIG5) | (1<<AGCRESET_SHIFT));
4003 read_nic_byte(dev, CONFIG5);
4005 write_nic_byte(dev, CONFIG5,
4006 read_nic_byte(dev, CONFIG5) &~ (1<<AGCRESET_SHIFT));
4009 write_nic_byte(dev, WPA_CONFIG, 0);
4010 //write_nic_byte(dev, TESTR, 0xd);
4013 rtl8180_no_hw_wep(dev);
4015 if(priv->card_8185){
4016 rtl8185_set_rate(dev);
4017 write_nic_byte(dev, RATE_FALLBACK, 0x81);
4018 // write_nic_byte(dev, 0xdf, 0x15);
4020 word = read_nic_word(dev, BRSR);
4022 word &= ~BRSR_BPLCP;
4023 word |= ieeerate2rtlrate(priv->ieee80211->basic_rate);
4027 write_nic_word(dev, BRSR, word);
4031 if(priv->card_8185){
4032 write_nic_byte(dev, GP_ENABLE,read_nic_byte(dev, GP_ENABLE) & ~(1<<6));
4034 //FIXME cfg 3 ClkRun enable - isn't it ReadOnly ?
4035 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
4036 write_nic_byte(dev,CONFIG3, read_nic_byte(dev, CONFIG3)
4037 |(1<<CONFIG3_CLKRUN_SHIFT));
4038 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
4044 if(priv->rf_set_sens != NULL)
4045 priv->rf_set_sens(dev,priv->sens);
4046 rtl8180_irq_enable(dev);
4048 netif_start_queue(dev);
4049 /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY));
4051 DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY));
4053 DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY));
4054 if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK");
4055 if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK");
4056 if(check_nic_enought_desc(dev,LOW_PRIORITY)) DMESG("LOW OK");*/
4061 /* this configures registers for beacon tx and enables it via
4062 * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might
4063 * be used to stop beacon transmission
4065 void rtl8180_start_tx_beacon(struct net_device *dev)
4067 // struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
4069 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
4071 DMESG("Enabling beacon TX");
4072 //write_nic_byte(dev, 0x42,0xe6);// TCR
4073 // set_nic_txring(dev);
4074 // fix_tx_fifo(dev);
4075 rtl8180_prepare_beacon(dev);
4076 rtl8180_irq_disable(dev);
4077 rtl8180_beacon_tx_enable(dev);
4079 word = read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd;
4080 write_nic_word(dev, AtimWnd,word);// word |=
4081 //priv->ieee80211->current_network.atim_window);
4083 word = read_nic_word(dev, BintrItv);
4084 word &= ~BintrItv_BintrItv;
4085 word |= 1000;/*priv->ieee80211->current_network.beacon_interval *
4086 ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1);
4087 // FIXME: check if correct ^^ worked with 0x3e8;
4089 write_nic_word(dev, BintrItv, word);
4092 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
4094 // rtl8180_beacon_tx_enable(dev);
4095 rtl8185b_irq_enable(dev);
4096 /* VV !!!!!!!!!! VV*/
4098 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
4099 write_nic_byte(dev,0x9d,0x00);
4100 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
4102 // DMESG("ring %x %x", priv->txlpringdma,read_nic_dword(dev,TLPDA));
4108 /***************************************************************************
4109 -------------------------------NET STUFF---------------------------
4110 ***************************************************************************/
4111 static struct net_device_stats *rtl8180_stats(struct net_device *dev)
4113 struct r8180_priv *priv = ieee80211_priv(dev);
4115 return &priv->ieee80211->stats;
4118 // Change current and default preamble mode.
4119 // 2005.01.06, by rcnjko.
4122 MgntActSet_802_11_PowerSaveMode(
4123 struct r8180_priv *priv,
4128 // Currently, we do not change power save mode on IBSS mode.
4129 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
4135 // <RJ_NOTE> If we make HW to fill up the PwrMgt bit for us,
4136 // some AP will not response to our mgnt frames with PwrMgt bit set,
4137 // e.g. cannot associate the AP.
4138 // So I commented out it. 2005.02.16, by rcnjko.
4140 // // Change device's power save mode.
4141 // Adapter->HalFunc.SetPSModeHandler( Adapter, rtPsMode );
4143 // Update power save mode configured.
4144 // priv->dot11PowerSaveMode = rtPsMode;
4145 priv->ieee80211->ps = rtPsMode;
4146 // Determine ListenInterval.
4151 //================================================================================
4152 // Leisure Power Save in linked state.
4153 //================================================================================
4157 // Enter the leisure power save mode.
4161 struct r8180_priv *priv
4164 if (priv->bLeisurePs)
4166 if (priv->ieee80211->ps == IEEE80211_PS_DISABLED)
4168 //printk("----Enter PS\n");
4169 MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_MBCAST|IEEE80211_PS_UNICAST);//IEEE80211_PS_ENABLE
4177 // Leave the leisure power save mode.
4181 struct r8180_priv *priv
4184 if (priv->bLeisurePs)
4186 if (priv->ieee80211->ps != IEEE80211_PS_DISABLED)
4188 //printk("----Leave PS\n");
4189 MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_DISABLED);
4194 void rtl8180_hw_wakeup_wq (struct work_struct *work)
4196 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
4197 // struct ieee80211_device * ieee = (struct ieee80211_device*)
4198 // container_of(work, struct ieee80211_device, watch_dog_wq);
4199 struct delayed_work *dwork = to_delayed_work(work);
4200 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_wakeup_wq);
4201 struct net_device *dev = ieee->dev;
4203 // printk("dev is %d\n",dev);
4204 // printk("&*&(^*(&(&=========>%s()\n", __func__);
4205 rtl8180_hw_wakeup(dev);
4209 void rtl8180_hw_sleep_wq (struct work_struct *work)
4211 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
4212 // struct ieee80211_device * ieee = (struct ieee80211_device*)
4213 // container_of(work, struct ieee80211_device, watch_dog_wq);
4214 struct delayed_work *dwork = to_delayed_work(work);
4215 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_sleep_wq);
4216 struct net_device *dev = ieee->dev;
4218 rtl8180_hw_sleep_down(dev);
4221 //YJ,add,080828,for KeepAlive
4222 static void MgntLinkKeepAlive(struct r8180_priv *priv )
4224 if (priv->keepAliveLevel == 0)
4227 if(priv->ieee80211->state == IEEE80211_LINKED)
4232 //printk("LastTx:%d Tx:%d LastRx:%d Rx:%ld Idle:%d\n",priv->link_detect.LastNumTxUnicast,priv->NumTxUnicast, priv->link_detect.LastNumRxUnicast, priv->ieee80211->NumRxUnicast, priv->link_detect.IdleCount);
4234 if ( (priv->keepAliveLevel== 2) ||
4235 (priv->link_detect.LastNumTxUnicast == priv->NumTxUnicast &&
4236 priv->link_detect.LastNumRxUnicast == priv->ieee80211->NumRxUnicast )
4239 priv->link_detect.IdleCount++;
4242 // Send a Keep-Alive packet packet to AP if we had been idle for a while.
4244 if(priv->link_detect.IdleCount >= ((KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD)-1) )
4246 priv->link_detect.IdleCount = 0;
4247 ieee80211_sta_ps_send_null_frame(priv->ieee80211, false);
4252 priv->link_detect.IdleCount = 0;
4254 priv->link_detect.LastNumTxUnicast = priv->NumTxUnicast;
4255 priv->link_detect.LastNumRxUnicast = priv->ieee80211->NumRxUnicast;
4258 //YJ,add,080828,for KeepAlive,end
4260 static u8 read_acadapter_file(char *filename);
4261 void rtl8180_watch_dog(struct net_device *dev)
4263 struct r8180_priv *priv = ieee80211_priv(dev);
4264 bool bEnterPS = false;
4265 bool bBusyTraffic = false;
4270 if(priv->ieee80211->actscanning == false){
4271 if((priv->ieee80211->iw_mode != IW_MODE_ADHOC) && (priv->ieee80211->state == IEEE80211_NOLINK) && (priv->ieee80211->beinretry == false) && (priv->eRFPowerState == eRfOn)){
4276 //YJ,add,080828,for link state check
4277 if((priv->ieee80211->state == IEEE80211_LINKED) && (priv->ieee80211->iw_mode == IW_MODE_INFRA)){
4278 SlotIndex = (priv->link_detect.SlotIndex++) % priv->link_detect.SlotNum;
4279 priv->link_detect.RxFrameNum[SlotIndex] = priv->ieee80211->NumRxDataInPeriod + priv->ieee80211->NumRxBcnInPeriod;
4280 for( i=0; i<priv->link_detect.SlotNum; i++ )
4281 TotalRxNum+= priv->link_detect.RxFrameNum[i];
4282 //printk("&&&&&=== TotalRxNum = %d\n", TotalRxNum);
4283 if(TotalRxNum == 0){
4284 priv->ieee80211->state = IEEE80211_ASSOCIATING;
4285 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
4289 //YJ,add,080828,for KeepAlive
4290 MgntLinkKeepAlive(priv);
4292 //YJ,add,080828,for LPS
4294 if(priv->PowerProfile == POWER_PROFILE_BATTERY )
4296 //Turn on LeisurePS on battery power
4297 //printk("!!!!!On battery power\n");
4298 priv->bLeisurePs = true;
4300 else if(priv->PowerProfile == POWER_PROFILE_AC )
4302 // Turn off LeisurePS on AC power
4303 //printk("----On AC power\n");
4304 LeisurePSLeave(priv);
4305 priv->bLeisurePs= false;
4310 if(priv->ieee80211->state == IEEE80211_LINKED){
4311 priv->link_detect.NumRxOkInPeriod = priv->ieee80211->NumRxDataInPeriod;
4312 //printk("TxOk=%d RxOk=%d\n", priv->link_detect.NumTxOkInPeriod, priv->link_detect.NumRxOkInPeriod);
4313 if( priv->link_detect.NumRxOkInPeriod> 666 ||
4314 priv->link_detect.NumTxOkInPeriod> 666 ) {
4315 bBusyTraffic = true;
4317 if(((priv->link_detect.NumRxOkInPeriod + priv->link_detect.NumTxOkInPeriod) > 8)
4318 || (priv->link_detect.NumRxOkInPeriod > 2)) {
4326 LeisurePSEnter(priv);
4329 LeisurePSLeave(priv);
4333 LeisurePSLeave(priv);
4336 priv->link_detect.bBusyTraffic = bBusyTraffic;
4337 priv->link_detect.NumRxOkInPeriod = 0;
4338 priv->link_detect.NumTxOkInPeriod = 0;
4339 priv->ieee80211->NumRxDataInPeriod = 0;
4340 priv->ieee80211->NumRxBcnInPeriod = 0;
4342 int _rtl8180_up(struct net_device *dev)
4344 struct r8180_priv *priv = ieee80211_priv(dev);
4349 DMESG("Bringing up iface");
4350 rtl8185b_adapter_start(dev);
4351 rtl8185b_rx_enable(dev);
4352 rtl8185b_tx_enable(dev);
4354 if(priv->bInactivePs){
4355 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
4361 timer_rate_adaptive((unsigned long)dev);
4364 watch_dog_adaptive((unsigned long)dev);
4366 if(priv->bSwAntennaDiverity)
4367 SwAntennaDiversityTimerCallback(dev);
4370 ieee80211_softmac_start_protocol(priv->ieee80211);
4372 //Add for RF power on power off by lizhaoming 080512
4373 // priv->eRFPowerState = eRfOn;
4374 // printk("\n--------Start queue_work:GPIOChangeRFWorkItem");
4375 // queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->GPIOChangeRFWorkItem,1000);
4381 int rtl8180_open(struct net_device *dev)
4383 struct r8180_priv *priv = ieee80211_priv(dev);
4386 down(&priv->wx_sem);
4387 ret = rtl8180_up(dev);
4394 int rtl8180_up(struct net_device *dev)
4396 struct r8180_priv *priv = ieee80211_priv(dev);
4398 if (priv->up == 1) return -1;
4400 return _rtl8180_up(dev);
4404 int rtl8180_close(struct net_device *dev)
4406 struct r8180_priv *priv = ieee80211_priv(dev);
4409 down(&priv->wx_sem);
4410 ret = rtl8180_down(dev);
4417 int rtl8180_down(struct net_device *dev)
4419 struct r8180_priv *priv = ieee80211_priv(dev);
4421 if (priv->up == 0) return -1;
4425 ieee80211_softmac_stop_protocol(priv->ieee80211);
4427 if (!netif_queue_stopped(dev))
4428 netif_stop_queue(dev);
4429 rtl8180_rtx_disable(dev);
4430 rtl8180_irq_disable(dev);
4431 del_timer_sync(&priv->watch_dog_timer);
4432 //cancel_delayed_work(&priv->ieee80211->watch_dog_wq);
4434 del_timer_sync(&priv->rateadapter_timer);
4435 cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
4437 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
4438 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
4439 cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
4440 cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
4441 del_timer_sync(&priv->SwAntennaDiversityTimer);
4442 SetZebraRFPowerState8185(dev,eRfOff);
4443 //ieee80211_softmac_stop_protocol(priv->ieee80211);
4444 memset(&(priv->ieee80211->current_network),0,sizeof(struct ieee80211_network));
4445 priv->ieee80211->state = IEEE80211_NOLINK;
4449 void rtl8180_restart_wq(struct work_struct *work)
4451 struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq);
4452 struct net_device *dev = priv->dev;
4454 down(&priv->wx_sem);
4456 rtl8180_commit(dev);
4461 void rtl8180_restart(struct net_device *dev)
4463 struct r8180_priv *priv = ieee80211_priv(dev);
4464 //rtl8180_commit(dev);
4465 schedule_work(&priv->reset_wq);
4466 //DMESG("TXTIMEOUT");
4470 void rtl8180_commit(struct net_device *dev)
4472 struct r8180_priv *priv = ieee80211_priv(dev);
4474 if (priv->up == 0) return ;
4476 del_timer_sync(&priv->watch_dog_timer);
4477 //cancel_delayed_work(&priv->ieee80211->watch_dog_wq);
4479 //by amy for rate adaptive
4480 del_timer_sync(&priv->rateadapter_timer);
4481 cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
4482 //by amy for rate adaptive
4484 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
4485 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
4486 cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
4487 cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
4488 del_timer_sync(&priv->SwAntennaDiversityTimer);
4489 ieee80211_softmac_stop_protocol(priv->ieee80211);
4490 rtl8180_irq_disable(dev);
4491 rtl8180_rtx_disable(dev);
4496 static void r8180_set_multicast(struct net_device *dev)
4498 struct r8180_priv *priv = ieee80211_priv(dev);
4501 //down(&priv->wx_sem);
4503 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
4505 if (promisc != priv->promisc)
4506 rtl8180_restart(dev);
4508 priv->promisc = promisc;
4510 //up(&priv->wx_sem);
4513 int r8180_set_mac_adr(struct net_device *dev, void *mac)
4515 struct r8180_priv *priv = ieee80211_priv(dev);
4516 struct sockaddr *addr = mac;
4518 down(&priv->wx_sem);
4520 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
4522 if(priv->ieee80211->iw_mode == IW_MODE_MASTER)
4523 memcpy(priv->ieee80211->current_network.bssid, dev->dev_addr, ETH_ALEN);
4535 /* based on ipw2200 driver */
4536 int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
4538 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
4540 struct iwreq *wrq = (struct iwreq *) rq;
4543 case RTL_IOCTL_WPA_SUPPLICANT:
4544 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
4556 /****************************************************************************
4557 -----------------------------PCI STUFF---------------------------
4558 *****************************************************************************/
4560 static const struct net_device_ops rtl8180_netdev_ops = {
4561 .ndo_open = rtl8180_open,
4562 .ndo_stop = rtl8180_close,
4563 .ndo_get_stats = rtl8180_stats,
4564 .ndo_tx_timeout = rtl8180_restart,
4565 .ndo_do_ioctl = rtl8180_ioctl,
4566 .ndo_set_multicast_list = r8180_set_multicast,
4567 .ndo_set_mac_address = r8180_set_mac_adr,
4568 .ndo_validate_addr = eth_validate_addr,
4569 .ndo_change_mtu = eth_change_mtu,
4570 .ndo_start_xmit = ieee80211_xmit,
4573 static int __devinit rtl8180_pci_probe(struct pci_dev *pdev,
4574 const struct pci_device_id *id)
4576 unsigned long ioaddr = 0;
4577 struct net_device *dev = NULL;
4578 struct r8180_priv *priv= NULL;
4582 unsigned long pmem_start, pmem_len, pmem_flags;
4584 DMESG("Configuring chip resources");
4586 if( pci_enable_device (pdev) ){
4587 DMESG("Failed to enable PCI device");
4591 pci_set_master(pdev);
4592 //pci_set_wmi(pdev);
4593 pci_set_dma_mask(pdev, 0xffffff00ULL);
4594 pci_set_consistent_dma_mask(pdev,0xffffff00ULL);
4595 dev = alloc_ieee80211(sizeof(struct r8180_priv));
4598 priv = ieee80211_priv(dev);
4599 priv->ieee80211 = netdev_priv(dev);
4601 pci_set_drvdata(pdev, dev);
4602 SET_NETDEV_DEV(dev, &pdev->dev);
4604 priv = ieee80211_priv(dev);
4605 // memset(priv,0,sizeof(struct r8180_priv));
4610 pmem_start = pci_resource_start(pdev, 1);
4611 pmem_len = pci_resource_len(pdev, 1);
4612 pmem_flags = pci_resource_flags (pdev, 1);
4614 if (!(pmem_flags & IORESOURCE_MEM)) {
4615 DMESG("region #1 not a MMIO resource, aborting");
4619 //DMESG("Memory mapped space @ 0x%08lx ", pmem_start);
4620 if( ! request_mem_region(pmem_start, pmem_len, RTL8180_MODULE_NAME)) {
4621 DMESG("request_mem_region failed!");
4626 ioaddr = (unsigned long)ioremap_nocache( pmem_start, pmem_len);
4627 if( ioaddr == (unsigned long)NULL ){
4628 DMESG("ioremap failed!");
4629 // release_mem_region( pmem_start, pmem_len );
4633 dev->mem_start = ioaddr; // shared mem start
4634 dev->mem_end = ioaddr + pci_resource_len(pdev, 0); // shared mem end
4637 //pci_read_config_byte(pdev, 0x05, ptr);
4638 //pci_write_config_byte(pdev, 0x05, (*ptr) & (~0x04));
4639 pci_read_config_byte(pdev, 0x05, &unit);
4640 pci_write_config_byte(pdev, 0x05, unit & (~0x04));
4642 dev->irq = pdev->irq;
4645 dev->netdev_ops = &rtl8180_netdev_ops;
4646 dev->wireless_handlers = &r8180_wx_handlers_def;
4648 dev->type=ARPHRD_ETHER;
4649 dev->watchdog_timeo = HZ*3; //added by david woo, 2007.12.13
4651 if (dev_alloc_name(dev, ifname) < 0){
4652 DMESG("Oops: devname already taken! Trying wlan%%d...\n");
4654 // ifname = "ath%d";
4655 dev_alloc_name(dev, ifname);
4659 if(rtl8180_init(dev)!=0){
4660 DMESG("Initialization failed");
4664 netif_carrier_off(dev);
4666 register_netdev(dev);
4668 rtl8180_proc_init_one(dev);
4670 DMESG("Driver probe completed\n");
4675 if( dev->mem_start != (unsigned long)NULL ){
4676 iounmap( (void *)dev->mem_start );
4677 release_mem_region( pci_resource_start(pdev, 1),
4678 pci_resource_len(pdev, 1) );
4686 free_irq(dev->irq, dev);
4689 free_ieee80211(dev);
4692 pci_disable_device(pdev);
4694 DMESG("wlan driver load failed\n");
4695 pci_set_drvdata(pdev, NULL);
4701 static void __devexit rtl8180_pci_remove(struct pci_dev *pdev)
4703 struct r8180_priv *priv;
4704 struct net_device *dev = pci_get_drvdata(pdev);
4707 unregister_netdev(dev);
4709 priv=ieee80211_priv(dev);
4711 rtl8180_proc_remove_one(dev);
4713 priv->rf_close(dev);
4715 //rtl8180_rtx_disable(dev);
4716 //rtl8180_irq_disable(dev);
4718 //write_nic_word(dev,INTA,read_nic_word(dev,INTA));
4719 //force_pci_posting(dev);
4724 DMESG("Freeing irq %d",dev->irq);
4725 free_irq(dev->irq, dev);
4730 free_rx_desc_ring(dev);
4731 free_tx_desc_rings(dev);
4732 // free_beacon_desc_ring(dev,priv->txbeaconcount);
4734 if( dev->mem_start != (unsigned long)NULL ){
4735 iounmap( (void *)dev->mem_start );
4736 release_mem_region( pci_resource_start(pdev, 1),
4737 pci_resource_len(pdev, 1) );
4740 free_ieee80211(dev);
4742 pci_disable_device(pdev);
4744 DMESG("wlan driver removed\n");
4748 /* fun with the built-in ieee80211 stack... */
4749 extern int ieee80211_crypto_init(void);
4750 extern void ieee80211_crypto_deinit(void);
4751 extern int ieee80211_crypto_tkip_init(void);
4752 extern void ieee80211_crypto_tkip_exit(void);
4753 extern int ieee80211_crypto_ccmp_init(void);
4754 extern void ieee80211_crypto_ccmp_exit(void);
4755 extern int ieee80211_crypto_wep_init(void);
4756 extern void ieee80211_crypto_wep_exit(void);
4758 static int __init rtl8180_pci_module_init(void)
4762 ret = ieee80211_crypto_init();
4764 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
4767 ret = ieee80211_crypto_tkip_init();
4769 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n", ret);
4772 ret = ieee80211_crypto_ccmp_init();
4774 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n", ret);
4777 ret = ieee80211_crypto_wep_init();
4779 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
4783 printk(KERN_INFO "\nLinux kernel driver for RTL8180 \
4784 / RTL8185 based WLAN cards\n");
4785 printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n");
4786 DMESG("Initializing module");
4787 DMESG("Wireless extensions version %d", WIRELESS_EXT);
4788 rtl8180_proc_module_init();
4790 if(0!=pci_register_driver(&rtl8180_pci_driver))
4791 //if(0!=pci_module_init(&rtl8180_pci_driver))
4793 DMESG("No device found");
4794 /*pci_unregister_driver (&rtl8180_pci_driver);*/
4801 static void __exit rtl8180_pci_module_exit(void)
4803 pci_unregister_driver (&rtl8180_pci_driver);
4804 rtl8180_proc_module_remove();
4805 ieee80211_crypto_tkip_exit();
4806 ieee80211_crypto_ccmp_exit();
4807 ieee80211_crypto_wep_exit();
4808 ieee80211_crypto_deinit();
4813 void rtl8180_try_wake_queue(struct net_device *dev, int pri)
4815 unsigned long flags;
4817 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
4819 spin_lock_irqsave(&priv->tx_lock,flags);
4820 enough_desc = check_nic_enought_desc(dev,pri);
4821 spin_unlock_irqrestore(&priv->tx_lock,flags);
4824 ieee80211_wake_queue(priv->ieee80211);
4827 /*****************************************************************************
4828 -----------------------------IRQ STUFF---------------------------
4829 ******************************************************************************/
4831 void rtl8180_tx_isr(struct net_device *dev, int pri,short error)
4833 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
4835 u32 *tail; //tail virtual addr
4836 u32 *head; //head virtual addr
4837 u32 *begin;//start of ring virtual addr
4838 u32 *nicv; //nic pointer virtual addr
4839 // u32 *txdv; //packet just TXed
4840 u32 nic; //nic pointer physical addr
4841 u32 nicbegin;// start of ring physical addr
4844 /* physical addr are ok on 32 bits since we set DMA mask*/
4849 if (error) priv->stats.txretry++; //tony 20060601
4850 spin_lock_irqsave(&priv->tx_lock,flag);
4852 case MANAGE_PRIORITY:
4853 tail = priv->txmapringtail;
4854 begin = priv->txmapring;
4855 head = priv->txmapringhead;
4856 nic = read_nic_dword(dev,TX_MANAGEPRIORITY_RING_ADDR);
4857 nicbegin = priv->txmapringdma;
4861 tail = priv->txbkpringtail;
4862 begin = priv->txbkpring;
4863 head = priv->txbkpringhead;
4864 nic = read_nic_dword(dev,TX_BKPRIORITY_RING_ADDR);
4865 nicbegin = priv->txbkpringdma;
4869 tail = priv->txbepringtail;
4870 begin = priv->txbepring;
4871 head = priv->txbepringhead;
4872 nic = read_nic_dword(dev,TX_BEPRIORITY_RING_ADDR);
4873 nicbegin = priv->txbepringdma;
4877 tail = priv->txvipringtail;
4878 begin = priv->txvipring;
4879 head = priv->txvipringhead;
4880 nic = read_nic_dword(dev,TX_VIPRIORITY_RING_ADDR);
4881 nicbegin = priv->txvipringdma;
4885 tail = priv->txvopringtail;
4886 begin = priv->txvopring;
4887 head = priv->txvopringhead;
4888 nic = read_nic_dword(dev,TX_VOPRIORITY_RING_ADDR);
4889 nicbegin = priv->txvopringdma;
4893 tail = priv->txhpringtail;
4894 begin = priv->txhpring;
4895 head = priv->txhpringhead;
4896 nic = read_nic_dword(dev,TX_HIGHPRIORITY_RING_ADDR);
4897 nicbegin = priv->txhpringdma;
4901 spin_unlock_irqrestore(&priv->tx_lock,flag);
4904 /* DMESG("%x %s %x %x",((int)nic & 0xfff)/8/4,
4905 *(priv->txnpring + ((int)nic&0xfff)/4/8) & (1<<31) ? "filled" : "empty",
4906 (priv->txnpringtail - priv->txnpring)/8,(priv->txnpringhead -
4909 //nicv = (u32*) ((nic - nicbegin) + (int)begin);
4910 nicv = (u32*) ((nic - nicbegin) + (u8*)begin);
4911 if((head <= tail && (nicv > tail || nicv < head)) ||
4912 (head > tail && (nicv > tail && nicv < head))){
4913 DMESGW("nic has lost pointer");
4914 spin_unlock_irqrestore(&priv->tx_lock,flag);
4915 rtl8180_restart(dev);
4919 /* we check all the descriptors between the head and the nic,
4920 * but not the currenly pointed by the nic (the next to be txed)
4921 * and the previous of the pointed (might be in process ??)
4923 //if (head == nic) return;
4924 //DMESG("%x %x",head,nic);
4925 offs = (nic - nicbegin);
4926 //DMESG("%x %x %x",nic ,(u32)nicbegin, (int)nic -nicbegin);
4930 hd = (head - begin) /8;
4935 j = offs + (priv->txringcount -1 -hd);
4936 // j= priv->txringcount -1- (hd - offs);
4944 // printk("+++++++++++++check status desc\n");
4945 if((*head) & (1<<31))
4947 if(((*head)&(0x10000000)) != 0){
4948 // printk("++++++++++++++last desc,retry count is %d\n",((*head) & (0x000000ff)));
4949 priv->CurrRetryCnt += (u16)((*head) & (0x000000ff));
4953 priv->NumTxOkTotal++;
4954 // printk("NumTxOkTotal is %d\n",priv->NumTxOkTotal++);
4957 // printk("in function %s:curr_retry_count is %d\n",__func__,((*head) & (0x000000ff)));
4960 priv->NumTxOkBytesTotal += (*(head+3)) & (0x00000fff);
4962 // printk("in function %s:curr_txokbyte_count is %d\n",__func__,(*(head+3)) & (0x00000fff));
4963 *head = *head &~ (1<<31);
4965 if((head - begin)/8 == priv->txringcount-1)
4972 //DMESG("%x",txdv[0]);
4973 /* the head has been moved to the last certainly TXed
4974 * (or at least processed by the nic) packet.
4975 * The driver take forcefully owning of all these packets
4976 * If the packet previous of the nic pointer has been
4977 * processed this doesn't matter: it will be checked
4978 * here at the next round. Anyway if no more packet are
4979 * TXed no memory leak occour at all.
4983 case MANAGE_PRIORITY:
4984 priv->txmapringhead = head;
4985 //printk("1==========================================> priority check!\n");
4986 if(priv->ack_tx_to_ieee){
4987 // try to implement power-save mode 2008.1.22
4988 // printk("2==========================================> priority check!\n");
4990 if(rtl8180_is_tx_queue_empty(dev)){
4991 // printk("tx queue empty, after send null sleep packet, try to sleep !\n");
4992 priv->ack_tx_to_ieee = 0;
4993 ieee80211_ps_tx_ack(priv->ieee80211,!error);
5000 priv->txbkpringhead = head;
5004 priv->txbepringhead = head;
5008 priv->txvipringhead = head;
5012 priv->txvopringhead = head;
5016 priv->txhpringhead = head;
5020 /*DMESG("%x %x %x", (priv->txnpringhead - priv->txnpring) /8 ,
5021 (priv->txnpringtail - priv->txnpring) /8,
5025 spin_unlock_irqrestore(&priv->tx_lock,flag);
5029 void rtl8180_tx_irq_wq(struct work_struct *work)
5031 //struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq);
5032 struct delayed_work *dwork = to_delayed_work(work);
5033 struct ieee80211_device * ieee = (struct ieee80211_device*)
5034 container_of(dwork, struct ieee80211_device, watch_dog_wq);
5035 struct net_device *dev = ieee->dev;
5037 rtl8180_tx_isr(dev,MANAGE_PRIORITY,0);
5039 irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs)
5041 struct net_device *dev = (struct net_device *) netdev;
5042 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
5043 unsigned long flags;
5046 /* We should return IRQ_NONE, but for now let me keep this */
5047 if(priv->irq_enabled == 0) return IRQ_HANDLED;
5049 spin_lock_irqsave(&priv->irq_th_lock,flags);
5052 inta = read_nic_dword(dev, ISR);// & priv->IntrMask;
5053 write_nic_dword(dev,ISR,inta); // reset int situation
5055 priv->stats.shints++;
5057 //DMESG("Enter interrupt, ISR value = 0x%08x", inta);
5060 spin_unlock_irqrestore(&priv->irq_th_lock,flags);
5063 most probably we can safely return IRQ_NONE,
5064 but for now is better to avoid problems
5070 spin_unlock_irqrestore(&priv->irq_th_lock,flags);
5075 //priv->irqpending = inta;
5078 if(!netif_running(dev)) {
5079 spin_unlock_irqrestore(&priv->irq_th_lock,flags);
5083 if(inta & ISR_TimeOut){
5084 write_nic_dword(dev, TimerInt, 0);
5085 //DMESG("=================>waking up");
5086 // rtl8180_hw_wakeup(dev);
5089 if(inta & ISR_TBDOK){
5090 priv->stats.txbeacon++;
5093 if(inta & ISR_TBDER){
5094 priv->stats.txbeaconerr++;
5097 if(inta & IMR_TMGDOK ) {
5098 // priv->NumTxOkTotal++;
5099 rtl8180_tx_isr(dev,MANAGE_PRIORITY,0);
5100 // schedule_work(&priv->tx_irq_wq);
5104 if(inta & ISR_THPDER){
5105 priv->stats.txhperr++;
5106 rtl8180_tx_isr(dev,HI_PRIORITY,1);
5107 priv->ieee80211->stats.tx_errors++;
5110 if(inta & ISR_THPDOK){ //High priority tx ok
5111 // priv->NumTxOkTotal++;
5112 //priv->NumTxOkInPeriod++; //YJ,del,080828
5113 priv->link_detect.NumTxOkInPeriod++; //YJ,add,080828
5114 priv->stats.txhpokint++;
5115 rtl8180_tx_isr(dev,HI_PRIORITY,0);
5118 if(inta & ISR_RER) {
5119 priv->stats.rxerr++;
5121 if(inta & ISR_TBKDER){ //corresponding to BK_PRIORITY
5122 priv->stats.txbkperr++;
5123 priv->ieee80211->stats.tx_errors++;
5124 //tasklet_schedule(&priv->irq_tx_tasklet);
5125 rtl8180_tx_isr(dev,BK_PRIORITY,1);
5126 rtl8180_try_wake_queue(dev, BE_PRIORITY);
5129 if(inta & ISR_TBEDER){ //corresponding to BE_PRIORITY
5130 priv->stats.txbeperr++;
5131 priv->ieee80211->stats.tx_errors++;
5132 rtl8180_tx_isr(dev,BE_PRIORITY,1);
5133 //tasklet_schedule(&priv->irq_tx_tasklet);
5134 rtl8180_try_wake_queue(dev, BE_PRIORITY);
5136 if(inta & ISR_TNPDER){ //corresponding to VO_PRIORITY
5137 priv->stats.txnperr++;
5138 priv->ieee80211->stats.tx_errors++;
5139 //tasklet_schedule(&priv->irq_tx_tasklet);
5140 rtl8180_tx_isr(dev,NORM_PRIORITY,1);
5141 rtl8180_try_wake_queue(dev, NORM_PRIORITY);
5144 if(inta & ISR_TLPDER){ //corresponding to VI_PRIORITY
5145 priv->stats.txlperr++;
5146 priv->ieee80211->stats.tx_errors++;
5147 rtl8180_tx_isr(dev,LOW_PRIORITY,1);
5148 //tasklet_schedule(&priv->irq_tx_tasklet);
5149 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
5153 //priv->NumRxOkInPeriod++; //YJ,del,080828
5154 priv->stats.rxint++;
5155 tasklet_schedule(&priv->irq_rx_tasklet);
5158 if(inta & ISR_RQoSOK ){
5159 //priv->NumRxOkInPeriod++; //YJ,del,080828
5160 priv->stats.rxint++;
5161 tasklet_schedule(&priv->irq_rx_tasklet);
5163 if(inta & ISR_BcnInt) {
5164 //DMESG("Preparing Beacons");
5165 rtl8180_prepare_beacon(dev);
5169 DMESGW("No RX descriptor available");
5170 priv->stats.rxrdu++;
5171 tasklet_schedule(&priv->irq_rx_tasklet);
5172 /*queue_work(priv->workqueue ,&priv->restart_work);*/
5175 if(inta & ISR_RXFOVW){
5176 priv->stats.rxoverflow++;
5177 tasklet_schedule(&priv->irq_rx_tasklet);
5178 //queue_work(priv->workqueue ,&priv->restart_work);
5181 if(inta & ISR_TXFOVW) priv->stats.txoverflow++;
5183 if(inta & ISR_TNPDOK){ //Normal priority tx ok
5184 // priv->NumTxOkTotal++;
5185 //priv->NumTxOkInPeriod++; //YJ,del,080828
5186 priv->link_detect.NumTxOkInPeriod++; //YJ,add,080828
5187 // priv->ieee80211->stats.tx_packets++;
5188 priv->stats.txnpokint++;
5189 rtl8180_tx_isr(dev,NORM_PRIORITY,0);
5192 if(inta & ISR_TLPDOK){ //Low priority tx ok
5193 // priv->NumTxOkTotal++;
5194 //priv->NumTxOkInPeriod++; //YJ,del,080828
5195 priv->link_detect.NumTxOkInPeriod++; //YJ,add,080828
5196 // priv->ieee80211->stats.tx_packets++;
5197 priv->stats.txlpokint++;
5198 rtl8180_tx_isr(dev,LOW_PRIORITY,0);
5199 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
5202 if(inta & ISR_TBKDOK){ //corresponding to BK_PRIORITY
5203 priv->stats.txbkpokint++;
5204 // priv->NumTxOkTotal++;
5205 //priv->NumTxOkInPeriod++; //YJ,del,080828
5206 priv->link_detect.NumTxOkInPeriod++; //YJ,add,080828
5207 rtl8180_tx_isr(dev,BK_PRIORITY,0);
5208 rtl8180_try_wake_queue(dev, BE_PRIORITY);
5211 if(inta & ISR_TBEDOK){ //corresponding to BE_PRIORITY
5212 priv->stats.txbeperr++;
5213 // priv->NumTxOkTotal++;
5214 //priv->NumTxOkInPeriod++; //YJ,del,080828
5215 priv->link_detect.NumTxOkInPeriod++; //YJ,add,080828
5216 rtl8180_tx_isr(dev,BE_PRIORITY,0);
5217 rtl8180_try_wake_queue(dev, BE_PRIORITY);
5219 force_pci_posting(dev);
5220 spin_unlock_irqrestore(&priv->irq_th_lock,flags);
5226 void rtl8180_irq_rx_tasklet(struct r8180_priv* priv)
5228 // unsigned long flags;
5230 /* spin_lock_irqsave(&priv->irq_lock, flags);
5231 priv->irq_mask &=~IMR_ROK;
5232 priv->irq_mask &=~IMR_RDU;
5234 rtl8180_irq_enable(priv->dev);
5235 spin_unlock_irqrestore(&priv->irq_lock, flags);
5237 rtl8180_rx(priv->dev);
5239 /* spin_lock_irqsave(&priv->irq_lock, flags);
5240 priv->irq_mask |= IMR_ROK;
5241 priv->irq_mask |= IMR_RDU;
5242 rtl8180_irq_enable(priv->dev);
5243 spin_unlock_irqrestore(&priv->irq_lock, flags);
5247 /****************************************************************************
5248 lizhaoming--------------------------- RF power on/power off -----------------
5249 *****************************************************************************/
5251 void GPIOChangeRFWorkItemCallBack(struct work_struct *work)
5253 //struct delayed_work *dwork = to_delayed_work(work);
5254 struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, GPIOChangeRFWorkItem.work);
5255 struct net_device *dev = ieee->dev;
5256 struct r8180_priv *priv = ieee80211_priv(dev);
5261 RT_RF_POWER_STATE eRfPowerStateToSet;
5262 bool bActuallySet=false;
5265 static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
5266 static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
5267 static int readf_count = 0;
5268 //printk("============>%s in \n", __func__);
5271 if(readf_count % 10 == 0)
5272 priv->PowerProfile = read_acadapter_file("/proc/acpi/ac_adapter/AC0/state");
5274 readf_count = (readf_count+1)%0xffff;
5277 // We should turn off LED before polling FF51[4].
5280 btPSR = read_nic_byte(dev, PSR);
5281 write_nic_byte(dev, PSR, (btPSR & ~BIT3));
5283 //It need to delay 4us suggested by Jong, 2008-01-16
5286 //HW radio On/Off according to the value of FF51[4](config0)
5287 btConfig0 = btPSR = read_nic_byte(dev, CONFIG0);
5290 write_nic_byte(dev, PSR, btPSR| BIT3);
5292 eRfPowerStateToSet = (btConfig0 & BIT4) ? eRfOn : eRfOff;
5294 if((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn))
5296 priv->ieee80211->bHwRadioOff = false;
5297 bActuallySet = true;
5299 else if((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff))
5301 priv->ieee80211->bHwRadioOff = true;
5302 bActuallySet = true;
5307 MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
5309 /* To update the UI status for Power status changed */
5310 if(priv->ieee80211->bHwRadioOff == true)
5313 //if(!priv->RfOffReason)
5316 // argv[1] = "RFOFF";
5318 argv[0] = RadioPowerPath;
5321 call_usermodehelper(RadioPowerPath,argv,envp,1);
5328 static u8 read_acadapter_file(char *filename)
5333 /***************************************************************************
5334 ------------------- module init / exit stubs ----------------
5335 ****************************************************************************/
5336 module_init(rtl8180_pci_module_init);
5337 module_exit(rtl8180_pci_module_exit);