ath9k: Add 'misc' file to debugfs, fix queue indexes.
authorBen Greear <greearb@candelatech.com>
Mon, 17 Jan 2011 19:54:50 +0000 (11:54 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 21 Jan 2011 20:34:18 +0000 (15:34 -0500)
Add a misc file to show hardware op-mode, irq setup,
number of various types of VIFs and more.

Also, previous patches were using the wrong xmit queue
indexes.  Change to use the internal ath9k indexes instead
of the mac80211 queue indexes.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/debug.c

index b0cb792d38ca90f9b76b5e0b881b19a38a64908a..f0c80ec290d1b2f290ba9a73f19c0fa74e242097 100644 (file)
@@ -595,10 +595,10 @@ static const struct file_operations fops_wiphy = {
 do {                                                                   \
        len += snprintf(buf + len, size - len,                          \
                        "%s%13u%11u%10u%10u\n", str,                    \
-                       (unsigned int)(sc->tx.txq[WME_AC_BE].elem),     \
-                       (unsigned int)(sc->tx.txq[WME_AC_BK].elem),     \
-                       (unsigned int)(sc->tx.txq[WME_AC_VI].elem),     \
-                       (unsigned int)(sc->tx.txq[WME_AC_VO].elem));    \
+                       (unsigned int)(sc->tx.txq[ATH_TXQ_AC_BE].elem), \
+                       (unsigned int)(sc->tx.txq[ATH_TXQ_AC_BK].elem), \
+                       (unsigned int)(sc->tx.txq[ATH_TXQ_AC_VI].elem), \
+                       (unsigned int)(sc->tx.txq[ATH_TXQ_AC_VO].elem));        \
        if (len >= size)                                                \
                goto done;                                              \
 } while(0)
@@ -607,10 +607,10 @@ do {                                                                      \
 do {                                                                   \
        len += snprintf(buf + len, size - len,                          \
                        "%s%13i%11i%10i%10i\n", str,                    \
-                       list_empty(&sc->tx.txq[WME_AC_BE].elem),        \
-                       list_empty(&sc->tx.txq[WME_AC_BK].elem),        \
-                       list_empty(&sc->tx.txq[WME_AC_VI].elem),        \
-                       list_empty(&sc->tx.txq[WME_AC_VO].elem));       \
+                       list_empty(&sc->tx.txq[ATH_TXQ_AC_BE].elem),    \
+                       list_empty(&sc->tx.txq[ATH_TXQ_AC_BK].elem),    \
+                       list_empty(&sc->tx.txq[ATH_TXQ_AC_VI].elem),    \
+                       list_empty(&sc->tx.txq[ATH_TXQ_AC_VO].elem));   \
        if (len >= size)                                                \
                goto done;                                              \
 } while (0)
@@ -657,10 +657,10 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
        PR("hw-tx-proc-desc: ", txprocdesc);
        len += snprintf(buf + len, size - len,
                        "%s%11p%11p%10p%10p\n", "txq-memory-address:",
-                       &(sc->tx.txq[WME_AC_BE]),
-                       &(sc->tx.txq[WME_AC_BK]),
-                       &(sc->tx.txq[WME_AC_VI]),
-                       &(sc->tx.txq[WME_AC_VO]));
+                       &(sc->tx.txq[ATH_TXQ_AC_BE]),
+                       &(sc->tx.txq[ATH_TXQ_AC_BK]),
+                       &(sc->tx.txq[ATH_TXQ_AC_VI]),
+                       &(sc->tx.txq[ATH_TXQ_AC_VO]));
        if (len >= size)
                goto done;
 
@@ -777,6 +777,108 @@ done:
        return retval;
 }
 
+static ssize_t read_file_misc(struct file *file, char __user *user_buf,
+                             size_t count, loff_t *ppos)
+{
+       struct ath_softc *sc = file->private_data;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct ath_hw *ah = sc->sc_ah;
+       struct ieee80211_hw *hw = sc->hw;
+       char *buf;
+       unsigned int len = 0, size = 8000;
+       ssize_t retval = 0;
+       const char *tmp;
+       unsigned int reg;
+       struct ath9k_vif_iter_data iter_data;
+
+       ath9k_calculate_iter_data(hw, NULL, &iter_data);
+       
+       buf = kzalloc(size, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       switch (sc->sc_ah->opmode) {
+       case  NL80211_IFTYPE_ADHOC:
+               tmp = "ADHOC";
+               break;
+       case  NL80211_IFTYPE_MESH_POINT:
+               tmp = "MESH";
+               break;
+       case  NL80211_IFTYPE_AP:
+               tmp = "AP";
+               break;
+       case  NL80211_IFTYPE_STATION:
+               tmp = "STATION";
+               break;
+       default:
+               tmp = "???";
+               break;
+       }
+
+       len += snprintf(buf + len, size - len,
+                       "curbssid: %pM\n"
+                       "OP-Mode: %s(%i)\n"
+                       "Beacon-Timer-Register: 0x%x\n",
+                       common->curbssid,
+                       tmp, (int)(sc->sc_ah->opmode),
+                       REG_READ(ah, AR_BEACON_PERIOD));
+
+       reg = REG_READ(ah, AR_TIMER_MODE);
+       len += snprintf(buf + len, size - len, "Timer-Mode-Register: 0x%x (",
+                       reg);
+       if (reg & AR_TBTT_TIMER_EN)
+               len += snprintf(buf + len, size - len, "TBTT ");
+       if (reg & AR_DBA_TIMER_EN)
+               len += snprintf(buf + len, size - len, "DBA ");
+       if (reg & AR_SWBA_TIMER_EN)
+               len += snprintf(buf + len, size - len, "SWBA ");
+       if (reg & AR_HCF_TIMER_EN)
+               len += snprintf(buf + len, size - len, "HCF ");
+       if (reg & AR_TIM_TIMER_EN)
+               len += snprintf(buf + len, size - len, "TIM ");
+       if (reg & AR_DTIM_TIMER_EN)
+               len += snprintf(buf + len, size - len, "DTIM ");
+       len += snprintf(buf + len, size - len, ")\n");
+
+       reg = sc->sc_ah->imask;
+       len += snprintf(buf + len, size - len, "imask: 0x%x (", reg);
+       if (reg & ATH9K_INT_SWBA)
+               len += snprintf(buf + len, size - len, "SWBA ");
+       if (reg & ATH9K_INT_BMISS)
+               len += snprintf(buf + len, size - len, "BMISS ");
+       if (reg & ATH9K_INT_CST)
+               len += snprintf(buf + len, size - len, "CST ");
+       if (reg & ATH9K_INT_RX)
+               len += snprintf(buf + len, size - len, "RX ");
+       if (reg & ATH9K_INT_RXHP)
+               len += snprintf(buf + len, size - len, "RXHP ");
+       if (reg & ATH9K_INT_RXLP)
+               len += snprintf(buf + len, size - len, "RXLP ");
+       if (reg & ATH9K_INT_BB_WATCHDOG)
+               len += snprintf(buf + len, size - len, "BB_WATCHDOG ");
+       /* there are other IRQs if one wanted to add them. */
+       len += snprintf(buf + len, size - len, ")\n");
+
+       len += snprintf(buf + len, size - len,
+                       "VIF Counts: AP: %i STA: %i MESH: %i WDS: %i"
+                       " ADHOC: %i OTHER: %i nvifs: %hi beacon-vifs: %hi\n",
+                       iter_data.naps, iter_data.nstations, iter_data.nmeshes,
+                       iter_data.nwds, iter_data.nadhocs, iter_data.nothers,
+                       sc->nvifs, sc->nbcnvifs);
+
+       len += snprintf(buf + len, size - len,
+                       "Calculated-BSSID-Mask: %pM\n",
+                       iter_data.mask);
+
+       if (len > size)
+               len = size;
+
+       retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+       kfree(buf);
+
+       return retval;
+}
+
 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
                       struct ath_tx_status *ts)
 {
@@ -822,6 +924,13 @@ static const struct file_operations fops_stations = {
        .llseek = default_llseek,
 };
 
+static const struct file_operations fops_misc = {
+       .read = read_file_misc,
+       .open = ath9k_debugfs_open,
+       .owner = THIS_MODULE,
+       .llseek = default_llseek,
+};
+
 static ssize_t read_file_recv(struct file *file, char __user *user_buf,
                              size_t count, loff_t *ppos)
 {
@@ -1063,6 +1172,10 @@ int ath9k_init_debug(struct ath_hw *ah)
                        sc, &fops_stations))
                goto err;
 
+       if (!debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy,
+                       sc, &fops_misc))
+               goto err;
+
        if (!debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy,
                        sc, &fops_recv))
                goto err;