b43: Dynamically control log verbosity
authorMichael Buesch <mb@bu3sch.de>
Sun, 25 Jan 2009 14:49:59 +0000 (15:49 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 Jan 2009 21:01:47 +0000 (16:01 -0500)
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: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/Kconfig
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/debugfs.c
drivers/net/wireless/b43/debugfs.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/main.h

index 1f81d36..aab71a7 100644 (file)
@@ -110,10 +110,18 @@ config B43_DEBUG
        bool "Broadcom 43xx debugging"
        depends on B43
        ---help---
-         Broadcom 43xx debugging messages.
+         Broadcom 43xx debugging.
 
-         Say Y, if you want to find out why the driver does not
-         work for you.
+         This adds additional runtime sanity checks and statistics to the driver.
+         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
        bool "Force usage of PIO instead of DMA"
index 9e0da21..e9d60f0 100644 (file)
@@ -878,12 +878,9 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
     __attribute__ ((format(printf, 2, 3)));
 void b43warn(struct b43_wl *wl, const char *fmt, ...)
     __attribute__ ((format(printf, 2, 3)));
-#if B43_DEBUG
 void b43dbg(struct b43_wl *wl, const char *fmt, ...)
     __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.
  * This _also_ evaluates the arg with debugging disabled. */
index 7ed0eee..bc2767d 100644 (file)
@@ -668,9 +668,18 @@ B43_DEBUGFS_FOPS(restart, NULL, restart_write_file, 1);
 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)
index 91a2f29..b9d4de4 100644 (file)
@@ -71,7 +71,7 @@ struct b43_dfsentry {
        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_exit(void);
@@ -82,7 +82,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev,
 
 #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;
 }
index e41c10f..dbb8765 100644 (file)
@@ -4,7 +4,7 @@
 
   Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
   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 Andreas Jaggi <andreas.jaggi@waterwave.ch>
 
@@ -88,6 +88,10 @@ static int modparam_btcoex = 1;
 module_param_named(btcoex, modparam_btcoex, int, 0444);
 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[] = {
        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
@@ -300,6 +304,8 @@ void b43info(struct b43_wl *wl, const char *fmt, ...)
 {
        va_list args;
 
+       if (b43_modparam_verbose < B43_VERBOSITY_INFO)
+               return;
        if (!b43_ratelimit(wl))
                return;
        va_start(args, fmt);
@@ -313,6 +319,8 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
 {
        va_list args;
 
+       if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
+               return;
        if (!b43_ratelimit(wl))
                return;
        va_start(args, fmt);
@@ -326,6 +334,8 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
 {
        va_list args;
 
+       if (b43_modparam_verbose < B43_VERBOSITY_WARN)
+               return;
        if (!b43_ratelimit(wl))
                return;
        va_start(args, fmt);
@@ -335,18 +345,18 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
        va_end(args);
 }
 
-#if B43_DEBUG
 void b43dbg(struct b43_wl *wl, const char *fmt, ...)
 {
        va_list args;
 
+       if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
+               return;
        va_start(args, fmt);
        printk(KERN_DEBUG "b43-%s debug: ",
               (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
        vprintk(fmt, args);
        va_end(args);
 }
-#endif /* DEBUG */
 
 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,
        u8 algorithm;
        u8 index;
        int err;
-#if B43_DEBUG
-       static const u8 bcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-#endif
+       static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
        if (modparam_nohwcrypt)
                return -ENOSPC; /* User disabled HW-crypto */
@@ -4744,9 +4752,10 @@ static int b43_wireless_init(struct ssb_device *dev)
        INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work);
 
        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;
-      out:
+out:
        return err;
 }
 
index e6d90f3..40abcf5 100644 (file)
 
 
 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. */