mac80211: update to wireless-testing 2010-03-03
[openwrt-10.03/.git] / package / mac80211 / patches / 540-minstrel_debugfs_cleanup.patch
diff --git a/package/mac80211/patches/540-minstrel_debugfs_cleanup.patch b/package/mac80211/patches/540-minstrel_debugfs_cleanup.patch
new file mode 100644 (file)
index 0000000..9a13bae
--- /dev/null
@@ -0,0 +1,80 @@
+--- a/net/mac80211/rc80211_minstrel.h
++++ b/net/mac80211/rc80211_minstrel.h
+@@ -80,6 +80,11 @@ struct minstrel_priv {
+       unsigned int lookaround_rate_mrr;
+ };
++struct minstrel_debugfs_info {
++      size_t len;
++      char buf[];
++};
++
+ void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
+ void minstrel_remove_sta_debugfs(void *priv, void *priv_sta);
+--- a/net/mac80211/rc80211_minstrel_debugfs.c
++++ b/net/mac80211/rc80211_minstrel_debugfs.c
+@@ -52,21 +52,15 @@
+ #include <net/mac80211.h>
+ #include "rc80211_minstrel.h"
+-struct minstrel_stats_info {
+-      struct minstrel_sta_info *mi;
+-      char buf[4096];
+-      size_t len;
+-};
+-
+ static int
+ minstrel_stats_open(struct inode *inode, struct file *file)
+ {
+       struct minstrel_sta_info *mi = inode->i_private;
+-      struct minstrel_stats_info *ms;
++      struct minstrel_debugfs_info *ms;
+       unsigned int i, tp, prob, eprob;
+       char *p;
+-      ms = kmalloc(sizeof(*ms), GFP_KERNEL);
++      ms = kmalloc(sizeof(*ms) + 4096, GFP_KERNEL);
+       if (!ms)
+               return -ENOMEM;
+@@ -107,35 +101,18 @@ minstrel_stats_open(struct inode *inode,
+ }
+ static ssize_t
+-minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *o)
++minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
+ {
+-      struct minstrel_stats_info *ms;
+-      char *src;
++      struct minstrel_debugfs_info *ms;
+       ms = file->private_data;
+-      src = ms->buf;
+-
+-      len = min(len, ms->len);
+-      if (len <= *o)
+-              return 0;
+-
+-      src += *o;
+-      len -= *o;
+-      *o += len;
+-
+-      if (copy_to_user(buf, src, len))
+-              return -EFAULT;
+-
+-      return len;
++      return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
+ }
+ static int
+ minstrel_stats_release(struct inode *inode, struct file *file)
+ {
+-      struct minstrel_stats_info *ms = file->private_data;
+-
+-      kfree(ms);
+-
++      kfree(file->private_data);
+       return 0;
+ }