On 04/08/13 15:32, Владимир Столяров wrote:
This patch fixes temperature compensation on rt5350. Other devices also could 
be added (e.g. rt3352).
This patch is reworked version of my previous patch. Tested on my dir-320 b1 
(aka dir-320 nru)



Hi,

can you split this so it is not part of the 616-rt2x00-support-rt5350.patch patch ?

also the patch seems to have a lot of whitespace errors. it should really be run via the check_patch.pl script.

        John


Signed-off-by: Vladimir Stolyarov<[email protected]>
--- openwrt/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch     
2013-08-01 16:58:41.000000000 +0400
+++ 
openwrt-on-dir-320-b1/trunk/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
 2013-08-04 17:22:07.000000000 +0400
@@ -1,7 +1,7 @@
  Index: compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800.h
  ===================================================================
---- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2800.h       
2013-07-27 18:03:04.837450150 +0200
-+++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800.h    
2013-07-27 18:03:04.973450152 +0200
+--- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2800.h       
2013-08-02 17:24:53.000000000 +0400
++++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800.h    
2013-08-04 16:36:31.000000000 +0400
  @@ -71,6 +71,7 @@
   #define RF3053                               0x000d
   #define RF5592                               0x000f
@@ -10,11 +10,185 @@
   #define RF5360                               0x5360
   #define RF5370                               0x5370
   #define RF5372                               0x5372
+@@ -2238,6 +2239,118 @@
+ #define EEPROM_VERSION_FAE            FIELD16(0x00ff)
+ #define EEPROM_VERSION_VERSION                FIELD16(0xff00)
+
++#define EEPROM_TSSI_OVER_OFDM54               0x0037 // The TSSI over OFDM 
54Mbps
++#define EEPROM_TSSI_BASE              FIELD16(0x3f00)
++#define EEPROM_CH_2_TSSI_DELTA                FIELD16(0x0f00)
++#define EEPROM_CH_1_TSSI_DELTA                FIELD16(0xf000)
++/*
++ * Per channel tssi deltas
++ */
++
++#define EEPROM_CH_3_4_TSSI_DELTA      0x002a
++#define EEPROM_CH_3_TSSI_DELTA                FIELD16(0x000f)
++#define EEPROM_CH_4_TSSI_DELTA                FIELD16(0x0f00)
++
++#define EEPROM_CH_5_6_TSSI_DELTA      0x002b
++#define EEPROM_CH_5_TSSI_DELTA                FIELD16(0x000f)
++#define EEPROM_CH_6_TSSI_DELTA                FIELD16(0x0f00)
++
++#define EEPROM_CH_7_8_TSSI_DELTA      0x002c
++#define EEPROM_CH_7_TSSI_DELTA                FIELD16(0x000f)
++#define EEPROM_CH_8_TSSI_DELTA                FIELD16(0x0f00)
++
++#define EEPROM_CH_9_10_TSSI_DELTA     0x002d
++#define EEPROM_CH_9_TSSI_DELTA                FIELD16(0x000f)
++#define EEPROM_CH_10_TSSI_DELTA               FIELD16(0x0f00)
++
++#define EEPROM_CH_11_12_TSSI_DELTA    0x002e
++#define EEPROM_CH_11_TSSI_DELTA               FIELD16(0x000f)
++#define EEPROM_CH_12_TSSI_DELTA               FIELD16(0x0f00)
++
++#define EEPROM_CH_13_14_TSSI_DELTA    0x002f
++#define EEPROM_CH_13_TSSI_DELTA               FIELD16(0x000f)
++#define EEPROM_CH_14_TSSI_DELTA               FIELD16(0x0f00)
++
++/*
++ * tssi ratio values (used in get_tssi_ratio)
++ * array idx: [0 ; 24]
++ * delta pwr: [-12;12]
++ */
++const u32 rt5350_tssi_ratio_values[25] = {    955, 1161, 1413, 1718, 2089,
++                                              2541, 3090, 3758, 4571, 5559,
++                                              6761, 8222, 10000, 12162, 14791,
++                                              17989, 21878, 26607, 32359, 
39355,
++                                              47863, 58210, 70795, 86099, 
104713 };
++
++/*
++ * tssi ratio deltas (used for delta_power calculation)
++ * 1st idx: 0-CCK, 1-OFDM, 2-HT, 3-HT40, 4-HT+STBC, 5-HT40+STBC
++ */
++const int rt5350_tssi_ratio_deltas[6][16] ={  { -12, -12, -12, -12 },
++                                              { -15, -15, -15, -15, -15, -15, 
-15, -15 },
++                                              { -15, -15, -15, -15, -15, -15, 
-15, -15, -15, -15, -15, -15 ,-15, -15, -15, -15 },
++                                              { -15, -15, -15, -15, -15, -16, 
-16, -16, -16, -16, -16, -16 ,-16, -16, -16, -16 },
++                                              { -15, -15, -15, -15, -15, -15, 
-15, -15 },
++                                              { -15, -15, -15, -15, -15, -16, 
-16, -16 },
++                                         };
++
++/*
++ * desired tssi for cck, ofdm, ht
++ */
++#define EEPROM_DESTSSI_CCK_MCS0123    0x006f
++#define EEPROM_DESTSSI_CCK_MCS0               FIELD16(0x000f)
++#define EEPROM_DESTSSI_CCK_MCS1               FIELD16(0x00f0)
++#define EEPROM_DESTSSI_CCK_MCS2               FIELD16(0x0f00)
++#define EEPROM_DESTSSI_CCK_MCS3               FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_OFDM_MCS0123   0x0070
++#define EEPROM_DESTSSI_OFDM_MCS0      FIELD16(0x000f)
++#define EEPROM_DESTSSI_OFDM_MCS1      FIELD16(0x00f0)
++#define EEPROM_DESTSSI_OFDM_MCS2      FIELD16(0x0f00)
++#define EEPROM_DESTSSI_OFDM_MCS3      FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_OFDM_MCS4567   0x0071
++#define EEPROM_DESTSSI_OFDM_MCS4      FIELD16(0x000f)
++#define EEPROM_DESTSSI_OFDM_MCS5      FIELD16(0x00f0)
++#define EEPROM_DESTSSI_OFDM_MCS6      FIELD16(0x0f00)
++#define EEPROM_DESTSSI_OFDM_MCS7      FIELD16(0xf000)
++#define EEPROM_DESTSSI_OFDM54         FIELD16(0x0f00)
++
++#define EEPROM_DESTSSI_HT_MCS0123     0x0072
++#define EEPROM_DESTSSI_HT_MCS0                FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_MCS1                FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_MCS2                FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_MCS3                FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_HT_MCS4567     0x0073
++#define EEPROM_DESTSSI_HT_MCS4                FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_MCS5                FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_MCS6                FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_MCS7                FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_HT_MCS891011   0x0074
++#define EEPROM_DESTSSI_HT_MCS8                FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_MCS9                FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_MCS10               FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_MCS11               FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_HT_MCS12131415 0x0073
++#define EEPROM_DESTSSI_HT_MCS12               FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_MCS13               FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_MCS14               FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_MCS15               FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_HT_STBC_MCS0123        0x0072
++#define EEPROM_DESTSSI_HT_STBC_MCS0   FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_STBC_MCS1   FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_STBC_MCS2   FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_STBC_MCS3   FIELD16(0xf000)
++
++#define EEPROM_DESTSSI_HT_STBC_MCS4567        0x0073
++#define EEPROM_DESTSSI_HT_STBC_MCS4   FIELD16(0x000f)
++#define EEPROM_DESTSSI_HT_STBC_MCS5   FIELD16(0x00f0)
++#define EEPROM_DESTSSI_HT_STBC_MCS6   FIELD16(0x0f00)
++#define EEPROM_DESTSSI_HT_STBC_MCS7   FIELD16(0xf000)
+ /*
+  * HW MAC address.
+  */
  Index: compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800lib.c
  ===================================================================
---- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2800lib.c    
2013-07-27 18:03:04.949450152 +0200
-+++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800lib.c 
2013-07-27 18:20:44.749475406 +0200
-@@ -2141,6 +2141,15 @@
+--- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2800lib.c    
2013-08-02 17:24:53.000000000 +0400
++++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2800lib.c 
2013-08-04 17:20:26.000000000 +0400
+@@ -692,8 +692,9 @@
+       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
+       struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
+       struct txdone_entry_desc txdesc;
+-      u32 word;
++      u32 word, desired_tssi;
+       u16 mcs, real_mcs;
++      u8 rate_mode;
+       int aggr, ampdu;
+
+       /*
+@@ -707,6 +708,8 @@
+
+       real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
+       aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE);
++      
++      rate_mode = rt2x00_get_field32(word, TXWI_W0_PHYMODE);
+
+       /*
+        * If a frame was meant to be sent as a single non-aggregated MPDU
+@@ -762,6 +765,34 @@
+        */
+       if (txdesc.retry)
+               __set_bit(TXDONE_FALLBACK,&txdesc.flags);
++      
++      
++      switch(rate_mode) {
++        case RATE_MODE_CCK:
++          desired_tssi = rt2x00dev->desired_tssi_over_cck[mcs];
++          break;
++        case RATE_MODE_OFDM:
++          desired_tssi = rt2x00dev->desired_tssi_over_ofdm[mcs];
++          break;
++        case RATE_MODE_HT_MIX:
++        case RATE_MODE_HT_GREENFIELD:
++          if (rt2x00_get_field32(word, TXWI_W0_BW)) { //HT40
++              if(rt2x00_get_field32(word, TXWI_W0_STBC)&&  (mcs<  7)) {
++                      desired_tssi = 
rt2x00dev->desired_tssi_over_ht40_stbc[mcs];
++              } else {
++                      desired_tssi = rt2x00dev->desired_tssi_over_ht40[mcs];
++              }
++          } else {
++              if(rt2x00_get_field32(word, TXWI_W0_STBC)&&  (mcs<  7)) {
++                      desired_tssi = 
rt2x00dev->desired_tssi_over_ht_stbc[mcs];
++              } else {
++                      desired_tssi = rt2x00dev->desired_tssi_over_ht[mcs];
++              };
++          }
++          break;
++      }
++      rt2x00dev->desired_tssi = desired_tssi;
++      
+
+       rt2x00lib_txdone(entry,&txdesc);
+ }
+@@ -2141,6 +2172,15 @@
        if (rf->channel<= 14) {
                int idx = rf->channel-1;

@@ -30,7 +204,7 @@
                if (test_bit(CAPABILITY_BT_COEXIST,&rt2x00dev->cap_flags)) {
                        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
                                /* r55/r59 value array of channel 1~14 */
-@@ -2598,6 +2607,7 @@
+@@ -2598,6 +2638,7 @@
        case RF3322:
                rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
                break;
@@ -38,7 +212,7 @@
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -2614,6 +2624,7 @@
+@@ -2614,6 +2655,7 @@

        if (rt2x00_rf(rt2x00dev, RF3290) ||
            rt2x00_rf(rt2x00dev, RF3322) ||
@@ -46,7 +220,7 @@
            rt2x00_rf(rt2x00dev, RF5360) ||
            rt2x00_rf(rt2x00dev, RF5370) ||
            rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -2778,7 +2789,8 @@
+@@ -2778,7 +2820,8 @@
        /*
         * Clear update flag
         */
@@ -56,7 +230,275 @@
                rt2800_bbp_read(rt2x00dev, 49,&bbp);
                rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
                rt2800_bbp_write(rt2x00dev, 49, bbp);
-@@ -3224,6 +3236,7 @@
+@@ -2960,6 +3003,254 @@
+       return min(delta, 0);
+ }
+
++static u32 tssi_ratio(struct rt2x00_dev *rt2x00dev, int delta_power)
++{
++  u32 ratio = 0;
++
++  switch(rt2x00dev->chip.rt) {
++      case RT5350:
++              if((delta_power>= -12)&&  (delta_power<= 12)) {
++                      ratio = rt5350_tssi_ratio_values[delta_power + 12];
++              }
++              break;
++      default:
++              break;
++  }
++
++  return ratio;
++}
++
++static void init_desired_tssi_table(struct rt2x00_dev *rt2x00dev, int channel)
++{
++  u16 eeprom;
++  u8 tssi_base, tssi_ch_delta[15], tssi_current_ch_delta;
++  u8 tx_power[28], tx_power_stbc[7], tx_power_ofdm54;
++  const int (*tssi_ratio_deltas)[6][16];
++  int i;
++
++  switch(rt2x00dev->chip.rt) {
++      case RT5350:
++              tssi_ratio_deltas =&rt5350_tssi_ratio_deltas;
++              rt2x00dev->tssi_max = RT5350_TSSI_MAX;
++              break;
++      default:
++              break;
++  }
++              
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_OVER_OFDM54,&eeprom);
++  tssi_base = rt2x00_get_field16(eeprom, EEPROM_TSSI_BASE);
++  rt2x00dev->tssi_ref = tssi_base;
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_OVER_OFDM54,&eeprom);
++  tssi_ch_delta[0] = 14; //just to be safe
++  tssi_ch_delta[1] = rt2x00_get_field16(eeprom, EEPROM_CH_1_TSSI_DELTA);
++  tssi_ch_delta[2] = rt2x00_get_field16(eeprom, EEPROM_CH_2_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_3_4_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[3] = rt2x00_get_field16(eeprom, EEPROM_CH_3_TSSI_DELTA);
++  tssi_ch_delta[4] = rt2x00_get_field16(eeprom, EEPROM_CH_4_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_5_6_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[5] = rt2x00_get_field16(eeprom, EEPROM_CH_5_TSSI_DELTA);
++  tssi_ch_delta[6] = rt2x00_get_field16(eeprom, EEPROM_CH_6_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_7_8_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[7] = rt2x00_get_field16(eeprom, EEPROM_CH_7_TSSI_DELTA);
++  tssi_ch_delta[8] = rt2x00_get_field16(eeprom, EEPROM_CH_8_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_9_10_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[9] = rt2x00_get_field16(eeprom, EEPROM_CH_9_TSSI_DELTA);
++  tssi_ch_delta[10] = rt2x00_get_field16(eeprom, EEPROM_CH_10_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_11_12_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[11] = rt2x00_get_field16(eeprom, EEPROM_CH_11_TSSI_DELTA);
++  tssi_ch_delta[12] = rt2x00_get_field16(eeprom, EEPROM_CH_12_TSSI_DELTA);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_CH_13_14_TSSI_DELTA,&eeprom);
++  tssi_ch_delta[13] = rt2x00_get_field16(eeprom, EEPROM_CH_13_TSSI_DELTA);
++  tssi_ch_delta[14] = rt2x00_get_field16(eeprom, EEPROM_CH_14_TSSI_DELTA);
++
++  tssi_current_ch_delta = tssi_ch_delta[channel];
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_OFDM_MCS4567,&eeprom);
++  tx_power_ofdm54 = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM54);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_CCK_MCS0123,&eeprom);
++  tx_power[0] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_CCK_MCS0);
++  tx_power[1] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_CCK_MCS1);
++  tx_power[2] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_CCK_MCS2);
++  tx_power[3] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_CCK_MCS3);
++
++  // Boundary verification: the desired TSSI value (CCK: MCS0~MCS3)
++  for (i=0;i<3;i++)
++  {
++    rt2x00dev->desired_tssi_over_cck[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power[i] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[0][i]);
++    if (rt2x00dev->desired_tssi_over_cck[i]>  (rt2x00dev->tssi_max * 10000))
++    {
++      rt2x00dev->desired_tssi_over_cck[i] = (rt2x00dev->tssi_max * 10000);
++    }
++  }
++
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_OFDM_MCS0123,&eeprom);
++  tx_power[4] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS0);
++  tx_power[5] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS1);
++  tx_power[6] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS2);
++  tx_power[7] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS3);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_OFDM_MCS0123,&eeprom);
++  tx_power[8] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS4);
++  tx_power[9] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS5);
++  tx_power[10] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS6);
++  tx_power[11] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_OFDM_MCS7);
++
++  // Boundary verification: the desired TSSI value (OFDM: MCS0~MCS7)
++  for (i=0;i<7;i++)
++  {
++    rt2x00dev->desired_tssi_over_ofdm[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power[i + 4] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[1][i]);
++    if (rt2x00dev->desired_tssi_over_ofdm[i]>  (rt2x00dev->tssi_max * 10000))
++    {
++      rt2x00dev->desired_tssi_over_ofdm[i] = (rt2x00dev->tssi_max * 10000);
++    }
++  }
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_HT_MCS0123,&eeprom);
++  tx_power[12] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS0);
++  tx_power[13] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS1);
++  tx_power[14] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS2);
++  tx_power[15] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS3);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_CCK_MCS0123,&eeprom);
++  tx_power[16] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS4);
++  tx_power[17] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS5);
++  tx_power[18] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS6);
++  tx_power[19] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS7);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_HT_MCS0123,&eeprom);
++  tx_power[20] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS0);
++  tx_power[21] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS1);
++  tx_power[22] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS2);
++  tx_power[23] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS3);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_CCK_MCS0123,&eeprom);
++  tx_power[24] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS4);
++  tx_power[25] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS5);
++  tx_power[26] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS6);
++  tx_power[27] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_MCS7);
++
++  // Boundary verification: the desired TSSI value (HT, HT40: MCS0~MCS15)
++  for (i=0;i<15;i++)
++  {
++    rt2x00dev->desired_tssi_over_ht[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power[i + 12] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[2][i]);
++    rt2x00dev->desired_tssi_over_ht40[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power[i + 12] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[3][i]);
++    if (rt2x00dev->desired_tssi_over_ht[i]>  (rt2x00dev->tssi_max * 10000))
++    {
++      rt2x00dev->desired_tssi_over_ht[i] = (rt2x00dev->tssi_max * 10000);
++    }
++    if (rt2x00dev->desired_tssi_over_ht40[i]>  (rt2x00dev->tssi_max * 10000))
++    {
++      rt2x00dev->desired_tssi_over_ht40[i] = (rt2x00dev->tssi_max * 10000);
++    }
++  }
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_HT_STBC_MCS0123,&eeprom);
++  tx_power_stbc[0] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS0);
++  tx_power_stbc[1] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS1);
++  tx_power_stbc[2] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS2);
++  tx_power_stbc[3] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS3);
++
++  rt2x00_eeprom_read(rt2x00dev, EEPROM_DESTSSI_HT_STBC_MCS0123,&eeprom);
++  tx_power_stbc[4] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS4);
++  tx_power_stbc[5] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS5);
++  tx_power_stbc[6] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS6);
++  tx_power_stbc[7] = rt2x00_get_field16(eeprom, EEPROM_DESTSSI_HT_STBC_MCS7);
++
++  // Boundary verification: the desired TSSI value (HT,HT40+STBC: MCS0~MCS7)
++  for (i=0;i<7;i++)
++  {
++    rt2x00dev->desired_tssi_over_ht_stbc[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power_stbc[i] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[4][i]);
++    rt2x00dev->desired_tssi_over_ht40_stbc[i] = tssi_base *
++      tssi_ratio(rt2x00dev, tx_power_stbc[i] - tx_power_ofdm54 + 
tssi_current_ch_delta + (*tssi_ratio_deltas)[5][i]);
++    if (rt2x00dev->desired_tssi_over_ht_stbc[i]>  (rt2x00dev->tssi_max * 
10000))
++    {
++      rt2x00dev->desired_tssi_over_ht_stbc[i] = (rt2x00dev->tssi_max * 10000);
++    }
++    if (rt2x00dev->desired_tssi_over_ht40_stbc[i]>  (rt2x00dev->tssi_max * 
10000))
++    {
++      rt2x00dev->desired_tssi_over_ht40_stbc[i] = (rt2x00dev->tssi_max * 
10000);
++    }
++  }
++
++  if (rt2x00dev->alt_temp_comp_delta == '\0')
++      rt2x00dev->alt_temp_comp_delta = 0;
++}
++
++static int alt_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)
++{
++  u32 desired_tssi, current_tssi;
++  u8 bbp49, bbp47;
++  int i;
++
++  //clear TSSI_UPDATE_REQ first
++  rt2800_bbp_read(rt2x00dev, 47,&bbp47);
++  rt2x00_set_field8(&bbp47, BBP47_TSSI_UPDATE_REQ, 0);
++  rt2800_bbp_write(rt2x00dev, 47, bbp47);
++
++  //write 1 to enable TSSI_INFO update
++  rt2800_bbp_read(rt2x00dev, 47,&bbp47);
++  rt2x00_set_field8(&bbp47, BBP47_TSSI_UPDATE_REQ, 1);
++  rt2800_bbp_write(rt2x00dev, 47, bbp47);
++  mdelay(100);
++
++  //wait for update
++  for(i=0;i<100;i++) {
++      rt2800_bbp_read(rt2x00dev, 47,&bbp47);
++      rt2800_bbp_read(rt2x00dev, 49,&bbp49);      
++      if (!rt2x00_get_field8(bbp47, BBP47_TSSI_UPDATE_REQ) ||
++           rt2x00_get_field8(bbp49, BBP49_UPDATE_FLAG)) { //TSSI updated, 
request cleared, update flag set
++              rt2800_bbp_read(rt2x00dev, 47,&bbp47);
++              rt2x00_set_field8(&bbp49, BBP47_TSSI_REPORT_SEL, 0);
++              rt2800_bbp_write(rt2x00dev, 47, bbp47);
++              rt2800_bbp_read(rt2x00dev, 49,&bbp49);
++
++              if(bbp47>  rt2x00dev->tssi_max) {
++                      current_tssi = 0;
++              }
++      }
++      mdelay(1);
++ }
++      
++
++  desired_tssi = rt2x00dev->desired_tssi;
++  switch (rt2x00dev->chip.rt) {
++      case RT5350:
++              current_tssi = bbp49 * 100000 / (rt2x00dev->tssi_ref);
++              break;
++      default:
++              current_tssi = bbp49 * 10000;
++              break;
++  }
++
++  if ((desired_tssi-desired_tssi/32>  current_tssi)&&
++      (rt2x00dev->alt_temp_comp_delta<= 12))
++  {
++    rt2x00dev->alt_temp_comp_delta++;
++  }
++
++  if ((desired_tssi+desired_tssi/32<  current_tssi)&&
++      (rt2x00dev->alt_temp_comp_delta>= -30))
++  {
++    rt2x00dev->alt_temp_comp_delta--;
++  }
++
++    return rt2x00dev->alt_temp_comp_delta;
++}
+ static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int 
is_rate_b,
+                                  enum ieee80211_band band, int power_level,
+                                  u8 txpower, int delta)
+@@ -3037,7 +3328,11 @@
+        * expected. We adjust it, based on TSSI reference and boundaries values
+        * provided in EEPROM.
+        */
+-      delta += rt2800_get_gain_calibration_delta(rt2x00dev);
++      if (rt2x00_rt(rt2x00dev, RT5350)) { //for RT5350 needed other code
++        delta += alt_get_gain_calibration_delta(rt2x00dev); //step by step 
compensation
++      } else {
++        delta += rt2800_get_gain_calibration_delta(rt2x00dev);
++      }
+
+       /*
+        * Decrease power according to user settings, on devices with unknown
+@@ -3224,6 +3519,7 @@
                rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
                break;
        case RF3290:
@@ -64,16 +506,30 @@
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -3569,6 +3582,8 @@
-               rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
+@@ -3322,6 +3618,12 @@
+       /* Always recalculate LNA gain before changing configuration */
+       rt2800_config_lna_gain(rt2x00dev, libconf);
+
++      /*
++       *  init desired tssi table
++       */
++      if (rt2x00_rt(rt2x00dev, RT5350))
++        init_desired_tssi_table(rt2x00dev, libconf->rf.channel);
++      
+       if (flags&  IEEE80211_CONF_CHANGE_CHANNEL) {
+               rt2800_config_channel(rt2x00dev, libconf->conf,
+                               &libconf->rf,&libconf->channel);
+@@ -3563,7 +3865,8 @@
+       } else if (rt2x00_rt(rt2x00dev, RT3572)) {
+               rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-               rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
-+      } else if (rt2x00_rt(rt2x00dev, RT5350)) {
-+              rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
-       } else {
-               rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
-               rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-@@ -4216,9 +4231,13 @@
+-      } else if (rt2x00_rt(rt2x00dev, RT5390) ||
++      } else if (rt2x00_rt(rt2x00dev, RT5350) ||
++                 rt2x00_rt(rt2x00dev, RT5390) ||
+                  rt2x00_rt(rt2x00dev, RT5392) ||
+                  rt2x00_rt(rt2x00dev, RT5592)) {
+               rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
+@@ -4216,9 +4519,13 @@

        rt2800_bbp_write(rt2x00dev, 82, 0x62);

@@ -90,7 +546,7 @@

        rt2800_bbp_write(rt2x00dev, 86, 0x38);

-@@ -4232,9 +4251,13 @@
+@@ -4232,9 +4539,13 @@

        rt2800_bbp_write(rt2x00dev, 104, 0x92);

@@ -107,7 +563,7 @@

        rt2800_bbp_write(rt2x00dev, 120, 0x50);

-@@ -4259,6 +4282,13 @@
+@@ -4259,6 +4570,13 @@
        rt2800_bbp_write(rt2x00dev, 143, 0xa2);

        rt2800_bbp_write(rt2x00dev, 148, 0xc8);
@@ -121,7 +577,7 @@
   }

   static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
-@@ -4543,6 +4573,7 @@
+@@ -4543,6 +4861,7 @@
                rt2800_init_bbp_3290(rt2x00dev);
                break;
        case RT3352:
@@ -129,7 +585,7 @@
                rt2800_init_bbp_3352(rt2x00dev);
                break;
        case RT3390:
-@@ -5182,6 +5213,76 @@
+@@ -5182,6 +5501,76 @@
        rt2800_normal_mode_setup_3xxx(rt2x00dev);
   }

@@ -206,7 +662,7 @@
   static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
   {
        rt2800_rf_init_calibration(rt2x00dev, 2);
-@@ -5410,6 +5511,9 @@
+@@ -5410,6 +5799,9 @@
        case RT3572:
                rt2800_init_rfcsr_3572(rt2x00dev);
                break;
@@ -216,7 +672,7 @@
        case RT5390:
                rt2800_init_rfcsr_5390(rt2x00dev);
                break;
-@@ -5621,6 +5725,12 @@
+@@ -5621,6 +6013,12 @@
                rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
                rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
                rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
@@ -229,7 +685,7 @@
        } else if (rt2x00_rt(rt2x00dev, RT2860) ||
                   rt2x00_rt(rt2x00dev, RT2872)) {
                /*
-@@ -5749,6 +5859,8 @@
+@@ -5749,6 +6147,8 @@
            rt2x00_rt(rt2x00dev, RT5390) ||
            rt2x00_rt(rt2x00dev, RT5392))
                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID,&rf);
@@ -238,7 +694,7 @@
        else
                rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);

-@@ -5765,6 +5877,7 @@
+@@ -5765,6 +6165,7 @@
        case RF3290:
        case RF3320:
        case RF3322:
@@ -246,7 +702,7 @@
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -6263,7 +6376,8 @@
+@@ -6263,7 +6664,8 @@
                   rt2x00_rf(rt2x00dev, RF5392)) {
                spec->num_channels = 14;
                spec->channels = rf_vals_3x;
@@ -256,7 +712,7 @@
                spec->num_channels = 14;
                if (spec->clk_is_20mhz)
                        spec->channels = rf_vals_xtal20mhz_3x;
-@@ -6364,6 +6478,7 @@
+@@ -6364,6 +6766,7 @@
        case RF3320:
        case RF3052:
        case RF3290:
@@ -264,7 +720,7 @@
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -6401,6 +6516,7 @@
+@@ -6401,6 +6804,7 @@
        case RT3352:
        case RT3390:
        case RT3572:
@@ -274,8 +730,8 @@
        case RT5592:
  Index: compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2x00.h
  ===================================================================
---- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2x00.h       
2013-07-27 18:03:04.865450150 +0200
-+++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2x00.h    
2013-07-27 18:03:04.977450152 +0200
+--- compat-wireless-2013-06-27.orig/drivers/net/wireless/rt2x00/rt2x00.h       
2013-08-02 17:24:53.000000000 +0400
++++ compat-wireless-2013-06-27/drivers/net/wireless/rt2x00/rt2x00.h    
2013-08-04 16:41:05.000000000 +0400
  @@ -181,6 +181,7 @@
   #define RT3572               0x3572
   #define RT3593               0x3593
@@ -284,3 +740,27 @@
   #define RT5390               0x5390  /* 2.4GHz */
   #define RT5392               0x5392  /* 2.4GHz */
   #define RT5592               0x5592
+@@ -1022,6 +1023,23 @@
+
+       /* Extra TX headroom required for alignment purposes. */
+       unsigned int extra_tx_headroom;
++      
++      /* desired tssi values */
++      u32 desired_tssi_over_cck[4];
++      u32 desired_tssi_over_ofdm[8];
++      u32 desired_tssi_over_ht_stbc[8];
++      u32 desired_tssi_over_ht40_stbc[8];
++      u32 desired_tssi_over_ht[16];
++      u32 desired_tssi_over_ht40[16];
++      
++      int alt_temp_comp_delta;
++
++      u16 tssi_ref;
++
++      u32 desired_tssi;
++      /* desired tssi maximum */
++      u8 tssi_max;
++#define RT5350_TSSI_MAX               0x7c
+ };
+
+ struct rt2x00_bar_list_entry {



_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to