diff options
author | Sujith Manoharan <Sujith.Manoharan@atheros.com> | 2011-04-13 01:54:10 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-04-13 15:22:41 -0400 |
commit | 719c4cf6b1b113e9caf377c6607ae45758a85871 (patch) | |
tree | cec18a2d04f7302c3c201143547899a8dccd8676 /drivers/net/wireless | |
parent | 8e42e4ba98f986be64016df79eacbb671dbd3d18 (diff) |
ath9k_htc: Add RX error statistics
Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc.h | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 109 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 2 |
3 files changed, 118 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 20511af33f5f..0e48fa0efa77 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -296,6 +296,9 @@ struct ath9k_htc_tx_ctl { | |||
296 | 296 | ||
297 | #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) | 297 | #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) |
298 | 298 | ||
299 | void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, | ||
300 | struct ath_htc_rx_status *rxs); | ||
301 | |||
299 | struct ath_tx_stats { | 302 | struct ath_tx_stats { |
300 | u32 buf_queued; | 303 | u32 buf_queued; |
301 | u32 buf_completed; | 304 | u32 buf_completed; |
@@ -310,6 +313,14 @@ struct ath_rx_stats { | |||
310 | u32 skb_allocated; | 313 | u32 skb_allocated; |
311 | u32 skb_completed; | 314 | u32 skb_completed; |
312 | u32 skb_dropped; | 315 | u32 skb_dropped; |
316 | u32 err_crc; | ||
317 | u32 err_decrypt_crc; | ||
318 | u32 err_mic; | ||
319 | u32 err_pre_delim; | ||
320 | u32 err_post_delim; | ||
321 | u32 err_decrypt_busy; | ||
322 | u32 err_phy; | ||
323 | u32 err_phy_stats[ATH9K_PHYERR_MAX]; | ||
313 | }; | 324 | }; |
314 | 325 | ||
315 | struct ath9k_debug { | 326 | struct ath9k_debug { |
@@ -330,6 +341,11 @@ struct ath9k_debug { | |||
330 | 341 | ||
331 | #define TX_QSTAT_INC(c) do { } while (0) | 342 | #define TX_QSTAT_INC(c) do { } while (0) |
332 | 343 | ||
344 | static inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, | ||
345 | struct ath_htc_rx_status *rxs) | ||
346 | { | ||
347 | } | ||
348 | |||
333 | #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ | 349 | #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ |
334 | 350 | ||
335 | #define ATH_LED_PIN_DEF 1 | 351 | #define ATH_LED_PIN_DEF 1 |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c index 8b679aab338a..6fc6cb749362 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c | |||
@@ -123,27 +123,118 @@ static const struct file_operations fops_xmit = { | |||
123 | .llseek = default_llseek, | 123 | .llseek = default_llseek, |
124 | }; | 124 | }; |
125 | 125 | ||
126 | void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, | ||
127 | struct ath_htc_rx_status *rxs) | ||
128 | { | ||
129 | #define RX_PHY_ERR_INC(c) priv->debug.rx_stats.err_phy_stats[c]++ | ||
130 | |||
131 | if (rxs->rs_status & ATH9K_RXERR_CRC) | ||
132 | priv->debug.rx_stats.err_crc++; | ||
133 | if (rxs->rs_status & ATH9K_RXERR_DECRYPT) | ||
134 | priv->debug.rx_stats.err_decrypt_crc++; | ||
135 | if (rxs->rs_status & ATH9K_RXERR_MIC) | ||
136 | priv->debug.rx_stats.err_mic++; | ||
137 | if (rxs->rs_status & ATH9K_RX_DELIM_CRC_PRE) | ||
138 | priv->debug.rx_stats.err_pre_delim++; | ||
139 | if (rxs->rs_status & ATH9K_RX_DELIM_CRC_POST) | ||
140 | priv->debug.rx_stats.err_post_delim++; | ||
141 | if (rxs->rs_status & ATH9K_RX_DECRYPT_BUSY) | ||
142 | priv->debug.rx_stats.err_decrypt_busy++; | ||
143 | |||
144 | if (rxs->rs_status & ATH9K_RXERR_PHY) { | ||
145 | priv->debug.rx_stats.err_phy++; | ||
146 | if (rxs->rs_phyerr < ATH9K_PHYERR_MAX) | ||
147 | RX_PHY_ERR_INC(rxs->rs_phyerr); | ||
148 | } | ||
149 | |||
150 | #undef RX_PHY_ERR_INC | ||
151 | } | ||
152 | |||
126 | static ssize_t read_file_recv(struct file *file, char __user *user_buf, | 153 | static ssize_t read_file_recv(struct file *file, char __user *user_buf, |
127 | size_t count, loff_t *ppos) | 154 | size_t count, loff_t *ppos) |
128 | { | 155 | { |
156 | #define PHY_ERR(s, p) \ | ||
157 | len += snprintf(buf + len, size - len, "%20s : %10u\n", s, \ | ||
158 | priv->debug.rx_stats.err_phy_stats[p]); | ||
159 | |||
129 | struct ath9k_htc_priv *priv = file->private_data; | 160 | struct ath9k_htc_priv *priv = file->private_data; |
130 | char buf[512]; | 161 | char *buf; |
131 | unsigned int len = 0; | 162 | unsigned int len = 0, size = 1500; |
163 | ssize_t retval = 0; | ||
132 | 164 | ||
133 | len += snprintf(buf + len, sizeof(buf) - len, | 165 | buf = kzalloc(size, GFP_KERNEL); |
166 | if (buf == NULL) | ||
167 | return -ENOMEM; | ||
168 | |||
169 | len += snprintf(buf + len, size - len, | ||
134 | "%20s : %10u\n", "SKBs allocated", | 170 | "%20s : %10u\n", "SKBs allocated", |
135 | priv->debug.rx_stats.skb_allocated); | 171 | priv->debug.rx_stats.skb_allocated); |
136 | len += snprintf(buf + len, sizeof(buf) - len, | 172 | len += snprintf(buf + len, size - len, |
137 | "%20s : %10u\n", "SKBs completed", | 173 | "%20s : %10u\n", "SKBs completed", |
138 | priv->debug.rx_stats.skb_completed); | 174 | priv->debug.rx_stats.skb_completed); |
139 | len += snprintf(buf + len, sizeof(buf) - len, | 175 | len += snprintf(buf + len, size - len, |
140 | "%20s : %10u\n", "SKBs Dropped", | 176 | "%20s : %10u\n", "SKBs Dropped", |
141 | priv->debug.rx_stats.skb_dropped); | 177 | priv->debug.rx_stats.skb_dropped); |
142 | 178 | ||
143 | if (len > sizeof(buf)) | 179 | len += snprintf(buf + len, size - len, |
144 | len = sizeof(buf); | 180 | "%20s : %10u\n", "CRC ERR", |
145 | 181 | priv->debug.rx_stats.err_crc); | |
146 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | 182 | len += snprintf(buf + len, size - len, |
183 | "%20s : %10u\n", "DECRYPT CRC ERR", | ||
184 | priv->debug.rx_stats.err_decrypt_crc); | ||
185 | len += snprintf(buf + len, size - len, | ||
186 | "%20s : %10u\n", "MIC ERR", | ||
187 | priv->debug.rx_stats.err_mic); | ||
188 | len += snprintf(buf + len, size - len, | ||
189 | "%20s : %10u\n", "PRE-DELIM CRC ERR", | ||
190 | priv->debug.rx_stats.err_pre_delim); | ||
191 | len += snprintf(buf + len, size - len, | ||
192 | "%20s : %10u\n", "POST-DELIM CRC ERR", | ||
193 | priv->debug.rx_stats.err_post_delim); | ||
194 | len += snprintf(buf + len, size - len, | ||
195 | "%20s : %10u\n", "DECRYPT BUSY ERR", | ||
196 | priv->debug.rx_stats.err_decrypt_busy); | ||
197 | len += snprintf(buf + len, size - len, | ||
198 | "%20s : %10u\n", "TOTAL PHY ERR", | ||
199 | priv->debug.rx_stats.err_phy); | ||
200 | |||
201 | |||
202 | PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN); | ||
203 | PHY_ERR("TIMING", ATH9K_PHYERR_TIMING); | ||
204 | PHY_ERR("PARITY", ATH9K_PHYERR_PARITY); | ||
205 | PHY_ERR("RATE", ATH9K_PHYERR_RATE); | ||
206 | PHY_ERR("LENGTH", ATH9K_PHYERR_LENGTH); | ||
207 | PHY_ERR("RADAR", ATH9K_PHYERR_RADAR); | ||
208 | PHY_ERR("SERVICE", ATH9K_PHYERR_SERVICE); | ||
209 | PHY_ERR("TOR", ATH9K_PHYERR_TOR); | ||
210 | PHY_ERR("OFDM-TIMING", ATH9K_PHYERR_OFDM_TIMING); | ||
211 | PHY_ERR("OFDM-SIGNAL-PARITY", ATH9K_PHYERR_OFDM_SIGNAL_PARITY); | ||
212 | PHY_ERR("OFDM-RATE", ATH9K_PHYERR_OFDM_RATE_ILLEGAL); | ||
213 | PHY_ERR("OFDM-LENGTH", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL); | ||
214 | PHY_ERR("OFDM-POWER-DROP", ATH9K_PHYERR_OFDM_POWER_DROP); | ||
215 | PHY_ERR("OFDM-SERVICE", ATH9K_PHYERR_OFDM_SERVICE); | ||
216 | PHY_ERR("OFDM-RESTART", ATH9K_PHYERR_OFDM_RESTART); | ||
217 | PHY_ERR("FALSE-RADAR-EXT", ATH9K_PHYERR_FALSE_RADAR_EXT); | ||
218 | PHY_ERR("CCK-TIMING", ATH9K_PHYERR_CCK_TIMING); | ||
219 | PHY_ERR("CCK-HEADER-CRC", ATH9K_PHYERR_CCK_HEADER_CRC); | ||
220 | PHY_ERR("CCK-RATE", ATH9K_PHYERR_CCK_RATE_ILLEGAL); | ||
221 | PHY_ERR("CCK-SERVICE", ATH9K_PHYERR_CCK_SERVICE); | ||
222 | PHY_ERR("CCK-RESTART", ATH9K_PHYERR_CCK_RESTART); | ||
223 | PHY_ERR("CCK-LENGTH", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL); | ||
224 | PHY_ERR("CCK-POWER-DROP", ATH9K_PHYERR_CCK_POWER_DROP); | ||
225 | PHY_ERR("HT-CRC", ATH9K_PHYERR_HT_CRC_ERROR); | ||
226 | PHY_ERR("HT-LENGTH", ATH9K_PHYERR_HT_LENGTH_ILLEGAL); | ||
227 | PHY_ERR("HT-RATE", ATH9K_PHYERR_HT_RATE_ILLEGAL); | ||
228 | |||
229 | if (len > size) | ||
230 | len = size; | ||
231 | |||
232 | retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
233 | kfree(buf); | ||
234 | |||
235 | return retval; | ||
236 | |||
237 | #undef PHY_ERR | ||
147 | } | 238 | } |
148 | 239 | ||
149 | static const struct file_operations fops_recv = { | 240 | static const struct file_operations fops_recv = { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 0e2855893669..a62495d1330a 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -540,6 +540,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, | |||
540 | goto rx_next; | 540 | goto rx_next; |
541 | } | 541 | } |
542 | 542 | ||
543 | ath9k_htc_err_stat_rx(priv, rxstatus); | ||
544 | |||
543 | /* Get the RX status information */ | 545 | /* Get the RX status information */ |
544 | memcpy(&rxbuf->rxstatus, rxstatus, HTC_RX_FRAME_HEADER_SIZE); | 546 | memcpy(&rxbuf->rxstatus, rxstatus, HTC_RX_FRAME_HEADER_SIZE); |
545 | skb_pull(skb, HTC_RX_FRAME_HEADER_SIZE); | 547 | skb_pull(skb, HTC_RX_FRAME_HEADER_SIZE); |