1 // SPDX-License-Identifier: GPL-2.0-or-later
4 Broadcom B43legacy wireless driver
14 #include "b43legacy.h"
19 #include <linux/capability.h>
22 #define GENERIC_FILESIZE 64
25 static int get_integer(const char *buf, size_t count)
27 char tmp[10 + 1] = { 0 };
28 int ret = -EINVAL, res;
32 count = min_t(size_t, count, 10);
33 memcpy(tmp, buf, count);
34 ret = kstrtoint(tmp, 10, &res);
41 static int get_boolean(const char *buf, size_t count)
48 if (count >= 4 && memcmp(buf, "true", 4) == 0)
50 if (count >= 5 && memcmp(buf, "false", 5) == 0)
52 if (count >= 3 && memcmp(buf, "yes", 3) == 0)
54 if (count >= 2 && memcmp(buf, "no", 2) == 0)
56 if (count >= 2 && memcmp(buf, "on", 2) == 0)
58 if (count >= 3 && memcmp(buf, "off", 3) == 0)
64 static ssize_t b43legacy_attr_interfmode_show(struct device *dev,
65 struct device_attribute *attr,
68 struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev);
71 if (!capable(CAP_NET_ADMIN))
74 mutex_lock(&wldev->wl->mutex);
76 switch (wldev->phy.interfmode) {
77 case B43legacy_INTERFMODE_NONE:
78 count = snprintf(buf, PAGE_SIZE, "0 (No Interference"
81 case B43legacy_INTERFMODE_NONWLAN:
82 count = snprintf(buf, PAGE_SIZE, "1 (Non-WLAN Interference"
85 case B43legacy_INTERFMODE_MANUALWLAN:
86 count = snprintf(buf, PAGE_SIZE, "2 (WLAN Interference"
93 mutex_unlock(&wldev->wl->mutex);
98 static ssize_t b43legacy_attr_interfmode_store(struct device *dev,
99 struct device_attribute *attr,
100 const char *buf, size_t count)
102 struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev);
107 if (!capable(CAP_NET_ADMIN))
110 mode = get_integer(buf, count);
113 mode = B43legacy_INTERFMODE_NONE;
116 mode = B43legacy_INTERFMODE_NONWLAN;
119 mode = B43legacy_INTERFMODE_MANUALWLAN;
122 mode = B43legacy_INTERFMODE_AUTOWLAN;
128 mutex_lock(&wldev->wl->mutex);
129 spin_lock_irqsave(&wldev->wl->irq_lock, flags);
131 err = b43legacy_radio_set_interference_mitigation(wldev, mode);
133 b43legacyerr(wldev->wl, "Interference Mitigation not "
134 "supported by device\n");
135 spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
136 mutex_unlock(&wldev->wl->mutex);
138 return err ? err : count;
141 static DEVICE_ATTR(interference, 0644,
142 b43legacy_attr_interfmode_show,
143 b43legacy_attr_interfmode_store);
145 static ssize_t b43legacy_attr_preamble_show(struct device *dev,
146 struct device_attribute *attr,
149 struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev);
152 if (!capable(CAP_NET_ADMIN))
155 mutex_lock(&wldev->wl->mutex);
157 if (wldev->short_preamble)
158 count = snprintf(buf, PAGE_SIZE, "1 (Short Preamble"
161 count = snprintf(buf, PAGE_SIZE, "0 (Short Preamble"
164 mutex_unlock(&wldev->wl->mutex);
169 static ssize_t b43legacy_attr_preamble_store(struct device *dev,
170 struct device_attribute *attr,
171 const char *buf, size_t count)
173 struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev);
177 if (!capable(CAP_NET_ADMIN))
180 value = get_boolean(buf, count);
183 mutex_lock(&wldev->wl->mutex);
184 spin_lock_irqsave(&wldev->wl->irq_lock, flags);
186 wldev->short_preamble = !!value;
188 spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
189 mutex_unlock(&wldev->wl->mutex);
194 static DEVICE_ATTR(shortpreamble, 0644,
195 b43legacy_attr_preamble_show,
196 b43legacy_attr_preamble_store);
198 int b43legacy_sysfs_register(struct b43legacy_wldev *wldev)
200 struct device *dev = wldev->dev->dev;
203 B43legacy_WARN_ON(b43legacy_status(wldev) !=
204 B43legacy_STAT_INITIALIZED);
206 err = device_create_file(dev, &dev_attr_interference);
209 err = device_create_file(dev, &dev_attr_shortpreamble);
211 goto err_remove_interfmode;
215 err_remove_interfmode:
216 device_remove_file(dev, &dev_attr_interference);
220 void b43legacy_sysfs_unregister(struct b43legacy_wldev *wldev)
222 struct device *dev = wldev->dev->dev;
224 device_remove_file(dev, &dev_attr_shortpreamble);
225 device_remove_file(dev, &dev_attr_interference);