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
pgpXmzLBHRn23.pgp
Description: PGP signature
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel