diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 135 |
1 files changed, 67 insertions, 68 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index d19bee43861d..639d5a2f84e2 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -245,43 +245,48 @@ rf_write: | |||
245 | } | 245 | } |
246 | 246 | ||
247 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS | 247 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS |
248 | #define CSR_OFFSET(__word) ( CSR_REG_BASE + ((__word) * sizeof(u16)) ) | 248 | static void _rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, |
249 | 249 | const unsigned int offset, | |
250 | static void rt2500usb_read_csr(struct rt2x00_dev *rt2x00dev, | 250 | u32 *value) |
251 | const unsigned int word, u32 *data) | ||
252 | { | 251 | { |
253 | rt2500usb_register_read(rt2x00dev, CSR_OFFSET(word), (u16 *) data); | 252 | rt2500usb_register_read(rt2x00dev, offset, (u16 *)value); |
254 | } | 253 | } |
255 | 254 | ||
256 | static void rt2500usb_write_csr(struct rt2x00_dev *rt2x00dev, | 255 | static void _rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, |
257 | const unsigned int word, u32 data) | 256 | const unsigned int offset, |
257 | u32 value) | ||
258 | { | 258 | { |
259 | rt2500usb_register_write(rt2x00dev, CSR_OFFSET(word), data); | 259 | rt2500usb_register_write(rt2x00dev, offset, value); |
260 | } | 260 | } |
261 | 261 | ||
262 | static const struct rt2x00debug rt2500usb_rt2x00debug = { | 262 | static const struct rt2x00debug rt2500usb_rt2x00debug = { |
263 | .owner = THIS_MODULE, | 263 | .owner = THIS_MODULE, |
264 | .csr = { | 264 | .csr = { |
265 | .read = rt2500usb_read_csr, | 265 | .read = _rt2500usb_register_read, |
266 | .write = rt2500usb_write_csr, | 266 | .write = _rt2500usb_register_write, |
267 | .flags = RT2X00DEBUGFS_OFFSET, | ||
268 | .word_base = CSR_REG_BASE, | ||
267 | .word_size = sizeof(u16), | 269 | .word_size = sizeof(u16), |
268 | .word_count = CSR_REG_SIZE / sizeof(u16), | 270 | .word_count = CSR_REG_SIZE / sizeof(u16), |
269 | }, | 271 | }, |
270 | .eeprom = { | 272 | .eeprom = { |
271 | .read = rt2x00_eeprom_read, | 273 | .read = rt2x00_eeprom_read, |
272 | .write = rt2x00_eeprom_write, | 274 | .write = rt2x00_eeprom_write, |
275 | .word_base = EEPROM_BASE, | ||
273 | .word_size = sizeof(u16), | 276 | .word_size = sizeof(u16), |
274 | .word_count = EEPROM_SIZE / sizeof(u16), | 277 | .word_count = EEPROM_SIZE / sizeof(u16), |
275 | }, | 278 | }, |
276 | .bbp = { | 279 | .bbp = { |
277 | .read = rt2500usb_bbp_read, | 280 | .read = rt2500usb_bbp_read, |
278 | .write = rt2500usb_bbp_write, | 281 | .write = rt2500usb_bbp_write, |
282 | .word_base = BBP_BASE, | ||
279 | .word_size = sizeof(u8), | 283 | .word_size = sizeof(u8), |
280 | .word_count = BBP_SIZE / sizeof(u8), | 284 | .word_count = BBP_SIZE / sizeof(u8), |
281 | }, | 285 | }, |
282 | .rf = { | 286 | .rf = { |
283 | .read = rt2x00_rf_read, | 287 | .read = rt2x00_rf_read, |
284 | .write = rt2500usb_rf_write, | 288 | .write = rt2500usb_rf_write, |
289 | .word_base = RF_BASE, | ||
285 | .word_size = sizeof(u32), | 290 | .word_size = sizeof(u32), |
286 | .word_count = RF_SIZE / sizeof(u32), | 291 | .word_count = RF_SIZE / sizeof(u32), |
287 | }, | 292 | }, |
@@ -423,57 +428,16 @@ static void rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev, | |||
423 | rt2x00_set_field16(®, TXRX_CSR10_AUTORESPOND_PREAMBLE, | 428 | rt2x00_set_field16(®, TXRX_CSR10_AUTORESPOND_PREAMBLE, |
424 | !!erp->short_preamble); | 429 | !!erp->short_preamble); |
425 | rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg); | 430 | rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg); |
426 | } | ||
427 | |||
428 | static void rt2500usb_config_phymode(struct rt2x00_dev *rt2x00dev, | ||
429 | const int basic_rate_mask) | ||
430 | { | ||
431 | rt2500usb_register_write(rt2x00dev, TXRX_CSR11, basic_rate_mask); | ||
432 | } | ||
433 | 431 | ||
434 | static void rt2500usb_config_channel(struct rt2x00_dev *rt2x00dev, | 432 | rt2500usb_register_write(rt2x00dev, TXRX_CSR11, erp->basic_rates); |
435 | struct rf_channel *rf, const int txpower) | ||
436 | { | ||
437 | /* | ||
438 | * Set TXpower. | ||
439 | */ | ||
440 | rt2x00_set_field32(&rf->rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower)); | ||
441 | 433 | ||
442 | /* | 434 | rt2500usb_register_write(rt2x00dev, MAC_CSR10, erp->slot_time); |
443 | * For RT2525E we should first set the channel to half band higher. | 435 | rt2500usb_register_write(rt2x00dev, MAC_CSR11, erp->sifs); |
444 | */ | 436 | rt2500usb_register_write(rt2x00dev, MAC_CSR12, erp->eifs); |
445 | if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) { | ||
446 | static const u32 vals[] = { | ||
447 | 0x000008aa, 0x000008ae, 0x000008ae, 0x000008b2, | ||
448 | 0x000008b2, 0x000008b6, 0x000008b6, 0x000008ba, | ||
449 | 0x000008ba, 0x000008be, 0x000008b7, 0x00000902, | ||
450 | 0x00000902, 0x00000906 | ||
451 | }; | ||
452 | |||
453 | rt2500usb_rf_write(rt2x00dev, 2, vals[rf->channel - 1]); | ||
454 | if (rf->rf4) | ||
455 | rt2500usb_rf_write(rt2x00dev, 4, rf->rf4); | ||
456 | } | ||
457 | |||
458 | rt2500usb_rf_write(rt2x00dev, 1, rf->rf1); | ||
459 | rt2500usb_rf_write(rt2x00dev, 2, rf->rf2); | ||
460 | rt2500usb_rf_write(rt2x00dev, 3, rf->rf3); | ||
461 | if (rf->rf4) | ||
462 | rt2500usb_rf_write(rt2x00dev, 4, rf->rf4); | ||
463 | } | ||
464 | |||
465 | static void rt2500usb_config_txpower(struct rt2x00_dev *rt2x00dev, | ||
466 | const int txpower) | ||
467 | { | ||
468 | u32 rf3; | ||
469 | |||
470 | rt2x00_rf_read(rt2x00dev, 3, &rf3); | ||
471 | rt2x00_set_field32(&rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower)); | ||
472 | rt2500usb_rf_write(rt2x00dev, 3, rf3); | ||
473 | } | 437 | } |
474 | 438 | ||
475 | static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev, | 439 | static void rt2500usb_config_ant(struct rt2x00_dev *rt2x00dev, |
476 | struct antenna_setup *ant) | 440 | struct antenna_setup *ant) |
477 | { | 441 | { |
478 | u8 r2; | 442 | u8 r2; |
479 | u8 r14; | 443 | u8 r14; |
@@ -555,15 +519,52 @@ static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
555 | rt2500usb_register_write(rt2x00dev, PHY_CSR6, csr6); | 519 | rt2500usb_register_write(rt2x00dev, PHY_CSR6, csr6); |
556 | } | 520 | } |
557 | 521 | ||
522 | static void rt2500usb_config_channel(struct rt2x00_dev *rt2x00dev, | ||
523 | struct rf_channel *rf, const int txpower) | ||
524 | { | ||
525 | /* | ||
526 | * Set TXpower. | ||
527 | */ | ||
528 | rt2x00_set_field32(&rf->rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower)); | ||
529 | |||
530 | /* | ||
531 | * For RT2525E we should first set the channel to half band higher. | ||
532 | */ | ||
533 | if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) { | ||
534 | static const u32 vals[] = { | ||
535 | 0x000008aa, 0x000008ae, 0x000008ae, 0x000008b2, | ||
536 | 0x000008b2, 0x000008b6, 0x000008b6, 0x000008ba, | ||
537 | 0x000008ba, 0x000008be, 0x000008b7, 0x00000902, | ||
538 | 0x00000902, 0x00000906 | ||
539 | }; | ||
540 | |||
541 | rt2500usb_rf_write(rt2x00dev, 2, vals[rf->channel - 1]); | ||
542 | if (rf->rf4) | ||
543 | rt2500usb_rf_write(rt2x00dev, 4, rf->rf4); | ||
544 | } | ||
545 | |||
546 | rt2500usb_rf_write(rt2x00dev, 1, rf->rf1); | ||
547 | rt2500usb_rf_write(rt2x00dev, 2, rf->rf2); | ||
548 | rt2500usb_rf_write(rt2x00dev, 3, rf->rf3); | ||
549 | if (rf->rf4) | ||
550 | rt2500usb_rf_write(rt2x00dev, 4, rf->rf4); | ||
551 | } | ||
552 | |||
553 | static void rt2500usb_config_txpower(struct rt2x00_dev *rt2x00dev, | ||
554 | const int txpower) | ||
555 | { | ||
556 | u32 rf3; | ||
557 | |||
558 | rt2x00_rf_read(rt2x00dev, 3, &rf3); | ||
559 | rt2x00_set_field32(&rf3, RF3_TXPOWER, TXPOWER_TO_DEV(txpower)); | ||
560 | rt2500usb_rf_write(rt2x00dev, 3, rf3); | ||
561 | } | ||
562 | |||
558 | static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev, | 563 | static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev, |
559 | struct rt2x00lib_conf *libconf) | 564 | struct rt2x00lib_conf *libconf) |
560 | { | 565 | { |
561 | u16 reg; | 566 | u16 reg; |
562 | 567 | ||
563 | rt2500usb_register_write(rt2x00dev, MAC_CSR10, libconf->slot_time); | ||
564 | rt2500usb_register_write(rt2x00dev, MAC_CSR11, libconf->sifs); | ||
565 | rt2500usb_register_write(rt2x00dev, MAC_CSR12, libconf->eifs); | ||
566 | |||
567 | rt2500usb_register_read(rt2x00dev, TXRX_CSR18, ®); | 568 | rt2500usb_register_read(rt2x00dev, TXRX_CSR18, ®); |
568 | rt2x00_set_field16(®, TXRX_CSR18_INTERVAL, | 569 | rt2x00_set_field16(®, TXRX_CSR18_INTERVAL, |
569 | libconf->conf->beacon_int * 4); | 570 | libconf->conf->beacon_int * 4); |
@@ -574,17 +575,14 @@ static void rt2500usb_config(struct rt2x00_dev *rt2x00dev, | |||
574 | struct rt2x00lib_conf *libconf, | 575 | struct rt2x00lib_conf *libconf, |
575 | const unsigned int flags) | 576 | const unsigned int flags) |
576 | { | 577 | { |
577 | if (flags & CONFIG_UPDATE_PHYMODE) | 578 | if (flags & IEEE80211_CONF_CHANGE_CHANNEL) |
578 | rt2500usb_config_phymode(rt2x00dev, libconf->basic_rates); | ||
579 | if (flags & CONFIG_UPDATE_CHANNEL) | ||
580 | rt2500usb_config_channel(rt2x00dev, &libconf->rf, | 579 | rt2500usb_config_channel(rt2x00dev, &libconf->rf, |
581 | libconf->conf->power_level); | 580 | libconf->conf->power_level); |
582 | if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL)) | 581 | if ((flags & IEEE80211_CONF_CHANGE_POWER) && |
582 | !(flags & IEEE80211_CONF_CHANGE_CHANNEL)) | ||
583 | rt2500usb_config_txpower(rt2x00dev, | 583 | rt2500usb_config_txpower(rt2x00dev, |
584 | libconf->conf->power_level); | 584 | libconf->conf->power_level); |
585 | if (flags & CONFIG_UPDATE_ANTENNA) | 585 | if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL) |
586 | rt2500usb_config_antenna(rt2x00dev, &libconf->ant); | ||
587 | if (flags & (CONFIG_UPDATE_SLOT_TIME | CONFIG_UPDATE_BEACON_INT)) | ||
588 | rt2500usb_config_duration(rt2x00dev, libconf); | 586 | rt2500usb_config_duration(rt2x00dev, libconf); |
589 | } | 587 | } |
590 | 588 | ||
@@ -1794,6 +1792,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | |||
1794 | .config_filter = rt2500usb_config_filter, | 1792 | .config_filter = rt2500usb_config_filter, |
1795 | .config_intf = rt2500usb_config_intf, | 1793 | .config_intf = rt2500usb_config_intf, |
1796 | .config_erp = rt2500usb_config_erp, | 1794 | .config_erp = rt2500usb_config_erp, |
1795 | .config_ant = rt2500usb_config_ant, | ||
1797 | .config = rt2500usb_config, | 1796 | .config = rt2500usb_config, |
1798 | }; | 1797 | }; |
1799 | 1798 | ||