Hi Don't work because of function call order: rt2x00lib_probe_dev calls first rt2800_probe_hw (it use is_clk_20mhz init'ed by default 40MHz & switch rf_vals table) and second rt2x00lib_probe_hw which set correct is_clk_20mhz but don't switch rf_vals table. As result is_clk_20mhz is correct but rf_vals table always for 40MHz.
16.11.2012, 18:16, "Daniel Golle" <dgo...@allnet.de>: > Detect 20Mhz clock during board-setup of the Rt3352 and Rt5350 and make the > value available to rt2x00 via rt2x00_platform_data. > This is then used to select rf_vals according to whether the clock runs at > 40MHz > or at 20MHz in rt2x00. > > Signed-off-by: Daniel Golle <dgo...@allnet.de> > > create mode 100644 > package/mac80211/patches/623-rt2x00-rf_vals-rt3352-xtal20.patch > > diff --git a/package/mac80211/patches/623-rt2x00-rf_vals-rt3352-xtal20.patch > b/package/mac80211/patches/623-rt2x00-rf_vals-rt3352-xtal20.patch > new file mode 100644 > index 0000000..5ee6627 > --- /dev/null > +++ b/package/mac80211/patches/623-rt2x00-rf_vals-rt3352-xtal20.patch > @@ -0,0 +1,89 @@ > +--- a/drivers/net/wireless/rt2x00/rt2800lib.c > ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c > +@@ -5072,6 +5072,27 @@ static const struct rf_channel rf_vals_3 > + {173, 0x61, 0, 9}, > + }; > + > ++/* > ++ * RF value list for rt3xxx with Xtal20MHz > ++ * Supports: 2.4 GHz (all) (RF3322) > ++ */ > ++static const struct rf_channel rf_vals_xtal20mhz_3x[] = { > ++ {1, 0xE2, 2, 0x14}, > ++ {2, 0xE3, 2, 0x14}, > ++ {3, 0xE4, 2, 0x14}, > ++ {4, 0xE5, 2, 0x14}, > ++ {5, 0xE6, 2, 0x14}, > ++ {6, 0xE7, 2, 0x14}, > ++ {7, 0xE8, 2, 0x14}, > ++ {8, 0xE9, 2, 0x14}, > ++ {9, 0xEA, 2, 0x14}, > ++ {10, 0xEB, 2, 0x14}, > ++ {11, 0xEC, 2, 0x14}, > ++ {12, 0xED, 2, 0x14}, > ++ {13, 0xEE, 2, 0x14}, > ++ {14, 0xF0, 2, 0x18}, > ++}; > ++ > + static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) > + { > + struct hw_mode_spec *spec = &rt2x00dev->spec; > +@@ -5149,7 +5170,6 @@ static int rt2800_probe_hw_mode(struct r > + rt2x00_rf(rt2x00dev, RF3022) || > + rt2x00_rf(rt2x00dev, RF3290) || > + rt2x00_rf(rt2x00dev, RF3320) || > +- rt2x00_rf(rt2x00dev, RF3322) || > + rt2x00_rf(rt2x00dev, RF5360) || > + rt2x00_rf(rt2x00dev, RF5370) || > + rt2x00_rf(rt2x00dev, RF5372) || > +@@ -5157,6 +5177,12 @@ static int rt2800_probe_hw_mode(struct r > + rt2x00_rf(rt2x00dev, RF5392)) { > + spec->num_channels = 14; > + spec->channels = rf_vals_3x; > ++ } else if (rt2x00_rf(rt2x00dev, RF3322)) { > ++ spec->num_channels = 14; > ++ if (spec->is_clk_20mhz) > ++ spec->channels = rf_vals_xtal20mhz_3x; > ++ else > ++ spec->channels = rf_vals_3x; > + } else if (rt2x00_rf(rt2x00dev, RF3052)) { > + spec->supported_bands |= SUPPORT_BAND_5GHZ; > + spec->num_channels = ARRAY_SIZE(rf_vals_3x); > +--- a/drivers/net/wireless/rt2x00/rt2x00.h > ++++ b/drivers/net/wireless/rt2x00/rt2x00.h > +@@ -421,6 +421,7 @@ static inline struct rt2x00_intf* vif_to > + * @channels: Device/chipset specific channel values (See &struct > rf_channel). > + * @channels_info: Additional information for channels (See &struct > channel_info). > + * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap). > ++ * @is_clk_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz > + */ > + struct hw_mode_spec { > + unsigned int supported_bands; > +@@ -437,6 +438,7 @@ struct hw_mode_spec { > + const struct channel_info *channels_info; > + > + struct ieee80211_sta_ht_cap ht; > ++ int is_clk_20mhz; > + }; > + > + /* > +--- a/include/linux/rt2x00_platform.h > ++++ b/include/linux/rt2x00_platform.h > +@@ -18,6 +18,7 @@ struct rt2x00_platform_data { > + > + int disable_2ghz; > + int disable_5ghz; > ++ int is_clk_20mhz; > + }; > + > + #endif /* _RT2X00_PLATFORM_H */ > +--- a/drivers/net/wireless/rt2x00/rt2x00dev.c > ++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c > +@@ -854,6 +854,7 @@ static int rt2x00lib_probe_hw_modes(stru > + spec->supported_bands &= ~SUPPORT_BAND_2GHZ; > + if (pdata->disable_5ghz) > + spec->supported_bands &= ~SUPPORT_BAND_5GHZ; > ++ spec->is_clk_20mhz = pdata->is_clk_20mhz; > + } > + > + if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) { > diff --git a/target/linux/generic/files/include/linux/rt2x00_platform.h > b/target/linux/generic/files/include/linux/rt2x00_platform.h > index e10377e..80483ef 100644 > --- a/target/linux/generic/files/include/linux/rt2x00_platform.h > +++ b/target/linux/generic/files/include/linux/rt2x00_platform.h > @@ -18,6 +18,7 @@ struct rt2x00_platform_data { > > int disable_2ghz; > int disable_5ghz; > + int is_clk_20mhz; > }; > > #endif /* _RT2X00_PLATFORM_H */ > diff --git > a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > index 949232d..81c0a44 100644 > --- > a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > +++ > b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > @@ -110,6 +110,7 @@ > #define RT5350_SYSCFG0_DRAM_SIZE_16M 2 > #define RT5350_SYSCFG0_DRAM_SIZE_32M 3 > #define RT5350_SYSCFG0_DRAM_SIZE_64M 4 > +#define RT3352_SYSCFG0_XTAL_SEL BIT(20) > > #define RT3352_SYSCFG1_USB0_HOST_MODE BIT(10) > > diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > index 92ae56d..56eae8a 100644 > --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > @@ -215,7 +215,15 @@ static struct platform_device rt305x_wifi_device = { > > void __init rt305x_register_wifi(void) > { > + u32 t; > rt305x_wifi_data.eeprom_file_name = "RT305X.eeprom"; > + > + if (soc_is_rt3352() || soc_is_rt5350()) { > + t = rt305x_sysc_rr(SYSC_REG_SYSTEM_CONFIG); > + t &= RT3352_SYSCFG0_XTAL_SEL; > + if (!t) > + rt305x_wifi_data.is_clk_20mhz = 1; > + } > platform_device_register(&rt305x_wifi_device); > } > > -- > 1.8.0 --- serge _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel