1/*
2	Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
3	Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
4	Copyright (C) 2009 Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
5	Copyright (C) 2009 Gertjan van Wingerde <gwingerde@gmail.com>
6
7	Based on the original rt2800pci.c and rt2800usb.c.
8	  Copyright (C) 2009 Alban Browaeys <prahal@yahoo.com>
9	  Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
10	  Copyright (C) 2009 Luis Correia <luis.f.correia@gmail.com>
11	  Copyright (C) 2009 Mattias Nissler <mattias.nissler@gmx.de>
12	  Copyright (C) 2009 Mark Asselstine <asselsm@gmail.com>
13	  Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com>
14	  <http://rt2x00.serialmonkey.com>
15
16	This program is free software; you can redistribute it and/or modify
17	it under the terms of the GNU General Public License as published by
18	the Free Software Foundation; either version 2 of the License, or
19	(at your option) any later version.
20
21	This program is distributed in the hope that it will be useful,
22	but WITHOUT ANY WARRANTY; without even the implied warranty of
23	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24	GNU General Public License for more details.
25
26	You should have received a copy of the GNU General Public License
27	along with this program; if not, see <http://www.gnu.org/licenses/>.
28 */
29
30/*
31	Module: rt2800lib
32	Abstract: rt2800 generic device routines.
33 */
34
35#include <linux/crc-ccitt.h>
36#include <linux/kernel.h>
37#include <linux/module.h>
38#include <linux/slab.h>
39
40#include "rt2x00.h"
41#include "rt2800lib.h"
42#include "rt2800.h"
43
44/*
45 * Register access.
46 * All access to the CSR registers will go through the methods
47 * rt2800_register_read and rt2800_register_write.
48 * BBP and RF register require indirect register access,
49 * and use the CSR registers BBPCSR and RFCSR to achieve this.
50 * These indirect registers work with busy bits,
51 * and we will try maximal REGISTER_BUSY_COUNT times to access
52 * the register while taking a REGISTER_BUSY_DELAY us delay
53 * between each attampt. When the busy bit is still set at that time,
54 * the access attempt is considered to have failed,
55 * and we will print an error.
56 * The _lock versions must be used if you already hold the csr_mutex
57 */
58#define WAIT_FOR_BBP(__dev, __reg) \
59	rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
60#define WAIT_FOR_RFCSR(__dev, __reg) \
61	rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg))
62#define WAIT_FOR_RF(__dev, __reg) \
63	rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
64#define WAIT_FOR_MCU(__dev, __reg) \
65	rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \
66			    H2M_MAILBOX_CSR_OWNER, (__reg))
67
68static inline bool rt2800_is_305x_soc(struct rt2x00_dev *rt2x00dev)
69{
70	/* check for rt2872 on SoC */
71	if (!rt2x00_is_soc(rt2x00dev) ||
72	    !rt2x00_rt(rt2x00dev, RT2872))
73		return false;
74
75	/* we know for sure that these rf chipsets are used on rt305x boards */
76	if (rt2x00_rf(rt2x00dev, RF3020) ||
77	    rt2x00_rf(rt2x00dev, RF3021) ||
78	    rt2x00_rf(rt2x00dev, RF3022))
79		return true;
80
81	rt2x00_warn(rt2x00dev, "Unknown RF chipset on rt305x\n");
82	return false;
83}
84
85static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
86			     const unsigned int word, const u8 value)
87{
88	u32 reg;
89
90	mutex_lock(&rt2x00dev->csr_mutex);
91
92	/*
93	 * Wait until the BBP becomes available, afterwards we
94	 * can safely write the new data into the register.
95	 */
96	if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
97		reg = 0;
98		rt2x00_set_field32(&reg, BBP_CSR_CFG_VALUE, value);
99		rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
100		rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
101		rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 0);
102		rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
103
104		rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
105	}
106
107	mutex_unlock(&rt2x00dev->csr_mutex);
108}
109
110static void rt2800_bbp_read(struct rt2x00_dev *rt2x00dev,
111			    const unsigned int word, u8 *value)
112{
113	u32 reg;
114
115	mutex_lock(&rt2x00dev->csr_mutex);
116
117	/*
118	 * Wait until the BBP becomes available, afterwards we
119	 * can safely write the read request into the register.
120	 * After the data has been written, we wait until hardware
121	 * returns the correct value, if at any time the register
122	 * doesn't become available in time, reg will be 0xffffffff
123	 * which means we return 0xff to the caller.
124	 */
125	if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
126		reg = 0;
127		rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
128		rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
129		rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 1);
130		rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
131
132		rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
133
134		WAIT_FOR_BBP(rt2x00dev, &reg);
135	}
136
137	*value = rt2x00_get_field32(reg, BBP_CSR_CFG_VALUE);
138
139	mutex_unlock(&rt2x00dev->csr_mutex);
140}
141
142static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev,
143			       const unsigned int word, const u8 value)
144{
145	u32 reg;
146
147	mutex_lock(&rt2x00dev->csr_mutex);
148
149	/*
150	 * Wait until the RFCSR becomes available, afterwards we
151	 * can safely write the new data into the register.
152	 */
153	if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
154		reg = 0;
155		rt2x00_set_field32(&reg, RF_CSR_CFG_DATA, value);
156		rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
157		rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
158		rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
159
160		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
161	}
162
163	mutex_unlock(&rt2x00dev->csr_mutex);
164}
165
166static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
167			      const unsigned int word, u8 *value)
168{
169	u32 reg;
170
171	mutex_lock(&rt2x00dev->csr_mutex);
172
173	/*
174	 * Wait until the RFCSR becomes available, afterwards we
175	 * can safely write the read request into the register.
176	 * After the data has been written, we wait until hardware
177	 * returns the correct value, if at any time the register
178	 * doesn't become available in time, reg will be 0xffffffff
179	 * which means we return 0xff to the caller.
180	 */
181	if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
182		reg = 0;
183		rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
184		rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 0);
185		rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
186
187		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
188
189		WAIT_FOR_RFCSR(rt2x00dev, &reg);
190	}
191
192	*value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
193
194	mutex_unlock(&rt2x00dev->csr_mutex);
195}
196
197static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
198			    const unsigned int word, const u32 value)
199{
200	u32 reg;
201
202	mutex_lock(&rt2x00dev->csr_mutex);
203
204	/*
205	 * Wait until the RF becomes available, afterwards we
206	 * can safely write the new data into the register.
207	 */
208	if (WAIT_FOR_RF(rt2x00dev, &reg)) {
209		reg = 0;
210		rt2x00_set_field32(&reg, RF_CSR_CFG0_REG_VALUE_BW, value);
211		rt2x00_set_field32(&reg, RF_CSR_CFG0_STANDBYMODE, 0);
212		rt2x00_set_field32(&reg, RF_CSR_CFG0_SEL, 0);
213		rt2x00_set_field32(&reg, RF_CSR_CFG0_BUSY, 1);
214
215		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG0, reg);
216		rt2x00_rf_write(rt2x00dev, word, value);
217	}
218
219	mutex_unlock(&rt2x00dev->csr_mutex);
220}
221
222static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
223	[EEPROM_CHIP_ID]		= 0x0000,
224	[EEPROM_VERSION]		= 0x0001,
225	[EEPROM_MAC_ADDR_0]		= 0x0002,
226	[EEPROM_MAC_ADDR_1]		= 0x0003,
227	[EEPROM_MAC_ADDR_2]		= 0x0004,
228	[EEPROM_NIC_CONF0]		= 0x001a,
229	[EEPROM_NIC_CONF1]		= 0x001b,
230	[EEPROM_FREQ]			= 0x001d,
231	[EEPROM_LED_AG_CONF]		= 0x001e,
232	[EEPROM_LED_ACT_CONF]		= 0x001f,
233	[EEPROM_LED_POLARITY]		= 0x0020,
234	[EEPROM_NIC_CONF2]		= 0x0021,
235	[EEPROM_LNA]			= 0x0022,
236	[EEPROM_RSSI_BG]		= 0x0023,
237	[EEPROM_RSSI_BG2]		= 0x0024,
238	[EEPROM_TXMIXER_GAIN_BG]	= 0x0024, /* overlaps with RSSI_BG2 */
239	[EEPROM_RSSI_A]			= 0x0025,
240	[EEPROM_RSSI_A2]		= 0x0026,
241	[EEPROM_TXMIXER_GAIN_A]		= 0x0026, /* overlaps with RSSI_A2 */
242	[EEPROM_EIRP_MAX_TX_POWER]	= 0x0027,
243	[EEPROM_TXPOWER_DELTA]		= 0x0028,
244	[EEPROM_TXPOWER_BG1]		= 0x0029,
245	[EEPROM_TXPOWER_BG2]		= 0x0030,
246	[EEPROM_TSSI_BOUND_BG1]		= 0x0037,
247	[EEPROM_TSSI_BOUND_BG2]		= 0x0038,
248	[EEPROM_TSSI_BOUND_BG3]		= 0x0039,
249	[EEPROM_TSSI_BOUND_BG4]		= 0x003a,
250	[EEPROM_TSSI_BOUND_BG5]		= 0x003b,
251	[EEPROM_TXPOWER_A1]		= 0x003c,
252	[EEPROM_TXPOWER_A2]		= 0x0053,
253	[EEPROM_TSSI_BOUND_A1]		= 0x006a,
254	[EEPROM_TSSI_BOUND_A2]		= 0x006b,
255	[EEPROM_TSSI_BOUND_A3]		= 0x006c,
256	[EEPROM_TSSI_BOUND_A4]		= 0x006d,
257	[EEPROM_TSSI_BOUND_A5]		= 0x006e,
258	[EEPROM_TXPOWER_BYRATE]		= 0x006f,
259	[EEPROM_BBP_START]		= 0x0078,
260};
261
262static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
263	[EEPROM_CHIP_ID]		= 0x0000,
264	[EEPROM_VERSION]		= 0x0001,
265	[EEPROM_MAC_ADDR_0]		= 0x0002,
266	[EEPROM_MAC_ADDR_1]		= 0x0003,
267	[EEPROM_MAC_ADDR_2]		= 0x0004,
268	[EEPROM_NIC_CONF0]		= 0x001a,
269	[EEPROM_NIC_CONF1]		= 0x001b,
270	[EEPROM_NIC_CONF2]		= 0x001c,
271	[EEPROM_EIRP_MAX_TX_POWER]	= 0x0020,
272	[EEPROM_FREQ]			= 0x0022,
273	[EEPROM_LED_AG_CONF]		= 0x0023,
274	[EEPROM_LED_ACT_CONF]		= 0x0024,
275	[EEPROM_LED_POLARITY]		= 0x0025,
276	[EEPROM_LNA]			= 0x0026,
277	[EEPROM_EXT_LNA2]		= 0x0027,
278	[EEPROM_RSSI_BG]		= 0x0028,
279	[EEPROM_RSSI_BG2]		= 0x0029,
280	[EEPROM_RSSI_A]			= 0x002a,
281	[EEPROM_RSSI_A2]		= 0x002b,
282	[EEPROM_TXPOWER_BG1]		= 0x0030,
283	[EEPROM_TXPOWER_BG2]		= 0x0037,
284	[EEPROM_EXT_TXPOWER_BG3]	= 0x003e,
285	[EEPROM_TSSI_BOUND_BG1]		= 0x0045,
286	[EEPROM_TSSI_BOUND_BG2]		= 0x0046,
287	[EEPROM_TSSI_BOUND_BG3]		= 0x0047,
288	[EEPROM_TSSI_BOUND_BG4]		= 0x0048,
289	[EEPROM_TSSI_BOUND_BG5]		= 0x0049,
290	[EEPROM_TXPOWER_A1]		= 0x004b,
291	[EEPROM_TXPOWER_A2]		= 0x0065,
292	[EEPROM_EXT_TXPOWER_A3]		= 0x007f,
293	[EEPROM_TSSI_BOUND_A1]		= 0x009a,
294	[EEPROM_TSSI_BOUND_A2]		= 0x009b,
295	[EEPROM_TSSI_BOUND_A3]		= 0x009c,
296	[EEPROM_TSSI_BOUND_A4]		= 0x009d,
297	[EEPROM_TSSI_BOUND_A5]		= 0x009e,
298	[EEPROM_TXPOWER_BYRATE]		= 0x00a0,
299};
300
301static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev,
302					     const enum rt2800_eeprom_word word)
303{
304	const unsigned int *map;
305	unsigned int index;
306
307	if (WARN_ONCE(word >= EEPROM_WORD_COUNT,
308		      "%s: invalid EEPROM word %d\n",
309		      wiphy_name(rt2x00dev->hw->wiphy), word))
310		return 0;
311
312	if (rt2x00_rt(rt2x00dev, RT3593))
313		map = rt2800_eeprom_map_ext;
314	else
315		map = rt2800_eeprom_map;
316
317	index = map[word];
318
319	/* Index 0 is valid only for EEPROM_CHIP_ID.
320	 * Otherwise it means that the offset of the
321	 * given word is not initialized in the map,
322	 * or that the field is not usable on the
323	 * actual chipset.
324	 */
325	WARN_ONCE(word != EEPROM_CHIP_ID && index == 0,
326		  "%s: invalid access of EEPROM word %d\n",
327		  wiphy_name(rt2x00dev->hw->wiphy), word);
328
329	return index;
330}
331
332static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev,
333				const enum rt2800_eeprom_word word)
334{
335	unsigned int index;
336
337	index = rt2800_eeprom_word_index(rt2x00dev, word);
338	return rt2x00_eeprom_addr(rt2x00dev, index);
339}
340
341static void rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev,
342			       const enum rt2800_eeprom_word word, u16 *data)
343{
344	unsigned int index;
345
346	index = rt2800_eeprom_word_index(rt2x00dev, word);
347	rt2x00_eeprom_read(rt2x00dev, index, data);
348}
349
350static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev,
351				const enum rt2800_eeprom_word word, u16 data)
352{
353	unsigned int index;
354
355	index = rt2800_eeprom_word_index(rt2x00dev, word);
356	rt2x00_eeprom_write(rt2x00dev, index, data);
357}
358
359static void rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev,
360					  const enum rt2800_eeprom_word array,
361					  unsigned int offset,
362					  u16 *data)
363{
364	unsigned int index;
365
366	index = rt2800_eeprom_word_index(rt2x00dev, array);
367	rt2x00_eeprom_read(rt2x00dev, index + offset, data);
368}
369
370static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev)
371{
372	u32 reg;
373	int i, count;
374
375	rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, &reg);
376	if (rt2x00_get_field32(reg, WLAN_EN))
377		return 0;
378
379	rt2x00_set_field32(&reg, WLAN_GPIO_OUT_OE_BIT_ALL, 0xff);
380	rt2x00_set_field32(&reg, FRC_WL_ANT_SET, 1);
381	rt2x00_set_field32(&reg, WLAN_CLK_EN, 0);
382	rt2x00_set_field32(&reg, WLAN_EN, 1);
383	rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
384
385	udelay(REGISTER_BUSY_DELAY);
386
387	count = 0;
388	do {
389		/*
390		 * Check PLL_LD & XTAL_RDY.
391		 */
392		for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
393			rt2800_register_read(rt2x00dev, CMB_CTRL, &reg);
394			if (rt2x00_get_field32(reg, PLL_LD) &&
395			    rt2x00_get_field32(reg, XTAL_RDY))
396				break;
397			udelay(REGISTER_BUSY_DELAY);
398		}
399
400		if (i >= REGISTER_BUSY_COUNT) {
401
402			if (count >= 10)
403				return -EIO;
404
405			rt2800_register_write(rt2x00dev, 0x58, 0x018);
406			udelay(REGISTER_BUSY_DELAY);
407			rt2800_register_write(rt2x00dev, 0x58, 0x418);
408			udelay(REGISTER_BUSY_DELAY);
409			rt2800_register_write(rt2x00dev, 0x58, 0x618);
410			udelay(REGISTER_BUSY_DELAY);
411			count++;
412		} else {
413			count = 0;
414		}
415
416		rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, &reg);
417		rt2x00_set_field32(&reg, PCIE_APP0_CLK_REQ, 0);
418		rt2x00_set_field32(&reg, WLAN_CLK_EN, 1);
419		rt2x00_set_field32(&reg, WLAN_RESET, 1);
420		rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
421		udelay(10);
422		rt2x00_set_field32(&reg, WLAN_RESET, 0);
423		rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
424		udelay(10);
425		rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, 0x7fffffff);
426	} while (count != 0);
427
428	return 0;
429}
430
431void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
432			const u8 command, const u8 token,
433			const u8 arg0, const u8 arg1)
434{
435	u32 reg;
436
437	/*
438	 * SOC devices don't support MCU requests.
439	 */
440	if (rt2x00_is_soc(rt2x00dev))
441		return;
442
443	mutex_lock(&rt2x00dev->csr_mutex);
444
445	/*
446	 * Wait until the MCU becomes available, afterwards we
447	 * can safely write the new data into the register.
448	 */
449	if (WAIT_FOR_MCU(rt2x00dev, &reg)) {
450		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_OWNER, 1);
451		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
452		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
453		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG1, arg1);
454		rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
455
456		reg = 0;
457		rt2x00_set_field32(&reg, HOST_CMD_CSR_HOST_COMMAND, command);
458		rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
459	}
460
461	mutex_unlock(&rt2x00dev->csr_mutex);
462}
463EXPORT_SYMBOL_GPL(rt2800_mcu_request);
464
465int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev)
466{
467	unsigned int i = 0;
468	u32 reg;
469
470	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
471		rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
472		if (reg && reg != ~0)
473			return 0;
474		msleep(1);
475	}
476
477	rt2x00_err(rt2x00dev, "Unstable hardware\n");
478	return -EBUSY;
479}
480EXPORT_SYMBOL_GPL(rt2800_wait_csr_ready);
481
482int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
483{
484	unsigned int i;
485	u32 reg;
486
487	/*
488	 * Some devices are really slow to respond here. Wait a whole second
489	 * before timing out.
490	 */
491	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
492		rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
493		if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
494		    !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY))
495			return 0;
496
497		msleep(10);
498	}
499
500	rt2x00_err(rt2x00dev, "WPDMA TX/RX busy [0x%08x]\n", reg);
501	return -EACCES;
502}
503EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready);
504
505void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev)
506{
507	u32 reg;
508
509	rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
510	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
511	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
512	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
513	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
514	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
515	rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
516}
517EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
518
519void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
520			       unsigned short *txwi_size,
521			       unsigned short *rxwi_size)
522{
523	switch (rt2x00dev->chip.rt) {
524	case RT3593:
525		*txwi_size = TXWI_DESC_SIZE_4WORDS;
526		*rxwi_size = RXWI_DESC_SIZE_5WORDS;
527		break;
528
529	case RT5592:
530		*txwi_size = TXWI_DESC_SIZE_5WORDS;
531		*rxwi_size = RXWI_DESC_SIZE_6WORDS;
532		break;
533
534	default:
535		*txwi_size = TXWI_DESC_SIZE_4WORDS;
536		*rxwi_size = RXWI_DESC_SIZE_4WORDS;
537		break;
538	}
539}
540EXPORT_SYMBOL_GPL(rt2800_get_txwi_rxwi_size);
541
542static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
543{
544	u16 fw_crc;
545	u16 crc;
546
547	/*
548	 * The last 2 bytes in the firmware array are the crc checksum itself,
549	 * this means that we should never pass those 2 bytes to the crc
550	 * algorithm.
551	 */
552	fw_crc = (data[len - 2] << 8 | data[len - 1]);
553
554	/*
555	 * Use the crc ccitt algorithm.
556	 * This will return the same value as the legacy driver which
557	 * used bit ordering reversion on the both the firmware bytes
558	 * before input input as well as on the final output.
559	 * Obviously using crc ccitt directly is much more efficient.
560	 */
561	crc = crc_ccitt(~0, data, len - 2);
562
563	/*
564	 * There is a small difference between the crc-itu-t + bitrev and
565	 * the crc-ccitt crc calculation. In the latter method the 2 bytes
566	 * will be swapped, use swab16 to convert the crc to the correct
567	 * value.
568	 */
569	crc = swab16(crc);
570
571	return fw_crc == crc;
572}
573
574int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
575			  const u8 *data, const size_t len)
576{
577	size_t offset = 0;
578	size_t fw_len;
579	bool multiple;
580
581	/*
582	 * PCI(e) & SOC devices require firmware with a length
583	 * of 8kb. USB devices require firmware files with a length
584	 * of 4kb. Certain USB chipsets however require different firmware,
585	 * which Ralink only provides attached to the original firmware
586	 * file. Thus for USB devices, firmware files have a length
587	 * which is a multiple of 4kb. The firmware for rt3290 chip also
588	 * have a length which is a multiple of 4kb.
589	 */
590	if (rt2x00_is_usb(rt2x00dev) || rt2x00_rt(rt2x00dev, RT3290))
591		fw_len = 4096;
592	else
593		fw_len = 8192;
594
595	multiple = true;
596	/*
597	 * Validate the firmware length
598	 */
599	if (len != fw_len && (!multiple || (len % fw_len) != 0))
600		return FW_BAD_LENGTH;
601
602	/*
603	 * Check if the chipset requires one of the upper parts
604	 * of the firmware.
605	 */
606	if (rt2x00_is_usb(rt2x00dev) &&
607	    !rt2x00_rt(rt2x00dev, RT2860) &&
608	    !rt2x00_rt(rt2x00dev, RT2872) &&
609	    !rt2x00_rt(rt2x00dev, RT3070) &&
610	    ((len / fw_len) == 1))
611		return FW_BAD_VERSION;
612
613	/*
614	 * 8kb firmware files must be checked as if it were
615	 * 2 separate firmware files.
616	 */
617	while (offset < len) {
618		if (!rt2800_check_firmware_crc(data + offset, fw_len))
619			return FW_BAD_CRC;
620
621		offset += fw_len;
622	}
623
624	return FW_OK;
625}
626EXPORT_SYMBOL_GPL(rt2800_check_firmware);
627
628int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
629			 const u8 *data, const size_t len)
630{
631	unsigned int i;
632	u32 reg;
633	int retval;
634
635	if (rt2x00_rt(rt2x00dev, RT3290)) {
636		retval = rt2800_enable_wlan_rt3290(rt2x00dev);
637		if (retval)
638			return -EBUSY;
639	}
640
641	/*
642	 * If driver doesn't wake up firmware here,
643	 * rt2800_load_firmware will hang forever when interface is up again.
644	 */
645	rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0x00000000);
646
647	/*
648	 * Wait for stable hardware.
649	 */
650	if (rt2800_wait_csr_ready(rt2x00dev))
651		return -EBUSY;
652
653	if (rt2x00_is_pci(rt2x00dev)) {
654		if (rt2x00_rt(rt2x00dev, RT3290) ||
655		    rt2x00_rt(rt2x00dev, RT3572) ||
656		    rt2x00_rt(rt2x00dev, RT5390) ||
657		    rt2x00_rt(rt2x00dev, RT5392)) {
658			rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
659			rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
660			rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
661			rt2800_register_write(rt2x00dev, AUX_CTRL, reg);
662		}
663		rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
664	}
665
666	rt2800_disable_wpdma(rt2x00dev);
667
668	/*
669	 * Write firmware to the device.
670	 */
671	rt2800_drv_write_firmware(rt2x00dev, data, len);
672
673	/*
674	 * Wait for device to stabilize.
675	 */
676	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
677		rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
678		if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
679			break;
680		msleep(1);
681	}
682
683	if (i == REGISTER_BUSY_COUNT) {
684		rt2x00_err(rt2x00dev, "PBF system register not ready\n");
685		return -EBUSY;
686	}
687
688	/*
689	 * Disable DMA, will be reenabled later when enabling
690	 * the radio.
691	 */
692	rt2800_disable_wpdma(rt2x00dev);
693
694	/*
695	 * Initialize firmware.
696	 */
697	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
698	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
699	if (rt2x00_is_usb(rt2x00dev)) {
700		rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
701		rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
702	}
703	msleep(1);
704
705	return 0;
706}
707EXPORT_SYMBOL_GPL(rt2800_load_firmware);
708
709void rt2800_write_tx_data(struct queue_entry *entry,
710			  struct txentry_desc *txdesc)
711{
712	__le32 *txwi = rt2800_drv_get_txwi(entry);
713	u32 word;
714	int i;
715
716	/*
717	 * Initialize TX Info descriptor
718	 */
719	rt2x00_desc_read(txwi, 0, &word);
720	rt2x00_set_field32(&word, TXWI_W0_FRAG,
721			   test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
722	rt2x00_set_field32(&word, TXWI_W0_MIMO_PS,
723			   test_bit(ENTRY_TXD_HT_MIMO_PS, &txdesc->flags));
724	rt2x00_set_field32(&word, TXWI_W0_CF_ACK, 0);
725	rt2x00_set_field32(&word, TXWI_W0_TS,
726			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
727	rt2x00_set_field32(&word, TXWI_W0_AMPDU,
728			   test_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags));
729	rt2x00_set_field32(&word, TXWI_W0_MPDU_DENSITY,
730			   txdesc->u.ht.mpdu_density);
731	rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->u.ht.txop);
732	rt2x00_set_field32(&word, TXWI_W0_MCS, txdesc->u.ht.mcs);
733	rt2x00_set_field32(&word, TXWI_W0_BW,
734			   test_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags));
735	rt2x00_set_field32(&word, TXWI_W0_SHORT_GI,
736			   test_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags));
737	rt2x00_set_field32(&word, TXWI_W0_STBC, txdesc->u.ht.stbc);
738	rt2x00_set_field32(&word, TXWI_W0_PHYMODE, txdesc->rate_mode);
739	rt2x00_desc_write(txwi, 0, word);
740
741	rt2x00_desc_read(txwi, 1, &word);
742	rt2x00_set_field32(&word, TXWI_W1_ACK,
743			   test_bit(ENTRY_TXD_ACK, &txdesc->flags));
744	rt2x00_set_field32(&word, TXWI_W1_NSEQ,
745			   test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
746	rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->u.ht.ba_size);
747	rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID,
748			   test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags) ?
749			   txdesc->key_idx : txdesc->u.ht.wcid);
750	rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT,
751			   txdesc->length);
752	rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE, entry->queue->qid);
753	rt2x00_set_field32(&word, TXWI_W1_PACKETID_ENTRY, (entry->entry_idx % 3) + 1);
754	rt2x00_desc_write(txwi, 1, word);
755
756	/*
757	 * Always write 0 to IV/EIV fields (word 2 and 3), hardware will insert
758	 * the IV from the IVEIV register when TXD_W3_WIV is set to 0.
759	 * When TXD_W3_WIV is set to 1 it will use the IV data
760	 * from the descriptor. The TXWI_W1_WIRELESS_CLI_ID indicates which
761	 * crypto entry in the registers should be used to encrypt the frame.
762	 *
763	 * Nulify all remaining words as well, we don't know how to program them.
764	 */
765	for (i = 2; i < entry->queue->winfo_size / sizeof(__le32); i++)
766		_rt2x00_desc_write(txwi, i, 0);
767}
768EXPORT_SYMBOL_GPL(rt2800_write_tx_data);
769
770static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, u32 rxwi_w2)
771{
772	s8 rssi0 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI0);
773	s8 rssi1 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI1);
774	s8 rssi2 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI2);
775	u16 eeprom;
776	u8 offset0;
777	u8 offset1;
778	u8 offset2;
779
780	if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
781		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &eeprom);
782		offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0);
783		offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1);
784		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
785		offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_OFFSET2);
786	} else {
787		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &eeprom);
788		offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET0);
789		offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET1);
790		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
791		offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_OFFSET2);
792	}
793
794	/*
795	 * Convert the value from the descriptor into the RSSI value
796	 * If the value in the descriptor is 0, it is considered invalid
797	 * and the default (extremely low) rssi value is assumed
798	 */
799	rssi0 = (rssi0) ? (-12 - offset0 - rt2x00dev->lna_gain - rssi0) : -128;
800	rssi1 = (rssi1) ? (-12 - offset1 - rt2x00dev->lna_gain - rssi1) : -128;
801	rssi2 = (rssi2) ? (-12 - offset2 - rt2x00dev->lna_gain - rssi2) : -128;
802
803	/*
804	 * mac80211 only accepts a single RSSI value. Calculating the
805	 * average doesn't deliver a fair answer either since -60:-60 would
806	 * be considered equally good as -50:-70 while the second is the one
807	 * which gives less energy...
808	 */
809	rssi0 = max(rssi0, rssi1);
810	return (int)max(rssi0, rssi2);
811}
812
813void rt2800_process_rxwi(struct queue_entry *entry,
814			 struct rxdone_entry_desc *rxdesc)
815{
816	__le32 *rxwi = (__le32 *) entry->skb->data;
817	u32 word;
818
819	rt2x00_desc_read(rxwi, 0, &word);
820
821	rxdesc->cipher = rt2x00_get_field32(word, RXWI_W0_UDF);
822	rxdesc->size = rt2x00_get_field32(word, RXWI_W0_MPDU_TOTAL_BYTE_COUNT);
823
824	rt2x00_desc_read(rxwi, 1, &word);
825
826	if (rt2x00_get_field32(word, RXWI_W1_SHORT_GI))
827		rxdesc->flags |= RX_FLAG_SHORT_GI;
828
829	if (rt2x00_get_field32(word, RXWI_W1_BW))
830		rxdesc->flags |= RX_FLAG_40MHZ;
831
832	/*
833	 * Detect RX rate, always use MCS as signal type.
834	 */
835	rxdesc->dev_flags |= RXDONE_SIGNAL_MCS;
836	rxdesc->signal = rt2x00_get_field32(word, RXWI_W1_MCS);
837	rxdesc->rate_mode = rt2x00_get_field32(word, RXWI_W1_PHYMODE);
838
839	/*
840	 * Mask of 0x8 bit to remove the short preamble flag.
841	 */
842	if (rxdesc->rate_mode == RATE_MODE_CCK)
843		rxdesc->signal &= ~0x8;
844
845	rt2x00_desc_read(rxwi, 2, &word);
846
847	/*
848	 * Convert descriptor AGC value to RSSI value.
849	 */
850	rxdesc->rssi = rt2800_agc_to_rssi(entry->queue->rt2x00dev, word);
851	/*
852	 * Remove RXWI descriptor from start of the buffer.
853	 */
854	skb_pull(entry->skb, entry->queue->winfo_size);
855}
856EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
857
858void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
859{
860	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
861	struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
862	struct txdone_entry_desc txdesc;
863	u32 word;
864	u16 mcs, real_mcs;
865	int aggr, ampdu;
866
867	/*
868	 * Obtain the status about this packet.
869	 */
870	txdesc.flags = 0;
871	rt2x00_desc_read(txwi, 0, &word);
872
873	mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
874	ampdu = rt2x00_get_field32(word, TXWI_W0_AMPDU);
875
876	real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
877	aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE);
878
879	/*
880	 * If a frame was meant to be sent as a single non-aggregated MPDU
881	 * but ended up in an aggregate the used tx rate doesn't correlate
882	 * with the one specified in the TXWI as the whole aggregate is sent
883	 * with the same rate.
884	 *
885	 * For example: two frames are sent to rt2x00, the first one sets
886	 * AMPDU=1 and requests MCS7 whereas the second frame sets AMDPU=0
887	 * and requests MCS15. If the hw aggregates both frames into one
888	 * AMDPU the tx status for both frames will contain MCS7 although
889	 * the frame was sent successfully.
890	 *
891	 * Hence, replace the requested rate with the real tx rate to not
892	 * confuse the rate control algortihm by providing clearly wrong
893	 * data.
894	 */
895	if (unlikely(aggr == 1 && ampdu == 0 && real_mcs != mcs)) {
896		skbdesc->tx_rate_idx = real_mcs;
897		mcs = real_mcs;
898	}
899
900	if (aggr == 1 || ampdu == 1)
901		__set_bit(TXDONE_AMPDU, &txdesc.flags);
902
903	/*
904	 * Ralink has a retry mechanism using a global fallback
905	 * table. We setup this fallback table to try the immediate
906	 * lower rate for all rates. In the TX_STA_FIFO, the MCS field
907	 * always contains the MCS used for the last transmission, be
908	 * it successful or not.
909	 */
910	if (rt2x00_get_field32(status, TX_STA_FIFO_TX_SUCCESS)) {
911		/*
912		 * Transmission succeeded. The number of retries is
913		 * mcs - real_mcs
914		 */
915		__set_bit(TXDONE_SUCCESS, &txdesc.flags);
916		txdesc.retry = ((mcs > real_mcs) ? mcs - real_mcs : 0);
917	} else {
918		/*
919		 * Transmission failed. The number of retries is
920		 * always 7 in this case (for a total number of 8
921		 * frames sent).
922		 */
923		__set_bit(TXDONE_FAILURE, &txdesc.flags);
924		txdesc.retry = rt2x00dev->long_retry;
925	}
926
927	/*
928	 * the frame was retried at least once
929	 * -> hw used fallback rates
930	 */
931	if (txdesc.retry)
932		__set_bit(TXDONE_FALLBACK, &txdesc.flags);
933
934	rt2x00lib_txdone(entry, &txdesc);
935}
936EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
937
938static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
939					  unsigned int index)
940{
941	return HW_BEACON_BASE(index);
942}
943
944static inline u8 rt2800_get_beacon_offset(struct rt2x00_dev *rt2x00dev,
945					  unsigned int index)
946{
947	return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
948}
949
950static void rt2800_update_beacons_setup(struct rt2x00_dev *rt2x00dev)
951{
952	struct data_queue *queue = rt2x00dev->bcn;
953	struct queue_entry *entry;
954	int i, bcn_num = 0;
955	u64 off, reg = 0;
956	u32 bssid_dw1;
957
958	/*
959	 * Setup offsets of all active beacons in BCN_OFFSET{0,1} registers.
960	 */
961	for (i = 0; i < queue->limit; i++) {
962		entry = &queue->entries[i];
963		if (!test_bit(ENTRY_BCN_ENABLED, &entry->flags))
964			continue;
965		off = rt2800_get_beacon_offset(rt2x00dev, entry->entry_idx);
966		reg |= off << (8 * bcn_num);
967		bcn_num++;
968	}
969
970	WARN_ON_ONCE(bcn_num != rt2x00dev->intf_beaconing);
971
972	rt2800_register_write(rt2x00dev, BCN_OFFSET0, (u32) reg);
973	rt2800_register_write(rt2x00dev, BCN_OFFSET1, (u32) (reg >> 32));
974
975	/*
976	 * H/W sends up to MAC_BSSID_DW1_BSS_BCN_NUM + 1 consecutive beacons.
977	 */
978	rt2800_register_read(rt2x00dev, MAC_BSSID_DW1, &bssid_dw1);
979	rt2x00_set_field32(&bssid_dw1, MAC_BSSID_DW1_BSS_BCN_NUM,
980			   bcn_num > 0 ? bcn_num - 1 : 0);
981	rt2800_register_write(rt2x00dev, MAC_BSSID_DW1, bssid_dw1);
982}
983
984void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
985{
986	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
987	struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
988	unsigned int beacon_base;
989	unsigned int padding_len;
990	u32 orig_reg, reg;
991	const int txwi_desc_size = entry->queue->winfo_size;
992
993	/*
994	 * Disable beaconing while we are reloading the beacon data,
995	 * otherwise we might be sending out invalid data.
996	 */
997	rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
998	orig_reg = reg;
999	rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
1000	rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1001
1002	/*
1003	 * Add space for the TXWI in front of the skb.
1004	 */
1005	memset(skb_push(entry->skb, txwi_desc_size), 0, txwi_desc_size);
1006
1007	/*
1008	 * Register descriptor details in skb frame descriptor.
1009	 */
1010	skbdesc->flags |= SKBDESC_DESC_IN_SKB;
1011	skbdesc->desc = entry->skb->data;
1012	skbdesc->desc_len = txwi_desc_size;
1013
1014	/*
1015	 * Add the TXWI for the beacon to the skb.
1016	 */
1017	rt2800_write_tx_data(entry, txdesc);
1018
1019	/*
1020	 * Dump beacon to userspace through debugfs.
1021	 */
1022	rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb);
1023
1024	/*
1025	 * Write entire beacon with TXWI and padding to register.
1026	 */
1027	padding_len = roundup(entry->skb->len, 4) - entry->skb->len;
1028	if (padding_len && skb_pad(entry->skb, padding_len)) {
1029		rt2x00_err(rt2x00dev, "Failure padding beacon, aborting\n");
1030		/* skb freed by skb_pad() on failure */
1031		entry->skb = NULL;
1032		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1033		return;
1034	}
1035
1036	beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
1037
1038	rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
1039				   entry->skb->len + padding_len);
1040	__set_bit(ENTRY_BCN_ENABLED, &entry->flags);
1041
1042	/*
1043	 * Change global beacons settings.
1044	 */
1045	rt2800_update_beacons_setup(rt2x00dev);
1046
1047	/*
1048	 * Restore beaconing state.
1049	 */
1050	rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1051
1052	/*
1053	 * Clean up beacon skb.
1054	 */
1055	dev_kfree_skb_any(entry->skb);
1056	entry->skb = NULL;
1057}
1058EXPORT_SYMBOL_GPL(rt2800_write_beacon);
1059
1060static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,
1061						unsigned int index)
1062{
1063	int i;
1064	const int txwi_desc_size = rt2x00dev->bcn->winfo_size;
1065	unsigned int beacon_base;
1066
1067	beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
1068
1069	/*
1070	 * For the Beacon base registers we only need to clear
1071	 * the whole TXWI which (when set to 0) will invalidate
1072	 * the entire beacon.
1073	 */
1074	for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
1075		rt2800_register_write(rt2x00dev, beacon_base + i, 0);
1076}
1077
1078void rt2800_clear_beacon(struct queue_entry *entry)
1079{
1080	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1081	u32 orig_reg, reg;
1082
1083	/*
1084	 * Disable beaconing while we are reloading the beacon data,
1085	 * otherwise we might be sending out invalid data.
1086	 */
1087	rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &orig_reg);
1088	reg = orig_reg;
1089	rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
1090	rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1091
1092	/*
1093	 * Clear beacon.
1094	 */
1095	rt2800_clear_beacon_register(rt2x00dev, entry->entry_idx);
1096	__clear_bit(ENTRY_BCN_ENABLED, &entry->flags);
1097
1098	/*
1099	 * Change global beacons settings.
1100	 */
1101	rt2800_update_beacons_setup(rt2x00dev);
1102	/*
1103	 * Restore beaconing state.
1104	 */
1105	rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1106}
1107EXPORT_SYMBOL_GPL(rt2800_clear_beacon);
1108
1109#ifdef CONFIG_RT2X00_LIB_DEBUGFS
1110const struct rt2x00debug rt2800_rt2x00debug = {
1111	.owner	= THIS_MODULE,
1112	.csr	= {
1113		.read		= rt2800_register_read,
1114		.write		= rt2800_register_write,
1115		.flags		= RT2X00DEBUGFS_OFFSET,
1116		.word_base	= CSR_REG_BASE,
1117		.word_size	= sizeof(u32),
1118		.word_count	= CSR_REG_SIZE / sizeof(u32),
1119	},
1120	.eeprom	= {
1121		/* NOTE: The local EEPROM access functions can't
1122		 * be used here, use the generic versions instead.
1123		 */
1124		.read		= rt2x00_eeprom_read,
1125		.write		= rt2x00_eeprom_write,
1126		.word_base	= EEPROM_BASE,
1127		.word_size	= sizeof(u16),
1128		.word_count	= EEPROM_SIZE / sizeof(u16),
1129	},
1130	.bbp	= {
1131		.read		= rt2800_bbp_read,
1132		.write		= rt2800_bbp_write,
1133		.word_base	= BBP_BASE,
1134		.word_size	= sizeof(u8),
1135		.word_count	= BBP_SIZE / sizeof(u8),
1136	},
1137	.rf	= {
1138		.read		= rt2x00_rf_read,
1139		.write		= rt2800_rf_write,
1140		.word_base	= RF_BASE,
1141		.word_size	= sizeof(u32),
1142		.word_count	= RF_SIZE / sizeof(u32),
1143	},
1144	.rfcsr	= {
1145		.read		= rt2800_rfcsr_read,
1146		.write		= rt2800_rfcsr_write,
1147		.word_base	= RFCSR_BASE,
1148		.word_size	= sizeof(u8),
1149		.word_count	= RFCSR_SIZE / sizeof(u8),
1150	},
1151};
1152EXPORT_SYMBOL_GPL(rt2800_rt2x00debug);
1153#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
1154
1155int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev)
1156{
1157	u32 reg;
1158
1159	if (rt2x00_rt(rt2x00dev, RT3290)) {
1160		rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, &reg);
1161		return rt2x00_get_field32(reg, WLAN_GPIO_IN_BIT0);
1162	} else {
1163		rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
1164		return rt2x00_get_field32(reg, GPIO_CTRL_VAL2);
1165	}
1166}
1167EXPORT_SYMBOL_GPL(rt2800_rfkill_poll);
1168
1169#ifdef CONFIG_RT2X00_LIB_LEDS
1170static void rt2800_brightness_set(struct led_classdev *led_cdev,
1171				  enum led_brightness brightness)
1172{
1173	struct rt2x00_led *led =
1174	    container_of(led_cdev, struct rt2x00_led, led_dev);
1175	unsigned int enabled = brightness != LED_OFF;
1176	unsigned int bg_mode =
1177	    (enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ);
1178	unsigned int polarity =
1179		rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
1180				   EEPROM_FREQ_LED_POLARITY);
1181	unsigned int ledmode =
1182		rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
1183				   EEPROM_FREQ_LED_MODE);
1184	u32 reg;
1185
1186	/* Check for SoC (SOC devices don't support MCU requests) */
1187	if (rt2x00_is_soc(led->rt2x00dev)) {
1188		rt2800_register_read(led->rt2x00dev, LED_CFG, &reg);
1189
1190		/* Set LED Polarity */
1191		rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, polarity);
1192
1193		/* Set LED Mode */
1194		if (led->type == LED_TYPE_RADIO) {
1195			rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE,
1196					   enabled ? 3 : 0);
1197		} else if (led->type == LED_TYPE_ASSOC) {
1198			rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE,
1199					   enabled ? 3 : 0);
1200		} else if (led->type == LED_TYPE_QUALITY) {
1201			rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE,
1202					   enabled ? 3 : 0);
1203		}
1204
1205		rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
1206
1207	} else {
1208		if (led->type == LED_TYPE_RADIO) {
1209			rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
1210					      enabled ? 0x20 : 0);
1211		} else if (led->type == LED_TYPE_ASSOC) {
1212			rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
1213					      enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
1214		} else if (led->type == LED_TYPE_QUALITY) {
1215			/*
1216			 * The brightness is divided into 6 levels (0 - 5),
1217			 * The specs tell us the following levels:
1218			 *	0, 1 ,3, 7, 15, 31
1219			 * to determine the level in a simple way we can simply
1220			 * work with bitshifting:
1221			 *	(1 << level) - 1
1222			 */
1223			rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
1224					      (1 << brightness / (LED_FULL / 6)) - 1,
1225					      polarity);
1226		}
1227	}
1228}
1229
1230static void rt2800_init_led(struct rt2x00_dev *rt2x00dev,
1231		     struct rt2x00_led *led, enum led_type type)
1232{
1233	led->rt2x00dev = rt2x00dev;
1234	led->type = type;
1235	led->led_dev.brightness_set = rt2800_brightness_set;
1236	led->flags = LED_INITIALIZED;
1237}
1238#endif /* CONFIG_RT2X00_LIB_LEDS */
1239
1240/*
1241 * Configuration handlers.
1242 */
1243static void rt2800_config_wcid(struct rt2x00_dev *rt2x00dev,
1244			       const u8 *address,
1245			       int wcid)
1246{
1247	struct mac_wcid_entry wcid_entry;
1248	u32 offset;
1249
1250	offset = MAC_WCID_ENTRY(wcid);
1251
1252	memset(&wcid_entry, 0xff, sizeof(wcid_entry));
1253	if (address)
1254		memcpy(wcid_entry.mac, address, ETH_ALEN);
1255
1256	rt2800_register_multiwrite(rt2x00dev, offset,
1257				      &wcid_entry, sizeof(wcid_entry));
1258}
1259
1260static void rt2800_delete_wcid_attr(struct rt2x00_dev *rt2x00dev, int wcid)
1261{
1262	u32 offset;
1263	offset = MAC_WCID_ATTR_ENTRY(wcid);
1264	rt2800_register_write(rt2x00dev, offset, 0);
1265}
1266
1267static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
1268					   int wcid, u32 bssidx)
1269{
1270	u32 offset = MAC_WCID_ATTR_ENTRY(wcid);
1271	u32 reg;
1272
1273	/*
1274	 * The BSS Idx numbers is split in a main value of 3 bits,
1275	 * and a extended field for adding one additional bit to the value.
1276	 */
1277	rt2800_register_read(rt2x00dev, offset, &reg);
1278	rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX, (bssidx & 0x7));
1279	rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT,
1280			   (bssidx & 0x8) >> 3);
1281	rt2800_register_write(rt2x00dev, offset, reg);
1282}
1283
1284static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,
1285					   struct rt2x00lib_crypto *crypto,
1286					   struct ieee80211_key_conf *key)
1287{
1288	struct mac_iveiv_entry iveiv_entry;
1289	u32 offset;
1290	u32 reg;
1291
1292	offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
1293
1294	if (crypto->cmd == SET_KEY) {
1295		rt2800_register_read(rt2x00dev, offset, &reg);
1296		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
1297				   !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
1298		/*
1299		 * Both the cipher as the BSS Idx numbers are split in a main
1300		 * value of 3 bits, and a extended field for adding one additional
1301		 * bit to the value.
1302		 */
1303		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER,
1304				   (crypto->cipher & 0x7));
1305		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER_EXT,
1306				   (crypto->cipher & 0x8) >> 3);
1307		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
1308		rt2800_register_write(rt2x00dev, offset, reg);
1309	} else {
1310		/* Delete the cipher without touching the bssidx */
1311		rt2800_register_read(rt2x00dev, offset, &reg);
1312		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB, 0);
1313		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER, 0);
1314		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER_EXT, 0);
1315		rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
1316		rt2800_register_write(rt2x00dev, offset, reg);
1317	}
1318
1319	offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
1320
1321	memset(&iveiv_entry, 0, sizeof(iveiv_entry));
1322	if ((crypto->cipher == CIPHER_TKIP) ||
1323	    (crypto->cipher == CIPHER_TKIP_NO_MIC) ||
1324	    (crypto->cipher == CIPHER_AES))
1325		iveiv_entry.iv[3] |= 0x20;
1326	iveiv_entry.iv[3] |= key->keyidx << 6;
1327	rt2800_register_multiwrite(rt2x00dev, offset,
1328				      &iveiv_entry, sizeof(iveiv_entry));
1329}
1330
1331int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
1332			     struct rt2x00lib_crypto *crypto,
1333			     struct ieee80211_key_conf *key)
1334{
1335	struct hw_key_entry key_entry;
1336	struct rt2x00_field32 field;
1337	u32 offset;
1338	u32 reg;
1339
1340	if (crypto->cmd == SET_KEY) {
1341		key->hw_key_idx = (4 * crypto->bssidx) + key->keyidx;
1342
1343		memcpy(key_entry.key, crypto->key,
1344		       sizeof(key_entry.key));
1345		memcpy(key_entry.tx_mic, crypto->tx_mic,
1346		       sizeof(key_entry.tx_mic));
1347		memcpy(key_entry.rx_mic, crypto->rx_mic,
1348		       sizeof(key_entry.rx_mic));
1349
1350		offset = SHARED_KEY_ENTRY(key->hw_key_idx);
1351		rt2800_register_multiwrite(rt2x00dev, offset,
1352					      &key_entry, sizeof(key_entry));
1353	}
1354
1355	/*
1356	 * The cipher types are stored over multiple registers
1357	 * starting with SHARED_KEY_MODE_BASE each word will have
1358	 * 32 bits and contains the cipher types for 2 bssidx each.
1359	 * Using the correct defines correctly will cause overhead,
1360	 * so just calculate the correct offset.
1361	 */
1362	field.bit_offset = 4 * (key->hw_key_idx % 8);
1363	field.bit_mask = 0x7 << field.bit_offset;
1364
1365	offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
1366
1367	rt2800_register_read(rt2x00dev, offset, &reg);
1368	rt2x00_set_field32(&reg, field,
1369			   (crypto->cmd == SET_KEY) * crypto->cipher);
1370	rt2800_register_write(rt2x00dev, offset, reg);
1371
1372	/*
1373	 * Update WCID information
1374	 */
1375	rt2800_config_wcid(rt2x00dev, crypto->address, key->hw_key_idx);
1376	rt2800_config_wcid_attr_bssidx(rt2x00dev, key->hw_key_idx,
1377				       crypto->bssidx);
1378	rt2800_config_wcid_attr_cipher(rt2x00dev, crypto, key);
1379
1380	return 0;
1381}
1382EXPORT_SYMBOL_GPL(rt2800_config_shared_key);
1383
1384int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
1385			       struct rt2x00lib_crypto *crypto,
1386			       struct ieee80211_key_conf *key)
1387{
1388	struct hw_key_entry key_entry;
1389	u32 offset;
1390
1391	if (crypto->cmd == SET_KEY) {
1392		/*
1393		 * Allow key configuration only for STAs that are
1394		 * known by the hw.
1395		 */
1396		if (crypto->wcid > WCID_END)
1397			return -ENOSPC;
1398		key->hw_key_idx = crypto->wcid;
1399
1400		memcpy(key_entry.key, crypto->key,
1401		       sizeof(key_entry.key));
1402		memcpy(key_entry.tx_mic, crypto->tx_mic,
1403		       sizeof(key_entry.tx_mic));
1404		memcpy(key_entry.rx_mic, crypto->rx_mic,
1405		       sizeof(key_entry.rx_mic));
1406
1407		offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
1408		rt2800_register_multiwrite(rt2x00dev, offset,
1409					      &key_entry, sizeof(key_entry));
1410	}
1411
1412	/*
1413	 * Update WCID information
1414	 */
1415	rt2800_config_wcid_attr_cipher(rt2x00dev, crypto, key);
1416
1417	return 0;
1418}
1419EXPORT_SYMBOL_GPL(rt2800_config_pairwise_key);
1420
1421int rt2800_sta_add(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif,
1422		   struct ieee80211_sta *sta)
1423{
1424	int wcid;
1425	struct rt2x00_sta *sta_priv = sta_to_rt2x00_sta(sta);
1426	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1427
1428	/*
1429	 * Search for the first free WCID entry and return the corresponding
1430	 * index.
1431	 */
1432	wcid = find_first_zero_bit(drv_data->sta_ids, STA_IDS_SIZE) + WCID_START;
1433
1434	/*
1435	 * Store selected wcid even if it is invalid so that we can
1436	 * later decide if the STA is uploaded into the hw.
1437	 */
1438	sta_priv->wcid = wcid;
1439
1440	/*
1441	 * No space left in the device, however, we can still communicate
1442	 * with the STA -> No error.
1443	 */
1444	if (wcid > WCID_END)
1445		return 0;
1446
1447	__set_bit(wcid - WCID_START, drv_data->sta_ids);
1448
1449	/*
1450	 * Clean up WCID attributes and write STA address to the device.
1451	 */
1452	rt2800_delete_wcid_attr(rt2x00dev, wcid);
1453	rt2800_config_wcid(rt2x00dev, sta->addr, wcid);
1454	rt2800_config_wcid_attr_bssidx(rt2x00dev, wcid,
1455				       rt2x00lib_get_bssidx(rt2x00dev, vif));
1456	return 0;
1457}
1458EXPORT_SYMBOL_GPL(rt2800_sta_add);
1459
1460int rt2800_sta_remove(struct rt2x00_dev *rt2x00dev, int wcid)
1461{
1462	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1463
1464	if (wcid > WCID_END)
1465		return 0;
1466	/*
1467	 * Remove WCID entry, no need to clean the attributes as they will
1468	 * get renewed when the WCID is reused.
1469	 */
1470	rt2800_config_wcid(rt2x00dev, NULL, wcid);
1471	__clear_bit(wcid - WCID_START, drv_data->sta_ids);
1472
1473	return 0;
1474}
1475EXPORT_SYMBOL_GPL(rt2800_sta_remove);
1476
1477void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
1478			  const unsigned int filter_flags)
1479{
1480	u32 reg;
1481
1482	/*
1483	 * Start configuration steps.
1484	 * Note that the version error will always be dropped
1485	 * and broadcast frames will always be accepted since
1486	 * there is no filter for it at this time.
1487	 */
1488	rt2800_register_read(rt2x00dev, RX_FILTER_CFG, &reg);
1489	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CRC_ERROR,
1490			   !(filter_flags & FIF_FCSFAIL));
1491	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
1492			   !(filter_flags & FIF_PLCPFAIL));
1493	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME, 1);
1494	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
1495	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
1496	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
1497			   !(filter_flags & FIF_ALLMULTI));
1498	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BROADCAST, 0);
1499	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_DUPLICATE, 1);
1500	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END_ACK,
1501			   !(filter_flags & FIF_CONTROL));
1502	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END,
1503			   !(filter_flags & FIF_CONTROL));
1504	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_ACK,
1505			   !(filter_flags & FIF_CONTROL));
1506	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CTS,
1507			   !(filter_flags & FIF_CONTROL));
1508	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_RTS,
1509			   !(filter_flags & FIF_CONTROL));
1510	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PSPOLL,
1511			   !(filter_flags & FIF_PSPOLL));
1512	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BA, 0);
1513	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BAR,
1514			   !(filter_flags & FIF_CONTROL));
1515	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CNTL,
1516			   !(filter_flags & FIF_CONTROL));
1517	rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg);
1518}
1519EXPORT_SYMBOL_GPL(rt2800_config_filter);
1520
1521void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
1522			struct rt2x00intf_conf *conf, const unsigned int flags)
1523{
1524	u32 reg;
1525	bool update_bssid = false;
1526
1527	if (flags & CONFIG_UPDATE_TYPE) {
1528		/*
1529		 * Enable synchronisation.
1530		 */
1531		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
1532		rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, conf->sync);
1533		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1534
1535		if (conf->sync == TSF_SYNC_AP_NONE) {
1536			/*
1537			 * Tune beacon queue transmit parameters for AP mode
1538			 */
1539			rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG, &reg);
1540			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_CWMIN, 0);
1541			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_AIFSN, 1);
1542			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_EXP_WIN, 32);
1543			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_TBTT_ADJUST, 0);
1544			rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg);
1545		} else {
1546			rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG, &reg);
1547			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_CWMIN, 4);
1548			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_AIFSN, 2);
1549			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_EXP_WIN, 32);
1550			rt2x00_set_field32(&reg, TBTT_SYNC_CFG_TBTT_ADJUST, 16);
1551			rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg);
1552		}
1553	}
1554
1555	if (flags & CONFIG_UPDATE_MAC) {
1556		if (flags & CONFIG_UPDATE_TYPE &&
1557		    conf->sync == TSF_SYNC_AP_NONE) {
1558			/*
1559			 * The BSSID register has to be set to our own mac
1560			 * address in AP mode.
1561			 */
1562			memcpy(conf->bssid, conf->mac, sizeof(conf->mac));
1563			update_bssid = true;
1564		}
1565
1566		if (!is_zero_ether_addr((const u8 *)conf->mac)) {
1567			reg = le32_to_cpu(conf->mac[1]);
1568			rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff);
1569			conf->mac[1] = cpu_to_le32(reg);
1570		}
1571
1572		rt2800_register_multiwrite(rt2x00dev, MAC_ADDR_DW0,
1573					      conf->mac, sizeof(conf->mac));
1574	}
1575
1576	if ((flags & CONFIG_UPDATE_BSSID) || update_bssid) {
1577		if (!is_zero_ether_addr((const u8 *)conf->bssid)) {
1578			reg = le32_to_cpu(conf->bssid[1]);
1579			rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3);
1580			rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0);
1581			conf->bssid[1] = cpu_to_le32(reg);
1582		}
1583
1584		rt2800_register_multiwrite(rt2x00dev, MAC_BSSID_DW0,
1585					      conf->bssid, sizeof(conf->bssid));
1586	}
1587}
1588EXPORT_SYMBOL_GPL(rt2800_config_intf);
1589
1590static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev,
1591				    struct rt2x00lib_erp *erp)
1592{
1593	bool any_sta_nongf = !!(erp->ht_opmode &
1594				IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
1595	u8 protection = erp->ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION;
1596	u8 mm20_mode, mm40_mode, gf20_mode, gf40_mode;
1597	u16 mm20_rate, mm40_rate, gf20_rate, gf40_rate;
1598	u32 reg;
1599
1600	/* default protection rate for HT20: OFDM 24M */
1601	mm20_rate = gf20_rate = 0x4004;
1602
1603	/* default protection rate for HT40: duplicate OFDM 24M */
1604	mm40_rate = gf40_rate = 0x4084;
1605
1606	switch (protection) {
1607	case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
1608		/*
1609		 * All STAs in this BSS are HT20/40 but there might be
1610		 * STAs not supporting greenfield mode.
1611		 * => Disable protection for HT transmissions.
1612		 */
1613		mm20_mode = mm40_mode = gf20_mode = gf40_mode = 0;
1614
1615		break;
1616	case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
1617		/*
1618		 * All STAs in this BSS are HT20 or HT20/40 but there
1619		 * might be STAs not supporting greenfield mode.
1620		 * => Protect all HT40 transmissions.
1621		 */
1622		mm20_mode = gf20_mode = 0;
1623		mm40_mode = gf40_mode = 2;
1624
1625		break;
1626	case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
1627		/*
1628		 * Nonmember protection:
1629		 * According to 802.11n we _should_ protect all
1630		 * HT transmissions (but we don't have to).
1631		 *
1632		 * But if cts_protection is enabled we _shall_ protect
1633		 * all HT transmissions using a CCK rate.
1634		 *
1635		 * And if any station is non GF we _shall_ protect
1636		 * GF transmissions.
1637		 *
1638		 * We decide to protect everything
1639		 * -> fall through to mixed mode.
1640		 */
1641	case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
1642		/*
1643		 * Legacy STAs are present
1644		 * => Protect all HT transmissions.
1645		 */
1646		mm20_mode = mm40_mode = gf20_mode = gf40_mode = 2;
1647
1648		/*
1649		 * If erp protection is needed we have to protect HT
1650		 * transmissions with CCK 11M long preamble.
1651		 */
1652		if (erp->cts_protection) {
1653			/* don't duplicate RTS/CTS in CCK mode */
1654			mm20_rate = mm40_rate = 0x0003;
1655			gf20_rate = gf40_rate = 0x0003;
1656		}
1657		break;
1658	}
1659
1660	/* check for STAs not supporting greenfield mode */
1661	if (any_sta_nongf)
1662		gf20_mode = gf40_mode = 2;
1663
1664	/* Update HT protection config */
1665	rt2800_register_read(rt2x00dev, MM20_PROT_CFG, &reg);
1666	rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_RATE, mm20_rate);
1667	rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_CTRL, mm20_mode);
1668	rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
1669
1670	rt2800_register_read(rt2x00dev, MM40_PROT_CFG, &reg);
1671	rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_RATE, mm40_rate);
1672	rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_CTRL, mm40_mode);
1673	rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
1674
1675	rt2800_register_read(rt2x00dev, GF20_PROT_CFG, &reg);
1676	rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_RATE, gf20_rate);
1677	rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_CTRL, gf20_mode);
1678	rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
1679
1680	rt2800_register_read(rt2x00dev, GF40_PROT_CFG, &reg);
1681	rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_RATE, gf40_rate);
1682	rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_CTRL, gf40_mode);
1683	rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
1684}
1685
1686void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
1687		       u32 changed)
1688{
1689	u32 reg;
1690
1691	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1692		rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
1693		rt2x00_set_field32(&reg, AUTO_RSP_CFG_BAC_ACK_POLICY,
1694				   !!erp->short_preamble);
1695		rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE,
1696				   !!erp->short_preamble);
1697		rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
1698	}
1699
1700	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1701		rt2800_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
1702		rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL,
1703				   erp->cts_protection ? 2 : 0);
1704		rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
1705	}
1706
1707	if (changed & BSS_CHANGED_BASIC_RATES) {
1708		rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE,
1709					 erp->basic_rates);
1710		rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
1711	}
1712
1713	if (changed & BSS_CHANGED_ERP_SLOT) {
1714		rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG, &reg);
1715		rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME,
1716				   erp->slot_time);
1717		rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
1718
1719		rt2800_register_read(rt2x00dev, XIFS_TIME_CFG, &reg);
1720		rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, erp->eifs);
1721		rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
1722	}
1723
1724	if (changed & BSS_CHANGED_BEACON_INT) {
1725		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
1726		rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
1727				   erp->beacon_int * 16);
1728		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1729	}
1730
1731	if (changed & BSS_CHANGED_HT)
1732		rt2800_config_ht_opmode(rt2x00dev, erp);
1733}
1734EXPORT_SYMBOL_GPL(rt2800_config_erp);
1735
1736static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev)
1737{
1738	u32 reg;
1739	u16 eeprom;
1740	u8 led_ctrl, led_g_mode, led_r_mode;
1741
1742	rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
1743	if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
1744		rt2x00_set_field32(&reg, GPIO_SWITCH_0, 1);
1745		rt2x00_set_field32(&reg, GPIO_SWITCH_1, 1);
1746	} else {
1747		rt2x00_set_field32(&reg, GPIO_SWITCH_0, 0);
1748		rt2x00_set_field32(&reg, GPIO_SWITCH_1, 0);
1749	}
1750	rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
1751
1752	rt2800_register_read(rt2x00dev, LED_CFG, &reg);
1753	led_g_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 3 : 0;
1754	led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3;
1755	if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) ||
1756	    led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) {
1757		rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
1758		led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE);
1759		if (led_ctrl == 0 || led_ctrl > 0x40) {
1760			rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, led_g_mode);
1761			rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, led_r_mode);
1762			rt2800_register_write(rt2x00dev, LED_CFG, reg);
1763		} else {
1764			rt2800_mcu_request(rt2x00dev, MCU_BAND_SELECT, 0xff,
1765					   (led_g_mode << 2) | led_r_mode, 1);
1766		}
1767	}
1768}
1769
1770static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev,
1771				     enum antenna ant)
1772{
1773	u32 reg;
1774	u8 eesk_pin = (ant == ANTENNA_A) ? 1 : 0;
1775	u8 gpio_bit3 = (ant == ANTENNA_A) ? 0 : 1;
1776
1777	if (rt2x00_is_pci(rt2x00dev)) {
1778		rt2800_register_read(rt2x00dev, E2PROM_CSR, &reg);
1779		rt2x00_set_field32(&reg, E2PROM_CSR_DATA_CLOCK, eesk_pin);
1780		rt2800_register_write(rt2x00dev, E2PROM_CSR, reg);
1781	} else if (rt2x00_is_usb(rt2x00dev))
1782		rt2800_mcu_request(rt2x00dev, MCU_ANT_SELECT, 0xff,
1783				   eesk_pin, 0);
1784
1785	rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
1786	rt2x00_set_field32(&reg, GPIO_CTRL_DIR3, 0);
1787	rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, gpio_bit3);
1788	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
1789}
1790
1791void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
1792{
1793	u8 r1;
1794	u8 r3;
1795	u16 eeprom;
1796
1797	rt2800_bbp_read(rt2x00dev, 1, &r1);
1798	rt2800_bbp_read(rt2x00dev, 3, &r3);
1799
1800	if (rt2x00_rt(rt2x00dev, RT3572) &&
1801	    rt2x00_has_cap_bt_coexist(rt2x00dev))
1802		rt2800_config_3572bt_ant(rt2x00dev);
1803
1804	/*
1805	 * Configure the TX antenna.
1806	 */
1807	switch (ant->tx_chain_num) {
1808	case 1:
1809		rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
1810		break;
1811	case 2:
1812		if (rt2x00_rt(rt2x00dev, RT3572) &&
1813		    rt2x00_has_cap_bt_coexist(rt2x00dev))
1814			rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 1);
1815		else
1816			rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
1817		break;
1818	case 3:
1819		rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
1820		break;
1821	}
1822
1823	/*
1824	 * Configure the RX antenna.
1825	 */
1826	switch (ant->rx_chain_num) {
1827	case 1:
1828		if (rt2x00_rt(rt2x00dev, RT3070) ||
1829		    rt2x00_rt(rt2x00dev, RT3090) ||
1830		    rt2x00_rt(rt2x00dev, RT3352) ||
1831		    rt2x00_rt(rt2x00dev, RT3390)) {
1832			rt2800_eeprom_read(rt2x00dev,
1833					   EEPROM_NIC_CONF1, &eeprom);
1834			if (rt2x00_get_field16(eeprom,
1835						EEPROM_NIC_CONF1_ANT_DIVERSITY))
1836				rt2800_set_ant_diversity(rt2x00dev,
1837						rt2x00dev->default_ant.rx);
1838		}
1839		rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
1840		break;
1841	case 2:
1842		if (rt2x00_rt(rt2x00dev, RT3572) &&
1843		    rt2x00_has_cap_bt_coexist(rt2x00dev)) {
1844			rt2x00_set_field8(&r3, BBP3_RX_ADC, 1);
1845			rt2x00_set_field8(&r3, BBP3_RX_ANTENNA,
1846				rt2x00dev->curr_band == IEEE80211_BAND_5GHZ);
1847			rt2800_set_ant_diversity(rt2x00dev, ANTENNA_B);
1848		} else {
1849			rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
1850		}
1851		break;
1852	case 3:
1853		rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
1854		break;
1855	}
1856
1857	rt2800_bbp_write(rt2x00dev, 3, r3);
1858	rt2800_bbp_write(rt2x00dev, 1, r1);
1859
1860	if (rt2x00_rt(rt2x00dev, RT3593)) {
1861		if (ant->rx_chain_num == 1)
1862			rt2800_bbp_write(rt2x00dev, 86, 0x00);
1863		else
1864			rt2800_bbp_write(rt2x00dev, 86, 0x46);
1865	}
1866}
1867EXPORT_SYMBOL_GPL(rt2800_config_ant);
1868
1869static void rt2800_config_lna_gain(struct rt2x00_dev *rt2x00dev,
1870				   struct rt2x00lib_conf *libconf)
1871{
1872	u16 eeprom;
1873	short lna_gain;
1874
1875	if (libconf->rf.channel <= 14) {
1876		rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
1877		lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG);
1878	} else if (libconf->rf.channel <= 64) {
1879		rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
1880		lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
1881	} else if (libconf->rf.channel <= 128) {
1882		if (rt2x00_rt(rt2x00dev, RT3593)) {
1883			rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
1884			lna_gain = rt2x00_get_field16(eeprom,
1885						      EEPROM_EXT_LNA2_A1);
1886		} else {
1887			rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
1888			lna_gain = rt2x00_get_field16(eeprom,
1889						      EEPROM_RSSI_BG2_LNA_A1);
1890		}
1891	} else {
1892		if (rt2x00_rt(rt2x00dev, RT3593)) {
1893			rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
1894			lna_gain = rt2x00_get_field16(eeprom,
1895						      EEPROM_EXT_LNA2_A2);
1896		} else {
1897			rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
1898			lna_gain = rt2x00_get_field16(eeprom,
1899						      EEPROM_RSSI_A2_LNA_A2);
1900		}
1901	}
1902
1903	rt2x00dev->lna_gain = lna_gain;
1904}
1905
1906#define FREQ_OFFSET_BOUND	0x5f
1907
1908static void rt2800_adjust_freq_offset(struct rt2x00_dev *rt2x00dev)
1909{
1910	u8 freq_offset, prev_freq_offset;
1911	u8 rfcsr, prev_rfcsr;
1912
1913	freq_offset = rt2x00_get_field8(rt2x00dev->freq_offset, RFCSR17_CODE);
1914	freq_offset = min_t(u8, freq_offset, FREQ_OFFSET_BOUND);
1915
1916	rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
1917	prev_rfcsr = rfcsr;
1918
1919	rt2x00_set_field8(&rfcsr, RFCSR17_CODE, freq_offset);
1920	if (rfcsr == prev_rfcsr)
1921		return;
1922
1923	if (rt2x00_is_usb(rt2x00dev)) {
1924		rt2800_mcu_request(rt2x00dev, MCU_FREQ_OFFSET, 0xff,
1925				   freq_offset, prev_rfcsr);
1926		return;
1927	}
1928
1929	prev_freq_offset = rt2x00_get_field8(prev_rfcsr, RFCSR17_CODE);
1930	while (prev_freq_offset != freq_offset) {
1931		if (prev_freq_offset < freq_offset)
1932			prev_freq_offset++;
1933		else
1934			prev_freq_offset--;
1935
1936		rt2x00_set_field8(&rfcsr, RFCSR17_CODE, prev_freq_offset);
1937		rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
1938
1939		usleep_range(1000, 1500);
1940	}
1941}
1942
1943static void rt2800_config_channel_rf2xxx(struct rt2x00_dev *rt2x00dev,
1944					 struct ieee80211_conf *conf,
1945					 struct rf_channel *rf,
1946					 struct channel_info *info)
1947{
1948	rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset);
1949
1950	if (rt2x00dev->default_ant.tx_chain_num == 1)
1951		rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
1952
1953	if (rt2x00dev->default_ant.rx_chain_num == 1) {
1954		rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1);
1955		rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
1956	} else if (rt2x00dev->default_ant.rx_chain_num == 2)
1957		rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
1958
1959	if (rf->channel > 14) {
1960		/*
1961		 * When TX power is below 0, we should increase it by 7 to
1962		 * make it a positive value (Minimum value is -7).
1963		 * However this means that values between 0 and 7 have
1964		 * double meaning, and we should set a 7DBm boost flag.
1965		 */
1966		rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST,
1967				   (info->default_power1 >= 0));
1968
1969		if (info->default_power1 < 0)
1970			info->default_power1 += 7;
1971
1972		rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A, info->default_power1);
1973
1974		rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST,
1975				   (info->default_power2 >= 0));
1976
1977		if (info->default_power2 < 0)
1978			info->default_power2 += 7;
1979
1980		rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A, info->default_power2);
1981	} else {
1982		rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G, info->default_power1);
1983		rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G, info->default_power2);
1984	}
1985
1986	rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf));
1987
1988	rt2800_rf_write(rt2x00dev, 1, rf->rf1);
1989	rt2800_rf_write(rt2x00dev, 2, rf->rf2);
1990	rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
1991	rt2800_rf_write(rt2x00dev, 4, rf->rf4);
1992
1993	udelay(200);
1994
1995	rt2800_rf_write(rt2x00dev, 1, rf->rf1);
1996	rt2800_rf_write(rt2x00dev, 2, rf->rf2);
1997	rt2800_rf_write(rt2x00dev, 3, rf->rf3 | 0x00000004);
1998	rt2800_rf_write(rt2x00dev, 4, rf->rf4);
1999
2000	udelay(200);
2001
2002	rt2800_rf_write(rt2x00dev, 1, rf->rf1);
2003	rt2800_rf_write(rt2x00dev, 2, rf->rf2);
2004	rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
2005	rt2800_rf_write(rt2x00dev, 4, rf->rf4);
2006}
2007
2008static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
2009					 struct ieee80211_conf *conf,
2010					 struct rf_channel *rf,
2011					 struct channel_info *info)
2012{
2013	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2014	u8 rfcsr, calib_tx, calib_rx;
2015
2016	rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
2017
2018	rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
2019	rt2x00_set_field8(&rfcsr, RFCSR3_K, rf->rf3);
2020	rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2021
2022	rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
2023	rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
2024	rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2025
2026	rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
2027	rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, info->default_power1);
2028	rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2029
2030	rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
2031	rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->default_power2);
2032	rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
2033
2034	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2035	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2036	rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD,
2037			  rt2x00dev->default_ant.rx_chain_num <= 1);
2038	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD,
2039			  rt2x00dev->default_ant.rx_chain_num <= 2);
2040	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2041	rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD,
2042			  rt2x00dev->default_ant.tx_chain_num <= 1);
2043	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD,
2044			  rt2x00dev->default_ant.tx_chain_num <= 2);
2045	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2046
2047	rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
2048	rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
2049	rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
2050
2051	if (rt2x00_rt(rt2x00dev, RT3390)) {
2052		calib_tx = conf_is_ht40(conf) ? 0x68 : 0x4f;
2053		calib_rx = conf_is_ht40(conf) ? 0x6f : 0x4f;
2054	} else {
2055		if (conf_is_ht40(conf)) {
2056			calib_tx = drv_data->calibration_bw40;
2057			calib_rx = drv_data->calibration_bw40;
2058		} else {
2059			calib_tx = drv_data->calibration_bw20;
2060			calib_rx = drv_data->calibration_bw20;
2061		}
2062	}
2063
2064	rt2800_rfcsr_read(rt2x00dev, 24, &rfcsr);
2065	rt2x00_set_field8(&rfcsr, RFCSR24_TX_CALIB, calib_tx);
2066	rt2800_rfcsr_write(rt2x00dev, 24, rfcsr);
2067
2068	rt2800_rfcsr_read(rt2x00dev, 31, &rfcsr);
2069	rt2x00_set_field8(&rfcsr, RFCSR31_RX_CALIB, calib_rx);
2070	rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
2071
2072	rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
2073	rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
2074	rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2075
2076	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
2077	rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
2078	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2079	msleep(1);
2080	rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0);
2081	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2082}
2083
2084static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
2085					 struct ieee80211_conf *conf,
2086					 struct rf_channel *rf,
2087					 struct channel_info *info)
2088{
2089	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2090	u8 rfcsr;
2091	u32 reg;
2092
2093	if (rf->channel <= 14) {
2094		rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
2095		rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
2096	} else {
2097		rt2800_bbp_write(rt2x00dev, 25, 0x09);
2098		rt2800_bbp_write(rt2x00dev, 26, 0xff);
2099	}
2100
2101	rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
2102	rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3);
2103
2104	rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
2105	rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
2106	if (rf->channel <= 14)
2107		rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 2);
2108	else
2109		rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 1);
2110	rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2111
2112	rt2800_rfcsr_read(rt2x00dev, 5, &rfcsr);
2113	if (rf->channel <= 14)
2114		rt2x00_set_field8(&rfcsr, RFCSR5_R1, 1);
2115	else
2116		rt2x00_set_field8(&rfcsr, RFCSR5_R1, 2);
2117	rt2800_rfcsr_write(rt2x00dev, 5, rfcsr);
2118
2119	rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
2120	if (rf->channel <= 14) {
2121		rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3);
2122		rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
2123				  info->default_power1);
2124	} else {
2125		rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7);
2126		rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
2127				(info->default_power1 & 0x3) |
2128				((info->default_power1 & 0xC) << 1));
2129	}
2130	rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2131
2132	rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
2133	if (rf->channel <= 14) {
2134		rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3);
2135		rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
2136				  info->default_power2);
2137	} else {
2138		rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7);
2139		rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
2140				(info->default_power2 & 0x3) |
2141				((info->default_power2 & 0xC) << 1));
2142	}
2143	rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
2144
2145	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2146	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2147	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2148	rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2149	rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
2150	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2151	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2152	if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
2153		if (rf->channel <= 14) {
2154			rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2155			rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2156		}
2157		rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2158		rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2159	} else {
2160		switch (rt2x00dev->default_ant.tx_chain_num) {
2161		case 1:
2162			rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2163		case 2:
2164			rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2165			break;
2166		}
2167
2168		switch (rt2x00dev->default_ant.rx_chain_num) {
2169		case 1:
2170			rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2171		case 2:
2172			rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2173			break;
2174		}
2175	}
2176	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2177
2178	rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
2179	rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
2180	rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
2181
2182	if (conf_is_ht40(conf)) {
2183		rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw40);
2184		rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw40);
2185	} else {
2186		rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw20);
2187		rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw20);
2188	}
2189
2190	if (rf->channel <= 14) {
2191		rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
2192		rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
2193		rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
2194		rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
2195		rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
2196		rfcsr = 0x4c;
2197		rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
2198				  drv_data->txmixer_gain_24g);
2199		rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
2200		rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
2201		rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
2202		rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
2203		rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
2204		rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
2205		rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
2206		rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
2207	} else {
2208		rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
2209		rt2x00_set_field8(&rfcsr, RFCSR7_BIT2, 1);
2210		rt2x00_set_field8(&rfcsr, RFCSR7_BIT3, 0);
2211		rt2x00_set_field8(&rfcsr, RFCSR7_BIT4, 1);
2212		rt2x00_set_field8(&rfcsr, RFCSR7_BITS67, 0);
2213		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2214		rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
2215		rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
2216		rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
2217		rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
2218		rfcsr = 0x7a;
2219		rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
2220				  drv_data->txmixer_gain_5g);
2221		rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
2222		rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
2223		if (rf->channel <= 64) {
2224			rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
2225			rt2800_rfcsr_write(rt2x00dev, 20, 0xf6);
2226			rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
2227		} else if (rf->channel <= 128) {
2228			rt2800_rfcsr_write(rt2x00dev, 19, 0x74);
2229			rt2800_rfcsr_write(rt2x00dev, 20, 0xf4);
2230			rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
2231		} else {
2232			rt2800_rfcsr_write(rt2x00dev, 19, 0x72);
2233			rt2800_rfcsr_write(rt2x00dev, 20, 0xf3);
2234			rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
2235		}
2236		rt2800_rfcsr_write(rt2x00dev, 26, 0x87);
2237		rt2800_rfcsr_write(rt2x00dev, 27, 0x01);
2238		rt2800_rfcsr_write(rt2x00dev, 29, 0x9f);
2239	}
2240
2241	rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
2242	rt2x00_set_field32(&reg, GPIO_CTRL_DIR7, 0);
2243	if (rf->channel <= 14)
2244		rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 1);
2245	else
2246		rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 0);
2247	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
2248
2249	rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
2250	rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
2251	rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2252}
2253
2254static void rt2800_config_channel_rf3053(struct rt2x00_dev *rt2x00dev,
2255					 struct ieee80211_conf *conf,
2256					 struct rf_channel *rf,
2257					 struct channel_info *info)
2258{
2259	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2260	u8 txrx_agc_fc;
2261	u8 txrx_h20m;
2262	u8 rfcsr;
2263	u8 bbp;
2264	const bool txbf_enabled = false; /* TODO */
2265
2266	/* TODO: use TX{0,1,2}FinePowerControl values from EEPROM */
2267	rt2800_bbp_read(rt2x00dev, 109, &bbp);
2268	rt2x00_set_field8(&bbp, BBP109_TX0_POWER, 0);
2269	rt2x00_set_field8(&bbp, BBP109_TX1_POWER, 0);
2270	rt2800_bbp_write(rt2x00dev, 109, bbp);
2271
2272	rt2800_bbp_read(rt2x00dev, 110, &bbp);
2273	rt2x00_set_field8(&bbp, BBP110_TX2_POWER, 0);
2274	rt2800_bbp_write(rt2x00dev, 110, bbp);
2275
2276	if (rf->channel <= 14) {
2277		/* Restore BBP 25 & 26 for 2.4 GHz */
2278		rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
2279		rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
2280	} else {
2281		/* Hard code BBP 25 & 26 for 5GHz */
2282
2283		/* Enable IQ Phase correction */
2284		rt2800_bbp_write(rt2x00dev, 25, 0x09);
2285		/* Setup IQ Phase correction value */
2286		rt2800_bbp_write(rt2x00dev, 26, 0xff);
2287	}
2288
2289	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2290	rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3 & 0xf);
2291
2292	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
2293	rt2x00_set_field8(&rfcsr, RFCSR11_R, (rf->rf2 & 0x3));
2294	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2295
2296	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
2297	rt2x00_set_field8(&rfcsr, RFCSR11_PLL_IDOH, 1);
2298	if (rf->channel <= 14)
2299		rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 1);
2300	else
2301		rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 2);
2302	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2303
2304	rt2800_rfcsr_read(rt2x00dev, 53, &rfcsr);
2305	if (rf->channel <= 14) {
2306		rfcsr = 0;
2307		rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
2308				  info->default_power1 & 0x1f);
2309	} else {
2310		if (rt2x00_is_usb(rt2x00dev))
2311			rfcsr = 0x40;
2312
2313		rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
2314				  ((info->default_power1 & 0x18) << 1) |
2315				  (info->default_power1 & 7));
2316	}
2317	rt2800_rfcsr_write(rt2x00dev, 53, rfcsr);
2318
2319	rt2800_rfcsr_read(rt2x00dev, 55, &rfcsr);
2320	if (rf->channel <= 14) {
2321		rfcsr = 0;
2322		rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
2323				  info->default_power2 & 0x1f);
2324	} else {
2325		if (rt2x00_is_usb(rt2x00dev))
2326			rfcsr = 0x40;
2327
2328		rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
2329				  ((info->default_power2 & 0x18) << 1) |
2330				  (info->default_power2 & 7));
2331	}
2332	rt2800_rfcsr_write(rt2x00dev, 55, rfcsr);
2333
2334	rt2800_rfcsr_read(rt2x00dev, 54, &rfcsr);
2335	if (rf->channel <= 14) {
2336		rfcsr = 0;
2337		rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
2338				  info->default_power3 & 0x1f);
2339	} else {
2340		if (rt2x00_is_usb(rt2x00dev))
2341			rfcsr = 0x40;
2342
2343		rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
2344				  ((info->default_power3 & 0x18) << 1) |
2345				  (info->default_power3 & 7));
2346	}
2347	rt2800_rfcsr_write(rt2x00dev, 54, rfcsr);
2348
2349	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2350	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2351	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2352	rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2353	rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
2354	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2355	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2356	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
2357	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
2358
2359	switch (rt2x00dev->default_ant.tx_chain_num) {
2360	case 3:
2361		rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2362		/* fallthrough */
2363	case 2:
2364		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2365		/* fallthrough */
2366	case 1:
2367		rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2368		break;
2369	}
2370
2371	switch (rt2x00dev->default_ant.rx_chain_num) {
2372	case 3:
2373		rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2374		/* fallthrough */
2375	case 2:
2376		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2377		/* fallthrough */
2378	case 1:
2379		rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2380		break;
2381	}
2382	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2383
2384	rt2800_adjust_freq_offset(rt2x00dev);
2385
2386	if (conf_is_ht40(conf)) {
2387		txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw40,
2388						RFCSR24_TX_AGC_FC);
2389		txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw40,
2390					      RFCSR24_TX_H20M);
2391	} else {
2392		txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw20,
2393						RFCSR24_TX_AGC_FC);
2394		txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw20,
2395					      RFCSR24_TX_H20M);
2396	}
2397
2398	/* NOTE: the reference driver does not writes the new value
2399	 * back to RFCSR 32
2400	 */
2401	rt2800_rfcsr_read(rt2x00dev, 32, &rfcsr);
2402	rt2x00_set_field8(&rfcsr, RFCSR32_TX_AGC_FC, txrx_agc_fc);
2403
2404	if (rf->channel <= 14)
2405		rfcsr = 0xa0;
2406	else
2407		rfcsr = 0x80;
2408	rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
2409
2410	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
2411	rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, txrx_h20m);
2412	rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, txrx_h20m);
2413	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2414
2415	/* Band selection */
2416	rt2800_rfcsr_read(rt2x00dev, 36, &rfcsr);
2417	if (rf->channel <= 14)
2418		rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
2419	else
2420		rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
2421	rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
2422
2423	rt2800_rfcsr_read(rt2x00dev, 34, &rfcsr);
2424	if (rf->channel <= 14)
2425		rfcsr = 0x3c;
2426	else
2427		rfcsr = 0x20;
2428	rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
2429
2430	rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
2431	if (rf->channel <= 14)
2432		rfcsr = 0x1a;
2433	else
2434		rfcsr = 0x12;
2435	rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2436
2437	rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
2438	if (rf->channel >= 1 && rf->channel <= 14)
2439		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
2440	else if (rf->channel >= 36 && rf->channel <= 64)
2441		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
2442	else if (rf->channel >= 100 && rf->channel <= 128)
2443		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
2444	else
2445		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
2446	rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2447
2448	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
2449	rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
2450	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2451
2452	rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
2453
2454	if (rf->channel <= 14) {
2455		rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
2456		rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
2457	} else {
2458		rt2800_rfcsr_write(rt2x00dev, 10, 0xd8);
2459		rt2800_rfcsr_write(rt2x00dev, 13, 0x23);
2460	}
2461
2462	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
2463	rt2x00_set_field8(&rfcsr, RFCSR51_BITS01, 1);
2464	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
2465
2466	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
2467	if (rf->channel <= 14) {
2468		rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 5);
2469		rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 3);
2470	} else {
2471		rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 4);
2472		rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 2);
2473	}
2474	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
2475
2476	rt2800_rfcsr_read(rt2x00dev, 49, &rfcsr);
2477	if (rf->channel <= 14)
2478		rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 3);
2479	else
2480		rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 2);
2481
2482	if (txbf_enabled)
2483		rt2x00_set_field8(&rfcsr, RFCSR49_TX_DIV, 1);
2484
2485	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
2486
2487	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
2488	rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO1_EN, 0);
2489	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
2490
2491	rt2800_rfcsr_read(rt2x00dev, 57, &rfcsr);
2492	if (rf->channel <= 14)
2493		rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x1b);
2494	else
2495		rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x0f);
2496	rt2800_rfcsr_write(rt2x00dev, 57, rfcsr);
2497
2498	if (rf->channel <= 14) {
2499		rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
2500		rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
2501	} else {
2502		rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
2503		rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
2504	}
2505
2506	/* Initiate VCO calibration */
2507	rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
2508	if (rf->channel <= 14) {
2509		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
2510	} else {
2511		rt2x00_set_field8(&rfcsr, RFCSR3_BIT1, 1);
2512		rt2x00_set_field8(&rfcsr, RFCSR3_BIT2, 1);
2513		rt2x00_set_field8(&rfcsr, RFCSR3_BIT3, 1);
2514		rt2x00_set_field8(&rfcsr, RFCSR3_BIT4, 1);
2515		rt2x00_set_field8(&rfcsr, RFCSR3_BIT5, 1);
2516		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
2517	}
2518	rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2519
2520	if (rf->channel >= 1 && rf->channel <= 14) {
2521		rfcsr = 0x23;
2522		if (txbf_enabled)
2523			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2524		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2525
2526		rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
2527	} else if (rf->channel >= 36 && rf->channel <= 64) {
2528		rfcsr = 0x36;
2529		if (txbf_enabled)
2530			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2531		rt2800_rfcsr_write(rt2x00dev, 39, 0x36);
2532
2533		rt2800_rfcsr_write(rt2x00dev, 45, 0xeb);
2534	} else if (rf->channel >= 100 && rf->channel <= 128) {
2535		rfcsr = 0x32;
2536		if (txbf_enabled)
2537			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2538		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2539
2540		rt2800_rfcsr_write(rt2x00dev, 45, 0xb3);
2541	} else {
2542		rfcsr = 0x30;
2543		if (txbf_enabled)
2544			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2545		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2546
2547		rt2800_rfcsr_write(rt2x00dev, 45, 0x9b);
2548	}
2549}
2550
2551#define POWER_BOUND		0x27
2552#define POWER_BOUND_5G		0x2b
2553
2554static void rt2800_config_channel_rf3290(struct rt2x00_dev *rt2x00dev,
2555					 struct ieee80211_conf *conf,
2556					 struct rf_channel *rf,
2557					 struct channel_info *info)
2558{
2559	u8 rfcsr;
2560
2561	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2562	rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
2563	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
2564	rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2);
2565	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2566
2567	rt2800_rfcsr_read(rt2x00dev, 49, &rfcsr);
2568	if (info->default_power1 > POWER_BOUND)
2569		rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND);
2570	else
2571		rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
2572	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
2573
2574	rt2800_adjust_freq_offset(rt2x00dev);
2575
2576	if (rf->channel <= 14) {
2577		if (rf->channel == 6)
2578			rt2800_bbp_write(rt2x00dev, 68, 0x0c);
2579		else
2580			rt2800_bbp_write(rt2x00dev, 68, 0x0b);
2581
2582		if (rf->channel >= 1 && rf->channel <= 6)
2583			rt2800_bbp_write(rt2x00dev, 59, 0x0f);
2584		else if (rf->channel >= 7 && rf->channel <= 11)
2585			rt2800_bbp_write(rt2x00dev, 59, 0x0e);
2586		else if (rf->channel >= 12 && rf->channel <= 14)
2587			rt2800_bbp_write(rt2x00dev, 59, 0x0d);
2588	}
2589}
2590
2591static void rt2800_config_channel_rf3322(struct rt2x00_dev *rt2x00dev,
2592					 struct ieee80211_conf *conf,
2593					 struct rf_channel *rf,
2594					 struct channel_info *info)
2595{
2596	u8 rfcsr;
2597
2598	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2599	rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
2600
2601	rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
2602	rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
2603	rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
2604
2605	if (info->default_power1 > POWER_BOUND)
2606		rt2800_rfcsr_write(rt2x00dev, 47, POWER_BOUND);
2607	else
2608		rt2800_rfcsr_write(rt2x00dev, 47, info->default_power1);
2609
2610	if (info->default_power2 > POWER_BOUND)
2611		rt2800_rfcsr_write(rt2x00dev, 48, POWER_BOUND);
2612	else
2613		rt2800_rfcsr_write(rt2x00dev, 48, info->default_power2);
2614
2615	rt2800_adjust_freq_offset(rt2x00dev);
2616
2617	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2618	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2619	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2620
2621	if ( rt2x00dev->default_ant.tx_chain_num == 2 )
2622		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2623	else
2624		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
2625
2626	if ( rt2x00dev->default_ant.rx_chain_num == 2 )
2627		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2628	else
2629		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2630
2631	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2632	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2633
2634	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2635
2636	rt2800_rfcsr_write(rt2x00dev, 31, 80);
2637}
2638
2639static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
2640					 struct ieee80211_conf *conf,
2641					 struct rf_channel *rf,
2642					 struct channel_info *info)
2643{
2644	u8 rfcsr;
2645
2646	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2647	rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
2648	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
2649	rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2);
2650	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2651
2652	rt2800_rfcsr_read(rt2x00dev, 49, &rfcsr);
2653	if (info->default_power1 > POWER_BOUND)
2654		rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND);
2655	else
2656		rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
2657	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
2658
2659	if (rt2x00_rt(rt2x00dev, RT5392)) {
2660		rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
2661		if (info->default_power2 > POWER_BOUND)
2662			rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND);
2663		else
2664			rt2x00_set_field8(&rfcsr, RFCSR50_TX,
2665					  info->default_power2);
2666		rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
2667	}
2668
2669	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2670	if (rt2x00_rt(rt2x00dev, RT5392)) {
2671		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2672		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2673	}
2674	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
2675	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
2676	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2677	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2678	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2679
2680	rt2800_adjust_freq_offset(rt2x00dev);
2681
2682	if (rf->channel <= 14) {
2683		int idx = rf->channel-1;
2684
2685		if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
2686			if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
2687				/* r55/r59 value array of channel 1~14 */
2688				static const char r55_bt_rev[] = {0x83, 0x83,
2689					0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
2690					0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
2691				static const char r59_bt_rev[] = {0x0e, 0x0e,
2692					0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
2693					0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
2694
2695				rt2800_rfcsr_write(rt2x00dev, 55,
2696						   r55_bt_rev[idx]);
2697				rt2800_rfcsr_write(rt2x00dev, 59,
2698						   r59_bt_rev[idx]);
2699			} else {
2700				static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
2701					0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
2702					0x88, 0x88, 0x86, 0x85, 0x84};
2703
2704				rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
2705			}
2706		} else {
2707			if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
2708				static const char r55_nonbt_rev[] = {0x23, 0x23,
2709					0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
2710					0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
2711				static const char r59_nonbt_rev[] = {0x07, 0x07,
2712					0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
2713					0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
2714
2715				rt2800_rfcsr_write(rt2x00dev, 55,
2716						   r55_nonbt_rev[idx]);
2717				rt2800_rfcsr_write(rt2x00dev, 59,
2718						   r59_nonbt_rev[idx]);
2719			} else if (rt2x00_rt(rt2x00dev, RT5390) ||
2720				   rt2x00_rt(rt2x00dev, RT5392)) {
2721				static const char r59_non_bt[] = {0x8f, 0x8f,
2722					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
2723					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
2724
2725				rt2800_rfcsr_write(rt2x00dev, 59,
2726						   r59_non_bt[idx]);
2727			}
2728		}
2729	}
2730}
2731
2732static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev,
2733					 struct ieee80211_conf *conf,
2734					 struct rf_channel *rf,
2735					 struct channel_info *info)
2736{
2737	u8 rfcsr, ep_reg;
2738	u32 reg;
2739	int power_bound;
2740
2741	/* TODO */
2742	const bool is_11b = false;
2743	const bool is_type_ep = false;
2744
2745	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
2746	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL,
2747			   (rf->channel > 14 || conf_is_ht40(conf)) ? 5 : 0);
2748	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
2749
2750	/* Order of values on rf_channel entry: N, K, mod, R */
2751	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1 & 0xff);
2752
2753	rt2800_rfcsr_read(rt2x00dev,  9, &rfcsr);
2754	rt2x00_set_field8(&rfcsr, RFCSR9_K, rf->rf2 & 0xf);
2755	rt2x00_set_field8(&rfcsr, RFCSR9_N, (rf->rf1 & 0x100) >> 8);
2756	rt2x00_set_field8(&rfcsr, RFCSR9_MOD, ((rf->rf3 - 8) & 0x4) >> 2);
2757	rt2800_rfcsr_write(rt2x00dev, 9, rfcsr);
2758
2759	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
2760	rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf4 - 1);
2761	rt2x00_set_field8(&rfcsr, RFCSR11_MOD, (rf->rf3 - 8) & 0x3);
2762	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2763
2764	if (rf->channel <= 14) {
2765		rt2800_rfcsr_write(rt2x00dev, 10, 0x90);
2766		/* FIXME: RF11 owerwrite ? */
2767		rt2800_rfcsr_write(rt2x00dev, 11, 0x4A);
2768		rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
2769		rt2800_rfcsr_write(rt2x00dev, 13, 0x42);
2770		rt2800_rfcsr_write(rt2x00dev, 22, 0x40);
2771		rt2800_rfcsr_write(rt2x00dev, 24, 0x4A);
2772		rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
2773		rt2800_rfcsr_write(rt2x00dev, 27, 0x42);
2774		rt2800_rfcsr_write(rt2x00dev, 36, 0x80);
2775		rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
2776		rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
2777		rt2800_rfcsr_write(rt2x00dev, 39, 0x1B);
2778		rt2800_rfcsr_write(rt2x00dev, 40, 0x0D);
2779		rt2800_rfcsr_write(rt2x00dev, 41, 0x9B);
2780		rt2800_rfcsr_write(rt2x00dev, 42, 0xD5);
2781		rt2800_rfcsr_write(rt2x00dev, 43, 0x72);
2782		rt2800_rfcsr_write(rt2x00dev, 44, 0x0E);
2783		rt2800_rfcsr_write(rt2x00dev, 45, 0xA2);
2784		rt2800_rfcsr_write(rt2x00dev, 46, 0x6B);
2785		rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
2786		rt2800_rfcsr_write(rt2x00dev, 51, 0x3E);
2787		rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
2788		rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
2789		rt2800_rfcsr_write(rt2x00dev, 56, 0xA1);
2790		rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
2791		rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
2792		rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
2793		rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
2794		rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
2795
2796		/* TODO RF27 <- tssi */
2797
2798		rfcsr = rf->channel <= 10 ? 0x07 : 0x06;
2799		rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
2800		rt2800_rfcsr_write(rt2x00dev, 59, rfcsr);
2801
2802		if (is_11b) {
2803			/* CCK */
2804			rt2800_rfcsr_write(rt2x00dev, 31, 0xF8);
2805			rt2800_rfcsr_write(rt2x00dev, 32, 0xC0);
2806			if (is_type_ep)
2807				rt2800_rfcsr_write(rt2x00dev, 55, 0x06);
2808			else
2809				rt2800_rfcsr_write(rt2x00dev, 55, 0x47);
2810		} else {
2811			/* OFDM */
2812			if (is_type_ep)
2813				rt2800_rfcsr_write(rt2x00dev, 55, 0x03);
2814			else
2815				rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
2816		}
2817
2818		power_bound = POWER_BOUND;
2819		ep_reg = 0x2;
2820	} else {
2821		rt2800_rfcsr_write(rt2x00dev, 10, 0x97);
2822		/* FIMXE: RF11 overwrite */
2823		rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
2824		rt2800_rfcsr_write(rt2x00dev, 25, 0xBF);
2825		rt2800_rfcsr_write(rt2x00dev, 27, 0x42);
2826		rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
2827		rt2800_rfcsr_write(rt2x00dev, 37, 0x04);
2828		rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
2829		rt2800_rfcsr_write(rt2x00dev, 40, 0x42);
2830		rt2800_rfcsr_write(rt2x00dev, 41, 0xBB);
2831		rt2800_rfcsr_write(rt2x00dev, 42, 0xD7);
2832		rt2800_rfcsr_write(rt2x00dev, 45, 0x41);
2833		rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
2834		rt2800_rfcsr_write(rt2x00dev, 57, 0x77);
2835		rt2800_rfcsr_write(rt2x00dev, 60, 0x05);
2836		rt2800_rfcsr_write(rt2x00dev, 61, 0x01);
2837
2838		/* TODO RF27 <- tssi */
2839
2840		if (rf->channel >= 36 && rf->channel <= 64) {
2841
2842			rt2800_rfcsr_write(rt2x00dev, 12, 0x2E);
2843			rt2800_rfcsr_write(rt2x00dev, 13, 0x22);
2844			rt2800_rfcsr_write(rt2x00dev, 22, 0x60);
2845			rt2800_rfcsr_write(rt2x00dev, 23, 0x7F);
2846			if (rf->channel <= 50)
2847				rt2800_rfcsr_write(rt2x00dev, 24, 0x09);
2848			else if (rf->channel >= 52)
2849				rt2800_rfcsr_write(rt2x00dev, 24, 0x07);
2850			rt2800_rfcsr_write(rt2x00dev, 39, 0x1C);
2851			rt2800_rfcsr_write(rt2x00dev, 43, 0x5B);
2852			rt2800_rfcsr_write(rt2x00dev, 44, 0X40);
2853			rt2800_rfcsr_write(rt2x00dev, 46, 0X00);
2854			rt2800_rfcsr_write(rt2x00dev, 51, 0xFE);
2855			rt2800_rfcsr_write(rt2x00dev, 52, 0x0C);
2856			rt2800_rfcsr_write(rt2x00dev, 54, 0xF8);
2857			if (rf->channel <= 50) {
2858				rt2800_rfcsr_write(rt2x00dev, 55, 0x06),
2859				rt2800_rfcsr_write(rt2x00dev, 56, 0xD3);
2860			} else if (rf->channel >= 52) {
2861				rt2800_rfcsr_write(rt2x00dev, 55, 0x04);
2862				rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
2863			}
2864
2865			rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
2866			rt2800_rfcsr_write(rt2x00dev, 59, 0x7F);
2867			rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
2868
2869		} else if (rf->channel >= 100 && rf->channel <= 165) {
2870
2871			rt2800_rfcsr_write(rt2x00dev, 12, 0x0E);
2872			rt2800_rfcsr_write(rt2x00dev, 13, 0x42);
2873			rt2800_rfcsr_write(rt2x00dev, 22, 0x40);
2874			if (rf->channel <= 153) {
2875				rt2800_rfcsr_write(rt2x00dev, 23, 0x3C);
2876				rt2800_rfcsr_write(rt2x00dev, 24, 0x06);
2877			} else if (rf->channel >= 155) {
2878				rt2800_rfcsr_write(rt2x00dev, 23, 0x38);
2879				rt2800_rfcsr_write(rt2x00dev, 24, 0x05);
2880			}
2881			if (rf->channel <= 138) {
2882				rt2800_rfcsr_write(rt2x00dev, 39, 0x1A);
2883				rt2800_rfcsr_write(rt2x00dev, 43, 0x3B);
2884				rt2800_rfcsr_write(rt2x00dev, 44, 0x20);
2885				rt2800_rfcsr_write(rt2x00dev, 46, 0x18);
2886			} else if (rf->channel >= 140) {
2887				rt2800_rfcsr_write(rt2x00dev, 39, 0x18);
2888				rt2800_rfcsr_write(rt2x00dev, 43, 0x1B);
2889				rt2800_rfcsr_write(rt2x00dev, 44, 0x10);
2890				rt2800_rfcsr_write(rt2x00dev, 46, 0X08);
2891			}
2892			if (rf->channel <= 124)
2893				rt2800_rfcsr_write(rt2x00dev, 51, 0xFC);
2894			else if (rf->channel >= 126)
2895				rt2800_rfcsr_write(rt2x00dev, 51, 0xEC);
2896			if (rf->channel <= 138)
2897				rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
2898			else if (rf->channel >= 140)
2899				rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
2900			rt2800_rfcsr_write(rt2x00dev, 54, 0xEB);
2901			if (rf->channel <= 138)
2902				rt2800_rfcsr_write(rt2x00dev, 55, 0x01);
2903			else if (rf->channel >= 140)
2904				rt2800_rfcsr_write(rt2x00dev, 55, 0x00);
2905			if (rf->channel <= 128)
2906				rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
2907			else if (rf->channel >= 130)
2908				rt2800_rfcsr_write(rt2x00dev, 56, 0xAB);
2909			if (rf->channel <= 116)
2910				rt2800_rfcsr_write(rt2x00dev, 58, 0x1D);
2911			else if (rf->channel >= 118)
2912				rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
2913			if (rf->channel <= 138)
2914				rt2800_rfcsr_write(rt2x00dev, 59, 0x3F);
2915			else if (rf->channel >= 140)
2916				rt2800_rfcsr_write(rt2x00dev, 59, 0x7C);
2917			if (rf->channel <= 116)
2918				rt2800_rfcsr_write(rt2x00dev, 62, 0x1D);
2919			else if (rf->channel >= 118)
2920				rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
2921		}
2922
2923		power_bound = POWER_BOUND_5G;
2924		ep_reg = 0x3;
2925	}
2926
2927	rt2800_rfcsr_read(rt2x00dev, 49, &rfcsr);
2928	if (info->default_power1 > power_bound)
2929		rt2x00_set_field8(&rfcsr, RFCSR49_TX, power_bound);
2930	else
2931		rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
2932	if (is_type_ep)
2933		rt2x00_set_field8(&rfcsr, RFCSR49_EP, ep_reg);
2934	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
2935
2936	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
2937	if (info->default_power2 > power_bound)
2938		rt2x00_set_field8(&rfcsr, RFCSR50_TX, power_bound);
2939	else
2940		rt2x00_set_field8(&rfcsr, RFCSR50_TX, info->default_power2);
2941	if (is_type_ep)
2942		rt2x00_set_field8(&rfcsr, RFCSR50_EP, ep_reg);
2943	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
2944
2945	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
2946	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
2947	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
2948
2949	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD,
2950			  rt2x00dev->default_ant.tx_chain_num >= 1);
2951	rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD,
2952			  rt2x00dev->default_ant.tx_chain_num == 2);
2953	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2954
2955	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD,
2956			  rt2x00dev->default_ant.rx_chain_num >= 1);
2957	rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD,
2958			  rt2x00dev->default_ant.rx_chain_num == 2);
2959	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2960
2961	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2962	rt2800_rfcsr_write(rt2x00dev, 6, 0xe4);
2963
2964	if (conf_is_ht40(conf))
2965		rt2800_rfcsr_write(rt2x00dev, 30, 0x16);
2966	else
2967		rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
2968
2969	if (!is_11b) {
2970		rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
2971		rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
2972	}
2973
2974	/* TODO proper frequency adjustment */
2975	rt2800_adjust_freq_offset(rt2x00dev);
2976
2977	/* TODO merge with others */
2978	rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
2979	rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
2980	rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2981
2982	/* BBP settings */
2983	rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
2984	rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
2985	rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
2986
2987	rt2800_bbp_write(rt2x00dev, 79, (rf->channel <= 14) ? 0x1C : 0x18);
2988	rt2800_bbp_write(rt2x00dev, 80, (rf->channel <= 14) ? 0x0E : 0x08);
2989	rt2800_bbp_write(rt2x00dev, 81, (rf->channel <= 14) ? 0x3A : 0x38);
2990	rt2800_bbp_write(rt2x00dev, 82, (rf->channel <= 14) ? 0x62 : 0x92);
2991
2992	/* GLRT band configuration */
2993	rt2800_bbp_write(rt2x00dev, 195, 128);
2994	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0xE0 : 0xF0);
2995	rt2800_bbp_write(rt2x00dev, 195, 129);
2996	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x1F : 0x1E);
2997	rt2800_bbp_write(rt2x00dev, 195, 130);
2998	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x38 : 0x28);
2999	rt2800_bbp_write(rt2x00dev, 195, 131);
3000	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x32 : 0x20);
3001	rt2800_bbp_write(rt2x00dev, 195, 133);
3002	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x28 : 0x7F);
3003	rt2800_bbp_write(rt2x00dev, 195, 124);
3004	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
3005}
3006
3007static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
3008					   const unsigned int word,
3009					   const u8 value)
3010{
3011	u8 chain, reg;
3012
3013	for (chain = 0; chain < rt2x00dev->default_ant.rx_chain_num; chain++) {
3014		rt2800_bbp_read(rt2x00dev, 27, &reg);
3015		rt2x00_set_field8(&reg,  BBP27_RX_CHAIN_SEL, chain);
3016		rt2800_bbp_write(rt2x00dev, 27, reg);
3017
3018		rt2800_bbp_write(rt2x00dev, word, value);
3019	}
3020}
3021
3022static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel)
3023{
3024	u8 cal;
3025
3026	/* TX0 IQ Gain */
3027	rt2800_bbp_write(rt2x00dev, 158, 0x2c);
3028	if (channel <= 14)
3029		cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX0_2G);
3030	else if (channel >= 36 && channel <= 64)
3031		cal = rt2x00_eeprom_byte(rt2x00dev,
3032					 EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G);
3033	else if (channel >= 100 && channel <= 138)
3034		cal = rt2x00_eeprom_byte(rt2x00dev,
3035					 EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G);
3036	else if (channel >= 140 && channel <= 165)
3037		cal = rt2x00_eeprom_byte(rt2x00dev,
3038					 EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G);
3039	else
3040		cal = 0;
3041	rt2800_bbp_write(rt2x00dev, 159, cal);
3042
3043	/* TX0 IQ Phase */
3044	rt2800_bbp_write(rt2x00dev, 158, 0x2d);
3045	if (channel <= 14)
3046		cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX0_2G);
3047	else if (channel >= 36 && channel <= 64)
3048		cal = rt2x00_eeprom_byte(rt2x00dev,
3049					 EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G);
3050	else if (channel >= 100 && channel <= 138)
3051		cal = rt2x00_eeprom_byte(rt2x00dev,
3052					 EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G);
3053	else if (channel >= 140 && channel <= 165)
3054		cal = rt2x00_eeprom_byte(rt2x00dev,
3055					 EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G);
3056	else
3057		cal = 0;
3058	rt2800_bbp_write(rt2x00dev, 159, cal);
3059
3060	/* TX1 IQ Gain */
3061	rt2800_bbp_write(rt2x00dev, 158, 0x4a);
3062	if (channel <= 14)
3063		cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX1_2G);
3064	else if (channel >= 36 && channel <= 64)
3065		cal = rt2x00_eeprom_byte(rt2x00dev,
3066					 EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G);
3067	else if (channel >= 100 && channel <= 138)
3068		cal = rt2x00_eeprom_byte(rt2x00dev,
3069					 EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G);
3070	else if (channel >= 140 && channel <= 165)
3071		cal = rt2x00_eeprom_byte(rt2x00dev,
3072					 EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G);
3073	else
3074		cal = 0;
3075	rt2800_bbp_write(rt2x00dev, 159, cal);
3076
3077	/* TX1 IQ Phase */
3078	rt2800_bbp_write(rt2x00dev, 158, 0x4b);
3079	if (channel <= 14)
3080		cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX1_2G);
3081	else if (channel >= 36 && channel <= 64)
3082		cal = rt2x00_eeprom_byte(rt2x00dev,
3083					 EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G);
3084	else if (channel >= 100 && channel <= 138)
3085		cal = rt2x00_eeprom_byte(rt2x00dev,
3086					 EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G);
3087	else if (channel >= 140 && channel <= 165)
3088		cal = rt2x00_eeprom_byte(rt2x00dev,
3089					 EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G);
3090	else
3091		cal = 0;
3092	rt2800_bbp_write(rt2x00dev, 159, cal);
3093
3094	/* FIXME: possible RX0, RX1 callibration ? */
3095
3096	/* RF IQ compensation control */
3097	rt2800_bbp_write(rt2x00dev, 158, 0x04);
3098	cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_COMPENSATION_CONTROL);
3099	rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
3100
3101	/* RF IQ imbalance compensation control */
3102	rt2800_bbp_write(rt2x00dev, 158, 0x03);
3103	cal = rt2x00_eeprom_byte(rt2x00dev,
3104				 EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL);
3105	rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
3106}
3107
3108static char rt2800_txpower_to_dev(struct rt2x00_dev *rt2x00dev,
3109				  unsigned int channel,
3110				  char txpower)
3111{
3112	if (rt2x00_rt(rt2x00dev, RT3593))
3113		txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
3114
3115	if (channel <= 14)
3116		return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
3117
3118	if (rt2x00_rt(rt2x00dev, RT3593))
3119		return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
3120			       MAX_A_TXPOWER_3593);
3121	else
3122		return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
3123}
3124
3125static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
3126				  struct ieee80211_conf *conf,
3127				  struct rf_channel *rf,
3128				  struct channel_info *info)
3129{
3130	u32 reg;
3131	unsigned int tx_pin;
3132	u8 bbp, rfcsr;
3133
3134	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
3135						     info->default_power1);
3136	info->default_power2 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
3137						     info->default_power2);
3138	if (rt2x00dev->default_ant.tx_chain_num > 2)
3139		info->default_power3 =
3140			rt2800_txpower_to_dev(rt2x00dev, rf->channel,
3141					      info->default_power3);
3142
3143	switch (rt2x00dev->chip.rf) {
3144	case RF2020:
3145	case RF3020:
3146	case RF3021:
3147	case RF3022:
3148	case RF3320:
3149		rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info);
3150		break;
3151	case RF3052:
3152		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
3153		break;
3154	case RF3053:
3155		rt2800_config_channel_rf3053(rt2x00dev, conf, rf, info);
3156		break;
3157	case RF3290:
3158		rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info);
3159		break;
3160	case RF3322:
3161		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
3162		break;
3163	case RF3070:
3164	case RF5360:
3165	case RF5362:
3166	case RF5370:
3167	case RF5372:
3168	case RF5390:
3169	case RF5392:
3170		rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
3171		break;
3172	case RF5592:
3173		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info);
3174		break;
3175	default:
3176		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
3177	}
3178
3179	if (rt2x00_rf(rt2x00dev, RF3070) ||
3180	    rt2x00_rf(rt2x00dev, RF3290) ||
3181	    rt2x00_rf(rt2x00dev, RF3322) ||
3182	    rt2x00_rf(rt2x00dev, RF5360) ||
3183	    rt2x00_rf(rt2x00dev, RF5362) ||
3184	    rt2x00_rf(rt2x00dev, RF5370) ||
3185	    rt2x00_rf(rt2x00dev, RF5372) ||
3186	    rt2x00_rf(rt2x00dev, RF5390) ||
3187	    rt2x00_rf(rt2x00dev, RF5392)) {
3188		rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
3189		rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, 0);
3190		rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, 0);
3191		rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
3192
3193		rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
3194		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
3195		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
3196	}
3197
3198	/*
3199	 * Change BBP settings
3200	 */
3201	if (rt2x00_rt(rt2x00dev, RT3352)) {
3202		rt2800_bbp_write(rt2x00dev, 27, 0x0);
3203		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
3204		rt2800_bbp_write(rt2x00dev, 27, 0x20);
3205		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
3206	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
3207		if (rf->channel > 14) {
3208			/* Disable CCK Packet detection on 5GHz */
3209			rt2800_bbp_write(rt2x00dev, 70, 0x00);
3210		} else {
3211			rt2800_bbp_write(rt2x00dev, 70, 0x0a);
3212		}
3213
3214		if (conf_is_ht40(conf))
3215			rt2800_bbp_write(rt2x00dev, 105, 0x04);
3216		else
3217			rt2800_bbp_write(rt2x00dev, 105, 0x34);
3218
3219		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
3220		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
3221		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
3222		rt2800_bbp_write(rt2x00dev, 77, 0x98);
3223	} else {
3224		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
3225		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
3226		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
3227		rt2800_bbp_write(rt2x00dev, 86, 0);
3228	}
3229
3230	if (rf->channel <= 14) {
3231		if (!rt2x00_rt(rt2x00dev, RT5390) &&
3232		    !rt2x00_rt(rt2x00dev, RT5392)) {
3233			if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
3234				rt2800_bbp_write(rt2x00dev, 82, 0x62);
3235				rt2800_bbp_write(rt2x00dev, 75, 0x46);
3236			} else {
3237				if (rt2x00_rt(rt2x00dev, RT3593))
3238					rt2800_bbp_write(rt2x00dev, 82, 0x62);
3239				else
3240					rt2800_bbp_write(rt2x00dev, 82, 0x84);
3241				rt2800_bbp_write(rt2x00dev, 75, 0x50);
3242			}
3243			if (rt2x00_rt(rt2x00dev, RT3593))
3244				rt2800_bbp_write(rt2x00dev, 83, 0x8a);
3245		}
3246
3247	} else {
3248		if (rt2x00_rt(rt2x00dev, RT3572))
3249			rt2800_bbp_write(rt2x00dev, 82, 0x94);
3250		else if (rt2x00_rt(rt2x00dev, RT3593))
3251			rt2800_bbp_write(rt2x00dev, 82, 0x82);
3252		else
3253			rt2800_bbp_write(rt2x00dev, 82, 0xf2);
3254
3255		if (rt2x00_rt(rt2x00dev, RT3593))
3256			rt2800_bbp_write(rt2x00dev, 83, 0x9a);
3257
3258		if (rt2x00_has_cap_external_lna_a(rt2x00dev))
3259			rt2800_bbp_write(rt2x00dev, 75, 0x46);
3260		else
3261			rt2800_bbp_write(rt2x00dev, 75, 0x50);
3262	}
3263
3264	rt2800_register_read(rt2x00dev, TX_BAND_CFG, &reg);
3265	rt2x00_set_field32(&reg, TX_BAND_CFG_HT40_MINUS, conf_is_ht40_minus(conf));
3266	rt2x00_set_field32(&reg, TX_BAND_CFG_A, rf->channel > 14);
3267	rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
3268	rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg);
3269
3270	if (rt2x00_rt(rt2x00dev, RT3572))
3271		rt2800_rfcsr_write(rt2x00dev, 8, 0);
3272
3273	tx_pin = 0;
3274
3275	switch (rt2x00dev->default_ant.tx_chain_num) {
3276	case 3:
3277		/* Turn on tertiary PAs */
3278		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN,
3279				   rf->channel > 14);
3280		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN,
3281				   rf->channel <= 14);
3282		/* fall-through */
3283	case 2:
3284		/* Turn on secondary PAs */
3285		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN,
3286				   rf->channel > 14);
3287		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN,
3288				   rf->channel <= 14);
3289		/* fall-through */
3290	case 1:
3291		/* Turn on primary PAs */
3292		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN,
3293				   rf->channel > 14);
3294		if (rt2x00_has_cap_bt_coexist(rt2x00dev))
3295			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
3296		else
3297			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN,
3298					   rf->channel <= 14);
3299		break;
3300	}
3301
3302	switch (rt2x00dev->default_ant.rx_chain_num) {
3303	case 3:
3304		/* Turn on tertiary LNAs */
3305		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1);
3306		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1);
3307		/* fall-through */
3308	case 2:
3309		/* Turn on secondary LNAs */
3310		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
3311		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
3312		/* fall-through */
3313	case 1:
3314		/* Turn on primary LNAs */
3315		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
3316		rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
3317		break;
3318	}
3319
3320	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
3321	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
3322
3323	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
3324
3325	if (rt2x00_rt(rt2x00dev, RT3572)) {
3326		rt2800_rfcsr_write(rt2x00dev, 8, 0x80);
3327
3328		/* AGC init */
3329		if (rf->channel <= 14)
3330			reg = 0x1c + (2 * rt2x00dev->lna_gain);
3331		else
3332			reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3);
3333
3334		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
3335	}
3336
3337	if (rt2x00_rt(rt2x00dev, RT3593)) {
3338		rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
3339
3340		/* Band selection */
3341		if (rt2x00_is_usb(rt2x00dev) ||
3342		    rt2x00_is_pcie(rt2x00dev)) {
3343			/* GPIO #8 controls all paths */
3344			rt2x00_set_field32(&reg, GPIO_CTRL_DIR8, 0);
3345			if (rf->channel <= 14)
3346				rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 1);
3347			else
3348				rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 0);
3349		}
3350
3351		/* LNA PE control. */
3352		if (rt2x00_is_usb(rt2x00dev)) {
3353			/* GPIO #4 controls PE0 and PE1,
3354			 * GPIO #7 controls PE2
3355			 */
3356			rt2x00_set_field32(&reg, GPIO_CTRL_DIR4, 0);
3357			rt2x00_set_field32(&reg, GPIO_CTRL_DIR7, 0);
3358
3359			rt2x00_set_field32(&reg, GPIO_CTRL_VAL4, 1);
3360			rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 1);
3361		} else if (rt2x00_is_pcie(rt2x00dev)) {
3362			/* GPIO #4 controls PE0, PE1 and PE2 */
3363			rt2x00_set_field32(&reg, GPIO_CTRL_DIR4, 0);
3364			rt2x00_set_field32(&reg, GPIO_CTRL_VAL4, 1);
3365		}
3366
3367		rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
3368
3369		/* AGC init */
3370		if (rf->channel <= 14)
3371			reg = 0x1c + 2 * rt2x00dev->lna_gain;
3372		else
3373			reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3);
3374
3375		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
3376
3377		usleep_range(1000, 1500);
3378	}
3379
3380	if (rt2x00_rt(rt2x00dev, RT5592)) {
3381		rt2800_bbp_write(rt2x00dev, 195, 141);
3382		rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
3383
3384		/* AGC init */
3385		reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain;
3386		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
3387
3388		rt2800_iq_calibrate(rt2x00dev, rf->channel);
3389	}
3390
3391	rt2800_bbp_read(rt2x00dev, 4, &bbp);
3392	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
3393	rt2800_bbp_write(rt2x00dev, 4, bbp);
3394
3395	rt2800_bbp_read(rt2x00dev, 3, &bbp);
3396	rt2x00_set_field8(&bbp, BBP3_HT40_MINUS, conf_is_ht40_minus(conf));
3397	rt2800_bbp_write(rt2x00dev, 3, bbp);
3398
3399	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
3400		if (conf_is_ht40(conf)) {
3401			rt2800_bbp_write(rt2x00dev, 69, 0x1a);
3402			rt2800_bbp_write(rt2x00dev, 70, 0x0a);
3403			rt2800_bbp_write(rt2x00dev, 73, 0x16);
3404		} else {
3405			rt2800_bbp_write(rt2x00dev, 69, 0x16);
3406			rt2800_bbp_write(rt2x00dev, 70, 0x08);
3407			rt2800_bbp_write(rt2x00dev, 73, 0x11);
3408		}
3409	}
3410
3411	msleep(1);
3412
3413	/*
3414	 * Clear channel statistic counters
3415	 */
3416	rt2800_register_read(rt2x00dev, CH_IDLE_STA, &reg);
3417	rt2800_register_read(rt2x00dev, CH_BUSY_STA, &reg);
3418	rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC, &reg);
3419
3420	/*
3421	 * Clear update flag
3422	 */
3423	if (rt2x00_rt(rt2x00dev, RT3352)) {
3424		rt2800_bbp_read(rt2x00dev, 49, &bbp);
3425		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
3426		rt2800_bbp_write(rt2x00dev, 49, bbp);
3427	}
3428}
3429
3430static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)
3431{
3432	u8 tssi_bounds[9];
3433	u8 current_tssi;
3434	u16 eeprom;
3435	u8 step;
3436	int i;
3437
3438	/*
3439	 * First check if temperature compensation is supported.
3440	 */
3441	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
3442	if (!rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC))
3443		return 0;
3444
3445	/*
3446	 * Read TSSI boundaries for temperature compensation from
3447	 * the EEPROM.
3448	 *
3449	 * Array idx               0    1    2    3    4    5    6    7    8
3450	 * Matching Delta value   -4   -3   -2   -1    0   +1   +2   +3   +4
3451	 * Example TSSI bounds  0xF0 0xD0 0xB5 0xA0 0x88 0x45 0x25 0x15 0x00
3452	 */
3453	if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
3454		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG1, &eeprom);
3455		tssi_bounds[0] = rt2x00_get_field16(eeprom,
3456					EEPROM_TSSI_BOUND_BG1_MINUS4);
3457		tssi_bounds[1] = rt2x00_get_field16(eeprom,
3458					EEPROM_TSSI_BOUND_BG1_MINUS3);
3459
3460		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG2, &eeprom);
3461		tssi_bounds[2] = rt2x00_get_field16(eeprom,
3462					EEPROM_TSSI_BOUND_BG2_MINUS2);
3463		tssi_bounds[3] = rt2x00_get_field16(eeprom,
3464					EEPROM_TSSI_BOUND_BG2_MINUS1);
3465
3466		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG3, &eeprom);
3467		tssi_bounds[4] = rt2x00_get_field16(eeprom,
3468					EEPROM_TSSI_BOUND_BG3_REF);
3469		tssi_bounds[5] = rt2x00_get_field16(eeprom,
3470					EEPROM_TSSI_BOUND_BG3_PLUS1);
3471
3472		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG4, &eeprom);
3473		tssi_bounds[6] = rt2x00_get_field16(eeprom,
3474					EEPROM_TSSI_BOUND_BG4_PLUS2);
3475		tssi_bounds[7] = rt2x00_get_field16(eeprom,
3476					EEPROM_TSSI_BOUND_BG4_PLUS3);
3477
3478		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG5, &eeprom);
3479		tssi_bounds[8] = rt2x00_get_field16(eeprom,
3480					EEPROM_TSSI_BOUND_BG5_PLUS4);
3481
3482		step = rt2x00_get_field16(eeprom,
3483					  EEPROM_TSSI_BOUND_BG5_AGC_STEP);
3484	} else {
3485		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A1, &eeprom);
3486		tssi_bounds[0] = rt2x00_get_field16(eeprom,
3487					EEPROM_TSSI_BOUND_A1_MINUS4);
3488		tssi_bounds[1] = rt2x00_get_field16(eeprom,
3489					EEPROM_TSSI_BOUND_A1_MINUS3);
3490
3491		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A2, &eeprom);
3492		tssi_bounds[2] = rt2x00_get_field16(eeprom,
3493					EEPROM_TSSI_BOUND_A2_MINUS2);
3494		tssi_bounds[3] = rt2x00_get_field16(eeprom,
3495					EEPROM_TSSI_BOUND_A2_MINUS1);
3496
3497		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A3, &eeprom);
3498		tssi_bounds[4] = rt2x00_get_field16(eeprom,
3499					EEPROM_TSSI_BOUND_A3_REF);
3500		tssi_bounds[5] = rt2x00_get_field16(eeprom,
3501					EEPROM_TSSI_BOUND_A3_PLUS1);
3502
3503		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A4, &eeprom);
3504		tssi_bounds[6] = rt2x00_get_field16(eeprom,
3505					EEPROM_TSSI_BOUND_A4_PLUS2);
3506		tssi_bounds[7] = rt2x00_get_field16(eeprom,
3507					EEPROM_TSSI_BOUND_A4_PLUS3);
3508
3509		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A5, &eeprom);
3510		tssi_bounds[8] = rt2x00_get_field16(eeprom,
3511					EEPROM_TSSI_BOUND_A5_PLUS4);
3512
3513		step = rt2x00_get_field16(eeprom,
3514					  EEPROM_TSSI_BOUND_A5_AGC_STEP);
3515	}
3516
3517	/*
3518	 * Check if temperature compensation is supported.
3519	 */
3520	if (tssi_bounds[4] == 0xff || step == 0xff)
3521		return 0;
3522
3523	/*
3524	 * Read current TSSI (BBP 49).
3525	 */
3526	rt2800_bbp_read(rt2x00dev, 49, &current_tssi);
3527
3528	/*
3529	 * Compare TSSI value (BBP49) with the compensation boundaries
3530	 * from the EEPROM and increase or decrease tx power.
3531	 */
3532	for (i = 0; i <= 3; i++) {
3533		if (current_tssi > tssi_bounds[i])
3534			break;
3535	}
3536
3537	if (i == 4) {
3538		for (i = 8; i >= 5; i--) {
3539			if (current_tssi < tssi_bounds[i])
3540				break;
3541		}
3542	}
3543
3544	return (i - 4) * step;
3545}
3546
3547static int rt2800_get_txpower_bw_comp(struct rt2x00_dev *rt2x00dev,
3548				      enum ieee80211_band band)
3549{
3550	u16 eeprom;
3551	u8 comp_en;
3552	u8 comp_type;
3553	int comp_value = 0;
3554
3555	rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_DELTA, &eeprom);
3556
3557	/*
3558	 * HT40 compensation not required.
3559	 */
3560	if (eeprom == 0xffff ||
3561	    !test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
3562		return 0;
3563
3564	if (band == IEEE80211_BAND_2GHZ) {
3565		comp_en = rt2x00_get_field16(eeprom,
3566				 EEPROM_TXPOWER_DELTA_ENABLE_2G);
3567		if (comp_en) {
3568			comp_type = rt2x00_get_field16(eeprom,
3569					   EEPROM_TXPOWER_DELTA_TYPE_2G);
3570			comp_value = rt2x00_get_field16(eeprom,
3571					    EEPROM_TXPOWER_DELTA_VALUE_2G);
3572			if (!comp_type)
3573				comp_value = -comp_value;
3574		}
3575	} else {
3576		comp_en = rt2x00_get_field16(eeprom,
3577				 EEPROM_TXPOWER_DELTA_ENABLE_5G);
3578		if (comp_en) {
3579			comp_type = rt2x00_get_field16(eeprom,
3580					   EEPROM_TXPOWER_DELTA_TYPE_5G);
3581			comp_value = rt2x00_get_field16(eeprom,
3582					    EEPROM_TXPOWER_DELTA_VALUE_5G);
3583			if (!comp_type)
3584				comp_value = -comp_value;
3585		}
3586	}
3587
3588	return comp_value;
3589}
3590
3591static int rt2800_get_txpower_reg_delta(struct rt2x00_dev *rt2x00dev,
3592					int power_level, int max_power)
3593{
3594	int delta;
3595
3596	if (rt2x00_has_cap_power_limit(rt2x00dev))
3597		return 0;
3598
3599	/*
3600	 * XXX: We don't know the maximum transmit power of our hardware since
3601	 * the EEPROM doesn't expose it. We only know that we are calibrated
3602	 * to 100% tx power.
3603	 *
3604	 * Hence, we assume the regulatory limit that cfg80211 calulated for
3605	 * the current channel is our maximum and if we are requested to lower
3606	 * the value we just reduce our tx power accordingly.
3607	 */
3608	delta = power_level - max_power;
3609	return min(delta, 0);
3610}
3611
3612static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int is_rate_b,
3613				   enum ieee80211_band band, int power_level,
3614				   u8 txpower, int delta)
3615{
3616	u16 eeprom;
3617	u8 criterion;
3618	u8 eirp_txpower;
3619	u8 eirp_txpower_criterion;
3620	u8 reg_limit;
3621
3622	if (rt2x00_rt(rt2x00dev, RT3593))
3623		return min_t(u8, txpower, 0xc);
3624
3625	if (rt2x00_has_cap_power_limit(rt2x00dev)) {
3626		/*
3627		 * Check if eirp txpower exceed txpower_limit.
3628		 * We use OFDM 6M as criterion and its eirp txpower
3629		 * is stored at EEPROM_EIRP_MAX_TX_POWER.
3630		 * .11b data rate need add additional 4dbm
3631		 * when calculating eirp txpower.
3632		 */
3633		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3634					      1, &eeprom);
3635		criterion = rt2x00_get_field16(eeprom,
3636					       EEPROM_TXPOWER_BYRATE_RATE0);
3637
3638		rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER,
3639				   &eeprom);
3640
3641		if (band == IEEE80211_BAND_2GHZ)
3642			eirp_txpower_criterion = rt2x00_get_field16(eeprom,
3643						 EEPROM_EIRP_MAX_TX_POWER_2GHZ);
3644		else
3645			eirp_txpower_criterion = rt2x00_get_field16(eeprom,
3646						 EEPROM_EIRP_MAX_TX_POWER_5GHZ);
3647
3648		eirp_txpower = eirp_txpower_criterion + (txpower - criterion) +
3649			       (is_rate_b ? 4 : 0) + delta;
3650
3651		reg_limit = (eirp_txpower > power_level) ?
3652					(eirp_txpower - power_level) : 0;
3653	} else
3654		reg_limit = 0;
3655
3656	txpower = max(0, txpower + delta - reg_limit);
3657	return min_t(u8, txpower, 0xc);
3658}
3659
3660
3661enum {
3662	TX_PWR_CFG_0_IDX,
3663	TX_PWR_CFG_1_IDX,
3664	TX_PWR_CFG_2_IDX,
3665	TX_PWR_CFG_3_IDX,
3666	TX_PWR_CFG_4_IDX,
3667	TX_PWR_CFG_5_IDX,
3668	TX_PWR_CFG_6_IDX,
3669	TX_PWR_CFG_7_IDX,
3670	TX_PWR_CFG_8_IDX,
3671	TX_PWR_CFG_9_IDX,
3672	TX_PWR_CFG_0_EXT_IDX,
3673	TX_PWR_CFG_1_EXT_IDX,
3674	TX_PWR_CFG_2_EXT_IDX,
3675	TX_PWR_CFG_3_EXT_IDX,
3676	TX_PWR_CFG_4_EXT_IDX,
3677	TX_PWR_CFG_IDX_COUNT,
3678};
3679
3680static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev,
3681					 struct ieee80211_channel *chan,
3682					 int power_level)
3683{
3684	u8 txpower;
3685	u16 eeprom;
3686	u32 regs[TX_PWR_CFG_IDX_COUNT];
3687	unsigned int offset;
3688	enum ieee80211_band band = chan->band;
3689	int delta;
3690	int i;
3691
3692	memset(regs, '\0', sizeof(regs));
3693
3694	/* TODO: adapt TX power reduction from the rt28xx code */
3695
3696	/* calculate temperature compensation delta */
3697	delta = rt2800_get_gain_calibration_delta(rt2x00dev);
3698
3699	if (band == IEEE80211_BAND_5GHZ)
3700		offset = 16;
3701	else
3702		offset = 0;
3703
3704	if (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
3705		offset += 8;
3706
3707	/* read the next four txpower values */
3708	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3709				      offset, &eeprom);
3710
3711	/* CCK 1MBS,2MBS */
3712	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3713	txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
3714					    txpower, delta);
3715	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3716			   TX_PWR_CFG_0_CCK1_CH0, txpower);
3717	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3718			   TX_PWR_CFG_0_CCK1_CH1, txpower);
3719	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
3720			   TX_PWR_CFG_0_EXT_CCK1_CH2, txpower);
3721
3722	/* CCK 5.5MBS,11MBS */
3723	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3724	txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
3725					    txpower, delta);
3726	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3727			   TX_PWR_CFG_0_CCK5_CH0, txpower);
3728	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3729			   TX_PWR_CFG_0_CCK5_CH1, txpower);
3730	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
3731			   TX_PWR_CFG_0_EXT_CCK5_CH2, txpower);
3732
3733	/* OFDM 6MBS,9MBS */
3734	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3735	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3736					    txpower, delta);
3737	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3738			   TX_PWR_CFG_0_OFDM6_CH0, txpower);
3739	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3740			   TX_PWR_CFG_0_OFDM6_CH1, txpower);
3741	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
3742			   TX_PWR_CFG_0_EXT_OFDM6_CH2, txpower);
3743
3744	/* OFDM 12MBS,18MBS */
3745	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
3746	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3747					    txpower, delta);
3748	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3749			   TX_PWR_CFG_0_OFDM12_CH0, txpower);
3750	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
3751			   TX_PWR_CFG_0_OFDM12_CH1, txpower);
3752	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
3753			   TX_PWR_CFG_0_EXT_OFDM12_CH2, txpower);
3754
3755	/* read the next four txpower values */
3756	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3757				      offset + 1, &eeprom);
3758
3759	/* OFDM 24MBS,36MBS */
3760	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3761	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3762					    txpower, delta);
3763	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3764			   TX_PWR_CFG_1_OFDM24_CH0, txpower);
3765	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3766			   TX_PWR_CFG_1_OFDM24_CH1, txpower);
3767	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
3768			   TX_PWR_CFG_1_EXT_OFDM24_CH2, txpower);
3769
3770	/* OFDM 48MBS */
3771	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3772	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3773					    txpower, delta);
3774	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3775			   TX_PWR_CFG_1_OFDM48_CH0, txpower);
3776	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3777			   TX_PWR_CFG_1_OFDM48_CH1, txpower);
3778	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
3779			   TX_PWR_CFG_1_EXT_OFDM48_CH2, txpower);
3780
3781	/* OFDM 54MBS */
3782	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3783	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3784					    txpower, delta);
3785	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3786			   TX_PWR_CFG_7_OFDM54_CH0, txpower);
3787	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3788			   TX_PWR_CFG_7_OFDM54_CH1, txpower);
3789	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3790			   TX_PWR_CFG_7_OFDM54_CH2, txpower);
3791
3792	/* read the next four txpower values */
3793	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3794				      offset + 2, &eeprom);
3795
3796	/* MCS 0,1 */
3797	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3798	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3799					    txpower, delta);
3800	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3801			   TX_PWR_CFG_1_MCS0_CH0, txpower);
3802	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3803			   TX_PWR_CFG_1_MCS0_CH1, txpower);
3804	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
3805			   TX_PWR_CFG_1_EXT_MCS0_CH2, txpower);
3806
3807	/* MCS 2,3 */
3808	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3809	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3810					    txpower, delta);
3811	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3812			   TX_PWR_CFG_1_MCS2_CH0, txpower);
3813	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
3814			   TX_PWR_CFG_1_MCS2_CH1, txpower);
3815	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
3816			   TX_PWR_CFG_1_EXT_MCS2_CH2, txpower);
3817
3818	/* MCS 4,5 */
3819	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3820	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3821					    txpower, delta);
3822	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3823			   TX_PWR_CFG_2_MCS4_CH0, txpower);
3824	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3825			   TX_PWR_CFG_2_MCS4_CH1, txpower);
3826	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
3827			   TX_PWR_CFG_2_EXT_MCS4_CH2, txpower);
3828
3829	/* MCS 6 */
3830	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
3831	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3832					    txpower, delta);
3833	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3834			   TX_PWR_CFG_2_MCS6_CH0, txpower);
3835	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3836			   TX_PWR_CFG_2_MCS6_CH1, txpower);
3837	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
3838			   TX_PWR_CFG_2_EXT_MCS6_CH2, txpower);
3839
3840	/* read the next four txpower values */
3841	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3842				      offset + 3, &eeprom);
3843
3844	/* MCS 7 */
3845	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3846	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3847					    txpower, delta);
3848	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3849			   TX_PWR_CFG_7_MCS7_CH0, txpower);
3850	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3851			   TX_PWR_CFG_7_MCS7_CH1, txpower);
3852	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
3853			   TX_PWR_CFG_7_MCS7_CH2, txpower);
3854
3855	/* MCS 8,9 */
3856	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3857	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3858					    txpower, delta);
3859	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3860			   TX_PWR_CFG_2_MCS8_CH0, txpower);
3861	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3862			   TX_PWR_CFG_2_MCS8_CH1, txpower);
3863	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
3864			   TX_PWR_CFG_2_EXT_MCS8_CH2, txpower);
3865
3866	/* MCS 10,11 */
3867	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3868	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3869					    txpower, delta);
3870	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3871			   TX_PWR_CFG_2_MCS10_CH0, txpower);
3872	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
3873			   TX_PWR_CFG_2_MCS10_CH1, txpower);
3874	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
3875			   TX_PWR_CFG_2_EXT_MCS10_CH2, txpower);
3876
3877	/* MCS 12,13 */
3878	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
3879	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3880					    txpower, delta);
3881	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3882			   TX_PWR_CFG_3_MCS12_CH0, txpower);
3883	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3884			   TX_PWR_CFG_3_MCS12_CH1, txpower);
3885	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
3886			   TX_PWR_CFG_3_EXT_MCS12_CH2, txpower);
3887
3888	/* read the next four txpower values */
3889	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3890				      offset + 4, &eeprom);
3891
3892	/* MCS 14 */
3893	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3894	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3895					    txpower, delta);
3896	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3897			   TX_PWR_CFG_3_MCS14_CH0, txpower);
3898	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3899			   TX_PWR_CFG_3_MCS14_CH1, txpower);
3900	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
3901			   TX_PWR_CFG_3_EXT_MCS14_CH2, txpower);
3902
3903	/* MCS 15 */
3904	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3905	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3906					    txpower, delta);
3907	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3908			   TX_PWR_CFG_8_MCS15_CH0, txpower);
3909	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3910			   TX_PWR_CFG_8_MCS15_CH1, txpower);
3911	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3912			   TX_PWR_CFG_8_MCS15_CH2, txpower);
3913
3914	/* MCS 16,17 */
3915	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3916	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3917					    txpower, delta);
3918	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3919			   TX_PWR_CFG_5_MCS16_CH0, txpower);
3920	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3921			   TX_PWR_CFG_5_MCS16_CH1, txpower);
3922	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3923			   TX_PWR_CFG_5_MCS16_CH2, txpower);
3924
3925	/* MCS 18,19 */
3926	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
3927	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3928					    txpower, delta);
3929	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3930			   TX_PWR_CFG_5_MCS18_CH0, txpower);
3931	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3932			   TX_PWR_CFG_5_MCS18_CH1, txpower);
3933	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
3934			   TX_PWR_CFG_5_MCS18_CH2, txpower);
3935
3936	/* read the next four txpower values */
3937	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3938				      offset + 5, &eeprom);
3939
3940	/* MCS 20,21 */
3941	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3942	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3943					    txpower, delta);
3944	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3945			   TX_PWR_CFG_6_MCS20_CH0, txpower);
3946	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3947			   TX_PWR_CFG_6_MCS20_CH1, txpower);
3948	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3949			   TX_PWR_CFG_6_MCS20_CH2, txpower);
3950
3951	/* MCS 22 */
3952	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3953	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3954					    txpower, delta);
3955	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3956			   TX_PWR_CFG_6_MCS22_CH0, txpower);
3957	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3958			   TX_PWR_CFG_6_MCS22_CH1, txpower);
3959	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
3960			   TX_PWR_CFG_6_MCS22_CH2, txpower);
3961
3962	/* MCS 23 */
3963	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
3964	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3965					    txpower, delta);
3966	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3967			   TX_PWR_CFG_8_MCS23_CH0, txpower);
3968	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3969			   TX_PWR_CFG_8_MCS23_CH1, txpower);
3970	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
3971			   TX_PWR_CFG_8_MCS23_CH2, txpower);
3972
3973	/* read the next four txpower values */
3974	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
3975				      offset + 6, &eeprom);
3976
3977	/* STBC, MCS 0,1 */
3978	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
3979	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3980					    txpower, delta);
3981	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3982			   TX_PWR_CFG_3_STBC0_CH0, txpower);
3983	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3984			   TX_PWR_CFG_3_STBC0_CH1, txpower);
3985	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
3986			   TX_PWR_CFG_3_EXT_STBC0_CH2, txpower);
3987
3988	/* STBC, MCS 2,3 */
3989	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
3990	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
3991					    txpower, delta);
3992	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3993			   TX_PWR_CFG_3_STBC2_CH0, txpower);
3994	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
3995			   TX_PWR_CFG_3_STBC2_CH1, txpower);
3996	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
3997			   TX_PWR_CFG_3_EXT_STBC2_CH2, txpower);
3998
3999	/* STBC, MCS 4,5 */
4000	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4001	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4002					    txpower, delta);
4003	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE0, txpower);
4004	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE1, txpower);
4005	rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE0,
4006			   txpower);
4007
4008	/* STBC, MCS 6 */
4009	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4010	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4011					    txpower, delta);
4012	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE2, txpower);
4013	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE3, txpower);
4014	rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE2,
4015			   txpower);
4016
4017	/* read the next four txpower values */
4018	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4019				      offset + 7, &eeprom);
4020
4021	/* STBC, MCS 7 */
4022	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4023	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4024					    txpower, delta);
4025	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
4026			   TX_PWR_CFG_9_STBC7_CH0, txpower);
4027	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
4028			   TX_PWR_CFG_9_STBC7_CH1, txpower);
4029	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
4030			   TX_PWR_CFG_9_STBC7_CH2, txpower);
4031
4032	rt2800_register_write(rt2x00dev, TX_PWR_CFG_0, regs[TX_PWR_CFG_0_IDX]);
4033	rt2800_register_write(rt2x00dev, TX_PWR_CFG_1, regs[TX_PWR_CFG_1_IDX]);
4034	rt2800_register_write(rt2x00dev, TX_PWR_CFG_2, regs[TX_PWR_CFG_2_IDX]);
4035	rt2800_register_write(rt2x00dev, TX_PWR_CFG_3, regs[TX_PWR_CFG_3_IDX]);
4036	rt2800_register_write(rt2x00dev, TX_PWR_CFG_4, regs[TX_PWR_CFG_4_IDX]);
4037	rt2800_register_write(rt2x00dev, TX_PWR_CFG_5, regs[TX_PWR_CFG_5_IDX]);
4038	rt2800_register_write(rt2x00dev, TX_PWR_CFG_6, regs[TX_PWR_CFG_6_IDX]);
4039	rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, regs[TX_PWR_CFG_7_IDX]);
4040	rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, regs[TX_PWR_CFG_8_IDX]);
4041	rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, regs[TX_PWR_CFG_9_IDX]);
4042
4043	rt2800_register_write(rt2x00dev, TX_PWR_CFG_0_EXT,
4044			      regs[TX_PWR_CFG_0_EXT_IDX]);
4045	rt2800_register_write(rt2x00dev, TX_PWR_CFG_1_EXT,
4046			      regs[TX_PWR_CFG_1_EXT_IDX]);
4047	rt2800_register_write(rt2x00dev, TX_PWR_CFG_2_EXT,
4048			      regs[TX_PWR_CFG_2_EXT_IDX]);
4049	rt2800_register_write(rt2x00dev, TX_PWR_CFG_3_EXT,
4050			      regs[TX_PWR_CFG_3_EXT_IDX]);
4051	rt2800_register_write(rt2x00dev, TX_PWR_CFG_4_EXT,
4052			      regs[TX_PWR_CFG_4_EXT_IDX]);
4053
4054	for (i = 0; i < TX_PWR_CFG_IDX_COUNT; i++)
4055		rt2x00_dbg(rt2x00dev,
4056			   "band:%cGHz, BW:%c0MHz, TX_PWR_CFG_%d%s = %08lx\n",
4057			   (band == IEEE80211_BAND_5GHZ) ? '5' : '2',
4058			   (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) ?
4059								'4' : '2',
4060			   (i > TX_PWR_CFG_9_IDX) ?
4061					(i - TX_PWR_CFG_9_IDX - 1) : i,
4062			   (i > TX_PWR_CFG_9_IDX) ? "_EXT" : "",
4063			   (unsigned long) regs[i]);
4064}
4065
4066/*
4067 * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and
4068 * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values,
4069 * 4 bits for each rate (tune from 0 to 15 dBm). BBP_R1 controls transmit power
4070 * for all rates, but allow to set only 4 discrete values: -12, -6, 0 and 6 dBm.
4071 * Reference per rate transmit power values are located in the EEPROM at
4072 * EEPROM_TXPOWER_BYRATE offset. We adjust them and BBP R1 settings according to
4073 * current conditions (i.e. band, bandwidth, temperature, user settings).
4074 */
4075static void rt2800_config_txpower_rt28xx(struct rt2x00_dev *rt2x00dev,
4076					 struct ieee80211_channel *chan,
4077					 int power_level)
4078{
4079	u8 txpower, r1;
4080	u16 eeprom;
4081	u32 reg, offset;
4082	int i, is_rate_b, delta, power_ctrl;
4083	enum ieee80211_band band = chan->band;
4084
4085	/*
4086	 * Calculate HT40 compensation. For 40MHz we need to add or subtract
4087	 * value read from EEPROM (different for 2GHz and for 5GHz).
4088	 */
4089	delta = rt2800_get_txpower_bw_comp(rt2x00dev, band);
4090
4091	/*
4092	 * Calculate temperature compensation. Depends on measurement of current
4093	 * TSSI (Transmitter Signal Strength Indication) we know TX power (due
4094	 * to temperature or maybe other factors) is smaller or bigger than
4095	 * expected. We adjust it, based on TSSI reference and boundaries values
4096	 * provided in EEPROM.
4097	 */
4098	switch (rt2x00dev->chip.rt) {
4099	case RT2860:
4100	case RT2872:
4101	case RT2883:
4102	case RT3070:
4103	case RT3071:
4104	case RT3090:
4105	case RT3572:
4106		delta += rt2800_get_gain_calibration_delta(rt2x00dev);
4107		break;
4108	default:
4109		/* TODO: temperature compensation code for other chips. */
4110		break;
4111	}
4112
4113	/*
4114	 * Decrease power according to user settings, on devices with unknown
4115	 * maximum tx power. For other devices we take user power_level into
4116	 * consideration on rt2800_compensate_txpower().
4117	 */
4118	delta += rt2800_get_txpower_reg_delta(rt2x00dev, power_level,
4119					      chan->max_power);
4120
4121	/*
4122	 * BBP_R1 controls TX power for all rates, it allow to set the following
4123	 * gains -12, -6, 0, +6 dBm by setting values 2, 1, 0, 3 respectively.
4124	 *
4125	 * TODO: we do not use +6 dBm option to do not increase power beyond
4126	 * regulatory limit, however this could be utilized for devices with
4127	 * CAPABILITY_POWER_LIMIT.
4128	 */
4129	if (delta <= -12) {
4130		power_ctrl = 2;
4131		delta += 12;
4132	} else if (delta <= -6) {
4133		power_ctrl = 1;
4134		delta += 6;
4135	} else {
4136		power_ctrl = 0;
4137	}
4138	rt2800_bbp_read(rt2x00dev, 1, &r1);
4139	rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
4140	rt2800_bbp_write(rt2x00dev, 1, r1);
4141
4142	offset = TX_PWR_CFG_0;
4143
4144	for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) {
4145		/* just to be safe */
4146		if (offset > TX_PWR_CFG_4)
4147			break;
4148
4149		rt2800_register_read(rt2x00dev, offset, &reg);
4150
4151		/* read the next four txpower values */
4152		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4153					      i, &eeprom);
4154
4155		is_rate_b = i ? 0 : 1;
4156		/*
4157		 * TX_PWR_CFG_0: 1MBS, TX_PWR_CFG_1: 24MBS,
4158		 * TX_PWR_CFG_2: MCS4, TX_PWR_CFG_3: MCS12,
4159		 * TX_PWR_CFG_4: unknown
4160		 */
4161		txpower = rt2x00_get_field16(eeprom,
4162					     EEPROM_TXPOWER_BYRATE_RATE0);
4163		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4164					     power_level, txpower, delta);
4165		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE0, txpower);
4166
4167		/*
4168		 * TX_PWR_CFG_0: 2MBS, TX_PWR_CFG_1: 36MBS,
4169		 * TX_PWR_CFG_2: MCS5, TX_PWR_CFG_3: MCS13,
4170		 * TX_PWR_CFG_4: unknown
4171		 */
4172		txpower = rt2x00_get_field16(eeprom,
4173					     EEPROM_TXPOWER_BYRATE_RATE1);
4174		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4175					     power_level, txpower, delta);
4176		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE1, txpower);
4177
4178		/*
4179		 * TX_PWR_CFG_0: 5.5MBS, TX_PWR_CFG_1: 48MBS,
4180		 * TX_PWR_CFG_2: MCS6,  TX_PWR_CFG_3: MCS14,
4181		 * TX_PWR_CFG_4: unknown
4182		 */
4183		txpower = rt2x00_get_field16(eeprom,
4184					     EEPROM_TXPOWER_BYRATE_RATE2);
4185		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4186					     power_level, txpower, delta);
4187		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE2, txpower);
4188
4189		/*
4190		 * TX_PWR_CFG_0: 11MBS, TX_PWR_CFG_1: 54MBS,
4191		 * TX_PWR_CFG_2: MCS7,  TX_PWR_CFG_3: MCS15,
4192		 * TX_PWR_CFG_4: unknown
4193		 */
4194		txpower = rt2x00_get_field16(eeprom,
4195					     EEPROM_TXPOWER_BYRATE_RATE3);
4196		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4197					     power_level, txpower, delta);
4198		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE3, txpower);
4199
4200		/* read the next four txpower values */
4201		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4202					      i + 1, &eeprom);
4203
4204		is_rate_b = 0;
4205		/*
4206		 * TX_PWR_CFG_0: 6MBS, TX_PWR_CFG_1: MCS0,
4207		 * TX_PWR_CFG_2: MCS8, TX_PWR_CFG_3: unknown,
4208		 * TX_PWR_CFG_4: unknown
4209		 */
4210		txpower = rt2x00_get_field16(eeprom,
4211					     EEPROM_TXPOWER_BYRATE_RATE0);
4212		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4213					     power_level, txpower, delta);
4214		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE4, txpower);
4215
4216		/*
4217		 * TX_PWR_CFG_0: 9MBS, TX_PWR_CFG_1: MCS1,
4218		 * TX_PWR_CFG_2: MCS9, TX_PWR_CFG_3: unknown,
4219		 * TX_PWR_CFG_4: unknown
4220		 */
4221		txpower = rt2x00_get_field16(eeprom,
4222					     EEPROM_TXPOWER_BYRATE_RATE1);
4223		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4224					     power_level, txpower, delta);
4225		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE5, txpower);
4226
4227		/*
4228		 * TX_PWR_CFG_0: 12MBS, TX_PWR_CFG_1: MCS2,
4229		 * TX_PWR_CFG_2: MCS10, TX_PWR_CFG_3: unknown,
4230		 * TX_PWR_CFG_4: unknown
4231		 */
4232		txpower = rt2x00_get_field16(eeprom,
4233					     EEPROM_TXPOWER_BYRATE_RATE2);
4234		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4235					     power_level, txpower, delta);
4236		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE6, txpower);
4237
4238		/*
4239		 * TX_PWR_CFG_0: 18MBS, TX_PWR_CFG_1: MCS3,
4240		 * TX_PWR_CFG_2: MCS11, TX_PWR_CFG_3: unknown,
4241		 * TX_PWR_CFG_4: unknown
4242		 */
4243		txpower = rt2x00_get_field16(eeprom,
4244					     EEPROM_TXPOWER_BYRATE_RATE3);
4245		txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
4246					     power_level, txpower, delta);
4247		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE7, txpower);
4248
4249		rt2800_register_write(rt2x00dev, offset, reg);
4250
4251		/* next TX_PWR_CFG register */
4252		offset += 4;
4253	}
4254}
4255
4256static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
4257				  struct ieee80211_channel *chan,
4258				  int power_level)
4259{
4260	if (rt2x00_rt(rt2x00dev, RT3593))
4261		rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
4262	else
4263		rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
4264}
4265
4266void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
4267{
4268	rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
4269			      rt2x00dev->tx_power);
4270}
4271EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
4272
4273void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
4274{
4275	u32	tx_pin;
4276	u8	rfcsr;
4277
4278	/*
4279	 * A voltage-controlled oscillator(VCO) is an electronic oscillator
4280	 * designed to be controlled in oscillation frequency by a voltage
4281	 * input. Maybe the temperature will affect the frequency of
4282	 * oscillation to be shifted. The VCO calibration will be called
4283	 * periodically to adjust the frequency to be precision.
4284	*/
4285
4286	rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
4287	tx_pin &= TX_PIN_CFG_PA_PE_DISABLE;
4288	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
4289
4290	switch (rt2x00dev->chip.rf) {
4291	case RF2020:
4292	case RF3020:
4293	case RF3021:
4294	case RF3022:
4295	case RF3320:
4296	case RF3052:
4297		rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
4298		rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
4299		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
4300		break;
4301	case RF3053:
4302	case RF3070:
4303	case RF3290:
4304	case RF5360:
4305	case RF5362:
4306	case RF5370:
4307	case RF5372:
4308	case RF5390:
4309	case RF5392:
4310		rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
4311		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
4312		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
4313		break;
4314	default:
4315		return;
4316	}
4317
4318	mdelay(1);
4319
4320	rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
4321	if (rt2x00dev->rf_channel <= 14) {
4322		switch (rt2x00dev->default_ant.tx_chain_num) {
4323		case 3:
4324			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1);
4325			/* fall through */
4326		case 2:
4327			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
4328			/* fall through */
4329		case 1:
4330		default:
4331			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
4332			break;
4333		}
4334	} else {
4335		switch (rt2x00dev->default_ant.tx_chain_num) {
4336		case 3:
4337			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1);
4338			/* fall through */
4339		case 2:
4340			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
4341			/* fall through */
4342		case 1:
4343		default:
4344			rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
4345			break;
4346		}
4347	}
4348	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
4349
4350}
4351EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
4352
4353static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev,
4354				      struct rt2x00lib_conf *libconf)
4355{
4356	u32 reg;
4357
4358	rt2800_register_read(rt2x00dev, TX_RTY_CFG, &reg);
4359	rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT,
4360			   libconf->conf->short_frame_max_tx_count);
4361	rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT,
4362			   libconf->conf->long_frame_max_tx_count);
4363	rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg);
4364}
4365
4366static void rt2800_config_ps(struct rt2x00_dev *rt2x00dev,
4367			     struct rt2x00lib_conf *libconf)
4368{
4369	enum dev_state state =
4370	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
4371		STATE_SLEEP : STATE_AWAKE;
4372	u32 reg;
4373
4374	if (state == STATE_SLEEP) {
4375		rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
4376
4377		rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
4378		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 5);
4379		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE,
4380				   libconf->conf->listen_interval - 1);
4381		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 1);
4382		rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
4383
4384		rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
4385	} else {
4386		rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
4387		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0);
4388		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0);
4389		rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 0);
4390		rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
4391
4392		rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
4393	}
4394}
4395
4396void rt2800_config(struct rt2x00_dev *rt2x00dev,
4397		   struct rt2x00lib_conf *libconf,
4398		   const unsigned int flags)
4399{
4400	/* Always recalculate LNA gain before changing configuration */
4401	rt2800_config_lna_gain(rt2x00dev, libconf);
4402
4403	if (flags & IEEE80211_CONF_CHANGE_CHANNEL) {
4404		rt2800_config_channel(rt2x00dev, libconf->conf,
4405				      &libconf->rf, &libconf->channel);
4406		rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
4407				      libconf->conf->power_level);
4408	}
4409	if (flags & IEEE80211_CONF_CHANGE_POWER)
4410		rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
4411				      libconf->conf->power_level);
4412	if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
4413		rt2800_config_retry_limit(rt2x00dev, libconf);
4414	if (flags & IEEE80211_CONF_CHANGE_PS)
4415		rt2800_config_ps(rt2x00dev, libconf);
4416}
4417EXPORT_SYMBOL_GPL(rt2800_config);
4418
4419/*
4420 * Link tuning
4421 */
4422void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
4423{
4424	u32 reg;
4425
4426	/*
4427	 * Update FCS error count from register.
4428	 */
4429	rt2800_register_read(rt2x00dev, RX_STA_CNT0, &reg);
4430	qual->rx_failed = rt2x00_get_field32(reg, RX_STA_CNT0_CRC_ERR);
4431}
4432EXPORT_SYMBOL_GPL(rt2800_link_stats);
4433
4434static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
4435{
4436	u8 vgc;
4437
4438	if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
4439		if (rt2x00_rt(rt2x00dev, RT3070) ||
4440		    rt2x00_rt(rt2x00dev, RT3071) ||
4441		    rt2x00_rt(rt2x00dev, RT3090) ||
4442		    rt2x00_rt(rt2x00dev, RT3290) ||
4443		    rt2x00_rt(rt2x00dev, RT3390) ||
4444		    rt2x00_rt(rt2x00dev, RT3572) ||
4445		    rt2x00_rt(rt2x00dev, RT3593) ||
4446		    rt2x00_rt(rt2x00dev, RT5390) ||
4447		    rt2x00_rt(rt2x00dev, RT5392) ||
4448		    rt2x00_rt(rt2x00dev, RT5592))
4449			vgc = 0x1c + (2 * rt2x00dev->lna_gain);
4450		else
4451			vgc = 0x2e + rt2x00dev->lna_gain;
4452	} else { /* 5GHZ band */
4453		if (rt2x00_rt(rt2x00dev, RT3593))
4454			vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
4455		else if (rt2x00_rt(rt2x00dev, RT5592))
4456			vgc = 0x24 + (2 * rt2x00dev->lna_gain);
4457		else {
4458			if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
4459				vgc = 0x32 + (rt2x00dev->lna_gain * 5) / 3;
4460			else
4461				vgc = 0x3a + (rt2x00dev->lna_gain * 5) / 3;
4462		}
4463	}
4464
4465	return vgc;
4466}
4467
4468static inline void rt2800_set_vgc(struct rt2x00_dev *rt2x00dev,
4469				  struct link_qual *qual, u8 vgc_level)
4470{
4471	if (qual->vgc_level != vgc_level) {
4472		if (rt2x00_rt(rt2x00dev, RT3572) ||
4473		    rt2x00_rt(rt2x00dev, RT3593)) {
4474			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
4475						       vgc_level);
4476		} else if (rt2x00_rt(rt2x00dev, RT5592)) {
4477			rt2800_bbp_write(rt2x00dev, 83, qual->rssi > -65 ? 0x4a : 0x7a);
4478			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level);
4479		} else {
4480			rt2800_bbp_write(rt2x00dev, 66, vgc_level);
4481		}
4482
4483		qual->vgc_level = vgc_level;
4484		qual->vgc_level_reg = vgc_level;
4485	}
4486}
4487
4488void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
4489{
4490	rt2800_set_vgc(rt2x00dev, qual, rt2800_get_default_vgc(rt2x00dev));
4491}
4492EXPORT_SYMBOL_GPL(rt2800_reset_tuner);
4493
4494void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
4495		       const u32 count)
4496{
4497	u8 vgc;
4498
4499	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C))
4500		return;
4501
4502	/* When RSSI is better than a certain threshold, increase VGC
4503	 * with a chip specific value in order to improve the balance
4504	 * between sensibility and noise isolation.
4505	 */
4506
4507	vgc = rt2800_get_default_vgc(rt2x00dev);
4508
4509	switch (rt2x00dev->chip.rt) {
4510	case RT3572:
4511	case RT3593:
4512		if (qual->rssi > -65) {
4513			if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ)
4514				vgc += 0x20;
4515			else
4516				vgc += 0x10;
4517		}
4518		break;
4519
4520	case RT5592:
4521		if (qual->rssi > -65)
4522			vgc += 0x20;
4523		break;
4524
4525	default:
4526		if (qual->rssi > -80)
4527			vgc += 0x10;
4528		break;
4529	}
4530
4531	rt2800_set_vgc(rt2x00dev, qual, vgc);
4532}
4533EXPORT_SYMBOL_GPL(rt2800_link_tuner);
4534
4535/*
4536 * Initialization functions.
4537 */
4538static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
4539{
4540	u32 reg;
4541	u16 eeprom;
4542	unsigned int i;
4543	int ret;
4544
4545	rt2800_disable_wpdma(rt2x00dev);
4546
4547	ret = rt2800_drv_init_registers(rt2x00dev);
4548	if (ret)
4549		return ret;
4550
4551	rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
4552	rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
4553
4554	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
4555
4556	rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
4557	rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL, 1600);
4558	rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
4559	rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, 0);
4560	rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
4561	rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
4562	rt2x00_set_field32(&reg, BCN_TIME_CFG_TX_TIME_COMPENSATE, 0);
4563	rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
4564
4565	rt2800_config_filter(rt2x00dev, FIF_ALLMULTI);
4566
4567	rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG, &reg);
4568	rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME, 9);
4569	rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_CC_DELAY_TIME, 2);
4570	rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
4571
4572	if (rt2x00_rt(rt2x00dev, RT3290)) {
4573		rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, &reg);
4574		if (rt2x00_get_field32(reg, WLAN_EN) == 1) {
4575			rt2x00_set_field32(&reg, PCIE_APP0_CLK_REQ, 1);
4576			rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
4577		}
4578
4579		rt2800_register_read(rt2x00dev, CMB_CTRL, &reg);
4580		if (!(rt2x00_get_field32(reg, LDO0_EN) == 1)) {
4581			rt2x00_set_field32(&reg, LDO0_EN, 1);
4582			rt2x00_set_field32(&reg, LDO_BGSEL, 3);
4583			rt2800_register_write(rt2x00dev, CMB_CTRL, reg);
4584		}
4585
4586		rt2800_register_read(rt2x00dev, OSC_CTRL, &reg);
4587		rt2x00_set_field32(&reg, OSC_ROSC_EN, 1);
4588		rt2x00_set_field32(&reg, OSC_CAL_REQ, 1);
4589		rt2x00_set_field32(&reg, OSC_REF_CYCLE, 0x27);
4590		rt2800_register_write(rt2x00dev, OSC_CTRL, reg);
4591
4592		rt2800_register_read(rt2x00dev, COEX_CFG0, &reg);
4593		rt2x00_set_field32(&reg, COEX_CFG_ANT, 0x5e);
4594		rt2800_register_write(rt2x00dev, COEX_CFG0, reg);
4595
4596		rt2800_register_read(rt2x00dev, COEX_CFG2, &reg);
4597		rt2x00_set_field32(&reg, BT_COEX_CFG1, 0x00);
4598		rt2x00_set_field32(&reg, BT_COEX_CFG0, 0x17);
4599		rt2x00_set_field32(&reg, WL_COEX_CFG1, 0x93);
4600		rt2x00_set_field32(&reg, WL_COEX_CFG0, 0x7f);
4601		rt2800_register_write(rt2x00dev, COEX_CFG2, reg);
4602
4603		rt2800_register_read(rt2x00dev, PLL_CTRL, &reg);
4604		rt2x00_set_field32(&reg, PLL_CONTROL, 1);
4605		rt2800_register_write(rt2x00dev, PLL_CTRL, reg);
4606	}
4607
4608	if (rt2x00_rt(rt2x00dev, RT3071) ||
4609	    rt2x00_rt(rt2x00dev, RT3090) ||
4610	    rt2x00_rt(rt2x00dev, RT3290) ||
4611	    rt2x00_rt(rt2x00dev, RT3390)) {
4612
4613		if (rt2x00_rt(rt2x00dev, RT3290))
4614			rt2800_register_write(rt2x00dev, TX_SW_CFG0,
4615					      0x00000404);
4616		else
4617			rt2800_register_write(rt2x00dev, TX_SW_CFG0,
4618					      0x00000400);
4619
4620		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
4621		if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
4622		    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) ||
4623		    rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) {
4624			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
4625					   &eeprom);
4626			if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
4627				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
4628						      0x0000002c);
4629			else
4630				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
4631						      0x0000000f);
4632		} else {
4633			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
4634		}
4635	} else if (rt2x00_rt(rt2x00dev, RT3070)) {
4636		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
4637
4638		if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
4639			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
4640			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x0000002c);
4641		} else {
4642			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
4643			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
4644		}
4645	} else if (rt2800_is_305x_soc(rt2x00dev)) {
4646		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
4647		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
4648		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030);
4649	} else if (rt2x00_rt(rt2x00dev, RT3352)) {
4650		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
4651		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
4652		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
4653	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
4654		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
4655		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
4656	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
4657		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
4658		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
4659		if (rt2x00_rt_rev_lt(rt2x00dev, RT3593, REV_RT3593E)) {
4660			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
4661					   &eeprom);
4662			if (rt2x00_get_field16(eeprom,
4663					       EEPROM_NIC_CONF1_DAC_TEST))
4664				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
4665						      0x0000001f);
4666			else
4667				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
4668						      0x0000000f);
4669		} else {
4670			rt2800_register_write(rt2x00dev, TX_SW_CFG2,
4671					      0x00000000);
4672		}
4673	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
4674		   rt2x00_rt(rt2x00dev, RT5392) ||
4675		   rt2x00_rt(rt2x00dev, RT5592)) {
4676		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
4677		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
4678		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
4679	} else {
4680		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
4681		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
4682	}
4683
4684	rt2800_register_read(rt2x00dev, TX_LINK_CFG, &reg);
4685	rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB_LIFETIME, 32);
4686	rt2x00_set_field32(&reg, TX_LINK_CFG_MFB_ENABLE, 0);
4687	rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_UMFS_ENABLE, 0);
4688	rt2x00_set_field32(&reg, TX_LINK_CFG_TX_MRQ_EN, 0);
4689	rt2x00_set_field32(&reg, TX_LINK_CFG_TX_RDG_EN, 0);
4690	rt2x00_set_field32(&reg, TX_LINK_CFG_TX_CF_ACK_EN, 1);
4691	rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB, 0);
4692	rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFS, 0);
4693	rt2800_register_write(rt2x00dev, TX_LINK_CFG, reg);
4694
4695	rt2800_register_read(rt2x00dev, TX_TIMEOUT_CFG, &reg);
4696	rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_MPDU_LIFETIME, 9);
4697	rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 32);
4698	rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_TX_OP_TIMEOUT, 10);
4699	rt2800_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
4700
4701	rt2800_register_read(rt2x00dev, MAX_LEN_CFG, &reg);
4702	rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
4703	if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
4704	    rt2x00_rt(rt2x00dev, RT2883) ||
4705	    rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E))
4706		rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2);
4707	else
4708		rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1);
4709	rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_PSDU, 0);
4710	rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_MPDU, 0);
4711	rt2800_register_write(rt2x00dev, MAX_LEN_CFG, reg);
4712
4713	rt2800_register_read(rt2x00dev, LED_CFG, &reg);
4714	rt2x00_set_field32(&reg, LED_CFG_ON_PERIOD, 70);
4715	rt2x00_set_field32(&reg, LED_CFG_OFF_PERIOD, 30);
4716	rt2x00_set_field32(&reg, LED_CFG_SLOW_BLINK_PERIOD, 3);
4717	rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, 3);
4718	rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, 3);
4719	rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE, 3);
4720	rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, 1);
4721	rt2800_register_write(rt2x00dev, LED_CFG, reg);
4722
4723	rt2800_register_write(rt2x00dev, PBF_MAX_PCNT, 0x1f3fbf9f);
4724
4725	rt2800_register_read(rt2x00dev, TX_RTY_CFG, &reg);
4726	rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT, 15);
4727	rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT, 31);
4728	rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_THRE, 2000);
4729	rt2x00_set_field32(&reg, TX_RTY_CFG_NON_AGG_RTY_MODE, 0);
4730	rt2x00_set_field32(&reg, TX_RTY_CFG_AGG_RTY_MODE, 0);
4731	rt2x00_set_field32(&reg, TX_RTY_CFG_TX_AUTO_FB_ENABLE, 1);
4732	rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg);
4733
4734	rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
4735	rt2x00_set_field32(&reg, AUTO_RSP_CFG_AUTORESPONDER, 1);
4736	rt2x00_set_field32(&reg, AUTO_RSP_CFG_BAC_ACK_POLICY, 1);
4737	rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MMODE, 0);
4738	rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MREF, 0);
4739	rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE, 1);
4740	rt2x00_set_field32(&reg, AUTO_RSP_CFG_DUAL_CTS_EN, 0);
4741	rt2x00_set_field32(&reg, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0);
4742	rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
4743
4744	rt2800_register_read(rt2x00dev, CCK_PROT_CFG, &reg);
4745	rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_RATE, 3);
4746	rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_CTRL, 0);
4747	rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_NAV_SHORT, 1);
4748	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4749	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4750	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4751	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 0);
4752	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4753	rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 0);
4754	rt2x00_set_field32(&reg, CCK_PROT_CFG_RTS_TH_EN, 1);
4755	rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg);
4756
4757	rt2800_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
4758	rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_RATE, 3);
4759	rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL, 0);
4760	rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_NAV_SHORT, 1);
4761	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4762	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4763	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4764	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 0);
4765	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4766	rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 0);
4767	rt2x00_set_field32(&reg, OFDM_PROT_CFG_RTS_TH_EN, 1);
4768	rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
4769
4770	rt2800_register_read(rt2x00dev, MM20_PROT_CFG, &reg);
4771	rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_RATE, 0x4004);
4772	rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_CTRL, 0);
4773	rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_NAV_SHORT, 1);
4774	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4775	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4776	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4777	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
4778	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4779	rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
4780	rt2x00_set_field32(&reg, MM20_PROT_CFG_RTS_TH_EN, 0);
4781	rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
4782
4783	rt2800_register_read(rt2x00dev, MM40_PROT_CFG, &reg);
4784	rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_RATE, 0x4084);
4785	rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_CTRL, 0);
4786	rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_NAV_SHORT, 1);
4787	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4788	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4789	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4790	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
4791	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4792	rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
4793	rt2x00_set_field32(&reg, MM40_PROT_CFG_RTS_TH_EN, 0);
4794	rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
4795
4796	rt2800_register_read(rt2x00dev, GF20_PROT_CFG, &reg);
4797	rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_RATE, 0x4004);
4798	rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_CTRL, 0);
4799	rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_NAV_SHORT, 1);
4800	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4801	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4802	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4803	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
4804	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4805	rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
4806	rt2x00_set_field32(&reg, GF20_PROT_CFG_RTS_TH_EN, 0);
4807	rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
4808
4809	rt2800_register_read(rt2x00dev, GF40_PROT_CFG, &reg);
4810	rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_RATE, 0x4084);
4811	rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_CTRL, 0);
4812	rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_NAV_SHORT, 1);
4813	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
4814	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
4815	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
4816	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
4817	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
4818	rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
4819	rt2x00_set_field32(&reg, GF40_PROT_CFG_RTS_TH_EN, 0);
4820	rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
4821
4822	if (rt2x00_is_usb(rt2x00dev)) {
4823		rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
4824
4825		rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
4826		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
4827		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
4828		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
4829		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
4830		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 3);
4831		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 0);
4832		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_BIG_ENDIAN, 0);
4833		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_HDR_SCATTER, 0);
4834		rt2x00_set_field32(&reg, WPDMA_GLO_CFG_HDR_SEG_LEN, 0);
4835		rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
4836	}
4837
4838	/*
4839	 * The legacy driver also sets TXOP_CTRL_CFG_RESERVED_TRUN_EN to 1
4840	 * although it is reserved.
4841	 */
4842	rt2800_register_read(rt2x00dev, TXOP_CTRL_CFG, &reg);
4843	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TIMEOUT_TRUN_EN, 1);
4844	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_AC_TRUN_EN, 1);
4845	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN, 1);
4846	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_USER_MODE_TRUN_EN, 1);
4847	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_MIMO_PS_TRUN_EN, 1);
4848	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_RESERVED_TRUN_EN, 1);
4849	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_LSIG_TXOP_EN, 0);
4850	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_EN, 0);
4851	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_DLY, 88);
4852	rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CWMIN, 0);
4853	rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, reg);
4854
4855	reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
4856	rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
4857
4858	rt2800_register_read(rt2x00dev, TX_RTS_CFG, &reg);
4859	rt2x00_set_field32(&reg, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 32);
4860	rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES,
4861			   IEEE80211_MAX_RTS_THRESHOLD);
4862	rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_FBK_EN, 0);
4863	rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg);
4864
4865	rt2800_register_write(rt2x00dev, EXP_ACK_TIME, 0x002400ca);
4866
4867	/*
4868	 * Usually the CCK SIFS time should be set to 10 and the OFDM SIFS
4869	 * time should be set to 16. However, the original Ralink driver uses
4870	 * 16 for both and indeed using a value of 10 for CCK SIFS results in
4871	 * connection problems with 11g + CTS protection. Hence, use the same
4872	 * defaults as the Ralink driver: 16 for both, CCK and OFDM SIFS.
4873	 */
4874	rt2800_register_read(rt2x00dev, XIFS_TIME_CFG, &reg);
4875	rt2x00_set_field32(&reg, XIFS_TIME_CFG_CCKM_SIFS_TIME, 16);
4876	rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_SIFS_TIME, 16);
4877	rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_XIFS_TIME, 4);
4878	rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, 314);
4879	rt2x00_set_field32(&reg, XIFS_TIME_CFG_BB_RXEND_ENABLE, 1);
4880	rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
4881
4882	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
4883
4884	/*
4885	 * ASIC will keep garbage value after boot, clear encryption keys.
4886	 */
4887	for (i = 0; i < 4; i++)
4888		rt2800_register_write(rt2x00dev,
4889					 SHARED_KEY_MODE_ENTRY(i), 0);
4890
4891	for (i = 0; i < 256; i++) {
4892		rt2800_config_wcid(rt2x00dev, NULL, i);
4893		rt2800_delete_wcid_attr(rt2x00dev, i);
4894		rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
4895	}
4896
4897	/*
4898	 * Clear all beacons
4899	 */
4900	for (i = 0; i < 8; i++)
4901		rt2800_clear_beacon_register(rt2x00dev, i);
4902
4903	if (rt2x00_is_usb(rt2x00dev)) {
4904		rt2800_register_read(rt2x00dev, US_CYC_CNT, &reg);
4905		rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 30);
4906		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
4907	} else if (rt2x00_is_pcie(rt2x00dev)) {
4908		rt2800_register_read(rt2x00dev, US_CYC_CNT, &reg);
4909		rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 125);
4910		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
4911	}
4912
4913	rt2800_register_read(rt2x00dev, HT_FBK_CFG0, &reg);
4914	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS0FBK, 0);
4915	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS1FBK, 0);
4916	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS2FBK, 1);
4917	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS3FBK, 2);
4918	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS4FBK, 3);
4919	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS5FBK, 4);
4920	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS6FBK, 5);
4921	rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS7FBK, 6);
4922	rt2800_register_write(rt2x00dev, HT_FBK_CFG0, reg);
4923
4924	rt2800_register_read(rt2x00dev, HT_FBK_CFG1, &reg);
4925	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS8FBK, 8);
4926	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS9FBK, 8);
4927	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS10FBK, 9);
4928	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS11FBK, 10);
4929	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS12FBK, 11);
4930	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS13FBK, 12);
4931	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS14FBK, 13);
4932	rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS15FBK, 14);
4933	rt2800_register_write(rt2x00dev, HT_FBK_CFG1, reg);
4934
4935	rt2800_register_read(rt2x00dev, LG_FBK_CFG0, &reg);
4936	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS0FBK, 8);
4937	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS1FBK, 8);
4938	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS2FBK, 9);
4939	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS3FBK, 10);
4940	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS4FBK, 11);
4941	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS5FBK, 12);
4942	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS6FBK, 13);
4943	rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS7FBK, 14);
4944	rt2800_register_write(rt2x00dev, LG_FBK_CFG0, reg);
4945
4946	rt2800_register_read(rt2x00dev, LG_FBK_CFG1, &reg);
4947	rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS0FBK, 0);
4948	rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS1FBK, 0);
4949	rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS2FBK, 1);
4950	rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS3FBK, 2);
4951	rt2800_register_write(rt2x00dev, LG_FBK_CFG1, reg);
4952
4953	/*
4954	 * Do not force the BA window size, we use the TXWI to set it
4955	 */
4956	rt2800_register_read(rt2x00dev, AMPDU_BA_WINSIZE, &reg);
4957	rt2x00_set_field32(&reg, AMPDU_BA_WINSIZE_FORCE_WINSIZE_ENABLE, 0);
4958	rt2x00_set_field32(&reg, AMPDU_BA_WINSIZE_FORCE_WINSIZE, 0);
4959	rt2800_register_write(rt2x00dev, AMPDU_BA_WINSIZE, reg);
4960
4961	/*
4962	 * We must clear the error counters.
4963	 * These registers are cleared on read,
4964	 * so we may pass a useless variable to store the value.
4965	 */
4966	rt2800_register_read(rt2x00dev, RX_STA_CNT0, &reg);
4967	rt2800_register_read(rt2x00dev, RX_STA_CNT1, &reg);
4968	rt2800_register_read(rt2x00dev, RX_STA_CNT2, &reg);
4969	rt2800_register_read(rt2x00dev, TX_STA_CNT0, &reg);
4970	rt2800_register_read(rt2x00dev, TX_STA_CNT1, &reg);
4971	rt2800_register_read(rt2x00dev, TX_STA_CNT2, &reg);
4972
4973	/*
4974	 * Setup leadtime for pre tbtt interrupt to 6ms
4975	 */
4976	rt2800_register_read(rt2x00dev, INT_TIMER_CFG, &reg);
4977	rt2x00_set_field32(&reg, INT_TIMER_CFG_PRE_TBTT_TIMER, 6 << 4);
4978	rt2800_register_write(rt2x00dev, INT_TIMER_CFG, reg);
4979
4980	/*
4981	 * Set up channel statistics timer
4982	 */
4983	rt2800_register_read(rt2x00dev, CH_TIME_CFG, &reg);
4984	rt2x00_set_field32(&reg, CH_TIME_CFG_EIFS_BUSY, 1);
4985	rt2x00_set_field32(&reg, CH_TIME_CFG_NAV_BUSY, 1);
4986	rt2x00_set_field32(&reg, CH_TIME_CFG_RX_BUSY, 1);
4987	rt2x00_set_field32(&reg, CH_TIME_CFG_TX_BUSY, 1);
4988	rt2x00_set_field32(&reg, CH_TIME_CFG_TMR_EN, 1);
4989	rt2800_register_write(rt2x00dev, CH_TIME_CFG, reg);
4990
4991	return 0;
4992}
4993
4994static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
4995{
4996	unsigned int i;
4997	u32 reg;
4998
4999	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
5000		rt2800_register_read(rt2x00dev, MAC_STATUS_CFG, &reg);
5001		if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY))
5002			return 0;
5003
5004		udelay(REGISTER_BUSY_DELAY);
5005	}
5006
5007	rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n");
5008	return -EACCES;
5009}
5010
5011static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
5012{
5013	unsigned int i;
5014	u8 value;
5015
5016	/*
5017	 * BBP was enabled after firmware was loaded,
5018	 * but we need to reactivate it now.
5019	 */
5020	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
5021	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
5022	msleep(1);
5023
5024	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
5025		rt2800_bbp_read(rt2x00dev, 0, &value);
5026		if ((value != 0xff) && (value != 0x00))
5027			return 0;
5028		udelay(REGISTER_BUSY_DELAY);
5029	}
5030
5031	rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
5032	return -EACCES;
5033}
5034
5035static void rt2800_bbp4_mac_if_ctrl(struct rt2x00_dev *rt2x00dev)
5036{
5037	u8 value;
5038
5039	rt2800_bbp_read(rt2x00dev, 4, &value);
5040	rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
5041	rt2800_bbp_write(rt2x00dev, 4, value);
5042}
5043
5044static void rt2800_init_freq_calibration(struct rt2x00_dev *rt2x00dev)
5045{
5046	rt2800_bbp_write(rt2x00dev, 142, 1);
5047	rt2800_bbp_write(rt2x00dev, 143, 57);
5048}
5049
5050static void rt2800_init_bbp_5592_glrt(struct rt2x00_dev *rt2x00dev)
5051{
5052	const u8 glrt_table[] = {
5053		0xE0, 0x1F, 0X38, 0x32, 0x08, 0x28, 0x19, 0x0A, 0xFF, 0x00, /* 128 ~ 137 */
5054		0x16, 0x10, 0x10, 0x0B, 0x36, 0x2C, 0x26, 0x24, 0x42, 0x36, /* 138 ~ 147 */
5055		0x30, 0x2D, 0x4C, 0x46, 0x3D, 0x40, 0x3E, 0x42, 0x3D, 0x40, /* 148 ~ 157 */
5056		0X3C, 0x34, 0x2C, 0x2F, 0x3C, 0x35, 0x2E, 0x2A, 0x49, 0x41, /* 158 ~ 167 */
5057		0x36, 0x31, 0x30, 0x30, 0x0E, 0x0D, 0x28, 0x21, 0x1C, 0x16, /* 168 ~ 177 */
5058		0x50, 0x4A, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, /* 178 ~ 187 */
5059		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 188 ~ 197 */
5060		0x00, 0x00, 0x7D, 0x14, 0x32, 0x2C, 0x36, 0x4C, 0x43, 0x2C, /* 198 ~ 207 */
5061		0x2E, 0x36, 0x30, 0x6E,					    /* 208 ~ 211 */
5062	};
5063	int i;
5064
5065	for (i = 0; i < ARRAY_SIZE(glrt_table); i++) {
5066		rt2800_bbp_write(rt2x00dev, 195, 128 + i);
5067		rt2800_bbp_write(rt2x00dev, 196, glrt_table[i]);
5068	}
5069};
5070
5071static void rt2800_init_bbp_early(struct rt2x00_dev *rt2x00dev)
5072{
5073	rt2800_bbp_write(rt2x00dev, 65, 0x2C);
5074	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5075	rt2800_bbp_write(rt2x00dev, 68, 0x0B);
5076	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5077	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5078	rt2800_bbp_write(rt2x00dev, 73, 0x10);
5079	rt2800_bbp_write(rt2x00dev, 81, 0x37);
5080	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5081	rt2800_bbp_write(rt2x00dev, 83, 0x6A);
5082	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5083	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5084	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5085	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5086	rt2800_bbp_write(rt2x00dev, 103, 0x00);
5087	rt2800_bbp_write(rt2x00dev, 105, 0x05);
5088	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5089}
5090
5091static void rt2800_disable_unused_dac_adc(struct rt2x00_dev *rt2x00dev)
5092{
5093	u16 eeprom;
5094	u8 value;
5095
5096	rt2800_bbp_read(rt2x00dev, 138, &value);
5097	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
5098	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
5099		value |= 0x20;
5100	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
5101		value &= ~0x02;
5102	rt2800_bbp_write(rt2x00dev, 138, value);
5103}
5104
5105static void rt2800_init_bbp_305x_soc(struct rt2x00_dev *rt2x00dev)
5106{
5107	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5108
5109	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5110	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5111
5112	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5113	rt2800_bbp_write(rt2x00dev, 73, 0x10);
5114
5115	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5116
5117	rt2800_bbp_write(rt2x00dev, 78, 0x0e);
5118	rt2800_bbp_write(rt2x00dev, 80, 0x08);
5119
5120	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5121
5122	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5123
5124	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5125
5126	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5127
5128	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5129
5130	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5131
5132	rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5133
5134	rt2800_bbp_write(rt2x00dev, 105, 0x01);
5135
5136	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5137}
5138
5139static void rt2800_init_bbp_28xx(struct rt2x00_dev *rt2x00dev)
5140{
5141	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5142	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5143
5144	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
5145		rt2800_bbp_write(rt2x00dev, 69, 0x16);
5146		rt2800_bbp_write(rt2x00dev, 73, 0x12);
5147	} else {
5148		rt2800_bbp_write(rt2x00dev, 69, 0x12);
5149		rt2800_bbp_write(rt2x00dev, 73, 0x10);
5150	}
5151
5152	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5153
5154	rt2800_bbp_write(rt2x00dev, 81, 0x37);
5155
5156	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5157
5158	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5159
5160	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
5161		rt2800_bbp_write(rt2x00dev, 84, 0x19);
5162	else
5163		rt2800_bbp_write(rt2x00dev, 84, 0x99);
5164
5165	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5166
5167	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5168
5169	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5170
5171	rt2800_bbp_write(rt2x00dev, 103, 0x00);
5172
5173	rt2800_bbp_write(rt2x00dev, 105, 0x05);
5174
5175	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5176}
5177
5178static void rt2800_init_bbp_30xx(struct rt2x00_dev *rt2x00dev)
5179{
5180	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5181	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5182
5183	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5184	rt2800_bbp_write(rt2x00dev, 73, 0x10);
5185
5186	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5187
5188	rt2800_bbp_write(rt2x00dev, 79, 0x13);
5189	rt2800_bbp_write(rt2x00dev, 80, 0x05);
5190	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5191
5192	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5193
5194	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5195
5196	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5197
5198	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5199
5200	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5201
5202	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5203
5204	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
5205	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
5206	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E))
5207		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5208	else
5209		rt2800_bbp_write(rt2x00dev, 103, 0x00);
5210
5211	rt2800_bbp_write(rt2x00dev, 105, 0x05);
5212
5213	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5214
5215	if (rt2x00_rt(rt2x00dev, RT3071) ||
5216	    rt2x00_rt(rt2x00dev, RT3090))
5217		rt2800_disable_unused_dac_adc(rt2x00dev);
5218}
5219
5220static void rt2800_init_bbp_3290(struct rt2x00_dev *rt2x00dev)
5221{
5222	u8 value;
5223
5224	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
5225
5226	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5227
5228	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5229	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5230
5231	rt2800_bbp_write(rt2x00dev, 68, 0x0b);
5232
5233	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5234	rt2800_bbp_write(rt2x00dev, 73, 0x13);
5235	rt2800_bbp_write(rt2x00dev, 75, 0x46);
5236	rt2800_bbp_write(rt2x00dev, 76, 0x28);
5237
5238	rt2800_bbp_write(rt2x00dev, 77, 0x58);
5239
5240	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5241
5242	rt2800_bbp_write(rt2x00dev, 74, 0x0b);
5243	rt2800_bbp_write(rt2x00dev, 79, 0x18);
5244	rt2800_bbp_write(rt2x00dev, 80, 0x09);
5245	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5246
5247	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5248
5249	rt2800_bbp_write(rt2x00dev, 83, 0x7a);
5250
5251	rt2800_bbp_write(rt2x00dev, 84, 0x9a);
5252
5253	rt2800_bbp_write(rt2x00dev, 86, 0x38);
5254
5255	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5256
5257	rt2800_bbp_write(rt2x00dev, 92, 0x02);
5258
5259	rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5260
5261	rt2800_bbp_write(rt2x00dev, 104, 0x92);
5262
5263	rt2800_bbp_write(rt2x00dev, 105, 0x1c);
5264
5265	rt2800_bbp_write(rt2x00dev, 106, 0x03);
5266
5267	rt2800_bbp_write(rt2x00dev, 128, 0x12);
5268
5269	rt2800_bbp_write(rt2x00dev, 67, 0x24);
5270	rt2800_bbp_write(rt2x00dev, 143, 0x04);
5271	rt2800_bbp_write(rt2x00dev, 142, 0x99);
5272	rt2800_bbp_write(rt2x00dev, 150, 0x30);
5273	rt2800_bbp_write(rt2x00dev, 151, 0x2e);
5274	rt2800_bbp_write(rt2x00dev, 152, 0x20);
5275	rt2800_bbp_write(rt2x00dev, 153, 0x34);
5276	rt2800_bbp_write(rt2x00dev, 154, 0x40);
5277	rt2800_bbp_write(rt2x00dev, 155, 0x3b);
5278	rt2800_bbp_write(rt2x00dev, 253, 0x04);
5279
5280	rt2800_bbp_read(rt2x00dev, 47, &value);
5281	rt2x00_set_field8(&value, BBP47_TSSI_ADC6, 1);
5282	rt2800_bbp_write(rt2x00dev, 47, value);
5283
5284	/* Use 5-bit ADC for Acquisition and 8-bit ADC for data */
5285	rt2800_bbp_read(rt2x00dev, 3, &value);
5286	rt2x00_set_field8(&value, BBP3_ADC_MODE_SWITCH, 1);
5287	rt2x00_set_field8(&value, BBP3_ADC_INIT_MODE, 1);
5288	rt2800_bbp_write(rt2x00dev, 3, value);
5289}
5290
5291static void rt2800_init_bbp_3352(struct rt2x00_dev *rt2x00dev)
5292{
5293	rt2800_bbp_write(rt2x00dev, 3, 0x00);
5294	rt2800_bbp_write(rt2x00dev, 4, 0x50);
5295
5296	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5297
5298	rt2800_bbp_write(rt2x00dev, 47, 0x48);
5299
5300	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5301	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5302
5303	rt2800_bbp_write(rt2x00dev, 68, 0x0b);
5304
5305	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5306	rt2800_bbp_write(rt2x00dev, 73, 0x13);
5307	rt2800_bbp_write(rt2x00dev, 75, 0x46);
5308	rt2800_bbp_write(rt2x00dev, 76, 0x28);
5309
5310	rt2800_bbp_write(rt2x00dev, 77, 0x59);
5311
5312	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5313
5314	rt2800_bbp_write(rt2x00dev, 78, 0x0e);
5315	rt2800_bbp_write(rt2x00dev, 80, 0x08);
5316	rt2800_bbp_write(rt2x00dev, 81, 0x37);
5317
5318	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5319
5320	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5321
5322	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5323
5324	rt2800_bbp_write(rt2x00dev, 86, 0x38);
5325
5326	rt2800_bbp_write(rt2x00dev, 88, 0x90);
5327
5328	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5329
5330	rt2800_bbp_write(rt2x00dev, 92, 0x02);
5331
5332	rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5333
5334	rt2800_bbp_write(rt2x00dev, 104, 0x92);
5335
5336	rt2800_bbp_write(rt2x00dev, 105, 0x34);
5337
5338	rt2800_bbp_write(rt2x00dev, 106, 0x05);
5339
5340	rt2800_bbp_write(rt2x00dev, 120, 0x50);
5341
5342	rt2800_bbp_write(rt2x00dev, 137, 0x0f);
5343
5344	rt2800_bbp_write(rt2x00dev, 163, 0xbd);
5345	/* Set ITxBF timeout to 0x9c40=1000msec */
5346	rt2800_bbp_write(rt2x00dev, 179, 0x02);
5347	rt2800_bbp_write(rt2x00dev, 180, 0x00);
5348	rt2800_bbp_write(rt2x00dev, 182, 0x40);
5349	rt2800_bbp_write(rt2x00dev, 180, 0x01);
5350	rt2800_bbp_write(rt2x00dev, 182, 0x9c);
5351	rt2800_bbp_write(rt2x00dev, 179, 0x00);
5352	/* Reprogram the inband interface to put right values in RXWI */
5353	rt2800_bbp_write(rt2x00dev, 142, 0x04);
5354	rt2800_bbp_write(rt2x00dev, 143, 0x3b);
5355	rt2800_bbp_write(rt2x00dev, 142, 0x06);
5356	rt2800_bbp_write(rt2x00dev, 143, 0xa0);
5357	rt2800_bbp_write(rt2x00dev, 142, 0x07);
5358	rt2800_bbp_write(rt2x00dev, 143, 0xa1);
5359	rt2800_bbp_write(rt2x00dev, 142, 0x08);
5360	rt2800_bbp_write(rt2x00dev, 143, 0xa2);
5361
5362	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
5363}
5364
5365static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
5366{
5367	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5368	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5369
5370	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5371	rt2800_bbp_write(rt2x00dev, 73, 0x10);
5372
5373	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5374
5375	rt2800_bbp_write(rt2x00dev, 79, 0x13);
5376	rt2800_bbp_write(rt2x00dev, 80, 0x05);
5377	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5378
5379	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5380
5381	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5382
5383	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5384
5385	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5386
5387	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5388
5389	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5390
5391	if (rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E))
5392		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5393	else
5394		rt2800_bbp_write(rt2x00dev, 103, 0x00);
5395
5396	rt2800_bbp_write(rt2x00dev, 105, 0x05);
5397
5398	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5399
5400	rt2800_disable_unused_dac_adc(rt2x00dev);
5401}
5402
5403static void rt2800_init_bbp_3572(struct rt2x00_dev *rt2x00dev)
5404{
5405	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5406
5407	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5408	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5409
5410	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5411	rt2800_bbp_write(rt2x00dev, 73, 0x10);
5412
5413	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5414
5415	rt2800_bbp_write(rt2x00dev, 79, 0x13);
5416	rt2800_bbp_write(rt2x00dev, 80, 0x05);
5417	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5418
5419	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5420
5421	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
5422
5423	rt2800_bbp_write(rt2x00dev, 84, 0x99);
5424
5425	rt2800_bbp_write(rt2x00dev, 86, 0x00);
5426
5427	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5428
5429	rt2800_bbp_write(rt2x00dev, 92, 0x00);
5430
5431	rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5432
5433	rt2800_bbp_write(rt2x00dev, 105, 0x05);
5434
5435	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5436
5437	rt2800_disable_unused_dac_adc(rt2x00dev);
5438}
5439
5440static void rt2800_init_bbp_3593(struct rt2x00_dev *rt2x00dev)
5441{
5442	rt2800_init_bbp_early(rt2x00dev);
5443
5444	rt2800_bbp_write(rt2x00dev, 79, 0x13);
5445	rt2800_bbp_write(rt2x00dev, 80, 0x05);
5446	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5447	rt2800_bbp_write(rt2x00dev, 137, 0x0f);
5448
5449	rt2800_bbp_write(rt2x00dev, 84, 0x19);
5450
5451	/* Enable DC filter */
5452	if (rt2x00_rt_rev_gte(rt2x00dev, RT3593, REV_RT3593E))
5453		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5454}
5455
5456static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
5457{
5458	int ant, div_mode;
5459	u16 eeprom;
5460	u8 value;
5461
5462	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
5463
5464	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5465
5466	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
5467	rt2800_bbp_write(rt2x00dev, 66, 0x38);
5468
5469	rt2800_bbp_write(rt2x00dev, 68, 0x0b);
5470
5471	rt2800_bbp_write(rt2x00dev, 69, 0x12);
5472	rt2800_bbp_write(rt2x00dev, 73, 0x13);
5473	rt2800_bbp_write(rt2x00dev, 75, 0x46);
5474	rt2800_bbp_write(rt2x00dev, 76, 0x28);
5475
5476	rt2800_bbp_write(rt2x00dev, 77, 0x59);
5477
5478	rt2800_bbp_write(rt2x00dev, 70, 0x0a);
5479
5480	rt2800_bbp_write(rt2x00dev, 79, 0x13);
5481	rt2800_bbp_write(rt2x00dev, 80, 0x05);
5482	rt2800_bbp_write(rt2x00dev, 81, 0x33);
5483
5484	rt2800_bbp_write(rt2x00dev, 82, 0x62);
5485
5486	rt2800_bbp_write(rt2x00dev, 83, 0x7a);
5487
5488	rt2800_bbp_write(rt2x00dev, 84, 0x9a);
5489
5490	rt2800_bbp_write(rt2x00dev, 86, 0x38);
5491
5492	if (rt2x00_rt(rt2x00dev, RT5392))
5493		rt2800_bbp_write(rt2x00dev, 88, 0x90);
5494
5495	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5496
5497	rt2800_bbp_write(rt2x00dev, 92, 0x02);
5498
5499	if (rt2x00_rt(rt2x00dev, RT5392)) {
5500		rt2800_bbp_write(rt2x00dev, 95, 0x9a);
5501		rt2800_bbp_write(rt2x00dev, 98, 0x12);
5502	}
5503
5504	rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5505
5506	rt2800_bbp_write(rt2x00dev, 104, 0x92);
5507
5508	rt2800_bbp_write(rt2x00dev, 105, 0x3c);
5509
5510	if (rt2x00_rt(rt2x00dev, RT5390))
5511		rt2800_bbp_write(rt2x00dev, 106, 0x03);
5512	else if (rt2x00_rt(rt2x00dev, RT5392))
5513		rt2800_bbp_write(rt2x00dev, 106, 0x12);
5514	else
5515		WARN_ON(1);
5516
5517	rt2800_bbp_write(rt2x00dev, 128, 0x12);
5518
5519	if (rt2x00_rt(rt2x00dev, RT5392)) {
5520		rt2800_bbp_write(rt2x00dev, 134, 0xd0);
5521		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
5522	}
5523
5524	rt2800_disable_unused_dac_adc(rt2x00dev);
5525
5526	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
5527	div_mode = rt2x00_get_field16(eeprom,
5528				      EEPROM_NIC_CONF1_ANT_DIVERSITY);
5529	ant = (div_mode == 3) ? 1 : 0;
5530
5531	/* check if this is a Bluetooth combo card */
5532	if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
5533		u32 reg;
5534
5535		rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
5536		rt2x00_set_field32(&reg, GPIO_CTRL_DIR3, 0);
5537		rt2x00_set_field32(&reg, GPIO_CTRL_DIR6, 0);
5538		rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, 0);
5539		rt2x00_set_field32(&reg, GPIO_CTRL_VAL6, 0);
5540		if (ant == 0)
5541			rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, 1);
5542		else if (ant == 1)
5543			rt2x00_set_field32(&reg, GPIO_CTRL_VAL6, 1);
5544		rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
5545	}
5546
5547	/* This chip has hardware antenna diversity*/
5548	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R)) {
5549		rt2800_bbp_write(rt2x00dev, 150, 0); /* Disable Antenna Software OFDM */
5550		rt2800_bbp_write(rt2x00dev, 151, 0); /* Disable Antenna Software CCK */
5551		rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */
5552	}
5553
5554	rt2800_bbp_read(rt2x00dev, 152, &value);
5555	if (ant == 0)
5556		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1);
5557	else
5558		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0);
5559	rt2800_bbp_write(rt2x00dev, 152, value);
5560
5561	rt2800_init_freq_calibration(rt2x00dev);
5562}
5563
5564static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev)
5565{
5566	int ant, div_mode;
5567	u16 eeprom;
5568	u8 value;
5569
5570	rt2800_init_bbp_early(rt2x00dev);
5571
5572	rt2800_bbp_read(rt2x00dev, 105, &value);
5573	rt2x00_set_field8(&value, BBP105_MLD,
5574			  rt2x00dev->default_ant.rx_chain_num == 2);
5575	rt2800_bbp_write(rt2x00dev, 105, value);
5576
5577	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
5578
5579	rt2800_bbp_write(rt2x00dev, 20, 0x06);
5580	rt2800_bbp_write(rt2x00dev, 31, 0x08);
5581	rt2800_bbp_write(rt2x00dev, 65, 0x2C);
5582	rt2800_bbp_write(rt2x00dev, 68, 0xDD);
5583	rt2800_bbp_write(rt2x00dev, 69, 0x1A);
5584	rt2800_bbp_write(rt2x00dev, 70, 0x05);
5585	rt2800_bbp_write(rt2x00dev, 73, 0x13);
5586	rt2800_bbp_write(rt2x00dev, 74, 0x0F);
5587	rt2800_bbp_write(rt2x00dev, 75, 0x4F);
5588	rt2800_bbp_write(rt2x00dev, 76, 0x28);
5589	rt2800_bbp_write(rt2x00dev, 77, 0x59);
5590	rt2800_bbp_write(rt2x00dev, 84, 0x9A);
5591	rt2800_bbp_write(rt2x00dev, 86, 0x38);
5592	rt2800_bbp_write(rt2x00dev, 88, 0x90);
5593	rt2800_bbp_write(rt2x00dev, 91, 0x04);
5594	rt2800_bbp_write(rt2x00dev, 92, 0x02);
5595	rt2800_bbp_write(rt2x00dev, 95, 0x9a);
5596	rt2800_bbp_write(rt2x00dev, 98, 0x12);
5597	rt2800_bbp_write(rt2x00dev, 103, 0xC0);
5598	rt2800_bbp_write(rt2x00dev, 104, 0x92);
5599	/* FIXME BBP105 owerwrite */
5600	rt2800_bbp_write(rt2x00dev, 105, 0x3C);
5601	rt2800_bbp_write(rt2x00dev, 106, 0x35);
5602	rt2800_bbp_write(rt2x00dev, 128, 0x12);
5603	rt2800_bbp_write(rt2x00dev, 134, 0xD0);
5604	rt2800_bbp_write(rt2x00dev, 135, 0xF6);
5605	rt2800_bbp_write(rt2x00dev, 137, 0x0F);
5606
5607	/* Initialize GLRT (Generalized Likehood Radio Test) */
5608	rt2800_init_bbp_5592_glrt(rt2x00dev);
5609
5610	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
5611
5612	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
5613	div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY);
5614	ant = (div_mode == 3) ? 1 : 0;
5615	rt2800_bbp_read(rt2x00dev, 152, &value);
5616	if (ant == 0) {
5617		/* Main antenna */
5618		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1);
5619	} else {
5620		/* Auxiliary antenna */
5621		rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0);
5622	}
5623	rt2800_bbp_write(rt2x00dev, 152, value);
5624
5625	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) {
5626		rt2800_bbp_read(rt2x00dev, 254, &value);
5627		rt2x00_set_field8(&value, BBP254_BIT7, 1);
5628		rt2800_bbp_write(rt2x00dev, 254, value);
5629	}
5630
5631	rt2800_init_freq_calibration(rt2x00dev);
5632
5633	rt2800_bbp_write(rt2x00dev, 84, 0x19);
5634	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
5635		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
5636}
5637
5638static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
5639{
5640	unsigned int i;
5641	u16 eeprom;
5642	u8 reg_id;
5643	u8 value;
5644
5645	if (rt2800_is_305x_soc(rt2x00dev))
5646		rt2800_init_bbp_305x_soc(rt2x00dev);
5647
5648	switch (rt2x00dev->chip.rt) {
5649	case RT2860:
5650	case RT2872:
5651	case RT2883:
5652		rt2800_init_bbp_28xx(rt2x00dev);
5653		break;
5654	case RT3070:
5655	case RT3071:
5656	case RT3090:
5657		rt2800_init_bbp_30xx(rt2x00dev);
5658		break;
5659	case RT3290:
5660		rt2800_init_bbp_3290(rt2x00dev);
5661		break;
5662	case RT3352:
5663		rt2800_init_bbp_3352(rt2x00dev);
5664		break;
5665	case RT3390:
5666		rt2800_init_bbp_3390(rt2x00dev);
5667		break;
5668	case RT3572:
5669		rt2800_init_bbp_3572(rt2x00dev);
5670		break;
5671	case RT3593:
5672		rt2800_init_bbp_3593(rt2x00dev);
5673		return;
5674	case RT5390:
5675	case RT5392:
5676		rt2800_init_bbp_53xx(rt2x00dev);
5677		break;
5678	case RT5592:
5679		rt2800_init_bbp_5592(rt2x00dev);
5680		return;
5681	}
5682
5683	for (i = 0; i < EEPROM_BBP_SIZE; i++) {
5684		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_BBP_START, i,
5685					      &eeprom);
5686
5687		if (eeprom != 0xffff && eeprom != 0x0000) {
5688			reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);
5689			value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE);
5690			rt2800_bbp_write(rt2x00dev, reg_id, value);
5691		}
5692	}
5693}
5694
5695static void rt2800_led_open_drain_enable(struct rt2x00_dev *rt2x00dev)
5696{
5697	u32 reg;
5698
5699	rt2800_register_read(rt2x00dev, OPT_14_CSR, &reg);
5700	rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
5701	rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
5702}
5703
5704static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev, bool bw40,
5705				u8 filter_target)
5706{
5707	unsigned int i;
5708	u8 bbp;
5709	u8 rfcsr;
5710	u8 passband;
5711	u8 stopband;
5712	u8 overtuned = 0;
5713	u8 rfcsr24 = (bw40) ? 0x27 : 0x07;
5714
5715	rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
5716
5717	rt2800_bbp_read(rt2x00dev, 4, &bbp);
5718	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * bw40);
5719	rt2800_bbp_write(rt2x00dev, 4, bbp);
5720
5721	rt2800_rfcsr_read(rt2x00dev, 31, &rfcsr);
5722	rt2x00_set_field8(&rfcsr, RFCSR31_RX_H20M, bw40);
5723	rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
5724
5725	rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr);
5726	rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 1);
5727	rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
5728
5729	/*
5730	 * Set power & frequency of passband test tone
5731	 */
5732	rt2800_bbp_write(rt2x00dev, 24, 0);
5733
5734	for (i = 0; i < 100; i++) {
5735		rt2800_bbp_write(rt2x00dev, 25, 0x90);
5736		msleep(1);
5737
5738		rt2800_bbp_read(rt2x00dev, 55, &passband);
5739		if (passband)
5740			break;
5741	}
5742
5743	/*
5744	 * Set power & frequency of stopband test tone
5745	 */
5746	rt2800_bbp_write(rt2x00dev, 24, 0x06);
5747
5748	for (i = 0; i < 100; i++) {
5749		rt2800_bbp_write(rt2x00dev, 25, 0x90);
5750		msleep(1);
5751
5752		rt2800_bbp_read(rt2x00dev, 55, &stopband);
5753
5754		if ((passband - stopband) <= filter_target) {
5755			rfcsr24++;
5756			overtuned += ((passband - stopband) == filter_target);
5757		} else
5758			break;
5759
5760		rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
5761	}
5762
5763	rfcsr24 -= !!overtuned;
5764
5765	rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
5766	return rfcsr24;
5767}
5768
5769static void rt2800_rf_init_calibration(struct rt2x00_dev *rt2x00dev,
5770				       const unsigned int rf_reg)
5771{
5772	u8 rfcsr;
5773
5774	rt2800_rfcsr_read(rt2x00dev, rf_reg, &rfcsr);
5775	rt2x00_set_field8(&rfcsr, FIELD8(0x80), 1);
5776	rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr);
5777	msleep(1);
5778	rt2x00_set_field8(&rfcsr, FIELD8(0x80), 0);
5779	rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr);
5780}
5781
5782static void rt2800_rx_filter_calibration(struct rt2x00_dev *rt2x00dev)
5783{
5784	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
5785	u8 filter_tgt_bw20;
5786	u8 filter_tgt_bw40;
5787	u8 rfcsr, bbp;
5788
5789	/*
5790	 * TODO: sync filter_tgt values with vendor driver
5791	 */
5792	if (rt2x00_rt(rt2x00dev, RT3070)) {
5793		filter_tgt_bw20 = 0x16;
5794		filter_tgt_bw40 = 0x19;
5795	} else {
5796		filter_tgt_bw20 = 0x13;
5797		filter_tgt_bw40 = 0x15;
5798	}
5799
5800	drv_data->calibration_bw20 =
5801		rt2800_init_rx_filter(rt2x00dev, false, filter_tgt_bw20);
5802	drv_data->calibration_bw40 =
5803		rt2800_init_rx_filter(rt2x00dev, true, filter_tgt_bw40);
5804
5805	/*
5806	 * Save BBP 25 & 26 values for later use in channel switching (for 3052)
5807	 */
5808	rt2800_bbp_read(rt2x00dev, 25, &drv_data->bbp25);
5809	rt2800_bbp_read(rt2x00dev, 26, &drv_data->bbp26);
5810
5811	/*
5812	 * Set back to initial state
5813	 */
5814	rt2800_bbp_write(rt2x00dev, 24, 0);
5815
5816	rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr);
5817	rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 0);
5818	rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
5819
5820	/*
5821	 * Set BBP back to BW20
5822	 */
5823	rt2800_bbp_read(rt2x00dev, 4, &bbp);
5824	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 0);
5825	rt2800_bbp_write(rt2x00dev, 4, bbp);
5826}
5827
5828static void rt2800_normal_mode_setup_3xxx(struct rt2x00_dev *rt2x00dev)
5829{
5830	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
5831	u8 min_gain, rfcsr, bbp;
5832	u16 eeprom;
5833
5834	rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
5835
5836	rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
5837	if (rt2x00_rt(rt2x00dev, RT3070) ||
5838	    rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
5839	    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) ||
5840	    rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) {
5841		if (!rt2x00_has_cap_external_lna_bg(rt2x00dev))
5842			rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
5843	}
5844
5845	min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2;
5846	if (drv_data->txmixer_gain_24g >= min_gain) {
5847		rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
5848				  drv_data->txmixer_gain_24g);
5849	}
5850
5851	rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
5852
5853	if (rt2x00_rt(rt2x00dev, RT3090)) {
5854		/*  Turn off unused DAC1 and ADC1 to reduce power consumption */
5855		rt2800_bbp_read(rt2x00dev, 138, &bbp);
5856		rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
5857		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
5858			rt2x00_set_field8(&bbp, BBP138_RX_ADC1, 0);
5859		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
5860			rt2x00_set_field8(&bbp, BBP138_TX_DAC1, 1);
5861		rt2800_bbp_write(rt2x00dev, 138, bbp);
5862	}
5863
5864	if (rt2x00_rt(rt2x00dev, RT3070)) {
5865		rt2800_rfcsr_read(rt2x00dev, 27, &rfcsr);
5866		if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F))
5867			rt2x00_set_field8(&rfcsr, RFCSR27_R1, 3);
5868		else
5869			rt2x00_set_field8(&rfcsr, RFCSR27_R1, 0);
5870		rt2x00_set_field8(&rfcsr, RFCSR27_R2, 0);
5871		rt2x00_set_field8(&rfcsr, RFCSR27_R3, 0);
5872		rt2x00_set_field8(&rfcsr, RFCSR27_R4, 0);
5873		rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
5874	} else if (rt2x00_rt(rt2x00dev, RT3071) ||
5875		   rt2x00_rt(rt2x00dev, RT3090) ||
5876		   rt2x00_rt(rt2x00dev, RT3390)) {
5877		rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
5878		rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
5879		rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
5880		rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
5881		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
5882		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
5883		rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
5884
5885		rt2800_rfcsr_read(rt2x00dev, 15, &rfcsr);
5886		rt2x00_set_field8(&rfcsr, RFCSR15_TX_LO2_EN, 0);
5887		rt2800_rfcsr_write(rt2x00dev, 15, rfcsr);
5888
5889		rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr);
5890		rt2x00_set_field8(&rfcsr, RFCSR20_RX_LO1_EN, 0);
5891		rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
5892
5893		rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr);
5894		rt2x00_set_field8(&rfcsr, RFCSR21_RX_LO2_EN, 0);
5895		rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
5896	}
5897}
5898
5899static void rt2800_normal_mode_setup_3593(struct rt2x00_dev *rt2x00dev)
5900{
5901	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
5902	u8 rfcsr;
5903	u8 tx_gain;
5904
5905	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
5906	rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO2_EN, 0);
5907	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
5908
5909	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
5910	tx_gain = rt2x00_get_field8(drv_data->txmixer_gain_24g,
5911				    RFCSR17_TXMIXER_GAIN);
5912	rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, tx_gain);
5913	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
5914
5915	rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
5916	rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
5917	rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
5918
5919	rt2800_rfcsr_read(rt2x00dev, 39, &rfcsr);
5920	rt2x00_set_field8(&rfcsr, RFCSR39_RX_LO2_EN, 0);
5921	rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
5922
5923	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
5924	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
5925	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
5926	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
5927
5928	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
5929	rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
5930	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
5931
5932	/* TODO: enable stream mode */
5933}
5934
5935static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev)
5936{
5937	u8 reg;
5938	u16 eeprom;
5939
5940	/*  Turn off unused DAC1 and ADC1 to reduce power consumption */
5941	rt2800_bbp_read(rt2x00dev, 138, &reg);
5942	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
5943	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
5944		rt2x00_set_field8(&reg, BBP138_RX_ADC1, 0);
5945	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
5946		rt2x00_set_field8(&reg, BBP138_TX_DAC1, 1);
5947	rt2800_bbp_write(rt2x00dev, 138, reg);
5948
5949	rt2800_rfcsr_read(rt2x00dev, 38, &reg);
5950	rt2x00_set_field8(&reg, RFCSR38_RX_LO1_EN, 0);
5951	rt2800_rfcsr_write(rt2x00dev, 38, reg);
5952
5953	rt2800_rfcsr_read(rt2x00dev, 39, &reg);
5954	rt2x00_set_field8(&reg, RFCSR39_RX_LO2_EN, 0);
5955	rt2800_rfcsr_write(rt2x00dev, 39, reg);
5956
5957	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
5958
5959	rt2800_rfcsr_read(rt2x00dev, 30, &reg);
5960	rt2x00_set_field8(&reg, RFCSR30_RX_VCM, 2);
5961	rt2800_rfcsr_write(rt2x00dev, 30, reg);
5962}
5963
5964static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev)
5965{
5966	rt2800_rf_init_calibration(rt2x00dev, 30);
5967
5968	rt2800_rfcsr_write(rt2x00dev, 0, 0x50);
5969	rt2800_rfcsr_write(rt2x00dev, 1, 0x01);
5970	rt2800_rfcsr_write(rt2x00dev, 2, 0xf7);
5971	rt2800_rfcsr_write(rt2x00dev, 3, 0x75);
5972	rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
5973	rt2800_rfcsr_write(rt2x00dev, 5, 0x03);
5974	rt2800_rfcsr_write(rt2x00dev, 6, 0x02);
5975	rt2800_rfcsr_write(rt2x00dev, 7, 0x50);
5976	rt2800_rfcsr_write(rt2x00dev, 8, 0x39);
5977	rt2800_rfcsr_write(rt2x00dev, 9, 0x0f);
5978	rt2800_rfcsr_write(rt2x00dev, 10, 0x60);
5979	rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
5980	rt2800_rfcsr_write(rt2x00dev, 12, 0x75);
5981	rt2800_rfcsr_write(rt2x00dev, 13, 0x75);
5982	rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
5983	rt2800_rfcsr_write(rt2x00dev, 15, 0x58);
5984	rt2800_rfcsr_write(rt2x00dev, 16, 0xb3);
5985	rt2800_rfcsr_write(rt2x00dev, 17, 0x92);
5986	rt2800_rfcsr_write(rt2x00dev, 18, 0x2c);
5987	rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
5988	rt2800_rfcsr_write(rt2x00dev, 20, 0xba);
5989	rt2800_rfcsr_write(rt2x00dev, 21, 0xdb);
5990	rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
5991	rt2800_rfcsr_write(rt2x00dev, 23, 0x31);
5992	rt2800_rfcsr_write(rt2x00dev, 24, 0x08);
5993	rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
5994	rt2800_rfcsr_write(rt2x00dev, 26, 0x25);
5995	rt2800_rfcsr_write(rt2x00dev, 27, 0x23);
5996	rt2800_rfcsr_write(rt2x00dev, 28, 0x13);
5997	rt2800_rfcsr_write(rt2x00dev, 29, 0x83);
5998	rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
5999	rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
6000}
6001
6002static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev)
6003{
6004	u8 rfcsr;
6005	u16 eeprom;
6006	u32 reg;
6007
6008	/* XXX vendor driver do this only for 3070 */
6009	rt2800_rf_init_calibration(rt2x00dev, 30);
6010
6011	rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
6012	rt2800_rfcsr_write(rt2x00dev, 5, 0x03);
6013	rt2800_rfcsr_write(rt2x00dev, 6, 0x02);
6014	rt2800_rfcsr_write(rt2x00dev, 7, 0x60);
6015	rt2800_rfcsr_write(rt2x00dev, 9, 0x0f);
6016	rt2800_rfcsr_write(rt2x00dev, 10, 0x41);
6017	rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
6018	rt2800_rfcsr_write(rt2x00dev, 12, 0x7b);
6019	rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
6020	rt2800_rfcsr_write(rt2x00dev, 15, 0x58);
6021	rt2800_rfcsr_write(rt2x00dev, 16, 0xb3);
6022	rt2800_rfcsr_write(rt2x00dev, 17, 0x92);
6023	rt2800_rfcsr_write(rt2x00dev, 18, 0x2c);
6024	rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
6025	rt2800_rfcsr_write(rt2x00dev, 20, 0xba);
6026	rt2800_rfcsr_write(rt2x00dev, 21, 0xdb);
6027	rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
6028	rt2800_rfcsr_write(rt2x00dev, 25, 0x03);
6029	rt2800_rfcsr_write(rt2x00dev, 29, 0x1f);
6030
6031	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
6032		rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6033		rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
6034		rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
6035		rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6036	} else if (rt2x00_rt(rt2x00dev, RT3071) ||
6037		   rt2x00_rt(rt2x00dev, RT3090)) {
6038		rt2800_rfcsr_write(rt2x00dev, 31, 0x14);
6039
6040		rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
6041		rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
6042		rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
6043
6044		rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6045		rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
6046		if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
6047		    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E)) {
6048			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
6049					   &eeprom);
6050			if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
6051				rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
6052			else
6053				rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
6054		}
6055		rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6056
6057		rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
6058		rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
6059		rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
6060	}
6061
6062	rt2800_rx_filter_calibration(rt2x00dev);
6063
6064	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F) ||
6065	    rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
6066	    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E))
6067		rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
6068
6069	rt2800_led_open_drain_enable(rt2x00dev);
6070	rt2800_normal_mode_setup_3xxx(rt2x00dev);
6071}
6072
6073static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev)
6074{
6075	u8 rfcsr;
6076
6077	rt2800_rf_init_calibration(rt2x00dev, 2);
6078
6079	rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
6080	rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
6081	rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
6082	rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
6083	rt2800_rfcsr_write(rt2x00dev, 6, 0xa0);
6084	rt2800_rfcsr_write(rt2x00dev, 8, 0xf3);
6085	rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
6086	rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
6087	rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
6088	rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
6089	rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
6090	rt2800_rfcsr_write(rt2x00dev, 18, 0x02);
6091	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
6092	rt2800_rfcsr_write(rt2x00dev, 25, 0x83);
6093	rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
6094	rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
6095	rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
6096	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
6097	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
6098	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
6099	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
6100	rt2800_rfcsr_write(rt2x00dev, 34, 0x05);
6101	rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
6102	rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
6103	rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
6104	rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
6105	rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
6106	rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
6107	rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
6108	rt2800_rfcsr_write(rt2x00dev, 43, 0x7b);
6109	rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
6110	rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
6111	rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
6112	rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
6113	rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
6114	rt2800_rfcsr_write(rt2x00dev, 49, 0x98);
6115	rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
6116	rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
6117	rt2800_rfcsr_write(rt2x00dev, 54, 0x78);
6118	rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
6119	rt2800_rfcsr_write(rt2x00dev, 56, 0x02);
6120	rt2800_rfcsr_write(rt2x00dev, 57, 0x80);
6121	rt2800_rfcsr_write(rt2x00dev, 58, 0x7f);
6122	rt2800_rfcsr_write(rt2x00dev, 59, 0x09);
6123	rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
6124	rt2800_rfcsr_write(rt2x00dev, 61, 0xc1);
6125
6126	rt2800_rfcsr_read(rt2x00dev, 29, &rfcsr);
6127	rt2x00_set_field8(&rfcsr, RFCSR29_RSSI_GAIN, 3);
6128	rt2800_rfcsr_write(rt2x00dev, 29, rfcsr);
6129
6130	rt2800_led_open_drain_enable(rt2x00dev);
6131	rt2800_normal_mode_setup_3xxx(rt2x00dev);
6132}
6133
6134static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
6135{
6136	rt2800_rf_init_calibration(rt2x00dev, 30);
6137
6138	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
6139	rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
6140	rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
6141	rt2800_rfcsr_write(rt2x00dev, 3, 0x18);
6142	rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
6143	rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
6144	rt2800_rfcsr_write(rt2x00dev, 6, 0x33);
6145	rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
6146	rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
6147	rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
6148	rt2800_rfcsr_write(rt2x00dev, 10, 0xd2);
6149	rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
6150	rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
6151	rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
6152	rt2800_rfcsr_write(rt2x00dev, 14, 0x5a);
6153	rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
6154	rt2800_rfcsr_write(rt2x00dev, 16, 0x01);
6155	rt2800_rfcsr_write(rt2x00dev, 18, 0x45);
6156	rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
6157	rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
6158	rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
6159	rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
6160	rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
6161	rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
6162	rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
6163	rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
6164	rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
6165	rt2800_rfcsr_write(rt2x00dev, 28, 0x03);
6166	rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
6167	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
6168	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
6169	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
6170	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
6171	rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
6172	rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
6173	rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
6174	rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
6175	rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
6176	rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
6177	rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
6178	rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
6179	rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
6180	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
6181	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
6182	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
6183	rt2800_rfcsr_write(rt2x00dev, 46, 0xdd);
6184	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
6185	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
6186	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
6187	rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
6188	rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
6189	rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
6190	rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
6191	rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
6192	rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
6193	rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
6194	rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
6195	rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
6196	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
6197	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
6198	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
6199	rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
6200	rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
6201
6202	rt2800_rx_filter_calibration(rt2x00dev);
6203	rt2800_led_open_drain_enable(rt2x00dev);
6204	rt2800_normal_mode_setup_3xxx(rt2x00dev);
6205}
6206
6207static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev)
6208{
6209	u32 reg;
6210
6211	rt2800_rf_init_calibration(rt2x00dev, 30);
6212
6213	rt2800_rfcsr_write(rt2x00dev, 0, 0xa0);
6214	rt2800_rfcsr_write(rt2x00dev, 1, 0xe1);
6215	rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
6216	rt2800_rfcsr_write(rt2x00dev, 3, 0x62);
6217	rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
6218	rt2800_rfcsr_write(rt2x00dev, 5, 0x8b);
6219	rt2800_rfcsr_write(rt2x00dev, 6, 0x42);
6220	rt2800_rfcsr_write(rt2x00dev, 7, 0x34);
6221	rt2800_rfcsr_write(rt2x00dev, 8, 0x00);
6222	rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
6223	rt2800_rfcsr_write(rt2x00dev, 10, 0x61);
6224	rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
6225	rt2800_rfcsr_write(rt2x00dev, 12, 0x3b);
6226	rt2800_rfcsr_write(rt2x00dev, 13, 0xe0);
6227	rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
6228	rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
6229	rt2800_rfcsr_write(rt2x00dev, 16, 0xe0);
6230	rt2800_rfcsr_write(rt2x00dev, 17, 0x94);
6231	rt2800_rfcsr_write(rt2x00dev, 18, 0x5c);
6232	rt2800_rfcsr_write(rt2x00dev, 19, 0x4a);
6233	rt2800_rfcsr_write(rt2x00dev, 20, 0xb2);
6234	rt2800_rfcsr_write(rt2x00dev, 21, 0xf6);
6235	rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
6236	rt2800_rfcsr_write(rt2x00dev, 23, 0x14);
6237	rt2800_rfcsr_write(rt2x00dev, 24, 0x08);
6238	rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
6239	rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
6240	rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
6241	rt2800_rfcsr_write(rt2x00dev, 28, 0x41);
6242	rt2800_rfcsr_write(rt2x00dev, 29, 0x8f);
6243	rt2800_rfcsr_write(rt2x00dev, 30, 0x20);
6244	rt2800_rfcsr_write(rt2x00dev, 31, 0x0f);
6245
6246	rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
6247	rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
6248	rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
6249
6250	rt2800_rx_filter_calibration(rt2x00dev);
6251
6252	if (rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E))
6253		rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
6254
6255	rt2800_led_open_drain_enable(rt2x00dev);
6256	rt2800_normal_mode_setup_3xxx(rt2x00dev);
6257}
6258
6259static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev)
6260{
6261	u8 rfcsr;
6262	u32 reg;
6263
6264	rt2800_rf_init_calibration(rt2x00dev, 30);
6265
6266	rt2800_rfcsr_write(rt2x00dev, 0, 0x70);
6267	rt2800_rfcsr_write(rt2x00dev, 1, 0x81);
6268	rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
6269	rt2800_rfcsr_write(rt2x00dev, 3, 0x02);
6270	rt2800_rfcsr_write(rt2x00dev, 4, 0x4c);
6271	rt2800_rfcsr_write(rt2x00dev, 5, 0x05);
6272	rt2800_rfcsr_write(rt2x00dev, 6, 0x4a);
6273	rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
6274	rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
6275	rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
6276	rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
6277	rt2800_rfcsr_write(rt2x00dev, 12, 0x70);
6278	rt2800_rfcsr_write(rt2x00dev, 13, 0x65);
6279	rt2800_rfcsr_write(rt2x00dev, 14, 0xa0);
6280	rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
6281	rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
6282	rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
6283	rt2800_rfcsr_write(rt2x00dev, 18, 0xac);
6284	rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
6285	rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
6286	rt2800_rfcsr_write(rt2x00dev, 21, 0xd0);
6287	rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
6288	rt2800_rfcsr_write(rt2x00dev, 23, 0x3c);
6289	rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
6290	rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
6291	rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
6292	rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
6293	rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
6294	rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
6295	rt2800_rfcsr_write(rt2x00dev, 30, 0x09);
6296	rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
6297
6298	rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
6299	rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
6300	rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
6301
6302	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6303	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
6304	rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
6305	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6306	msleep(1);
6307	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6308	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
6309	rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
6310	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6311
6312	rt2800_rx_filter_calibration(rt2x00dev);
6313	rt2800_led_open_drain_enable(rt2x00dev);
6314	rt2800_normal_mode_setup_3xxx(rt2x00dev);
6315}
6316
6317static void rt3593_post_bbp_init(struct rt2x00_dev *rt2x00dev)
6318{
6319	u8 bbp;
6320	bool txbf_enabled = false; /* FIXME */
6321
6322	rt2800_bbp_read(rt2x00dev, 105, &bbp);
6323	if (rt2x00dev->default_ant.rx_chain_num == 1)
6324		rt2x00_set_field8(&bbp, BBP105_MLD, 0);
6325	else
6326		rt2x00_set_field8(&bbp, BBP105_MLD, 1);
6327	rt2800_bbp_write(rt2x00dev, 105, bbp);
6328
6329	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6330
6331	rt2800_bbp_write(rt2x00dev, 92, 0x02);
6332	rt2800_bbp_write(rt2x00dev, 82, 0x82);
6333	rt2800_bbp_write(rt2x00dev, 106, 0x05);
6334	rt2800_bbp_write(rt2x00dev, 104, 0x92);
6335	rt2800_bbp_write(rt2x00dev, 88, 0x90);
6336	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
6337	rt2800_bbp_write(rt2x00dev, 47, 0x48);
6338	rt2800_bbp_write(rt2x00dev, 120, 0x50);
6339
6340	if (txbf_enabled)
6341		rt2800_bbp_write(rt2x00dev, 163, 0xbd);
6342	else
6343		rt2800_bbp_write(rt2x00dev, 163, 0x9d);
6344
6345	/* SNR mapping */
6346	rt2800_bbp_write(rt2x00dev, 142, 6);
6347	rt2800_bbp_write(rt2x00dev, 143, 160);
6348	rt2800_bbp_write(rt2x00dev, 142, 7);
6349	rt2800_bbp_write(rt2x00dev, 143, 161);
6350	rt2800_bbp_write(rt2x00dev, 142, 8);
6351	rt2800_bbp_write(rt2x00dev, 143, 162);
6352
6353	/* ADC/DAC control */
6354	rt2800_bbp_write(rt2x00dev, 31, 0x08);
6355
6356	/* RX AGC energy lower bound in log2 */
6357	rt2800_bbp_write(rt2x00dev, 68, 0x0b);
6358
6359	/* FIXME: BBP 105 owerwrite? */
6360	rt2800_bbp_write(rt2x00dev, 105, 0x04);
6361
6362}
6363
6364static void rt2800_init_rfcsr_3593(struct rt2x00_dev *rt2x00dev)
6365{
6366	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
6367	u32 reg;
6368	u8 rfcsr;
6369
6370	/* Disable GPIO #4 and #7 function for LAN PE control */
6371	rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
6372	rt2x00_set_field32(&reg, GPIO_SWITCH_4, 0);
6373	rt2x00_set_field32(&reg, GPIO_SWITCH_7, 0);
6374	rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
6375
6376	/* Initialize default register values */
6377	rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
6378	rt2800_rfcsr_write(rt2x00dev, 3, 0x80);
6379	rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
6380	rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
6381	rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
6382	rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
6383	rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
6384	rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
6385	rt2800_rfcsr_write(rt2x00dev, 12, 0x4e);
6386	rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
6387	rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
6388	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
6389	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
6390	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
6391	rt2800_rfcsr_write(rt2x00dev, 32, 0x78);
6392	rt2800_rfcsr_write(rt2x00dev, 33, 0x3b);
6393	rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
6394	rt2800_rfcsr_write(rt2x00dev, 35, 0xe0);
6395	rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
6396	rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
6397	rt2800_rfcsr_write(rt2x00dev, 44, 0xd3);
6398	rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
6399	rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
6400	rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
6401	rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
6402	rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
6403	rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
6404	rt2800_rfcsr_write(rt2x00dev, 53, 0x18);
6405	rt2800_rfcsr_write(rt2x00dev, 54, 0x18);
6406	rt2800_rfcsr_write(rt2x00dev, 55, 0x18);
6407	rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
6408	rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
6409
6410	/* Initiate calibration */
6411	/* TODO: use rt2800_rf_init_calibration ? */
6412	rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
6413	rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
6414	rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
6415
6416	rt2800_adjust_freq_offset(rt2x00dev);
6417
6418	rt2800_rfcsr_read(rt2x00dev, 18, &rfcsr);
6419	rt2x00_set_field8(&rfcsr, RFCSR18_XO_TUNE_BYPASS, 1);
6420	rt2800_rfcsr_write(rt2x00dev, 18, rfcsr);
6421
6422	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6423	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
6424	rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
6425	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6426	usleep_range(1000, 1500);
6427	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
6428	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
6429	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
6430
6431	/* Set initial values for RX filter calibration */
6432	drv_data->calibration_bw20 = 0x1f;
6433	drv_data->calibration_bw40 = 0x2f;
6434
6435	/* Save BBP 25 & 26 values for later use in channel switching */
6436	rt2800_bbp_read(rt2x00dev, 25, &drv_data->bbp25);
6437	rt2800_bbp_read(rt2x00dev, 26, &drv_data->bbp26);
6438
6439	rt2800_led_open_drain_enable(rt2x00dev);
6440	rt2800_normal_mode_setup_3593(rt2x00dev);
6441
6442	rt3593_post_bbp_init(rt2x00dev);
6443
6444	/* TODO: enable stream mode support */
6445}
6446
6447static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
6448{
6449	rt2800_rf_init_calibration(rt2x00dev, 2);
6450
6451	rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
6452	rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
6453	rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
6454	rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
6455	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
6456		rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
6457	else
6458		rt2800_rfcsr_write(rt2x00dev, 6, 0xa0);
6459	rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
6460	rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
6461	rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
6462	rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
6463	rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
6464	rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
6465	rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
6466	rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
6467	rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
6468	rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
6469
6470	rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
6471	rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
6472	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
6473	rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
6474	rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
6475	if (rt2x00_is_usb(rt2x00dev) &&
6476	    rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
6477		rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
6478	else
6479		rt2800_rfcsr_write(rt2x00dev, 25, 0xc0);
6480	rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
6481	rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
6482	rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
6483	rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
6484
6485	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
6486	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
6487	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
6488	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
6489	rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
6490	rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
6491	rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
6492	rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
6493	rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
6494	rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
6495
6496	rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
6497	rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
6498	rt2800_rfcsr_write(rt2x00dev, 42, 0xd2);
6499	rt2800_rfcsr_write(rt2x00dev, 43, 0x9a);
6500	rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
6501	rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
6502	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
6503		rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
6504	else
6505		rt2800_rfcsr_write(rt2x00dev, 46, 0x7b);
6506	rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
6507	rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
6508	rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
6509
6510	rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
6511	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
6512		rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
6513	else
6514		rt2800_rfcsr_write(rt2x00dev, 53, 0x84);
6515	rt2800_rfcsr_write(rt2x00dev, 54, 0x78);
6516	rt2800_rfcsr_write(rt2x00dev, 55, 0x44);
6517	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
6518		rt2800_rfcsr_write(rt2x00dev, 56, 0x42);
6519	else
6520		rt2800_rfcsr_write(rt2x00dev, 56, 0x22);
6521	rt2800_rfcsr_write(rt2x00dev, 57, 0x80);
6522	rt2800_rfcsr_write(rt2x00dev, 58, 0x7f);
6523	rt2800_rfcsr_write(rt2x00dev, 59, 0x8f);
6524
6525	rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
6526	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
6527		if (rt2x00_is_usb(rt2x00dev))
6528			rt2800_rfcsr_write(rt2x00dev, 61, 0xd1);
6529		else
6530			rt2800_rfcsr_write(rt2x00dev, 61, 0xd5);
6531	} else {
6532		if (rt2x00_is_usb(rt2x00dev))
6533			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
6534		else
6535			rt2800_rfcsr_write(rt2x00dev, 61, 0xb5);
6536	}
6537	rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
6538	rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
6539
6540	rt2800_normal_mode_setup_5xxx(rt2x00dev);
6541
6542	rt2800_led_open_drain_enable(rt2x00dev);
6543}
6544
6545static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev)
6546{
6547	rt2800_rf_init_calibration(rt2x00dev, 2);
6548
6549	rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
6550	rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
6551	rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
6552	rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
6553	rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
6554	rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
6555	rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
6556	rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
6557	rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
6558	rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
6559	rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
6560	rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
6561	rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
6562	rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
6563	rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
6564	rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
6565	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
6566	rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
6567	rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
6568	rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
6569	rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
6570	rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
6571	rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
6572	rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
6573	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
6574	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
6575	rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
6576	rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
6577	rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
6578	rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
6579	rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
6580	rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
6581	rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
6582	rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
6583	rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
6584	rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
6585	rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
6586	rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
6587	rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
6588	rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
6589	rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
6590	rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
6591	rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
6592	rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
6593	rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
6594	rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
6595	rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
6596	rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
6597	rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
6598	rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
6599	rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
6600	rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
6601	rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
6602	rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
6603	rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
6604	rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
6605	rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
6606	rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
6607
6608	rt2800_normal_mode_setup_5xxx(rt2x00dev);
6609
6610	rt2800_led_open_drain_enable(rt2x00dev);
6611}
6612
6613static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev)
6614{
6615	rt2800_rf_init_calibration(rt2x00dev, 30);
6616
6617	rt2800_rfcsr_write(rt2x00dev, 1, 0x3F);
6618	rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
6619	rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
6620	rt2800_rfcsr_write(rt2x00dev, 6, 0xE4);
6621	rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
6622	rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
6623	rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
6624	rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
6625	rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
6626	rt2800_rfcsr_write(rt2x00dev, 19, 0x4D);
6627	rt2800_rfcsr_write(rt2x00dev, 20, 0x10);
6628	rt2800_rfcsr_write(rt2x00dev, 21, 0x8D);
6629	rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
6630	rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
6631	rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
6632	rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
6633	rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
6634	rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
6635	rt2800_rfcsr_write(rt2x00dev, 47, 0x0C);
6636	rt2800_rfcsr_write(rt2x00dev, 53, 0x22);
6637	rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
6638
6639	rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
6640	msleep(1);
6641
6642	rt2800_adjust_freq_offset(rt2x00dev);
6643
6644	/* Enable DC filter */
6645	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
6646		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6647
6648	rt2800_normal_mode_setup_5xxx(rt2x00dev);
6649
6650	if (rt2x00_rt_rev_lt(rt2x00dev, RT5592, REV_RT5592C))
6651		rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
6652
6653	rt2800_led_open_drain_enable(rt2x00dev);
6654}
6655
6656static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
6657{
6658	if (rt2800_is_305x_soc(rt2x00dev)) {
6659		rt2800_init_rfcsr_305x_soc(rt2x00dev);
6660		return;
6661	}
6662
6663	switch (rt2x00dev->chip.rt) {
6664	case RT3070:
6665	case RT3071:
6666	case RT3090:
6667		rt2800_init_rfcsr_30xx(rt2x00dev);
6668		break;
6669	case RT3290:
6670		rt2800_init_rfcsr_3290(rt2x00dev);
6671		break;
6672	case RT3352:
6673		rt2800_init_rfcsr_3352(rt2x00dev);
6674		break;
6675	case RT3390:
6676		rt2800_init_rfcsr_3390(rt2x00dev);
6677		break;
6678	case RT3572:
6679		rt2800_init_rfcsr_3572(rt2x00dev);
6680		break;
6681	case RT3593:
6682		rt2800_init_rfcsr_3593(rt2x00dev);
6683		break;
6684	case RT5390:
6685		rt2800_init_rfcsr_5390(rt2x00dev);
6686		break;
6687	case RT5392:
6688		rt2800_init_rfcsr_5392(rt2x00dev);
6689		break;
6690	case RT5592:
6691		rt2800_init_rfcsr_5592(rt2x00dev);
6692		break;
6693	}
6694}
6695
6696int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev)
6697{
6698	u32 reg;
6699	u16 word;
6700
6701	/*
6702	 * Initialize MAC registers.
6703	 */
6704	if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) ||
6705		     rt2800_init_registers(rt2x00dev)))
6706		return -EIO;
6707
6708	/*
6709	 * Wait BBP/RF to wake up.
6710	 */
6711	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev)))
6712		return -EIO;
6713
6714	/*
6715	 * Send signal during boot time to initialize firmware.
6716	 */
6717	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
6718	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
6719	if (rt2x00_is_usb(rt2x00dev))
6720		rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
6721	rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
6722	msleep(1);
6723
6724	/*
6725	 * Make sure BBP is up and running.
6726	 */
6727	if (unlikely(rt2800_wait_bbp_ready(rt2x00dev)))
6728		return -EIO;
6729
6730	/*
6731	 * Initialize BBP/RF registers.
6732	 */
6733	rt2800_init_bbp(rt2x00dev);
6734	rt2800_init_rfcsr(rt2x00dev);
6735
6736	if (rt2x00_is_usb(rt2x00dev) &&
6737	    (rt2x00_rt(rt2x00dev, RT3070) ||
6738	     rt2x00_rt(rt2x00dev, RT3071) ||
6739	     rt2x00_rt(rt2x00dev, RT3572))) {
6740		udelay(200);
6741		rt2800_mcu_request(rt2x00dev, MCU_CURRENT, 0, 0, 0);
6742		udelay(10);
6743	}
6744
6745	/*
6746	 * Enable RX.
6747	 */
6748	rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
6749	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
6750	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
6751	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
6752
6753	udelay(50);
6754
6755	rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
6756	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
6757	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
6758	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 2);
6759	rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
6760	rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
6761
6762	rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
6763	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
6764	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
6765	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
6766
6767	/*
6768	 * Initialize LED control
6769	 */
6770	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_AG_CONF, &word);
6771	rt2800_mcu_request(rt2x00dev, MCU_LED_AG_CONF, 0xff,
6772			   word & 0xff, (word >> 8) & 0xff);
6773
6774	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_ACT_CONF, &word);
6775	rt2800_mcu_request(rt2x00dev, MCU_LED_ACT_CONF, 0xff,
6776			   word & 0xff, (word >> 8) & 0xff);
6777
6778	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_POLARITY, &word);
6779	rt2800_mcu_request(rt2x00dev, MCU_LED_LED_POLARITY, 0xff,
6780			   word & 0xff, (word >> 8) & 0xff);
6781
6782	return 0;
6783}
6784EXPORT_SYMBOL_GPL(rt2800_enable_radio);
6785
6786void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev)
6787{
6788	u32 reg;
6789
6790	rt2800_disable_wpdma(rt2x00dev);
6791
6792	/* Wait for DMA, ignore error */
6793	rt2800_wait_wpdma_ready(rt2x00dev);
6794
6795	rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
6796	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 0);
6797	rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
6798	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
6799}
6800EXPORT_SYMBOL_GPL(rt2800_disable_radio);
6801
6802int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev)
6803{
6804	u32 reg;
6805	u16 efuse_ctrl_reg;
6806
6807	if (rt2x00_rt(rt2x00dev, RT3290))
6808		efuse_ctrl_reg = EFUSE_CTRL_3290;
6809	else
6810		efuse_ctrl_reg = EFUSE_CTRL;
6811
6812	rt2800_register_read(rt2x00dev, efuse_ctrl_reg, &reg);
6813	return rt2x00_get_field32(reg, EFUSE_CTRL_PRESENT);
6814}
6815EXPORT_SYMBOL_GPL(rt2800_efuse_detect);
6816
6817static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
6818{
6819	u32 reg;
6820	u16 efuse_ctrl_reg;
6821	u16 efuse_data0_reg;
6822	u16 efuse_data1_reg;
6823	u16 efuse_data2_reg;
6824	u16 efuse_data3_reg;
6825
6826	if (rt2x00_rt(rt2x00dev, RT3290)) {
6827		efuse_ctrl_reg = EFUSE_CTRL_3290;
6828		efuse_data0_reg = EFUSE_DATA0_3290;
6829		efuse_data1_reg = EFUSE_DATA1_3290;
6830		efuse_data2_reg = EFUSE_DATA2_3290;
6831		efuse_data3_reg = EFUSE_DATA3_3290;
6832	} else {
6833		efuse_ctrl_reg = EFUSE_CTRL;
6834		efuse_data0_reg = EFUSE_DATA0;
6835		efuse_data1_reg = EFUSE_DATA1;
6836		efuse_data2_reg = EFUSE_DATA2;
6837		efuse_data3_reg = EFUSE_DATA3;
6838	}
6839	mutex_lock(&rt2x00dev->csr_mutex);
6840
6841	rt2800_register_read_lock(rt2x00dev, efuse_ctrl_reg, &reg);
6842	rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i);
6843	rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0);
6844	rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1);
6845	rt2800_register_write_lock(rt2x00dev, efuse_ctrl_reg, reg);
6846
6847	/* Wait until the EEPROM has been loaded */
6848	rt2800_regbusy_read(rt2x00dev, efuse_ctrl_reg, EFUSE_CTRL_KICK, &reg);
6849	/* Apparently the data is read from end to start */
6850	rt2800_register_read_lock(rt2x00dev, efuse_data3_reg, &reg);
6851	/* The returned value is in CPU order, but eeprom is le */
6852	*(u32 *)&rt2x00dev->eeprom[i] = cpu_to_le32(reg);
6853	rt2800_register_read_lock(rt2x00dev, efuse_data2_reg, &reg);
6854	*(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
6855	rt2800_register_read_lock(rt2x00dev, efuse_data1_reg, &reg);
6856	*(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
6857	rt2800_register_read_lock(rt2x00dev, efuse_data0_reg, &reg);
6858	*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
6859
6860	mutex_unlock(&rt2x00dev->csr_mutex);
6861}
6862
6863int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
6864{
6865	unsigned int i;
6866
6867	for (i = 0; i < EEPROM_SIZE / sizeof(u16); i += 8)
6868		rt2800_efuse_read(rt2x00dev, i);
6869
6870	return 0;
6871}
6872EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
6873
6874static u8 rt2800_get_txmixer_gain_24g(struct rt2x00_dev *rt2x00dev)
6875{
6876	u16 word;
6877
6878	if (rt2x00_rt(rt2x00dev, RT3593))
6879		return 0;
6880
6881	rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
6882	if ((word & 0x00ff) != 0x00ff)
6883		return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
6884
6885	return 0;
6886}
6887
6888static u8 rt2800_get_txmixer_gain_5g(struct rt2x00_dev *rt2x00dev)
6889{
6890	u16 word;
6891
6892	if (rt2x00_rt(rt2x00dev, RT3593))
6893		return 0;
6894
6895	rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
6896	if ((word & 0x00ff) != 0x00ff)
6897		return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
6898
6899	return 0;
6900}
6901
6902static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
6903{
6904	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
6905	u16 word;
6906	u8 *mac;
6907	u8 default_lna_gain;
6908	int retval;
6909
6910	/*
6911	 * Read the EEPROM.
6912	 */
6913	retval = rt2800_read_eeprom(rt2x00dev);
6914	if (retval)
6915		return retval;
6916
6917	/*
6918	 * Start validation of the data that has been read.
6919	 */
6920	mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
6921	if (!is_valid_ether_addr(mac)) {
6922		eth_random_addr(mac);
6923		rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
6924	}
6925
6926	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &word);
6927	if (word == 0xffff) {
6928		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
6929		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
6930		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
6931		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
6932		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
6933	} else if (rt2x00_rt(rt2x00dev, RT2860) ||
6934		   rt2x00_rt(rt2x00dev, RT2872)) {
6935		/*
6936		 * There is a max of 2 RX streams for RT28x0 series
6937		 */
6938		if (rt2x00_get_field16(word, EEPROM_NIC_CONF0_RXPATH) > 2)
6939			rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
6940		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
6941	}
6942
6943	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &word);
6944	if (word == 0xffff) {
6945		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_HW_RADIO, 0);
6946		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC, 0);
6947		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G, 0);
6948		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G, 0);
6949		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_CARDBUS_ACCEL, 0);
6950		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_2G, 0);
6951		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_5G, 0);
6952		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_WPS_PBC, 0);
6953		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_2G, 0);
6954		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_5G, 0);
6955		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BROADBAND_EXT_LNA, 0);
6956		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_ANT_DIVERSITY, 0);
6957		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_INTERNAL_TX_ALC, 0);
6958		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BT_COEXIST, 0);
6959		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_DAC_TEST, 0);
6960		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF1, word);
6961		rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
6962	}
6963
6964	rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);
6965	if ((word & 0x00ff) == 0x00ff) {
6966		rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);
6967		rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
6968		rt2x00_eeprom_dbg(rt2x00dev, "Freq: 0x%04x\n", word);
6969	}
6970	if ((word & 0xff00) == 0xff00) {
6971		rt2x00_set_field16(&word, EEPROM_FREQ_LED_MODE,
6972				   LED_MODE_TXRX_ACTIVITY);
6973		rt2x00_set_field16(&word, EEPROM_FREQ_LED_POLARITY, 0);
6974		rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
6975		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_AG_CONF, 0x5555);
6976		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_ACT_CONF, 0x2221);
6977		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_POLARITY, 0xa9f8);
6978		rt2x00_eeprom_dbg(rt2x00dev, "Led Mode: 0x%04x\n", word);
6979	}
6980
6981	/*
6982	 * During the LNA validation we are going to use
6983	 * lna0 as correct value. Note that EEPROM_LNA
6984	 * is never validated.
6985	 */
6986	rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &word);
6987	default_lna_gain = rt2x00_get_field16(word, EEPROM_LNA_A0);
6988
6989	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &word);
6990	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET0)) > 10)
6991		rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET0, 0);
6992	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET1)) > 10)
6993		rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
6994	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
6995
6996	drv_data->txmixer_gain_24g = rt2800_get_txmixer_gain_24g(rt2x00dev);
6997
6998	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
6999	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
7000		rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
7001	if (!rt2x00_rt(rt2x00dev, RT3593)) {
7002		if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
7003		    rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
7004			rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
7005					   default_lna_gain);
7006	}
7007	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
7008
7009	drv_data->txmixer_gain_5g = rt2800_get_txmixer_gain_5g(rt2x00dev);
7010
7011	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
7012	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
7013		rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);
7014	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET1)) > 10)
7015		rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET1, 0);
7016	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word);
7017
7018	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
7019	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
7020		rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
7021	if (!rt2x00_rt(rt2x00dev, RT3593)) {
7022		if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
7023		    rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
7024			rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
7025					   default_lna_gain);
7026	}
7027	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
7028
7029	if (rt2x00_rt(rt2x00dev, RT3593)) {
7030		rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &word);
7031		if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
7032		    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
7033			rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
7034					   default_lna_gain);
7035		if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0x00 ||
7036		    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0xff)
7037			rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
7038					   default_lna_gain);
7039		rt2800_eeprom_write(rt2x00dev, EEPROM_EXT_LNA2, word);
7040	}
7041
7042	return 0;
7043}
7044
7045static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
7046{
7047	u16 value;
7048	u16 eeprom;
7049	u16 rf;
7050
7051	/*
7052	 * Read EEPROM word for configuration.
7053	 */
7054	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
7055
7056	/*
7057	 * Identify RF chipset by EEPROM value
7058	 * RT28xx/RT30xx: defined in "EEPROM_NIC_CONF0_RF_TYPE" field
7059	 * RT53xx: defined in "EEPROM_CHIP_ID" field
7060	 */
7061	if (rt2x00_rt(rt2x00dev, RT3290) ||
7062	    rt2x00_rt(rt2x00dev, RT5390) ||
7063	    rt2x00_rt(rt2x00dev, RT5392))
7064		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
7065	else
7066		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
7067
7068	switch (rf) {
7069	case RF2820:
7070	case RF2850:
7071	case RF2720:
7072	case RF2750:
7073	case RF3020:
7074	case RF2020:
7075	case RF3021:
7076	case RF3022:
7077	case RF3052:
7078	case RF3053:
7079	case RF3070:
7080	case RF3290:
7081	case RF3320:
7082	case RF3322:
7083	case RF5360:
7084	case RF5362:
7085	case RF5370:
7086	case RF5372:
7087	case RF5390:
7088	case RF5392:
7089	case RF5592:
7090		break;
7091	default:
7092		rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n",
7093			   rf);
7094		return -ENODEV;
7095	}
7096
7097	rt2x00_set_rf(rt2x00dev, rf);
7098
7099	/*
7100	 * Identify default antenna configuration.
7101	 */
7102	rt2x00dev->default_ant.tx_chain_num =
7103	    rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH);
7104	rt2x00dev->default_ant.rx_chain_num =
7105	    rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH);
7106
7107	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
7108
7109	if (rt2x00_rt(rt2x00dev, RT3070) ||
7110	    rt2x00_rt(rt2x00dev, RT3090) ||
7111	    rt2x00_rt(rt2x00dev, RT3352) ||
7112	    rt2x00_rt(rt2x00dev, RT3390)) {
7113		value = rt2x00_get_field16(eeprom,
7114				EEPROM_NIC_CONF1_ANT_DIVERSITY);
7115		switch (value) {
7116		case 0:
7117		case 1:
7118		case 2:
7119			rt2x00dev->default_ant.tx = ANTENNA_A;
7120			rt2x00dev->default_ant.rx = ANTENNA_A;
7121			break;
7122		case 3:
7123			rt2x00dev->default_ant.tx = ANTENNA_A;
7124			rt2x00dev->default_ant.rx = ANTENNA_B;
7125			break;
7126		}
7127	} else {
7128		rt2x00dev->default_ant.tx = ANTENNA_A;
7129		rt2x00dev->default_ant.rx = ANTENNA_A;
7130	}
7131
7132	if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R)) {
7133		rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY; /* Unused */
7134		rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY; /* Unused */
7135	}
7136
7137	/*
7138	 * Determine external LNA informations.
7139	 */
7140	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G))
7141		__set_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags);
7142	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G))
7143		__set_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags);
7144
7145	/*
7146	 * Detect if this device has an hardware controlled radio.
7147	 */
7148	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_HW_RADIO))
7149		__set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags);
7150
7151	/*
7152	 * Detect if this device has Bluetooth co-existence.
7153	 */
7154	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
7155		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
7156
7157	/*
7158	 * Read frequency offset and RF programming sequence.
7159	 */
7160	rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
7161	rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET);
7162
7163	/*
7164	 * Store led settings, for correct led behaviour.
7165	 */
7166#ifdef CONFIG_RT2X00_LIB_LEDS
7167	rt2800_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO);
7168	rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
7169	rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
7170
7171	rt2x00dev->led_mcu_reg = eeprom;
7172#endif /* CONFIG_RT2X00_LIB_LEDS */
7173
7174	/*
7175	 * Check if support EIRP tx power limit feature.
7176	 */
7177	rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER, &eeprom);
7178
7179	if (rt2x00_get_field16(eeprom, EEPROM_EIRP_MAX_TX_POWER_2GHZ) <
7180					EIRP_MAX_TX_POWER_LIMIT)
7181		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
7182
7183	return 0;
7184}
7185
7186/*
7187 * RF value list for rt28xx
7188 * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
7189 */
7190static const struct rf_channel rf_vals[] = {
7191	{ 1,  0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
7192	{ 2,  0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
7193	{ 3,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
7194	{ 4,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
7195	{ 5,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
7196	{ 6,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
7197	{ 7,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
7198	{ 8,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
7199	{ 9,  0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
7200	{ 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
7201	{ 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
7202	{ 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
7203	{ 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
7204	{ 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
7205
7206	/* 802.11 UNI / HyperLan 2 */
7207	{ 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
7208	{ 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
7209	{ 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
7210	{ 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
7211	{ 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
7212	{ 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
7213	{ 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
7214	{ 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
7215	{ 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
7216	{ 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
7217	{ 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
7218	{ 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
7219
7220	/* 802.11 HyperLan 2 */
7221	{ 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
7222	{ 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
7223	{ 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 },
7224	{ 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 },
7225	{ 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
7226	{ 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
7227	{ 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
7228	{ 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
7229	{ 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
7230	{ 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
7231	{ 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
7232	{ 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
7233	{ 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
7234	{ 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
7235	{ 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
7236	{ 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
7237
7238	/* 802.11 UNII */
7239	{ 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
7240	{ 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
7241	{ 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
7242	{ 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
7243	{ 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
7244	{ 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
7245	{ 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
7246	{ 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f },
7247	{ 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 },
7248	{ 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 },
7249	{ 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f },
7250
7251	/* 802.11 Japan */
7252	{ 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
7253	{ 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
7254	{ 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
7255	{ 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
7256	{ 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
7257	{ 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
7258	{ 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
7259};
7260
7261/*
7262 * RF value list for rt3xxx
7263 * Supports: 2.4 GHz (all) & 5.2 GHz (RF3052 & RF3053)
7264 */
7265static const struct rf_channel rf_vals_3x[] = {
7266	{1,  241, 2, 2 },
7267	{2,  241, 2, 7 },
7268	{3,  242, 2, 2 },
7269	{4,  242, 2, 7 },
7270	{5,  243, 2, 2 },
7271	{6,  243, 2, 7 },
7272	{7,  244, 2, 2 },
7273	{8,  244, 2, 7 },
7274	{9,  245, 2, 2 },
7275	{10, 245, 2, 7 },
7276	{11, 246, 2, 2 },
7277	{12, 246, 2, 7 },
7278	{13, 247, 2, 2 },
7279	{14, 248, 2, 4 },
7280
7281	/* 802.11 UNI / HyperLan 2 */
7282	{36, 0x56, 0, 4},
7283	{38, 0x56, 0, 6},
7284	{40, 0x56, 0, 8},
7285	{44, 0x57, 0, 0},
7286	{46, 0x57, 0, 2},
7287	{48, 0x57, 0, 4},
7288	{52, 0x57, 0, 8},
7289	{54, 0x57, 0, 10},
7290	{56, 0x58, 0, 0},
7291	{60, 0x58, 0, 4},
7292	{62, 0x58, 0, 6},
7293	{64, 0x58, 0, 8},
7294
7295	/* 802.11 HyperLan 2 */
7296	{100, 0x5b, 0, 8},
7297	{102, 0x5b, 0, 10},
7298	{104, 0x5c, 0, 0},
7299	{108, 0x5c, 0, 4},
7300	{110, 0x5c, 0, 6},
7301	{112, 0x5c, 0, 8},
7302	{116, 0x5d, 0, 0},
7303	{118, 0x5d, 0, 2},
7304	{120, 0x5d, 0, 4},
7305	{124, 0x5d, 0, 8},
7306	{126, 0x5d, 0, 10},
7307	{128, 0x5e, 0, 0},
7308	{132, 0x5e, 0, 4},
7309	{134, 0x5e, 0, 6},
7310	{136, 0x5e, 0, 8},
7311	{140, 0x5f, 0, 0},
7312
7313	/* 802.11 UNII */
7314	{149, 0x5f, 0, 9},
7315	{151, 0x5f, 0, 11},
7316	{153, 0x60, 0, 1},
7317	{157, 0x60, 0, 5},
7318	{159, 0x60, 0, 7},
7319	{161, 0x60, 0, 9},
7320	{165, 0x61, 0, 1},
7321	{167, 0x61, 0, 3},
7322	{169, 0x61, 0, 5},
7323	{171, 0x61, 0, 7},
7324	{173, 0x61, 0, 9},
7325};
7326
7327static const struct rf_channel rf_vals_5592_xtal20[] = {
7328	/* Channel, N, K, mod, R */
7329	{1, 482, 4, 10, 3},
7330	{2, 483, 4, 10, 3},
7331	{3, 484, 4, 10, 3},
7332	{4, 485, 4, 10, 3},
7333	{5, 486, 4, 10, 3},
7334	{6, 487, 4, 10, 3},
7335	{7, 488, 4, 10, 3},
7336	{8, 489, 4, 10, 3},
7337	{9, 490, 4, 10, 3},
7338	{10, 491, 4, 10, 3},
7339	{11, 492, 4, 10, 3},
7340	{12, 493, 4, 10, 3},
7341	{13, 494, 4, 10, 3},
7342	{14, 496, 8, 10, 3},
7343	{36, 172, 8, 12, 1},
7344	{38, 173, 0, 12, 1},
7345	{40, 173, 4, 12, 1},
7346	{42, 173, 8, 12, 1},
7347	{44, 174, 0, 12, 1},
7348	{46, 174, 4, 12, 1},
7349	{48, 174, 8, 12, 1},
7350	{50, 175, 0, 12, 1},
7351	{52, 175, 4, 12, 1},
7352	{54, 175, 8, 12, 1},
7353	{56, 176, 0, 12, 1},
7354	{58, 176, 4, 12, 1},
7355	{60, 176, 8, 12, 1},
7356	{62, 177, 0, 12, 1},
7357	{64, 177, 4, 12, 1},
7358	{100, 183, 4, 12, 1},
7359	{102, 183, 8, 12, 1},
7360	{104, 184, 0, 12, 1},
7361	{106, 184, 4, 12, 1},
7362	{108, 184, 8, 12, 1},
7363	{110, 185, 0, 12, 1},
7364	{112, 185, 4, 12, 1},
7365	{114, 185, 8, 12, 1},
7366	{116, 186, 0, 12, 1},
7367	{118, 186, 4, 12, 1},
7368	{120, 186, 8, 12, 1},
7369	{122, 187, 0, 12, 1},
7370	{124, 187, 4, 12, 1},
7371	{126, 187, 8, 12, 1},
7372	{128, 188, 0, 12, 1},
7373	{130, 188, 4, 12, 1},
7374	{132, 188, 8, 12, 1},
7375	{134, 189, 0, 12, 1},
7376	{136, 189, 4, 12, 1},
7377	{138, 189, 8, 12, 1},
7378	{140, 190, 0, 12, 1},
7379	{149, 191, 6, 12, 1},
7380	{151, 191, 10, 12, 1},
7381	{153, 192, 2, 12, 1},
7382	{155, 192, 6, 12, 1},
7383	{157, 192, 10, 12, 1},
7384	{159, 193, 2, 12, 1},
7385	{161, 193, 6, 12, 1},
7386	{165, 194, 2, 12, 1},
7387	{184, 164, 0, 12, 1},
7388	{188, 164, 4, 12, 1},
7389	{192, 165, 8, 12, 1},
7390	{196, 166, 0, 12, 1},
7391};
7392
7393static const struct rf_channel rf_vals_5592_xtal40[] = {
7394	/* Channel, N, K, mod, R */
7395	{1, 241, 2, 10, 3},
7396	{2, 241, 7, 10, 3},
7397	{3, 242, 2, 10, 3},
7398	{4, 242, 7, 10, 3},
7399	{5, 243, 2, 10, 3},
7400	{6, 243, 7, 10, 3},
7401	{7, 244, 2, 10, 3},
7402	{8, 244, 7, 10, 3},
7403	{9, 245, 2, 10, 3},
7404	{10, 245, 7, 10, 3},
7405	{11, 246, 2, 10, 3},
7406	{12, 246, 7, 10, 3},
7407	{13, 247, 2, 10, 3},
7408	{14, 248, 4, 10, 3},
7409	{36, 86, 4, 12, 1},
7410	{38, 86, 6, 12, 1},
7411	{40, 86, 8, 12, 1},
7412	{42, 86, 10, 12, 1},
7413	{44, 87, 0, 12, 1},
7414	{46, 87, 2, 12, 1},
7415	{48, 87, 4, 12, 1},
7416	{50, 87, 6, 12, 1},
7417	{52, 87, 8, 12, 1},
7418	{54, 87, 10, 12, 1},
7419	{56, 88, 0, 12, 1},
7420	{58, 88, 2, 12, 1},
7421	{60, 88, 4, 12, 1},
7422	{62, 88, 6, 12, 1},
7423	{64, 88, 8, 12, 1},
7424	{100, 91, 8, 12, 1},
7425	{102, 91, 10, 12, 1},
7426	{104, 92, 0, 12, 1},
7427	{106, 92, 2, 12, 1},
7428	{108, 92, 4, 12, 1},
7429	{110, 92, 6, 12, 1},
7430	{112, 92, 8, 12, 1},
7431	{114, 92, 10, 12, 1},
7432	{116, 93, 0, 12, 1},
7433	{118, 93, 2, 12, 1},
7434	{120, 93, 4, 12, 1},
7435	{122, 93, 6, 12, 1},
7436	{124, 93, 8, 12, 1},
7437	{126, 93, 10, 12, 1},
7438	{128, 94, 0, 12, 1},
7439	{130, 94, 2, 12, 1},
7440	{132, 94, 4, 12, 1},
7441	{134, 94, 6, 12, 1},
7442	{136, 94, 8, 12, 1},
7443	{138, 94, 10, 12, 1},
7444	{140, 95, 0, 12, 1},
7445	{149, 95, 9, 12, 1},
7446	{151, 95, 11, 12, 1},
7447	{153, 96, 1, 12, 1},
7448	{155, 96, 3, 12, 1},
7449	{157, 96, 5, 12, 1},
7450	{159, 96, 7, 12, 1},
7451	{161, 96, 9, 12, 1},
7452	{165, 97, 1, 12, 1},
7453	{184, 82, 0, 12, 1},
7454	{188, 82, 4, 12, 1},
7455	{192, 82, 8, 12, 1},
7456	{196, 83, 0, 12, 1},
7457};
7458
7459static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
7460{
7461	struct hw_mode_spec *spec = &rt2x00dev->spec;
7462	struct channel_info *info;
7463	char *default_power1;
7464	char *default_power2;
7465	char *default_power3;
7466	unsigned int i;
7467	u32 reg;
7468
7469	/*
7470	 * Disable powersaving as default.
7471	 */
7472	rt2x00dev->hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
7473
7474	/*
7475	 * Initialize all hw fields.
7476	 */
7477	ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_HT_CCK_RATES);
7478	ieee80211_hw_set(rt2x00dev->hw, REPORTS_TX_ACK_STATUS);
7479	ieee80211_hw_set(rt2x00dev->hw, AMPDU_AGGREGATION);
7480	ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK);
7481	ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM);
7482	ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS);
7483
7484	/*
7485	 * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
7486	 * unless we are capable of sending the buffered frames out after the
7487	 * DTIM transmission using rt2x00lib_beacondone. This will send out
7488	 * multicast and broadcast traffic immediately instead of buffering it
7489	 * infinitly and thus dropping it after some time.
7490	 */
7491	if (!rt2x00_is_usb(rt2x00dev))
7492		ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING);
7493
7494	SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
7495	SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
7496				rt2800_eeprom_addr(rt2x00dev,
7497						   EEPROM_MAC_ADDR_0));
7498
7499	/*
7500	 * As rt2800 has a global fallback table we cannot specify
7501	 * more then one tx rate per frame but since the hw will
7502	 * try several rates (based on the fallback table) we should
7503	 * initialize max_report_rates to the maximum number of rates
7504	 * we are going to try. Otherwise mac80211 will truncate our
7505	 * reported tx rates and the rc algortihm will end up with
7506	 * incorrect data.
7507	 */
7508	rt2x00dev->hw->max_rates = 1;
7509	rt2x00dev->hw->max_report_rates = 7;
7510	rt2x00dev->hw->max_rate_tries = 1;
7511
7512	/*
7513	 * Initialize hw_mode information.
7514	 */
7515	spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
7516
7517	switch (rt2x00dev->chip.rf) {
7518	case RF2720:
7519	case RF2820:
7520		spec->num_channels = 14;
7521		spec->channels = rf_vals;
7522		break;
7523
7524	case RF2750:
7525	case RF2850:
7526		spec->num_channels = ARRAY_SIZE(rf_vals);
7527		spec->channels = rf_vals;
7528		break;
7529
7530	case RF2020:
7531	case RF3020:
7532	case RF3021:
7533	case RF3022:
7534	case RF3070:
7535	case RF3290:
7536	case RF3320:
7537	case RF3322:
7538	case RF5360:
7539	case RF5362:
7540	case RF5370:
7541	case RF5372:
7542	case RF5390:
7543	case RF5392:
7544		spec->num_channels = 14;
7545		spec->channels = rf_vals_3x;
7546		break;
7547
7548	case RF3052:
7549	case RF3053:
7550		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
7551		spec->channels = rf_vals_3x;
7552		break;
7553
7554	case RF5592:
7555		rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, &reg);
7556		if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
7557			spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal40);
7558			spec->channels = rf_vals_5592_xtal40;
7559		} else {
7560			spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal20);
7561			spec->channels = rf_vals_5592_xtal20;
7562		}
7563		break;
7564	}
7565
7566	if (WARN_ON_ONCE(!spec->channels))
7567		return -ENODEV;
7568
7569	spec->supported_bands = SUPPORT_BAND_2GHZ;
7570	if (spec->num_channels > 14)
7571		spec->supported_bands |= SUPPORT_BAND_5GHZ;
7572
7573	/*
7574	 * Initialize HT information.
7575	 */
7576	if (!rt2x00_rf(rt2x00dev, RF2020))
7577		spec->ht.ht_supported = true;
7578	else
7579		spec->ht.ht_supported = false;
7580
7581	spec->ht.cap =
7582	    IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
7583	    IEEE80211_HT_CAP_GRN_FLD |
7584	    IEEE80211_HT_CAP_SGI_20 |
7585	    IEEE80211_HT_CAP_SGI_40;
7586
7587	if (rt2x00dev->default_ant.tx_chain_num >= 2)
7588		spec->ht.cap |= IEEE80211_HT_CAP_TX_STBC;
7589
7590	spec->ht.cap |= rt2x00dev->default_ant.rx_chain_num <<
7591			IEEE80211_HT_CAP_RX_STBC_SHIFT;
7592
7593	spec->ht.ampdu_factor = 3;
7594	spec->ht.ampdu_density = 4;
7595	spec->ht.mcs.tx_params =
7596	    IEEE80211_HT_MCS_TX_DEFINED |
7597	    IEEE80211_HT_MCS_TX_RX_DIFF |
7598	    ((rt2x00dev->default_ant.tx_chain_num - 1) <<
7599	     IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
7600
7601	switch (rt2x00dev->default_ant.rx_chain_num) {
7602	case 3:
7603		spec->ht.mcs.rx_mask[2] = 0xff;
7604	case 2:
7605		spec->ht.mcs.rx_mask[1] = 0xff;
7606	case 1:
7607		spec->ht.mcs.rx_mask[0] = 0xff;
7608		spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
7609		break;
7610	}
7611
7612	/*
7613	 * Create channel information array
7614	 */
7615	info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
7616	if (!info)
7617		return -ENOMEM;
7618
7619	spec->channels_info = info;
7620
7621	default_power1 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
7622	default_power2 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
7623
7624	if (rt2x00dev->default_ant.tx_chain_num > 2)
7625		default_power3 = rt2800_eeprom_addr(rt2x00dev,
7626						    EEPROM_EXT_TXPOWER_BG3);
7627	else
7628		default_power3 = NULL;
7629
7630	for (i = 0; i < 14; i++) {
7631		info[i].default_power1 = default_power1[i];
7632		info[i].default_power2 = default_power2[i];
7633		if (default_power3)
7634			info[i].default_power3 = default_power3[i];
7635	}
7636
7637	if (spec->num_channels > 14) {
7638		default_power1 = rt2800_eeprom_addr(rt2x00dev,
7639						    EEPROM_TXPOWER_A1);
7640		default_power2 = rt2800_eeprom_addr(rt2x00dev,
7641						    EEPROM_TXPOWER_A2);
7642
7643		if (rt2x00dev->default_ant.tx_chain_num > 2)
7644			default_power3 =
7645				rt2800_eeprom_addr(rt2x00dev,
7646						   EEPROM_EXT_TXPOWER_A3);
7647		else
7648			default_power3 = NULL;
7649
7650		for (i = 14; i < spec->num_channels; i++) {
7651			info[i].default_power1 = default_power1[i - 14];
7652			info[i].default_power2 = default_power2[i - 14];
7653			if (default_power3)
7654				info[i].default_power3 = default_power3[i - 14];
7655		}
7656	}
7657
7658	switch (rt2x00dev->chip.rf) {
7659	case RF2020:
7660	case RF3020:
7661	case RF3021:
7662	case RF3022:
7663	case RF3320:
7664	case RF3052:
7665	case RF3053:
7666	case RF3070:
7667	case RF3290:
7668	case RF5360:
7669	case RF5362:
7670	case RF5370:
7671	case RF5372:
7672	case RF5390:
7673	case RF5392:
7674		__set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
7675		break;
7676	}
7677
7678	return 0;
7679}
7680
7681static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
7682{
7683	u32 reg;
7684	u32 rt;
7685	u32 rev;
7686
7687	if (rt2x00_rt(rt2x00dev, RT3290))
7688		rt2800_register_read(rt2x00dev, MAC_CSR0_3290, &reg);
7689	else
7690		rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
7691
7692	rt = rt2x00_get_field32(reg, MAC_CSR0_CHIPSET);
7693	rev = rt2x00_get_field32(reg, MAC_CSR0_REVISION);
7694
7695	switch (rt) {
7696	case RT2860:
7697	case RT2872:
7698	case RT2883:
7699	case RT3070:
7700	case RT3071:
7701	case RT3090:
7702	case RT3290:
7703	case RT3352:
7704	case RT3390:
7705	case RT3572:
7706	case RT3593:
7707	case RT5390:
7708	case RT5392:
7709	case RT5592:
7710		break;
7711	default:
7712		rt2x00_err(rt2x00dev, "Invalid RT chipset 0x%04x, rev %04x detected\n",
7713			   rt, rev);
7714		return -ENODEV;
7715	}
7716
7717	rt2x00_set_rt(rt2x00dev, rt, rev);
7718
7719	return 0;
7720}
7721
7722int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
7723{
7724	int retval;
7725	u32 reg;
7726
7727	retval = rt2800_probe_rt(rt2x00dev);
7728	if (retval)
7729		return retval;
7730
7731	/*
7732	 * Allocate eeprom data.
7733	 */
7734	retval = rt2800_validate_eeprom(rt2x00dev);
7735	if (retval)
7736		return retval;
7737
7738	retval = rt2800_init_eeprom(rt2x00dev);
7739	if (retval)
7740		return retval;
7741
7742	/*
7743	 * Enable rfkill polling by setting GPIO direction of the
7744	 * rfkill switch GPIO pin correctly.
7745	 */
7746	rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
7747	rt2x00_set_field32(&reg, GPIO_CTRL_DIR2, 1);
7748	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
7749
7750	/*
7751	 * Initialize hw specifications.
7752	 */
7753	retval = rt2800_probe_hw_mode(rt2x00dev);
7754	if (retval)
7755		return retval;
7756
7757	/*
7758	 * Set device capabilities.
7759	 */
7760	__set_bit(CAPABILITY_CONTROL_FILTERS, &rt2x00dev->cap_flags);
7761	__set_bit(CAPABILITY_CONTROL_FILTER_PSPOLL, &rt2x00dev->cap_flags);
7762	if (!rt2x00_is_usb(rt2x00dev))
7763		__set_bit(CAPABILITY_PRE_TBTT_INTERRUPT, &rt2x00dev->cap_flags);
7764
7765	/*
7766	 * Set device requirements.
7767	 */
7768	if (!rt2x00_is_soc(rt2x00dev))
7769		__set_bit(REQUIRE_FIRMWARE, &rt2x00dev->cap_flags);
7770	__set_bit(REQUIRE_L2PAD, &rt2x00dev->cap_flags);
7771	__set_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags);
7772	if (!rt2800_hwcrypt_disabled(rt2x00dev))
7773		__set_bit(CAPABILITY_HW_CRYPTO, &rt2x00dev->cap_flags);
7774	__set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags);
7775	__set_bit(REQUIRE_HT_TX_DESC, &rt2x00dev->cap_flags);
7776	if (rt2x00_is_usb(rt2x00dev))
7777		__set_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags);
7778	else {
7779		__set_bit(REQUIRE_DMA, &rt2x00dev->cap_flags);
7780		__set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);
7781	}
7782
7783	/*
7784	 * Set the rssi offset.
7785	 */
7786	rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;
7787
7788	return 0;
7789}
7790EXPORT_SYMBOL_GPL(rt2800_probe_hw);
7791
7792/*
7793 * IEEE80211 stack callback functions.
7794 */
7795void rt2800_get_key_seq(struct ieee80211_hw *hw,
7796			struct ieee80211_key_conf *key,
7797			struct ieee80211_key_seq *seq)
7798{
7799	struct rt2x00_dev *rt2x00dev = hw->priv;
7800	struct mac_iveiv_entry iveiv_entry;
7801	u32 offset;
7802
7803	if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
7804		return;
7805
7806	offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
7807	rt2800_register_multiread(rt2x00dev, offset,
7808				      &iveiv_entry, sizeof(iveiv_entry));
7809
7810	memcpy(&seq->tkip.iv16, &iveiv_entry.iv[0], 2);
7811	memcpy(&seq->tkip.iv32, &iveiv_entry.iv[4], 4);
7812}
7813EXPORT_SYMBOL_GPL(rt2800_get_key_seq);
7814
7815int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7816{
7817	struct rt2x00_dev *rt2x00dev = hw->priv;
7818	u32 reg;
7819	bool enabled = (value < IEEE80211_MAX_RTS_THRESHOLD);
7820
7821	rt2800_register_read(rt2x00dev, TX_RTS_CFG, &reg);
7822	rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES, value);
7823	rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg);
7824
7825	rt2800_register_read(rt2x00dev, CCK_PROT_CFG, &reg);
7826	rt2x00_set_field32(&reg, CCK_PROT_CFG_RTS_TH_EN, enabled);
7827	rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg);
7828
7829	rt2800_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
7830	rt2x00_set_field32(&reg, OFDM_PROT_CFG_RTS_TH_EN, enabled);
7831	rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
7832
7833	rt2800_register_read(rt2x00dev, MM20_PROT_CFG, &reg);
7834	rt2x00_set_field32(&reg, MM20_PROT_CFG_RTS_TH_EN, enabled);
7835	rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
7836
7837	rt2800_register_read(rt2x00dev, MM40_PROT_CFG, &reg);
7838	rt2x00_set_field32(&reg, MM40_PROT_CFG_RTS_TH_EN, enabled);
7839	rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
7840
7841	rt2800_register_read(rt2x00dev, GF20_PROT_CFG, &reg);
7842	rt2x00_set_field32(&reg, GF20_PROT_CFG_RTS_TH_EN, enabled);
7843	rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
7844
7845	rt2800_register_read(rt2x00dev, GF40_PROT_CFG, &reg);
7846	rt2x00_set_field32(&reg, GF40_PROT_CFG_RTS_TH_EN, enabled);
7847	rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
7848
7849	return 0;
7850}
7851EXPORT_SYMBOL_GPL(rt2800_set_rts_threshold);
7852
7853int rt2800_conf_tx(struct ieee80211_hw *hw,
7854		   struct ieee80211_vif *vif, u16 queue_idx,
7855		   const struct ieee80211_tx_queue_params *params)
7856{
7857	struct rt2x00_dev *rt2x00dev = hw->priv;
7858	struct data_queue *queue;
7859	struct rt2x00_field32 field;
7860	int retval;
7861	u32 reg;
7862	u32 offset;
7863
7864	/*
7865	 * First pass the configuration through rt2x00lib, that will
7866	 * update the queue settings and validate the input. After that
7867	 * we are free to update the registers based on the value
7868	 * in the queue parameter.
7869	 */
7870	retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
7871	if (retval)
7872		return retval;
7873
7874	/*
7875	 * We only need to perform additional register initialization
7876	 * for WMM queues/
7877	 */
7878	if (queue_idx >= 4)
7879		return 0;
7880
7881	queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
7882
7883	/* Update WMM TXOP register */
7884	offset = WMM_TXOP0_CFG + (sizeof(u32) * (!!(queue_idx & 2)));
7885	field.bit_offset = (queue_idx & 1) * 16;
7886	field.bit_mask = 0xffff << field.bit_offset;
7887
7888	rt2800_register_read(rt2x00dev, offset, &reg);
7889	rt2x00_set_field32(&reg, field, queue->txop);
7890	rt2800_register_write(rt2x00dev, offset, reg);
7891
7892	/* Update WMM registers */
7893	field.bit_offset = queue_idx * 4;
7894	field.bit_mask = 0xf << field.bit_offset;
7895
7896	rt2800_register_read(rt2x00dev, WMM_AIFSN_CFG, &reg);
7897	rt2x00_set_field32(&reg, field, queue->aifs);
7898	rt2800_register_write(rt2x00dev, WMM_AIFSN_CFG, reg);
7899
7900	rt2800_register_read(rt2x00dev, WMM_CWMIN_CFG, &reg);
7901	rt2x00_set_field32(&reg, field, queue->cw_min);
7902	rt2800_register_write(rt2x00dev, WMM_CWMIN_CFG, reg);
7903
7904	rt2800_register_read(rt2x00dev, WMM_CWMAX_CFG, &reg);
7905	rt2x00_set_field32(&reg, field, queue->cw_max);
7906	rt2800_register_write(rt2x00dev, WMM_CWMAX_CFG, reg);
7907
7908	/* Update EDCA registers */
7909	offset = EDCA_AC0_CFG + (sizeof(u32) * queue_idx);
7910
7911	rt2800_register_read(rt2x00dev, offset, &reg);
7912	rt2x00_set_field32(&reg, EDCA_AC0_CFG_TX_OP, queue->txop);
7913	rt2x00_set_field32(&reg, EDCA_AC0_CFG_AIFSN, queue->aifs);
7914	rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMIN, queue->cw_min);
7915	rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMAX, queue->cw_max);
7916	rt2800_register_write(rt2x00dev, offset, reg);
7917
7918	return 0;
7919}
7920EXPORT_SYMBOL_GPL(rt2800_conf_tx);
7921
7922u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
7923{
7924	struct rt2x00_dev *rt2x00dev = hw->priv;
7925	u64 tsf;
7926	u32 reg;
7927
7928	rt2800_register_read(rt2x00dev, TSF_TIMER_DW1, &reg);
7929	tsf = (u64) rt2x00_get_field32(reg, TSF_TIMER_DW1_HIGH_WORD) << 32;
7930	rt2800_register_read(rt2x00dev, TSF_TIMER_DW0, &reg);
7931	tsf |= rt2x00_get_field32(reg, TSF_TIMER_DW0_LOW_WORD);
7932
7933	return tsf;
7934}
7935EXPORT_SYMBOL_GPL(rt2800_get_tsf);
7936
7937int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7938			enum ieee80211_ampdu_mlme_action action,
7939			struct ieee80211_sta *sta, u16 tid, u16 *ssn,
7940			u8 buf_size, bool amsdu)
7941{
7942	struct rt2x00_sta *sta_priv = (struct rt2x00_sta *)sta->drv_priv;
7943	int ret = 0;
7944
7945	/*
7946	 * Don't allow aggregation for stations the hardware isn't aware
7947	 * of because tx status reports for frames to an unknown station
7948	 * always contain wcid=WCID_END+1 and thus we can't distinguish
7949	 * between multiple stations which leads to unwanted situations
7950	 * when the hw reorders frames due to aggregation.
7951	 */
7952	if (sta_priv->wcid > WCID_END)
7953		return 1;
7954
7955	switch (action) {
7956	case IEEE80211_AMPDU_RX_START:
7957	case IEEE80211_AMPDU_RX_STOP:
7958		/*
7959		 * The hw itself takes care of setting up BlockAck mechanisms.
7960		 * So, we only have to allow mac80211 to nagotiate a BlockAck
7961		 * agreement. Once that is done, the hw will BlockAck incoming
7962		 * AMPDUs without further setup.
7963		 */
7964		break;
7965	case IEEE80211_AMPDU_TX_START:
7966		ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
7967		break;
7968	case IEEE80211_AMPDU_TX_STOP_CONT:
7969	case IEEE80211_AMPDU_TX_STOP_FLUSH:
7970	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7971		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
7972		break;
7973	case IEEE80211_AMPDU_TX_OPERATIONAL:
7974		break;
7975	default:
7976		rt2x00_warn((struct rt2x00_dev *)hw->priv,
7977			    "Unknown AMPDU action\n");
7978	}
7979
7980	return ret;
7981}
7982EXPORT_SYMBOL_GPL(rt2800_ampdu_action);
7983
7984int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
7985		      struct survey_info *survey)
7986{
7987	struct rt2x00_dev *rt2x00dev = hw->priv;
7988	struct ieee80211_conf *conf = &hw->conf;
7989	u32 idle, busy, busy_ext;
7990
7991	if (idx != 0)
7992		return -ENOENT;
7993
7994	survey->channel = conf->chandef.chan;
7995
7996	rt2800_register_read(rt2x00dev, CH_IDLE_STA, &idle);
7997	rt2800_register_read(rt2x00dev, CH_BUSY_STA, &busy);
7998	rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC, &busy_ext);
7999
8000	if (idle || busy) {
8001		survey->filled = SURVEY_INFO_TIME |
8002				 SURVEY_INFO_TIME_BUSY |
8003				 SURVEY_INFO_TIME_EXT_BUSY;
8004
8005		survey->time = (idle + busy) / 1000;
8006		survey->time_busy = busy / 1000;
8007		survey->time_ext_busy = busy_ext / 1000;
8008	}
8009
8010	if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
8011		survey->filled |= SURVEY_INFO_IN_USE;
8012
8013	return 0;
8014
8015}
8016EXPORT_SYMBOL_GPL(rt2800_get_survey);
8017
8018MODULE_AUTHOR(DRV_PROJECT ", Bartlomiej Zolnierkiewicz");
8019MODULE_VERSION(DRV_VERSION);
8020MODULE_DESCRIPTION("Ralink RT2800 library");
8021MODULE_LICENSE("GPL");
8022