diff options
-rw-r--r-- | package/mac80211/patches/620-rt2x00-support-rt3352.patch | 160 |
1 files changed, 90 insertions, 70 deletions
diff --git a/package/mac80211/patches/620-rt2x00-support-rt3352.patch b/package/mac80211/patches/620-rt2x00-support-rt3352.patch index 27473ec..bb2086d 100644 --- a/package/mac80211/patches/620-rt2x00-support-rt3352.patch +++ b/package/mac80211/patches/620-rt2x00-support-rt3352.patch @@ -1,6 +1,42 @@ +From 03839951515b0ea2b21d649b1fe7b63f9817d0c8 Mon Sep 17 00:00:00 2001 +From: Daniel Golle <dgolle@allnet.de> +Date: Sun, 9 Sep 2012 14:24:39 +0300 +Subject: [PATCH] rt2x00: add MediaTek/RaLink Rt3352 WiSoC + +Support for the RT3352 WiSoC was developed for and tested with the ALL5002 +devboard running OpenWrt. For now, this supports only devices with internal +TXALC. Corrections were made according to the remarks of Stanislaw Gruszka and +Gertjan van Wingerde, thank you guys for reviewing! + +Signed-off-by: Daniel Golle <dgolle@allnet.de> +Signed-off-by: John W. Linville <linville@tuxdriver.com> +--- + drivers/net/wireless/rt2x00/rt2800.h | 5 + + drivers/net/wireless/rt2x00/rt2800lib.c | 211 +++++++++++++++++++++++++++++++- + drivers/net/wireless/rt2x00/rt2x00.h | 1 + + 3 files changed, 212 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h +index e13916f..6d67c3e 100644 +--- a/drivers/net/wireless/rt2x00/rt2800.h ++++ b/drivers/net/wireless/rt2x00/rt2800.h +@@ -1943,6 +1943,11 @@ struct mac_iveiv_entry { + #define BBP47_TSSI_ADC6 FIELD8(0x80) + + /* ++ * BBP 49 ++ */ ++#define BBP49_UPDATE_FLAG FIELD8(0x01) ++ ++/* + * BBP 109 + */ + #define BBP109_TX0_POWER FIELD8(0x0f) +diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c +index a04e222..9e09367 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c -@@ -1615,6 +1615,7 @@ void rt2800_config_ant(struct rt2x00_dev +@@ -1615,6 +1615,7 @@ void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant) case 1: if (rt2x00_rt(rt2x00dev, RT3070) || rt2x00_rt(rt2x00dev, RT3090) || @@ -8,7 +44,7 @@ rt2x00_rt(rt2x00dev, RT3390)) { rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); -@@ -2053,6 +2054,58 @@ static void rt2800_config_channel_rf3290 +@@ -2053,6 +2054,60 @@ static void rt2800_config_channel_rf3290(struct rt2x00_dev *rt2x00dev, } } @@ -38,8 +74,7 @@ + + rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr); + if (rt2x00dev->freq_offset > FREQ_OFFSET_BOUND) -+ rt2x00_set_field8(&rfcsr, RFCSR17_CODE, -+ FREQ_OFFSET_BOUND); ++ rt2x00_set_field8(&rfcsr, RFCSR17_CODE, FREQ_OFFSET_BOUND); + else + rt2x00_set_field8(&rfcsr, RFCSR17_CODE, rt2x00dev->freq_offset); + @@ -48,17 +83,20 @@ + rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + -+ if ( rt2x00dev->default_ant.tx_chain_num == 1 ) ++ if ( rt2x00dev->default_ant.tx_chain_num == 2 ) ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); ++ else + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); + -+ if ( rt2x00dev->default_ant.rx_chain_num == 1 ) ++ if ( rt2x00dev->default_ant.rx_chain_num == 2 ) ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); ++ else + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); + ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); ++ + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 31, 80); @@ -67,7 +105,7 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf, struct rf_channel *rf, -@@ -2182,6 +2235,9 @@ static void rt2800_config_channel(struct +@@ -2182,6 +2237,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, case RF3290: rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info); break; @@ -77,7 +115,7 @@ case RF5360: case RF5370: case RF5372: -@@ -2194,6 +2250,7 @@ static void rt2800_config_channel(struct +@@ -2194,6 +2252,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, } if (rt2x00_rf(rt2x00dev, RF3290) || @@ -85,7 +123,7 @@ rt2x00_rf(rt2x00dev, RF5360) || rt2x00_rf(rt2x00dev, RF5370) || rt2x00_rf(rt2x00dev, RF5372) || -@@ -2212,10 +2269,20 @@ static void rt2800_config_channel(struct +@@ -2212,10 +2271,17 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, /* * Change BBP settings */ @@ -93,15 +131,12 @@ - rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); - rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); - rt2800_bbp_write(rt2x00dev, 86, 0); -+ if (rt2x00_rt(rt2x00dev, RT3352)) -+ { ++ if (rt2x00_rt(rt2x00dev, RT3352)) { + rt2800_bbp_write(rt2x00dev, 27, 0x0); + rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 27, 0x20); + rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); -+ } -+ else -+ { ++ } else { + 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); @@ -110,7 +145,7 @@ if (rf->channel <= 14) { if (!rt2x00_rt(rt2x00dev, RT5390) && -@@ -2310,6 +2377,16 @@ static void rt2800_config_channel(struct +@@ -2310,6 +2376,15 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, rt2800_register_read(rt2x00dev, CH_IDLE_STA, ®); rt2800_register_read(rt2x00dev, CH_BUSY_STA, ®); rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC, ®); @@ -118,8 +153,7 @@ + /* + * Clear update flag + */ -+ if (rt2x00_rt(rt2x00dev, RT3352)) -+ { ++ if (rt2x00_rt(rt2x00dev, RT3352)) { + rt2800_bbp_read(rt2x00dev, 49, &bbp); + rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0); + rt2800_bbp_write(rt2x00dev, 49, bbp); @@ -127,23 +161,18 @@ } static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev) -@@ -2961,11 +3038,15 @@ static int rt2800_init_registers(struct - if (rt2x00_rt(rt2x00dev, RT3071) || - rt2x00_rt(rt2x00dev, RT3090) || - rt2x00_rt(rt2x00dev, RT3290) || -+ rt2x00_rt(rt2x00dev, RT3352) || - rt2x00_rt(rt2x00dev, RT3390)) { - - if (rt2x00_rt(rt2x00dev, RT3290)) - rt2800_register_write(rt2x00dev, TX_SW_CFG0, - 0x00000404); -+ else if (rt2x00_rt(rt2x00dev, RT3352)) -+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, -+ 0x00000402); - else - rt2800_register_write(rt2x00dev, TX_SW_CFG0, - 0x00000400); -@@ -3378,6 +3459,11 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -2998,6 +3073,10 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030); ++ } else if (rt2x00_rt(rt2x00dev, RT3352)) { ++ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402); ++ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); ++ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } else if (rt2x00_rt(rt2x00dev, RT3572)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); +@@ -3378,6 +3457,11 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_wait_bbp_ready(rt2x00dev))) return -EACCES; @@ -155,7 +184,7 @@ if (rt2x00_rt(rt2x00dev, RT3290) || rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) { -@@ -3388,15 +3474,20 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3388,15 +3472,20 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) if (rt2800_is_305x_soc(rt2x00dev) || rt2x00_rt(rt2x00dev, RT3290) || @@ -176,7 +205,7 @@ rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) rt2800_bbp_write(rt2x00dev, 68, 0x0b); -@@ -3405,6 +3496,7 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3405,6 +3494,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 69, 0x16); rt2800_bbp_write(rt2x00dev, 73, 0x12); } else if (rt2x00_rt(rt2x00dev, RT3290) || @@ -184,7 +213,7 @@ rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) { rt2800_bbp_write(rt2x00dev, 69, 0x12); -@@ -3436,6 +3528,10 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3436,6 +3526,10 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) } else if (rt2800_is_305x_soc(rt2x00dev)) { rt2800_bbp_write(rt2x00dev, 78, 0x0e); rt2800_bbp_write(rt2x00dev, 80, 0x08); @@ -195,7 +224,7 @@ } else { rt2800_bbp_write(rt2x00dev, 81, 0x37); } -@@ -3465,18 +3561,21 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3465,18 +3559,21 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 84, 0x99); if (rt2x00_rt(rt2x00dev, RT3290) || @@ -218,7 +247,7 @@ rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) rt2800_bbp_write(rt2x00dev, 92, 0x02); -@@ -3493,6 +3592,7 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3493,6 +3590,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) || rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) || rt2x00_rt(rt2x00dev, RT3290) || @@ -226,7 +255,7 @@ rt2x00_rt(rt2x00dev, RT3572) || rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392) || -@@ -3502,6 +3602,7 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3502,6 +3600,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 103, 0x00); if (rt2x00_rt(rt2x00dev, RT3290) || @@ -234,7 +263,7 @@ rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) rt2800_bbp_write(rt2x00dev, 104, 0x92); -@@ -3510,6 +3611,8 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3510,6 +3609,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 105, 0x01); else if (rt2x00_rt(rt2x00dev, RT3290)) rt2800_bbp_write(rt2x00dev, 105, 0x1c); @@ -243,7 +272,7 @@ else if (rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) rt2800_bbp_write(rt2x00dev, 105, 0x3c); -@@ -3519,11 +3622,16 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3519,11 +3620,16 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) if (rt2x00_rt(rt2x00dev, RT3290) || rt2x00_rt(rt2x00dev, RT5390)) rt2800_bbp_write(rt2x00dev, 106, 0x03); @@ -260,7 +289,7 @@ if (rt2x00_rt(rt2x00dev, RT3290) || rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) -@@ -3534,6 +3642,9 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3534,6 +3640,9 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 135, 0xf6); } @@ -270,7 +299,7 @@ if (rt2x00_rt(rt2x00dev, RT3071) || rt2x00_rt(rt2x00dev, RT3090) || rt2x00_rt(rt2x00dev, RT3390) || -@@ -3574,6 +3685,28 @@ static int rt2800_init_bbp(struct rt2x00 +@@ -3574,6 +3683,28 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) rt2800_bbp_write(rt2x00dev, 3, value); } @@ -299,7 +328,7 @@ if (rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392)) { int ant, div_mode; -@@ -3707,6 +3840,7 @@ static int rt2800_init_rfcsr(struct rt2x +@@ -3707,6 +3838,7 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) !rt2x00_rt(rt2x00dev, RT3071) && !rt2x00_rt(rt2x00dev, RT3090) && !rt2x00_rt(rt2x00dev, RT3290) && @@ -307,7 +336,7 @@ !rt2x00_rt(rt2x00dev, RT3390) && !rt2x00_rt(rt2x00dev, RT3572) && !rt2x00_rt(rt2x00dev, RT5390) && -@@ -3903,6 +4037,70 @@ static int rt2800_init_rfcsr(struct rt2x +@@ -3903,6 +4035,70 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) rt2800_rfcsr_write(rt2x00dev, 30, 0x00); rt2800_rfcsr_write(rt2x00dev, 31, 0x00); return 0; @@ -378,7 +407,7 @@ } else if (rt2x00_rt(rt2x00dev, RT5390)) { rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); rt2800_rfcsr_write(rt2x00dev, 2, 0x80); -@@ -4104,6 +4302,7 @@ static int rt2800_init_rfcsr(struct rt2x +@@ -4104,6 +4300,7 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19); } else if (rt2x00_rt(rt2x00dev, RT3071) || rt2x00_rt(rt2x00dev, RT3090) || @@ -386,7 +415,7 @@ rt2x00_rt(rt2x00dev, RT3390) || rt2x00_rt(rt2x00dev, RT3572)) { drv_data->calibration_bw20 = -@@ -4566,6 +4765,7 @@ static int rt2800_init_eeprom(struct rt2 +@@ -4566,6 +4763,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) case RT3071: case RT3090: case RT3290: @@ -394,7 +423,7 @@ case RT3390: case RT3572: case RT5390: -@@ -4588,6 +4788,7 @@ static int rt2800_init_eeprom(struct rt2 +@@ -4588,6 +4786,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) case RF3052: case RF3290: case RF3320: @@ -402,7 +431,7 @@ case RF5360: case RF5370: case RF5372: -@@ -4612,6 +4813,7 @@ static int rt2800_init_eeprom(struct rt2 +@@ -4612,6 +4811,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) if (rt2x00_rt(rt2x00dev, RT3070) || rt2x00_rt(rt2x00dev, RT3090) || @@ -410,7 +439,7 @@ rt2x00_rt(rt2x00dev, RT3390)) { value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY); -@@ -4904,6 +5106,7 @@ static int rt2800_probe_hw_mode(struct r +@@ -4904,6 +5104,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) rt2x00_rf(rt2x00dev, RF3022) || rt2x00_rf(rt2x00dev, RF3290) || rt2x00_rf(rt2x00dev, RF3320) || @@ -418,9 +447,11 @@ rt2x00_rf(rt2x00dev, RF5360) || rt2x00_rf(rt2x00dev, RF5370) || rt2x00_rf(rt2x00dev, RF5372) || +diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h +index f991e8b..49375c8 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h -@@ -189,6 +189,7 @@ struct rt2x00_chip { +@@ -188,6 +188,7 @@ struct rt2x00_chip { #define RT3071 0x3071 #define RT3090 0x3090 /* 2.4GHz PCIe */ #define RT3290 0x3290 @@ -428,17 +459,6 @@ #define RT3390 0x3390 #define RT3572 0x3572 #define RT3593 0x3593 ---- a/drivers/net/wireless/rt2x00/rt2800.h -+++ b/drivers/net/wireless/rt2x00/rt2800.h -@@ -1943,6 +1943,11 @@ struct mac_iveiv_entry { - #define BBP47_TSSI_ADC6 FIELD8(0x80) - - /* -+ * BBP 49 -+ */ -+#define BBP49_UPDATE_FLAG FIELD8(0x01) -+ -+/* - * BBP 109 - */ - #define BBP109_TX0_POWER FIELD8(0x0f) +-- +1.7.12.2 + |