Commit 060210f9 authored by Michael Buesch's avatar Michael Buesch Committed by John W. Linville

b43: Dynamically control log verbosity

Dynamically control the log verbosity with a module parameter.
This enables us to dynamically enable debugging messages (or disable
info, warn, error messages) via module parameter or /sys/module/b43/parameters/verbose.

This increases the module size by about 3k. But in practice it reduces the
module size for the user, because some distributions ship the b43 module
with CONFIG_B43_DEBUG set, which increases the module by about 15k.

So with this patch applied, distributions should really _disable_ CONFIG_B43_DEBUG.
There is no reason to keep it in a production-release kernel.
So we have a net reduction in size by about 12k.

This patch also adds a printk of the wireless core revision, so people
don't have to enable SSB debugging to get the wireless core revision.
Signed-off-by: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 08e87a83
...@@ -110,10 +110,18 @@ config B43_DEBUG ...@@ -110,10 +110,18 @@ config B43_DEBUG
bool "Broadcom 43xx debugging" bool "Broadcom 43xx debugging"
depends on B43 depends on B43
---help--- ---help---
Broadcom 43xx debugging messages. Broadcom 43xx debugging.
Say Y, if you want to find out why the driver does not This adds additional runtime sanity checks and statistics to the driver.
work for you. These checks and statistics might me expensive and hurt runtime performance
of your system.
This also adds the b43 debugfs interface.
Do not enable this, unless you are debugging the driver.
Say N, if you are a distributor or user building a release kernel
for production use.
Only say Y, if you are debugging a problem in the b43 driver sourcecode.
config B43_FORCE_PIO config B43_FORCE_PIO
bool "Force usage of PIO instead of DMA" bool "Force usage of PIO instead of DMA"
......
...@@ -878,12 +878,9 @@ void b43err(struct b43_wl *wl, const char *fmt, ...) ...@@ -878,12 +878,9 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3))); __attribute__ ((format(printf, 2, 3)));
void b43warn(struct b43_wl *wl, const char *fmt, ...) void b43warn(struct b43_wl *wl, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3))); __attribute__ ((format(printf, 2, 3)));
#if B43_DEBUG
void b43dbg(struct b43_wl *wl, const char *fmt, ...) void b43dbg(struct b43_wl *wl, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3))); __attribute__ ((format(printf, 2, 3)));
#else /* DEBUG */
# define b43dbg(wl, fmt...) do { /* nothing */ } while (0)
#endif /* DEBUG */
/* A WARN_ON variant that vanishes when b43 debugging is disabled. /* A WARN_ON variant that vanishes when b43 debugging is disabled.
* This _also_ evaluates the arg with debugging disabled. */ * This _also_ evaluates the arg with debugging disabled. */
......
...@@ -668,9 +668,18 @@ B43_DEBUGFS_FOPS(restart, NULL, restart_write_file, 1); ...@@ -668,9 +668,18 @@ B43_DEBUGFS_FOPS(restart, NULL, restart_write_file, 1);
B43_DEBUGFS_FOPS(loctls, loctls_read_file, NULL, 0); B43_DEBUGFS_FOPS(loctls, loctls_read_file, NULL, 0);
int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature) bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
{ {
return !!(dev->dfsentry && dev->dfsentry->dyn_debug[feature]); bool enabled;
enabled = (dev->dfsentry && dev->dfsentry->dyn_debug[feature]);
if (unlikely(enabled)) {
/* Force full debugging messages, if the user enabled
* some dynamic debugging feature. */
b43_modparam_verbose = B43_VERBOSITY_MAX;
}
return enabled;
} }
static void b43_remove_dynamic_debug(struct b43_wldev *dev) static void b43_remove_dynamic_debug(struct b43_wldev *dev)
......
...@@ -71,7 +71,7 @@ struct b43_dfsentry { ...@@ -71,7 +71,7 @@ struct b43_dfsentry {
struct dentry *dyn_debug_dentries[__B43_NR_DYNDBG]; struct dentry *dyn_debug_dentries[__B43_NR_DYNDBG];
}; };
int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature); bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature);
void b43_debugfs_init(void); void b43_debugfs_init(void);
void b43_debugfs_exit(void); void b43_debugfs_exit(void);
...@@ -82,7 +82,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev, ...@@ -82,7 +82,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev,
#else /* CONFIG_B43_DEBUG */ #else /* CONFIG_B43_DEBUG */
static inline int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature) static inline bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
{ {
return 0; return 0;
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de> Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it> Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
Copyright (c) 2005, 2006 Michael Buesch <mb@bu3sch.de> Copyright (c) 2005-2009 Michael Buesch <mb@bu3sch.de>
Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org> Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch> Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
...@@ -88,6 +88,10 @@ static int modparam_btcoex = 1; ...@@ -88,6 +88,10 @@ static int modparam_btcoex = 1;
module_param_named(btcoex, modparam_btcoex, int, 0444); module_param_named(btcoex, modparam_btcoex, int, 0444);
MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)"); MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)");
int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
module_param_named(verbose, b43_modparam_verbose, int, 0644);
MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
static const struct ssb_device_id b43_ssb_tbl[] = { static const struct ssb_device_id b43_ssb_tbl[] = {
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
...@@ -300,6 +304,8 @@ void b43info(struct b43_wl *wl, const char *fmt, ...) ...@@ -300,6 +304,8 @@ void b43info(struct b43_wl *wl, const char *fmt, ...)
{ {
va_list args; va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_INFO)
return;
if (!b43_ratelimit(wl)) if (!b43_ratelimit(wl))
return; return;
va_start(args, fmt); va_start(args, fmt);
...@@ -313,6 +319,8 @@ void b43err(struct b43_wl *wl, const char *fmt, ...) ...@@ -313,6 +319,8 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
{ {
va_list args; va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
return;
if (!b43_ratelimit(wl)) if (!b43_ratelimit(wl))
return; return;
va_start(args, fmt); va_start(args, fmt);
...@@ -326,6 +334,8 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...) ...@@ -326,6 +334,8 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
{ {
va_list args; va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_WARN)
return;
if (!b43_ratelimit(wl)) if (!b43_ratelimit(wl))
return; return;
va_start(args, fmt); va_start(args, fmt);
...@@ -335,18 +345,18 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...) ...@@ -335,18 +345,18 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
va_end(args); va_end(args);
} }
#if B43_DEBUG
void b43dbg(struct b43_wl *wl, const char *fmt, ...) void b43dbg(struct b43_wl *wl, const char *fmt, ...)
{ {
va_list args; va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
return;
va_start(args, fmt); va_start(args, fmt);
printk(KERN_DEBUG "b43-%s debug: ", printk(KERN_DEBUG "b43-%s debug: ",
(wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan"); (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
vprintk(fmt, args); vprintk(fmt, args);
va_end(args); va_end(args);
} }
#endif /* DEBUG */
static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val) static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val)
{ {
...@@ -3589,9 +3599,7 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -3589,9 +3599,7 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
u8 algorithm; u8 algorithm;
u8 index; u8 index;
int err; int err;
#if B43_DEBUG static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
static const u8 bcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
#endif
if (modparam_nohwcrypt) if (modparam_nohwcrypt)
return -ENOSPC; /* User disabled HW-crypto */ return -ENOSPC; /* User disabled HW-crypto */
...@@ -4744,9 +4752,10 @@ static int b43_wireless_init(struct ssb_device *dev) ...@@ -4744,9 +4752,10 @@ static int b43_wireless_init(struct ssb_device *dev)
INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work); INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work);
ssb_set_devtypedata(dev, wl); ssb_set_devtypedata(dev, wl);
b43info(wl, "Broadcom %04X WLAN found\n", dev->bus->chip_id); b43info(wl, "Broadcom %04X WLAN found (core revision %u)\n",
dev->bus->chip_id, dev->id.revision);
err = 0; err = 0;
out: out:
return err; return err;
} }
......
...@@ -40,6 +40,24 @@ ...@@ -40,6 +40,24 @@
extern int b43_modparam_qos; extern int b43_modparam_qos;
extern int b43_modparam_verbose;
/* Logmessage verbosity levels. Update the b43_modparam_verbose helptext, if
* you add or remove levels. */
enum b43_verbosity {
B43_VERBOSITY_ERROR,
B43_VERBOSITY_WARN,
B43_VERBOSITY_INFO,
B43_VERBOSITY_DEBUG,
__B43_VERBOSITY_AFTERLAST, /* keep last */
B43_VERBOSITY_MAX = __B43_VERBOSITY_AFTERLAST - 1,
#if B43_DEBUG
B43_VERBOSITY_DEFAULT = B43_VERBOSITY_DEBUG,
#else
B43_VERBOSITY_DEFAULT = B43_VERBOSITY_INFO,
#endif
};
/* Lightweight function to convert a frequency (in Mhz) to a channel number. */ /* Lightweight function to convert a frequency (in Mhz) to a channel number. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment