Merge commit 'origin/master' into next
[pandora-kernel.git] / drivers / net / wireless / ath / ath9k / debug.c
index 97df20c..6d20725 100644 (file)
@@ -44,6 +44,44 @@ static int ath9k_debugfs_open(struct inode *inode, struct file *file)
        return 0;
 }
 
+static ssize_t read_file_debug(struct file *file, char __user *user_buf,
+                            size_t count, loff_t *ppos)
+{
+       struct ath_softc *sc = file->private_data;
+       char buf[32];
+       unsigned int len;
+
+       len = snprintf(buf, sizeof(buf), "0x%08x\n", sc->debug.debug_mask);
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
+static ssize_t write_file_debug(struct file *file, const char __user *user_buf,
+                            size_t count, loff_t *ppos)
+{
+       struct ath_softc *sc = file->private_data;
+       unsigned long mask;
+       char buf[32];
+       ssize_t len;
+
+       len = min(count, sizeof(buf) - 1);
+       if (copy_from_user(buf, user_buf, len))
+               return -EINVAL;
+
+       buf[len] = '\0';
+       if (strict_strtoul(buf, 0, &mask))
+               return -EINVAL;
+
+       sc->debug.debug_mask = mask;
+       return count;
+}
+
+static const struct file_operations fops_debug = {
+       .read = read_file_debug,
+       .write = write_file_debug,
+       .open = ath9k_debugfs_open,
+       .owner = THIS_MODULE
+};
+
 static ssize_t read_file_dma(struct file *file, char __user *user_buf,
                             size_t count, loff_t *ppos)
 {
@@ -224,111 +262,66 @@ static const struct file_operations fops_interrupt = {
        .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++;
-}
-
-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);
+       stats = &sc->debug.stats.rcstats[idx];
+       stats->success++;
 }
 
-/* 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 = {
@@ -506,6 +499,11 @@ int ath9k_init_debug(struct ath_softc *sc)
        if (!sc->debug.debugfs_phy)
                goto err;
 
+       sc->debug.debugfs_debug = debugfs_create_file("debug",
+               S_IRUGO | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_debug);
+       if (!sc->debug.debugfs_debug)
+               goto err;
+
        sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUGO,
                                       sc->debug.debugfs_phy, sc, &fops_dma);
        if (!sc->debug.debugfs_dma)
@@ -543,6 +541,7 @@ void ath9k_exit_debug(struct ath_softc *sc)
        debugfs_remove(sc->debug.debugfs_rcstat);
        debugfs_remove(sc->debug.debugfs_interrupt);
        debugfs_remove(sc->debug.debugfs_dma);
+       debugfs_remove(sc->debug.debugfs_debug);
        debugfs_remove(sc->debug.debugfs_phy);
 }