diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 22c10e1e5ad6..6e9ca3e00f1d 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -4396,6 +4396,19 @@ static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev, | |||
4396 | return rfcsr24; | 4396 | return rfcsr24; |
4397 | } | 4397 | } |
4398 | 4398 | ||
4399 | static void rt2800_rf_init_calibration(struct rt2x00_dev *rt2x00dev, | ||
4400 | const unsigned int rf_reg) | ||
4401 | { | ||
4402 | u8 rfcsr; | ||
4403 | |||
4404 | rt2800_rfcsr_read(rt2x00dev, rf_reg, &rfcsr); | ||
4405 | rt2x00_set_field8(&rfcsr, FIELD8(0x80), 1); | ||
4406 | rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr); | ||
4407 | msleep(1); | ||
4408 | rt2x00_set_field8(&rfcsr, FIELD8(0x80), 0); | ||
4409 | rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr); | ||
4410 | } | ||
4411 | |||
4399 | static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev) | 4412 | static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev) |
4400 | { | 4413 | { |
4401 | u8 reg; | 4414 | u8 reg; |
@@ -4427,6 +4440,8 @@ static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev) | |||
4427 | 4440 | ||
4428 | static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev) | 4441 | static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev) |
4429 | { | 4442 | { |
4443 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4444 | |||
4430 | rt2800_rfcsr_write(rt2x00dev, 0, 0x50); | 4445 | rt2800_rfcsr_write(rt2x00dev, 0, 0x50); |
4431 | rt2800_rfcsr_write(rt2x00dev, 1, 0x01); | 4446 | rt2800_rfcsr_write(rt2x00dev, 1, 0x01); |
4432 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf7); | 4447 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf7); |
@@ -4463,6 +4478,9 @@ static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev) | |||
4463 | 4478 | ||
4464 | static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev) | 4479 | static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev) |
4465 | { | 4480 | { |
4481 | /* XXX vendor driver do this only for 3070 */ | ||
4482 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4483 | |||
4466 | rt2800_rfcsr_write(rt2x00dev, 4, 0x40); | 4484 | rt2800_rfcsr_write(rt2x00dev, 4, 0x40); |
4467 | rt2800_rfcsr_write(rt2x00dev, 5, 0x03); | 4485 | rt2800_rfcsr_write(rt2x00dev, 5, 0x03); |
4468 | rt2800_rfcsr_write(rt2x00dev, 6, 0x02); | 4486 | rt2800_rfcsr_write(rt2x00dev, 6, 0x02); |
@@ -4486,6 +4504,8 @@ static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev) | |||
4486 | 4504 | ||
4487 | static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev) | 4505 | static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev) |
4488 | { | 4506 | { |
4507 | rt2800_rf_init_calibration(rt2x00dev, 2); | ||
4508 | |||
4489 | rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); | 4509 | rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); |
4490 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); | 4510 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); |
4491 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); | 4511 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); |
@@ -4536,6 +4556,8 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev) | |||
4536 | 4556 | ||
4537 | static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev) | 4557 | static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev) |
4538 | { | 4558 | { |
4559 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4560 | |||
4539 | rt2800_rfcsr_write(rt2x00dev, 0, 0xf0); | 4561 | rt2800_rfcsr_write(rt2x00dev, 0, 0xf0); |
4540 | rt2800_rfcsr_write(rt2x00dev, 1, 0x23); | 4562 | rt2800_rfcsr_write(rt2x00dev, 1, 0x23); |
4541 | rt2800_rfcsr_write(rt2x00dev, 2, 0x50); | 4563 | rt2800_rfcsr_write(rt2x00dev, 2, 0x50); |
@@ -4603,6 +4625,8 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev) | |||
4603 | 4625 | ||
4604 | static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev) | 4626 | static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev) |
4605 | { | 4627 | { |
4628 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4629 | |||
4606 | rt2800_rfcsr_write(rt2x00dev, 0, 0xa0); | 4630 | rt2800_rfcsr_write(rt2x00dev, 0, 0xa0); |
4607 | rt2800_rfcsr_write(rt2x00dev, 1, 0xe1); | 4631 | rt2800_rfcsr_write(rt2x00dev, 1, 0xe1); |
4608 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); | 4632 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); |
@@ -4639,6 +4663,8 @@ static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev) | |||
4639 | 4663 | ||
4640 | static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev) | 4664 | static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev) |
4641 | { | 4665 | { |
4666 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4667 | |||
4642 | rt2800_rfcsr_write(rt2x00dev, 0, 0x70); | 4668 | rt2800_rfcsr_write(rt2x00dev, 0, 0x70); |
4643 | rt2800_rfcsr_write(rt2x00dev, 1, 0x81); | 4669 | rt2800_rfcsr_write(rt2x00dev, 1, 0x81); |
4644 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); | 4670 | rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); |
@@ -4674,6 +4700,8 @@ static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev) | |||
4674 | 4700 | ||
4675 | static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) | 4701 | static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) |
4676 | { | 4702 | { |
4703 | rt2800_rf_init_calibration(rt2x00dev, 2); | ||
4704 | |||
4677 | rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); | 4705 | rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); |
4678 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); | 4706 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); |
4679 | rt2800_rfcsr_write(rt2x00dev, 3, 0x88); | 4707 | rt2800_rfcsr_write(rt2x00dev, 3, 0x88); |
@@ -4760,6 +4788,8 @@ static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) | |||
4760 | 4788 | ||
4761 | static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev) | 4789 | static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev) |
4762 | { | 4790 | { |
4791 | rt2800_rf_init_calibration(rt2x00dev, 2); | ||
4792 | |||
4763 | rt2800_rfcsr_write(rt2x00dev, 1, 0x17); | 4793 | rt2800_rfcsr_write(rt2x00dev, 1, 0x17); |
4764 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); | 4794 | rt2800_rfcsr_write(rt2x00dev, 2, 0x80); |
4765 | rt2800_rfcsr_write(rt2x00dev, 3, 0x88); | 4795 | rt2800_rfcsr_write(rt2x00dev, 3, 0x88); |
@@ -4825,6 +4855,8 @@ static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev) | |||
4825 | 4855 | ||
4826 | static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev) | 4856 | static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev) |
4827 | { | 4857 | { |
4858 | rt2800_rf_init_calibration(rt2x00dev, 30); | ||
4859 | |||
4828 | rt2800_rfcsr_write(rt2x00dev, 1, 0x3F); | 4860 | rt2800_rfcsr_write(rt2x00dev, 1, 0x3F); |
4829 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); | 4861 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); |
4830 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); | 4862 | rt2800_rfcsr_write(rt2x00dev, 3, 0x08); |
@@ -4882,28 +4914,6 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) | |||
4882 | !rt2800_is_305x_soc(rt2x00dev)) | 4914 | !rt2800_is_305x_soc(rt2x00dev)) |
4883 | return 0; | 4915 | return 0; |
4884 | 4916 | ||
4885 | /* | ||
4886 | * Init RF calibration. | ||
4887 | */ | ||
4888 | |||
4889 | if (rt2x00_rt(rt2x00dev, RT3290) || | ||
4890 | rt2x00_rt(rt2x00dev, RT5390) || | ||
4891 | rt2x00_rt(rt2x00dev, RT5392)) { | ||
4892 | rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr); | ||
4893 | rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); | ||
4894 | rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); | ||
4895 | msleep(1); | ||
4896 | rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0); | ||
4897 | rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); | ||
4898 | } else { | ||
4899 | rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr); | ||
4900 | rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1); | ||
4901 | rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); | ||
4902 | msleep(1); | ||
4903 | rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0); | ||
4904 | rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); | ||
4905 | } | ||
4906 | |||
4907 | if (rt2800_is_305x_soc(rt2x00dev)) { | 4917 | if (rt2800_is_305x_soc(rt2x00dev)) { |
4908 | rt2800_init_rfcsr_305x_soc(rt2x00dev); | 4918 | rt2800_init_rfcsr_305x_soc(rt2x00dev); |
4909 | return 0; | 4919 | return 0; |