adds atm driver for ifxmips, code ported from wippies 2.6.16 gpl release. it compiles...
[openwrt/svn-archive/archive.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 }