Though rt2x00lib_probe_hw_modes seems to be the least-intrusive opportunity to
introduce that change, I wonder if it's actually "the right place"[tm] to do it.

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..e060f9a
--- /dev/null
+++ b/package/mac80211/patches/623-rt2x00-rf_vals-rt3352-xtal20.patch
@@ -0,0 +1,97 @@
+Index: compat-wireless-2012-09-07/drivers/net/wireless/rt2x00/rt2800lib.c
+===================================================================
+--- compat-wireless-2012-09-07.orig/drivers/net/wireless/rt2x00/rt2800lib.c
++++ compat-wireless-2012-09-07/drivers/net/wireless/rt2x00/rt2800lib.c
+@@ -5067,6 +5067,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;
+@@ -5144,7 +5165,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) ||
+@@ -5152,6 +5172,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->clk_is_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);
+Index: compat-wireless-2012-09-07/drivers/net/wireless/rt2x00/rt2x00.h
+===================================================================
+--- compat-wireless-2012-09-07.orig/drivers/net/wireless/rt2x00/rt2x00.h
++++ compat-wireless-2012-09-07/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).
++ * @clk_is_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 clk_is_20mhz;
+ };
+ 
+ /*
+Index: compat-wireless-2012-09-07/include/linux/rt2x00_platform.h
+===================================================================
+--- compat-wireless-2012-09-07.orig/include/linux/rt2x00_platform.h
++++ compat-wireless-2012-09-07/include/linux/rt2x00_platform.h
+@@ -18,6 +18,7 @@ struct rt2x00_platform_data {
+ 
+       int disable_2ghz;
+       int disable_5ghz;
++      int clk_is_20mhz;
+ };
+ 
+ #endif /* _RT2X00_PLATFORM_H */
+Index: compat-wireless-2012-09-07/drivers/net/wireless/rt2x00/rt2x00dev.c
+===================================================================
+--- compat-wireless-2012-09-07.orig/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ compat-wireless-2012-09-07/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->clk_is_20mhz = pdata->clk_is_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 clk_is_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..cb02515 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.clk_is_20mhz = 1;
+       }
        platform_device_register(&rt305x_wifi_device);
 }
 
-- 
1.8.0

Attachment: pgpuU9IWCgOat.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