aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorSujith Manoharan <Sujith.Manoharan@atheros.com>2011-04-13 01:54:10 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-13 15:22:41 -0400
commit719c4cf6b1b113e9caf377c6607ae45758a85871 (patch)
treecec18a2d04f7302c3c201143547899a8dccd8676 /drivers/net/wireless
parent8e42e4ba98f986be64016df79eacbb671dbd3d18 (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.h16
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_debug.c109
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_txrx.c2
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
299void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
300 struct ath_htc_rx_status *rxs);
301
299struct ath_tx_stats { 302struct 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
315struct ath9k_debug { 326struct 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
344static 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
126void 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
126static ssize_t read_file_recv(struct file *file, char __user *user_buf, 153static 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
149static const struct file_operations fops_recv = { 240static 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);