aboutsummaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch')
-rw-r--r--package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch258
1 files changed, 258 insertions, 0 deletions
diff --git a/package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch b/package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch
new file mode 100644
index 0000000000..14191c2a7a
--- /dev/null
+++ b/package/mac80211/patches/313-rt2x00-Channel-HT40-fixes-rt2800usb.patch
@@ -0,0 +1,258 @@
+From c2288ea288283cea727dfa547339d245458071fc Mon Sep 17 00:00:00 2001
+From: Ivo van Doorn <IvDoorn@gmail.com>
+Date: Sun, 8 Feb 2009 00:09:22 +0100
+Subject: [PATCH] rt2x00: Channel HT40+/- fixes (rt2800usb)
+
+Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
+---
+ drivers/net/wireless/rt2x00/rt2800usb.c | 107 ++++++++++++++++--------------
+ drivers/net/wireless/rt2x00/rt2800usb.h | 5 +-
+ 2 files changed, 61 insertions(+), 51 deletions(-)
+
+--- a/drivers/net/wireless/rt2x00/rt2800usb.c
++++ b/drivers/net/wireless/rt2x00/rt2800usb.c
+@@ -641,7 +641,7 @@ static void rt2800usb_config_ant(struct
+ rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
+ break;
+ case 2:
+- rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 16);
++ rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
+ break;
+ case 3:
+ /* Do nothing */
+@@ -691,6 +691,7 @@ static void rt2800usb_config_lna_gain(st
+ }
+
+ static void rt2800usb_config_channel_rt2x(struct rt2x00_dev *rt2x00dev,
++ struct ieee80211_conf *conf,
+ struct rf_channel *rf,
+ struct channel_info *info)
+ {
+@@ -702,6 +703,7 @@ static void rt2800usb_config_channel_rt2
+ * Determine antenna settings from EEPROM
+ */
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
++
+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) == 1)
+ rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
+
+@@ -742,8 +744,7 @@ static void rt2800usb_config_channel_rt2
+ TXPOWER_G_TO_DEV(info->tx_power2));
+ }
+
+- rt2x00_set_field32(&rf->rf4, RF4_BW40,
+- test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags));
++ rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf));
+
+ rt2800usb_rf_write(rt2x00dev, 1, rf->rf1);
+ rt2800usb_rf_write(rt2x00dev, 2, rf->rf2);
+@@ -766,6 +767,7 @@ static void rt2800usb_config_channel_rt2
+ }
+
+ static void rt2800usb_config_channel_rt3x(struct rt2x00_dev *rt2x00dev,
++ struct ieee80211_conf *conf,
+ struct rf_channel *rf,
+ struct channel_info *info)
+ {
+@@ -787,10 +789,12 @@ static void rt2800usb_config_channel_rt3
+ rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
+ rt2800usb_rfcsr_write(rt2x00dev, 23, rfcsr);
+
+- if (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
+- rt2800usb_rfcsr_write(rt2x00dev, 24, rt2x00dev->calibration_bw40);
++ if (conf_is_ht40(conf))
++ rt2800usb_rfcsr_write(rt2x00dev, 24,
++ rt2x00dev->calibration_bw40);
+ else
+- rt2800usb_rfcsr_write(rt2x00dev, 24, rt2x00dev->calibration_bw20);
++ rt2800usb_rfcsr_write(rt2x00dev, 24,
++ rt2x00dev->calibration_bw20);
+
+ rt2800usb_rfcsr_read(rt2x00dev, 23, &rfcsr);
+ rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
+@@ -798,46 +802,24 @@ static void rt2800usb_config_channel_rt3
+ }
+
+ static void rt2800usb_config_channel(struct rt2x00_dev *rt2x00dev,
++ struct ieee80211_conf *conf,
+ struct rf_channel *rf,
+ struct channel_info *info)
+ {
+ u32 reg;
+ unsigned int tx_pin;
+ u16 eeprom;
++ u8 bbp;
+
+- if (rt2x00_rev(&rt2x00dev->chip) != RT3070_VERSION)
+- rt2800usb_config_channel_rt2x(rt2x00dev, rf, info);
+- else
+- rt2800usb_config_channel_rt3x(rt2x00dev, rf, info);
+-
+- tx_pin = 0;
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
+-
++ /*
++ * Determine antenna settings from EEPROM
++ */
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
+
+- /* Turn off unused PA or LNA when only 1T or 1R */
+- if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) == 1) {
+-
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 0);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 0);
+- }
+-
+- /* Turn off unused PA or LNA when only 1T or 1R */
+- if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) == 1) {
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 0);
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 0);
+- }
+-
+- if (rf->channel > 14)
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
++ if (rt2x00_rev(&rt2x00dev->chip) != RT3070_VERSION)
++ rt2800usb_config_channel_rt2x(rt2x00dev, conf, rf, info);
+ else
+- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
++ rt2800usb_config_channel_rt3x(rt2x00dev, conf, rf, info);
+
+ /*
+ * Change BBP settings
+@@ -855,11 +837,6 @@ static void rt2800usb_config_channel(str
+ rt2800usb_bbp_write(rt2x00dev, 82, 0x84);
+ rt2800usb_bbp_write(rt2x00dev, 75, 0x50);
+ }
+-
+- rt2x00usb_register_read(rt2x00dev, TX_BAND_CFG, &reg);
+- rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_A, 0);
+- rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_BG, 1);
+- rt2x00usb_register_write(rt2x00dev, TX_BAND_CFG, reg);
+ } else {
+ rt2800usb_bbp_write(rt2x00dev, 82, 0xf2);
+
+@@ -867,15 +844,45 @@ static void rt2800usb_config_channel(str
+ rt2800usb_bbp_write(rt2x00dev, 75, 0x46);
+ else
+ rt2800usb_bbp_write(rt2x00dev, 75, 0x50);
++ }
++
++ rt2x00usb_register_read(rt2x00dev, TX_BAND_CFG, &reg);
++ rt2x00_set_field32(&reg, TX_BAND_CFG_HT40_PLUS, conf_is_ht40_plus(conf));
++ rt2x00_set_field32(&reg, TX_BAND_CFG_A, rf->channel > 14);
++ rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
++ rt2x00usb_register_write(rt2x00dev, TX_BAND_CFG, reg);
++
++ tx_pin = 0;
++
++ /* Turn on unused PA or LNA when not using 1T or 1R */
++ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) != 1) {
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
++ }
+
+- rt2x00usb_register_read(rt2x00dev, TX_BAND_CFG, &reg);
+- rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_A, 1);
+- rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_BG, 0);
+- rt2x00usb_register_write(rt2x00dev, TX_BAND_CFG, reg);
++ /* Turn on unused PA or LNA when not using 1T or 1R */
++ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) != 1) {
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
+ }
+
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, rf->channel <= 14);
++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, rf->channel > 14);
++
+ rt2x00usb_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+
++ rt2800usb_bbp_read(rt2x00dev, 4, &bbp);
++ rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
++ rt2800usb_bbp_write(rt2x00dev, 4, bbp);
++
++ rt2800usb_bbp_read(rt2x00dev, 3, &bbp);
++ rt2x00_set_field8(&bbp, BBP3_HT40_PLUS, conf_is_ht40_plus(conf));
++ rt2800usb_bbp_write(rt2x00dev, 3, bbp);
++
+ msleep(1);
+ }
+
+@@ -1008,8 +1015,8 @@ static void rt2800usb_config(struct rt2x
+ rt2800usb_config_lna_gain(rt2x00dev, libconf);
+
+ if (flags & IEEE80211_CONF_CHANGE_CHANNEL)
+- rt2800usb_config_channel(rt2x00dev, &libconf->rf,
+- &libconf->channel);
++ rt2800usb_config_channel(rt2x00dev, libconf->conf,
++ &libconf->rf, &libconf->channel);
+ if (flags & IEEE80211_CONF_CHANGE_POWER)
+ rt2800usb_config_txpower(rt2x00dev, libconf->conf->power_level);
+ if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
+@@ -1643,7 +1650,7 @@ static u8 rt2800usb_init_rx_filter(struc
+
+ if (bw40) {
+ rt2800usb_bbp_read(rt2x00dev, 4, &bbp);
+- rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 0x10);
++ rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2);
+ rt2800usb_bbp_write(rt2x00dev, 4, bbp);
+ }
+
+@@ -2777,14 +2784,14 @@ static const struct rt2x00lib_ops rt2800
+
+ static const struct data_queue_desc rt2800usb_queue_rx = {
+ .entry_num = RX_ENTRIES,
+- .data_size = DATA_FRAME_SIZE,
++ .data_size = AGGREGATION_SIZE,
+ .desc_size = RXD_DESC_SIZE + RXWI_DESC_SIZE,
+ .priv_size = sizeof(struct queue_entry_priv_usb),
+ };
+
+ static const struct data_queue_desc rt2800usb_queue_tx = {
+ .entry_num = TX_ENTRIES,
+- .data_size = DATA_FRAME_SIZE,
++ .data_size = AGGREGATION_SIZE,
+ .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
+ .priv_size = sizeof(struct queue_entry_priv_usb),
+ };
+--- a/drivers/net/wireless/rt2x00/rt2800usb.h
++++ b/drivers/net/wireless/rt2x00/rt2800usb.h
+@@ -803,6 +803,7 @@
+ * TX_BAND_CFG: 0x1 use upper 20MHz, 0x0 use lower 20MHz
+ */
+ #define TX_BAND_CFG 0x132c
++#define TX_BAND_CFG_HT40_PLUS FIELD32(0x00000001)
+ #define TX_BAND_CFG_A FIELD32(0x00000002)
+ #define TX_BAND_CFG_BG FIELD32(0x00000004)
+
+@@ -1482,10 +1483,12 @@ struct mac_iveiv_entry {
+ * BBP 3: RX Antenna
+ */
+ #define BBP3_RX_ANTENNA FIELD8(0x18)
++#define BBP3_HT40_PLUS FIELD8(0x20)
+
+ /*
+ * BBP 4: Bandwidth
+ */
++#define BBP4_TX_BF FIELD8(0x01)
+ #define BBP4_BANDWIDTH FIELD8(0x18)
+
+ /*
+@@ -1548,7 +1551,7 @@ struct mac_iveiv_entry {
+ #define RF4_TXPOWER_A_7DBM_BOOST FIELD32(0x00000040)
+ #define RF4_TXPOWER_A FIELD32(0x00000780)
+ #define RF4_FREQ_OFFSET FIELD32(0x001f8000)
+-#define RF4_BW40 FIELD32(0x00200000)
++#define RF4_HT40 FIELD32(0x00200000)
+
+ /*
+ * EEPROM content.