|
|
1.1 root 1: /* */
2: /* if_enp: ACC VERSAbus Ethernet controler (v/eiu) */
3: /* */
4:
5: #include <stdio.h>
6: #include <sys/types.h>
7: #include <sys/socket.h>
8: #include <sys/errno.h>
9:
10: #include <net/if.h>
11: #include <net/netisr.h>
12: #include <net/route.h>
13: #include <netinet/in.h>
14: #include <netinet/ip_var.h>
15: #include <netinet/if_ether.h>
16:
17: #include <machine/mtpr.h>
18: #include <tahoeif/if_enp.h>
19: #include <sys/buf.h>
20: #include <vba/vbavar.h>
21: #include <nlist.h>
22: #include "nstat.h"
23:
24: struct nlist enpbufnl[] = {
25: # define N_RINGADDR 0
26: { "_ring_addr"},
27: # define N_NUMENP 1
28: { "_numenp" },
29: { "" },
30: };
31:
32: #define NENP 6
33: #define NOFRINGS 4
34: RING32 ring[NOFRINGS]; /* 4 rings per enp */
35:
36: extern int kmem;
37: extern int vmem;
38: extern char *system;
39:
40: extern char *vmemf;
41: int vmem;
42:
43: char ringname[4][20] =
44: {
45: "toenp",
46: "hostfree",
47: "tohost",
48: "enpfree",
49: };
50:
51: enpbuf(unit)
52: int unit;
53: {
54: int i, j, num;
55:
56: RING32 *rp;
57: long ring_addr[NENP]; /* addrs of stat areas */
58: struct sockaddr_in *sin;
59:
60: off_t numdev_memaddr;
61: off_t ring_memaddr;
62:
63: static int getvm = 0;
64:
65: if (!getvm) {
66: nlist(system, enpbufnl);
67: getvm = 1;
68: }
69:
70: numdev_memaddr = enpbufnl[N_NUMENP].n_value;
71: ring_memaddr = enpbufnl[N_RINGADDR].n_value; /* versa bus address */
72:
73: if (numdev_memaddr==0 || ring_memaddr == 0) {
74: printf("enpbuf: symbol not in namelist\n");
75: return(1);
76: }
77:
78: klseek(kmem, numdev_memaddr, 0);
79: read(kmem, (char *)&num, sizeof (num));
80:
81: if ((num < 0) || (num > NENP)) {
82: printf("enpbuf: invalid number of devices (num = %d)\n", num);
83: return(1);
84: }
85: if (num == 0) {
86: printf("enpbuf: no enp (driver) installed.\n");
87: return(1);
88: }
89: if (unit > num) {
90: printf("enpbuf: invalid device no.(unit=%d)\n", unit);
91: return;
92: } else
93: num = unit + 1; /* print only once for dev-> unit */
94:
95: klseek(kmem, ring_memaddr, 0);
96: read(kmem, (char *)ring_addr, sizeof(long)*num);
97:
98: vmem = open(vmemf, 0);
99: if (vmem < 0) {
100: printf("enpbuf: cannot open ");
101: perror(vmemf);
102: return(1);
103: }
104: lseek(vmem, (off_t)ring_addr[unit], 0);
105: read(vmem, (char *)&ring[0], sizeof(RING32)*4);
106:
107: close(vmem);
108:
109: printf("%-20s %-10s %-10s\n", "ring name", "rdidx", "wrtidx");
110:
111: for (i = 0; i < NOFRINGS; i++) {
112: register int slot, addr;
113:
114: printf("-------------------------------------\n");
115: rp = (RING32 *)&ring[i];
116: printf("%-20s %-10d %-10d\n", ringname[i],
117: rp->r_rdidx, rp->r_wrtidx);
118: printf("-------------------------------------\n");
119: for (slot = 0; slot < 32; slot++) {
120: addr = rp->r_slot[ slot ];
121: printf("%x ", addr );
122: }
123: }
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.