42 #include <linux/module.h>
44 #include <linux/list.h>
46 #include <linux/if_arp.h>
55 #define CAN_PROC_VERSION "version"
56 #define CAN_PROC_STATS "stats"
57 #define CAN_PROC_RESET_STATS "reset_stats"
58 #define CAN_PROC_RCVLIST_ALL "rcvlist_all"
59 #define CAN_PROC_RCVLIST_FIL "rcvlist_fil"
60 #define CAN_PROC_RCVLIST_INV "rcvlist_inv"
61 #define CAN_PROC_RCVLIST_SFF "rcvlist_sff"
62 #define CAN_PROC_RCVLIST_EFF "rcvlist_eff"
63 #define CAN_PROC_RCVLIST_ERR "rcvlist_err"
76 static int user_reset;
78 static const char rx_list_name[][8] = {
90 static void can_init_stats(
void)
108 static unsigned long calc_rate(
unsigned long oldjif,
unsigned long newjif,
113 if (oldjif == newjif)
123 rate = (count *
HZ) / (newjif - oldjif);
200 hlist_for_each_entry_rcu(r, n, rx_list,
list) {
202 " %-5s %08x %08x %pK %pK %8ld %s\n" :
203 " %-5s %03x %08x %pK %pK %8ld %s\n";
210 static void can_print_recv_banner(
struct seq_file *m)
216 seq_puts(m,
" device can_id can_mask function"
217 " userdata matches ident\n");
220 static int can_stats_proc_show(
struct seq_file *m,
void *
v)
230 seq_printf(m,
" %8ld %% total match ratio (RXMR)\n",
233 seq_printf(m,
" %8ld frames/s total tx rate (TXR)\n",
235 seq_printf(m,
" %8ld frames/s total rx rate (RXR)\n",
240 seq_printf(m,
" %8ld %% current match ratio (CRXMR)\n",
243 seq_printf(m,
" %8ld frames/s current tx rate (CTXR)\n",
245 seq_printf(m,
" %8ld frames/s current rx rate (CRXR)\n",
250 seq_printf(m,
" %8ld %% max match ratio (MRXMR)\n",
253 seq_printf(m,
" %8ld frames/s max tx rate (MTXR)\n",
255 seq_printf(m,
" %8ld frames/s max rx rate (MRXR)\n",
261 seq_printf(m,
" %8ld current receive list entries (CRCV)\n",
263 seq_printf(m,
" %8ld maximum receive list entries (MRCV)\n",
267 seq_printf(m,
"\n %8ld statistic resets (STR)\n",
271 seq_printf(m,
" %8ld user statistic resets (USTR)\n",
285 .open = can_stats_proc_open,
291 static int can_reset_stats_proc_show(
struct seq_file *m,
void *v)
296 seq_printf(m,
"Scheduled statistic reset #%ld.\n",
303 seq_printf(m,
"Performed statistic reset #%ld.\n",
316 .open = can_reset_stats_proc_open,
322 static int can_version_proc_show(
struct seq_file *m,
void *v)
335 .open = can_version_proc_open,
341 static inline void can_rcvlist_proc_show_one(
struct seq_file *m,
int idx,
345 if (!hlist_empty(&d->
rx[idx])) {
346 can_print_recv_banner(m);
347 can_print_rcvlist(m, &d->
rx[idx], dev);
353 static int can_rcvlist_proc_show(
struct seq_file *m,
void *v)
360 seq_printf(m,
"\nreceive list '%s':\n", rx_list_name[idx]);
366 can_rcvlist_proc_show_one(m, idx,
NULL, d);
371 can_rcvlist_proc_show_one(m, idx, dev, dev->
ml_priv);
387 .open = can_rcvlist_proc_open,
393 static inline void can_rcvlist_sff_proc_show_one(
struct seq_file *m,
401 for (i = 0; i < 0x800; i++)
402 if (!hlist_empty(&d->
rx_sff[i])) {
408 can_print_recv_banner(m);
409 for (i = 0; i < 0x800; i++) {
410 if (!hlist_empty(&d->
rx_sff[i]))
411 can_print_rcvlist(m, &d->
rx_sff[i], dev);
417 static int can_rcvlist_sff_proc_show(
struct seq_file *m,
void *v)
423 seq_puts(m,
"\nreceive list 'rx_sff':\n");
429 can_rcvlist_sff_proc_show_one(m,
NULL, d);
434 can_rcvlist_sff_proc_show_one(m, dev, dev->
ml_priv);
443 static int can_rcvlist_sff_proc_open(
struct inode *inode,
struct file *file)
450 .open = can_rcvlist_sff_proc_open,
460 static void can_remove_proc_readentry(
const char *
name)
476 "CONFIG_PROC_FS missing?\n");
482 &can_version_proc_fops);
484 &can_stats_proc_fops);
486 &can_reset_stats_proc_fops);
488 &can_rcvlist_proc_fops, (
void *)
RX_ERR);
490 &can_rcvlist_proc_fops, (
void *)
RX_ALL);
492 &can_rcvlist_proc_fops, (
void *)
RX_FIL);
494 &can_rcvlist_proc_fops, (
void *)
RX_INV);
496 &can_rcvlist_proc_fops, (
void *)
RX_EFF);
498 &can_rcvlist_sff_proc_fops);