--- /dev/null
+--- a/net80211/ieee80211_linux.c
++++ b/net80211/ieee80211_linux.c
+@@ -476,8 +476,12 @@ static int
+ proc_ieee80211_open(struct inode *inode, struct file *file)
+ {
+ struct proc_ieee80211_priv *pv = NULL;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ struct ieee80211vap *vap = PDE_DATA(inode);
++#else
+ struct proc_dir_entry *dp = PDE(inode);
+ struct ieee80211vap *vap = dp->data;
++#endif
+
+ if (!(file->private_data = kmalloc(sizeof(struct proc_ieee80211_priv), GFP_KERNEL)))
+ return -ENOMEM;
+@@ -842,10 +846,16 @@ ieee80211_virtfs_latevattach(struct ieee
+ tmp = vap->iv_proc_entries;
+ while (tmp) {
+ if (!tmp->entry) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ tmp->entry = proc_create_data(tmp->name,
++ PROC_IEEE80211_PERM, vap->iv_proc,
++ tmp->fileops, vap);
++#else
+ tmp->entry = create_proc_entry(tmp->name,
+ PROC_IEEE80211_PERM, vap->iv_proc);
+ tmp->entry->data = vap;
+ tmp->entry->proc_fops = tmp->fileops;
++#endif
+ }
+ tmp = tmp->next;
+ }
+@@ -913,10 +923,16 @@ ieee80211_proc_vcreate(struct ieee80211v
+
+ /* Create the actual proc entry */
+ if (vap->iv_proc) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ entry->entry = proc_create_data(entry->name,
++ PROC_IEEE80211_PERM, vap->iv_proc,
++ entry->fileops, vap);
++#else
+ entry->entry = create_proc_entry(entry->name,
+ PROC_IEEE80211_PERM, vap->iv_proc);
+ entry->entry->data = vap;
+ entry->entry->proc_fops = entry->fileops;
++#endif
+ }
+
+ /* Add it to the list */
+@@ -953,14 +969,26 @@ ieee80211_virtfs_vdetach(struct ieee8021
+ tmp = vap->iv_proc_entries;
+ while (tmp) {
+ if (tmp->entry) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ proc_remove(vap->iv_proc);
++#else
+ remove_proc_entry(tmp->name, vap->iv_proc);
++#endif
+ tmp->entry = NULL;
+ }
+ tmp = tmp->next;
+ }
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ proc_remove(proc_madwifi);
++#else
+ remove_proc_entry(vap->iv_proc->name, proc_madwifi);
++#endif
+ if (proc_madwifi_count == 1) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ proc_remove(proc_net);
++#else
+ remove_proc_entry("madwifi", proc_net);
++#endif
+ proc_madwifi = NULL;
+ }
+ proc_madwifi_count--;
+--- a/ath_rate/minstrel/minstrel.c
++++ b/ath_rate/minstrel/minstrel.c
+@@ -835,8 +835,12 @@ static int
+ ath_proc_ratesample_open(struct inode *inode, struct file *file)
+ {
+ struct proc_ieee80211_priv *pv = NULL;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0))
++ struct ieee80211vap *vap = PDE_DATA(inode);
++#else
+ struct proc_dir_entry *dp = PDE(inode);
+ struct ieee80211vap *vap = dp->data;
++#endif
+
+ if (!(file->private_data = kmalloc(sizeof(struct proc_ieee80211_priv),
+ GFP_KERNEL)))
+--- a/ath_rate/sample/sample.c
++++ b/ath_rate/sample/sample.c
+@@ -923,12 +923,15 @@ proc_read_nodes(struct ieee80211vap *vap
+ }
+
+ static int
+-proc_ratesample_open(struct inode *inode, struct file *file)
++proc_ratesample_open_common(struct inode *inode, struct file *file, const unsigned long size)
+ {
+ struct proc_ieee80211_priv *pv;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++ struct ieee80211vap *vap = PDE_DATA(inode);
++#else
+ struct proc_dir_entry *dp = PDE(inode);
+ struct ieee80211vap *vap = dp->data;
+- unsigned long size;
++#endif
+
+ if (!(file->private_data = kmalloc(sizeof(struct proc_ieee80211_priv),
+ GFP_KERNEL)))
+@@ -953,18 +956,47 @@ proc_ratesample_open(struct inode *inode
+ pv->max_wlen = MAX_PROC_IEEE80211_SIZE;
+ pv->max_rlen = MAX_PROC_IEEE80211_SIZE;
+
+- /* Determine what size packets to get stats for based on proc filename */
+- size = simple_strtoul(dp->name + 10, NULL, 0);
+-
+ /* now read the data into the buffer */
+ pv->rlen = proc_read_nodes(vap, size, pv->rbuf, MAX_PROC_IEEE80211_SIZE);
+ return 0;
+ }
+
+-static struct file_operations proc_ratesample_ops = {
++static int
++proc_ratesample_stats250_open(struct inode *inode, struct file *file)
++{
++ return proc_ratesample_open_common(inode, file, 250);
++}
++
++static int
++proc_ratesample_stats1600_open(struct inode *inode, struct file *file)
++{
++ return proc_ratesample_open_common(inode, file, 1600);
++}
++
++static int
++proc_ratesample_stats3000_open(struct inode *inode, struct file *file)
++{
++ return proc_ratesample_open_common(inode, file, 3000);
++}
++
++static struct file_operations proc_ratesample_stats250_ops = {
++ .read = NULL,
++ .write = NULL,
++ .open = proc_ratesample_stats250_open,
++ .release = NULL,
++};
++
++static struct file_operations proc_ratesample_stats1600_ops = {
++ .read = NULL,
++ .write = NULL,
++ .open = proc_ratesample_stats1600_open,
++ .release = NULL,
++};
++
++static struct file_operations proc_ratesample_stats3000_ops = {
+ .read = NULL,
+ .write = NULL,
+- .open = proc_ratesample_open,
++ .open = proc_ratesample_stats3000_open,
+ .release = NULL,
+ };
+
+@@ -972,9 +1004,9 @@ static void
+ ath_rate_dynamic_proc_register(struct ieee80211vap *vap)
+ {
+ /* Create proc entries for the rate control algorithm */
+- ieee80211_proc_vcreate(vap, &proc_ratesample_ops, "ratestats_250");
+- ieee80211_proc_vcreate(vap, &proc_ratesample_ops, "ratestats_1600");
+- ieee80211_proc_vcreate(vap, &proc_ratesample_ops, "ratestats_3000");
++ ieee80211_proc_vcreate(vap, &proc_ratesample_stats250_ops, "ratestats_250");
++ ieee80211_proc_vcreate(vap, &proc_ratesample_stats1600_ops, "ratestats_1600");
++ ieee80211_proc_vcreate(vap, &proc_ratesample_stats3000_ops, "ratestats_3000");
+ }
+
+ static struct ieee80211_rate_ops ath_rate_ops = {