|
|
Power 6/32 Unix version 1.21
/* */
/* if_enp: ACC VERSAbus Ethernet controler (v/eiu) */
/* */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <net/if.h>
#include <net/netisr.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/ip_var.h>
#include <netinet/if_ether.h>
#include <machine/mtpr.h>
#include <tahoeif/if_enp.h>
#include <sys/buf.h>
#include <vba/vbavar.h>
#include <nlist.h>
#include "nstat.h"
struct nlist enpbufnl[] = {
# define N_RINGADDR 0
{ "_ring_addr"},
# define N_NUMENP 1
{ "_numenp" },
{ "" },
};
#define NENP 6
#define NOFRINGS 4
RING32 ring[NOFRINGS]; /* 4 rings per enp */
extern int kmem;
extern int vmem;
extern char *system;
extern char *vmemf;
int vmem;
char ringname[4][20] =
{
"toenp",
"hostfree",
"tohost",
"enpfree",
};
enpbuf(unit)
int unit;
{
int i, j, num;
RING32 *rp;
long ring_addr[NENP]; /* addrs of stat areas */
struct sockaddr_in *sin;
off_t numdev_memaddr;
off_t ring_memaddr;
static int getvm = 0;
if (!getvm) {
nlist(system, enpbufnl);
getvm = 1;
}
numdev_memaddr = enpbufnl[N_NUMENP].n_value;
ring_memaddr = enpbufnl[N_RINGADDR].n_value; /* versa bus address */
if (numdev_memaddr==0 || ring_memaddr == 0) {
printf("enpbuf: symbol not in namelist\n");
return(1);
}
klseek(kmem, numdev_memaddr, 0);
read(kmem, (char *)&num, sizeof (num));
if ((num < 0) || (num > NENP)) {
printf("enpbuf: invalid number of devices (num = %d)\n", num);
return(1);
}
if (num == 0) {
printf("enpbuf: no enp (driver) installed.\n");
return(1);
}
if (unit > num) {
printf("enpbuf: invalid device no.(unit=%d)\n", unit);
return;
} else
num = unit + 1; /* print only once for dev-> unit */
klseek(kmem, ring_memaddr, 0);
read(kmem, (char *)ring_addr, sizeof(long)*num);
vmem = open(vmemf, 0);
if (vmem < 0) {
printf("enpbuf: cannot open ");
perror(vmemf);
return(1);
}
lseek(vmem, (off_t)ring_addr[unit], 0);
read(vmem, (char *)&ring[0], sizeof(RING32)*4);
close(vmem);
printf("%-20s %-10s %-10s\n", "ring name", "rdidx", "wrtidx");
for (i = 0; i < NOFRINGS; i++) {
register int slot, addr;
printf("-------------------------------------\n");
rp = (RING32 *)&ring[i];
printf("%-20s %-10d %-10d\n", ringname[i],
rp->r_rdidx, rp->r_wrtidx);
printf("-------------------------------------\n");
for (slot = 0; slot < 32; slot++) {
addr = rp->r_slot[ slot ];
printf("%x ", addr );
}
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.