b43: Remove QoS update workqueue
[safe/jmp/linux-2.6] / drivers / net / wireless / b43 / debugfs.c
index f82e3ef..06a01da 100644 (file)
 #include "main.h"
 #include "debugfs.h"
 #include "dma.h"
-#include "pio.h"
 #include "xmit.h"
 
 
 /* The root directory. */
-struct dentry *rootdir;
+static struct dentry *rootdir;
 
 struct b43_debugfs_fops {
        ssize_t (*read)(struct b43_wldev *dev, char *buf, size_t bufsize);
@@ -75,67 +74,329 @@ struct b43_dfs_file * fops_to_dfs_file(struct b43_wldev *dev,
        } while (0)
 
 
-/* wl->irq_lock is locked */
-ssize_t tsf_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
+/* The biggest address values for SHM access from the debugfs files. */
+#define B43_MAX_SHM_ROUTING    4
+#define B43_MAX_SHM_ADDR       0xFFFF
+
+static ssize_t shm16read__read_file(struct b43_wldev *dev,
+                                   char *buf, size_t bufsize)
 {
        ssize_t count = 0;
-       u64 tsf;
+       unsigned int routing, addr;
+       u16 val;
 
-       b43_tsf_read(dev, &tsf);
-       fappend("0x%08x%08x\n",
-               (unsigned int)((tsf & 0xFFFFFFFF00000000ULL) >> 32),
-               (unsigned int)(tsf & 0xFFFFFFFFULL));
+       routing = dev->dfsentry->shm16read_routing_next;
+       addr = dev->dfsentry->shm16read_addr_next;
+       if ((routing > B43_MAX_SHM_ROUTING) ||
+           (addr > B43_MAX_SHM_ADDR))
+               return -EDESTADDRREQ;
+
+       val = b43_shm_read16(dev, routing, addr);
+       fappend("0x%04X\n", val);
 
        return count;
 }
 
-/* wl->irq_lock is locked */
-int tsf_write_file(struct b43_wldev *dev, const char *buf, size_t count)
+static int shm16read__write_file(struct b43_wldev *dev,
+                                const char *buf, size_t count)
 {
-       u64 tsf;
+       unsigned int routing, addr;
+       int res;
 
-       if (sscanf(buf, "%llu", (unsigned long long *)(&tsf)) != 1)
+       res = sscanf(buf, "0x%X 0x%X", &routing, &addr);
+       if (res != 2)
                return -EINVAL;
-       b43_tsf_write(dev, tsf);
+       if (routing > B43_MAX_SHM_ROUTING)
+               return -EADDRNOTAVAIL;
+       if (addr > B43_MAX_SHM_ADDR)
+               return -EADDRNOTAVAIL;
+       if (routing == B43_SHM_SHARED) {
+               if ((addr % 2) != 0)
+                       return -EADDRNOTAVAIL;
+       }
+
+       dev->dfsentry->shm16read_routing_next = routing;
+       dev->dfsentry->shm16read_addr_next = addr;
 
        return 0;
 }
 
-/* wl->irq_lock is locked */
-ssize_t ucode_regs_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
+static int shm16write__write_file(struct b43_wldev *dev,
+                                 const char *buf, size_t count)
+{
+       unsigned int routing, addr, mask, set;
+       u16 val;
+       int res;
+       unsigned long flags;
+
+       res = sscanf(buf, "0x%X 0x%X 0x%X 0x%X",
+                    &routing, &addr, &mask, &set);
+       if (res != 4)
+               return -EINVAL;
+       if (routing > B43_MAX_SHM_ROUTING)
+               return -EADDRNOTAVAIL;
+       if (addr > B43_MAX_SHM_ADDR)
+               return -EADDRNOTAVAIL;
+       if (routing == B43_SHM_SHARED) {
+               if ((addr % 2) != 0)
+                       return -EADDRNOTAVAIL;
+       }
+       if ((mask > 0xFFFF) || (set > 0xFFFF))
+               return -E2BIG;
+
+       spin_lock_irqsave(&dev->wl->shm_lock, flags);
+       if (mask == 0)
+               val = 0;
+       else
+               val = __b43_shm_read16(dev, routing, addr);
+       val &= mask;
+       val |= set;
+       __b43_shm_write16(dev, routing, addr, val);
+       spin_unlock_irqrestore(&dev->wl->shm_lock, flags);
+
+       return 0;
+}
+
+static ssize_t shm32read__read_file(struct b43_wldev *dev,
+                                   char *buf, size_t bufsize)
 {
        ssize_t count = 0;
-       int i;
+       unsigned int routing, addr;
+       u32 val;
+
+       routing = dev->dfsentry->shm32read_routing_next;
+       addr = dev->dfsentry->shm32read_addr_next;
+       if ((routing > B43_MAX_SHM_ROUTING) ||
+           (addr > B43_MAX_SHM_ADDR))
+               return -EDESTADDRREQ;
+
+       val = b43_shm_read32(dev, routing, addr);
+       fappend("0x%08X\n", val);
+
+       return count;
+}
+
+static int shm32read__write_file(struct b43_wldev *dev,
+                                const char *buf, size_t count)
+{
+       unsigned int routing, addr;
+       int res;
+
+       res = sscanf(buf, "0x%X 0x%X", &routing, &addr);
+       if (res != 2)
+               return -EINVAL;
+       if (routing > B43_MAX_SHM_ROUTING)
+               return -EADDRNOTAVAIL;
+       if (addr > B43_MAX_SHM_ADDR)
+               return -EADDRNOTAVAIL;
+       if (routing == B43_SHM_SHARED) {
+               if ((addr % 2) != 0)
+                       return -EADDRNOTAVAIL;
+       }
+
+       dev->dfsentry->shm32read_routing_next = routing;
+       dev->dfsentry->shm32read_addr_next = addr;
 
-       for (i = 0; i < 64; i++) {
-               fappend("r%d = 0x%04x\n", i,
-                       b43_shm_read16(dev, B43_SHM_SCRATCH, i));
+       return 0;
+}
+
+static int shm32write__write_file(struct b43_wldev *dev,
+                                 const char *buf, size_t count)
+{
+       unsigned int routing, addr, mask, set;
+       u32 val;
+       int res;
+       unsigned long flags;
+
+       res = sscanf(buf, "0x%X 0x%X 0x%X 0x%X",
+                    &routing, &addr, &mask, &set);
+       if (res != 4)
+               return -EINVAL;
+       if (routing > B43_MAX_SHM_ROUTING)
+               return -EADDRNOTAVAIL;
+       if (addr > B43_MAX_SHM_ADDR)
+               return -EADDRNOTAVAIL;
+       if (routing == B43_SHM_SHARED) {
+               if ((addr % 2) != 0)
+                       return -EADDRNOTAVAIL;
        }
+       if ((mask > 0xFFFFFFFF) || (set > 0xFFFFFFFF))
+               return -E2BIG;
+
+       spin_lock_irqsave(&dev->wl->shm_lock, flags);
+       if (mask == 0)
+               val = 0;
+       else
+               val = __b43_shm_read32(dev, routing, addr);
+       val &= mask;
+       val |= set;
+       __b43_shm_write32(dev, routing, addr, val);
+       spin_unlock_irqrestore(&dev->wl->shm_lock, flags);
+
+       return 0;
+}
+
+/* The biggest MMIO address that we allow access to from the debugfs files. */
+#define B43_MAX_MMIO_ACCESS    (0xF00 - 1)
+
+static ssize_t mmio16read__read_file(struct b43_wldev *dev,
+                                    char *buf, size_t bufsize)
+{
+       ssize_t count = 0;
+       unsigned int addr;
+       u16 val;
+
+       addr = dev->dfsentry->mmio16read_next;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EDESTADDRREQ;
+
+       val = b43_read16(dev, addr);
+       fappend("0x%04X\n", val);
 
        return count;
 }
 
+static int mmio16read__write_file(struct b43_wldev *dev,
+                                 const char *buf, size_t count)
+{
+       unsigned int addr;
+       int res;
+
+       res = sscanf(buf, "0x%X", &addr);
+       if (res != 1)
+               return -EINVAL;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EADDRNOTAVAIL;
+       if ((addr % 2) != 0)
+               return -EINVAL;
+
+       dev->dfsentry->mmio16read_next = addr;
+
+       return 0;
+}
+
+static int mmio16write__write_file(struct b43_wldev *dev,
+                                  const char *buf, size_t count)
+{
+       unsigned int addr, mask, set;
+       int res;
+       u16 val;
+
+       res = sscanf(buf, "0x%X 0x%X 0x%X", &addr, &mask, &set);
+       if (res != 3)
+               return -EINVAL;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EADDRNOTAVAIL;
+       if ((mask > 0xFFFF) || (set > 0xFFFF))
+               return -E2BIG;
+       if ((addr % 2) != 0)
+               return -EINVAL;
+
+       if (mask == 0)
+               val = 0;
+       else
+               val = b43_read16(dev, addr);
+       val &= mask;
+       val |= set;
+       b43_write16(dev, addr, val);
+
+       return 0;
+}
+
+static ssize_t mmio32read__read_file(struct b43_wldev *dev,
+                                    char *buf, size_t bufsize)
+{
+       ssize_t count = 0;
+       unsigned int addr;
+       u32 val;
+
+       addr = dev->dfsentry->mmio32read_next;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EDESTADDRREQ;
+
+       val = b43_read32(dev, addr);
+       fappend("0x%08X\n", val);
+
+       return count;
+}
+
+static int mmio32read__write_file(struct b43_wldev *dev,
+                                 const char *buf, size_t count)
+{
+       unsigned int addr;
+       int res;
+
+       res = sscanf(buf, "0x%X", &addr);
+       if (res != 1)
+               return -EINVAL;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EADDRNOTAVAIL;
+       if ((addr % 4) != 0)
+               return -EINVAL;
+
+       dev->dfsentry->mmio32read_next = addr;
+
+       return 0;
+}
+
+static int mmio32write__write_file(struct b43_wldev *dev,
+                                  const char *buf, size_t count)
+{
+       unsigned int addr, mask, set;
+       int res;
+       u32 val;
+
+       res = sscanf(buf, "0x%X 0x%X 0x%X", &addr, &mask, &set);
+       if (res != 3)
+               return -EINVAL;
+       if (addr > B43_MAX_MMIO_ACCESS)
+               return -EADDRNOTAVAIL;
+       if ((mask > 0xFFFFFFFF) || (set > 0xFFFFFFFF))
+               return -E2BIG;
+       if ((addr % 4) != 0)
+               return -EINVAL;
+
+       if (mask == 0)
+               val = 0;
+       else
+               val = b43_read32(dev, addr);
+       val &= mask;
+       val |= set;
+       b43_write32(dev, addr, val);
+
+       return 0;
+}
+
 /* wl->irq_lock is locked */
-ssize_t shm_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
+static ssize_t tsf_read_file(struct b43_wldev *dev,
+                            char *buf, size_t bufsize)
 {
        ssize_t count = 0;
-       int i;
-       u16 tmp;
-       __le16 *le16buf = (__le16 *)buf;
+       u64 tsf;
 
-       for (i = 0; i < 0x1000; i++) {
-               if (bufsize <= 0)
-                       break;
-               tmp = b43_shm_read16(dev, B43_SHM_SHARED, 2 * i);
-               le16buf[i] = cpu_to_le16(tmp);
-               count += sizeof(tmp);
-               bufsize -= sizeof(tmp);
-       }
+       b43_tsf_read(dev, &tsf);
+       fappend("0x%08x%08x\n",
+               (unsigned int)((tsf & 0xFFFFFFFF00000000ULL) >> 32),
+               (unsigned int)(tsf & 0xFFFFFFFFULL));
 
        return count;
 }
 
-ssize_t txstat_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
+/* wl->irq_lock is locked */
+static int tsf_write_file(struct b43_wldev *dev,
+                         const char *buf, size_t count)
+{
+       u64 tsf;
+
+       if (sscanf(buf, "%llu", (unsigned long long *)(&tsf)) != 1)
+               return -EINVAL;
+       b43_tsf_write(dev, tsf);
+
+       return 0;
+}
+
+static ssize_t txstat_read_file(struct b43_wldev *dev,
+                               char *buf, size_t bufsize)
 {
        struct b43_txstatus_log *log = &dev->dfsentry->txstatlog;
        ssize_t count = 0;
@@ -182,87 +443,9 @@ out_unlock:
        return count;
 }
 
-ssize_t txpower_g_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
-{
-       ssize_t count = 0;
-
-       if (dev->phy.type != B43_PHYTYPE_G) {
-               fappend("Device is not a G-PHY\n");
-               goto out;
-       }
-       fappend("Control:               %s\n", dev->phy.manual_txpower_control ?
-               "MANUAL" : "AUTOMATIC");
-       fappend("Baseband attenuation:  %u\n", dev->phy.bbatt.att);
-       fappend("Radio attenuation:     %u\n", dev->phy.rfatt.att);
-       fappend("TX Mixer Gain:         %s\n",
-               (dev->phy.tx_control & B43_TXCTL_TXMIX) ? "ON" : "OFF");
-       fappend("PA Gain 2dB:           %s\n",
-               (dev->phy.tx_control & B43_TXCTL_PA2DB) ? "ON" : "OFF");
-       fappend("PA Gain 3dB:           %s\n",
-               (dev->phy.tx_control & B43_TXCTL_PA3DB) ? "ON" : "OFF");
-       fappend("\n\n");
-       fappend("You can write to this file:\n");
-       fappend("Writing \"auto\" enables automatic txpower control.\n");
-       fappend
-           ("Writing the attenuation values as \"bbatt rfatt txmix pa2db pa3db\" "
-            "enables manual txpower control.\n");
-       fappend("Example: 5 4 0 0 1\n");
-       fappend("Enables manual control with Baseband attenuation 5, "
-               "Radio attenuation 4, No TX Mixer Gain, "
-               "No PA Gain 2dB, With PA Gain 3dB.\n");
-out:
-       return count;
-}
-
-int txpower_g_write_file(struct b43_wldev *dev, const char *buf, size_t count)
-{
-       unsigned long flags;
-       unsigned long phy_flags;
-       int err = 0;
-
-       spin_lock_irqsave(&dev->wl->irq_lock, flags);
-       if (dev->phy.type != B43_PHYTYPE_G) {
-               err = -ENODEV;
-               goto out_unlock;
-       }
-       if ((count >= 4) && (memcmp(buf, "auto", 4) == 0)) {
-               /* Automatic control */
-               dev->phy.manual_txpower_control = 0;
-               b43_phy_xmitpower(dev);
-       } else {
-               int bbatt = 0, rfatt = 0, txmix = 0, pa2db = 0, pa3db = 0;
-               /* Manual control */
-               if (sscanf(buf, "%d %d %d %d %d", &bbatt, &rfatt,
-                          &txmix, &pa2db, &pa3db) != 5) {
-                       err = -EINVAL;
-                       goto out_unlock;
-               }
-               b43_put_attenuation_into_ranges(dev, &bbatt, &rfatt);
-               dev->phy.manual_txpower_control = 1;
-               dev->phy.bbatt.att = bbatt;
-               dev->phy.rfatt.att = rfatt;
-               dev->phy.tx_control = 0;
-               if (txmix)
-                       dev->phy.tx_control |= B43_TXCTL_TXMIX;
-               if (pa2db)
-                       dev->phy.tx_control |= B43_TXCTL_PA2DB;
-               if (pa3db)
-                       dev->phy.tx_control |= B43_TXCTL_PA3DB;
-               b43_phy_lock(dev, phy_flags);
-               b43_radio_lock(dev);
-               b43_set_txpower_g(dev, &dev->phy.bbatt,
-                                 &dev->phy.rfatt, dev->phy.tx_control);
-               b43_radio_unlock(dev);
-               b43_phy_unlock(dev, phy_flags);
-       }
-out_unlock:
-       spin_unlock_irqrestore(&dev->wl->irq_lock, flags);
-
-       return err;
-}
-
 /* wl->irq_lock is locked */
-int restart_write_file(struct b43_wldev *dev, const char *buf, size_t count)
+static int restart_write_file(struct b43_wldev *dev,
+                             const char *buf, size_t count)
 {
        int err = 0;
 
@@ -274,52 +457,69 @@ int restart_write_file(struct b43_wldev *dev, const char *buf, size_t count)
        return err;
 }
 
-static ssize_t append_lo_table(ssize_t count, char *buf, const size_t bufsize,
-                              struct b43_loctl table[B43_NR_BB][B43_NR_RF])
+static unsigned long calc_expire_secs(unsigned long now,
+                                     unsigned long time,
+                                     unsigned long expire)
 {
-       unsigned int i, j;
-       struct b43_loctl *ctl;
-
-       for (i = 0; i < B43_NR_BB; i++) {
-               for (j = 0; j < B43_NR_RF; j++) {
-                       ctl = &(table[i][j]);
-                       fappend("(bbatt %2u, rfatt %2u)  ->  "
-                               "(I %+3d, Q %+3d, Used: %d, Calibrated: %d)\n",
-                               i, j, ctl->i, ctl->q,
-                               ctl->used,
-                               b43_loctl_is_calibrated(ctl));
-               }
+       expire = time + expire;
+
+       if (time_after(now, expire))
+               return 0; /* expired */
+       if (expire < now) {
+               /* jiffies wrapped */
+               expire -= MAX_JIFFY_OFFSET;
+               now -= MAX_JIFFY_OFFSET;
        }
+       B43_WARN_ON(expire < now);
 
-       return count;
+       return (expire - now) / HZ;
 }
 
-ssize_t loctls_read_file(struct b43_wldev *dev, char *buf, size_t bufsize)
+static ssize_t loctls_read_file(struct b43_wldev *dev,
+                               char *buf, size_t bufsize)
 {
        ssize_t count = 0;
        struct b43_txpower_lo_control *lo;
        int i, err = 0;
+       struct b43_lo_calib *cal;
+       unsigned long now = jiffies;
+       struct b43_phy *phy = &dev->phy;
 
-       if (dev->phy.type != B43_PHYTYPE_G) {
+       if (phy->type != B43_PHYTYPE_G) {
                fappend("Device is not a G-PHY\n");
                err = -ENODEV;
                goto out;
        }
-       lo = dev->phy.lo_control;
+       lo = phy->g->lo_control;
        fappend("-- Local Oscillator calibration data --\n\n");
-       fappend("Measured: %d,  Rebuild: %d,  HW-power-control: %d\n",
-               lo->lo_measured,
-               lo->rebuild,
+       fappend("HW-power-control enabled: %d\n",
                dev->phy.hardware_power_control);
-       fappend("TX Bias: 0x%02X,  TX Magn: 0x%02X\n",
-               lo->tx_bias, lo->tx_magn);
-       fappend("Power Vector: 0x%08X%08X\n",
+       fappend("TX Bias: 0x%02X,  TX Magn: 0x%02X  (expire in %lu sec)\n",
+               lo->tx_bias, lo->tx_magn,
+               calc_expire_secs(now, lo->txctl_measured_time,
+                                B43_LO_TXCTL_EXPIRE));
+       fappend("Power Vector: 0x%08X%08X  (expires in %lu sec)\n",
                (unsigned int)((lo->power_vector & 0xFFFFFFFF00000000ULL) >> 32),
-               (unsigned int)(lo->power_vector & 0x00000000FFFFFFFFULL));
-       fappend("\nControl table WITH PADMIX:\n");
-       count = append_lo_table(count, buf, bufsize, lo->with_padmix);
-       fappend("\nControl table WITHOUT PADMIX:\n");
-       count = append_lo_table(count, buf, bufsize, lo->no_padmix);
+               (unsigned int)(lo->power_vector & 0x00000000FFFFFFFFULL),
+               calc_expire_secs(now, lo->pwr_vec_read_time,
+                                B43_LO_PWRVEC_EXPIRE));
+
+       fappend("\nCalibrated settings:\n");
+       list_for_each_entry(cal, &lo->calib_list, list) {
+               bool active;
+
+               active = (b43_compare_bbatt(&cal->bbatt, &phy->g->bbatt) &&
+                         b43_compare_rfatt(&cal->rfatt, &phy->g->rfatt));
+               fappend("BB(%d), RF(%d,%d)  ->  I=%d, Q=%d  "
+                       "(expires in %lu sec)%s\n",
+                       cal->bbatt.att,
+                       cal->rfatt.att, cal->rfatt.with_padmix,
+                       cal->ctl.i, cal->ctl.q,
+                       calc_expire_secs(now, cal->calib_time,
+                                        B43_LO_CALIB_EXPIRE),
+                       active ? "  ACTIVE" : "");
+       }
+
        fappend("\nUsed RF attenuation values:  Value(WithPadmix flag)\n");
        for (i = 0; i < lo->rfatt_list.len; i++) {
                fappend("%u(%d), ",
@@ -352,9 +552,9 @@ static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf,
        struct b43_wldev *dev;
        struct b43_debugfs_fops *dfops;
        struct b43_dfs_file *dfile;
-       ssize_t ret;
+       ssize_t uninitialized_var(ret);
        char *buf;
-       const size_t bufsize = 1024 * 128;
+       const size_t bufsize = 1024 * 16; /* 16 kiB buffer */
        const size_t buforder = get_order(bufsize);
        int err = 0;
 
@@ -483,11 +683,16 @@ out_unlock:
                .take_irqlock   = _take_irqlock,                \
        }
 
+B43_DEBUGFS_FOPS(shm16read, shm16read__read_file, shm16read__write_file, 1);
+B43_DEBUGFS_FOPS(shm16write, NULL, shm16write__write_file, 1);
+B43_DEBUGFS_FOPS(shm32read, shm32read__read_file, shm32read__write_file, 1);
+B43_DEBUGFS_FOPS(shm32write, NULL, shm32write__write_file, 1);
+B43_DEBUGFS_FOPS(mmio16read, mmio16read__read_file, mmio16read__write_file, 1);
+B43_DEBUGFS_FOPS(mmio16write, NULL, mmio16write__write_file, 1);
+B43_DEBUGFS_FOPS(mmio32read, mmio32read__read_file, mmio32read__write_file, 1);
+B43_DEBUGFS_FOPS(mmio32write, NULL, mmio32write__write_file, 1);
 B43_DEBUGFS_FOPS(tsf, tsf_read_file, tsf_write_file, 1);
-B43_DEBUGFS_FOPS(ucode_regs, ucode_regs_read_file, NULL, 1);
-B43_DEBUGFS_FOPS(shm, shm_read_file, NULL, 1);
 B43_DEBUGFS_FOPS(txstat, txstat_read_file, NULL, 0);
-B43_DEBUGFS_FOPS(txpower_g, txpower_g_read_file, txpower_g_write_file, 0);
 B43_DEBUGFS_FOPS(restart, NULL, restart_write_file, 1);
 B43_DEBUGFS_FOPS(loctls, loctls_read_file, NULL, 0);
 
@@ -524,6 +729,8 @@ static void b43_add_dynamic_debug(struct b43_wldev *dev)
        add_dyn_dbg("debug_dmaverbose", B43_DBG_DMAVERBOSE, 0);
        add_dyn_dbg("debug_pwork_fast", B43_DBG_PWORK_FAST, 0);
        add_dyn_dbg("debug_pwork_stop", B43_DBG_PWORK_STOP, 0);
+       add_dyn_dbg("debug_lo", B43_DBG_LO, 0);
+       add_dyn_dbg("debug_firmware", B43_DBG_FIRMWARE, 0);
 
 #undef add_dyn_dbg
 }
@@ -570,6 +777,13 @@ void b43_debugfs_add_device(struct b43_wldev *dev)
                return;
        }
 
+       e->mmio16read_next = 0xFFFF; /* invalid address */
+       e->mmio32read_next = 0xFFFF; /* invalid address */
+       e->shm16read_routing_next = 0xFFFFFFFF; /* invalid routing */
+       e->shm16read_addr_next = 0xFFFFFFFF; /* invalid address */
+       e->shm32read_routing_next = 0xFFFFFFFF; /* invalid routing */
+       e->shm32read_addr_next = 0xFFFFFFFF; /* invalid address */
+
 #define ADD_FILE(name, mode)   \
        do {                                                    \
                struct dentry *d;                               \
@@ -582,11 +796,16 @@ void b43_debugfs_add_device(struct b43_wldev *dev)
        } while (0)
 
 
+       ADD_FILE(shm16read, 0600);
+       ADD_FILE(shm16write, 0200);
+       ADD_FILE(shm32read, 0600);
+       ADD_FILE(shm32write, 0200);
+       ADD_FILE(mmio16read, 0600);
+       ADD_FILE(mmio16write, 0200);
+       ADD_FILE(mmio32read, 0600);
+       ADD_FILE(mmio32write, 0200);
        ADD_FILE(tsf, 0600);
-       ADD_FILE(ucode_regs, 0400);
-       ADD_FILE(shm, 0400);
        ADD_FILE(txstat, 0400);
-       ADD_FILE(txpower_g, 0600);
        ADD_FILE(restart, 0200);
        ADD_FILE(loctls, 0400);
 
@@ -606,11 +825,16 @@ void b43_debugfs_remove_device(struct b43_wldev *dev)
                return;
        b43_remove_dynamic_debug(dev);
 
+       debugfs_remove(e->file_shm16read.dentry);
+       debugfs_remove(e->file_shm16write.dentry);
+       debugfs_remove(e->file_shm32read.dentry);
+       debugfs_remove(e->file_shm32write.dentry);
+       debugfs_remove(e->file_mmio16read.dentry);
+       debugfs_remove(e->file_mmio16write.dentry);
+       debugfs_remove(e->file_mmio32read.dentry);
+       debugfs_remove(e->file_mmio32write.dentry);
        debugfs_remove(e->file_tsf.dentry);
-       debugfs_remove(e->file_ucode_regs.dentry);
-       debugfs_remove(e->file_shm.dentry);
        debugfs_remove(e->file_txstat.dentry);
-       debugfs_remove(e->file_txpower_g.dentry);
        debugfs_remove(e->file_restart.dentry);
        debugfs_remove(e->file_loctls.dentry);
 
@@ -619,6 +843,7 @@ void b43_debugfs_remove_device(struct b43_wldev *dev)
        kfree(e);
 }
 
+/* Called with IRQs disabled. */
 void b43_debugfs_log_txstat(struct b43_wldev *dev,
                            const struct b43_txstatus *status)
 {
@@ -630,8 +855,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev,
        if (!e)
                return;
        log = &e->txstatlog;
-       B43_WARN_ON(!irqs_disabled());
-       spin_lock(&log->lock);
+       spin_lock(&log->lock); /* IRQs are already disabled. */
        i = log->end + 1;
        if (i == B43_NR_LOGGED_TXSTATUS)
                i = 0;