Skip to content

Commit

Permalink
Add rtl8180 wireless driver
Browse files Browse the repository at this point in the history
This patch adds a mac80211 based wireless driver for the rtl8180 and
rtl8185 PCI wireless cards.  Also included are some rtl8187 changes
required due to the relationship between that driver and this one.

Michael Wu is primarily responsible for the initial driver and rtl8185
support.  Andreas Merello provided the additional rtl8180 support.

Thanks to Jukka Ruohonen for the donating a rtl8185 card! It was very
helpful for the rtl8225z2 code.

The Signed-off-by information below is collected from the individual
patches submitted to wireless-2.6 before merging this driver upstream.

Signed-off-by: Andrea Merello <andreamrl@tiscali.it>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Pavel Roskin <proski@gnu.org>
Signed-off-by: Michael Wu <flamingice@sourmilk.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Michael Wu authored and David S. Miller committed Jan 28, 2008
1 parent fa1c114 commit f653211
Show file tree
Hide file tree
Showing 18 changed files with 2,777 additions and 60 deletions.
56 changes: 56 additions & 0 deletions drivers/net/wireless/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,62 @@ config USB_ZD1201
To compile this driver as a module, choose M here: the
module will be called zd1201.

config RTL8180
tristate "Realtek 8180/8185 PCI support"
depends on MAC80211 && PCI && WLAN_80211 && EXPERIMENTAL
select EEPROM_93CX6
---help---
This is a driver for RTL8180 and RTL8185 based cards.
These are PCI based chips found in cards such as:

(RTL8185 802.11g)
A-Link WL54PC

(RTL8180 802.11b)
Belkin F5D6020 v3
Belkin F5D6020 v3
Dlink DWL-610
Dlink DWL-510
Netgear MA521
Level-One WPC-0101
Acer Aspire 1357 LMi
VCTnet PC-11B1
Ovislink AirLive WL-1120PCM
Mentor WL-PCI
Linksys WPC11 v4
TrendNET TEW-288PI
D-Link DWL-520 Rev D
Repotec RP-WP7126
TP-Link TL-WN250/251
Zonet ZEW1000
Longshine LCS-8031-R
HomeLine HLW-PCC200
GigaFast WF721-AEX
Planet WL-3553
Encore ENLWI-PCI1-NT
TrendNET TEW-266PC
Gigabyte GN-WLMR101
Siemens-fujitsu Amilo D1840W
Edimax EW-7126
PheeNet WL-11PCIR
Tonze PC-2100T
Planet WL-8303
Dlink DWL-650 v M1
Edimax EW-7106
Q-Tec 770WC
Topcom Skyr@cer 4011b
Roper FreeLan 802.11b (edition 2004)
Wistron Neweb Corp CB-200B
Pentagram HorNET
QTec 775WC
TwinMOS Booming B Series
Micronet SP906BB
Sweex LC700010
Surecom EP-9428
Safecom SWLCR-1100

Thanks to Realtek for their support!

config RTL8187
tristate "Realtek 8187 USB support"
depends on MAC80211 && USB && WLAN_80211 && EXPERIMENTAL
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o
obj-$(CONFIG_USB_ZD1201) += zd1201.o
obj-$(CONFIG_LIBERTAS) += libertas/

rtl8180-objs := rtl8180_dev.o rtl8180_rtl8225.o rtl8180_sa2400.o rtl8180_max2820.o rtl8180_grf5101.o
rtl8187-objs := rtl8187_dev.o rtl8187_rtl8225.o

obj-$(CONFIG_RTL8180) += rtl8180.o
obj-$(CONFIG_RTL8187) += rtl8187.o

obj-$(CONFIG_ADM8211) += adm8211.o
Expand Down
151 changes: 151 additions & 0 deletions drivers/net/wireless/rtl8180.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
#ifndef RTL8180_H
#define RTL8180_H

#include "rtl818x.h"

#define MAX_RX_SIZE IEEE80211_MAX_RTS_THRESHOLD

#define RF_PARAM_ANALOGPHY (1 << 0)
#define RF_PARAM_ANTBDEFAULT (1 << 1)
#define RF_PARAM_CARRIERSENSE1 (1 << 2)
#define RF_PARAM_CARRIERSENSE2 (1 << 3)

#define BB_ANTATTEN_CHAN14 0x0C
#define BB_ANTENNA_B 0x40

#define BB_HOST_BANG (1 << 30)
#define BB_HOST_BANG_EN (1 << 2)
#define BB_HOST_BANG_CLK (1 << 1)
#define BB_HOST_BANG_DATA 1

#define ANAPARAM_TXDACOFF_SHIFT 27
#define ANAPARAM_PWR0_SHIFT 28
#define ANAPARAM_PWR0_MASK (0x07 << ANAPARAM_PWR0_SHIFT)
#define ANAPARAM_PWR1_SHIFT 20
#define ANAPARAM_PWR1_MASK (0x7F << ANAPARAM_PWR1_SHIFT)

enum rtl8180_tx_desc_flags {
RTL8180_TX_DESC_FLAG_NO_ENC = (1 << 15),
RTL8180_TX_DESC_FLAG_TX_OK = (1 << 15),
RTL8180_TX_DESC_FLAG_SPLCP = (1 << 16),
RTL8180_TX_DESC_FLAG_RX_UNDER = (1 << 16),
RTL8180_TX_DESC_FLAG_MOREFRAG = (1 << 17),
RTL8180_TX_DESC_FLAG_CTS = (1 << 18),
RTL8180_TX_DESC_FLAG_RTS = (1 << 23),
RTL8180_TX_DESC_FLAG_LS = (1 << 28),
RTL8180_TX_DESC_FLAG_FS = (1 << 29),
RTL8180_TX_DESC_FLAG_DMA = (1 << 30),
RTL8180_TX_DESC_FLAG_OWN = (1 << 31)
};

struct rtl8180_tx_desc {
__le32 flags;
__le16 rts_duration;
__le16 plcp_len;
__le32 tx_buf;
__le32 frame_len;
__le32 next_tx_desc;
u8 cw;
u8 retry_limit;
u8 agc;
u8 flags2;
u32 reserved[2];
} __attribute__ ((packed));

enum rtl8180_rx_desc_flags {
RTL8180_RX_DESC_FLAG_ICV_ERR = (1 << 12),
RTL8180_RX_DESC_FLAG_CRC32_ERR = (1 << 13),
RTL8180_RX_DESC_FLAG_PM = (1 << 14),
RTL8180_RX_DESC_FLAG_RX_ERR = (1 << 15),
RTL8180_RX_DESC_FLAG_BCAST = (1 << 16),
RTL8180_RX_DESC_FLAG_PAM = (1 << 17),
RTL8180_RX_DESC_FLAG_MCAST = (1 << 18),
RTL8180_RX_DESC_FLAG_SPLCP = (1 << 25),
RTL8180_RX_DESC_FLAG_FOF = (1 << 26),
RTL8180_RX_DESC_FLAG_DMA_FAIL = (1 << 27),
RTL8180_RX_DESC_FLAG_LS = (1 << 28),
RTL8180_RX_DESC_FLAG_FS = (1 << 29),
RTL8180_RX_DESC_FLAG_EOR = (1 << 30),
RTL8180_RX_DESC_FLAG_OWN = (1 << 31)
};

struct rtl8180_rx_desc {
__le32 flags;
__le32 flags2;
union {
__le32 rx_buf;
__le64 tsft;
};
} __attribute__ ((packed));

struct rtl8180_tx_ring {
struct rtl8180_tx_desc *desc;
dma_addr_t dma;
unsigned int idx;
unsigned int entries;
struct sk_buff_head queue;
};

struct rtl8180_priv {
/* common between rtl818x drivers */
struct rtl818x_csr __iomem *map;
const struct rtl818x_rf_ops *rf;
int mode;
int if_id;

/* rtl8180 driver specific */
spinlock_t lock;
struct rtl8180_rx_desc *rx_ring;
dma_addr_t rx_ring_dma;
unsigned int rx_idx;
struct sk_buff *rx_buf[32];
struct rtl8180_tx_ring tx_ring[4];
struct ieee80211_channel channels[14];
struct ieee80211_rate rates[12];
struct ieee80211_hw_mode modes[2];
struct pci_dev *pdev;
u32 rx_conf;

int r8185;
u32 anaparam;
u16 rfparam;
u8 csthreshold;
};

void rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data);
void rtl8180_set_anaparam(struct rtl8180_priv *priv, u32 anaparam);

static inline u8 rtl818x_ioread8(struct rtl8180_priv *priv, u8 __iomem *addr)
{
return ioread8(addr);
}

static inline u16 rtl818x_ioread16(struct rtl8180_priv *priv, __le16 __iomem *addr)
{
return ioread16(addr);
}

static inline u32 rtl818x_ioread32(struct rtl8180_priv *priv, __le32 __iomem *addr)
{
return ioread32(addr);
}

static inline void rtl818x_iowrite8(struct rtl8180_priv *priv,
u8 __iomem *addr, u8 val)
{
iowrite8(val, addr);
}

static inline void rtl818x_iowrite16(struct rtl8180_priv *priv,
__le16 __iomem *addr, u16 val)
{
iowrite16(val, addr);
}

static inline void rtl818x_iowrite32(struct rtl8180_priv *priv,
__le32 __iomem *addr, u32 val)
{
iowrite32(val, addr);
}

#endif /* RTL8180_H */
Loading

0 comments on commit f653211

Please sign in to comment.