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