2 This is part of rtl818x pci OpenSource driver - v 0.1
3 Copyright (C) Andrea Merello 2004-2005 <andrea.merello@gmail.com>
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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32 #undef RX_DONT_PASS_UL
35 #include <linux/slab.h>
36 #include <linux/syscalls.h>
37 #include <linux/eeprom_93cx6.h>
38 #include <linux/interrupt.h>
39 #include <linux/proc_fs.h>
40 #include <linux/seq_file.h>
44 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
45 #include "r8180_93cx6.h" /* Card EEPROM */
49 #include "ieee80211/dot11d.h"
51 static struct pci_device_id rtl8180_pci_id_tbl[] = {
53 .vendor = PCI_VENDOR_ID_REALTEK,
55 .subvendor = PCI_ANY_ID,
56 .subdevice = PCI_ANY_ID,
68 static char ifname[IFNAMSIZ] = "wlan%d";
71 MODULE_LICENSE("GPL");
72 MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl);
73 MODULE_AUTHOR("Andrea Merello <andrea.merello@gmail.com>");
74 MODULE_DESCRIPTION("Linux driver for Realtek RTL8187SE WiFi cards");
76 module_param_string(ifname, ifname, sizeof(ifname), S_IRUGO|S_IWUSR);
77 module_param(hwwep, int, S_IRUGO|S_IWUSR);
79 MODULE_PARM_DESC(hwwep, " Try to use hardware WEP support. Still broken and not available on all cards");
81 static int rtl8180_pci_probe(struct pci_dev *pdev,
82 const struct pci_device_id *id);
84 static void rtl8180_pci_remove(struct pci_dev *pdev);
86 static void rtl8180_shutdown(struct pci_dev *pdev)
88 struct net_device *dev = pci_get_drvdata(pdev);
89 if (dev->netdev_ops->ndo_stop)
90 dev->netdev_ops->ndo_stop(dev);
91 pci_disable_device(pdev);
94 static int rtl8180_suspend(struct pci_dev *pdev, pm_message_t state)
96 struct net_device *dev = pci_get_drvdata(pdev);
98 if (!netif_running(dev))
101 if (dev->netdev_ops->ndo_stop)
102 dev->netdev_ops->ndo_stop(dev);
104 netif_device_detach(dev);
107 pci_save_state(pdev);
108 pci_disable_device(pdev);
109 pci_set_power_state(pdev, pci_choose_state(pdev, state));
113 static int rtl8180_resume(struct pci_dev *pdev)
115 struct net_device *dev = pci_get_drvdata(pdev);
119 pci_set_power_state(pdev, PCI_D0);
121 err = pci_enable_device(pdev);
123 dev_err(&pdev->dev, "pci_enable_device failed on resume\n");
128 pci_restore_state(pdev);
131 * Suspend/Resume resets the PCI configuration space, so we have to
132 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
133 * from interfering with C3 CPU state. pci_restore_state won't help
134 * here since it only restores the first 64 bytes pci config header.
136 pci_read_config_dword(pdev, 0x40, &val);
137 if ((val & 0x0000ff00) != 0)
138 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
140 if (!netif_running(dev))
143 if (dev->netdev_ops->ndo_open)
144 dev->netdev_ops->ndo_open(dev);
146 netif_device_attach(dev);
151 static struct pci_driver rtl8180_pci_driver = {
152 .name = RTL8180_MODULE_NAME,
153 .id_table = rtl8180_pci_id_tbl,
154 .probe = rtl8180_pci_probe,
155 .remove = rtl8180_pci_remove,
156 .suspend = rtl8180_suspend,
157 .resume = rtl8180_resume,
158 .shutdown = rtl8180_shutdown,
161 u8 read_nic_byte(struct net_device *dev, int x)
163 return 0xff&readb((u8 __iomem *)dev->mem_start + x);
166 u32 read_nic_dword(struct net_device *dev, int x)
168 return readl((u8 __iomem *)dev->mem_start + x);
171 u16 read_nic_word(struct net_device *dev, int x)
173 return readw((u8 __iomem *)dev->mem_start + x);
176 void write_nic_byte(struct net_device *dev, int x, u8 y)
178 writeb(y, (u8 __iomem *)dev->mem_start + x);
182 void write_nic_dword(struct net_device *dev, int x, u32 y)
184 writel(y, (u8 __iomem *)dev->mem_start + x);
188 void write_nic_word(struct net_device *dev, int x, u16 y)
190 writew(y, (u8 __iomem *)dev->mem_start + x);
194 inline void force_pci_posting(struct net_device *dev)
196 read_nic_byte(dev, EPROM_CMD);
200 static irqreturn_t rtl8180_interrupt(int irq, void *netdev);
201 void set_nic_rxring(struct net_device *dev);
202 void set_nic_txring(struct net_device *dev);
203 static struct net_device_stats *rtl8180_stats(struct net_device *dev);
204 void rtl8180_commit(struct net_device *dev);
205 void rtl8180_start_tx_beacon(struct net_device *dev);
207 static struct proc_dir_entry *rtl8180_proc;
209 static int proc_get_registers(struct seq_file *m, void *v)
211 struct net_device *dev = m->private;
212 int i, n, max = 0xff;
214 /* This dump the current register page */
215 for (n = 0; n <= max;) {
216 seq_printf(m, "\nD: %2x > ", n);
218 for (i = 0; i < 16 && n <= max; i++, n++)
219 seq_printf(m, "%2x ", read_nic_byte(dev, n));
225 int get_curr_tx_free_desc(struct net_device *dev, int priority);
227 static int proc_get_stats_hw(struct seq_file *m, void *v)
232 static int proc_get_stats_rx(struct seq_file *m, void *v)
234 struct net_device *dev = m->private;
235 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
240 "RX CRC Error(0-500): %lu\n"
241 "RX CRC Error(500-1000): %lu\n"
242 "RX CRC Error(>1000): %lu\n"
243 "RX ICV Error: %lu\n",
246 priv->stats.rxcrcerrmin,
247 priv->stats.rxcrcerrmid,
248 priv->stats.rxcrcerrmax,
255 static int proc_get_stats_tx(struct seq_file *m, void *v)
257 struct net_device *dev = m->private;
258 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
259 unsigned long totalOK;
261 totalOK = priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint;
266 "TX beacon OK: %lu\n"
267 "TX beacon error: %lu\n",
269 priv->stats.txnperr+priv->stats.txhperr+priv->stats.txlperr,
271 priv->stats.txbeacon,
272 priv->stats.txbeaconerr
278 static void rtl8180_proc_module_init(void)
280 DMESG("Initializing proc filesystem");
281 rtl8180_proc = proc_mkdir(RTL8180_MODULE_NAME, init_net.proc_net);
284 static void rtl8180_proc_module_remove(void)
286 remove_proc_entry(RTL8180_MODULE_NAME, init_net.proc_net);
289 static void rtl8180_proc_remove_one(struct net_device *dev)
291 remove_proc_subtree(dev->name, rtl8180_proc);
295 * seq_file wrappers for procfile show routines.
297 static int rtl8180_proc_open(struct inode *inode, struct file *file)
299 struct net_device *dev = proc_get_parent_data(inode);
300 int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
302 return single_open(file, show, dev);
305 static const struct file_operations rtl8180_proc_fops = {
306 .open = rtl8180_proc_open,
309 .release = single_release,
313 * Table of proc files we need to create.
315 struct rtl8180_proc_file {
317 int (*show)(struct seq_file *, void *);
320 static const struct rtl8180_proc_file rtl8180_proc_files[] = {
321 { "stats-hw", &proc_get_stats_hw },
322 { "stats-rx", &proc_get_stats_rx },
323 { "stats-tx", &proc_get_stats_tx },
324 { "registers", &proc_get_registers },
328 static void rtl8180_proc_init_one(struct net_device *dev)
330 const struct rtl8180_proc_file *f;
331 struct proc_dir_entry *dir;
333 dir = proc_mkdir_data(dev->name, 0, rtl8180_proc, dev);
335 DMESGE("Unable to initialize /proc/net/r8180/%s\n", dev->name);
339 for (f = rtl8180_proc_files; f->name[0]; f++) {
340 if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir,
341 &rtl8180_proc_fops, f->show)) {
342 DMESGE("Unable to initialize /proc/net/r8180/%s/%s\n",
350 FIXME: check if we can use some standard already-existent
351 data type+functions in kernel
354 static short buffer_add(struct buffer **buffer, u32 *buf, dma_addr_t dma,
355 struct buffer **bufferhead)
361 *buffer = kmalloc(sizeof(struct buffer), GFP_KERNEL);
363 if (*buffer == NULL) {
364 DMESGE("Failed to kmalloc head of TX/RX struct");
367 (*buffer)->next = *buffer;
368 (*buffer)->buf = buf;
369 (*buffer)->dma = dma;
370 if (bufferhead != NULL)
371 (*bufferhead) = (*buffer);
376 while (tmp->next != (*buffer))
378 tmp->next = kmalloc(sizeof(struct buffer), GFP_KERNEL);
379 if (tmp->next == NULL) {
380 DMESGE("Failed to kmalloc TX/RX struct");
383 tmp->next->buf = buf;
384 tmp->next->dma = dma;
385 tmp->next->next = *buffer;
390 void buffer_free(struct net_device *dev, struct buffer **buffer, int len, short consistent)
393 struct buffer *tmp, *next;
394 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
395 struct pci_dev *pdev = priv->pdev;
405 pci_free_consistent(pdev, len,
408 pci_unmap_single(pdev, tmp->dma,
409 len, PCI_DMA_FROMDEVICE);
414 } while (next != *buffer);
419 int get_curr_tx_free_desc(struct net_device *dev, int priority)
421 struct r8180_priv *priv = ieee80211_priv(dev);
427 case MANAGE_PRIORITY:
428 head = priv->txmapringhead;
429 tail = priv->txmapringtail;
432 head = priv->txbkpringhead;
433 tail = priv->txbkpringtail;
436 head = priv->txbepringhead;
437 tail = priv->txbepringtail;
440 head = priv->txvipringhead;
441 tail = priv->txvipringtail;
444 head = priv->txvopringhead;
445 tail = priv->txvopringtail;
448 head = priv->txhpringhead;
449 tail = priv->txhpringtail;
456 ret = priv->txringcount - (tail - head)/8;
458 ret = (head - tail)/8;
460 if (ret > priv->txringcount)
466 static short check_nic_enought_desc(struct net_device *dev, int priority)
468 struct r8180_priv *priv = ieee80211_priv(dev);
469 struct ieee80211_device *ieee = netdev_priv(dev);
470 int requiredbyte, required;
472 requiredbyte = priv->ieee80211->fts + sizeof(struct ieee80211_header_data);
474 if (ieee->current_network.QoS_Enable)
477 required = requiredbyte / (priv->txbuffsize-4);
479 if (requiredbyte % priv->txbuffsize)
482 /* for now we keep two free descriptor as a safety boundary
483 * between the tail and the head
486 return (required+2 < get_curr_tx_free_desc(dev, priority));
489 void fix_tx_fifo(struct net_device *dev)
491 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
495 for (tmp = priv->txmapring, i = 0;
496 i < priv->txringcount;
498 *tmp = *tmp & ~(1<<31);
501 for (tmp = priv->txbkpring, i = 0;
502 i < priv->txringcount;
504 *tmp = *tmp & ~(1<<31);
507 for (tmp = priv->txbepring, i = 0;
508 i < priv->txringcount;
510 *tmp = *tmp & ~(1<<31);
512 for (tmp = priv->txvipring, i = 0;
513 i < priv->txringcount;
515 *tmp = *tmp & ~(1<<31);
518 for (tmp = priv->txvopring, i = 0;
519 i < priv->txringcount;
521 *tmp = *tmp & ~(1<<31);
524 for (tmp = priv->txhpring, i = 0;
525 i < priv->txringcount;
527 *tmp = *tmp & ~(1<<31);
530 for (tmp = priv->txbeaconring, i = 0;
531 i < priv->txbeaconcount;
533 *tmp = *tmp & ~(1<<31);
536 priv->txmapringtail = priv->txmapring;
537 priv->txmapringhead = priv->txmapring;
538 priv->txmapbufstail = priv->txmapbufs;
540 priv->txbkpringtail = priv->txbkpring;
541 priv->txbkpringhead = priv->txbkpring;
542 priv->txbkpbufstail = priv->txbkpbufs;
544 priv->txbepringtail = priv->txbepring;
545 priv->txbepringhead = priv->txbepring;
546 priv->txbepbufstail = priv->txbepbufs;
548 priv->txvipringtail = priv->txvipring;
549 priv->txvipringhead = priv->txvipring;
550 priv->txvipbufstail = priv->txvipbufs;
552 priv->txvopringtail = priv->txvopring;
553 priv->txvopringhead = priv->txvopring;
554 priv->txvopbufstail = priv->txvopbufs;
556 priv->txhpringtail = priv->txhpring;
557 priv->txhpringhead = priv->txhpring;
558 priv->txhpbufstail = priv->txhpbufs;
560 priv->txbeaconringtail = priv->txbeaconring;
561 priv->txbeaconbufstail = priv->txbeaconbufs;
564 ieee80211_reset_queue(priv->ieee80211);
565 priv->ack_tx_to_ieee = 0;
568 void fix_rx_fifo(struct net_device *dev)
570 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
572 struct buffer *rxbuf;
575 rx_desc_size = 8; /* 4*8 = 32 bytes */
577 for (tmp = priv->rxring, rxbuf = priv->rxbufferhead;
578 (tmp < (priv->rxring)+(priv->rxringcount)*rx_desc_size);
579 tmp += rx_desc_size, rxbuf = rxbuf->next) {
580 *(tmp+2) = rxbuf->dma;
581 *tmp = *tmp & ~0xfff;
582 *tmp = *tmp | priv->rxbuffersize;
586 priv->rxringtail = priv->rxring;
587 priv->rxbuffer = priv->rxbufferhead;
588 priv->rx_skb_complete = 1;
592 static void rtl8180_irq_disable(struct net_device *dev)
594 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
596 write_nic_dword(dev, IMR, 0);
597 force_pci_posting(dev);
598 priv->irq_enabled = 0;
601 void rtl8180_set_mode(struct net_device *dev, int mode)
605 ecmd = read_nic_byte(dev, EPROM_CMD);
606 ecmd = ecmd & ~EPROM_CMD_OPERATING_MODE_MASK;
607 ecmd = ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
608 ecmd = ecmd & ~(1<<EPROM_CS_SHIFT);
609 ecmd = ecmd & ~(1<<EPROM_CK_SHIFT);
610 write_nic_byte(dev, EPROM_CMD, ecmd);
613 void rtl8180_beacon_tx_enable(struct net_device *dev);
615 void rtl8180_update_msr(struct net_device *dev)
617 struct r8180_priv *priv = ieee80211_priv(dev);
621 msr = read_nic_byte(dev, MSR);
622 msr &= ~MSR_LINK_MASK;
624 rxconf = read_nic_dword(dev, RX_CONF);
626 if (priv->ieee80211->state == IEEE80211_LINKED) {
627 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
628 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
629 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
630 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
631 else if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
632 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
634 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
635 rxconf |= (1<<RX_CHECK_BSSID_SHIFT);
638 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
639 rxconf &= ~(1<<RX_CHECK_BSSID_SHIFT);
642 write_nic_byte(dev, MSR, msr);
643 write_nic_dword(dev, RX_CONF, rxconf);
646 void rtl8180_set_chan(struct net_device *dev, short ch)
648 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
650 if ((ch > 14) || (ch < 1)) {
651 printk("In %s: Invalid chnanel %d\n", __func__, ch);
656 priv->rf_set_chan(dev, priv->chan);
659 void set_nic_txring(struct net_device *dev)
661 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
663 write_nic_dword(dev, TX_MANAGEPRIORITY_RING_ADDR, priv->txmapringdma);
664 write_nic_dword(dev, TX_BKPRIORITY_RING_ADDR, priv->txbkpringdma);
665 write_nic_dword(dev, TX_BEPRIORITY_RING_ADDR, priv->txbepringdma);
666 write_nic_dword(dev, TX_VIPRIORITY_RING_ADDR, priv->txvipringdma);
667 write_nic_dword(dev, TX_VOPRIORITY_RING_ADDR, priv->txvopringdma);
668 write_nic_dword(dev, TX_HIGHPRIORITY_RING_ADDR, priv->txhpringdma);
669 write_nic_dword(dev, TX_BEACON_RING_ADDR, priv->txbeaconringdma);
672 void rtl8180_beacon_tx_enable(struct net_device *dev)
674 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
676 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
677 priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_BQ);
678 write_nic_byte(dev, TPPollStop, priv->dma_poll_mask);
679 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
682 void rtl8180_beacon_tx_disable(struct net_device *dev)
684 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
686 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
687 priv->dma_poll_stop_mask |= TPPOLLSTOP_BQ;
688 write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
689 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
693 void rtl8180_rtx_disable(struct net_device *dev)
696 struct r8180_priv *priv = ieee80211_priv(dev);
698 cmd = read_nic_byte(dev, CMD);
699 write_nic_byte(dev, CMD, cmd &
700 ~((1<<CMD_RX_ENABLE_SHIFT)|(1<<CMD_TX_ENABLE_SHIFT)));
701 force_pci_posting(dev);
704 if (!priv->rx_skb_complete)
705 dev_kfree_skb_any(priv->rx_skb);
708 static short alloc_tx_desc_ring(struct net_device *dev, int bufsize, int count,
714 dma_addr_t dma_desc, dma_tmp;
715 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
716 struct pci_dev *pdev = priv->pdev;
719 if ((bufsize & 0xfff) != bufsize) {
720 DMESGE("TX buffer allocation too large");
723 desc = (u32 *)pci_alloc_consistent(pdev,
724 sizeof(u32)*8*count+256, &dma_desc);
730 * descriptor's buffer must be 256 byte aligned
731 * we shouldn't be here, since we set DMA mask !
733 WARN(1, "DMA buffer is not aligned\n");
737 for (i = 0; i < count; i++) {
738 buf = (void *)pci_alloc_consistent(pdev, bufsize, &dma_tmp);
743 case TX_MANAGEPRIORITY_RING_ADDR:
744 if (-1 == buffer_add(&(priv->txmapbufs), buf, dma_tmp, NULL)) {
745 DMESGE("Unable to allocate mem for buffer NP");
749 case TX_BKPRIORITY_RING_ADDR:
750 if (-1 == buffer_add(&(priv->txbkpbufs), buf, dma_tmp, NULL)) {
751 DMESGE("Unable to allocate mem for buffer LP");
755 case TX_BEPRIORITY_RING_ADDR:
756 if (-1 == buffer_add(&(priv->txbepbufs), buf, dma_tmp, NULL)) {
757 DMESGE("Unable to allocate mem for buffer NP");
761 case TX_VIPRIORITY_RING_ADDR:
762 if (-1 == buffer_add(&(priv->txvipbufs), buf, dma_tmp, NULL)) {
763 DMESGE("Unable to allocate mem for buffer LP");
767 case TX_VOPRIORITY_RING_ADDR:
768 if (-1 == buffer_add(&(priv->txvopbufs), buf, dma_tmp, NULL)) {
769 DMESGE("Unable to allocate mem for buffer NP");
773 case TX_HIGHPRIORITY_RING_ADDR:
774 if (-1 == buffer_add(&(priv->txhpbufs), buf, dma_tmp, NULL)) {
775 DMESGE("Unable to allocate mem for buffer HP");
779 case TX_BEACON_RING_ADDR:
780 if (-1 == buffer_add(&(priv->txbeaconbufs), buf, dma_tmp, NULL)) {
781 DMESGE("Unable to allocate mem for buffer BP");
786 *tmp = *tmp & ~(1<<31); /* descriptor empty, owned by the drv */
787 *(tmp+2) = (u32)dma_tmp;
791 *(tmp+4) = (u32)dma_desc+((i+1)*8*4);
793 *(tmp+4) = (u32)dma_desc;
799 case TX_MANAGEPRIORITY_RING_ADDR:
800 priv->txmapringdma = dma_desc;
801 priv->txmapring = desc;
803 case TX_BKPRIORITY_RING_ADDR:
804 priv->txbkpringdma = dma_desc;
805 priv->txbkpring = desc;
807 case TX_BEPRIORITY_RING_ADDR:
808 priv->txbepringdma = dma_desc;
809 priv->txbepring = desc;
811 case TX_VIPRIORITY_RING_ADDR:
812 priv->txvipringdma = dma_desc;
813 priv->txvipring = desc;
815 case TX_VOPRIORITY_RING_ADDR:
816 priv->txvopringdma = dma_desc;
817 priv->txvopring = desc;
819 case TX_HIGHPRIORITY_RING_ADDR:
820 priv->txhpringdma = dma_desc;
821 priv->txhpring = desc;
823 case TX_BEACON_RING_ADDR:
824 priv->txbeaconringdma = dma_desc;
825 priv->txbeaconring = desc;
833 static void free_tx_desc_rings(struct net_device *dev)
835 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
836 struct pci_dev *pdev = priv->pdev;
837 int count = priv->txringcount;
839 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
840 priv->txmapring, priv->txmapringdma);
841 buffer_free(dev, &(priv->txmapbufs), priv->txbuffsize, 1);
843 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
844 priv->txbkpring, priv->txbkpringdma);
845 buffer_free(dev, &(priv->txbkpbufs), priv->txbuffsize, 1);
847 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
848 priv->txbepring, priv->txbepringdma);
849 buffer_free(dev, &(priv->txbepbufs), priv->txbuffsize, 1);
851 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
852 priv->txvipring, priv->txvipringdma);
853 buffer_free(dev, &(priv->txvipbufs), priv->txbuffsize, 1);
855 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
856 priv->txvopring, priv->txvopringdma);
857 buffer_free(dev, &(priv->txvopbufs), priv->txbuffsize, 1);
859 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
860 priv->txhpring, priv->txhpringdma);
861 buffer_free(dev, &(priv->txhpbufs), priv->txbuffsize, 1);
863 count = priv->txbeaconcount;
864 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
865 priv->txbeaconring, priv->txbeaconringdma);
866 buffer_free(dev, &(priv->txbeaconbufs), priv->txbuffsize, 1);
869 static void free_rx_desc_ring(struct net_device *dev)
871 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
872 struct pci_dev *pdev = priv->pdev;
873 int count = priv->rxringcount;
875 pci_free_consistent(pdev, sizeof(u32)*8*count+256,
876 priv->rxring, priv->rxringdma);
878 buffer_free(dev, &(priv->rxbuffer), priv->rxbuffersize, 0);
881 static short alloc_rx_desc_ring(struct net_device *dev, u16 bufsize, int count)
886 dma_addr_t dma_desc, dma_tmp;
887 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
888 struct pci_dev *pdev = priv->pdev;
892 rx_desc_size = 8; /* 4*8 = 32 bytes */
894 if ((bufsize & 0xfff) != bufsize) {
895 DMESGE("RX buffer allocation too large");
899 desc = (u32 *)pci_alloc_consistent(pdev, sizeof(u32)*rx_desc_size*count+256,
904 * descriptor's buffer must be 256 byte aligned
905 * should never happen since we specify the DMA mask
907 WARN(1, "DMA buffer is not aligned\n");
910 priv->rxringdma = dma_desc;
913 for (i = 0; i < count; i++) {
914 buf = kmalloc(bufsize * sizeof(u8), GFP_ATOMIC);
916 DMESGE("Failed to kmalloc RX buffer");
920 dma_tmp = pci_map_single(pdev, buf, bufsize * sizeof(u8),
922 if (pci_dma_mapping_error(pdev, dma_tmp))
924 if (-1 == buffer_add(&(priv->rxbuffer), buf, dma_tmp,
925 &(priv->rxbufferhead))) {
926 DMESGE("Unable to allocate mem RX buf");
929 *tmp = 0; /* zero pads the header of the descriptor */
930 *tmp = *tmp | (bufsize&0xfff);
931 *(tmp+2) = (u32)dma_tmp;
932 *tmp = *tmp | (1<<31); /* descriptor void, owned by the NIC */
934 tmp = tmp+rx_desc_size;
937 *(tmp-rx_desc_size) = *(tmp-rx_desc_size) | (1<<30); /* this is the last descriptor */
943 void set_nic_rxring(struct net_device *dev)
946 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
948 pgreg = read_nic_byte(dev, PGSELECT);
949 write_nic_byte(dev, PGSELECT, pgreg & ~(1<<PGSELECT_PG_SHIFT));
951 write_nic_dword(dev, RXRING_ADDR, priv->rxringdma);
954 void rtl8180_reset(struct net_device *dev)
958 rtl8180_irq_disable(dev);
960 cr = read_nic_byte(dev, CMD);
962 cr = cr | (1<<CMD_RST_SHIFT);
963 write_nic_byte(dev, CMD, cr);
965 force_pci_posting(dev);
969 if (read_nic_byte(dev, CMD) & (1<<CMD_RST_SHIFT))
970 DMESGW("Card reset timeout!");
972 DMESG("Card successfully reset");
974 rtl8180_set_mode(dev, EPROM_CMD_LOAD);
975 force_pci_posting(dev);
979 inline u16 ieeerate2rtlrate(int rate)
1011 static u16 rtl_rate[] = {10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540, 720};
1013 inline u16 rtl8180_rate2rate(short rate)
1017 return rtl_rate[rate];
1020 inline u8 rtl8180_IsWirelessBMode(u16 rate)
1022 if (((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220))
1028 u16 N_DBPSOfRate(u16 DataRate);
1030 u16 ComputeTxTime(u16 FrameLength, u16 DataRate, u8 bManagementFrame,
1037 if (rtl8180_IsWirelessBMode(DataRate)) {
1038 if (bManagementFrame || !bShortPreamble || DataRate == 10)
1040 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1042 /* short preamble */
1043 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1045 if ((FrameLength*8 % (DataRate/10)) != 0) /* get the ceilling */
1047 } else { /* 802.11g DSSS-OFDM PLCP length field calculation. */
1048 N_DBPS = N_DBPSOfRate(DataRate);
1049 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1050 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1051 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1056 u16 N_DBPSOfRate(u16 DataRate)
1093 * For Netgear case, they want good-looking signal strength.
1095 static long NetgearSignalStrengthTranslate(long LastSS, long CurrSS)
1099 /* Step 1. Scale mapping. */
1100 if (CurrSS >= 71 && CurrSS <= 100)
1101 RetSS = 90 + ((CurrSS - 70) / 3);
1102 else if (CurrSS >= 41 && CurrSS <= 70)
1103 RetSS = 78 + ((CurrSS - 40) / 3);
1104 else if (CurrSS >= 31 && CurrSS <= 40)
1105 RetSS = 66 + (CurrSS - 30);
1106 else if (CurrSS >= 21 && CurrSS <= 30)
1107 RetSS = 54 + (CurrSS - 20);
1108 else if (CurrSS >= 5 && CurrSS <= 20)
1109 RetSS = 42 + (((CurrSS - 5) * 2) / 3);
1110 else if (CurrSS == 4)
1112 else if (CurrSS == 3)
1114 else if (CurrSS == 2)
1116 else if (CurrSS == 1)
1121 /* Step 2. Smoothing. */
1123 RetSS = ((LastSS * 5) + (RetSS) + 5) / 6;
1129 * Translate 0-100 signal strength index into dBm.
1131 static long TranslateToDbm8185(u8 SignalStrengthIndex)
1135 /* Translate to dBm (x=0.5y-95). */
1136 SignalPower = (long)((SignalStrengthIndex + 1) >> 1);
1143 * Perform signal smoothing for dynamic mechanism.
1144 * This is different with PerformSignalSmoothing8185 in smoothing formula.
1145 * No dramatic adjustion is apply because dynamic mechanism need some degree
1146 * of correctness. Ported from 8187B.
1148 static void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv,
1151 /* Determin the current packet is CCK rate. */
1152 priv->bCurCCKPkt = bCckRate;
1154 if (priv->UndecoratedSmoothedSS >= 0)
1155 priv->UndecoratedSmoothedSS = ((priv->UndecoratedSmoothedSS * 5) +
1156 (priv->SignalStrength * 10)) / 6;
1158 priv->UndecoratedSmoothedSS = priv->SignalStrength * 10;
1160 priv->UndercorateSmoothedRxPower = ((priv->UndercorateSmoothedRxPower * 50) +
1161 (priv->RxPower * 11)) / 60;
1164 priv->CurCCKRSSI = priv->RSSI;
1166 priv->CurCCKRSSI = 0;
1171 * This is rough RX isr handling routine
1173 static void rtl8180_rx(struct net_device *dev)
1175 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1176 struct sk_buff *tmp_skb;
1180 unsigned char quality, signal;
1189 u8 LNA_gain[4] = {02, 17, 29, 39};
1191 struct ieee80211_hdr_4addr *hdr;
1193 u8 bHwError = 0, bCRC = 0, bICV = 0;
1194 bool bCckRate = false;
1196 long SignalStrengthIndex = 0;
1197 struct ieee80211_rx_stats stats = {
1201 .freq = IEEE80211_24GHZ_BAND,
1204 stats.nic_type = NIC_8185B;
1207 if ((*(priv->rxringtail)) & (1<<31)) {
1208 /* we have got an RX int, but the descriptor
1209 * we are pointing is empty */
1211 priv->stats.rxnodata++;
1212 priv->ieee80211->stats.rx_errors++;
1215 tmp = priv->rxringtail;
1217 if (tmp == priv->rxring)
1218 tmp = priv->rxring + (priv->rxringcount - 1)*rx_desc_size;
1220 tmp -= rx_desc_size;
1222 if (!(*tmp & (1<<31)))
1224 } while (tmp != priv->rxring);
1227 priv->rxringtail = tmp2;
1230 /* while there are filled descriptors */
1231 while (!(*(priv->rxringtail) & (1<<31))) {
1232 if (*(priv->rxringtail) & (1<<26))
1233 DMESGW("RX buffer overflow");
1234 if (*(priv->rxringtail) & (1<<12))
1235 priv->stats.rxicverr++;
1237 if (*(priv->rxringtail) & (1<<27)) {
1238 priv->stats.rxdmafail++;
1239 /* DMESG("EE: RX DMA FAILED at buffer pointed by descriptor %x",(u32)priv->rxringtail); */
1243 pci_dma_sync_single_for_cpu(priv->pdev,
1244 priv->rxbuffer->dma,
1245 priv->rxbuffersize * sizeof(u8),
1246 PCI_DMA_FROMDEVICE);
1248 first = *(priv->rxringtail) & (1<<29) ? 1 : 0;
1250 priv->rx_prevlen = 0;
1252 last = *(priv->rxringtail) & (1<<28) ? 1 : 0;
1254 lastlen = ((*priv->rxringtail) & 0xfff);
1256 /* if the last descriptor (that should
1257 * tell us the total packet len) tell
1258 * us something less than the descriptors
1259 * len we had until now, then there is some
1261 * workaround to prevent kernel panic
1263 if (lastlen < priv->rx_prevlen)
1266 len = lastlen-priv->rx_prevlen;
1268 if (*(priv->rxringtail) & (1<<13)) {
1269 if ((*(priv->rxringtail) & 0xfff) < 500)
1270 priv->stats.rxcrcerrmin++;
1271 else if ((*(priv->rxringtail) & 0x0fff) > 1000)
1272 priv->stats.rxcrcerrmax++;
1274 priv->stats.rxcrcerrmid++;
1279 len = priv->rxbuffersize;
1282 if (first && last) {
1283 padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1285 padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1292 priv->rx_prevlen += len;
1294 if (priv->rx_prevlen > MAX_FRAG_THRESHOLD + 100) {
1295 /* HW is probably passing several buggy frames
1296 * without FD or LD flag set.
1297 * Throw this garbage away to prevent skb
1300 if (!priv->rx_skb_complete)
1301 dev_kfree_skb_any(priv->rx_skb);
1302 priv->rx_skb_complete = 1;
1305 signal = (unsigned char)(((*(priv->rxringtail+3)) & (0x00ff0000))>>16);
1306 signal = (signal & 0xfe) >> 1;
1308 quality = (unsigned char)((*(priv->rxringtail+3)) & (0xff));
1310 stats.mac_time[0] = *(priv->rxringtail+1);
1311 stats.mac_time[1] = *(priv->rxringtail+2);
1312 rxpower = ((char)(((*(priv->rxringtail+4)) & (0x00ff0000))>>16))/2 - 42;
1313 RSSI = ((u8)(((*(priv->rxringtail+3)) & (0x0000ff00))>>8)) & (0x7f);
1315 rate = ((*(priv->rxringtail)) &
1316 ((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20;
1318 stats.rate = rtl8180_rate2rate(rate);
1319 Antenna = (((*(priv->rxringtail+3)) & (0x00008000)) == 0) ? 0 : 1;
1320 if (!rtl8180_IsWirelessBMode(stats.rate)) { /* OFDM rate. */
1321 RxAGC_dBm = rxpower+1; /* bias */
1322 } else { /* CCK rate. */
1323 RxAGC_dBm = signal; /* bit 0 discard */
1325 LNA = (u8) (RxAGC_dBm & 0x60) >> 5; /* bit 6~ bit 5 */
1326 BB = (u8) (RxAGC_dBm & 0x1F); /* bit 4 ~ bit 0 */
1328 RxAGC_dBm = -(LNA_gain[LNA] + (BB*2)); /* Pin_11b=-(LNA_gain+BB_gain) (dBm) */
1330 RxAGC_dBm += 4; /* bias */
1333 if (RxAGC_dBm & 0x80) /* absolute value */
1334 RXAGC = ~(RxAGC_dBm)+1;
1335 bCckRate = rtl8180_IsWirelessBMode(stats.rate);
1336 /* Translate RXAGC into 1-100. */
1337 if (!rtl8180_IsWirelessBMode(stats.rate)) { /* OFDM rate. */
1340 else if (RXAGC < 25)
1342 RXAGC = (90-RXAGC)*100/65;
1343 } else { /* CCK rate. */
1346 else if (RXAGC < 30)
1348 RXAGC = (95-RXAGC)*100/65;
1350 priv->SignalStrength = (u8)RXAGC;
1351 priv->RecvSignalPower = RxAGC_dBm;
1352 priv->RxPower = rxpower;
1354 /* SQ translation formula is provided by SD3 DZ. 2006.06.27 */
1356 quality = 1; /*0; */ /* 0 will cause epc to show signal zero , walk around now; */
1357 else if (quality < 27)
1360 quality = 127 - quality;
1361 priv->SignalQuality = quality;
1363 stats.signal = (u8)quality; /*priv->wstats.qual.level = priv->SignalStrength; */
1364 stats.signalstrength = RXAGC;
1365 if (stats.signalstrength > 100)
1366 stats.signalstrength = 100;
1367 stats.signalstrength = (stats.signalstrength * 70)/100 + 30;
1368 /* printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength); */
1369 stats.rssi = priv->wstats.qual.qual = priv->SignalQuality;
1370 stats.noise = priv->wstats.qual.noise = 100 - priv->wstats.qual.qual;
1371 bHwError = (((*(priv->rxringtail)) & (0x00000fff)) == 4080) |
1372 (((*(priv->rxringtail)) & (0x04000000)) != 0) |
1373 (((*(priv->rxringtail)) & (0x08000000)) != 0) |
1374 (((~(*(priv->rxringtail))) & (0x10000000)) != 0) |
1375 (((~(*(priv->rxringtail))) & (0x20000000)) != 0);
1376 bCRC = ((*(priv->rxringtail)) & (0x00002000)) >> 13;
1377 bICV = ((*(priv->rxringtail)) & (0x00001000)) >> 12;
1378 hdr = (struct ieee80211_hdr_4addr *)priv->rxbuffer->buf;
1379 fc = le16_to_cpu(hdr->frame_ctl);
1380 type = WLAN_FC_GET_TYPE(fc);
1382 if (IEEE80211_FTYPE_CTL != type &&
1383 !bHwError && !bCRC && !bICV &&
1384 eqMacAddr(priv->ieee80211->current_network.bssid,
1385 fc & IEEE80211_FCTL_TODS ? hdr->addr1 :
1386 fc & IEEE80211_FCTL_FROMDS ? hdr->addr2 :
1389 /* Perform signal smoothing for dynamic
1390 * mechanism on demand. This is different
1391 * with PerformSignalSmoothing8185 in smoothing
1392 * fomula. No dramatic adjustion is apply
1393 * because dynamic mechanism need some degree
1394 * of correctness. */
1395 PerformUndecoratedSignalSmoothing8185(priv, bCckRate);
1397 /* For good-looking singal strength. */
1398 SignalStrengthIndex = NetgearSignalStrengthTranslate(
1399 priv->LastSignalStrengthInPercent,
1400 priv->SignalStrength);
1402 priv->LastSignalStrengthInPercent = SignalStrengthIndex;
1403 priv->Stats_SignalStrength = TranslateToDbm8185((u8)SignalStrengthIndex);
1405 * We need more correct power of received packets and the "SignalStrength" of RxStats is beautified,
1406 * so we record the correct power here.
1408 priv->Stats_SignalQuality = (long)(priv->Stats_SignalQuality * 5 + (long)priv->SignalQuality + 5) / 6;
1409 priv->Stats_RecvSignalPower = (long)(priv->Stats_RecvSignalPower * 5 + priv->RecvSignalPower - 1) / 6;
1411 /* Figure out which antenna that received the last packet. */
1412 priv->LastRxPktAntenna = Antenna ? 1 : 0; /* 0: aux, 1: main. */
1413 SwAntennaDiversityRxOk8185(dev, priv->SignalStrength);
1417 if (!priv->rx_skb_complete) {
1418 /* seems that HW sometimes fails to receive and
1419 doesn't provide the last descriptor */
1420 dev_kfree_skb_any(priv->rx_skb);
1421 priv->stats.rxnolast++;
1423 priv->rx_skb = dev_alloc_skb(len+2);
1427 priv->rx_skb_complete = 0;
1428 priv->rx_skb->dev = dev;
1430 /* if we are here we should have already RXed
1432 * If we get here and the skb is not allocated then
1433 * we have just throw out garbage (skb not allocated)
1434 * and we are still rxing garbage....
1436 if (!priv->rx_skb_complete) {
1438 tmp_skb = dev_alloc_skb(priv->rx_skb->len+len+2);
1445 memcpy(skb_put(tmp_skb, priv->rx_skb->len),
1449 dev_kfree_skb_any(priv->rx_skb);
1451 priv->rx_skb = tmp_skb;
1455 if (!priv->rx_skb_complete) {
1457 memcpy(skb_put(priv->rx_skb, len),
1458 (((unsigned char *)priv->rxbuffer->buf) + 2), len);
1460 memcpy(skb_put(priv->rx_skb, len),
1461 priv->rxbuffer->buf, len);
1465 if (last && !priv->rx_skb_complete) {
1466 if (priv->rx_skb->len > 4)
1467 skb_trim(priv->rx_skb, priv->rx_skb->len-4);
1468 if (!ieee80211_rtl_rx(priv->ieee80211,
1469 priv->rx_skb, &stats))
1470 dev_kfree_skb_any(priv->rx_skb);
1471 priv->rx_skb_complete = 1;
1474 pci_dma_sync_single_for_device(priv->pdev,
1475 priv->rxbuffer->dma,
1476 priv->rxbuffersize * sizeof(u8),
1477 PCI_DMA_FROMDEVICE);
1479 drop: /* this is used when we have not enough mem */
1480 /* restore the descriptor */
1481 *(priv->rxringtail+2) = priv->rxbuffer->dma;
1482 *(priv->rxringtail) = *(priv->rxringtail) & ~0xfff;
1483 *(priv->rxringtail) =
1484 *(priv->rxringtail) | priv->rxbuffersize;
1486 *(priv->rxringtail) =
1487 *(priv->rxringtail) | (1<<31);
1489 priv->rxringtail += rx_desc_size;
1490 if (priv->rxringtail >=
1491 (priv->rxring)+(priv->rxringcount)*rx_desc_size)
1492 priv->rxringtail = priv->rxring;
1494 priv->rxbuffer = (priv->rxbuffer->next);
1499 static void rtl8180_dma_kick(struct net_device *dev, int priority)
1501 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1503 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1504 write_nic_byte(dev, TX_DMA_POLLING,
1505 (1 << (priority + 1)) | priv->dma_poll_mask);
1506 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1508 force_pci_posting(dev);
1511 static void rtl8180_data_hard_stop(struct net_device *dev)
1513 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1515 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1516 priv->dma_poll_stop_mask |= TPPOLLSTOP_AC_VIQ;
1517 write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
1518 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1521 static void rtl8180_data_hard_resume(struct net_device *dev)
1523 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1525 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1526 priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_AC_VIQ);
1527 write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
1528 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1532 * This function TX data frames when the ieee80211 stack requires this.
1533 * It checks also if we need to stop the ieee tx queue, eventually do it
1535 static void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev,
1538 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1540 struct ieee80211_hdr_3addr *h = (struct ieee80211_hdr_3addr *) skb->data;
1541 short morefrag = (h->frame_control) & IEEE80211_FCTL_MOREFRAGS;
1542 unsigned long flags;
1545 mode = priv->ieee80211->iw_mode;
1547 rate = ieeerate2rtlrate(rate);
1549 * This function doesn't require lock because we make
1550 * sure it's called with the tx_lock already acquired.
1551 * this come from the kernel's hard_xmit callback (through
1552 * the ieee stack, or from the try_wake_queue (again through
1555 priority = AC2Q(skb->priority);
1556 spin_lock_irqsave(&priv->tx_lock, flags);
1558 if (priv->ieee80211->bHwRadioOff) {
1559 spin_unlock_irqrestore(&priv->tx_lock, flags);
1564 if (!check_nic_enought_desc(dev, priority)) {
1565 DMESGW("Error: no descriptor left by previous TX (avail %d) ",
1566 get_curr_tx_free_desc(dev, priority));
1567 ieee80211_rtl_stop_queue(priv->ieee80211);
1569 rtl8180_tx(dev, skb->data, skb->len, priority, morefrag, 0, rate);
1570 if (!check_nic_enought_desc(dev, priority))
1571 ieee80211_rtl_stop_queue(priv->ieee80211);
1573 spin_unlock_irqrestore(&priv->tx_lock, flags);
1577 * This is a rough attempt to TX a frame
1578 * This is called by the ieee 80211 stack to TX management frames.
1579 * If the ring is full packets are dropped (for data frame the queue
1580 * is stopped before this can happen). For this reason it is better
1581 * if the descriptors are larger than the largest management frame
1582 * we intend to TX: i'm unsure what the HW does if it will not find
1583 * the last fragment of a frame because it has been dropped...
1584 * Since queues for Management and Data frames are different we
1585 * might use a different lock than tx_lock (for example mgmt_tx_lock)
1587 /* these function may loop if invoked with 0 descriptors or 0 len buffer */
1588 static int rtl8180_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1590 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1591 unsigned long flags;
1594 priority = MANAGE_PRIORITY;
1596 spin_lock_irqsave(&priv->tx_lock, flags);
1598 if (priv->ieee80211->bHwRadioOff) {
1599 spin_unlock_irqrestore(&priv->tx_lock, flags);
1600 dev_kfree_skb_any(skb);
1601 return NETDEV_TX_OK;
1604 rtl8180_tx(dev, skb->data, skb->len, priority,
1605 0, 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
1607 priv->ieee80211->stats.tx_bytes += skb->len;
1608 priv->ieee80211->stats.tx_packets++;
1609 spin_unlock_irqrestore(&priv->tx_lock, flags);
1611 dev_kfree_skb_any(skb);
1612 return NETDEV_TX_OK;
1615 /* longpre 144+48 shortpre 72+24 */
1616 u16 rtl8180_len2duration(u32 len, short rate, short *ext)
1625 duration = ((len+4)<<4) / 0x2;
1626 drift = ((len+4)<<4) % 0x2;
1633 duration = ((len+4)<<4) / 0x4;
1634 drift = ((len+4)<<4) % 0x4;
1639 case 2: /* 5.5mbps */
1641 duration = ((len+4)<<4) / 0xb;
1642 drift = ((len+4)<<4) % 0xb;
1648 case 3: /* 11mbps */
1650 duration = ((len+4)<<4) / 0x16;
1651 drift = ((len+4)<<4) % 0x16;
1664 static void rtl8180_prepare_beacon(struct net_device *dev)
1666 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1667 struct sk_buff *skb;
1669 u16 word = read_nic_word(dev, BcnItv);
1670 word &= ~BcnItv_BcnItv; /* clear Bcn_Itv */
1671 word |= cpu_to_le16(priv->ieee80211->current_network.beacon_interval); /* 0x64; */
1672 write_nic_word(dev, BcnItv, word);
1674 skb = ieee80211_get_beacon(priv->ieee80211);
1676 rtl8180_tx(dev, skb->data, skb->len, BEACON_PRIORITY,
1677 0, 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
1678 dev_kfree_skb_any(skb);
1683 * This function do the real dirty work: it enqueues a TX command
1684 * descriptor in the ring buffer, copyes the frame in a TX buffer
1685 * and kicks the NIC to ensure it does the DMA transfer.
1687 short rtl8180_tx(struct net_device *dev, u8 *txbuf, int len, int priority,
1688 short morefrag, short descfrag, int rate)
1690 struct r8180_priv *priv = ieee80211_priv(dev);
1691 u32 *tail, *temp_tail;
1698 struct buffer *buflist;
1699 struct ieee80211_hdr_3addr *frag_hdr = (struct ieee80211_hdr_3addr *)txbuf;
1701 u8 bUseShortPreamble = 0;
1706 u16 ThisFrameTime = 0;
1707 u16 TxDescDuration = 0;
1708 bool ownbit_flag = false;
1711 case MANAGE_PRIORITY:
1712 tail = priv->txmapringtail;
1713 begin = priv->txmapring;
1714 buflist = priv->txmapbufstail;
1715 count = priv->txringcount;
1718 tail = priv->txbkpringtail;
1719 begin = priv->txbkpring;
1720 buflist = priv->txbkpbufstail;
1721 count = priv->txringcount;
1724 tail = priv->txbepringtail;
1725 begin = priv->txbepring;
1726 buflist = priv->txbepbufstail;
1727 count = priv->txringcount;
1730 tail = priv->txvipringtail;
1731 begin = priv->txvipring;
1732 buflist = priv->txvipbufstail;
1733 count = priv->txringcount;
1736 tail = priv->txvopringtail;
1737 begin = priv->txvopring;
1738 buflist = priv->txvopbufstail;
1739 count = priv->txringcount;
1742 tail = priv->txhpringtail;
1743 begin = priv->txhpring;
1744 buflist = priv->txhpbufstail;
1745 count = priv->txringcount;
1747 case BEACON_PRIORITY:
1748 tail = priv->txbeaconringtail;
1749 begin = priv->txbeaconring;
1750 buflist = priv->txbeaconbufstail;
1751 count = priv->txbeaconcount;
1758 memcpy(&dest, frag_hdr->addr1, ETH_ALEN);
1759 if (is_multicast_ether_addr(dest)) {
1765 ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate),
1766 0, bUseShortPreamble);
1767 TxDescDuration = ThisFrameTime;
1768 } else { /* Unicast packet */
1771 /* YJ,add,080828,for Keep alive */
1772 priv->NumTxUnicast++;
1774 /* Figure out ACK rate according to BSS basic rate
1776 AckTime = ComputeTxTime(14, 10, 0, 0); /* AckCTSLng = 14 use 1M bps send */
1778 if (((len + sCrcLng) > priv->rts) && priv->rts) { /* RTS/CTS. */
1779 u16 RtsTime, CtsTime;
1784 /* Rate and time required for RTS. */
1785 RtsTime = ComputeTxTime(sAckCtsLng/8, priv->ieee80211->basic_rate, 0, 0);
1786 /* Rate and time required for CTS. */
1787 CtsTime = ComputeTxTime(14, 10, 0, 0); /* AckCTSLng = 14 use 1M bps send */
1789 /* Figure out time required to transmit this frame. */
1790 ThisFrameTime = ComputeTxTime(len + sCrcLng,
1791 rtl8180_rate2rate(rate),
1795 /* RTS-CTS-ThisFrame-ACK. */
1796 RtsDur = CtsTime + ThisFrameTime + AckTime + 3*aSifsTime;
1798 TxDescDuration = RtsTime + RtsDur;
1799 } else { /* Normal case. */
1804 ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate),
1805 0, bUseShortPreamble);
1806 TxDescDuration = ThisFrameTime + aSifsTime + AckTime;
1809 if (!(frag_hdr->frame_control & IEEE80211_FCTL_MOREFRAGS)) {
1810 /* ThisFrame-ACK. */
1811 Duration = aSifsTime + AckTime;
1812 } else { /* One or more fragments remained. */
1814 NextFragTime = ComputeTxTime(len + sCrcLng, /* pretend following packet length equal current packet */
1815 rtl8180_rate2rate(rate),
1819 /* ThisFrag-ACk-NextFrag-ACK. */
1820 Duration = NextFragTime + 3*aSifsTime + 2*AckTime;
1823 } /* End of Unicast packet */
1825 frag_hdr->duration_id = Duration;
1827 buflen = priv->txbuffsize;
1831 while (remain != 0) {
1834 DMESGE("TX buffer error, cannot TX frames. pri %d.", priority);
1839 if ((*tail & (1 << 31)) && (priority != BEACON_PRIORITY)) {
1840 DMESGW("No more TX desc, returning %x of %x",
1842 priv->stats.txrdu++;
1846 *tail = 0; /* zeroes header */
1853 /* FIXME: this should be triggered by HW encryption parameters.*/
1854 *tail |= (1<<15); /* no encrypt */
1856 if (remain == len && !descfrag) {
1857 ownbit_flag = false;
1858 *tail = *tail | (1<<29) ; /* fist segment of the packet */
1859 *tail = *tail | (len);
1864 for (i = 0; i < buflen && remain > 0; i++, remain--) {
1865 ((u8 *)buf)[i] = txbuf[i]; /* copy data into descriptor pointed DMAble buffer */
1866 if (remain == 4 && i+4 >= buflen)
1868 /* ensure the last desc has at least 4 bytes payload */
1872 *(tail+3) = *(tail+3) & ~0xfff;
1873 *(tail+3) = *(tail+3) | i; /* buffer length */
1874 /* Use short preamble or not */
1875 if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE)
1876 if (priv->plcp_preamble_mode == 1 && rate != 0) /* short mode now, not long! */
1877 ; /* *tail |= (1<<16); */ /* enable short preamble mode. */
1882 if (bRTSEnable) { /* rts enable */
1883 *tail |= ((ieeerate2rtlrate(priv->ieee80211->basic_rate))<<19); /* RTS RATE */
1884 *tail |= (1<<23); /* rts enable */
1885 *(tail+1) |= (RtsDur&0xffff); /* RTS Duration */
1887 *(tail+3) |= ((TxDescDuration&0xffff)<<16); /* DURATION */
1888 /* *(tail+3) |= (0xe6<<16); */
1889 *(tail+5) |= (11<<8); /* (priv->retry_data<<8); */ /* retry lim; */
1891 *tail = *tail | ((rate&0xf) << 24);
1894 *tail = (*tail) | (1<<17); /* more fragment */
1896 *tail = (*tail) | (1<<28); /* last segment of frame */
1898 *(tail+5) = *(tail+5)|(2<<27);
1899 *(tail+7) = *(tail+7)|(1<<4);
1903 *tail = *tail | (1<<31); /* descriptor ready to be txed */
1905 if ((tail - begin)/8 == count-1)
1910 buflist = buflist->next;
1915 case MANAGE_PRIORITY:
1916 priv->txmapringtail = tail;
1917 priv->txmapbufstail = buflist;
1920 priv->txbkpringtail = tail;
1921 priv->txbkpbufstail = buflist;
1924 priv->txbepringtail = tail;
1925 priv->txbepbufstail = buflist;
1928 priv->txvipringtail = tail;
1929 priv->txvipbufstail = buflist;
1932 priv->txvopringtail = tail;
1933 priv->txvopbufstail = buflist;
1936 priv->txhpringtail = tail;
1937 priv->txhpbufstail = buflist;
1939 case BEACON_PRIORITY:
1941 * The HW seems to be happy with the 1st
1942 * descriptor filled and the 2nd empty...
1943 * So always update descriptor 1 and never
1949 *temp_tail = *temp_tail | (1<<31); /* descriptor ready to be txed */
1950 rtl8180_dma_kick(dev, priority);
1955 void rtl8180_irq_rx_tasklet(struct r8180_priv *priv);
1957 static void rtl8180_link_change(struct net_device *dev)
1959 struct r8180_priv *priv = ieee80211_priv(dev);
1960 u16 beacon_interval;
1961 struct ieee80211_network *net = &priv->ieee80211->current_network;
1963 rtl8180_update_msr(dev);
1965 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1967 write_nic_dword(dev, BSSID, ((u32 *)net->bssid)[0]);
1968 write_nic_word(dev, BSSID+4, ((u16 *)net->bssid)[2]);
1970 beacon_interval = read_nic_word(dev, BEACON_INTERVAL);
1971 beacon_interval &= ~BEACON_INTERVAL_MASK;
1972 beacon_interval |= net->beacon_interval;
1973 write_nic_word(dev, BEACON_INTERVAL, beacon_interval);
1975 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1977 rtl8180_set_chan(dev, priv->chan);
1980 static void rtl8180_rq_tx_ack(struct net_device *dev)
1983 struct r8180_priv *priv = ieee80211_priv(dev);
1985 write_nic_byte(dev, CONFIG4, read_nic_byte(dev, CONFIG4) | CONFIG4_PWRMGT);
1986 priv->ack_tx_to_ieee = 1;
1989 static short rtl8180_is_tx_queue_empty(struct net_device *dev)
1992 struct r8180_priv *priv = ieee80211_priv(dev);
1995 for (d = priv->txmapring;
1996 d < priv->txmapring + priv->txringcount; d += 8)
2000 for (d = priv->txbkpring;
2001 d < priv->txbkpring + priv->txringcount; d += 8)
2005 for (d = priv->txbepring;
2006 d < priv->txbepring + priv->txringcount; d += 8)
2010 for (d = priv->txvipring;
2011 d < priv->txvipring + priv->txringcount; d += 8)
2015 for (d = priv->txvopring;
2016 d < priv->txvopring + priv->txringcount; d += 8)
2020 for (d = priv->txhpring;
2021 d < priv->txhpring + priv->txringcount; d += 8)
2027 static void rtl8180_hw_wakeup(struct net_device *dev)
2029 unsigned long flags;
2030 struct r8180_priv *priv = ieee80211_priv(dev);
2032 spin_lock_irqsave(&priv->ps_lock, flags);
2033 write_nic_byte(dev, CONFIG4, read_nic_byte(dev, CONFIG4) & ~CONFIG4_PWRMGT);
2034 if (priv->rf_wakeup)
2035 priv->rf_wakeup(dev);
2036 spin_unlock_irqrestore(&priv->ps_lock, flags);
2039 static void rtl8180_hw_sleep_down(struct net_device *dev)
2041 unsigned long flags;
2042 struct r8180_priv *priv = ieee80211_priv(dev);
2044 spin_lock_irqsave(&priv->ps_lock, flags);
2046 priv->rf_sleep(dev);
2047 spin_unlock_irqrestore(&priv->ps_lock, flags);
2050 static void rtl8180_hw_sleep(struct net_device *dev, u32 th, u32 tl)
2052 struct r8180_priv *priv = ieee80211_priv(dev);
2054 unsigned long flags;
2056 spin_lock_irqsave(&priv->ps_lock, flags);
2059 * Writing HW register with 0 equals to disable
2060 * the timer, that is not really what we want
2062 tl -= MSECS(4+16+7);
2065 * If the interval in witch we are requested to sleep is too
2066 * short then give up and remain awake
2068 if (((tl >= rb) && (tl-rb) <= MSECS(MIN_SLEEP_TIME))
2069 || ((rb > tl) && (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
2070 spin_unlock_irqrestore(&priv->ps_lock, flags);
2071 printk("too short to sleep\n");
2076 u32 tmp = (tl > rb) ? (tl-rb) : (rb-tl);
2078 priv->DozePeriodInPast2Sec += jiffies_to_msecs(tmp);
2079 /* as tl may be less than rb */
2080 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp);
2083 * If we suspect the TimerInt is gone beyond tl
2084 * while setting it, then give up
2087 if (((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME))) ||
2088 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
2089 spin_unlock_irqrestore(&priv->ps_lock, flags);
2093 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq);
2094 spin_unlock_irqrestore(&priv->ps_lock, flags);
2097 static void rtl8180_wmm_param_update(struct work_struct *work)
2099 struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wmm_param_update_wq);
2100 struct net_device *dev = ieee->dev;
2101 u8 *ac_param = (u8 *)(ieee->current_network.wmm_param);
2102 u8 mode = ieee->current_network.mode;
2108 if (!ieee->current_network.QoS_Enable) {
2109 /* legacy ac_xx_param update */
2110 AcParam.longData = 0;
2111 AcParam.f.AciAifsn.f.AIFSN = 2; /* Follow 802.11 DIFS. */
2112 AcParam.f.AciAifsn.f.ACM = 0;
2113 AcParam.f.Ecw.f.ECWmin = 3; /* Follow 802.11 CWmin. */
2114 AcParam.f.Ecw.f.ECWmax = 7; /* Follow 802.11 CWmax. */
2115 AcParam.f.TXOPLimit = 0;
2116 for (eACI = 0; eACI < AC_MAX; eACI++) {
2117 AcParam.f.AciAifsn.f.ACI = (u8)eACI;
2121 pAcParam = (PAC_PARAM)(&AcParam);
2122 /* Retrieve parameters to update. */
2123 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
2124 u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit))<<AC_PARAM_TXOP_LIMIT_OFFSET)|
2125 (((u32)(pAcParam->f.Ecw.f.ECWmax))<<AC_PARAM_ECW_MAX_OFFSET)|
2126 (((u32)(pAcParam->f.Ecw.f.ECWmin))<<AC_PARAM_ECW_MIN_OFFSET)|
2127 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2130 write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2133 write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2136 write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2139 write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2142 pr_warn("SetHwReg8185():invalid ACI: %d!\n",
2151 for (i = 0; i < AC_MAX; i++) {
2152 /* AcParam.longData = 0; */
2153 pAcParam = (AC_PARAM *)ac_param;
2159 /* Retrieve parameters to update. */
2160 eACI = pAcParam->f.AciAifsn.f.ACI;
2161 /* Mode G/A: slotTimeTimer = 9; Mode B: 20 */
2162 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
2163 u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
2164 (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
2165 (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
2166 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2170 write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2173 write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2176 write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2179 write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2182 pr_warn("SetHwReg8185(): invalid ACI: %d !\n",
2187 ac_param += (sizeof(AC_PARAM));
2191 void rtl8180_restart_wq(struct work_struct *work);
2192 /* void rtl8180_rq_tx_ack(struct work_struct *work); */
2193 void rtl8180_watch_dog_wq(struct work_struct *work);
2194 void rtl8180_hw_wakeup_wq(struct work_struct *work);
2195 void rtl8180_hw_sleep_wq(struct work_struct *work);
2196 void rtl8180_sw_antenna_wq(struct work_struct *work);
2197 void rtl8180_watch_dog(struct net_device *dev);
2199 static void watch_dog_adaptive(unsigned long data)
2201 struct r8180_priv *priv = ieee80211_priv((struct net_device *)data);
2204 DMESG("<----watch_dog_adaptive():driver is not up!\n");
2208 /* Tx High Power Mechanism. */
2209 if (CheckHighPower((struct net_device *)data))
2210 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->tx_pw_wq);
2212 /* Tx Power Tracking on 87SE. */
2213 if (CheckTxPwrTracking((struct net_device *)data))
2214 TxPwrTracking87SE((struct net_device *)data);
2216 /* Perform DIG immediately. */
2217 if (CheckDig((struct net_device *)data))
2218 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_dig_wq);
2219 rtl8180_watch_dog((struct net_device *)data);
2221 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->GPIOChangeRFWorkItem);
2223 priv->watch_dog_timer.expires = jiffies + MSECS(IEEE80211_WATCH_DOG_TIME);
2224 add_timer(&priv->watch_dog_timer);
2227 static CHANNEL_LIST ChannelPlan[] = {
2228 {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, /* FCC */
2229 {{1,2,3,4,5,6,7,8,9,10,11},11}, /* IC */
2230 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, /* ETSI */
2231 {{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. */
2232 {{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. */
2233 {{14,36,40,44,48,52,56,60,64},9}, /* MKK */
2234 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14, 36,40,44,48,52,56,60,64},22},/* MKK1 */
2235 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, /* Israel. */
2236 {{1,2,3,4,5,6,7,8,9,10,11,12,13,34,38,42,46},17}, /* For 11a , TELEC */
2237 {{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 */
2238 {{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 */
2241 static void rtl8180_set_channel_map(u8 channel_plan, struct ieee80211_device *ieee)
2245 /* lzm add 080826 */
2246 ieee->MinPassiveChnlNum = MAX_CHANNEL_NUMBER+1;
2247 ieee->IbssStartChnl = 0;
2249 switch (channel_plan) {
2250 case COUNTRY_CODE_FCC:
2251 case COUNTRY_CODE_IC:
2252 case COUNTRY_CODE_ETSI:
2253 case COUNTRY_CODE_SPAIN:
2254 case COUNTRY_CODE_FRANCE:
2255 case COUNTRY_CODE_MKK:
2256 case COUNTRY_CODE_MKK1:
2257 case COUNTRY_CODE_ISRAEL:
2258 case COUNTRY_CODE_TELEC:
2261 ieee->bGlobalDomain = false;
2262 if (ChannelPlan[channel_plan].Len != 0) {
2263 /* Clear old channel map */
2264 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
2265 /* Set new channel map */
2266 for (i = 0; i < ChannelPlan[channel_plan].Len; i++) {
2267 if (ChannelPlan[channel_plan].Channel[i] <= 14)
2268 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
2273 case COUNTRY_CODE_GLOBAL_DOMAIN:
2275 GET_DOT11D_INFO(ieee)->bEnabled = false;
2277 ieee->bGlobalDomain = true;
2280 case COUNTRY_CODE_WORLD_WIDE_13_INDEX:/* lzm add 080826 */
2282 ieee->MinPassiveChnlNum = 12;
2283 ieee->IbssStartChnl = 10;
2289 ieee->bGlobalDomain = false;
2290 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
2291 for (i = 1; i <= 14; i++)
2292 GET_DOT11D_INFO(ieee)->channel_map[i] = 1;
2298 void GPIOChangeRFWorkItemCallBack(struct work_struct *work);
2301 static void rtl8180_statistics_init(struct Stats *pstats)
2303 memset(pstats, 0, sizeof(struct Stats));
2306 static void rtl8180_link_detect_init(plink_detect_t plink_detect)
2308 memset(plink_detect, 0, sizeof(link_detect_t));
2309 plink_detect->SlotNum = DEFAULT_SLOT_NUM;
2312 /* YJ,add,080828,end */
2313 static void rtl8187se_eeprom_register_read(struct eeprom_93cx6 *eeprom)
2315 struct net_device *dev = eeprom->data;
2316 u8 reg = read_nic_byte(dev, EPROM_CMD);
2318 eeprom->reg_data_in = reg & RTL818X_EEPROM_CMD_WRITE;
2319 eeprom->reg_data_out = reg & RTL818X_EEPROM_CMD_READ;
2320 eeprom->reg_data_clock = reg & RTL818X_EEPROM_CMD_CK;
2321 eeprom->reg_chip_select = reg & RTL818X_EEPROM_CMD_CS;
2324 static void rtl8187se_eeprom_register_write(struct eeprom_93cx6 *eeprom)
2326 struct net_device *dev = eeprom->data;
2329 if (eeprom->reg_data_in)
2330 reg |= RTL818X_EEPROM_CMD_WRITE;
2331 if (eeprom->reg_data_out)
2332 reg |= RTL818X_EEPROM_CMD_READ;
2333 if (eeprom->reg_data_clock)
2334 reg |= RTL818X_EEPROM_CMD_CK;
2335 if (eeprom->reg_chip_select)
2336 reg |= RTL818X_EEPROM_CMD_CS;
2338 write_nic_byte(dev, EPROM_CMD, reg);
2339 read_nic_byte(dev, EPROM_CMD);
2343 short rtl8180_init(struct net_device *dev)
2345 struct r8180_priv *priv = ieee80211_priv(dev);
2350 struct eeprom_93cx6 eeprom;
2354 eeprom.register_read = rtl8187se_eeprom_register_read;
2355 eeprom.register_write = rtl8187se_eeprom_register_write;
2356 eeprom.width = PCI_EEPROM_WIDTH_93C46;
2358 eeprom_93cx6_read(&eeprom, EEPROM_COUNTRY_CODE>>1, &eeprom_val);
2359 priv->channel_plan = eeprom_val & 0xFF;
2360 if (priv->channel_plan > COUNTRY_CODE_GLOBAL_DOMAIN) {
2361 printk("rtl8180_init:Error channel plan! Set to default.\n");
2362 priv->channel_plan = 0;
2365 DMESG("Channel plan is %d\n", priv->channel_plan);
2366 rtl8180_set_channel_map(priv->channel_plan, priv->ieee80211);
2368 /* FIXME: these constants are placed in a bad pleace. */
2369 priv->txbuffsize = 2048; /* 1024; */
2370 priv->txringcount = 32; /* 32; */
2371 priv->rxbuffersize = 2048; /* 1024; */
2372 priv->rxringcount = 64; /* 32; */
2373 priv->txbeaconcount = 2;
2374 priv->rx_skb_complete = 1;
2376 priv->RFChangeInProgress = false;
2377 priv->SetRFPowerStateInProgress = false;
2378 priv->RFProgType = 0;
2380 priv->irq_enabled = 0;
2382 rtl8180_statistics_init(&priv->stats);
2383 rtl8180_link_detect_init(&priv->link_detect);
2385 priv->ack_tx_to_ieee = 0;
2386 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2387 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2388 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
2389 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2390 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;
2391 priv->ieee80211->active_scan = 1;
2392 priv->ieee80211->rate = 110; /* 11 mbps */
2393 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION;
2394 priv->ieee80211->host_encrypt = 1;
2395 priv->ieee80211->host_decrypt = 1;
2396 priv->ieee80211->sta_wake_up = rtl8180_hw_wakeup;
2397 priv->ieee80211->ps_request_tx_ack = rtl8180_rq_tx_ack;
2398 priv->ieee80211->enter_sleep_state = rtl8180_hw_sleep;
2399 priv->ieee80211->ps_is_queue_empty = rtl8180_is_tx_queue_empty;
2401 priv->hw_wep = hwwep;
2403 priv->retry_rts = DEFAULT_RETRY_RTS;
2404 priv->retry_data = DEFAULT_RETRY_DATA;
2405 priv->RFChangeInProgress = false;
2406 priv->SetRFPowerStateInProgress = false;
2407 priv->RFProgType = 0;
2408 priv->bInactivePs = true; /* false; */
2409 priv->ieee80211->bInactivePs = priv->bInactivePs;
2410 priv->bSwRfProcessing = false;
2411 priv->eRFPowerState = eRfOff;
2412 priv->RfOffReason = 0;
2413 priv->LedStrategy = SW_LED_MODE0;
2414 priv->TxPollingTimes = 0; /* lzm add 080826 */
2415 priv->bLeisurePs = true;
2416 priv->dot11PowerSaveMode = eActive;
2417 priv->AdMinCheckPeriod = 5;
2418 priv->AdMaxCheckPeriod = 10;
2419 priv->AdMaxRxSsThreshold = 30; /* 60->30 */
2420 priv->AdRxSsThreshold = 20; /* 50->20 */
2421 priv->AdCheckPeriod = priv->AdMinCheckPeriod;
2422 priv->AdTickCount = 0;
2423 priv->AdRxSignalStrength = -1;
2424 priv->RegSwAntennaDiversityMechanism = 0;
2425 priv->RegDefaultAntenna = 0;
2426 priv->SignalStrength = 0;
2427 priv->AdRxOkCnt = 0;
2428 priv->CurrAntennaIndex = 0;
2429 priv->AdRxSsBeforeSwitched = 0;
2430 init_timer(&priv->SwAntennaDiversityTimer);
2431 priv->SwAntennaDiversityTimer.data = (unsigned long)dev;
2432 priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback;
2433 priv->bDigMechanism = true;
2434 priv->InitialGain = 6;
2435 priv->bXtalCalibration = false;
2436 priv->XtalCal_Xin = 0;
2437 priv->XtalCal_Xout = 0;
2438 priv->bTxPowerTrack = false;
2439 priv->ThermalMeter = 0;
2440 priv->FalseAlarmRegValue = 0;
2441 priv->RegDigOfdmFaUpTh = 0xc; /* Upper threshold of OFDM false alarm, which is used in DIG. */
2442 priv->DIG_NumberFallbackVote = 0;
2443 priv->DIG_NumberUpgradeVote = 0;
2444 priv->LastSignalStrengthInPercent = 0;
2445 priv->Stats_SignalStrength = 0;
2446 priv->LastRxPktAntenna = 0;
2447 priv->SignalQuality = 0; /* in 0-100 index. */
2448 priv->Stats_SignalQuality = 0;
2449 priv->RecvSignalPower = 0; /* in dBm. */
2450 priv->Stats_RecvSignalPower = 0;
2451 priv->AdMainAntennaRxOkCnt = 0;
2452 priv->AdAuxAntennaRxOkCnt = 0;
2453 priv->bHWAdSwitched = false;
2454 priv->bRegHighPowerMechanism = true;
2455 priv->RegHiPwrUpperTh = 77;
2456 priv->RegHiPwrLowerTh = 75;
2457 priv->RegRSSIHiPwrUpperTh = 70;
2458 priv->RegRSSIHiPwrLowerTh = 20;
2459 priv->bCurCCKPkt = false;
2460 priv->UndecoratedSmoothedSS = -1;
2461 priv->bToUpdateTxPwr = false;
2462 priv->CurCCKRSSI = 0;
2465 priv->NumTxOkTotal = 0;
2466 priv->NumTxUnicast = 0;
2467 priv->keepAliveLevel = DEFAULT_KEEP_ALIVE_LEVEL;
2468 priv->CurrRetryCnt = 0;
2469 priv->LastRetryCnt = 0;
2470 priv->LastTxokCnt = 0;
2471 priv->LastRxokCnt = 0;
2472 priv->LastRetryRate = 0;
2473 priv->bTryuping = 0;
2474 priv->CurrTxRate = 0;
2475 priv->CurrRetryRate = 0;
2476 priv->TryupingCount = 0;
2477 priv->TryupingCountNoData = 0;
2478 priv->TryDownCountLowData = 0;
2479 priv->LastTxOKBytes = 0;
2480 priv->LastFailTxRate = 0;
2481 priv->LastFailTxRateSS = 0;
2482 priv->FailTxRateCount = 0;
2483 priv->LastTxThroughput = 0;
2484 priv->NumTxOkBytesTotal = 0;
2485 priv->ForcedDataRate = 0;
2486 priv->RegBModeGainStage = 1;
2488 priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
2489 spin_lock_init(&priv->irq_th_lock);
2490 spin_lock_init(&priv->tx_lock);
2491 spin_lock_init(&priv->ps_lock);
2492 spin_lock_init(&priv->rf_ps_lock);
2493 sema_init(&priv->wx_sem, 1);
2494 INIT_WORK(&priv->reset_wq, (void *)rtl8180_restart_wq);
2495 INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,
2496 (void *)rtl8180_hw_wakeup_wq);
2497 INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,
2498 (void *)rtl8180_hw_sleep_wq);
2499 INIT_WORK(&priv->ieee80211->wmm_param_update_wq,
2500 (void *)rtl8180_wmm_param_update);
2501 INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,
2502 (void *)rtl8180_rate_adapter);
2503 INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,
2504 (void *)rtl8180_hw_dig_wq);
2505 INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,
2506 (void *)rtl8180_tx_pw_wq);
2507 INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,
2508 (void *) GPIOChangeRFWorkItemCallBack);
2509 tasklet_init(&priv->irq_rx_tasklet,
2510 (void(*)(unsigned long)) rtl8180_irq_rx_tasklet,
2511 (unsigned long)priv);
2513 init_timer(&priv->watch_dog_timer);
2514 priv->watch_dog_timer.data = (unsigned long)dev;
2515 priv->watch_dog_timer.function = watch_dog_adaptive;
2517 init_timer(&priv->rateadapter_timer);
2518 priv->rateadapter_timer.data = (unsigned long)dev;
2519 priv->rateadapter_timer.function = timer_rate_adaptive;
2520 priv->RateAdaptivePeriod = RATE_ADAPTIVE_TIMER_PERIOD;
2521 priv->bEnhanceTxPwr = false;
2523 priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit;
2524 priv->ieee80211->set_chan = rtl8180_set_chan;
2525 priv->ieee80211->link_change = rtl8180_link_change;
2526 priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit;
2527 priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop;
2528 priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume;
2530 priv->ieee80211->init_wmmparam_flag = 0;
2532 priv->ieee80211->start_send_beacons = rtl8180_start_tx_beacon;
2533 priv->ieee80211->stop_send_beacons = rtl8180_beacon_tx_disable;
2534 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2536 priv->ShortRetryLimit = 7;
2537 priv->LongRetryLimit = 7;
2538 priv->EarlyRxThreshold = 7;
2540 priv->TransmitConfig = (1<<TCR_DurProcMode_OFFSET) |
2541 (7<<TCR_MXDMA_OFFSET) |
2542 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) |
2543 (priv->LongRetryLimit<<TCR_LRL_OFFSET);
2545 priv->ReceiveConfig = RCR_AMF | RCR_ADF | RCR_ACF |
2546 RCR_AB | RCR_AM | RCR_APM |
2547 (7<<RCR_MXDMA_OFFSET) |
2548 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) |
2549 (priv->EarlyRxThreshold == 7 ?
2550 RCR_ONLYERLPKT : 0);
2552 priv->IntrMask = IMR_TMGDOK | IMR_TBDER |
2553 IMR_THPDER | IMR_THPDOK |
2554 IMR_TVODER | IMR_TVODOK |
2555 IMR_TVIDER | IMR_TVIDOK |
2556 IMR_TBEDER | IMR_TBEDOK |
2557 IMR_TBKDER | IMR_TBKDOK |
2562 priv->InitialGain = 6;
2564 DMESG("MAC controller is a RTL8187SE b/g");
2566 priv->ieee80211->modulation |= IEEE80211_OFDM_MODULATION;
2567 priv->ieee80211->short_slot = 1;
2569 eeprom_93cx6_read(&eeprom, EEPROM_SW_REVD_OFFSET, &usValue);
2570 DMESG("usValue is %#hx\n", usValue);
2571 /* 3Read AntennaDiversity */
2573 /* SW Antenna Diversity. */
2574 priv->EEPROMSwAntennaDiversity = (usValue & EEPROM_SW_AD_MASK) ==
2575 EEPROM_SW_AD_ENABLE;
2577 /* Default Antenna to use. */
2578 priv->EEPROMDefaultAntenna1 = (usValue & EEPROM_DEF_ANT_MASK) ==
2581 if (priv->RegSwAntennaDiversityMechanism == 0) /* Auto */
2582 /* 0: default from EEPROM. */
2583 priv->bSwAntennaDiverity = priv->EEPROMSwAntennaDiversity;
2585 /* 1:disable antenna diversity, 2: enable antenna diversity. */
2586 priv->bSwAntennaDiverity = priv->RegSwAntennaDiversityMechanism == 2;
2588 if (priv->RegDefaultAntenna == 0)
2589 /* 0: default from EEPROM. */
2590 priv->bDefaultAntenna1 = priv->EEPROMDefaultAntenna1;
2592 /* 1: main, 2: aux. */
2593 priv->bDefaultAntenna1 = priv->RegDefaultAntenna == 2;
2595 priv->plcp_preamble_mode = 2;
2596 /* the eeprom type is stored in RCR register bit #6 */
2597 if (RCR_9356SEL & read_nic_dword(dev, RCR))
2598 priv->epromtype = EPROM_93c56;
2600 priv->epromtype = EPROM_93c46;
2602 eeprom_93cx6_multiread(&eeprom, 0x7, (__le16 *)
2605 for (i = 1, j = 0; i < 14; i += 2, j++) {
2606 eeprom_93cx6_read(&eeprom, EPROM_TXPW_CH1_2 + j, &word);
2607 priv->chtxpwr[i] = word & 0xff;
2608 priv->chtxpwr[i+1] = (word & 0xff00)>>8;
2610 for (i = 1, j = 0; i < 14; i += 2, j++) {
2611 eeprom_93cx6_read(&eeprom, EPROM_TXPW_OFDM_CH1_2 + j, &word);
2612 priv->chtxpwr_ofdm[i] = word & 0xff;
2613 priv->chtxpwr_ofdm[i+1] = (word & 0xff00) >> 8;
2616 /* 3Read crystal calibration and thermal meter indication on 87SE. */
2617 eeprom_93cx6_read(&eeprom, EEPROM_RSV>>1, &tmpu16);
2619 /* Crystal calibration for Xin and Xout resp. */
2620 priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK;
2621 priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK) >> 4;
2622 if ((tmpu16 & EEPROM_XTAL_CAL_ENABLE) >> 12)
2623 priv->bXtalCalibration = true;
2625 /* Thermal meter reference indication. */
2626 priv->ThermalMeter = (u8)((tmpu16 & EEPROM_THERMAL_METER_MASK) >> 8);
2627 if ((tmpu16 & EEPROM_THERMAL_METER_ENABLE) >> 13)
2628 priv->bTxPowerTrack = true;
2630 priv->rf_sleep = rtl8225z4_rf_sleep;
2631 priv->rf_wakeup = rtl8225z4_rf_wakeup;
2632 DMESGW("**PLEASE** REPORT SUCCESSFUL/UNSUCCESSFUL TO Realtek!");
2634 priv->rf_close = rtl8225z2_rf_close;
2635 priv->rf_init = rtl8225z2_rf_init;
2636 priv->rf_set_chan = rtl8225z2_rf_set_chan;
2637 priv->rf_set_sens = NULL;
2639 if (0 != alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount))
2642 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2643 TX_MANAGEPRIORITY_RING_ADDR))
2646 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2647 TX_BKPRIORITY_RING_ADDR))
2650 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2651 TX_BEPRIORITY_RING_ADDR))
2654 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2655 TX_VIPRIORITY_RING_ADDR))
2658 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2659 TX_VOPRIORITY_RING_ADDR))
2662 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2663 TX_HIGHPRIORITY_RING_ADDR))
2666 if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txbeaconcount,
2667 TX_BEACON_RING_ADDR))
2670 if (request_irq(dev->irq, rtl8180_interrupt, IRQF_SHARED, dev->name, dev)) {
2671 DMESGE("Error allocating IRQ %d", dev->irq);
2674 priv->irq = dev->irq;
2675 DMESG("IRQ %d", dev->irq);
2681 void rtl8180_no_hw_wep(struct net_device *dev)
2685 void rtl8180_set_hw_wep(struct net_device *dev)
2687 struct r8180_priv *priv = ieee80211_priv(dev);
2692 pgreg = read_nic_byte(dev, PGSELECT);
2693 write_nic_byte(dev, PGSELECT, pgreg & ~(1<<PGSELECT_PG_SHIFT));
2695 key0_word4 = read_nic_dword(dev, KEY0+4+4+4);
2696 key0_word4 &= ~0xff;
2697 key0_word4 |= priv->key0[3] & 0xff;
2698 write_nic_dword(dev, KEY0, (priv->key0[0]));
2699 write_nic_dword(dev, KEY0+4, (priv->key0[1]));
2700 write_nic_dword(dev, KEY0+4+4, (priv->key0[2]));
2701 write_nic_dword(dev, KEY0+4+4+4, (key0_word4));
2703 security = read_nic_byte(dev, SECURITY);
2704 security |= (1<<SECURITY_WEP_TX_ENABLE_SHIFT);
2705 security |= (1<<SECURITY_WEP_RX_ENABLE_SHIFT);
2706 security &= ~SECURITY_ENCRYP_MASK;
2707 security |= (SECURITY_ENCRYP_104<<SECURITY_ENCRYP_SHIFT);
2709 write_nic_byte(dev, SECURITY, security);
2711 DMESG("key %x %x %x %x", read_nic_dword(dev, KEY0+4+4+4),
2712 read_nic_dword(dev, KEY0+4+4), read_nic_dword(dev, KEY0+4),
2713 read_nic_dword(dev, KEY0));
2717 void rtl8185_rf_pins_enable(struct net_device *dev)
2720 /* tmp = read_nic_word(dev, RFPinsEnable); */
2721 write_nic_word(dev, RFPinsEnable, 0x1fff); /* | tmp); */
2724 void rtl8185_set_anaparam2(struct net_device *dev, u32 a)
2728 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
2730 conf3 = read_nic_byte(dev, CONFIG3);
2731 write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
2732 write_nic_dword(dev, ANAPARAM2, a);
2734 conf3 = read_nic_byte(dev, CONFIG3);
2735 write_nic_byte(dev, CONFIG3, conf3 & ~(1<<CONFIG3_ANAPARAM_W_SHIFT));
2736 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2739 void rtl8180_set_anaparam(struct net_device *dev, u32 a)
2743 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
2745 conf3 = read_nic_byte(dev, CONFIG3);
2746 write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
2747 write_nic_dword(dev, ANAPARAM, a);
2749 conf3 = read_nic_byte(dev, CONFIG3);
2750 write_nic_byte(dev, CONFIG3, conf3 & ~(1<<CONFIG3_ANAPARAM_W_SHIFT));
2751 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2754 void rtl8185_tx_antenna(struct net_device *dev, u8 ant)
2756 write_nic_byte(dev, TX_ANTENNA, ant);
2757 force_pci_posting(dev);
2761 static void rtl8185_write_phy(struct net_device *dev, u8 adr, u32 data)
2767 phyw = ((data<<8) | adr);
2769 /* Note that, we must write 0xff7c after 0x7d-0x7f to write BB register. */
2770 write_nic_byte(dev, 0x7f, ((phyw & 0xff000000) >> 24));
2771 write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16));
2772 write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8));
2773 write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff)));
2775 /* this is ok to fail when we write AGC table. check for AGC table might be
2776 * done by masking with 0x7f instead of 0xff
2778 /* if (phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); */
2781 inline void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data)
2784 rtl8185_write_phy(dev, adr, data);
2787 void write_phy_cck(struct net_device *dev, u8 adr, u32 data)
2790 rtl8185_write_phy(dev, adr, data | 0x10000);
2794 * This configures registers for beacon tx and enables it via
2795 * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might
2796 * be used to stop beacon transmission
2798 void rtl8180_start_tx_beacon(struct net_device *dev)
2802 DMESG("Enabling beacon TX");
2803 rtl8180_prepare_beacon(dev);
2804 rtl8180_irq_disable(dev);
2805 rtl8180_beacon_tx_enable(dev);
2807 word = read_nic_word(dev, AtimWnd) & ~AtimWnd_AtimWnd;
2808 write_nic_word(dev, AtimWnd, word); /* word |= */
2810 word = read_nic_word(dev, BintrItv);
2811 word &= ~BintrItv_BintrItv;
2812 word |= 1000; /* priv->ieee80211->current_network.beacon_interval *
2813 ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1);
2814 // FIXME: check if correct ^^ worked with 0x3e8;
2816 write_nic_word(dev, BintrItv, word);
2818 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2820 rtl8185b_irq_enable(dev);
2823 static struct net_device_stats *rtl8180_stats(struct net_device *dev)
2825 struct r8180_priv *priv = ieee80211_priv(dev);
2827 return &priv->ieee80211->stats;
2831 * Change current and default preamble mode.
2834 MgntActSet_802_11_PowerSaveMode(
2835 struct r8180_priv *priv,
2839 /* Currently, we do not change power save mode on IBSS mode. */
2840 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
2843 priv->ieee80211->ps = rtPsMode;
2848 void LeisurePSEnter(struct r8180_priv *priv)
2850 if (priv->bLeisurePs) {
2851 if (priv->ieee80211->ps == IEEE80211_PS_DISABLED)
2852 /* IEEE80211_PS_ENABLE */
2853 MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_MBCAST|IEEE80211_PS_UNICAST);
2857 void LeisurePSLeave(struct r8180_priv *priv)
2859 if (priv->bLeisurePs) {
2860 if (priv->ieee80211->ps != IEEE80211_PS_DISABLED)
2861 MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_DISABLED);
2865 void rtl8180_hw_wakeup_wq(struct work_struct *work)
2867 struct delayed_work *dwork = to_delayed_work(work);
2868 struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, hw_wakeup_wq);
2869 struct net_device *dev = ieee->dev;
2871 rtl8180_hw_wakeup(dev);
2874 void rtl8180_hw_sleep_wq(struct work_struct *work)
2876 struct delayed_work *dwork = to_delayed_work(work);
2877 struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, hw_sleep_wq);
2878 struct net_device *dev = ieee->dev;
2880 rtl8180_hw_sleep_down(dev);
2883 static void MgntLinkKeepAlive(struct r8180_priv *priv)
2885 if (priv->keepAliveLevel == 0)
2888 if (priv->ieee80211->state == IEEE80211_LINKED) {
2893 if ((priv->keepAliveLevel == 2) ||
2894 (priv->link_detect.LastNumTxUnicast == priv->NumTxUnicast &&
2895 priv->link_detect.LastNumRxUnicast == priv->ieee80211->NumRxUnicast)
2897 priv->link_detect.IdleCount++;
2900 * Send a Keep-Alive packet packet to AP if we had been idle for a while.
2902 if (priv->link_detect.IdleCount >= ((KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD)-1)) {
2903 priv->link_detect.IdleCount = 0;
2904 ieee80211_sta_ps_send_null_frame(priv->ieee80211, false);
2907 priv->link_detect.IdleCount = 0;
2909 priv->link_detect.LastNumTxUnicast = priv->NumTxUnicast;
2910 priv->link_detect.LastNumRxUnicast = priv->ieee80211->NumRxUnicast;
2914 void rtl8180_watch_dog(struct net_device *dev)
2916 struct r8180_priv *priv = ieee80211_priv(dev);
2917 bool bEnterPS = false;
2918 bool bBusyTraffic = false;
2922 if (priv->ieee80211->actscanning == false) {
2923 if ((priv->ieee80211->iw_mode != IW_MODE_ADHOC) &&
2924 (priv->ieee80211->state == IEEE80211_NOLINK) &&
2925 (priv->ieee80211->beinretry == false) &&
2926 (priv->eRFPowerState == eRfOn))
2929 /* YJ,add,080828,for link state check */
2930 if ((priv->ieee80211->state == IEEE80211_LINKED) && (priv->ieee80211->iw_mode == IW_MODE_INFRA)) {
2931 SlotIndex = (priv->link_detect.SlotIndex++) % priv->link_detect.SlotNum;
2932 priv->link_detect.RxFrameNum[SlotIndex] = priv->ieee80211->NumRxDataInPeriod + priv->ieee80211->NumRxBcnInPeriod;
2933 for (i = 0; i < priv->link_detect.SlotNum; i++)
2934 TotalRxNum += priv->link_detect.RxFrameNum[i];
2936 if (TotalRxNum == 0) {
2937 priv->ieee80211->state = IEEE80211_ASSOCIATING;
2938 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
2942 /* YJ,add,080828,for KeepAlive */
2943 MgntLinkKeepAlive(priv);
2945 /* YJ,add,080828,for LPS */
2946 LeisurePSLeave(priv);
2948 if (priv->ieee80211->state == IEEE80211_LINKED) {
2949 priv->link_detect.NumRxOkInPeriod = priv->ieee80211->NumRxDataInPeriod;
2950 if (priv->link_detect.NumRxOkInPeriod > 666 ||
2951 priv->link_detect.NumTxOkInPeriod > 666) {
2952 bBusyTraffic = true;
2954 if (((priv->link_detect.NumRxOkInPeriod + priv->link_detect.NumTxOkInPeriod) > 8)
2955 || (priv->link_detect.NumRxOkInPeriod > 2)) {
2961 LeisurePSEnter(priv);
2963 LeisurePSLeave(priv);
2965 LeisurePSLeave(priv);
2966 priv->link_detect.bBusyTraffic = bBusyTraffic;
2967 priv->link_detect.NumRxOkInPeriod = 0;
2968 priv->link_detect.NumTxOkInPeriod = 0;
2969 priv->ieee80211->NumRxDataInPeriod = 0;
2970 priv->ieee80211->NumRxBcnInPeriod = 0;
2973 static int _rtl8180_up(struct net_device *dev)
2975 struct r8180_priv *priv = ieee80211_priv(dev);
2979 DMESG("Bringing up iface");
2980 rtl8185b_adapter_start(dev);
2981 rtl8185b_rx_enable(dev);
2982 rtl8185b_tx_enable(dev);
2983 if (priv->bInactivePs) {
2984 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
2987 timer_rate_adaptive((unsigned long)dev);
2988 watch_dog_adaptive((unsigned long)dev);
2989 if (priv->bSwAntennaDiverity)
2990 SwAntennaDiversityTimerCallback(dev);
2991 ieee80211_softmac_start_protocol(priv->ieee80211);
2995 static int rtl8180_open(struct net_device *dev)
2997 struct r8180_priv *priv = ieee80211_priv(dev);
3000 down(&priv->wx_sem);
3001 ret = rtl8180_up(dev);
3006 int rtl8180_up(struct net_device *dev)
3008 struct r8180_priv *priv = ieee80211_priv(dev);
3013 return _rtl8180_up(dev);
3016 static int rtl8180_close(struct net_device *dev)
3018 struct r8180_priv *priv = ieee80211_priv(dev);
3021 down(&priv->wx_sem);
3022 ret = rtl8180_down(dev);
3028 int rtl8180_down(struct net_device *dev)
3030 struct r8180_priv *priv = ieee80211_priv(dev);
3037 ieee80211_softmac_stop_protocol(priv->ieee80211);
3039 if (!netif_queue_stopped(dev))
3040 netif_stop_queue(dev);
3041 rtl8180_rtx_disable(dev);
3042 rtl8180_irq_disable(dev);
3043 del_timer_sync(&priv->watch_dog_timer);
3044 del_timer_sync(&priv->rateadapter_timer);
3045 cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
3046 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
3047 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
3048 cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
3049 cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
3050 del_timer_sync(&priv->SwAntennaDiversityTimer);
3051 SetZebraRFPowerState8185(dev, eRfOff);
3052 memset(&(priv->ieee80211->current_network), 0, sizeof(struct ieee80211_network));
3053 priv->ieee80211->state = IEEE80211_NOLINK;
3057 void rtl8180_restart_wq(struct work_struct *work)
3059 struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq);
3060 struct net_device *dev = priv->dev;
3062 down(&priv->wx_sem);
3064 rtl8180_commit(dev);
3069 static void rtl8180_restart(struct net_device *dev)
3071 struct r8180_priv *priv = ieee80211_priv(dev);
3073 schedule_work(&priv->reset_wq);
3076 void rtl8180_commit(struct net_device *dev)
3078 struct r8180_priv *priv = ieee80211_priv(dev);
3083 del_timer_sync(&priv->watch_dog_timer);
3084 del_timer_sync(&priv->rateadapter_timer);
3085 cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
3086 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
3087 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
3088 cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
3089 cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
3090 del_timer_sync(&priv->SwAntennaDiversityTimer);
3091 ieee80211_softmac_stop_protocol(priv->ieee80211);
3092 rtl8180_irq_disable(dev);
3093 rtl8180_rtx_disable(dev);
3097 static void r8180_set_multicast(struct net_device *dev)
3099 struct r8180_priv *priv = ieee80211_priv(dev);
3102 promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
3104 if (promisc != priv->promisc)
3105 rtl8180_restart(dev);
3107 priv->promisc = promisc;
3110 static int r8180_set_mac_adr(struct net_device *dev, void *mac)
3112 struct r8180_priv *priv = ieee80211_priv(dev);
3113 struct sockaddr *addr = mac;
3115 down(&priv->wx_sem);
3117 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
3119 if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
3120 memcpy(priv->ieee80211->current_network.bssid, dev->dev_addr, ETH_ALEN);
3132 /* based on ipw2200 driver */
3133 static int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
3135 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3136 struct iwreq *wrq = (struct iwreq *) rq;
3140 case RTL_IOCTL_WPA_SUPPLICANT:
3141 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
3150 static const struct net_device_ops rtl8180_netdev_ops = {
3151 .ndo_open = rtl8180_open,
3152 .ndo_stop = rtl8180_close,
3153 .ndo_get_stats = rtl8180_stats,
3154 .ndo_tx_timeout = rtl8180_restart,
3155 .ndo_do_ioctl = rtl8180_ioctl,
3156 .ndo_set_rx_mode = r8180_set_multicast,
3157 .ndo_set_mac_address = r8180_set_mac_adr,
3158 .ndo_validate_addr = eth_validate_addr,
3159 .ndo_change_mtu = eth_change_mtu,
3160 .ndo_start_xmit = ieee80211_rtl_xmit,
3163 static int rtl8180_pci_probe(struct pci_dev *pdev,
3164 const struct pci_device_id *id)
3166 unsigned long ioaddr = 0;
3167 struct net_device *dev = NULL;
3168 struct r8180_priv *priv = NULL;
3172 unsigned long pmem_start, pmem_len, pmem_flags;
3174 DMESG("Configuring chip resources");
3176 if (pci_enable_device(pdev)) {
3177 DMESG("Failed to enable PCI device");
3181 pci_set_master(pdev);
3182 pci_set_dma_mask(pdev, 0xffffff00ULL);
3183 pci_set_consistent_dma_mask(pdev, 0xffffff00ULL);
3184 dev = alloc_ieee80211(sizeof(struct r8180_priv));
3189 priv = ieee80211_priv(dev);
3190 priv->ieee80211 = netdev_priv(dev);
3192 pci_set_drvdata(pdev, dev);
3193 SET_NETDEV_DEV(dev, &pdev->dev);
3195 priv = ieee80211_priv(dev);
3198 pmem_start = pci_resource_start(pdev, 1);
3199 pmem_len = pci_resource_len(pdev, 1);
3200 pmem_flags = pci_resource_flags(pdev, 1);
3202 if (!(pmem_flags & IORESOURCE_MEM)) {
3203 DMESG("region #1 not a MMIO resource, aborting");
3207 if (!request_mem_region(pmem_start, pmem_len, RTL8180_MODULE_NAME)) {
3208 DMESG("request_mem_region failed!");
3212 ioaddr = (unsigned long)ioremap_nocache(pmem_start, pmem_len);
3213 if (ioaddr == (unsigned long)NULL) {
3214 DMESG("ioremap failed!");
3218 dev->mem_start = ioaddr; /* shared mem start */
3219 dev->mem_end = ioaddr + pci_resource_len(pdev, 0); /* shared mem end */
3221 pci_read_config_byte(pdev, 0x05, &unit);
3222 pci_write_config_byte(pdev, 0x05, unit & (~0x04));
3224 dev->irq = pdev->irq;
3227 dev->netdev_ops = &rtl8180_netdev_ops;
3228 dev->wireless_handlers = &r8180_wx_handlers_def;
3230 dev->type = ARPHRD_ETHER;
3231 dev->watchdog_timeo = HZ*3;
3233 if (dev_alloc_name(dev, ifname) < 0) {
3234 DMESG("Oops: devname already taken! Trying wlan%%d...\n");
3235 strcpy(ifname, "wlan%d");
3236 dev_alloc_name(dev, ifname);
3239 if (rtl8180_init(dev) != 0) {
3240 DMESG("Initialization failed");
3244 netif_carrier_off(dev);
3246 if (register_netdev(dev))
3249 rtl8180_proc_init_one(dev);
3251 DMESG("Driver probe completed\n");
3254 if (dev->mem_start != (unsigned long)NULL) {
3255 iounmap((void __iomem *)dev->mem_start);
3256 release_mem_region(pci_resource_start(pdev, 1),
3257 pci_resource_len(pdev, 1));
3262 free_irq(dev->irq, dev);
3265 free_ieee80211(dev);
3269 pci_disable_device(pdev);
3271 DMESG("wlan driver load failed\n");
3275 static void rtl8180_pci_remove(struct pci_dev *pdev)
3277 struct r8180_priv *priv;
3278 struct net_device *dev = pci_get_drvdata(pdev);
3281 unregister_netdev(dev);
3283 priv = ieee80211_priv(dev);
3285 rtl8180_proc_remove_one(dev);
3287 priv->rf_close(dev);
3292 DMESG("Freeing irq %d", dev->irq);
3293 free_irq(dev->irq, dev);
3297 free_rx_desc_ring(dev);
3298 free_tx_desc_rings(dev);
3300 if (dev->mem_start != (unsigned long)NULL) {
3301 iounmap((void __iomem *)dev->mem_start);
3302 release_mem_region(pci_resource_start(pdev, 1),
3303 pci_resource_len(pdev, 1));
3306 free_ieee80211(dev);
3308 pci_disable_device(pdev);
3310 DMESG("wlan driver removed\n");
3313 /* fun with the built-in ieee80211 stack... */
3314 extern int ieee80211_crypto_init(void);
3315 extern void ieee80211_crypto_deinit(void);
3316 extern int ieee80211_crypto_tkip_init(void);
3317 extern void ieee80211_crypto_tkip_exit(void);
3318 extern int ieee80211_crypto_ccmp_init(void);
3319 extern void ieee80211_crypto_ccmp_exit(void);
3320 extern int ieee80211_crypto_wep_init(void);
3321 extern void ieee80211_crypto_wep_exit(void);
3323 static int __init rtl8180_pci_module_init(void)
3327 ret = ieee80211_crypto_init();
3329 pr_err("ieee80211_crypto_init() failed %d\n", ret);
3332 ret = ieee80211_crypto_tkip_init();
3334 pr_err("ieee80211_crypto_tkip_init() failed %d\n", ret);
3337 ret = ieee80211_crypto_ccmp_init();
3339 pr_err("ieee80211_crypto_ccmp_init() failed %d\n", ret);
3342 ret = ieee80211_crypto_wep_init();
3344 pr_err("ieee80211_crypto_wep_init() failed %d\n", ret);
3348 pr_info("\nLinux kernel driver for RTL8180 / RTL8185 based WLAN cards\n");
3349 pr_info("Copyright (c) 2004-2005, Andrea Merello\n");
3350 DMESG("Initializing module");
3351 DMESG("Wireless extensions version %d", WIRELESS_EXT);
3352 rtl8180_proc_module_init();
3354 if (pci_register_driver(&rtl8180_pci_driver)) {
3355 DMESG("No device found");
3361 static void __exit rtl8180_pci_module_exit(void)
3363 pci_unregister_driver(&rtl8180_pci_driver);
3364 rtl8180_proc_module_remove();
3365 ieee80211_crypto_tkip_exit();
3366 ieee80211_crypto_ccmp_exit();
3367 ieee80211_crypto_wep_exit();
3368 ieee80211_crypto_deinit();
3372 static void rtl8180_try_wake_queue(struct net_device *dev, int pri)
3374 unsigned long flags;
3376 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3378 spin_lock_irqsave(&priv->tx_lock, flags);
3379 enough_desc = check_nic_enought_desc(dev, pri);
3380 spin_unlock_irqrestore(&priv->tx_lock, flags);
3383 ieee80211_rtl_wake_queue(priv->ieee80211);
3386 static void rtl8180_tx_isr(struct net_device *dev, int pri, short error)
3388 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3389 u32 *tail; /* tail virtual addr */
3390 u32 *head; /* head virtual addr */
3391 u32 *begin; /* start of ring virtual addr */
3392 u32 *nicv; /* nic pointer virtual addr */
3393 u32 nic; /* nic pointer physical addr */
3394 u32 nicbegin; /* start of ring physical addr */
3396 /* physical addr are ok on 32 bits since we set DMA mask */
3401 priv->stats.txretry++; /* tony 20060601 */
3402 spin_lock_irqsave(&priv->tx_lock, flag);
3404 case MANAGE_PRIORITY:
3405 tail = priv->txmapringtail;
3406 begin = priv->txmapring;
3407 head = priv->txmapringhead;
3408 nic = read_nic_dword(dev, TX_MANAGEPRIORITY_RING_ADDR);
3409 nicbegin = priv->txmapringdma;
3412 tail = priv->txbkpringtail;
3413 begin = priv->txbkpring;
3414 head = priv->txbkpringhead;
3415 nic = read_nic_dword(dev, TX_BKPRIORITY_RING_ADDR);
3416 nicbegin = priv->txbkpringdma;
3419 tail = priv->txbepringtail;
3420 begin = priv->txbepring;
3421 head = priv->txbepringhead;
3422 nic = read_nic_dword(dev, TX_BEPRIORITY_RING_ADDR);
3423 nicbegin = priv->txbepringdma;
3426 tail = priv->txvipringtail;
3427 begin = priv->txvipring;
3428 head = priv->txvipringhead;
3429 nic = read_nic_dword(dev, TX_VIPRIORITY_RING_ADDR);
3430 nicbegin = priv->txvipringdma;
3433 tail = priv->txvopringtail;
3434 begin = priv->txvopring;
3435 head = priv->txvopringhead;
3436 nic = read_nic_dword(dev, TX_VOPRIORITY_RING_ADDR);
3437 nicbegin = priv->txvopringdma;
3440 tail = priv->txhpringtail;
3441 begin = priv->txhpring;
3442 head = priv->txhpringhead;
3443 nic = read_nic_dword(dev, TX_HIGHPRIORITY_RING_ADDR);
3444 nicbegin = priv->txhpringdma;
3448 spin_unlock_irqrestore(&priv->tx_lock, flag);
3452 nicv = (u32 *)((nic - nicbegin) + (u8 *)begin);
3453 if ((head <= tail && (nicv > tail || nicv < head)) ||
3454 (head > tail && (nicv > tail && nicv < head))) {
3455 DMESGW("nic has lost pointer");
3456 spin_unlock_irqrestore(&priv->tx_lock, flag);
3457 rtl8180_restart(dev);
3462 * We check all the descriptors between the head and the nic,
3463 * but not the currently pointed by the nic (the next to be txed)
3464 * and the previous of the pointed (might be in process ??)
3466 offs = (nic - nicbegin);
3467 offs = offs / 8 / 4;
3468 hd = (head - begin) / 8;
3473 j = offs + (priv->txringcount-1-hd);
3479 for (i = 0; i < j; i++) {
3480 if ((*head) & (1<<31))
3482 if (((*head)&(0x10000000)) != 0) {
3483 priv->CurrRetryCnt += (u16)((*head) & (0x000000ff));
3485 priv->NumTxOkTotal++;
3489 priv->NumTxOkBytesTotal += (*(head+3)) & (0x00000fff);
3491 *head = *head & ~(1<<31);
3493 if ((head - begin)/8 == priv->txringcount-1)
3500 * The head has been moved to the last certainly TXed
3501 * (or at least processed by the nic) packet.
3502 * The driver take forcefully owning of all these packets
3503 * If the packet previous of the nic pointer has been
3504 * processed this doesn't matter: it will be checked
3505 * here at the next round. Anyway if no more packet are
3506 * TXed no memory leak occur at all.
3510 case MANAGE_PRIORITY:
3511 priv->txmapringhead = head;
3513 if (priv->ack_tx_to_ieee) {
3514 if (rtl8180_is_tx_queue_empty(dev)) {
3515 priv->ack_tx_to_ieee = 0;
3516 ieee80211_ps_tx_ack(priv->ieee80211, !error);
3521 priv->txbkpringhead = head;
3524 priv->txbepringhead = head;
3527 priv->txvipringhead = head;
3530 priv->txvopringhead = head;
3533 priv->txhpringhead = head;
3537 spin_unlock_irqrestore(&priv->tx_lock, flag);
3540 irqreturn_t rtl8180_interrupt(int irq, void *netdev)
3542 struct net_device *dev = (struct net_device *) netdev;
3543 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3544 unsigned long flags;
3547 /* We should return IRQ_NONE, but for now let me keep this */
3548 if (priv->irq_enabled == 0)
3551 spin_lock_irqsave(&priv->irq_th_lock, flags);
3554 inta = read_nic_dword(dev, ISR); /* & priv->IntrMask; */
3555 write_nic_dword(dev, ISR, inta); /* reset int situation */
3557 priv->stats.shints++;
3560 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3563 * most probably we can safely return IRQ_NONE,
3564 * but for now is better to avoid problems
3568 if (inta == 0xffff) {
3569 /* HW disappeared */
3570 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3576 if (!netif_running(dev)) {
3577 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3581 if (inta & ISR_TimeOut)
3582 write_nic_dword(dev, TimerInt, 0);
3584 if (inta & ISR_TBDOK)
3585 priv->stats.txbeacon++;
3587 if (inta & ISR_TBDER)
3588 priv->stats.txbeaconerr++;
3590 if (inta & IMR_TMGDOK)
3591 rtl8180_tx_isr(dev, MANAGE_PRIORITY, 0);
3593 if (inta & ISR_THPDER) {
3594 priv->stats.txhperr++;
3595 rtl8180_tx_isr(dev, HI_PRIORITY, 1);
3596 priv->ieee80211->stats.tx_errors++;
3599 if (inta & ISR_THPDOK) { /* High priority tx ok */
3600 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3601 priv->stats.txhpokint++;
3602 rtl8180_tx_isr(dev, HI_PRIORITY, 0);
3606 priv->stats.rxerr++;
3608 if (inta & ISR_TBKDER) { /* corresponding to BK_PRIORITY */
3609 priv->stats.txbkperr++;
3610 priv->ieee80211->stats.tx_errors++;
3611 rtl8180_tx_isr(dev, BK_PRIORITY, 1);
3612 rtl8180_try_wake_queue(dev, BK_PRIORITY);
3615 if (inta & ISR_TBEDER) { /* corresponding to BE_PRIORITY */
3616 priv->stats.txbeperr++;
3617 priv->ieee80211->stats.tx_errors++;
3618 rtl8180_tx_isr(dev, BE_PRIORITY, 1);
3619 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3621 if (inta & ISR_TNPDER) { /* corresponding to VO_PRIORITY */
3622 priv->stats.txnperr++;
3623 priv->ieee80211->stats.tx_errors++;
3624 rtl8180_tx_isr(dev, NORM_PRIORITY, 1);
3625 rtl8180_try_wake_queue(dev, NORM_PRIORITY);
3628 if (inta & ISR_TLPDER) { /* corresponding to VI_PRIORITY */
3629 priv->stats.txlperr++;
3630 priv->ieee80211->stats.tx_errors++;
3631 rtl8180_tx_isr(dev, LOW_PRIORITY, 1);
3632 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
3635 if (inta & ISR_ROK) {
3636 priv->stats.rxint++;
3637 tasklet_schedule(&priv->irq_rx_tasklet);
3640 if (inta & ISR_RQoSOK) {
3641 priv->stats.rxint++;
3642 tasklet_schedule(&priv->irq_rx_tasklet);
3645 if (inta & ISR_BcnInt)
3646 rtl8180_prepare_beacon(dev);
3648 if (inta & ISR_RDU) {
3649 DMESGW("No RX descriptor available");
3650 priv->stats.rxrdu++;
3651 tasklet_schedule(&priv->irq_rx_tasklet);
3654 if (inta & ISR_RXFOVW) {
3655 priv->stats.rxoverflow++;
3656 tasklet_schedule(&priv->irq_rx_tasklet);
3659 if (inta & ISR_TXFOVW)
3660 priv->stats.txoverflow++;
3662 if (inta & ISR_TNPDOK) { /* Normal priority tx ok */
3663 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3664 priv->stats.txnpokint++;
3665 rtl8180_tx_isr(dev, NORM_PRIORITY, 0);
3666 rtl8180_try_wake_queue(dev, NORM_PRIORITY);
3669 if (inta & ISR_TLPDOK) { /* Low priority tx ok */
3670 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3671 priv->stats.txlpokint++;
3672 rtl8180_tx_isr(dev, LOW_PRIORITY, 0);
3673 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
3676 if (inta & ISR_TBKDOK) { /* corresponding to BK_PRIORITY */
3677 priv->stats.txbkpokint++;
3678 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3679 rtl8180_tx_isr(dev, BK_PRIORITY, 0);
3680 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3683 if (inta & ISR_TBEDOK) { /* corresponding to BE_PRIORITY */
3684 priv->stats.txbeperr++;
3685 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3686 rtl8180_tx_isr(dev, BE_PRIORITY, 0);
3687 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3689 force_pci_posting(dev);
3690 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3695 void rtl8180_irq_rx_tasklet(struct r8180_priv *priv)
3697 rtl8180_rx(priv->dev);
3700 void GPIOChangeRFWorkItemCallBack(struct work_struct *work)
3702 struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, GPIOChangeRFWorkItem.work);
3703 struct net_device *dev = ieee->dev;
3704 struct r8180_priv *priv = ieee80211_priv(dev);
3707 RT_RF_POWER_STATE eRfPowerStateToSet;
3708 bool bActuallySet = false;
3711 static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
3712 static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
3713 static int readf_count;
3715 readf_count = (readf_count+1)%0xffff;
3716 /* We should turn off LED before polling FF51[4]. */
3719 btPSR = read_nic_byte(dev, PSR);
3720 write_nic_byte(dev, PSR, (btPSR & ~BIT3));
3722 /* It need to delay 4us suggested by Jong, 2008-01-16 */
3725 /* HW radio On/Off according to the value of FF51[4](config0) */
3726 btConfig0 = btPSR = read_nic_byte(dev, CONFIG0);
3728 eRfPowerStateToSet = (btConfig0 & BIT4) ? eRfOn : eRfOff;
3730 /* Turn LED back on when radio enabled */
3731 if (eRfPowerStateToSet == eRfOn)
3732 write_nic_byte(dev, PSR, btPSR | BIT3);
3734 if ((priv->ieee80211->bHwRadioOff == true) &&
3735 (eRfPowerStateToSet == eRfOn)) {
3736 priv->ieee80211->bHwRadioOff = false;
3737 bActuallySet = true;
3738 } else if ((priv->ieee80211->bHwRadioOff == false) &&
3739 (eRfPowerStateToSet == eRfOff)) {
3740 priv->ieee80211->bHwRadioOff = true;
3741 bActuallySet = true;
3745 MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
3747 /* To update the UI status for Power status changed */
3748 if (priv->ieee80211->bHwRadioOff == true)
3752 argv[0] = RadioPowerPath;
3755 call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
3759 module_init(rtl8180_pci_module_init);
3760 module_exit(rtl8180_pci_module_exit);