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

[PATCH] bcm43xx: sysfs code cleanup

This cleans up the bcm43xx sysfs code and makes it compliant
with the unwritten sysfs rules (at least I hope so).
Signed-off-by: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8829d55e
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "bcm43xx_debugfs.h" #include "bcm43xx_debugfs.h"
#include "bcm43xx_leds.h" #include "bcm43xx_leds.h"
#include "bcm43xx_sysfs.h"
#define PFX KBUILD_MODNAME ": " #define PFX KBUILD_MODNAME ": "
...@@ -638,8 +637,6 @@ struct bcm43xx_key { ...@@ -638,8 +637,6 @@ struct bcm43xx_key {
}; };
struct bcm43xx_private { struct bcm43xx_private {
struct bcm43xx_sysfs sysfs;
struct ieee80211_device *ieee; struct ieee80211_device *ieee;
struct ieee80211softmac_device *softmac; struct ieee80211softmac_device *softmac;
...@@ -772,6 +769,20 @@ struct bcm43xx_private * bcm43xx_priv(struct net_device *dev) ...@@ -772,6 +769,20 @@ struct bcm43xx_private * bcm43xx_priv(struct net_device *dev)
return ieee80211softmac_priv(dev); return ieee80211softmac_priv(dev);
} }
struct device;
static inline
struct bcm43xx_private * dev_to_bcm(struct device *dev)
{
struct net_device *net_dev;
struct bcm43xx_private *bcm;
net_dev = dev_get_drvdata(dev);
bcm = bcm43xx_priv(net_dev);
return bcm;
}
/* Helper function, which returns a boolean. /* Helper function, which returns a boolean.
* TRUE, if PIO is used; FALSE, if DMA is used. * TRUE, if PIO is used; FALSE, if DMA is used.
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "bcm43xx_wx.h" #include "bcm43xx_wx.h"
#include "bcm43xx_ethtool.h" #include "bcm43xx_ethtool.h"
#include "bcm43xx_xmit.h" #include "bcm43xx_xmit.h"
#include "bcm43xx_sysfs.h"
MODULE_DESCRIPTION("Broadcom BCM43xx wireless driver"); MODULE_DESCRIPTION("Broadcom BCM43xx wireless driver");
......
...@@ -71,14 +71,46 @@ static int get_boolean(const char *buf, size_t count) ...@@ -71,14 +71,46 @@ static int get_boolean(const char *buf, size_t count)
return -EINVAL; return -EINVAL;
} }
static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len)
{
int i, pos = 0;
for (i = 0; i < BCM43xx_SPROM_SIZE; i++) {
pos += snprintf(buf + pos, buf_len - pos - 1,
"%04X", swab16(sprom[i]) & 0xFFFF);
}
pos += snprintf(buf + pos, buf_len - pos - 1, "\n");
return pos + 1;
}
static int hex2sprom(u16 *sprom, const char *dump, size_t len)
{
char tmp[5] = { 0 };
int cnt = 0;
unsigned long parsed;
if (len < BCM43xx_SPROM_SIZE * sizeof(u16) * 2)
return -EINVAL;
while (cnt < BCM43xx_SPROM_SIZE) {
memcpy(tmp, dump, 4);
dump += 4;
parsed = simple_strtoul(tmp, NULL, 16);
sprom[cnt++] = swab16((u16)parsed);
}
return 0;
}
static ssize_t bcm43xx_attr_sprom_show(struct device *dev, static ssize_t bcm43xx_attr_sprom_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_sprom); struct bcm43xx_private *bcm = dev_to_bcm(dev);
u16 *sprom; u16 *sprom;
unsigned long flags; unsigned long flags;
int i, err; int err;
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
...@@ -91,55 +123,53 @@ static ssize_t bcm43xx_attr_sprom_show(struct device *dev, ...@@ -91,55 +123,53 @@ static ssize_t bcm43xx_attr_sprom_show(struct device *dev,
bcm43xx_lock_mmio(bcm, flags); bcm43xx_lock_mmio(bcm, flags);
assert(bcm->initialized); assert(bcm->initialized);
err = bcm43xx_sprom_read(bcm, sprom); err = bcm43xx_sprom_read(bcm, sprom);
if (!err) { if (!err)
for (i = 0; i < BCM43xx_SPROM_SIZE; i++) { err = sprom2hex(sprom, buf, PAGE_SIZE);
buf[i * 2] = sprom[i] & 0x00FF;
buf[i * 2 + 1] = (sprom[i] & 0xFF00) >> 8;
}
}
bcm43xx_unlock_mmio(bcm, flags); bcm43xx_unlock_mmio(bcm, flags);
kfree(sprom); kfree(sprom);
return err ? err : BCM43xx_SPROM_SIZE * sizeof(u16); return err;
} }
static ssize_t bcm43xx_attr_sprom_store(struct device *dev, static ssize_t bcm43xx_attr_sprom_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_sprom); struct bcm43xx_private *bcm = dev_to_bcm(dev);
u16 *sprom; u16 *sprom;
unsigned long flags; unsigned long flags;
int i, err; int err;
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (count != BCM43xx_SPROM_SIZE * sizeof(u16))
return -EINVAL;
sprom = kmalloc(BCM43xx_SPROM_SIZE * sizeof(*sprom), sprom = kmalloc(BCM43xx_SPROM_SIZE * sizeof(*sprom),
GFP_KERNEL); GFP_KERNEL);
if (!sprom) if (!sprom)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < BCM43xx_SPROM_SIZE; i++) { err = hex2sprom(sprom, buf, count);
sprom[i] = buf[i * 2] & 0xFF; if (err)
sprom[i] |= ((u16)(buf[i * 2 + 1] & 0xFF)) << 8; goto out_kfree;
}
bcm43xx_lock_mmio(bcm, flags); bcm43xx_lock_mmio(bcm, flags);
assert(bcm->initialized); assert(bcm->initialized);
err = bcm43xx_sprom_write(bcm, sprom); err = bcm43xx_sprom_write(bcm, sprom);
bcm43xx_unlock_mmio(bcm, flags); bcm43xx_unlock_mmio(bcm, flags);
out_kfree:
kfree(sprom); kfree(sprom);
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR(sprom, 0600,
bcm43xx_attr_sprom_show,
bcm43xx_attr_sprom_store);
static ssize_t bcm43xx_attr_interfmode_show(struct device *dev, static ssize_t bcm43xx_attr_interfmode_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_interfmode); struct bcm43xx_private *bcm = dev_to_bcm(dev);
unsigned long flags; unsigned long flags;
int err; int err;
ssize_t count = 0; ssize_t count = 0;
...@@ -175,7 +205,7 @@ static ssize_t bcm43xx_attr_interfmode_store(struct device *dev, ...@@ -175,7 +205,7 @@ static ssize_t bcm43xx_attr_interfmode_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_interfmode); struct bcm43xx_private *bcm = dev_to_bcm(dev);
unsigned long flags; unsigned long flags;
int err; int err;
int mode; int mode;
...@@ -215,11 +245,15 @@ static ssize_t bcm43xx_attr_interfmode_store(struct device *dev, ...@@ -215,11 +245,15 @@ static ssize_t bcm43xx_attr_interfmode_store(struct device *dev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR(interference, 0644,
bcm43xx_attr_interfmode_show,
bcm43xx_attr_interfmode_store);
static ssize_t bcm43xx_attr_preamble_show(struct device *dev, static ssize_t bcm43xx_attr_preamble_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_preamble); struct bcm43xx_private *bcm = dev_to_bcm(dev);
unsigned long flags; unsigned long flags;
int err; int err;
ssize_t count; ssize_t count;
...@@ -245,7 +279,7 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev, ...@@ -245,7 +279,7 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct bcm43xx_private *bcm = devattr_to_bcm(attr, attr_preamble); struct bcm43xx_private *bcm = dev_to_bcm(dev);
unsigned long flags; unsigned long flags;
int err; int err;
int value; int value;
...@@ -267,56 +301,41 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev, ...@@ -267,56 +301,41 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR(shortpreamble, 0644,
bcm43xx_attr_preamble_show,
bcm43xx_attr_preamble_store);
int bcm43xx_sysfs_register(struct bcm43xx_private *bcm) int bcm43xx_sysfs_register(struct bcm43xx_private *bcm)
{ {
struct device *dev = &bcm->pci_dev->dev; struct device *dev = &bcm->pci_dev->dev;
struct bcm43xx_sysfs *sysfs = &bcm->sysfs;
int err; int err;
assert(bcm->initialized); assert(bcm->initialized);
sysfs->attr_sprom.attr.name = "sprom"; err = device_create_file(dev, &dev_attr_sprom);
sysfs->attr_sprom.attr.owner = THIS_MODULE;
sysfs->attr_sprom.attr.mode = 0600;
sysfs->attr_sprom.show = bcm43xx_attr_sprom_show;
sysfs->attr_sprom.store = bcm43xx_attr_sprom_store;
err = device_create_file(dev, &sysfs->attr_sprom);
if (err) if (err)
goto out; goto out;
err = device_create_file(dev, &dev_attr_interference);
sysfs->attr_interfmode.attr.name = "interference";
sysfs->attr_interfmode.attr.owner = THIS_MODULE;
sysfs->attr_interfmode.attr.mode = 0600;
sysfs->attr_interfmode.show = bcm43xx_attr_interfmode_show;
sysfs->attr_interfmode.store = bcm43xx_attr_interfmode_store;
err = device_create_file(dev, &sysfs->attr_interfmode);
if (err) if (err)
goto err_remove_sprom; goto err_remove_sprom;
err = device_create_file(dev, &dev_attr_shortpreamble);
sysfs->attr_preamble.attr.name = "shortpreamble";
sysfs->attr_preamble.attr.owner = THIS_MODULE;
sysfs->attr_preamble.attr.mode = 0600;
sysfs->attr_preamble.show = bcm43xx_attr_preamble_show;
sysfs->attr_preamble.store = bcm43xx_attr_preamble_store;
err = device_create_file(dev, &sysfs->attr_preamble);
if (err) if (err)
goto err_remove_interfmode; goto err_remove_interfmode;
out: out:
return err; return err;
err_remove_interfmode: err_remove_interfmode:
device_remove_file(dev, &sysfs->attr_interfmode); device_remove_file(dev, &dev_attr_interference);
err_remove_sprom: err_remove_sprom:
device_remove_file(dev, &sysfs->attr_sprom); device_remove_file(dev, &dev_attr_sprom);
goto out; goto out;
} }
void bcm43xx_sysfs_unregister(struct bcm43xx_private *bcm) void bcm43xx_sysfs_unregister(struct bcm43xx_private *bcm)
{ {
struct device *dev = &bcm->pci_dev->dev; struct device *dev = &bcm->pci_dev->dev;
struct bcm43xx_sysfs *sysfs = &bcm->sysfs;
device_remove_file(dev, &sysfs->attr_preamble); device_remove_file(dev, &dev_attr_shortpreamble);
device_remove_file(dev, &sysfs->attr_interfmode); device_remove_file(dev, &dev_attr_interference);
device_remove_file(dev, &sysfs->attr_sprom); device_remove_file(dev, &dev_attr_sprom);
} }
#ifndef BCM43xx_SYSFS_H_ #ifndef BCM43xx_SYSFS_H_
#define BCM43xx_SYSFS_H_ #define BCM43xx_SYSFS_H_
#include <linux/device.h>
struct bcm43xx_sysfs {
struct device_attribute attr_sprom;
struct device_attribute attr_interfmode;
struct device_attribute attr_preamble;
};
#define devattr_to_bcm(attr, attr_name) ({ \
struct bcm43xx_sysfs *__s; struct bcm43xx_private *__p; \
__s = container_of((attr), struct bcm43xx_sysfs, attr_name); \
__p = container_of(__s, struct bcm43xx_private, sysfs); \
__p; \
})
struct bcm43xx_private; struct bcm43xx_private;
int bcm43xx_sysfs_register(struct bcm43xx_private *bcm); int bcm43xx_sysfs_register(struct bcm43xx_private *bcm);
......
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