adds atm driver for ifxmips, code ported from wippies 2.6.16 gpl release. it compiles...
[10.03/openwrt.git] / package / ifxmips-atm / src / proc.c
1 #include <linux/atm.h>
2 #include <linux/proc_fs.h>
3
4 #include "proc.h"
5 #include "common.h"
6
7 struct proc_dir_entry *ppe_proc_dir;
8
9 int proc_read_idle_counter(char *page, char **start, off_t off, int count, int *eof, void *data)
10 {
11     int len = 0;
12
13     len += sprintf(page + off,       "Channel 0\n");
14     len += sprintf(page + off + len, "  TX\n");
15     len += sprintf(page + off + len,
16                 "    DREG_AT_CELL0       = %d\n", *DREG_AT_CELL0 & 0xFFFF);
17     len += sprintf(page + off + len,
18                 "    DREG_AT_IDLE_CNT0   = %d\n", *DREG_AT_IDLE_CNT0 & 0xFFFF);
19     len += sprintf(page + off + len, "  RX\n");
20     len += sprintf(page + off + len,
21                 "    DREG_AR_CELL0       = %d\n", *DREG_AR_CELL0 & 0xFFFF);
22     len += sprintf(page + off + len,
23                 "    DREG_AR_IDLE_CNT0   = %d\n", *DREG_AR_IDLE_CNT0 & 0xFFFF);
24     len += sprintf(page + off + len,
25                 "    DREG_AR_AIIDLE_CNT0 = %d\n", *DREG_AR_AIIDLE_CNT0 & 0xFFFF);
26     len += sprintf(page + off + len,
27                 "    DREG_AR_BE_CNT0     = %d\n", *DREG_AR_BE_CNT0 & 0xFFFF);
28     len += sprintf(page + off + len, "Channel 1\n");
29     len += sprintf(page + off + len, "  TX\n");
30     len += sprintf(page + off + len,
31                 "    DREG_AT_CELL1       = %d\n", *DREG_AT_CELL1 & 0xFFFF);
32     len += sprintf(page + off + len,
33                 "    DREG_AT_IDLE_CNT1   = %d\n", *DREG_AT_IDLE_CNT1 & 0xFFFF);
34     len += sprintf(page + off + len, "  RX\n");
35     len += sprintf(page + off + len,
36                 "    DREG_AR_CELL1       = %d\n", *DREG_AR_CELL1 & 0xFFFF);
37     len += sprintf(page + off + len,
38                 "    DREG_AR_IDLE_CNT1   = %d\n", *DREG_AR_IDLE_CNT1 & 0xFFFF);
39     len += sprintf(page + off + len,
40                 "    DREG_AR_AIIDLE_CNT1 = %d\n", *DREG_AR_AIIDLE_CNT1 & 0xFFFF);
41     len += sprintf(page + off + len,
42                 "    DREG_AR_BE_CNT1     = %d\n", *DREG_AR_BE_CNT1 & 0xFFFF);
43
44     return len;
45 }
46
47 int proc_read_stats(char *page, char **start, off_t off, int count, int *eof, void *data)
48 {
49     int len = 0;
50
51     int i, j;
52     struct connection *connection;
53     struct port *port;
54     int base;
55
56     len += sprintf(page + off, "ATM Stats:\n");
57
58     connection = ppe_dev.connection;
59     port = ppe_dev.port;
60     for ( i = 0; i < ATM_PORT_NUMBER; i++, port++ )
61     {
62         base = port->connection_base;
63         for ( j = 0; j < port->max_connections; j++, base++ )
64             if ( (port->connection_table & (1 << j))
65                 && connection[base].vcc != NULL )
66             {
67                 if ( connection[base].vcc->stats )
68                 {
69                     struct k_atm_aal_stats *stats = connection[base].vcc->stats;
70
71                     len += sprintf(page + off + len, "  VCC %d.%d.%d (stats)\n", i, connection[base].vcc->vpi, connection[base].vcc->vci);
72                     len += sprintf(page + off + len, "    rx      = %d\n", stats->rx.counter);
73                     len += sprintf(page + off + len, "    rx_err  = %d\n", stats->rx_err.counter);
74                     len += sprintf(page + off + len, "    rx_drop = %d\n", stats->rx_drop.counter);
75                     len += sprintf(page + off + len, "    tx      = %d\n", stats->tx.counter);
76                     len += sprintf(page + off + len, "    tx_err  = %d\n", stats->tx_err.counter);
77                 }
78                 else
79                     len += sprintf(page + off + len, "  VCC %d.%d.%d\n", i, connection[base].vcc->vpi, connection[base].vcc->vci);
80             }
81     }
82
83     return len;
84 }
85
86 void proc_file_create(void)
87 {
88     ppe_proc_dir = proc_mkdir("ppe", NULL);
89         create_proc_read_entry("idle_counter", 0, ppe_proc_dir, proc_read_idle_counter, NULL);
90     create_proc_read_entry("stats", 0, ppe_proc_dir, proc_read_stats, NULL);
91 }
92
93 void proc_file_delete(void)
94 {
95     remove_proc_entry("idle_counter", ppe_proc_dir);
96     remove_proc_entry("stats", ppe_proc_dir);
97     remove_proc_entry("ppe", NULL);
98 }