1
1
Files
zyxel-vmg8825_b50b-cfw/package/base-files-prebuild/files/rootfs/bin/WlGetDriverStats.sh
T
2026-04-17 18:33:03 +02:00

314 lines
10 KiB
Bash
Executable File

#!/bin/sh
#
# WlGetDriverStats.sh <ucast|mcast> <WiFi interface name> <NrRetries> <enable|disable>
#
# Copyright (C) 2019, Broadcom. All Rights Reserved.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# <<Broadcom-WL-IPTag/Proprietary,Open:.*>>
#
WLCMD=wl
DHDCMD=dhd
IFNAME=$1
DUMPPATH=/tmp
DUMPDIR=${DUMPPATH}/$(date +"%d:%m:%Y_%H:%M")
SOCRAMDUMPFILE=${DUMPDIR}/socram_${IFNAME}
LOOP_TIME=10
NR_RUNS=0
ENABLEDUMP=0
HOSTAPD_CONF=/tmp/wlX_hapd.conf
show_help () {
echo "Syntax: $0 <WiFi interface name> <NrRetries> <SOCRAMDUMP: enable|disable>"
echo " or : $0 <WiFi interface name> [<Driver mode: auto|nic|dhd>] <NrRetries> <SOCRAMDUMP: enable|disable>"
echo "Example 1: $0 wl1 (infinite loop)"
echo "Example 2: $0 wl1 dhd (for FD driver; infinite loop)"
echo "Example 3: $0 eth5 auto 12 enable (for any driver; 12 loops - 5s between loops; dump socram also)"
echo "Try \`$0 --help' for more information."
exit
}
dump_hapd () {
for i in 0 1 2
do
HAPDFILE=${HOSTAPD_CONF//X/$i}
if test -f $HAPDFILE; then
echo "------- Dumping $HAPDFILE ----------"
cat $HAPDFILE
fi
done
}
# $1 Heading
# $2 cmd to execute
display_cmd_op(){
cmd="$2"
echo "---------------------------------"
echo -e "$1"
echo "---------------------------------"
$cmd |
while IFS= read -r line
do
echo -e "\t""$line"
done
}
# Help option
if [[ $# -eq 1 ]] && [[ $1 == "--help" ]]; then
show_help
exit 0
fi
if [ $# -eq 0 ]; then
show_help
exit 0
fi
MODE="auto"
ENABLEDUMP="disable"
NR_REPEATS=0
if [ $# -eq 4 ]; then
MODE=$2
NR_REPEATS=$3
ENABLEDUMP=$4
elif [ $# -eq 3 ]; then
if [[ $2 != "nic" ]] && [[ $2 != "dhd" ]] && [[ $2 != "auto" ]]; then
NR_REPEATS=$2
ENABLEDUMP=$3
else
MODE=$2
NR_REPEATS=$3
fi
elif [ $# -eq 2 ]; then
if [[ $2 != "nic" ]] && [[ $2 != "dhd" ]] && [[ $2 != "auto" ]]; then
NR_REPEATS=$2
else
MODE=$2
fi
fi
if [ $MODE = "auto" ]; then
fwid=$(wl -i $IFNAME ver | grep -c FWID)
if [ $fwid = "1" ]; then
MODE="dhd"
else
MODE="nic"
fi
fi
if [[ $MODE != "nic" ]] && [[ $MODE != "dhd" ]]; then
echo "UNKNOWN driver mode!"
show_help
exit 0
fi
# Overwrite msglevel
WLMSGLVL=`wl -i $IFNAME msglevel | cut -d ' ' -f1`
wl -i $IFNAME msglevel 0
if [[ $MODE == "dhd" ]]; then
echo -n $IFNAME DHD version = ; echo $($DHDCMD -i $IFNAME version)
DHDMSGLVL=`dhd -i $IFNAME msglevel | cut -d ' ' -f1`
$DHDCMD -i $IFNAME msglevel 0
fi
driver_init () {
if [ $($WLCMD -i $IFNAME isup) -ne 1 ]; then
echo -e "Interface $IFNAME is not up"
exit 0
fi
$WLCMD -i $IFNAME bs_data > /dev/NULL 2>&1
$WLCMD -i $IFNAME pktq_stats c: a:// p:// > /dev/NULL 2>&1
$WLCMD -i $IFNAME rx_report -noidle > /dev/NULL 2>&1
}
driver_info () {
echo "============================="
echo "$IFNAME Driver info"
echo "============================="
display_cmd_op "WLVERSION: wl -i $IFNAME ver" "$WLCMD -i $IFNAME ver"
display_cmd_op "REVINFO: wl -i $IFNAME revinfo" "$WLCMD -i $IFNAME revinfo"
display_cmd_op "DHDVERSION: dhd -i $IFNAME version" "$DHDCMD -i $IFNAME version"
display_cmd_op "WLCAP: wl -i $IFNAME cap" "$WLCMD -i $IFNAME cap"
display_cmd_op "UPTIME (sec): [System uptime] [sum of how much time each core spent idle] " "cat /proc/uptime"
}
wl_stats () {
echo "================================="
echo "WL Statistics for $IFNAME"
echo "================================="
display_cmd_op "STATUS: wl -i $IFNAME status" "$WLCMD -i $IFNAME status"
display_cmd_op "ASSOCLIST: wl -i $IFNAME assoclist" "$WLCMD -i $IFNAME assoclist"
for x in $($WLCMD -i $IFNAME assoclist);
do
if [ $x != assoclist ] ; then
display_cmd_op "STAINFO: stainfo for $x" "$WLCMD -i $IFNAME sta_info $x"
fi
done
for x in $($WLCMD -i $IFNAME assoclist);
do
if [ $x != assoclist ] ; then
display_cmd_op "RSSI: rssi for $x" "$WLCMD -i $IFNAME rssi $x"
fi
done
display_cmd_op "AUTH STA LIST: wl -i $IFNAME authe_sta_list" "$WLCMD -i $IFNAME authe_sta_list"
display_cmd_op "SMFSTATS: wl -i $IFNAME smfstats" "$WLCMD -i $IFNAME smfstats"
display_cmd_op "6G RATE: wl -i $IFNAME 6g_rate" "$WLCMD -i $IFNAME 6g_rate"
display_cmd_op "5G RATE: wl -i $IFNAME 5g_rate" "$WLCMD -i $IFNAME 5g_rate"
display_cmd_op "2G RATE: wl -i $IFNAME 2g_rate" "$WLCMD -i $IFNAME 2g_rate"
display_cmd_op "NRATE: wl -i $IFNAME nrate" "$WLCMD -i $IFNAME nrate"
display_cmd_op "RATE: wl -i $IFNAME rate" "$WLCMD -i $IFNAME rate"
display_cmd_op "11H SPECT: wl -i $IFNAME spect" "$WLCMD -i $IFNAME spect"
display_cmd_op "CHANIMSTATS: wl -i $IFNAME chanim_stats" "$WLCMD -i $IFNAME chanim_stats"
display_cmd_op "INTERFERENCE: wl -i $IFNAME interference" "$WLCMD -i $IFNAME interference"
display_cmd_op "INTERFERENCE_OVR: wl -i $IFNAME interference_override" "$WLCMD -i $IFNAME interference_override"
display_cmd_op "BSDATA: wl -i $IFNAME bs_data" "$WLCMD -i $IFNAME bs_data"
display_cmd_op "PKTQSTATS: wl -i $IFNAME pktq_stats" "$WLCMD -i $IFNAME pktq_stats c: a:// p://"
display_cmd_op "RXREPORT: wl -i $IFNAME rx_report" "$WLCMD -i $IFNAME rx_report -noidle"
display_cmd_op "TXQ DUMP: wl -i $IFNAME dump txq" "$WLCMD -i $IFNAME dump txq"
display_cmd_op "PERFSTATS DUMP: wl -i $IFNAME dump perf_stats" "$WLCMD -i $IFNAME dump perf_stats"
display_cmd_op "AMPDU DUMP: wl -i $IFNAME dump ampdu" "$WLCMD -i $IFNAME dump ampdu"
display_cmd_op "AMSDU DUMP: wl -i $IFNAME dump amsdu" "$WLCMD -i $IFNAME dump amsdu"
display_cmd_op "WLC DUMP: wl -i $IFNAME dump wlc" "$WLCMD -i $IFNAME dump wlc"
display_cmd_op "TXBF DUMP: wl -i $IFNAME dump txbf" "$WLCMD -i $IFNAME dump txbf"
display_cmd_op "MUTX DUMP: wl -i $IFNAME dump mutx" "$WLCMD -i $IFNAME dump mutx"
display_cmd_op "MURX DUMP: wl -i $IFNAME dump murx" "$WLCMD -i $IFNAME dump murx"
display_cmd_op "MSCHED DUMP: wl -i $IFNAME dump msched" "$WLCMD -i $IFNAME dump msched"
display_cmd_op "UMSCHED DUMP: wl -i $IFNAME dump umsched" "$WLCMD -i $IFNAME dump umsched"
display_cmd_op "TWT DUMP: wl -i $IFNAME dump twt" "$WLCMD -i $IFNAME dump twt"
display_cmd_op "D11CNTS DUMP: wl -i $IFNAME dump d11cnts" "$WLCMD -i $IFNAME dump d11cnts"
display_cmd_op "WME COUNTERS: wl -i $IFNAME wme counters" "$WLCMD -i $IFNAME wme_counters"
display_cmd_op "INTERFACE COUNTERS: wl -i $IFNAME if_counters" "$WLCMD -i $IFNAME if_counters"
display_cmd_op "COUNTERS: wl -i $IFNAME counters" "$WLCMD -i $IFNAME counters"
display_cmd_op "MEMORY USAGE: wl -i $IFNAME memuse" "$WLCMD -i $IFNAME memuse"
display_cmd_op "CHANNEL INFO: wl -i $IFNAME chan_info" "$WLCMD -i $IFNAME chan_info"
display_cmd_op "DFS STATUS: wl -i $IFNAME dfs_status_all" "$WLCMD -i $IFNAME dfs_status_all"
display_cmd_op "NOISE: wl -i $IFNAME noise" "$WLCMD -i $IFNAME noise"
display_cmd_op "TEMPERATURE SENSOR: wl -i $IFNAME phy_tempsense" "$WLCMD -i $IFNAME phy_tempsense"
display_cmd_op "BAND: wl -i $IFNAME band" "$WLCMD -i $IFNAME band"
display_cmd_op "SCAN RESULTS: wl -i $IFNAME scanresults" "$WLCMD -i $IFNAME scanresults"
display_cmd_op "RATELINKMEM: wl -i $IFNAME dump ratelinkmem" "$WLCMD -i $IFNAME dump ratelinkmem"
}
dhd_stats () {
echo "================================="
echo "DHD Statistics for $IFNAME"
echo "================================="
display_cmd_op "DHDDUMP: dhd -i $IFNAME DHD dump" "$DHDCMD -i $IFNAME dump"
if [ $ENABLEDUMP = "enable" ] ; then
mkdir $DUMPDIR
display_cmd_op "SOCRAMDUMP: Uploading DUMP to $1" "$DHDCMD -i $IFNAME upload $1"
fi
$DHDCMD -i $IFNAME cons mu
}
host_side_dump () {
### host side dump
echo "================================="
echo "HOST Statistics"
echo "================================="
fcctl status;
cat /proc/wfd/stats;
cat /proc/fcache/stats/errors;
cat /proc/fcache/stats/slow_path;
if [[ $MODE == "dhd" ]]; then
bs /d/r/pddc;
bs /d/rdd pdfrc;
fi
cat /proc/net/igmp_snooping;
cat /proc/fcache/misc/mcastlist;
bs /b/e mcast;
bs /b/e wlan_mcast;
bs /b/e l2_ucast;
###
}
loop_commands () {
sleep $LOOP_TIME
NR_RUNS=`expr $NR_RUNS + 1`
echo "================================="
echo "CPU Stats"
echo "================================="
mpstat -P ALL
echo "================================="
echo "Process status"
echo "================================="
ps -ax
if [ $? != 0 ]; then
ps
fi
top -n 1
echo "================================="
echo "Memory status"
echo "================================="
cat /proc/meminfo
echo "================================="
echo "Statistics for $IFNAME run $NR_RUNS/$NR_REPEATS @$LOOP_TIME s"
echo "================================="
wl_stats
if [[ $MODE == "dhd" ]]; then
dhd_stats "${SOCRAMDUMPFILE}_${NR_RUNS}"
fi
host_side_dump
}
if [ $MODE == "dhd" ]; then
$DHDCMD -i $IFNAME version > /dev/NULL 2>&1
if [ $? -ne 0 ] ; then
echo -e "Bad Interface $IFNAME $?"
show_help
exit 0
fi
fi
$WLCMD -i $IFNAME ver > /dev/NULL 2>&1
if [ $? -ne 0 ] ; then
echo "########### Dongle trap detected on $IFNAME ################"
exit 0
fi
#driver_init
driver_info
#display_cmd_op "IFCONFIG: ifconfig -a" "ifconfig -a"
echo "================================="
echo "Statistics for $IFNAME first run"
echo "================================="
wl_stats
if [[ $MODE == "dhd" ]]; then
dhd_stats "${SOCRAMDUMPFILE}_${NR_RUNS}"
fi
if [[ $NR_REPEATS -eq 0 ]]; then
while true; do
loop_commands
done
else
while [[ $NR_REPEATS -gt $NR_RUNS ]]; do
loop_commands
done
dump_hapd
# restore msglevel
wl -i $IFNAME msglevel $WLMSGLVL
if [ $MODE == "dhd" ]; then
dhd -i $IFNAME msglevel $DHDMSGLVL
fi
fi