.owner = THIS_MODULE
 };
 
-static void ath_debug_stat_11n_rc(struct ath_softc *sc, struct sk_buff *skb)
-{
-       struct ath_tx_info_priv *tx_info_priv = NULL;
-       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
-       struct ieee80211_tx_rate *rates = tx_info->status.rates;
-       int final_ts_idx, idx;
-
-       tx_info_priv = ATH_TX_INFO_PRIV(tx_info);
-       final_ts_idx = tx_info_priv->tx.ts_rateindex;
-       idx = sc->cur_rate_table->info[rates[final_ts_idx].idx].dot11rate;
-
-       sc->debug.stats.n_rcstats[idx].success++;
-}
-
-static void ath_debug_stat_legacy_rc(struct ath_softc *sc, struct sk_buff *skb)
+void ath_debug_stat_rc(struct ath_softc *sc, struct sk_buff *skb)
 {
        struct ath_tx_info_priv *tx_info_priv = NULL;
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
        struct ieee80211_tx_rate *rates = tx_info->status.rates;
        int final_ts_idx, idx;
+       struct ath_rc_stats *stats;
 
        tx_info_priv = ATH_TX_INFO_PRIV(tx_info);
        final_ts_idx = tx_info_priv->tx.ts_rateindex;
        idx = rates[final_ts_idx].idx;
-
-       sc->debug.stats.legacy_rcstats[idx].success++;
+       stats = &sc->debug.stats.rcstats[idx];
+       stats->success++;
 }
 
-void ath_debug_stat_rc(struct ath_softc *sc, struct sk_buff *skb)
-{
-       if (conf_is_ht(&sc->hw->conf))
-               ath_debug_stat_11n_rc(sc, skb);
-       else
-               ath_debug_stat_legacy_rc(sc, skb);
-}
-
-/* FIXME: legacy rates, later on .. */
 void ath_debug_stat_retries(struct ath_softc *sc, int rix,
                            int xretries, int retries, u8 per)
 {
-       if (conf_is_ht(&sc->hw->conf)) {
-               int idx = sc->cur_rate_table->info[rix].dot11rate;
+       struct ath_rc_stats *stats = &sc->debug.stats.rcstats[rix];
 
-               sc->debug.stats.n_rcstats[idx].xretries += xretries;
-               sc->debug.stats.n_rcstats[idx].retries += retries;
-               sc->debug.stats.n_rcstats[idx].per = per;
-       }
+       stats->xretries += xretries;
+       stats->retries += retries;
+       stats->per = per;
 }
 
-static ssize_t ath_read_file_stat_11n_rc(struct file *file,
-                                        char __user *user_buf,
-                                        size_t count, loff_t *ppos)
+static ssize_t read_file_rcstat(struct file *file, char __user *user_buf,
+                               size_t count, loff_t *ppos)
 {
        struct ath_softc *sc = file->private_data;
-       char buf[1024];
-       unsigned int len = 0;
+       char *buf;
+       unsigned int len = 0, max;
        int i = 0;
+       ssize_t retval;
 
-       len += sprintf(buf, "%7s %13s %8s %8s %6s\n\n", "Rate", "Success",
-                      "Retries", "XRetries", "PER");
-
-       for (i = 0; i <= 15; i++) {
-               len += snprintf(buf + len, sizeof(buf) - len,
-                               "%5s%3d: %8u %8u %8u %8u\n", "MCS", i,
-                               sc->debug.stats.n_rcstats[i].success,
-                               sc->debug.stats.n_rcstats[i].retries,
-                               sc->debug.stats.n_rcstats[i].xretries,
-                               sc->debug.stats.n_rcstats[i].per);
-       }
-
-       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
-}
+       if (sc->cur_rate_table == NULL)
+               return 0;
 
-static ssize_t ath_read_file_stat_legacy_rc(struct file *file,
-                                           char __user *user_buf,
-                                           size_t count, loff_t *ppos)
-{
-       struct ath_softc *sc = file->private_data;
-       char buf[512];
-       unsigned int len = 0;
-       int i = 0;
+       max = 80 + sc->cur_rate_table->rate_cnt * 64;
+       buf = kmalloc(max + 1, GFP_KERNEL);
+       if (buf == NULL)
+               return 0;
+       buf[max] = 0;
 
-       len += sprintf(buf, "%7s %13s\n\n", "Rate", "Success");
+       len += sprintf(buf, "%5s %15s %8s %9s %3s\n\n", "Rate", "Success",
+                      "Retries", "XRetries", "PER");
 
        for (i = 0; i < sc->cur_rate_table->rate_cnt; i++) {
-               len += snprintf(buf + len, sizeof(buf) - len, "%5u: %12u\n",
-                               sc->cur_rate_table->info[i].ratekbps / 1000,
-                               sc->debug.stats.legacy_rcstats[i].success);
+               u32 ratekbps = sc->cur_rate_table->info[i].ratekbps;
+               struct ath_rc_stats *stats = &sc->debug.stats.rcstats[i];
+
+               len += snprintf(buf + len, max - len,
+                       "%3u.%d: %8u %8u %8u %8u\n", ratekbps / 1000,
+                       (ratekbps % 1000) / 100, stats->success,
+                       stats->retries, stats->xretries,
+                       stats->per);
        }
 
-       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
-}
-
-static ssize_t read_file_rcstat(struct file *file, char __user *user_buf,
-                               size_t count, loff_t *ppos)
-{
-       struct ath_softc *sc = file->private_data;
-
-       if (sc->cur_rate_table == NULL)
-               return 0;
-
-       if (conf_is_ht(&sc->hw->conf))
-               return ath_read_file_stat_11n_rc(file, user_buf, count, ppos);
-       else
-               return ath_read_file_stat_legacy_rc(file, user_buf, count ,ppos);
+       retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+       kfree(buf);
+       return retval;
 }
 
 static const struct file_operations fops_rcstat = {