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

Reply via email to