ath9k_htc: Support reporting tx and rx chain mask.
PATCH 1/2 ath9k_htc: Support reporting tx and rx chain mask.
From: Ben Greear <[email protected]>
Signed-off-by Ben Greear <[email protected]>
---
This is against wireless-next, and has been in my 3.9 tree for some time.
drivers/net/wireless/ath/ath9k/htc.h | 2 + drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 16 +--------- drivers/net/wireless/ath/ath9k/htc_drv_init.c | 7 ++++ drivers/net/wireless/ath/ath9k/htc_drv_main.c | 38 ++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 15 deletions(-)
drivers/net/wireless/ath/ath9k/htc.h +2 -0
@@ -583,6 +583,8 @@ bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,void ath9k_start_rfkill_poll (struct ath9k_htc_priv *priv);void ath9k_htc_rfkill_poll_state (struct ieee80211_hw *hw); +struct base_eep_header *ath9k_htc_get_eeprom_base (struct ath9k_htc_priv *priv); +#ifdef CONFIG_MAC80211_LEDS void ath9k_init_leds (struct ath9k_htc_priv *priv);void ath9k_deinit_leds (struct ath9k_htc_priv *priv);
drivers/net/wireless/ath/ath9k/htc_drv_debug.c +1 -15
@@ -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" );
drivers/net/wireless/ath/ath9k/htc_drv_init.c +7 -0
@@ -716,6 +716,7 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv, struct ieee80211_hw *hw) {struct ath_common *common =ath9k_hw_common (priv->ah); +struct base_eep_header *pBase; hw->flags =IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_AMPDU_AGGREGATION |
@@ -771,6 +772,12 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv, &priv->sbands[IEEE80211_BAND_5GHZ].ht_cap); } + pBase =ath9k_htc_get_eeprom_base (priv); +if (pBase) { + hw->wiphy->available_antennas_rx = pBase->rxMask; + hw->wiphy->available_antennas_tx = pBase->txMask; + } +SET_IEEE80211_PERM_ADDR (hw, common->macaddr); }
drivers/net/wireless/ath/ath9k/htc_drv_main.c +38 -0
@@ -1774,6 +1774,43 @@ static int ath9k_htc_get_stats(struct ieee80211_hw *hw,return 0 ; } +struct base_eep_header *ath9k_htc_get_eeprom_base (struct ath9k_htc_priv *priv) +{ +struct base_eep_header *pBase =NULL ; +/* +* 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; +return pBase; +} + + +static int ath9k_htc_get_antenna (struct ieee80211_hw *hw,u32 *tx_ant, +u32 *rx_ant) +{ +struct ath9k_htc_priv *priv = hw->priv; +struct base_eep_header *pBase =ath9k_htc_get_eeprom_base (priv); +if (pBase) { + *tx_ant = pBase->txMask; + *rx_ant = pBase->rxMask; + }else { + *tx_ant =0 ; + *rx_ant =0 ; + } +return 0 ; +} +struct ieee80211_ops ath9k_htc_ops = { .tx = ath9k_htc_tx, .start = ath9k_htc_start,
@@ -1799,4 +1836,5 @@ struct ieee80211_ops ath9k_htc_ops = { .set_coverage_class = ath9k_htc_set_coverage_class, .set_bitrate_mask = ath9k_htc_set_bitrate_mask, .get_stats = ath9k_htc_get_stats, + .get_antenna = ath9k_htc_get_antenna, };
Signature · 1 line
1.7.3.4
PATCH 2/2 ath9k_htc: Add ethtool stats support.
From: Ben Greear <[email protected]>
This provides some of the same info found in
the ath9k_htc debugfs through the standard ethtool stats API.
This logic is only supported when ath9k_htc debugfs kernel feature is enabled, since that is the only time stats are actually gathered.
Signed-off-by Ben Greear <[email protected]>
---
This patch is against wireless-next, and has been tested against my 3.9 tree for quite a while.
drivers/net/wireless/ath/ath9k/hif_usb.c | 8 ++- drivers/net/wireless/ath/ath9k/htc.h | 14 ++++ drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 81 ++++++++++++++++++++++++ drivers/net/wireless/ath/ath9k/htc_drv_main.c | 6 ++ 4 files changed, 108 insertions(+), 1 deletions(-)
drivers/net/wireless/ath/ath9k/hif_usb.c +7 -1
@@ -234,10 +234,15 @@ static inline void ath9k_skb_queue_complete(struct hif_device_usb *hif_dev,struct sk_buff *skb;while ((skb =__skb_dequeue (queue)) !=NULL ) { +#ifdef CONFIG_ATH9K_HTC_DEBUGFS +int ln = skb->len; +#endif ath9k_htc_txcompletion_cb (hif_dev->htc_handle, skb, txok); -if (txok) +if (txok) {TX_STAT_INC (skb_success); +TX_STAT_ADD (skb_success_bytes, ln); + }else TX_STAT_INC (skb_failed); }
@@ -620,6 +625,7 @@ static void ath9k_hif_usb_rx_stream(struct hif_device_usb *hif_dev, err:for (i =0 ; i < pool_index; i++) { +RX_STAT_ADD (skb_completed_bytes, skb_pool[i]->len);ath9k_htc_rx_msg (hif_dev->htc_handle, skb_pool[i], skb_pool[i]->len,USB_WLAN_RX_PIPE );RX_STAT_INC (skb_completed);
drivers/net/wireless/ath/ath9k/htc.h +14 -0
@@ -324,7 +324,9 @@ static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb)#ifdef CONFIG_ATH9K_HTC_DEBUGFS #define TX_STAT_INC (c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) +#define TX_STAT_ADD (c, a) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c += a)#define RX_STAT_INC (c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) +#define RX_STAT_ADD (c, a) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c += a)#define CAB_STAT_INC priv->debug.tx_stats.cab_queued++#define TX_QSTAT_INC (q) (priv->debug.tx_stats.queue_stats[q]++)
@@ -337,6 +339,7 @@ struct ath_tx_stats {u32 buf_completed;u32 skb_queued;u32 skb_success; +u32 skb_success_bytes;u32 skb_failed;u32 cab_queued;u32 queue_stats[IEEE80211_NUM_ACS ];
@@ -345,6 +348,7 @@ struct ath_tx_stats {struct ath_rx_stats {u32 skb_allocated;u32 skb_completed; +u32 skb_completed_bytes;u32 skb_dropped;u32 err_crc;u32 err_decrypt_crc;
@@ -362,10 +366,20 @@ struct ath9k_debug { struct ath_rx_stats rx_stats; }; +void ath9k_htc_get_et_strings (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +u32 sset,u8 *data); +int ath9k_htc_get_et_sset_count (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,int sset); +void ath9k_htc_get_et_stats (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +struct ethtool_stats *stats,u64 *data);#else #define TX_STAT_INC (c) do { } while (0) +#define TX_STAT_ADD (c, a) do { } while (0)#define RX_STAT_INC (c) do { } while (0) +#define RX_STAT_ADD (c, a) do { } while (0)#define CAB_STAT_INC do { } while (0)#define TX_QSTAT_INC (c) do { } while (0)
drivers/net/wireless/ath/ath9k/htc_drv_debug.c +81 -0
87 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/htc_drv_main.c +6 -0
@@ -1837,4 +1837,10 @@ struct ieee80211_ops ath9k_htc_ops = { .set_bitrate_mask = ath9k_htc_set_bitrate_mask, .get_stats = ath9k_htc_get_stats, .get_antenna = ath9k_htc_get_antenna, + +#ifdef CONFIG_ATH9K_HTC_DEBUGFS + .get_et_sset_count = ath9k_htc_get_et_sset_count, + .get_et_stats = ath9k_htc_get_et_stats, + .get_et_strings = ath9k_htc_get_et_strings, +#endif };
Signature · 1 line
1.7.3.4