diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 541 |
1 files changed, 3 insertions, 538 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 365f66fe7c68..f5b864b1a55d 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -230,541 +230,6 @@ static int rt2800usb_load_firmware(struct rt2x00_dev *rt2x00dev, | |||
230 | } | 230 | } |
231 | 231 | ||
232 | /* | 232 | /* |
233 | * Initialization functions. | ||
234 | */ | ||
235 | static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev) | ||
236 | { | ||
237 | u32 reg; | ||
238 | unsigned int i; | ||
239 | |||
240 | if (rt2x00_intf_is_usb(rt2x00dev)) { | ||
241 | /* | ||
242 | * Wait untill BBP and RF are ready. | ||
243 | */ | ||
244 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
245 | rt2800_register_read(rt2x00dev, MAC_CSR0, ®); | ||
246 | if (reg && reg != ~0) | ||
247 | break; | ||
248 | msleep(1); | ||
249 | } | ||
250 | |||
251 | if (i == REGISTER_BUSY_COUNT) { | ||
252 | ERROR(rt2x00dev, "Unstable hardware.\n"); | ||
253 | return -EBUSY; | ||
254 | } | ||
255 | |||
256 | rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, ®); | ||
257 | rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, | ||
258 | reg & ~0x00002000); | ||
259 | } | ||
260 | |||
261 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); | ||
262 | rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1); | ||
263 | rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1); | ||
264 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | ||
265 | |||
266 | if (rt2x00_intf_is_usb(rt2x00dev)) { | ||
267 | rt2800_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000); | ||
268 | |||
269 | rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, | ||
270 | USB_MODE_RESET, REGISTER_TIMEOUT); | ||
271 | } | ||
272 | |||
273 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); | ||
274 | |||
275 | rt2800_register_read(rt2x00dev, BCN_OFFSET0, ®); | ||
276 | rt2x00_set_field32(®, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */ | ||
277 | rt2x00_set_field32(®, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */ | ||
278 | rt2x00_set_field32(®, BCN_OFFSET0_BCN2, 0xf0); /* 0x3c00 */ | ||
279 | rt2x00_set_field32(®, BCN_OFFSET0_BCN3, 0xf8); /* 0x3e00 */ | ||
280 | rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg); | ||
281 | |||
282 | rt2800_register_read(rt2x00dev, BCN_OFFSET1, ®); | ||
283 | rt2x00_set_field32(®, BCN_OFFSET1_BCN4, 0xc8); /* 0x3200 */ | ||
284 | rt2x00_set_field32(®, BCN_OFFSET1_BCN5, 0xd0); /* 0x3400 */ | ||
285 | rt2x00_set_field32(®, BCN_OFFSET1_BCN6, 0x77); /* 0x1dc0 */ | ||
286 | rt2x00_set_field32(®, BCN_OFFSET1_BCN7, 0x6f); /* 0x1bc0 */ | ||
287 | rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg); | ||
288 | |||
289 | rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f); | ||
290 | rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003); | ||
291 | |||
292 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); | ||
293 | |||
294 | rt2800_register_read(rt2x00dev, BCN_TIME_CFG, ®); | ||
295 | rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_INTERVAL, 0); | ||
296 | rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 0); | ||
297 | rt2x00_set_field32(®, BCN_TIME_CFG_TSF_SYNC, 0); | ||
298 | rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 0); | ||
299 | rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 0); | ||
300 | rt2x00_set_field32(®, BCN_TIME_CFG_TX_TIME_COMPENSATE, 0); | ||
301 | rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); | ||
302 | |||
303 | if (rt2x00_intf_is_usb(rt2x00dev) && | ||
304 | rt2x00_rev(&rt2x00dev->chip) == RT3070_VERSION) { | ||
305 | rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); | ||
306 | rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); | ||
307 | rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); | ||
308 | } else { | ||
309 | rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000); | ||
310 | rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); | ||
311 | } | ||
312 | |||
313 | rt2800_register_read(rt2x00dev, TX_LINK_CFG, ®); | ||
314 | rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFB_LIFETIME, 32); | ||
315 | rt2x00_set_field32(®, TX_LINK_CFG_MFB_ENABLE, 0); | ||
316 | rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_UMFS_ENABLE, 0); | ||
317 | rt2x00_set_field32(®, TX_LINK_CFG_TX_MRQ_EN, 0); | ||
318 | rt2x00_set_field32(®, TX_LINK_CFG_TX_RDG_EN, 0); | ||
319 | rt2x00_set_field32(®, TX_LINK_CFG_TX_CF_ACK_EN, 1); | ||
320 | rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFB, 0); | ||
321 | rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFS, 0); | ||
322 | rt2800_register_write(rt2x00dev, TX_LINK_CFG, reg); | ||
323 | |||
324 | rt2800_register_read(rt2x00dev, TX_TIMEOUT_CFG, ®); | ||
325 | rt2x00_set_field32(®, TX_TIMEOUT_CFG_MPDU_LIFETIME, 9); | ||
326 | rt2x00_set_field32(®, TX_TIMEOUT_CFG_TX_OP_TIMEOUT, 10); | ||
327 | rt2800_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg); | ||
328 | |||
329 | rt2800_register_read(rt2x00dev, MAX_LEN_CFG, ®); | ||
330 | rt2x00_set_field32(®, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE); | ||
331 | if (rt2x00_rev(&rt2x00dev->chip) >= RT2880E_VERSION && | ||
332 | rt2x00_rev(&rt2x00dev->chip) < RT3070_VERSION) | ||
333 | rt2x00_set_field32(®, MAX_LEN_CFG_MAX_PSDU, 2); | ||
334 | else | ||
335 | rt2x00_set_field32(®, MAX_LEN_CFG_MAX_PSDU, 1); | ||
336 | rt2x00_set_field32(®, MAX_LEN_CFG_MIN_PSDU, 0); | ||
337 | rt2x00_set_field32(®, MAX_LEN_CFG_MIN_MPDU, 0); | ||
338 | rt2800_register_write(rt2x00dev, MAX_LEN_CFG, reg); | ||
339 | |||
340 | rt2800_register_write(rt2x00dev, PBF_MAX_PCNT, 0x1f3fbf9f); | ||
341 | |||
342 | rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, ®); | ||
343 | rt2x00_set_field32(®, AUTO_RSP_CFG_AUTORESPONDER, 1); | ||
344 | rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MMODE, 0); | ||
345 | rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MREF, 0); | ||
346 | rt2x00_set_field32(®, AUTO_RSP_CFG_DUAL_CTS_EN, 0); | ||
347 | rt2x00_set_field32(®, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0); | ||
348 | rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg); | ||
349 | |||
350 | rt2800_register_read(rt2x00dev, CCK_PROT_CFG, ®); | ||
351 | rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_RATE, 8); | ||
352 | rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_CTRL, 0); | ||
353 | rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_NAV, 1); | ||
354 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
355 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
356 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
357 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 1); | ||
358 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
359 | rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 1); | ||
360 | rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg); | ||
361 | |||
362 | rt2800_register_read(rt2x00dev, OFDM_PROT_CFG, ®); | ||
363 | rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_RATE, 8); | ||
364 | rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_CTRL, 0); | ||
365 | rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_NAV, 1); | ||
366 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
367 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
368 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
369 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 1); | ||
370 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
371 | rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 1); | ||
372 | rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg); | ||
373 | |||
374 | rt2800_register_read(rt2x00dev, MM20_PROT_CFG, ®); | ||
375 | rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_RATE, 0x4004); | ||
376 | rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_CTRL, 0); | ||
377 | rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_NAV, 1); | ||
378 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
379 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
380 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
381 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0); | ||
382 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
383 | rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_GF40, 0); | ||
384 | rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg); | ||
385 | |||
386 | rt2800_register_read(rt2x00dev, MM40_PROT_CFG, ®); | ||
387 | rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_RATE, 0x4084); | ||
388 | rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_CTRL, 0); | ||
389 | rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_NAV, 1); | ||
390 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
391 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
392 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
393 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1); | ||
394 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
395 | rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_GF40, 1); | ||
396 | rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg); | ||
397 | |||
398 | rt2800_register_read(rt2x00dev, GF20_PROT_CFG, ®); | ||
399 | rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_RATE, 0x4004); | ||
400 | rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_CTRL, 0); | ||
401 | rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_NAV, 1); | ||
402 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
403 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
404 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
405 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0); | ||
406 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
407 | rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_GF40, 0); | ||
408 | rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg); | ||
409 | |||
410 | rt2800_register_read(rt2x00dev, GF40_PROT_CFG, ®); | ||
411 | rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_RATE, 0x4084); | ||
412 | rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_CTRL, 0); | ||
413 | rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_NAV, 1); | ||
414 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 1); | ||
415 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1); | ||
416 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1); | ||
417 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1); | ||
418 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_GF20, 1); | ||
419 | rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_GF40, 1); | ||
420 | rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg); | ||
421 | |||
422 | if (rt2x00_intf_is_usb(rt2x00dev)) { | ||
423 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); | ||
424 | |||
425 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); | ||
426 | rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0); | ||
427 | rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_DMA_BUSY, 0); | ||
428 | rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0); | ||
429 | rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_DMA_BUSY, 0); | ||
430 | rt2x00_set_field32(®, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 3); | ||
431 | rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 0); | ||
432 | rt2x00_set_field32(®, WPDMA_GLO_CFG_BIG_ENDIAN, 0); | ||
433 | rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_HDR_SCATTER, 0); | ||
434 | rt2x00_set_field32(®, WPDMA_GLO_CFG_HDR_SEG_LEN, 0); | ||
435 | rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); | ||
436 | } | ||
437 | |||
438 | rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, 0x0000583f); | ||
439 | rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, 0x00000002); | ||
440 | |||
441 | rt2800_register_read(rt2x00dev, TX_RTS_CFG, ®); | ||
442 | rt2x00_set_field32(®, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 32); | ||
443 | rt2x00_set_field32(®, TX_RTS_CFG_RTS_THRES, | ||
444 | IEEE80211_MAX_RTS_THRESHOLD); | ||
445 | rt2x00_set_field32(®, TX_RTS_CFG_RTS_FBK_EN, 0); | ||
446 | rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg); | ||
447 | |||
448 | rt2800_register_write(rt2x00dev, EXP_ACK_TIME, 0x002400ca); | ||
449 | rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); | ||
450 | |||
451 | /* | ||
452 | * ASIC will keep garbage value after boot, clear encryption keys. | ||
453 | */ | ||
454 | for (i = 0; i < 4; i++) | ||
455 | rt2800_register_write(rt2x00dev, | ||
456 | SHARED_KEY_MODE_ENTRY(i), 0); | ||
457 | |||
458 | for (i = 0; i < 256; i++) { | ||
459 | u32 wcid[2] = { 0xffffffff, 0x00ffffff }; | ||
460 | rt2800_register_multiwrite(rt2x00dev, MAC_WCID_ENTRY(i), | ||
461 | wcid, sizeof(wcid)); | ||
462 | |||
463 | rt2800_register_write(rt2x00dev, MAC_WCID_ATTR_ENTRY(i), 1); | ||
464 | rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0); | ||
465 | } | ||
466 | |||
467 | /* | ||
468 | * Clear all beacons | ||
469 | * For the Beacon base registers we only need to clear | ||
470 | * the first byte since that byte contains the VALID and OWNER | ||
471 | * bits which (when set to 0) will invalidate the entire beacon. | ||
472 | */ | ||
473 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE0, 0); | ||
474 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE1, 0); | ||
475 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE2, 0); | ||
476 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE3, 0); | ||
477 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE4, 0); | ||
478 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE5, 0); | ||
479 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE6, 0); | ||
480 | rt2800_register_write(rt2x00dev, HW_BEACON_BASE7, 0); | ||
481 | |||
482 | if (rt2x00_intf_is_usb(rt2x00dev)) { | ||
483 | rt2800_register_read(rt2x00dev, USB_CYC_CFG, ®); | ||
484 | rt2x00_set_field32(®, USB_CYC_CFG_CLOCK_CYCLE, 30); | ||
485 | rt2800_register_write(rt2x00dev, USB_CYC_CFG, reg); | ||
486 | } | ||
487 | |||
488 | rt2800_register_read(rt2x00dev, HT_FBK_CFG0, ®); | ||
489 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS0FBK, 0); | ||
490 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS1FBK, 0); | ||
491 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS2FBK, 1); | ||
492 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS3FBK, 2); | ||
493 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS4FBK, 3); | ||
494 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS5FBK, 4); | ||
495 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS6FBK, 5); | ||
496 | rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS7FBK, 6); | ||
497 | rt2800_register_write(rt2x00dev, HT_FBK_CFG0, reg); | ||
498 | |||
499 | rt2800_register_read(rt2x00dev, HT_FBK_CFG1, ®); | ||
500 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS8FBK, 8); | ||
501 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS9FBK, 8); | ||
502 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS10FBK, 9); | ||
503 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS11FBK, 10); | ||
504 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS12FBK, 11); | ||
505 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS13FBK, 12); | ||
506 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS14FBK, 13); | ||
507 | rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS15FBK, 14); | ||
508 | rt2800_register_write(rt2x00dev, HT_FBK_CFG1, reg); | ||
509 | |||
510 | rt2800_register_read(rt2x00dev, LG_FBK_CFG0, ®); | ||
511 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS0FBK, 8); | ||
512 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS1FBK, 8); | ||
513 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS2FBK, 9); | ||
514 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS3FBK, 10); | ||
515 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS4FBK, 11); | ||
516 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS5FBK, 12); | ||
517 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS6FBK, 13); | ||
518 | rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS7FBK, 14); | ||
519 | rt2800_register_write(rt2x00dev, LG_FBK_CFG0, reg); | ||
520 | |||
521 | rt2800_register_read(rt2x00dev, LG_FBK_CFG1, ®); | ||
522 | rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS0FBK, 0); | ||
523 | rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS1FBK, 0); | ||
524 | rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS2FBK, 1); | ||
525 | rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS3FBK, 2); | ||
526 | rt2800_register_write(rt2x00dev, LG_FBK_CFG1, reg); | ||
527 | |||
528 | /* | ||
529 | * We must clear the error counters. | ||
530 | * These registers are cleared on read, | ||
531 | * so we may pass a useless variable to store the value. | ||
532 | */ | ||
533 | rt2800_register_read(rt2x00dev, RX_STA_CNT0, ®); | ||
534 | rt2800_register_read(rt2x00dev, RX_STA_CNT1, ®); | ||
535 | rt2800_register_read(rt2x00dev, RX_STA_CNT2, ®); | ||
536 | rt2800_register_read(rt2x00dev, TX_STA_CNT0, ®); | ||
537 | rt2800_register_read(rt2x00dev, TX_STA_CNT1, ®); | ||
538 | rt2800_register_read(rt2x00dev, TX_STA_CNT2, ®); | ||
539 | |||
540 | return 0; | ||
541 | } | ||
542 | |||
543 | static int rt2800usb_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev) | ||
544 | { | ||
545 | unsigned int i; | ||
546 | u32 reg; | ||
547 | |||
548 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
549 | rt2800_register_read(rt2x00dev, MAC_STATUS_CFG, ®); | ||
550 | if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY)) | ||
551 | return 0; | ||
552 | |||
553 | udelay(REGISTER_BUSY_DELAY); | ||
554 | } | ||
555 | |||
556 | ERROR(rt2x00dev, "BBP/RF register access failed, aborting.\n"); | ||
557 | return -EACCES; | ||
558 | } | ||
559 | |||
560 | static int rt2800usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev) | ||
561 | { | ||
562 | unsigned int i; | ||
563 | u8 value; | ||
564 | |||
565 | /* | ||
566 | * BBP was enabled after firmware was loaded, | ||
567 | * but we need to reactivate it now. | ||
568 | */ | ||
569 | rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); | ||
570 | rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); | ||
571 | msleep(1); | ||
572 | |||
573 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
574 | rt2800_bbp_read(rt2x00dev, 0, &value); | ||
575 | if ((value != 0xff) && (value != 0x00)) | ||
576 | return 0; | ||
577 | udelay(REGISTER_BUSY_DELAY); | ||
578 | } | ||
579 | |||
580 | ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); | ||
581 | return -EACCES; | ||
582 | } | ||
583 | |||
584 | static int rt2800usb_init_bbp(struct rt2x00_dev *rt2x00dev) | ||
585 | { | ||
586 | unsigned int i; | ||
587 | u16 eeprom; | ||
588 | u8 reg_id; | ||
589 | u8 value; | ||
590 | |||
591 | if (unlikely(rt2800usb_wait_bbp_rf_ready(rt2x00dev) || | ||
592 | rt2800usb_wait_bbp_ready(rt2x00dev))) | ||
593 | return -EACCES; | ||
594 | |||
595 | rt2800_bbp_write(rt2x00dev, 65, 0x2c); | ||
596 | rt2800_bbp_write(rt2x00dev, 66, 0x38); | ||
597 | rt2800_bbp_write(rt2x00dev, 69, 0x12); | ||
598 | rt2800_bbp_write(rt2x00dev, 70, 0x0a); | ||
599 | rt2800_bbp_write(rt2x00dev, 73, 0x10); | ||
600 | rt2800_bbp_write(rt2x00dev, 81, 0x37); | ||
601 | rt2800_bbp_write(rt2x00dev, 82, 0x62); | ||
602 | rt2800_bbp_write(rt2x00dev, 83, 0x6a); | ||
603 | rt2800_bbp_write(rt2x00dev, 84, 0x99); | ||
604 | rt2800_bbp_write(rt2x00dev, 86, 0x00); | ||
605 | rt2800_bbp_write(rt2x00dev, 91, 0x04); | ||
606 | rt2800_bbp_write(rt2x00dev, 92, 0x00); | ||
607 | rt2800_bbp_write(rt2x00dev, 103, 0x00); | ||
608 | rt2800_bbp_write(rt2x00dev, 105, 0x05); | ||
609 | |||
610 | if (rt2x00_rev(&rt2x00dev->chip) == RT2860C_VERSION) { | ||
611 | rt2800_bbp_write(rt2x00dev, 69, 0x16); | ||
612 | rt2800_bbp_write(rt2x00dev, 73, 0x12); | ||
613 | } | ||
614 | |||
615 | if (rt2x00_rev(&rt2x00dev->chip) > RT2860D_VERSION) | ||
616 | rt2800_bbp_write(rt2x00dev, 84, 0x19); | ||
617 | |||
618 | if (rt2x00_intf_is_usb(rt2x00dev) && | ||
619 | rt2x00_rev(&rt2x00dev->chip) == RT3070_VERSION) { | ||
620 | rt2800_bbp_write(rt2x00dev, 70, 0x0a); | ||
621 | rt2800_bbp_write(rt2x00dev, 84, 0x99); | ||
622 | rt2800_bbp_write(rt2x00dev, 105, 0x05); | ||
623 | } | ||
624 | |||
625 | for (i = 0; i < EEPROM_BBP_SIZE; i++) { | ||
626 | rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom); | ||
627 | |||
628 | if (eeprom != 0xffff && eeprom != 0x0000) { | ||
629 | reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID); | ||
630 | value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE); | ||
631 | rt2800_bbp_write(rt2x00dev, reg_id, value); | ||
632 | } | ||
633 | } | ||
634 | |||
635 | return 0; | ||
636 | } | ||
637 | |||
638 | static u8 rt2800usb_init_rx_filter(struct rt2x00_dev *rt2x00dev, | ||
639 | bool bw40, u8 rfcsr24, u8 filter_target) | ||
640 | { | ||
641 | unsigned int i; | ||
642 | u8 bbp; | ||
643 | u8 rfcsr; | ||
644 | u8 passband; | ||
645 | u8 stopband; | ||
646 | u8 overtuned = 0; | ||
647 | |||
648 | rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); | ||
649 | |||
650 | rt2800_bbp_read(rt2x00dev, 4, &bbp); | ||
651 | rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * bw40); | ||
652 | rt2800_bbp_write(rt2x00dev, 4, bbp); | ||
653 | |||
654 | rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); | ||
655 | rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 1); | ||
656 | rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); | ||
657 | |||
658 | /* | ||
659 | * Set power & frequency of passband test tone | ||
660 | */ | ||
661 | rt2800_bbp_write(rt2x00dev, 24, 0); | ||
662 | |||
663 | for (i = 0; i < 100; i++) { | ||
664 | rt2800_bbp_write(rt2x00dev, 25, 0x90); | ||
665 | msleep(1); | ||
666 | |||
667 | rt2800_bbp_read(rt2x00dev, 55, &passband); | ||
668 | if (passband) | ||
669 | break; | ||
670 | } | ||
671 | |||
672 | /* | ||
673 | * Set power & frequency of stopband test tone | ||
674 | */ | ||
675 | rt2800_bbp_write(rt2x00dev, 24, 0x06); | ||
676 | |||
677 | for (i = 0; i < 100; i++) { | ||
678 | rt2800_bbp_write(rt2x00dev, 25, 0x90); | ||
679 | msleep(1); | ||
680 | |||
681 | rt2800_bbp_read(rt2x00dev, 55, &stopband); | ||
682 | |||
683 | if ((passband - stopband) <= filter_target) { | ||
684 | rfcsr24++; | ||
685 | overtuned += ((passband - stopband) == filter_target); | ||
686 | } else | ||
687 | break; | ||
688 | |||
689 | rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); | ||
690 | } | ||
691 | |||
692 | rfcsr24 -= !!overtuned; | ||
693 | |||
694 | rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); | ||
695 | return rfcsr24; | ||
696 | } | ||
697 | |||
698 | static int rt2800usb_init_rfcsr(struct rt2x00_dev *rt2x00dev) | ||
699 | { | ||
700 | u8 rfcsr; | ||
701 | u8 bbp; | ||
702 | |||
703 | if (rt2x00_intf_is_usb(rt2x00dev) && | ||
704 | rt2x00_rev(&rt2x00dev->chip) != RT3070_VERSION) | ||
705 | return 0; | ||
706 | |||
707 | /* | ||
708 | * Init RF calibration. | ||
709 | */ | ||
710 | rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr); | ||
711 | rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1); | ||
712 | rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); | ||
713 | msleep(1); | ||
714 | rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0); | ||
715 | rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); | ||
716 | |||
717 | if (rt2x00_intf_is_usb(rt2x00dev)) { | ||
718 | rt2800_rfcsr_write(rt2x00dev, 4, 0x40); | ||
719 | rt2800_rfcsr_write(rt2x00dev, 5, 0x03); | ||
720 | rt2800_rfcsr_write(rt2x00dev, 6, 0x02); | ||
721 | rt2800_rfcsr_write(rt2x00dev, 7, 0x70); | ||
722 | rt2800_rfcsr_write(rt2x00dev, 9, 0x0f); | ||
723 | rt2800_rfcsr_write(rt2x00dev, 10, 0x71); | ||
724 | rt2800_rfcsr_write(rt2x00dev, 11, 0x21); | ||
725 | rt2800_rfcsr_write(rt2x00dev, 12, 0x7b); | ||
726 | rt2800_rfcsr_write(rt2x00dev, 14, 0x90); | ||
727 | rt2800_rfcsr_write(rt2x00dev, 15, 0x58); | ||
728 | rt2800_rfcsr_write(rt2x00dev, 16, 0xb3); | ||
729 | rt2800_rfcsr_write(rt2x00dev, 17, 0x92); | ||
730 | rt2800_rfcsr_write(rt2x00dev, 18, 0x2c); | ||
731 | rt2800_rfcsr_write(rt2x00dev, 19, 0x02); | ||
732 | rt2800_rfcsr_write(rt2x00dev, 20, 0xba); | ||
733 | rt2800_rfcsr_write(rt2x00dev, 21, 0xdb); | ||
734 | rt2800_rfcsr_write(rt2x00dev, 24, 0x16); | ||
735 | rt2800_rfcsr_write(rt2x00dev, 25, 0x01); | ||
736 | rt2800_rfcsr_write(rt2x00dev, 27, 0x03); | ||
737 | rt2800_rfcsr_write(rt2x00dev, 29, 0x1f); | ||
738 | } | ||
739 | |||
740 | /* | ||
741 | * Set RX Filter calibration for 20MHz and 40MHz | ||
742 | */ | ||
743 | rt2x00dev->calibration[0] = | ||
744 | rt2800usb_init_rx_filter(rt2x00dev, false, 0x07, 0x16); | ||
745 | rt2x00dev->calibration[1] = | ||
746 | rt2800usb_init_rx_filter(rt2x00dev, true, 0x27, 0x19); | ||
747 | |||
748 | /* | ||
749 | * Set back to initial state | ||
750 | */ | ||
751 | rt2800_bbp_write(rt2x00dev, 24, 0); | ||
752 | |||
753 | rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); | ||
754 | rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 0); | ||
755 | rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); | ||
756 | |||
757 | /* | ||
758 | * set BBP back to BW20 | ||
759 | */ | ||
760 | rt2800_bbp_read(rt2x00dev, 4, &bbp); | ||
761 | rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 0); | ||
762 | rt2800_bbp_write(rt2x00dev, 4, bbp); | ||
763 | |||
764 | return 0; | ||
765 | } | ||
766 | |||
767 | /* | ||
768 | * Device state switch handlers. | 233 | * Device state switch handlers. |
769 | */ | 234 | */ |
770 | static void rt2800usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | 235 | static void rt2800usb_toggle_rx(struct rt2x00_dev *rt2x00dev, |
@@ -806,9 +271,9 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
806 | * Initialize all registers. | 271 | * Initialize all registers. |
807 | */ | 272 | */ |
808 | if (unlikely(rt2800usb_wait_wpdma_ready(rt2x00dev) || | 273 | if (unlikely(rt2800usb_wait_wpdma_ready(rt2x00dev) || |
809 | rt2800usb_init_registers(rt2x00dev) || | 274 | rt2800_init_registers(rt2x00dev) || |
810 | rt2800usb_init_bbp(rt2x00dev) || | 275 | rt2800_init_bbp(rt2x00dev) || |
811 | rt2800usb_init_rfcsr(rt2x00dev))) | 276 | rt2800_init_rfcsr(rt2x00dev))) |
812 | return -EIO; | 277 | return -EIO; |
813 | 278 | ||
814 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); | 279 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); |