Developer Debugging Guide¶
Advanced debugging techniques for driver developers working on the MT7925 driver.
Debug Build Configuration¶
Kernel Config Options¶
Enable these options for debugging:
CONFIG_MT76_DEBUG=y # MT76 debug messages
CONFIG_MT76_TRACER=y # MT76 tracepoints
CONFIG_PROVE_LOCKING=y # Lockdep for deadlock detection
CONFIG_DEBUG_LOCK_ALLOC=y # Lock debugging
CONFIG_LOCKDEP=y # Lock dependency tracking
CONFIG_DEBUG_OBJECTS=y # Object debugging
CONFIG_KASAN=y # Memory error detection
Module Parameters¶
Debugfs Interface¶
Location¶
Key Entries¶
| Entry | Description |
|---|---|
fw_debug |
Firmware debug logging (0/1/2) |
chip_reset |
Trigger chip reset |
regidx/regval |
Direct register access |
xmit-queues |
TX queue status |
rx-queues |
RX queue status |
tx_stats |
TX statistics |
txpower_sku |
TX power limits |
runtime-pm |
Power management control |
Firmware Debug¶
# Enable extended logging
echo 2 | sudo tee /sys/kernel/debug/ieee80211/phy0/mt76/fw_debug
# Watch firmware messages
dmesg -w | grep mt7925
Chip Reset with Coredump¶
# Trigger coredump + reset
echo 0 | sudo tee /sys/kernel/debug/ieee80211/phy0/mt76/chip_reset
# Check coredumps
ls /sys/class/devcoredump/
Register Access¶
# Set register address
echo 0xd4200 | sudo tee /sys/kernel/debug/ieee80211/phy0/mt76/regidx
# Read value
sudo cat /sys/kernel/debug/ieee80211/phy0/mt76/regval
Caution
Direct register access can crash the system. Use only if you understand the hardware.
Tracepoints¶
Enable Tracing¶
# Enable all mt76 tracepoints
echo 1 | sudo tee /sys/kernel/debug/tracing/events/mt76/enable
# View trace
cat /sys/kernel/debug/tracing/trace
# Clear trace
echo > /sys/kernel/debug/tracing/trace
Available Tracepoints¶
mt76:dev_irq- Interrupt eventsmt76:tx- TX eventsmt76:rx- RX eventsmt76:mcu_msg- MCU messages
Filtering¶
# Filter specific events
echo 'eid==0x02' | sudo tee /sys/kernel/debug/tracing/events/mt76/mcu_msg/filter
Lockdep Analysis¶
Check for Warnings¶
Add Assertions¶
In driver code:
int mt7925_mcu_function(struct mt792x_dev *dev, ...)
{
lockdep_assert_held(&dev->mt76.mutex);
// ... function body
}
Memory Debugging¶
KASAN (Kernel Address Sanitizer)¶
Enable CONFIG_KASAN=y to detect:
- Use-after-free
- Out-of-bounds access
- Memory leaks
SLUB Debug¶
GDB Debugging¶
Load Symbols¶
With kgdb¶
# Enable kgdb in kernel config
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# Connect from remote
target remote /dev/ttyS0
Crash Dump Analysis¶
kdump Setup¶
# Check if kdump is enabled
systemctl status kdump
# Analyze crash dump
crash /var/crash/vmcore /usr/lib/debug/vmlinux
crash Commands¶
crash> bt # Backtrace
crash> log # Kernel log
crash> mod -t # List loaded modules
crash> struct mt792x_dev <addr>
Common Debug Scenarios¶
MCU Timeout¶
# Check MCU log
cat /sys/kernel/debug/ieee80211/phy0/mt76/mcu
# Enable MCU tracing
echo 1 > /sys/kernel/debug/tracing/events/mt76/mcu_msg/enable
Deadlock Investigation¶
# Check process state
ps aux | awk '$8 ~ /D/'
# Get backtrace of stuck process
echo t > /proc/sysrq-trigger
dmesg | tail -100
NULL Pointer¶
Performance Profiling¶
perf¶
ftrace¶
# Trace mt76 functions
echo 'mt76*' > /sys/kernel/debug/tracing/set_ftrace_filter
echo function > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
Log Collection Script¶
#!/bin/bash
# collect-debug.sh
OUTPUT_DIR="mt7925-debug-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$OUTPUT_DIR"
# System info
uname -a > "$OUTPUT_DIR/uname.txt"
lspci -vnn | grep -A20 "MediaTek" > "$OUTPUT_DIR/lspci.txt"
dmesg > "$OUTPUT_DIR/dmesg.txt"
# Module info
modinfo mt7925e > "$OUTPUT_DIR/modinfo.txt"
dkms status > "$OUTPUT_DIR/dkms.txt"
# Debugfs (if accessible)
if [ -d /sys/kernel/debug/ieee80211/phy0/mt76 ]; then
cat /sys/kernel/debug/ieee80211/phy0/mt76/xmit-queues > "$OUTPUT_DIR/xmit-queues.txt" 2>/dev/null
cat /sys/kernel/debug/ieee80211/phy0/mt76/tx_stats > "$OUTPUT_DIR/tx_stats.txt" 2>/dev/null
fi
# Network info
iw dev > "$OUTPUT_DIR/iw-dev.txt"
ip link show > "$OUTPUT_DIR/ip-link.txt"
echo "Debug info collected in $OUTPUT_DIR"
tar czf "$OUTPUT_DIR.tar.gz" "$OUTPUT_DIR"