debug.c (27d7f47756f40fb1bc3159e09217f740f5c5b5b1) debug.c (6e4d291eec82c682d82d02cd275a6ec511f9b203)
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

--- 55 unchanged lines hidden (view full) ---

64 char buf[32];
65 ssize_t len;
66
67 len = min(count, sizeof(buf) - 1);
68 if (copy_from_user(buf, user_buf, len))
69 return -EFAULT;
70
71 buf[len] = '\0';
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

--- 55 unchanged lines hidden (view full) ---

64 char buf[32];
65 ssize_t len;
66
67 len = min(count, sizeof(buf) - 1);
68 if (copy_from_user(buf, user_buf, len))
69 return -EFAULT;
70
71 buf[len] = '\0';
72 if (kstrtoul(buf, 0, &mask))
72 if (strict_strtoul(buf, 0, &mask))
73 return -EINVAL;
74
75 common->debug_mask = mask;
76 return count;
77}
78
79static const struct file_operations fops_debug = {
80 .read = read_file_debug,

--- 28 unchanged lines hidden (view full) ---

109 char buf[32];
110 ssize_t len;
111
112 len = min(count, sizeof(buf) - 1);
113 if (copy_from_user(buf, user_buf, len))
114 return -EFAULT;
115
116 buf[len] = '\0';
73 return -EINVAL;
74
75 common->debug_mask = mask;
76 return count;
77}
78
79static const struct file_operations fops_debug = {
80 .read = read_file_debug,

--- 28 unchanged lines hidden (view full) ---

109 char buf[32];
110 ssize_t len;
111
112 len = min(count, sizeof(buf) - 1);
113 if (copy_from_user(buf, user_buf, len))
114 return -EFAULT;
115
116 buf[len] = '\0';
117 if (kstrtoul(buf, 0, &mask))
117 if (strict_strtoul(buf, 0, &mask))
118 return -EINVAL;
119
120 ah->txchainmask = mask;
121 ah->caps.tx_chainmask = mask;
122 return count;
123}
124
125static const struct file_operations fops_tx_chainmask = {

--- 26 unchanged lines hidden (view full) ---

152 char buf[32];
153 ssize_t len;
154
155 len = min(count, sizeof(buf) - 1);
156 if (copy_from_user(buf, user_buf, len))
157 return -EFAULT;
158
159 buf[len] = '\0';
118 return -EINVAL;
119
120 ah->txchainmask = mask;
121 ah->caps.tx_chainmask = mask;
122 return count;
123}
124
125static const struct file_operations fops_tx_chainmask = {

--- 26 unchanged lines hidden (view full) ---

152 char buf[32];
153 ssize_t len;
154
155 len = min(count, sizeof(buf) - 1);
156 if (copy_from_user(buf, user_buf, len))
157 return -EFAULT;
158
159 buf[len] = '\0';
160 if (kstrtoul(buf, 0, &mask))
160 if (strict_strtoul(buf, 0, &mask))
161 return -EINVAL;
162
163 ah->rxchainmask = mask;
164 ah->caps.rx_chainmask = mask;
165 return count;
166}
167
168static const struct file_operations fops_rx_chainmask = {
169 .read = read_file_rx_chainmask,
170 .write = write_file_rx_chainmask,
171 .open = simple_open,
172 .owner = THIS_MODULE,
173 .llseek = default_llseek,
174};
175
161 return -EINVAL;
162
163 ah->rxchainmask = mask;
164 ah->caps.rx_chainmask = mask;
165 return count;
166}
167
168static const struct file_operations fops_rx_chainmask = {
169 .read = read_file_rx_chainmask,
170 .write = write_file_rx_chainmask,
171 .open = simple_open,
172 .owner = THIS_MODULE,
173 .llseek = default_llseek,
174};
175
176static ssize_t read_file_disable_ani(struct file *file, char __user *user_buf,
176static ssize_t read_file_ani(struct file *file, char __user *user_buf,
177 size_t count, loff_t *ppos)
178{
179 struct ath_softc *sc = file->private_data;
180 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
177 size_t count, loff_t *ppos)
178{
179 struct ath_softc *sc = file->private_data;
180 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
181 char buf[32];
182 unsigned int len;
181 struct ath_hw *ah = sc->sc_ah;
182 unsigned int len = 0, size = 1024;
183 ssize_t retval = 0;
184 char *buf;
183
185
184 len = sprintf(buf, "%d\n", common->disable_ani);
185 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
186 buf = kzalloc(size, GFP_KERNEL);
187 if (buf == NULL)
188 return -ENOMEM;
189
190 if (common->disable_ani) {
191 len += snprintf(buf + len, size - len, "%s: %s\n",
192 "ANI", "DISABLED");
193 goto exit;
194 }
195
196 len += snprintf(buf + len, size - len, "%15s: %s\n",
197 "ANI", "ENABLED");
198 len += snprintf(buf + len, size - len, "%15s: %u\n",
199 "ANI RESET", ah->stats.ast_ani_reset);
200 len += snprintf(buf + len, size - len, "%15s: %u\n",
201 "SPUR UP", ah->stats.ast_ani_spurup);
202 len += snprintf(buf + len, size - len, "%15s: %u\n",
203 "SPUR DOWN", ah->stats.ast_ani_spurup);
204 len += snprintf(buf + len, size - len, "%15s: %u\n",
205 "OFDM WS-DET ON", ah->stats.ast_ani_ofdmon);
206 len += snprintf(buf + len, size - len, "%15s: %u\n",
207 "OFDM WS-DET OFF", ah->stats.ast_ani_ofdmoff);
208 len += snprintf(buf + len, size - len, "%15s: %u\n",
209 "MRC-CCK ON", ah->stats.ast_ani_ccklow);
210 len += snprintf(buf + len, size - len, "%15s: %u\n",
211 "MRC-CCK OFF", ah->stats.ast_ani_cckhigh);
212 len += snprintf(buf + len, size - len, "%15s: %u\n",
213 "FIR-STEP UP", ah->stats.ast_ani_stepup);
214 len += snprintf(buf + len, size - len, "%15s: %u\n",
215 "FIR-STEP DOWN", ah->stats.ast_ani_stepdown);
216 len += snprintf(buf + len, size - len, "%15s: %u\n",
217 "INV LISTENTIME", ah->stats.ast_ani_lneg_or_lzero);
218 len += snprintf(buf + len, size - len, "%15s: %u\n",
219 "OFDM ERRORS", ah->stats.ast_ani_ofdmerrs);
220 len += snprintf(buf + len, size - len, "%15s: %u\n",
221 "CCK ERRORS", ah->stats.ast_ani_cckerrs);
222exit:
223 if (len > size)
224 len = size;
225
226 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
227 kfree(buf);
228
229 return retval;
186}
187
230}
231
188static ssize_t write_file_disable_ani(struct file *file,
189 const char __user *user_buf,
190 size_t count, loff_t *ppos)
232static ssize_t write_file_ani(struct file *file,
233 const char __user *user_buf,
234 size_t count, loff_t *ppos)
191{
192 struct ath_softc *sc = file->private_data;
193 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
235{
236 struct ath_softc *sc = file->private_data;
237 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
194 unsigned long disable_ani;
238 unsigned long ani;
195 char buf[32];
196 ssize_t len;
197
198 len = min(count, sizeof(buf) - 1);
199 if (copy_from_user(buf, user_buf, len))
200 return -EFAULT;
201
202 buf[len] = '\0';
239 char buf[32];
240 ssize_t len;
241
242 len = min(count, sizeof(buf) - 1);
243 if (copy_from_user(buf, user_buf, len))
244 return -EFAULT;
245
246 buf[len] = '\0';
203 if (kstrtoul(buf, 0, &disable_ani))
247 if (strict_strtoul(buf, 0, &ani))
204 return -EINVAL;
205
248 return -EINVAL;
249
206 common->disable_ani = !!disable_ani;
250 if (ani < 0 || ani > 1)
251 return -EINVAL;
207
252
208 if (disable_ani) {
253 common->disable_ani = !ani;
254
255 if (common->disable_ani) {
209 clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
210 ath_stop_ani(sc);
211 } else {
212 ath_check_ani(sc);
213 }
214
215 return count;
216}
217
256 clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
257 ath_stop_ani(sc);
258 } else {
259 ath_check_ani(sc);
260 }
261
262 return count;
263}
264
218static const struct file_operations fops_disable_ani = {
219 .read = read_file_disable_ani,
220 .write = write_file_disable_ani,
265static const struct file_operations fops_ani = {
266 .read = read_file_ani,
267 .write = write_file_ani,
221 .open = simple_open,
222 .owner = THIS_MODULE,
223 .llseek = default_llseek,
224};
225
226static ssize_t read_file_ant_diversity(struct file *file, char __user *user_buf,
227 size_t count, loff_t *ppos)
228{

--- 19 unchanged lines hidden (view full) ---

248 len = min(count, sizeof(buf) - 1);
249 if (copy_from_user(buf, user_buf, len))
250 return -EFAULT;
251
252 if (!AR_SREV_9565(sc->sc_ah))
253 goto exit;
254
255 buf[len] = '\0';
268 .open = simple_open,
269 .owner = THIS_MODULE,
270 .llseek = default_llseek,
271};
272
273static ssize_t read_file_ant_diversity(struct file *file, char __user *user_buf,
274 size_t count, loff_t *ppos)
275{

--- 19 unchanged lines hidden (view full) ---

295 len = min(count, sizeof(buf) - 1);
296 if (copy_from_user(buf, user_buf, len))
297 return -EFAULT;
298
299 if (!AR_SREV_9565(sc->sc_ah))
300 goto exit;
301
302 buf[len] = '\0';
256 if (kstrtoul(buf, 0, &antenna_diversity))
303 if (strict_strtoul(buf, 0, &antenna_diversity))
257 return -EINVAL;
258
259 common->antenna_diversity = !!antenna_diversity;
260 ath9k_ps_wakeup(sc);
261 ath_ant_comb_update(sc);
262 ath_dbg(common, CONFIG, "Antenna diversity: %d\n",
263 common->antenna_diversity);
264 ath9k_ps_restore(sc);

--- 468 unchanged lines hidden (view full) ---

733
734 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
735}
736
737void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
738 struct ath_tx_status *ts, struct ath_txq *txq,
739 unsigned int flags)
740{
304 return -EINVAL;
305
306 common->antenna_diversity = !!antenna_diversity;
307 ath9k_ps_wakeup(sc);
308 ath_ant_comb_update(sc);
309 ath_dbg(common, CONFIG, "Antenna diversity: %d\n",
310 common->antenna_diversity);
311 ath9k_ps_restore(sc);

--- 468 unchanged lines hidden (view full) ---

780
781 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
782}
783
784void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
785 struct ath_tx_status *ts, struct ath_txq *txq,
786 unsigned int flags)
787{
741#define TX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].ts\
742 [sc->debug.tsidx].c)
743 int qnum = txq->axq_qnum;
744
745 TX_STAT_INC(qnum, tx_pkts_all);
746 sc->debug.stats.txstats[qnum].tx_bytes_all += bf->bf_mpdu->len;
747
748 if (bf_isampdu(bf)) {
749 if (flags & ATH_TX_ERROR)
750 TX_STAT_INC(qnum, a_xretries);

--- 15 unchanged lines hidden (view full) ---

766 if (ts->ts_status & ATH9K_TXERR_TIMER_EXPIRED)
767 TX_STAT_INC(qnum, timer_exp);
768 if (ts->ts_flags & ATH9K_TX_DESC_CFG_ERR)
769 TX_STAT_INC(qnum, desc_cfg_err);
770 if (ts->ts_flags & ATH9K_TX_DATA_UNDERRUN)
771 TX_STAT_INC(qnum, data_underrun);
772 if (ts->ts_flags & ATH9K_TX_DELIM_UNDERRUN)
773 TX_STAT_INC(qnum, delim_underrun);
788 int qnum = txq->axq_qnum;
789
790 TX_STAT_INC(qnum, tx_pkts_all);
791 sc->debug.stats.txstats[qnum].tx_bytes_all += bf->bf_mpdu->len;
792
793 if (bf_isampdu(bf)) {
794 if (flags & ATH_TX_ERROR)
795 TX_STAT_INC(qnum, a_xretries);

--- 15 unchanged lines hidden (view full) ---

811 if (ts->ts_status & ATH9K_TXERR_TIMER_EXPIRED)
812 TX_STAT_INC(qnum, timer_exp);
813 if (ts->ts_flags & ATH9K_TX_DESC_CFG_ERR)
814 TX_STAT_INC(qnum, desc_cfg_err);
815 if (ts->ts_flags & ATH9K_TX_DATA_UNDERRUN)
816 TX_STAT_INC(qnum, data_underrun);
817 if (ts->ts_flags & ATH9K_TX_DELIM_UNDERRUN)
818 TX_STAT_INC(qnum, delim_underrun);
774
775#ifdef CONFIG_ATH9K_MAC_DEBUG
776 spin_lock(&sc->debug.samp_lock);
777 TX_SAMP_DBG(jiffies) = jiffies;
778 TX_SAMP_DBG(rssi_ctl0) = ts->ts_rssi_ctl0;
779 TX_SAMP_DBG(rssi_ctl1) = ts->ts_rssi_ctl1;
780 TX_SAMP_DBG(rssi_ctl2) = ts->ts_rssi_ctl2;
781 TX_SAMP_DBG(rssi_ext0) = ts->ts_rssi_ext0;
782 TX_SAMP_DBG(rssi_ext1) = ts->ts_rssi_ext1;
783 TX_SAMP_DBG(rssi_ext2) = ts->ts_rssi_ext2;
784 TX_SAMP_DBG(rateindex) = ts->ts_rateindex;
785 TX_SAMP_DBG(isok) = !!(ts->ts_status & ATH9K_TXERR_MASK);
786 TX_SAMP_DBG(rts_fail_cnt) = ts->ts_shortretry;
787 TX_SAMP_DBG(data_fail_cnt) = ts->ts_longretry;
788 TX_SAMP_DBG(rssi) = ts->ts_rssi;
789 TX_SAMP_DBG(tid) = ts->tid;
790 TX_SAMP_DBG(qid) = ts->qid;
791
792 if (ts->ts_flags & ATH9K_TX_BA) {
793 TX_SAMP_DBG(ba_low) = ts->ba_low;
794 TX_SAMP_DBG(ba_high) = ts->ba_high;
795 } else {
796 TX_SAMP_DBG(ba_low) = 0;
797 TX_SAMP_DBG(ba_high) = 0;
798 }
799
800 sc->debug.tsidx = (sc->debug.tsidx + 1) % ATH_DBG_MAX_SAMPLES;
801 spin_unlock(&sc->debug.samp_lock);
802#endif
803
804#undef TX_SAMP_DBG
805}
806
807static const struct file_operations fops_xmit = {
808 .read = read_file_xmit,
809 .open = simple_open,
810 .owner = THIS_MODULE,
811 .llseek = default_llseek,
812};

--- 97 unchanged lines hidden (view full) ---

910
911#undef RXS_ERR
912#undef PHY_ERR
913}
914
915void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs)
916{
917#define RX_PHY_ERR_INC(c) sc->debug.stats.rxstats.phy_err_stats[c]++
819}
820
821static const struct file_operations fops_xmit = {
822 .read = read_file_xmit,
823 .open = simple_open,
824 .owner = THIS_MODULE,
825 .llseek = default_llseek,
826};

--- 97 unchanged lines hidden (view full) ---

924
925#undef RXS_ERR
926#undef PHY_ERR
927}
928
929void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs)
930{
931#define RX_PHY_ERR_INC(c) sc->debug.stats.rxstats.phy_err_stats[c]++
918#define RX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].rs\
919 [sc->debug.rsidx].c)
920
921 RX_STAT_INC(rx_pkts_all);
922 sc->debug.stats.rxstats.rx_bytes_all += rs->rs_datalen;
923
924 if (rs->rs_status & ATH9K_RXERR_CRC)
925 RX_STAT_INC(crc_err);
926 if (rs->rs_status & ATH9K_RXERR_DECRYPT)
927 RX_STAT_INC(decrypt_crc_err);

--- 7 unchanged lines hidden (view full) ---

935 RX_STAT_INC(decrypt_busy_err);
936
937 if (rs->rs_status & ATH9K_RXERR_PHY) {
938 RX_STAT_INC(phy_err);
939 if (rs->rs_phyerr < ATH9K_PHYERR_MAX)
940 RX_PHY_ERR_INC(rs->rs_phyerr);
941 }
942
932
933 RX_STAT_INC(rx_pkts_all);
934 sc->debug.stats.rxstats.rx_bytes_all += rs->rs_datalen;
935
936 if (rs->rs_status & ATH9K_RXERR_CRC)
937 RX_STAT_INC(crc_err);
938 if (rs->rs_status & ATH9K_RXERR_DECRYPT)
939 RX_STAT_INC(decrypt_crc_err);

--- 7 unchanged lines hidden (view full) ---

947 RX_STAT_INC(decrypt_busy_err);
948
949 if (rs->rs_status & ATH9K_RXERR_PHY) {
950 RX_STAT_INC(phy_err);
951 if (rs->rs_phyerr < ATH9K_PHYERR_MAX)
952 RX_PHY_ERR_INC(rs->rs_phyerr);
953 }
954
943#ifdef CONFIG_ATH9K_MAC_DEBUG
944 spin_lock(&sc->debug.samp_lock);
945 RX_SAMP_DBG(jiffies) = jiffies;
946 RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0;
947 RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl1;
948 RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl2;
949 RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext0;
950 RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext1;
951 RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext2;
952 RX_SAMP_DBG(antenna) = rs->rs_antenna;
953 RX_SAMP_DBG(rssi) = rs->rs_rssi;
954 RX_SAMP_DBG(rate) = rs->rs_rate;
955 RX_SAMP_DBG(is_mybeacon) = rs->is_mybeacon;
956
957 sc->debug.rsidx = (sc->debug.rsidx + 1) % ATH_DBG_MAX_SAMPLES;
958 spin_unlock(&sc->debug.samp_lock);
959
960#endif
961
962#undef RX_PHY_ERR_INC
955#undef RX_PHY_ERR_INC
963#undef RX_SAMP_DBG
964}
965
966static const struct file_operations fops_recv = {
967 .read = read_file_recv,
968 .open = simple_open,
969 .owner = THIS_MODULE,
970 .llseek = default_llseek,
971};

--- 301 unchanged lines hidden (view full) ---

1273 char buf[32];
1274 ssize_t len;
1275
1276 len = min(count, sizeof(buf) - 1);
1277 if (copy_from_user(buf, user_buf, len))
1278 return -EFAULT;
1279
1280 buf[len] = '\0';
956}
957
958static const struct file_operations fops_recv = {
959 .read = read_file_recv,
960 .open = simple_open,
961 .owner = THIS_MODULE,
962 .llseek = default_llseek,
963};

--- 301 unchanged lines hidden (view full) ---

1265 char buf[32];
1266 ssize_t len;
1267
1268 len = min(count, sizeof(buf) - 1);
1269 if (copy_from_user(buf, user_buf, len))
1270 return -EFAULT;
1271
1272 buf[len] = '\0';
1281 if (kstrtoul(buf, 0, &regidx))
1273 if (strict_strtoul(buf, 0, &regidx))
1282 return -EINVAL;
1283
1284 sc->debug.regidx = regidx;
1285 return count;
1286}
1287
1288static const struct file_operations fops_regidx = {
1289 .read = read_file_regidx,

--- 28 unchanged lines hidden (view full) ---

1318 char buf[32];
1319 ssize_t len;
1320
1321 len = min(count, sizeof(buf) - 1);
1322 if (copy_from_user(buf, user_buf, len))
1323 return -EFAULT;
1324
1325 buf[len] = '\0';
1274 return -EINVAL;
1275
1276 sc->debug.regidx = regidx;
1277 return count;
1278}
1279
1280static const struct file_operations fops_regidx = {
1281 .read = read_file_regidx,

--- 28 unchanged lines hidden (view full) ---

1310 char buf[32];
1311 ssize_t len;
1312
1313 len = min(count, sizeof(buf) - 1);
1314 if (copy_from_user(buf, user_buf, len))
1315 return -EFAULT;
1316
1317 buf[len] = '\0';
1326 if (kstrtoul(buf, 0, &regval))
1318 if (strict_strtoul(buf, 0, &regval))
1327 return -EINVAL;
1328
1329 ath9k_ps_wakeup(sc);
1330 REG_WRITE_D(ah, sc->debug.regidx, regval);
1331 ath9k_ps_restore(sc);
1332 return count;
1333}
1334

--- 145 unchanged lines hidden (view full) ---

1480
1481static const struct file_operations fops_modal_eeprom = {
1482 .read = read_file_modal_eeprom,
1483 .open = simple_open,
1484 .owner = THIS_MODULE,
1485 .llseek = default_llseek,
1486};
1487
1319 return -EINVAL;
1320
1321 ath9k_ps_wakeup(sc);
1322 REG_WRITE_D(ah, sc->debug.regidx, regval);
1323 ath9k_ps_restore(sc);
1324 return count;
1325}
1326

--- 145 unchanged lines hidden (view full) ---

1472
1473static const struct file_operations fops_modal_eeprom = {
1474 .read = read_file_modal_eeprom,
1475 .open = simple_open,
1476 .owner = THIS_MODULE,
1477 .llseek = default_llseek,
1478};
1479
1488#ifdef CONFIG_ATH9K_MAC_DEBUG
1489
1490void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
1491{
1492#define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c)
1493 struct ath_hw *ah = sc->sc_ah;
1494 struct ath_common *common = ath9k_hw_common(ah);
1495 unsigned long flags;
1496 int i;
1497
1498 ath9k_ps_wakeup(sc);
1499
1500 spin_lock_bh(&sc->debug.samp_lock);
1501
1502 spin_lock_irqsave(&common->cc_lock, flags);
1503 ath_hw_cycle_counters_update(common);
1504
1505 ATH_SAMP_DBG(cc.cycles) = common->cc_ani.cycles;
1506 ATH_SAMP_DBG(cc.rx_busy) = common->cc_ani.rx_busy;
1507 ATH_SAMP_DBG(cc.rx_frame) = common->cc_ani.rx_frame;
1508 ATH_SAMP_DBG(cc.tx_frame) = common->cc_ani.tx_frame;
1509 spin_unlock_irqrestore(&common->cc_lock, flags);
1510
1511 ATH_SAMP_DBG(noise) = ah->noise;
1512
1513 REG_WRITE_D(ah, AR_MACMISC,
1514 ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) |
1515 (AR_MACMISC_MISC_OBS_BUS_1 <<
1516 AR_MACMISC_MISC_OBS_BUS_MSB_S)));
1517
1518 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++)
1519 ATH_SAMP_DBG(dma_dbg_reg_vals[i]) = REG_READ_D(ah,
1520 AR_DMADBG_0 + (i * sizeof(u32)));
1521
1522 ATH_SAMP_DBG(pcu_obs) = REG_READ_D(ah, AR_OBS_BUS_1);
1523 ATH_SAMP_DBG(pcu_cr) = REG_READ_D(ah, AR_CR);
1524
1525 memcpy(ATH_SAMP_DBG(nfCalHist), sc->caldata.nfCalHist,
1526 sizeof(ATH_SAMP_DBG(nfCalHist)));
1527
1528 sc->debug.sampidx = (sc->debug.sampidx + 1) % ATH_DBG_MAX_SAMPLES;
1529 spin_unlock_bh(&sc->debug.samp_lock);
1530 ath9k_ps_restore(sc);
1531
1532#undef ATH_SAMP_DBG
1533}
1534
1535static int open_file_bb_mac_samps(struct inode *inode, struct file *file)
1536{
1537#define ATH_SAMP_DBG(c) bb_mac_samp[sampidx].c
1538 struct ath_softc *sc = inode->i_private;
1539 struct ath_hw *ah = sc->sc_ah;
1540 struct ath_common *common = ath9k_hw_common(ah);
1541 struct ieee80211_conf *conf = &common->hw->conf;
1542 struct ath_dbg_bb_mac_samp *bb_mac_samp;
1543 struct ath9k_nfcal_hist *h;
1544 int i, j, qcuOffset = 0, dcuOffset = 0;
1545 u32 *qcuBase, *dcuBase, size = 30000, len = 0;
1546 u32 sampidx = 0;
1547 u8 *buf;
1548 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
1549 u8 nread;
1550
1551 if (test_bit(SC_OP_INVALID, &sc->sc_flags))
1552 return -EAGAIN;
1553
1554 buf = vmalloc(size);
1555 if (!buf)
1556 return -ENOMEM;
1557 bb_mac_samp = vmalloc(sizeof(*bb_mac_samp) * ATH_DBG_MAX_SAMPLES);
1558 if (!bb_mac_samp) {
1559 vfree(buf);
1560 return -ENOMEM;
1561 }
1562 /* Account the current state too */
1563 ath9k_debug_samp_bb_mac(sc);
1564
1565 spin_lock_bh(&sc->debug.samp_lock);
1566 memcpy(bb_mac_samp, sc->debug.bb_mac_samp,
1567 sizeof(*bb_mac_samp) * ATH_DBG_MAX_SAMPLES);
1568 len += snprintf(buf + len, size - len,
1569 "Current Sample Index: %d\n", sc->debug.sampidx);
1570 spin_unlock_bh(&sc->debug.samp_lock);
1571
1572 len += snprintf(buf + len, size - len,
1573 "Raw DMA Debug Dump:\n");
1574 len += snprintf(buf + len, size - len, "Sample |\t");
1575 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++)
1576 len += snprintf(buf + len, size - len, " DMA Reg%d |\t", i);
1577 len += snprintf(buf + len, size - len, "\n");
1578
1579 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1580 len += snprintf(buf + len, size - len, "%d\t", sampidx);
1581
1582 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++)
1583 len += snprintf(buf + len, size - len, " %08x\t",
1584 ATH_SAMP_DBG(dma_dbg_reg_vals[i]));
1585 len += snprintf(buf + len, size - len, "\n");
1586 }
1587 len += snprintf(buf + len, size - len, "\n");
1588
1589 len += snprintf(buf + len, size - len,
1590 "Sample Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n");
1591 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1592 qcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[0]);
1593 dcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[4]);
1594
1595 for (i = 0; i < ATH9K_NUM_QUEUES; i++,
1596 qcuOffset += 4, dcuOffset += 5) {
1597 if (i == 8) {
1598 qcuOffset = 0;
1599 qcuBase++;
1600 }
1601
1602 if (i == 6) {
1603 dcuOffset = 0;
1604 dcuBase++;
1605 }
1606 if (!sc->debug.stats.txstats[i].queued)
1607 continue;
1608
1609 len += snprintf(buf + len, size - len,
1610 "%4d %7d %2x %1x %2x %2x\n",
1611 sampidx, i,
1612 (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset,
1613 (*qcuBase & (0x8 << qcuOffset)) >>
1614 (qcuOffset + 3),
1615 ATH_SAMP_DBG(dma_dbg_reg_vals[2]) &
1616 (0x7 << (i * 3)) >> (i * 3),
1617 (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset);
1618 }
1619 len += snprintf(buf + len, size - len, "\n");
1620 }
1621 len += snprintf(buf + len, size - len,
1622 "samp qcu_sh qcu_fh qcu_comp dcu_comp dcu_arb dcu_fp "
1623 "ch_idle_dur ch_idle_dur_val txfifo_val0 txfifo_val1 "
1624 "txfifo_dcu0 txfifo_dcu1 pcu_obs AR_CR\n");
1625
1626 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1627 qcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[0]);
1628 dcuBase = &ATH_SAMP_DBG(dma_dbg_reg_vals[4]);
1629
1630 len += snprintf(buf + len, size - len, "%4d %5x %5x ", sampidx,
1631 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x003c0000) >> 18,
1632 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x03c00000) >> 22);
1633 len += snprintf(buf + len, size - len, "%7x %8x ",
1634 (ATH_SAMP_DBG(dma_dbg_reg_vals[3]) & 0x1c000000) >> 26,
1635 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x3));
1636 len += snprintf(buf + len, size - len, "%7x %7x ",
1637 (ATH_SAMP_DBG(dma_dbg_reg_vals[5]) & 0x06000000) >> 25,
1638 (ATH_SAMP_DBG(dma_dbg_reg_vals[5]) & 0x38000000) >> 27);
1639 len += snprintf(buf + len, size - len, "%7d %12d ",
1640 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x000003fc) >> 2,
1641 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00000400) >> 10);
1642 len += snprintf(buf + len, size - len, "%12d %12d ",
1643 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00000800) >> 11,
1644 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x00001000) >> 12);
1645 len += snprintf(buf + len, size - len, "%12d %12d ",
1646 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x0001e000) >> 13,
1647 (ATH_SAMP_DBG(dma_dbg_reg_vals[6]) & 0x001e0000) >> 17);
1648 len += snprintf(buf + len, size - len, "0x%07x 0x%07x\n",
1649 ATH_SAMP_DBG(pcu_obs), ATH_SAMP_DBG(pcu_cr));
1650 }
1651
1652 len += snprintf(buf + len, size - len,
1653 "Sample ChNoise Chain privNF #Reading Readings\n");
1654 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1655 h = ATH_SAMP_DBG(nfCalHist);
1656 if (!ATH_SAMP_DBG(noise))
1657 continue;
1658
1659 for (i = 0; i < NUM_NF_READINGS; i++) {
1660 if (!(chainmask & (1 << i)) ||
1661 ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf)))
1662 continue;
1663
1664 nread = AR_PHY_CCA_FILTERWINDOW_LENGTH -
1665 h[i].invalidNFcount;
1666 len += snprintf(buf + len, size - len,
1667 "%4d %5d %4d\t %d\t %d\t",
1668 sampidx, ATH_SAMP_DBG(noise),
1669 i, h[i].privNF, nread);
1670 for (j = 0; j < nread; j++)
1671 len += snprintf(buf + len, size - len,
1672 " %d", h[i].nfCalBuffer[j]);
1673 len += snprintf(buf + len, size - len, "\n");
1674 }
1675 }
1676 len += snprintf(buf + len, size - len, "\nCycle counters:\n"
1677 "Sample Total Rxbusy Rxframes Txframes\n");
1678 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1679 if (!ATH_SAMP_DBG(cc.cycles))
1680 continue;
1681 len += snprintf(buf + len, size - len,
1682 "%4d %08x %08x %08x %08x\n",
1683 sampidx, ATH_SAMP_DBG(cc.cycles),
1684 ATH_SAMP_DBG(cc.rx_busy),
1685 ATH_SAMP_DBG(cc.rx_frame),
1686 ATH_SAMP_DBG(cc.tx_frame));
1687 }
1688
1689 len += snprintf(buf + len, size - len, "Tx status Dump :\n");
1690 len += snprintf(buf + len, size - len,
1691 "Sample rssi:- ctl0 ctl1 ctl2 ext0 ext1 ext2 comb "
1692 "isok rts_fail data_fail rate tid qid "
1693 "ba_low ba_high tx_before(ms)\n");
1694 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1695 for (i = 0; i < ATH_DBG_MAX_SAMPLES; i++) {
1696 if (!ATH_SAMP_DBG(ts[i].jiffies))
1697 continue;
1698 len += snprintf(buf + len, size - len, "%-14d"
1699 "%-4d %-4d %-4d %-4d %-4d %-4d %-4d %-4d %-8d "
1700 "%-9d %-4d %-3d %-3d %08x %08x %-11d\n",
1701 sampidx,
1702 ATH_SAMP_DBG(ts[i].rssi_ctl0),
1703 ATH_SAMP_DBG(ts[i].rssi_ctl1),
1704 ATH_SAMP_DBG(ts[i].rssi_ctl2),
1705 ATH_SAMP_DBG(ts[i].rssi_ext0),
1706 ATH_SAMP_DBG(ts[i].rssi_ext1),
1707 ATH_SAMP_DBG(ts[i].rssi_ext2),
1708 ATH_SAMP_DBG(ts[i].rssi),
1709 ATH_SAMP_DBG(ts[i].isok),
1710 ATH_SAMP_DBG(ts[i].rts_fail_cnt),
1711 ATH_SAMP_DBG(ts[i].data_fail_cnt),
1712 ATH_SAMP_DBG(ts[i].rateindex),
1713 ATH_SAMP_DBG(ts[i].tid),
1714 ATH_SAMP_DBG(ts[i].qid),
1715 ATH_SAMP_DBG(ts[i].ba_low),
1716 ATH_SAMP_DBG(ts[i].ba_high),
1717 jiffies_to_msecs(jiffies -
1718 ATH_SAMP_DBG(ts[i].jiffies)));
1719 }
1720 }
1721
1722 len += snprintf(buf + len, size - len, "Rx status Dump :\n");
1723 len += snprintf(buf + len, size - len, "Sample rssi:- ctl0 ctl1 ctl2 "
1724 "ext0 ext1 ext2 comb beacon ant rate rx_before(ms)\n");
1725 for (sampidx = 0; sampidx < ATH_DBG_MAX_SAMPLES; sampidx++) {
1726 for (i = 0; i < ATH_DBG_MAX_SAMPLES; i++) {
1727 if (!ATH_SAMP_DBG(rs[i].jiffies))
1728 continue;
1729 len += snprintf(buf + len, size - len, "%-14d"
1730 "%-4d %-4d %-4d %-4d %-4d %-4d %-4d %-9s %-2d %02x %-13d\n",
1731 sampidx,
1732 ATH_SAMP_DBG(rs[i].rssi_ctl0),
1733 ATH_SAMP_DBG(rs[i].rssi_ctl1),
1734 ATH_SAMP_DBG(rs[i].rssi_ctl2),
1735 ATH_SAMP_DBG(rs[i].rssi_ext0),
1736 ATH_SAMP_DBG(rs[i].rssi_ext1),
1737 ATH_SAMP_DBG(rs[i].rssi_ext2),
1738 ATH_SAMP_DBG(rs[i].rssi),
1739 ATH_SAMP_DBG(rs[i].is_mybeacon) ?
1740 "True" : "False",
1741 ATH_SAMP_DBG(rs[i].antenna),
1742 ATH_SAMP_DBG(rs[i].rate),
1743 jiffies_to_msecs(jiffies -
1744 ATH_SAMP_DBG(rs[i].jiffies)));
1745 }
1746 }
1747
1748 vfree(bb_mac_samp);
1749 file->private_data = buf;
1750
1751 return 0;
1752#undef ATH_SAMP_DBG
1753}
1754
1755static const struct file_operations fops_samps = {
1756 .open = open_file_bb_mac_samps,
1757 .read = ath9k_debugfs_read_buf,
1758 .release = ath9k_debugfs_release_buf,
1759 .owner = THIS_MODULE,
1760 .llseek = default_llseek,
1761};
1762
1763#endif
1764
1765#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
1766static ssize_t read_file_btcoex(struct file *file, char __user *user_buf,
1767 size_t count, loff_t *ppos)
1768{
1769 struct ath_softc *sc = file->private_data;
1770 u32 len = 0, size = 1500;
1771 char *buf;
1772 size_t retval;

--- 230 unchanged lines hidden (view full) ---

2003
2004 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_RADAR]);
2005 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_OFDM_TIMING]);
2006 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_CCK_TIMING]);
2007
2008 WARN_ON(i != ATH9K_SSTATS_LEN);
2009}
2010
1480#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
1481static ssize_t read_file_btcoex(struct file *file, char __user *user_buf,
1482 size_t count, loff_t *ppos)
1483{
1484 struct ath_softc *sc = file->private_data;
1485 u32 len = 0, size = 1500;
1486 char *buf;
1487 size_t retval;

--- 230 unchanged lines hidden (view full) ---

1718
1719 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_RADAR]);
1720 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_OFDM_TIMING]);
1721 AWDATA_RX(phy_err_stats[ATH9K_PHYERR_CCK_TIMING]);
1722
1723 WARN_ON(i != ATH9K_SSTATS_LEN);
1724}
1725
2011void ath9k_deinit_debug(struct ath_softc *sc)
2012{
2013 if (config_enabled(CONFIG_ATH9K_DEBUGFS) && sc->rfs_chan_spec_scan) {
2014 relay_close(sc->rfs_chan_spec_scan);
2015 sc->rfs_chan_spec_scan = NULL;
2016 }
2017}
2018
2019int ath9k_init_debug(struct ath_hw *ah)
2020{
2021 struct ath_common *common = ath9k_hw_common(ah);
2022 struct ath_softc *sc = (struct ath_softc *) common->priv;
2023
2024 sc->debug.debugfs_phy = debugfs_create_dir("ath9k",
2025 sc->hw->wiphy->debugfsdir);
2026 if (!sc->debug.debugfs_phy)

--- 27 unchanged lines hidden (view full) ---

2054 debugfs_create_file("reset", S_IRUSR, sc->debug.debugfs_phy, sc,
2055 &fops_reset);
2056 debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc,
2057 &fops_recv);
2058 debugfs_create_file("rx_chainmask", S_IRUSR | S_IWUSR,
2059 sc->debug.debugfs_phy, sc, &fops_rx_chainmask);
2060 debugfs_create_file("tx_chainmask", S_IRUSR | S_IWUSR,
2061 sc->debug.debugfs_phy, sc, &fops_tx_chainmask);
1726int ath9k_init_debug(struct ath_hw *ah)
1727{
1728 struct ath_common *common = ath9k_hw_common(ah);
1729 struct ath_softc *sc = (struct ath_softc *) common->priv;
1730
1731 sc->debug.debugfs_phy = debugfs_create_dir("ath9k",
1732 sc->hw->wiphy->debugfsdir);
1733 if (!sc->debug.debugfs_phy)

--- 27 unchanged lines hidden (view full) ---

1761 debugfs_create_file("reset", S_IRUSR, sc->debug.debugfs_phy, sc,
1762 &fops_reset);
1763 debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc,
1764 &fops_recv);
1765 debugfs_create_file("rx_chainmask", S_IRUSR | S_IWUSR,
1766 sc->debug.debugfs_phy, sc, &fops_rx_chainmask);
1767 debugfs_create_file("tx_chainmask", S_IRUSR | S_IWUSR,
1768 sc->debug.debugfs_phy, sc, &fops_tx_chainmask);
2062 debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR,
2063 sc->debug.debugfs_phy, sc, &fops_disable_ani);
1769 debugfs_create_file("ani", S_IRUSR | S_IWUSR,
1770 sc->debug.debugfs_phy, sc, &fops_ani);
2064 debugfs_create_bool("paprd", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
2065 &sc->sc_ah->config.enable_paprd);
2066 debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
2067 sc, &fops_regidx);
2068 debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
2069 sc, &fops_regval);
2070 debugfs_create_bool("ignore_extcca", S_IRUSR | S_IWUSR,
2071 sc->debug.debugfs_phy,

--- 18 unchanged lines hidden (view full) ---

2090 &fops_spectral_short_repeat);
2091 debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR,
2092 sc->debug.debugfs_phy, sc, &fops_spectral_count);
2093 debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR,
2094 sc->debug.debugfs_phy, sc, &fops_spectral_period);
2095 debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR,
2096 sc->debug.debugfs_phy, sc,
2097 &fops_spectral_fft_period);
1771 debugfs_create_bool("paprd", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1772 &sc->sc_ah->config.enable_paprd);
1773 debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1774 sc, &fops_regidx);
1775 debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1776 sc, &fops_regval);
1777 debugfs_create_bool("ignore_extcca", S_IRUSR | S_IWUSR,
1778 sc->debug.debugfs_phy,

--- 18 unchanged lines hidden (view full) ---

1797 &fops_spectral_short_repeat);
1798 debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR,
1799 sc->debug.debugfs_phy, sc, &fops_spectral_count);
1800 debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR,
1801 sc->debug.debugfs_phy, sc, &fops_spectral_period);
1802 debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR,
1803 sc->debug.debugfs_phy, sc,
1804 &fops_spectral_fft_period);
2098
2099#ifdef CONFIG_ATH9K_MAC_DEBUG
2100 debugfs_create_file("samples", S_IRUSR, sc->debug.debugfs_phy, sc,
2101 &fops_samps);
2102#endif
2103 debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR,
2104 sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
2105 debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
2106 sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
2107 debugfs_create_file("diversity", S_IRUSR | S_IWUSR,
2108 sc->debug.debugfs_phy, sc, &fops_ant_diversity);
2109#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
2110 debugfs_create_file("btcoex", S_IRUSR, sc->debug.debugfs_phy, sc,
2111 &fops_btcoex);
2112#endif
2113 return 0;
2114}
1805 debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR,
1806 sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
1807 debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
1808 sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
1809 debugfs_create_file("diversity", S_IRUSR | S_IWUSR,
1810 sc->debug.debugfs_phy, sc, &fops_ant_diversity);
1811#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
1812 debugfs_create_file("btcoex", S_IRUSR, sc->debug.debugfs_phy, sc,
1813 &fops_btcoex);
1814#endif
1815 return 0;
1816}