2 * This is part of rtl8180 OpenSource driver.
3 * Copyright (C) Andrea Merello 2004-2005 <andrea.merello@gmail.com>
4 * Released under the terms of GPL (General Public Licence)
6 * Parts of this driver are based on the GPL part of the official realtek driver
8 * Parts of this driver are based on the rtl8180 driver skeleton from Patric
9 * Schenke & Andres Salomon
11 * Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver
13 * We want to thanks the Authors of those projects and the Ndiswrapper project
20 #include <linux/interrupt.h>
22 #define RTL8180_MODULE_NAME "r8180"
23 #define DMESG(x, a...) printk(KERN_INFO RTL8180_MODULE_NAME ": " x "\n", ## a)
24 #define DMESGW(x, a...) printk(KERN_WARNING RTL8180_MODULE_NAME ": WW:" x "\n", ## a)
25 #define DMESGE(x, a...) printk(KERN_WARNING RTL8180_MODULE_NAME ": EE:" x "\n", ## a)
27 #include <linux/module.h>
28 #include <linux/kernel.h>
29 /* #include <linux/config.h> */
30 #include <linux/ioport.h>
31 #include <linux/sched.h>
32 #include <linux/types.h>
33 #include <linux/slab.h>
34 #include <linux/netdevice.h>
35 #include <linux/pci.h>
36 #include <linux/etherdevice.h>
37 #include <linux/delay.h>
38 #include <linux/rtnetlink.h> /* for rtnl_lock() */
39 #include <linux/wireless.h>
40 #include <linux/timer.h>
41 #include <linux/proc_fs.h> /* Necessary because we use the proc fs. */
42 #include <linux/if_arp.h>
43 #include "ieee80211/ieee80211.h"
45 /* #include <asm/semaphore.h> */
50 #define RTL_IOCTL_WPA_SUPPLICANT (SIOCIWFIRSTPRIV + 30)
52 #define DEFAULT_FRAG_THRESHOLD 2342U
53 #define MIN_FRAG_THRESHOLD 256U
54 #define DEFAULT_RTS_THRESHOLD 2342U
55 #define MIN_RTS_THRESHOLD 0U
56 #define MAX_RTS_THRESHOLD 2342U
57 #define DEFAULT_BEACONINTERVAL 0x64U
59 #define DEFAULT_RETRY_RTS 7
60 #define DEFAULT_RETRY_DATA 7
62 #define BEACON_QUEUE 6
67 #define sAckCtsLng 112 /* bits in ACK and CTS frames. */
69 #define RATE_ADAPTIVE_TIMER_PERIOD 300
71 typedef enum _WIRELESS_MODE {
72 WIRELESS_MODE_UNKNOWN = 0x00,
73 WIRELESS_MODE_A = 0x01,
74 WIRELESS_MODE_B = 0x02,
75 WIRELESS_MODE_G = 0x04,
76 WIRELESS_MODE_AUTO = 0x08,
79 struct chnl_access_setting {
93 typedef u32 AC_CODING;
94 #define AC0_BE 0 /* ACI: 0x00 */ /* Best Effort. */
95 #define AC1_BK 1 /* ACI: 0x01 */ /* Background. */
96 #define AC2_VI 2 /* ACI: 0x10 */ /* Video. */
97 #define AC3_VO 3 /* ACI: 0x11 */ /* Voice. */
98 #define AC_MAX 4 /* Max: define total number; Should not to be used as a real
103 * ECWmin/ECWmax field.
104 * Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
115 * ACI/AIFSN Field. Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
117 typedef union _ACI_AIFSN {
126 } ACI_AIFSN, *PACI_AIFSN;
129 * AC Parameters Record Format.
130 * Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
132 typedef union _AC_PARAM {
141 } AC_PARAM, *PAC_PARAM;
143 /* it is a wrong definition. -xiong-2006-11-17
144 * typedef struct ThreeWireReg {
155 typedef union _ThreeWire {
156 struct _ThreeWireStruc {
162 /* u2Byte resv2:14; */
163 /* u2Byte ThreeWireEnable:1; */
164 /* u2Byte resv3:1; */
176 /* YJ,modified,080828. */
180 unsigned long rxnolast;
181 unsigned long rxnodata;
182 /* unsigned long rxreset; */
183 /* unsigned long rxwrkaround; */
184 unsigned long rxnopointer;
185 unsigned long txnperr;
186 unsigned long txresumed;
188 unsigned long rxoverflow;
190 unsigned long txbkpokint;
191 unsigned long txbepoking;
192 unsigned long txbkperr;
193 unsigned long txbeperr;
194 unsigned long txnpokint;
195 unsigned long txhpokint;
196 unsigned long txhperr;
198 unsigned long shints;
199 unsigned long txoverflow;
200 unsigned long rxdmafail;
201 unsigned long txbeacon;
202 unsigned long txbeaconerr;
203 unsigned long txlpokint;
204 unsigned long txlperr;
205 unsigned long txretry; /* retry number tony 20060601 */
206 unsigned long rxcrcerrmin; /* crc error (0-500) */
207 unsigned long rxcrcerrmid; /* crc error (500-1000) */
208 unsigned long rxcrcerrmax; /* crc error (>1000) */
209 unsigned long rxicverr; /* ICV error */
212 #define MAX_LD_SLOT_NUM 10
213 #define KEEP_ALIVE_INTERVAL 20 /* in seconds. */
214 #define CHECK_FOR_HANG_PERIOD 2 /* be equal to watchdog check time. */
215 #define DEFAULT_KEEP_ALIVE_LEVEL 1
216 #define DEFAULT_SLOT_NUM 2
217 #define POWER_PROFILE_AC 0
218 #define POWER_PROFILE_BATTERY 1
220 struct link_detect_t {
221 u32 rx_frame_num[MAX_LD_SLOT_NUM]; /* number of Rx Frame.
222 * CheckForHang_period to determine
225 u16 slot_num; /* number of CheckForHang period to determine link status,
229 u32 num_tx_ok_in_period; /* number of packet transmitted during
232 u32 num_rx_ok_in_period; /* number of packet received during
235 u8 idle_count; /* (KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD) */
236 u32 last_num_tx_unicast;
237 u32 last_num_rx_unicast;
239 bool b_busy_traffic; /* when it is set to 1, UI cann't scan at will. */
242 /* YJ,modified,080828,end */
245 * ==========================================================================
247 * ==========================================================================
249 typedef enum _LED_STRATEGY_8185 {
252 HW_LED, /* HW control 2 LEDs, LED0 and LED1 (there are 4 different
254 } LED_STRATEGY_8185, *PLED_STRATEGY_8185;
255 /* by amy for led. */
256 /* by amy for power save. */
257 typedef enum _LED_CTL_MODE {
258 LED_CTL_POWER_ON = 1,
263 LED_CTL_SITE_SURVEY = 6,
264 LED_CTL_POWER_OFF = 7
267 typedef enum _RT_RF_POWER_STATE {
275 auth_not_valid = 0x2,
286 /* ----END MIC_CHECK */
288 /* Reason code defined in 802.11i D10.0 p.28. */
290 four_way_tmout = 0x0f,
291 two_way_tmout = 0x10,
293 invalid_Gcipher = 0x12,
294 invalid_Pcipher = 0x13,
296 unsup_RSNIEver = 0x15,
297 invalid_RSNIE = 0x16,
298 auth_802_1x_fail = 0x17,
301 /* Reason code defined in 7.3.1.7, 802.1e D13.0, p.42. Added by Annie,
304 QoS_unspec = 0x20, /* 32 */
305 QAP_bandwidth = 0x21, /* 33 */
306 poor_condition = 0x22, /* 34 */
307 no_facility = 0x23, /* 35 */
309 req_declined = 0x25, /* 37 */
310 invalid_param = 0x26, /* 38 */
311 req_not_honored = 0x27, /* 39 */
312 TS_not_created = 0x2F, /* 47 */
313 DL_not_allowed = 0x30, /* 48 */
314 dest_not_exist = 0x31, /* 49 */
315 dest_not_QSTA = 0x32, /* 50 */
318 typedef enum _RT_PS_MODE {
319 eActive, /* Active/Continuous access. */
320 eMaxPs, /* Max power save mode. */
321 eFastPs /* Fast power save mode. */
324 /* by amy for power save. */
326 struct pci_dev *pdev;
330 struct ieee80211_device *ieee80211;
332 short plcp_preamble_mode; /* 0:auto 1:short 2:long */
334 spinlock_t irq_th_lock;
337 spinlock_t rf_ps_lock;
341 struct net_device *dev;
345 u8 chtxpwr[15]; /* channels from 1 to 14, 0 not used. */
346 u8 chtxpwr_ofdm[15]; /* channels from 1 to 14, 0 not used. */
347 /* u8 challow[15]; */ /* channels from 1 to 14, 0 not used. */
348 u8 channel_plan; /* it's the channel plan index. */
350 short crcmon; /* if 1 allow bad crc frame reception in monitor mode. */
352 struct timer_list scan_timer;
353 /* short scanpending;
356 spinlock_t scan_lock;
358 /* u8 active_scan_num; */
359 struct semaphore wx_sem;
366 short (*rf_set_sens)(struct net_device *dev, short sens);
367 void (*rf_set_chan)(struct net_device *dev, short ch);
368 void (*rf_close)(struct net_device *dev);
369 void (*rf_init)(struct net_device *dev);
370 void (*rf_sleep)(struct net_device *dev);
371 void (*rf_wakeup)(struct net_device *dev);
376 struct link_detect_t link_detect; /* YJ,add,080828 */
377 struct iw_statistics wstats;
382 dma_addr_t rxringdma;
383 struct buffer *rxbuffer;
384 struct buffer *rxbufferhead;
388 struct sk_buff *rx_skb;
390 short rx_skb_complete;
399 * dma_addr_t txlpringdma;
400 * dma_addr_t txhpringdma;
401 * dma_addr_t txnpringdma;
408 * struct buffer *txlpbufs;
409 * struct buffer *txhpbufs;
410 * struct buffer *txnpbufs;
411 * struct buffer *txlpbufstail;
412 * struct buffer *txhpbufstail;
413 * struct buffer *txnpbufstail;
421 dma_addr_t txmapringdma;
422 dma_addr_t txbkpringdma;
423 dma_addr_t txbepringdma;
424 dma_addr_t txvipringdma;
425 dma_addr_t txvopringdma;
426 dma_addr_t txhpringdma;
439 struct buffer *txmapbufs;
440 struct buffer *txbkpbufs;
441 struct buffer *txbepbufs;
442 struct buffer *txvipbufs;
443 struct buffer *txvopbufs;
444 struct buffer *txhpbufs;
445 struct buffer *txmapbufstail;
446 struct buffer *txbkpbufstail;
447 struct buffer *txbepbufstail;
448 struct buffer *txvipbufstail;
449 struct buffer *txvopbufstail;
450 struct buffer *txhpbufstail;
454 /* struct tx_pendingbuf txnp_pending; */
455 /* struct tasklet_struct irq_tx_tasklet; */
456 struct tasklet_struct irq_rx_tasklet;
458 /* short tx_suspend; */
460 /* adhoc/master mode stuff. */
461 u32 *txbeaconringtail;
462 dma_addr_t txbeaconringdma;
465 struct buffer *txbeaconbufs;
466 struct buffer *txbeaconbufstail;
467 /* char *master_essid; */
468 /* u16 master_beaconinterval; */
469 /* u32 master_beaconsize; */
470 /* u16 beacon_interval; */
476 /* by amy for led. */
477 LED_STRATEGY_8185 LedStrategy;
478 /* by amy for led. */
480 /* by amy for power save. */
481 struct timer_list watch_dog_timer;
483 bool bSwRfProcessing;
484 RT_RF_POWER_STATE eInactivePowerState;
485 RT_RF_POWER_STATE eRFPowerState;
487 bool RFChangeInProgress;
488 bool SetRFPowerStateInProgress;
491 RT_PS_MODE dot11PowerSaveMode;
492 /* u32 NumRxOkInPeriod;*/ /* YJ,del,080828 */
493 /* u32 NumTxOkInPeriod;*/ /* YJ,del,080828 */
496 bool bApBufOurFrame; /* TRUE if AP buffer our unicast data , we will
497 * keep eAwake until receive data or timeout.
499 u8 WaitBufDataBcnCount;
500 u8 WaitBufDataTimeOut;
502 /* by amy for power save. */
503 /* by amy for antenna. */
504 u8 EEPROMSwAntennaDiversity;
505 bool EEPROMDefaultAntenna1;
506 u8 RegSwAntennaDiversityMechanism;
507 bool bSwAntennaDiverity;
508 u8 RegDefaultAntenna;
509 bool bDefaultAntenna1;
511 long Stats_SignalStrength;
512 long LastSignalStrengthInPercent; /* In percentage, used for smoothing,
513 * e.g. Moving Average.
515 u8 SignalQuality; /* in 0-100 index. */
516 long Stats_SignalQuality;
517 long RecvSignalPower; /* in dBm. */
518 long Stats_RecvSignalPower;
519 u8 LastRxPktAntenna; /* +by amy 080312 Antenna which received the lasted
520 * packet. 0: Aux, 1:Main. Added by Roger,
524 long AdRxSignalStrength;
525 u8 CurrAntennaIndex; /* Index to current Antenna (both Tx and Rx). */
526 u8 AdTickCount; /* Times of SwAntennaDiversityTimer happened. */
527 u8 AdCheckPeriod; /* # of period SwAntennaDiversityTimer to check Rx
528 * signal strength for SW Antenna Diversity.
530 u8 AdMinCheckPeriod; /* Min value of AdCheckPeriod. */
531 u8 AdMaxCheckPeriod; /* Max value of AdCheckPeriod. */
532 long AdRxSsThreshold; /* Signal strength threshold to switch antenna. */
533 long AdMaxRxSsThreshold; /* Max value of AdRxSsThreshold. */
534 bool bAdSwitchedChecking; /* TRUE if we shall shall check Rx signal
535 * strength for last time switching antenna.
537 long AdRxSsBeforeSwitched; /* Rx signal strength before we switched
540 struct timer_list SwAntennaDiversityTimer;
541 /* by amy for antenna {by amy 080312 */
543 /* Crystal calibration. Added by Roger, 2007.12.11. */
545 bool bXtalCalibration; /* Crystal calibration.*/
546 u8 XtalCal_Xin; /* Crystal calibration for Xin. 0~7.5pF */
547 u8 XtalCal_Xout; /* Crystal calibration for Xout. 0~7.5pF */
549 /* Tx power tracking with thermal meter indication.
550 * Added by Roger, 2007.12.11.
553 bool bTxPowerTrack; /* Tx Power tracking. */
554 u8 ThermalMeter; /* Thermal meter reference indication. */
556 /* Dynamic Initial Gain Adjustment Mechanism. Added by Bruce,
559 bool bDigMechanism; /* TRUE if DIG is enabled, FALSE ow. */
560 bool bRegHighPowerMechanism; /* For High Power Mechanism. 061010,
563 u32 FalseAlarmRegValue;
564 u8 RegDigOfdmFaUpTh; /* Upper threshold of OFDM false alarm, which is
567 u8 DIG_NumberFallbackVote;
568 u8 DIG_NumberUpgradeVote;
569 /* For HW antenna diversity, added by Roger, 2008.01.30. */
570 u32 AdMainAntennaRxOkCnt; /* Main antenna Rx OK count. */
571 u32 AdAuxAntennaRxOkCnt; /* Aux antenna Rx OK count. */
572 bool bHWAdSwitched; /* TRUE if we has switched default antenna by HW
575 /* RF High Power upper/lower threshold. */
578 /* RF RSSI High Power upper/lower Threshold. */
579 u8 RegRSSIHiPwrUpperTh;
580 u8 RegRSSIHiPwrLowerTh;
581 /* Current CCK RSSI value to determine CCK high power, asked by SD3 DZ,
582 * by Bruce, 2007-04-12.
586 /* High Power Mechanism. Added by amy, 080312. */
588 long UndecoratedSmoothedSS;
589 long UndecoratedSmoothedRxPower;
593 /* For adjust Dig Threshold during Legacy/Leisure Power Save Mode. */
594 u32 DozePeriodInPast2Sec;
595 /* Don't access BB/RF under disable PLL situation. */
596 u8 InitialGainBackUp;
597 u8 RegBModeGainStage;
598 /* by amy for rate adaptive */
599 struct timer_list rateadapter_timer;
600 u32 RateAdaptivePeriod;
603 int ForcedDataRate; /* Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M.)
605 u32 NumTxUnicast; /* YJ,add,080828,for keep alive. */
606 u8 keepAliveLevel; /*YJ,add,080828,for KeepAlive. */
607 unsigned long NumTxOkTotal;
610 unsigned long LastTxokCnt;
611 unsigned long LastRxokCnt;
613 unsigned long LastTxOKBytes;
614 unsigned long NumTxOkBytesTotal;
616 long LastFailTxRateSS;
618 u32 LastTxThroughput;
620 unsigned short bTryuping;
621 u8 CurrTxRate; /* the rate before up. */
624 u8 TryDownCountLowData;
625 u8 TryupingCountNoData;
628 /* by amy for rate adaptive. */
630 /* short wq_hurryup; */
631 /* struct workqueue_struct *workqueue; */
632 struct work_struct reset_wq;
633 struct work_struct watch_dog_wq;
634 short ack_tx_to_ieee;
636 u8 dma_poll_stop_mask;
638 /* u8 RegThreeWireMode; */
641 u16 EarlyRxThreshold;
646 struct chnl_access_setting ChannelAccessSetting;
649 #define MANAGE_PRIORITY 0
650 #define BK_PRIORITY 1
651 #define BE_PRIORITY 2
652 #define VI_PRIORITY 3
653 #define VO_PRIORITY 4
654 #define HI_PRIORITY 5
655 #define BEACON_PRIORITY 6
657 #define LOW_PRIORITY VI_PRIORITY
658 #define NORM_PRIORITY VO_PRIORITY
659 /* AC2Queue mapping. */
660 #define AC2Q(_ac) (((_ac) == WME_AC_VO) ? VO_PRIORITY : \
661 ((_ac) == WME_AC_VI) ? VI_PRIORITY : \
662 ((_ac) == WME_AC_BK) ? BK_PRIORITY : \
665 short rtl8180_tx(struct net_device *dev, u8 *skbuf, int len, int priority,
666 short morefrag, short fragdesc, int rate);
668 u8 read_nic_byte(struct net_device *dev, int x);
669 u32 read_nic_dword(struct net_device *dev, int x);
670 u16 read_nic_word(struct net_device *dev, int x);
671 void write_nic_byte(struct net_device *dev, int x, u8 y);
672 void write_nic_word(struct net_device *dev, int x, u16 y);
673 void write_nic_dword(struct net_device *dev, int x, u32 y);
674 void force_pci_posting(struct net_device *dev);
676 void rtl8180_rtx_disable(struct net_device *);
677 void rtl8180_set_anaparam(struct net_device *dev, u32 a);
678 void rtl8185_set_anaparam2(struct net_device *dev, u32 a);
679 void rtl8180_set_hw_wep(struct net_device *dev);
680 void rtl8180_no_hw_wep(struct net_device *dev);
681 void rtl8180_update_msr(struct net_device *dev);
682 void rtl8180_beacon_tx_disable(struct net_device *dev);
683 void rtl8180_beacon_rx_disable(struct net_device *dev);
684 int rtl8180_down(struct net_device *dev);
685 int rtl8180_up(struct net_device *dev);
686 void rtl8180_commit(struct net_device *dev);
687 void rtl8180_set_chan(struct net_device *dev, short ch);
688 void write_phy(struct net_device *dev, u8 adr, u8 data);
689 void write_phy_cck(struct net_device *dev, u8 adr, u32 data);
690 void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data);
691 void rtl8185_tx_antenna(struct net_device *dev, u8 ant);
692 void rtl8185_rf_pins_enable(struct net_device *dev);
693 void IPSEnter(struct net_device *dev);
694 void IPSLeave(struct net_device *dev);
695 int get_curr_tx_free_desc(struct net_device *dev, int priority);
696 void UpdateInitialGain(struct net_device *dev);
697 bool SetAntennaConfig87SE(struct net_device *dev, u8 DefaultAnt,
700 /* #ifdef CONFIG_RTL8185B */
701 void rtl8185b_adapter_start(struct net_device *dev);
702 void rtl8185b_rx_enable(struct net_device *dev);
703 void rtl8185b_tx_enable(struct net_device *dev);
704 void rtl8180_reset(struct net_device *dev);
705 void rtl8185b_irq_enable(struct net_device *dev);
706 void fix_rx_fifo(struct net_device *dev);
707 void fix_tx_fifo(struct net_device *dev);
708 void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch);
709 void rtl8180_rate_adapter(struct work_struct *work);
711 bool MgntActSet_RF_State(struct net_device *dev, RT_RF_POWER_STATE StateToSet,
716 /* fun with the built-in ieee80211 stack... */
717 extern int ieee80211_crypto_init(void);
718 extern void ieee80211_crypto_deinit(void);
719 extern int ieee80211_crypto_tkip_init(void);
720 extern void ieee80211_crypto_tkip_exit(void);
721 extern int ieee80211_crypto_ccmp_init(void);
722 extern void ieee80211_crypto_ccmp_exit(void);
723 extern int ieee80211_crypto_wep_init(void);
724 extern void ieee80211_crypto_wep_exit(void);