399d5cf532
Some of our local patches have been accepted upstream. And there are some more relevant changes (mostly for rt2800usb). Import them and rebase our remaining local patches on top. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
136 lines
4.3 KiB
Diff
136 lines
4.3 KiB
Diff
From 269f19c848a2380db03a3f207cafb88e28d71c53 Mon Sep 17 00:00:00 2001
|
|
From: Gabor Juhos <juhosg@openwrt.org>
|
|
Date: Sun, 24 Mar 2013 19:26:28 +0100
|
|
Subject: [PATCH] rt2x00: rt2800lib: add channel configuration code for RT3883
|
|
|
|
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|
---
|
|
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 72 +++++++++++++++++++++++++++++--
|
|
1 file changed, 69 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
@@ -3733,6 +3733,36 @@ static char rt2800_txpower_to_dev(struct
|
|
return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
|
|
}
|
|
|
|
+static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev,
|
|
+ struct rf_channel *rf)
|
|
+{
|
|
+ u8 bbp;
|
|
+
|
|
+ bbp = (rf->channel > 14) ? 0x48 : 0x38;
|
|
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
|
|
+
|
|
+ rt2800_bbp_write(rt2x00dev, 69, 0x12);
|
|
+
|
|
+ if (rf->channel <= 14) {
|
|
+ rt2800_bbp_write(rt2x00dev, 70, 0x0a);
|
|
+ } else {
|
|
+ /* Disable CCK packet detection */
|
|
+ rt2800_bbp_write(rt2x00dev, 70, 0x00);
|
|
+ }
|
|
+
|
|
+ rt2800_bbp_write(rt2x00dev, 73, 0x10);
|
|
+
|
|
+ if (rf->channel > 14) {
|
|
+ rt2800_bbp_write(rt2x00dev, 62, 0x1d);
|
|
+ rt2800_bbp_write(rt2x00dev, 63, 0x1d);
|
|
+ rt2800_bbp_write(rt2x00dev, 64, 0x1d);
|
|
+ } else {
|
|
+ rt2800_bbp_write(rt2x00dev, 62, 0x2d);
|
|
+ rt2800_bbp_write(rt2x00dev, 63, 0x2d);
|
|
+ rt2800_bbp_write(rt2x00dev, 64, 0x2d);
|
|
+ }
|
|
+}
|
|
+
|
|
static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
|
struct ieee80211_conf *conf,
|
|
struct rf_channel *rf,
|
|
@@ -3751,6 +3781,12 @@ static void rt2800_config_channel(struct
|
|
rt2800_txpower_to_dev(rt2x00dev, rf->channel,
|
|
info->default_power3);
|
|
|
|
+ switch (rt2x00dev->chip.rt) {
|
|
+ case RT3883:
|
|
+ rt3883_bbp_adjust(rt2x00dev, rf);
|
|
+ break;
|
|
+ }
|
|
+
|
|
switch (rt2x00dev->chip.rf) {
|
|
case RF2020:
|
|
case RF3020:
|
|
@@ -3855,6 +3891,15 @@ static void rt2800_config_channel(struct
|
|
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
|
rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
|
|
rt2800_bbp_write(rt2x00dev, 77, 0x98);
|
|
+ } else if (rt2x00_rt(rt2x00dev, RT3883)) {
|
|
+ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
|
|
+ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
|
+ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
|
|
+
|
|
+ if (rt2x00dev->default_ant.rx_chain_num > 1)
|
|
+ rt2800_bbp_write(rt2x00dev, 86, 0x46);
|
|
+ else
|
|
+ rt2800_bbp_write(rt2x00dev, 86, 0);
|
|
} else {
|
|
rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
|
|
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
|
@@ -3868,6 +3913,7 @@ static void rt2800_config_channel(struct
|
|
!rt2x00_rt(rt2x00dev, RT6352)) {
|
|
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
|
rt2800_bbp_write(rt2x00dev, 82, 0x62);
|
|
+ rt2800_bbp_write(rt2x00dev, 82, 0x62);
|
|
rt2800_bbp_write(rt2x00dev, 75, 0x46);
|
|
} else {
|
|
if (rt2x00_rt(rt2x00dev, RT3593))
|
|
@@ -3876,19 +3922,22 @@ static void rt2800_config_channel(struct
|
|
rt2800_bbp_write(rt2x00dev, 82, 0x84);
|
|
rt2800_bbp_write(rt2x00dev, 75, 0x50);
|
|
}
|
|
- if (rt2x00_rt(rt2x00dev, RT3593))
|
|
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
|
|
+ rt2x00_rt(rt2x00dev, RT3883))
|
|
rt2800_bbp_write(rt2x00dev, 83, 0x8a);
|
|
}
|
|
|
|
} else {
|
|
if (rt2x00_rt(rt2x00dev, RT3572))
|
|
rt2800_bbp_write(rt2x00dev, 82, 0x94);
|
|
- else if (rt2x00_rt(rt2x00dev, RT3593))
|
|
+ else if (rt2x00_rt(rt2x00dev, RT3593) ||
|
|
+ rt2x00_rt(rt2x00dev, RT3883))
|
|
rt2800_bbp_write(rt2x00dev, 82, 0x82);
|
|
else if (!rt2x00_rt(rt2x00dev, RT6352))
|
|
rt2800_bbp_write(rt2x00dev, 82, 0xf2);
|
|
|
|
- if (rt2x00_rt(rt2x00dev, RT3593))
|
|
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
|
|
+ rt2x00_rt(rt2x00dev, RT3883))
|
|
rt2800_bbp_write(rt2x00dev, 83, 0x9a);
|
|
|
|
if (rt2x00_has_cap_external_lna_a(rt2x00dev))
|
|
@@ -4011,6 +4060,23 @@ static void rt2800_config_channel(struct
|
|
|
|
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
|
|
|
|
+ usleep_range(1000, 1500);
|
|
+ }
|
|
+
|
|
+ if (rt2x00_rt(rt2x00dev, RT3883)) {
|
|
+ if (!conf_is_ht40(conf))
|
|
+ rt2800_bbp_write(rt2x00dev, 105, 0x34);
|
|
+ else
|
|
+ rt2800_bbp_write(rt2x00dev, 105, 0x04);
|
|
+
|
|
+ /* AGC init */
|
|
+ if (rf->channel <= 14)
|
|
+ reg = 0x2e + rt2x00dev->lna_gain;
|
|
+ else
|
|
+ reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3);
|
|
+
|
|
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
|
|
+
|
|
usleep_range(1000, 1500);
|
|
}
|
|
|