]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/staging/rtl8187se/r8180_rtl8225z2.c
staging: Update e-mail address for Andrea Merello
[karo-tx-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 <andrea.merello@gmail.com>
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 #include "r8180_hw.h"
13 #include "r8180_rtl8225.h"
14 #include "r8180_93cx6.h"
15
16 #include "ieee80211/dot11d.h"
17
18 static void write_rtl8225(struct net_device *dev, u8 adr, u16 data)
19 {
20         int i;
21         u16 out, select;
22         u8 bit;
23         u32 bangdata = (data << 4) | (adr & 0xf);
24
25         out = read_nic_word(dev, RFPinsOutput) & 0xfff3;
26
27         write_nic_word(dev, RFPinsEnable,
28                 (read_nic_word(dev, RFPinsEnable) | 0x7));
29
30         select = read_nic_word(dev, RFPinsSelect);
31
32         write_nic_word(dev, RFPinsSelect, select | 0x7 |
33                        SW_CONTROL_GPIO);
34
35         force_pci_posting(dev);
36         udelay(10);
37
38         write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
39
40         force_pci_posting(dev);
41         udelay(2);
42
43         write_nic_word(dev, RFPinsOutput, out);
44
45         force_pci_posting(dev);
46         udelay(10);
47
48         for (i = 15; i >= 0; i--) {
49                 bit = (bangdata & (1 << i)) >> i;
50
51                 write_nic_word(dev, RFPinsOutput, bit | out);
52
53                 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
54                 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
55
56                 i--;
57                 bit = (bangdata & (1 << i)) >> i;
58
59                 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
60                 write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
61
62                 write_nic_word(dev, RFPinsOutput, bit | out);
63
64         }
65
66         write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
67
68         force_pci_posting(dev);
69         udelay(10);
70
71         write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
72
73         write_nic_word(dev, RFPinsSelect, select | SW_CONTROL_GPIO);
74
75         rtl8185_rf_pins_enable(dev);
76 }
77
78 static const u8 rtl8225_agc[] = {
79         0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
80         0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96,
81         0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e,
82         0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86,
83         0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e,
84         0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36,
85         0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e,
86         0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26,
87         0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e,
88         0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16,
89         0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
90         0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06,
91         0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01,
92         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
93         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
94         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
95 };
96
97 static const u32 rtl8225_chan[] = {
98         0,
99         0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
100         0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x074A,
101 };
102
103 static const u8 rtl8225z2_gain_bg[] = {
104         0x23, 0x15, 0xa5, /* -82-1dBm */
105         0x23, 0x15, 0xb5, /* -82-2dBm */
106         0x23, 0x15, 0xc5, /* -82-3dBm */
107         0x33, 0x15, 0xc5, /* -78dBm */
108         0x43, 0x15, 0xc5, /* -74dBm */
109         0x53, 0x15, 0xc5, /* -70dBm */
110         0x63, 0x15, 0xc5, /* -66dBm */
111 };
112
113 static const u8 rtl8225z2_gain_a[] = {
114         0x13, 0x27, 0x5a, /* -82dBm */
115         0x23, 0x23, 0x58, /* -82dBm */
116         0x33, 0x1f, 0x56, /* -82dBm */
117         0x43, 0x1b, 0x54, /* -78dBm */
118         0x53, 0x17, 0x51, /* -74dBm */
119         0x63, 0x24, 0x4f, /* -70dBm */
120         0x73, 0x0f, 0x4c, /* -66dBm */
121 };
122
123 static const u16 rtl8225z2_rxgain[] = {
124         0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
125         0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
126         0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
127         0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
128         0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
129         0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
130         0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
131         0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
132         0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
133         0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
134         0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
135         0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb
136
137 };
138
139 void rtl8225z2_set_gain(struct net_device *dev, short gain)
140 {
141         const u8 *rtl8225_gain;
142         struct r8180_priv *priv = ieee80211_priv(dev);
143         u8 mode = priv->ieee80211->mode;
144
145         if (mode == IEEE_B || mode == IEEE_G)
146                 rtl8225_gain = rtl8225z2_gain_bg;
147         else
148                 rtl8225_gain = rtl8225z2_gain_a;
149
150         write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]);
151         write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]);
152         write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]);
153         write_phy_ofdm(dev, 0x21, 0x37);
154 }
155
156 static u32 read_rtl8225(struct net_device *dev, u8 adr)
157 {
158         u32 data2Write = ((u32)(adr & 0x1f)) << 27;
159         u32 dataRead;
160         u32 mask;
161         u16 oval, oval2, oval3, tmp;
162         int i;
163         short bit, rw;
164         u8 wLength = 6;
165         u8 rLength = 12;
166         u8 low2high = 0;
167
168         oval = read_nic_word(dev, RFPinsOutput);
169         oval2 = read_nic_word(dev, RFPinsEnable);
170         oval3 = read_nic_word(dev, RFPinsSelect);
171
172         write_nic_word(dev, RFPinsEnable, (oval2|0xf));
173         write_nic_word(dev, RFPinsSelect, (oval3|0xf));
174
175         dataRead = 0;
176
177         oval &= ~0xf;
178
179         write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN);
180         udelay(4);
181
182         write_nic_word(dev, RFPinsOutput, oval);
183         udelay(5);
184
185         rw = 0;
186
187         mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1));
188
189         for (i = 0; i < wLength/2; i++) {
190                 bit = ((data2Write&mask) != 0) ? 1 : 0;
191                 write_nic_word(dev, RFPinsOutput, bit | oval | rw);
192                 udelay(1);
193
194                 write_nic_word(dev, RFPinsOutput,
195                                 bit | oval | BB_HOST_BANG_CLK | rw);
196                 udelay(2);
197                 write_nic_word(dev, RFPinsOutput,
198                                 bit | oval | BB_HOST_BANG_CLK | rw);
199                 udelay(2);
200
201                 mask = (low2high) ? (mask<<1) : (mask>>1);
202
203                 if (i == 2) {
204                         rw = BB_HOST_BANG_RW;
205                         write_nic_word(dev, RFPinsOutput,
206                                         bit | oval | BB_HOST_BANG_CLK | rw);
207                         udelay(2);
208                         write_nic_word(dev, RFPinsOutput, bit | oval | rw);
209                         udelay(2);
210                         break;
211                 }
212
213                 bit = ((data2Write&mask) != 0) ? 1 : 0;
214
215                 write_nic_word(dev, RFPinsOutput,
216                                 oval | bit | rw | BB_HOST_BANG_CLK);
217                 udelay(2);
218                 write_nic_word(dev, RFPinsOutput,
219                                 oval | bit | rw | BB_HOST_BANG_CLK);
220                 udelay(2);
221
222                 write_nic_word(dev, RFPinsOutput, oval | bit | rw);
223                 udelay(1);
224
225                 mask = (low2high) ? (mask<<1) : (mask>>1);
226         }
227
228         write_nic_word(dev, RFPinsOutput, rw|oval);
229         udelay(2);
230         mask = (low2high) ? 0x01 : (((u32)0x01) << (12-1));
231
232         /*
233          * We must set data pin to HW controlled, otherwise RF can't driver it
234          * and value RF register won't be able to read back properly.
235          */
236         write_nic_word(dev, RFPinsEnable, (oval2 & (~0x01)));
237
238         for (i = 0; i < rLength; i++) {
239                 write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1);
240
241                 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK);
242                 udelay(2);
243                 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK);
244                 udelay(2);
245                 write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK);
246                 udelay(2);
247                 tmp = read_nic_word(dev, RFPinsInput);
248
249                 dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0);
250
251                 write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2);
252
253                 mask = (low2high) ? (mask<<1) : (mask>>1);
254         }
255
256         write_nic_word(dev, RFPinsOutput,
257                         BB_HOST_BANG_EN | BB_HOST_BANG_RW | oval);
258         udelay(2);
259
260         write_nic_word(dev, RFPinsEnable, oval2);
261         write_nic_word(dev, RFPinsSelect, oval3); /* Set To SW Switch */
262         write_nic_word(dev, RFPinsOutput, 0x3a0);
263
264         return dataRead;
265 }
266
267 void rtl8225z2_rf_close(struct net_device *dev)
268 {
269         RF_WriteReg(dev, 0x4, 0x1f);
270
271         force_pci_posting(dev);
272         mdelay(1);
273
274         rtl8180_set_anaparam(dev, RTL8225z2_ANAPARAM_OFF);
275         rtl8185_set_anaparam2(dev, RTL8225z2_ANAPARAM2_OFF);
276 }
277
278 /*
279  * Map dBm into Tx power index according to current HW model, for example,
280  * RF and PA, and current wireless mode.
281  */
282 s8 DbmToTxPwrIdx(struct r8180_priv *priv, WIRELESS_MODE WirelessMode,
283                  s32 PowerInDbm)
284 {
285         bool bUseDefault = true;
286         s8 TxPwrIdx = 0;
287
288         /*
289          * OFDM Power in dBm = Index * 0.5 + 0
290          * CCK Power in dBm = Index * 0.25 + 13
291          */
292         s32 tmp = 0;
293
294         if (WirelessMode == WIRELESS_MODE_G) {
295                 bUseDefault = false;
296                 tmp = (2 * PowerInDbm);
297
298                 if (tmp < 0)
299                         TxPwrIdx = 0;
300                 else if (tmp > 40) /* 40 means 20 dBm. */
301                         TxPwrIdx = 40;
302                 else
303                         TxPwrIdx = (s8)tmp;
304         } else if (WirelessMode == WIRELESS_MODE_B) {
305                 bUseDefault = false;
306                 tmp = (4 * PowerInDbm) - 52;
307
308                 if (tmp < 0)
309                         TxPwrIdx = 0;
310                 else if (tmp > 28) /* 28 means 20 dBm. */
311                         TxPwrIdx = 28;
312                 else
313                         TxPwrIdx = (s8)tmp;
314         }
315
316         /*
317          * TRUE if we want to use a default implementation.
318          * We shall set it to FALSE when we have exact translation formula
319          * for target IC. 070622, by rcnjko.
320          */
321         if (bUseDefault) {
322                 if (PowerInDbm < 0)
323                         TxPwrIdx = 0;
324                 else if (PowerInDbm > 35)
325                         TxPwrIdx = 35;
326                 else
327                         TxPwrIdx = (u8)PowerInDbm;
328         }
329
330         return TxPwrIdx;
331 }
332
333 void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch)
334 {
335         struct r8180_priv *priv = ieee80211_priv(dev);
336         u8 max_cck_power_level;
337         u8 max_ofdm_power_level;
338         u8 min_ofdm_power_level;
339         char cck_power_level = (char)(0xff & priv->chtxpwr[ch]);
340         char ofdm_power_level = (char)(0xff & priv->chtxpwr_ofdm[ch]);
341
342         if (IS_DOT11D_ENABLE(priv->ieee80211) &&
343             IS_DOT11D_STATE_DONE(priv->ieee80211)) {
344                 u8 MaxTxPwrInDbm = DOT11D_GetMaxTxPwrInDbm(priv->ieee80211, ch);
345                 u8 CckMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_B,
346                                                         MaxTxPwrInDbm);
347                 u8 OfdmMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_G,
348                                                         MaxTxPwrInDbm);
349
350                 if (cck_power_level > CckMaxPwrIdx)
351                         cck_power_level = CckMaxPwrIdx;
352                 if (ofdm_power_level > OfdmMaxPwrIdx)
353                         ofdm_power_level = OfdmMaxPwrIdx;
354         }
355
356         max_cck_power_level = 15;
357         max_ofdm_power_level = 25;
358         min_ofdm_power_level = 10;
359
360         if (cck_power_level > 35)
361                 cck_power_level = 35;
362
363         write_nic_byte(dev, CCK_TXAGC, cck_power_level);
364         force_pci_posting(dev);
365         mdelay(1);
366
367         if (ofdm_power_level > 35)
368                 ofdm_power_level = 35;
369
370         if (priv->up == 0) {
371                 write_phy_ofdm(dev, 2, 0x42);
372                 write_phy_ofdm(dev, 5, 0x00);
373                 write_phy_ofdm(dev, 6, 0x40);
374                 write_phy_ofdm(dev, 7, 0x00);
375                 write_phy_ofdm(dev, 8, 0x40);
376         }
377
378         write_nic_byte(dev, OFDM_TXAGC, ofdm_power_level);
379
380         if (ofdm_power_level <= 11) {
381                 write_phy_ofdm(dev, 0x07, 0x5c);
382                 write_phy_ofdm(dev, 0x09, 0x5c);
383         }
384
385         if (ofdm_power_level <= 17) {
386                 write_phy_ofdm(dev, 0x07, 0x54);
387                 write_phy_ofdm(dev, 0x09, 0x54);
388         } else {
389                 write_phy_ofdm(dev, 0x07, 0x50);
390                 write_phy_ofdm(dev, 0x09, 0x50);
391         }
392
393         force_pci_posting(dev);
394         mdelay(1);
395 }
396
397 void rtl8225z2_rf_set_chan(struct net_device *dev, short ch)
398 {
399         rtl8225z2_SetTXPowerLevel(dev, ch);
400
401         RF_WriteReg(dev, 0x7, rtl8225_chan[ch]);
402
403         if ((RF_ReadReg(dev, 0x7) & 0x0F80) != rtl8225_chan[ch])
404                 RF_WriteReg(dev, 0x7, rtl8225_chan[ch]);
405
406         mdelay(1);
407
408         force_pci_posting(dev);
409         mdelay(10);
410 }
411
412 static void rtl8225_host_pci_init(struct net_device *dev)
413 {
414         write_nic_word(dev, RFPinsOutput, 0x480);
415
416         rtl8185_rf_pins_enable(dev);
417
418         write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO);
419
420         write_nic_byte(dev, GP_ENABLE, 0);
421
422         force_pci_posting(dev);
423         mdelay(200);
424
425         /* bit 6 is for RF on/off detection */
426         write_nic_word(dev, GP_ENABLE, 0xff & (~(1 << 6)));
427 }
428
429 void rtl8225z2_rf_init(struct net_device *dev)
430 {
431         struct r8180_priv *priv = ieee80211_priv(dev);
432         int i;
433         short channel = 1;
434         u16 brsr;
435         u32 data;
436
437         priv->chan = channel;
438
439         rtl8225_host_pci_init(dev);
440
441         write_nic_dword(dev, RF_TIMING, 0x000a8008);
442
443         brsr = read_nic_word(dev, BRSR);
444
445         write_nic_word(dev, BRSR, 0xffff);
446
447         write_nic_dword(dev, RF_PARA, 0x100044);
448
449         rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
450         write_nic_byte(dev, CONFIG3, 0x44);
451         rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
452
453         rtl8185_rf_pins_enable(dev);
454
455         write_rtl8225(dev, 0x0, 0x2bf); mdelay(1);
456         write_rtl8225(dev, 0x1, 0xee0); mdelay(1);
457         write_rtl8225(dev, 0x2, 0x44d); mdelay(1);
458         write_rtl8225(dev, 0x3, 0x441); mdelay(1);
459         write_rtl8225(dev, 0x4, 0x8c3); mdelay(1);
460         write_rtl8225(dev, 0x5, 0xc72); mdelay(1);
461         write_rtl8225(dev, 0x6, 0xe6);  mdelay(1);
462         write_rtl8225(dev, 0x7, rtl8225_chan[channel]);  mdelay(1);
463         write_rtl8225(dev, 0x8, 0x3f);  mdelay(1);
464         write_rtl8225(dev, 0x9, 0x335); mdelay(1);
465         write_rtl8225(dev, 0xa, 0x9d4); mdelay(1);
466         write_rtl8225(dev, 0xb, 0x7bb); mdelay(1);
467         write_rtl8225(dev, 0xc, 0x850); mdelay(1);
468         write_rtl8225(dev, 0xd, 0xcdf); mdelay(1);
469         write_rtl8225(dev, 0xe, 0x2b);  mdelay(1);
470         write_rtl8225(dev, 0xf, 0x114);
471
472         mdelay(100);
473
474         write_rtl8225(dev, 0x0, 0x1b7);
475
476         for (i = 0; i < ARRAY_SIZE(rtl8225z2_rxgain); i++) {
477                 write_rtl8225(dev, 0x1, i + 1);
478                 write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]);
479         }
480
481         write_rtl8225(dev, 0x3, 0x80);
482         write_rtl8225(dev, 0x5, 0x4);
483
484         write_rtl8225(dev, 0x0, 0xb7);
485
486         write_rtl8225(dev, 0x2, 0xc4d);
487
488         /* FIXME!! rtl8187 we have to check if calibrarion
489          * is successful and eventually cal. again (repeat
490          * the two write on reg 2)
491          */
492         data = read_rtl8225(dev, 6);
493         if (!(data & 0x00000080)) {
494                 write_rtl8225(dev, 0x02, 0x0c4d);
495                 force_pci_posting(dev); mdelay(200);
496                 write_rtl8225(dev, 0x02, 0x044d);
497                 force_pci_posting(dev); mdelay(100);
498                 data = read_rtl8225(dev, 6);
499                 if (!(data & 0x00000080))
500                         DMESGW("RF Calibration Failed!!!!\n");
501         }
502
503         mdelay(200);
504
505         write_rtl8225(dev, 0x0, 0x2bf);
506
507         for (i = 0; i < ARRAY_SIZE(rtl8225_agc); i++) {
508                 write_phy_ofdm(dev, 0xb, rtl8225_agc[i]);
509                 mdelay(1);
510
511                 /* enable writing AGC table */
512                 write_phy_ofdm(dev, 0xa, i + 0x80);
513                 mdelay(1);
514         }
515
516         force_pci_posting(dev);
517         mdelay(1);
518
519         write_phy_ofdm(dev, 0x00, 0x01); mdelay(1);
520         write_phy_ofdm(dev, 0x01, 0x02); mdelay(1);
521         write_phy_ofdm(dev, 0x02, 0x62); mdelay(1);
522         write_phy_ofdm(dev, 0x03, 0x00); mdelay(1);
523         write_phy_ofdm(dev, 0x04, 0x00); mdelay(1);
524         write_phy_ofdm(dev, 0x05, 0x00); mdelay(1);
525         write_phy_ofdm(dev, 0x06, 0x40); mdelay(1);
526         write_phy_ofdm(dev, 0x07, 0x00); mdelay(1);
527         write_phy_ofdm(dev, 0x08, 0x40); mdelay(1);
528         write_phy_ofdm(dev, 0x09, 0xfe); mdelay(1);
529         write_phy_ofdm(dev, 0x0a, 0x08); mdelay(1);
530         write_phy_ofdm(dev, 0x0b, 0x80); mdelay(1);
531         write_phy_ofdm(dev, 0x0c, 0x01); mdelay(1);
532         write_phy_ofdm(dev, 0x0d, 0x43);
533         write_phy_ofdm(dev, 0x0e, 0xd3); mdelay(1);
534         write_phy_ofdm(dev, 0x0f, 0x38); mdelay(1);
535         write_phy_ofdm(dev, 0x10, 0x84); mdelay(1);
536         write_phy_ofdm(dev, 0x11, 0x07); mdelay(1);
537         write_phy_ofdm(dev, 0x12, 0x20); mdelay(1);
538         write_phy_ofdm(dev, 0x13, 0x20); mdelay(1);
539         write_phy_ofdm(dev, 0x14, 0x00); mdelay(1);
540         write_phy_ofdm(dev, 0x15, 0x40); mdelay(1);
541         write_phy_ofdm(dev, 0x16, 0x00); mdelay(1);
542         write_phy_ofdm(dev, 0x17, 0x40); mdelay(1);
543         write_phy_ofdm(dev, 0x18, 0xef); mdelay(1);
544         write_phy_ofdm(dev, 0x19, 0x19); mdelay(1);
545         write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1);
546         write_phy_ofdm(dev, 0x1b, 0x15); mdelay(1);
547         write_phy_ofdm(dev, 0x1c, 0x04); mdelay(1);
548         write_phy_ofdm(dev, 0x1d, 0xc5); mdelay(1);
549         write_phy_ofdm(dev, 0x1e, 0x95); mdelay(1);
550         write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1);
551         write_phy_ofdm(dev, 0x20, 0x1f); mdelay(1);
552         write_phy_ofdm(dev, 0x21, 0x17); mdelay(1);
553         write_phy_ofdm(dev, 0x22, 0x16); mdelay(1);
554         write_phy_ofdm(dev, 0x23, 0x80); mdelay(1); /* FIXME maybe not needed */
555         write_phy_ofdm(dev, 0x24, 0x46); mdelay(1);
556         write_phy_ofdm(dev, 0x25, 0x00); mdelay(1);
557         write_phy_ofdm(dev, 0x26, 0x90); mdelay(1);
558         write_phy_ofdm(dev, 0x27, 0x88); mdelay(1);
559
560         rtl8225z2_set_gain(dev, 4);
561
562         write_phy_cck(dev, 0x0, 0x98); mdelay(1);
563         write_phy_cck(dev, 0x3, 0x20); mdelay(1);
564         write_phy_cck(dev, 0x4, 0x7e); mdelay(1);
565         write_phy_cck(dev, 0x5, 0x12); mdelay(1);
566         write_phy_cck(dev, 0x6, 0xfc); mdelay(1);
567         write_phy_cck(dev, 0x7, 0x78); mdelay(1);
568         write_phy_cck(dev, 0x8, 0x2e); mdelay(1);
569         write_phy_cck(dev, 0x10, 0x93); mdelay(1);
570         write_phy_cck(dev, 0x11, 0x88); mdelay(1);
571         write_phy_cck(dev, 0x12, 0x47); mdelay(1);
572         write_phy_cck(dev, 0x13, 0xd0);
573         write_phy_cck(dev, 0x19, 0x00);
574         write_phy_cck(dev, 0x1a, 0xa0);
575         write_phy_cck(dev, 0x1b, 0x08);
576         write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */
577         write_phy_cck(dev, 0x41, 0x8d); mdelay(1);
578         write_phy_cck(dev, 0x42, 0x15); mdelay(1);
579         write_phy_cck(dev, 0x43, 0x18); mdelay(1);
580         write_phy_cck(dev, 0x44, 0x36); mdelay(1);
581         write_phy_cck(dev, 0x45, 0x35); mdelay(1);
582         write_phy_cck(dev, 0x46, 0x2e); mdelay(1);
583         write_phy_cck(dev, 0x47, 0x25); mdelay(1);
584         write_phy_cck(dev, 0x48, 0x1c); mdelay(1);
585         write_phy_cck(dev, 0x49, 0x12); mdelay(1);
586         write_phy_cck(dev, 0x4a, 0x09); mdelay(1);
587         write_phy_cck(dev, 0x4b, 0x04); mdelay(1);
588         write_phy_cck(dev, 0x4c, 0x05); mdelay(1);
589
590         write_nic_byte(dev, 0x5b, 0x0d); mdelay(1);
591
592         rtl8225z2_SetTXPowerLevel(dev, channel);
593
594         /* RX antenna default to A */
595         write_phy_cck(dev, 0x11, 0x9b); mdelay(1);              /* B: 0xDB */
596         write_phy_ofdm(dev, 0x26, 0x90); mdelay(1);             /* B: 0x10 */
597
598         rtl8185_tx_antenna(dev, 0x03);                          /* B: 0x00 */
599
600         /* switch to high-speed 3-wire
601          * last digit. 2 for both cck and ofdm
602          */
603         write_nic_dword(dev, 0x94, 0x15c00002);
604         rtl8185_rf_pins_enable(dev);
605
606         rtl8225z2_rf_set_chan(dev, priv->chan);
607 }
608
609 void rtl8225z2_rf_set_mode(struct net_device *dev)
610 {
611         struct r8180_priv *priv = ieee80211_priv(dev);
612
613         if (priv->ieee80211->mode == IEEE_A) {
614                 write_rtl8225(dev, 0x5, 0x1865);
615                 write_nic_dword(dev, RF_PARA, 0x10084);
616                 write_nic_dword(dev, RF_TIMING, 0xa8008);
617                 write_phy_ofdm(dev, 0x0, 0x0);
618                 write_phy_ofdm(dev, 0xa, 0x6);
619                 write_phy_ofdm(dev, 0xb, 0x99);
620                 write_phy_ofdm(dev, 0xf, 0x20);
621                 write_phy_ofdm(dev, 0x11, 0x7);
622
623                 rtl8225z2_set_gain(dev, 4);
624
625                 write_phy_ofdm(dev, 0x15, 0x40);
626                 write_phy_ofdm(dev, 0x17, 0x40);
627
628                 write_nic_dword(dev, 0x94, 0x10000000);
629         } else {
630                 write_rtl8225(dev, 0x5, 0x1864);
631                 write_nic_dword(dev, RF_PARA, 0x10044);
632                 write_nic_dword(dev, RF_TIMING, 0xa8008);
633                 write_phy_ofdm(dev, 0x0, 0x1);
634                 write_phy_ofdm(dev, 0xa, 0x6);
635                 write_phy_ofdm(dev, 0xb, 0x99);
636                 write_phy_ofdm(dev, 0xf, 0x20);
637                 write_phy_ofdm(dev, 0x11, 0x7);
638
639                 rtl8225z2_set_gain(dev, 4);
640
641                 write_phy_ofdm(dev, 0x15, 0x40);
642                 write_phy_ofdm(dev, 0x17, 0x40);
643
644                 write_nic_dword(dev, 0x94, 0x04000002);
645         }
646 }
647
648 #define MAX_DOZE_WAITING_TIMES_85B              20
649 #define MAX_POLLING_24F_TIMES_87SE              10
650 #define LPS_MAX_SLEEP_WAITING_TIMES_87SE        5
651
652 bool SetZebraRFPowerState8185(struct net_device *dev,
653                               RT_RF_POWER_STATE eRFPowerState)
654 {
655         struct r8180_priv *priv = ieee80211_priv(dev);
656         u8                      btCR9346, btConfig3;
657         bool bActionAllowed = true, bTurnOffBB = true;
658         u8                      u1bTmp;
659         int                     i;
660         bool            bResult = true;
661         u8                      QueueID;
662
663         if (priv->SetRFPowerStateInProgress == true)
664                 return false;
665
666         priv->SetRFPowerStateInProgress = true;
667
668         btCR9346 = read_nic_byte(dev, CR9346);
669         write_nic_byte(dev, CR9346, (btCR9346 | 0xC0));
670
671         btConfig3 = read_nic_byte(dev, CONFIG3);
672         write_nic_byte(dev, CONFIG3, (btConfig3 | CONFIG3_PARM_En));
673
674         switch (eRFPowerState) {
675         case eRfOn:
676                 write_nic_word(dev, 0x37C, 0x00EC);
677
678                 /* turn on AFE */
679                 write_nic_byte(dev, 0x54, 0x00);
680                 write_nic_byte(dev, 0x62, 0x00);
681
682                 /* turn on RF */
683                 RF_WriteReg(dev, 0x0, 0x009f); udelay(500);
684                 RF_WriteReg(dev, 0x4, 0x0972); udelay(500);
685
686                 /* turn on RF again */
687                 RF_WriteReg(dev, 0x0, 0x009f); udelay(500);
688                 RF_WriteReg(dev, 0x4, 0x0972); udelay(500);
689
690                 /* turn on BB */
691                 write_phy_ofdm(dev, 0x10, 0x40);
692                 write_phy_ofdm(dev, 0x12, 0x40);
693
694                 /* Avoid power down at init time. */
695                 write_nic_byte(dev, CONFIG4, priv->RFProgType);
696
697                 u1bTmp = read_nic_byte(dev, 0x24E);
698                 write_nic_byte(dev, 0x24E, (u1bTmp & (~(BIT5 | BIT6))));
699                 break;
700         case eRfSleep:
701                 for (QueueID = 0, i = 0; QueueID < 6;) {
702                         if (get_curr_tx_free_desc(dev, QueueID) ==
703                                                         priv->txringcount) {
704                                 QueueID++;
705                                 continue;
706                         } else {
707                                 priv->TxPollingTimes++;
708                                 if (priv->TxPollingTimes >=
709                                         LPS_MAX_SLEEP_WAITING_TIMES_87SE) {
710                                         bActionAllowed = false;
711                                         break;
712                                 } else
713                                         udelay(10);
714                         }
715                 }
716
717                 if (bActionAllowed) {
718                         /* turn off BB RXIQ matrix to cut off rx signal */
719                         write_phy_ofdm(dev, 0x10, 0x00);
720                         write_phy_ofdm(dev, 0x12, 0x00);
721
722                         /* turn off RF */
723                         RF_WriteReg(dev, 0x4, 0x0000);
724                         RF_WriteReg(dev, 0x0, 0x0000);
725
726                         /* turn off AFE except PLL */
727                         write_nic_byte(dev, 0x62, 0xff);
728                         write_nic_byte(dev, 0x54, 0xec);
729
730                         mdelay(1);
731
732                         {
733                                 int i = 0;
734                                 while (true) {
735                                         u8 tmp24F = read_nic_byte(dev, 0x24f);
736
737                                         if ((tmp24F == 0x01) ||
738                                                         (tmp24F == 0x09)) {
739                                                 bTurnOffBB = true;
740                                                 break;
741                                         } else {
742                                                 udelay(10);
743                                                 i++;
744                                                 priv->TxPollingTimes++;
745
746                                                 if (priv->TxPollingTimes >= LPS_MAX_SLEEP_WAITING_TIMES_87SE) {
747                                                         bTurnOffBB = false;
748                                                         break;
749                                                 } else
750                                                         udelay(10);
751                                         }
752                                 }
753                         }
754
755                         if (bTurnOffBB) {
756                                 /* turn off BB */
757                                 u1bTmp = read_nic_byte(dev, 0x24E);
758                                 write_nic_byte(dev, 0x24E,
759                                                 (u1bTmp | BIT5 | BIT6));
760
761                                 /* turn off AFE PLL */
762                                 write_nic_byte(dev, 0x54, 0xFC);
763                                 write_nic_word(dev, 0x37C, 0x00FC);
764                         }
765                 }
766                 break;
767         case eRfOff:
768                 for (QueueID = 0, i = 0; QueueID < 6;) {
769                         if (get_curr_tx_free_desc(dev, QueueID) ==
770                                         priv->txringcount) {
771                                 QueueID++;
772                                 continue;
773                         } else {
774                                 udelay(10);
775                                 i++;
776                         }
777
778                         if (i >= MAX_DOZE_WAITING_TIMES_85B)
779                                 break;
780                 }
781
782                 /* turn off BB RXIQ matrix to cut off rx signal */
783                 write_phy_ofdm(dev, 0x10, 0x00);
784                 write_phy_ofdm(dev, 0x12, 0x00);
785
786                 /* turn off RF */
787                 RF_WriteReg(dev, 0x4, 0x0000);
788                 RF_WriteReg(dev, 0x0, 0x0000);
789
790                 /* turn off AFE except PLL */
791                 write_nic_byte(dev, 0x62, 0xff);
792                 write_nic_byte(dev, 0x54, 0xec);
793
794                 mdelay(1);
795
796                 {
797                         int i = 0;
798
799                         while (true) {
800                                 u8 tmp24F = read_nic_byte(dev, 0x24f);
801
802                                 if ((tmp24F == 0x01) || (tmp24F == 0x09)) {
803                                         bTurnOffBB = true;
804                                         break;
805                                 } else {
806                                         bTurnOffBB = false;
807                                         udelay(10);
808                                         i++;
809                                 }
810
811                                 if (i > MAX_POLLING_24F_TIMES_87SE)
812                                         break;
813                         }
814                 }
815
816                 if (bTurnOffBB) {
817                         /* turn off BB */
818                         u1bTmp = read_nic_byte(dev, 0x24E);
819                         write_nic_byte(dev, 0x24E, (u1bTmp | BIT5 | BIT6));
820
821                         /* turn off AFE PLL (80M) */
822                         write_nic_byte(dev, 0x54, 0xFC);
823                         write_nic_word(dev, 0x37C, 0x00FC);
824                 }
825                 break;
826         }
827
828         btConfig3 &= ~(CONFIG3_PARM_En);
829         write_nic_byte(dev, CONFIG3, btConfig3);
830
831         btCR9346 &= ~(0xC0);
832         write_nic_byte(dev, CR9346, btCR9346);
833
834         if (bResult && bActionAllowed)
835                 priv->eRFPowerState = eRFPowerState;
836
837         priv->SetRFPowerStateInProgress = false;
838
839         return bResult && bActionAllowed;
840 }
841
842 void rtl8225z4_rf_sleep(struct net_device *dev)
843 {
844         MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
845 }
846
847 void rtl8225z4_rf_wakeup(struct net_device *dev)
848 {
849         MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_PS);
850 }