rt2500usb.c 61.1 KB
Newer Older
1
/*
2
	Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
3 4 5 6 7 8 9 10 11 12 13 14 15
	<http://rt2x00.serialmonkey.com>

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
16
	along with this program; if not, see <http://www.gnu.org/licenses/>.
17 18 19 20 21 22 23 24 25 26 27 28
 */

/*
	Module: rt2500usb
	Abstract: rt2500usb device specific routines.
	Supported chipsets: RT2570.
 */

#include <linux/delay.h>
#include <linux/etherdevice.h>
#include <linux/kernel.h>
#include <linux/module.h>
29
#include <linux/slab.h>
30 31 32 33 34 35
#include <linux/usb.h>

#include "rt2x00.h"
#include "rt2x00usb.h"
#include "rt2500usb.h"

36 37 38
/*
 * Allow hardware encryption to be disabled.
 */
39
static bool modparam_nohwcrypt;
40 41 42
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");

43 44 45 46 47 48 49
/*
 * Register access.
 * All access to the CSR registers will go through the methods
 * rt2500usb_register_read and rt2500usb_register_write.
 * BBP and RF register require indirect register access,
 * and use the CSR registers BBPCSR and RFCSR to achieve this.
 * These indirect registers work with busy bits,
50
 * and we will try maximal REGISTER_USB_BUSY_COUNT times to access
51 52 53 54
 * the register while taking a REGISTER_BUSY_DELAY us delay
 * between each attampt. When the busy bit is still set at that time,
 * the access attempt is considered to have failed,
 * and we will print an error.
55
 * If the csr_mutex is already held then the _lock variants must
56
 * be used instead.
57
 */
58 59
static u16 rt2500usb_register_read(struct rt2x00_dev *rt2x00dev,
				   const unsigned int offset)
60 61 62 63
{
	__le16 reg;
	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ,
				      USB_VENDOR_REQUEST_IN, offset,
64
				      &reg, sizeof(reg));
65
	return le16_to_cpu(reg);
66 67
}

68 69
static u16 rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev,
					const unsigned int offset)
70 71 72 73
{
	__le16 reg;
	rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_READ,
				       USB_VENDOR_REQUEST_IN, offset,
74
				       &reg, sizeof(reg), REGISTER_TIMEOUT);
75
	return le16_to_cpu(reg);
76 77
}

78
static void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev,
79 80 81 82 83 84
					    const unsigned int offset,
					    u16 value)
{
	__le16 reg = cpu_to_le16(value);
	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE,
				      USB_VENDOR_REQUEST_OUT, offset,
85
				      &reg, sizeof(reg));
86 87
}

88
static void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev,
89 90 91 92 93 94
						 const unsigned int offset,
						 u16 value)
{
	__le16 reg = cpu_to_le16(value);
	rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_WRITE,
				       USB_VENDOR_REQUEST_OUT, offset,
95
				       &reg, sizeof(reg), REGISTER_TIMEOUT);
96 97
}

98
static void rt2500usb_register_multiwrite(struct rt2x00_dev *rt2x00dev,
99 100 101 102 103
						 const unsigned int offset,
						 void *value, const u16 length)
{
	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE,
				      USB_VENDOR_REQUEST_OUT, offset,
104
				      value, length);
105 106
}

107 108 109 110
static int rt2500usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
				  const unsigned int offset,
				  struct rt2x00_field16 field,
				  u16 *reg)
111 112 113
{
	unsigned int i;

114
	for (i = 0; i < REGISTER_USB_BUSY_COUNT; i++) {
115
		*reg = rt2500usb_register_read_lock(rt2x00dev, offset);
116 117
		if (!rt2x00_get_field16(*reg, field))
			return 1;
118 119 120
		udelay(REGISTER_BUSY_DELAY);
	}

121 122
	rt2x00_err(rt2x00dev, "Indirect register access failed: offset=0x%.08x, value=0x%.08x\n",
		   offset, *reg);
123 124 125
	*reg = ~0;

	return 0;
126 127
}

128 129 130 131 132
#define WAIT_FOR_BBP(__dev, __reg) \
	rt2500usb_regbusy_read((__dev), PHY_CSR8, PHY_CSR8_BUSY, (__reg))
#define WAIT_FOR_RF(__dev, __reg) \
	rt2500usb_regbusy_read((__dev), PHY_CSR10, PHY_CSR10_RF_BUSY, (__reg))

A
Adam Baker 已提交
133
static void rt2500usb_bbp_write(struct rt2x00_dev *rt2x00dev,
134 135 136 137
				const unsigned int word, const u8 value)
{
	u16 reg;

138
	mutex_lock(&rt2x00dev->csr_mutex);
139

140
	/*
141 142
	 * Wait until the BBP becomes available, afterwards we
	 * can safely write the new data into the register.
143
	 */
144 145 146 147 148
	if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
		reg = 0;
		rt2x00_set_field16(&reg, PHY_CSR7_DATA, value);
		rt2x00_set_field16(&reg, PHY_CSR7_REG_ID, word);
		rt2x00_set_field16(&reg, PHY_CSR7_READ_CONTROL, 0);
149

150 151
		rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg);
	}
152

153
	mutex_unlock(&rt2x00dev->csr_mutex);
154 155
}

A
Adam Baker 已提交
156
static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev,
157 158 159 160
			       const unsigned int word, u8 *value)
{
	u16 reg;

161
	mutex_lock(&rt2x00dev->csr_mutex);
162

163
	/*
164 165 166 167 168 169
	 * Wait until the BBP becomes available, afterwards we
	 * can safely write the read request into the register.
	 * After the data has been written, we wait until hardware
	 * returns the correct value, if at any time the register
	 * doesn't become available in time, reg will be 0xffffffff
	 * which means we return 0xff to the caller.
170
	 */
171 172 173 174
	if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
		reg = 0;
		rt2x00_set_field16(&reg, PHY_CSR7_REG_ID, word);
		rt2x00_set_field16(&reg, PHY_CSR7_READ_CONTROL, 1);
175

176
		rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg);
177

178
		if (WAIT_FOR_BBP(rt2x00dev, &reg))
179
			reg = rt2500usb_register_read_lock(rt2x00dev, PHY_CSR7);
180
	}
181 182

	*value = rt2x00_get_field16(reg, PHY_CSR7_DATA);
183

184
	mutex_unlock(&rt2x00dev->csr_mutex);
185 186
}

A
Adam Baker 已提交
187
static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev,
188 189 190 191
			       const unsigned int word, const u32 value)
{
	u16 reg;

192
	mutex_lock(&rt2x00dev->csr_mutex);
193

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
	/*
	 * Wait until the RF becomes available, afterwards we
	 * can safely write the new data into the register.
	 */
	if (WAIT_FOR_RF(rt2x00dev, &reg)) {
		reg = 0;
		rt2x00_set_field16(&reg, PHY_CSR9_RF_VALUE, value);
		rt2500usb_register_write_lock(rt2x00dev, PHY_CSR9, reg);

		reg = 0;
		rt2x00_set_field16(&reg, PHY_CSR10_RF_VALUE, value >> 16);
		rt2x00_set_field16(&reg, PHY_CSR10_RF_NUMBER_OF_BITS, 20);
		rt2x00_set_field16(&reg, PHY_CSR10_RF_IF_SELECT, 0);
		rt2x00_set_field16(&reg, PHY_CSR10_RF_BUSY, 1);

		rt2500usb_register_write_lock(rt2x00dev, PHY_CSR10, reg);
		rt2x00_rf_write(rt2x00dev, word, value);
211 212
	}

213
	mutex_unlock(&rt2x00dev->csr_mutex);
214 215 216
}

#ifdef CONFIG_RT2X00_LIB_DEBUGFS
217 218
static u32 _rt2500usb_register_read(struct rt2x00_dev *rt2x00dev,
				     const unsigned int offset)
219
{
220
	return rt2500usb_register_read(rt2x00dev, offset);
221 222
}

223 224 225
static void _rt2500usb_register_write(struct rt2x00_dev *rt2x00dev,
				      const unsigned int offset,
				      u32 value)
226
{
227
	rt2500usb_register_write(rt2x00dev, offset, value);
228 229
}

230 231 232 233 234 235 236 237 238 239
static u8 _rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev,
			      const unsigned int word)
{
	u8 value;

	rt2500usb_bbp_read(rt2x00dev, word, &value);

	return value;
}

240 241 242
static const struct rt2x00debug rt2500usb_rt2x00debug = {
	.owner	= THIS_MODULE,
	.csr	= {
243 244 245 246
		.read		= _rt2500usb_register_read,
		.write		= _rt2500usb_register_write,
		.flags		= RT2X00DEBUGFS_OFFSET,
		.word_base	= CSR_REG_BASE,
247 248 249 250
		.word_size	= sizeof(u16),
		.word_count	= CSR_REG_SIZE / sizeof(u16),
	},
	.eeprom	= {
251
		.read		= _rt2x00_eeprom_read,
252
		.write		= rt2x00_eeprom_write,
253
		.word_base	= EEPROM_BASE,
254 255 256 257
		.word_size	= sizeof(u16),
		.word_count	= EEPROM_SIZE / sizeof(u16),
	},
	.bbp	= {
258
		.read		= _rt2500usb_bbp_read,
259
		.write		= rt2500usb_bbp_write,
260
		.word_base	= BBP_BASE,
261 262 263 264
		.word_size	= sizeof(u8),
		.word_count	= BBP_SIZE / sizeof(u8),
	},
	.rf	= {
265
		.read		= rt2x00_rf_read,
266
		.write		= rt2500usb_rf_write,
267
		.word_base	= RF_BASE,
268 269 270 271 272 273
		.word_size	= sizeof(u32),
		.word_count	= RF_SIZE / sizeof(u32),
	},
};
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */

274 275 276 277
static int rt2500usb_rfkill_poll(struct rt2x00_dev *rt2x00dev)
{
	u16 reg;

278
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR19);
279
	return rt2x00_get_field16(reg, MAC_CSR19_VAL7);
280 281
}

282
#ifdef CONFIG_RT2X00_LIB_LEDS
283
static void rt2500usb_brightness_set(struct led_classdev *led_cdev,
284 285 286 287 288
				     enum led_brightness brightness)
{
	struct rt2x00_led *led =
	    container_of(led_cdev, struct rt2x00_led, led_dev);
	unsigned int enabled = brightness != LED_OFF;
289
	u16 reg;
290

291
	reg = rt2500usb_register_read(led->rt2x00dev, MAC_CSR20);
292

293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
	if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
		rt2x00_set_field16(&reg, MAC_CSR20_LINK, enabled);
	else if (led->type == LED_TYPE_ACTIVITY)
		rt2x00_set_field16(&reg, MAC_CSR20_ACTIVITY, enabled);

	rt2500usb_register_write(led->rt2x00dev, MAC_CSR20, reg);
}

static int rt2500usb_blink_set(struct led_classdev *led_cdev,
			       unsigned long *delay_on,
			       unsigned long *delay_off)
{
	struct rt2x00_led *led =
	    container_of(led_cdev, struct rt2x00_led, led_dev);
	u16 reg;

309
	reg = rt2500usb_register_read(led->rt2x00dev, MAC_CSR21);
310 311 312
	rt2x00_set_field16(&reg, MAC_CSR21_ON_PERIOD, *delay_on);
	rt2x00_set_field16(&reg, MAC_CSR21_OFF_PERIOD, *delay_off);
	rt2500usb_register_write(led->rt2x00dev, MAC_CSR21, reg);
313

314
	return 0;
315
}
316 317 318 319 320 321 322 323 324 325 326

static void rt2500usb_init_led(struct rt2x00_dev *rt2x00dev,
			       struct rt2x00_led *led,
			       enum led_type type)
{
	led->rt2x00dev = rt2x00dev;
	led->type = type;
	led->led_dev.brightness_set = rt2500usb_brightness_set;
	led->led_dev.blink_set = rt2500usb_blink_set;
	led->flags = LED_INITIALIZED;
}
327
#endif /* CONFIG_RT2X00_LIB_LEDS */
328

329 330 331
/*
 * Configuration handlers.
 */
332 333 334 335 336 337 338 339 340 341 342

/*
 * rt2500usb does not differentiate between shared and pairwise
 * keys, so we should use the same function for both key types.
 */
static int rt2500usb_config_key(struct rt2x00_dev *rt2x00dev,
				struct rt2x00lib_crypto *crypto,
				struct ieee80211_key_conf *key)
{
	u32 mask;
	u16 reg;
343
	enum cipher curr_cipher;
344 345

	if (crypto->cmd == SET_KEY) {
346 347 348 349 350
		/*
		 * Disallow to set WEP key other than with index 0,
		 * it is known that not work at least on some hardware.
		 * SW crypto will be used in that case.
		 */
351 352 353
		if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
		     key->cipher == WLAN_CIPHER_SUITE_WEP104) &&
		    key->keyidx != 0)
354 355
			return -EOPNOTSUPP;

356 357 358 359 360 361 362
		/*
		 * Pairwise key will always be entry 0, but this
		 * could collide with a shared key on the same
		 * position...
		 */
		mask = TXRX_CSR0_KEY_ID.bit_mask;

363
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR0);
364
		curr_cipher = rt2x00_get_field16(reg, TXRX_CSR0_ALGORITHM);
365 366 367 368 369 370 371 372
		reg &= mask;

		if (reg && reg == mask)
			return -ENOSPC;

		reg = rt2x00_get_field16(reg, TXRX_CSR0_KEY_ID);

		key->hw_key_idx += reg ? ffz(reg) : 0;
373 374 375 376 377 378 379 380
		/*
		 * Hardware requires that all keys use the same cipher
		 * (e.g. TKIP-only, AES-only, but not TKIP+AES).
		 * If this is not the first key, compare the cipher with the
		 * first one and fall back to SW crypto if not the same.
		 */
		if (key->hw_key_idx > 0 && crypto->cipher != curr_cipher)
			return -EOPNOTSUPP;
381

382
		rt2500usb_register_multiwrite(rt2x00dev, KEY_ENTRY(key->hw_key_idx),
383
					      crypto->key, sizeof(crypto->key));
384 385 386

		/*
		 * The driver does not support the IV/EIV generation
I
Ivo van Doorn 已提交
387
		 * in hardware. However it demands the data to be provided
D
Daniel Mack 已提交
388
		 * both separately as well as inside the frame.
I
Ivo van Doorn 已提交
389 390 391
		 * We already provided the CONFIG_CRYPTO_COPY_IV to rt2x00lib
		 * to ensure rt2x00lib will not strip the data from the
		 * frame after the copy, now we must tell mac80211
392 393 394 395 396 397 398 399 400 401
		 * to generate the IV/EIV data.
		 */
		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
		key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
	}

	/*
	 * TXRX_CSR0_KEY_ID contains only single-bit fields to indicate
	 * a particular key is valid.
	 */
402
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR0);
403 404 405 406 407 408 409 410 411 412 413 414 415 416
	rt2x00_set_field16(&reg, TXRX_CSR0_ALGORITHM, crypto->cipher);
	rt2x00_set_field16(&reg, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER);

	mask = rt2x00_get_field16(reg, TXRX_CSR0_KEY_ID);
	if (crypto->cmd == SET_KEY)
		mask |= 1 << key->hw_key_idx;
	else if (crypto->cmd == DISABLE_KEY)
		mask &= ~(1 << key->hw_key_idx);
	rt2x00_set_field16(&reg, TXRX_CSR0_KEY_ID, mask);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg);

	return 0;
}

I
Ivo van Doorn 已提交
417 418 419 420 421 422 423 424 425 426 427
static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev,
				    const unsigned int filter_flags)
{
	u16 reg;

	/*
	 * Start configuration steps.
	 * Note that the version error will always be dropped
	 * and broadcast frames will always be accepted since
	 * there is no filter for it at this time.
	 */
428
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR2);
I
Ivo van Doorn 已提交
429 430 431 432 433 434
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CRC,
			   !(filter_flags & FIF_FCSFAIL));
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_PHYSICAL,
			   !(filter_flags & FIF_PLCPFAIL));
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL,
			   !(filter_flags & FIF_CONTROL));
E
Eli Cooper 已提交
435 436
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
			   !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
I
Ivo van Doorn 已提交
437
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
E
Eli Cooper 已提交
438
			   !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
439
			   !rt2x00dev->intf_ap_count);
I
Ivo van Doorn 已提交
440 441 442 443 444 445 446
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,
			   !(filter_flags & FIF_ALLMULTI));
	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_BROADCAST, 0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);
}

447 448 449 450
static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev,
				  struct rt2x00_intf *intf,
				  struct rt2x00intf_conf *conf,
				  const unsigned int flags)
451
{
452
	unsigned int bcn_preload;
453 454
	u16 reg;

455 456 457 458
	if (flags & CONFIG_UPDATE_TYPE) {
		/*
		 * Enable beacon config
		 */
459
		bcn_preload = PREAMBLE + GET_DURATION(IEEE80211_HEADER, 20);
460
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR20);
461 462
		rt2x00_set_field16(&reg, TXRX_CSR20_OFFSET, bcn_preload >> 6);
		rt2x00_set_field16(&reg, TXRX_CSR20_BCN_EXPECT_WINDOW,
463
				   2 * (conf->type != NL80211_IFTYPE_STATION));
464
		rt2500usb_register_write(rt2x00dev, TXRX_CSR20, reg);
465

466 467 468
		/*
		 * Enable synchronisation.
		 */
469
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR18);
470 471 472
		rt2x00_set_field16(&reg, TXRX_CSR18_OFFSET, 0);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);

473
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR19);
474 475 476
		rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, conf->sync);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
	}
477

478 479 480 481 482 483 484
	if (flags & CONFIG_UPDATE_MAC)
		rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, conf->mac,
					      (3 * sizeof(__le16)));

	if (flags & CONFIG_UPDATE_BSSID)
		rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR5, conf->bssid,
					      (3 * sizeof(__le16)));
485 486
}

I
Ivo van Doorn 已提交
487
static void rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev,
488 489
				 struct rt2x00lib_erp *erp,
				 u32 changed)
490 491 492
{
	u16 reg;

493
	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
494
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR10);
495 496 497 498
		rt2x00_set_field16(&reg, TXRX_CSR10_AUTORESPOND_PREAMBLE,
				   !!erp->short_preamble);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg);
	}
499

500 501 502
	if (changed & BSS_CHANGED_BASIC_RATES)
		rt2500usb_register_write(rt2x00dev, TXRX_CSR11,
					 erp->basic_rates);
503

504
	if (changed & BSS_CHANGED_BEACON_INT) {
505
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR18);
506 507 508 509
		rt2x00_set_field16(&reg, TXRX_CSR18_INTERVAL,
				   erp->beacon_int * 4);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
	}
510

511 512 513 514 515
	if (changed & BSS_CHANGED_ERP_SLOT) {
		rt2500usb_register_write(rt2x00dev, MAC_CSR10, erp->slot_time);
		rt2500usb_register_write(rt2x00dev, MAC_CSR11, erp->sifs);
		rt2500usb_register_write(rt2x00dev, MAC_CSR12, erp->eifs);
	}
516 517
}

518 519
static void rt2500usb_config_ant(struct rt2x00_dev *rt2x00dev,
				 struct antenna_setup *ant)
520 521 522 523 524 525
{
	u8 r2;
	u8 r14;
	u16 csr5;
	u16 csr6;

526 527 528 529 530 531 532
	/*
	 * We should never come here because rt2x00lib is supposed
	 * to catch this and send us the correct antenna explicitely.
	 */
	BUG_ON(ant->rx == ANTENNA_SW_DIVERSITY ||
	       ant->tx == ANTENNA_SW_DIVERSITY);

533 534
	rt2500usb_bbp_read(rt2x00dev, 2, &r2);
	rt2500usb_bbp_read(rt2x00dev, 14, &r14);
535 536
	csr5 = rt2500usb_register_read(rt2x00dev, PHY_CSR5);
	csr6 = rt2500usb_register_read(rt2x00dev, PHY_CSR6);
537 538 539 540

	/*
	 * Configure the TX antenna.
	 */
541
	switch (ant->tx) {
542 543 544 545 546 547 548 549 550 551 552
	case ANTENNA_HW_DIVERSITY:
		rt2x00_set_field8(&r2, BBP_R2_TX_ANTENNA, 1);
		rt2x00_set_field16(&csr5, PHY_CSR5_CCK, 1);
		rt2x00_set_field16(&csr6, PHY_CSR6_OFDM, 1);
		break;
	case ANTENNA_A:
		rt2x00_set_field8(&r2, BBP_R2_TX_ANTENNA, 0);
		rt2x00_set_field16(&csr5, PHY_CSR5_CCK, 0);
		rt2x00_set_field16(&csr6, PHY_CSR6_OFDM, 0);
		break;
	case ANTENNA_B:
553
	default:
554 555 556 557 558 559 560 561 562
		rt2x00_set_field8(&r2, BBP_R2_TX_ANTENNA, 2);
		rt2x00_set_field16(&csr5, PHY_CSR5_CCK, 2);
		rt2x00_set_field16(&csr6, PHY_CSR6_OFDM, 2);
		break;
	}

	/*
	 * Configure the RX antenna.
	 */
563
	switch (ant->rx) {
564 565 566 567 568 569 570
	case ANTENNA_HW_DIVERSITY:
		rt2x00_set_field8(&r14, BBP_R14_RX_ANTENNA, 1);
		break;
	case ANTENNA_A:
		rt2x00_set_field8(&r14, BBP_R14_RX_ANTENNA, 0);
		break;
	case ANTENNA_B:
571
	default:
572 573 574 575 576 577 578
		rt2x00_set_field8(&r14, BBP_R14_RX_ANTENNA, 2);
		break;
	}

	/*
	 * RT2525E and RT5222 need to flip TX I/Q
	 */
579
	if (rt2x00_rf(rt2x00dev, RF2525E) || rt2x00_rf(rt2x00dev, RF5222)) {
580 581 582 583 584 585 586
		rt2x00_set_field8(&r2, BBP_R2_TX_IQ_FLIP, 1);
		rt2x00_set_field16(&csr5, PHY_CSR5_CCK_FLIP, 1);
		rt2x00_set_field16(&csr6, PHY_CSR6_OFDM_FLIP, 1);

		/*
		 * RT2525E does not need RX I/Q Flip.
		 */
587
		if (rt2x00_rf(rt2x00dev, RF2525E))
588 589 590 591 592 593 594 595 596 597 598 599
			rt2x00_set_field8(&r14, BBP_R14_RX_IQ_FLIP, 0);
	} else {
		rt2x00_set_field16(&csr5, PHY_CSR5_CCK_FLIP, 0);
		rt2x00_set_field16(&csr6, PHY_CSR6_OFDM_FLIP, 0);
	}

	rt2500usb_bbp_write(rt2x00dev, 2, r2);
	rt2500usb_bbp_write(rt2x00dev, 14, r14);
	rt2500usb_register_write(rt2x00dev, PHY_CSR5, csr5);
	rt2500usb_register_write(rt2x00dev, PHY_CSR6, csr6);
}

600 601 602 603 604 605 606 607 608 609 610
static void rt2500usb_config_channel(struct rt2x00_dev *rt2x00dev,
				     struct rf_channel *rf, const int txpower)
{
	/*
	 * Set TXpower.
	 */
	rt2x00_set_field32(&rf->rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower));

	/*
	 * For RT2525E we should first set the channel to half band higher.
	 */
611
	if (rt2x00_rf(rt2x00dev, RF2525E)) {
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
		static const u32 vals[] = {
			0x000008aa, 0x000008ae, 0x000008ae, 0x000008b2,
			0x000008b2, 0x000008b6, 0x000008b6, 0x000008ba,
			0x000008ba, 0x000008be, 0x000008b7, 0x00000902,
			0x00000902, 0x00000906
		};

		rt2500usb_rf_write(rt2x00dev, 2, vals[rf->channel - 1]);
		if (rf->rf4)
			rt2500usb_rf_write(rt2x00dev, 4, rf->rf4);
	}

	rt2500usb_rf_write(rt2x00dev, 1, rf->rf1);
	rt2500usb_rf_write(rt2x00dev, 2, rf->rf2);
	rt2500usb_rf_write(rt2x00dev, 3, rf->rf3);
	if (rf->rf4)
		rt2500usb_rf_write(rt2x00dev, 4, rf->rf4);
}

static void rt2500usb_config_txpower(struct rt2x00_dev *rt2x00dev,
				     const int txpower)
{
	u32 rf3;

636
	rf3 = rt2x00_rf_read(rt2x00dev, 3);
637 638 639 640
	rt2x00_set_field32(&rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower));
	rt2500usb_rf_write(rt2x00dev, 3, rf3);
}

I
Ivo van Doorn 已提交
641 642 643 644 645 646 647 648 649
static void rt2500usb_config_ps(struct rt2x00_dev *rt2x00dev,
				struct rt2x00lib_conf *libconf)
{
	enum dev_state state =
	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
		STATE_SLEEP : STATE_AWAKE;
	u16 reg;

	if (state == STATE_SLEEP) {
650
		reg = rt2500usb_register_read(rt2x00dev, MAC_CSR18);
I
Ivo van Doorn 已提交
651
		rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON,
652
				   rt2x00dev->beacon_int - 20);
I
Ivo van Doorn 已提交
653 654 655 656 657 658 659 660 661
		rt2x00_set_field16(&reg, MAC_CSR18_BEACONS_BEFORE_WAKEUP,
				   libconf->conf->listen_interval - 1);

		/* We must first disable autowake before it can be enabled */
		rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 0);
		rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);

		rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 1);
		rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
662
	} else {
663
		reg = rt2500usb_register_read(rt2x00dev, MAC_CSR18);
664 665
		rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 0);
		rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
I
Ivo van Doorn 已提交
666 667 668 669 670
	}

	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
}

671
static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
672 673
			     struct rt2x00lib_conf *libconf,
			     const unsigned int flags)
674
{
675
	if (flags & IEEE80211_CONF_CHANGE_CHANNEL)
676 677
		rt2500usb_config_channel(rt2x00dev, &libconf->rf,
					 libconf->conf->power_level);
678 679
	if ((flags & IEEE80211_CONF_CHANGE_POWER) &&
	    !(flags & IEEE80211_CONF_CHANGE_CHANNEL))
680 681
		rt2500usb_config_txpower(rt2x00dev,
					 libconf->conf->power_level);
I
Ivo van Doorn 已提交
682 683
	if (flags & IEEE80211_CONF_CHANGE_PS)
		rt2500usb_config_ps(rt2x00dev, libconf);
684 685 686 687 688
}

/*
 * Link tuning
 */
689 690
static void rt2500usb_link_stats(struct rt2x00_dev *rt2x00dev,
				 struct link_qual *qual)
691 692 693 694 695 696
{
	u16 reg;

	/*
	 * Update FCS error count from register.
	 */
697
	reg = rt2500usb_register_read(rt2x00dev, STA_CSR0);
698
	qual->rx_failed = rt2x00_get_field16(reg, STA_CSR0_FCS_ERROR);
699 700 701 702

	/*
	 * Update False CCA count from register.
	 */
703
	reg = rt2500usb_register_read(rt2x00dev, STA_CSR3);
704
	qual->false_cca = rt2x00_get_field16(reg, STA_CSR3_FALSE_CCA_ERROR);
705 706
}

707 708
static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev,
				  struct link_qual *qual)
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
{
	u16 eeprom;
	u16 value;

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &eeprom);
	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R24_LOW);
	rt2500usb_bbp_write(rt2x00dev, 24, value);

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &eeprom);
	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R25_LOW);
	rt2500usb_bbp_write(rt2x00dev, 25, value);

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &eeprom);
	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R61_LOW);
	rt2500usb_bbp_write(rt2x00dev, 61, value);

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &eeprom);
	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_VGCUPPER);
	rt2500usb_bbp_write(rt2x00dev, 17, value);

729
	qual->vgc_level = value;
730 731
}

732 733 734 735 736 737 738 739 740 741
/*
 * Queue handlers.
 */
static void rt2500usb_start_queue(struct data_queue *queue)
{
	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
	u16 reg;

	switch (queue->qid) {
	case QID_RX:
742
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR2);
743 744 745 746
		rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 0);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);
		break;
	case QID_BEACON:
747
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR19);
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
		rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
		rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
		rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
		break;
	default:
		break;
	}
}

static void rt2500usb_stop_queue(struct data_queue *queue)
{
	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
	u16 reg;

	switch (queue->qid) {
	case QID_RX:
765
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR2);
766 767 768 769
		rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 1);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);
		break;
	case QID_BEACON:
770
		reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR19);
771 772 773 774 775 776 777 778 779 780
		rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
		rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
		rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
		rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
		break;
	default:
		break;
	}
}

781 782 783 784 785 786 787 788 789 790 791 792
/*
 * Initialization functions.
 */
static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev)
{
	u16 reg;

	rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0001,
				    USB_MODE_TEST, REGISTER_TIMEOUT);
	rt2x00usb_vendor_request_sw(rt2x00dev, USB_SINGLE_WRITE, 0x0308,
				    0x00f0, REGISTER_TIMEOUT);

793
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR2);
794 795 796 797 798 799
	rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 1);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);

	rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x1111);
	rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x1e11);

800
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR1);
801 802 803 804 805
	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 1);
	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 1);
	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 0);
	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);

806
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR1);
807 808 809 810 811
	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 0);
	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 0);
	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 0);
	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);

812
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR5);
813 814 815 816 817 818
	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID0, 13);
	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID0_VALID, 1);
	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID1, 12);
	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID1_VALID, 1);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR5, reg);

819
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR6);
820 821 822 823 824 825
	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID0, 10);
	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID0_VALID, 1);
	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID1, 11);
	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID1_VALID, 1);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR6, reg);

826
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR7);
827 828 829 830 831 832
	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID0, 7);
	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID0_VALID, 1);
	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID1, 6);
	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID1_VALID, 1);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR7, reg);

833
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR8);
834 835 836 837 838 839
	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID0, 5);
	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID0_VALID, 1);
	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID1, 0);
	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID1_VALID, 0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR8, reg);

840
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR19);
841 842 843 844 845 846
	rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
	rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, 0);
	rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
	rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);

847 848 849 850 851 852
	rt2500usb_register_write(rt2x00dev, TXRX_CSR21, 0xe78f);
	rt2500usb_register_write(rt2x00dev, MAC_CSR9, 0xff1d);

	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
		return -EBUSY;

853
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR1);
854 855 856 857 858
	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 0);
	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 0);
	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 1);
	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);

859
	if (rt2x00_rev(rt2x00dev) >= RT2570_VERSION_C) {
860
		reg = rt2500usb_register_read(rt2x00dev, PHY_CSR2);
861
		rt2x00_set_field16(&reg, PHY_CSR2_LNA, 0);
862
	} else {
863 864 865
		reg = 0;
		rt2x00_set_field16(&reg, PHY_CSR2_LNA, 1);
		rt2x00_set_field16(&reg, PHY_CSR2_LNA_MODE, 3);
866 867 868 869 870 871 872 873
	}
	rt2500usb_register_write(rt2x00dev, PHY_CSR2, reg);

	rt2500usb_register_write(rt2x00dev, MAC_CSR11, 0x0002);
	rt2500usb_register_write(rt2x00dev, MAC_CSR22, 0x0053);
	rt2500usb_register_write(rt2x00dev, MAC_CSR15, 0x01ee);
	rt2500usb_register_write(rt2x00dev, MAC_CSR16, 0x0000);

874
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR8);
875 876 877 878
	rt2x00_set_field16(&reg, MAC_CSR8_MAX_FRAME_UNIT,
			   rt2x00dev->rx->data_size);
	rt2500usb_register_write(rt2x00dev, MAC_CSR8, reg);

879
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR0);
880
	rt2x00_set_field16(&reg, TXRX_CSR0_ALGORITHM, CIPHER_NONE);
881
	rt2x00_set_field16(&reg, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER);
882
	rt2x00_set_field16(&reg, TXRX_CSR0_KEY_ID, 0);
883 884
	rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg);

885
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR18);
886 887 888
	rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON, 90);
	rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);

889
	reg = rt2500usb_register_read(rt2x00dev, PHY_CSR4);
890 891 892
	rt2x00_set_field16(&reg, PHY_CSR4_LOW_RF_LE, 1);
	rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg);

893
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR1);
894 895 896 897 898 899
	rt2x00_set_field16(&reg, TXRX_CSR1_AUTO_SEQUENCE, 1);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);

	return 0;
}

900
static int rt2500usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
901 902 903 904
{
	unsigned int i;
	u8 value;

905
	for (i = 0; i < REGISTER_USB_BUSY_COUNT; i++) {
906 907
		rt2500usb_bbp_read(rt2x00dev, 0, &value);
		if ((value != 0xff) && (value != 0x00))
908
			return 0;
909 910 911
		udelay(REGISTER_BUSY_DELAY);
	}

912
	rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
913
	return -EACCES;
914 915 916 917 918 919 920 921 922 923 924
}

static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev)
{
	unsigned int i;
	u16 eeprom;
	u8 value;
	u8 reg_id;

	if (unlikely(rt2500usb_wait_bbp_ready(rt2x00dev)))
		return -EACCES;
925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978

	rt2500usb_bbp_write(rt2x00dev, 3, 0x02);
	rt2500usb_bbp_write(rt2x00dev, 4, 0x19);
	rt2500usb_bbp_write(rt2x00dev, 14, 0x1c);
	rt2500usb_bbp_write(rt2x00dev, 15, 0x30);
	rt2500usb_bbp_write(rt2x00dev, 16, 0xac);
	rt2500usb_bbp_write(rt2x00dev, 18, 0x18);
	rt2500usb_bbp_write(rt2x00dev, 19, 0xff);
	rt2500usb_bbp_write(rt2x00dev, 20, 0x1e);
	rt2500usb_bbp_write(rt2x00dev, 21, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 22, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 23, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 24, 0x80);
	rt2500usb_bbp_write(rt2x00dev, 25, 0x50);
	rt2500usb_bbp_write(rt2x00dev, 26, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 27, 0x23);
	rt2500usb_bbp_write(rt2x00dev, 30, 0x10);
	rt2500usb_bbp_write(rt2x00dev, 31, 0x2b);
	rt2500usb_bbp_write(rt2x00dev, 32, 0xb9);
	rt2500usb_bbp_write(rt2x00dev, 34, 0x12);
	rt2500usb_bbp_write(rt2x00dev, 35, 0x50);
	rt2500usb_bbp_write(rt2x00dev, 39, 0xc4);
	rt2500usb_bbp_write(rt2x00dev, 40, 0x02);
	rt2500usb_bbp_write(rt2x00dev, 41, 0x60);
	rt2500usb_bbp_write(rt2x00dev, 53, 0x10);
	rt2500usb_bbp_write(rt2x00dev, 54, 0x18);
	rt2500usb_bbp_write(rt2x00dev, 56, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 57, 0x10);
	rt2500usb_bbp_write(rt2x00dev, 58, 0x08);
	rt2500usb_bbp_write(rt2x00dev, 61, 0x60);
	rt2500usb_bbp_write(rt2x00dev, 62, 0x10);
	rt2500usb_bbp_write(rt2x00dev, 75, 0xff);

	for (i = 0; i < EEPROM_BBP_SIZE; i++) {
		rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);

		if (eeprom != 0xffff && eeprom != 0x0000) {
			reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);
			value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE);
			rt2500usb_bbp_write(rt2x00dev, reg_id, value);
		}
	}

	return 0;
}

/*
 * Device state switch handlers.
 */
static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev)
{
	/*
	 * Initialize all registers.
	 */
979 980
	if (unlikely(rt2500usb_init_registers(rt2x00dev) ||
		     rt2500usb_init_bbp(rt2x00dev)))
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
		return -EIO;

	return 0;
}

static void rt2500usb_disable_radio(struct rt2x00_dev *rt2x00dev)
{
	rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x2121);
	rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x2121);

	/*
	 * Disable synchronisation.
	 */
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);

	rt2x00usb_disable_radio(rt2x00dev);
}

static int rt2500usb_set_state(struct rt2x00_dev *rt2x00dev,
			       enum dev_state state)
{
	u16 reg;
	u16 reg2;
	unsigned int i;
	char put_to_sleep;
	char bbp_state;
	char rf_state;

	put_to_sleep = (state != STATE_AWAKE);

	reg = 0;
	rt2x00_set_field16(&reg, MAC_CSR17_BBP_DESIRE_STATE, state);
	rt2x00_set_field16(&reg, MAC_CSR17_RF_DESIRE_STATE, state);
	rt2x00_set_field16(&reg, MAC_CSR17_PUT_TO_SLEEP, put_to_sleep);
	rt2500usb_register_write(rt2x00dev, MAC_CSR17, reg);
	rt2x00_set_field16(&reg, MAC_CSR17_SET_STATE, 1);
	rt2500usb_register_write(rt2x00dev, MAC_CSR17, reg);

	/*
	 * Device is not guaranteed to be in the requested state yet.
	 * We must wait until the register indicates that the
	 * device has entered the correct state.
	 */
1024
	for (i = 0; i < REGISTER_USB_BUSY_COUNT; i++) {
1025
		reg2 = rt2500usb_register_read(rt2x00dev, MAC_CSR17);
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
		bbp_state = rt2x00_get_field16(reg2, MAC_CSR17_BBP_CURR_STATE);
		rf_state = rt2x00_get_field16(reg2, MAC_CSR17_RF_CURR_STATE);
		if (bbp_state == state && rf_state == state)
			return 0;
		rt2500usb_register_write(rt2x00dev, MAC_CSR17, reg);
		msleep(30);
	}

	return -EBUSY;
}

static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev,
				      enum dev_state state)
{
	int retval = 0;

	switch (state) {
	case STATE_RADIO_ON:
		retval = rt2500usb_enable_radio(rt2x00dev);
		break;
	case STATE_RADIO_OFF:
		rt2500usb_disable_radio(rt2x00dev);
		break;
1049 1050 1051
	case STATE_RADIO_IRQ_ON:
	case STATE_RADIO_IRQ_OFF:
		/* No support, but no error either */
1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
		break;
	case STATE_DEEP_SLEEP:
	case STATE_SLEEP:
	case STATE_STANDBY:
	case STATE_AWAKE:
		retval = rt2500usb_set_state(rt2x00dev, state);
		break;
	default:
		retval = -ENOTSUPP;
		break;
	}

1064
	if (unlikely(retval))
1065 1066
		rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n",
			   state, retval);
1067

1068 1069 1070 1071 1072 1073
	return retval;
}

/*
 * TX descriptor initialization
 */
1074
static void rt2500usb_write_tx_desc(struct queue_entry *entry,
1075
				    struct txentry_desc *txdesc)
1076
{
1077 1078
	struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
	__le32 *txd = (__le32 *) entry->skb->data;
1079 1080 1081 1082 1083
	u32 word;

	/*
	 * Start writing the descriptor words.
	 */
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
	rt2x00_desc_read(txd, 0, &word);
	rt2x00_set_field32(&word, TXD_W0_RETRY_LIMIT, txdesc->retry_limit);
	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
			   test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
	rt2x00_set_field32(&word, TXD_W0_ACK,
			   test_bit(ENTRY_TXD_ACK, &txdesc->flags));
	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
	rt2x00_set_field32(&word, TXD_W0_OFDM,
			   (txdesc->rate_mode == RATE_MODE_OFDM));
	rt2x00_set_field32(&word, TXD_W0_NEW_SEQ,
			   test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags));
1096
	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->u.plcp.ifs);
1097 1098 1099 1100 1101
	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length);
	rt2x00_set_field32(&word, TXD_W0_CIPHER, !!txdesc->cipher);
	rt2x00_set_field32(&word, TXD_W0_KEY_ID, txdesc->key_idx);
	rt2x00_desc_write(txd, 0, word);

1102
	rt2x00_desc_read(txd, 1, &word);
1103
	rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset);
H
Helmut Schaa 已提交
1104 1105 1106
	rt2x00_set_field32(&word, TXD_W1_AIFS, entry->queue->aifs);
	rt2x00_set_field32(&word, TXD_W1_CWMIN, entry->queue->cw_min);
	rt2x00_set_field32(&word, TXD_W1_CWMAX, entry->queue->cw_max);
1107 1108 1109
	rt2x00_desc_write(txd, 1, word);

	rt2x00_desc_read(txd, 2, &word);
1110 1111 1112 1113 1114 1115
	rt2x00_set_field32(&word, TXD_W2_PLCP_SIGNAL, txdesc->u.plcp.signal);
	rt2x00_set_field32(&word, TXD_W2_PLCP_SERVICE, txdesc->u.plcp.service);
	rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_LOW,
			   txdesc->u.plcp.length_low);
	rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH,
			   txdesc->u.plcp.length_high);
1116 1117
	rt2x00_desc_write(txd, 2, word);

1118 1119 1120 1121 1122
	if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags)) {
		_rt2x00_desc_write(txd, 3, skbdesc->iv[0]);
		_rt2x00_desc_write(txd, 4, skbdesc->iv[1]);
	}

1123 1124 1125
	/*
	 * Register descriptor details in skb frame descriptor.
	 */
1126
	skbdesc->flags |= SKBDESC_DESC_IN_SKB;
1127 1128
	skbdesc->desc = txd;
	skbdesc->desc_len = TXD_DESC_SIZE;
1129 1130
}

1131 1132 1133 1134 1135
/*
 * TX data initialization
 */
static void rt2500usb_beacondone(struct urb *urb);

1136 1137
static void rt2500usb_write_beacon(struct queue_entry *entry,
				   struct txentry_desc *txdesc)
1138 1139 1140 1141
{
	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
	struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
	struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data;
1142
	int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint);
1143
	int length;
1144
	u16 reg, reg0;
1145 1146 1147 1148 1149

	/*
	 * Disable beaconing while we are reloading the beacon data,
	 * otherwise we might be sending out invalid data.
	 */
1150
	reg = rt2500usb_register_read(rt2x00dev, TXRX_CSR19);
1151 1152 1153
	rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);

1154 1155 1156 1157 1158 1159
	/*
	 * Add space for the descriptor in front of the skb.
	 */
	skb_push(entry->skb, TXD_DESC_SIZE);
	memset(entry->skb->data, 0, TXD_DESC_SIZE);

1160 1161 1162
	/*
	 * Write the TX descriptor for the beacon.
	 */
1163
	rt2500usb_write_tx_desc(entry, txdesc);
1164 1165 1166 1167

	/*
	 * Dump beacon to userspace through debugfs.
	 */
1168
	rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry);
1169

1170 1171 1172 1173 1174
	/*
	 * USB devices cannot blindly pass the skb->len as the
	 * length of the data to usb_fill_bulk_urb. Pass the skb
	 * to the driver to determine what the length should be.
	 */
1175
	length = rt2x00dev->ops->lib->get_tx_data_len(entry);
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194

	usb_fill_bulk_urb(bcn_priv->urb, usb_dev, pipe,
			  entry->skb->data, length, rt2500usb_beacondone,
			  entry);

	/*
	 * Second we need to create the guardian byte.
	 * We only need a single byte, so lets recycle
	 * the 'flags' field we are not using for beacons.
	 */
	bcn_priv->guardian_data = 0;
	usb_fill_bulk_urb(bcn_priv->guardian_urb, usb_dev, pipe,
			  &bcn_priv->guardian_data, 1, rt2500usb_beacondone,
			  entry);

	/*
	 * Send out the guardian byte.
	 */
	usb_submit_urb(bcn_priv->guardian_urb, GFP_ATOMIC);
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214

	/*
	 * Enable beaconing again.
	 */
	rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
	rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
	reg0 = reg;
	rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1);
	/*
	 * Beacon generation will fail initially.
	 * To prevent this we need to change the TXRX_CSR19
	 * register several times (reg0 is the same as reg
	 * except for TXRX_CSR19_BEACON_GEN, which is 0 in reg0
	 * and 1 in reg).
	 */
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1215 1216
}

1217
static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
1218 1219 1220 1221 1222 1223 1224
{
	int length;

	/*
	 * The length _must_ be a multiple of 2,
	 * but it must _not_ be a multiple of the USB packet size.
	 */
1225 1226
	length = roundup(entry->skb->len, 2);
	length += (2 * !(length % entry->queue->usb_maxpacket));
1227 1228 1229 1230

	return length;
}

1231 1232 1233
/*
 * RX control handlers
 */
I
Ivo van Doorn 已提交
1234 1235
static void rt2500usb_fill_rxdone(struct queue_entry *entry,
				  struct rxdone_entry_desc *rxdesc)
1236
{
1237
	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1238
	struct queue_entry_priv_usb *entry_priv = entry->priv_data;
I
Ivo van Doorn 已提交
1239 1240 1241
	struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
	__le32 *rxd =
	    (__le32 *)(entry->skb->data +
1242 1243
		       (entry_priv->urb->actual_length -
			entry->queue->desc_size));
1244 1245 1246
	u32 word0;
	u32 word1;

1247
	/*
1248 1249
	 * Copy descriptor to the skbdesc->desc buffer, making it safe from moving of
	 * frame data in rt2x00usb.
1250
	 */
1251
	memcpy(skbdesc->desc, rxd, skbdesc->desc_len);
1252
	rxd = (__le32 *)skbdesc->desc;
1253 1254

	/*
1255
	 * It is now safe to read the descriptor on all architectures.
1256
	 */
1257 1258 1259
	rt2x00_desc_read(rxd, 0, &word0);
	rt2x00_desc_read(rxd, 1, &word1);

1260
	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
I
Ivo van Doorn 已提交
1261
		rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
1262
	if (rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR))
I
Ivo van Doorn 已提交
1263
		rxdesc->flags |= RX_FLAG_FAILED_PLCP_CRC;
1264

1265 1266 1267
	rxdesc->cipher = rt2x00_get_field32(word0, RXD_W0_CIPHER);
	if (rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR))
		rxdesc->cipher_status = RX_CRYPTO_FAIL_KEY;
1268 1269 1270 1271

	if (rxdesc->cipher != CIPHER_NONE) {
		_rt2x00_desc_read(rxd, 2, &rxdesc->iv[0]);
		_rt2x00_desc_read(rxd, 3, &rxdesc->iv[1]);
1272 1273
		rxdesc->dev_flags |= RXDONE_CRYPTO_IV;

1274 1275
		/* ICV is located at the end of frame */

I
Ivo van Doorn 已提交
1276
		rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
1277 1278 1279 1280 1281 1282
		if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
			rxdesc->flags |= RX_FLAG_DECRYPTED;
		else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
			rxdesc->flags |= RX_FLAG_MMIC_ERROR;
	}

1283 1284
	/*
	 * Obtain the status about this packet.
I
Ivo van Doorn 已提交
1285 1286 1287
	 * When frame was received with an OFDM bitrate,
	 * the signal is the PLCP value. If it was received with
	 * a CCK bitrate the signal is the rate in 100kbit/s.
1288
	 */
I
Ivo van Doorn 已提交
1289
	rxdesc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
1290 1291
	rxdesc->rssi =
	    rt2x00_get_field32(word1, RXD_W1_RSSI) - rt2x00dev->rssi_offset;
I
Ivo van Doorn 已提交
1292
	rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
1293 1294 1295

	if (rt2x00_get_field32(word0, RXD_W0_OFDM))
		rxdesc->dev_flags |= RXDONE_SIGNAL_PLCP;
I
Ivo van Doorn 已提交
1296 1297
	else
		rxdesc->dev_flags |= RXDONE_SIGNAL_BITRATE;
1298 1299
	if (rt2x00_get_field32(word0, RXD_W0_MY_BSS))
		rxdesc->dev_flags |= RXDONE_MY_BSS;
1300

1301 1302 1303 1304
	/*
	 * Adjust the skb memory window to the frame boundaries.
	 */
	skb_trim(entry->skb, rxdesc->size);
1305 1306 1307 1308 1309 1310 1311
}

/*
 * Interrupt functions.
 */
static void rt2500usb_beacondone(struct urb *urb)
{
I
Ivo van Doorn 已提交
1312
	struct queue_entry *entry = (struct queue_entry *)urb->context;
1313
	struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data;
1314

1315
	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &entry->queue->rt2x00dev->flags))
1316 1317 1318 1319 1320 1321 1322 1323
		return;

	/*
	 * Check if this was the guardian beacon,
	 * if that was the case we need to send the real beacon now.
	 * Otherwise we should free the sk_buffer, the device
	 * should be doing the rest of the work now.
	 */
1324 1325 1326
	if (bcn_priv->guardian_urb == urb) {
		usb_submit_urb(bcn_priv->urb, GFP_ATOMIC);
	} else if (bcn_priv->urb == urb) {
I
Ivo van Doorn 已提交
1327 1328
		dev_kfree_skb(entry->skb);
		entry->skb = NULL;
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338
	}
}

/*
 * Device probe functions.
 */
static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
{
	u16 word;
	u8 *mac;
1339
	u8 bbp;
1340 1341 1342 1343 1344 1345 1346

	rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, EEPROM_SIZE);

	/*
	 * Start validation of the data that has been read.
	 */
	mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
1347
	rt2x00lib_set_mac_address(rt2x00dev, mac);
1348 1349 1350 1351

	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_ANTENNA_NUM, 2);
I
Ivo van Doorn 已提交
1352 1353 1354 1355 1356 1357
		rt2x00_set_field16(&word, EEPROM_ANTENNA_TX_DEFAULT,
				   ANTENNA_SW_DIVERSITY);
		rt2x00_set_field16(&word, EEPROM_ANTENNA_RX_DEFAULT,
				   ANTENNA_SW_DIVERSITY);
		rt2x00_set_field16(&word, EEPROM_ANTENNA_LED_MODE,
				   LED_MODE_DEFAULT);
1358 1359 1360 1361
		rt2x00_set_field16(&word, EEPROM_ANTENNA_DYN_TXAGC, 0);
		rt2x00_set_field16(&word, EEPROM_ANTENNA_HARDWARE_RADIO, 0);
		rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF2522);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);
1362
		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
1363 1364 1365 1366 1367 1368 1369 1370
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_NIC_CARDBUS_ACCEL, 0);
		rt2x00_set_field16(&word, EEPROM_NIC_DYN_BBP_TUNE, 0);
		rt2x00_set_field16(&word, EEPROM_NIC_CCK_TX_POWER, 0);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);
1371
		rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
1372 1373 1374 1375 1376 1377 1378
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_CALIBRATE_OFFSET_RSSI,
				   DEFAULT_RSSI_OFFSET);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_CALIBRATE_OFFSET, word);
1379 1380
		rt2x00_eeprom_dbg(rt2x00dev, "Calibrate offset: 0x%04x\n",
				  word);
1381 1382 1383 1384 1385 1386
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_THRESHOLD, 45);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE, word);
1387
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune: 0x%04x\n", word);
1388 1389
	}

1390 1391 1392 1393 1394 1395 1396
	/*
	 * Switch lower vgc bound to current BBP R17 value,
	 * lower the value a bit for better quality.
	 */
	rt2500usb_bbp_read(rt2x00dev, 17, &bbp);
	bbp -= 6;

1397 1398 1399
	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCUPPER, 0x40);
1400
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp);
1401
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word);
1402
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune vgc: 0x%04x\n", word);
1403 1404 1405
	} else {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word);
1406 1407 1408 1409 1410 1411 1412
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R17, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_LOW, 0x48);
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_HIGH, 0x41);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R17, word);
1413
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r17: 0x%04x\n", word);
1414 1415 1416 1417 1418 1419 1420
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R24_LOW, 0x40);
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R24_HIGH, 0x80);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R24, word);
1421
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r24: 0x%04x\n", word);
1422 1423 1424 1425 1426 1427 1428
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R25_LOW, 0x40);
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R25_HIGH, 0x50);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R25, word);
1429
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r25: 0x%04x\n", word);
1430 1431 1432 1433 1434 1435 1436
	}

	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &word);
	if (word == 0xffff) {
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R61_LOW, 0x60);
		rt2x00_set_field16(&word, EEPROM_BBPTUNE_R61_HIGH, 0x6d);
		rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R61, word);
1437
		rt2x00_eeprom_dbg(rt2x00dev, "BBPtune r61: 0x%04x\n", word);
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457
	}

	return 0;
}

static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
{
	u16 reg;
	u16 value;
	u16 eeprom;

	/*
	 * Read EEPROM word for configuration.
	 */
	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);

	/*
	 * Identify RF chipset.
	 */
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
1458
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR0);
1459 1460
	rt2x00_set_chip(rt2x00dev, RT2570, value, reg);

1461
	if (((reg & 0xfff0) != 0) || ((reg & 0x0000000f) == 0)) {
1462
		rt2x00_err(rt2x00dev, "Invalid RT chipset detected\n");
1463 1464 1465
		return -ENODEV;
	}

1466 1467 1468 1469 1470 1471
	if (!rt2x00_rf(rt2x00dev, RF2522) &&
	    !rt2x00_rf(rt2x00dev, RF2523) &&
	    !rt2x00_rf(rt2x00dev, RF2524) &&
	    !rt2x00_rf(rt2x00dev, RF2525) &&
	    !rt2x00_rf(rt2x00dev, RF2525E) &&
	    !rt2x00_rf(rt2x00dev, RF5222)) {
1472
		rt2x00_err(rt2x00dev, "Invalid RF chipset detected\n");
1473 1474 1475 1476 1477 1478
		return -ENODEV;
	}

	/*
	 * Identify default antenna configuration.
	 */
1479
	rt2x00dev->default_ant.tx =
1480
	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TX_DEFAULT);
1481
	rt2x00dev->default_ant.rx =
1482 1483
	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_DEFAULT);

1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
	/*
	 * When the eeprom indicates SW_DIVERSITY use HW_DIVERSITY instead.
	 * I am not 100% sure about this, but the legacy drivers do not
	 * indicate antenna swapping in software is required when
	 * diversity is enabled.
	 */
	if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
		rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY;
	if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
		rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY;

1495 1496 1497
	/*
	 * Store led mode, for correct led behaviour.
	 */
1498
#ifdef CONFIG_RT2X00_LIB_LEDS
1499 1500
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);

1501
	rt2500usb_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO);
1502 1503 1504
	if (value == LED_MODE_TXRX_ACTIVITY ||
	    value == LED_MODE_DEFAULT ||
	    value == LED_MODE_ASUS)
1505 1506
		rt2500usb_init_led(rt2x00dev, &rt2x00dev->led_qual,
				   LED_TYPE_ACTIVITY);
1507
#endif /* CONFIG_RT2X00_LIB_LEDS */
1508

1509 1510 1511 1512
	/*
	 * Detect if this device has an hardware controlled radio.
	 */
	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
I
Ivo van Doorn 已提交
1513
		__set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags);
1514

1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
	/*
	 * Read the RSSI <-> dBm offset information.
	 */
	rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &eeprom);
	rt2x00dev->rssi_offset =
	    rt2x00_get_field16(eeprom, EEPROM_CALIBRATE_OFFSET_RSSI);

	return 0;
}

/*
 * RF value list for RF2522
 * Supports: 2.4 GHz
 */
static const struct rf_channel rf_vals_bg_2522[] = {
	{ 1,  0x00002050, 0x000c1fda, 0x00000101, 0 },
	{ 2,  0x00002050, 0x000c1fee, 0x00000101, 0 },
	{ 3,  0x00002050, 0x000c2002, 0x00000101, 0 },
	{ 4,  0x00002050, 0x000c2016, 0x00000101, 0 },
	{ 5,  0x00002050, 0x000c202a, 0x00000101, 0 },
	{ 6,  0x00002050, 0x000c203e, 0x00000101, 0 },
	{ 7,  0x00002050, 0x000c2052, 0x00000101, 0 },
	{ 8,  0x00002050, 0x000c2066, 0x00000101, 0 },
	{ 9,  0x00002050, 0x000c207a, 0x00000101, 0 },
	{ 10, 0x00002050, 0x000c208e, 0x00000101, 0 },
	{ 11, 0x00002050, 0x000c20a2, 0x00000101, 0 },
	{ 12, 0x00002050, 0x000c20b6, 0x00000101, 0 },
	{ 13, 0x00002050, 0x000c20ca, 0x00000101, 0 },
	{ 14, 0x00002050, 0x000c20fa, 0x00000101, 0 },
};

/*
 * RF value list for RF2523
 * Supports: 2.4 GHz
 */
static const struct rf_channel rf_vals_bg_2523[] = {
	{ 1,  0x00022010, 0x00000c9e, 0x000e0111, 0x00000a1b },
	{ 2,  0x00022010, 0x00000ca2, 0x000e0111, 0x00000a1b },
	{ 3,  0x00022010, 0x00000ca6, 0x000e0111, 0x00000a1b },
	{ 4,  0x00022010, 0x00000caa, 0x000e0111, 0x00000a1b },
	{ 5,  0x00022010, 0x00000cae, 0x000e0111, 0x00000a1b },
	{ 6,  0x00022010, 0x00000cb2, 0x000e0111, 0x00000a1b },
	{ 7,  0x00022010, 0x00000cb6, 0x000e0111, 0x00000a1b },
	{ 8,  0x00022010, 0x00000cba, 0x000e0111, 0x00000a1b },
	{ 9,  0x00022010, 0x00000cbe, 0x000e0111, 0x00000a1b },
	{ 10, 0x00022010, 0x00000d02, 0x000e0111, 0x00000a1b },
	{ 11, 0x00022010, 0x00000d06, 0x000e0111, 0x00000a1b },
	{ 12, 0x00022010, 0x00000d0a, 0x000e0111, 0x00000a1b },
	{ 13, 0x00022010, 0x00000d0e, 0x000e0111, 0x00000a1b },
	{ 14, 0x00022010, 0x00000d1a, 0x000e0111, 0x00000a03 },
};

/*
 * RF value list for RF2524
 * Supports: 2.4 GHz
 */
static const struct rf_channel rf_vals_bg_2524[] = {
	{ 1,  0x00032020, 0x00000c9e, 0x00000101, 0x00000a1b },
	{ 2,  0x00032020, 0x00000ca2, 0x00000101, 0x00000a1b },
	{ 3,  0x00032020, 0x00000ca6, 0x00000101, 0x00000a1b },
	{ 4,  0x00032020, 0x00000caa, 0x00000101, 0x00000a1b },
	{ 5,  0x00032020, 0x00000cae, 0x00000101, 0x00000a1b },
	{ 6,  0x00032020, 0x00000cb2, 0x00000101, 0x00000a1b },
	{ 7,  0x00032020, 0x00000cb6, 0x00000101, 0x00000a1b },
	{ 8,  0x00032020, 0x00000cba, 0x00000101, 0x00000a1b },
	{ 9,  0x00032020, 0x00000cbe, 0x00000101, 0x00000a1b },
	{ 10, 0x00032020, 0x00000d02, 0x00000101, 0x00000a1b },
	{ 11, 0x00032020, 0x00000d06, 0x00000101, 0x00000a1b },
	{ 12, 0x00032020, 0x00000d0a, 0x00000101, 0x00000a1b },
	{ 13, 0x00032020, 0x00000d0e, 0x00000101, 0x00000a1b },
	{ 14, 0x00032020, 0x00000d1a, 0x00000101, 0x00000a03 },
};

/*
 * RF value list for RF2525
 * Supports: 2.4 GHz
 */
static const struct rf_channel rf_vals_bg_2525[] = {
	{ 1,  0x00022020, 0x00080c9e, 0x00060111, 0x00000a1b },
	{ 2,  0x00022020, 0x00080ca2, 0x00060111, 0x00000a1b },
	{ 3,  0x00022020, 0x00080ca6, 0x00060111, 0x00000a1b },
	{ 4,  0x00022020, 0x00080caa, 0x00060111, 0x00000a1b },
	{ 5,  0x00022020, 0x00080cae, 0x00060111, 0x00000a1b },
	{ 6,  0x00022020, 0x00080cb2, 0x00060111, 0x00000a1b },
	{ 7,  0x00022020, 0x00080cb6, 0x00060111, 0x00000a1b },
	{ 8,  0x00022020, 0x00080cba, 0x00060111, 0x00000a1b },
	{ 9,  0x00022020, 0x00080cbe, 0x00060111, 0x00000a1b },
	{ 10, 0x00022020, 0x00080d02, 0x00060111, 0x00000a1b },
	{ 11, 0x00022020, 0x00080d06, 0x00060111, 0x00000a1b },
	{ 12, 0x00022020, 0x00080d0a, 0x00060111, 0x00000a1b },
	{ 13, 0x00022020, 0x00080d0e, 0x00060111, 0x00000a1b },
	{ 14, 0x00022020, 0x00080d1a, 0x00060111, 0x00000a03 },
};

/*
 * RF value list for RF2525e
 * Supports: 2.4 GHz
 */
static const struct rf_channel rf_vals_bg_2525e[] = {
	{ 1,  0x00022010, 0x0000089a, 0x00060111, 0x00000e1b },
	{ 2,  0x00022010, 0x0000089e, 0x00060111, 0x00000e07 },
	{ 3,  0x00022010, 0x0000089e, 0x00060111, 0x00000e1b },
	{ 4,  0x00022010, 0x000008a2, 0x00060111, 0x00000e07 },
	{ 5,  0x00022010, 0x000008a2, 0x00060111, 0x00000e1b },
	{ 6,  0x00022010, 0x000008a6, 0x00060111, 0x00000e07 },
	{ 7,  0x00022010, 0x000008a6, 0x00060111, 0x00000e1b },
	{ 8,  0x00022010, 0x000008aa, 0x00060111, 0x00000e07 },
	{ 9,  0x00022010, 0x000008aa, 0x00060111, 0x00000e1b },
	{ 10, 0x00022010, 0x000008ae, 0x00060111, 0x00000e07 },
	{ 11, 0x00022010, 0x000008ae, 0x00060111, 0x00000e1b },
	{ 12, 0x00022010, 0x000008b2, 0x00060111, 0x00000e07 },
	{ 13, 0x00022010, 0x000008b2, 0x00060111, 0x00000e1b },
	{ 14, 0x00022010, 0x000008b6, 0x00060111, 0x00000e23 },
};

/*
 * RF value list for RF5222
 * Supports: 2.4 GHz & 5.2 GHz
 */
static const struct rf_channel rf_vals_5222[] = {
	{ 1,  0x00022020, 0x00001136, 0x00000101, 0x00000a0b },
	{ 2,  0x00022020, 0x0000113a, 0x00000101, 0x00000a0b },
	{ 3,  0x00022020, 0x0000113e, 0x00000101, 0x00000a0b },
	{ 4,  0x00022020, 0x00001182, 0x00000101, 0x00000a0b },
	{ 5,  0x00022020, 0x00001186, 0x00000101, 0x00000a0b },
	{ 6,  0x00022020, 0x0000118a, 0x00000101, 0x00000a0b },
	{ 7,  0x00022020, 0x0000118e, 0x00000101, 0x00000a0b },
	{ 8,  0x00022020, 0x00001192, 0x00000101, 0x00000a0b },
	{ 9,  0x00022020, 0x00001196, 0x00000101, 0x00000a0b },
	{ 10, 0x00022020, 0x0000119a, 0x00000101, 0x00000a0b },
	{ 11, 0x00022020, 0x0000119e, 0x00000101, 0x00000a0b },
	{ 12, 0x00022020, 0x000011a2, 0x00000101, 0x00000a0b },
	{ 13, 0x00022020, 0x000011a6, 0x00000101, 0x00000a0b },
	{ 14, 0x00022020, 0x000011ae, 0x00000101, 0x00000a1b },

	/* 802.11 UNI / HyperLan 2 */
	{ 36, 0x00022010, 0x00018896, 0x00000101, 0x00000a1f },
	{ 40, 0x00022010, 0x0001889a, 0x00000101, 0x00000a1f },
	{ 44, 0x00022010, 0x0001889e, 0x00000101, 0x00000a1f },
	{ 48, 0x00022010, 0x000188a2, 0x00000101, 0x00000a1f },
	{ 52, 0x00022010, 0x000188a6, 0x00000101, 0x00000a1f },
	{ 66, 0x00022010, 0x000188aa, 0x00000101, 0x00000a1f },
	{ 60, 0x00022010, 0x000188ae, 0x00000101, 0x00000a1f },
	{ 64, 0x00022010, 0x000188b2, 0x00000101, 0x00000a1f },

	/* 802.11 HyperLan 2 */
	{ 100, 0x00022010, 0x00008802, 0x00000101, 0x00000a0f },
	{ 104, 0x00022010, 0x00008806, 0x00000101, 0x00000a0f },
	{ 108, 0x00022010, 0x0000880a, 0x00000101, 0x00000a0f },
	{ 112, 0x00022010, 0x0000880e, 0x00000101, 0x00000a0f },
	{ 116, 0x00022010, 0x00008812, 0x00000101, 0x00000a0f },
	{ 120, 0x00022010, 0x00008816, 0x00000101, 0x00000a0f },
	{ 124, 0x00022010, 0x0000881a, 0x00000101, 0x00000a0f },
	{ 128, 0x00022010, 0x0000881e, 0x00000101, 0x00000a0f },
	{ 132, 0x00022010, 0x00008822, 0x00000101, 0x00000a0f },
	{ 136, 0x00022010, 0x00008826, 0x00000101, 0x00000a0f },

	/* 802.11 UNII */
	{ 140, 0x00022010, 0x0000882a, 0x00000101, 0x00000a0f },
	{ 149, 0x00022020, 0x000090a6, 0x00000101, 0x00000a07 },
	{ 153, 0x00022020, 0x000090ae, 0x00000101, 0x00000a07 },
	{ 157, 0x00022020, 0x000090b6, 0x00000101, 0x00000a07 },
	{ 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 },
};

1680
static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
1681 1682
{
	struct hw_mode_spec *spec = &rt2x00dev->spec;
1683 1684
	struct channel_info *info;
	char *tx_power;
1685 1686 1687 1688
	unsigned int i;

	/*
	 * Initialize all hw fields.
1689 1690 1691 1692 1693 1694
	 *
	 * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING unless we are
	 * capable of sending the buffered frames out after the DTIM
	 * transmission using rt2x00lib_beacondone. This will send out
	 * multicast and broadcast traffic immediately instead of buffering it
	 * infinitly and thus dropping it after some time.
1695
	 */
1696 1697 1698 1699
	ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK);
	ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS);
	ieee80211_hw_set(rt2x00dev->hw, RX_INCLUDES_FCS);
	ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM);
1700

1701 1702 1703 1704 1705
	/*
	 * Disable powersaving as default.
	 */
	rt2x00dev->hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;

1706
	SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
1707 1708 1709 1710 1711 1712 1713
	SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
				rt2x00_eeprom_addr(rt2x00dev,
						   EEPROM_MAC_ADDR_0));

	/*
	 * Initialize hw_mode information.
	 */
1714 1715
	spec->supported_bands = SUPPORT_BAND_2GHZ;
	spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
1716

1717
	if (rt2x00_rf(rt2x00dev, RF2522)) {
1718 1719
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);
		spec->channels = rf_vals_bg_2522;
1720
	} else if (rt2x00_rf(rt2x00dev, RF2523)) {
1721 1722
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523);
		spec->channels = rf_vals_bg_2523;
1723
	} else if (rt2x00_rf(rt2x00dev, RF2524)) {
1724 1725
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524);
		spec->channels = rf_vals_bg_2524;
1726
	} else if (rt2x00_rf(rt2x00dev, RF2525)) {
1727 1728
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525);
		spec->channels = rf_vals_bg_2525;
1729
	} else if (rt2x00_rf(rt2x00dev, RF2525E)) {
1730 1731
		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
		spec->channels = rf_vals_bg_2525e;
1732
	} else if (rt2x00_rf(rt2x00dev, RF5222)) {
1733
		spec->supported_bands |= SUPPORT_BAND_5GHZ;
1734 1735 1736
		spec->num_channels = ARRAY_SIZE(rf_vals_5222);
		spec->channels = rf_vals_5222;
	}
1737 1738 1739 1740

	/*
	 * Create channel information array
	 */
1741
	info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
1742 1743 1744 1745 1746 1747
	if (!info)
		return -ENOMEM;

	spec->channels_info = info;

	tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
1748 1749 1750 1751
	for (i = 0; i < 14; i++) {
		info[i].max_power = MAX_TXPOWER;
		info[i].default_power1 = TXPOWER_FROM_DEV(tx_power[i]);
	}
1752 1753

	if (spec->num_channels > 14) {
1754 1755 1756 1757
		for (i = 14; i < spec->num_channels; i++) {
			info[i].max_power = MAX_TXPOWER;
			info[i].default_power1 = DEFAULT_TXPOWER;
		}
1758 1759 1760
	}

	return 0;
1761 1762 1763 1764 1765
}

static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
{
	int retval;
1766
	u16 reg;
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778

	/*
	 * Allocate eeprom data.
	 */
	retval = rt2500usb_validate_eeprom(rt2x00dev);
	if (retval)
		return retval;

	retval = rt2500usb_init_eeprom(rt2x00dev);
	if (retval)
		return retval;

1779 1780 1781 1782
	/*
	 * Enable rfkill polling by setting GPIO direction of the
	 * rfkill switch GPIO pin correctly.
	 */
1783
	reg = rt2500usb_register_read(rt2x00dev, MAC_CSR19);
1784
	rt2x00_set_field16(&reg, MAC_CSR19_DIR0, 0);
1785 1786
	rt2500usb_register_write(rt2x00dev, MAC_CSR19, reg);

1787 1788 1789
	/*
	 * Initialize hw specifications.
	 */
1790 1791 1792
	retval = rt2500usb_probe_hw_mode(rt2x00dev);
	if (retval)
		return retval;
1793 1794

	/*
I
Ivo van Doorn 已提交
1795
	 * This device requires the atim queue
1796
	 */
I
Ivo van Doorn 已提交
1797 1798
	__set_bit(REQUIRE_ATIM_QUEUE, &rt2x00dev->cap_flags);
	__set_bit(REQUIRE_BEACON_GUARD, &rt2x00dev->cap_flags);
1799
	if (!modparam_nohwcrypt) {
I
Ivo van Doorn 已提交
1800 1801
		__set_bit(CAPABILITY_HW_CRYPTO, &rt2x00dev->cap_flags);
		__set_bit(REQUIRE_COPY_IV, &rt2x00dev->cap_flags);
1802
	}
I
Ivo van Doorn 已提交
1803
	__set_bit(REQUIRE_SW_SEQNO, &rt2x00dev->cap_flags);
1804
	__set_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags);
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815

	/*
	 * Set the rssi offset.
	 */
	rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;

	return 0;
}

static const struct ieee80211_ops rt2500usb_mac80211_ops = {
	.tx			= rt2x00mac_tx,
1816 1817
	.start			= rt2x00mac_start,
	.stop			= rt2x00mac_stop,
1818 1819 1820
	.add_interface		= rt2x00mac_add_interface,
	.remove_interface	= rt2x00mac_remove_interface,
	.config			= rt2x00mac_config,
I
Ivo van Doorn 已提交
1821
	.configure_filter	= rt2x00mac_configure_filter,
1822
	.set_tim		= rt2x00mac_set_tim,
1823
	.set_key		= rt2x00mac_set_key,
1824 1825
	.sw_scan_start		= rt2x00mac_sw_scan_start,
	.sw_scan_complete	= rt2x00mac_sw_scan_complete,
1826
	.get_stats		= rt2x00mac_get_stats,
1827
	.bss_info_changed	= rt2x00mac_bss_info_changed,
1828
	.conf_tx		= rt2x00mac_conf_tx,
1829
	.rfkill_poll		= rt2x00mac_rfkill_poll,
I
Ivo van Doorn 已提交
1830
	.flush			= rt2x00mac_flush,
1831 1832
	.set_antenna		= rt2x00mac_set_antenna,
	.get_antenna		= rt2x00mac_get_antenna,
1833
	.get_ringparam		= rt2x00mac_get_ringparam,
1834
	.tx_frames_pending	= rt2x00mac_tx_frames_pending,
1835 1836 1837 1838 1839 1840
};

static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
	.probe_hw		= rt2500usb_probe_hw,
	.initialize		= rt2x00usb_initialize,
	.uninitialize		= rt2x00usb_uninitialize,
1841
	.clear_entry		= rt2x00usb_clear_entry,
1842
	.set_device_state	= rt2500usb_set_device_state,
1843
	.rfkill_poll		= rt2500usb_rfkill_poll,
1844 1845
	.link_stats		= rt2500usb_link_stats,
	.reset_tuner		= rt2500usb_reset_tuner,
1846
	.watchdog		= rt2x00usb_watchdog,
1847 1848 1849
	.start_queue		= rt2500usb_start_queue,
	.kick_queue		= rt2x00usb_kick_queue,
	.stop_queue		= rt2500usb_stop_queue,
I
Ivo van Doorn 已提交
1850
	.flush_queue		= rt2x00usb_flush_queue,
1851
	.write_tx_desc		= rt2500usb_write_tx_desc,
1852
	.write_beacon		= rt2500usb_write_beacon,
1853
	.get_tx_data_len	= rt2500usb_get_tx_data_len,
1854
	.fill_rxdone		= rt2500usb_fill_rxdone,
1855 1856
	.config_shared_key	= rt2500usb_config_key,
	.config_pairwise_key	= rt2500usb_config_key,
I
Ivo van Doorn 已提交
1857
	.config_filter		= rt2500usb_config_filter,
1858
	.config_intf		= rt2500usb_config_intf,
1859
	.config_erp		= rt2500usb_config_erp,
1860
	.config_ant		= rt2500usb_config_ant,
1861 1862 1863
	.config			= rt2500usb_config,
};

1864 1865 1866 1867 1868 1869 1870 1871 1872
static void rt2500usb_queue_init(struct data_queue *queue)
{
	switch (queue->qid) {
	case QID_RX:
		queue->limit = 32;
		queue->data_size = DATA_FRAME_SIZE;
		queue->desc_size = RXD_DESC_SIZE;
		queue->priv_size = sizeof(struct queue_entry_priv_usb);
		break;
I
Ivo van Doorn 已提交
1873

1874 1875 1876 1877 1878 1879 1880 1881 1882
	case QID_AC_VO:
	case QID_AC_VI:
	case QID_AC_BE:
	case QID_AC_BK:
		queue->limit = 32;
		queue->data_size = DATA_FRAME_SIZE;
		queue->desc_size = TXD_DESC_SIZE;
		queue->priv_size = sizeof(struct queue_entry_priv_usb);
		break;
I
Ivo van Doorn 已提交
1883

1884 1885 1886 1887 1888 1889
	case QID_BEACON:
		queue->limit = 1;
		queue->data_size = MGMT_FRAME_SIZE;
		queue->desc_size = TXD_DESC_SIZE;
		queue->priv_size = sizeof(struct queue_entry_priv_usb_bcn);
		break;
I
Ivo van Doorn 已提交
1890

1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
	case QID_ATIM:
		queue->limit = 8;
		queue->data_size = DATA_FRAME_SIZE;
		queue->desc_size = TXD_DESC_SIZE;
		queue->priv_size = sizeof(struct queue_entry_priv_usb);
		break;

	default:
		BUG();
		break;
	}
}
I
Ivo van Doorn 已提交
1903

1904
static const struct rt2x00_ops rt2500usb_ops = {
G
Gertjan van Wingerde 已提交
1905 1906 1907 1908 1909
	.name			= KBUILD_MODNAME,
	.max_ap_intf		= 1,
	.eeprom_size		= EEPROM_SIZE,
	.rf_size		= RF_SIZE,
	.tx_queues		= NUM_TX_QUEUES,
1910
	.queue_init		= rt2500usb_queue_init,
G
Gertjan van Wingerde 已提交
1911 1912
	.lib			= &rt2500usb_rt2x00_ops,
	.hw			= &rt2500usb_mac80211_ops,
1913
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
G
Gertjan van Wingerde 已提交
1914
	.debugfs		= &rt2500usb_rt2x00debug,
1915 1916 1917 1918 1919 1920 1921 1922
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
};

/*
 * rt2500usb module information.
 */
static struct usb_device_id rt2500usb_device_table[] = {
	/* ASUS */
1923 1924
	{ USB_DEVICE(0x0b05, 0x1706) },
	{ USB_DEVICE(0x0b05, 0x1707) },
1925
	/* Belkin */
1926
	{ USB_DEVICE(0x050d, 0x7050) },	/* FCC ID: K7SF5D7050A ver. 2.x */
1927
	{ USB_DEVICE(0x050d, 0x7051) },
1928
	/* Cisco Systems */
1929 1930 1931
	{ USB_DEVICE(0x13b1, 0x000d) },
	{ USB_DEVICE(0x13b1, 0x0011) },
	{ USB_DEVICE(0x13b1, 0x001a) },
1932
	/* Conceptronic */
1933
	{ USB_DEVICE(0x14b2, 0x3c02) },
1934
	/* D-LINK */
1935
	{ USB_DEVICE(0x2001, 0x3c00) },
1936
	/* Gigabyte */
1937 1938
	{ USB_DEVICE(0x1044, 0x8001) },
	{ USB_DEVICE(0x1044, 0x8007) },
1939
	/* Hercules */
1940
	{ USB_DEVICE(0x06f8, 0xe000) },
1941
	/* Melco */
1942 1943 1944 1945 1946
	{ USB_DEVICE(0x0411, 0x005e) },
	{ USB_DEVICE(0x0411, 0x0066) },
	{ USB_DEVICE(0x0411, 0x0067) },
	{ USB_DEVICE(0x0411, 0x008b) },
	{ USB_DEVICE(0x0411, 0x0097) },
1947
	/* MSI */
1948 1949 1950
	{ USB_DEVICE(0x0db0, 0x6861) },
	{ USB_DEVICE(0x0db0, 0x6865) },
	{ USB_DEVICE(0x0db0, 0x6869) },
1951
	/* Ralink */
1952 1953 1954
	{ USB_DEVICE(0x148f, 0x1706) },
	{ USB_DEVICE(0x148f, 0x2570) },
	{ USB_DEVICE(0x148f, 0x9020) },
1955
	/* Sagem */
1956
	{ USB_DEVICE(0x079b, 0x004b) },
1957
	/* Siemens */
1958
	{ USB_DEVICE(0x0681, 0x3c06) },
1959
	/* SMC */
1960
	{ USB_DEVICE(0x0707, 0xee13) },
1961
	/* Spairon */
1962
	{ USB_DEVICE(0x114b, 0x0110) },
1963
	/* SURECOM */
1964
	{ USB_DEVICE(0x0769, 0x11f3) },
1965
	/* Trust */
1966
	{ USB_DEVICE(0x0eb0, 0x9020) },
1967
	/* VTech */
1968
	{ USB_DEVICE(0x0f88, 0x3012) },
1969
	/* Zinwell */
1970
	{ USB_DEVICE(0x5a57, 0x0260) },
1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
	{ 0, }
};

MODULE_AUTHOR(DRV_PROJECT);
MODULE_VERSION(DRV_VERSION);
MODULE_DESCRIPTION("Ralink RT2500 USB Wireless LAN driver.");
MODULE_SUPPORTED_DEVICE("Ralink RT2570 USB chipset based cards");
MODULE_DEVICE_TABLE(usb, rt2500usb_device_table);
MODULE_LICENSE("GPL");

1981 1982 1983 1984 1985 1986
static int rt2500usb_probe(struct usb_interface *usb_intf,
			   const struct usb_device_id *id)
{
	return rt2x00usb_probe(usb_intf, &rt2500usb_ops);
}

1987
static struct usb_driver rt2500usb_driver = {
1988
	.name		= KBUILD_MODNAME,
1989
	.id_table	= rt2500usb_device_table,
1990
	.probe		= rt2500usb_probe,
1991 1992 1993
	.disconnect	= rt2x00usb_disconnect,
	.suspend	= rt2x00usb_suspend,
	.resume		= rt2x00usb_resume,
S
Stanislaw Gruszka 已提交
1994
	.reset_resume	= rt2x00usb_resume,
1995
	.disable_hub_initiated_lpm = 1,
1996 1997
};

1998
module_usb_driver(rt2500usb_driver);