aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtl8180_grf5101.c
diff options
context:
space:
mode:
authorMichael Wu <flamingice@sourmilk.net>2007-10-14 14:43:16 -0400
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:09:35 -0500
commitf653211197f3841f383fa9757ef8ce182c6cf627 (patch)
treeba56e1fa09924d1ffab4f825044175291786b58e /drivers/net/wireless/rtl8180_grf5101.c
parentfa1c114fdaa605496045e56c42d0c8aa4c139e57 (diff)
Add rtl8180 wireless driver
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>
Diffstat (limited to 'drivers/net/wireless/rtl8180_grf5101.c')
-rw-r--r--drivers/net/wireless/rtl8180_grf5101.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/drivers/net/wireless/rtl8180_grf5101.c b/drivers/net/wireless/rtl8180_grf5101.c
new file mode 100644
index 000000000000..8293e19c4c59
--- /dev/null
+++ b/drivers/net/wireless/rtl8180_grf5101.c
@@ -0,0 +1,179 @@
1
2/*
3 * Radio tuning for GCT GRF5101 on RTL8180
4 *
5 * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
6 *
7 * Code from the BSD driver and the rtl8181 project have been
8 * very useful to understand certain things
9 *
10 * I want to thanks the Authors of such projects and the Ndiswrapper
11 * project Authors.
12 *
13 * A special Big Thanks also is for all people who donated me cards,
14 * making possible the creation of the original rtl8180 driver
15 * from which this code is derived!
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#include <linux/init.h>
23#include <linux/pci.h>
24#include <linux/delay.h>
25#include <net/mac80211.h>
26
27#include "rtl8180.h"
28#include "rtl8180_grf5101.h"
29
30static const int grf5101_encode[] = {
31 0x0, 0x8, 0x4, 0xC,
32 0x2, 0xA, 0x6, 0xE,
33 0x1, 0x9, 0x5, 0xD,
34 0x3, 0xB, 0x7, 0xF
35};
36
37static void write_grf5101(struct ieee80211_hw *dev, u8 addr, u32 data)
38{
39 struct rtl8180_priv *priv = dev->priv;
40 u32 phy_config;
41
42 phy_config = grf5101_encode[(data >> 8) & 0xF];
43 phy_config |= grf5101_encode[(data >> 4) & 0xF] << 4;
44 phy_config |= grf5101_encode[data & 0xF] << 8;
45 phy_config |= grf5101_encode[(addr >> 1) & 0xF] << 12;
46 phy_config |= (addr & 1) << 16;
47 phy_config |= grf5101_encode[(data & 0xf000) >> 12] << 24;
48
49 /* MAC will bang bits to the chip */
50 phy_config |= 0x90000000;
51
52 rtl818x_iowrite32(priv,
53 (__le32 __iomem *) &priv->map->RFPinsOutput, phy_config);
54
55 msleep(3);
56}
57
58static void grf5101_write_phy_antenna(struct ieee80211_hw *dev, short chan)
59{
60 struct rtl8180_priv *priv = dev->priv;
61 u8 ant = GRF5101_ANTENNA;
62
63 if (priv->rfparam & RF_PARAM_ANTBDEFAULT)
64 ant |= BB_ANTENNA_B;
65
66 if (chan == 14)
67 ant |= BB_ANTATTEN_CHAN14;
68
69 rtl8180_write_phy(dev, 0x10, ant);
70}
71
72static void grf5101_rf_set_channel(struct ieee80211_hw *dev,
73 struct ieee80211_conf *conf)
74{
75 struct rtl8180_priv *priv = dev->priv;
76 u32 txpw = priv->channels[conf->channel - 1].val & 0xFF;
77 u32 chan = conf->channel - 1;
78
79 /* set TX power */
80 write_grf5101(dev, 0x15, 0x0);
81 write_grf5101(dev, 0x06, txpw);
82 write_grf5101(dev, 0x15, 0x10);
83 write_grf5101(dev, 0x15, 0x0);
84
85 /* set frequency */
86 write_grf5101(dev, 0x07, 0x0);
87 write_grf5101(dev, 0x0B, chan);
88 write_grf5101(dev, 0x07, 0x1000);
89
90 grf5101_write_phy_antenna(dev, chan);
91}
92
93static void grf5101_rf_stop(struct ieee80211_hw *dev)
94{
95 struct rtl8180_priv *priv = dev->priv;
96 u32 anaparam;
97
98 anaparam = priv->anaparam;
99 anaparam &= 0x000fffff;
100 anaparam |= 0x3f900000;
101 rtl8180_set_anaparam(priv, anaparam);
102
103 write_grf5101(dev, 0x07, 0x0);
104 write_grf5101(dev, 0x1f, 0x45);
105 write_grf5101(dev, 0x1f, 0x5);
106 write_grf5101(dev, 0x00, 0x8e4);
107}
108
109static void grf5101_rf_init(struct ieee80211_hw *dev)
110{
111 struct rtl8180_priv *priv = dev->priv;
112
113 rtl8180_set_anaparam(priv, priv->anaparam);
114
115 write_grf5101(dev, 0x1f, 0x0);
116 write_grf5101(dev, 0x1f, 0x0);
117 write_grf5101(dev, 0x1f, 0x40);
118 write_grf5101(dev, 0x1f, 0x60);
119 write_grf5101(dev, 0x1f, 0x61);
120 write_grf5101(dev, 0x1f, 0x61);
121 write_grf5101(dev, 0x00, 0xae4);
122 write_grf5101(dev, 0x1f, 0x1);
123 write_grf5101(dev, 0x1f, 0x41);
124 write_grf5101(dev, 0x1f, 0x61);
125
126 write_grf5101(dev, 0x01, 0x1a23);
127 write_grf5101(dev, 0x02, 0x4971);
128 write_grf5101(dev, 0x03, 0x41de);
129 write_grf5101(dev, 0x04, 0x2d80);
130 write_grf5101(dev, 0x05, 0x68ff); /* 0x61ff original value */
131 write_grf5101(dev, 0x06, 0x0);
132 write_grf5101(dev, 0x07, 0x0);
133 write_grf5101(dev, 0x08, 0x7533);
134 write_grf5101(dev, 0x09, 0xc401);
135 write_grf5101(dev, 0x0a, 0x0);
136 write_grf5101(dev, 0x0c, 0x1c7);
137 write_grf5101(dev, 0x0d, 0x29d3);
138 write_grf5101(dev, 0x0e, 0x2e8);
139 write_grf5101(dev, 0x10, 0x192);
140 write_grf5101(dev, 0x11, 0x248);
141 write_grf5101(dev, 0x12, 0x0);
142 write_grf5101(dev, 0x13, 0x20c4);
143 write_grf5101(dev, 0x14, 0xf4fc);
144 write_grf5101(dev, 0x15, 0x0);
145 write_grf5101(dev, 0x16, 0x1500);
146
147 write_grf5101(dev, 0x07, 0x1000);
148
149 /* baseband configuration */
150 rtl8180_write_phy(dev, 0, 0xa8);
151 rtl8180_write_phy(dev, 3, 0x0);
152 rtl8180_write_phy(dev, 4, 0xc0);
153 rtl8180_write_phy(dev, 5, 0x90);
154 rtl8180_write_phy(dev, 6, 0x1e);
155 rtl8180_write_phy(dev, 7, 0x64);
156
157 grf5101_write_phy_antenna(dev, 1);
158
159 rtl8180_write_phy(dev, 0x11, 0x88);
160
161 if (rtl818x_ioread8(priv, &priv->map->CONFIG2) &
162 RTL818X_CONFIG2_ANTENNA_DIV)
163 rtl8180_write_phy(dev, 0x12, 0xc0); /* enable ant diversity */
164 else
165 rtl8180_write_phy(dev, 0x12, 0x40); /* disable ant diversity */
166
167 rtl8180_write_phy(dev, 0x13, 0x90 | priv->csthreshold);
168
169 rtl8180_write_phy(dev, 0x19, 0x0);
170 rtl8180_write_phy(dev, 0x1a, 0xa0);
171 rtl8180_write_phy(dev, 0x1b, 0x44);
172}
173
174const struct rtl818x_rf_ops grf5101_rf_ops = {
175 .name = "GCT",
176 .init = grf5101_rf_init,
177 .stop = grf5101_rf_stop,
178 .set_chan = grf5101_rf_set_channel
179};