Merge tag 'sh-for-linus' of git://github.com/pmundt/linux-sh
[firefly-linux-kernel-4.4.55.git] / drivers / staging / rtl8187se / r8180_core.c
1 /*
2    This is part of rtl818x pci OpenSource driver - v 0.1
3    Copyright (C) Andrea Merello 2004-2005  <andreamrl@tiscali.it>
4    Released under the terms of GPL (General Public License)
5
6    Parts of this driver are based on the GPL part of the official
7    Realtek driver.
8
9    Parts of this driver are based on the rtl8180 driver skeleton
10    from Patric Schenke & Andres Salomon.
11
12    Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver.
13
14    Parts of BB/RF code are derived from David Young rtl8180 netbsd driver.
15
16    RSSI calc function from 'The Deuce'
17
18    Some ideas borrowed from the 8139too.c driver included in linux kernel.
19
20    We (I?) want to thanks the Authors of those projecs and also the
21    Ndiswrapper's project Authors.
22
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.
25
26    Power management interface routines.
27    Written by Mariusz Matuszek.
28 */
29
30 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31
32 #undef RX_DONT_PASS_UL
33 #undef DUMMY_RX
34
35 #include <linux/slab.h>
36 #include <linux/syscalls.h>
37 #include <linux/eeprom_93cx6.h>
38 #include <linux/interrupt.h>
39
40 #include "r8180_hw.h"
41 #include "r8180.h"
42 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
43 #include "r8180_93cx6.h"   /* Card EEPROM */
44 #include "r8180_wx.h"
45 #include "r8180_dm.h"
46
47 #include "ieee80211/dot11d.h"
48
49 static struct pci_device_id rtl8180_pci_id_tbl[] = {
50         {
51                 .vendor = PCI_VENDOR_ID_REALTEK,
52                 .device = 0x8199,
53                 .subvendor = PCI_ANY_ID,
54                 .subdevice = PCI_ANY_ID,
55                 .driver_data = 0,
56         },
57         {
58                 .vendor = 0,
59                 .device = 0,
60                 .subvendor = 0,
61                 .subdevice = 0,
62                 .driver_data = 0,
63         }
64 };
65
66 static char ifname[IFNAMSIZ] = "wlan%d";
67 static int hwwep;
68
69 MODULE_LICENSE("GPL");
70 MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl);
71 MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
72 MODULE_DESCRIPTION("Linux driver for Realtek RTL8187SE WiFi cards");
73
74 module_param_string(ifname, ifname, sizeof(ifname), S_IRUGO|S_IWUSR);
75 module_param(hwwep, int, S_IRUGO|S_IWUSR);
76
77 MODULE_PARM_DESC(hwwep, " Try to use hardware WEP support. Still broken and not available on all cards");
78
79 static int rtl8180_pci_probe(struct pci_dev *pdev,
80                                        const struct pci_device_id *id);
81
82 static void rtl8180_pci_remove(struct pci_dev *pdev);
83
84 static void rtl8180_shutdown(struct pci_dev *pdev)
85 {
86         struct net_device *dev = pci_get_drvdata(pdev);
87         if (dev->netdev_ops->ndo_stop)
88                 dev->netdev_ops->ndo_stop(dev);
89         pci_disable_device(pdev);
90 }
91
92 static int rtl8180_suspend(struct pci_dev *pdev, pm_message_t state)
93 {
94         struct net_device *dev = pci_get_drvdata(pdev);
95
96         if (!netif_running(dev))
97                 goto out_pci_suspend;
98
99         if (dev->netdev_ops->ndo_stop)
100                 dev->netdev_ops->ndo_stop(dev);
101
102         netif_device_detach(dev);
103
104 out_pci_suspend:
105         pci_save_state(pdev);
106         pci_disable_device(pdev);
107         pci_set_power_state(pdev, pci_choose_state(pdev, state));
108         return 0;
109 }
110
111 static int rtl8180_resume(struct pci_dev *pdev)
112 {
113         struct net_device *dev = pci_get_drvdata(pdev);
114         int err;
115         u32 val;
116
117         pci_set_power_state(pdev, PCI_D0);
118
119         err = pci_enable_device(pdev);
120         if (err) {
121                 dev_err(&pdev->dev, "pci_enable_device failed on resume\n");
122
123                 return err;
124         }
125
126         pci_restore_state(pdev);
127
128         /*
129          * Suspend/Resume resets the PCI configuration space, so we have to
130          * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
131          * from interfering with C3 CPU state. pci_restore_state won't help
132          * here since it only restores the first 64 bytes pci config header.
133          */
134         pci_read_config_dword(pdev, 0x40, &val);
135         if ((val & 0x0000ff00) != 0)
136                 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
137
138         if (!netif_running(dev))
139                 goto out;
140
141         if (dev->netdev_ops->ndo_open)
142                 dev->netdev_ops->ndo_open(dev);
143
144         netif_device_attach(dev);
145 out:
146         return 0;
147 }
148
149 static struct pci_driver rtl8180_pci_driver = {
150         .name           = RTL8180_MODULE_NAME,
151         .id_table       = rtl8180_pci_id_tbl,
152         .probe          = rtl8180_pci_probe,
153         .remove         = rtl8180_pci_remove,
154         .suspend        = rtl8180_suspend,
155         .resume         = rtl8180_resume,
156         .shutdown       = rtl8180_shutdown,
157 };
158
159 u8 read_nic_byte(struct net_device *dev, int x)
160 {
161         return 0xff&readb((u8 *)dev->mem_start + x);
162 }
163
164 u32 read_nic_dword(struct net_device *dev, int x)
165 {
166         return readl((u8 *)dev->mem_start + x);
167 }
168
169 u16 read_nic_word(struct net_device *dev, int x)
170 {
171         return readw((u8 *)dev->mem_start + x);
172 }
173
174 void write_nic_byte(struct net_device *dev, int x, u8 y)
175 {
176         writeb(y, (u8 *)dev->mem_start + x);
177         udelay(20);
178 }
179
180 void write_nic_dword(struct net_device *dev, int x, u32 y)
181 {
182         writel(y, (u8 *)dev->mem_start + x);
183         udelay(20);
184 }
185
186 void write_nic_word(struct net_device *dev, int x, u16 y)
187 {
188         writew(y, (u8 *)dev->mem_start + x);
189         udelay(20);
190 }
191
192 inline void force_pci_posting(struct net_device *dev)
193 {
194         read_nic_byte(dev, EPROM_CMD);
195         mb();
196 }
197
198 irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs);
199 void set_nic_rxring(struct net_device *dev);
200 void set_nic_txring(struct net_device *dev);
201 static struct net_device_stats *rtl8180_stats(struct net_device *dev);
202 void rtl8180_commit(struct net_device *dev);
203 void rtl8180_start_tx_beacon(struct net_device *dev);
204
205 static struct proc_dir_entry *rtl8180_proc;
206
207 static int proc_get_registers(char *page, char **start,
208                           off_t offset, int count,
209                           int *eof, void *data)
210 {
211         struct net_device *dev = data;
212         int len = 0;
213         int i, n;
214         int max = 0xff;
215
216         /* This dump the current register page */
217         for (n = 0; n <= max;) {
218                 len += snprintf(page + len, count - len, "\nD:  %2x > ", n);
219
220                 for (i = 0; i < 16 && n <= max; i++, n++)
221                         len += snprintf(page + len, count - len, "%2x ",
222                                         read_nic_byte(dev, n));
223         }
224         len += snprintf(page + len, count - len, "\n");
225
226         *eof = 1;
227         return len;
228 }
229
230 int get_curr_tx_free_desc(struct net_device *dev, int priority);
231
232 static int proc_get_stats_hw(char *page, char **start,
233                           off_t offset, int count,
234                           int *eof, void *data)
235 {
236         int len = 0;
237
238         *eof = 1;
239         return len;
240 }
241
242 static int proc_get_stats_rx(char *page, char **start,
243                           off_t offset, int count,
244                           int *eof, void *data)
245 {
246         struct net_device *dev = data;
247         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
248
249         int len = 0;
250
251         len += snprintf(page + len, count - len,
252                 "RX OK: %lu\n"
253                 "RX Retry: %lu\n"
254                 "RX CRC Error(0-500): %lu\n"
255                 "RX CRC Error(500-1000): %lu\n"
256                 "RX CRC Error(>1000): %lu\n"
257                 "RX ICV Error: %lu\n",
258                 priv->stats.rxint,
259                 priv->stats.rxerr,
260                 priv->stats.rxcrcerrmin,
261                 priv->stats.rxcrcerrmid,
262                 priv->stats.rxcrcerrmax,
263                 priv->stats.rxicverr
264                 );
265
266         *eof = 1;
267         return len;
268 }
269
270 static int proc_get_stats_tx(char *page, char **start,
271                           off_t offset, int count,
272                           int *eof, void *data)
273 {
274         struct net_device *dev = data;
275         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
276
277         int len = 0;
278         unsigned long totalOK;
279
280         totalOK = priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint;
281         len += snprintf(page + len, count - len,
282                 "TX OK: %lu\n"
283                 "TX Error: %lu\n"
284                 "TX Retry: %lu\n"
285                 "TX beacon OK: %lu\n"
286                 "TX beacon error: %lu\n",
287                 totalOK,
288                 priv->stats.txnperr+priv->stats.txhperr+priv->stats.txlperr,
289                 priv->stats.txretry,
290                 priv->stats.txbeacon,
291                 priv->stats.txbeaconerr
292         );
293
294         *eof = 1;
295         return len;
296 }
297
298 void rtl8180_proc_module_init(void)
299 {
300         DMESG("Initializing proc filesystem");
301         rtl8180_proc = proc_mkdir(RTL8180_MODULE_NAME, init_net.proc_net);
302 }
303
304 void rtl8180_proc_module_remove(void)
305 {
306         remove_proc_entry(RTL8180_MODULE_NAME, init_net.proc_net);
307 }
308
309 void rtl8180_proc_remove_one(struct net_device *dev)
310 {
311         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
312         if (priv->dir_dev) {
313                 remove_proc_entry("stats-hw", priv->dir_dev);
314                 remove_proc_entry("stats-tx", priv->dir_dev);
315                 remove_proc_entry("stats-rx", priv->dir_dev);
316                 remove_proc_entry("registers", priv->dir_dev);
317                 priv->dir_dev = NULL;
318         }
319 }
320
321 void rtl8180_proc_init_one(struct net_device *dev)
322 {
323         struct proc_dir_entry *e;
324         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
325
326         priv->dir_dev = rtl8180_proc;
327         if (!priv->dir_dev) {
328                 DMESGE("Unable to initialize /proc/net/r8180/%s\n",
329                       dev->name);
330                 return;
331         }
332
333         e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO,
334                                    priv->dir_dev, proc_get_stats_hw, dev);
335         if (!e) {
336                 DMESGE("Unable to initialize "
337                       "/proc/net/r8180/%s/stats-hw\n",
338                       dev->name);
339         }
340
341         e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
342                                    priv->dir_dev, proc_get_stats_rx, dev);
343         if (!e) {
344                 DMESGE("Unable to initialize "
345                       "/proc/net/r8180/%s/stats-rx\n",
346                       dev->name);
347         }
348
349
350         e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
351                                    priv->dir_dev, proc_get_stats_tx, dev);
352         if (!e) {
353                 DMESGE("Unable to initialize "
354                       "/proc/net/r8180/%s/stats-tx\n",
355                       dev->name);
356         }
357
358         e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
359                                    priv->dir_dev, proc_get_registers, dev);
360         if (!e) {
361                 DMESGE("Unable to initialize "
362                       "/proc/net/r8180/%s/registers\n",
363                       dev->name);
364         }
365 }
366
367 /*
368   FIXME: check if we can use some standard already-existent
369   data type+functions in kernel
370 */
371
372 short buffer_add(struct buffer **buffer, u32 *buf, dma_addr_t dma,
373                 struct buffer **bufferhead)
374 {
375         struct buffer *tmp;
376
377         if (!*buffer) {
378
379                 *buffer = kmalloc(sizeof(struct buffer), GFP_KERNEL);
380
381                 if (*buffer == NULL) {
382                         DMESGE("Failed to kmalloc head of TX/RX struct");
383                         return -1;
384                 }
385                 (*buffer)->next = *buffer;
386                 (*buffer)->buf = buf;
387                 (*buffer)->dma = dma;
388                 if (bufferhead != NULL)
389                         (*bufferhead) = (*buffer);
390                 return 0;
391         }
392         tmp = *buffer;
393
394         while (tmp->next != (*buffer))
395                 tmp = tmp->next;
396         tmp->next = kmalloc(sizeof(struct buffer), GFP_KERNEL);
397         if (tmp->next == NULL) {
398                 DMESGE("Failed to kmalloc TX/RX struct");
399                 return -1;
400         }
401         tmp->next->buf = buf;
402         tmp->next->dma = dma;
403         tmp->next->next = *buffer;
404
405         return 0;
406 }
407
408 void buffer_free(struct net_device *dev, struct buffer **buffer, int len, short consistent)
409 {
410
411         struct buffer *tmp, *next;
412         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
413         struct pci_dev *pdev = priv->pdev;
414
415         if (!*buffer)
416                 return;
417
418         tmp = *buffer;
419
420         do {
421                 next = tmp->next;
422                 if (consistent) {
423                         pci_free_consistent(pdev, len,
424                                     tmp->buf, tmp->dma);
425                 } else {
426                         pci_unmap_single(pdev, tmp->dma,
427                         len, PCI_DMA_FROMDEVICE);
428                         kfree(tmp->buf);
429                 }
430                 kfree(tmp);
431                 tmp = next;
432         } while (next != *buffer);
433
434         *buffer = NULL;
435 }
436
437 int get_curr_tx_free_desc(struct net_device *dev, int priority)
438 {
439         struct r8180_priv *priv = ieee80211_priv(dev);
440         u32 *tail;
441         u32 *head;
442         int ret;
443
444         switch (priority) {
445         case MANAGE_PRIORITY:
446                 head = priv->txmapringhead;
447                 tail = priv->txmapringtail;
448                 break;
449         case BK_PRIORITY:
450                 head = priv->txbkpringhead;
451                 tail = priv->txbkpringtail;
452                 break;
453         case BE_PRIORITY:
454                 head = priv->txbepringhead;
455                 tail = priv->txbepringtail;
456                 break;
457         case VI_PRIORITY:
458                 head = priv->txvipringhead;
459                 tail = priv->txvipringtail;
460                 break;
461         case VO_PRIORITY:
462                 head = priv->txvopringhead;
463                 tail = priv->txvopringtail;
464                 break;
465         case HI_PRIORITY:
466                 head = priv->txhpringhead;
467                 tail = priv->txhpringtail;
468                 break;
469         default:
470                 return -1;
471         }
472
473         if (head <= tail)
474                 ret = priv->txringcount - (tail - head)/8;
475         else
476                 ret = (head - tail)/8;
477
478         if (ret > priv->txringcount)
479                 DMESG("BUG");
480
481         return ret;
482 }
483
484 short check_nic_enought_desc(struct net_device *dev, int priority)
485 {
486         struct r8180_priv *priv = ieee80211_priv(dev);
487         struct ieee80211_device *ieee = netdev_priv(dev);
488         int requiredbyte, required;
489
490         requiredbyte = priv->ieee80211->fts + sizeof(struct ieee80211_header_data);
491
492         if (ieee->current_network.QoS_Enable)
493                 requiredbyte += 2;
494
495         required = requiredbyte / (priv->txbuffsize-4);
496
497         if (requiredbyte % priv->txbuffsize)
498                 required++;
499
500         /* for now we keep two free descriptor as a safety boundary
501          * between the tail and the head
502          */
503
504         return (required+2 < get_curr_tx_free_desc(dev, priority));
505 }
506
507 void fix_tx_fifo(struct net_device *dev)
508 {
509         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
510         u32 *tmp;
511         int i;
512
513         for (tmp = priv->txmapring, i = 0;
514              i < priv->txringcount;
515              tmp += 8, i++) {
516                 *tmp = *tmp & ~(1<<31);
517         }
518
519         for (tmp = priv->txbkpring, i = 0;
520              i < priv->txringcount;
521              tmp += 8, i++) {
522                 *tmp = *tmp & ~(1<<31);
523         }
524
525         for (tmp = priv->txbepring, i = 0;
526              i < priv->txringcount;
527              tmp += 8, i++) {
528                 *tmp = *tmp & ~(1<<31);
529         }
530         for (tmp = priv->txvipring, i = 0;
531              i < priv->txringcount;
532              tmp += 8, i++) {
533                 *tmp = *tmp & ~(1<<31);
534         }
535
536         for (tmp = priv->txvopring, i = 0;
537              i < priv->txringcount;
538              tmp += 8, i++) {
539                 *tmp = *tmp & ~(1<<31);
540         }
541
542         for (tmp = priv->txhpring, i = 0;
543              i < priv->txringcount;
544              tmp += 8, i++) {
545                 *tmp = *tmp & ~(1<<31);
546         }
547
548         for (tmp = priv->txbeaconring, i = 0;
549              i < priv->txbeaconcount;
550              tmp += 8, i++) {
551                 *tmp = *tmp & ~(1<<31);
552         }
553
554         priv->txmapringtail = priv->txmapring;
555         priv->txmapringhead = priv->txmapring;
556         priv->txmapbufstail = priv->txmapbufs;
557
558         priv->txbkpringtail = priv->txbkpring;
559         priv->txbkpringhead = priv->txbkpring;
560         priv->txbkpbufstail = priv->txbkpbufs;
561
562         priv->txbepringtail = priv->txbepring;
563         priv->txbepringhead = priv->txbepring;
564         priv->txbepbufstail = priv->txbepbufs;
565
566         priv->txvipringtail = priv->txvipring;
567         priv->txvipringhead = priv->txvipring;
568         priv->txvipbufstail = priv->txvipbufs;
569
570         priv->txvopringtail = priv->txvopring;
571         priv->txvopringhead = priv->txvopring;
572         priv->txvopbufstail = priv->txvopbufs;
573
574         priv->txhpringtail = priv->txhpring;
575         priv->txhpringhead = priv->txhpring;
576         priv->txhpbufstail = priv->txhpbufs;
577
578         priv->txbeaconringtail = priv->txbeaconring;
579         priv->txbeaconbufstail = priv->txbeaconbufs;
580         set_nic_txring(dev);
581
582         ieee80211_reset_queue(priv->ieee80211);
583         priv->ack_tx_to_ieee = 0;
584 }
585
586 void fix_rx_fifo(struct net_device *dev)
587 {
588         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
589         u32 *tmp;
590         struct buffer *rxbuf;
591         u8 rx_desc_size;
592
593         rx_desc_size = 8; /* 4*8 = 32 bytes */
594
595         for (tmp = priv->rxring, rxbuf = priv->rxbufferhead;
596              (tmp < (priv->rxring)+(priv->rxringcount)*rx_desc_size);
597              tmp += rx_desc_size, rxbuf = rxbuf->next) {
598                 *(tmp+2) = rxbuf->dma;
599                 *tmp = *tmp & ~0xfff;
600                 *tmp = *tmp | priv->rxbuffersize;
601                 *tmp |= (1<<31);
602         }
603
604         priv->rxringtail = priv->rxring;
605         priv->rxbuffer = priv->rxbufferhead;
606         priv->rx_skb_complete = 1;
607         set_nic_rxring(dev);
608 }
609
610 void rtl8180_irq_disable(struct net_device *dev)
611 {
612         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
613
614         write_nic_dword(dev, IMR, 0);
615         force_pci_posting(dev);
616         priv->irq_enabled = 0;
617 }
618
619 void rtl8180_set_mode(struct net_device *dev, int mode)
620 {
621         u8 ecmd;
622
623         ecmd = read_nic_byte(dev, EPROM_CMD);
624         ecmd = ecmd & ~EPROM_CMD_OPERATING_MODE_MASK;
625         ecmd = ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
626         ecmd = ecmd & ~(1<<EPROM_CS_SHIFT);
627         ecmd = ecmd & ~(1<<EPROM_CK_SHIFT);
628         write_nic_byte(dev, EPROM_CMD, ecmd);
629 }
630
631 void rtl8180_beacon_tx_enable(struct net_device *dev);
632
633 void rtl8180_update_msr(struct net_device *dev)
634 {
635         struct r8180_priv *priv = ieee80211_priv(dev);
636         u8 msr;
637         u32 rxconf;
638
639         msr  = read_nic_byte(dev, MSR);
640         msr &= ~MSR_LINK_MASK;
641
642         rxconf = read_nic_dword(dev, RX_CONF);
643
644         if (priv->ieee80211->state == IEEE80211_LINKED) {
645                 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
646                         msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
647                 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
648                         msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
649                 else if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
650                         msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
651                 else
652                         msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
653                 rxconf |= (1<<RX_CHECK_BSSID_SHIFT);
654
655         } else {
656                 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
657                 rxconf &= ~(1<<RX_CHECK_BSSID_SHIFT);
658         }
659
660         write_nic_byte(dev, MSR, msr);
661         write_nic_dword(dev, RX_CONF, rxconf);
662 }
663
664 void rtl8180_set_chan(struct net_device *dev, short ch)
665 {
666         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
667
668         if ((ch > 14) || (ch < 1)) {
669                 printk("In %s: Invalid chnanel %d\n", __func__, ch);
670                 return;
671         }
672
673         priv->chan = ch;
674         priv->rf_set_chan(dev, priv->chan);
675 }
676
677 void set_nic_txring(struct net_device *dev)
678 {
679         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
680
681         write_nic_dword(dev, TX_MANAGEPRIORITY_RING_ADDR, priv->txmapringdma);
682         write_nic_dword(dev, TX_BKPRIORITY_RING_ADDR, priv->txbkpringdma);
683         write_nic_dword(dev, TX_BEPRIORITY_RING_ADDR, priv->txbepringdma);
684         write_nic_dword(dev, TX_VIPRIORITY_RING_ADDR, priv->txvipringdma);
685         write_nic_dword(dev, TX_VOPRIORITY_RING_ADDR, priv->txvopringdma);
686         write_nic_dword(dev, TX_HIGHPRIORITY_RING_ADDR, priv->txhpringdma);
687         write_nic_dword(dev, TX_BEACON_RING_ADDR, priv->txbeaconringdma);
688 }
689
690 void rtl8180_beacon_tx_enable(struct net_device *dev)
691 {
692         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
693
694         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
695         priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_BQ);
696         write_nic_byte(dev, TPPollStop, priv->dma_poll_mask);
697         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
698 }
699
700 void rtl8180_beacon_tx_disable(struct net_device *dev)
701 {
702         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
703
704         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
705         priv->dma_poll_stop_mask |= TPPOLLSTOP_BQ;
706         write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
707         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
708
709 }
710
711 void rtl8180_rtx_disable(struct net_device *dev)
712 {
713         u8 cmd;
714         struct r8180_priv *priv = ieee80211_priv(dev);
715
716         cmd = read_nic_byte(dev, CMD);
717         write_nic_byte(dev, CMD, cmd &
718                        ~((1<<CMD_RX_ENABLE_SHIFT)|(1<<CMD_TX_ENABLE_SHIFT)));
719         force_pci_posting(dev);
720         mdelay(10);
721
722         if (!priv->rx_skb_complete)
723                 dev_kfree_skb_any(priv->rx_skb);
724 }
725
726 short alloc_tx_desc_ring(struct net_device *dev, int bufsize, int count,
727                          int addr)
728 {
729         int i;
730         u32 *desc;
731         u32 *tmp;
732         dma_addr_t dma_desc, dma_tmp;
733         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
734         struct pci_dev *pdev = priv->pdev;
735         void *buf;
736
737         if ((bufsize & 0xfff) != bufsize) {
738                 DMESGE("TX buffer allocation too large");
739                 return 0;
740         }
741         desc = (u32 *)pci_alloc_consistent(pdev,
742                                           sizeof(u32)*8*count+256, &dma_desc);
743         if (desc == NULL)
744                 return -1;
745
746         if (dma_desc & 0xff)
747                 /*
748                  * descriptor's buffer must be 256 byte aligned
749                  * we shouldn't be here, since we set DMA mask !
750                  */
751                 WARN(1, "DMA buffer is not aligned\n");
752
753         tmp = desc;
754
755         for (i = 0; i < count; i++) {
756                 buf = (void *)pci_alloc_consistent(pdev, bufsize, &dma_tmp);
757                 if (buf == NULL)
758                         return -ENOMEM;
759
760                 switch (addr) {
761                 case TX_MANAGEPRIORITY_RING_ADDR:
762                         if (-1 == buffer_add(&(priv->txmapbufs), buf, dma_tmp, NULL)) {
763                                 DMESGE("Unable to allocate mem for buffer NP");
764                                 return -ENOMEM;
765                         }
766                         break;
767                 case TX_BKPRIORITY_RING_ADDR:
768                         if (-1 == buffer_add(&(priv->txbkpbufs), buf, dma_tmp, NULL)) {
769                                 DMESGE("Unable to allocate mem for buffer LP");
770                                 return -ENOMEM;
771                         }
772                         break;
773                 case TX_BEPRIORITY_RING_ADDR:
774                         if (-1 == buffer_add(&(priv->txbepbufs), buf, dma_tmp, NULL)) {
775                                 DMESGE("Unable to allocate mem for buffer NP");
776                                 return -ENOMEM;
777                         }
778                         break;
779                 case TX_VIPRIORITY_RING_ADDR:
780                         if (-1 == buffer_add(&(priv->txvipbufs), buf, dma_tmp, NULL)) {
781                                 DMESGE("Unable to allocate mem for buffer LP");
782                                 return -ENOMEM;
783                         }
784                         break;
785                 case TX_VOPRIORITY_RING_ADDR:
786                         if (-1 == buffer_add(&(priv->txvopbufs), buf, dma_tmp, NULL)) {
787                                 DMESGE("Unable to allocate mem for buffer NP");
788                                 return -ENOMEM;
789                         }
790                         break;
791                 case TX_HIGHPRIORITY_RING_ADDR:
792                         if (-1 == buffer_add(&(priv->txhpbufs), buf, dma_tmp, NULL)) {
793                                 DMESGE("Unable to allocate mem for buffer HP");
794                                 return -ENOMEM;
795                         }
796                         break;
797                 case TX_BEACON_RING_ADDR:
798                         if (-1 == buffer_add(&(priv->txbeaconbufs), buf, dma_tmp, NULL)) {
799                                 DMESGE("Unable to allocate mem for buffer BP");
800                                 return -ENOMEM;
801                         }
802                         break;
803                 }
804                 *tmp = *tmp & ~(1<<31); /* descriptor empty, owned by the drv */
805                 *(tmp+2) = (u32)dma_tmp;
806                 *(tmp+3) = bufsize;
807
808                 if (i+1 < count)
809                         *(tmp+4) = (u32)dma_desc+((i+1)*8*4);
810                 else
811                         *(tmp+4) = (u32)dma_desc;
812
813                 tmp = tmp+8;
814         }
815
816         switch (addr) {
817         case TX_MANAGEPRIORITY_RING_ADDR:
818                 priv->txmapringdma = dma_desc;
819                 priv->txmapring = desc;
820                 break;
821         case TX_BKPRIORITY_RING_ADDR:
822                 priv->txbkpringdma = dma_desc;
823                 priv->txbkpring = desc;
824                 break;
825         case TX_BEPRIORITY_RING_ADDR:
826                 priv->txbepringdma = dma_desc;
827                 priv->txbepring = desc;
828                 break;
829         case TX_VIPRIORITY_RING_ADDR:
830                 priv->txvipringdma = dma_desc;
831                 priv->txvipring = desc;
832                 break;
833         case TX_VOPRIORITY_RING_ADDR:
834                 priv->txvopringdma = dma_desc;
835                 priv->txvopring = desc;
836                 break;
837         case TX_HIGHPRIORITY_RING_ADDR:
838                 priv->txhpringdma = dma_desc;
839                 priv->txhpring = desc;
840                 break;
841         case TX_BEACON_RING_ADDR:
842                 priv->txbeaconringdma = dma_desc;
843                 priv->txbeaconring = desc;
844                 break;
845
846         }
847
848         return 0;
849 }
850
851 void free_tx_desc_rings(struct net_device *dev)
852 {
853         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
854         struct pci_dev *pdev = priv->pdev;
855         int count = priv->txringcount;
856
857         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
858                             priv->txmapring, priv->txmapringdma);
859         buffer_free(dev, &(priv->txmapbufs), priv->txbuffsize, 1);
860
861         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
862                             priv->txbkpring, priv->txbkpringdma);
863         buffer_free(dev, &(priv->txbkpbufs), priv->txbuffsize, 1);
864
865         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
866                             priv->txbepring, priv->txbepringdma);
867         buffer_free(dev, &(priv->txbepbufs), priv->txbuffsize, 1);
868
869         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
870                             priv->txvipring, priv->txvipringdma);
871         buffer_free(dev, &(priv->txvipbufs), priv->txbuffsize, 1);
872
873         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
874                             priv->txvopring, priv->txvopringdma);
875         buffer_free(dev, &(priv->txvopbufs), priv->txbuffsize, 1);
876
877         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
878                             priv->txhpring, priv->txhpringdma);
879         buffer_free(dev, &(priv->txhpbufs), priv->txbuffsize, 1);
880
881         count = priv->txbeaconcount;
882         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
883                             priv->txbeaconring, priv->txbeaconringdma);
884         buffer_free(dev, &(priv->txbeaconbufs), priv->txbuffsize, 1);
885 }
886
887 void free_rx_desc_ring(struct net_device *dev)
888 {
889         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
890         struct pci_dev *pdev = priv->pdev;
891         int count = priv->rxringcount;
892
893         pci_free_consistent(pdev, sizeof(u32)*8*count+256,
894                             priv->rxring, priv->rxringdma);
895
896         buffer_free(dev, &(priv->rxbuffer), priv->rxbuffersize, 0);
897 }
898
899 short alloc_rx_desc_ring(struct net_device *dev, u16 bufsize, int count)
900 {
901         int i;
902         u32 *desc;
903         u32 *tmp;
904         dma_addr_t dma_desc, dma_tmp;
905         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
906         struct pci_dev *pdev = priv->pdev;
907         void *buf;
908         u8 rx_desc_size;
909
910         rx_desc_size = 8; /* 4*8 = 32 bytes */
911
912         if ((bufsize & 0xfff) != bufsize) {
913                 DMESGE("RX buffer allocation too large");
914                 return -1;
915         }
916
917         desc = (u32 *)pci_alloc_consistent(pdev, sizeof(u32)*rx_desc_size*count+256,
918                                           &dma_desc);
919
920         if (dma_desc & 0xff)
921                 /*
922                  * descriptor's buffer must be 256 byte aligned
923                  * should never happen since we specify the DMA mask
924                  */
925                 WARN(1, "DMA buffer is not aligned\n");
926
927         priv->rxring = desc;
928         priv->rxringdma = dma_desc;
929         tmp = desc;
930
931         for (i = 0; i < count; i++) {
932                 buf = kmalloc(bufsize * sizeof(u8), GFP_ATOMIC);
933                 if (buf == NULL) {
934                         DMESGE("Failed to kmalloc RX buffer");
935                         return -1;
936                 }
937
938                 dma_tmp = pci_map_single(pdev, buf, bufsize * sizeof(u8),
939                                          PCI_DMA_FROMDEVICE);
940                 if (pci_dma_mapping_error(pdev, dma_tmp))
941                         return -1;
942                 if (-1 == buffer_add(&(priv->rxbuffer), buf, dma_tmp,
943                            &(priv->rxbufferhead))) {
944                         DMESGE("Unable to allocate mem RX buf");
945                         return -1;
946                 }
947                 *tmp = 0; /* zero pads the header of the descriptor */
948                 *tmp = *tmp | (bufsize&0xfff);
949                 *(tmp+2) = (u32)dma_tmp;
950                 *tmp = *tmp | (1<<31); /* descriptor void, owned by the NIC */
951
952                 tmp = tmp+rx_desc_size;
953         }
954
955         *(tmp-rx_desc_size) = *(tmp-rx_desc_size) | (1<<30); /* this is the last descriptor */
956
957         return 0;
958 }
959
960
961 void set_nic_rxring(struct net_device *dev)
962 {
963         u8 pgreg;
964         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
965
966         pgreg = read_nic_byte(dev, PGSELECT);
967         write_nic_byte(dev, PGSELECT, pgreg & ~(1<<PGSELECT_PG_SHIFT));
968
969         write_nic_dword(dev, RXRING_ADDR, priv->rxringdma);
970 }
971
972 void rtl8180_reset(struct net_device *dev)
973 {
974         u8 cr;
975
976         rtl8180_irq_disable(dev);
977
978         cr = read_nic_byte(dev, CMD);
979         cr = cr & 2;
980         cr = cr | (1<<CMD_RST_SHIFT);
981         write_nic_byte(dev, CMD, cr);
982
983         force_pci_posting(dev);
984
985         mdelay(200);
986
987         if (read_nic_byte(dev, CMD) & (1<<CMD_RST_SHIFT))
988                 DMESGW("Card reset timeout!");
989         else
990                 DMESG("Card successfully reset");
991
992         rtl8180_set_mode(dev, EPROM_CMD_LOAD);
993         force_pci_posting(dev);
994         mdelay(200);
995 }
996
997 inline u16 ieeerate2rtlrate(int rate)
998 {
999         switch (rate) {
1000         case 10:
1001                 return 0;
1002         case 20:
1003                 return 1;
1004         case 55:
1005                 return 2;
1006         case 110:
1007                 return 3;
1008         case 60:
1009                 return 4;
1010         case 90:
1011                 return 5;
1012         case 120:
1013                 return 6;
1014         case 180:
1015                 return 7;
1016         case 240:
1017                 return 8;
1018         case 360:
1019                 return 9;
1020         case 480:
1021                 return 10;
1022         case 540:
1023                 return 11;
1024         default:
1025                 return 3;
1026         }
1027 }
1028
1029 static u16 rtl_rate[] = {10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540, 720};
1030
1031 inline u16 rtl8180_rate2rate(short rate)
1032 {
1033         if (rate > 12)
1034                 return 10;
1035         return rtl_rate[rate];
1036 }
1037
1038 inline u8 rtl8180_IsWirelessBMode(u16 rate)
1039 {
1040         if (((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220))
1041                 return 1;
1042         else
1043                 return 0;
1044 }
1045
1046 u16 N_DBPSOfRate(u16 DataRate);
1047
1048 u16 ComputeTxTime(u16 FrameLength, u16 DataRate, u8 bManagementFrame,
1049                   u8 bShortPreamble)
1050 {
1051         u16     FrameTime;
1052         u16     N_DBPS;
1053         u16     Ceiling;
1054
1055         if (rtl8180_IsWirelessBMode(DataRate)) {
1056                 if (bManagementFrame || !bShortPreamble || DataRate == 10)
1057                         /* long preamble */
1058                         FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1059                 else
1060                         /* short preamble */
1061                         FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1062
1063                 if ((FrameLength*8 % (DataRate/10)) != 0) /* get the ceilling */
1064                         FrameTime++;
1065         } else {        /* 802.11g DSSS-OFDM PLCP length field calculation. */
1066                 N_DBPS = N_DBPSOfRate(DataRate);
1067                 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1068                                 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1069                 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1070         }
1071         return FrameTime;
1072 }
1073
1074 u16 N_DBPSOfRate(u16 DataRate)
1075 {
1076          u16 N_DBPS = 24;
1077
1078         switch (DataRate) {
1079         case 60:
1080                 N_DBPS = 24;
1081                 break;
1082         case 90:
1083                 N_DBPS = 36;
1084                 break;
1085         case 120:
1086                 N_DBPS = 48;
1087                 break;
1088         case 180:
1089                 N_DBPS = 72;
1090                 break;
1091         case 240:
1092                 N_DBPS = 96;
1093                 break;
1094         case 360:
1095                 N_DBPS = 144;
1096                 break;
1097         case 480:
1098                 N_DBPS = 192;
1099                 break;
1100         case 540:
1101                 N_DBPS = 216;
1102                 break;
1103         default:
1104                 break;
1105         }
1106
1107         return N_DBPS;
1108 }
1109
1110 /*
1111  * For Netgear case, they want good-looking signal strength.
1112  */
1113 long NetgearSignalStrengthTranslate(long LastSS, long CurrSS)
1114 {
1115         long RetSS;
1116
1117         /* Step 1. Scale mapping. */
1118         if (CurrSS >= 71 && CurrSS <= 100)
1119                 RetSS = 90 + ((CurrSS - 70) / 3);
1120         else if (CurrSS >= 41 && CurrSS <= 70)
1121                 RetSS = 78 + ((CurrSS - 40) / 3);
1122         else if (CurrSS >= 31 && CurrSS <= 40)
1123                 RetSS = 66 + (CurrSS - 30);
1124         else if (CurrSS >= 21 && CurrSS <= 30)
1125                 RetSS = 54 + (CurrSS - 20);
1126         else if (CurrSS >= 5 && CurrSS <= 20)
1127                 RetSS = 42 + (((CurrSS - 5) * 2) / 3);
1128         else if (CurrSS == 4)
1129                 RetSS = 36;
1130         else if (CurrSS == 3)
1131                 RetSS = 27;
1132         else if (CurrSS == 2)
1133                 RetSS = 18;
1134         else if (CurrSS == 1)
1135                 RetSS = 9;
1136         else
1137                 RetSS = CurrSS;
1138
1139         /* Step 2. Smoothing. */
1140         if (LastSS > 0)
1141                 RetSS = ((LastSS * 5) + (RetSS) + 5) / 6;
1142
1143         return RetSS;
1144 }
1145
1146 /*
1147  * Translate 0-100 signal strength index into dBm.
1148  */
1149 long TranslateToDbm8185(u8 SignalStrengthIndex)
1150 {
1151         long SignalPower;
1152
1153         /* Translate to dBm (x=0.5y-95). */
1154         SignalPower = (long)((SignalStrengthIndex + 1) >> 1);
1155         SignalPower -= 95;
1156
1157         return SignalPower;
1158 }
1159
1160 /*
1161  * Perform signal smoothing for dynamic mechanism.
1162  * This is different with PerformSignalSmoothing8185 in smoothing formula.
1163  * No dramatic adjustion is apply because dynamic mechanism need some degree
1164  * of correctness. Ported from 8187B.
1165  */
1166 void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv,
1167                                            bool bCckRate)
1168 {
1169         /* Determin the current packet is CCK rate. */
1170         priv->bCurCCKPkt = bCckRate;
1171
1172         if (priv->UndecoratedSmoothedSS >= 0)
1173                 priv->UndecoratedSmoothedSS = ((priv->UndecoratedSmoothedSS * 5) +
1174                                                (priv->SignalStrength * 10)) / 6;
1175         else
1176                 priv->UndecoratedSmoothedSS = priv->SignalStrength * 10;
1177
1178         priv->UndercorateSmoothedRxPower = ((priv->UndercorateSmoothedRxPower * 50) +
1179                                             (priv->RxPower * 11)) / 60;
1180
1181         if (bCckRate)
1182                 priv->CurCCKRSSI = priv->RSSI;
1183         else
1184                 priv->CurCCKRSSI = 0;
1185 }
1186
1187
1188 /*
1189  * This is rough RX isr handling routine
1190  */
1191 void rtl8180_rx(struct net_device *dev)
1192 {
1193         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1194         struct sk_buff *tmp_skb;
1195         short first, last;
1196         u32 len;
1197         int lastlen;
1198         unsigned char quality, signal;
1199         u8 rate;
1200         u32 *tmp, *tmp2;
1201         u8 rx_desc_size;
1202         u8 padding;
1203         char rxpower = 0;
1204         u32 RXAGC = 0;
1205         long RxAGC_dBm = 0;
1206         u8      LNA = 0, BB = 0;
1207         u8      LNA_gain[4] = {02, 17, 29, 39};
1208         u8  Antenna = 0;
1209         struct ieee80211_hdr_4addr *hdr;
1210         u16 fc, type;
1211         u8 bHwError = 0, bCRC = 0, bICV = 0;
1212         bool    bCckRate = false;
1213         u8     RSSI = 0;
1214         long    SignalStrengthIndex = 0;
1215         struct ieee80211_rx_stats stats = {
1216                 .signal = 0,
1217                 .noise = -98,
1218                 .rate = 0,
1219                 .freq = IEEE80211_24GHZ_BAND,
1220         };
1221
1222         stats.nic_type = NIC_8185B;
1223         rx_desc_size = 8;
1224
1225         if ((*(priv->rxringtail)) & (1<<31)) {
1226                 /* we have got an RX int, but the descriptor
1227                  * we are pointing is empty */
1228
1229                 priv->stats.rxnodata++;
1230                 priv->ieee80211->stats.rx_errors++;
1231
1232                 tmp2 = NULL;
1233                 tmp = priv->rxringtail;
1234                 do {
1235                         if (tmp == priv->rxring)
1236                                 tmp  = priv->rxring + (priv->rxringcount - 1)*rx_desc_size;
1237                         else
1238                                 tmp -= rx_desc_size;
1239
1240                         if (!(*tmp & (1<<31)))
1241                                 tmp2 = tmp;
1242                 } while (tmp != priv->rxring);
1243
1244                 if (tmp2)
1245                         priv->rxringtail = tmp2;
1246         }
1247
1248         /* while there are filled descriptors */
1249         while (!(*(priv->rxringtail) & (1<<31))) {
1250                 if (*(priv->rxringtail) & (1<<26))
1251                         DMESGW("RX buffer overflow");
1252                 if (*(priv->rxringtail) & (1<<12))
1253                         priv->stats.rxicverr++;
1254
1255                 if (*(priv->rxringtail) & (1<<27)) {
1256                         priv->stats.rxdmafail++;
1257                         /* DMESG("EE: RX DMA FAILED at buffer pointed by descriptor %x",(u32)priv->rxringtail); */
1258                         goto drop;
1259                 }
1260
1261                 pci_dma_sync_single_for_cpu(priv->pdev,
1262                                     priv->rxbuffer->dma,
1263                                     priv->rxbuffersize * sizeof(u8),
1264                                     PCI_DMA_FROMDEVICE);
1265
1266                 first = *(priv->rxringtail) & (1<<29) ? 1 : 0;
1267                 if (first)
1268                         priv->rx_prevlen = 0;
1269
1270                 last = *(priv->rxringtail) & (1<<28) ? 1 : 0;
1271                 if (last) {
1272                         lastlen = ((*priv->rxringtail) & 0xfff);
1273
1274                         /* if the last descriptor (that should
1275                          * tell us the total packet len) tell
1276                          * us something less than the descriptors
1277                          * len we had until now, then there is some
1278                          * problem..
1279                          * workaround to prevent kernel panic
1280                          */
1281                         if (lastlen < priv->rx_prevlen)
1282                                 len = 0;
1283                         else
1284                                 len = lastlen-priv->rx_prevlen;
1285
1286                         if (*(priv->rxringtail) & (1<<13)) {
1287                                 if ((*(priv->rxringtail) & 0xfff) < 500)
1288                                         priv->stats.rxcrcerrmin++;
1289                                 else if ((*(priv->rxringtail) & 0x0fff) > 1000)
1290                                         priv->stats.rxcrcerrmax++;
1291                                 else
1292                                         priv->stats.rxcrcerrmid++;
1293
1294                         }
1295
1296                 } else {
1297                         len = priv->rxbuffersize;
1298                 }
1299
1300                 if (first && last) {
1301                         padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1302                 } else if (first) {
1303                         padding = ((*(priv->rxringtail+3))&(0x04000000))>>26;
1304                         if (padding)
1305                                 len -= 2;
1306                 } else {
1307                         padding = 0;
1308                 }
1309                 padding = 0;
1310                 priv->rx_prevlen += len;
1311
1312                 if (priv->rx_prevlen > MAX_FRAG_THRESHOLD + 100) {
1313                         /* HW is probably passing several buggy frames
1314                         * without FD or LD flag set.
1315                         * Throw this garbage away to prevent skb
1316                         * memory exhausting
1317                         */
1318                         if (!priv->rx_skb_complete)
1319                                 dev_kfree_skb_any(priv->rx_skb);
1320                         priv->rx_skb_complete = 1;
1321                 }
1322
1323                 signal = (unsigned char)(((*(priv->rxringtail+3)) & (0x00ff0000))>>16);
1324                 signal = (signal & 0xfe) >> 1;
1325
1326                 quality = (unsigned char)((*(priv->rxringtail+3)) & (0xff));
1327
1328                 stats.mac_time[0] = *(priv->rxringtail+1);
1329                 stats.mac_time[1] = *(priv->rxringtail+2);
1330                 rxpower = ((char)(((*(priv->rxringtail+4)) & (0x00ff0000))>>16))/2 - 42;
1331                 RSSI = ((u8)(((*(priv->rxringtail+3)) & (0x0000ff00))>>8)) & (0x7f);
1332
1333                 rate = ((*(priv->rxringtail)) &
1334                         ((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20;
1335
1336                 stats.rate = rtl8180_rate2rate(rate);
1337                 Antenna = (((*(priv->rxringtail+3)) & (0x00008000)) == 0) ? 0 : 1;
1338                 if (!rtl8180_IsWirelessBMode(stats.rate)) { /* OFDM rate. */
1339                         RxAGC_dBm = rxpower+1;  /* bias */
1340                 } else { /* CCK rate. */
1341                         RxAGC_dBm = signal; /* bit 0 discard */
1342
1343                         LNA = (u8) (RxAGC_dBm & 0x60) >> 5; /* bit 6~ bit 5 */
1344                         BB  = (u8) (RxAGC_dBm & 0x1F); /* bit 4 ~ bit 0 */
1345
1346                         RxAGC_dBm = -(LNA_gain[LNA] + (BB*2)); /* Pin_11b=-(LNA_gain+BB_gain) (dBm) */
1347
1348                         RxAGC_dBm += 4; /* bias */
1349                 }
1350
1351                 if (RxAGC_dBm & 0x80) /* absolute value */
1352                         RXAGC = ~(RxAGC_dBm)+1;
1353                 bCckRate = rtl8180_IsWirelessBMode(stats.rate);
1354                 /* Translate RXAGC into 1-100. */
1355                 if (!rtl8180_IsWirelessBMode(stats.rate)) { /* OFDM rate. */
1356                         if (RXAGC > 90)
1357                                 RXAGC = 90;
1358                         else if (RXAGC < 25)
1359                                 RXAGC = 25;
1360                         RXAGC = (90-RXAGC)*100/65;
1361                 } else { /* CCK rate. */
1362                         if (RXAGC > 95)
1363                                 RXAGC = 95;
1364                         else if (RXAGC < 30)
1365                                 RXAGC = 30;
1366                         RXAGC = (95-RXAGC)*100/65;
1367                 }
1368                 priv->SignalStrength = (u8)RXAGC;
1369                 priv->RecvSignalPower = RxAGC_dBm;
1370                 priv->RxPower = rxpower;
1371                 priv->RSSI = RSSI;
1372                 /* SQ translation formula is provided by SD3 DZ. 2006.06.27 */
1373                 if (quality >= 127)
1374                         quality = 1; /*0; */ /* 0 will cause epc to show signal zero , walk around now; */
1375                 else if (quality < 27)
1376                         quality = 100;
1377                 else
1378                         quality = 127 - quality;
1379                 priv->SignalQuality = quality;
1380
1381                 stats.signal = (u8)quality; /*priv->wstats.qual.level = priv->SignalStrength; */
1382                 stats.signalstrength = RXAGC;
1383                 if (stats.signalstrength > 100)
1384                         stats.signalstrength = 100;
1385                 stats.signalstrength = (stats.signalstrength * 70)/100 + 30;
1386                 /* printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength); */
1387                 stats.rssi = priv->wstats.qual.qual = priv->SignalQuality;
1388                 stats.noise = priv->wstats.qual.noise = 100 - priv->wstats.qual.qual;
1389                 bHwError = (((*(priv->rxringtail)) & (0x00000fff)) == 4080) |
1390                            (((*(priv->rxringtail)) & (0x04000000)) != 0) |
1391                            (((*(priv->rxringtail)) & (0x08000000)) != 0) |
1392                            (((~(*(priv->rxringtail))) & (0x10000000)) != 0) |
1393                            (((~(*(priv->rxringtail))) & (0x20000000)) != 0);
1394                 bCRC = ((*(priv->rxringtail)) & (0x00002000)) >> 13;
1395                 bICV = ((*(priv->rxringtail)) & (0x00001000)) >> 12;
1396                 hdr = (struct ieee80211_hdr_4addr *)priv->rxbuffer->buf;
1397                     fc = le16_to_cpu(hdr->frame_ctl);
1398                 type = WLAN_FC_GET_TYPE(fc);
1399
1400                 if (IEEE80211_FTYPE_CTL != type &&
1401                     !bHwError && !bCRC && !bICV &&
1402                     eqMacAddr(priv->ieee80211->current_network.bssid,
1403                         fc & IEEE80211_FCTL_TODS ? hdr->addr1 :
1404                         fc & IEEE80211_FCTL_FROMDS ? hdr->addr2 :
1405                         hdr->addr3)) {
1406
1407                         /* Perform signal smoothing for dynamic
1408                          * mechanism on demand. This is different
1409                          * with PerformSignalSmoothing8185 in smoothing
1410                          * fomula. No dramatic adjustion is apply
1411                          * because dynamic mechanism need some degree
1412                          * of correctness. */
1413                         PerformUndecoratedSignalSmoothing8185(priv, bCckRate);
1414
1415                         /* For good-looking singal strength. */
1416                         SignalStrengthIndex = NetgearSignalStrengthTranslate(
1417                                                         priv->LastSignalStrengthInPercent,
1418                                                         priv->SignalStrength);
1419
1420                         priv->LastSignalStrengthInPercent = SignalStrengthIndex;
1421                         priv->Stats_SignalStrength = TranslateToDbm8185((u8)SignalStrengthIndex);
1422                 /*
1423                  * We need more correct power of received packets and the  "SignalStrength" of RxStats is beautified,
1424                  * so we record the correct power here.
1425                  */
1426                         priv->Stats_SignalQuality = (long)(priv->Stats_SignalQuality * 5 + (long)priv->SignalQuality + 5) / 6;
1427                         priv->Stats_RecvSignalPower = (long)(priv->Stats_RecvSignalPower * 5 + priv->RecvSignalPower - 1) / 6;
1428
1429                 /* Figure out which antenna that received the last packet. */
1430                         priv->LastRxPktAntenna = Antenna ? 1 : 0; /* 0: aux, 1: main. */
1431                         SwAntennaDiversityRxOk8185(dev, priv->SignalStrength);
1432                 }
1433
1434                 if (first) {
1435                         if (!priv->rx_skb_complete) {
1436                                 /* seems that HW sometimes fails to receive and
1437                                    doesn't provide the last descriptor */
1438                                 dev_kfree_skb_any(priv->rx_skb);
1439                                 priv->stats.rxnolast++;
1440                         }
1441                         priv->rx_skb = dev_alloc_skb(len+2);
1442                         if (!priv->rx_skb)
1443                                 goto drop;
1444
1445                         priv->rx_skb_complete = 0;
1446                         priv->rx_skb->dev = dev;
1447                 } else {
1448                         /* if we are here we should have already RXed
1449                         * the first frame.
1450                         * If we get here and the skb is not allocated then
1451                         * we have just throw out garbage (skb not allocated)
1452                         * and we are still rxing garbage....
1453                         */
1454                         if (!priv->rx_skb_complete) {
1455
1456                                 tmp_skb = dev_alloc_skb(priv->rx_skb->len+len+2);
1457
1458                                 if (!tmp_skb)
1459                                         goto drop;
1460
1461                                 tmp_skb->dev = dev;
1462
1463                                 memcpy(skb_put(tmp_skb, priv->rx_skb->len),
1464                                         priv->rx_skb->data,
1465                                         priv->rx_skb->len);
1466
1467                                 dev_kfree_skb_any(priv->rx_skb);
1468
1469                                 priv->rx_skb = tmp_skb;
1470                         }
1471                 }
1472
1473                 if (!priv->rx_skb_complete) {
1474                         if (padding) {
1475                                 memcpy(skb_put(priv->rx_skb, len),
1476                                         (((unsigned char *)priv->rxbuffer->buf) + 2), len);
1477                         } else {
1478                                 memcpy(skb_put(priv->rx_skb, len),
1479                                         priv->rxbuffer->buf, len);
1480                         }
1481                 }
1482
1483                 if (last && !priv->rx_skb_complete) {
1484                         if (priv->rx_skb->len > 4)
1485                                 skb_trim(priv->rx_skb, priv->rx_skb->len-4);
1486                         if (!ieee80211_rtl_rx(priv->ieee80211,
1487                                          priv->rx_skb, &stats))
1488                                 dev_kfree_skb_any(priv->rx_skb);
1489                         priv->rx_skb_complete = 1;
1490                 }
1491
1492                 pci_dma_sync_single_for_device(priv->pdev,
1493                                     priv->rxbuffer->dma,
1494                                     priv->rxbuffersize * sizeof(u8),
1495                                     PCI_DMA_FROMDEVICE);
1496
1497 drop: /* this is used when we have not enough mem */
1498                 /* restore the descriptor */
1499                 *(priv->rxringtail+2) = priv->rxbuffer->dma;
1500                 *(priv->rxringtail) = *(priv->rxringtail) & ~0xfff;
1501                 *(priv->rxringtail) =
1502                         *(priv->rxringtail) | priv->rxbuffersize;
1503
1504                 *(priv->rxringtail) =
1505                         *(priv->rxringtail) | (1<<31);
1506
1507                 priv->rxringtail += rx_desc_size;
1508                 if (priv->rxringtail >=
1509                    (priv->rxring)+(priv->rxringcount)*rx_desc_size)
1510                         priv->rxringtail = priv->rxring;
1511
1512                 priv->rxbuffer = (priv->rxbuffer->next);
1513         }
1514 }
1515
1516
1517 void rtl8180_dma_kick(struct net_device *dev, int priority)
1518 {
1519         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1520
1521         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1522         write_nic_byte(dev, TX_DMA_POLLING,
1523                         (1 << (priority + 1)) | priv->dma_poll_mask);
1524         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1525
1526         force_pci_posting(dev);
1527 }
1528
1529 void rtl8180_data_hard_stop(struct net_device *dev)
1530 {
1531         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1532
1533         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1534         priv->dma_poll_stop_mask |= TPPOLLSTOP_AC_VIQ;
1535         write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
1536         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1537 }
1538
1539 void rtl8180_data_hard_resume(struct net_device *dev)
1540 {
1541         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1542
1543         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1544         priv->dma_poll_stop_mask &= ~(TPPOLLSTOP_AC_VIQ);
1545         write_nic_byte(dev, TPPollStop, priv->dma_poll_stop_mask);
1546         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1547 }
1548
1549 /*
1550  * This function TX data frames when the ieee80211 stack requires this.
1551  * It checks also if we need to stop the ieee tx queue, eventually do it
1552  */
1553 void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int
1554 rate) {
1555         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1556         int mode;
1557         struct ieee80211_hdr_3addr *h = (struct ieee80211_hdr_3addr *) skb->data;
1558         short morefrag = (h->frame_control) & IEEE80211_FCTL_MOREFRAGS;
1559         unsigned long flags;
1560         int priority;
1561
1562         mode = priv->ieee80211->iw_mode;
1563
1564         rate = ieeerate2rtlrate(rate);
1565         /*
1566          * This function doesn't require lock because we make
1567          * sure it's called with the tx_lock already acquired.
1568          * this come from the kernel's hard_xmit callback (through
1569          * the ieee stack, or from the try_wake_queue (again through
1570          * the ieee stack.
1571          */
1572         priority = AC2Q(skb->priority);
1573         spin_lock_irqsave(&priv->tx_lock, flags);
1574
1575         if (priv->ieee80211->bHwRadioOff) {
1576                 spin_unlock_irqrestore(&priv->tx_lock, flags);
1577
1578                 return;
1579         }
1580
1581         if (!check_nic_enought_desc(dev, priority)) {
1582                 DMESGW("Error: no descriptor left by previous TX (avail %d) ",
1583                         get_curr_tx_free_desc(dev, priority));
1584                 ieee80211_rtl_stop_queue(priv->ieee80211);
1585         }
1586         rtl8180_tx(dev, skb->data, skb->len, priority, morefrag, 0, rate);
1587         if (!check_nic_enought_desc(dev, priority))
1588                 ieee80211_rtl_stop_queue(priv->ieee80211);
1589
1590         spin_unlock_irqrestore(&priv->tx_lock, flags);
1591 }
1592
1593 /*
1594  * This is a rough attempt to TX a frame
1595  * This is called by the ieee 80211 stack to TX management frames.
1596  * If the ring is full packets are dropped (for data frame the queue
1597  * is stopped before this can happen). For this reason it is better
1598  * if the descriptors are larger than the largest management frame
1599  * we intend to TX: i'm unsure what the HW does if it will not find
1600  * the last fragment of a frame because it has been dropped...
1601  * Since queues for Management and Data frames are different we
1602  * might use a different lock than tx_lock (for example mgmt_tx_lock)
1603  */
1604 /* these function may loop if invoked with 0 descriptors or 0 len buffer */
1605 int rtl8180_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1606 {
1607         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1608         unsigned long flags;
1609         int priority;
1610
1611         priority = MANAGE_PRIORITY;
1612
1613         spin_lock_irqsave(&priv->tx_lock, flags);
1614
1615         if (priv->ieee80211->bHwRadioOff) {
1616                 spin_unlock_irqrestore(&priv->tx_lock, flags);
1617                 dev_kfree_skb_any(skb);
1618                 return NETDEV_TX_OK;
1619         }
1620
1621         rtl8180_tx(dev, skb->data, skb->len, priority,
1622                 0, 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
1623
1624         priv->ieee80211->stats.tx_bytes += skb->len;
1625         priv->ieee80211->stats.tx_packets++;
1626         spin_unlock_irqrestore(&priv->tx_lock, flags);
1627
1628         dev_kfree_skb_any(skb);
1629         return NETDEV_TX_OK;
1630 }
1631
1632 /* longpre 144+48 shortpre 72+24 */
1633 u16 rtl8180_len2duration(u32 len, short rate, short *ext)
1634 {
1635         u16 duration;
1636         u16 drift;
1637         *ext = 0;
1638
1639         switch (rate) {
1640         case 0: /* 1mbps */
1641                 *ext = 0;
1642                 duration = ((len+4)<<4) / 0x2;
1643                 drift = ((len+4)<<4) % 0x2;
1644                 if (drift == 0)
1645                         break;
1646                 duration++;
1647                 break;
1648         case 1: /* 2mbps */
1649                 *ext = 0;
1650                 duration = ((len+4)<<4) / 0x4;
1651                 drift = ((len+4)<<4) % 0x4;
1652                 if (drift == 0)
1653                         break;
1654                 duration++;
1655                 break;
1656         case 2: /* 5.5mbps */
1657                 *ext = 0;
1658                 duration = ((len+4)<<4) / 0xb;
1659                 drift = ((len+4)<<4) % 0xb;
1660                 if (drift == 0)
1661                         break;
1662                 duration++;
1663                 break;
1664         default:
1665         case 3: /* 11mbps */
1666                 *ext = 0;
1667                 duration = ((len+4)<<4) / 0x16;
1668                 drift = ((len+4)<<4) % 0x16;
1669                 if (drift == 0)
1670                         break;
1671                 duration++;
1672                 if (drift > 6)
1673                         break;
1674                 *ext = 1;
1675                 break;
1676         }
1677
1678         return duration;
1679 }
1680
1681 void rtl8180_prepare_beacon(struct net_device *dev)
1682 {
1683         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1684         struct sk_buff *skb;
1685
1686         u16 word  = read_nic_word(dev, BcnItv);
1687         word &= ~BcnItv_BcnItv; /* clear Bcn_Itv */
1688         word |= cpu_to_le16(priv->ieee80211->current_network.beacon_interval); /* 0x64; */
1689         write_nic_word(dev, BcnItv, word);
1690
1691         skb = ieee80211_get_beacon(priv->ieee80211);
1692         if (skb) {
1693                 rtl8180_tx(dev, skb->data, skb->len, BEACON_PRIORITY,
1694                         0, 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
1695                 dev_kfree_skb_any(skb);
1696         }
1697 }
1698
1699 /*
1700  * This function do the real dirty work: it enqueues a TX command
1701  * descriptor in the ring buffer, copyes the frame in a TX buffer
1702  * and kicks the NIC to ensure it does the DMA transfer.
1703  */
1704 short rtl8180_tx(struct net_device *dev, u8 *txbuf, int len, int priority,
1705                  short morefrag, short descfrag, int rate)
1706 {
1707         struct r8180_priv *priv = ieee80211_priv(dev);
1708         u32 *tail, *temp_tail;
1709         u32 *begin;
1710         u32 *buf;
1711         int i;
1712         int remain;
1713         int buflen;
1714         int count;
1715         struct buffer *buflist;
1716         struct ieee80211_hdr_3addr *frag_hdr = (struct ieee80211_hdr_3addr *)txbuf;
1717         u8 dest[ETH_ALEN];
1718         u8                      bUseShortPreamble = 0;
1719         u8                      bCTSEnable = 0;
1720         u8                      bRTSEnable = 0;
1721         u16                     Duration = 0;
1722         u16                     RtsDur = 0;
1723         u16                     ThisFrameTime = 0;
1724         u16                     TxDescDuration = 0;
1725         u8                      ownbit_flag = false;
1726
1727         switch (priority) {
1728         case MANAGE_PRIORITY:
1729                 tail = priv->txmapringtail;
1730                 begin = priv->txmapring;
1731                 buflist = priv->txmapbufstail;
1732                 count = priv->txringcount;
1733                 break;
1734         case BK_PRIORITY:
1735                 tail = priv->txbkpringtail;
1736                 begin = priv->txbkpring;
1737                 buflist = priv->txbkpbufstail;
1738                 count = priv->txringcount;
1739                 break;
1740         case BE_PRIORITY:
1741                 tail = priv->txbepringtail;
1742                 begin = priv->txbepring;
1743                 buflist = priv->txbepbufstail;
1744                 count = priv->txringcount;
1745                 break;
1746         case VI_PRIORITY:
1747                 tail = priv->txvipringtail;
1748                 begin = priv->txvipring;
1749                 buflist = priv->txvipbufstail;
1750                 count = priv->txringcount;
1751                 break;
1752         case VO_PRIORITY:
1753                 tail = priv->txvopringtail;
1754                 begin = priv->txvopring;
1755                 buflist = priv->txvopbufstail;
1756                 count = priv->txringcount;
1757                 break;
1758         case HI_PRIORITY:
1759                 tail = priv->txhpringtail;
1760                 begin = priv->txhpring;
1761                 buflist = priv->txhpbufstail;
1762                 count = priv->txringcount;
1763                 break;
1764         case BEACON_PRIORITY:
1765                 tail = priv->txbeaconringtail;
1766                 begin = priv->txbeaconring;
1767                 buflist = priv->txbeaconbufstail;
1768                 count = priv->txbeaconcount;
1769                 break;
1770         default:
1771                 return -1;
1772                 break;
1773         }
1774
1775                 memcpy(&dest, frag_hdr->addr1, ETH_ALEN);
1776                 if (is_multicast_ether_addr(dest)) {
1777                         Duration = 0;
1778                         RtsDur = 0;
1779                         bRTSEnable = 0;
1780                         bCTSEnable = 0;
1781
1782                         ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate),
1783                                                       0, bUseShortPreamble);
1784                         TxDescDuration = ThisFrameTime;
1785                 } else { /* Unicast packet */
1786                         u16 AckTime;
1787
1788                         /* YJ,add,080828,for Keep alive */
1789                         priv->NumTxUnicast++;
1790
1791                         /* Figure out ACK rate according to BSS basic rate
1792                          * and Tx rate. */
1793                         AckTime = ComputeTxTime(14, 10, 0, 0);  /* AckCTSLng = 14 use 1M bps send */
1794
1795                         if (((len + sCrcLng) > priv->rts) && priv->rts) { /* RTS/CTS. */
1796                                 u16 RtsTime, CtsTime;
1797                                 /* u16 CtsRate; */
1798                                 bRTSEnable = 1;
1799                                 bCTSEnable = 0;
1800
1801                                 /* Rate and time required for RTS. */
1802                                 RtsTime = ComputeTxTime(sAckCtsLng/8, priv->ieee80211->basic_rate, 0, 0);
1803                                 /* Rate and time required for CTS. */
1804                                 CtsTime = ComputeTxTime(14, 10, 0, 0);  /* AckCTSLng = 14 use 1M bps send */
1805
1806                                 /* Figure out time required to transmit this frame. */
1807                                 ThisFrameTime = ComputeTxTime(len + sCrcLng,
1808                                                 rtl8180_rate2rate(rate),
1809                                                 0,
1810                                                 bUseShortPreamble);
1811
1812                                 /* RTS-CTS-ThisFrame-ACK. */
1813                                 RtsDur = CtsTime + ThisFrameTime + AckTime + 3*aSifsTime;
1814
1815                                 TxDescDuration = RtsTime + RtsDur;
1816                         } else { /* Normal case. */
1817                                 bCTSEnable = 0;
1818                                 bRTSEnable = 0;
1819                                 RtsDur = 0;
1820
1821                                 ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate),
1822                                                               0, bUseShortPreamble);
1823                                 TxDescDuration = ThisFrameTime + aSifsTime + AckTime;
1824                         }
1825
1826                         if (!(frag_hdr->frame_control & IEEE80211_FCTL_MOREFRAGS)) {
1827                                 /* ThisFrame-ACK. */
1828                                 Duration = aSifsTime + AckTime;
1829                         } else { /* One or more fragments remained. */
1830                                 u16 NextFragTime;
1831                                 NextFragTime = ComputeTxTime(len + sCrcLng, /* pretend following packet length equal current packet */
1832                                                 rtl8180_rate2rate(rate),
1833                                                 0,
1834                                                 bUseShortPreamble);
1835
1836                                 /* ThisFrag-ACk-NextFrag-ACK. */
1837                                 Duration = NextFragTime + 3*aSifsTime + 2*AckTime;
1838                         }
1839
1840                 } /* End of Unicast packet */
1841
1842                 frag_hdr->duration_id = Duration;
1843
1844         buflen = priv->txbuffsize;
1845         remain = len;
1846         temp_tail = tail;
1847
1848         while (remain != 0) {
1849                 mb();
1850                 if (!buflist) {
1851                         DMESGE("TX buffer error, cannot TX frames. pri %d.", priority);
1852                         return -1;
1853                 }
1854                 buf = buflist->buf;
1855
1856                 if ((*tail & (1 << 31)) && (priority != BEACON_PRIORITY)) {
1857                         DMESGW("No more TX desc, returning %x of %x",
1858                                remain, len);
1859                         priv->stats.txrdu++;
1860                         return remain;
1861                 }
1862
1863                 *tail = 0; /* zeroes header */
1864                 *(tail+1) = 0;
1865                 *(tail+3) = 0;
1866                 *(tail+5) = 0;
1867                 *(tail+6) = 0;
1868                 *(tail+7) = 0;
1869
1870                 /* FIXME: this should be triggered by HW encryption parameters.*/
1871                 *tail |= (1<<15); /* no encrypt */
1872
1873                 if (remain == len && !descfrag) {
1874                         ownbit_flag = false;
1875                         *tail = *tail | (1<<29) ; /* fist segment of the packet */
1876                         *tail = *tail | (len);
1877                 } else {
1878                         ownbit_flag = true;
1879                 }
1880
1881                 for (i = 0; i < buflen && remain > 0; i++, remain--) {
1882                         ((u8 *)buf)[i] = txbuf[i]; /* copy data into descriptor pointed DMAble buffer */
1883                         if (remain == 4 && i+4 >= buflen)
1884                                 break;
1885                         /* ensure the last desc has at least 4 bytes payload */
1886
1887                 }
1888                 txbuf = txbuf + i;
1889                 *(tail+3) = *(tail+3) & ~0xfff;
1890                 *(tail+3) = *(tail+3) | i; /* buffer length */
1891                 /* Use short preamble or not */
1892                 if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE)
1893                         if (priv->plcp_preamble_mode == 1 && rate != 0) /*  short mode now, not long! */
1894                         ; /* *tail |= (1<<16); */                               /* enable short preamble mode. */
1895
1896                 if (bCTSEnable)
1897                         *tail |= (1<<18);
1898
1899                 if (bRTSEnable) { /* rts enable */
1900                         *tail |= ((ieeerate2rtlrate(priv->ieee80211->basic_rate))<<19); /* RTS RATE */
1901                         *tail |= (1<<23); /* rts enable */
1902                         *(tail+1) |= (RtsDur&0xffff); /* RTS Duration */
1903                 }
1904                 *(tail+3) |= ((TxDescDuration&0xffff)<<16); /* DURATION */
1905                 /* *(tail+3) |= (0xe6<<16); */
1906                 *(tail+5) |= (11<<8); /* (priv->retry_data<<8); */ /* retry lim; */
1907
1908                 *tail = *tail | ((rate&0xf) << 24);
1909
1910                 if (morefrag)
1911                         *tail = (*tail) | (1<<17); /* more fragment */
1912                 if (!remain)
1913                         *tail = (*tail) | (1<<28); /* last segment of frame */
1914
1915                 *(tail+5) = *(tail+5)|(2<<27);
1916                 *(tail+7) = *(tail+7)|(1<<4);
1917
1918                 wmb();
1919                 if (ownbit_flag)
1920                         *tail = *tail | (1<<31); /* descriptor ready to be txed */
1921
1922                 if ((tail - begin)/8 == count-1)
1923                         tail = begin;
1924                 else
1925                         tail = tail+8;
1926
1927                 buflist = buflist->next;
1928
1929                 mb();
1930
1931                 switch (priority) {
1932                 case MANAGE_PRIORITY:
1933                         priv->txmapringtail = tail;
1934                         priv->txmapbufstail = buflist;
1935                         break;
1936                 case BK_PRIORITY:
1937                         priv->txbkpringtail = tail;
1938                         priv->txbkpbufstail = buflist;
1939                         break;
1940                 case BE_PRIORITY:
1941                         priv->txbepringtail = tail;
1942                         priv->txbepbufstail = buflist;
1943                         break;
1944                 case VI_PRIORITY:
1945                         priv->txvipringtail = tail;
1946                         priv->txvipbufstail = buflist;
1947                         break;
1948                 case VO_PRIORITY:
1949                         priv->txvopringtail = tail;
1950                         priv->txvopbufstail = buflist;
1951                         break;
1952                 case HI_PRIORITY:
1953                         priv->txhpringtail = tail;
1954                         priv->txhpbufstail = buflist;
1955                         break;
1956                 case BEACON_PRIORITY:
1957                         /*
1958                          * The HW seems to be happy with the 1st
1959                          * descriptor filled and the 2nd empty...
1960                          * So always update descriptor 1 and never
1961                          * touch 2nd
1962                          */
1963                         break;
1964                 }
1965         }
1966         *temp_tail = *temp_tail | (1<<31); /* descriptor ready to be txed */
1967         rtl8180_dma_kick(dev, priority);
1968
1969         return 0;
1970 }
1971
1972 void rtl8180_irq_rx_tasklet(struct r8180_priv *priv);
1973
1974 void rtl8180_link_change(struct net_device *dev)
1975 {
1976         struct r8180_priv *priv = ieee80211_priv(dev);
1977         u16 beacon_interval;
1978         struct ieee80211_network *net = &priv->ieee80211->current_network;
1979
1980         rtl8180_update_msr(dev);
1981
1982         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
1983
1984         write_nic_dword(dev, BSSID, ((u32 *)net->bssid)[0]);
1985         write_nic_word(dev, BSSID+4, ((u16 *)net->bssid)[2]);
1986
1987         beacon_interval  = read_nic_word(dev, BEACON_INTERVAL);
1988         beacon_interval &= ~BEACON_INTERVAL_MASK;
1989         beacon_interval |= net->beacon_interval;
1990         write_nic_word(dev, BEACON_INTERVAL, beacon_interval);
1991
1992         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
1993
1994         rtl8180_set_chan(dev, priv->chan);
1995 }
1996
1997 void rtl8180_rq_tx_ack(struct net_device *dev)
1998 {
1999
2000         struct r8180_priv *priv = ieee80211_priv(dev);
2001
2002         write_nic_byte(dev, CONFIG4, read_nic_byte(dev, CONFIG4) | CONFIG4_PWRMGT);
2003         priv->ack_tx_to_ieee = 1;
2004 }
2005
2006 short rtl8180_is_tx_queue_empty(struct net_device *dev)
2007 {
2008
2009         struct r8180_priv *priv = ieee80211_priv(dev);
2010         u32 *d;
2011
2012         for (d = priv->txmapring;
2013                 d < priv->txmapring + priv->txringcount; d += 8)
2014                         if (*d & (1<<31))
2015                                 return 0;
2016
2017         for (d = priv->txbkpring;
2018                 d < priv->txbkpring + priv->txringcount; d += 8)
2019                         if (*d & (1<<31))
2020                                 return 0;
2021
2022         for (d = priv->txbepring;
2023                 d < priv->txbepring + priv->txringcount; d += 8)
2024                         if (*d & (1<<31))
2025                                 return 0;
2026
2027         for (d = priv->txvipring;
2028                 d < priv->txvipring + priv->txringcount; d += 8)
2029                         if (*d & (1<<31))
2030                                 return 0;
2031
2032         for (d = priv->txvopring;
2033                 d < priv->txvopring + priv->txringcount; d += 8)
2034                         if (*d & (1<<31))
2035                                 return 0;
2036
2037         for (d = priv->txhpring;
2038                 d < priv->txhpring + priv->txringcount; d += 8)
2039                         if (*d & (1<<31))
2040                                 return 0;
2041         return 1;
2042 }
2043
2044 void rtl8180_hw_wakeup(struct net_device *dev)
2045 {
2046         unsigned long flags;
2047         struct r8180_priv *priv = ieee80211_priv(dev);
2048
2049         spin_lock_irqsave(&priv->ps_lock, flags);
2050         write_nic_byte(dev, CONFIG4, read_nic_byte(dev, CONFIG4) & ~CONFIG4_PWRMGT);
2051         if (priv->rf_wakeup)
2052                 priv->rf_wakeup(dev);
2053         spin_unlock_irqrestore(&priv->ps_lock, flags);
2054 }
2055
2056 void rtl8180_hw_sleep_down(struct net_device *dev)
2057 {
2058         unsigned long flags;
2059         struct r8180_priv *priv = ieee80211_priv(dev);
2060
2061         spin_lock_irqsave(&priv->ps_lock, flags);
2062         if (priv->rf_sleep)
2063                 priv->rf_sleep(dev);
2064         spin_unlock_irqrestore(&priv->ps_lock, flags);
2065 }
2066
2067 void rtl8180_hw_sleep(struct net_device *dev, u32 th, u32 tl)
2068 {
2069         struct r8180_priv *priv = ieee80211_priv(dev);
2070         u32 rb = jiffies;
2071         unsigned long flags;
2072
2073         spin_lock_irqsave(&priv->ps_lock, flags);
2074
2075         /*
2076          * Writing HW register with 0 equals to disable
2077          * the timer, that is not really what we want
2078          */
2079         tl -= MSECS(4+16+7);
2080
2081         /*
2082          * If the interval in witch we are requested to sleep is too
2083          * short then give up and remain awake
2084          */
2085         if (((tl >= rb) && (tl-rb) <= MSECS(MIN_SLEEP_TIME))
2086                 || ((rb > tl) && (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
2087                 spin_unlock_irqrestore(&priv->ps_lock, flags);
2088                 printk("too short to sleep\n");
2089                 return;
2090         }
2091
2092         {
2093                 u32 tmp = (tl > rb) ? (tl-rb) : (rb-tl);
2094
2095                 priv->DozePeriodInPast2Sec += jiffies_to_msecs(tmp);
2096                 /* as tl may be less than rb */
2097                 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp);
2098         }
2099         /*
2100          * If we suspect the TimerInt is gone beyond tl
2101          * while setting it, then give up
2102          */
2103
2104         if (((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME))) ||
2105                 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
2106                 spin_unlock_irqrestore(&priv->ps_lock, flags);
2107                 return;
2108         }
2109
2110         queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq);
2111         spin_unlock_irqrestore(&priv->ps_lock, flags);
2112 }
2113
2114 void rtl8180_wmm_param_update(struct work_struct *work)
2115 {
2116         struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wmm_param_update_wq);
2117         struct net_device *dev = ieee->dev;
2118         u8 *ac_param = (u8 *)(ieee->current_network.wmm_param);
2119         u8 mode = ieee->current_network.mode;
2120         AC_CODING       eACI;
2121         AC_PARAM        AcParam;
2122         PAC_PARAM       pAcParam;
2123         u8 i;
2124
2125         if (!ieee->current_network.QoS_Enable) {
2126                 /* legacy ac_xx_param update */
2127                 AcParam.longData = 0;
2128                 AcParam.f.AciAifsn.f.AIFSN = 2; /* Follow 802.11 DIFS. */
2129                 AcParam.f.AciAifsn.f.ACM = 0;
2130                 AcParam.f.Ecw.f.ECWmin = 3; /* Follow 802.11 CWmin. */
2131                 AcParam.f.Ecw.f.ECWmax = 7; /* Follow 802.11 CWmax. */
2132                 AcParam.f.TXOPLimit = 0;
2133                 for (eACI = 0; eACI < AC_MAX; eACI++) {
2134                         AcParam.f.AciAifsn.f.ACI = (u8)eACI;
2135                         {
2136                                 u8              u1bAIFS;
2137                                 u32             u4bAcParam;
2138                                 pAcParam = (PAC_PARAM)(&AcParam);
2139                                 /* Retrieve parameters to update. */
2140                                 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
2141                                 u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit))<<AC_PARAM_TXOP_LIMIT_OFFSET)|
2142                                               (((u32)(pAcParam->f.Ecw.f.ECWmax))<<AC_PARAM_ECW_MAX_OFFSET)|
2143                                               (((u32)(pAcParam->f.Ecw.f.ECWmin))<<AC_PARAM_ECW_MIN_OFFSET)|
2144                                                (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2145                                 switch (eACI) {
2146                                 case AC1_BK:
2147                                         write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2148                                         break;
2149                                 case AC0_BE:
2150                                         write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2151                                         break;
2152                                 case AC2_VI:
2153                                         write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2154                                         break;
2155                                 case AC3_VO:
2156                                         write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2157                                         break;
2158                                 default:
2159                                         pr_warn("SetHwReg8185():invalid ACI: %d!\n",
2160                                                 eACI);
2161                                         break;
2162                                 }
2163                         }
2164                 }
2165                 return;
2166         }
2167
2168         for (i = 0; i < AC_MAX; i++) {
2169                 /* AcParam.longData = 0; */
2170                 pAcParam = (AC_PARAM *)ac_param;
2171                 {
2172                         AC_CODING       eACI;
2173                         u8              u1bAIFS;
2174                         u32             u4bAcParam;
2175
2176                         /* Retrieve parameters to update. */
2177                         eACI = pAcParam->f.AciAifsn.f.ACI;
2178                         /* Mode G/A: slotTimeTimer = 9; Mode B: 20 */
2179                         u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
2180                         u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET)    |
2181                                         (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET)  |
2182                                         (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET)  |
2183                                         (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2184
2185                         switch (eACI) {
2186                         case AC1_BK:
2187                                 write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2188                                 break;
2189                         case AC0_BE:
2190                                 write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2191                                 break;
2192                         case AC2_VI:
2193                                 write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2194                                 break;
2195                         case AC3_VO:
2196                                 write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2197                                 break;
2198                         default:
2199                                 pr_warn("SetHwReg8185(): invalid ACI: %d !\n",
2200                                         eACI);
2201                                 break;
2202                         }
2203                 }
2204                 ac_param += (sizeof(AC_PARAM));
2205         }
2206 }
2207
2208 void rtl8180_restart_wq(struct work_struct *work);
2209 /* void rtl8180_rq_tx_ack(struct work_struct *work); */
2210 void rtl8180_watch_dog_wq(struct work_struct *work);
2211 void rtl8180_hw_wakeup_wq(struct work_struct *work);
2212 void rtl8180_hw_sleep_wq(struct work_struct *work);
2213 void rtl8180_sw_antenna_wq(struct work_struct *work);
2214 void rtl8180_watch_dog(struct net_device *dev);
2215
2216 void watch_dog_adaptive(unsigned long data)
2217 {
2218         struct r8180_priv *priv = ieee80211_priv((struct net_device *)data);
2219
2220         if (!priv->up) {
2221                 DMESG("<----watch_dog_adaptive():driver is not up!\n");
2222                 return;
2223         }
2224
2225         /* Tx High Power Mechanism. */
2226         if (CheckHighPower((struct net_device *)data))
2227                 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->tx_pw_wq);
2228
2229         /* Tx Power Tracking on 87SE. */
2230         if (CheckTxPwrTracking((struct net_device *)data))
2231                 TxPwrTracking87SE((struct net_device *)data);
2232
2233         /* Perform DIG immediately. */
2234         if (CheckDig((struct net_device *)data) == true)
2235                 queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_dig_wq);
2236         rtl8180_watch_dog((struct net_device *)data);
2237
2238         queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->GPIOChangeRFWorkItem);
2239
2240         priv->watch_dog_timer.expires = jiffies + MSECS(IEEE80211_WATCH_DOG_TIME);
2241         add_timer(&priv->watch_dog_timer);
2242 }
2243
2244 static CHANNEL_LIST ChannelPlan[] = {
2245         {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19},         /* FCC */
2246         {{1,2,3,4,5,6,7,8,9,10,11},11},                                 /* IC */
2247         {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   /* ETSI */
2248         {{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. */
2249         {{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. */
2250         {{14,36,40,44,48,52,56,60,64},9},                               /* MKK */
2251         {{1,2,3,4,5,6,7,8,9,10,11,12,13,14, 36,40,44,48,52,56,60,64},22},/* MKK1 */
2252         {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   /* Israel. */
2253         {{1,2,3,4,5,6,7,8,9,10,11,12,13,34,38,42,46},17},               /* For 11a , TELEC */
2254         {{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 */
2255         {{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 */
2256 };
2257
2258 static void rtl8180_set_channel_map(u8 channel_plan, struct ieee80211_device *ieee)
2259 {
2260         int i;
2261
2262         /* lzm add 080826 */
2263         ieee->MinPassiveChnlNum = MAX_CHANNEL_NUMBER+1;
2264         ieee->IbssStartChnl = 0;
2265
2266         switch (channel_plan) {
2267         case COUNTRY_CODE_FCC:
2268         case COUNTRY_CODE_IC:
2269         case COUNTRY_CODE_ETSI:
2270         case COUNTRY_CODE_SPAIN:
2271         case COUNTRY_CODE_FRANCE:
2272         case COUNTRY_CODE_MKK:
2273         case COUNTRY_CODE_MKK1:
2274         case COUNTRY_CODE_ISRAEL:
2275         case COUNTRY_CODE_TELEC:
2276                 {
2277                         Dot11d_Init(ieee);
2278                         ieee->bGlobalDomain = false;
2279                         if (ChannelPlan[channel_plan].Len != 0) {
2280                                 /* Clear old channel map */
2281                                 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
2282                                 /* Set new channel map */
2283                                 for (i = 0; i < ChannelPlan[channel_plan].Len; i++) {
2284                                         if (ChannelPlan[channel_plan].Channel[i] <= 14)
2285                                                 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
2286                                 }
2287                         }
2288                         break;
2289                 }
2290         case COUNTRY_CODE_GLOBAL_DOMAIN:
2291                 {
2292                         GET_DOT11D_INFO(ieee)->bEnabled = 0;
2293                         Dot11d_Reset(ieee);
2294                         ieee->bGlobalDomain = true;
2295                         break;
2296                 }
2297         case COUNTRY_CODE_WORLD_WIDE_13_INDEX:/* lzm add 080826 */
2298                 {
2299                         ieee->MinPassiveChnlNum = 12;
2300                         ieee->IbssStartChnl = 10;
2301                         break;
2302                 }
2303         default:
2304                 {
2305                         Dot11d_Init(ieee);
2306                         ieee->bGlobalDomain = false;
2307                         memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
2308                         for (i = 1; i <= 14; i++)
2309                                 GET_DOT11D_INFO(ieee)->channel_map[i] = 1;
2310                         break;
2311                 }
2312         }
2313 }
2314
2315 void GPIOChangeRFWorkItemCallBack(struct work_struct *work);
2316
2317 /* YJ,add,080828 */
2318 static void rtl8180_statistics_init(struct Stats *pstats)
2319 {
2320         memset(pstats, 0, sizeof(struct Stats));
2321 }
2322
2323 static void rtl8180_link_detect_init(plink_detect_t plink_detect)
2324 {
2325         memset(plink_detect, 0, sizeof(link_detect_t));
2326         plink_detect->SlotNum = DEFAULT_SLOT_NUM;
2327 }
2328
2329 /* YJ,add,080828,end */
2330 static void rtl8187se_eeprom_register_read(struct eeprom_93cx6 *eeprom)
2331 {
2332         struct net_device *dev = eeprom->data;
2333         u8 reg = read_nic_byte(dev, EPROM_CMD);
2334
2335         eeprom->reg_data_in = reg & RTL818X_EEPROM_CMD_WRITE;
2336         eeprom->reg_data_out = reg & RTL818X_EEPROM_CMD_READ;
2337         eeprom->reg_data_clock = reg & RTL818X_EEPROM_CMD_CK;
2338         eeprom->reg_chip_select = reg & RTL818X_EEPROM_CMD_CS;
2339 }
2340
2341 static void rtl8187se_eeprom_register_write(struct eeprom_93cx6 *eeprom)
2342 {
2343         struct net_device *dev = eeprom->data;
2344         u8 reg = 2 << 6;
2345
2346         if (eeprom->reg_data_in)
2347                 reg |= RTL818X_EEPROM_CMD_WRITE;
2348         if (eeprom->reg_data_out)
2349                 reg |= RTL818X_EEPROM_CMD_READ;
2350         if (eeprom->reg_data_clock)
2351                 reg |= RTL818X_EEPROM_CMD_CK;
2352         if (eeprom->reg_chip_select)
2353                 reg |= RTL818X_EEPROM_CMD_CS;
2354
2355         write_nic_byte(dev, EPROM_CMD, reg);
2356         read_nic_byte(dev, EPROM_CMD);
2357         udelay(10);
2358 }
2359
2360 short rtl8180_init(struct net_device *dev)
2361 {
2362         struct r8180_priv *priv = ieee80211_priv(dev);
2363         u16 word;
2364         u16 usValue;
2365         u16 tmpu16;
2366         int i, j;
2367         struct eeprom_93cx6 eeprom;
2368         u16 eeprom_val;
2369
2370         eeprom.data = dev;
2371         eeprom.register_read = rtl8187se_eeprom_register_read;
2372         eeprom.register_write = rtl8187se_eeprom_register_write;
2373         eeprom.width = PCI_EEPROM_WIDTH_93C46;
2374
2375         eeprom_93cx6_read(&eeprom, EEPROM_COUNTRY_CODE>>1, &eeprom_val);
2376         priv->channel_plan = eeprom_val & 0xFF;
2377         if (priv->channel_plan > COUNTRY_CODE_GLOBAL_DOMAIN) {
2378                 printk("rtl8180_init:Error channel plan! Set to default.\n");
2379                 priv->channel_plan = 0;
2380         }
2381
2382         DMESG("Channel plan is %d\n", priv->channel_plan);
2383         rtl8180_set_channel_map(priv->channel_plan, priv->ieee80211);
2384
2385         /* FIXME: these constants are placed in a bad pleace. */
2386         priv->txbuffsize = 2048;        /* 1024; */
2387         priv->txringcount = 32;         /* 32; */
2388         priv->rxbuffersize = 2048;      /* 1024; */
2389         priv->rxringcount = 64;         /* 32; */
2390         priv->txbeaconcount = 2;
2391         priv->rx_skb_complete = 1;
2392
2393         priv->RFChangeInProgress = false;
2394         priv->SetRFPowerStateInProgress = false;
2395         priv->RFProgType = 0;
2396
2397         priv->irq_enabled = 0;
2398
2399         rtl8180_statistics_init(&priv->stats);
2400         rtl8180_link_detect_init(&priv->link_detect);
2401
2402         priv->ack_tx_to_ieee = 0;
2403         priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2404         priv->ieee80211->iw_mode = IW_MODE_INFRA;
2405         priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
2406                 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2407                 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;
2408         priv->ieee80211->active_scan = 1;
2409         priv->ieee80211->rate = 110; /* 11 mbps */
2410         priv->ieee80211->modulation = IEEE80211_CCK_MODULATION;
2411         priv->ieee80211->host_encrypt = 1;
2412         priv->ieee80211->host_decrypt = 1;
2413         priv->ieee80211->sta_wake_up = rtl8180_hw_wakeup;
2414         priv->ieee80211->ps_request_tx_ack = rtl8180_rq_tx_ack;
2415         priv->ieee80211->enter_sleep_state = rtl8180_hw_sleep;
2416         priv->ieee80211->ps_is_queue_empty = rtl8180_is_tx_queue_empty;
2417
2418         priv->hw_wep = hwwep;
2419         priv->dev = dev;
2420         priv->retry_rts = DEFAULT_RETRY_RTS;
2421         priv->retry_data = DEFAULT_RETRY_DATA;
2422         priv->RFChangeInProgress = false;
2423         priv->SetRFPowerStateInProgress = false;
2424         priv->RFProgType = 0;
2425         priv->bInactivePs = true; /* false; */
2426         priv->ieee80211->bInactivePs = priv->bInactivePs;
2427         priv->bSwRfProcessing = false;
2428         priv->eRFPowerState = eRfOff;
2429         priv->RfOffReason = 0;
2430         priv->LedStrategy = SW_LED_MODE0;
2431         priv->TxPollingTimes = 0; /* lzm add 080826 */
2432         priv->bLeisurePs = true;
2433         priv->dot11PowerSaveMode = eActive;
2434         priv->AdMinCheckPeriod = 5;
2435         priv->AdMaxCheckPeriod = 10;
2436         priv->AdMaxRxSsThreshold = 30;  /* 60->30 */
2437         priv->AdRxSsThreshold = 20;     /* 50->20 */
2438         priv->AdCheckPeriod = priv->AdMinCheckPeriod;
2439         priv->AdTickCount = 0;
2440         priv->AdRxSignalStrength = -1;
2441         priv->RegSwAntennaDiversityMechanism = 0;
2442         priv->RegDefaultAntenna = 0;
2443         priv->SignalStrength = 0;
2444         priv->AdRxOkCnt = 0;
2445         priv->CurrAntennaIndex = 0;
2446         priv->AdRxSsBeforeSwitched = 0;
2447         init_timer(&priv->SwAntennaDiversityTimer);
2448         priv->SwAntennaDiversityTimer.data = (unsigned long)dev;
2449         priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback;
2450         priv->bDigMechanism = 1;
2451         priv->InitialGain = 6;
2452         priv->bXtalCalibration = false;
2453         priv->XtalCal_Xin = 0;
2454         priv->XtalCal_Xout = 0;
2455         priv->bTxPowerTrack = false;
2456         priv->ThermalMeter = 0;
2457         priv->FalseAlarmRegValue = 0;
2458         priv->RegDigOfdmFaUpTh = 0xc; /* Upper threshold of OFDM false alarm, which is used in DIG. */
2459         priv->DIG_NumberFallbackVote = 0;
2460         priv->DIG_NumberUpgradeVote = 0;
2461         priv->LastSignalStrengthInPercent = 0;
2462         priv->Stats_SignalStrength = 0;
2463         priv->LastRxPktAntenna = 0;
2464         priv->SignalQuality = 0; /* in 0-100 index. */
2465         priv->Stats_SignalQuality = 0;
2466         priv->RecvSignalPower = 0; /* in dBm. */
2467         priv->Stats_RecvSignalPower = 0;
2468         priv->AdMainAntennaRxOkCnt = 0;
2469         priv->AdAuxAntennaRxOkCnt = 0;
2470         priv->bHWAdSwitched = false;
2471         priv->bRegHighPowerMechanism = true;
2472         priv->RegHiPwrUpperTh = 77;
2473         priv->RegHiPwrLowerTh = 75;
2474         priv->RegRSSIHiPwrUpperTh = 70;
2475         priv->RegRSSIHiPwrLowerTh = 20;
2476         priv->bCurCCKPkt = false;
2477         priv->UndecoratedSmoothedSS = -1;
2478         priv->bToUpdateTxPwr = false;
2479         priv->CurCCKRSSI = 0;
2480         priv->RxPower = 0;
2481         priv->RSSI = 0;
2482         priv->NumTxOkTotal = 0;
2483         priv->NumTxUnicast = 0;
2484         priv->keepAliveLevel = DEFAULT_KEEP_ALIVE_LEVEL;
2485         priv->CurrRetryCnt = 0;
2486         priv->LastRetryCnt = 0;
2487         priv->LastTxokCnt = 0;
2488         priv->LastRxokCnt = 0;
2489         priv->LastRetryRate = 0;
2490         priv->bTryuping = 0;
2491         priv->CurrTxRate = 0;
2492         priv->CurrRetryRate = 0;
2493         priv->TryupingCount = 0;
2494         priv->TryupingCountNoData = 0;
2495         priv->TryDownCountLowData = 0;
2496         priv->LastTxOKBytes = 0;
2497         priv->LastFailTxRate = 0;
2498         priv->LastFailTxRateSS = 0;
2499         priv->FailTxRateCount = 0;
2500         priv->LastTxThroughput = 0;
2501         priv->NumTxOkBytesTotal = 0;
2502         priv->ForcedDataRate = 0;
2503         priv->RegBModeGainStage = 1;
2504
2505         priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
2506         spin_lock_init(&priv->irq_th_lock);
2507         spin_lock_init(&priv->tx_lock);
2508         spin_lock_init(&priv->ps_lock);
2509         spin_lock_init(&priv->rf_ps_lock);
2510         sema_init(&priv->wx_sem, 1);
2511         INIT_WORK(&priv->reset_wq, (void *)rtl8180_restart_wq);
2512         INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,
2513                           (void *)rtl8180_hw_wakeup_wq);
2514         INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,
2515                           (void *)rtl8180_hw_sleep_wq);
2516         INIT_WORK(&priv->ieee80211->wmm_param_update_wq,
2517                   (void *)rtl8180_wmm_param_update);
2518         INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,
2519                           (void *)rtl8180_rate_adapter);
2520         INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,
2521                          (void *)rtl8180_hw_dig_wq);
2522         INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,
2523                          (void *)rtl8180_tx_pw_wq);
2524         INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,
2525                          (void *) GPIOChangeRFWorkItemCallBack);
2526         tasklet_init(&priv->irq_rx_tasklet,
2527                      (void(*)(unsigned long)) rtl8180_irq_rx_tasklet,
2528                      (unsigned long)priv);
2529
2530         init_timer(&priv->watch_dog_timer);
2531         priv->watch_dog_timer.data = (unsigned long)dev;
2532         priv->watch_dog_timer.function = watch_dog_adaptive;
2533
2534         init_timer(&priv->rateadapter_timer);
2535         priv->rateadapter_timer.data = (unsigned long)dev;
2536         priv->rateadapter_timer.function = timer_rate_adaptive;
2537         priv->RateAdaptivePeriod = RATE_ADAPTIVE_TIMER_PERIOD;
2538         priv->bEnhanceTxPwr = false;
2539
2540         priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit;
2541         priv->ieee80211->set_chan = rtl8180_set_chan;
2542         priv->ieee80211->link_change = rtl8180_link_change;
2543         priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit;
2544         priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop;
2545         priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume;
2546
2547         priv->ieee80211->init_wmmparam_flag = 0;
2548
2549         priv->ieee80211->start_send_beacons = rtl8180_start_tx_beacon;
2550         priv->ieee80211->stop_send_beacons = rtl8180_beacon_tx_disable;
2551         priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2552
2553         priv->ShortRetryLimit = 7;
2554         priv->LongRetryLimit = 7;
2555         priv->EarlyRxThreshold = 7;
2556
2557         priv->TransmitConfig =  (1<<TCR_DurProcMode_OFFSET) |
2558                                 (7<<TCR_MXDMA_OFFSET) |
2559                                 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) |
2560                                 (priv->LongRetryLimit<<TCR_LRL_OFFSET);
2561
2562         priv->ReceiveConfig =   RCR_AMF | RCR_ADF | RCR_ACF |
2563                                 RCR_AB | RCR_AM | RCR_APM |
2564                                 (7<<RCR_MXDMA_OFFSET) |
2565                                 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) |
2566                                 (priv->EarlyRxThreshold == 7 ?
2567                                          RCR_ONLYERLPKT : 0);
2568
2569         priv->IntrMask          = IMR_TMGDOK | IMR_TBDER | IMR_THPDER |
2570                                   IMR_THPDER | IMR_THPDOK |
2571                                   IMR_TVODER | IMR_TVODOK |
2572                                   IMR_TVIDER | IMR_TVIDOK |
2573                                   IMR_TBEDER | IMR_TBEDOK |
2574                                   IMR_TBKDER | IMR_TBKDOK |
2575                                   IMR_RDU |
2576                                   IMR_RER | IMR_ROK |
2577                                   IMR_RQoSOK;
2578
2579         priv->InitialGain = 6;
2580
2581         DMESG("MAC controller is a RTL8187SE b/g");
2582
2583         priv->ieee80211->modulation |= IEEE80211_OFDM_MODULATION;
2584         priv->ieee80211->short_slot = 1;
2585
2586         eeprom_93cx6_read(&eeprom, EEPROM_SW_REVD_OFFSET, &usValue);
2587         DMESG("usValue is %#hx\n", usValue);
2588         /* 3Read AntennaDiversity */
2589
2590         /* SW Antenna Diversity. */
2591         priv->EEPROMSwAntennaDiversity = (usValue & EEPROM_SW_AD_MASK) ==
2592                 EEPROM_SW_AD_ENABLE;
2593
2594         /* Default Antenna to use. */
2595         priv->EEPROMDefaultAntenna1 = (usValue & EEPROM_DEF_ANT_MASK) ==
2596                 EEPROM_DEF_ANT_1;
2597
2598         if (priv->RegSwAntennaDiversityMechanism == 0) /* Auto */
2599                 /* 0: default from EEPROM. */
2600                 priv->bSwAntennaDiverity = priv->EEPROMSwAntennaDiversity;
2601         else
2602                 /* 1:disable antenna diversity, 2: enable antenna diversity. */
2603                 priv->bSwAntennaDiverity = priv->RegSwAntennaDiversityMechanism == 2;
2604
2605         if (priv->RegDefaultAntenna == 0)
2606                 /* 0: default from EEPROM. */
2607                 priv->bDefaultAntenna1 = priv->EEPROMDefaultAntenna1;
2608         else
2609                 /* 1: main, 2: aux. */
2610                 priv->bDefaultAntenna1 = priv->RegDefaultAntenna == 2;
2611
2612         priv->plcp_preamble_mode = 2;
2613         /* the eeprom type is stored in RCR register bit #6 */
2614         if (RCR_9356SEL & read_nic_dword(dev, RCR))
2615                 priv->epromtype = EPROM_93c56;
2616         else
2617                 priv->epromtype = EPROM_93c46;
2618
2619         eeprom_93cx6_multiread(&eeprom, 0x7, (__le16 *)
2620                                dev->dev_addr, 3);
2621
2622         for (i = 1, j = 0; i < 14; i += 2, j++) {
2623                 eeprom_93cx6_read(&eeprom, EPROM_TXPW_CH1_2 + j, &word);
2624                 priv->chtxpwr[i] = word & 0xff;
2625                 priv->chtxpwr[i+1] = (word & 0xff00)>>8;
2626         }
2627         for (i = 1, j = 0; i < 14; i += 2, j++) {
2628                 eeprom_93cx6_read(&eeprom, EPROM_TXPW_OFDM_CH1_2 + j, &word);
2629                 priv->chtxpwr_ofdm[i] = word & 0xff;
2630                 priv->chtxpwr_ofdm[i+1] = (word & 0xff00) >> 8;
2631         }
2632
2633         /* 3Read crystal calibration and thermal meter indication on 87SE. */
2634         eeprom_93cx6_read(&eeprom, EEPROM_RSV>>1, &tmpu16);
2635
2636         /* Crystal calibration for Xin and Xout resp. */
2637         priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK;
2638         priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK) >> 4;
2639         if ((tmpu16 & EEPROM_XTAL_CAL_ENABLE) >> 12)
2640                 priv->bXtalCalibration = true;
2641
2642         /* Thermal meter reference indication. */
2643         priv->ThermalMeter =  (u8)((tmpu16 & EEPROM_THERMAL_METER_MASK) >> 8);
2644         if ((tmpu16 & EEPROM_THERMAL_METER_ENABLE) >> 13)
2645                 priv->bTxPowerTrack = true;
2646
2647         priv->rf_sleep = rtl8225z4_rf_sleep;
2648         priv->rf_wakeup = rtl8225z4_rf_wakeup;
2649         DMESGW("**PLEASE** REPORT SUCCESSFUL/UNSUCCESSFUL TO Realtek!");
2650
2651         priv->rf_close = rtl8225z2_rf_close;
2652         priv->rf_init = rtl8225z2_rf_init;
2653         priv->rf_set_chan = rtl8225z2_rf_set_chan;
2654         priv->rf_set_sens = NULL;
2655
2656         if (0 != alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount))
2657                 return -ENOMEM;
2658
2659         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2660                                   TX_MANAGEPRIORITY_RING_ADDR))
2661                 return -ENOMEM;
2662
2663         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2664                                  TX_BKPRIORITY_RING_ADDR))
2665                 return -ENOMEM;
2666
2667         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2668                                  TX_BEPRIORITY_RING_ADDR))
2669                 return -ENOMEM;
2670
2671         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2672                                   TX_VIPRIORITY_RING_ADDR))
2673                 return -ENOMEM;
2674
2675         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2676                                   TX_VOPRIORITY_RING_ADDR))
2677                 return -ENOMEM;
2678
2679         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount,
2680                                   TX_HIGHPRIORITY_RING_ADDR))
2681                 return -ENOMEM;
2682
2683         if (0 != alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txbeaconcount,
2684                                   TX_BEACON_RING_ADDR))
2685                 return -ENOMEM;
2686
2687         if (request_irq(dev->irq, (void *)rtl8180_interrupt, IRQF_SHARED, dev->name, dev)) {
2688                 DMESGE("Error allocating IRQ %d", dev->irq);
2689                 return -1;
2690         } else {
2691                 priv->irq = dev->irq;
2692                 DMESG("IRQ %d", dev->irq);
2693         }
2694
2695         return 0;
2696 }
2697
2698 void rtl8180_no_hw_wep(struct net_device *dev)
2699 {
2700 }
2701
2702 void rtl8180_set_hw_wep(struct net_device *dev)
2703 {
2704         struct r8180_priv *priv = ieee80211_priv(dev);
2705         u8 pgreg;
2706         u8 security;
2707         u32 key0_word4;
2708
2709         pgreg = read_nic_byte(dev, PGSELECT);
2710         write_nic_byte(dev, PGSELECT, pgreg & ~(1<<PGSELECT_PG_SHIFT));
2711
2712         key0_word4 = read_nic_dword(dev, KEY0+4+4+4);
2713         key0_word4 &= ~0xff;
2714         key0_word4 |= priv->key0[3] & 0xff;
2715         write_nic_dword(dev, KEY0, (priv->key0[0]));
2716         write_nic_dword(dev, KEY0+4, (priv->key0[1]));
2717         write_nic_dword(dev, KEY0+4+4, (priv->key0[2]));
2718         write_nic_dword(dev, KEY0+4+4+4, (key0_word4));
2719
2720         security  = read_nic_byte(dev, SECURITY);
2721         security |= (1<<SECURITY_WEP_TX_ENABLE_SHIFT);
2722         security |= (1<<SECURITY_WEP_RX_ENABLE_SHIFT);
2723         security &= ~SECURITY_ENCRYP_MASK;
2724         security |= (SECURITY_ENCRYP_104<<SECURITY_ENCRYP_SHIFT);
2725
2726         write_nic_byte(dev, SECURITY, security);
2727
2728         DMESG("key %x %x %x %x", read_nic_dword(dev, KEY0+4+4+4),
2729               read_nic_dword(dev, KEY0+4+4), read_nic_dword(dev, KEY0+4),
2730               read_nic_dword(dev, KEY0));
2731 }
2732
2733
2734 void rtl8185_rf_pins_enable(struct net_device *dev)
2735 {
2736         /* u16 tmp; */
2737         /* tmp = read_nic_word(dev, RFPinsEnable); */
2738         write_nic_word(dev, RFPinsEnable, 0x1fff); /* | tmp); */
2739 }
2740
2741 void rtl8185_set_anaparam2(struct net_device *dev, u32 a)
2742 {
2743         u8 conf3;
2744
2745         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
2746
2747         conf3 = read_nic_byte(dev, CONFIG3);
2748         write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
2749         write_nic_dword(dev, ANAPARAM2, a);
2750
2751         conf3 = read_nic_byte(dev, CONFIG3);
2752         write_nic_byte(dev, CONFIG3, conf3 & ~(1<<CONFIG3_ANAPARAM_W_SHIFT));
2753         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2754 }
2755
2756 void rtl8180_set_anaparam(struct net_device *dev, u32 a)
2757 {
2758         u8 conf3;
2759
2760         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
2761
2762         conf3 = read_nic_byte(dev, CONFIG3);
2763         write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
2764         write_nic_dword(dev, ANAPARAM, a);
2765
2766         conf3 = read_nic_byte(dev, CONFIG3);
2767         write_nic_byte(dev, CONFIG3, conf3 & ~(1<<CONFIG3_ANAPARAM_W_SHIFT));
2768         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2769 }
2770
2771 void rtl8185_tx_antenna(struct net_device *dev, u8 ant)
2772 {
2773         write_nic_byte(dev, TX_ANTENNA, ant);
2774         force_pci_posting(dev);
2775         mdelay(1);
2776 }
2777
2778 void rtl8185_write_phy(struct net_device *dev, u8 adr, u32 data)
2779 {
2780         u32 phyw;
2781
2782         adr |= 0x80;
2783
2784         phyw = ((data<<8) | adr);
2785
2786         /* Note that, we must write 0xff7c after 0x7d-0x7f to write BB register. */
2787         write_nic_byte(dev, 0x7f, ((phyw & 0xff000000) >> 24));
2788         write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16));
2789         write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8));
2790         write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff)));
2791
2792         /* this is ok to fail when we write AGC table. check for AGC table might be
2793          * done by masking with 0x7f instead of 0xff
2794          */
2795         /* if (phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); */
2796 }
2797
2798 inline void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data)
2799 {
2800         data = data & 0xff;
2801         rtl8185_write_phy(dev, adr, data);
2802 }
2803
2804 void write_phy_cck(struct net_device *dev, u8 adr, u32 data)
2805 {
2806         data = data & 0xff;
2807         rtl8185_write_phy(dev, adr, data | 0x10000);
2808 }
2809
2810 /*
2811  * This configures registers for beacon tx and enables it via
2812  * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might
2813  * be used to stop beacon transmission
2814  */
2815 void rtl8180_start_tx_beacon(struct net_device *dev)
2816 {
2817         u16 word;
2818
2819         DMESG("Enabling beacon TX");
2820         rtl8180_prepare_beacon(dev);
2821         rtl8180_irq_disable(dev);
2822         rtl8180_beacon_tx_enable(dev);
2823
2824         word = read_nic_word(dev, AtimWnd) & ~AtimWnd_AtimWnd;
2825         write_nic_word(dev, AtimWnd, word); /* word |= */
2826
2827         word  = read_nic_word(dev, BintrItv);
2828         word &= ~BintrItv_BintrItv;
2829         word |= 1000; /* priv->ieee80211->current_network.beacon_interval *
2830                 ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1);
2831         // FIXME: check if correct ^^ worked with 0x3e8;
2832         */
2833         write_nic_word(dev, BintrItv, word);
2834
2835         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
2836
2837         rtl8185b_irq_enable(dev);
2838 }
2839
2840 static struct net_device_stats *rtl8180_stats(struct net_device *dev)
2841 {
2842         struct r8180_priv *priv = ieee80211_priv(dev);
2843
2844         return &priv->ieee80211->stats;
2845 }
2846
2847 /*
2848  * Change current and default preamble mode.
2849  */
2850 bool
2851 MgntActSet_802_11_PowerSaveMode(
2852         struct r8180_priv *priv,
2853         RT_PS_MODE              rtPsMode
2854 )
2855 {
2856         /* Currently, we do not change power save mode on IBSS mode. */
2857         if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
2858                 return false;
2859
2860         priv->ieee80211->ps = rtPsMode;
2861
2862         return true;
2863 }
2864
2865 void LeisurePSEnter(struct r8180_priv *priv)
2866 {
2867         if (priv->bLeisurePs) {
2868                 if (priv->ieee80211->ps == IEEE80211_PS_DISABLED)
2869                         /* IEEE80211_PS_ENABLE */
2870                         MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_MBCAST|IEEE80211_PS_UNICAST);
2871         }
2872 }
2873
2874 void LeisurePSLeave(struct r8180_priv *priv)
2875 {
2876         if (priv->bLeisurePs) {
2877                 if (priv->ieee80211->ps != IEEE80211_PS_DISABLED)
2878                         MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_DISABLED);
2879         }
2880 }
2881
2882 void rtl8180_hw_wakeup_wq(struct work_struct *work)
2883 {
2884         struct delayed_work *dwork = to_delayed_work(work);
2885         struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, hw_wakeup_wq);
2886         struct net_device *dev = ieee->dev;
2887
2888         rtl8180_hw_wakeup(dev);
2889 }
2890
2891 void rtl8180_hw_sleep_wq(struct work_struct *work)
2892 {
2893         struct delayed_work *dwork = to_delayed_work(work);
2894         struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, hw_sleep_wq);
2895         struct net_device *dev = ieee->dev;
2896
2897         rtl8180_hw_sleep_down(dev);
2898 }
2899
2900 static void MgntLinkKeepAlive(struct r8180_priv *priv)
2901 {
2902         if (priv->keepAliveLevel == 0)
2903                 return;
2904
2905         if (priv->ieee80211->state == IEEE80211_LINKED) {
2906                 /*
2907                  * Keep-Alive.
2908                  */
2909
2910                 if ((priv->keepAliveLevel == 2) ||
2911                         (priv->link_detect.LastNumTxUnicast == priv->NumTxUnicast &&
2912                         priv->link_detect.LastNumRxUnicast == priv->ieee80211->NumRxUnicast)
2913                         ) {
2914                         priv->link_detect.IdleCount++;
2915
2916                         /*
2917                          * Send a Keep-Alive packet packet to AP if we had been idle for a while.
2918                          */
2919                         if (priv->link_detect.IdleCount >= ((KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD)-1)) {
2920                                 priv->link_detect.IdleCount = 0;
2921                                 ieee80211_sta_ps_send_null_frame(priv->ieee80211, false);
2922                         }
2923                 } else {
2924                         priv->link_detect.IdleCount = 0;
2925                 }
2926                 priv->link_detect.LastNumTxUnicast = priv->NumTxUnicast;
2927                 priv->link_detect.LastNumRxUnicast = priv->ieee80211->NumRxUnicast;
2928         }
2929 }
2930
2931 void rtl8180_watch_dog(struct net_device *dev)
2932 {
2933         struct r8180_priv *priv = ieee80211_priv(dev);
2934         bool bEnterPS = false;
2935         bool bBusyTraffic = false;
2936         u32 TotalRxNum = 0;
2937         u16 SlotIndex = 0;
2938         u16 i = 0;
2939         if (priv->ieee80211->actscanning == false) {
2940                 if ((priv->ieee80211->iw_mode != IW_MODE_ADHOC) &&
2941                     (priv->ieee80211->state == IEEE80211_NOLINK) &&
2942                     (priv->ieee80211->beinretry == false) &&
2943                     (priv->eRFPowerState == eRfOn))
2944                         IPSEnter(dev);
2945         }
2946         /* YJ,add,080828,for link state check */
2947         if ((priv->ieee80211->state == IEEE80211_LINKED) && (priv->ieee80211->iw_mode == IW_MODE_INFRA)) {
2948                 SlotIndex = (priv->link_detect.SlotIndex++) % priv->link_detect.SlotNum;
2949                 priv->link_detect.RxFrameNum[SlotIndex] = priv->ieee80211->NumRxDataInPeriod + priv->ieee80211->NumRxBcnInPeriod;
2950                 for (i = 0; i < priv->link_detect.SlotNum; i++)
2951                         TotalRxNum += priv->link_detect.RxFrameNum[i];
2952
2953                 if (TotalRxNum == 0) {
2954                         priv->ieee80211->state = IEEE80211_ASSOCIATING;
2955                         queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
2956                 }
2957         }
2958
2959         /* YJ,add,080828,for KeepAlive */
2960         MgntLinkKeepAlive(priv);
2961
2962         /* YJ,add,080828,for LPS */
2963         LeisurePSLeave(priv);
2964
2965         if (priv->ieee80211->state == IEEE80211_LINKED) {
2966                 priv->link_detect.NumRxOkInPeriod = priv->ieee80211->NumRxDataInPeriod;
2967                 if (priv->link_detect.NumRxOkInPeriod > 666 ||
2968                         priv->link_detect.NumTxOkInPeriod > 666) {
2969                         bBusyTraffic = true;
2970                 }
2971                 if (((priv->link_detect.NumRxOkInPeriod + priv->link_detect.NumTxOkInPeriod) > 8)
2972                         || (priv->link_detect.NumRxOkInPeriod > 2)) {
2973                         bEnterPS = false;
2974                 } else
2975                         bEnterPS = true;
2976
2977                 if (bEnterPS)
2978                         LeisurePSEnter(priv);
2979                 else
2980                         LeisurePSLeave(priv);
2981         } else
2982                 LeisurePSLeave(priv);
2983         priv->link_detect.bBusyTraffic = bBusyTraffic;
2984         priv->link_detect.NumRxOkInPeriod = 0;
2985         priv->link_detect.NumTxOkInPeriod = 0;
2986         priv->ieee80211->NumRxDataInPeriod = 0;
2987         priv->ieee80211->NumRxBcnInPeriod = 0;
2988 }
2989
2990 int _rtl8180_up(struct net_device *dev)
2991 {
2992         struct r8180_priv *priv = ieee80211_priv(dev);
2993
2994         priv->up = 1;
2995
2996         DMESG("Bringing up iface");
2997         rtl8185b_adapter_start(dev);
2998         rtl8185b_rx_enable(dev);
2999         rtl8185b_tx_enable(dev);
3000         if (priv->bInactivePs) {
3001                 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3002                         IPSLeave(dev);
3003         }
3004         timer_rate_adaptive((unsigned long)dev);
3005         watch_dog_adaptive((unsigned long)dev);
3006         if (priv->bSwAntennaDiverity)
3007                         SwAntennaDiversityTimerCallback(dev);
3008         ieee80211_softmac_start_protocol(priv->ieee80211);
3009         return 0;
3010 }
3011
3012 int rtl8180_open(struct net_device *dev)
3013 {
3014         struct r8180_priv *priv = ieee80211_priv(dev);
3015         int ret;
3016
3017         down(&priv->wx_sem);
3018         ret = rtl8180_up(dev);
3019         up(&priv->wx_sem);
3020         return ret;
3021 }
3022
3023 int rtl8180_up(struct net_device *dev)
3024 {
3025         struct r8180_priv *priv = ieee80211_priv(dev);
3026
3027         if (priv->up == 1)
3028                 return -1;
3029
3030         return _rtl8180_up(dev);
3031 }
3032
3033 int rtl8180_close(struct net_device *dev)
3034 {
3035         struct r8180_priv *priv = ieee80211_priv(dev);
3036         int ret;
3037
3038         down(&priv->wx_sem);
3039         ret = rtl8180_down(dev);
3040         up(&priv->wx_sem);
3041
3042         return ret;
3043 }
3044
3045 int rtl8180_down(struct net_device *dev)
3046 {
3047         struct r8180_priv *priv = ieee80211_priv(dev);
3048
3049         if (priv->up == 0)
3050                 return -1;
3051
3052         priv->up = 0;
3053
3054         ieee80211_softmac_stop_protocol(priv->ieee80211);
3055         /* FIXME */
3056         if (!netif_queue_stopped(dev))
3057                 netif_stop_queue(dev);
3058         rtl8180_rtx_disable(dev);
3059         rtl8180_irq_disable(dev);
3060         del_timer_sync(&priv->watch_dog_timer);
3061         del_timer_sync(&priv->rateadapter_timer);
3062         cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
3063         cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
3064         cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
3065         cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
3066         cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
3067         del_timer_sync(&priv->SwAntennaDiversityTimer);
3068         SetZebraRFPowerState8185(dev, eRfOff);
3069         memset(&(priv->ieee80211->current_network), 0, sizeof(struct ieee80211_network));
3070         priv->ieee80211->state = IEEE80211_NOLINK;
3071         return 0;
3072 }
3073
3074 void rtl8180_restart_wq(struct work_struct *work)
3075 {
3076         struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq);
3077         struct net_device *dev = priv->dev;
3078
3079         down(&priv->wx_sem);
3080
3081         rtl8180_commit(dev);
3082
3083         up(&priv->wx_sem);
3084 }
3085
3086 void rtl8180_restart(struct net_device *dev)
3087 {
3088         struct r8180_priv *priv = ieee80211_priv(dev);
3089
3090         schedule_work(&priv->reset_wq);
3091 }
3092
3093 void rtl8180_commit(struct net_device *dev)
3094 {
3095         struct r8180_priv *priv = ieee80211_priv(dev);
3096
3097         if (priv->up == 0)
3098                 return ;
3099
3100         del_timer_sync(&priv->watch_dog_timer);
3101         del_timer_sync(&priv->rateadapter_timer);
3102         cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
3103         cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
3104         cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
3105         cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
3106         cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
3107         del_timer_sync(&priv->SwAntennaDiversityTimer);
3108         ieee80211_softmac_stop_protocol(priv->ieee80211);
3109         rtl8180_irq_disable(dev);
3110         rtl8180_rtx_disable(dev);
3111         _rtl8180_up(dev);
3112 }
3113
3114 static void r8180_set_multicast(struct net_device *dev)
3115 {
3116         struct r8180_priv *priv = ieee80211_priv(dev);
3117         short promisc;
3118
3119         promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
3120
3121         if (promisc != priv->promisc)
3122                 rtl8180_restart(dev);
3123
3124         priv->promisc = promisc;
3125 }
3126
3127 int r8180_set_mac_adr(struct net_device *dev, void *mac)
3128 {
3129         struct r8180_priv *priv = ieee80211_priv(dev);
3130         struct sockaddr *addr = mac;
3131
3132         down(&priv->wx_sem);
3133
3134         memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
3135
3136         if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
3137                 memcpy(priv->ieee80211->current_network.bssid, dev->dev_addr, ETH_ALEN);
3138
3139         if (priv->up) {
3140                 rtl8180_down(dev);
3141                 rtl8180_up(dev);
3142         }
3143
3144         up(&priv->wx_sem);
3145
3146         return 0;
3147 }
3148
3149 /* based on ipw2200 driver */
3150 int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
3151 {
3152         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3153         struct iwreq *wrq = (struct iwreq *) rq;
3154         int ret = -1;
3155
3156         switch (cmd) {
3157         case RTL_IOCTL_WPA_SUPPLICANT:
3158                 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
3159                 return ret;
3160         default:
3161                 return -EOPNOTSUPP;
3162         }
3163
3164         return -EOPNOTSUPP;
3165 }
3166
3167 static const struct net_device_ops rtl8180_netdev_ops = {
3168         .ndo_open               = rtl8180_open,
3169         .ndo_stop               = rtl8180_close,
3170         .ndo_get_stats          = rtl8180_stats,
3171         .ndo_tx_timeout         = rtl8180_restart,
3172         .ndo_do_ioctl           = rtl8180_ioctl,
3173         .ndo_set_rx_mode        = r8180_set_multicast,
3174         .ndo_set_mac_address    = r8180_set_mac_adr,
3175         .ndo_validate_addr      = eth_validate_addr,
3176         .ndo_change_mtu         = eth_change_mtu,
3177         .ndo_start_xmit         = ieee80211_rtl_xmit,
3178 };
3179
3180 static int rtl8180_pci_probe(struct pci_dev *pdev,
3181                                        const struct pci_device_id *id)
3182 {
3183         unsigned long ioaddr = 0;
3184         struct net_device *dev = NULL;
3185         struct r8180_priv *priv = NULL;
3186         u8 unit = 0;
3187         int ret = -ENODEV;
3188
3189         unsigned long pmem_start, pmem_len, pmem_flags;
3190
3191         DMESG("Configuring chip resources");
3192
3193         if (pci_enable_device(pdev)) {
3194                 DMESG("Failed to enable PCI device");
3195                 return -EIO;
3196         }
3197
3198         pci_set_master(pdev);
3199         pci_set_dma_mask(pdev, 0xffffff00ULL);
3200         pci_set_consistent_dma_mask(pdev, 0xffffff00ULL);
3201         dev = alloc_ieee80211(sizeof(struct r8180_priv));
3202         if (!dev) {
3203                 ret = -ENOMEM;
3204                 goto fail_free;
3205         }
3206         priv = ieee80211_priv(dev);
3207         priv->ieee80211 = netdev_priv(dev);
3208
3209         pci_set_drvdata(pdev, dev);
3210         SET_NETDEV_DEV(dev, &pdev->dev);
3211
3212         priv = ieee80211_priv(dev);
3213         priv->pdev = pdev;
3214
3215         pmem_start = pci_resource_start(pdev, 1);
3216         pmem_len = pci_resource_len(pdev, 1);
3217         pmem_flags = pci_resource_flags(pdev, 1);
3218
3219         if (!(pmem_flags & IORESOURCE_MEM)) {
3220                 DMESG("region #1 not a MMIO resource, aborting");
3221                 goto fail;
3222         }
3223
3224         if (!request_mem_region(pmem_start, pmem_len, RTL8180_MODULE_NAME)) {
3225                 DMESG("request_mem_region failed!");
3226                 goto fail;
3227         }
3228
3229         ioaddr = (unsigned long)ioremap_nocache(pmem_start, pmem_len);
3230         if (ioaddr == (unsigned long)NULL) {
3231                 DMESG("ioremap failed!");
3232                 goto fail1;
3233         }
3234
3235         dev->mem_start = ioaddr; /* shared mem start */
3236         dev->mem_end = ioaddr + pci_resource_len(pdev, 0); /* shared mem end */
3237
3238         pci_read_config_byte(pdev, 0x05, &unit);
3239         pci_write_config_byte(pdev, 0x05, unit & (~0x04));
3240
3241         dev->irq = pdev->irq;
3242         priv->irq = 0;
3243
3244         dev->netdev_ops = &rtl8180_netdev_ops;
3245         dev->wireless_handlers = &r8180_wx_handlers_def;
3246
3247         dev->type = ARPHRD_ETHER;
3248         dev->watchdog_timeo = HZ*3;
3249
3250         if (dev_alloc_name(dev, ifname) < 0) {
3251                 DMESG("Oops: devname already taken! Trying wlan%%d...\n");
3252                 strcpy(ifname, "wlan%d");
3253                 dev_alloc_name(dev, ifname);
3254         }
3255
3256         if (rtl8180_init(dev) != 0) {
3257                 DMESG("Initialization failed");
3258                 goto fail1;
3259         }
3260
3261         netif_carrier_off(dev);
3262
3263         if (register_netdev(dev))
3264                 goto fail1;
3265
3266         rtl8180_proc_init_one(dev);
3267
3268         DMESG("Driver probe completed\n");
3269         return 0;
3270 fail1:
3271         if (dev->mem_start != (unsigned long)NULL) {
3272                 iounmap((void *)dev->mem_start);
3273                 release_mem_region(pci_resource_start(pdev, 1),
3274                                    pci_resource_len(pdev, 1));
3275         }
3276 fail:
3277         if (dev) {
3278                 if (priv->irq) {
3279                         free_irq(dev->irq, dev);
3280                         dev->irq = 0;
3281                 }
3282                 free_ieee80211(dev);
3283         }
3284
3285 fail_free:
3286         pci_disable_device(pdev);
3287
3288         DMESG("wlan driver load failed\n");
3289         pci_set_drvdata(pdev, NULL);
3290         return ret;
3291 }
3292
3293 static void rtl8180_pci_remove(struct pci_dev *pdev)
3294 {
3295         struct r8180_priv *priv;
3296         struct net_device *dev = pci_get_drvdata(pdev);
3297
3298         if (dev) {
3299                 unregister_netdev(dev);
3300
3301                 priv = ieee80211_priv(dev);
3302
3303                 rtl8180_proc_remove_one(dev);
3304                 rtl8180_down(dev);
3305                 priv->rf_close(dev);
3306                 rtl8180_reset(dev);
3307                 mdelay(10);
3308
3309                 if (priv->irq) {
3310                         DMESG("Freeing irq %d", dev->irq);
3311                         free_irq(dev->irq, dev);
3312                         priv->irq = 0;
3313                 }
3314
3315                 free_rx_desc_ring(dev);
3316                 free_tx_desc_rings(dev);
3317
3318                 if (dev->mem_start != (unsigned long)NULL) {
3319                         iounmap((void *)dev->mem_start);
3320                         release_mem_region(pci_resource_start(pdev, 1),
3321                                            pci_resource_len(pdev, 1));
3322                 }
3323
3324                 free_ieee80211(dev);
3325         }
3326         pci_disable_device(pdev);
3327
3328         DMESG("wlan driver removed\n");
3329 }
3330
3331 /* fun with the built-in ieee80211 stack... */
3332 extern int ieee80211_crypto_init(void);
3333 extern void ieee80211_crypto_deinit(void);
3334 extern int ieee80211_crypto_tkip_init(void);
3335 extern void ieee80211_crypto_tkip_exit(void);
3336 extern int ieee80211_crypto_ccmp_init(void);
3337 extern void ieee80211_crypto_ccmp_exit(void);
3338 extern int ieee80211_crypto_wep_init(void);
3339 extern void ieee80211_crypto_wep_exit(void);
3340
3341 static int __init rtl8180_pci_module_init(void)
3342 {
3343         int ret;
3344
3345         ret = ieee80211_crypto_init();
3346         if (ret) {
3347                 pr_err("ieee80211_crypto_init() failed %d\n", ret);
3348                 return ret;
3349         }
3350         ret = ieee80211_crypto_tkip_init();
3351         if (ret) {
3352                 pr_err("ieee80211_crypto_tkip_init() failed %d\n", ret);
3353                 return ret;
3354         }
3355         ret = ieee80211_crypto_ccmp_init();
3356         if (ret) {
3357                 pr_err("ieee80211_crypto_ccmp_init() failed %d\n", ret);
3358                 return ret;
3359         }
3360         ret = ieee80211_crypto_wep_init();
3361         if (ret) {
3362                 pr_err("ieee80211_crypto_wep_init() failed %d\n", ret);
3363                 return ret;
3364         }
3365
3366         pr_info("\nLinux kernel driver for RTL8180 / RTL8185 based WLAN cards\n");
3367         pr_info("Copyright (c) 2004-2005, Andrea Merello\n");
3368         DMESG("Initializing module");
3369         DMESG("Wireless extensions version %d", WIRELESS_EXT);
3370         rtl8180_proc_module_init();
3371
3372         if (pci_register_driver(&rtl8180_pci_driver)) {
3373                 DMESG("No device found");
3374                 return -ENODEV;
3375         }
3376         return 0;
3377 }
3378
3379 static void __exit rtl8180_pci_module_exit(void)
3380 {
3381         pci_unregister_driver(&rtl8180_pci_driver);
3382         rtl8180_proc_module_remove();
3383         ieee80211_crypto_tkip_exit();
3384         ieee80211_crypto_ccmp_exit();
3385         ieee80211_crypto_wep_exit();
3386         ieee80211_crypto_deinit();
3387         DMESG("Exiting");
3388 }
3389
3390 void rtl8180_try_wake_queue(struct net_device *dev, int pri)
3391 {
3392         unsigned long flags;
3393         short enough_desc;
3394         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3395
3396         spin_lock_irqsave(&priv->tx_lock, flags);
3397         enough_desc = check_nic_enought_desc(dev, pri);
3398         spin_unlock_irqrestore(&priv->tx_lock, flags);
3399
3400         if (enough_desc)
3401                 ieee80211_rtl_wake_queue(priv->ieee80211);
3402 }
3403
3404 void rtl8180_tx_isr(struct net_device *dev, int pri, short error)
3405 {
3406         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3407         u32 *tail; /* tail virtual addr */
3408         u32 *head; /* head virtual addr */
3409         u32 *begin; /* start of ring virtual addr */
3410         u32 *nicv; /* nic pointer virtual addr */
3411         u32 nic; /* nic pointer physical addr */
3412         u32 nicbegin; /* start of ring physical addr */
3413         unsigned long flag;
3414         /* physical addr are ok on 32 bits since we set DMA mask */
3415         int offs;
3416         int j, i;
3417         int hd;
3418         if (error)
3419                 priv->stats.txretry++; /* tony 20060601 */
3420         spin_lock_irqsave(&priv->tx_lock, flag);
3421         switch (pri) {
3422         case MANAGE_PRIORITY:
3423                 tail = priv->txmapringtail;
3424                 begin = priv->txmapring;
3425                 head = priv->txmapringhead;
3426                 nic = read_nic_dword(dev, TX_MANAGEPRIORITY_RING_ADDR);
3427                 nicbegin = priv->txmapringdma;
3428                 break;
3429         case BK_PRIORITY:
3430                 tail = priv->txbkpringtail;
3431                 begin = priv->txbkpring;
3432                 head = priv->txbkpringhead;
3433                 nic = read_nic_dword(dev, TX_BKPRIORITY_RING_ADDR);
3434                 nicbegin = priv->txbkpringdma;
3435                 break;
3436         case BE_PRIORITY:
3437                 tail = priv->txbepringtail;
3438                 begin = priv->txbepring;
3439                 head = priv->txbepringhead;
3440                 nic = read_nic_dword(dev, TX_BEPRIORITY_RING_ADDR);
3441                 nicbegin = priv->txbepringdma;
3442                 break;
3443         case VI_PRIORITY:
3444                 tail = priv->txvipringtail;
3445                 begin = priv->txvipring;
3446                 head = priv->txvipringhead;
3447                 nic = read_nic_dword(dev, TX_VIPRIORITY_RING_ADDR);
3448                 nicbegin = priv->txvipringdma;
3449                 break;
3450         case VO_PRIORITY:
3451                 tail = priv->txvopringtail;
3452                 begin = priv->txvopring;
3453                 head = priv->txvopringhead;
3454                 nic = read_nic_dword(dev, TX_VOPRIORITY_RING_ADDR);
3455                 nicbegin = priv->txvopringdma;
3456                 break;
3457         case HI_PRIORITY:
3458                 tail = priv->txhpringtail;
3459                 begin = priv->txhpring;
3460                 head = priv->txhpringhead;
3461                 nic = read_nic_dword(dev, TX_HIGHPRIORITY_RING_ADDR);
3462                 nicbegin = priv->txhpringdma;
3463                 break;
3464
3465         default:
3466                 spin_unlock_irqrestore(&priv->tx_lock, flag);
3467                 return ;
3468         }
3469
3470         nicv = (u32 *)((nic - nicbegin) + (u8 *)begin);
3471         if ((head <= tail && (nicv > tail || nicv < head)) ||
3472                 (head > tail && (nicv > tail && nicv < head))) {
3473                         DMESGW("nic has lost pointer");
3474                         spin_unlock_irqrestore(&priv->tx_lock, flag);
3475                         rtl8180_restart(dev);
3476                         return;
3477                 }
3478
3479         /*
3480          * We check all the descriptors between the head and the nic,
3481          * but not the currently pointed by the nic (the next to be txed)
3482          * and the previous of the pointed (might be in process ??)
3483          */
3484         offs = (nic - nicbegin);
3485         offs = offs / 8 / 4;
3486         hd = (head - begin) / 8;
3487
3488         if (offs >= hd)
3489                 j = offs - hd;
3490         else
3491                 j = offs + (priv->txringcount-1-hd);
3492
3493         j -= 2;
3494         if (j < 0)
3495                 j = 0;
3496
3497         for (i = 0; i < j; i++) {
3498                 if ((*head) & (1<<31))
3499                         break;
3500                 if (((*head)&(0x10000000)) != 0) {
3501                         priv->CurrRetryCnt += (u16)((*head) & (0x000000ff));
3502                         if (!error)
3503                                 priv->NumTxOkTotal++;
3504                 }
3505
3506                 if (!error)
3507                         priv->NumTxOkBytesTotal += (*(head+3)) & (0x00000fff);
3508
3509                 *head = *head & ~(1<<31);
3510
3511                 if ((head - begin)/8 == priv->txringcount-1)
3512                         head = begin;
3513                 else
3514                         head += 8;
3515         }
3516
3517         /*
3518          * The head has been moved to the last certainly TXed
3519          * (or at least processed by the nic) packet.
3520          * The driver take forcefully owning of all these packets
3521          * If the packet previous of the nic pointer has been
3522          * processed this doesn't matter: it will be checked
3523          * here at the next round. Anyway if no more packet are
3524          * TXed no memory leak occur at all.
3525          */
3526
3527         switch (pri) {
3528         case MANAGE_PRIORITY:
3529                 priv->txmapringhead = head;
3530
3531                 if (priv->ack_tx_to_ieee) {
3532                         if (rtl8180_is_tx_queue_empty(dev)) {
3533                                 priv->ack_tx_to_ieee = 0;
3534                                 ieee80211_ps_tx_ack(priv->ieee80211, !error);
3535                         }
3536                 }
3537                 break;
3538         case BK_PRIORITY:
3539                 priv->txbkpringhead = head;
3540                 break;
3541         case BE_PRIORITY:
3542                 priv->txbepringhead = head;
3543                 break;
3544         case VI_PRIORITY:
3545                 priv->txvipringhead = head;
3546                 break;
3547         case VO_PRIORITY:
3548                 priv->txvopringhead = head;
3549                 break;
3550         case HI_PRIORITY:
3551                 priv->txhpringhead = head;
3552                 break;
3553         }
3554
3555         spin_unlock_irqrestore(&priv->tx_lock, flag);
3556 }
3557
3558 irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs)
3559 {
3560         struct net_device *dev = (struct net_device *) netdev;
3561         struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3562         unsigned long flags;
3563         u32 inta;
3564
3565         /* We should return IRQ_NONE, but for now let me keep this */
3566         if (priv->irq_enabled == 0)
3567                 return IRQ_HANDLED;
3568
3569         spin_lock_irqsave(&priv->irq_th_lock, flags);
3570
3571         /* ISR: 4bytes */
3572         inta = read_nic_dword(dev, ISR); /* & priv->IntrMask; */
3573         write_nic_dword(dev, ISR, inta); /* reset int situation */
3574
3575         priv->stats.shints++;
3576
3577         if (!inta) {
3578                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3579                 return IRQ_HANDLED;
3580         /*
3581          * most probably we can safely return IRQ_NONE,
3582          * but for now is better to avoid problems
3583          */
3584         }
3585
3586         if (inta == 0xffff) {
3587                 /* HW disappeared */
3588                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3589                 return IRQ_HANDLED;
3590         }
3591
3592         priv->stats.ints++;
3593
3594         if (!netif_running(dev)) {
3595                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3596                 return IRQ_HANDLED;
3597         }
3598
3599         if (inta & ISR_TimeOut)
3600                 write_nic_dword(dev, TimerInt, 0);
3601
3602         if (inta & ISR_TBDOK)
3603                 priv->stats.txbeacon++;
3604
3605         if (inta & ISR_TBDER)
3606                 priv->stats.txbeaconerr++;
3607
3608         if (inta & IMR_TMGDOK)
3609                 rtl8180_tx_isr(dev, MANAGE_PRIORITY, 0);
3610
3611         if (inta & ISR_THPDER) {
3612                 priv->stats.txhperr++;
3613                 rtl8180_tx_isr(dev, HI_PRIORITY, 1);
3614                 priv->ieee80211->stats.tx_errors++;
3615         }
3616
3617         if (inta & ISR_THPDOK) { /* High priority tx ok */
3618                 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3619                 priv->stats.txhpokint++;
3620                 rtl8180_tx_isr(dev, HI_PRIORITY, 0);
3621         }
3622
3623         if (inta & ISR_RER)
3624                 priv->stats.rxerr++;
3625
3626         if (inta & ISR_TBKDER) { /* corresponding to BK_PRIORITY */
3627                 priv->stats.txbkperr++;
3628                 priv->ieee80211->stats.tx_errors++;
3629                 rtl8180_tx_isr(dev, BK_PRIORITY, 1);
3630                 rtl8180_try_wake_queue(dev, BK_PRIORITY);
3631         }
3632
3633         if (inta & ISR_TBEDER) { /* corresponding to BE_PRIORITY */
3634                 priv->stats.txbeperr++;
3635                 priv->ieee80211->stats.tx_errors++;
3636                 rtl8180_tx_isr(dev, BE_PRIORITY, 1);
3637                 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3638         }
3639         if (inta & ISR_TNPDER) { /* corresponding to VO_PRIORITY */
3640                 priv->stats.txnperr++;
3641                 priv->ieee80211->stats.tx_errors++;
3642                 rtl8180_tx_isr(dev, NORM_PRIORITY, 1);
3643                 rtl8180_try_wake_queue(dev, NORM_PRIORITY);
3644         }
3645
3646         if (inta & ISR_TLPDER) { /* corresponding to VI_PRIORITY */
3647                 priv->stats.txlperr++;
3648                 priv->ieee80211->stats.tx_errors++;
3649                 rtl8180_tx_isr(dev, LOW_PRIORITY, 1);
3650                 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
3651         }
3652
3653         if (inta & ISR_ROK) {
3654                 priv->stats.rxint++;
3655                 tasklet_schedule(&priv->irq_rx_tasklet);
3656         }
3657
3658         if (inta & ISR_RQoSOK) {
3659                 priv->stats.rxint++;
3660                 tasklet_schedule(&priv->irq_rx_tasklet);
3661         }
3662
3663         if (inta & ISR_BcnInt)
3664                 rtl8180_prepare_beacon(dev);
3665
3666         if (inta & ISR_RDU) {
3667                 DMESGW("No RX descriptor available");
3668                 priv->stats.rxrdu++;
3669                 tasklet_schedule(&priv->irq_rx_tasklet);
3670         }
3671
3672         if (inta & ISR_RXFOVW) {
3673                 priv->stats.rxoverflow++;
3674                 tasklet_schedule(&priv->irq_rx_tasklet);
3675         }
3676
3677         if (inta & ISR_TXFOVW)
3678                 priv->stats.txoverflow++;
3679
3680         if (inta & ISR_TNPDOK) { /* Normal priority tx ok */
3681                 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3682                 priv->stats.txnpokint++;
3683                 rtl8180_tx_isr(dev, NORM_PRIORITY, 0);
3684                 rtl8180_try_wake_queue(dev, NORM_PRIORITY);
3685         }
3686
3687         if (inta & ISR_TLPDOK) { /* Low priority tx ok */
3688                 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3689                 priv->stats.txlpokint++;
3690                 rtl8180_tx_isr(dev, LOW_PRIORITY, 0);
3691                 rtl8180_try_wake_queue(dev, LOW_PRIORITY);
3692         }
3693
3694         if (inta & ISR_TBKDOK) { /* corresponding to BK_PRIORITY */
3695                 priv->stats.txbkpokint++;
3696                 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3697                 rtl8180_tx_isr(dev, BK_PRIORITY, 0);
3698                 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3699         }
3700
3701         if (inta & ISR_TBEDOK) { /* corresponding to BE_PRIORITY */
3702                 priv->stats.txbeperr++;
3703                 priv->link_detect.NumTxOkInPeriod++; /* YJ,add,080828 */
3704                 rtl8180_tx_isr(dev, BE_PRIORITY, 0);
3705                 rtl8180_try_wake_queue(dev, BE_PRIORITY);
3706         }
3707         force_pci_posting(dev);
3708         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
3709
3710         return IRQ_HANDLED;
3711 }
3712
3713 void rtl8180_irq_rx_tasklet(struct r8180_priv *priv)
3714 {
3715         rtl8180_rx(priv->dev);
3716 }
3717
3718 void GPIOChangeRFWorkItemCallBack(struct work_struct *work)
3719 {
3720         struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, GPIOChangeRFWorkItem.work);
3721         struct net_device *dev = ieee->dev;
3722         struct r8180_priv *priv = ieee80211_priv(dev);
3723         u8 btPSR;
3724         u8 btConfig0;
3725         RT_RF_POWER_STATE       eRfPowerStateToSet;
3726         bool bActuallySet = false;
3727
3728         char *argv[3];
3729         static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
3730         static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
3731         static int readf_count;
3732
3733         readf_count = (readf_count+1)%0xffff;
3734         /* We should turn off LED before polling FF51[4]. */
3735
3736         /* Turn off LED. */
3737         btPSR = read_nic_byte(dev, PSR);
3738         write_nic_byte(dev, PSR, (btPSR & ~BIT3));
3739
3740         /* It need to delay 4us suggested by Jong, 2008-01-16 */
3741         udelay(4);
3742
3743         /* HW radio On/Off according to the value of FF51[4](config0) */
3744         btConfig0 = btPSR = read_nic_byte(dev, CONFIG0);
3745
3746         eRfPowerStateToSet = (btConfig0 & BIT4) ?  eRfOn : eRfOff;
3747
3748         /* Turn LED back on when radio enabled */
3749         if (eRfPowerStateToSet == eRfOn)
3750                 write_nic_byte(dev, PSR, btPSR | BIT3);
3751
3752         if ((priv->ieee80211->bHwRadioOff == true) &&
3753            (eRfPowerStateToSet == eRfOn)) {
3754                 priv->ieee80211->bHwRadioOff = false;
3755                 bActuallySet = true;
3756         } else if ((priv->ieee80211->bHwRadioOff == false) &&
3757                   (eRfPowerStateToSet == eRfOff)) {
3758                 priv->ieee80211->bHwRadioOff = true;
3759                 bActuallySet = true;
3760         }
3761
3762         if (bActuallySet) {
3763                 MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
3764
3765                 /* To update the UI status for Power status changed */
3766                 if (priv->ieee80211->bHwRadioOff == true)
3767                         argv[1] = "RFOFF";
3768                 else
3769                         argv[1] = "RFON";
3770                 argv[0] = RadioPowerPath;
3771                 argv[2] = NULL;
3772
3773                 call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
3774         }
3775 }
3776
3777 module_init(rtl8180_pci_module_init);
3778 module_exit(rtl8180_pci_module_exit);