Recent Ralink RFs need different rf_vals depending on whether HT20 or HT40 is
being used.

Signed-off-by: Daniel Golle <dgo...@allnet.de>

 create mode 100644 package/mac80211/patches/623-differentiate-rf_vals.patch

diff --git a/package/mac80211/patches/622-rt2x00-fix-rt3352-ext-pa.patch 
b/package/mac80211/patches/622-rt2x00-fix-rt3352-ext-pa.patch
index 17beaa0..ab4f7b3 100644
--- a/package/mac80211/patches/622-rt2x00-fix-rt3352-ext-pa.patch
+++ b/package/mac80211/patches/622-rt2x00-fix-rt3352-ext-pa.patch
@@ -119,7 +119,7 @@
                                        EIRP_MAX_TX_POWER_LIMIT)
                __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
-+      if (rt2x00_rt(rt2x00dev, RT3352) {
++      if (rt2x00_rt(rt2x00dev, RT3352)) {
 +              if (!rt2x00_get_field16(eeprom,
 +                  EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
 +                      __set_bit(CAPABILITY_INTERNAL_PA_TX0,
diff --git a/package/mac80211/patches/623-differentiate-rf_vals.patch 
b/package/mac80211/patches/623-differentiate-rf_vals.patch
new file mode 100644
index 0000000..8e569d6
--- /dev/null
+++ b/package/mac80211/patches/623-differentiate-rf_vals.patch
@@ -0,0 +1,211 @@
+--- a/drivers/net/wireless/rt2x00/rt2400pci.c
++++ b/drivers/net/wireless/rt2x00/rt2400pci.c
+@@ -1588,7 +1588,7 @@ static int rt2400pci_probe_hw_mode(struc
+       spec->supported_rates = SUPPORT_RATE_CCK;
+ 
+       spec->num_channels = ARRAY_SIZE(rf_vals_b);
+-      spec->channels = rf_vals_b;
++      spec->channels_ht20 = spec->channels_ht40 = rf_vals_b;
+ 
+       /*
+        * Create channel information array
+--- a/drivers/net/wireless/rt2x00/rt2500pci.c
++++ b/drivers/net/wireless/rt2x00/rt2500pci.c
+@@ -1882,23 +1882,23 @@ static int rt2500pci_probe_hw_mode(struc
+ 
+       if (rt2x00_rf(rt2x00dev, RF2522)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);
+-              spec->channels = rf_vals_bg_2522;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2522;
+       } else if (rt2x00_rf(rt2x00dev, RF2523)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523);
+-              spec->channels = rf_vals_bg_2523;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2523;
+       } else if (rt2x00_rf(rt2x00dev, RF2524)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524);
+-              spec->channels = rf_vals_bg_2524;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2524;
+       } else if (rt2x00_rf(rt2x00dev, RF2525)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525);
+-              spec->channels = rf_vals_bg_2525;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2525;
+       } else if (rt2x00_rf(rt2x00dev, RF2525E)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
+-              spec->channels = rf_vals_bg_2525e;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2525e;
+       } else if (rt2x00_rf(rt2x00dev, RF5222)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals_5222);
+-              spec->channels = rf_vals_5222;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_5222;
+       }
+ 
+       /*
+--- a/drivers/net/wireless/rt2x00/rt2500usb.c
++++ b/drivers/net/wireless/rt2x00/rt2500usb.c
+@@ -1721,23 +1721,23 @@ static int rt2500usb_probe_hw_mode(struc
+ 
+       if (rt2x00_rf(rt2x00dev, RF2522)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);
+-              spec->channels = rf_vals_bg_2522;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2522;
+       } else if (rt2x00_rf(rt2x00dev, RF2523)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523);
+-              spec->channels = rf_vals_bg_2523;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2523;
+       } else if (rt2x00_rf(rt2x00dev, RF2524)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524);
+-              spec->channels = rf_vals_bg_2524;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2524;
+       } else if (rt2x00_rf(rt2x00dev, RF2525)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525);
+-              spec->channels = rf_vals_bg_2525;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2525;
+       } else if (rt2x00_rf(rt2x00dev, RF2525E)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);
+-              spec->channels = rf_vals_bg_2525e;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2525e;
+       } else if (rt2x00_rf(rt2x00dev, RF5222)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals_5222);
+-              spec->channels = rf_vals_5222;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_5222;
+       }
+ 
+       /*
+--- a/drivers/net/wireless/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+@@ -5132,12 +5132,12 @@ static int rt2800_probe_hw_mode(struct r
+       if (rt2x00_rf(rt2x00dev, RF2820) ||
+           rt2x00_rf(rt2x00dev, RF2720)) {
+               spec->num_channels = 14;
+-              spec->channels = rf_vals;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals;
+       } else if (rt2x00_rf(rt2x00dev, RF2850) ||
+                  rt2x00_rf(rt2x00dev, RF2750)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals);
+-              spec->channels = rf_vals;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals;
+       } else if (rt2x00_rf(rt2x00dev, RF3020) ||
+                  rt2x00_rf(rt2x00dev, RF2020) ||
+                  rt2x00_rf(rt2x00dev, RF3021) ||
+@@ -5151,11 +5151,11 @@ static int rt2800_probe_hw_mode(struct r
+                  rt2x00_rf(rt2x00dev, RF5390) ||
+                  rt2x00_rf(rt2x00dev, RF5392)) {
+               spec->num_channels = 14;
+-              spec->channels = rf_vals_3x;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_3x;
+       } else if (rt2x00_rf(rt2x00dev, RF3052)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals_3x);
+-              spec->channels = rf_vals_3x;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_3x;
+       }
+ 
+       /*
+--- a/drivers/net/wireless/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -433,7 +433,8 @@ struct hw_mode_spec {
+ #define SUPPORT_RATE_OFDM     0x00000002
+ 
+       unsigned int num_channels;
+-      const struct rf_channel *channels;
++      const struct rf_channel *channels_ht20;
++      const struct rf_channel *channels_ht40;
+       const struct channel_info *channels_info;
+ 
+       struct ieee80211_sta_ht_cap ht;
+--- a/drivers/net/wireless/rt2x00/rt2x00config.c
++++ b/drivers/net/wireless/rt2x00/rt2x00config.c
+@@ -184,7 +184,7 @@ static u16 rt2x00ht_center_channel(struc
+       /*
+        * Initialize center channel to current channel.
+        */
+-      center_channel = spec->channels[conf->channel->hw_value].channel;
++      center_channel = spec->channels_ht40[conf->channel->hw_value].channel;
+ 
+       /*
+        * Adjust center channel to HT40+ and HT40- operation.
+@@ -195,7 +195,7 @@ static u16 rt2x00ht_center_channel(struc
+               center_channel -= (center_channel == 14) ? 1 : 2;
+ 
+       for (i = 0; i < spec->num_channels; i++)
+-              if (spec->channels[i].channel == center_channel)
++              if (spec->channels_ht40[i].channel == center_channel)
+                       return i;
+ 
+       WARN_ON(1);
+@@ -225,15 +225,17 @@ void rt2x00lib_config(struct rt2x00_dev
+               if (conf_is_ht40(conf)) {
+                       set_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
+                       hw_value = rt2x00ht_center_channel(rt2x00dev, conf);
++                      memcpy(&libconf.rf,
++                             &rt2x00dev->spec.channels_ht40[hw_value],
++                             sizeof(libconf.rf));
+               } else {
+                       clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
+                       hw_value = conf->channel->hw_value;
++                      memcpy(&libconf.rf,
++                             &rt2x00dev->spec.channels_ht20[hw_value],
++                             sizeof(libconf.rf));
+               }
+ 
+-              memcpy(&libconf.rf,
+-                     &rt2x00dev->spec.channels[hw_value],
+-                     sizeof(libconf.rf));
+-
+               memcpy(&libconf.channel,
+                      &rt2x00dev->spec.channels_info[hw_value],
+                      sizeof(libconf.channel));
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -887,7 +887,7 @@ static int rt2x00lib_probe_hw_modes(stru
+        */
+       for (i = 0; i < spec->num_channels; i++) {
+               rt2x00lib_channel(&channels[i],
+-                                spec->channels[i].channel,
++                                spec->channels_ht20[i].channel,
+                                 spec->channels_info[i].max_power, i);
+       }
+ 
+--- a/drivers/net/wireless/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/rt2x00/rt61pci.c
+@@ -2797,10 +2797,10 @@ static int rt61pci_probe_hw_mode(struct
+ 
+       if (!test_bit(CAPABILITY_RF_SEQUENCE, &rt2x00dev->cap_flags)) {
+               spec->num_channels = 14;
+-              spec->channels = rf_vals_noseq;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_noseq;
+       } else {
+               spec->num_channels = 14;
+-              spec->channels = rf_vals_seq;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_seq;
+       }
+ 
+       if (rt2x00_rf(rt2x00dev, RF5225) || rt2x00_rf(rt2x00dev, RF5325)) {
+--- a/drivers/net/wireless/rt2x00/rt73usb.c
++++ b/drivers/net/wireless/rt2x00/rt73usb.c
+@@ -2134,18 +2134,18 @@ static int rt73usb_probe_hw_mode(struct
+ 
+       if (rt2x00_rf(rt2x00dev, RF2528)) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_bg_2528);
+-              spec->channels = rf_vals_bg_2528;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_bg_2528;
+       } else if (rt2x00_rf(rt2x00dev, RF5226)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals_5226);
+-              spec->channels = rf_vals_5226;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_5226;
+       } else if (rt2x00_rf(rt2x00dev, RF2527)) {
+               spec->num_channels = 14;
+-              spec->channels = rf_vals_5225_2527;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_5225_2527;
+       } else if (rt2x00_rf(rt2x00dev, RF5225)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals_5225_2527);
+-              spec->channels = rf_vals_5225_2527;
++              spec->channels_ht20 = spec->channels_ht40 = rf_vals_5225_2527;
+       }
+ 
+       /*
-- 
1.8.0

Attachment: pgpXmzLBHRn23.pgp
Description: PGP signature

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to