]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/ath/ath9k/htc_drv_debug.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[~andy/linux] / drivers / net / wireless / ath / ath9k / htc_drv_debug.c
index d08ef24e969686bd379468fde063e5cb2be0e8d6..c1b45e2f848124bdeb0d28a156ed570f4928e635 100644 (file)
@@ -496,21 +496,7 @@ static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf,
        ssize_t retval = 0;
        char *buf;
 
-       /*
-        * This can be done since all the 3 EEPROM families have the
-        * same base header upto a certain point, and we are interested in
-        * the data only upto that point.
-        */
-
-       if (AR_SREV_9271(priv->ah))
-               pBase = (struct base_eep_header *)
-                       &priv->ah->eeprom.map4k.baseEepHeader;
-       else if (priv->ah->hw_version.usbdev == AR9280_USB)
-               pBase = (struct base_eep_header *)
-                       &priv->ah->eeprom.def.baseEepHeader;
-       else if (priv->ah->hw_version.usbdev == AR9287_USB)
-               pBase = (struct base_eep_header *)
-                       &priv->ah->eeprom.map9287.baseEepHeader;
+       pBase = ath9k_htc_get_eeprom_base(priv);
 
        if (pBase == NULL) {
                ath_err(common, "Unknown EEPROM type\n");
@@ -916,6 +902,87 @@ static const struct file_operations fops_modal_eeprom = {
        .llseek = default_llseek,
 };
 
+
+/* Ethtool support for get-stats */
+#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
+static const char ath9k_htc_gstrings_stats[][ETH_GSTRING_LEN] = {
+       "tx_pkts_nic",
+       "tx_bytes_nic",
+       "rx_pkts_nic",
+       "rx_bytes_nic",
+
+       AMKSTR(d_tx_pkts),
+
+       "d_rx_crc_err",
+       "d_rx_decrypt_crc_err",
+       "d_rx_phy_err",
+       "d_rx_mic_err",
+       "d_rx_pre_delim_crc_err",
+       "d_rx_post_delim_crc_err",
+       "d_rx_decrypt_busy_err",
+
+       "d_rx_phyerr_radar",
+       "d_rx_phyerr_ofdm_timing",
+       "d_rx_phyerr_cck_timing",
+
+};
+#define ATH9K_HTC_SSTATS_LEN ARRAY_SIZE(ath9k_htc_gstrings_stats)
+
+void ath9k_htc_get_et_strings(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif,
+                             u32 sset, u8 *data)
+{
+       if (sset == ETH_SS_STATS)
+               memcpy(data, *ath9k_htc_gstrings_stats,
+                      sizeof(ath9k_htc_gstrings_stats));
+}
+
+int ath9k_htc_get_et_sset_count(struct ieee80211_hw *hw,
+                               struct ieee80211_vif *vif, int sset)
+{
+       if (sset == ETH_SS_STATS)
+               return ATH9K_HTC_SSTATS_LEN;
+       return 0;
+}
+
+#define STXBASE priv->debug.tx_stats
+#define SRXBASE priv->debug.rx_stats
+#define ASTXQ(a)                                       \
+       data[i++] = STXBASE.a[IEEE80211_AC_BE];         \
+       data[i++] = STXBASE.a[IEEE80211_AC_BK];         \
+       data[i++] = STXBASE.a[IEEE80211_AC_VI];         \
+       data[i++] = STXBASE.a[IEEE80211_AC_VO]
+
+void ath9k_htc_get_et_stats(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif,
+                           struct ethtool_stats *stats, u64 *data)
+{
+       struct ath9k_htc_priv *priv = hw->priv;
+       int i = 0;
+
+       data[i++] = STXBASE.skb_success;
+       data[i++] = STXBASE.skb_success_bytes;
+       data[i++] = SRXBASE.skb_completed;
+       data[i++] = SRXBASE.skb_completed_bytes;
+
+       ASTXQ(queue_stats);
+
+       data[i++] = SRXBASE.err_crc;
+       data[i++] = SRXBASE.err_decrypt_crc;
+       data[i++] = SRXBASE.err_phy;
+       data[i++] = SRXBASE.err_mic;
+       data[i++] = SRXBASE.err_pre_delim;
+       data[i++] = SRXBASE.err_post_delim;
+       data[i++] = SRXBASE.err_decrypt_busy;
+
+       data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_RADAR];
+       data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_OFDM_TIMING];
+       data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_CCK_TIMING];
+
+       WARN_ON(i != ATH9K_HTC_SSTATS_LEN);
+}
+
+
 int ath9k_htc_init_debug(struct ath_hw *ah)
 {
        struct ath_common *common = ath9k_hw_common(ah);