Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[deliverable/linux.git] / drivers / staging / rtl8187se / r8180_rtl8225z2.c
1 /*
2 This is part of the rtl8180-sa2400 driver
3 released under the GPL (See file COPYING for details).
4 Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
5
6 This files contains programming code for the rtl8225
7 radio frontend.
8
9 *Many* thanks to Realtek Corp. for their great support!
10
11 */
12
13 #include "r8180_hw.h"
14 #include "r8180_rtl8225.h"
15 #include "r8180_93cx6.h"
16
17 #include "ieee80211/dot11d.h"
18
19
20 static void write_rtl8225(struct net_device *dev, u8 adr, u16 data)
21 {
22 int i;
23 u16 out, select;
24 u8 bit;
25 u32 bangdata = (data << 4) | (adr & 0xf);
26 struct r8180_priv *priv = ieee80211_priv(dev);
27
28 out = read_nic_word(dev, RFPinsOutput) & 0xfff3;
29
30 write_nic_word(dev, RFPinsEnable,
31 (read_nic_word(dev, RFPinsEnable) | 0x7));
32
33 select = read_nic_word(dev, RFPinsSelect);
34
35 write_nic_word(dev, RFPinsSelect, select | 0x7 |
36 ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
37
38 force_pci_posting(dev);
39 udelay(10);
40
41 write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
42
43 force_pci_posting(dev);
44 udelay(2);
45
46 write_nic_word(dev, RFPinsOutput, out);
47
48 force_pci_posting(dev);
49 udelay(10);
50
51 for (i = 15; i >= 0; i--) {
52 bit = (bangdata & (1 << i)) >> i;
53
54 write_nic_word(dev, RFPinsOutput, bit | out);
55
56 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
57 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
58
59 i--;
60 bit = (bangdata & (1 << i)) >> i;
61
62 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
63 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
64
65 write_nic_word(dev, RFPinsOutput, bit | out);
66
67 }
68
69 write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
70
71 force_pci_posting(dev);
72 udelay(10);
73
74 write_nic_word(dev, RFPinsOutput, out |
75 ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN));
76
77 write_nic_word(dev, RFPinsSelect, select |
78 ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
79
80 if (priv->card_type == USB)
81 mdelay(2);
82 else
83 rtl8185_rf_pins_enable(dev);
84 }
85
86 static const u16 rtl8225bcd_rxgain[] = {
87 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
88 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
89 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
90 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
91 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
92 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
93 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
94 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
95 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
96 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
97 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
98 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
99
100 };
101
102 static const u8 rtl8225_agc[] = {
103 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
104 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96,
105 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e,
106 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86,
107 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e,
108 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36,
109 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e,
110 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26,
111 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e,
112 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16,
113 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
114 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06,
115 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01,
116 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
117 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
118 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
119 };
120
121 static const u8 rtl8225_gain[] = {
122 0x23, 0x88, 0x7c, 0xa5, /* -82dBm */
123 0x23, 0x88, 0x7c, 0xb5, /* -82dBm */
124 0x23, 0x88, 0x7c, 0xc5, /* -82dBm */
125 0x33, 0x80, 0x79, 0xc5, /* -78dBm */
126 0x43, 0x78, 0x76, 0xc5, /* -74dBm */
127 0x53, 0x60, 0x73, 0xc5, /* -70dBm */
128 0x63, 0x58, 0x70, 0xc5, /* -66dBm */
129 };
130
131 static const u8 rtl8225_tx_gain_cck_ofdm[] = {
132 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
133 };
134
135 static const u8 rtl8225_tx_power_cck[] = {
136 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
137 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
138 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
139 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
140 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
141 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
142 };
143
144 static const u8 rtl8225_tx_power_cck_ch14[] = {
145 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
146 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
147 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
148 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
149 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
150 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
151 };
152
153 static const u8 rtl8225_tx_power_ofdm[] = {
154 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
155 };
156
157 static const u32 rtl8225_chan[] = {
158 0,
159 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
160 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x074A,
161 };
162
163 static void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch)
164 {
165 struct r8180_priv *priv = ieee80211_priv(dev);
166 int GainIdx;
167 int GainSetting;
168 int i;
169 u8 power;
170 const u8 *cck_power_table;
171 u8 max_cck_power_level;
172 u8 max_ofdm_power_level;
173 u8 min_ofdm_power_level;
174 u8 cck_power_level = 0xff & priv->chtxpwr[ch];
175 u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch];
176
177 if (priv->card_type == USB) {
178 max_cck_power_level = 11;
179 max_ofdm_power_level = 25;
180 min_ofdm_power_level = 10;
181 } else {
182 max_cck_power_level = 35;
183 max_ofdm_power_level = 35;
184 min_ofdm_power_level = 0;
185 }
186
187 if (cck_power_level > max_cck_power_level)
188 cck_power_level = max_cck_power_level;
189
190 GainIdx = cck_power_level % 6;
191 GainSetting = cck_power_level / 6;
192
193 if (ch == 14)
194 cck_power_table = rtl8225_tx_power_cck_ch14;
195 else
196 cck_power_table = rtl8225_tx_power_cck;
197
198 write_nic_byte(dev, TX_GAIN_CCK,
199 rtl8225_tx_gain_cck_ofdm[GainSetting] >> 1);
200
201 for (i = 0; i < 8; i++) {
202 power = cck_power_table[GainIdx * 8 + i];
203 write_phy_cck(dev, 0x44 + i, power);
204 }
205
206 /* FIXME Is this delay really needeed ? */
207 force_pci_posting(dev);
208 mdelay(1);
209
210 if (ofdm_power_level > (max_ofdm_power_level - min_ofdm_power_level))
211 ofdm_power_level = max_ofdm_power_level;
212 else
213 ofdm_power_level += min_ofdm_power_level;
214
215 if (ofdm_power_level > 35)
216 ofdm_power_level = 35;
217
218 GainIdx = ofdm_power_level % 6;
219 GainSetting = ofdm_power_level / 6;
220
221 rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON);
222
223 write_phy_ofdm(dev, 2, 0x42);
224 write_phy_ofdm(dev, 6, 0x00);
225 write_phy_ofdm(dev, 8, 0x00);
226
227 write_nic_byte(dev, TX_GAIN_OFDM,
228 rtl8225_tx_gain_cck_ofdm[GainSetting] >> 1);
229
230 power = rtl8225_tx_power_ofdm[GainIdx];
231
232 write_phy_ofdm(dev, 5, power);
233 write_phy_ofdm(dev, 7, power);
234
235 force_pci_posting(dev);
236 mdelay(1);
237 }
238
239 static const u8 rtl8225z2_threshold[] = {
240 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd,
241 };
242
243 static const u8 rtl8225z2_gain_bg[] = {
244 0x23, 0x15, 0xa5, /* -82-1dBm */
245 0x23, 0x15, 0xb5, /* -82-2dBm */
246 0x23, 0x15, 0xc5, /* -82-3dBm */
247 0x33, 0x15, 0xc5, /* -78dBm */
248 0x43, 0x15, 0xc5, /* -74dBm */
249 0x53, 0x15, 0xc5, /* -70dBm */
250 0x63, 0x15, 0xc5, /* -66dBm */
251 };
252
253 static const u8 rtl8225z2_gain_a[] = {
254 0x13, 0x27, 0x5a, /* -82dBm */
255 0x23, 0x23, 0x58, /* -82dBm */
256 0x33, 0x1f, 0x56, /* -82dBm */
257 0x43, 0x1b, 0x54, /* -78dBm */
258 0x53, 0x17, 0x51, /* -74dBm */
259 0x63, 0x24, 0x4f, /* -70dBm */
260 0x73, 0x0f, 0x4c, /* -66dBm */
261 };
262
263 static const u16 rtl8225z2_rxgain[] = {
264 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
265 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
266 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
267 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
268 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
269 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
270 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
271 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
272 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
273 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
274 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
275 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
276
277 };
278
279 static const u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[] = {
280 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
281 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
282 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
283 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
284 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
285 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
286 };
287
288 static const u8 rtl8225z2_tx_power_ofdm[] = {
289 0x42, 0x00, 0x40, 0x00, 0x40
290 };
291
292 static const u8 rtl8225z2_tx_power_cck_ch14[] = {
293 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00
294 };
295
296 static const u8 rtl8225z2_tx_power_cck[] = {
297 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04
298 };
299
300 void rtl8225z2_set_gain(struct net_device *dev, short gain)
301 {
302 const u8 *rtl8225_gain;
303 struct r8180_priv *priv = ieee80211_priv(dev);
304 u8 mode = priv->ieee80211->mode;
305
306 if (mode == IEEE_B || mode == IEEE_G)
307 rtl8225_gain = rtl8225z2_gain_bg;
308 else
309 rtl8225_gain = rtl8225z2_gain_a;
310
311 write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]);
312 write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]);
313 write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]);
314 write_phy_ofdm(dev, 0x21, 0x37);
315 }
316
317 static u32 read_rtl8225(struct net_device *dev, u8 adr)
318 {
319 u32 data2Write = ((u32)(adr & 0x1f)) << 27;
320 u32 dataRead;
321 u32 mask;
322 u16 oval,oval2,oval3,tmp;
323 int i;
324 short bit, rw;
325 u8 wLength = 6;
326 u8 rLength = 12;
327 u8 low2high = 0;
328
329 oval = read_nic_word(dev, RFPinsOutput);
330 oval2 = read_nic_word(dev, RFPinsEnable);
331 oval3 = read_nic_word(dev, RFPinsSelect);
332
333 write_nic_word(dev, RFPinsEnable, (oval2|0xf));
334 write_nic_word(dev, RFPinsSelect, (oval3|0xf));
335
336 dataRead = 0;
337
338 oval &= ~0xf;
339
340 write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4);
341
342 write_nic_word(dev, RFPinsOutput, oval ); udelay(5);
343
344 rw = 0;
345
346 mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1));
347
348 for (i = 0; i < wLength/2; i++) {
349 bit = ((data2Write&mask) != 0) ? 1 : 0;
350 write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1);
351
352 write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
353 write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
354
355 mask = (low2high) ? (mask<<1): (mask>>1);
356
357 if (i == 2) {
358 rw = BB_HOST_BANG_RW;
359 write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
360 write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2);
361 break;
362 }
363
364 bit = ((data2Write&mask) != 0) ? 1: 0;
365
366 write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2);
367 write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2);
368
369 write_nic_word(dev, RFPinsOutput, oval| bit |rw); udelay(1);
370
371 mask = (low2high) ? (mask<<1) : (mask>>1);
372 }
373
374 write_nic_word(dev, RFPinsOutput, rw|oval); udelay(2);
375 mask = (low2high) ? 0x01 : (((u32)0x01) << (12-1));
376
377 /*
378 * We must set data pin to HW controled, otherwise RF can't driver it
379 * and value RF register won't be able to read back properly.
380 */
381 write_nic_word(dev, RFPinsEnable, (oval2 & (~0x01)));
382
383 for (i = 0; i < rLength; i++) {
384 write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1);
385
386 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
387 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
388 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
389 tmp = read_nic_word(dev, RFPinsInput);
390
391 dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0);
392
393 write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2);
394
395 mask = (low2high) ? (mask<<1) : (mask>>1);
396 }
397
398 write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2);
399
400 write_nic_word(dev, RFPinsEnable, oval2);
401 write_nic_word(dev, RFPinsSelect, oval3); /* Set To SW Switch */
402 write_nic_word(dev, RFPinsOutput, 0x3a0);
403
404 return dataRead;
405 }
406
407 short rtl8225_is_V_z2(struct net_device *dev)
408 {
409 short vz2 = 1;
410
411 if (read_rtl8225(dev, 8) != 0x588)
412 vz2 = 0;
413 else /* reg 9 pg 1 = 24 */
414 if (read_rtl8225(dev, 9) != 0x700)
415 vz2 = 0;
416
417 /* sw back to pg 0 */
418 write_rtl8225(dev, 0, 0xb7);
419
420 return vz2;
421 }
422
423 void rtl8225z2_rf_close(struct net_device *dev)
424 {
425 RF_WriteReg(dev, 0x4, 0x1f);
426
427 force_pci_posting(dev);
428 mdelay(1);
429
430 rtl8180_set_anaparam(dev, RTL8225z2_ANAPARAM_OFF);
431 rtl8185_set_anaparam2(dev, RTL8225z2_ANAPARAM2_OFF);
432 }
433
434 /*
435 * Map dBm into Tx power index according to current HW model, for example,
436 * RF and PA, and current wireless mode.
437 */
438 s8 DbmToTxPwrIdx(struct r8180_priv *priv, WIRELESS_MODE WirelessMode,
439 s32 PowerInDbm)
440 {
441 bool bUseDefault = true;
442 s8 TxPwrIdx = 0;
443
444 /*
445 * OFDM Power in dBm = Index * 0.5 + 0
446 * CCK Power in dBm = Index * 0.25 + 13
447 */
448 if (priv->card_8185 >= VERSION_8187S_B) {
449 s32 tmp = 0;
450
451 if (WirelessMode == WIRELESS_MODE_G) {
452 bUseDefault = false;
453 tmp = (2 * PowerInDbm);
454
455 if (tmp < 0)
456 TxPwrIdx = 0;
457 else if (tmp > 40) /* 40 means 20 dBm. */
458 TxPwrIdx = 40;
459 else
460 TxPwrIdx = (s8)tmp;
461 } else if (WirelessMode == WIRELESS_MODE_B) {
462 bUseDefault = false;
463 tmp = (4 * PowerInDbm) - 52;
464
465 if(tmp < 0)
466 TxPwrIdx = 0;
467 else if (tmp > 28) /* 28 means 20 dBm. */
468 TxPwrIdx = 28;
469 else
470 TxPwrIdx = (s8)tmp;
471 }
472 }
473
474 /*
475 * TRUE if we want to use a default implementation.
476 * We shall set it to FALSE when we have exact translation formular
477 * for target IC. 070622, by rcnjko.
478 */
479 if (bUseDefault) {
480 if (PowerInDbm < 0)
481 TxPwrIdx = 0;
482 else if (PowerInDbm > 35)
483 TxPwrIdx = 35;
484 else
485 TxPwrIdx = (u8)PowerInDbm;
486 }
487
488 return TxPwrIdx;
489 }
490
491 void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch)
492 {
493 struct r8180_priv *priv = ieee80211_priv(dev);
494 u8 max_cck_power_level;
495 u8 max_ofdm_power_level;
496 u8 min_ofdm_power_level;
497 char cck_power_level = (char)(0xff & priv->chtxpwr[ch]);
498 char ofdm_power_level = (char)(0xff & priv->chtxpwr_ofdm[ch]);
499
500 if (IS_DOT11D_ENABLE(priv->ieee80211) &&
501 IS_DOT11D_STATE_DONE(priv->ieee80211)) {
502 u8 MaxTxPwrInDbm = DOT11D_GetMaxTxPwrInDbm(priv->ieee80211, ch);
503 u8 CckMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_B, MaxTxPwrInDbm);
504 u8 OfdmMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_G, MaxTxPwrInDbm);
505
506 if (cck_power_level > CckMaxPwrIdx)
507 cck_power_level = CckMaxPwrIdx;
508 if (ofdm_power_level > OfdmMaxPwrIdx)
509 ofdm_power_level = OfdmMaxPwrIdx;
510 }
511
512 max_cck_power_level = 15;
513 max_ofdm_power_level = 25;
514 min_ofdm_power_level = 10;
515
516 if (cck_power_level > 35)
517 cck_power_level = 35;
518
519 write_nic_byte(dev, CCK_TXAGC,
520 (ZEBRA2_CCK_OFDM_GAIN_SETTING[(u8)cck_power_level]));
521 force_pci_posting(dev);
522 mdelay(1);
523
524 if (ofdm_power_level > 35)
525 ofdm_power_level = 35;
526
527 if (priv->up == 0) {
528 write_phy_ofdm(dev, 2, 0x42);
529 write_phy_ofdm(dev, 5, 0x00);
530 write_phy_ofdm(dev, 6, 0x40);
531 write_phy_ofdm(dev, 7, 0x00);
532 write_phy_ofdm(dev, 8, 0x40);
533 }
534
535 write_nic_byte(dev, OFDM_TXAGC,
536 ZEBRA2_CCK_OFDM_GAIN_SETTING[(u8)ofdm_power_level]);
537
538 if (ofdm_power_level <= 11) {
539 write_phy_ofdm(dev, 0x07, 0x5c);
540 write_phy_ofdm(dev, 0x09, 0x5c);
541 }
542
543 if (ofdm_power_level <= 17) {
544 write_phy_ofdm(dev, 0x07, 0x54);
545 write_phy_ofdm(dev, 0x09, 0x54);
546 } else {
547 write_phy_ofdm(dev, 0x07, 0x50);
548 write_phy_ofdm(dev, 0x09, 0x50);
549 }
550
551 force_pci_posting(dev);
552 mdelay(1);
553 }
554
555 void rtl8225z2_rf_set_chan(struct net_device *dev, short ch)
556 {
557 rtl8225z2_SetTXPowerLevel(dev, ch);
558
559 RF_WriteReg(dev, 0x7, rtl8225_chan[ch]);
560
561 if ((RF_ReadReg(dev, 0x7) & 0x0F80) != rtl8225_chan[ch])
562 RF_WriteReg(dev, 0x7, rtl8225_chan[ch]);
563
564 mdelay(1);
565
566 force_pci_posting(dev);
567 mdelay(10);
568 }
569
570 static void rtl8225_host_pci_init(struct net_device *dev)
571 {
572 write_nic_word(dev, RFPinsOutput, 0x480);
573
574 rtl8185_rf_pins_enable(dev);
575
576 write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO);
577
578 write_nic_byte(dev, GP_ENABLE, 0);
579
580 force_pci_posting(dev);
581 mdelay(200);
582
583 /* bit 6 is for RF on/off detection */
584 write_nic_word(dev, GP_ENABLE, 0xff & (~(1 << 6)));
585 }
586
587 static void rtl8225_rf_set_chan(struct net_device *dev, short ch)
588 {
589 struct r8180_priv *priv = ieee80211_priv(dev);
590 short gset = (priv->ieee80211->state == IEEE80211_LINKED &&
591 ieee80211_is_54g(priv->ieee80211->current_network)) ||
592 priv->ieee80211->iw_mode == IW_MODE_MONITOR;
593
594 rtl8225_SetTXPowerLevel(dev, ch);
595
596 write_rtl8225(dev, 0x7, rtl8225_chan[ch]);
597
598 force_pci_posting(dev);
599 mdelay(10);
600
601 if (gset) {
602 write_nic_byte(dev, SIFS, 0x22);
603 write_nic_byte(dev, DIFS, 0x14);
604 } else {
605 write_nic_byte(dev, SIFS, 0x44);
606 write_nic_byte(dev, DIFS, 0x24);
607 }
608
609 if (priv->ieee80211->state == IEEE80211_LINKED &&
610 ieee80211_is_shortslot(priv->ieee80211->current_network))
611 write_nic_byte(dev, SLOT, 0x9);
612 else
613 write_nic_byte(dev, SLOT, 0x14);
614
615 if (gset) {
616 write_nic_byte(dev, EIFS, 81);
617 write_nic_byte(dev, CW_VAL, 0x73);
618 } else {
619 write_nic_byte(dev, EIFS, 81);
620 write_nic_byte(dev, CW_VAL, 0xa5);
621 }
622 }
623
624 void rtl8225z2_rf_init(struct net_device *dev)
625 {
626 struct r8180_priv *priv = ieee80211_priv(dev);
627 int i;
628 short channel = 1;
629 u16 brsr;
630 u32 data,addr;
631
632 priv->chan = channel;
633
634 if (priv->card_type != USB)
635 rtl8225_host_pci_init(dev);
636
637 write_nic_dword(dev, RF_TIMING, 0x000a8008);
638
639 brsr = read_nic_word(dev, BRSR);
640
641 write_nic_word(dev, BRSR, 0xffff);
642
643 write_nic_dword(dev, RF_PARA, 0x100044);
644
645 rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
646 write_nic_byte(dev, CONFIG3, 0x44);
647 rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
648
649 rtl8185_rf_pins_enable(dev);
650
651 write_rtl8225(dev, 0x0, 0x2bf); mdelay(1);
652 write_rtl8225(dev, 0x1, 0xee0); mdelay(1);
653 write_rtl8225(dev, 0x2, 0x44d); mdelay(1);
654 write_rtl8225(dev, 0x3, 0x441); mdelay(1);
655 write_rtl8225(dev, 0x4, 0x8c3); mdelay(1);
656 write_rtl8225(dev, 0x5, 0xc72); mdelay(1);
657 write_rtl8225(dev, 0x6, 0xe6); mdelay(1);
658 write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1);
659 write_rtl8225(dev, 0x8, 0x3f); mdelay(1);
660 write_rtl8225(dev, 0x9, 0x335); mdelay(1);
661 write_rtl8225(dev, 0xa, 0x9d4); mdelay(1);
662 write_rtl8225(dev, 0xb, 0x7bb); mdelay(1);
663 write_rtl8225(dev, 0xc, 0x850); mdelay(1);
664 write_rtl8225(dev, 0xd, 0xcdf); mdelay(1);
665 write_rtl8225(dev, 0xe, 0x2b); mdelay(1);
666 write_rtl8225(dev, 0xf, 0x114);
667
668 mdelay(100);
669
670 write_rtl8225(dev, 0x0, 0x1b7);
671
672 for (i = 0; i < 95; i++) {
673 write_rtl8225(dev, 0x1, (u8)(i + 1));
674 write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]);
675 }
676
677 write_rtl8225(dev, 0x3, 0x80);
678 write_rtl8225(dev, 0x5, 0x4);
679
680 write_rtl8225(dev, 0x0, 0xb7);
681
682 write_rtl8225(dev, 0x2, 0xc4d);
683
684 if (priv->card_type == USB) {
685 mdelay(200);
686
687 write_rtl8225(dev, 0x2, 0x44d);
688 mdelay(100);
689 }
690
691 /* FIXME!! rtl8187 we have to check if calibrarion
692 * is successful and eventually cal. again (repeat
693 * the two write on reg 2)
694 */
695 data = read_rtl8225(dev, 6);
696 if (!(data & 0x00000080)) {
697 write_rtl8225(dev, 0x02, 0x0c4d);
698 force_pci_posting(dev); mdelay(200);
699 write_rtl8225(dev, 0x02, 0x044d);
700 force_pci_posting(dev); mdelay(100);
701 data = read_rtl8225(dev, 6);
702 if (!(data & 0x00000080))
703 DMESGW("RF Calibration Failed!!!!\n");
704 }
705
706 mdelay(200);
707
708 write_rtl8225(dev, 0x0, 0x2bf);
709
710 if (priv->card_type != USB)
711 rtl8185_rf_pins_enable(dev);
712
713 for (i = 0; i < 128; i++) {
714 data = rtl8225_agc[i];
715
716 addr = i + 0x80; /* enable writing AGC table */
717 write_phy_ofdm(dev, 0xb, data);
718 mdelay(1);
719
720 write_phy_ofdm(dev, 0xa, addr);
721 mdelay(1);
722 }
723
724 force_pci_posting(dev);
725 mdelay(1);
726
727 write_phy_ofdm(dev, 0x00, 0x01); mdelay(1);
728 write_phy_ofdm(dev, 0x01, 0x02); mdelay(1);
729 write_phy_ofdm(dev, 0x02, ((priv->card_type == USB) ? 0x42 : 0x62)); mdelay(1);
730 write_phy_ofdm(dev, 0x03, 0x00); mdelay(1);
731 write_phy_ofdm(dev, 0x04, 0x00); mdelay(1);
732 write_phy_ofdm(dev, 0x05, 0x00); mdelay(1);
733 write_phy_ofdm(dev, 0x06, 0x40); mdelay(1);
734 write_phy_ofdm(dev, 0x07, 0x00); mdelay(1);
735 write_phy_ofdm(dev, 0x08, 0x40); mdelay(1);
736 write_phy_ofdm(dev, 0x09, 0xfe); mdelay(1);
737 write_phy_ofdm(dev, 0x0a, 0x08); mdelay(1);
738 write_phy_ofdm(dev, 0x0b, 0x80); mdelay(1);
739 write_phy_ofdm(dev, 0x0c, 0x01); mdelay(1);
740 write_phy_ofdm(dev, 0x0d, 0x43);
741 write_phy_ofdm(dev, 0x0e, 0xd3); mdelay(1);
742 write_phy_ofdm(dev, 0x0f, 0x38); mdelay(1);
743 write_phy_ofdm(dev, 0x10, 0x84); mdelay(1);
744 write_phy_ofdm(dev, 0x11, 0x07); mdelay(1);
745 write_phy_ofdm(dev, 0x12, 0x20); mdelay(1);
746 write_phy_ofdm(dev, 0x13, 0x20); mdelay(1);
747 write_phy_ofdm(dev, 0x14, 0x00); mdelay(1);
748 write_phy_ofdm(dev, 0x15, 0x40); mdelay(1);
749 write_phy_ofdm(dev, 0x16, 0x00); mdelay(1);
750 write_phy_ofdm(dev, 0x17, 0x40); mdelay(1);
751 write_phy_ofdm(dev, 0x18, 0xef); mdelay(1);
752 write_phy_ofdm(dev, 0x19, 0x19); mdelay(1);
753 write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1);
754 write_phy_ofdm(dev, 0x1b, 0x15); mdelay(1);
755 write_phy_ofdm(dev, 0x1c, 0x04); mdelay(1);
756 write_phy_ofdm(dev, 0x1d, 0xc5); mdelay(1);
757 write_phy_ofdm(dev, 0x1e, 0x95); mdelay(1);
758 write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1);
759 write_phy_ofdm(dev, 0x20, 0x1f); mdelay(1);
760 write_phy_ofdm(dev, 0x21, 0x17); mdelay(1);
761 write_phy_ofdm(dev, 0x22, 0x16); mdelay(1);
762 write_phy_ofdm(dev, 0x23, 0x80); mdelay(1); /* FIXME maybe not needed */
763 write_phy_ofdm(dev, 0x24, 0x46); mdelay(1);
764 write_phy_ofdm(dev, 0x25, 0x00); mdelay(1);
765 write_phy_ofdm(dev, 0x26, 0x90); mdelay(1);
766 write_phy_ofdm(dev, 0x27, 0x88); mdelay(1);
767
768 rtl8225z2_set_gain(dev,4);
769
770 write_phy_cck(dev, 0x0, 0x98); mdelay(1);
771 write_phy_cck(dev, 0x3, 0x20); mdelay(1);
772 write_phy_cck(dev, 0x4, 0x7e); mdelay(1);
773 write_phy_cck(dev, 0x5, 0x12); mdelay(1);
774 write_phy_cck(dev, 0x6, 0xfc); mdelay(1);
775 write_phy_cck(dev, 0x7, 0x78); mdelay(1);
776 write_phy_cck(dev, 0x8, 0x2e); mdelay(1);
777 write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1);
778 write_phy_cck(dev, 0x11, 0x88); mdelay(1);
779 write_phy_cck(dev, 0x12, 0x47); mdelay(1);
780 write_phy_cck(dev, 0x13, 0xd0);
781 write_phy_cck(dev, 0x19, 0x00);
782 write_phy_cck(dev, 0x1a, 0xa0);
783 write_phy_cck(dev, 0x1b, 0x08);
784 write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */
785 write_phy_cck(dev, 0x41, 0x8d); mdelay(1);
786 write_phy_cck(dev, 0x42, 0x15); mdelay(1);
787 write_phy_cck(dev, 0x43, 0x18); mdelay(1);
788 write_phy_cck(dev, 0x44, 0x36); mdelay(1);
789 write_phy_cck(dev, 0x45, 0x35); mdelay(1);
790 write_phy_cck(dev, 0x46, 0x2e); mdelay(1);
791 write_phy_cck(dev, 0x47, 0x25); mdelay(1);
792 write_phy_cck(dev, 0x48, 0x1c); mdelay(1);
793 write_phy_cck(dev, 0x49, 0x12); mdelay(1);
794 write_phy_cck(dev, 0x4a, 0x09); mdelay(1);
795 write_phy_cck(dev, 0x4b, 0x04); mdelay(1);
796 write_phy_cck(dev, 0x4c, 0x05); mdelay(1);
797
798 write_nic_byte(dev, 0x5b, 0x0d); mdelay(1);
799
800 rtl8225z2_SetTXPowerLevel(dev, channel);
801
802 /* RX antenna default to A */
803 write_phy_cck(dev, 0x11, 0x9b); mdelay(1); /* B: 0xDB */
804 write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* B: 0x10 */
805
806 rtl8185_tx_antenna(dev, 0x03); /* B: 0x00 */
807
808 /* switch to high-speed 3-wire
809 * last digit. 2 for both cck and ofdm
810 */
811 if (priv->card_type == USB)
812 write_nic_dword(dev, 0x94, 0x3dc00002);
813 else {
814 write_nic_dword(dev, 0x94, 0x15c00002);
815 rtl8185_rf_pins_enable(dev);
816 }
817
818 rtl8225_rf_set_chan(dev, priv->chan);
819 }
820
821 void rtl8225z2_rf_set_mode(struct net_device *dev)
822 {
823 struct r8180_priv *priv = ieee80211_priv(dev);
824
825 if (priv->ieee80211->mode == IEEE_A) {
826 write_rtl8225(dev, 0x5, 0x1865);
827 write_nic_dword(dev, RF_PARA, 0x10084);
828 write_nic_dword(dev, RF_TIMING, 0xa8008);
829 write_phy_ofdm(dev, 0x0, 0x0);
830 write_phy_ofdm(dev, 0xa, 0x6);
831 write_phy_ofdm(dev, 0xb, 0x99);
832 write_phy_ofdm(dev, 0xf, 0x20);
833 write_phy_ofdm(dev, 0x11, 0x7);
834
835 rtl8225z2_set_gain(dev,4);
836
837 write_phy_ofdm(dev,0x15, 0x40);
838 write_phy_ofdm(dev,0x17, 0x40);
839
840 write_nic_dword(dev, 0x94,0x10000000);
841 } else {
842 write_rtl8225(dev, 0x5, 0x1864);
843 write_nic_dword(dev, RF_PARA, 0x10044);
844 write_nic_dword(dev, RF_TIMING, 0xa8008);
845 write_phy_ofdm(dev, 0x0, 0x1);
846 write_phy_ofdm(dev, 0xa, 0x6);
847 write_phy_ofdm(dev, 0xb, 0x99);
848 write_phy_ofdm(dev, 0xf, 0x20);
849 write_phy_ofdm(dev, 0x11, 0x7);
850
851 rtl8225z2_set_gain(dev,4);
852
853 write_phy_ofdm(dev,0x15, 0x40);
854 write_phy_ofdm(dev,0x17, 0x40);
855
856 write_nic_dword(dev, 0x94,0x04000002);
857 }
858 }
859
860 #define MAX_DOZE_WAITING_TIMES_85B 20
861 #define MAX_POLLING_24F_TIMES_87SE 10
862 #define LPS_MAX_SLEEP_WAITING_TIMES_87SE 5
863
864 bool SetZebraRFPowerState8185(struct net_device *dev,
865 RT_RF_POWER_STATE eRFPowerState)
866 {
867 struct r8180_priv *priv = ieee80211_priv(dev);
868 u8 btCR9346, btConfig3;
869 bool bActionAllowed = true, bTurnOffBB = true;
870 u8 u1bTmp;
871 int i;
872 bool bResult = true;
873 u8 QueueID;
874
875 if (priv->SetRFPowerStateInProgress == true)
876 return false;
877
878 priv->SetRFPowerStateInProgress = true;
879
880 btCR9346 = read_nic_byte(dev, CR9346);
881 write_nic_byte(dev, CR9346, (btCR9346 | 0xC0));
882
883 btConfig3 = read_nic_byte(dev, CONFIG3);
884 write_nic_byte(dev, CONFIG3, (btConfig3 | CONFIG3_PARM_En));
885
886 switch (priv->rf_chip) {
887 case RF_ZEBRA2:
888 switch (eRFPowerState) {
889 case eRfOn:
890 RF_WriteReg(dev,0x4,0x9FF);
891
892 write_nic_dword(dev, ANAPARAM, ANAPARM_ON);
893 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ON);
894
895 write_nic_byte(dev, CONFIG4, priv->RFProgType);
896
897 /* turn on CCK and OFDM */
898 u1bTmp = read_nic_byte(dev, 0x24E);
899 write_nic_byte(dev, 0x24E, (u1bTmp & (~(BIT5 | BIT6))));
900 break;
901 case eRfSleep:
902 break;
903 case eRfOff:
904 break;
905 default:
906 bResult = false;
907 break;
908 }
909 break;
910 case RF_ZEBRA4:
911 switch (eRFPowerState) {
912 case eRfOn:
913 write_nic_word(dev, 0x37C, 0x00EC);
914
915 /* turn on AFE */
916 write_nic_byte(dev, 0x54, 0x00);
917 write_nic_byte(dev, 0x62, 0x00);
918
919 /* turn on RF */
920 RF_WriteReg(dev, 0x0, 0x009f); udelay(500);
921 RF_WriteReg(dev, 0x4, 0x0972); udelay(500);
922
923 /* turn on RF again */
924 RF_WriteReg(dev, 0x0, 0x009f); udelay(500);
925 RF_WriteReg(dev, 0x4, 0x0972); udelay(500);
926
927 /* turn on BB */
928 write_phy_ofdm(dev,0x10,0x40);
929 write_phy_ofdm(dev,0x12,0x40);
930
931 /* Avoid power down at init time. */
932 write_nic_byte(dev, CONFIG4, priv->RFProgType);
933
934 u1bTmp = read_nic_byte(dev, 0x24E);
935 write_nic_byte(dev, 0x24E, (u1bTmp & (~(BIT5 | BIT6))));
936 break;
937 case eRfSleep:
938 for (QueueID = 0, i = 0; QueueID < 6;) {
939 if (get_curr_tx_free_desc(dev, QueueID) == priv->txringcount) {
940 QueueID++;
941 continue;
942 } else {
943 priv->TxPollingTimes ++;
944 if (priv->TxPollingTimes >= LPS_MAX_SLEEP_WAITING_TIMES_87SE) {
945 bActionAllowed = false;
946 break;
947 } else
948 udelay(10);
949 }
950 }
951
952 if (bActionAllowed) {
953 /* turn off BB RXIQ matrix to cut off rx signal */
954 write_phy_ofdm(dev, 0x10, 0x00);
955 write_phy_ofdm(dev, 0x12, 0x00);
956
957 /* turn off RF */
958 RF_WriteReg(dev, 0x4, 0x0000);
959 RF_WriteReg(dev, 0x0, 0x0000);
960
961 /* turn off AFE except PLL */
962 write_nic_byte(dev, 0x62, 0xff);
963 write_nic_byte(dev, 0x54, 0xec);
964
965 mdelay(1);
966
967 {
968 int i = 0;
969 while (true) {
970 u8 tmp24F = read_nic_byte(dev, 0x24f);
971
972 if ((tmp24F == 0x01) || (tmp24F == 0x09)) {
973 bTurnOffBB = true;
974 break;
975 } else {
976 udelay(10);
977 i++;
978 priv->TxPollingTimes++;
979
980 if (priv->TxPollingTimes >= LPS_MAX_SLEEP_WAITING_TIMES_87SE) {
981 bTurnOffBB = false;
982 break;
983 } else
984 udelay(10);
985 }
986 }
987 }
988
989 if (bTurnOffBB) {
990 /* turn off BB */
991 u1bTmp = read_nic_byte(dev, 0x24E);
992 write_nic_byte(dev, 0x24E, (u1bTmp | BIT5 | BIT6));
993
994 /* turn off AFE PLL */
995 write_nic_byte(dev, 0x54, 0xFC);
996 write_nic_word(dev, 0x37C, 0x00FC);
997 }
998 }
999 break;
1000 case eRfOff:
1001 for (QueueID = 0, i = 0; QueueID < 6;) {
1002 if (get_curr_tx_free_desc(dev, QueueID) == priv->txringcount) {
1003 QueueID++;
1004 continue;
1005 } else {
1006 udelay(10);
1007 i++;
1008 }
1009
1010 if (i >= MAX_DOZE_WAITING_TIMES_85B)
1011 break;
1012 }
1013
1014 /* turn off BB RXIQ matrix to cut off rx signal */
1015 write_phy_ofdm(dev, 0x10, 0x00);
1016 write_phy_ofdm(dev, 0x12, 0x00);
1017
1018 /* turn off RF */
1019 RF_WriteReg(dev, 0x4, 0x0000);
1020 RF_WriteReg(dev, 0x0, 0x0000);
1021
1022 /* turn off AFE except PLL */
1023 write_nic_byte(dev, 0x62, 0xff);
1024 write_nic_byte(dev, 0x54, 0xec);
1025
1026 mdelay(1);
1027
1028 {
1029 int i = 0;
1030
1031 while (true)
1032 {
1033 u8 tmp24F = read_nic_byte(dev, 0x24f);
1034
1035 if ((tmp24F == 0x01) || (tmp24F == 0x09)) {
1036 bTurnOffBB = true;
1037 break;
1038 } else {
1039 bTurnOffBB = false;
1040 udelay(10);
1041 i++;
1042 }
1043
1044 if (i > MAX_POLLING_24F_TIMES_87SE)
1045 break;
1046 }
1047 }
1048
1049 if (bTurnOffBB) {
1050 /* turn off BB */
1051 u1bTmp = read_nic_byte(dev, 0x24E);
1052 write_nic_byte(dev, 0x24E, (u1bTmp | BIT5 | BIT6));
1053
1054 /* turn off AFE PLL (80M) */
1055 write_nic_byte(dev, 0x54, 0xFC);
1056 write_nic_word(dev, 0x37C, 0x00FC);
1057 }
1058 break;
1059 default:
1060 bResult = false;
1061 printk("SetZebraRFPowerState8185(): unknow state to set: 0x%X!!!\n", eRFPowerState);
1062 break;
1063 }
1064 break;
1065 }
1066
1067 btConfig3 &= ~(CONFIG3_PARM_En);
1068 write_nic_byte(dev, CONFIG3, btConfig3);
1069
1070 btCR9346 &= ~(0xC0);
1071 write_nic_byte(dev, CR9346, btCR9346);
1072
1073 if (bResult && bActionAllowed)
1074 priv->eRFPowerState = eRFPowerState;
1075
1076 priv->SetRFPowerStateInProgress = false;
1077
1078 return bResult && bActionAllowed;
1079 }
1080
1081 void rtl8225z4_rf_sleep(struct net_device *dev)
1082 {
1083 MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
1084 }
1085
1086 void rtl8225z4_rf_wakeup(struct net_device *dev)
1087 {
1088 MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_PS);
1089 }
This page took 0.066923 seconds and 5 git commands to generate.