Hi, Daniel
And no, No, NO! :) I pooly explain or you don't pay attention. Xtal20/40MHz external clock/tick generator have no direct relation to HT20/HT40 but precision of channel frequency only. So for that case we use corrected frequency rf_vals table. And Xtal20/40MHz really must be read from SYSC_CFG_REG as in original patch. In my dir-620 d1 Xtal20MHz really exist. rt3050/rt3052 use xtal40MHz (in specs, I don't check in my dir-620 a1 (rt3052), tonight I'll check it). I think no need to differentiate ht20/ht40. 12.11.2012, 07:06, "Daniel Golle" <dgo...@allnet.de>: > 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 --- serge _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel