ath9k: Dump BTCOEX tuning parameters
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Thu, 25 Oct 2012 11:46:54 +0000 (17:16 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 29 Oct 2012 19:30:35 +0000 (15:30 -0400)
Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/gpio.c

index 18dfb764eed5f1d6ebbf1129d906d7cf82eaf7ea..4e125d8904a00dbb2796da796f0f5991f1054ed2 100644 (file)
@@ -494,6 +494,7 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc);
 void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status);
 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen);
 void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc);
+int ath9k_dump_btcoex(struct ath_softc *sc, u8 *buf, u32 len, u32 size);
 #else
 static inline int ath9k_init_btcoex(struct ath_softc *sc)
 {
@@ -520,6 +521,11 @@ static inline u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc,
 static inline void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
 {
 }
+static inline int ath9k_dump_btcoex(struct ath_softc *sc, u8 *buf,
+                                   u32 len, u32 size)
+{
+       return 0;
+}
 #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
 
 struct ath9k_wow_pattern {
index 6727b566d294a43073c2a4cf3cc532f0e633b34e..a8be94b2a53abf6eb76cd2418cb0d72e81324c87 100644 (file)
@@ -1586,6 +1586,35 @@ static const struct file_operations fops_samps = {
 
 #endif
 
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+static ssize_t read_file_btcoex(struct file *file, char __user *user_buf,
+                               size_t count, loff_t *ppos)
+{
+       struct ath_softc *sc = file->private_data;
+       u32 len = 0, size = 1500;
+       char *buf;
+       size_t retval;
+
+       buf = kzalloc(size, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       len = ath9k_dump_btcoex(sc, buf, len, size);
+
+       retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+       kfree(buf);
+
+       return retval;
+}
+
+static const struct file_operations fops_btcoex = {
+       .read = read_file_btcoex,
+       .open = simple_open,
+       .owner = THIS_MODULE,
+       .llseek = default_llseek,
+};
+#endif
+
 int ath9k_init_debug(struct ath_hw *ah)
 {
        struct ath_common *common = ath9k_hw_common(ah);
@@ -1658,6 +1687,9 @@ int ath9k_init_debug(struct ath_hw *ah)
                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
        debugfs_create_file("diversity", S_IRUSR | S_IWUSR,
                            sc->debug.debugfs_phy, sc, &fops_ant_diversity);
-
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+       debugfs_create_file("btcoex", S_IRUSR, sc->debug.debugfs_phy, sc,
+                           &fops_btcoex);
+#endif
        return 0;
 }
index 64dde1cd20e88463b23b3e33e7cf446fb107b47d..a8ea57b9f49cc1836872ec3b0617d1075969b6c3 100644 (file)
@@ -494,4 +494,52 @@ int ath9k_init_btcoex(struct ath_softc *sc)
        return 0;
 }
 
+int ath9k_dump_btcoex(struct ath_softc *sc, u8 *buf, u32 len, u32 size)
+{
+#define ATH_DUMP_BTCOEX(_s, _val)                                \
+       do {                                                     \
+               len += snprintf(buf + len, size - len,           \
+                               "%20s : %10d\n", _s, (_val));    \
+       } while (0)
+
+       struct ath_btcoex *btcoex = &sc->btcoex;
+       struct ath_mci_profile *mci = &btcoex->mci;
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
+       int i;
+
+       ATH_DUMP_BTCOEX("Total BT profiles", NUM_PROF(mci));
+       ATH_DUMP_BTCOEX("Number of MGMT", mci->num_mgmt);
+       ATH_DUMP_BTCOEX("Number of SCO", mci->num_sco);
+       ATH_DUMP_BTCOEX("Number of A2DP", mci->num_a2dp);
+       ATH_DUMP_BTCOEX("Number of HID", mci->num_hid);
+       ATH_DUMP_BTCOEX("Number of PAN", mci->num_pan);
+       ATH_DUMP_BTCOEX("Number of ACL", mci->num_other_acl);
+       ATH_DUMP_BTCOEX("Number of BDR", mci->num_bdr);
+       ATH_DUMP_BTCOEX("Aggr. Limit", mci->aggr_limit);
+       ATH_DUMP_BTCOEX("Stomp Type", btcoex->bt_stomp_type);
+       ATH_DUMP_BTCOEX("BTCoex Period (msec)", btcoex->btcoex_period);
+       ATH_DUMP_BTCOEX("Duty Cycle", btcoex->duty_cycle);
+       ATH_DUMP_BTCOEX("BT Wait time", btcoex->bt_wait_time);
+       ATH_DUMP_BTCOEX("Concurrent Tx", btcoex_hw->mci.concur_tx);
+       ATH_DUMP_BTCOEX("Concur RSSI count", btcoex->rssi_count);
+       len += snprintf(buf + len, size - len, "BT Weights: ");
+       for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++)
+               len += snprintf(buf + len, size - len, "%08x ",
+                               btcoex_hw->bt_weight[i]);
+       len += snprintf(buf + len, size - len, "\n");
+       len += snprintf(buf + len, size - len, "WLAN Weights: ");
+       for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++)
+               len += snprintf(buf + len, size - len, "%08x ",
+                               btcoex_hw->wlan_weight[i]);
+       len += snprintf(buf + len, size - len, "\n");
+       len += snprintf(buf + len, size - len, "Tx Priorities: ");
+       for (i = 0; i < ATH_BTCOEX_STOMP_MAX; i++)
+               len += snprintf(buf + len, size - len, "%08x ",
+                               btcoex_hw->tx_prio[i]);
+       len += snprintf(buf + len, size - len, "\n");
+#undef ATH_DUMP_BTCOEX
+
+       return len;
+}
 #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */