]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/mac80211/debugfs_sta.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / net / mac80211 / debugfs_sta.c
index 4601fea1784dd7404b2d91c2635b211453e9e0c6..c04a1396cf8d94e4ff6d467cb1f98a3a1133f5be 100644 (file)
 
 /* sta attributtes */
 
-#define STA_READ(name, buflen, field, format_string)                   \
+#define STA_READ(name, field, format_string)                           \
 static ssize_t sta_ ##name## _read(struct file *file,                  \
                                   char __user *userbuf,                \
                                   size_t count, loff_t *ppos)          \
 {                                                                      \
-       int res;                                                        \
        struct sta_info *sta = file->private_data;                      \
-       char buf[buflen];                                               \
-       res = scnprintf(buf, buflen, format_string, sta->field);        \
-       return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
+       return mac80211_format_buffer(userbuf, count, ppos,             \
+                                     format_string, sta->field);       \
 }
-#define STA_READ_D(name, field) STA_READ(name, 20, field, "%d\n")
-#define STA_READ_U(name, field) STA_READ(name, 20, field, "%u\n")
-#define STA_READ_S(name, field) STA_READ(name, 20, field, "%s\n")
+#define STA_READ_D(name, field) STA_READ(name, field, "%d\n")
+#define STA_READ_U(name, field) STA_READ(name, field, "%u\n")
+#define STA_READ_S(name, field) STA_READ(name, field, "%s\n")
 
 #define STA_OPS(name)                                                  \
 static const struct file_operations sta_ ##name## _ops = {             \
@@ -79,22 +77,18 @@ static ssize_t sta_num_ps_buf_frames_read(struct file *file,
                                          char __user *userbuf,
                                          size_t count, loff_t *ppos)
 {
-       char buf[20];
        struct sta_info *sta = file->private_data;
-       int res = scnprintf(buf, sizeof(buf), "%u\n",
-                           skb_queue_len(&sta->ps_tx_buf));
-       return simple_read_from_buffer(userbuf, count, ppos, buf, res);
+       return mac80211_format_buffer(userbuf, count, ppos, "%u\n",
+                                     skb_queue_len(&sta->ps_tx_buf));
 }
 STA_OPS(num_ps_buf_frames);
 
 static ssize_t sta_inactive_ms_read(struct file *file, char __user *userbuf,
                                    size_t count, loff_t *ppos)
 {
-       char buf[20];
        struct sta_info *sta = file->private_data;
-       int res = scnprintf(buf, sizeof(buf), "%d\n",
-                           jiffies_to_msecs(jiffies - sta->last_rx));
-       return simple_read_from_buffer(userbuf, count, ppos, buf, res);
+       return mac80211_format_buffer(userbuf, count, ppos, "%d\n",
+                                     jiffies_to_msecs(jiffies - sta->last_rx));
 }
 STA_OPS(inactive_ms);
 
@@ -118,34 +112,35 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
        char buf[71 + STA_TID_NUM * 40], *p = buf;
        int i;
        struct sta_info *sta = file->private_data;
+       struct tid_ampdu_rx *tid_rx;
+       struct tid_ampdu_tx *tid_tx;
+
+       rcu_read_lock();
 
-       spin_lock_bh(&sta->lock);
        p += scnprintf(p, sizeof(buf) + buf - p, "next dialog_token: %#02x\n",
                        sta->ampdu_mlme.dialog_token_allocator + 1);
        p += scnprintf(p, sizeof(buf) + buf - p,
                       "TID\t\tRX active\tDTKN\tSSN\t\tTX\tDTKN\tpending\n");
+
        for (i = 0; i < STA_TID_NUM; i++) {
+               tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]);
+               tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[i]);
+
                p += scnprintf(p, sizeof(buf) + buf - p, "%02d", i);
-               p += scnprintf(p, sizeof(buf) + buf - p, "\t\t%x",
-                               !!sta->ampdu_mlme.tid_rx[i]);
+               p += scnprintf(p, sizeof(buf) + buf - p, "\t\t%x", !!tid_rx);
                p += scnprintf(p, sizeof(buf) + buf - p, "\t%#.2x",
-                               sta->ampdu_mlme.tid_rx[i] ?
-                               sta->ampdu_mlme.tid_rx[i]->dialog_token : 0);
+                               tid_rx ? tid_rx->dialog_token : 0);
                p += scnprintf(p, sizeof(buf) + buf - p, "\t%#.3x",
-                               sta->ampdu_mlme.tid_rx[i] ?
-                               sta->ampdu_mlme.tid_rx[i]->ssn : 0);
+                               tid_rx ? tid_rx->ssn : 0);
 
-               p += scnprintf(p, sizeof(buf) + buf - p, "\t\t%x",
-                               !!sta->ampdu_mlme.tid_tx[i]);
+               p += scnprintf(p, sizeof(buf) + buf - p, "\t\t%x", !!tid_tx);
                p += scnprintf(p, sizeof(buf) + buf - p, "\t%#.2x",
-                               sta->ampdu_mlme.tid_tx[i] ?
-                               sta->ampdu_mlme.tid_tx[i]->dialog_token : 0);
+                               tid_tx ? tid_tx->dialog_token : 0);
                p += scnprintf(p, sizeof(buf) + buf - p, "\t%03d",
-                               sta->ampdu_mlme.tid_tx[i] ?
-                               skb_queue_len(&sta->ampdu_mlme.tid_tx[i]->pending) : 0);
+                               tid_tx ? skb_queue_len(&tid_tx->pending) : 0);
                p += scnprintf(p, sizeof(buf) + buf - p, "\n");
        }
-       spin_unlock_bh(&sta->lock);
+       rcu_read_unlock();
 
        return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
 }
@@ -194,7 +189,7 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
 
        if (tx) {
                if (start)
-                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid);
+                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid, 5000);
                else
                        ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
        } else {