Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
mac80211
rc80211_minstrel_ht_debugfs.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2010 Felix Fietkau <
[email protected]
>
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*/
8
#include <linux/netdevice.h>
9
#include <linux/types.h>
10
#include <
linux/skbuff.h
>
11
#include <
linux/debugfs.h
>
12
#include <
linux/ieee80211.h
>
13
#include <linux/export.h>
14
#include <
net/mac80211.h
>
15
#include "
rc80211_minstrel.h
"
16
#include "
rc80211_minstrel_ht.h
"
17
18
static
int
19
minstrel_ht_stats_open(
struct
inode
*
inode
,
struct
file
*
file
)
20
{
21
struct
minstrel_ht_sta_priv
*msp = inode->
i_private
;
22
struct
minstrel_ht_sta
*mi = &msp->
ht
;
23
struct
minstrel_debugfs_info
*
ms
;
24
unsigned
int
i
,
j
, tp, prob, eprob;
25
char
*
p
;
26
int
ret
;
27
28
if
(!msp->
is_ht
) {
29
inode->
i_private
= &msp->
legacy
;
30
ret =
minstrel_stats_open
(inode, file);
31
inode->
i_private
= msp;
32
return
ret
;
33
}
34
35
ms =
kmalloc
(
sizeof
(*ms) + 8192,
GFP_KERNEL
);
36
if
(!ms)
37
return
-
ENOMEM
;
38
39
file->
private_data
=
ms
;
40
p = ms->
buf
;
41
p +=
sprintf
(p,
"type rate throughput ewma prob this prob "
42
"this succ/attempt success attempts\n"
);
43
for
(i = 0; i <
MINSTREL_MAX_STREAMS
*
MINSTREL_STREAM_GROUPS
; i++) {
44
char
htmode =
'2'
;
45
char
gimode =
'L'
;
46
47
if
(!mi->
groups
[i].supported)
48
continue
;
49
50
if
(
minstrel_mcs_groups
[i].
flags
&
IEEE80211_TX_RC_40_MHZ_WIDTH
)
51
htmode =
'4'
;
52
if
(
minstrel_mcs_groups
[i].
flags
&
IEEE80211_TX_RC_SHORT_GI
)
53
gimode =
'S'
;
54
55
for
(j = 0; j <
MCS_GROUP_RATES
; j++) {
56
struct
minstrel_rate_stats
*mr = &mi->
groups
[
i
].rates[
j
];
57
int
idx
= i * MCS_GROUP_RATES +
j
;
58
59
if
(!(mi->
groups
[i].supported &
BIT
(j)))
60
continue
;
61
62
p +=
sprintf
(p,
"HT%c0/%cGI "
, htmode, gimode);
63
64
*(p++) = (idx == mi->
max_tp_rate
) ?
'T'
:
' '
;
65
*(p++) = (idx == mi->
max_tp_rate2
) ?
't'
:
' '
;
66
*(p++) = (idx == mi->
max_prob_rate
) ?
'P'
:
' '
;
67
p +=
sprintf
(p,
"MCS%-2u"
, (
minstrel_mcs_groups
[i].
streams
- 1) *
68
MCS_GROUP_RATES + j);
69
70
tp = mr->
cur_tp
/ 10;
71
prob =
MINSTREL_TRUNC
(mr->
cur_prob
* 1000);
72
eprob =
MINSTREL_TRUNC
(mr->
probability
* 1000);
73
74
p +=
sprintf
(p,
" %6u.%1u %6u.%1u %6u.%1u "
75
"%3u(%3u) %8llu %8llu\n"
,
76
tp / 10, tp % 10,
77
eprob / 10, eprob % 10,
78
prob / 10, prob % 10,
79
mr->
last_success
,
80
mr->
last_attempts
,
81
(
unsigned
long
long
)mr->
succ_hist
,
82
(
unsigned
long
long
)mr->
att_hist
);
83
}
84
}
85
p +=
sprintf
(p,
"\nTotal packet count:: ideal %d "
86
"lookaround %d\n"
,
87
max
(0, (
int
) mi->
total_packets
- (
int
) mi->
sample_packets
),
88
mi->
sample_packets
);
89
p +=
sprintf
(p,
"Average A-MPDU length: %d.%d\n"
,
90
MINSTREL_TRUNC
(mi->
avg_ampdu_len
),
91
MINSTREL_TRUNC
(mi->
avg_ampdu_len
* 10) % 10);
92
ms->
len
= p - ms->
buf
;
93
94
return
nonseekable_open
(inode, file);
95
}
96
97
static
const
struct
file_operations
minstrel_ht_stat_fops = {
98
.owner =
THIS_MODULE
,
99
.open = minstrel_ht_stats_open,
100
.read =
minstrel_stats_read
,
101
.release =
minstrel_stats_release
,
102
.llseek =
no_llseek
,
103
};
104
105
void
106
minstrel_ht_add_sta_debugfs
(
void
*
priv
,
void
*priv_sta,
struct
dentry
*dir)
107
{
108
struct
minstrel_ht_sta_priv
*msp = priv_sta;
109
110
msp->dbg_stats =
debugfs_create_file
(
"rc_stats"
,
S_IRUGO
, dir, msp,
111
&minstrel_ht_stat_fops);
112
}
113
114
void
115
minstrel_ht_remove_sta_debugfs
(
void
*
priv
,
void
*priv_sta)
116
{
117
struct
minstrel_ht_sta_priv
*msp = priv_sta;
118
119
debugfs_remove
(msp->dbg_stats);
120
}
Generated on Thu Jan 10 2013 15:00:02 for Linux Kernel by
1.8.2