1 /* 2 * Copyright (c) 2008-2011 Atheros Communications Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <linux/slab.h> 18 #include <linux/vmalloc.h> 19 #include <asm/unaligned.h> 20 21 #include "ath9k.h" 22 23 #define REG_WRITE_D(_ah, _reg, _val) \ 24 ath9k_hw_common(_ah)->ops->write((_ah), (_val), (_reg)) 25 #define REG_READ_D(_ah, _reg) \ 26 ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) 27 28 static int ath9k_debugfs_open(struct inode *inode, struct file *file) 29 { 30 file->private_data = inode->i_private; 31 return 0; 32 } 33 34 static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, 35 size_t count, loff_t *ppos) 36 { 37 u8 *buf = file->private_data; 38 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); 39 } 40 41 static int ath9k_debugfs_release_buf(struct inode *inode, struct file *file) 42 { 43 vfree(file->private_data); 44 return 0; 45 } 46 47 #ifdef CONFIG_ATH_DEBUG 48 49 static ssize_t read_file_debug(struct file *file, char __user *user_buf, 50 size_t count, loff_t *ppos) 51 { 52 struct ath_softc *sc = file->private_data; 53 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 54 char buf[32]; 55 unsigned int len; 56 57 len = sprintf(buf, "0x%08x\n", common->debug_mask); 58 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 59 } 60 61 static ssize_t write_file_debug(struct file *file, const char __user *user_buf, 62 size_t count, loff_t *ppos) 63 { 64 struct ath_softc *sc = file->private_data; 65 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 66 unsigned long mask; 67 char buf[32]; 68 ssize_t len; 69 70 len = min(count, sizeof(buf) - 1); 71 if (copy_from_user(buf, user_buf, len)) 72 return -EFAULT; 73 74 buf[len] = '\0'; 75 if (strict_strtoul(buf, 0, &mask)) 76 return -EINVAL; 77 78 common->debug_mask = mask; 79 return count; 80 } 81 82 static const struct file_operations fops_debug = { 83 .read = read_file_debug, 84 .write = write_file_debug, 85 .open = ath9k_debugfs_open, 86 .owner = THIS_MODULE, 87 .llseek = default_llseek, 88 }; 89 90 #endif 91 92 #define DMA_BUF_LEN 1024 93 94 static ssize_t read_file_tx_chainmask(struct file *file, char __user *user_buf, 95 size_t count, loff_t *ppos) 96 { 97 struct ath_softc *sc = file->private_data; 98 struct ath_hw *ah = sc->sc_ah; 99 char buf[32]; 100 unsigned int len; 101 102 len = sprintf(buf, "0x%08x\n", ah->txchainmask); 103 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 104 } 105 106 static ssize_t write_file_tx_chainmask(struct file *file, const char __user *user_buf, 107 size_t count, loff_t *ppos) 108 { 109 struct ath_softc *sc = file->private_data; 110 struct ath_hw *ah = sc->sc_ah; 111 unsigned long mask; 112 char buf[32]; 113 ssize_t len; 114 115 len = min(count, sizeof(buf) - 1); 116 if (copy_from_user(buf, user_buf, len)) 117 return -EFAULT; 118 119 buf[len] = '\0'; 120 if (strict_strtoul(buf, 0, &mask)) 121 return -EINVAL; 122 123 ah->txchainmask = mask; 124 ah->caps.tx_chainmask = mask; 125 return count; 126 } 127 128 static const struct file_operations fops_tx_chainmask = { 129 .read = read_file_tx_chainmask, 130 .write = write_file_tx_chainmask, 131 .open = ath9k_debugfs_open, 132 .owner = THIS_MODULE, 133 .llseek = default_llseek, 134 }; 135 136 137 static ssize_t read_file_rx_chainmask(struct file *file, char __user *user_buf, 138 size_t count, loff_t *ppos) 139 { 140 struct ath_softc *sc = file->private_data; 141 struct ath_hw *ah = sc->sc_ah; 142 char buf[32]; 143 unsigned int len; 144 145 len = sprintf(buf, "0x%08x\n", ah->rxchainmask); 146 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 147 } 148 149 static ssize_t write_file_rx_chainmask(struct file *file, const char __user *user_buf, 150 size_t count, loff_t *ppos) 151 { 152 struct ath_softc *sc = file->private_data; 153 struct ath_hw *ah = sc->sc_ah; 154 unsigned long mask; 155 char buf[32]; 156 ssize_t len; 157 158 len = min(count, sizeof(buf) - 1); 159 if (copy_from_user(buf, user_buf, len)) 160 return -EFAULT; 161 162 buf[len] = '\0'; 163 if (strict_strtoul(buf, 0, &mask)) 164 return -EINVAL; 165 166 ah->rxchainmask = mask; 167 ah->caps.rx_chainmask = mask; 168 return count; 169 } 170 171 static const struct file_operations fops_rx_chainmask = { 172 .read = read_file_rx_chainmask, 173 .write = write_file_rx_chainmask, 174 .open = ath9k_debugfs_open, 175 .owner = THIS_MODULE, 176 .llseek = default_llseek, 177 }; 178 179 static ssize_t read_file_disable_ani(struct file *file, char __user *user_buf, 180 size_t count, loff_t *ppos) 181 { 182 struct ath_softc *sc = file->private_data; 183 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 184 char buf[32]; 185 unsigned int len; 186 187 len = sprintf(buf, "%d\n", common->disable_ani); 188 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 189 } 190 191 static ssize_t write_file_disable_ani(struct file *file, 192 const char __user *user_buf, 193 size_t count, loff_t *ppos) 194 { 195 struct ath_softc *sc = file->private_data; 196 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 197 unsigned long disable_ani; 198 char buf[32]; 199 ssize_t len; 200 201 len = min(count, sizeof(buf) - 1); 202 if (copy_from_user(buf, user_buf, len)) 203 return -EFAULT; 204 205 buf[len] = '\0'; 206 if (strict_strtoul(buf, 0, &disable_ani)) 207 return -EINVAL; 208 209 common->disable_ani = !!disable_ani; 210 211 if (disable_ani) { 212 sc->sc_flags &= ~SC_OP_ANI_RUN; 213 del_timer_sync(&common->ani.timer); 214 } else { 215 sc->sc_flags |= SC_OP_ANI_RUN; 216 ath_start_ani(common); 217 } 218 219 return count; 220 } 221 222 static const struct file_operations fops_disable_ani = { 223 .read = read_file_disable_ani, 224 .write = write_file_disable_ani, 225 .open = ath9k_debugfs_open, 226 .owner = THIS_MODULE, 227 .llseek = default_llseek, 228 }; 229 230 static ssize_t read_file_dma(struct file *file, char __user *user_buf, 231 size_t count, loff_t *ppos) 232 { 233 struct ath_softc *sc = file->private_data; 234 struct ath_hw *ah = sc->sc_ah; 235 char *buf; 236 int retval; 237 unsigned int len = 0; 238 u32 val[ATH9K_NUM_DMA_DEBUG_REGS]; 239 int i, qcuOffset = 0, dcuOffset = 0; 240 u32 *qcuBase = &val[0], *dcuBase = &val[4]; 241 242 buf = kmalloc(DMA_BUF_LEN, GFP_KERNEL); 243 if (!buf) 244 return -ENOMEM; 245 246 ath9k_ps_wakeup(sc); 247 248 REG_WRITE_D(ah, AR_MACMISC, 249 ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) | 250 (AR_MACMISC_MISC_OBS_BUS_1 << 251 AR_MACMISC_MISC_OBS_BUS_MSB_S))); 252 253 len += snprintf(buf + len, DMA_BUF_LEN - len, 254 "Raw DMA Debug values:\n"); 255 256 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) { 257 if (i % 4 == 0) 258 len += snprintf(buf + len, DMA_BUF_LEN - len, "\n"); 259 260 val[i] = REG_READ_D(ah, AR_DMADBG_0 + (i * sizeof(u32))); 261 len += snprintf(buf + len, DMA_BUF_LEN - len, "%d: %08x ", 262 i, val[i]); 263 } 264 265 len += snprintf(buf + len, DMA_BUF_LEN - len, "\n\n"); 266 len += snprintf(buf + len, DMA_BUF_LEN - len, 267 "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); 268 269 for (i = 0; i < ATH9K_NUM_QUEUES; i++, qcuOffset += 4, dcuOffset += 5) { 270 if (i == 8) { 271 qcuOffset = 0; 272 qcuBase++; 273 } 274 275 if (i == 6) { 276 dcuOffset = 0; 277 dcuBase++; 278 } 279 280 len += snprintf(buf + len, DMA_BUF_LEN - len, 281 "%2d %2x %1x %2x %2x\n", 282 i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, 283 (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), 284 val[2] & (0x7 << (i * 3)) >> (i * 3), 285 (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); 286 } 287 288 len += snprintf(buf + len, DMA_BUF_LEN - len, "\n"); 289 290 len += snprintf(buf + len, DMA_BUF_LEN - len, 291 "qcu_stitch state: %2x qcu_fetch state: %2x\n", 292 (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22); 293 len += snprintf(buf + len, DMA_BUF_LEN - len, 294 "qcu_complete state: %2x dcu_complete state: %2x\n", 295 (val[3] & 0x1c000000) >> 26, (val[6] & 0x3)); 296 len += snprintf(buf + len, DMA_BUF_LEN - len, 297 "dcu_arb state: %2x dcu_fp state: %2x\n", 298 (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27); 299 len += snprintf(buf + len, DMA_BUF_LEN - len, 300 "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", 301 (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10); 302 len += snprintf(buf + len, DMA_BUF_LEN - len, 303 "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", 304 (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12); 305 len += snprintf(buf + len, DMA_BUF_LEN - len, 306 "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", 307 (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17); 308 309 len += snprintf(buf + len, DMA_BUF_LEN - len, "pcu observe: 0x%x\n", 310 REG_READ_D(ah, AR_OBS_BUS_1)); 311 len += snprintf(buf + len, DMA_BUF_LEN - len, 312 "AR_CR: 0x%x\n", REG_READ_D(ah, AR_CR)); 313 314 ath9k_ps_restore(sc); 315 316 if (len > DMA_BUF_LEN) 317 len = DMA_BUF_LEN; 318 319 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 320 kfree(buf); 321 return retval; 322 } 323 324 static const struct file_operations fops_dma = { 325 .read = read_file_dma, 326 .open = ath9k_debugfs_open, 327 .owner = THIS_MODULE, 328 .llseek = default_llseek, 329 }; 330 331 332 void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status) 333 { 334 if (status) 335 sc->debug.stats.istats.total++; 336 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 337 if (status & ATH9K_INT_RXLP) 338 sc->debug.stats.istats.rxlp++; 339 if (status & ATH9K_INT_RXHP) 340 sc->debug.stats.istats.rxhp++; 341 if (status & ATH9K_INT_BB_WATCHDOG) 342 sc->debug.stats.istats.bb_watchdog++; 343 } else { 344 if (status & ATH9K_INT_RX) 345 sc->debug.stats.istats.rxok++; 346 } 347 if (status & ATH9K_INT_RXEOL) 348 sc->debug.stats.istats.rxeol++; 349 if (status & ATH9K_INT_RXORN) 350 sc->debug.stats.istats.rxorn++; 351 if (status & ATH9K_INT_TX) 352 sc->debug.stats.istats.txok++; 353 if (status & ATH9K_INT_TXURN) 354 sc->debug.stats.istats.txurn++; 355 if (status & ATH9K_INT_MIB) 356 sc->debug.stats.istats.mib++; 357 if (status & ATH9K_INT_RXPHY) 358 sc->debug.stats.istats.rxphyerr++; 359 if (status & ATH9K_INT_RXKCM) 360 sc->debug.stats.istats.rx_keycache_miss++; 361 if (status & ATH9K_INT_SWBA) 362 sc->debug.stats.istats.swba++; 363 if (status & ATH9K_INT_BMISS) 364 sc->debug.stats.istats.bmiss++; 365 if (status & ATH9K_INT_BNR) 366 sc->debug.stats.istats.bnr++; 367 if (status & ATH9K_INT_CST) 368 sc->debug.stats.istats.cst++; 369 if (status & ATH9K_INT_GTT) 370 sc->debug.stats.istats.gtt++; 371 if (status & ATH9K_INT_TIM) 372 sc->debug.stats.istats.tim++; 373 if (status & ATH9K_INT_CABEND) 374 sc->debug.stats.istats.cabend++; 375 if (status & ATH9K_INT_DTIMSYNC) 376 sc->debug.stats.istats.dtimsync++; 377 if (status & ATH9K_INT_DTIM) 378 sc->debug.stats.istats.dtim++; 379 if (status & ATH9K_INT_TSFOOR) 380 sc->debug.stats.istats.tsfoor++; 381 } 382 383 static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, 384 size_t count, loff_t *ppos) 385 { 386 struct ath_softc *sc = file->private_data; 387 char buf[512]; 388 unsigned int len = 0; 389 390 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 391 len += snprintf(buf + len, sizeof(buf) - len, 392 "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp); 393 len += snprintf(buf + len, sizeof(buf) - len, 394 "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp); 395 len += snprintf(buf + len, sizeof(buf) - len, 396 "%8s: %10u\n", "WATCHDOG", 397 sc->debug.stats.istats.bb_watchdog); 398 } else { 399 len += snprintf(buf + len, sizeof(buf) - len, 400 "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok); 401 } 402 len += snprintf(buf + len, sizeof(buf) - len, 403 "%8s: %10u\n", "RXEOL", sc->debug.stats.istats.rxeol); 404 len += snprintf(buf + len, sizeof(buf) - len, 405 "%8s: %10u\n", "RXORN", sc->debug.stats.istats.rxorn); 406 len += snprintf(buf + len, sizeof(buf) - len, 407 "%8s: %10u\n", "TX", sc->debug.stats.istats.txok); 408 len += snprintf(buf + len, sizeof(buf) - len, 409 "%8s: %10u\n", "TXURN", sc->debug.stats.istats.txurn); 410 len += snprintf(buf + len, sizeof(buf) - len, 411 "%8s: %10u\n", "MIB", sc->debug.stats.istats.mib); 412 len += snprintf(buf + len, sizeof(buf) - len, 413 "%8s: %10u\n", "RXPHY", sc->debug.stats.istats.rxphyerr); 414 len += snprintf(buf + len, sizeof(buf) - len, 415 "%8s: %10u\n", "RXKCM", sc->debug.stats.istats.rx_keycache_miss); 416 len += snprintf(buf + len, sizeof(buf) - len, 417 "%8s: %10u\n", "SWBA", sc->debug.stats.istats.swba); 418 len += snprintf(buf + len, sizeof(buf) - len, 419 "%8s: %10u\n", "BMISS", sc->debug.stats.istats.bmiss); 420 len += snprintf(buf + len, sizeof(buf) - len, 421 "%8s: %10u\n", "BNR", sc->debug.stats.istats.bnr); 422 len += snprintf(buf + len, sizeof(buf) - len, 423 "%8s: %10u\n", "CST", sc->debug.stats.istats.cst); 424 len += snprintf(buf + len, sizeof(buf) - len, 425 "%8s: %10u\n", "GTT", sc->debug.stats.istats.gtt); 426 len += snprintf(buf + len, sizeof(buf) - len, 427 "%8s: %10u\n", "TIM", sc->debug.stats.istats.tim); 428 len += snprintf(buf + len, sizeof(buf) - len, 429 "%8s: %10u\n", "CABEND", sc->debug.stats.istats.cabend); 430 len += snprintf(buf + len, sizeof(buf) - len, 431 "%8s: %10u\n", "DTIMSYNC", sc->debug.stats.istats.dtimsync); 432 len += snprintf(buf + len, sizeof(buf) - len, 433 "%8s: %10u\n", "DTIM", sc->debug.stats.istats.dtim); 434 len += snprintf(buf + len, sizeof(buf) - len, 435 "%8s: %10u\n", "TSFOOR", sc->debug.stats.istats.tsfoor); 436 len += snprintf(buf + len, sizeof(buf) - len, 437 "%8s: %10u\n", "TOTAL", sc->debug.stats.istats.total); 438 439 440 if (len > sizeof(buf)) 441 len = sizeof(buf); 442 443 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 444 } 445 446 static const struct file_operations fops_interrupt = { 447 .read = read_file_interrupt, 448 .open = ath9k_debugfs_open, 449 .owner = THIS_MODULE, 450 .llseek = default_llseek, 451 }; 452 453 static const char *channel_type_str(enum nl80211_channel_type t) 454 { 455 switch (t) { 456 case NL80211_CHAN_NO_HT: 457 return "no ht"; 458 case NL80211_CHAN_HT20: 459 return "ht20"; 460 case NL80211_CHAN_HT40MINUS: 461 return "ht40-"; 462 case NL80211_CHAN_HT40PLUS: 463 return "ht40+"; 464 default: 465 return "???"; 466 } 467 } 468 469 static ssize_t read_file_wiphy(struct file *file, char __user *user_buf, 470 size_t count, loff_t *ppos) 471 { 472 struct ath_softc *sc = file->private_data; 473 struct ieee80211_channel *chan = sc->hw->conf.channel; 474 struct ieee80211_conf *conf = &(sc->hw->conf); 475 char buf[512]; 476 unsigned int len = 0; 477 u8 addr[ETH_ALEN]; 478 u32 tmp; 479 480 len += snprintf(buf + len, sizeof(buf) - len, 481 "%s (chan=%d center-freq: %d MHz channel-type: %d (%s))\n", 482 wiphy_name(sc->hw->wiphy), 483 ieee80211_frequency_to_channel(chan->center_freq), 484 chan->center_freq, 485 conf->channel_type, 486 channel_type_str(conf->channel_type)); 487 488 ath9k_ps_wakeup(sc); 489 put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_STA_ID0), addr); 490 put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_STA_ID1) & 0xffff, addr + 4); 491 len += snprintf(buf + len, sizeof(buf) - len, 492 "addr: %pM\n", addr); 493 put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_BSSMSKL), addr); 494 put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_BSSMSKU) & 0xffff, addr + 4); 495 len += snprintf(buf + len, sizeof(buf) - len, 496 "addrmask: %pM\n", addr); 497 tmp = ath9k_hw_getrxfilter(sc->sc_ah); 498 ath9k_ps_restore(sc); 499 len += snprintf(buf + len, sizeof(buf) - len, 500 "rfilt: 0x%x", tmp); 501 if (tmp & ATH9K_RX_FILTER_UCAST) 502 len += snprintf(buf + len, sizeof(buf) - len, " UCAST"); 503 if (tmp & ATH9K_RX_FILTER_MCAST) 504 len += snprintf(buf + len, sizeof(buf) - len, " MCAST"); 505 if (tmp & ATH9K_RX_FILTER_BCAST) 506 len += snprintf(buf + len, sizeof(buf) - len, " BCAST"); 507 if (tmp & ATH9K_RX_FILTER_CONTROL) 508 len += snprintf(buf + len, sizeof(buf) - len, " CONTROL"); 509 if (tmp & ATH9K_RX_FILTER_BEACON) 510 len += snprintf(buf + len, sizeof(buf) - len, " BEACON"); 511 if (tmp & ATH9K_RX_FILTER_PROM) 512 len += snprintf(buf + len, sizeof(buf) - len, " PROM"); 513 if (tmp & ATH9K_RX_FILTER_PROBEREQ) 514 len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ"); 515 if (tmp & ATH9K_RX_FILTER_PHYERR) 516 len += snprintf(buf + len, sizeof(buf) - len, " PHYERR"); 517 if (tmp & ATH9K_RX_FILTER_MYBEACON) 518 len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON"); 519 if (tmp & ATH9K_RX_FILTER_COMP_BAR) 520 len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR"); 521 if (tmp & ATH9K_RX_FILTER_PSPOLL) 522 len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL"); 523 if (tmp & ATH9K_RX_FILTER_PHYRADAR) 524 len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR"); 525 if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL) 526 len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL"); 527 528 len += snprintf(buf + len, sizeof(buf) - len, 529 "\n\nReset causes:\n" 530 " baseband hang: %d\n" 531 " baseband watchdog: %d\n" 532 " fatal hardware error interrupt: %d\n" 533 " tx hardware error: %d\n" 534 " tx path hang: %d\n" 535 " pll rx hang: %d\n", 536 sc->debug.stats.reset[RESET_TYPE_BB_HANG], 537 sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG], 538 sc->debug.stats.reset[RESET_TYPE_FATAL_INT], 539 sc->debug.stats.reset[RESET_TYPE_TX_ERROR], 540 sc->debug.stats.reset[RESET_TYPE_TX_HANG], 541 sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); 542 543 if (len > sizeof(buf)) 544 len = sizeof(buf); 545 546 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 547 } 548 549 static const struct file_operations fops_wiphy = { 550 .read = read_file_wiphy, 551 .open = ath9k_debugfs_open, 552 .owner = THIS_MODULE, 553 .llseek = default_llseek, 554 }; 555 556 #define PR_QNUM(_n) sc->tx.txq_map[_n]->axq_qnum 557 #define PR(str, elem) \ 558 do { \ 559 len += snprintf(buf + len, size - len, \ 560 "%s%13u%11u%10u%10u\n", str, \ 561 sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].elem, \ 562 sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].elem, \ 563 sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].elem, \ 564 sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].elem); \ 565 if (len >= size) \ 566 goto done; \ 567 } while(0) 568 569 #define PRX(str, elem) \ 570 do { \ 571 len += snprintf(buf + len, size - len, \ 572 "%s%13u%11u%10u%10u\n", str, \ 573 (unsigned int)(sc->tx.txq_map[WME_AC_BE]->elem), \ 574 (unsigned int)(sc->tx.txq_map[WME_AC_BK]->elem), \ 575 (unsigned int)(sc->tx.txq_map[WME_AC_VI]->elem), \ 576 (unsigned int)(sc->tx.txq_map[WME_AC_VO]->elem)); \ 577 if (len >= size) \ 578 goto done; \ 579 } while(0) 580 581 #define PRQLE(str, elem) \ 582 do { \ 583 len += snprintf(buf + len, size - len, \ 584 "%s%13i%11i%10i%10i\n", str, \ 585 list_empty(&sc->tx.txq_map[WME_AC_BE]->elem), \ 586 list_empty(&sc->tx.txq_map[WME_AC_BK]->elem), \ 587 list_empty(&sc->tx.txq_map[WME_AC_VI]->elem), \ 588 list_empty(&sc->tx.txq_map[WME_AC_VO]->elem)); \ 589 if (len >= size) \ 590 goto done; \ 591 } while (0) 592 593 static ssize_t read_file_xmit(struct file *file, char __user *user_buf, 594 size_t count, loff_t *ppos) 595 { 596 struct ath_softc *sc = file->private_data; 597 char *buf; 598 unsigned int len = 0, size = 8000; 599 int i; 600 ssize_t retval = 0; 601 char tmp[32]; 602 603 buf = kzalloc(size, GFP_KERNEL); 604 if (buf == NULL) 605 return -ENOMEM; 606 607 len += sprintf(buf, "Num-Tx-Queues: %i tx-queues-setup: 0x%x" 608 " poll-work-seen: %u\n" 609 "%30s %10s%10s%10s\n\n", 610 ATH9K_NUM_TX_QUEUES, sc->tx.txqsetup, 611 sc->tx_complete_poll_work_seen, 612 "BE", "BK", "VI", "VO"); 613 614 PR("MPDUs Queued: ", queued); 615 PR("MPDUs Completed: ", completed); 616 PR("MPDUs XRetried: ", xretries); 617 PR("Aggregates: ", a_aggr); 618 PR("AMPDUs Queued HW:", a_queued_hw); 619 PR("AMPDUs Queued SW:", a_queued_sw); 620 PR("AMPDUs Completed:", a_completed); 621 PR("AMPDUs Retried: ", a_retries); 622 PR("AMPDUs XRetried: ", a_xretries); 623 PR("FIFO Underrun: ", fifo_underrun); 624 PR("TXOP Exceeded: ", xtxop); 625 PR("TXTIMER Expiry: ", timer_exp); 626 PR("DESC CFG Error: ", desc_cfg_err); 627 PR("DATA Underrun: ", data_underrun); 628 PR("DELIM Underrun: ", delim_underrun); 629 PR("TX-Pkts-All: ", tx_pkts_all); 630 PR("TX-Bytes-All: ", tx_bytes_all); 631 PR("hw-put-tx-buf: ", puttxbuf); 632 PR("hw-tx-start: ", txstart); 633 PR("hw-tx-proc-desc: ", txprocdesc); 634 len += snprintf(buf + len, size - len, 635 "%s%11p%11p%10p%10p\n", "txq-memory-address:", 636 sc->tx.txq_map[WME_AC_BE], 637 sc->tx.txq_map[WME_AC_BK], 638 sc->tx.txq_map[WME_AC_VI], 639 sc->tx.txq_map[WME_AC_VO]); 640 if (len >= size) 641 goto done; 642 643 PRX("axq-qnum: ", axq_qnum); 644 PRX("axq-depth: ", axq_depth); 645 PRX("axq-ampdu_depth: ", axq_ampdu_depth); 646 PRX("axq-stopped ", stopped); 647 PRX("tx-in-progress ", axq_tx_inprogress); 648 PRX("pending-frames ", pending_frames); 649 PRX("txq_headidx: ", txq_headidx); 650 PRX("txq_tailidx: ", txq_headidx); 651 652 PRQLE("axq_q empty: ", axq_q); 653 PRQLE("axq_acq empty: ", axq_acq); 654 for (i = 0; i < ATH_TXFIFO_DEPTH; i++) { 655 snprintf(tmp, sizeof(tmp) - 1, "txq_fifo[%i] empty: ", i); 656 PRQLE(tmp, txq_fifo[i]); 657 } 658 659 /* Print out more detailed queue-info */ 660 for (i = 0; i <= WME_AC_BK; i++) { 661 struct ath_txq *txq = &(sc->tx.txq[i]); 662 struct ath_atx_ac *ac; 663 struct ath_atx_tid *tid; 664 if (len >= size) 665 goto done; 666 spin_lock_bh(&txq->axq_lock); 667 if (!list_empty(&txq->axq_acq)) { 668 ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, 669 list); 670 len += snprintf(buf + len, size - len, 671 "txq[%i] first-ac: %p sched: %i\n", 672 i, ac, ac->sched); 673 if (list_empty(&ac->tid_q) || (len >= size)) 674 goto done_for; 675 tid = list_first_entry(&ac->tid_q, struct ath_atx_tid, 676 list); 677 len += snprintf(buf + len, size - len, 678 " first-tid: %p sched: %i paused: %i\n", 679 tid, tid->sched, tid->paused); 680 } 681 done_for: 682 spin_unlock_bh(&txq->axq_lock); 683 } 684 685 done: 686 if (len > size) 687 len = size; 688 689 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 690 kfree(buf); 691 692 return retval; 693 } 694 695 static ssize_t read_file_stations(struct file *file, char __user *user_buf, 696 size_t count, loff_t *ppos) 697 { 698 struct ath_softc *sc = file->private_data; 699 char *buf; 700 unsigned int len = 0, size = 64000; 701 struct ath_node *an = NULL; 702 ssize_t retval = 0; 703 int q; 704 705 buf = kzalloc(size, GFP_KERNEL); 706 if (buf == NULL) 707 return -ENOMEM; 708 709 len += snprintf(buf + len, size - len, 710 "Stations:\n" 711 " tid: addr sched paused buf_q-empty an ac\n" 712 " ac: addr sched tid_q-empty txq\n"); 713 714 spin_lock(&sc->nodes_lock); 715 list_for_each_entry(an, &sc->nodes, list) { 716 len += snprintf(buf + len, size - len, 717 "%pM\n", an->sta->addr); 718 if (len >= size) 719 goto done; 720 721 for (q = 0; q < WME_NUM_TID; q++) { 722 struct ath_atx_tid *tid = &(an->tid[q]); 723 len += snprintf(buf + len, size - len, 724 " tid: %p %s %s %i %p %p\n", 725 tid, tid->sched ? "sched" : "idle", 726 tid->paused ? "paused" : "running", 727 skb_queue_empty(&tid->buf_q), 728 tid->an, tid->ac); 729 if (len >= size) 730 goto done; 731 } 732 733 for (q = 0; q < WME_NUM_AC; q++) { 734 struct ath_atx_ac *ac = &(an->ac[q]); 735 len += snprintf(buf + len, size - len, 736 " ac: %p %s %i %p\n", 737 ac, ac->sched ? "sched" : "idle", 738 list_empty(&ac->tid_q), ac->txq); 739 if (len >= size) 740 goto done; 741 } 742 } 743 744 done: 745 spin_unlock(&sc->nodes_lock); 746 if (len > size) 747 len = size; 748 749 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 750 kfree(buf); 751 752 return retval; 753 } 754 755 static ssize_t read_file_misc(struct file *file, char __user *user_buf, 756 size_t count, loff_t *ppos) 757 { 758 struct ath_softc *sc = file->private_data; 759 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 760 struct ath_hw *ah = sc->sc_ah; 761 struct ieee80211_hw *hw = sc->hw; 762 char *buf; 763 unsigned int len = 0, size = 8000; 764 ssize_t retval = 0; 765 unsigned int reg; 766 struct ath9k_vif_iter_data iter_data; 767 768 ath9k_calculate_iter_data(hw, NULL, &iter_data); 769 770 buf = kzalloc(size, GFP_KERNEL); 771 if (buf == NULL) 772 return -ENOMEM; 773 774 ath9k_ps_wakeup(sc); 775 len += snprintf(buf + len, size - len, 776 "curbssid: %pM\n" 777 "OP-Mode: %s(%i)\n" 778 "Beacon-Timer-Register: 0x%x\n", 779 common->curbssid, 780 ath_opmode_to_string(sc->sc_ah->opmode), 781 (int)(sc->sc_ah->opmode), 782 REG_READ(ah, AR_BEACON_PERIOD)); 783 784 reg = REG_READ(ah, AR_TIMER_MODE); 785 ath9k_ps_restore(sc); 786 len += snprintf(buf + len, size - len, "Timer-Mode-Register: 0x%x (", 787 reg); 788 if (reg & AR_TBTT_TIMER_EN) 789 len += snprintf(buf + len, size - len, "TBTT "); 790 if (reg & AR_DBA_TIMER_EN) 791 len += snprintf(buf + len, size - len, "DBA "); 792 if (reg & AR_SWBA_TIMER_EN) 793 len += snprintf(buf + len, size - len, "SWBA "); 794 if (reg & AR_HCF_TIMER_EN) 795 len += snprintf(buf + len, size - len, "HCF "); 796 if (reg & AR_TIM_TIMER_EN) 797 len += snprintf(buf + len, size - len, "TIM "); 798 if (reg & AR_DTIM_TIMER_EN) 799 len += snprintf(buf + len, size - len, "DTIM "); 800 len += snprintf(buf + len, size - len, ")\n"); 801 802 reg = sc->sc_ah->imask; 803 len += snprintf(buf + len, size - len, "imask: 0x%x (", reg); 804 if (reg & ATH9K_INT_SWBA) 805 len += snprintf(buf + len, size - len, "SWBA "); 806 if (reg & ATH9K_INT_BMISS) 807 len += snprintf(buf + len, size - len, "BMISS "); 808 if (reg & ATH9K_INT_CST) 809 len += snprintf(buf + len, size - len, "CST "); 810 if (reg & ATH9K_INT_RX) 811 len += snprintf(buf + len, size - len, "RX "); 812 if (reg & ATH9K_INT_RXHP) 813 len += snprintf(buf + len, size - len, "RXHP "); 814 if (reg & ATH9K_INT_RXLP) 815 len += snprintf(buf + len, size - len, "RXLP "); 816 if (reg & ATH9K_INT_BB_WATCHDOG) 817 len += snprintf(buf + len, size - len, "BB_WATCHDOG "); 818 /* there are other IRQs if one wanted to add them. */ 819 len += snprintf(buf + len, size - len, ")\n"); 820 821 len += snprintf(buf + len, size - len, 822 "VIF Counts: AP: %i STA: %i MESH: %i WDS: %i" 823 " ADHOC: %i OTHER: %i nvifs: %hi beacon-vifs: %hi\n", 824 iter_data.naps, iter_data.nstations, iter_data.nmeshes, 825 iter_data.nwds, iter_data.nadhocs, iter_data.nothers, 826 sc->nvifs, sc->nbcnvifs); 827 828 len += snprintf(buf + len, size - len, 829 "Calculated-BSSID-Mask: %pM\n", 830 iter_data.mask); 831 832 if (len > size) 833 len = size; 834 835 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 836 kfree(buf); 837 838 return retval; 839 } 840 841 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, 842 struct ath_tx_status *ts, struct ath_txq *txq, 843 unsigned int flags) 844 { 845 #define TX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].ts\ 846 [sc->debug.tsidx].c) 847 int qnum = txq->axq_qnum; 848 849 TX_STAT_INC(qnum, tx_pkts_all); 850 sc->debug.stats.txstats[qnum].tx_bytes_all += bf->bf_mpdu->len; 851 852 if (bf_isampdu(bf)) { 853 if (flags & ATH_TX_BAR) 854 TX_STAT_INC(qnum, a_xretries); 855 else 856 TX_STAT_INC(qnum, a_completed); 857 } else { 858 if (ts->ts_status & ATH9K_TXERR_XRETRY) 859 TX_STAT_INC(qnum, xretries); 860 else 861 TX_STAT_INC(qnum, completed); 862 } 863 864 if (ts->ts_status & ATH9K_TXERR_FIFO) 865 TX_STAT_INC(qnum, fifo_underrun); 866 if (ts->ts_status & ATH9K_TXERR_XTXOP) 867 TX_STAT_INC(qnum, xtxop); 868 if (ts->ts_status & ATH9K_TXERR_TIMER_EXPIRED) 869 TX_STAT_INC(qnum, timer_exp); 870 if (ts->ts_flags & ATH9K_TX_DESC_CFG_ERR) 871 TX_STAT_INC(qnum, desc_cfg_err); 872 if (ts->ts_flags & ATH9K_TX_DATA_UNDERRUN) 873 TX_STAT_INC(qnum, data_underrun); 874 if (ts->ts_flags & ATH9K_TX_DELIM_UNDERRUN) 875 TX_STAT_INC(qnum, delim_underrun); 876 877 spin_lock(&sc->debug.samp_lock); 878 TX_SAMP_DBG(jiffies) = jiffies; 879 TX_SAMP_DBG(rssi_ctl0) = ts->ts_rssi_ctl0; 880 TX_SAMP_DBG(rssi_ctl1) = ts->ts_rssi_ctl1; 881 TX_SAMP_DBG(rssi_ctl2) = ts->ts_rssi_ctl2; 882 TX_SAMP_DBG(rssi_ext0) = ts->ts_rssi_ext0; 883 TX_SAMP_DBG(rssi_ext1) = ts->ts_rssi_ext1; 884 TX_SAMP_DBG(rssi_ext2) = ts->ts_rssi_ext2; 885 TX_SAMP_DBG(rateindex) = ts->ts_rateindex; 886 TX_SAMP_DBG(isok) = !!(ts->ts_status & ATH9K_TXERR_MASK); 887 TX_SAMP_DBG(rts_fail_cnt) = ts->ts_shortretry; 888 TX_SAMP_DBG(data_fail_cnt) = ts->ts_longretry; 889 TX_SAMP_DBG(rssi) = ts->ts_rssi; 890 TX_SAMP_DBG(tid) = ts->tid; 891 TX_SAMP_DBG(qid) = ts->qid; 892 893 if (ts->ts_flags & ATH9K_TX_BA) { 894 TX_SAMP_DBG(ba_low) = ts->ba_low; 895 TX_SAMP_DBG(ba_high) = ts->ba_high; 896 } else { 897 TX_SAMP_DBG(ba_low) = 0; 898 TX_SAMP_DBG(ba_high) = 0; 899 } 900 901 sc->debug.tsidx = (sc->debug.tsidx + 1) % ATH_DBG_MAX_SAMPLES; 902 spin_unlock(&sc->debug.samp_lock); 903 904 #undef TX_SAMP_DBG 905 } 906 907 static const struct file_operations fops_xmit = { 908 .read = read_file_xmit, 909 .open = ath9k_debugfs_open, 910 .owner = THIS_MODULE, 911 .llseek = default_llseek, 912 }; 913 914 static const struct file_operations fops_stations = { 915 .read = read_file_stations, 916 .open = ath9k_debugfs_open, 917 .owner = THIS_MODULE, 918 .llseek = default_llseek, 919 }; 920 921 static const struct file_operations fops_misc = { 922 .read = read_file_misc, 923 .open = ath9k_debugfs_open, 924 .owner = THIS_MODULE, 925 .llseek = default_llseek, 926 }; 927 928 static ssize_t read_file_recv(struct file *file, char __user *user_buf, 929 size_t count, loff_t *ppos) 930 { 931 #define PHY_ERR(s, p) \ 932 len += snprintf(buf + len, size - len, "%18s : %10u\n", s, \ 933 sc->debug.stats.rxstats.phy_err_stats[p]); 934 935 struct ath_softc *sc = file->private_data; 936 char *buf; 937 unsigned int len = 0, size = 1400; 938 ssize_t retval = 0; 939 940 buf = kzalloc(size, GFP_KERNEL); 941 if (buf == NULL) 942 return -ENOMEM; 943 944 len += snprintf(buf + len, size - len, 945 "%18s : %10u\n", "CRC ERR", 946 sc->debug.stats.rxstats.crc_err); 947 len += snprintf(buf + len, size - len, 948 "%18s : %10u\n", "DECRYPT CRC ERR", 949 sc->debug.stats.rxstats.decrypt_crc_err); 950 len += snprintf(buf + len, size - len, 951 "%18s : %10u\n", "PHY ERR", 952 sc->debug.stats.rxstats.phy_err); 953 len += snprintf(buf + len, size - len, 954 "%18s : %10u\n", "MIC ERR", 955 sc->debug.stats.rxstats.mic_err); 956 len += snprintf(buf + len, size - len, 957 "%18s : %10u\n", "PRE-DELIM CRC ERR", 958 sc->debug.stats.rxstats.pre_delim_crc_err); 959 len += snprintf(buf + len, size - len, 960 "%18s : %10u\n", "POST-DELIM CRC ERR", 961 sc->debug.stats.rxstats.post_delim_crc_err); 962 len += snprintf(buf + len, size - len, 963 "%18s : %10u\n", "DECRYPT BUSY ERR", 964 sc->debug.stats.rxstats.decrypt_busy_err); 965 966 len += snprintf(buf + len, size - len, 967 "%18s : %10d\n", "RSSI-CTL0", 968 sc->debug.stats.rxstats.rs_rssi_ctl0); 969 970 len += snprintf(buf + len, size - len, 971 "%18s : %10d\n", "RSSI-CTL1", 972 sc->debug.stats.rxstats.rs_rssi_ctl1); 973 974 len += snprintf(buf + len, size - len, 975 "%18s : %10d\n", "RSSI-CTL2", 976 sc->debug.stats.rxstats.rs_rssi_ctl2); 977 978 len += snprintf(buf + len, size - len, 979 "%18s : %10d\n", "RSSI-EXT0", 980 sc->debug.stats.rxstats.rs_rssi_ext0); 981 982 len += snprintf(buf + len, size - len, 983 "%18s : %10d\n", "RSSI-EXT1", 984 sc->debug.stats.rxstats.rs_rssi_ext1); 985 986 len += snprintf(buf + len, size - len, 987 "%18s : %10d\n", "RSSI-EXT2", 988 sc->debug.stats.rxstats.rs_rssi_ext2); 989 990 len += snprintf(buf + len, size - len, 991 "%18s : %10d\n", "Rx Antenna", 992 sc->debug.stats.rxstats.rs_antenna); 993 994 PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN); 995 PHY_ERR("TIMING", ATH9K_PHYERR_TIMING); 996 PHY_ERR("PARITY", ATH9K_PHYERR_PARITY); 997 PHY_ERR("RATE", ATH9K_PHYERR_RATE); 998 PHY_ERR("LENGTH", ATH9K_PHYERR_LENGTH); 999 PHY_ERR("RADAR", ATH9K_PHYERR_RADAR); 1000 PHY_ERR("SERVICE", ATH9K_PHYERR_SERVICE); 1001 PHY_ERR("TOR", ATH9K_PHYERR_TOR); 1002 PHY_ERR("OFDM-TIMING", ATH9K_PHYERR_OFDM_TIMING); 1003 PHY_ERR("OFDM-SIGNAL-PARITY", ATH9K_PHYERR_OFDM_SIGNAL_PARITY); 1004 PHY_ERR("OFDM-RATE", ATH9K_PHYERR_OFDM_RATE_ILLEGAL); 1005 PHY_ERR("OFDM-LENGTH", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL); 1006 PHY_ERR("OFDM-POWER-DROP", ATH9K_PHYERR_OFDM_POWER_DROP); 1007 PHY_ERR("OFDM-SERVICE", ATH9K_PHYERR_OFDM_SERVICE); 1008 PHY_ERR("OFDM-RESTART", ATH9K_PHYERR_OFDM_RESTART); 1009 PHY_ERR("FALSE-RADAR-EXT", ATH9K_PHYERR_FALSE_RADAR_EXT); 1010 PHY_ERR("CCK-TIMING", ATH9K_PHYERR_CCK_TIMING); 1011 PHY_ERR("CCK-HEADER-CRC", ATH9K_PHYERR_CCK_HEADER_CRC); 1012 PHY_ERR("CCK-RATE", ATH9K_PHYERR_CCK_RATE_ILLEGAL); 1013 PHY_ERR("CCK-SERVICE", ATH9K_PHYERR_CCK_SERVICE); 1014 PHY_ERR("CCK-RESTART", ATH9K_PHYERR_CCK_RESTART); 1015 PHY_ERR("CCK-LENGTH", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL); 1016 PHY_ERR("CCK-POWER-DROP", ATH9K_PHYERR_CCK_POWER_DROP); 1017 PHY_ERR("HT-CRC", ATH9K_PHYERR_HT_CRC_ERROR); 1018 PHY_ERR("HT-LENGTH", ATH9K_PHYERR_HT_LENGTH_ILLEGAL); 1019 PHY_ERR("HT-RATE", ATH9K_PHYERR_HT_RATE_ILLEGAL); 1020 1021 len += snprintf(buf + len, size - len, 1022 "%18s : %10u\n", "RX-Pkts-All", 1023 sc->debug.stats.rxstats.rx_pkts_all); 1024 len += snprintf(buf + len, size - len, 1025 "%18s : %10u\n", "RX-Bytes-All", 1026 sc->debug.stats.rxstats.rx_bytes_all); 1027 1028 if (len > size) 1029 len = size; 1030 1031 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1032 kfree(buf); 1033 1034 return retval; 1035 1036 #undef PHY_ERR 1037 } 1038 1039 void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) 1040 { 1041 #define RX_STAT_INC(c) sc->debug.stats.rxstats.c++ 1042 #define RX_PHY_ERR_INC(c) sc->debug.stats.rxstats.phy_err_stats[c]++ 1043 #define RX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].rs\ 1044 [sc->debug.rsidx].c) 1045 1046 u32 phyerr; 1047 1048 RX_STAT_INC(rx_pkts_all); 1049 sc->debug.stats.rxstats.rx_bytes_all += rs->rs_datalen; 1050 1051 if (rs->rs_status & ATH9K_RXERR_CRC) 1052 RX_STAT_INC(crc_err); 1053 if (rs->rs_status & ATH9K_RXERR_DECRYPT) 1054 RX_STAT_INC(decrypt_crc_err); 1055 if (rs->rs_status & ATH9K_RXERR_MIC) 1056 RX_STAT_INC(mic_err); 1057 if (rs->rs_status & ATH9K_RX_DELIM_CRC_PRE) 1058 RX_STAT_INC(pre_delim_crc_err); 1059 if (rs->rs_status & ATH9K_RX_DELIM_CRC_POST) 1060 RX_STAT_INC(post_delim_crc_err); 1061 if (rs->rs_status & ATH9K_RX_DECRYPT_BUSY) 1062 RX_STAT_INC(decrypt_busy_err); 1063 1064 if (rs->rs_status & ATH9K_RXERR_PHY) { 1065 RX_STAT_INC(phy_err); 1066 phyerr = rs->rs_phyerr & 0x24; 1067 RX_PHY_ERR_INC(phyerr); 1068 } 1069 1070 sc->debug.stats.rxstats.rs_rssi_ctl0 = rs->rs_rssi_ctl0; 1071 sc->debug.stats.rxstats.rs_rssi_ctl1 = rs->rs_rssi_ctl1; 1072 sc->debug.stats.rxstats.rs_rssi_ctl2 = rs->rs_rssi_ctl2; 1073 1074 sc->debug.stats.rxstats.rs_rssi_ext0 = rs->rs_rssi_ext0; 1075 sc->debug.stats.rxstats.rs_rssi_ext1 = rs->rs_rssi_ext1; 1076 sc->debug.stats.rxstats.rs_rssi_ext2 = rs->rs_rssi_ext2; 1077 1078 sc->debug.stats.rxstats.rs_antenna = rs->rs_antenna; 1079 1080 spin_lock(&sc->debug.samp_lock); 1081 RX_SAMP_DBG(jiffies) = jiffies; 1082 RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0; 1083 RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl1; 1084 RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl2; 1085 RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext0; 1086 RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext1; 1087 RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext2; 1088 RX_SAMP_DBG(antenna) = rs->rs_antenna; 1089 RX_SAMP_DBG(rssi) = rs->rs_rssi; 1090 RX_SAMP_DBG(rate) = rs->rs_rate; 1091 RX_SAMP_DBG(is_mybeacon) = rs->is_mybeacon; 1092 1093 sc->debug.rsidx = (sc->debug.rsidx + 1) % ATH_DBG_MAX_SAMPLES; 1094 spin_unlock(&sc->debug.samp_lock); 1095 1096 #undef RX_STAT_INC 1097 #undef RX_PHY_ERR_INC 1098 #undef RX_SAMP_DBG 1099 } 1100 1101 static const struct file_operations fops_recv = { 1102 .read = read_file_recv, 1103 .open = ath9k_debugfs_open, 1104 .owner = THIS_MODULE, 1105 .llseek = default_llseek, 1106 }; 1107 1108 static ssize_t read_file_regidx(struct file *file, char __user *user_buf, 1109 size_t count, loff_t *ppos) 1110 { 1111 struct ath_softc *sc = file->private_data; 1112 char buf[32]; 1113 unsigned int len; 1114 1115 len = sprintf(buf, "0x%08x\n", sc->debug.regidx); 1116 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1117 } 1118 1119 static ssize_t write_file_regidx(struct file *file, const char __user *user_buf, 1120 size_t count, loff_t *ppos) 1121 { 1122 struct ath_softc *sc = file->private_data; 1123 unsigned long regidx; 1124 char buf[32]; 1125 ssize_t len; 1126 1127 len = min(count, sizeof(buf) - 1); 1128 if (copy_from_user(buf, user_buf, len)) 1129 return -EFAULT; 1130 1131 buf[len] = '\0'; 1132 if (strict_strtoul(buf, 0, ®idx)) 1133 return -EINVAL; 1134 1135 sc->debug.regidx = regidx; 1136 return count; 1137 } 1138 1139 static const struct file_operations fops_regidx = { 1140 .read = read_file_regidx, 1141 .write = write_file_regidx, 1142 .open = ath9k_debugfs_open, 1143 .owner = THIS_MODULE, 1144 .llseek = default_llseek, 1145 }; 1146 1147 static ssize_t read_file_regval(struct file *file, char __user *user_buf, 1148 size_t count, loff_t *ppos) 1149 { 1150 struct ath_softc *sc = file->private_data; 1151 struct ath_hw *ah = sc->sc_ah; 1152 char buf[32]; 1153 unsigned int len; 1154 u32 regval; 1155 1156 ath9k_ps_wakeup(sc); 1157 regval = REG_READ_D(ah, sc->debug.regidx); 1158 ath9k_ps_restore(sc); 1159 len = sprintf(buf, "0x%08x\n", regval); 1160 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1161 } 1162 1163 static ssize_t write_file_regval(struct file *file, const char __user *user_buf, 1164 size_t count, loff_t *ppos) 1165 { 1166 struct ath_softc *sc = file->private_data; 1167 struct ath_hw *ah = sc->sc_ah; 1168 unsigned long regval; 1169 char buf[32]; 1170 ssize_t len; 1171 1172 len = min(count, sizeof(buf) - 1); 1173 if (copy_from_user(buf, user_buf, len)) 1174 return -EFAULT; 1175 1176 buf[len] = '\0'; 1177 if (strict_strtoul(buf, 0, ®val)) 1178 return -EINVAL; 1179 1180 ath9k_ps_wakeup(sc); 1181 REG_WRITE_D(ah, sc->debug.regidx, regval); 1182 ath9k_ps_restore(sc); 1183 return count; 1184 } 1185 1186 static const struct file_operations fops_regval = { 1187 .read = read_file_regval, 1188 .write = write_file_regval, 1189 .open = ath9k_debugfs_open, 1190 .owner = THIS_MODULE, 1191 .llseek = default_llseek, 1192 }; 1193 1194 #define REGDUMP_LINE_SIZE 20 1195 1196 static int open_file_regdump(struct inode *inode, struct file *file) 1197 { 1198 struct ath_softc *sc = inode->i_private; 1199 unsigned int len = 0; 1200 u8 *buf; 1201 int i; 1202 unsigned long num_regs, regdump_len, max_reg_offset; 1203 1204 max_reg_offset = AR_SREV_9300_20_OR_LATER(sc->sc_ah) ? 0x16bd4 : 0xb500; 1205 num_regs = max_reg_offset / 4 + 1; 1206 regdump_len = num_regs * REGDUMP_LINE_SIZE + 1; 1207 buf = vmalloc(regdump_len); 1208 if (!buf) 1209 return -ENOMEM; 1210 1211 ath9k_ps_wakeup(sc); 1212 for (i = 0; i < num_regs; i++) 1213 len += scnprintf(buf + len, regdump_len - len, 1214 "0x%06x 0x%08x\n", i << 2, REG_READ(sc->sc_ah, i << 2)); 1215 ath9k_ps_restore(sc); 1216 1217 file->private_data = buf; 1218 1219 return 0; 1220 } 1221 1222 static const struct file_operations fops_regdump = { 1223 .open = open_file_regdump, 1224 .read = ath9k_debugfs_read_buf, 1225 .release = ath9k_debugfs_release_buf, 1226 .owner = THIS_MODULE, 1227 .llseek = default_llseek,/* read accesses f_pos */ 1228 }; 1229 1230 static ssize_t read_file_dump_nfcal(struct file *file, char __user *user_buf, 1231 size_t count, loff_t *ppos) 1232 { 1233 struct ath_softc *sc = file->private_data; 1234 struct ath_hw *ah = sc->sc_ah; 1235 struct ath9k_nfcal_hist *h = sc->caldata.nfCalHist; 1236 struct ath_common *common = ath9k_hw_common(ah); 1237 struct ieee80211_conf *conf = &common->hw->conf; 1238 u32 len = 0, size = 1500; 1239 u32 i, j; 1240 ssize_t retval = 0; 1241 char *buf; 1242 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; 1243 u8 nread; 1244 1245 buf = kzalloc(size, GFP_KERNEL); 1246 if (!buf) 1247 return -ENOMEM; 1248 1249 len += snprintf(buf + len, size - len, 1250 "Channel Noise Floor : %d\n", ah->noise); 1251 len += snprintf(buf + len, size - len, 1252 "Chain | privNF | # Readings | NF Readings\n"); 1253 for (i = 0; i < NUM_NF_READINGS; i++) { 1254 if (!(chainmask & (1 << i)) || 1255 ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf))) 1256 continue; 1257 1258 nread = AR_PHY_CCA_FILTERWINDOW_LENGTH - h[i].invalidNFcount; 1259 len += snprintf(buf + len, size - len, " %d\t %d\t %d\t\t", 1260 i, h[i].privNF, nread); 1261 for (j = 0; j < nread; j++) 1262 len += snprintf(buf + len, size - len, 1263 " %d", h[i].nfCalBuffer[j]); 1264 len += snprintf(buf + len, size - len, "\n"); 1265 } 1266 1267 if (len > size) 1268 len = size; 1269 1270 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1271 kfree(buf); 1272 1273 return retval; 1274 } 1275 1276 static const struct file_operations fops_dump_nfcal = { 1277 .read = read_file_dump_nfcal, 1278 .open = ath9k_debugfs_open, 1279 .owner = THIS_MODULE, 1280 .llseek = default_llseek, 1281 }; 1282 1283 static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf, 1284 size_t count, loff_t *ppos) 1285 { 1286 struct ath_softc *sc = file->private_data; 1287 struct ath_hw *ah = sc->sc_ah; 1288 u32 len = 0, size = 1500; 1289 ssize_t retval = 0; 1290 char *buf; 1291 1292 buf = kzalloc(size, GFP_KERNEL); 1293 if (!buf) 1294 return -ENOMEM; 1295 1296 len = ah->eep_ops->dump_eeprom(ah, true, buf, len, size); 1297 1298 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1299 kfree(buf); 1300 1301 return retval; 1302 } 1303 1304 static const struct file_operations fops_base_eeprom = { 1305 .read = read_file_base_eeprom, 1306 .open = ath9k_debugfs_open, 1307 .owner = THIS_MODULE, 1308 .llseek = default_llseek, 1309 }; 1310 1311 static ssize_t read_file_modal_eeprom(struct file *file, char __user *user_buf, 1312 size_t count, loff_t *ppos) 1313 { 1314 struct ath_softc *sc = file->private_data; 1315 struct ath_hw *ah = sc->sc_ah; 1316 u32 len = 0, size = 6000; 1317 char *buf; 1318 size_t retval; 1319 1320 buf = kzalloc(size, GFP_KERNEL); 1321 if (buf == NULL) 1322 return -ENOMEM; 1323 1324 len = ah->eep_ops->dump_eeprom(ah, false, buf, len, size); 1325 1326 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1327 kfree(buf); 1328 1329 return retval; 1330 } 1331 1332 static const struct file_operations fops_modal_eeprom = { 1333 .read = read_file_modal_eeprom, 1334 .open = ath9k_debugfs_open, 1335 .owner = THIS_MODULE, 1336 .llseek = default_llseek, 1337 }; 1338 1339 void ath9k_debug_samp_bb_mac(struct ath_softc *sc) 1340 { 1341 #define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c) 1342 struct ath_hw *ah = sc->sc_ah; 1343 struct ath_common *common = ath9k_hw_common(ah); 1344 unsigned long flags; 1345 int i; 1346 1347 ath9k_ps_wakeup(sc); 1348 1349 spin_lock_bh(&sc->debug.samp_lock); 1350 1351 spin_lock_irqsave(&common->cc_lock, flags); 1352 ath_hw_cycle_counters_update(common); 1353 1354 ATH_SAMP_DBG(cc.cycles) = common->cc_ani.cycles; 1355 ATH_SAMP_DBG(cc.rx_busy) = common->cc_ani.rx_busy; 1356 ATH_SAMP_DBG(cc.rx_frame) = common->cc_ani.rx_frame; 1357 ATH_SAMP_DBG(cc.tx_frame) = common->cc_ani.tx_frame; 1358 spin_unlock_irqrestore(&common->cc_lock, flags); 1359 1360 ATH_SAMP_DBG(noise) = ah->noise; 1361 1362 REG_WRITE_D(ah, AR_MACMISC, 1363 ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) | 1364 (AR_MACMISC_MISC_OBS_BUS_1 << 1365 AR_MACMISC_MISC_OBS_BUS_MSB_S))); 1366 1367 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) 1368 ATH_SAMP_DBG(dma_dbg_reg_vals[i]) = REG_READ_D(ah, 1369 AR_DMADBG_0 + (i * sizeof(u32))); 1370 1371 ATH_SAMP_DBG(pcu_obs) = REG_READ_D(ah, AR_OBS_BUS_1); 1372 ATH_SAMP_DBG(pcu_cr) = REG_READ_D(ah, AR_CR); 1373 1374 memcpy(ATH_SAMP_DBG(nfCalHist), sc->caldata.nfCalHist, 1375 sizeof(ATH_SAMP_DBG(nfCalHist))); 1376 1377 sc->debug.sampidx = (sc->debug.sampidx + 1) % ATH_DBG_MAX_SAMPLES; 1378 spin_unlock_bh(&sc->debug.samp_lock); 1379 ath9k_ps_restore(sc); 1380 1381 #undef ATH_SAMP_DBG 1382 } 1383 1384 static int open_file_bb_mac_samps(struct inode *inode, struct file *file) 1385 { 1386 #define ATH_SAMP_DBG(c) bb_mac_samp[sampidx].c 1387 struct ath_softc *sc = inode->i_private; 1388 struct ath_hw *ah = sc->sc_ah; 1389 struct ath_common *common = ath9k_hw_common(ah); 1390 struct ieee80211_conf *conf = &common->hw->conf; 1391 struct ath_dbg_bb_mac_samp *bb_mac_samp; 1392 struct ath9k_nfcal_hist *h; 1393 int i, j, qcuOffset = 0, dcuOffset = 0; 1394 u32 *qcuBase, *dcuBase, size = 30000, len = 0; 1395 u32 sampidx = 0; 1396 u8 *buf; 1397 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; 1398 u8 nread; 1399 1400 if (sc->sc_flags & SC_OP_INVALID) 1401 return -EAGAIN; 1402 1403 buf = vmalloc(size); 1404 if (!buf) 1405 return -ENOMEM; 1406 bb_mac_samp = vmalloc(sizeof(*bb_mac_samp) * ATH_DBG_MAX_SAMPLES); 1407 if (!bb_mac_samp) { 1408 vfree(buf); 1409 return -ENOMEM; 1410 } 1411 /* Account the current state too */ 1412 ath9k_debug_samp_bb_mac(sc); 1413 1414 spin_lock_bh(&sc->debug.samp_lock); 1415 memcpy(bb_mac_samp, sc->debug.bb_mac_samp, 1416 sizeof(*bb_mac_samp) * ATH_DBG_MAX_SAMPLES); 1417 len += snprintf(buf + len, size - len, 1418 "Current Sample Index: %d\n", sc->debug.sampidx); 1419 spin_unlock_bh(&sc->debug.samp_lock); 1420 1421 len += snprintf(buf + len, size - len, 1422 "Raw DMA Debug Dump:\n"); 1423 len += snprintf(buf + len, size - len, "Sample |\t"); 1424 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) 1425 len += snprintf(buf + len, size - len, " DMA Reg%d |\t", i); 1426 len += snprintf(buf + len, size - len, "\n"); 1427 1428 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1429 len += snprintf(buf + len, size - len, "%d\t", sampidx); 1430 1431 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) 1432 len += snprintf(buf + len, size - len, " %08x\t", 1433 ATH_SAMP_DBG(dma_dbg_reg_vals[i])); 1434 len += snprintf(buf + len, size - len, "\n"); 1435 } 1436 len += snprintf(buf + len, size - len, "\n"); 1437 1438 len += snprintf(buf + len, size - len, 1439 "Sample Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); 1440 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1441 qcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[0]); 1442 dcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[4]); 1443 1444 for (i = 0; i < ATH9K_NUM_QUEUES; i++, 1445 qcuOffset += 4, dcuOffset += 5) { 1446 if (i == 8) { 1447 qcuOffset = 0; 1448 qcuBase++; 1449 } 1450 1451 if (i == 6) { 1452 dcuOffset = 0; 1453 dcuBase++; 1454 } 1455 if (!sc->debug.stats.txstats[i].queued) 1456 continue; 1457 1458 len += snprintf(buf + len, size - len, 1459 "%4d %7d %2x %1x %2x %2x\n", 1460 sampidx, i, 1461 (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, 1462 (*qcuBase & (0x8 << qcuOffset)) >> 1463 (qcuOffset + 3), 1464 ATH_SAMP_DBG(dma_dbg_reg_vals[2]) & 1465 (0x7 << (i * 3)) >> (i * 3), 1466 (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); 1467 } 1468 len += snprintf(buf + len, size - len, "\n"); 1469 } 1470 len += snprintf(buf + len, size - len, 1471 "samp qcu_sh qcu_fh qcu_comp dcu_comp dcu_arb dcu_fp " 1472 "ch_idle_dur ch_idle_dur_val txfifo_val0 txfifo_val1 " 1473 "txfifo_dcu0 txfifo_dcu1 pcu_obs AR_CR\n"); 1474 1475 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1476 qcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[0]); 1477 dcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[4]); 1478 1479 len += snprintf(buf + len, size - len, "%4d %5x %5x ", sampidx, 1480 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x003c0000) >> 18, 1481 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x03c00000) >> 22); 1482 len += snprintf(buf + len, size - len, "%7x %8x ", 1483 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x1c000000) >> 26, 1484 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x3)); 1485 len += snprintf(buf + len, size - len, "%7x %7x ", 1486 (ATH_SAMP_DBG(dma_dbg_reg_vals[5]) & 0x06000000) >> 25, 1487 (ATH_SAMP_DBG(dma_dbg_reg_vals[5]) & 0x38000000) >> 27); 1488 len += snprintf(buf + len, size - len, "%7d %12d ", 1489 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x000003fc) >> 2, 1490 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00000400) >> 10); 1491 len += snprintf(buf + len, size - len, "%12d %12d ", 1492 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00000800) >> 11, 1493 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00001000) >> 12); 1494 len += snprintf(buf + len, size - len, "%12d %12d ", 1495 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x0001e000) >> 13, 1496 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x001e0000) >> 17); 1497 len += snprintf(buf + len, size - len, "0x%07x 0x%07x\n", 1498 ATH_SAMP_DBG(pcu_obs), ATH_SAMP_DBG(pcu_cr)); 1499 } 1500 1501 len += snprintf(buf + len, size - len, 1502 "Sample ChNoise Chain privNF #Reading Readings\n"); 1503 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1504 h = ATH_SAMP_DBG(nfCalHist); 1505 if (!ATH_SAMP_DBG(noise)) 1506 continue; 1507 1508 for (i = 0; i < NUM_NF_READINGS; i++) { 1509 if (!(chainmask & (1 << i)) || 1510 ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf))) 1511 continue; 1512 1513 nread = AR_PHY_CCA_FILTERWINDOW_LENGTH - 1514 h[i].invalidNFcount; 1515 len += snprintf(buf + len, size - len, 1516 "%4d %5d %4d\t %d\t %d\t", 1517 sampidx, ATH_SAMP_DBG(noise), 1518 i, h[i].privNF, nread); 1519 for (j = 0; j < nread; j++) 1520 len += snprintf(buf + len, size - len, 1521 " %d", h[i].nfCalBuffer[j]); 1522 len += snprintf(buf + len, size - len, "\n"); 1523 } 1524 } 1525 len += snprintf(buf + len, size - len, "\nCycle counters:\n" 1526 "Sample Total Rxbusy Rxframes Txframes\n"); 1527 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1528 if (!ATH_SAMP_DBG(cc.cycles)) 1529 continue; 1530 len += snprintf(buf + len, size - len, 1531 "%4d %08x %08x %08x %08x\n", 1532 sampidx, ATH_SAMP_DBG(cc.cycles), 1533 ATH_SAMP_DBG(cc.rx_busy), 1534 ATH_SAMP_DBG(cc.rx_frame), 1535 ATH_SAMP_DBG(cc.tx_frame)); 1536 } 1537 1538 len += snprintf(buf + len, size - len, "Tx status Dump :\n"); 1539 len += snprintf(buf + len, size - len, 1540 "Sample rssi:- ctl0 ctl1 ctl2 ext0 ext1 ext2 comb " 1541 "isok rts_fail data_fail rate tid qid " 1542 "ba_low ba_high tx_before(ms)\n"); 1543 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1544 for (i = 0; i < ATH_DBG_MAX_SAMPLES; i++) { 1545 if (!ATH_SAMP_DBG(ts[i].jiffies)) 1546 continue; 1547 len += snprintf(buf + len, size - len, "%-14d" 1548 "%-4d %-4d %-4d %-4d %-4d %-4d %-4d %-4d %-8d " 1549 "%-9d %-4d %-3d %-3d %08x %08x %-11d\n", 1550 sampidx, 1551 ATH_SAMP_DBG(ts[i].rssi_ctl0), 1552 ATH_SAMP_DBG(ts[i].rssi_ctl1), 1553 ATH_SAMP_DBG(ts[i].rssi_ctl2), 1554 ATH_SAMP_DBG(ts[i].rssi_ext0), 1555 ATH_SAMP_DBG(ts[i].rssi_ext1), 1556 ATH_SAMP_DBG(ts[i].rssi_ext2), 1557 ATH_SAMP_DBG(ts[i].rssi), 1558 ATH_SAMP_DBG(ts[i].isok), 1559 ATH_SAMP_DBG(ts[i].rts_fail_cnt), 1560 ATH_SAMP_DBG(ts[i].data_fail_cnt), 1561 ATH_SAMP_DBG(ts[i].rateindex), 1562 ATH_SAMP_DBG(ts[i].tid), 1563 ATH_SAMP_DBG(ts[i].qid), 1564 ATH_SAMP_DBG(ts[i].ba_low), 1565 ATH_SAMP_DBG(ts[i].ba_high), 1566 jiffies_to_msecs(jiffies - 1567 ATH_SAMP_DBG(ts[i].jiffies))); 1568 } 1569 } 1570 1571 len += snprintf(buf + len, size - len, "Rx status Dump :\n"); 1572 len += snprintf(buf + len, size - len, "Sample rssi:- ctl0 ctl1 ctl2 " 1573 "ext0 ext1 ext2 comb beacon ant rate rx_before(ms)\n"); 1574 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) { 1575 for (i = 0; i < ATH_DBG_MAX_SAMPLES; i++) { 1576 if (!ATH_SAMP_DBG(rs[i].jiffies)) 1577 continue; 1578 len += snprintf(buf + len, size - len, "%-14d" 1579 "%-4d %-4d %-4d %-4d %-4d %-4d %-4d %-9s %-2d %02x %-13d\n", 1580 sampidx, 1581 ATH_SAMP_DBG(rs[i].rssi_ctl0), 1582 ATH_SAMP_DBG(rs[i].rssi_ctl1), 1583 ATH_SAMP_DBG(rs[i].rssi_ctl2), 1584 ATH_SAMP_DBG(rs[i].rssi_ext0), 1585 ATH_SAMP_DBG(rs[i].rssi_ext1), 1586 ATH_SAMP_DBG(rs[i].rssi_ext2), 1587 ATH_SAMP_DBG(rs[i].rssi), 1588 ATH_SAMP_DBG(rs[i].is_mybeacon) ? 1589 "True" : "False", 1590 ATH_SAMP_DBG(rs[i].antenna), 1591 ATH_SAMP_DBG(rs[i].rate), 1592 jiffies_to_msecs(jiffies - 1593 ATH_SAMP_DBG(rs[i].jiffies))); 1594 } 1595 } 1596 1597 vfree(bb_mac_samp); 1598 file->private_data = buf; 1599 1600 return 0; 1601 #undef ATH_SAMP_DBG 1602 } 1603 1604 static const struct file_operations fops_samps = { 1605 .open = open_file_bb_mac_samps, 1606 .read = ath9k_debugfs_read_buf, 1607 .release = ath9k_debugfs_release_buf, 1608 .owner = THIS_MODULE, 1609 .llseek = default_llseek, 1610 }; 1611 1612 1613 int ath9k_init_debug(struct ath_hw *ah) 1614 { 1615 struct ath_common *common = ath9k_hw_common(ah); 1616 struct ath_softc *sc = (struct ath_softc *) common->priv; 1617 1618 sc->debug.debugfs_phy = debugfs_create_dir("ath9k", 1619 sc->hw->wiphy->debugfsdir); 1620 if (!sc->debug.debugfs_phy) 1621 return -ENOMEM; 1622 1623 #ifdef CONFIG_ATH_DEBUG 1624 debugfs_create_file("debug", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 1625 sc, &fops_debug); 1626 #endif 1627 debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc, 1628 &fops_dma); 1629 debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, 1630 &fops_interrupt); 1631 debugfs_create_file("wiphy", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 1632 sc, &fops_wiphy); 1633 debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, 1634 &fops_xmit); 1635 debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, 1636 &fops_stations); 1637 debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc, 1638 &fops_misc); 1639 debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc, 1640 &fops_recv); 1641 debugfs_create_file("rx_chainmask", S_IRUSR | S_IWUSR, 1642 sc->debug.debugfs_phy, sc, &fops_rx_chainmask); 1643 debugfs_create_file("tx_chainmask", S_IRUSR | S_IWUSR, 1644 sc->debug.debugfs_phy, sc, &fops_tx_chainmask); 1645 debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR, 1646 sc->debug.debugfs_phy, sc, &fops_disable_ani); 1647 debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 1648 sc, &fops_regidx); 1649 debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 1650 sc, &fops_regval); 1651 debugfs_create_bool("ignore_extcca", S_IRUSR | S_IWUSR, 1652 sc->debug.debugfs_phy, 1653 &ah->config.cwm_ignore_extcca); 1654 debugfs_create_file("regdump", S_IRUSR, sc->debug.debugfs_phy, sc, 1655 &fops_regdump); 1656 debugfs_create_file("dump_nfcal", S_IRUSR, sc->debug.debugfs_phy, sc, 1657 &fops_dump_nfcal); 1658 debugfs_create_file("base_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 1659 &fops_base_eeprom); 1660 debugfs_create_file("modal_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 1661 &fops_modal_eeprom); 1662 debugfs_create_file("samples", S_IRUSR, sc->debug.debugfs_phy, sc, 1663 &fops_samps); 1664 1665 debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR, 1666 sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask); 1667 1668 debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 1669 sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); 1670 1671 sc->debug.regidx = 0; 1672 memset(&sc->debug.bb_mac_samp, 0, sizeof(sc->debug.bb_mac_samp)); 1673 sc->debug.sampidx = 0; 1674 sc->debug.tsidx = 0; 1675 sc->debug.rsidx = 0; 1676 return 0; 1677 } 1678