ath10k: dump fw features during probing
authorMichal Kazior <michal.kazior@tieto.com>
Mon, 15 Jun 2015 11:46:40 +0000 (14:46 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 16 Jun 2015 10:06:39 +0000 (13:06 +0300)
This should help when analysing problems from
users and spot fw api blob problems easier.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/debug.c

index 59496a90ad5e241563f5bcaa8226ebfde87bd478..f5db43284b97c462fbc403962c7e117bb17efb75 100644 (file)
@@ -103,6 +103,50 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
        },
 };
 
+static const char *const ath10k_core_fw_feature_str[] = {
+       [ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX] = "wmi-mgmt-rx",
+       [ATH10K_FW_FEATURE_WMI_10X] = "wmi-10.x",
+       [ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX] = "has-wmi-mgmt-tx",
+       [ATH10K_FW_FEATURE_NO_P2P] = "no-p2p",
+       [ATH10K_FW_FEATURE_WMI_10_2] = "wmi-10.2",
+       [ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT] = "multi-vif-ps",
+       [ATH10K_FW_FEATURE_WOWLAN_SUPPORT] = "wowlan",
+       [ATH10K_FW_FEATURE_IGNORE_OTP_RESULT] = "ignore-otp",
+       [ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING] = "no-4addr-pad",
+       [ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT] = "skip-clock-init",
+};
+
+static unsigned int ath10k_core_get_fw_feature_str(char *buf,
+                                                  size_t buf_len,
+                                                  enum ath10k_fw_features feat)
+{
+       if (feat >= ARRAY_SIZE(ath10k_core_fw_feature_str) ||
+           WARN_ON(!ath10k_core_fw_feature_str[feat])) {
+               return scnprintf(buf, buf_len, "bit%d", feat);
+       }
+
+       return scnprintf(buf, buf_len, "%s", ath10k_core_fw_feature_str[feat]);
+}
+
+void ath10k_core_get_fw_features_str(struct ath10k *ar,
+                                    char *buf,
+                                    size_t buf_len)
+{
+       unsigned int len = 0;
+       int i;
+
+       for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
+               if (test_bit(i, ar->fw_features)) {
+                       if (len > 0)
+                               len += scnprintf(buf + len, buf_len - len, ",");
+
+                       len += ath10k_core_get_fw_feature_str(buf + len,
+                                                             buf_len - len,
+                                                             i);
+               }
+       }
+}
+
 static void ath10k_send_suspend_complete(struct ath10k *ar)
 {
        ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot suspend complete\n");
index 78094f23c9dd5264a66d32167680a8af8728a8ff..e9f93045fbd86315b5b11b50662e50d5c0c56ce0 100644 (file)
@@ -749,6 +749,9 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
                                  enum ath10k_hw_rev hw_rev,
                                  const struct ath10k_hif_ops *hif_ops);
 void ath10k_core_destroy(struct ath10k *ar);
+void ath10k_core_get_fw_features_str(struct ath10k *ar,
+                                    char *buf,
+                                    size_t max_len);
 
 int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode);
 int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);
index 8fa606a9c4ddaf3f95b43d80723a0fbcfe59a010..8a4edfd36e47a145905ea8f70384f6bf45c6e5e5 100644 (file)
@@ -124,7 +124,11 @@ EXPORT_SYMBOL(ath10k_info);
 
 void ath10k_print_driver_info(struct ath10k *ar)
 {
-       ath10k_info(ar, "%s (0x%08x, 0x%08x%s%s%s) fw %s api %d htt %d.%d wmi %d cal %s max_sta %d\n",
+       char fw_features[128];
+
+       ath10k_core_get_fw_features_str(ar, fw_features, sizeof(fw_features));
+
+       ath10k_info(ar, "%s (0x%08x, 0x%08x%s%s%s) fw %s api %d htt %d.%d wmi %d cal %s max_sta %d features %s\n",
                    ar->hw_params.name,
                    ar->target_version,
                    ar->chip_id,
@@ -138,7 +142,8 @@ void ath10k_print_driver_info(struct ath10k *ar)
                    ar->htt.target_version_minor,
                    ar->wmi.op_version,
                    ath10k_cal_mode_str(ar->cal_mode),
-                   ar->max_num_stations);
+                   ar->max_num_stations,
+                   fw_features);
        ath10k_info(ar, "debug %d debugfs %d tracing %d dfs %d testmode %d\n",
                    config_enabled(CONFIG_ATH10K_DEBUG),
                    config_enabled(CONFIG_ATH10K_DEBUGFS),