FreeBSD下的ath有一系列的debug工具,在/usr/src/tools/tools/ath目录下,可以单独进行安装,也可以在这个目录下运行make && make install来安装:
root@test:/usr/src/tools/tools/ath # lf
Makefile ath_prom_read/ athpoke/ athspectral/
Makefile.inc athaggrstats/ athpow/ athstats/
arcode/ athalq/ athprom/ athsurvey/
ath_ee_9287_print/ athctrl.sh athradar/ common/
ath_ee_9300_print/ athdebug/ athratestats/
ath_ee_v14_print/ athdecode/ athrd/
ath_ee_v4k_print/ athkey/ athregs/
这当中最常用的几个是:
athsurvey: 相当于top,查看当前无线频道的繁忙程度;
athstats: 必备工具,能查看当前网卡的许多状态;
athdebug: 对可以调试的对象进行控制,代替了sysctl的操作;
athregs: 导出网卡的寄存器状态;
在使用这些之前,必须在内核中启用可调试选项:
options ATH_DEBUG
options AH_DEBUG
options ATH_DIAGAPI
其中,ATH_DEBUG是针对网卡的,可以针对某个网卡进行;AH_DEBUG是针对ath_hal的,对所有网卡都有效;最后一个是包括athstats在内好几个工具都需要的选项,为了保险起见,一般都把这三个同时放进内核配置文件。
重新编译、安装完内核后,就可以使用这些工具了。
# athsurvey -i ath0
min avg max
tx% rx% bc% ec% tx% rx% bc% ec% tx% rx% bc% ec%
(26.1 36.9 69.4 0.0) (32.6 48.7 81.2 0.0) (41.4 56.9 85.6 0.0)
(26.1 36.9 69.4 0.0) (33.1 48.6 81.7 0.0) (41.4 55.4 87.1 0.0)
当前ath0所在频道的繁忙程序,包括其他ap在内,其中bc代表:busy count,表示繁忙程序。如果该频道在没有使用的时候已经超过50%,那么说明已经有ap在该频道工作,最好换一个频道吧。
# athstats -i ath1
54 data frames received
41 data frames transmit
7 short on-chip tx retries
38 long on-chip tx retries
9 tx failed 'cuz too many retries
MCS7 current transmit rate
6 tx frames with no ack marked
10 tx frames with short preamble
408 beacons transmitted
5 periodic calibrations
-0/+0 TDMA slot adjust (usecs, smoothed)
37 rssi of last ack
36 avg recv rssi
-96 rx noise floor
25 tx frames through raw api
12 A-MPDU sub-frames received
10 Frames transmitted with HT Protection
1 OFDM weak signal detect
495 listen time
1 ANI disabled OFDM weak signal detect
19 cumulative OFDM phy error count
27 cumulative CCK phy error count
2 ANI forced listen time to zero
38 missing ACK's
7 RTS without CTS
11 successful RTS
3 bad FCS
2 average rssi (beacons only)
Antenna profile:
[0] tx 32 rx 0
[1] tx 0 rx 48
[2] tx 0 rx 6
athstats是调试用的比较多的工具,显示的内容比较多。我这几天用的最多的是调试天线的部分,所以最后几行对我很有帮助,可以看出哪根天线进入和流出了数据:
# athregs -i ath0
CR 0000000c RXDP 00000000 CFG 00080100 MIRT 00000000
IER 00000001 TIMT 00000000 TXCFG 00020085 RXCFG 00000005
MIBC 00000000 TOPS 00000000 RXNPTO 00000008 TXNPTO 00000010
……
athregs对于搞硬件相关的人员非常有用,可以看出各寄存器的值。
另外还有一个问题,就是到底debug哪些状态的问题,在调试的时候,由于默认情况下会出太多的东西,所以可以针对某一方面进行调试,比如说只对“发送功率”进行调试,那么可以设置debug的掩码:
sysctl hw.ath.hal.debug=0xffffffff
sysctl hw.ath.debug=0xffffffffffffffff
这两者的定义在下面两个文件中,请注意最后的ANY字样。
在国外的几个站点上,都说这是64位的一个掩码,但是看源代码,ah_debug应该是32位的,也有人建议使用0x8这种,我总有种不踏实的感觉,还是老老实实0x00000008吧:
/usr/src/sys/dev/ath/ath_hal/ah_debug.h
enum {
……
HAL_DEBUG_POWER_MGMT = 0x01000000, /* power calibration */
HAL_DEBUG_CHANNEL = 0x02000000,
HAL_DEBUG_QUEUE = 0x04000000,
HAL_DEBUG_PRINT_REG = 0x08000000,
HAL_DEBUG_FCS_RTT = 0x10000000,
HAL_DEBUG_BT_COEX = 0x20000000,
HAL_DEBUG_UNMASKABLE = 0x80000000, /* always printed */
HAL_DEBUG_ANY = 0xffffffff
……
};
/usr/src/sys/dev/ath/if_ath_debug.h
enum {
……
ATH_DEBUG_SW_TX_RETRIES = 0x040000000ULL, /* software TX retries */
ATH_DEBUG_FATAL = 0x080000000ULL, /* fatal errors */
ATH_DEBUG_SW_TX_BAR = 0x100000000ULL, /* BAR TX */
ATH_DEBUG_EDMA_RX = 0x200000000ULL, /* RX EDMA state */
ATH_DEBUG_SW_TX_FILT = 0x400000000ULL, /* SW TX FF */
ATH_DEBUG_NODE_PWRSAVE = 0x800000000ULL, /* node powersave */
ATH_DEBUG_DIVERSITY = 0x1000000000ULL, /* Diversity logic */
ATH_DEBUG_ANY = 0xffffffffffffffffULL
……
};
还有一种方法可以控制当前调试的类型,就是用athdebug命令:
# athdebug "-?"
usage: athdebug [-i device] [flags]
where flags are:
xmit
xmit_desc
recv
recv_desc
rate
reset
mode
beacon
watchdog
intr
xmit_proc
recv_proc
beacon_proc
calibrate
keycache
state
node
led
ff
dfs
tdma
tdma_timer
regdomain
fatal
ath网卡的调试还是很方便的。
另外再说一下,ar9300系列中,athsurvey还不是太好用,作者说临时还没有把ar9300加进ath_tools,但是已经开始考虑这件事情,希望ar9300能早日用上这些命令。