Commit 91a8edcc authored by Vladimir Kondratiev's avatar Vladimir Kondratiev Committed by Kalle Valo
Browse files

wil6210: detailed statistics for Rx reorder drop



Rx drops may be for 2 reasons: frame is old,
or it is duplicate. On the debugfs "stations" entry,
provide counters per reorder buffer for total
frames processed, drops for these 2 reasons.
Also add debug print for dropped frames.
Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 5421bf0c
...@@ -1344,6 +1344,7 @@ static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r) ...@@ -1344,6 +1344,7 @@ static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r)
{ {
int i; int i;
u16 index = ((r->head_seq_num - r->ssn) & 0xfff) % r->buf_size; u16 index = ((r->head_seq_num - r->ssn) & 0xfff) % r->buf_size;
unsigned long long drop_dup = r->drop_dup, drop_old = r->drop_old;
seq_printf(s, "([%2d] %3d TU) 0x%03x [", r->buf_size, r->timeout, seq_printf(s, "([%2d] %3d TU) 0x%03x [", r->buf_size, r->timeout,
r->head_seq_num); r->head_seq_num);
...@@ -1353,7 +1354,10 @@ static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r) ...@@ -1353,7 +1354,10 @@ static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r)
else else
seq_printf(s, "%c", r->reorder_buf[i] ? '*' : '_'); seq_printf(s, "%c", r->reorder_buf[i] ? '*' : '_');
} }
seq_printf(s, "] drop %llu last 0x%03x\n", r->drop, r->ssn_last_drop); seq_printf(s,
"] total %llu drop %llu (dup %llu + old %llu) last 0x%03x\n",
r->total, drop_dup + drop_old, drop_dup, drop_old,
r->ssn_last_drop);
} }
static int wil_sta_debugfs_show(struct seq_file *s, void *data) static int wil_sta_debugfs_show(struct seq_file *s, void *data)
......
...@@ -121,6 +121,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) ...@@ -121,6 +121,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
goto out; goto out;
} }
r->total++;
hseq = r->head_seq_num; hseq = r->head_seq_num;
/** Due to the race between WMI events, where BACK establishment /** Due to the race between WMI events, where BACK establishment
...@@ -153,7 +154,9 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) ...@@ -153,7 +154,9 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
/* frame with out of date sequence number */ /* frame with out of date sequence number */
if (seq_less(seq, r->head_seq_num)) { if (seq_less(seq, r->head_seq_num)) {
r->ssn_last_drop = seq; r->ssn_last_drop = seq;
r->drop++; r->drop_old++;
wil_dbg_txrx(wil, "Rx drop: old seq 0x%03x head 0x%03x\n",
seq, r->head_seq_num);
dev_kfree_skb(skb); dev_kfree_skb(skb);
goto out; goto out;
} }
...@@ -174,7 +177,8 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) ...@@ -174,7 +177,8 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
/* check if we already stored this frame */ /* check if we already stored this frame */
if (r->reorder_buf[index]) { if (r->reorder_buf[index]) {
r->drop++; r->drop_dup++;
wil_dbg_txrx(wil, "Rx drop: dup seq 0x%03x\n", seq);
dev_kfree_skb(skb); dev_kfree_skb(skb);
goto out; goto out;
} }
......
...@@ -424,13 +424,12 @@ struct pci_dev; ...@@ -424,13 +424,12 @@ struct pci_dev;
* @ssn: Starting Sequence Number expected to be aggregated. * @ssn: Starting Sequence Number expected to be aggregated.
* @buf_size: buffer size for incoming A-MPDUs * @buf_size: buffer size for incoming A-MPDUs
* @timeout: reset timer value (in TUs). * @timeout: reset timer value (in TUs).
* @ssn_last_drop: SSN of the last dropped frame
* @total: total number of processed incoming frames
* @drop_dup: duplicate frames dropped for this reorder buffer
* @drop_old: old frames dropped for this reorder buffer
* @dialog_token: dialog token for aggregation session * @dialog_token: dialog token for aggregation session
* @rcu_head: RCU head used for freeing this struct * @first_time: true when this buffer used 1-st time
* @drop: total frames dropped for this reorder buffer
*
* This structure's lifetime is managed by RCU, assignments to
* the array holding it must hold the aggregation mutex.
*
*/ */
struct wil_tid_ampdu_rx { struct wil_tid_ampdu_rx {
struct sk_buff **reorder_buf; struct sk_buff **reorder_buf;
...@@ -444,7 +443,9 @@ struct wil_tid_ampdu_rx { ...@@ -444,7 +443,9 @@ struct wil_tid_ampdu_rx {
u16 buf_size; u16 buf_size;
u16 timeout; u16 timeout;
u16 ssn_last_drop; u16 ssn_last_drop;
unsigned long long drop; unsigned long long total; /* frames processed */
unsigned long long drop_dup;
unsigned long long drop_old;
u8 dialog_token; u8 dialog_token;
bool first_time; /* is it 1-st time this buffer used? */ bool first_time; /* is it 1-st time this buffer used? */
}; };
......
Supports Markdown
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