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.
26 Power management interface routines.
27 Written by Mariusz Matuszek.
30 #undef RX_DONT_PASS_UL
33 #include <linux/syscalls.h>
37 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
38 #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
,
55 .subvendor
= PCI_ANY_ID
,
56 .subdevice
= PCI_ANY_ID
,
69 static char* ifname
= "wlan%d";
70 static int hwseqnum
= 0;
72 static int channels
= 0x3fff;
74 #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 )
75 #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])
76 MODULE_LICENSE("GPL");
77 MODULE_DEVICE_TABLE(pci
, rtl8180_pci_id_tbl
);
78 MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
79 MODULE_DESCRIPTION("Linux driver for Realtek RTL8180 / RTL8185 WiFi cards");
82 module_param(ifname
, charp
, S_IRUGO
|S_IWUSR
);
83 module_param(hwseqnum
,int, S_IRUGO
|S_IWUSR
);
84 module_param(hwwep
,int, S_IRUGO
|S_IWUSR
);
85 module_param(channels
,int, S_IRUGO
|S_IWUSR
);
87 MODULE_PARM_DESC(devname
," Net interface name, wlan%d=default");
88 MODULE_PARM_DESC(hwseqnum
," Try to use hardware 802.11 header sequence numbers. Zero=default");
89 MODULE_PARM_DESC(hwwep
," Try to use hardware WEP support. Still broken and not available on all cards");
90 MODULE_PARM_DESC(channels
," Channel bitmask for specific locales. NYI");
93 static int __devinit
rtl8180_pci_probe(struct pci_dev
*pdev
,
94 const struct pci_device_id
*id
);
96 static void __devexit
rtl8180_pci_remove(struct pci_dev
*pdev
);
98 static void rtl8180_shutdown (struct pci_dev
*pdev
)
100 struct net_device
*dev
= pci_get_drvdata(pdev
);
101 if (dev
->netdev_ops
->ndo_stop
)
102 dev
->netdev_ops
->ndo_stop(dev
);
103 pci_disable_device(pdev
);
106 static int rtl8180_suspend(struct pci_dev
*pdev
, pm_message_t state
)
108 struct net_device
*dev
= pci_get_drvdata(pdev
);
110 if (!netif_running(dev
))
111 goto out_pci_suspend
;
113 if (dev
->netdev_ops
->ndo_stop
)
114 dev
->netdev_ops
->ndo_stop(dev
);
116 netif_device_detach(dev
);
119 pci_save_state(pdev
);
120 pci_disable_device(pdev
);
121 pci_set_power_state(pdev
, pci_choose_state(pdev
, state
));
125 static int rtl8180_resume(struct pci_dev
*pdev
)
127 struct net_device
*dev
= pci_get_drvdata(pdev
);
131 pci_set_power_state(pdev
, PCI_D0
);
133 err
= pci_enable_device(pdev
);
135 printk(KERN_ERR
"%s: pci_enable_device failed on resume\n",
141 pci_restore_state(pdev
);
144 * Suspend/Resume resets the PCI configuration space, so we have to
145 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
146 * from interfering with C3 CPU state. pci_restore_state won't help
147 * here since it only restores the first 64 bytes pci config header.
149 pci_read_config_dword(pdev
, 0x40, &val
);
150 if ((val
& 0x0000ff00) != 0)
151 pci_write_config_dword(pdev
, 0x40, val
& 0xffff00ff);
153 if (!netif_running(dev
))
156 if (dev
->netdev_ops
->ndo_open
)
157 dev
->netdev_ops
->ndo_open(dev
);
159 netif_device_attach(dev
);
164 static struct pci_driver rtl8180_pci_driver
= {
165 .name
= RTL8180_MODULE_NAME
,
166 .id_table
= rtl8180_pci_id_tbl
,
167 .probe
= rtl8180_pci_probe
,
168 .remove
= __devexit_p(rtl8180_pci_remove
),
169 .suspend
= rtl8180_suspend
,
170 .resume
= rtl8180_resume
,
171 .shutdown
= rtl8180_shutdown
,
174 u8
read_nic_byte(struct net_device
*dev
, int x
)
176 return 0xff&readb((u8
*)dev
->mem_start
+x
);
179 u32
read_nic_dword(struct net_device
*dev
, int x
)
181 return readl((u8
*)dev
->mem_start
+x
);
184 u16
read_nic_word(struct net_device
*dev
, int x
)
186 return readw((u8
*)dev
->mem_start
+x
);
189 void write_nic_byte(struct net_device
*dev
, int x
,u8 y
)
191 writeb(y
,(u8
*)dev
->mem_start
+x
);
195 void write_nic_dword(struct net_device
*dev
, int x
,u32 y
)
197 writel(y
,(u8
*)dev
->mem_start
+x
);
201 void write_nic_word(struct net_device
*dev
, int x
,u16 y
)
203 writew(y
,(u8
*)dev
->mem_start
+x
);
207 inline void force_pci_posting(struct net_device
*dev
)
209 read_nic_byte(dev
,EPROM_CMD
);
213 irqreturn_t
rtl8180_interrupt(int irq
, void *netdev
, struct pt_regs
*regs
);
214 void set_nic_rxring(struct net_device
*dev
);
215 void set_nic_txring(struct net_device
*dev
);
216 static struct net_device_stats
*rtl8180_stats(struct net_device
*dev
);
217 void rtl8180_commit(struct net_device
*dev
);
218 void rtl8180_start_tx_beacon(struct net_device
*dev
);
220 static struct proc_dir_entry
*rtl8180_proc
= NULL
;
222 static int proc_get_registers(char *page
, char **start
,
223 off_t offset
, int count
,
224 int *eof
, void *data
)
226 struct net_device
*dev
= data
;
231 /* This dump the current register page */
232 for (n
= 0; n
<= max
;) {
233 len
+= snprintf(page
+ len
, count
- len
, "\nD: %2x > ", n
);
235 for (i
= 0; i
< 16 && n
<= max
; i
++, n
++)
236 len
+= snprintf(page
+ len
, count
- len
, "%2x ",
237 read_nic_byte(dev
, n
));
239 len
+= snprintf(page
+ len
, count
- len
,"\n");
245 int get_curr_tx_free_desc(struct net_device
*dev
, int priority
);
247 static int proc_get_stats_hw(char *page
, char **start
,
248 off_t offset
, int count
,
249 int *eof
, void *data
)
257 static int proc_get_stats_rx(char *page
, char **start
,
258 off_t offset
, int count
,
259 int *eof
, void *data
)
261 struct net_device
*dev
= data
;
262 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
266 len
+= snprintf(page
+ len
, count
- len
,
269 "RX CRC Error(0-500): %lu\n"
270 "RX CRC Error(500-1000): %lu\n"
271 "RX CRC Error(>1000): %lu\n"
272 "RX ICV Error: %lu\n",
275 priv
->stats
.rxcrcerrmin
,
276 priv
->stats
.rxcrcerrmid
,
277 priv
->stats
.rxcrcerrmax
,
285 static int proc_get_stats_tx(char *page
, char **start
,
286 off_t offset
, int count
,
287 int *eof
, void *data
)
289 struct net_device
*dev
= data
;
290 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
293 unsigned long totalOK
;
295 totalOK
=priv
->stats
.txnpokint
+priv
->stats
.txhpokint
+priv
->stats
.txlpokint
;
296 len
+= snprintf(page
+ len
, count
- len
,
300 "TX beacon OK: %lu\n"
301 "TX beacon error: %lu\n",
303 priv
->stats
.txnperr
+priv
->stats
.txhperr
+priv
->stats
.txlperr
,
305 priv
->stats
.txbeacon
,
306 priv
->stats
.txbeaconerr
313 void rtl8180_proc_module_init(void)
315 DMESG("Initializing proc filesystem");
316 rtl8180_proc
=create_proc_entry(RTL8180_MODULE_NAME
, S_IFDIR
, init_net
.proc_net
);
319 void rtl8180_proc_module_remove(void)
321 remove_proc_entry(RTL8180_MODULE_NAME
, init_net
.proc_net
);
324 void rtl8180_proc_remove_one(struct net_device
*dev
)
326 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
328 remove_proc_entry("stats-hw", priv
->dir_dev
);
329 remove_proc_entry("stats-tx", priv
->dir_dev
);
330 remove_proc_entry("stats-rx", priv
->dir_dev
);
331 remove_proc_entry("registers", priv
->dir_dev
);
332 remove_proc_entry(dev
->name
, rtl8180_proc
);
333 priv
->dir_dev
= NULL
;
337 void rtl8180_proc_init_one(struct net_device
*dev
)
339 struct proc_dir_entry
*e
;
340 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
342 priv
->dir_dev
= rtl8180_proc
;
343 if (!priv
->dir_dev
) {
344 DMESGE("Unable to initialize /proc/net/r8180/%s\n",
349 e
= create_proc_read_entry("stats-hw", S_IFREG
| S_IRUGO
,
350 priv
->dir_dev
, proc_get_stats_hw
, dev
);
352 DMESGE("Unable to initialize "
353 "/proc/net/r8180/%s/stats-hw\n",
357 e
= create_proc_read_entry("stats-rx", S_IFREG
| S_IRUGO
,
358 priv
->dir_dev
, proc_get_stats_rx
, dev
);
360 DMESGE("Unable to initialize "
361 "/proc/net/r8180/%s/stats-rx\n",
366 e
= create_proc_read_entry("stats-tx", S_IFREG
| S_IRUGO
,
367 priv
->dir_dev
, proc_get_stats_tx
, dev
);
369 DMESGE("Unable to initialize "
370 "/proc/net/r8180/%s/stats-tx\n",
374 e
= create_proc_read_entry("registers", S_IFREG
| S_IRUGO
,
375 priv
->dir_dev
, proc_get_registers
, dev
);
377 DMESGE("Unable to initialize "
378 "/proc/net/r8180/%s/registers\n",
384 FIXME: check if we can use some standard already-existent
385 data type+functions in kernel
388 short buffer_add(struct buffer
**buffer
, u32
*buf
, dma_addr_t dma
,
389 struct buffer
**bufferhead
)
395 *buffer
= kmalloc(sizeof(struct buffer
),GFP_KERNEL
);
397 if (*buffer
== NULL
) {
398 DMESGE("Failed to kmalloc head of TX/RX struct");
401 (*buffer
)->next
=*buffer
;
404 if(bufferhead
!=NULL
)
405 (*bufferhead
) = (*buffer
);
410 while(tmp
->next
!=(*buffer
)) tmp
=tmp
->next
;
411 if ((tmp
->next
= kmalloc(sizeof(struct buffer
),GFP_KERNEL
)) == NULL
){
412 DMESGE("Failed to kmalloc TX/RX struct");
417 tmp
->next
->next
=*buffer
;
422 void buffer_free(struct net_device
*dev
,struct buffer
**buffer
,int len
,short
426 struct buffer
*tmp
,*next
;
427 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
428 struct pci_dev
*pdev
=priv
->pdev
;
438 pci_free_consistent(pdev
,len
,
441 pci_unmap_single(pdev
, tmp
->dma
,
442 len
,PCI_DMA_FROMDEVICE
);
448 while(next
!= *buffer
);
453 void print_buffer(u32
*buffer
, int len
)
456 u8
*buf
=(u8
*)buffer
;
458 printk("ASCII BUFFER DUMP (len: %x):\n",len
);
463 printk("\nBINARY BUFFER DUMP (len: %x):\n",len
);
466 printk("%02x",buf
[i
]);
471 int get_curr_tx_free_desc(struct net_device
*dev
, int priority
)
473 struct r8180_priv
*priv
= ieee80211_priv(dev
);
479 case MANAGE_PRIORITY
:
480 head
= priv
->txmapringhead
;
481 tail
= priv
->txmapringtail
;
484 head
= priv
->txbkpringhead
;
485 tail
= priv
->txbkpringtail
;
488 head
= priv
->txbepringhead
;
489 tail
= priv
->txbepringtail
;
492 head
= priv
->txvipringhead
;
493 tail
= priv
->txvipringtail
;
496 head
= priv
->txvopringhead
;
497 tail
= priv
->txvopringtail
;
500 head
= priv
->txhpringhead
;
501 tail
= priv
->txhpringtail
;
508 ret
= priv
->txringcount
- (tail
- head
)/8;
510 ret
= (head
- tail
)/8;
512 if (ret
> priv
->txringcount
)
518 short check_nic_enought_desc(struct net_device
*dev
, int priority
)
520 struct r8180_priv
*priv
= ieee80211_priv(dev
);
521 struct ieee80211_device
*ieee
= netdev_priv(dev
);
522 int requiredbyte
, required
;
524 requiredbyte
= priv
->ieee80211
->fts
+ sizeof(struct ieee80211_header_data
);
526 if (ieee
->current_network
.QoS_Enable
)
529 required
= requiredbyte
/ (priv
->txbuffsize
-4);
531 if (requiredbyte
% priv
->txbuffsize
)
534 /* for now we keep two free descriptor as a safety boundary
535 * between the tail and the head
538 return (required
+2 < get_curr_tx_free_desc(dev
,priority
));
541 void fix_tx_fifo(struct net_device
*dev
)
543 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
547 for (tmp
=priv
->txmapring
, i
=0;
548 i
< priv
->txringcount
;
550 *tmp
= *tmp
&~ (1<<31);
553 for (tmp
=priv
->txbkpring
, i
=0;
554 i
< priv
->txringcount
;
556 *tmp
= *tmp
&~ (1<<31);
559 for (tmp
=priv
->txbepring
, i
=0;
560 i
< priv
->txringcount
;
562 *tmp
= *tmp
&~ (1<<31);
564 for (tmp
=priv
->txvipring
, i
=0;
565 i
< priv
->txringcount
;
567 *tmp
= *tmp
&~ (1<<31);
570 for (tmp
=priv
->txvopring
, i
=0;
571 i
< priv
->txringcount
;
573 *tmp
= *tmp
&~ (1<<31);
576 for (tmp
=priv
->txhpring
, i
=0;
577 i
< priv
->txringcount
;
579 *tmp
= *tmp
&~ (1<<31);
582 for (tmp
=priv
->txbeaconring
, i
=0;
583 i
< priv
->txbeaconcount
;
585 *tmp
= *tmp
&~ (1<<31);
588 priv
->txmapringtail
= priv
->txmapring
;
589 priv
->txmapringhead
= priv
->txmapring
;
590 priv
->txmapbufstail
= priv
->txmapbufs
;
592 priv
->txbkpringtail
= priv
->txbkpring
;
593 priv
->txbkpringhead
= priv
->txbkpring
;
594 priv
->txbkpbufstail
= priv
->txbkpbufs
;
596 priv
->txbepringtail
= priv
->txbepring
;
597 priv
->txbepringhead
= priv
->txbepring
;
598 priv
->txbepbufstail
= priv
->txbepbufs
;
600 priv
->txvipringtail
= priv
->txvipring
;
601 priv
->txvipringhead
= priv
->txvipring
;
602 priv
->txvipbufstail
= priv
->txvipbufs
;
604 priv
->txvopringtail
= priv
->txvopring
;
605 priv
->txvopringhead
= priv
->txvopring
;
606 priv
->txvopbufstail
= priv
->txvopbufs
;
608 priv
->txhpringtail
= priv
->txhpring
;
609 priv
->txhpringhead
= priv
->txhpring
;
610 priv
->txhpbufstail
= priv
->txhpbufs
;
612 priv
->txbeaconringtail
= priv
->txbeaconring
;
613 priv
->txbeaconbufstail
= priv
->txbeaconbufs
;
616 ieee80211_reset_queue(priv
->ieee80211
);
617 priv
->ack_tx_to_ieee
= 0;
620 void fix_rx_fifo(struct net_device
*dev
)
622 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
624 struct buffer
*rxbuf
;
627 rx_desc_size
= 8; // 4*8 = 32 bytes
629 for (tmp
=priv
->rxring
, rxbuf
=priv
->rxbufferhead
;
630 (tmp
< (priv
->rxring
)+(priv
->rxringcount
)*rx_desc_size
);
631 tmp
+=rx_desc_size
,rxbuf
=rxbuf
->next
){
632 *(tmp
+2) = rxbuf
->dma
;
634 *tmp
=*tmp
| priv
->rxbuffersize
;
638 priv
->rxringtail
=priv
->rxring
;
639 priv
->rxbuffer
=priv
->rxbufferhead
;
640 priv
->rx_skb_complete
=1;
644 unsigned char QUALITY_MAP
[] = {
645 0x64, 0x64, 0x64, 0x63, 0x63, 0x62, 0x62, 0x61,
646 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 0x5d, 0x5c,
647 0x5b, 0x5a, 0x59, 0x57, 0x56, 0x54, 0x52, 0x4f,
648 0x4c, 0x49, 0x45, 0x41, 0x3c, 0x37, 0x31, 0x29,
649 0x24, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
650 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x20,
651 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e,
652 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x19, 0x19,
653 0x18, 0x17, 0x16, 0x15, 0x14, 0x12, 0x11, 0x0f,
654 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x01, 0x00
657 unsigned char STRENGTH_MAP
[] = {
658 0x64, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e,
659 0x5d, 0x5c, 0x5b, 0x5a, 0x57, 0x54, 0x52, 0x50,
660 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x41, 0x3f,
661 0x3c, 0x3a, 0x37, 0x36, 0x36, 0x1c, 0x1c, 0x1b,
662 0x1b, 0x1a, 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17,
663 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13,
664 0x13, 0x12, 0x12, 0x11, 0x11, 0x10, 0x10, 0x0f,
665 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b,
666 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07,
667 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00
670 void rtl8180_RSSI_calc(struct net_device
*dev
, u8
*rssi
, u8
*qual
)
672 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
683 _rssi
= 0; // avoid gcc complains..
686 temp
= QUALITY_MAP
[q
];
698 switch(priv
->rf_chip
){
702 if ( !lsb
|| !(temp2
<= 0x3c) ) {
705 temp2
= 100 * temp2
/ 0x3c;
707 *rssi
= temp2
& 0xff;
708 _rssi
= temp2
& 0xff;
710 case RFCHIPID_INTERSIL
:
721 if ( temp2
<= 0x3e0000 ) {
722 if ( temp2
< 0xffef0000 )
736 temp3
= temp3
/ 0x6d;
738 _rssi
= temp3
& 0xff;
739 *rssi
= temp3
& 0xff;
744 if ( ! lsb
|| !(temp2
<= 0x3c) ){
747 temp2
= (100 * temp2
) / 0x3c;
749 *rssi
= temp2
& 0xff;
750 _rssi
= temp2
& 0xff;
752 case RFCHIPID_PHILIPS
:
753 if( orig_qual
<= 0x4e ){
754 _rssi
= STRENGTH_MAP
[orig_qual
];
775 *rssi
= temp2
& 0xff;
776 _rssi
= temp2
& 0xff;
791 void rtl8180_irq_enable(struct net_device
*dev
)
793 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
795 priv
->irq_enabled
= 1;
796 write_nic_word(dev
,INTA_MASK
, priv
->irq_mask
);
799 void rtl8180_irq_disable(struct net_device
*dev
)
801 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
803 write_nic_dword(dev
,IMR
,0);
804 force_pci_posting(dev
);
805 priv
->irq_enabled
= 0;
808 void rtl8180_set_mode(struct net_device
*dev
,int mode
)
812 ecmd
=read_nic_byte(dev
, EPROM_CMD
);
813 ecmd
=ecmd
&~ EPROM_CMD_OPERATING_MODE_MASK
;
814 ecmd
=ecmd
| (mode
<<EPROM_CMD_OPERATING_MODE_SHIFT
);
815 ecmd
=ecmd
&~ (1<<EPROM_CS_SHIFT
);
816 ecmd
=ecmd
&~ (1<<EPROM_CK_SHIFT
);
817 write_nic_byte(dev
, EPROM_CMD
, ecmd
);
820 void rtl8180_adapter_start(struct net_device
*dev
);
821 void rtl8180_beacon_tx_enable(struct net_device
*dev
);
823 void rtl8180_update_msr(struct net_device
*dev
)
825 struct r8180_priv
*priv
= ieee80211_priv(dev
);
829 msr
= read_nic_byte(dev
, MSR
);
830 msr
&= ~ MSR_LINK_MASK
;
832 rxconf
=read_nic_dword(dev
,RX_CONF
);
834 if(priv
->ieee80211
->state
== IEEE80211_LINKED
)
836 if(priv
->ieee80211
->iw_mode
== IW_MODE_ADHOC
)
837 msr
|= (MSR_LINK_ADHOC
<<MSR_LINK_SHIFT
);
838 else if (priv
->ieee80211
->iw_mode
== IW_MODE_MASTER
)
839 msr
|= (MSR_LINK_MASTER
<<MSR_LINK_SHIFT
);
840 else if (priv
->ieee80211
->iw_mode
== IW_MODE_INFRA
)
841 msr
|= (MSR_LINK_MANAGED
<<MSR_LINK_SHIFT
);
843 msr
|= (MSR_LINK_NONE
<<MSR_LINK_SHIFT
);
844 rxconf
|= (1<<RX_CHECK_BSSID_SHIFT
);
847 msr
|= (MSR_LINK_NONE
<<MSR_LINK_SHIFT
);
848 rxconf
&= ~(1<<RX_CHECK_BSSID_SHIFT
);
851 write_nic_byte(dev
, MSR
, msr
);
852 write_nic_dword(dev
, RX_CONF
, rxconf
);
855 void rtl8180_set_chan(struct net_device
*dev
,short ch
)
857 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
859 if ((ch
> 14) || (ch
< 1)) {
860 printk("In %s: Invalid chnanel %d\n", __func__
, ch
);
865 priv
->rf_set_chan(dev
,priv
->chan
);
868 void rtl8180_rx_enable(struct net_device
*dev
)
872 /* for now we accept data, management & ctl frame*/
873 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
875 rxconf
=read_nic_dword(dev
,RX_CONF
);
876 rxconf
= rxconf
&~ MAC_FILTER_MASK
;
877 rxconf
= rxconf
| (1<<ACCEPT_MNG_FRAME_SHIFT
);
878 rxconf
= rxconf
| (1<<ACCEPT_DATA_FRAME_SHIFT
);
879 rxconf
= rxconf
| (1<<ACCEPT_BCAST_FRAME_SHIFT
);
880 rxconf
= rxconf
| (1<<ACCEPT_MCAST_FRAME_SHIFT
);
881 if (dev
->flags
& IFF_PROMISC
)
882 DMESG("NIC in promisc mode");
884 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
|| \
885 dev
->flags
& IFF_PROMISC
){
886 rxconf
= rxconf
| (1<<ACCEPT_ALLMAC_FRAME_SHIFT
);
888 rxconf
= rxconf
| (1<<ACCEPT_NICMAC_FRAME_SHIFT
);
889 if(priv
->card_8185
== 0)
890 rxconf
= rxconf
| (1<<RX_CHECK_BSSID_SHIFT
);
893 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
){
894 rxconf
= rxconf
| (1<<ACCEPT_CTL_FRAME_SHIFT
);
895 rxconf
= rxconf
| (1<<ACCEPT_ICVERR_FRAME_SHIFT
);
896 rxconf
= rxconf
| (1<<ACCEPT_PWR_FRAME_SHIFT
);
899 if( priv
->crcmon
== 1 && priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
)
900 rxconf
= rxconf
| (1<<ACCEPT_CRCERR_FRAME_SHIFT
);
902 rxconf
= rxconf
& ~RX_FIFO_THRESHOLD_MASK
;
903 rxconf
= rxconf
| (RX_FIFO_THRESHOLD_NONE
<< RX_FIFO_THRESHOLD_SHIFT
);
905 rxconf
= rxconf
| (1<<RX_AUTORESETPHY_SHIFT
);
906 rxconf
= rxconf
&~ MAX_RX_DMA_MASK
;
907 rxconf
= rxconf
| (MAX_RX_DMA_2048
<<MAX_RX_DMA_SHIFT
);
909 rxconf
= rxconf
| RCR_ONLYERLPKT
;
911 rxconf
= rxconf
&~ RCR_CS_MASK
;
913 if (!priv
->card_8185
)
914 rxconf
|= (priv
->rcr_csense
<<RCR_CS_SHIFT
);
916 write_nic_dword(dev
, RX_CONF
, rxconf
);
920 cmd
=read_nic_byte(dev
,CMD
);
921 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_RX_ENABLE_SHIFT
));
924 void set_nic_txring(struct net_device
*dev
)
926 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
928 write_nic_dword(dev
, TX_MANAGEPRIORITY_RING_ADDR
, priv
->txmapringdma
);
929 write_nic_dword(dev
, TX_BKPRIORITY_RING_ADDR
, priv
->txbkpringdma
);
930 write_nic_dword(dev
, TX_BEPRIORITY_RING_ADDR
, priv
->txbepringdma
);
931 write_nic_dword(dev
, TX_VIPRIORITY_RING_ADDR
, priv
->txvipringdma
);
932 write_nic_dword(dev
, TX_VOPRIORITY_RING_ADDR
, priv
->txvopringdma
);
933 write_nic_dword(dev
, TX_HIGHPRIORITY_RING_ADDR
, priv
->txhpringdma
);
934 write_nic_dword(dev
, TX_BEACON_RING_ADDR
, priv
->txbeaconringdma
);
937 void rtl8180_conttx_enable(struct net_device
*dev
)
941 txconf
= read_nic_dword(dev
,TX_CONF
);
942 txconf
= txconf
&~ TX_LOOPBACK_MASK
;
943 txconf
= txconf
| (TX_LOOPBACK_CONTINUE
<<TX_LOOPBACK_SHIFT
);
944 write_nic_dword(dev
,TX_CONF
,txconf
);
947 void rtl8180_conttx_disable(struct net_device
*dev
)
951 txconf
= read_nic_dword(dev
,TX_CONF
);
952 txconf
= txconf
&~ TX_LOOPBACK_MASK
;
953 txconf
= txconf
| (TX_LOOPBACK_NONE
<<TX_LOOPBACK_SHIFT
);
954 write_nic_dword(dev
,TX_CONF
,txconf
);
957 void rtl8180_tx_enable(struct net_device
*dev
)
963 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
965 txconf
= read_nic_dword(dev
, TX_CONF
);
967 if (priv
->card_8185
) {
968 byte
= read_nic_byte(dev
,CW_CONF
);
969 byte
&= ~(1<<CW_CONF_PERPACKET_CW_SHIFT
);
970 byte
&= ~(1<<CW_CONF_PERPACKET_RETRY_SHIFT
);
971 write_nic_byte(dev
, CW_CONF
, byte
);
973 tx_agc_ctl
= read_nic_byte(dev
, TX_AGC_CTL
);
974 tx_agc_ctl
&= ~(1<<TX_AGC_CTL_PERPACKET_GAIN_SHIFT
);
975 tx_agc_ctl
&= ~(1<<TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT
);
976 tx_agc_ctl
|=(1<<TX_AGC_CTL_FEEDBACK_ANT
);
977 write_nic_byte(dev
, TX_AGC_CTL
, tx_agc_ctl
);
978 write_nic_byte(dev
, 0xec, 0x3f); /* Disable early TX */
982 txconf
= txconf
&~ (1<<TCR_PROBE_NOTIMESTAMP_SHIFT
);
985 txconf
= txconf
&~ (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT
);
987 txconf
= txconf
| (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT
);
990 txconf
= txconf
&~ TX_LOOPBACK_MASK
;
991 txconf
= txconf
| (TX_LOOPBACK_NONE
<<TX_LOOPBACK_SHIFT
);
992 txconf
= txconf
&~ TCR_DPRETRY_MASK
;
993 txconf
= txconf
&~ TCR_RTSRETRY_MASK
;
994 txconf
= txconf
| (priv
->retry_data
<<TX_DPRETRY_SHIFT
);
995 txconf
= txconf
| (priv
->retry_rts
<<TX_RTSRETRY_SHIFT
);
996 txconf
= txconf
&~ (1<<TX_NOCRC_SHIFT
);
998 if (priv
->card_8185
) {
999 if (priv
->hw_plcp_len
)
1000 txconf
= txconf
&~ TCR_PLCP_LEN
;
1002 txconf
= txconf
| TCR_PLCP_LEN
;
1004 txconf
= txconf
&~ TCR_SAT
;
1006 txconf
= txconf
&~ TCR_MXDMA_MASK
;
1007 txconf
= txconf
| (TCR_MXDMA_2048
<<TCR_MXDMA_SHIFT
);
1008 txconf
= txconf
| TCR_CWMIN
;
1009 txconf
= txconf
| TCR_DISCW
;
1011 txconf
= txconf
| (1 << TX_NOICV_SHIFT
);
1013 write_nic_dword(dev
,TX_CONF
,txconf
);
1017 cmd
=read_nic_byte(dev
,CMD
);
1018 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_TX_ENABLE_SHIFT
));
1020 write_nic_dword(dev
,TX_CONF
,txconf
);
1023 void rtl8180_beacon_tx_enable(struct net_device
*dev
)
1025 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1027 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
1028 priv
->dma_poll_stop_mask
&= ~(TPPOLLSTOP_BQ
);
1029 write_nic_byte(dev
,TPPollStop
, priv
->dma_poll_mask
);
1030 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
1033 void rtl8180_beacon_tx_disable(struct net_device
*dev
)
1035 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1037 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
1038 priv
->dma_poll_stop_mask
|= TPPOLLSTOP_BQ
;
1039 write_nic_byte(dev
,TPPollStop
, priv
->dma_poll_stop_mask
);
1040 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
1044 void rtl8180_rtx_disable(struct net_device
*dev
)
1047 struct r8180_priv
*priv
= ieee80211_priv(dev
);
1049 cmd
=read_nic_byte(dev
,CMD
);
1050 write_nic_byte(dev
, CMD
, cmd
&~ \
1051 ((1<<CMD_RX_ENABLE_SHIFT
)|(1<<CMD_TX_ENABLE_SHIFT
)));
1052 force_pci_posting(dev
);
1055 if(!priv
->rx_skb_complete
)
1056 dev_kfree_skb_any(priv
->rx_skb
);
1059 short alloc_tx_desc_ring(struct net_device
*dev
, int bufsize
, int count
,
1065 dma_addr_t dma_desc
, dma_tmp
;
1066 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1067 struct pci_dev
*pdev
= priv
->pdev
;
1070 if((bufsize
& 0xfff) != bufsize
) {
1071 DMESGE ("TX buffer allocation too large");
1074 desc
= (u32
*)pci_alloc_consistent(pdev
,
1075 sizeof(u32
)*8*count
+256, &dma_desc
);
1079 if (dma_desc
& 0xff)
1081 * descriptor's buffer must be 256 byte aligned
1082 * we shouldn't be here, since we set DMA mask !
1084 WARN(1, "DMA buffer is not aligned\n");
1088 for (i
= 0; i
< count
; i
++) {
1089 buf
= (void *)pci_alloc_consistent(pdev
, bufsize
, &dma_tmp
);
1094 case TX_MANAGEPRIORITY_RING_ADDR
:
1095 if(-1 == buffer_add(&(priv
->txmapbufs
),buf
,dma_tmp
,NULL
)){
1096 DMESGE("Unable to allocate mem for buffer NP");
1100 case TX_BKPRIORITY_RING_ADDR
:
1101 if(-1 == buffer_add(&(priv
->txbkpbufs
),buf
,dma_tmp
,NULL
)){
1102 DMESGE("Unable to allocate mem for buffer LP");
1106 case TX_BEPRIORITY_RING_ADDR
:
1107 if(-1 == buffer_add(&(priv
->txbepbufs
),buf
,dma_tmp
,NULL
)){
1108 DMESGE("Unable to allocate mem for buffer NP");
1112 case TX_VIPRIORITY_RING_ADDR
:
1113 if(-1 == buffer_add(&(priv
->txvipbufs
),buf
,dma_tmp
,NULL
)){
1114 DMESGE("Unable to allocate mem for buffer LP");
1118 case TX_VOPRIORITY_RING_ADDR
:
1119 if(-1 == buffer_add(&(priv
->txvopbufs
),buf
,dma_tmp
,NULL
)){
1120 DMESGE("Unable to allocate mem for buffer NP");
1124 case TX_HIGHPRIORITY_RING_ADDR
:
1125 if(-1 == buffer_add(&(priv
->txhpbufs
),buf
,dma_tmp
,NULL
)){
1126 DMESGE("Unable to allocate mem for buffer HP");
1130 case TX_BEACON_RING_ADDR
:
1131 if(-1 == buffer_add(&(priv
->txbeaconbufs
),buf
,dma_tmp
,NULL
)){
1132 DMESGE("Unable to allocate mem for buffer BP");
1137 *tmp
= *tmp
&~ (1<<31); // descriptor empty, owned by the drv
1138 *(tmp
+2) = (u32
)dma_tmp
;
1142 *(tmp
+4) = (u32
)dma_desc
+((i
+1)*8*4);
1144 *(tmp
+4) = (u32
)dma_desc
;
1150 case TX_MANAGEPRIORITY_RING_ADDR
:
1151 priv
->txmapringdma
=dma_desc
;
1152 priv
->txmapring
=desc
;
1154 case TX_BKPRIORITY_RING_ADDR
:
1155 priv
->txbkpringdma
=dma_desc
;
1156 priv
->txbkpring
=desc
;
1158 case TX_BEPRIORITY_RING_ADDR
:
1159 priv
->txbepringdma
=dma_desc
;
1160 priv
->txbepring
=desc
;
1162 case TX_VIPRIORITY_RING_ADDR
:
1163 priv
->txvipringdma
=dma_desc
;
1164 priv
->txvipring
=desc
;
1166 case TX_VOPRIORITY_RING_ADDR
:
1167 priv
->txvopringdma
=dma_desc
;
1168 priv
->txvopring
=desc
;
1170 case TX_HIGHPRIORITY_RING_ADDR
:
1171 priv
->txhpringdma
=dma_desc
;
1172 priv
->txhpring
=desc
;
1174 case TX_BEACON_RING_ADDR
:
1175 priv
->txbeaconringdma
=dma_desc
;
1176 priv
->txbeaconring
=desc
;
1184 void free_tx_desc_rings(struct net_device
*dev
)
1186 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1187 struct pci_dev
*pdev
=priv
->pdev
;
1188 int count
= priv
->txringcount
;
1190 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1191 priv
->txmapring
, priv
->txmapringdma
);
1192 buffer_free(dev
,&(priv
->txmapbufs
),priv
->txbuffsize
,1);
1194 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1195 priv
->txbkpring
, priv
->txbkpringdma
);
1196 buffer_free(dev
,&(priv
->txbkpbufs
),priv
->txbuffsize
,1);
1198 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1199 priv
->txbepring
, priv
->txbepringdma
);
1200 buffer_free(dev
,&(priv
->txbepbufs
),priv
->txbuffsize
,1);
1202 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1203 priv
->txvipring
, priv
->txvipringdma
);
1204 buffer_free(dev
,&(priv
->txvipbufs
),priv
->txbuffsize
,1);
1206 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1207 priv
->txvopring
, priv
->txvopringdma
);
1208 buffer_free(dev
,&(priv
->txvopbufs
),priv
->txbuffsize
,1);
1210 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1211 priv
->txhpring
, priv
->txhpringdma
);
1212 buffer_free(dev
,&(priv
->txhpbufs
),priv
->txbuffsize
,1);
1214 count
= priv
->txbeaconcount
;
1215 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1216 priv
->txbeaconring
, priv
->txbeaconringdma
);
1217 buffer_free(dev
,&(priv
->txbeaconbufs
),priv
->txbuffsize
,1);
1220 void free_rx_desc_ring(struct net_device
*dev
)
1222 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1223 struct pci_dev
*pdev
= priv
->pdev
;
1224 int count
= priv
->rxringcount
;
1226 pci_free_consistent(pdev
, sizeof(u32
)*8*count
+256,
1227 priv
->rxring
, priv
->rxringdma
);
1229 buffer_free(dev
,&(priv
->rxbuffer
),priv
->rxbuffersize
,0);
1232 short alloc_rx_desc_ring(struct net_device
*dev
, u16 bufsize
, int count
)
1237 dma_addr_t dma_desc
,dma_tmp
;
1238 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1239 struct pci_dev
*pdev
=priv
->pdev
;
1243 rx_desc_size
= 8; // 4*8 = 32 bytes
1245 if((bufsize
& 0xfff) != bufsize
){
1246 DMESGE ("RX buffer allocation too large");
1250 desc
= (u32
*)pci_alloc_consistent(pdev
,sizeof(u32
)*rx_desc_size
*count
+256,
1253 if (dma_desc
& 0xff)
1255 * descriptor's buffer must be 256 byte aligned
1256 * should never happen since we specify the DMA mask
1258 WARN(1, "DMA buffer is not aligned\n");
1261 priv
->rxringdma
=dma_desc
;
1264 for (i
= 0; i
< count
; i
++) {
1265 if ((buf
= kmalloc(bufsize
* sizeof(u8
),GFP_ATOMIC
)) == NULL
){
1266 DMESGE("Failed to kmalloc RX buffer");
1270 dma_tmp
= pci_map_single(pdev
,buf
,bufsize
* sizeof(u8
),
1271 PCI_DMA_FROMDEVICE
);
1273 if(-1 == buffer_add(&(priv
->rxbuffer
), buf
,dma_tmp
,
1274 &(priv
->rxbufferhead
))){
1275 DMESGE("Unable to allocate mem RX buf");
1278 *tmp
= 0; //zero pads the header of the descriptor
1279 *tmp
= *tmp
|( bufsize
&0xfff);
1280 *(tmp
+2) = (u32
)dma_tmp
;
1281 *tmp
= *tmp
|(1<<31); // descriptor void, owned by the NIC
1283 tmp
=tmp
+rx_desc_size
;
1286 *(tmp
-rx_desc_size
) = *(tmp
-rx_desc_size
) | (1<<30); // this is the last descriptor
1292 void set_nic_rxring(struct net_device
*dev
)
1295 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1297 pgreg
=read_nic_byte(dev
, PGSELECT
);
1298 write_nic_byte(dev
, PGSELECT
, pgreg
&~ (1<<PGSELECT_PG_SHIFT
));
1300 write_nic_dword(dev
, RXRING_ADDR
,priv
->rxringdma
);
1303 void rtl8180_reset(struct net_device
*dev
)
1307 rtl8180_irq_disable(dev
);
1309 cr
=read_nic_byte(dev
,CMD
);
1311 cr
= cr
| (1<<CMD_RST_SHIFT
);
1312 write_nic_byte(dev
,CMD
,cr
);
1314 force_pci_posting(dev
);
1318 if(read_nic_byte(dev
,CMD
) & (1<<CMD_RST_SHIFT
))
1319 DMESGW("Card reset timeout!");
1321 DMESG("Card successfully reset");
1323 rtl8180_set_mode(dev
,EPROM_CMD_LOAD
);
1324 force_pci_posting(dev
);
1328 inline u16
ieeerate2rtlrate(int rate
)
1360 static u16 rtl_rate
[] = {10,20,55,110,60,90,120,180,240,360,480,540,720};
1362 inline u16
rtl8180_rate2rate(short rate
)
1366 return rtl_rate
[rate
];
1369 inline u8
rtl8180_IsWirelessBMode(u16 rate
)
1371 if( ((rate
<= 110) && (rate
!= 60) && (rate
!= 90)) || (rate
== 220) )
1377 u16
N_DBPSOfRate(u16 DataRate
);
1379 u16
ComputeTxTime(u16 FrameLength
, u16 DataRate
, u8 bManagementFrame
,
1386 if (rtl8180_IsWirelessBMode(DataRate
)) {
1387 if (bManagementFrame
|| !bShortPreamble
|| DataRate
== 10)
1389 FrameTime
= (u16
)(144+48+(FrameLength
*8/(DataRate
/10)));
1391 /* short preamble */
1392 FrameTime
= (u16
)(72+24+(FrameLength
*8/(DataRate
/10)));
1394 if ((FrameLength
*8 % (DataRate
/10)) != 0) /* get the ceilling */
1396 } else { /* 802.11g DSSS-OFDM PLCP length field calculation. */
1397 N_DBPS
= N_DBPSOfRate(DataRate
);
1398 Ceiling
= (16 + 8*FrameLength
+ 6) / N_DBPS
1399 + (((16 + 8*FrameLength
+ 6) % N_DBPS
) ? 1 : 0);
1400 FrameTime
= (u16
)(16 + 4 + 4*Ceiling
+ 6);
1405 u16
N_DBPSOfRate(u16 DataRate
)
1444 // For Netgear case, they want good-looking singal strength.
1445 // 2004.12.05, by rcnjko.
1447 long NetgearSignalStrengthTranslate(long LastSS
, long CurrSS
)
1451 // Step 1. Scale mapping.
1452 if (CurrSS
>= 71 && CurrSS
<= 100)
1453 RetSS
= 90 + ((CurrSS
- 70) / 3);
1454 else if (CurrSS
>= 41 && CurrSS
<= 70)
1455 RetSS
= 78 + ((CurrSS
- 40) / 3);
1456 else if (CurrSS
>= 31 && CurrSS
<= 40)
1457 RetSS
= 66 + (CurrSS
- 30);
1458 else if (CurrSS
>= 21 && CurrSS
<= 30)
1459 RetSS
= 54 + (CurrSS
- 20);
1460 else if (CurrSS
>= 5 && CurrSS
<= 20)
1461 RetSS
= 42 + (((CurrSS
- 5) * 2) / 3);
1462 else if (CurrSS
== 4)
1464 else if (CurrSS
== 3)
1466 else if (CurrSS
== 2)
1468 else if (CurrSS
== 1)
1473 // Step 2. Smoothing.
1475 RetSS
= ((LastSS
* 5) + (RetSS
)+ 5) / 6;
1482 // Translate 0-100 signal strength index into dBm.
1484 long TranslateToDbm8185(u8 SignalStrengthIndex
)
1488 // Translate to dBm (x=0.5y-95).
1489 SignalPower
= (long)((SignalStrengthIndex
+ 1) >> 1);
1497 // Perform signal smoothing for dynamic mechanism.
1498 // This is different with PerformSignalSmoothing8185 in smoothing fomula.
1499 // No dramatic adjustion is apply because dynamic mechanism need some degree
1500 // of correctness. Ported from 8187B.
1501 // 2007-02-26, by Bruce.
1503 void PerformUndecoratedSignalSmoothing8185(struct r8180_priv
*priv
,
1506 // Determin the current packet is CCK rate.
1507 priv
->bCurCCKPkt
= bCckRate
;
1509 if (priv
->UndecoratedSmoothedSS
>= 0)
1510 priv
->UndecoratedSmoothedSS
= ( (priv
->UndecoratedSmoothedSS
* 5) + (priv
->SignalStrength
* 10) ) / 6;
1512 priv
->UndecoratedSmoothedSS
= priv
->SignalStrength
* 10;
1514 priv
->UndercorateSmoothedRxPower
= ( (priv
->UndercorateSmoothedRxPower
* 50) + (priv
->RxPower
* 11)) / 60;
1517 priv
->CurCCKRSSI
= priv
->RSSI
;
1519 priv
->CurCCKRSSI
= 0;
1524 /* This is rough RX isr handling routine*/
1525 void rtl8180_rx(struct net_device
*dev
)
1527 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1528 struct sk_buff
*tmp_skb
;
1532 unsigned char quality
, signal
;
1541 u8 LNA_gain
[4]={02, 17, 29, 39};
1543 struct ieee80211_hdr_4addr
*hdr
;
1545 u8 bHwError
= 0,bCRC
= 0,bICV
= 0;
1546 bool bCckRate
= false;
1548 long SignalStrengthIndex
= 0;
1549 struct ieee80211_rx_stats stats
= {
1553 .freq
= IEEE80211_24GHZ_BAND
,
1556 stats
.nic_type
= NIC_8185B
;
1559 if ((*(priv
->rxringtail
)) & (1<<31)) {
1560 /* we have got an RX int, but the descriptor
1561 * we are pointing is empty*/
1563 priv
->stats
.rxnodata
++;
1564 priv
->ieee80211
->stats
.rx_errors
++;
1567 tmp
= priv
->rxringtail
;
1569 if(tmp
== priv
->rxring
)
1570 tmp
= priv
->rxring
+ (priv
->rxringcount
- 1)*rx_desc_size
;
1572 tmp
-= rx_desc_size
;
1574 if(! (*tmp
& (1<<31)))
1576 }while(tmp
!= priv
->rxring
);
1578 if(tmp2
) priv
->rxringtail
= tmp2
;
1581 /* while there are filled descriptors */
1582 while(!(*(priv
->rxringtail
) & (1<<31))){
1583 if(*(priv
->rxringtail
) & (1<<26))
1584 DMESGW("RX buffer overflow");
1585 if(*(priv
->rxringtail
) & (1<<12))
1586 priv
->stats
.rxicverr
++;
1588 if(*(priv
->rxringtail
) & (1<<27)){
1589 priv
->stats
.rxdmafail
++;
1590 //DMESG("EE: RX DMA FAILED at buffer pointed by descriptor %x",(u32)priv->rxringtail);
1594 pci_dma_sync_single_for_cpu(priv
->pdev
,
1595 priv
->rxbuffer
->dma
,
1596 priv
->rxbuffersize
* \
1598 PCI_DMA_FROMDEVICE
);
1600 first
= *(priv
->rxringtail
) & (1<<29) ? 1:0;
1601 if(first
) priv
->rx_prevlen
=0;
1603 last
= *(priv
->rxringtail
) & (1<<28) ? 1:0;
1605 lastlen
=((*priv
->rxringtail
) &0xfff);
1607 /* if the last descriptor (that should
1608 * tell us the total packet len) tell
1609 * us something less than the descriptors
1610 * len we had until now, then there is some
1612 * workaround to prevent kernel panic
1614 if(lastlen
< priv
->rx_prevlen
)
1617 len
=lastlen
-priv
->rx_prevlen
;
1619 if(*(priv
->rxringtail
) & (1<<13)) {
1620 if ((*(priv
->rxringtail
) & 0xfff) <500)
1621 priv
->stats
.rxcrcerrmin
++;
1622 else if ((*(priv
->rxringtail
) & 0x0fff) >1000)
1623 priv
->stats
.rxcrcerrmax
++;
1625 priv
->stats
.rxcrcerrmid
++;
1630 len
= priv
->rxbuffersize
;
1634 padding
= ((*(priv
->rxringtail
+3))&(0x04000000))>>26;
1636 padding
= ((*(priv
->rxringtail
+3))&(0x04000000))>>26;
1644 priv
->rx_prevlen
+=len
;
1646 if(priv
->rx_prevlen
> MAX_FRAG_THRESHOLD
+ 100){
1647 /* HW is probably passing several buggy frames
1648 * without FD or LD flag set.
1649 * Throw this garbage away to prevent skb
1652 if(!priv
->rx_skb_complete
)
1653 dev_kfree_skb_any(priv
->rx_skb
);
1654 priv
->rx_skb_complete
= 1;
1657 signal
=(unsigned char)(((*(priv
->rxringtail
+3))& (0x00ff0000))>>16);
1658 signal
=(signal
&0xfe)>>1; // Modify by hikaru 6.6
1660 quality
=(unsigned char)((*(priv
->rxringtail
+3)) & (0xff));
1662 stats
.mac_time
[0] = *(priv
->rxringtail
+1);
1663 stats
.mac_time
[1] = *(priv
->rxringtail
+2);
1664 rxpower
=((char)(((*(priv
->rxringtail
+4))& (0x00ff0000))>>16))/2 - 42;
1665 RSSI
= ((u8
)(((*(priv
->rxringtail
+3)) & (0x0000ff00))>> 8)) & (0x7f);
1667 rate
=((*(priv
->rxringtail
)) &
1668 ((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20;
1670 stats
.rate
= rtl8180_rate2rate(rate
);
1671 Antenna
= (((*(priv
->rxringtail
+3))& (0x00008000)) == 0 )? 0:1 ;
1672 //by amy for antenna
1673 if(!rtl8180_IsWirelessBMode(stats
.rate
))
1676 RxAGC_dBm
= rxpower
+1; //bias
1680 RxAGC_dBm
= signal
;//bit 0 discard
1682 LNA
= (u8
) (RxAGC_dBm
& 0x60 ) >> 5 ; //bit 6~ bit 5
1683 BB
= (u8
) (RxAGC_dBm
& 0x1F); // bit 4 ~ bit 0
1685 RxAGC_dBm
= -( LNA_gain
[LNA
] + (BB
*2) ); //Pin_11b=-(LNA_gain+BB_gain) (dBm)
1687 RxAGC_dBm
+=4; //bias
1690 if(RxAGC_dBm
& 0x80) //absolute value
1691 RXAGC
= ~(RxAGC_dBm
)+1;
1692 bCckRate
= rtl8180_IsWirelessBMode(stats
.rate
);
1693 // Translate RXAGC into 1-100.
1694 if(!rtl8180_IsWirelessBMode(stats
.rate
))
1700 RXAGC
=(90-RXAGC
)*100/65;
1708 RXAGC
=(95-RXAGC
)*100/65;
1710 priv
->SignalStrength
= (u8
)RXAGC
;
1711 priv
->RecvSignalPower
= RxAGC_dBm
; // It can use directly by SD3 CMLin
1712 priv
->RxPower
= rxpower
;
1715 // SQ translation formular is provided by SD3 DZ. 2006.06.27, by rcnjko.
1717 quality
= 1;//0; //0 will cause epc to show signal zero , walk aroud now;
1718 else if(quality
< 27)
1721 quality
= 127 - quality
;
1722 priv
->SignalQuality
= quality
;
1723 if(!priv
->card_8185
)
1724 printk("check your card type\n");
1726 stats
.signal
= (u8
)quality
;//priv->wstats.qual.level = priv->SignalStrength;
1727 stats
.signalstrength
= RXAGC
;
1728 if(stats
.signalstrength
> 100)
1729 stats
.signalstrength
= 100;
1730 stats
.signalstrength
= (stats
.signalstrength
* 70)/100 + 30;
1731 // printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength);
1732 stats
.rssi
= priv
->wstats
.qual
.qual
= priv
->SignalQuality
;
1733 stats
.noise
= priv
->wstats
.qual
.noise
= 100 - priv
->wstats
.qual
.qual
;
1735 bHwError
= (((*(priv
->rxringtail
))& (0x00000fff)) == 4080)| (((*(priv
->rxringtail
))& (0x04000000)) != 0 )
1736 | (((*(priv
->rxringtail
))& (0x08000000)) != 0 )| (((~(*(priv
->rxringtail
)))& (0x10000000)) != 0 )| (((~(*(priv
->rxringtail
)))& (0x20000000)) != 0 );
1737 bCRC
= ((*(priv
->rxringtail
)) & (0x00002000)) >> 13;
1738 bICV
= ((*(priv
->rxringtail
)) & (0x00001000)) >> 12;
1739 hdr
= (struct ieee80211_hdr_4addr
*)priv
->rxbuffer
->buf
;
1740 fc
= le16_to_cpu(hdr
->frame_ctl
);
1741 type
= WLAN_FC_GET_TYPE(fc
);
1743 if((IEEE80211_FTYPE_CTL
!= type
) &&
1744 (eqMacAddr(priv
->ieee80211
->current_network
.bssid
, (fc
& IEEE80211_FCTL_TODS
)? hdr
->addr1
: (fc
& IEEE80211_FCTL_FROMDS
)? hdr
->addr2
: hdr
->addr3
))
1745 && (!bHwError
) && (!bCRC
)&& (!bICV
))
1748 // Perform signal smoothing for dynamic mechanism on demand.
1749 // This is different with PerformSignalSmoothing8185 in smoothing fomula.
1750 // No dramatic adjustion is apply because dynamic mechanism need some degree
1751 // of correctness. 2007.01.23, by shien chang.
1752 PerformUndecoratedSignalSmoothing8185(priv
,bCckRate
);
1754 // For good-looking singal strength.
1756 SignalStrengthIndex
= NetgearSignalStrengthTranslate(
1757 priv
->LastSignalStrengthInPercent
,
1758 priv
->SignalStrength
);
1760 priv
->LastSignalStrengthInPercent
= SignalStrengthIndex
;
1761 priv
->Stats_SignalStrength
= TranslateToDbm8185((u8
)SignalStrengthIndex
);
1763 // We need more correct power of received packets and the "SignalStrength" of RxStats is beautified,
1764 // so we record the correct power here.
1766 priv
->Stats_SignalQuality
=(long) (priv
->Stats_SignalQuality
* 5 + (long)priv
->SignalQuality
+ 5) / 6;
1767 priv
->Stats_RecvSignalPower
= (long)(priv
->Stats_RecvSignalPower
* 5 + priv
->RecvSignalPower
-1) / 6;
1769 // Figure out which antenna that received the lasted packet.
1770 priv
->LastRxPktAntenna
= Antenna
? 1 : 0; // 0: aux, 1: main.
1772 SwAntennaDiversityRxOk8185(dev
, priv
->SignalStrength
);
1775 //by amy for antenna
1778 if(!priv
->rx_skb_complete
){
1779 /* seems that HW sometimes fails to reiceve and
1780 doesn't provide the last descriptor */
1781 dev_kfree_skb_any(priv
->rx_skb
);
1782 priv
->stats
.rxnolast
++;
1784 /* support for prism header has been originally added by Christian */
1785 if(priv
->prism_hdr
&& priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
){
1788 priv
->rx_skb
= dev_alloc_skb(len
+2);
1789 if( !priv
->rx_skb
) goto drop
;
1792 priv
->rx_skb_complete
=0;
1793 priv
->rx_skb
->dev
=dev
;
1795 /* if we are here we should have already RXed
1797 * If we get here and the skb is not allocated then
1798 * we have just throw out garbage (skb not allocated)
1799 * and we are still rxing garbage....
1801 if(!priv
->rx_skb_complete
){
1803 tmp_skb
= dev_alloc_skb(priv
->rx_skb
->len
+len
+2);
1805 if(!tmp_skb
) goto drop
;
1809 memcpy(skb_put(tmp_skb
,priv
->rx_skb
->len
),
1813 dev_kfree_skb_any(priv
->rx_skb
);
1815 priv
->rx_skb
=tmp_skb
;
1819 if(!priv
->rx_skb_complete
) {
1821 memcpy(skb_put(priv
->rx_skb
,len
),
1822 (((unsigned char *)priv
->rxbuffer
->buf
) + 2),len
);
1824 memcpy(skb_put(priv
->rx_skb
,len
),
1825 priv
->rxbuffer
->buf
,len
);
1829 if(last
&& !priv
->rx_skb_complete
){
1830 if(priv
->rx_skb
->len
> 4)
1831 skb_trim(priv
->rx_skb
,priv
->rx_skb
->len
-4);
1832 #ifndef RX_DONT_PASS_UL
1833 if(!ieee80211_rtl_rx(priv
->ieee80211
,
1834 priv
->rx_skb
, &stats
)){
1835 #endif // RX_DONT_PASS_UL
1837 dev_kfree_skb_any(priv
->rx_skb
);
1838 #ifndef RX_DONT_PASS_UL
1841 priv
->rx_skb_complete
=1;
1845 pci_dma_sync_single_for_device(priv
->pdev
,
1846 priv
->rxbuffer
->dma
,
1847 priv
->rxbuffersize
* \
1849 PCI_DMA_FROMDEVICE
);
1851 drop
: // this is used when we have not enought mem
1852 /* restore the descriptor */
1853 *(priv
->rxringtail
+2)=priv
->rxbuffer
->dma
;
1854 *(priv
->rxringtail
)=*(priv
->rxringtail
) &~ 0xfff;
1855 *(priv
->rxringtail
)=
1856 *(priv
->rxringtail
) | priv
->rxbuffersize
;
1858 *(priv
->rxringtail
)=
1859 *(priv
->rxringtail
) | (1<<31);
1861 priv
->rxringtail
+=rx_desc_size
;
1862 if(priv
->rxringtail
>=
1863 (priv
->rxring
)+(priv
->rxringcount
)*rx_desc_size
)
1864 priv
->rxringtail
=priv
->rxring
;
1866 priv
->rxbuffer
=(priv
->rxbuffer
->next
);
1871 void rtl8180_dma_kick(struct net_device
*dev
, int priority
)
1873 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1875 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
1876 write_nic_byte(dev
, TX_DMA_POLLING
,
1877 (1 << (priority
+ 1)) | priv
->dma_poll_mask
);
1878 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
1880 force_pci_posting(dev
);
1883 void rtl8180_data_hard_stop(struct net_device
*dev
)
1885 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1887 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
1888 priv
->dma_poll_stop_mask
|= TPPOLLSTOP_AC_VIQ
;
1889 write_nic_byte(dev
,TPPollStop
, priv
->dma_poll_stop_mask
);
1890 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
1893 void rtl8180_data_hard_resume(struct net_device
*dev
)
1895 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1897 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
1898 priv
->dma_poll_stop_mask
&= ~(TPPOLLSTOP_AC_VIQ
);
1899 write_nic_byte(dev
,TPPollStop
, priv
->dma_poll_stop_mask
);
1900 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
1903 /* this function TX data frames when the ieee80211 stack requires this.
1904 * It checks also if we need to stop the ieee tx queue, eventually do it
1906 void rtl8180_hard_data_xmit(struct sk_buff
*skb
,struct net_device
*dev
, int
1909 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1911 struct ieee80211_hdr_3addr
*h
= (struct ieee80211_hdr_3addr
*) skb
->data
;
1912 short morefrag
= (h
->frame_ctl
) & IEEE80211_FCTL_MOREFRAGS
;
1913 unsigned long flags
;
1916 mode
= priv
->ieee80211
->iw_mode
;
1918 rate
= ieeerate2rtlrate(rate
);
1920 * This function doesn't require lock because we make
1921 * sure it's called with the tx_lock already acquired.
1922 * this come from the kernel's hard_xmit callback (trought
1923 * the ieee stack, or from the try_wake_queue (again trought
1926 priority
= AC2Q(skb
->priority
);
1927 spin_lock_irqsave(&priv
->tx_lock
,flags
);
1929 if(priv
->ieee80211
->bHwRadioOff
)
1931 spin_unlock_irqrestore(&priv
->tx_lock
,flags
);
1936 if (!check_nic_enought_desc(dev
, priority
)){
1937 DMESGW("Error: no descriptor left by previous TX (avail %d) ",
1938 get_curr_tx_free_desc(dev
, priority
));
1939 ieee80211_rtl_stop_queue(priv
->ieee80211
);
1941 rtl8180_tx(dev
, skb
->data
, skb
->len
, priority
, morefrag
,0,rate
);
1942 if (!check_nic_enought_desc(dev
, priority
))
1943 ieee80211_rtl_stop_queue(priv
->ieee80211
);
1945 spin_unlock_irqrestore(&priv
->tx_lock
,flags
);
1948 /* This is a rough attempt to TX a frame
1949 * This is called by the ieee 80211 stack to TX management frames.
1950 * If the ring is full packet are dropped (for data frame the queue
1951 * is stopped before this can happen). For this reason it is better
1952 * if the descriptors are larger than the largest management frame
1953 * we intend to TX: i'm unsure what the HW does if it will not found
1954 * the last fragment of a frame because it has been dropped...
1955 * Since queues for Management and Data frames are different we
1956 * might use a different lock than tx_lock (for example mgmt_tx_lock)
1958 /* these function may loops if invoked with 0 descriptors or 0 len buffer*/
1959 int rtl8180_hard_start_xmit(struct sk_buff
*skb
,struct net_device
*dev
)
1961 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1962 unsigned long flags
;
1965 priority
= MANAGE_PRIORITY
;
1967 spin_lock_irqsave(&priv
->tx_lock
,flags
);
1969 if (priv
->ieee80211
->bHwRadioOff
) {
1970 spin_unlock_irqrestore(&priv
->tx_lock
,flags
);
1971 dev_kfree_skb_any(skb
);
1972 return NETDEV_TX_OK
;
1975 rtl8180_tx(dev
, skb
->data
, skb
->len
, priority
,
1976 0, 0,ieeerate2rtlrate(priv
->ieee80211
->basic_rate
));
1978 priv
->ieee80211
->stats
.tx_bytes
+=skb
->len
;
1979 priv
->ieee80211
->stats
.tx_packets
++;
1980 spin_unlock_irqrestore(&priv
->tx_lock
,flags
);
1982 dev_kfree_skb_any(skb
);
1983 return NETDEV_TX_OK
;
1986 // longpre 144+48 shortpre 72+24
1987 u16
rtl8180_len2duration(u32 len
, short rate
,short* ext
)
1996 duration
= ((len
+4)<<4) /0x2;
1997 drift
= ((len
+4)<<4) % 0x2;
1998 if(drift
==0 ) break;
2003 duration
= ((len
+4)<<4) /0x4;
2004 drift
= ((len
+4)<<4) % 0x4;
2005 if(drift
==0 ) break;
2010 duration
= ((len
+4)<<4) /0xb;
2011 drift
= ((len
+4)<<4) % 0xb;
2019 duration
= ((len
+4)<<4) /0x16;
2020 drift
= ((len
+4)<<4) % 0x16;
2033 void rtl8180_prepare_beacon(struct net_device
*dev
)
2035 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2036 struct sk_buff
*skb
;
2038 u16 word
= read_nic_word(dev
, BcnItv
);
2039 word
&= ~BcnItv_BcnItv
; // clear Bcn_Itv
2040 word
|= cpu_to_le16(priv
->ieee80211
->current_network
.beacon_interval
);//0x64;
2041 write_nic_word(dev
, BcnItv
, word
);
2043 skb
= ieee80211_get_beacon(priv
->ieee80211
);
2045 rtl8180_tx(dev
,skb
->data
,skb
->len
,BEACON_PRIORITY
,
2046 0,0,ieeerate2rtlrate(priv
->ieee80211
->basic_rate
));
2047 dev_kfree_skb_any(skb
);
2051 /* This function do the real dirty work: it enqueues a TX command
2052 * descriptor in the ring buffer, copyes the frame in a TX buffer
2053 * and kicks the NIC to ensure it does the DMA transfer.
2055 short rtl8180_tx(struct net_device
*dev
, u8
* txbuf
, int len
, int priority
,
2056 short morefrag
, short descfrag
, int rate
)
2058 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2059 u32
*tail
,*temp_tail
;
2068 struct buffer
* buflist
;
2069 struct ieee80211_hdr_3addr
*frag_hdr
= (struct ieee80211_hdr_3addr
*)txbuf
;
2071 u8 bUseShortPreamble
= 0;
2076 u16 ThisFrameTime
= 0;
2077 u16 TxDescDuration
= 0;
2078 u8 ownbit_flag
= false; //added by david woo for sync Tx, 2007.12.14
2081 case MANAGE_PRIORITY
:
2082 tail
=priv
->txmapringtail
;
2083 begin
=priv
->txmapring
;
2084 buflist
= priv
->txmapbufstail
;
2085 count
= priv
->txringcount
;
2088 tail
=priv
->txbkpringtail
;
2089 begin
=priv
->txbkpring
;
2090 buflist
= priv
->txbkpbufstail
;
2091 count
= priv
->txringcount
;
2094 tail
=priv
->txbepringtail
;
2095 begin
=priv
->txbepring
;
2096 buflist
= priv
->txbepbufstail
;
2097 count
= priv
->txringcount
;
2100 tail
=priv
->txvipringtail
;
2101 begin
=priv
->txvipring
;
2102 buflist
= priv
->txvipbufstail
;
2103 count
= priv
->txringcount
;
2106 tail
=priv
->txvopringtail
;
2107 begin
=priv
->txvopring
;
2108 buflist
= priv
->txvopbufstail
;
2109 count
= priv
->txringcount
;
2112 tail
=priv
->txhpringtail
;
2113 begin
=priv
->txhpring
;
2114 buflist
= priv
->txhpbufstail
;
2115 count
= priv
->txringcount
;
2117 case BEACON_PRIORITY
:
2118 tail
=priv
->txbeaconringtail
;
2119 begin
=priv
->txbeaconring
;
2120 buflist
= priv
->txbeaconbufstail
;
2121 count
= priv
->txbeaconcount
;
2128 memcpy(&dest
, frag_hdr
->addr1
, ETH_ALEN
);
2129 if (is_multicast_ether_addr(dest
) ||
2130 is_broadcast_ether_addr(dest
))
2137 ThisFrameTime
= ComputeTxTime(len
+ sCrcLng
, rtl8180_rate2rate(rate
), 0, bUseShortPreamble
);
2138 TxDescDuration
= ThisFrameTime
;
2139 } else {// Unicast packet
2142 //YJ,add,080828,for Keep alive
2143 priv
->NumTxUnicast
++;
2145 // Figure out ACK rate according to BSS basic rate and Tx rate, 2006.03.08 by rcnjko.
2146 AckTime
= ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send
2148 if ( ((len
+ sCrcLng
) > priv
->rts
) && priv
->rts
)
2150 u16 RtsTime
, CtsTime
;
2155 // Rate and time required for RTS.
2156 RtsTime
= ComputeTxTime( sAckCtsLng
/8,priv
->ieee80211
->basic_rate
, 0, 0);
2157 // Rate and time required for CTS.
2158 CtsTime
= ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send
2160 // Figure out time required to transmit this frame.
2161 ThisFrameTime
= ComputeTxTime(len
+ sCrcLng
,
2162 rtl8180_rate2rate(rate
),
2166 // RTS-CTS-ThisFrame-ACK.
2167 RtsDur
= CtsTime
+ ThisFrameTime
+ AckTime
+ 3*aSifsTime
;
2169 TxDescDuration
= RtsTime
+ RtsDur
;
2171 else {// Normal case.
2176 ThisFrameTime
= ComputeTxTime(len
+ sCrcLng
, rtl8180_rate2rate(rate
), 0, bUseShortPreamble
);
2177 TxDescDuration
= ThisFrameTime
+ aSifsTime
+ AckTime
;
2180 if(!(frag_hdr
->frame_ctl
& IEEE80211_FCTL_MOREFRAGS
)) { //no more fragment
2182 Duration
= aSifsTime
+ AckTime
;
2183 } else { // One or more fragments remained.
2185 NextFragTime
= ComputeTxTime( len
+ sCrcLng
, //pretend following packet length equal current packet
2186 rtl8180_rate2rate(rate
),
2188 bUseShortPreamble
);
2190 //ThisFrag-ACk-NextFrag-ACK.
2191 Duration
= NextFragTime
+ 3*aSifsTime
+ 2*AckTime
;
2194 } // End of Unicast packet
2196 frag_hdr
->duration_id
= Duration
;
2198 buflen
=priv
->txbuffsize
;
2205 DMESGE("TX buffer error, cannot TX frames. pri %d.", priority
);
2210 if ((*tail
& (1 << 31)) && (priority
!= BEACON_PRIORITY
)) {
2211 DMESGW("No more TX desc, returning %x of %x",
2213 priv
->stats
.txrdu
++;
2217 *tail
= 0; // zeroes header
2224 if(priv
->card_8185
){
2225 //FIXME: this should be triggered by HW encryption parameters.
2226 *tail
|= (1<<15); //no encrypt
2229 if(remain
==len
&& !descfrag
) {
2230 ownbit_flag
= false; //added by david woo,2007.12.14
2231 *tail
= *tail
| (1<<29) ; //fist segment of the packet
2232 *tail
= *tail
|(len
);
2237 for(i
=0;i
<buflen
&& remain
>0;i
++,remain
--){
2238 ((u8
*)buf
)[i
]=txbuf
[i
]; //copy data into descriptor pointed DMAble buffer
2239 if(remain
== 4 && i
+4 >= buflen
) break;
2240 /* ensure the last desc has at least 4 bytes payload */
2244 *(tail
+3)=*(tail
+3) &~ 0xfff;
2245 *(tail
+3)=*(tail
+3) | i
; // buffer lenght
2246 // Use short preamble or not
2247 if (priv
->ieee80211
->current_network
.capability
&WLAN_CAPABILITY_SHORT_PREAMBLE
)
2248 if (priv
->plcp_preamble_mode
==1 && rate
!=0) // short mode now, not long!
2249 ;// *tail |= (1<<16); // enable short preamble mode.
2255 if(bRTSEnable
) //rts enable
2257 *tail
|= ((ieeerate2rtlrate(priv
->ieee80211
->basic_rate
))<<19);//RTS RATE
2258 *tail
|= (1<<23);//rts enable
2259 *(tail
+1) |=(RtsDur
&0xffff);//RTS Duration
2261 *(tail
+3) |= ((TxDescDuration
&0xffff)<<16); //DURATION
2262 // *(tail+3) |= (0xe6<<16);
2263 *(tail
+5) |= (11<<8);//(priv->retry_data<<8); //retry lim ;
2265 *tail
= *tail
| ((rate
&0xf) << 24);
2267 /* hw_plcp_len is not used for rtl8180 chip */
2269 if(priv
->card_8185
== 0 || !priv
->hw_plcp_len
){
2270 duration
= rtl8180_len2duration(len
, rate
, &ext
);
2271 *(tail
+1) = *(tail
+1) | ((duration
& 0x7fff)<<16);
2272 if(ext
) *(tail
+1) = *(tail
+1) |(1<<31); //plcp length extension
2275 if(morefrag
) *tail
= (*tail
) | (1<<17); // more fragment
2276 if(!remain
) *tail
= (*tail
) | (1<<28); // last segment of frame
2278 *(tail
+5) = *(tail
+5)|(2<<27);
2279 *(tail
+7) = *(tail
+7)|(1<<4);
2284 *tail
= *tail
| (1<<31); // descriptor ready to be txed
2287 if((tail
- begin
)/8 == count
-1)
2292 buflist
=buflist
->next
;
2297 case MANAGE_PRIORITY
:
2298 priv
->txmapringtail
=tail
;
2299 priv
->txmapbufstail
=buflist
;
2302 priv
->txbkpringtail
=tail
;
2303 priv
->txbkpbufstail
=buflist
;
2306 priv
->txbepringtail
=tail
;
2307 priv
->txbepbufstail
=buflist
;
2310 priv
->txvipringtail
=tail
;
2311 priv
->txvipbufstail
=buflist
;
2314 priv
->txvopringtail
=tail
;
2315 priv
->txvopbufstail
=buflist
;
2318 priv
->txhpringtail
=tail
;
2319 priv
->txhpbufstail
= buflist
;
2321 case BEACON_PRIORITY
:
2322 /* the HW seems to be happy with the 1st
2323 * descriptor filled and the 2nd empty...
2324 * So always update descriptor 1 and never
2330 *temp_tail
= *temp_tail
| (1<<31); // descriptor ready to be txed
2331 rtl8180_dma_kick(dev
,priority
);
2336 void rtl8180_irq_rx_tasklet(struct r8180_priv
* priv
);
2338 void rtl8180_link_change(struct net_device
*dev
)
2340 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2341 u16 beacon_interval
;
2342 struct ieee80211_network
*net
= &priv
->ieee80211
->current_network
;
2344 rtl8180_update_msr(dev
);
2346 rtl8180_set_mode(dev
,EPROM_CMD_CONFIG
);
2348 write_nic_dword(dev
,BSSID
,((u32
*)net
->bssid
)[0]);
2349 write_nic_word(dev
,BSSID
+4,((u16
*)net
->bssid
)[2]);
2351 beacon_interval
= read_nic_dword(dev
,BEACON_INTERVAL
);
2352 beacon_interval
&= ~ BEACON_INTERVAL_MASK
;
2353 beacon_interval
|= net
->beacon_interval
;
2354 write_nic_dword(dev
, BEACON_INTERVAL
, beacon_interval
);
2356 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
2359 rtl8180_set_chan(dev
, priv
->chan
);
2362 void rtl8180_rq_tx_ack(struct net_device
*dev
){
2364 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2366 write_nic_byte(dev
,CONFIG4
,read_nic_byte(dev
,CONFIG4
)|CONFIG4_PWRMGT
);
2367 priv
->ack_tx_to_ieee
= 1;
2370 short rtl8180_is_tx_queue_empty(struct net_device
*dev
){
2372 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2375 for (d
= priv
->txmapring
;
2376 d
< priv
->txmapring
+ priv
->txringcount
;d
+=8)
2377 if(*d
& (1<<31)) return 0;
2379 for (d
= priv
->txbkpring
;
2380 d
< priv
->txbkpring
+ priv
->txringcount
;d
+=8)
2381 if(*d
& (1<<31)) return 0;
2383 for (d
= priv
->txbepring
;
2384 d
< priv
->txbepring
+ priv
->txringcount
;d
+=8)
2385 if(*d
& (1<<31)) return 0;
2387 for (d
= priv
->txvipring
;
2388 d
< priv
->txvipring
+ priv
->txringcount
;d
+=8)
2389 if(*d
& (1<<31)) return 0;
2391 for (d
= priv
->txvopring
;
2392 d
< priv
->txvopring
+ priv
->txringcount
;d
+=8)
2393 if(*d
& (1<<31)) return 0;
2395 for (d
= priv
->txhpring
;
2396 d
< priv
->txhpring
+ priv
->txringcount
;d
+=8)
2397 if(*d
& (1<<31)) return 0;
2400 /* FIXME FIXME 5msecs is random */
2401 #define HW_WAKE_DELAY 5
2403 void rtl8180_hw_wakeup(struct net_device
*dev
)
2405 unsigned long flags
;
2406 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2408 spin_lock_irqsave(&priv
->ps_lock
,flags
);
2409 write_nic_byte(dev
,CONFIG4
,read_nic_byte(dev
,CONFIG4
)&~CONFIG4_PWRMGT
);
2410 if (priv
->rf_wakeup
)
2411 priv
->rf_wakeup(dev
);
2412 spin_unlock_irqrestore(&priv
->ps_lock
,flags
);
2415 void rtl8180_hw_sleep_down(struct net_device
*dev
)
2417 unsigned long flags
;
2418 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2420 spin_lock_irqsave(&priv
->ps_lock
,flags
);
2422 priv
->rf_sleep(dev
);
2423 spin_unlock_irqrestore(&priv
->ps_lock
,flags
);
2426 void rtl8180_hw_sleep(struct net_device
*dev
, u32 th
, u32 tl
)
2428 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2430 unsigned long flags
;
2432 spin_lock_irqsave(&priv
->ps_lock
,flags
);
2434 /* Writing HW register with 0 equals to disable
2435 * the timer, that is not really what we want
2437 tl
-= MSECS(4+16+7);
2439 /* If the interval in witch we are requested to sleep is too
2440 * short then give up and remain awake
2442 if(((tl
>=rb
)&& (tl
-rb
) <= MSECS(MIN_SLEEP_TIME
))
2443 ||((rb
>tl
)&& (rb
-tl
) < MSECS(MIN_SLEEP_TIME
))) {
2444 spin_unlock_irqrestore(&priv
->ps_lock
,flags
);
2445 printk("too short to sleep\n");
2450 u32 tmp
= (tl
>rb
)?(tl
-rb
):(rb
-tl
);
2452 priv
->DozePeriodInPast2Sec
+= jiffies_to_msecs(tmp
);
2454 queue_delayed_work(priv
->ieee80211
->wq
, &priv
->ieee80211
->hw_wakeup_wq
, tmp
); //as tl may be less than rb
2456 /* if we suspect the TimerInt is gone beyond tl
2457 * while setting it, then give up
2460 if(((tl
> rb
) && ((tl
-rb
) > MSECS(MAX_SLEEP_TIME
)))||
2461 ((tl
< rb
) && ((rb
-tl
) > MSECS(MAX_SLEEP_TIME
)))) {
2462 spin_unlock_irqrestore(&priv
->ps_lock
,flags
);
2466 queue_work(priv
->ieee80211
->wq
, (void *)&priv
->ieee80211
->hw_sleep_wq
);
2467 spin_unlock_irqrestore(&priv
->ps_lock
,flags
);
2470 void rtl8180_wmm_param_update(struct work_struct
* work
)
2472 struct ieee80211_device
* ieee
= container_of(work
, struct ieee80211_device
,wmm_param_update_wq
);
2473 struct net_device
*dev
= ieee
->dev
;
2474 u8
*ac_param
= (u8
*)(ieee
->current_network
.wmm_param
);
2475 u8 mode
= ieee
->current_network
.mode
;
2481 if(!ieee
->current_network
.QoS_Enable
){
2482 //legacy ac_xx_param update
2483 AcParam
.longData
= 0;
2484 AcParam
.f
.AciAifsn
.f
.AIFSN
= 2; // Follow 802.11 DIFS.
2485 AcParam
.f
.AciAifsn
.f
.ACM
= 0;
2486 AcParam
.f
.Ecw
.f
.ECWmin
= 3; // Follow 802.11 CWmin.
2487 AcParam
.f
.Ecw
.f
.ECWmax
= 7; // Follow 802.11 CWmax.
2488 AcParam
.f
.TXOPLimit
= 0;
2489 for(eACI
= 0; eACI
< AC_MAX
; eACI
++){
2490 AcParam
.f
.AciAifsn
.f
.ACI
= (u8
)eACI
;
2494 pAcParam
= (PAC_PARAM
)(&AcParam
);
2495 // Retrive paramters to udpate.
2496 u1bAIFS
= pAcParam
->f
.AciAifsn
.f
.AIFSN
*(((mode
&IEEE_G
) == IEEE_G
)?9:20) + aSifsTime
;
2497 u4bAcParam
= ((((u32
)(pAcParam
->f
.TXOPLimit
))<<AC_PARAM_TXOP_LIMIT_OFFSET
)|
2498 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmax
))<<AC_PARAM_ECW_MAX_OFFSET
)|
2499 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmin
))<<AC_PARAM_ECW_MIN_OFFSET
)|
2500 (((u32
)u1bAIFS
) << AC_PARAM_AIFS_OFFSET
));
2503 write_nic_dword(dev
, AC_BK_PARAM
, u4bAcParam
);
2506 write_nic_dword(dev
, AC_BE_PARAM
, u4bAcParam
);
2509 write_nic_dword(dev
, AC_VI_PARAM
, u4bAcParam
);
2512 write_nic_dword(dev
, AC_VO_PARAM
, u4bAcParam
);
2515 printk(KERN_WARNING
"SetHwReg8185():invalid ACI: %d!\n", eACI
);
2523 for(i
= 0; i
< AC_MAX
; i
++){
2524 //AcParam.longData = 0;
2525 pAcParam
= (AC_PARAM
* )ac_param
;
2531 // Retrive paramters to udpate.
2532 eACI
= pAcParam
->f
.AciAifsn
.f
.ACI
;
2533 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2534 u1bAIFS
= pAcParam
->f
.AciAifsn
.f
.AIFSN
* (((mode
&IEEE_G
) == IEEE_G
)?9:20) + aSifsTime
;
2535 u4bAcParam
= ( (((u32
)(pAcParam
->f
.TXOPLimit
)) << AC_PARAM_TXOP_LIMIT_OFFSET
) |
2536 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmax
)) << AC_PARAM_ECW_MAX_OFFSET
) |
2537 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmin
)) << AC_PARAM_ECW_MIN_OFFSET
) |
2538 (((u32
)u1bAIFS
) << AC_PARAM_AIFS_OFFSET
));
2542 write_nic_dword(dev
, AC_BK_PARAM
, u4bAcParam
);
2545 write_nic_dword(dev
, AC_BE_PARAM
, u4bAcParam
);
2548 write_nic_dword(dev
, AC_VI_PARAM
, u4bAcParam
);
2551 write_nic_dword(dev
, AC_VO_PARAM
, u4bAcParam
);
2554 printk(KERN_WARNING
"SetHwReg8185(): invalid ACI: %d !\n", eACI
);
2558 ac_param
+= (sizeof(AC_PARAM
));
2562 void rtl8180_tx_irq_wq(struct work_struct
*work
);
2563 void rtl8180_restart_wq(struct work_struct
*work
);
2564 //void rtl8180_rq_tx_ack(struct work_struct *work);
2565 void rtl8180_watch_dog_wq(struct work_struct
*work
);
2566 void rtl8180_hw_wakeup_wq(struct work_struct
*work
);
2567 void rtl8180_hw_sleep_wq(struct work_struct
*work
);
2568 void rtl8180_sw_antenna_wq(struct work_struct
*work
);
2569 void rtl8180_watch_dog(struct net_device
*dev
);
2571 void watch_dog_adaptive(unsigned long data
)
2573 struct r8180_priv
* priv
= ieee80211_priv((struct net_device
*)data
);
2576 DMESG("<----watch_dog_adaptive():driver is not up!\n");
2580 // Tx High Power Mechanism.
2582 if(CheckHighPower((struct net_device
*)data
))
2584 queue_work(priv
->ieee80211
->wq
, (void *)&priv
->ieee80211
->tx_pw_wq
);
2588 // Tx Power Tracking on 87SE.
2590 //if( priv->bTxPowerTrack ) //lzm mod 080826
2591 if( CheckTxPwrTracking((struct net_device
*)data
));
2592 TxPwrTracking87SE((struct net_device
*)data
);
2595 // Perform DIG immediately.
2597 if(CheckDig((struct net_device
*)data
) == true)
2599 queue_work(priv
->ieee80211
->wq
, (void *)&priv
->ieee80211
->hw_dig_wq
);
2602 rtl8180_watch_dog((struct net_device
*)data
);
2604 queue_work(priv
->ieee80211
->wq
, (void *)&priv
->ieee80211
->GPIOChangeRFWorkItem
);
2606 priv
->watch_dog_timer
.expires
= jiffies
+ MSECS(IEEE80211_WATCH_DOG_TIME
);
2607 add_timer(&priv
->watch_dog_timer
);
2610 static CHANNEL_LIST ChannelPlan
[] = {
2611 {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, //FCC
2612 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
2613 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
2614 {{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.
2615 {{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.
2616 {{14,36,40,44,48,52,56,60,64},9}, //MKK
2617 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14, 36,40,44,48,52,56,60,64},22},//MKK1
2618 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //Israel.
2619 {{1,2,3,4,5,6,7,8,9,10,11,12,13,34,38,42,46},17}, // For 11a , TELEC
2620 {{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
2621 {{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
2624 static void rtl8180_set_channel_map(u8 channel_plan
, struct ieee80211_device
*ieee
)
2629 ieee
->MinPassiveChnlNum
=MAX_CHANNEL_NUMBER
+1;
2630 ieee
->IbssStartChnl
=0;
2632 switch (channel_plan
)
2634 case COUNTRY_CODE_FCC
:
2635 case COUNTRY_CODE_IC
:
2636 case COUNTRY_CODE_ETSI
:
2637 case COUNTRY_CODE_SPAIN
:
2638 case COUNTRY_CODE_FRANCE
:
2639 case COUNTRY_CODE_MKK
:
2640 case COUNTRY_CODE_MKK1
:
2641 case COUNTRY_CODE_ISRAEL
:
2642 case COUNTRY_CODE_TELEC
:
2645 ieee
->bGlobalDomain
= false;
2646 if (ChannelPlan
[channel_plan
].Len
!= 0){
2647 // Clear old channel map
2648 memset(GET_DOT11D_INFO(ieee
)->channel_map
, 0, sizeof(GET_DOT11D_INFO(ieee
)->channel_map
));
2649 // Set new channel map
2650 for (i
=0;i
<ChannelPlan
[channel_plan
].Len
;i
++)
2652 if(ChannelPlan
[channel_plan
].Channel
[i
] <= 14)
2653 GET_DOT11D_INFO(ieee
)->channel_map
[ChannelPlan
[channel_plan
].Channel
[i
]] = 1;
2658 case COUNTRY_CODE_GLOBAL_DOMAIN
:
2660 GET_DOT11D_INFO(ieee
)->bEnabled
= 0;
2662 ieee
->bGlobalDomain
= true;
2665 case COUNTRY_CODE_WORLD_WIDE_13_INDEX
://lzm add 080826
2667 ieee
->MinPassiveChnlNum
=12;
2668 ieee
->IbssStartChnl
= 10;
2674 ieee
->bGlobalDomain
= false;
2675 memset(GET_DOT11D_INFO(ieee
)->channel_map
, 0, sizeof(GET_DOT11D_INFO(ieee
)->channel_map
));
2678 GET_DOT11D_INFO(ieee
)->channel_map
[i
] = 1;
2685 void GPIOChangeRFWorkItemCallBack(struct work_struct
*work
);
2688 static void rtl8180_statistics_init(struct Stats
*pstats
)
2690 memset(pstats
, 0, sizeof(struct Stats
));
2693 static void rtl8180_link_detect_init(plink_detect_t plink_detect
)
2695 memset(plink_detect
, 0, sizeof(link_detect_t
));
2696 plink_detect
->SlotNum
= DEFAULT_SLOT_NUM
;
2700 short rtl8180_init(struct net_device
*dev
)
2702 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2711 priv
->channel_plan
= eprom_read(dev
, EEPROM_COUNTRY_CODE
>>1) & 0xFF;
2712 if(priv
->channel_plan
> COUNTRY_CODE_GLOBAL_DOMAIN
){
2713 printk("rtl8180_init:Error channel plan! Set to default.\n");
2714 priv
->channel_plan
= 0;
2717 DMESG("Channel plan is %d\n",priv
->channel_plan
);
2718 rtl8180_set_channel_map(priv
->channel_plan
, priv
->ieee80211
);
2720 //FIXME: these constants are placed in a bad pleace.
2721 priv
->txbuffsize
= 2048;//1024;
2722 priv
->txringcount
= 32;//32;
2723 priv
->rxbuffersize
= 2048;//1024;
2724 priv
->rxringcount
= 64;//32;
2725 priv
->txbeaconcount
= 2;
2726 priv
->rx_skb_complete
= 1;
2728 priv
->RegThreeWireMode
= HW_THREE_WIRE_SI
;
2730 priv
->RFChangeInProgress
= false;
2731 priv
->SetRFPowerStateInProgress
= false;
2732 priv
->RFProgType
= 0;
2733 priv
->bInHctTest
= false;
2735 priv
->irq_enabled
=0;
2737 rtl8180_statistics_init(&priv
->stats
);
2738 rtl8180_link_detect_init(&priv
->link_detect
);
2740 priv
->ack_tx_to_ieee
= 0;
2741 priv
->ieee80211
->current_network
.beacon_interval
= DEFAULT_BEACONINTERVAL
;
2742 priv
->ieee80211
->iw_mode
= IW_MODE_INFRA
;
2743 priv
->ieee80211
->softmac_features
= IEEE_SOFTMAC_SCAN
|
2744 IEEE_SOFTMAC_ASSOCIATE
| IEEE_SOFTMAC_PROBERQ
|
2745 IEEE_SOFTMAC_PROBERS
| IEEE_SOFTMAC_TX_QUEUE
;
2746 priv
->ieee80211
->active_scan
= 1;
2747 priv
->ieee80211
->rate
= 110; //11 mbps
2748 priv
->ieee80211
->modulation
= IEEE80211_CCK_MODULATION
;
2749 priv
->ieee80211
->host_encrypt
= 1;
2750 priv
->ieee80211
->host_decrypt
= 1;
2751 priv
->ieee80211
->sta_wake_up
= rtl8180_hw_wakeup
;
2752 priv
->ieee80211
->ps_request_tx_ack
= rtl8180_rq_tx_ack
;
2753 priv
->ieee80211
->enter_sleep_state
= rtl8180_hw_sleep
;
2754 priv
->ieee80211
->ps_is_queue_empty
= rtl8180_is_tx_queue_empty
;
2756 priv
->hw_wep
= hwwep
;
2759 priv
->retry_rts
= DEFAULT_RETRY_RTS
;
2760 priv
->retry_data
= DEFAULT_RETRY_DATA
;
2761 priv
->RFChangeInProgress
= false;
2762 priv
->SetRFPowerStateInProgress
= false;
2763 priv
->RFProgType
= 0;
2764 priv
->bInHctTest
= false;
2765 priv
->bInactivePs
= true;//false;
2766 priv
->ieee80211
->bInactivePs
= priv
->bInactivePs
;
2767 priv
->bSwRfProcessing
= false;
2768 priv
->eRFPowerState
= eRfOff
;
2769 priv
->RfOffReason
= 0;
2770 priv
->LedStrategy
= SW_LED_MODE0
;
2771 priv
->TxPollingTimes
= 0;//lzm add 080826
2772 priv
->bLeisurePs
= true;
2773 priv
->dot11PowerSaveMode
= eActive
;
2774 //by amy for antenna
2775 priv
->AdMinCheckPeriod
= 5;
2776 priv
->AdMaxCheckPeriod
= 10;
2777 // Lower signal strength threshold to fit the HW participation in antenna diversity. +by amy 080312
2778 priv
->AdMaxRxSsThreshold
= 30;//60->30
2779 priv
->AdRxSsThreshold
= 20;//50->20
2780 priv
->AdCheckPeriod
= priv
->AdMinCheckPeriod
;
2781 priv
->AdTickCount
= 0;
2782 priv
->AdRxSignalStrength
= -1;
2783 priv
->RegSwAntennaDiversityMechanism
= 0;
2784 priv
->RegDefaultAntenna
= 0;
2785 priv
->SignalStrength
= 0;
2786 priv
->AdRxOkCnt
= 0;
2787 priv
->CurrAntennaIndex
= 0;
2788 priv
->AdRxSsBeforeSwitched
= 0;
2789 init_timer(&priv
->SwAntennaDiversityTimer
);
2790 priv
->SwAntennaDiversityTimer
.data
= (unsigned long)dev
;
2791 priv
->SwAntennaDiversityTimer
.function
= (void *)SwAntennaDiversityTimerCallback
;
2792 //by amy for antenna
2794 priv
->bDigMechanism
= 1;
2795 priv
->InitialGain
= 6;
2796 priv
->bXtalCalibration
= false;
2797 priv
->XtalCal_Xin
= 0;
2798 priv
->XtalCal_Xout
= 0;
2799 priv
->bTxPowerTrack
= false;
2800 priv
->ThermalMeter
= 0;
2801 priv
->FalseAlarmRegValue
= 0;
2802 priv
->RegDigOfdmFaUpTh
= 0xc; // Upper threhold of OFDM false alarm, which is used in DIG.
2803 priv
->DIG_NumberFallbackVote
= 0;
2804 priv
->DIG_NumberUpgradeVote
= 0;
2805 priv
->LastSignalStrengthInPercent
= 0;
2806 priv
->Stats_SignalStrength
= 0;
2807 priv
->LastRxPktAntenna
= 0;
2808 priv
->SignalQuality
= 0; // in 0-100 index.
2809 priv
->Stats_SignalQuality
= 0;
2810 priv
->RecvSignalPower
= 0; // in dBm.
2811 priv
->Stats_RecvSignalPower
= 0;
2812 priv
->AdMainAntennaRxOkCnt
= 0;
2813 priv
->AdAuxAntennaRxOkCnt
= 0;
2814 priv
->bHWAdSwitched
= false;
2815 priv
->bRegHighPowerMechanism
= true;
2816 priv
->RegHiPwrUpperTh
= 77;
2817 priv
->RegHiPwrLowerTh
= 75;
2818 priv
->RegRSSIHiPwrUpperTh
= 70;
2819 priv
->RegRSSIHiPwrLowerTh
= 20;
2820 priv
->bCurCCKPkt
= false;
2821 priv
->UndecoratedSmoothedSS
= -1;
2822 priv
->bToUpdateTxPwr
= false;
2823 priv
->CurCCKRSSI
= 0;
2826 priv
->NumTxOkTotal
= 0;
2827 priv
->NumTxUnicast
= 0;
2828 priv
->keepAliveLevel
= DEFAULT_KEEP_ALIVE_LEVEL
;
2829 priv
->PowerProfile
= POWER_PROFILE_AC
;
2830 priv
->CurrRetryCnt
=0;
2831 priv
->LastRetryCnt
=0;
2832 priv
->LastTxokCnt
=0;
2833 priv
->LastRxokCnt
=0;
2834 priv
->LastRetryRate
=0;
2837 priv
->CurrRetryRate
=0;
2838 priv
->TryupingCount
=0;
2839 priv
->TryupingCountNoData
=0;
2840 priv
->TryDownCountLowData
=0;
2841 priv
->LastTxOKBytes
=0;
2842 priv
->LastFailTxRate
=0;
2843 priv
->LastFailTxRateSS
=0;
2844 priv
->FailTxRateCount
=0;
2845 priv
->LastTxThroughput
=0;
2846 priv
->NumTxOkBytesTotal
=0;
2847 priv
->ForcedDataRate
= 0;
2848 priv
->RegBModeGainStage
= 1;
2850 priv
->promisc
= (dev
->flags
& IFF_PROMISC
) ? 1:0;
2851 spin_lock_init(&priv
->irq_lock
);
2852 spin_lock_init(&priv
->irq_th_lock
);
2853 spin_lock_init(&priv
->tx_lock
);
2854 spin_lock_init(&priv
->ps_lock
);
2855 spin_lock_init(&priv
->rf_ps_lock
);
2856 sema_init(&priv
->wx_sem
,1);
2857 sema_init(&priv
->rf_state
,1);
2858 INIT_WORK(&priv
->reset_wq
,(void*) rtl8180_restart_wq
);
2859 INIT_WORK(&priv
->tx_irq_wq
,(void*) rtl8180_tx_irq_wq
);
2860 INIT_DELAYED_WORK(&priv
->ieee80211
->hw_wakeup_wq
,(void*) rtl8180_hw_wakeup_wq
);
2861 INIT_DELAYED_WORK(&priv
->ieee80211
->hw_sleep_wq
,(void*) rtl8180_hw_sleep_wq
);
2862 INIT_WORK(&priv
->ieee80211
->wmm_param_update_wq
,(void*) rtl8180_wmm_param_update
);
2863 INIT_DELAYED_WORK(&priv
->ieee80211
->rate_adapter_wq
,(void*)rtl8180_rate_adapter
);//+by amy 080312
2864 INIT_DELAYED_WORK(&priv
->ieee80211
->hw_dig_wq
,(void*)rtl8180_hw_dig_wq
);//+by amy 080312
2865 INIT_DELAYED_WORK(&priv
->ieee80211
->tx_pw_wq
,(void*)rtl8180_tx_pw_wq
);//+by amy 080312
2867 INIT_DELAYED_WORK(&priv
->ieee80211
->GPIOChangeRFWorkItem
,(void*) GPIOChangeRFWorkItemCallBack
);
2869 tasklet_init(&priv
->irq_rx_tasklet
,
2870 (void(*)(unsigned long)) rtl8180_irq_rx_tasklet
,
2871 (unsigned long)priv
);
2873 init_timer(&priv
->watch_dog_timer
);
2874 priv
->watch_dog_timer
.data
= (unsigned long)dev
;
2875 priv
->watch_dog_timer
.function
= watch_dog_adaptive
;
2877 init_timer(&priv
->rateadapter_timer
);
2878 priv
->rateadapter_timer
.data
= (unsigned long)dev
;
2879 priv
->rateadapter_timer
.function
= timer_rate_adaptive
;
2880 priv
->RateAdaptivePeriod
= RATE_ADAPTIVE_TIMER_PERIOD
;
2881 priv
->bEnhanceTxPwr
=false;
2883 priv
->ieee80211
->softmac_hard_start_xmit
= rtl8180_hard_start_xmit
;
2884 priv
->ieee80211
->set_chan
= rtl8180_set_chan
;
2885 priv
->ieee80211
->link_change
= rtl8180_link_change
;
2886 priv
->ieee80211
->softmac_data_hard_start_xmit
= rtl8180_hard_data_xmit
;
2887 priv
->ieee80211
->data_hard_stop
= rtl8180_data_hard_stop
;
2888 priv
->ieee80211
->data_hard_resume
= rtl8180_data_hard_resume
;
2890 priv
->ieee80211
->init_wmmparam_flag
= 0;
2892 priv
->ieee80211
->start_send_beacons
= rtl8180_start_tx_beacon
;
2893 priv
->ieee80211
->stop_send_beacons
= rtl8180_beacon_tx_disable
;
2894 priv
->ieee80211
->fts
= DEFAULT_FRAG_THRESHOLD
;
2896 priv
->MWIEnable
= 0;
2898 priv
->ShortRetryLimit
= 7;
2899 priv
->LongRetryLimit
= 7;
2900 priv
->EarlyRxThreshold
= 7;
2902 priv
->CSMethod
= (0x01 << 29);
2904 priv
->TransmitConfig
=
2905 1<<TCR_DurProcMode_OFFSET
| //for RTL8185B, duration setting by HW
2906 (7<<TCR_MXDMA_OFFSET
) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
2907 (priv
->ShortRetryLimit
<<TCR_SRL_OFFSET
) | // Short retry limit
2908 (priv
->LongRetryLimit
<<TCR_LRL_OFFSET
) | // Long retry limit
2909 (0 ? TCR_SAT
: 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
2911 priv
->ReceiveConfig
=
2912 RCR_AMF
| RCR_ADF
| //accept management/data
2913 RCR_ACF
| //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2914 RCR_AB
| RCR_AM
| RCR_APM
| //accept BC/MC/UC
2915 (7<<RCR_MXDMA_OFFSET
) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2916 (priv
->EarlyRxThreshold
<<RCR_FIFO_OFFSET
) | // Rx FIFO Threshold, 7: No Rx threshold.
2917 (priv
->EarlyRxThreshold
== 7 ? RCR_ONLYERLPKT
:0);
2919 priv
->IntrMask
= IMR_TMGDOK
| IMR_TBDER
| IMR_THPDER
|
2920 IMR_THPDER
| IMR_THPDOK
|
2921 IMR_TVODER
| IMR_TVODOK
|
2922 IMR_TVIDER
| IMR_TVIDOK
|
2923 IMR_TBEDER
| IMR_TBEDOK
|
2924 IMR_TBKDER
| IMR_TBKDOK
|
2925 IMR_RDU
| // To handle the defragmentation not enough Rx descriptors case. Annie, 2006-03-27.
2927 IMR_RQoSOK
; // <NOTE> ROK and RQoSOK are mutually exclusive, so, we must handle RQoSOK interrupt to receive QoS frames, 2005.12.09, by rcnjko.
2929 priv
->InitialGain
= 6;
2931 hw_version
=( read_nic_dword(dev
, TCR
) & TCR_HWVERID_MASK
)>>TCR_HWVERID_SHIFT
;
2933 switch (hw_version
){
2934 case HW_VERID_R8185B_B
:
2935 priv
->card_8185
= VERSION_8187S_C
;
2936 DMESG("MAC controller is a RTL8187SE b/g");
2939 case HW_VERID_R8185_ABC
:
2940 DMESG("MAC controller is a RTL8185 b/g");
2941 priv
->card_8185
= 1;
2942 /* you should not find a card with 8225 PHY ver < C*/
2945 case HW_VERID_R8185_D
:
2946 DMESG("MAC controller is a RTL8185 b/g (V. D)");
2947 priv
->card_8185
= 2;
2948 /* you should not find a card with 8225 PHY ver < C*/
2951 case HW_VERID_R8180_ABCD
:
2952 DMESG("MAC controller is a RTL8180");
2953 priv
->card_8185
= 0;
2955 case HW_VERID_R8180_F
:
2956 DMESG("MAC controller is a RTL8180 (v. F)");
2957 priv
->card_8185
= 0;
2960 DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version
);
2961 priv
->card_8185
= 0;
2965 if(priv
->card_8185
){
2966 priv
->ieee80211
->modulation
|= IEEE80211_OFDM_MODULATION
;
2967 priv
->ieee80211
->short_slot
= 1;
2969 /* you should not found any 8185 Ver B Card */
2970 priv
->card_8185_Bversion
= 0;
2973 priv
->card_type
= PCI
;
2974 DMESG("This is a PCI NIC");
2975 priv
->enable_gpio0
= 0;
2977 usValue
= eprom_read(dev
, EEPROM_SW_REVD_OFFSET
);
2978 DMESG("usValue is 0x%x\n",usValue
);
2979 //3Read AntennaDiversity
2981 // SW Antenna Diversity.
2982 if ((usValue
& EEPROM_SW_AD_MASK
) != EEPROM_SW_AD_ENABLE
)
2983 priv
->EEPROMSwAntennaDiversity
= false;
2985 priv
->EEPROMSwAntennaDiversity
= true;
2987 // Default Antenna to use.
2988 if ((usValue
& EEPROM_DEF_ANT_MASK
) != EEPROM_DEF_ANT_1
)
2989 priv
->EEPROMDefaultAntenna1
= false;
2991 priv
->EEPROMDefaultAntenna1
= true;
2993 if( priv
->RegSwAntennaDiversityMechanism
== 0 ) // Auto
2994 /* 0: default from EEPROM. */
2995 priv
->bSwAntennaDiverity
= priv
->EEPROMSwAntennaDiversity
;
2997 /* 1:disable antenna diversity, 2: enable antenna diversity. */
2998 priv
->bSwAntennaDiverity
= ((priv
->RegSwAntennaDiversityMechanism
== 1)? false : true);
3000 if (priv
->RegDefaultAntenna
== 0)
3001 /* 0: default from EEPROM. */
3002 priv
->bDefaultAntenna1
= priv
->EEPROMDefaultAntenna1
;
3004 /* 1: main, 2: aux. */
3005 priv
->bDefaultAntenna1
= ((priv
->RegDefaultAntenna
== 2) ? true : false);
3007 /* rtl8185 can calc plcp len in HW.*/
3008 priv
->hw_plcp_len
= 1;
3010 priv
->plcp_preamble_mode
= 2;
3011 /*the eeprom type is stored in RCR register bit #6 */
3012 if (RCR_9356SEL
& read_nic_dword(dev
, RCR
))
3013 priv
->epromtype
=EPROM_93c56
;
3015 priv
->epromtype
=EPROM_93c46
;
3017 dev
->dev_addr
[0]=eprom_read(dev
,MAC_ADR
) & 0xff;
3018 dev
->dev_addr
[1]=(eprom_read(dev
,MAC_ADR
) & 0xff00)>>8;
3019 dev
->dev_addr
[2]=eprom_read(dev
,MAC_ADR
+1) & 0xff;
3020 dev
->dev_addr
[3]=(eprom_read(dev
,MAC_ADR
+1) & 0xff00)>>8;
3021 dev
->dev_addr
[4]=eprom_read(dev
,MAC_ADR
+2) & 0xff;
3022 dev
->dev_addr
[5]=(eprom_read(dev
,MAC_ADR
+2) & 0xff00)>>8;
3024 for(i
=1,j
=0; i
<14; i
+=2,j
++){
3025 word
= eprom_read(dev
,EPROM_TXPW_CH1_2
+ j
);
3026 priv
->chtxpwr
[i
]=word
& 0xff;
3027 priv
->chtxpwr
[i
+1]=(word
& 0xff00)>>8;
3029 if(priv
->card_8185
){
3030 for(i
=1,j
=0; i
<14; i
+=2,j
++){
3031 word
= eprom_read(dev
,EPROM_TXPW_OFDM_CH1_2
+ j
);
3032 priv
->chtxpwr_ofdm
[i
]=word
& 0xff;
3033 priv
->chtxpwr_ofdm
[i
+1]=(word
& 0xff00)>>8;
3037 //3Read crystal calibtration and thermal meter indication on 87SE.
3039 // By SD3 SY's request. Added by Roger, 2007.12.11.
3041 tmpu16
= eprom_read(dev
, EEPROM_RSV
>>1);
3043 // Crystal calibration for Xin and Xout resp.
3044 priv
->XtalCal_Xout
= tmpu16
& EEPROM_XTAL_CAL_XOUT_MASK
; // 0~7.5pF
3045 priv
->XtalCal_Xin
= (tmpu16
& EEPROM_XTAL_CAL_XIN_MASK
)>>4; // 0~7.5pF
3046 if((tmpu16
& EEPROM_XTAL_CAL_ENABLE
)>>12)
3047 priv
->bXtalCalibration
= true;
3049 // Thermal meter reference indication.
3050 priv
->ThermalMeter
= (u8
)((tmpu16
& EEPROM_THERMAL_METER_MASK
)>>8);
3051 if((tmpu16
& EEPROM_THERMAL_METER_ENABLE
)>>13)
3052 priv
->bTxPowerTrack
= true;
3054 word
= eprom_read(dev
,EPROM_TXPW_BASE
);
3055 priv
->cck_txpwr_base
= word
& 0xf;
3056 priv
->ofdm_txpwr_base
= (word
>>4) & 0xf;
3058 version
= eprom_read(dev
,EPROM_VERSION
);
3059 DMESG("EEPROM version %x",version
);
3060 if( (!priv
->card_8185
) && version
< 0x0101){
3061 DMESG ("EEPROM version too old, assuming defaults");
3062 DMESG ("If you see this message *plase* send your \
3063 DMESG output to andreamrl@tiscali.it THANKS");
3067 priv
->cs_treshold
=0xc;
3069 priv
->rf_chip
=RFCHIPID_PHILIPS
;
3071 if(!priv
->card_8185
){
3072 u8 rfparam
= eprom_read(dev
,RF_PARAM
);
3073 DMESG("RfParam: %x",rfparam
);
3075 priv
->digphy
= rfparam
& (1<<RF_PARAM_DIGPHY_SHIFT
) ? 0:1;
3076 priv
->antb
= rfparam
& (1<<RF_PARAM_ANTBDEFAULT_SHIFT
) ? 1:0;
3078 priv
->rcr_csense
= (rfparam
& RF_PARAM_CARRIERSENSE_MASK
) >>
3079 RF_PARAM_CARRIERSENSE_SHIFT
;
3082 (read_nic_byte(dev
,CONFIG2
)&(1<<CONFIG2_ANTENNA_SHIFT
)) ? 1:0;
3084 priv
->rcr_csense
= 3;
3087 priv
->cs_treshold
= (eprom_read(dev
,ENERGY_TRESHOLD
)&0xff00) >>8;
3089 priv
->rf_chip
= 0xff & eprom_read(dev
,RFCHIPID
);
3092 priv
->rf_chip
= RF_ZEBRA4
;
3093 priv
->rf_sleep
= rtl8225z4_rf_sleep
;
3094 priv
->rf_wakeup
= rtl8225z4_rf_wakeup
;
3095 DMESGW("**PLEASE** REPORT SUCCESSFUL/UNSUCCESSFUL TO Realtek!");
3097 priv
->rf_close
= rtl8225z2_rf_close
;
3098 priv
->rf_init
= rtl8225z2_rf_init
;
3099 priv
->rf_set_chan
= rtl8225z2_rf_set_chan
;
3100 priv
->rf_set_sens
= NULL
;
3102 if(!priv
->card_8185
){
3104 DMESG ("Antenna B is default antenna");
3106 DMESG ("Antenna A is default antenna");
3109 DMESG ("Antenna diversity is enabled");
3111 DMESG("Antenna diversity is disabled");
3113 DMESG("Carrier sense %d",priv
->rcr_csense
);
3116 if (0!=alloc_rx_desc_ring(dev
, priv
->rxbuffersize
, priv
->rxringcount
))
3119 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3120 TX_MANAGEPRIORITY_RING_ADDR
))
3123 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3124 TX_BKPRIORITY_RING_ADDR
))
3127 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3128 TX_BEPRIORITY_RING_ADDR
))
3131 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3132 TX_VIPRIORITY_RING_ADDR
))
3135 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3136 TX_VOPRIORITY_RING_ADDR
))
3139 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txringcount
,
3140 TX_HIGHPRIORITY_RING_ADDR
))
3143 if (0!=alloc_tx_desc_ring(dev
, priv
->txbuffsize
, priv
->txbeaconcount
,
3144 TX_BEACON_RING_ADDR
))
3147 if(!priv
->card_8185
){
3148 if(read_nic_byte(dev
, CONFIG0
) & (1<<CONFIG0_WEP40_SHIFT
))
3149 DMESG ("40-bit WEP is supported in hardware");
3151 DMESG ("40-bit WEP is NOT supported in hardware");
3153 if(read_nic_byte(dev
,CONFIG0
) & (1<<CONFIG0_WEP104_SHIFT
))
3154 DMESG ("104-bit WEP is supported in hardware");
3156 DMESG ("104-bit WEP is NOT supported in hardware");
3158 #if !defined(SA_SHIRQ)
3159 if(request_irq(dev
->irq
, (void *)rtl8180_interrupt
, IRQF_SHARED
, dev
->name
, dev
)){
3161 if(request_irq(dev
->irq
, (void *)rtl8180_interrupt
, SA_SHIRQ
, dev
->name
, dev
)){
3163 DMESGE("Error allocating IRQ %d",dev
->irq
);
3167 DMESG("IRQ %d",dev
->irq
);
3173 void rtl8180_no_hw_wep(struct net_device
*dev
)
3175 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3177 if (!priv
->card_8185
) {
3180 security
= read_nic_byte(dev
, SECURITY
);
3181 security
&=~(1<<SECURITY_WEP_TX_ENABLE_SHIFT
);
3182 security
&=~(1<<SECURITY_WEP_RX_ENABLE_SHIFT
);
3184 write_nic_byte(dev
, SECURITY
, security
);
3188 void rtl8180_set_hw_wep(struct net_device
*dev
)
3190 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3195 pgreg
=read_nic_byte(dev
, PGSELECT
);
3196 write_nic_byte(dev
, PGSELECT
, pgreg
&~ (1<<PGSELECT_PG_SHIFT
));
3198 key0_word4
= read_nic_dword(dev
, KEY0
+4+4+4);
3199 key0_word4
&= ~ 0xff;
3200 key0_word4
|= priv
->key0
[3]& 0xff;
3201 write_nic_dword(dev
,KEY0
,(priv
->key0
[0]));
3202 write_nic_dword(dev
,KEY0
+4,(priv
->key0
[1]));
3203 write_nic_dword(dev
,KEY0
+4+4,(priv
->key0
[2]));
3204 write_nic_dword(dev
,KEY0
+4+4+4,(key0_word4
));
3206 security
= read_nic_byte(dev
,SECURITY
);
3207 security
|= (1<<SECURITY_WEP_TX_ENABLE_SHIFT
);
3208 security
|= (1<<SECURITY_WEP_RX_ENABLE_SHIFT
);
3209 security
&= ~ SECURITY_ENCRYP_MASK
;
3210 security
|= (SECURITY_ENCRYP_104
<<SECURITY_ENCRYP_SHIFT
);
3212 write_nic_byte(dev
, SECURITY
, security
);
3214 DMESG("key %x %x %x %x",read_nic_dword(dev
,KEY0
+4+4+4),
3215 read_nic_dword(dev
,KEY0
+4+4),read_nic_dword(dev
,KEY0
+4),
3216 read_nic_dword(dev
,KEY0
));
3220 void rtl8185_rf_pins_enable(struct net_device
*dev
)
3223 // tmp = read_nic_word(dev, RFPinsEnable);
3224 write_nic_word(dev
, RFPinsEnable
, 0x1fff);// | tmp);
3227 void rtl8185_set_anaparam2(struct net_device
*dev
, u32 a
)
3231 rtl8180_set_mode(dev
, EPROM_CMD_CONFIG
);
3233 conf3
= read_nic_byte(dev
, CONFIG3
);
3234 write_nic_byte(dev
, CONFIG3
, conf3
| (1<<CONFIG3_ANAPARAM_W_SHIFT
));
3235 write_nic_dword(dev
, ANAPARAM2
, a
);
3237 conf3
= read_nic_byte(dev
, CONFIG3
);
3238 write_nic_byte(dev
, CONFIG3
, conf3
&~(1<<CONFIG3_ANAPARAM_W_SHIFT
));
3239 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
3242 void rtl8180_set_anaparam(struct net_device
*dev
, u32 a
)
3246 rtl8180_set_mode(dev
, EPROM_CMD_CONFIG
);
3248 conf3
= read_nic_byte(dev
, CONFIG3
);
3249 write_nic_byte(dev
, CONFIG3
, conf3
| (1<<CONFIG3_ANAPARAM_W_SHIFT
));
3250 write_nic_dword(dev
, ANAPARAM
, a
);
3252 conf3
= read_nic_byte(dev
, CONFIG3
);
3253 write_nic_byte(dev
, CONFIG3
, conf3
&~(1<<CONFIG3_ANAPARAM_W_SHIFT
));
3254 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
3257 void rtl8185_tx_antenna(struct net_device
*dev
, u8 ant
)
3259 write_nic_byte(dev
, TX_ANTENNA
, ant
);
3260 force_pci_posting(dev
);
3264 void rtl8185_write_phy(struct net_device
*dev
, u8 adr
, u32 data
)
3270 phyw
= ((data
<<8) | adr
);
3272 // Note that, we must write 0xff7c after 0x7d-0x7f to write BB register.
3273 write_nic_byte(dev
, 0x7f, ((phyw
& 0xff000000) >> 24));
3274 write_nic_byte(dev
, 0x7e, ((phyw
& 0x00ff0000) >> 16));
3275 write_nic_byte(dev
, 0x7d, ((phyw
& 0x0000ff00) >> 8));
3276 write_nic_byte(dev
, 0x7c, ((phyw
& 0x000000ff) ));
3278 /* this is ok to fail when we write AGC table. check for AGC table might be
3279 * done by masking with 0x7f instead of 0xff
3281 //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data,adr);
3284 inline void write_phy_ofdm (struct net_device
*dev
, u8 adr
, u32 data
)
3287 rtl8185_write_phy(dev
, adr
, data
);
3290 void write_phy_cck (struct net_device
*dev
, u8 adr
, u32 data
)
3293 rtl8185_write_phy(dev
, adr
, data
| 0x10000);
3297 * I hope this is enougth
3300 void write_phy(struct net_device
*dev
, u8 adr
, u8 data
)
3307 phy
|= 0x80; /* this should enable writing */
3310 //PHY_ADR, PHY_R and PHY_W are contig and treated as one dword
3311 write_nic_dword(dev
,PHY_ADR
, phy
);
3316 write_nic_dword(dev
,PHY_ADR
, phy
);
3317 for(i
=0;i
<MAX_PHY
;i
++){
3318 phy
=read_nic_dword(dev
,PHY_ADR
);
3319 phy
= phy
& 0xff0000;
3321 if(phy
== data
){ //SUCCESS!
3322 force_pci_posting(dev
);
3323 mdelay(3); //random value
3326 force_pci_posting(dev
);
3327 mdelay(3); //random value
3330 DMESGW ("Phy writing %x %x failed!", adr
,data
);
3333 void rtl8185_set_rate(struct net_device
*dev
)
3337 int basic_rate
,min_rr_rate
,max_rr_rate
;
3339 basic_rate
= ieeerate2rtlrate(240);
3340 min_rr_rate
= ieeerate2rtlrate(60);
3341 max_rr_rate
= ieeerate2rtlrate(240);
3343 write_nic_byte(dev
, RESP_RATE
,
3344 max_rr_rate
<<MAX_RESP_RATE_SHIFT
| min_rr_rate
<<MIN_RESP_RATE_SHIFT
);
3346 word
= read_nic_word(dev
, BRSR
);
3347 word
&= ~BRSR_MBR_8185
;
3349 for(i
=0;i
<=basic_rate
;i
++)
3352 write_nic_word(dev
, BRSR
, word
);
3355 void rtl8180_adapter_start(struct net_device
*dev
)
3357 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3362 rtl8180_rtx_disable(dev
);
3365 /* enable beacon timeout, beacon TX ok and err
3366 * LP tx ok and err, HP TX ok and err, NP TX ok and err,
3367 * RX ok and ERR, and GP timer */
3368 priv
->irq_mask
= 0x6fcf;
3370 priv
->dma_poll_mask
= 0;
3372 rtl8180_beacon_tx_disable(dev
);
3374 if(priv
->card_type
== CARDBUS
){
3375 config3
=read_nic_byte(dev
, CONFIG3
);
3376 write_nic_byte(dev
,CONFIG3
,config3
| CONFIG3_FuncRegEn
);
3377 write_nic_word(dev
,FEMR
, FEMR_INTR
| FEMR_WKUP
| FEMR_GWAKE
|
3378 read_nic_word(dev
, FEMR
));
3380 rtl8180_set_mode(dev
, EPROM_CMD_CONFIG
);
3381 write_nic_dword(dev
, MAC0
, ((u32
*)dev
->dev_addr
)[0]);
3382 write_nic_word(dev
, MAC4
, ((u32
*)dev
->dev_addr
)[1] & 0xffff );
3383 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
3385 rtl8180_update_msr(dev
);
3387 if(!priv
->card_8185
){
3388 anaparam
= eprom_read(dev
,EPROM_ANAPARAM_ADDRLWORD
);
3389 anaparam
|= eprom_read(dev
,EPROM_ANAPARAM_ADDRHWORD
)<<16;
3391 rtl8180_set_anaparam(dev
,anaparam
);
3393 /* These might be unnecessary since we do in rx_enable / tx_enable */
3397 rtl8180_set_mode(dev
, EPROM_CMD_CONFIG
);
3400 The following is very strange. seems to be that 1 means test mode,
3401 but we need to acknolwledges the nic when a packet is ready
3402 altought we set it to 0
3406 CONFIG2
, read_nic_byte(dev
,CONFIG2
) &~\
3407 (1<<CONFIG2_DMA_POLLING_MODE_SHIFT
));
3408 //^the nic isn't in test mode
3411 CONFIG2
, read_nic_byte(dev
,CONFIG2
)|(1<<4));
3413 rtl8180_set_mode(dev
,EPROM_CMD_NORMAL
);
3415 write_nic_dword(dev
,INT_TIMEOUT
,0);
3417 if(!priv
->card_8185
)
3420 experimental - this might be needed to calibrate AGC,
3421 anyway it shouldn't hurt
3423 write_nic_byte(dev
, CONFIG5
,
3424 read_nic_byte(dev
, CONFIG5
) | (1<<AGCRESET_SHIFT
));
3425 read_nic_byte(dev
, CONFIG5
);
3427 write_nic_byte(dev
, CONFIG5
,
3428 read_nic_byte(dev
, CONFIG5
) &~ (1<<AGCRESET_SHIFT
));
3430 write_nic_byte(dev
, WPA_CONFIG
, 0);
3431 //write_nic_byte(dev, TESTR, 0xd);
3434 rtl8180_no_hw_wep(dev
);
3436 if(priv
->card_8185
){
3437 rtl8185_set_rate(dev
);
3438 write_nic_byte(dev
, RATE_FALLBACK
, 0x81);
3440 word
= read_nic_word(dev
, BRSR
);
3442 word
&= ~BRSR_BPLCP
;
3443 word
|= ieeerate2rtlrate(priv
->ieee80211
->basic_rate
);
3445 write_nic_word(dev
, BRSR
, word
);
3448 if(priv
->card_8185
){
3449 write_nic_byte(dev
, GP_ENABLE
,read_nic_byte(dev
, GP_ENABLE
) & ~(1<<6));
3451 //FIXME cfg 3 ClkRun enable - isn't it ReadOnly ?
3452 rtl8180_set_mode(dev
, EPROM_CMD_CONFIG
);
3453 write_nic_byte(dev
,CONFIG3
, read_nic_byte(dev
, CONFIG3
)
3454 | (1 << CONFIG3_CLKRUN_SHIFT
));
3455 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
3460 if(priv
->rf_set_sens
!= NULL
)
3461 priv
->rf_set_sens(dev
,priv
->sens
);
3462 rtl8180_irq_enable(dev
);
3464 netif_start_queue(dev
);
3467 /* this configures registers for beacon tx and enables it via
3468 * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might
3469 * be used to stop beacon transmission
3471 void rtl8180_start_tx_beacon(struct net_device
*dev
)
3475 DMESG("Enabling beacon TX");
3476 rtl8180_prepare_beacon(dev
);
3477 rtl8180_irq_disable(dev
);
3478 rtl8180_beacon_tx_enable(dev
);
3480 word
= read_nic_word(dev
, AtimWnd
) &~ AtimWnd_AtimWnd
;
3481 write_nic_word(dev
, AtimWnd
,word
);// word |=
3483 word
= read_nic_word(dev
, BintrItv
);
3484 word
&= ~BintrItv_BintrItv
;
3485 word
|= 1000;/*priv->ieee80211->current_network.beacon_interval *
3486 ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1);
3487 // FIXME: check if correct ^^ worked with 0x3e8;
3489 write_nic_word(dev
, BintrItv
, word
);
3491 rtl8180_set_mode(dev
, EPROM_CMD_NORMAL
);
3493 rtl8185b_irq_enable(dev
);
3496 static struct net_device_stats
*rtl8180_stats(struct net_device
*dev
)
3498 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3500 return &priv
->ieee80211
->stats
;
3503 // Change current and default preamble mode.
3504 // 2005.01.06, by rcnjko.
3507 MgntActSet_802_11_PowerSaveMode(
3508 struct r8180_priv
*priv
,
3512 // Currently, we do not change power save mode on IBSS mode.
3513 if(priv
->ieee80211
->iw_mode
== IW_MODE_ADHOC
)
3516 priv
->ieee80211
->ps
= rtPsMode
;
3521 void LeisurePSEnter(struct r8180_priv
*priv
)
3523 if (priv
->bLeisurePs
) {
3524 if (priv
->ieee80211
->ps
== IEEE80211_PS_DISABLED
)
3525 MgntActSet_802_11_PowerSaveMode(priv
, IEEE80211_PS_MBCAST
|IEEE80211_PS_UNICAST
);//IEEE80211_PS_ENABLE
3529 void LeisurePSLeave(struct r8180_priv
*priv
)
3531 if (priv
->bLeisurePs
) {
3532 if (priv
->ieee80211
->ps
!= IEEE80211_PS_DISABLED
)
3533 MgntActSet_802_11_PowerSaveMode(priv
, IEEE80211_PS_DISABLED
);
3537 void rtl8180_hw_wakeup_wq (struct work_struct
*work
)
3539 struct delayed_work
*dwork
= to_delayed_work(work
);
3540 struct ieee80211_device
*ieee
= container_of(dwork
,struct ieee80211_device
,hw_wakeup_wq
);
3541 struct net_device
*dev
= ieee
->dev
;
3543 rtl8180_hw_wakeup(dev
);
3546 void rtl8180_hw_sleep_wq (struct work_struct
*work
)
3548 struct delayed_work
*dwork
= to_delayed_work(work
);
3549 struct ieee80211_device
*ieee
= container_of(dwork
,struct ieee80211_device
,hw_sleep_wq
);
3550 struct net_device
*dev
= ieee
->dev
;
3552 rtl8180_hw_sleep_down(dev
);
3555 static void MgntLinkKeepAlive(struct r8180_priv
*priv
)
3557 if (priv
->keepAliveLevel
== 0)
3560 if(priv
->ieee80211
->state
== IEEE80211_LINKED
)
3566 if ( (priv
->keepAliveLevel
== 2) ||
3567 (priv
->link_detect
.LastNumTxUnicast
== priv
->NumTxUnicast
&&
3568 priv
->link_detect
.LastNumRxUnicast
== priv
->ieee80211
->NumRxUnicast
)
3571 priv
->link_detect
.IdleCount
++;
3574 // Send a Keep-Alive packet packet to AP if we had been idle for a while.
3576 if(priv
->link_detect
.IdleCount
>= ((KEEP_ALIVE_INTERVAL
/ CHECK_FOR_HANG_PERIOD
)-1) )
3578 priv
->link_detect
.IdleCount
= 0;
3579 ieee80211_sta_ps_send_null_frame(priv
->ieee80211
, false);
3584 priv
->link_detect
.IdleCount
= 0;
3586 priv
->link_detect
.LastNumTxUnicast
= priv
->NumTxUnicast
;
3587 priv
->link_detect
.LastNumRxUnicast
= priv
->ieee80211
->NumRxUnicast
;
3591 static u8
read_acadapter_file(char *filename
);
3593 void rtl8180_watch_dog(struct net_device
*dev
)
3595 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3596 bool bEnterPS
= false;
3597 bool bBusyTraffic
= false;
3601 if(priv
->ieee80211
->actscanning
== false){
3602 if((priv
->ieee80211
->iw_mode
!= IW_MODE_ADHOC
) && (priv
->ieee80211
->state
== IEEE80211_NOLINK
) && (priv
->ieee80211
->beinretry
== false) && (priv
->eRFPowerState
== eRfOn
)){
3606 //YJ,add,080828,for link state check
3607 if((priv
->ieee80211
->state
== IEEE80211_LINKED
) && (priv
->ieee80211
->iw_mode
== IW_MODE_INFRA
)){
3608 SlotIndex
= (priv
->link_detect
.SlotIndex
++) % priv
->link_detect
.SlotNum
;
3609 priv
->link_detect
.RxFrameNum
[SlotIndex
] = priv
->ieee80211
->NumRxDataInPeriod
+ priv
->ieee80211
->NumRxBcnInPeriod
;
3610 for( i
=0; i
<priv
->link_detect
.SlotNum
; i
++ )
3611 TotalRxNum
+= priv
->link_detect
.RxFrameNum
[i
];
3613 if(TotalRxNum
== 0){
3614 priv
->ieee80211
->state
= IEEE80211_ASSOCIATING
;
3615 queue_work(priv
->ieee80211
->wq
, &priv
->ieee80211
->associate_procedure_wq
);
3619 //YJ,add,080828,for KeepAlive
3620 MgntLinkKeepAlive(priv
);
3622 //YJ,add,080828,for LPS
3624 if (priv
->PowerProfile
== POWER_PROFILE_BATTERY
)
3625 priv
->bLeisurePs
= true;
3626 else if (priv
->PowerProfile
== POWER_PROFILE_AC
) {
3627 LeisurePSLeave(priv
);
3628 priv
->bLeisurePs
= false;
3631 if(priv
->ieee80211
->state
== IEEE80211_LINKED
){
3632 priv
->link_detect
.NumRxOkInPeriod
= priv
->ieee80211
->NumRxDataInPeriod
;
3633 //printk("TxOk=%d RxOk=%d\n", priv->link_detect.NumTxOkInPeriod, priv->link_detect.NumRxOkInPeriod);
3634 if( priv
->link_detect
.NumRxOkInPeriod
> 666 ||
3635 priv
->link_detect
.NumTxOkInPeriod
> 666 ) {
3636 bBusyTraffic
= true;
3638 if(((priv
->link_detect
.NumRxOkInPeriod
+ priv
->link_detect
.NumTxOkInPeriod
) > 8)
3639 || (priv
->link_detect
.NumRxOkInPeriod
> 2)) {
3645 LeisurePSEnter(priv
);
3647 LeisurePSLeave(priv
);
3649 LeisurePSLeave(priv
);
3651 priv
->link_detect
.bBusyTraffic
= bBusyTraffic
;
3652 priv
->link_detect
.NumRxOkInPeriod
= 0;
3653 priv
->link_detect
.NumTxOkInPeriod
= 0;
3654 priv
->ieee80211
->NumRxDataInPeriod
= 0;
3655 priv
->ieee80211
->NumRxBcnInPeriod
= 0;
3658 int _rtl8180_up(struct net_device
*dev
)
3660 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3664 DMESG("Bringing up iface");
3665 rtl8185b_adapter_start(dev
);
3666 rtl8185b_rx_enable(dev
);
3667 rtl8185b_tx_enable(dev
);
3668 if(priv
->bInactivePs
){
3669 if(priv
->ieee80211
->iw_mode
== IW_MODE_ADHOC
)
3673 timer_rate_adaptive((unsigned long)dev
);
3675 watch_dog_adaptive((unsigned long)dev
);
3677 if(priv
->bSwAntennaDiverity
)
3678 SwAntennaDiversityTimerCallback(dev
);
3680 ieee80211_softmac_start_protocol(priv
->ieee80211
);
3685 int rtl8180_open(struct net_device
*dev
)
3687 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3690 down(&priv
->wx_sem
);
3691 ret
= rtl8180_up(dev
);
3696 int rtl8180_up(struct net_device
*dev
)
3698 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3700 if (priv
->up
== 1) return -1;
3702 return _rtl8180_up(dev
);
3705 int rtl8180_close(struct net_device
*dev
)
3707 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3710 down(&priv
->wx_sem
);
3711 ret
= rtl8180_down(dev
);
3717 int rtl8180_down(struct net_device
*dev
)
3719 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3726 ieee80211_softmac_stop_protocol(priv
->ieee80211
);
3728 if (!netif_queue_stopped(dev
))
3729 netif_stop_queue(dev
);
3730 rtl8180_rtx_disable(dev
);
3731 rtl8180_irq_disable(dev
);
3732 del_timer_sync(&priv
->watch_dog_timer
);
3733 del_timer_sync(&priv
->rateadapter_timer
);
3734 cancel_delayed_work(&priv
->ieee80211
->rate_adapter_wq
);
3735 cancel_delayed_work(&priv
->ieee80211
->hw_wakeup_wq
);
3736 cancel_delayed_work(&priv
->ieee80211
->hw_sleep_wq
);
3737 cancel_delayed_work(&priv
->ieee80211
->hw_dig_wq
);
3738 cancel_delayed_work(&priv
->ieee80211
->tx_pw_wq
);
3739 del_timer_sync(&priv
->SwAntennaDiversityTimer
);
3740 SetZebraRFPowerState8185(dev
,eRfOff
);
3741 memset(&(priv
->ieee80211
->current_network
),0,sizeof(struct ieee80211_network
));
3742 priv
->ieee80211
->state
= IEEE80211_NOLINK
;
3746 void rtl8180_restart_wq(struct work_struct
*work
)
3748 struct r8180_priv
*priv
= container_of(work
, struct r8180_priv
, reset_wq
);
3749 struct net_device
*dev
= priv
->dev
;
3751 down(&priv
->wx_sem
);
3753 rtl8180_commit(dev
);
3758 void rtl8180_restart(struct net_device
*dev
)
3760 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3762 schedule_work(&priv
->reset_wq
);
3765 void rtl8180_commit(struct net_device
*dev
)
3767 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3772 del_timer_sync(&priv
->watch_dog_timer
);
3773 del_timer_sync(&priv
->rateadapter_timer
);
3774 cancel_delayed_work(&priv
->ieee80211
->rate_adapter_wq
);
3775 cancel_delayed_work(&priv
->ieee80211
->hw_wakeup_wq
);
3776 cancel_delayed_work(&priv
->ieee80211
->hw_sleep_wq
);
3777 cancel_delayed_work(&priv
->ieee80211
->hw_dig_wq
);
3778 cancel_delayed_work(&priv
->ieee80211
->tx_pw_wq
);
3779 del_timer_sync(&priv
->SwAntennaDiversityTimer
);
3780 ieee80211_softmac_stop_protocol(priv
->ieee80211
);
3781 rtl8180_irq_disable(dev
);
3782 rtl8180_rtx_disable(dev
);
3786 static void r8180_set_multicast(struct net_device
*dev
)
3788 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3791 promisc
= (dev
->flags
& IFF_PROMISC
) ? 1:0;
3793 if (promisc
!= priv
->promisc
)
3794 rtl8180_restart(dev
);
3796 priv
->promisc
= promisc
;
3799 int r8180_set_mac_adr(struct net_device
*dev
, void *mac
)
3801 struct r8180_priv
*priv
= ieee80211_priv(dev
);
3802 struct sockaddr
*addr
= mac
;
3804 down(&priv
->wx_sem
);
3806 memcpy(dev
->dev_addr
, addr
->sa_data
, ETH_ALEN
);
3808 if(priv
->ieee80211
->iw_mode
== IW_MODE_MASTER
)
3809 memcpy(priv
->ieee80211
->current_network
.bssid
, dev
->dev_addr
, ETH_ALEN
);
3821 /* based on ipw2200 driver */
3822 int rtl8180_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
)
3824 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
3825 struct iwreq
*wrq
= (struct iwreq
*) rq
;
3829 case RTL_IOCTL_WPA_SUPPLICANT
:
3830 ret
= ieee80211_wpa_supplicant_ioctl(priv
->ieee80211
, &wrq
->u
.data
);
3839 static const struct net_device_ops rtl8180_netdev_ops
= {
3840 .ndo_open
= rtl8180_open
,
3841 .ndo_stop
= rtl8180_close
,
3842 .ndo_get_stats
= rtl8180_stats
,
3843 .ndo_tx_timeout
= rtl8180_restart
,
3844 .ndo_do_ioctl
= rtl8180_ioctl
,
3845 .ndo_set_multicast_list
= r8180_set_multicast
,
3846 .ndo_set_mac_address
= r8180_set_mac_adr
,
3847 .ndo_validate_addr
= eth_validate_addr
,
3848 .ndo_change_mtu
= eth_change_mtu
,
3849 .ndo_start_xmit
= ieee80211_rtl_xmit
,
3852 static int __devinit
rtl8180_pci_probe(struct pci_dev
*pdev
,
3853 const struct pci_device_id
*id
)
3855 unsigned long ioaddr
= 0;
3856 struct net_device
*dev
= NULL
;
3857 struct r8180_priv
*priv
= NULL
;
3860 unsigned long pmem_start
, pmem_len
, pmem_flags
;
3862 DMESG("Configuring chip resources");
3864 if( pci_enable_device (pdev
) ){
3865 DMESG("Failed to enable PCI device");
3869 pci_set_master(pdev
);
3870 pci_set_dma_mask(pdev
, 0xffffff00ULL
);
3871 pci_set_consistent_dma_mask(pdev
,0xffffff00ULL
);
3872 dev
= alloc_ieee80211(sizeof(struct r8180_priv
));
3875 priv
= ieee80211_priv(dev
);
3876 priv
->ieee80211
= netdev_priv(dev
);
3878 pci_set_drvdata(pdev
, dev
);
3879 SET_NETDEV_DEV(dev
, &pdev
->dev
);
3881 priv
= ieee80211_priv(dev
);
3884 pmem_start
= pci_resource_start(pdev
, 1);
3885 pmem_len
= pci_resource_len(pdev
, 1);
3886 pmem_flags
= pci_resource_flags (pdev
, 1);
3888 if (!(pmem_flags
& IORESOURCE_MEM
)) {
3889 DMESG("region #1 not a MMIO resource, aborting");
3893 if( ! request_mem_region(pmem_start
, pmem_len
, RTL8180_MODULE_NAME
)) {
3894 DMESG("request_mem_region failed!");
3898 ioaddr
= (unsigned long)ioremap_nocache( pmem_start
, pmem_len
);
3899 if( ioaddr
== (unsigned long)NULL
){
3900 DMESG("ioremap failed!");
3904 dev
->mem_start
= ioaddr
; // shared mem start
3905 dev
->mem_end
= ioaddr
+ pci_resource_len(pdev
, 0); // shared mem end
3907 pci_read_config_byte(pdev
, 0x05, &unit
);
3908 pci_write_config_byte(pdev
, 0x05, unit
& (~0x04));
3910 dev
->irq
= pdev
->irq
;
3913 dev
->netdev_ops
= &rtl8180_netdev_ops
;
3914 dev
->wireless_handlers
= &r8180_wx_handlers_def
;
3916 dev
->type
=ARPHRD_ETHER
;
3917 dev
->watchdog_timeo
= HZ
*3; //added by david woo, 2007.12.13
3919 if (dev_alloc_name(dev
, ifname
) < 0){
3920 DMESG("Oops: devname already taken! Trying wlan%%d...\n");
3922 dev_alloc_name(dev
, ifname
);
3925 if(rtl8180_init(dev
)!=0){
3926 DMESG("Initialization failed");
3930 netif_carrier_off(dev
);
3932 register_netdev(dev
);
3934 rtl8180_proc_init_one(dev
);
3936 DMESG("Driver probe completed\n");
3939 if( dev
->mem_start
!= (unsigned long)NULL
){
3940 iounmap( (void *)dev
->mem_start
);
3941 release_mem_region( pci_resource_start(pdev
, 1),
3942 pci_resource_len(pdev
, 1) );
3947 free_irq(dev
->irq
, dev
);
3950 free_ieee80211(dev
);
3953 pci_disable_device(pdev
);
3955 DMESG("wlan driver load failed\n");
3956 pci_set_drvdata(pdev
, NULL
);
3960 static void __devexit
rtl8180_pci_remove(struct pci_dev
*pdev
)
3962 struct r8180_priv
*priv
;
3963 struct net_device
*dev
= pci_get_drvdata(pdev
);
3966 unregister_netdev(dev
);
3968 priv
= ieee80211_priv(dev
);
3970 rtl8180_proc_remove_one(dev
);
3972 priv
->rf_close(dev
);
3977 DMESG("Freeing irq %d",dev
->irq
);
3978 free_irq(dev
->irq
, dev
);
3982 free_rx_desc_ring(dev
);
3983 free_tx_desc_rings(dev
);
3985 if( dev
->mem_start
!= (unsigned long)NULL
){
3986 iounmap( (void *)dev
->mem_start
);
3987 release_mem_region( pci_resource_start(pdev
, 1),
3988 pci_resource_len(pdev
, 1) );
3991 free_ieee80211(dev
);
3993 pci_disable_device(pdev
);
3995 DMESG("wlan driver removed\n");
3998 /* fun with the built-in ieee80211 stack... */
3999 extern int ieee80211_crypto_init(void);
4000 extern void ieee80211_crypto_deinit(void);
4001 extern int ieee80211_crypto_tkip_init(void);
4002 extern void ieee80211_crypto_tkip_exit(void);
4003 extern int ieee80211_crypto_ccmp_init(void);
4004 extern void ieee80211_crypto_ccmp_exit(void);
4005 extern int ieee80211_crypto_wep_init(void);
4006 extern void ieee80211_crypto_wep_exit(void);
4008 static int __init
rtl8180_pci_module_init(void)
4012 ret
= ieee80211_crypto_init();
4014 printk(KERN_ERR
"ieee80211_crypto_init() failed %d\n", ret
);
4017 ret
= ieee80211_crypto_tkip_init();
4019 printk(KERN_ERR
"ieee80211_crypto_tkip_init() failed %d\n", ret
);
4022 ret
= ieee80211_crypto_ccmp_init();
4024 printk(KERN_ERR
"ieee80211_crypto_ccmp_init() failed %d\n", ret
);
4027 ret
= ieee80211_crypto_wep_init();
4029 printk(KERN_ERR
"ieee80211_crypto_wep_init() failed %d\n", ret
);
4033 printk(KERN_INFO
"\nLinux kernel driver for RTL8180 \
4034 / RTL8185 based WLAN cards\n");
4035 printk(KERN_INFO
"Copyright (c) 2004-2005, Andrea Merello\n");
4036 DMESG("Initializing module");
4037 DMESG("Wireless extensions version %d", WIRELESS_EXT
);
4038 rtl8180_proc_module_init();
4040 if (pci_register_driver(&rtl8180_pci_driver
)) {
4041 DMESG("No device found");
4047 static void __exit
rtl8180_pci_module_exit(void)
4049 pci_unregister_driver (&rtl8180_pci_driver
);
4050 rtl8180_proc_module_remove();
4051 ieee80211_crypto_tkip_exit();
4052 ieee80211_crypto_ccmp_exit();
4053 ieee80211_crypto_wep_exit();
4054 ieee80211_crypto_deinit();
4058 void rtl8180_try_wake_queue(struct net_device
*dev
, int pri
)
4060 unsigned long flags
;
4062 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
4064 spin_lock_irqsave(&priv
->tx_lock
,flags
);
4065 enough_desc
= check_nic_enought_desc(dev
,pri
);
4066 spin_unlock_irqrestore(&priv
->tx_lock
,flags
);
4069 ieee80211_rtl_wake_queue(priv
->ieee80211
);
4072 void rtl8180_tx_isr(struct net_device
*dev
, int pri
,short error
)
4074 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
4075 u32
*tail
; //tail virtual addr
4076 u32
*head
; //head virtual addr
4077 u32
*begin
;//start of ring virtual addr
4078 u32
*nicv
; //nic pointer virtual addr
4079 u32 nic
; //nic pointer physical addr
4080 u32 nicbegin
;// start of ring physical addr
4082 /* physical addr are ok on 32 bits since we set DMA mask*/
4086 if (error
) priv
->stats
.txretry
++; //tony 20060601
4087 spin_lock_irqsave(&priv
->tx_lock
,flag
);
4089 case MANAGE_PRIORITY
:
4090 tail
= priv
->txmapringtail
;
4091 begin
= priv
->txmapring
;
4092 head
= priv
->txmapringhead
;
4093 nic
= read_nic_dword(dev
,TX_MANAGEPRIORITY_RING_ADDR
);
4094 nicbegin
= priv
->txmapringdma
;
4097 tail
= priv
->txbkpringtail
;
4098 begin
= priv
->txbkpring
;
4099 head
= priv
->txbkpringhead
;
4100 nic
= read_nic_dword(dev
,TX_BKPRIORITY_RING_ADDR
);
4101 nicbegin
= priv
->txbkpringdma
;
4104 tail
= priv
->txbepringtail
;
4105 begin
= priv
->txbepring
;
4106 head
= priv
->txbepringhead
;
4107 nic
= read_nic_dword(dev
,TX_BEPRIORITY_RING_ADDR
);
4108 nicbegin
= priv
->txbepringdma
;
4111 tail
= priv
->txvipringtail
;
4112 begin
= priv
->txvipring
;
4113 head
= priv
->txvipringhead
;
4114 nic
= read_nic_dword(dev
,TX_VIPRIORITY_RING_ADDR
);
4115 nicbegin
= priv
->txvipringdma
;
4118 tail
= priv
->txvopringtail
;
4119 begin
= priv
->txvopring
;
4120 head
= priv
->txvopringhead
;
4121 nic
= read_nic_dword(dev
,TX_VOPRIORITY_RING_ADDR
);
4122 nicbegin
= priv
->txvopringdma
;
4125 tail
= priv
->txhpringtail
;
4126 begin
= priv
->txhpring
;
4127 head
= priv
->txhpringhead
;
4128 nic
= read_nic_dword(dev
,TX_HIGHPRIORITY_RING_ADDR
);
4129 nicbegin
= priv
->txhpringdma
;
4133 spin_unlock_irqrestore(&priv
->tx_lock
,flag
);
4137 nicv
= (u32
*) ((nic
- nicbegin
) + (u8
*)begin
);
4138 if((head
<= tail
&& (nicv
> tail
|| nicv
< head
)) ||
4139 (head
> tail
&& (nicv
> tail
&& nicv
< head
))){
4140 DMESGW("nic has lost pointer");
4141 spin_unlock_irqrestore(&priv
->tx_lock
,flag
);
4142 rtl8180_restart(dev
);
4146 /* we check all the descriptors between the head and the nic,
4147 * but not the currenly pointed by the nic (the next to be txed)
4148 * and the previous of the pointed (might be in process ??)
4150 offs
= (nic
- nicbegin
);
4152 hd
= (head
- begin
) /8;
4157 j
= offs
+ (priv
->txringcount
-1 -hd
);
4164 if((*head
) & (1<<31))
4166 if(((*head
)&(0x10000000)) != 0){
4167 priv
->CurrRetryCnt
+= (u16
)((*head
) & (0x000000ff));
4169 priv
->NumTxOkTotal
++;
4173 priv
->NumTxOkBytesTotal
+= (*(head
+3)) & (0x00000fff);
4175 *head
= *head
&~ (1<<31);
4177 if((head
- begin
)/8 == priv
->txringcount
-1)
4183 /* the head has been moved to the last certainly TXed
4184 * (or at least processed by the nic) packet.
4185 * The driver take forcefully owning of all these packets
4186 * If the packet previous of the nic pointer has been
4187 * processed this doesn't matter: it will be checked
4188 * here at the next round. Anyway if no more packet are
4189 * TXed no memory leak occour at all.
4193 case MANAGE_PRIORITY
:
4194 priv
->txmapringhead
= head
;
4196 if(priv
->ack_tx_to_ieee
){
4197 if(rtl8180_is_tx_queue_empty(dev
)){
4198 priv
->ack_tx_to_ieee
= 0;
4199 ieee80211_ps_tx_ack(priv
->ieee80211
,!error
);
4204 priv
->txbkpringhead
= head
;
4207 priv
->txbepringhead
= head
;
4210 priv
->txvipringhead
= head
;
4213 priv
->txvopringhead
= head
;
4216 priv
->txhpringhead
= head
;
4220 spin_unlock_irqrestore(&priv
->tx_lock
,flag
);
4223 void rtl8180_tx_irq_wq(struct work_struct
*work
)
4225 struct delayed_work
*dwork
= to_delayed_work(work
);
4226 struct ieee80211_device
* ieee
= (struct ieee80211_device
*)
4227 container_of(dwork
, struct ieee80211_device
, watch_dog_wq
);
4228 struct net_device
*dev
= ieee
->dev
;
4230 rtl8180_tx_isr(dev
,MANAGE_PRIORITY
,0);
4232 irqreturn_t
rtl8180_interrupt(int irq
, void *netdev
, struct pt_regs
*regs
)
4234 struct net_device
*dev
= (struct net_device
*) netdev
;
4235 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
4236 unsigned long flags
;
4239 /* We should return IRQ_NONE, but for now let me keep this */
4240 if(priv
->irq_enabled
== 0) return IRQ_HANDLED
;
4242 spin_lock_irqsave(&priv
->irq_th_lock
,flags
);
4245 inta
= read_nic_dword(dev
, ISR
);// & priv->IntrMask;
4246 write_nic_dword(dev
,ISR
,inta
); // reset int situation
4248 priv
->stats
.shints
++;
4251 spin_unlock_irqrestore(&priv
->irq_th_lock
,flags
);
4254 most probably we can safely return IRQ_NONE,
4255 but for now is better to avoid problems
4259 if (inta
== 0xffff) {
4261 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
4267 if(!netif_running(dev
)) {
4268 spin_unlock_irqrestore(&priv
->irq_th_lock
,flags
);
4272 if (inta
& ISR_TimeOut
)
4273 write_nic_dword(dev
, TimerInt
, 0);
4275 if (inta
& ISR_TBDOK
)
4276 priv
->stats
.txbeacon
++;
4278 if (inta
& ISR_TBDER
)
4279 priv
->stats
.txbeaconerr
++;
4281 if (inta
& IMR_TMGDOK
)
4282 rtl8180_tx_isr(dev
,MANAGE_PRIORITY
,0);
4284 if(inta
& ISR_THPDER
){
4285 priv
->stats
.txhperr
++;
4286 rtl8180_tx_isr(dev
,HI_PRIORITY
,1);
4287 priv
->ieee80211
->stats
.tx_errors
++;
4290 if(inta
& ISR_THPDOK
){ //High priority tx ok
4291 priv
->link_detect
.NumTxOkInPeriod
++; //YJ,add,080828
4292 priv
->stats
.txhpokint
++;
4293 rtl8180_tx_isr(dev
,HI_PRIORITY
,0);
4296 if(inta
& ISR_RER
) {
4297 priv
->stats
.rxerr
++;
4299 if(inta
& ISR_TBKDER
){ //corresponding to BK_PRIORITY
4300 priv
->stats
.txbkperr
++;
4301 priv
->ieee80211
->stats
.tx_errors
++;
4302 rtl8180_tx_isr(dev
,BK_PRIORITY
,1);
4303 rtl8180_try_wake_queue(dev
, BE_PRIORITY
);
4306 if(inta
& ISR_TBEDER
){ //corresponding to BE_PRIORITY
4307 priv
->stats
.txbeperr
++;
4308 priv
->ieee80211
->stats
.tx_errors
++;
4309 rtl8180_tx_isr(dev
,BE_PRIORITY
,1);
4310 rtl8180_try_wake_queue(dev
, BE_PRIORITY
);
4312 if(inta
& ISR_TNPDER
){ //corresponding to VO_PRIORITY
4313 priv
->stats
.txnperr
++;
4314 priv
->ieee80211
->stats
.tx_errors
++;
4315 rtl8180_tx_isr(dev
,NORM_PRIORITY
,1);
4316 rtl8180_try_wake_queue(dev
, NORM_PRIORITY
);
4319 if(inta
& ISR_TLPDER
){ //corresponding to VI_PRIORITY
4320 priv
->stats
.txlperr
++;
4321 priv
->ieee80211
->stats
.tx_errors
++;
4322 rtl8180_tx_isr(dev
,LOW_PRIORITY
,1);
4323 rtl8180_try_wake_queue(dev
, LOW_PRIORITY
);
4327 priv
->stats
.rxint
++;
4328 tasklet_schedule(&priv
->irq_rx_tasklet
);
4331 if(inta
& ISR_RQoSOK
){
4332 priv
->stats
.rxint
++;
4333 tasklet_schedule(&priv
->irq_rx_tasklet
);
4335 if(inta
& ISR_BcnInt
) {
4336 rtl8180_prepare_beacon(dev
);
4340 DMESGW("No RX descriptor available");
4341 priv
->stats
.rxrdu
++;
4342 tasklet_schedule(&priv
->irq_rx_tasklet
);
4345 if(inta
& ISR_RXFOVW
){
4346 priv
->stats
.rxoverflow
++;
4347 tasklet_schedule(&priv
->irq_rx_tasklet
);
4350 if (inta
& ISR_TXFOVW
)
4351 priv
->stats
.txoverflow
++;
4353 if(inta
& ISR_TNPDOK
){ //Normal priority tx ok
4354 priv
->link_detect
.NumTxOkInPeriod
++; //YJ,add,080828
4355 priv
->stats
.txnpokint
++;
4356 rtl8180_tx_isr(dev
,NORM_PRIORITY
,0);
4359 if(inta
& ISR_TLPDOK
){ //Low priority tx ok
4360 priv
->link_detect
.NumTxOkInPeriod
++; //YJ,add,080828
4361 priv
->stats
.txlpokint
++;
4362 rtl8180_tx_isr(dev
,LOW_PRIORITY
,0);
4363 rtl8180_try_wake_queue(dev
, LOW_PRIORITY
);
4366 if(inta
& ISR_TBKDOK
){ //corresponding to BK_PRIORITY
4367 priv
->stats
.txbkpokint
++;
4368 priv
->link_detect
.NumTxOkInPeriod
++; //YJ,add,080828
4369 rtl8180_tx_isr(dev
,BK_PRIORITY
,0);
4370 rtl8180_try_wake_queue(dev
, BE_PRIORITY
);
4373 if(inta
& ISR_TBEDOK
){ //corresponding to BE_PRIORITY
4374 priv
->stats
.txbeperr
++;
4375 priv
->link_detect
.NumTxOkInPeriod
++; //YJ,add,080828
4376 rtl8180_tx_isr(dev
,BE_PRIORITY
,0);
4377 rtl8180_try_wake_queue(dev
, BE_PRIORITY
);
4379 force_pci_posting(dev
);
4380 spin_unlock_irqrestore(&priv
->irq_th_lock
,flags
);
4385 void rtl8180_irq_rx_tasklet(struct r8180_priv
* priv
)
4387 rtl8180_rx(priv
->dev
);
4390 void GPIOChangeRFWorkItemCallBack(struct work_struct
*work
)
4392 struct ieee80211_device
*ieee
= container_of(work
, struct ieee80211_device
, GPIOChangeRFWorkItem
.work
);
4393 struct net_device
*dev
= ieee
->dev
;
4394 struct r8180_priv
*priv
= ieee80211_priv(dev
);
4397 RT_RF_POWER_STATE eRfPowerStateToSet
;
4398 bool bActuallySet
=false;
4401 static char *RadioPowerPath
= "/etc/acpi/events/RadioPower.sh";
4402 static char *envp
[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL
};
4403 static int readf_count
= 0;
4406 if(readf_count
% 10 == 0)
4407 priv
->PowerProfile
= read_acadapter_file("/proc/acpi/ac_adapter/AC0/state");
4409 readf_count
= (readf_count
+1)%0xffff;
4412 // We should turn off LED before polling FF51[4].
4415 btPSR
= read_nic_byte(dev
, PSR
);
4416 write_nic_byte(dev
, PSR
, (btPSR
& ~BIT3
));
4418 //It need to delay 4us suggested by Jong, 2008-01-16
4421 //HW radio On/Off according to the value of FF51[4](config0)
4422 btConfig0
= btPSR
= read_nic_byte(dev
, CONFIG0
);
4425 write_nic_byte(dev
, PSR
, btPSR
| BIT3
);
4427 eRfPowerStateToSet
= (btConfig0
& BIT4
) ? eRfOn
: eRfOff
;
4429 if((priv
->ieee80211
->bHwRadioOff
== true) && (eRfPowerStateToSet
== eRfOn
))
4431 priv
->ieee80211
->bHwRadioOff
= false;
4432 bActuallySet
= true;
4434 else if((priv
->ieee80211
->bHwRadioOff
== false) && (eRfPowerStateToSet
== eRfOff
))
4436 priv
->ieee80211
->bHwRadioOff
= true;
4437 bActuallySet
= true;
4442 MgntActSet_RF_State(dev
, eRfPowerStateToSet
, RF_CHANGE_BY_HW
);
4444 /* To update the UI status for Power status changed */
4445 if(priv
->ieee80211
->bHwRadioOff
== true)
4448 //if(!priv->RfOffReason)
4451 // argv[1] = "RFOFF";
4453 argv
[0] = RadioPowerPath
;
4456 call_usermodehelper(RadioPowerPath
,argv
,envp
,1);
4461 static u8
read_acadapter_file(char *filename
)
4466 module_init(rtl8180_pci_module_init
);
4467 module_exit(rtl8180_pci_module_exit
);