|
|
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.