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