23 #include <linux/export.h>
36 #define ATH6KL_FWLOG_MAX_ENTRIES 20
38 #define ATH6KL_FWLOG_VALID_MASK 0x1ffff
51 rtn =
printk(
"%sath6kl: %pV", level, &vaf);
59 #ifdef CONFIG_ATH6KL_DEBUG
66 if (!(debug_mask & mask))
82 const void *
buf,
size_t len)
84 if (debug_mask & mask) {
86 ath6kl_dbg(mask,
"%s\n", msg);
93 #define REG_OUTPUT_LEN_PER_LINE 25
94 #define REGTYPE_STR_LEN 100
96 struct ath6kl_diag_reg_info {
102 static const struct ath6kl_diag_reg_info diag_reg[] = {
103 { 0x20000, 0x200fc,
"General DMA and Rx registers" },
104 { 0x28000, 0x28900,
"MAC PCU register & keycache" },
105 { 0x20800, 0x20a40,
"QCU" },
106 { 0x21000, 0x212f0,
"DCU" },
107 { 0x4000, 0x42e4,
"RTC" },
108 { 0x540000, 0x540000 + (256 * 1024),
"RAM" },
109 { 0x29800, 0x2B210,
"Base Band" },
110 { 0x1C000, 0x1C748,
"Analog" },
118 ath6kl_dbg(
ATH6KL_DBG_IRQ, (
"<------- Register Table -------->\n"));
120 if (irq_proc_reg !=
NULL) {
122 "Host Int status: 0x%x\n",
125 "CPU Int status: 0x%x\n",
128 "Error Int status: 0x%x\n",
131 "Counter Int status: 0x%x\n",
134 "Mbox Frame: 0x%x\n",
137 "Rx Lookahead Valid: 0x%x\n",
140 "Rx Lookahead 0: 0x%x\n",
143 "Rx Lookahead 1: 0x%x\n",
146 if (dev->
ar->mbox_info.gmbox_addr != 0) {
152 "GMBOX Host Int status 2: 0x%x\n",
155 "GMBOX RX Avail: 0x%x\n",
158 "GMBOX lookahead alias 0: 0x%x\n",
161 "GMBOX lookahead alias 1: 0x%x\n",
167 if (irq_enable_reg !=
NULL) {
169 "Int status Enable: 0x%x\n",
174 ath6kl_dbg(
ATH6KL_DBG_IRQ,
"<------------------------------->\n");
180 "--- endpoint: %d svc_id: 0x%X ---\n",
201 get_queue_depth(&ep_dist->
htc_ep->txq));
203 "----------------------------------\n");
212 dump_cred_dist(ep_list);
215 "credit distribution total %
d free %
d\
n",
216 target->credit_info->total_avail_credits,
217 target->credit_info->cur_free_credits);
224 ar->debug.war_stats.invalid_rate++;
229 static ssize_t read_file_war_stats(
struct file *
file,
char __user *user_buf,
230 size_t count, loff_t *ppos)
234 unsigned int len = 0, buf_len = 1500;
241 len +=
scnprintf(buf + len, buf_len - len,
"\n");
242 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
244 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n\n",
245 "=================");
246 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10u\n",
247 "Invalid rates", ar->debug.war_stats.invalid_rate);
259 .
read = read_file_war_stats,
265 void ath6kl_debug_fwlog_event(
struct ath6kl *ar,
const void *buf,
size_t len)
286 memset(slot->
payload + len, 0, ATH6KL_FWLOG_PAYLOAD_SIZE - len);
288 spin_lock(&ar->debug.fwlog_queue.
lock);
290 __skb_queue_tail(&ar->debug.fwlog_queue, skb);
291 complete(&ar->debug.fwlog_completion);
294 while (skb_queue_len(&ar->debug.fwlog_queue) >
296 skb = __skb_dequeue(&ar->debug.fwlog_queue);
300 spin_unlock(&ar->debug.fwlog_queue.
lock);
305 static int ath6kl_fwlog_open(
struct inode *
inode,
struct file *file)
309 if (ar->debug.fwlog_open)
312 ar->debug.fwlog_open =
true;
318 static int ath6kl_fwlog_release(
struct inode *inode,
struct file *file)
322 ar->debug.fwlog_open =
false;
327 static ssize_t ath6kl_fwlog_read(
struct file *file,
char __user *user_buf,
328 size_t count, loff_t *ppos)
343 spin_lock(&ar->debug.fwlog_queue.
lock);
345 while ((skb = __skb_dequeue(&ar->debug.fwlog_queue))) {
346 if (skb->
len > count - len) {
348 __skb_queue_head(&ar->debug.fwlog_queue, skb);
359 spin_unlock(&ar->debug.fwlog_queue.
lock);
371 .
open = ath6kl_fwlog_open,
372 .release = ath6kl_fwlog_release,
373 .read = ath6kl_fwlog_read,
378 static ssize_t ath6kl_fwlog_block_read(
struct file *file,
379 char __user *user_buf,
386 size_t len = 0, not_copied;
394 spin_lock(&ar->debug.fwlog_queue.
lock);
396 if (skb_queue_len(&ar->debug.fwlog_queue) == 0) {
398 init_completion(&ar->debug.fwlog_completion);
400 spin_unlock(&ar->debug.fwlog_queue.
lock);
403 &ar->debug.fwlog_completion);
409 spin_lock(&ar->debug.fwlog_queue.
lock);
412 while ((skb = __skb_dequeue(&ar->debug.fwlog_queue))) {
413 if (skb->
len > count - len) {
415 __skb_queue_head(&ar->debug.fwlog_queue, skb);
426 spin_unlock(&ar->debug.fwlog_queue.
lock);
431 if (not_copied != 0) {
447 .
open = ath6kl_fwlog_open,
448 .release = ath6kl_fwlog_release,
449 .read = ath6kl_fwlog_block_read,
454 static ssize_t ath6kl_fwlog_mask_read(
struct file *file,
char __user *user_buf,
455 size_t count, loff_t *ppos)
461 len =
snprintf(buf,
sizeof(buf),
"0x%x\n", ar->debug.fwlog_mask);
466 static ssize_t ath6kl_fwlog_mask_write(
struct file *file,
467 const char __user *user_buf,
468 size_t count, loff_t *ppos)
473 ret = kstrtou32_from_user(user_buf, count, 0, &ar->debug.fwlog_mask);
479 ar->debug.fwlog_mask);
488 .read = ath6kl_fwlog_mask_read,
489 .write = ath6kl_fwlog_mask_write,
494 static ssize_t read_file_tgt_stats(
struct file *file,
char __user *user_buf,
495 size_t count, loff_t *ppos)
501 unsigned int len = 0, buf_len = 1500;
540 len +=
scnprintf(buf + len, buf_len - len,
"\n");
541 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
543 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n\n",
544 "=================");
545 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
547 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
549 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
551 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
553 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
555 for (i = 0; i < 4; i++)
556 len +=
scnprintf(buf + len, buf_len - len,
557 "%18s %d %10llu\n",
"PER on ac",
559 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
560 "Error", tgt_stats->
tx_err);
561 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
563 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
565 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
567 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
569 len +=
scnprintf(buf + len, buf_len - len,
"%25s %10llu\n\n",
570 "TKIP counter measure used",
573 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
575 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
576 "=================");
578 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
580 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10d\n",
582 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
584 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
586 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
588 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
590 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
591 "Error", tgt_stats->
rx_err);
592 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
594 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
596 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
598 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
600 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
602 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
604 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
606 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n\n",
609 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
610 "Misc Target stats");
611 len +=
scnprintf(buf + len, buf_len - len,
"%25s\n",
612 "=================");
613 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
615 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
617 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10llu\n",
619 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10d\n",
621 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10d\n",
623 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10d\n",
625 len +=
scnprintf(buf + len, buf_len - len,
"%20s %10d\n",
638 .
read = read_file_tgt_stats,
644 #define print_credit_info(fmt_str, ep_list_field) \
645 (len += scnprintf(buf + len, buf_len - len, fmt_str, \
646 ep_list->ep_list_field))
647 #define CREDIT_INFO_DISPLAY_STRING_LEN 200
648 #define CREDIT_INFO_LEN 128
650 static ssize_t read_file_credit_dist_stats(
struct file *file,
651 char __user *user_buf,
652 size_t count, loff_t *ppos)
658 unsigned int buf_len, len = 0;
661 buf_len = CREDIT_INFO_DISPLAY_STRING_LEN +
667 len +=
scnprintf(buf + len, buf_len - len,
"%25s%5d\n",
668 "Total Avail Credits: ",
670 len +=
scnprintf(buf + len, buf_len - len,
"%25s%5d\n",
674 len +=
scnprintf(buf + len, buf_len - len,
675 " Epid Flags Cred_norm Cred_min Credits Cred_assngd"
676 " Seek_cred Cred_sz Cred_per_msg Cred_to_dist"
680 print_credit_info(
" %2d",
endpoint);
684 print_credit_info(
"%9d",
credits);
687 print_credit_info(
"%12d",
cred_sz);
690 len +=
scnprintf(buf + len, buf_len - len,
"%12d\n",
691 get_queue_depth(&ep_list->
htc_ep->txq));
703 .
read = read_file_credit_dist_stats,
709 static unsigned int print_endpoint_stat(
struct htc_target *target,
char *buf,
710 unsigned int buf_len,
unsigned int len,
717 len +=
scnprintf(buf + len, buf_len - len,
"%s:", name);
720 counter = ((
u32 *) ep_st) + (offset / 4);
721 len +=
scnprintf(buf + len, buf_len - len,
" %u", *counter);
723 len +=
scnprintf(buf + len, buf_len - len,
"\n");
728 static ssize_t ath6kl_endpoint_stats_read(
struct file *file,
729 char __user *user_buf,
730 size_t count, loff_t *ppos)
735 unsigned int buf_len, len = 0;
744 #define EPSTAT(name) \
746 len = print_endpoint_stat(target, buf, buf_len, len, \
747 offsetof(struct htc_endpoint_stats, \
783 static ssize_t ath6kl_endpoint_stats_write(
struct file *file,
784 const char __user *user_buf,
785 size_t count, loff_t *ppos)
793 ret = kstrtou32_from_user(user_buf, count, 0, &val);
799 memset(ep_st, 0,
sizeof(*ep_st));
808 .read = ath6kl_endpoint_stats_read,
809 .write = ath6kl_endpoint_stats_write,
814 static unsigned long ath6kl_get_num_reg(
void)
817 unsigned long n_reg = 0;
821 (diag_reg[i].reg_end - diag_reg[i].reg_start) / 4 + 1;
826 static bool ath6kl_dbg_is_diag_reg_valid(
u32 reg_addr)
831 if (reg_addr >= diag_reg[i].reg_start &&
832 reg_addr <= diag_reg[i].reg_end)
839 static ssize_t ath6kl_regread_read(
struct file *file,
char __user *user_buf,
840 size_t count, loff_t *ppos)
844 unsigned int len = 0;
846 if (ar->debug.dbgfs_diag_reg)
847 len +=
scnprintf(buf + len,
sizeof(buf) - len,
"0x%x\n",
848 ar->debug.dbgfs_diag_reg);
850 len +=
scnprintf(buf + len,
sizeof(buf) - len,
851 "All diag registers\n");
856 static ssize_t ath6kl_regread_write(
struct file *file,
857 const char __user *user_buf,
858 size_t count, loff_t *ppos)
866 if ((reg_addr % 4) != 0)
869 if (reg_addr && !ath6kl_dbg_is_diag_reg_valid(reg_addr))
872 ar->debug.dbgfs_diag_reg =
reg_addr;
878 .
read = ath6kl_regread_read,
879 .write = ath6kl_regread_write,
885 static int ath6kl_regdump_open(
struct inode *inode,
struct file *file)
889 unsigned long int reg_len;
890 unsigned int len = 0, n_reg;
896 if (!ar->debug.dbgfs_diag_reg)
897 n_reg = ath6kl_get_num_reg();
901 reg_len = n_reg * REG_OUTPUT_LEN_PER_LINE;
903 reg_len += REGTYPE_STR_LEN;
910 addr = ar->debug.dbgfs_diag_reg;
918 len +=
scnprintf(buf + len, reg_len - len,
924 len +=
scnprintf(buf + len, reg_len - len,
926 for (addr = diag_reg[i].reg_start;
927 addr <= diag_reg[
i].reg_end; addr += 4) {
934 len +=
scnprintf(buf + len, reg_len - len,
950 static ssize_t ath6kl_regdump_read(
struct file *file,
char __user *user_buf,
951 size_t count, loff_t *ppos)
957 static int ath6kl_regdump_release(
struct inode *inode,
struct file *file)
964 .
open = ath6kl_regdump_open,
965 .read = ath6kl_regdump_read,
966 .release = ath6kl_regdump_release,
971 static ssize_t ath6kl_lrssi_roam_write(
struct file *file,
972 const char __user *user_buf,
973 size_t count, loff_t *ppos)
988 static ssize_t ath6kl_lrssi_roam_read(
struct file *file,
989 char __user *user_buf,
990 size_t count, loff_t *ppos)
1002 .
read = ath6kl_lrssi_roam_read,
1003 .write = ath6kl_lrssi_roam_write,
1009 static ssize_t ath6kl_regwrite_read(
struct file *file,
1010 char __user *user_buf,
1011 size_t count, loff_t *ppos)
1015 unsigned int len = 0;
1017 len =
scnprintf(buf,
sizeof(buf),
"Addr: 0x%x Val: 0x%x\n",
1018 ar->debug.diag_reg_addr_wr, ar->debug.diag_reg_val_wr);
1023 static ssize_t ath6kl_regwrite_write(
struct file *file,
1024 const char __user *user_buf,
1025 size_t count, loff_t *ppos)
1030 unsigned int len = 0;
1033 len =
min(count,
sizeof(buf) - 1);
1040 token =
strsep(&sptr,
"=");
1044 if (kstrtou32(token, 0, ®_addr))
1047 if (!ath6kl_dbg_is_diag_reg_valid(reg_addr))
1050 if (kstrtou32(sptr, 0, ®_val))
1053 ar->debug.diag_reg_addr_wr =
reg_addr;
1054 ar->debug.diag_reg_val_wr =
reg_val;
1064 .
read = ath6kl_regwrite_read,
1065 .write = ath6kl_regwrite_write,
1071 int ath6kl_debug_roam_tbl_event(
struct ath6kl *ar,
const void *buf,
1077 if (len <
sizeof(*tbl))
1086 if (ar->debug.roam_tbl ==
NULL ||
1087 ar->debug.roam_tbl_len < (
unsigned int) len) {
1088 kfree(ar->debug.roam_tbl);
1090 if (ar->debug.roam_tbl ==
NULL)
1094 memcpy(ar->debug.roam_tbl, buf, len);
1095 ar->debug.roam_tbl_len = len;
1105 static ssize_t ath6kl_roam_table_read(
struct file *file,
char __user *user_buf,
1106 size_t count, loff_t *ppos)
1114 unsigned int len, buf_len;
1135 if (ar->debug.roam_tbl ==
NULL)
1141 buf_len = 100 + num_entries * 100;
1146 len +=
scnprintf(buf + len, buf_len - len,
1148 "# roam_util bssid rssi rssidt last_rssi util bias\n",
1153 len +=
scnprintf(buf + len, buf_len - len,
1154 "%d %pM %d %d %d %d %d\n",
1170 .
read = ath6kl_roam_table_read,
1176 static ssize_t ath6kl_force_roam_write(
struct file *file,
1177 const char __user *user_buf,
1178 size_t count, loff_t *ppos)
1188 len =
min(count,
sizeof(buf) - 1);
1193 if (
sscanf(buf,
"%02x:%02x:%02x:%02x:%02x:%02x",
1194 &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5])
1208 .
write = ath6kl_force_roam_write,
1214 static ssize_t ath6kl_roam_mode_write(
struct file *file,
1215 const char __user *user_buf,
1216 size_t count, loff_t *ppos)
1224 len =
min(count,
sizeof(buf) - 1);
1228 if (len > 0 && buf[len - 1] ==
'\n')
1229 buf[len - 1] =
'\0';
1248 .
write = ath6kl_roam_mode_write,
1254 void ath6kl_debug_set_keepalive(
struct ath6kl *ar,
u8 keepalive)
1256 ar->debug.keepalive = keepalive;
1259 static ssize_t ath6kl_keepalive_read(
struct file *file,
char __user *user_buf,
1260 size_t count, loff_t *ppos)
1266 len =
snprintf(buf,
sizeof(buf),
"%u\n", ar->debug.keepalive);
1271 static ssize_t ath6kl_keepalive_write(
struct file *file,
1272 const char __user *user_buf,
1273 size_t count, loff_t *ppos)
1292 .read = ath6kl_keepalive_read,
1293 .write = ath6kl_keepalive_write,
1298 void ath6kl_debug_set_disconnect_timeout(
struct ath6kl *ar,
u8 timeout)
1300 ar->debug.disc_timeout = timeout;
1303 static ssize_t ath6kl_disconnect_timeout_read(
struct file *file,
1304 char __user *user_buf,
1305 size_t count, loff_t *ppos)
1311 len =
snprintf(buf,
sizeof(buf),
"%u\n", ar->debug.disc_timeout);
1316 static ssize_t ath6kl_disconnect_timeout_write(
struct file *file,
1317 const char __user *user_buf,
1318 size_t count, loff_t *ppos)
1337 .read = ath6kl_disconnect_timeout_read,
1338 .write = ath6kl_disconnect_timeout_write,
1343 static ssize_t ath6kl_create_qos_write(
struct file *file,
1344 const char __user *user_buf,
1345 size_t count, loff_t *ppos)
1361 len =
min(count,
sizeof(buf) - 1);
1367 token =
strsep(&sptr,
" ");
1370 if (
kstrtou8(token, 0, &pstream.user_pri))
1373 token =
strsep(&sptr,
" ");
1376 if (
kstrtou8(token, 0, &pstream.traffic_direc))
1379 token =
strsep(&sptr,
" ");
1382 if (
kstrtou8(token, 0, &pstream.traffic_class))
1385 token =
strsep(&sptr,
" ");
1388 if (
kstrtou8(token, 0, &pstream.traffic_type))
1391 token =
strsep(&sptr,
" ");
1394 if (
kstrtou8(token, 0, &pstream.voice_psc_cap))
1397 token =
strsep(&sptr,
" ");
1400 if (kstrtou32(token, 0, &val32))
1404 token =
strsep(&sptr,
" ");
1407 if (kstrtou32(token, 0, &val32))
1411 token =
strsep(&sptr,
" ");
1414 if (kstrtou32(token, 0, &val32))
1418 token =
strsep(&sptr,
" ");
1421 if (kstrtou32(token, 0, &val32))
1425 token =
strsep(&sptr,
" ");
1428 if (kstrtou32(token, 0, &val32))
1432 token =
strsep(&sptr,
" ");
1435 if (
kstrtou8(token, 0, &pstream.tsid))
1438 token =
strsep(&sptr,
" ");
1445 token =
strsep(&sptr,
" ");
1452 token =
strsep(&sptr,
" ");
1455 if (kstrtou32(token, 0, &val32))
1459 token =
strsep(&sptr,
" ");
1462 if (kstrtou32(token, 0, &val32))
1466 token =
strsep(&sptr,
" ");
1469 if (kstrtou32(token, 0, &val32))
1473 token =
strsep(&sptr,
" ");
1476 if (kstrtou32(token, 0, &val32))
1480 token =
strsep(&sptr,
" ");
1483 if (kstrtou32(token, 0, &val32))
1487 token =
strsep(&sptr,
" ");
1490 if (kstrtou32(token, 0, &val32))
1494 token =
strsep(&sptr,
" ");
1497 if (kstrtou32(token, 0, &val32))
1501 token =
strsep(&sptr,
" ");
1504 if (kstrtou32(token, 0, &val32))
1508 pstream.nominal_phy =
le32_to_cpu(pstream.min_phy_rate) / 1000000;
1516 .
write = ath6kl_create_qos_write,
1522 static ssize_t ath6kl_delete_qos_write(
struct file *file,
1523 const char __user *user_buf,
1524 size_t count, loff_t *ppos)
1539 len =
min(count,
sizeof(buf) - 1);
1545 token =
strsep(&sptr,
" ");
1548 if (
kstrtou8(token, 0, &traffic_class))
1551 token =
strsep(&sptr,
" ");
1558 traffic_class, tsid);
1564 .
write = ath6kl_delete_qos_write,
1570 static ssize_t ath6kl_bgscan_int_write(
struct file *file,
1571 const char __user *user_buf,
1572 size_t count, loff_t *ppos)
1584 len =
min(count,
sizeof(buf) - 1);
1592 if (bgscan_int == 0)
1593 bgscan_int = 0xffff;
1604 .
write = ath6kl_bgscan_int_write,
1610 static ssize_t ath6kl_listen_int_write(
struct file *file,
1611 const char __user *user_buf,
1612 size_t count, loff_t *ppos)
1624 len =
min(count,
sizeof(buf) - 1);
1629 if (
kstrtou16(buf, 0, &listen_interval))
1632 if ((listen_interval < 15) || (listen_interval > 3000))
1642 static ssize_t ath6kl_listen_int_read(
struct file *file,
1643 char __user *user_buf,
1644 size_t count, loff_t *ppos)
1661 .
read = ath6kl_listen_int_read,
1662 .write = ath6kl_listen_int_write,
1668 static ssize_t ath6kl_power_params_write(
struct file *file,
1669 const char __user *user_buf,
1670 size_t count, loff_t *ppos)
1674 unsigned int len = 0;
1676 u16 idle_period, ps_poll_num, dtim,
1679 len =
min(count,
sizeof(buf) - 1);
1685 token =
strsep(&sptr,
" ");
1691 token =
strsep(&sptr,
" ");
1697 token =
strsep(&sptr,
" ");
1703 token =
strsep(&sptr,
" ");
1709 token =
strsep(&sptr,
" ");
1716 dtim, tx_wakeup, num_tx, 0);
1722 .
write = ath6kl_power_params_write,
1728 void ath6kl_debug_init(
struct ath6kl *ar)
1730 skb_queue_head_init(&ar->debug.fwlog_queue);
1731 init_completion(&ar->debug.fwlog_completion);
1737 ar->debug.fwlog_mask = 0;
1745 int ath6kl_debug_init_fs(
struct ath6kl *ar)
1748 ar->
wiphy->debugfsdir);
1756 &fops_credit_dist_stats);
1768 ar, &fops_fwlog_mask);
1771 &fops_diag_reg_read);
1813 &fops_power_params);
1818 void ath6kl_debug_cleanup(
struct ath6kl *ar)
1821 complete(&ar->debug.fwlog_completion);
1822 kfree(ar->debug.roam_tbl);