1605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu/*
2605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Radio tuning for RTL8225 on RTL8187
3605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu *
4605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
5605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
6605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu *
7605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Based on the r8187 driver, which is:
8605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2005 Andrea Merello <andreamrl@tiscali.it>, et al.
9605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu *
100aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * Magic delays, register offsets, and phy value tables below are
110aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * taken from the original r8187 driver sources.  Thanks to Realtek
120aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * for their support!
13605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu *
14605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * This program is free software; you can redistribute it and/or modify
15605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * it under the terms of the GNU General Public License version 2 as
16605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * published by the Free Software Foundation.
17605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu */
18605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
19605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <linux/init.h>
20605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <linux/usb.h>
21605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <net/mac80211.h>
22605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
23605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include "rtl8187.h"
243cfeb0c33f5cbcc6dde371392877ef3101b8f805John W. Linville#include "rtl8225.h"
25605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
26605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225_write_bitbang(struct ieee80211_hw *dev, u8 addr, u16 data)
27605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
28605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
29605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u16 reg80, reg84, reg82;
30605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u32 bangdata;
31605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
32605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
33605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	bangdata = (data << 4) | (addr & 0xf);
34605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
35605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput) & 0xfff3;
36605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable);
37605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
38605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x7);
39605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
40605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect);
41605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x7);
42605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
43605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
44605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
45605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
46605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80);
47605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
48605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
49605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 15; i >= 0; i--) {
50605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		u16 reg = reg80 | (bangdata & (1 << i)) >> i;
51605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
52605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (i & 1)
53605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg);
54605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
55605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg | (1 << 1));
56605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg | (1 << 1));
57605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
58605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (!(i & 1))
59605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg);
60605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
61605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
62605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
63605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
64605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
65605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
66605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84);
67605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
68605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
69899413de1a6c9f999f677526df5205a9a70dcd93Michael Wustatic void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data)
70605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
71605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
72605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u16 reg80, reg82, reg84;
73605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
74605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput);
75605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable);
76605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect);
77605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
78605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg80 &= ~(0x3 << 2);
79605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg84 &= ~0xF;
80605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
81605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x0007);
82605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x0007);
83605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
84605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
85605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
86605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
87605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
88605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80);
89605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
90605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
919be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville	mutex_lock(&priv->io_mutex);
929be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville
939be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville	priv->io_dmabuf->bits16 = data;
94605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
95605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
969be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville			addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data),
979be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville			HZ / 2);
989be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville
999be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville	mutex_unlock(&priv->io_mutex);
100605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
101605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
102605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(10);
103605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
104605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
105605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84);
106605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
107605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
108f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data)
109605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
110605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
111605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
112605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	if (priv->asic_rev)
113899413de1a6c9f999f677526df5205a9a70dcd93Michael Wu		rtl8225_write_8051(dev, addr, cpu_to_le16(data));
114605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	else
115605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_bitbang(dev, addr, data);
116605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
117605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
118f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic u16 rtl8225_read(struct ieee80211_hw *dev, u8 addr)
119605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
120605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
121605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u16 reg80, reg82, reg84, out;
122605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
123605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
124605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput);
125605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable);
126605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect);
127605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
128605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg80 &= ~0xF;
129605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
130605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x000F);
131605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x000F);
132605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
133605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2));
134605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(4);
135605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80);
136605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(5);
137605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
138605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 4; i >= 0; i--) {
139605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		u16 reg = reg80 | ((addr >> i) & 1);
140605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
141605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (!(i & 1)) {
142605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg);
143605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			udelay(1);
144605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		}
145605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
146605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
147605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg | (1 << 1));
148605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
149605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
150605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg | (1 << 1));
151605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
152605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
153605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (i & 1) {
154605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg);
155605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			udelay(1);
156605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		}
157605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
158605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
159605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
160605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			  reg80 | (1 << 3) | (1 << 1));
161605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
162605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
163605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			  reg80 | (1 << 3));
164605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
165605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
166605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			  reg80 | (1 << 3));
167605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
168605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
169605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	out = 0;
170605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 11; i >= 0; i--) {
171605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
172605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg80 | (1 << 3));
173605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(1);
174605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
175605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg80 | (1 << 3) | (1 << 1));
176605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
177605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
178605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg80 | (1 << 3) | (1 << 1));
179605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
180605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
181605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg80 | (1 << 3) | (1 << 1));
182605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
183605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
184605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (rtl818x_ioread16(priv, &priv->map->RFPinsInput) & (1 << 1))
185605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			out |= 1 << i;
186605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
187605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
188605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu				  reg80 | (1 << 3));
189605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		udelay(2);
190605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
191605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
192605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput,
193605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			  reg80 | (1 << 3) | (1 << 2));
194605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	udelay(2);
195605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
196605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82);
197605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84);
198605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x03A0);
199605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
200605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	return out;
201605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
202605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
203605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u16 rtl8225bcd_rxgain[] = {
204605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
205605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
206605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
207605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
208605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
209605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
210605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
211605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
212605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
213605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
214605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
215605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
216605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
217605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
218605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_agc[] = {
219605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
220605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96,
221605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e,
222605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86,
223605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e,
224605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36,
225605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e,
226605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26,
227605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e,
228605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16,
229605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
230605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06,
231605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01,
232605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
233605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
234605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
235605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
236605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
237605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_gain[] = {
238605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x88, 0x7c, 0xa5,	/* -82dBm */
239605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x88, 0x7c, 0xb5,	/* -82dBm */
240605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x88, 0x7c, 0xc5,	/* -82dBm */
241605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x33, 0x80, 0x79, 0xc5,	/* -78dBm */
242605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x43, 0x78, 0x76, 0xc5,	/* -74dBm */
243605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x53, 0x60, 0x73, 0xc5,	/* -70dBm */
244605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x63, 0x58, 0x70, 0xc5,	/* -66dBm */
245605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
246605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
247605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_threshold[] = {
248605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd
249605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
250605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
251605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_gain_cck_ofdm[] = {
252605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
253605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
254605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
255605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_cck[] = {
256605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
257605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
258605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
259605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
260605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
261605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
262605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
263605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
264605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_cck_ch14[] = {
265605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
266605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
267605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
268605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
269605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
270605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
271605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
272605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
273605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_ofdm[] = {
274605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
275605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
276605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
277605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u32 rtl8225_chan[] = {
278605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x085c, 0x08dc, 0x095c, 0x09dc, 0x0a5c, 0x0adc, 0x0b5c,
279605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0bdc, 0x0c5c, 0x0cdc, 0x0d5c, 0x0ddc, 0x0e5c, 0x0f72
280605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
281605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
282605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
283605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
284605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
285605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u8 cck_power, ofdm_power;
286605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	const u8 *tmp;
287605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u32 reg;
288605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
289605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
2908318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	cck_power = priv->channels[channel - 1].hw_value & 0xF;
2918318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	ofdm_power = priv->channels[channel - 1].hw_value >> 4;
292605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
293605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	cck_power = min(cck_power, (u8)11);
294eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger	if (ofdm_power > (u8)15)
295eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger		ofdm_power = 25;
296eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger	else
297eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger		ofdm_power += 10;
298605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
299605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
300605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			 rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1);
301605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
302605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	if (channel == 14)
303605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		tmp = &rtl8225_tx_power_cck_ch14[(cck_power % 6) * 8];
304605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	else
305605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		tmp = &rtl8225_tx_power_cck[(cck_power % 6) * 8];
306605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
307605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < 8; i++)
308605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++);
309605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
310605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1); // FIXME: optional?
311605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
312605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	/* anaparam2 on */
313605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
314605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg = rtl818x_ioread8(priv, &priv->map->CONFIG3);
315e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->CONFIG3,
316e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			reg | RTL818X_CONFIG3_ANAPARAM_WRITE);
3174ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski	rtl818x_iowrite32(priv, &priv->map->ANAPARAM2,
3184ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski			  RTL8187_RTL8225_ANAPARAM2_ON);
319e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->CONFIG3,
320e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			reg & ~RTL818X_CONFIG3_ANAPARAM_WRITE);
321605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
322605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
323605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 2, 0x42);
324605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 6, 0x00);
325605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 8, 0x00);
326605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
327605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM,
328605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			 rtl8225_tx_gain_cck_ofdm[ofdm_power / 6] >> 1);
329605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
330605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	tmp = &rtl8225_tx_power_ofdm[ofdm_power % 6];
331605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
332605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 5, *tmp);
333605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 7, *tmp);
334605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
335605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
336605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
337605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
338f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_init(struct ieee80211_hw *dev)
339605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
340605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
341605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
342605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
343946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x067);
344946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x1, 0xFE0);
345946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x2, 0x44D);
346946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x3, 0x441);
347946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x4, 0x486);
348946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x5, 0xBC0);
349946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x6, 0xAE6);
350946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x7, 0x82A);
351946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x8, 0x01F);
352946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x9, 0x334);
353946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xA, 0xFD4);
354946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xB, 0x391);
355946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xC, 0x050);
356946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xD, 0x6DB);
357946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xE, 0x029);
358605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0xF, 0x914); msleep(100);
359605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
360605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x2, 0xC4D); msleep(200);
361605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x2, 0x44D); msleep(200);
362605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
363605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	if (!(rtl8225_read(dev, 6) & (1 << 7))) {
364605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x02, 0x0c4d);
365605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		msleep(200);
366605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x02, 0x044d);
367605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		msleep(100);
368605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (!(rtl8225_read(dev, 6) & (1 << 7)))
3695db5584441c2dceb75696fb31a44ac7b9b925359Joe Perches			wiphy_warn(dev->wiphy, "RF Calibration Failed! %x\n",
370c96c31e499b70964cfc88744046c998bb710e4b8Joe Perches				   rtl8225_read(dev, 6));
371605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
372605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
373605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x127);
374605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
375605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < ARRAY_SIZE(rtl8225bcd_rxgain); i++) {
376605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x1, i + 1);
377605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x2, rtl8225bcd_rxgain[i]);
378605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
379605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
380605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x027);
381605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x22F);
382605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
383605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < ARRAY_SIZE(rtl8225_agc); i++) {
384605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_ofdm(dev, 0xB, rtl8225_agc[i]);
385605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_ofdm(dev, 0xA, 0x80 + i);
386605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
387605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
388605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
389605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
39035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x00, 0x01);
39135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x01, 0x02);
39235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x02, 0x42);
39335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x03, 0x00);
39435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x04, 0x00);
39535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x05, 0x00);
39635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x06, 0x40);
39735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x07, 0x00);
39835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x08, 0x40);
39935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x09, 0xfe);
40035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0a, 0x09);
40135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0b, 0x80);
40235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0c, 0x01);
40335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0e, 0xd3);
40435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0f, 0x38);
40535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x10, 0x84);
40635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x11, 0x06);
40735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x12, 0x20);
40835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x13, 0x20);
40935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x14, 0x00);
41035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x15, 0x40);
41135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x16, 0x00);
41235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x17, 0x40);
41335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x18, 0xef);
41435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x19, 0x19);
41535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1a, 0x20);
41635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1b, 0x76);
41735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1c, 0x04);
41835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1e, 0x95);
41935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1f, 0x75);
42035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x20, 0x1f);
42135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x21, 0x27);
42235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x22, 0x16);
42335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x24, 0x46);
42435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x25, 0x20);
42535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x26, 0x90);
42635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x27, 0x88);
427605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
428605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x0d, rtl8225_gain[2 * 4]);
429605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225_gain[2 * 4 + 2]);
430605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225_gain[2 * 4 + 3]);
431605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x23, rtl8225_gain[2 * 4 + 1]);
432605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
433a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x00, 0x98);
434a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x03, 0x20);
435a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x04, 0x7e);
436a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x05, 0x12);
437a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x06, 0xfc);
438a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x07, 0x78);
439a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x08, 0x2e);
440a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x10, 0x9b);
441a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x11, 0x88);
442a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x12, 0x47);
443605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x13, 0xd0);
444605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x19, 0x00);
445605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x1a, 0xa0);
446605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x1b, 0x08);
447605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x40, 0x86);
448a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x41, 0x8d);
449a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x42, 0x15);
450a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x43, 0x18);
451a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x44, 0x1f);
452a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x45, 0x1e);
453a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x46, 0x1a);
454a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x47, 0x15);
455a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x48, 0x10);
456a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x49, 0x0a);
457a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4a, 0x05);
458a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4b, 0x02);
459a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4c, 0x05);
460605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
461605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TESTR, 0x0D);
462605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
463605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_rf_set_tx_power(dev, 1);
464605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
465605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	/* RX antenna default to A */
466a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x10, 0x9b);			/* B: 0xDB */
46735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x26, 0x90);		/* B: 0x10 */
468605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
469605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03);	/* B: 0x00 */
470605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
471605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002);
472605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
473605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	/* set sensitivity */
474605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0c, 0x50);
475605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x0d, rtl8225_gain[2 * 4]);
476605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225_gain[2 * 4 + 2]);
477605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225_gain[2 * 4 + 3]);
478605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x23, rtl8225_gain[2 * 4 + 1]);
479605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x41, rtl8225_threshold[2]);
480605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
481605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
482e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const u8 rtl8225z2_agc[] = {
483e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51, 0x4f,
484e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x39, 0x37,
485e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25, 0x23, 0x21, 0x1f,
486e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0b, 0x09, 0x07,
487e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
488e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x01, 0x01, 0x01, 0x01, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
489e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28,
490e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x28, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d,
491e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30,
492e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
493e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31
494e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung};
495e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const u8 rtl8225z2_ofdm[] = {
496e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60,
497e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00,
498e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26,
499e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3,
500e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x0a, 0xe1, 0x2C, 0x8a, 0x86, 0x83, 0x34, 0x0f,
501e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00,
502e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e,
503e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x6d, 0x3c, 0xfb, 0x07
504e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung};
505e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
506605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_cck_ch14[] = {
507e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00,
508e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
509e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
510e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00
511605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
512605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
513605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_cck[] = {
514e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04,
515e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
516e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
517e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
518605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
519605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
520605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_ofdm[] = {
521605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x42, 0x00, 0x40, 0x00, 0x40
522605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
523605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
524605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_gain_cck_ofdm[] = {
525605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
526605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
527605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
528605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
529605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
530605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
531605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
532605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
533605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225z2_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
534605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
535605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
536605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u8 cck_power, ofdm_power;
537605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	const u8 *tmp;
538605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	u32 reg;
539605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
540605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
5418318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	cck_power = priv->channels[channel - 1].hw_value & 0xF;
5428318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	ofdm_power = priv->channels[channel - 1].hw_value >> 4;
543605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
544605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	cck_power = min(cck_power, (u8)15);
545605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	cck_power += priv->txpwr_base & 0xF;
546605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	cck_power = min(cck_power, (u8)35);
547605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
548eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger	if (ofdm_power > (u8)15)
549eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger		ofdm_power = 25;
550eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger	else
551eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger		ofdm_power += 10;
552605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	ofdm_power += priv->txpwr_base >> 4;
553605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	ofdm_power = min(ofdm_power, (u8)35);
554605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
555605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	if (channel == 14)
556605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		tmp = rtl8225z2_tx_power_cck_ch14;
557605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	else
558605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		tmp = rtl8225z2_tx_power_cck;
559605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
560605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < 8; i++)
561605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++);
562605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
563605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
564605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			 rtl8225z2_tx_gain_cck_ofdm[cck_power]);
565605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
566605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
567605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	/* anaparam2 on */
568605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
569605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	reg = rtl818x_ioread8(priv, &priv->map->CONFIG3);
570e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->CONFIG3,
571e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			reg | RTL818X_CONFIG3_ANAPARAM_WRITE);
5724ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski	rtl818x_iowrite32(priv, &priv->map->ANAPARAM2,
5734ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski			  RTL8187_RTL8225_ANAPARAM2_ON);
574e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->CONFIG3,
575e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			reg & ~RTL818X_CONFIG3_ANAPARAM_WRITE);
576605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
577605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
578605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 2, 0x42);
579605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 5, 0x00);
580605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 6, 0x40);
581605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 7, 0x00);
582605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 8, 0x40);
583605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
584605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM,
585605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu			 rtl8225z2_tx_gain_cck_ofdm[ofdm_power]);
586605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
587605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
588605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
589e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic void rtl8225z2_b_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
590e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung{
591e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	struct rtl8187_priv *priv = dev->priv;
592e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	u8 cck_power, ofdm_power;
593e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	const u8 *tmp;
594e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	int i;
595e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
596e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	cck_power = priv->channels[channel - 1].hw_value & 0xF;
597e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	ofdm_power = priv->channels[channel - 1].hw_value >> 4;
598e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
599e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (cck_power > 15)
600e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		cck_power = (priv->hw_rev == RTL8187BvB) ? 15 : 22;
601e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	else
602e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		cck_power += (priv->hw_rev == RTL8187BvB) ? 0 : 7;
603e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	cck_power += priv->txpwr_base & 0xF;
604e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	cck_power = min(cck_power, (u8)35);
605e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
606e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (ofdm_power > 15)
607e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		ofdm_power = (priv->hw_rev == RTL8187BvB) ? 17 : 25;
608e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	else
609e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		ofdm_power += (priv->hw_rev == RTL8187BvB) ? 2 : 10;
610e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	ofdm_power += (priv->txpwr_base >> 4) & 0xF;
611e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	ofdm_power = min(ofdm_power, (u8)35);
612e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
613e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (channel == 14)
614e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		tmp = rtl8225z2_tx_power_cck_ch14;
615e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	else
616e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		tmp = rtl8225z2_tx_power_cck;
617e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
618e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (priv->hw_rev == RTL8187BvB) {
619e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		if (cck_power <= 6)
620e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			; /* do nothing */
621e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		else if (cck_power <= 11)
622e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			tmp += 8;
623e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		else
624e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			tmp += 16;
625e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	} else {
626e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		if (cck_power <= 5)
627e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			; /* do nothing */
628e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		else if (cck_power <= 11)
629e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			tmp += 8;
630e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		else if (cck_power <= 17)
631e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			tmp += 16;
632e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		else
633e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			tmp += 24;
634e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	}
635e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
636e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	for (i = 0; i < 8; i++)
637e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++);
638e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
639e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
640c4832467a5c8c2ae96d6dad882be4d4ab9eefad7Larry Finger			 rtl8225z2_tx_gain_cck_ofdm[cck_power] << 1);
641e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	msleep(1);
642e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
643e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM,
644e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			 rtl8225z2_tx_gain_cck_ofdm[ofdm_power] << 1);
645e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (priv->hw_rev == RTL8187BvB) {
646e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		if (ofdm_power <= 11) {
647e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x87, 0x60);
648e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x89, 0x60);
649e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		} else {
650e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x87, 0x5c);
651e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x89, 0x5c);
652e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		}
653e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	} else {
654e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		if (ofdm_power <= 11) {
655e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x87, 0x5c);
656e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x89, 0x5c);
657e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		} else if (ofdm_power <= 17) {
658e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x87, 0x54);
659e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x89, 0x54);
660e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		} else {
661e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x87, 0x50);
662e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			rtl8225_write_phy_ofdm(dev, 0x89, 0x50);
663e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		}
664e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	}
665e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	msleep(1);
666e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung}
667e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
668605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u16 rtl8225z2_rxgain[] = {
669605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
670605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
671605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
672605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
673605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
674605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
675605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
676605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
677605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
678605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
679605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
680605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
681605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
682605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
683605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_gain_bg[] = {
684605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x15, 0xa5, /* -82-1dBm */
685605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x15, 0xb5, /* -82-2dBm */
686605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x23, 0x15, 0xc5, /* -82-3dBm */
687605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x33, 0x15, 0xc5, /* -78dBm */
688605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x43, 0x15, 0xc5, /* -74dBm */
689605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x53, 0x15, 0xc5, /* -70dBm */
690605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	0x63, 0x15, 0xc5  /* -66dBm */
691605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu};
692605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
693f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225z2_rf_init(struct ieee80211_hw *dev)
694605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
695605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
696605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	int i;
697605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
698946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x2BF);
699946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x1, 0xEE0);
700946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x2, 0x44D);
701946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x3, 0x441);
702946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x4, 0x8C3);
703946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x5, 0xC72);
704946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x6, 0x0E6);
705946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x7, 0x82A);
706946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x8, 0x03F);
707946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x9, 0x335);
708946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xa, 0x9D4);
709946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xb, 0x7BB);
710946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xc, 0x850);
711946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xd, 0xCDF);
712946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xe, 0x02B);
713946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xf, 0x114);
714946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	msleep(100);
715605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
716605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x1B7);
717605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
718605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < ARRAY_SIZE(rtl8225z2_rxgain); i++) {
719605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x1, i + 1);
720605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x2, rtl8225z2_rxgain[i]);
721605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
722605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
723605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x3, 0x080);
724605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x5, 0x004);
725605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x0B7);
726605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x2, 0xc4D);
727605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
728605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(200);
729605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x2, 0x44D);
730605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(100);
731605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
732605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	if (!(rtl8225_read(dev, 6) & (1 << 7))) {
733605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x02, 0x0C4D);
734605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		msleep(200);
735605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write(dev, 0x02, 0x044D);
736605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		msleep(100);
737605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		if (!(rtl8225_read(dev, 6) & (1 << 7)))
7385db5584441c2dceb75696fb31a44ac7b9b925359Joe Perches			wiphy_warn(dev->wiphy, "RF Calibration Failed! %x\n",
739c96c31e499b70964cfc88744046c998bb710e4b8Joe Perches				   rtl8225_read(dev, 6));
740605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
741605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
742605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(200);
743605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
744605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write(dev, 0x0, 0x2BF);
745605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
746605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	for (i = 0; i < ARRAY_SIZE(rtl8225_agc); i++) {
747605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_ofdm(dev, 0xB, rtl8225_agc[i]);
748605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu		rtl8225_write_phy_ofdm(dev, 0xA, 0x80 + i);
749605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	}
750605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
751605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
752605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
75335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x00, 0x01);
75435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x01, 0x02);
75535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x02, 0x42);
75635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x03, 0x00);
75735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x04, 0x00);
75835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x05, 0x00);
75935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x06, 0x40);
76035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x07, 0x00);
76135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x08, 0x40);
76235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x09, 0xfe);
76335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0a, 0x08);
76435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0b, 0x80);
76535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0c, 0x01);
766605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x0d, 0x43);
76735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0e, 0xd3);
76835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x0f, 0x38);
76935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x10, 0x84);
77035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x11, 0x07);
77135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x12, 0x20);
77235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x13, 0x20);
77335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x14, 0x00);
77435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x15, 0x40);
77535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x16, 0x00);
77635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x17, 0x40);
77735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x18, 0xef);
77835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x19, 0x19);
77935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1a, 0x20);
78035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1b, 0x15);
78135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1c, 0x04);
78235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1d, 0xc5);
78335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1e, 0x95);
78435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x1f, 0x75);
78535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x20, 0x1f);
78635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x21, 0x17);
78735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x22, 0x16);
78835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x23, 0x80);
78935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x24, 0x46);
79035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x25, 0x00);
79135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x26, 0x90);
79235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x27, 0x88);
793605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
794605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x0b, rtl8225z2_gain_bg[4 * 3]);
795605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225z2_gain_bg[4 * 3 + 1]);
796605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225z2_gain_bg[4 * 3 + 2]);
797605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_ofdm(dev, 0x21, 0x37);
798605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
799a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x00, 0x98);
800a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x03, 0x20);
801a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x04, 0x7e);
802a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x05, 0x12);
803a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x06, 0xfc);
804a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x07, 0x78);
805a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x08, 0x2e);
806a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x10, 0x9b);
807a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x11, 0x88);
808a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x12, 0x47);
809605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x13, 0xd0);
810605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x19, 0x00);
811605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x1a, 0xa0);
812605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x1b, 0x08);
813605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225_write_phy_cck(dev, 0x40, 0x86);
814a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x41, 0x8d);
815a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x42, 0x15);
816a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x43, 0x18);
817a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x44, 0x36);
818a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x45, 0x35);
819a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x46, 0x2e);
820a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x47, 0x25);
821a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x48, 0x1c);
822a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x49, 0x12);
823a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4a, 0x09);
824a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4b, 0x04);
825a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x4c, 0x05);
826605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
827605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, (u8 *)0xFF5B, 0x0D); msleep(1);
828605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
829605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl8225z2_rf_set_tx_power(dev, 1);
830605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
831605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	/* RX antenna default to A */
832a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger	rtl8225_write_phy_cck(dev, 0x10, 0x9b);			/* B: 0xDB */
83335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x26, 0x90);		/* B: 0x10 */
834605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
835605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03);	/* B: 0x00 */
836605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(1);
837605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002);
838605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
839605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
840e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic void rtl8225z2_b_rf_init(struct ieee80211_hw *dev)
841e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung{
842e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	struct rtl8187_priv *priv = dev->priv;
843e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	int i;
844e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
845946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x0B7);
846946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x1, 0xEE0);
847946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x2, 0x44D);
848946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x3, 0x441);
849946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x4, 0x8C3);
850946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x5, 0xC72);
851946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x6, 0x0E6);
852946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x7, 0x82A);
853946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x8, 0x03F);
854946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x9, 0x335);
855946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xa, 0x9D4);
856946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xb, 0x7BB);
857946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xc, 0x850);
858946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xd, 0xCDF);
859946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xe, 0x02B);
860946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0xf, 0x114);
861946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger
862946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x1B7);
863e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
864e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	for (i = 0; i < ARRAY_SIZE(rtl8225z2_rxgain); i++) {
865946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger		rtl8225_write(dev, 0x1, i + 1);
866946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger		rtl8225_write(dev, 0x2, rtl8225z2_rxgain[i]);
867e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	}
868e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
869946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x3, 0x080);
870946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x5, 0x004);
871946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x0B7);
872e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
873946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x2, 0xC4D);
874e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
875946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x2, 0x44D);
876946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x0, 0x2BF);
877e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
878e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, 0x03);
879e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM, 0x07);
880e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03);
881e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
882e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl8225_write_phy_ofdm(dev, 0x80, 0x12);
883e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	for (i = 0; i < ARRAY_SIZE(rtl8225z2_agc); i++) {
884e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write_phy_ofdm(dev, 0xF, rtl8225z2_agc[i]);
885e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write_phy_ofdm(dev, 0xE, 0x80 + i);
886e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write_phy_ofdm(dev, 0xE, 0);
887e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	}
888e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	rtl8225_write_phy_ofdm(dev, 0x80, 0x10);
889e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
890e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	for (i = 0; i < ARRAY_SIZE(rtl8225z2_ofdm); i++)
891e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write_phy_ofdm(dev, i, rtl8225z2_ofdm[i]);
892e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
89335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x97, 0x46);
89435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0xa4, 0xb6);
89535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_ofdm(dev, 0x85, 0xfc);
89635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger	rtl8225_write_phy_cck(dev, 0xc1, 0x88);
897e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung}
898e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
899f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_stop(struct ieee80211_hw *dev)
900605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
901946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger	rtl8225_write(dev, 0x4, 0x1f);
902605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
903605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
904f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
905f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu				   struct ieee80211_conf *conf)
906605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{
907605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	struct rtl8187_priv *priv = dev->priv;
9088318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	int chan = ieee80211_frequency_to_channel(conf->channel->center_freq);
909605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
910f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	if (priv->rf->init == rtl8225_rf_init)
9118318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg		rtl8225_rf_set_tx_power(dev, chan);
912e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	else if (priv->rf->init == rtl8225z2_rf_init)
9138318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg		rtl8225z2_rf_set_tx_power(dev, chan);
914e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	else
915e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225z2_b_rf_set_tx_power(dev, chan);
916605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu
9178318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg	rtl8225_write(dev, 0x7, rtl8225_chan[chan - 1]);
918605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu	msleep(10);
919605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}
920f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
921f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic const struct rtl818x_rf_ops rtl8225_ops = {
922f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.name		= "rtl8225",
923f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.init		= rtl8225_rf_init,
924f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.stop		= rtl8225_rf_stop,
925f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.set_chan	= rtl8225_rf_set_channel
926f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu};
927f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
928f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic const struct rtl818x_rf_ops rtl8225z2_ops = {
929f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.name		= "rtl8225z2",
930f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.init		= rtl8225z2_rf_init,
931f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.stop		= rtl8225_rf_stop,
932f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	.set_chan	= rtl8225_rf_set_channel
933f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu};
934f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
935e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const struct rtl818x_rf_ops rtl8225z2_b_ops = {
936e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	.name		= "rtl8225z2",
937e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	.init		= rtl8225z2_b_rf_init,
938e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	.stop		= rtl8225_rf_stop,
939e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	.set_chan	= rtl8225_rf_set_channel
940e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung};
941e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung
942f653211197f3841f383fa9757ef8ce182c6cf627Michael Wuconst struct rtl818x_rf_ops * rtl8187_detect_rf(struct ieee80211_hw *dev)
943f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu{
944f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu	u16 reg8, reg9;
945e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	struct rtl8187_priv *priv = dev->priv;
946f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
947e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	if (!priv->is_rtl8187b) {
948e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write(dev, 0, 0x1B7);
949f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
950e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		reg8 = rtl8225_read(dev, 8);
951e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		reg9 = rtl8225_read(dev, 9);
952f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
953e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		rtl8225_write(dev, 0, 0x0B7);
954f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
955e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		if (reg8 != 0x588 || reg9 != 0x700)
956e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung			return &rtl8225_ops;
957f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu
958e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		return &rtl8225z2_ops;
959e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung	} else
960e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung		return &rtl8225z2_b_ops;
961f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu}
962