rt2800: 5592: add channels table
authorStanislaw Gruszka <stf_xl@wp.pl>
Sat, 16 Mar 2013 18:19:31 +0000 (19:19 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 18 Mar 2013 20:38:30 +0000 (16:38 -0400)
Based on:
RT5592_ChipSwitchChannel()
RT5592_Frequency_Plan_Xtal20M[]
RT5592_Frequency_Plan_Xtal40M[]

from:
DPO_RT5572_LinuxSTA_2.6.1.3_20121022/chips/rt5592.c

Signed-off-by: Stanislaw Gruszka <stf_xl@wp.pl>
Tested-by: Wanlong Gao <gaowanlong@cn.fujitsu.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2800.h
drivers/net/wireless/rt2x00/rt2800lib.c

index 58c01648809caf34843e7b943766e3e928cbca00..b72f71ddbf79d92789f27a124f5d54c3b2262b2e 100644 (file)
 #define GPIO_SWITCH_6                  FIELD32(0x00000040)
 #define GPIO_SWITCH_7                  FIELD32(0x00000080)
 
+/*
+ * FIXME: where the DEBUG_INDEX name come from?
+ */
+#define MAC_DEBUG_INDEX                        0x05e8
+#define MAC_DEBUG_INDEX_XTAL           FIELD32(0x80000000)
+
 /*
  * MAC Control/Status Registers(CSR).
  * Some values are set in TU, whereas 1 TU == 1024 us.
index 45f58c94552645cd63f31087ede09db6ba930643..45f033842ab9a7ae10bca2dc06f910e4921d728a 100644 (file)
@@ -5124,6 +5124,138 @@ static const struct rf_channel rf_vals_3x[] = {
        {173, 0x61, 0, 9},
 };
 
+static const struct rf_channel rf_vals_5592_xtal20[] = {
+       /* Channel, N, K, mod, R */
+       {1, 482, 4, 10, 3},
+       {2, 483, 4, 10, 3},
+       {3, 484, 4, 10, 3},
+       {4, 485, 4, 10, 3},
+       {5, 486, 4, 10, 3},
+       {6, 487, 4, 10, 3},
+       {7, 488, 4, 10, 3},
+       {8, 489, 4, 10, 3},
+       {9, 490, 4, 10, 3},
+       {10, 491, 4, 10, 3},
+       {11, 492, 4, 10, 3},
+       {12, 493, 4, 10, 3},
+       {13, 494, 4, 10, 3},
+       {14, 496, 8, 10, 3},
+       {36, 172, 8, 12, 1},
+       {38, 173, 0, 12, 1},
+       {40, 173, 4, 12, 1},
+       {42, 173, 8, 12, 1},
+       {44, 174, 0, 12, 1},
+       {46, 174, 4, 12, 1},
+       {48, 174, 8, 12, 1},
+       {50, 175, 0, 12, 1},
+       {52, 175, 4, 12, 1},
+       {54, 175, 8, 12, 1},
+       {56, 176, 0, 12, 1},
+       {58, 176, 4, 12, 1},
+       {60, 176, 8, 12, 1},
+       {62, 177, 0, 12, 1},
+       {64, 177, 4, 12, 1},
+       {100, 183, 4, 12, 1},
+       {102, 183, 8, 12, 1},
+       {104, 184, 0, 12, 1},
+       {106, 184, 4, 12, 1},
+       {108, 184, 8, 12, 1},
+       {110, 185, 0, 12, 1},
+       {112, 185, 4, 12, 1},
+       {114, 185, 8, 12, 1},
+       {116, 186, 0, 12, 1},
+       {118, 186, 4, 12, 1},
+       {120, 186, 8, 12, 1},
+       {122, 187, 0, 12, 1},
+       {124, 187, 4, 12, 1},
+       {126, 187, 8, 12, 1},
+       {128, 188, 0, 12, 1},
+       {130, 188, 4, 12, 1},
+       {132, 188, 8, 12, 1},
+       {134, 189, 0, 12, 1},
+       {136, 189, 4, 12, 1},
+       {138, 189, 8, 12, 1},
+       {140, 190, 0, 12, 1},
+       {149, 191, 6, 12, 1},
+       {151, 191, 10, 12, 1},
+       {153, 192, 2, 12, 1},
+       {155, 192, 6, 12, 1},
+       {157, 192, 10, 12, 1},
+       {159, 193, 2, 12, 1},
+       {161, 193, 6, 12, 1},
+       {165, 194, 2, 12, 1},
+       {184, 164, 0, 12, 1},
+       {188, 164, 4, 12, 1},
+       {192, 165, 8, 12, 1},
+       {196, 166, 0, 12, 1},
+};
+
+static const struct rf_channel rf_vals_5592_xtal40[] = {
+       /* Channel, N, K, mod, R */
+       {1, 241, 2, 10, 3},
+       {2, 241, 7, 10, 3},
+       {3, 242, 2, 10, 3},
+       {4, 242, 7, 10, 3},
+       {5, 243, 2, 10, 3},
+       {6, 243, 7, 10, 3},
+       {7, 244, 2, 10, 3},
+       {8, 244, 7, 10, 3},
+       {9, 245, 2, 10, 3},
+       {10, 245, 7, 10, 3},
+       {11, 246, 2, 10, 3},
+       {12, 246, 7, 10, 3},
+       {13, 247, 2, 10, 3},
+       {14, 248, 4, 10, 3},
+       {36, 86, 4, 12, 1},
+       {38, 86, 6, 12, 1},
+       {40, 86, 8, 12, 1},
+       {42, 86, 10, 12, 1},
+       {44, 87, 0, 12, 1},
+       {46, 87, 2, 12, 1},
+       {48, 87, 4, 12, 1},
+       {50, 87, 6, 12, 1},
+       {52, 87, 8, 12, 1},
+       {54, 87, 10, 12, 1},
+       {56, 88, 0, 12, 1},
+       {58, 88, 2, 12, 1},
+       {60, 88, 4, 12, 1},
+       {62, 88, 6, 12, 1},
+       {64, 88, 8, 12, 1},
+       {100, 91, 8, 12, 1},
+       {102, 91, 10, 12, 1},
+       {104, 92, 0, 12, 1},
+       {106, 92, 2, 12, 1},
+       {108, 92, 4, 12, 1},
+       {110, 92, 6, 12, 1},
+       {112, 92, 8, 12, 1},
+       {114, 92, 10, 12, 1},
+       {116, 93, 0, 12, 1},
+       {118, 93, 2, 12, 1},
+       {120, 93, 4, 12, 1},
+       {122, 93, 6, 12, 1},
+       {124, 93, 8, 12, 1},
+       {126, 93, 10, 12, 1},
+       {128, 94, 0, 12, 1},
+       {130, 94, 2, 12, 1},
+       {132, 94, 4, 12, 1},
+       {134, 94, 6, 12, 1},
+       {136, 94, 8, 12, 1},
+       {138, 94, 10, 12, 1},
+       {140, 95, 0, 12, 1},
+       {149, 95, 9, 12, 1},
+       {151, 95, 11, 12, 1},
+       {153, 96, 1, 12, 1},
+       {155, 96, 3, 12, 1},
+       {157, 96, 5, 12, 1},
+       {159, 96, 7, 12, 1},
+       {161, 96, 9, 12, 1},
+       {165, 97, 1, 12, 1},
+       {184, 82, 0, 12, 1},
+       {188, 82, 4, 12, 1},
+       {192, 82, 8, 12, 1},
+       {196, 83, 0, 12, 1},
+};
+
 static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
@@ -5132,6 +5264,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
        char *default_power2;
        unsigned int i;
        u16 eeprom;
+       u32 reg;
 
        /*
         * Disable powersaving as default on PCI devices.
@@ -5213,6 +5346,17 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                spec->supported_bands |= SUPPORT_BAND_5GHZ;
                spec->num_channels = ARRAY_SIZE(rf_vals_3x);
                spec->channels = rf_vals_3x;
+       } else if (rt2x00_rf(rt2x00dev, RF5592)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+
+               rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, &reg);
+               if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
+                       spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal40);
+                       spec->channels = rf_vals_5592_xtal40;
+               } else {
+                       spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal20);
+                       spec->channels = rf_vals_5592_xtal20;
+               }
        }
 
        if (WARN_ON_ONCE(!spec->channels))