static void b43legacy_led_changestate(struct b43legacy_led *led) { struct b43legacy_wldev *dev = led->dev; const int index = led->index; u16 ledctl; B43legacy_WARN_ON(!(index >= 0 && index < B43legacy_NR_LEDS)); B43legacy_WARN_ON(!led->blink_interval); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); ledctl ^= (1 << index); b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); }
static ssize_t b43legacy_attr_interfmode_show(struct device *dev, struct device_attribute *attr, char *buf) { struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev); ssize_t count = 0; if (!capable(CAP_NET_ADMIN)) return -EPERM; mutex_lock(&wldev->wl->mutex); switch (wldev->phy.interfmode) { case B43legacy_INTERFMODE_NONE: count = snprintf(buf, PAGE_SIZE, "0 (No Interference" " Mitigation)\n"); break; case B43legacy_INTERFMODE_NONWLAN: count = snprintf(buf, PAGE_SIZE, "1 (Non-WLAN Interference" " Mitigation)\n"); break; case B43legacy_INTERFMODE_MANUALWLAN: count = snprintf(buf, PAGE_SIZE, "2 (WLAN Interference" " Mitigation)\n"); break; default: B43legacy_WARN_ON(1); } mutex_unlock(&wldev->wl->mutex); return count; }
int b43legacy_sysfs_register(struct b43legacy_wldev *wldev) { struct device *dev = wldev->dev->dev; int err; B43legacy_WARN_ON(b43legacy_status(wldev) != B43legacy_STAT_INITIALIZED); err = device_create_file(dev, &dev_attr_interference); if (err) goto out; err = device_create_file(dev, &dev_attr_shortpreamble); if (err) goto err_remove_interfmode; out: return err; err_remove_interfmode: device_remove_file(dev, &dev_attr_interference); goto out; }
void b43legacy_debugfs_log_txstat(struct b43legacy_wldev *dev, const struct b43legacy_txstatus *status) { struct b43legacy_dfsentry *e = dev->dfsentry; struct b43legacy_txstatus_log *log; struct b43legacy_txstatus *cur; int i; if (!e) return; log = &e->txstatlog; B43legacy_WARN_ON(!irqs_disabled()); spin_lock(&log->lock); i = log->end + 1; if (i == B43legacy_NR_LOGGED_TXSTATUS) i = 0; log->end = i; cur = &(log->log[i]); memcpy(cur, status, sizeof(*cur)); spin_unlock(&log->lock); }
static void b43legacy_led_blink_stop(struct b43legacy_led *led, int sync) { struct b43legacy_wldev *dev = led->dev; const int index = led->index; u16 ledctl; if (!led->blink_interval) return; if (unlikely(sync)) del_timer_sync(&led->blink_timer); else del_timer(&led->blink_timer); led->blink_interval = 0; /* Make sure the LED is turned off. */ B43legacy_WARN_ON(!(index >= 0 && index < B43legacy_NR_LEDS)); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); if (led->activelow) ledctl |= (1 << index); else ledctl &= ~(1 << index); b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); }
void b43legacy_debugfs_add_device(struct b43legacy_wldev *dev) { struct b43legacy_dfsentry *e; struct b43legacy_txstatus_log *log; char devdir[16]; B43legacy_WARN_ON(!dev); e = kzalloc(sizeof(*e), GFP_KERNEL); if (!e) { b43legacyerr(dev->wl, "debugfs: add device OOM\n"); return; } e->dev = dev; log = &e->txstatlog; log->log = kcalloc(B43legacy_NR_LOGGED_TXSTATUS, sizeof(struct b43legacy_txstatus), GFP_KERNEL); if (!log->log) { b43legacyerr(dev->wl, "debugfs: add device txstatus OOM\n"); kfree(e); return; } log->end = -1; spin_lock_init(&log->lock); dev->dfsentry = e; snprintf(devdir, sizeof(devdir), "%s", wiphy_name(dev->wl->hw->wiphy)); e->subdir = debugfs_create_dir(devdir, rootdir); if (!e->subdir || IS_ERR(e->subdir)) { if (e->subdir == ERR_PTR(-ENODEV)) { b43legacydbg(dev->wl, "DebugFS (CONFIG_DEBUG_FS) not " "enabled in kernel config\n"); } else { b43legacyerr(dev->wl, "debugfs: cannot create %s directory\n", devdir); } dev->dfsentry = NULL; kfree(log->log); kfree(e); return; } #define ADD_FILE(name, mode) \ do { \ struct dentry *d; \ d = debugfs_create_file(__stringify(name), \ mode, e->subdir, dev, \ &fops_##name.fops); \ e->file_##name.dentry = NULL; \ if (!IS_ERR(d)) \ e->file_##name.dentry = d; \ } while (0) ADD_FILE(tsf, 0600); ADD_FILE(ucode_regs, 0400); ADD_FILE(shm, 0400); ADD_FILE(txstat, 0400); ADD_FILE(restart, 0200); #undef ADD_FILE b43legacy_add_dynamic_debug(dev); }