STA_OPS_RW(aql);
 
 
-static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
-                                       size_t count, loff_t *ppos)
+static ssize_t sta_agg_status_do_read(struct wiphy *wiphy, struct file *file,
+                                     char *buf, size_t bufsz, void *data)
 {
-       char *buf, *p;
-       ssize_t bufsz = 71 + IEEE80211_NUM_TIDS * 40;
+       struct sta_info *sta = data;
+       char *p = buf;
        int i;
-       struct sta_info *sta = file->private_data;
        struct tid_ampdu_rx *tid_rx;
        struct tid_ampdu_tx *tid_tx;
-       ssize_t ret;
-
-       buf = kzalloc(bufsz, GFP_KERNEL);
-       if (!buf)
-               return -ENOMEM;
-       p = buf;
-
-       rcu_read_lock();
 
        p += scnprintf(p, bufsz + buf - p, "next dialog_token: %#02x\n",
                        sta->ampdu_mlme.dialog_token_allocator + 1);
        for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
                bool tid_rx_valid;
 
-               tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]);
-               tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[i]);
+               tid_rx = wiphy_dereference(wiphy, sta->ampdu_mlme.tid_rx[i]);
+               tid_tx = wiphy_dereference(wiphy, sta->ampdu_mlme.tid_tx[i]);
                tid_rx_valid = test_bit(i, sta->ampdu_mlme.agg_session_valid);
 
                p += scnprintf(p, bufsz + buf - p, "%02d", i);
                                tid_tx ? skb_queue_len(&tid_tx->pending) : 0);
                p += scnprintf(p, bufsz + buf - p, "\n");
        }
-       rcu_read_unlock();
 
-       ret = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
+       return p - buf;
+}
+
+static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
+                                  size_t count, loff_t *ppos)
+{
+       struct sta_info *sta = file->private_data;
+       struct wiphy *wiphy = sta->local->hw.wiphy;
+       size_t bufsz = 71 + IEEE80211_NUM_TIDS * 40;
+       char *buf = kmalloc(bufsz, GFP_KERNEL);
+       ssize_t ret;
+
+       if (!buf)
+               return -ENOMEM;
+
+       ret = wiphy_locked_debugfs_read(wiphy, file, buf, bufsz,
+                                       userbuf, count, ppos,
+                                       sta_agg_status_do_read, sta);
        kfree(buf);
+
        return ret;
 }
 
-static ssize_t sta_agg_status_write(struct file *file, const char __user *userbuf,
-                                   size_t count, loff_t *ppos)
+static ssize_t sta_agg_status_do_write(struct wiphy *wiphy, struct file *file,
+                                      char *buf, size_t count, void *data)
 {
-       char _buf[25] = {}, *buf = _buf;
-       struct sta_info *sta = file->private_data;
+       struct sta_info *sta = data;
        bool start, tx;
        unsigned long tid;
-       char *pos;
+       char *pos = buf;
        int ret, timeout = 5000;
 
-       if (count > sizeof(_buf))
-               return -EINVAL;
-
-       if (copy_from_user(buf, userbuf, count))
-               return -EFAULT;
-
-       buf[sizeof(_buf) - 1] = '\0';
-       pos = buf;
        buf = strsep(&pos, " ");
        if (!buf)
                return -EINVAL;
        if (ret || tid >= IEEE80211_NUM_TIDS)
                return -EINVAL;
 
-       wiphy_lock(sta->local->hw.wiphy);
        if (tx) {
                if (start)
                        ret = ieee80211_start_tx_ba_session(&sta->sta, tid,
                                               3, true);
                ret = 0;
        }
-       wiphy_unlock(sta->local->hw.wiphy);
 
        return ret ?: count;
 }
+
+static ssize_t sta_agg_status_write(struct file *file,
+                                   const char __user *userbuf,
+                                   size_t count, loff_t *ppos)
+{
+       struct sta_info *sta = file->private_data;
+       struct wiphy *wiphy = sta->local->hw.wiphy;
+       char _buf[26];
+
+       return wiphy_locked_debugfs_write(wiphy, file, _buf, sizeof(_buf),
+                                         userbuf, count,
+                                         sta_agg_status_do_write, sta);
+}
 STA_OPS_RW(agg_status);
 
 /* link sta attributes */