b43: Add debugfs file to dump microcode registers
PATCH 1/1 b43: Add debugfs file to dump microcode registers
This adds a debugfs file to dump all microcode registers. Note that the dumping is racy, as microcode continues to run while we loop over each register to dump it.
Cc Johannes Berg <[email protected]>
Cc Larry Finger <[email protected]>
Signed-off-by Michael Buesch <[email protected]>
drivers/net/wireless/b43/debugfs.c +43 -0
@@ -148,6 +148,39 @@ static ssize_t tsf_write_file(struct filreturn res; } +static ssize_t ucode_regs_read_file (struct file *file,char __user * userbuf, +size_t count,loff_t * ppos) +{ +struct b43_wldev *dev = file->private_data; +const size_t len =ARRAY_SIZE (big_buffer); +char *buf = big_buffer; +size_t pos =0 ; +ssize_t res; +unsigned long flags; +int i; + +mutex_lock (&big_buffer_mutex); +mutex_lock (&dev->wl->mutex); +spin_lock_irqsave (&dev->wl->irq_lock, flags); +if (b43_status (dev) <B43_STAT_INITIALIZED ) { +fappend ("Board not initialized.\n" ); + goto out; + } + +for (i =0 ; i <64 ; i++) { +fappend ("r%d = 0x%04x\n" , i, +b43_shm_read16 (dev,B43_SHM_SCRATCH , i)); + } + +out: +spin_unlock_irqrestore (&dev->wl->irq_lock, flags); +mutex_unlock (&dev->wl->mutex); + res =simple_read_from_buffer (userbuf, count, ppos, buf, pos); +mutex_unlock (&big_buffer_mutex); + +return res; +} +static ssize_t txstat_read_file (struct file *file,char __user * userbuf,size_t count,loff_t * ppos) {
@@ -470,6 +503,11 @@ static struct file_operations tsf_fops = .open = open_file_generic, }; +static struct file_operations ucode_regs_fops = { + .read = ucode_regs_read_file, + .open = open_file_generic, +}; +static struct file_operations txstat_fops = { .read = txstat_read_file, .write = write_file_dummy,
@@ -575,6 +613,10 @@ void b43_debugfs_add_device(struct b43_w dev, &tsf_fops);if (IS_ERR (e->dentry_tsf)) e->dentry_tsf =NULL ; + e->dentry_ucode_regs =debugfs_create_file ("ucode_regs" ,0400 , e->subdir, + dev, &ucode_regs_fops); +if (IS_ERR (e->dentry_ucode_regs)) + e->dentry_ucode_regs =NULL ; e->dentry_txstat =debugfs_create_file ("tx_status" ,0400 , e->subdir, dev, &txstat_fops);if (IS_ERR (e->dentry_txstat))
@@ -607,6 +649,7 @@ void b43_debugfs_remove_device(struct b4b43_remove_dynamic_debug (dev);debugfs_remove (e->dentry_loctls);debugfs_remove (e->dentry_tsf); +debugfs_remove (e->dentry_ucode_regs);debugfs_remove (e->dentry_txstat);debugfs_remove (e->dentry_restart);debugfs_remove (e->dentry_txpower_g);
drivers/net/wireless/b43/debugfs.h +1 -0
@@ -31,6 +31,7 @@ struct b43_txstatus_log {struct b43_dfsentry {struct dentry *subdir;struct dentry *dentry_tsf; +struct dentry *dentry_ucode_regs;struct dentry *dentry_txstat;struct dentry *dentry_txpower_g;struct dentry *dentry_restart;