1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
4 * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
7 #include <linux/debugfs.h>
13 mt76_reg_set(void *data
, u64 val
)
15 struct mt7601u_dev
*dev
= data
;
17 mt76_wr(dev
, dev
->debugfs_reg
, val
);
22 mt76_reg_get(void *data
, u64
*val
)
24 struct mt7601u_dev
*dev
= data
;
26 *val
= mt76_rr(dev
, dev
->debugfs_reg
);
30 DEFINE_DEBUGFS_ATTRIBUTE(fops_regval
, mt76_reg_get
, mt76_reg_set
, "0x%08llx\n");
33 mt7601u_ampdu_stat_show(struct seq_file
*file
, void *data
)
35 struct mt7601u_dev
*dev
= file
->private;
38 #define stat_printf(grp, off, name) \
39 seq_printf(file, #name ":\t%llu\n", dev->stats.grp[off])
41 stat_printf(rx_stat
, 0, rx_crc_err
);
42 stat_printf(rx_stat
, 1, rx_phy_err
);
43 stat_printf(rx_stat
, 2, rx_false_cca
);
44 stat_printf(rx_stat
, 3, rx_plcp_err
);
45 stat_printf(rx_stat
, 4, rx_fifo_overflow
);
46 stat_printf(rx_stat
, 5, rx_duplicate
);
48 stat_printf(tx_stat
, 0, tx_fail_cnt
);
49 stat_printf(tx_stat
, 1, tx_bcn_cnt
);
50 stat_printf(tx_stat
, 2, tx_success
);
51 stat_printf(tx_stat
, 3, tx_retransmit
);
52 stat_printf(tx_stat
, 4, tx_zero_len
);
53 stat_printf(tx_stat
, 5, tx_underflow
);
55 stat_printf(aggr_stat
, 0, non_aggr_tx
);
56 stat_printf(aggr_stat
, 1, aggr_tx
);
58 stat_printf(zero_len_del
, 0, tx_zero_len_del
);
59 stat_printf(zero_len_del
, 1, rx_zero_len_del
);
62 seq_puts(file
, "Aggregations stats:\n");
63 for (i
= 0; i
< 4; i
++) {
64 for (j
= 0; j
< 8; j
++)
65 seq_printf(file
, "%08llx ",
66 dev
->stats
.aggr_n
[i
* 8 + j
]);
70 seq_printf(file
, "recent average AMPDU len: %d\n",
71 atomic_read(&dev
->avg_ampdu_len
));
76 DEFINE_SHOW_ATTRIBUTE(mt7601u_ampdu_stat
);
79 mt7601u_eeprom_param_show(struct seq_file
*file
, void *data
)
81 struct mt7601u_dev
*dev
= file
->private;
82 struct mt7601u_rate_power
*rp
= &dev
->ee
->power_rate_table
;
83 struct tssi_data
*td
= &dev
->ee
->tssi_data
;
86 seq_printf(file
, "RF freq offset: %hhx\n", dev
->ee
->rf_freq_off
);
87 seq_printf(file
, "RSSI offset: %hhx %hhx\n",
88 dev
->ee
->rssi_offset
[0], dev
->ee
->rssi_offset
[1]);
89 seq_printf(file
, "Reference temp: %hhx\n", dev
->ee
->ref_temp
);
90 seq_printf(file
, "LNA gain: %hhx\n", dev
->ee
->lna_gain
);
91 seq_printf(file
, "Reg channels: %hhu-%hhu\n", dev
->ee
->reg
.start
,
92 dev
->ee
->reg
.start
+ dev
->ee
->reg
.num
- 1);
94 seq_puts(file
, "Per rate power:\n");
95 for (i
= 0; i
< 2; i
++)
96 seq_printf(file
, "\t raw:%02hhx bw20:%02hhx bw40:%02hhx\n",
97 rp
->cck
[i
].raw
, rp
->cck
[i
].bw20
, rp
->cck
[i
].bw40
);
98 for (i
= 0; i
< 4; i
++)
99 seq_printf(file
, "\t raw:%02hhx bw20:%02hhx bw40:%02hhx\n",
100 rp
->ofdm
[i
].raw
, rp
->ofdm
[i
].bw20
, rp
->ofdm
[i
].bw40
);
101 for (i
= 0; i
< 4; i
++)
102 seq_printf(file
, "\t raw:%02hhx bw20:%02hhx bw40:%02hhx\n",
103 rp
->ht
[i
].raw
, rp
->ht
[i
].bw20
, rp
->ht
[i
].bw40
);
105 seq_puts(file
, "Per channel power:\n");
106 for (i
= 0; i
< 7; i
++)
107 seq_printf(file
, "\t tx_power ch%u:%02hhx ch%u:%02hhx\n",
108 i
* 2 + 1, dev
->ee
->chan_pwr
[i
* 2],
109 i
* 2 + 2, dev
->ee
->chan_pwr
[i
* 2 + 1]);
111 if (!dev
->ee
->tssi_enabled
)
114 seq_puts(file
, "TSSI:\n");
115 seq_printf(file
, "\t slope:%02hhx\n", td
->slope
);
116 seq_printf(file
, "\t offset=%02hhx %02hhx %02hhx\n",
117 td
->offset
[0], td
->offset
[1], td
->offset
[2]);
118 seq_printf(file
, "\t delta_off:%08x\n", td
->tx0_delta_offset
);
123 DEFINE_SHOW_ATTRIBUTE(mt7601u_eeprom_param
);
125 void mt7601u_init_debugfs(struct mt7601u_dev
*dev
)
129 dir
= debugfs_create_dir("mt7601u", dev
->hw
->wiphy
->debugfsdir
);
133 debugfs_create_u8("temperature", 0400, dir
, &dev
->raw_temp
);
134 debugfs_create_u32("temp_mode", 0400, dir
, &dev
->temp_mode
);
136 debugfs_create_u32("regidx", 0600, dir
, &dev
->debugfs_reg
);
137 debugfs_create_file("regval", 0600, dir
, dev
, &fops_regval
);
138 debugfs_create_file("ampdu_stat", 0400, dir
, dev
, &mt7601u_ampdu_stat_fops
);
139 debugfs_create_file("eeprom_param", 0400, dir
, dev
, &mt7601u_eeprom_param_fops
);