@@ -71,48 +71,148 @@ struct dentry *brcms_debugfs_get_devdir(struct brcms_pub *drvr)
7171}
7272
7373static
74- ssize_t brcms_debugfs_hardware_read (struct file * f , char __user * data ,
75- size_t count , loff_t * ppos )
74+ int brcms_debugfs_hardware_read (struct seq_file * s , void * data )
7675{
77- char buf [128 ];
78- int res ;
79- struct brcms_pub * drvr = f -> private_data ;
80-
81- /* only allow read from start */
82- if (* ppos > 0 )
83- return 0 ;
84-
85- res = scnprintf (buf , sizeof (buf ),
86- "board vendor: %x\n"
87- "board type: %x\n"
88- "board revision: %x\n"
89- "board flags: %x\n"
90- "board flags2: %x\n"
91- "firmware revision: %x\n" ,
92- drvr -> wlc -> hw -> d11core -> bus -> boardinfo .vendor ,
93- drvr -> wlc -> hw -> d11core -> bus -> boardinfo .type ,
94- drvr -> wlc -> hw -> boardrev ,
95- drvr -> wlc -> hw -> boardflags ,
96- drvr -> wlc -> hw -> boardflags2 ,
97- drvr -> wlc -> ucode_rev
98- );
99-
100- return simple_read_from_buffer (data , count , ppos , buf , res );
76+ struct brcms_pub * drvr = s -> private ;
77+
78+ seq_printf (s , "board vendor: %x\n"
79+ "board type: %x\n"
80+ "board revision: %x\n"
81+ "board flags: %x\n"
82+ "board flags2: %x\n"
83+ "firmware revision: %x\n" ,
84+ drvr -> wlc -> hw -> d11core -> bus -> boardinfo .vendor ,
85+ drvr -> wlc -> hw -> d11core -> bus -> boardinfo .type ,
86+ drvr -> wlc -> hw -> boardrev ,
87+ drvr -> wlc -> hw -> boardflags ,
88+ drvr -> wlc -> hw -> boardflags2 ,
89+ drvr -> wlc -> ucode_rev );
90+
91+ return 0 ;
92+ }
93+
94+ static int brcms_debugfs_macstat_read (struct seq_file * s , void * data )
95+ {
96+ struct brcms_pub * drvr = s -> private ;
97+ struct brcms_info * wl = drvr -> ieee_hw -> priv ;
98+ struct macstat stats ;
99+ int i ;
100+
101+ spin_lock_bh (& wl -> lock );
102+ stats = * (drvr -> wlc -> core -> macstat_snapshot );
103+ spin_unlock_bh (& wl -> lock );
104+
105+ seq_printf (s , "txallfrm: %d\n" , stats .txallfrm );
106+ seq_printf (s , "txrtsfrm: %d\n" , stats .txrtsfrm );
107+ seq_printf (s , "txctsfrm: %d\n" , stats .txctsfrm );
108+ seq_printf (s , "txackfrm: %d\n" , stats .txackfrm );
109+ seq_printf (s , "txdnlfrm: %d\n" , stats .txdnlfrm );
110+ seq_printf (s , "txbcnfrm: %d\n" , stats .txbcnfrm );
111+ seq_printf (s , "txfunfl[8]:" );
112+ for (i = 0 ; i < ARRAY_SIZE (stats .txfunfl ); i ++ )
113+ seq_printf (s , " %d" , stats .txfunfl [i ]);
114+ seq_printf (s , "\ntxtplunfl: %d\n" , stats .txtplunfl );
115+ seq_printf (s , "txphyerr: %d\n" , stats .txphyerr );
116+ seq_printf (s , "pktengrxducast: %d\n" , stats .pktengrxducast );
117+ seq_printf (s , "pktengrxdmcast: %d\n" , stats .pktengrxdmcast );
118+ seq_printf (s , "rxfrmtoolong: %d\n" , stats .rxfrmtoolong );
119+ seq_printf (s , "rxfrmtooshrt: %d\n" , stats .rxfrmtooshrt );
120+ seq_printf (s , "rxinvmachdr: %d\n" , stats .rxinvmachdr );
121+ seq_printf (s , "rxbadfcs: %d\n" , stats .rxbadfcs );
122+ seq_printf (s , "rxbadplcp: %d\n" , stats .rxbadplcp );
123+ seq_printf (s , "rxcrsglitch: %d\n" , stats .rxcrsglitch );
124+ seq_printf (s , "rxstrt: %d\n" , stats .rxstrt );
125+ seq_printf (s , "rxdfrmucastmbss: %d\n" , stats .rxdfrmucastmbss );
126+ seq_printf (s , "rxmfrmucastmbss: %d\n" , stats .rxmfrmucastmbss );
127+ seq_printf (s , "rxcfrmucast: %d\n" , stats .rxcfrmucast );
128+ seq_printf (s , "rxrtsucast: %d\n" , stats .rxrtsucast );
129+ seq_printf (s , "rxctsucast: %d\n" , stats .rxctsucast );
130+ seq_printf (s , "rxackucast: %d\n" , stats .rxackucast );
131+ seq_printf (s , "rxdfrmocast: %d\n" , stats .rxdfrmocast );
132+ seq_printf (s , "rxmfrmocast: %d\n" , stats .rxmfrmocast );
133+ seq_printf (s , "rxcfrmocast: %d\n" , stats .rxcfrmocast );
134+ seq_printf (s , "rxrtsocast: %d\n" , stats .rxrtsocast );
135+ seq_printf (s , "rxctsocast: %d\n" , stats .rxctsocast );
136+ seq_printf (s , "rxdfrmmcast: %d\n" , stats .rxdfrmmcast );
137+ seq_printf (s , "rxmfrmmcast: %d\n" , stats .rxmfrmmcast );
138+ seq_printf (s , "rxcfrmmcast: %d\n" , stats .rxcfrmmcast );
139+ seq_printf (s , "rxbeaconmbss: %d\n" , stats .rxbeaconmbss );
140+ seq_printf (s , "rxdfrmucastobss: %d\n" , stats .rxdfrmucastobss );
141+ seq_printf (s , "rxbeaconobss: %d\n" , stats .rxbeaconobss );
142+ seq_printf (s , "rxrsptmout: %d\n" , stats .rxrsptmout );
143+ seq_printf (s , "bcntxcancl: %d\n" , stats .bcntxcancl );
144+ seq_printf (s , "rxf0ovfl: %d\n" , stats .rxf0ovfl );
145+ seq_printf (s , "rxf1ovfl: %d\n" , stats .rxf1ovfl );
146+ seq_printf (s , "rxf2ovfl: %d\n" , stats .rxf2ovfl );
147+ seq_printf (s , "txsfovfl: %d\n" , stats .txsfovfl );
148+ seq_printf (s , "pmqovfl: %d\n" , stats .pmqovfl );
149+ seq_printf (s , "rxcgprqfrm: %d\n" , stats .rxcgprqfrm );
150+ seq_printf (s , "rxcgprsqovfl: %d\n" , stats .rxcgprsqovfl );
151+ seq_printf (s , "txcgprsfail: %d\n" , stats .txcgprsfail );
152+ seq_printf (s , "txcgprssuc: %d\n" , stats .txcgprssuc );
153+ seq_printf (s , "prs_timeout: %d\n" , stats .prs_timeout );
154+ seq_printf (s , "rxnack: %d\n" , stats .rxnack );
155+ seq_printf (s , "frmscons: %d\n" , stats .frmscons );
156+ seq_printf (s , "txnack: %d\n" , stats .txnack );
157+ seq_printf (s , "txglitch_nack: %d\n" , stats .txglitch_nack );
158+ seq_printf (s , "txburst: %d\n" , stats .txburst );
159+ seq_printf (s , "bphy_rxcrsglitch: %d\n" , stats .bphy_rxcrsglitch );
160+ seq_printf (s , "phywatchdog: %d\n" , stats .phywatchdog );
161+ seq_printf (s , "bphy_badplcp: %d\n" , stats .bphy_badplcp );
162+ return 0 ;
163+ }
164+
165+ struct brcms_debugfs_entry {
166+ int (* read )(struct seq_file * seq , void * data );
167+ struct brcms_pub * drvr ;
168+ };
169+
170+ static int brcms_debugfs_entry_open (struct inode * inode , struct file * f )
171+ {
172+ struct brcms_debugfs_entry * entry = inode -> i_private ;
173+
174+ return single_open (f , entry -> read , entry -> drvr );
101175}
102176
103- static const struct file_operations brcms_debugfs_hardware_ops = {
177+ static const struct file_operations brcms_debugfs_def_ops = {
104178 .owner = THIS_MODULE ,
105- .open = simple_open ,
106- .read = brcms_debugfs_hardware_read
179+ .open = brcms_debugfs_entry_open ,
180+ .release = single_release ,
181+ .read = seq_read ,
182+ .llseek = seq_lseek
107183};
108184
185+ static int
186+ brcms_debugfs_add_entry (struct brcms_pub * drvr , const char * fn ,
187+ int (* read_fn )(struct seq_file * seq , void * data ))
188+ {
189+ struct device * dev = & drvr -> wlc -> hw -> d11core -> dev ;
190+ struct dentry * dentry = drvr -> dbgfs_dir ;
191+ struct brcms_debugfs_entry * entry ;
192+
193+ if (IS_ERR_OR_NULL (dentry ))
194+ return - ENOENT ;
195+
196+ entry = devm_kzalloc (dev , sizeof (* entry ), GFP_KERNEL );
197+ if (!entry )
198+ return - ENOMEM ;
199+
200+ entry -> read = read_fn ;
201+ entry -> drvr = drvr ;
202+
203+ dentry = debugfs_create_file (fn , S_IRUGO , dentry , entry ,
204+ & brcms_debugfs_def_ops );
205+
206+ return PTR_ERR_OR_ZERO (dentry );
207+ }
208+
109209void brcms_debugfs_create_files (struct brcms_pub * drvr )
110210{
111- struct dentry * dentry = drvr -> dbgfs_dir ;
211+ if (IS_ERR_OR_NULL (drvr -> dbgfs_dir ))
212+ return ;
112213
113- if (!IS_ERR_OR_NULL (dentry ))
114- debugfs_create_file ("hardware" , S_IRUGO , dentry ,
115- drvr , & brcms_debugfs_hardware_ops );
214+ brcms_debugfs_add_entry (drvr , "hardware" , brcms_debugfs_hardware_read );
215+ brcms_debugfs_add_entry (drvr , "macstat" , brcms_debugfs_macstat_read );
116216}
117217
118218#define __brcms_fn (fn ) \
0 commit comments