return hw_rate;
 }
 
+/* mac80211's rate_idx is like this:
+ *
+ * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+ *
+ * B/G rate:
+ * (rx_status->flag & RX_FLAG_HT) = 0,
+ * DESC92_RATE1M-->DESC92_RATE54M ==> idx is 0-->11,
+ *
+ * N rate:
+ * (rx_status->flag & RX_FLAG_HT) = 1,
+ * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
+ *
+ * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+ * A rate:
+ * (rx_status->flag & RX_FLAG_HT) = 0,
+ * DESC92_RATE6M-->DESC92_RATE54M ==> idx is 0-->7,
+ *
+ * N rate:
+ * (rx_status->flag & RX_FLAG_HT) = 1,
+ * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
+ */
+int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+                        bool isht, u8 desc_rate, bool first_ampdu)
+{
+       int rate_idx;
+
+       if (false == isht) {
+               if (IEEE80211_BAND_2GHZ == hw->conf.channel->band) {
+                       switch (desc_rate) {
+                       case DESC92_RATE1M:
+                               rate_idx = 0;
+                               break;
+                       case DESC92_RATE2M:
+                               rate_idx = 1;
+                               break;
+                       case DESC92_RATE5_5M:
+                               rate_idx = 2;
+                               break;
+                       case DESC92_RATE11M:
+                               rate_idx = 3;
+                               break;
+                       case DESC92_RATE6M:
+                               rate_idx = 4;
+                               break;
+                       case DESC92_RATE9M:
+                               rate_idx = 5;
+                               break;
+                       case DESC92_RATE12M:
+                               rate_idx = 6;
+                               break;
+                       case DESC92_RATE18M:
+                               rate_idx = 7;
+                               break;
+                       case DESC92_RATE24M:
+                               rate_idx = 8;
+                               break;
+                       case DESC92_RATE36M:
+                               rate_idx = 9;
+                               break;
+                       case DESC92_RATE48M:
+                               rate_idx = 10;
+                               break;
+                       case DESC92_RATE54M:
+                               rate_idx = 11;
+                               break;
+                       default:
+                               rate_idx = 0;
+                               break;
+                       }
+               } else {
+                       switch (desc_rate) {
+                       case DESC92_RATE6M:
+                               rate_idx = 0;
+                               break;
+                       case DESC92_RATE9M:
+                               rate_idx = 1;
+                               break;
+                       case DESC92_RATE12M:
+                               rate_idx = 2;
+                               break;
+                       case DESC92_RATE18M:
+                               rate_idx = 3;
+                               break;
+                       case DESC92_RATE24M:
+                               rate_idx = 4;
+                               break;
+                       case DESC92_RATE36M:
+                               rate_idx = 5;
+                               break;
+                       case DESC92_RATE48M:
+                               rate_idx = 6;
+                               break;
+                       case DESC92_RATE54M:
+                               rate_idx = 7;
+                               break;
+                       default:
+                               rate_idx = 0;
+                               break;
+                       }
+               }
+
+       } else {
+
+               switch (desc_rate) {
+               case DESC92_RATEMCS0:
+                       rate_idx = 0;
+                       break;
+               case DESC92_RATEMCS1:
+                       rate_idx = 1;
+                       break;
+               case DESC92_RATEMCS2:
+                       rate_idx = 2;
+                       break;
+               case DESC92_RATEMCS3:
+                       rate_idx = 3;
+                       break;
+               case DESC92_RATEMCS4:
+                       rate_idx = 4;
+                       break;
+               case DESC92_RATEMCS5:
+                       rate_idx = 5;
+                       break;
+               case DESC92_RATEMCS6:
+                       rate_idx = 6;
+                       break;
+               case DESC92_RATEMCS7:
+                       rate_idx = 7;
+                       break;
+               case DESC92_RATEMCS8:
+                       rate_idx = 8;
+                       break;
+               case DESC92_RATEMCS9:
+                       rate_idx = 9;
+                       break;
+               case DESC92_RATEMCS10:
+                       rate_idx = 10;
+                       break;
+               case DESC92_RATEMCS11:
+                       rate_idx = 11;
+                       break;
+               case DESC92_RATEMCS12:
+                       rate_idx = 12;
+                       break;
+               case DESC92_RATEMCS13:
+                       rate_idx = 13;
+                       break;
+               case DESC92_RATEMCS14:
+                       rate_idx = 14;
+                       break;
+               case DESC92_RATEMCS15:
+                       rate_idx = 15;
+                       break;
+               default:
+                       rate_idx = 0;
+                       break;
+               }
+       }
+       return rate_idx;
+}
+EXPORT_SYMBOL(rtlwifi_rate_mapping);
+
 void rtl_get_tcb_desc(struct ieee80211_hw *hw,
                      struct ieee80211_tx_info *info,
                      struct ieee80211_sta *sta,
 
 void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
 u8 rtl_tid_to_ac(struct ieee80211_hw *hw, u8 tid);
 extern struct attribute_group rtl_attribute_group;
+int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+                        bool isht, u8 desc_rate, bool first_ampdu);
 #endif
 
        _HAL_STATE_START = 1,
 };
 
+enum rtl_desc92_rate {
+       DESC92_RATE1M = 0x00,
+       DESC92_RATE2M = 0x01,
+       DESC92_RATE5_5M = 0x02,
+       DESC92_RATE11M = 0x03,
+
+       DESC92_RATE6M = 0x04,
+       DESC92_RATE9M = 0x05,
+       DESC92_RATE12M = 0x06,
+       DESC92_RATE18M = 0x07,
+       DESC92_RATE24M = 0x08,
+       DESC92_RATE36M = 0x09,
+       DESC92_RATE48M = 0x0a,
+       DESC92_RATE54M = 0x0b,
+
+       DESC92_RATEMCS0 = 0x0c,
+       DESC92_RATEMCS1 = 0x0d,
+       DESC92_RATEMCS2 = 0x0e,
+       DESC92_RATEMCS3 = 0x0f,
+       DESC92_RATEMCS4 = 0x10,
+       DESC92_RATEMCS5 = 0x11,
+       DESC92_RATEMCS6 = 0x12,
+       DESC92_RATEMCS7 = 0x13,
+       DESC92_RATEMCS8 = 0x14,
+       DESC92_RATEMCS9 = 0x15,
+       DESC92_RATEMCS10 = 0x16,
+       DESC92_RATEMCS11 = 0x17,
+       DESC92_RATEMCS12 = 0x18,
+       DESC92_RATEMCS13 = 0x19,
+       DESC92_RATEMCS14 = 0x1a,
+       DESC92_RATEMCS15 = 0x1b,
+       DESC92_RATEMCS15_SG = 0x1c,
+       DESC92_RATEMCS32 = 0x20,
+};
+
 enum rtl_var_map {
        /*reg map */
        SYS_ISO_CTRL = 0,