/* * Configure and start event timers. */ void cpu_initclocks_bsp(void) { int base, div; timer[0] = et_find(timername[0], ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (timer[0] == NULL) timer[0] = et_find(NULL, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (timer[0] == NULL) panic("No usable event timer found!"); et_init(timer[0], timer1cb, NULL, NULL); timer[1] = et_find(timername[1][0] ? timername[1] : NULL, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (timer[1]) et_init(timer[1], timer2cb, NULL, NULL); /* * We honor the requested 'hz' value. * We want to run stathz in the neighborhood of 128hz. * We would like profhz to run as often as possible. */ if (singlemul == 0) { if (hz >= 1500 || (hz % 128) == 0) singlemul = 1; else if (hz >= 750) singlemul = 2; else singlemul = 4; } if (timer[1] == NULL) { base = round_freq(timer[0], hz * singlemul); singlemul = max((base + hz / 2) / hz, 1); hz = (base + singlemul / 2) / singlemul; if (base <= 128) stathz = base; else { div = base / 128; if (div >= singlemul && (div % singlemul) == 0) div++; stathz = base / div; } profhz = stathz; while ((profhz + stathz) <= 128 * 64) profhz += stathz; profhz = round_freq(timer[0], profhz); } else { hz = round_freq(timer[0], hz); stathz = round_freq(timer[1], 127); profhz = round_freq(timer[1], stathz * 64); } tick = 1000000 / hz; ET_LOCK(); cpu_restartclocks(); ET_UNLOCK(); }
/* Report or change the active event timers hardware. */ static int sysctl_kern_eventtimer_timer1(SYSCTL_HANDLER_ARGS) { char buf[32]; struct eventtimer *et; int error; ET_LOCK(); et = timer[0]; snprintf(buf, sizeof(buf), "%s", et->et_name); ET_UNLOCK(); error = sysctl_handle_string(oidp, buf, sizeof(buf), req); ET_LOCK(); et = timer[0]; if (error != 0 || req->newptr == NULL || strcmp(buf, et->et_name) == 0) { ET_UNLOCK(); return (error); } et = et_find(buf, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (et == NULL) { ET_UNLOCK(); return (ENOENT); } timer1hz = 0; configtimer(0); et_free(timer[0]); timer[0] = et; et_init(timer[0], timer1cb, NULL, NULL); cpu_restartclocks(); ET_UNLOCK(); return (error); }
/* * Check that both timers are running with at least 1/4 of configured rate. * If not - replace the broken one. */ static void timercheck(void) { if (!timertest) return; timertest = 0; if (timerticks[0] * 4 < timer1hz) { printf("Event timer \"%s\" is dead.\n", timer[0]->et_name); timer1hz = 0; configtimer(0); et_ban(timer[0]); et_free(timer[0]); timer[0] = et_find(NULL, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (timer[0] == NULL) { timer2hz = 0; configtimer(1); et_free(timer[1]); timer[1] = NULL; timer[0] = timer[1]; } et_init(timer[0], timer1cb, NULL, NULL); cpu_restartclocks(); return; } if (timerticks[1] * 4 < timer2hz) { printf("Event timer \"%s\" is dead.\n", timer[1]->et_name); timer2hz = 0; configtimer(1); et_ban(timer[1]); et_free(timer[1]); timer[1] = et_find(NULL, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (timer[1] != NULL) et_init(timer[1], timer2cb, NULL, NULL); cpu_restartclocks(); return; } }
int et_iovar(char *name, int cmd, void *buf, int len, bool set) { struct ifreq ifr; et_var_t var; int s, ret = 0; /* open socket to kernel */ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); return errno; } /* get interface name if need */ if (name) { strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)-1); ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; } else et_find(s, &ifr); if (!*ifr.ifr_name) { perror("et interface not found"); ret = -1; goto err; } /* do it */ var.cmd = cmd; var.buf = buf; var.len = len; var.set = set; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { perror("ioctl"); ret = errno; } err: close(s); return ret; }
static int sysctl_kern_eventtimer_timer2(SYSCTL_HANDLER_ARGS) { char buf[32]; struct eventtimer *et; int error; ET_LOCK(); et = timer[1]; if (et == NULL) snprintf(buf, sizeof(buf), "NONE"); else snprintf(buf, sizeof(buf), "%s", et->et_name); ET_UNLOCK(); error = sysctl_handle_string(oidp, buf, sizeof(buf), req); ET_LOCK(); et = timer[1]; if (error != 0 || req->newptr == NULL || strcmp(buf, et ? et->et_name : "NONE") == 0) { ET_UNLOCK(); return (error); } et = et_find(buf, ET_FLAGS_PERIODIC, ET_FLAGS_PERIODIC); if (et == NULL && strcasecmp(buf, "NONE") != 0) { ET_UNLOCK(); return (ENOENT); } if (timer[1] != NULL) { timer2hz = 0; configtimer(1); et_free(timer[1]); } timer[1] = et; if (timer[1] != NULL) et_init(timer[1], timer2cb, NULL, NULL); cpu_restartclocks(); ET_UNLOCK(); return (error); }
int GetPhyStatus(void) { char switch_link_status[]="GGGGG"; struct ifreq ifr; int vecarg[5]; int s; char output[25]; if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) syserr("socket"); et_find(s, &ifr); if (!*ifr.ifr_name) { //printf("et interface not found\n"); return 0; } //Get Link Speed vecarg[0] = strtoul("0x1", NULL, 0) << 16;; vecarg[0] |= strtoul("0x4", NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); else { if( !(vecarg[1] & SWITCH_PORT_0_GIGA) ) memcpy(&switch_link_status[0], "M", 1); if( !(vecarg[1] & SWITCH_PORT_1_GIGA) ) memcpy(&switch_link_status[1], "M", 1); if( !(vecarg[1] & SWITCH_PORT_2_GIGA) ) memcpy(&switch_link_status[2], "M", 1); if( !(vecarg[1] & SWITCH_PORT_3_GIGA) ) memcpy(&switch_link_status[3], "M", 1); if( !(vecarg[1] & SWITCH_PORT_4_GIGA) ) memcpy(&switch_link_status[4], "M", 1); } //Get Link Status vecarg[0] = strtoul("0x1", NULL, 0) << 16;; vecarg[0] |= strtoul("0x0", NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); else { if( !(vecarg[1] & SWITCH_PORT_0_UP) ) memcpy(&switch_link_status[0], "X", 1); if( !(vecarg[1] & SWITCH_PORT_1_UP) ) memcpy(&switch_link_status[1], "X", 1); if( !(vecarg[1] & SWITCH_PORT_2_UP) ) memcpy(&switch_link_status[2], "X", 1); if( !(vecarg[1] & SWITCH_PORT_3_UP) ) memcpy(&switch_link_status[3], "X", 1); if( !(vecarg[1] & SWITCH_PORT_4_UP) ) memcpy(&switch_link_status[4], "X", 1); } sprintf(output, "W0=%c;L1=%c;L2=%c;L3=%c;L4=%c", switch_link_status[0], switch_link_status[1], switch_link_status[2], switch_link_status[3], switch_link_status[4]); puts(output); return 1; }
int main(int ac, char *av[]) { char *interface = NULL; struct ifreq ifr; char *endptr; int arg; int vecarg[VECLEN]; int s; static int optind; et_var_t var; if (ac < 2) usage(av[0]); optind = 1; if (av[1][0] == '-') { if ((av[1][1] != 'a') && (av[1][1] != 'i')) usage(av[0]); if (ac < 4) usage(av[0]); interface = av[2]; optind += 2; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) syserr("socket"); if (interface) strncpy(ifr.ifr_name, interface, sizeof (ifr.ifr_name)); else et_find(s, &ifr); if (!*ifr.ifr_name) { fprintf(stderr, "et interface not found\n"); exit(1); } if (strcmp(av[optind], "up") == 0) { if (ioctl(s, SIOCSETCUP, (caddr_t)&ifr) < 0) syserr("etcup"); } else if (strcmp(av[optind], "down") == 0) { if (ioctl(s, SIOCSETCDOWN, (caddr_t)&ifr) < 0) syserr("etcdown"); } else if (strcmp(av[optind], "loop") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCLOOP, (caddr_t)&ifr) < 0) syserr("etcloop"); } else if ((strcmp(av[optind], "dump") == 0) && (ac == 2)) { ifr.ifr_data = buf; if (ioctl(s, SIOCGETCDUMP, (caddr_t)&ifr) < 0) syserr("etcdump"); printf("%s\n", buf); } else if (strcmp(av[optind], "msglevel") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = strtol(av[optind + 1], &endptr, 0); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSETMSGLEVEL, (caddr_t)&ifr) < 0) syserr("etcsetmsglevel"); } else if (strcmp(av[optind], "promisc") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCPROMISC, (caddr_t)&ifr) < 0) syserr("etcpromisc"); } else if (strcmp(av[optind], "qos") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCQOS, (caddr_t)&ifr) < 0) syserr("etcqos"); } else if (strcmp(av[optind], "speed") == 0) { if (optind >= (ac -1)) usage(av[0]); if (strcmp(av[optind+1], "auto") == 0) arg = -1; else if (strcmp(av[optind+1], "10half") == 0) arg = 0; else if (strcmp(av[optind+1], "10full") == 0) arg = 1; else if (strcmp(av[optind+1], "100half") == 0) arg = 2; else if (strcmp(av[optind+1], "100full") == 0) arg = 3; else if (strcmp(av[optind+1], "1000full") == 0) arg = 5; else usage(av[0]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSPEED, (caddr_t)&ifr) < 0) syserr("etcspeed"); } else if (strcmp(av[optind], "phyrd") == 0) { int cmd = -1; if ((ac < (optind + 2)) || (ac > (optind + 3))) { usage(av[0]); } else if (ac == (optind + 3)) { /* PHY address provided */ vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16;; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; cmd = SIOCGETCPHYRD2; } else { /* "My" PHY address implied */ vecarg[0] = strtoul(av[optind + 1], NULL, 0); cmd = SIOCGETCPHYRD; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphyrd"); printf("0x%04x\n", vecarg[1]); } else if (strcmp(av[optind], "phywr") == 0) { int cmd = -1; if ((ac < (optind + 3)) || (ac > (optind + 4))) { usage(av[0]); } else if (ac == (optind + 4)) { vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16;; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; vecarg[1] = strtoul(av[optind + 3], NULL, 0); cmd = SIOCSETCPHYWR2; } else { vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); cmd = SIOCSETCPHYWR; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphywr"); } else if (strcmp(av[optind], "robord") == 0) { if (ac != (optind + 3)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16;; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); printf("0x%04x\n", vecarg[1]); } else if (strcmp(av[optind], "robowr") == 0) { if (ac != (optind + 4)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16;; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; vecarg[1] = strtoul(av[optind + 3], NULL, 0); ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCSETCROBOWR, (caddr_t)&ifr) < 0) syserr("etcrobowr"); } else if (strcmp(av[optind], "clear_dump") == 0) { if ((ac > (optind + 2))) usage(av[0]); var.set = 1; var.cmd = IOV_ET_CLEAR_DUMP; var.buf = NULL; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etccleardump"); } else if ((strcmp(av[optind], "pktc") == 0) || (strcmp(av[optind], "pktcbnd") == 0)) { /* Get pktc or pktcbnd */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = strcmp(av[optind], "pktc") == 0 ? IOV_PKTC : IOV_PKTCBND; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); if (!var.set) printf("%d\n", vecarg[0]); } else if ((strcmp(av[optind], "counters") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("counters"); var.cmd = IOV_COUNTERS; var.buf = buf; var.len = sizeof(buf); ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); printf("%s\n", buf); } else if ((strcmp(av[optind], "dump") == 0) && (ac > 2) && (strcmp(av[optind + 1], "ctf") == 0)) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctf"); var.cmd = IOV_DUMP_CTF; var.buf = buf; var.len = sizeof(buf); ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); printf("%s\n", buf); } else { if (strcmp(av[optind], "switch_mode") == 0) { int all = 0; /* GET case */ if (ac == (optind + 1)) { var.set = 0; vecarg[0] = VECLEN; all = 1; } else if (ac == (optind + 2)) { var.set = 0; vecarg[0] = strtoul(av[optind + 1], NULL, 0); all = (int)(vecarg[0] == VECLEN); } else { if (ac != (optind + 3)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); if (vecarg[1] > 3) usage(av[0]); var.set = 1; } var.len = VECLEN * sizeof(int); var.cmd = IOV_ET_POWER_SAVE_MODE; var.buf = &vecarg; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswitchmode"); if (!var.set) { if (all) printf("phy power save mode for all phys:" " %d %d %d %d %d \n", vecarg[0], vecarg[1], vecarg[2], vecarg[3], vecarg[4]); else printf("phy power save mode for phy %d mode %d\n", vecarg[0], vecarg[1]); } } else { usage(av[0]); } } return (0); }
int main(int ac, char *av[]) { char *interface = NULL; struct ifreq ifr; char *endptr; int arg; int vecarg[VECLEN]; int s; static int optind; et_var_t var; char *dbuf; int dbuf_len, dbuf_alloc = 0; if (ac < 2) usage(av[0]); optind = 1; if (av[1][0] == '-') { if ((av[1][1] != 'a') && (av[1][1] != 'i')) usage(av[0]); if (ac < 4) usage(av[0]); interface = av[2]; optind += 2; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) syserr("socket"); if (interface) { strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0'; } else et_find(s, &ifr); if (!*ifr.ifr_name) { fprintf(stderr, "et interface not found\n"); exit(1); } if (strcmp(av[optind], "up") == 0) { if (ioctl(s, SIOCSETCUP, (caddr_t)&ifr) < 0) syserr("etcup"); } else if (strcmp(av[optind], "down") == 0) { if (ioctl(s, SIOCSETCDOWN, (caddr_t)&ifr) < 0) syserr("etcdown"); } else if (strcmp(av[optind], "loop") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCLOOP, (caddr_t)&ifr) < 0) syserr("etcloop"); } else if ((strcmp(av[optind], "dump") == 0) && (optind == (ac - 1))) { DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.set = 0; var.cmd = IOV_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("etcdump"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if (strcmp(av[optind], "msglevel") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = strtol(av[optind + 1], &endptr, 0); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSETMSGLEVEL, (caddr_t)&ifr) < 0) syserr("etcsetmsglevel"); } else if (strcmp(av[optind], "promisc") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCPROMISC, (caddr_t)&ifr) < 0) syserr("etcpromisc"); } else if (strcmp(av[optind], "qos") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCQOS, (caddr_t)&ifr) < 0) syserr("etcqos"); } else if (strcmp(av[optind], "speed") == 0) { if (optind >= (ac -1)) usage(av[0]); if (strcmp(av[optind+1], "auto") == 0) arg = -1; else if (strcmp(av[optind+1], "10half") == 0) arg = 0; else if (strcmp(av[optind+1], "10full") == 0) arg = 1; else if (strcmp(av[optind+1], "100half") == 0) arg = 2; else if (strcmp(av[optind+1], "100full") == 0) arg = 3; else if (strcmp(av[optind+1], "1000full") == 0) arg = 5; else usage(av[0]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSPEED, (caddr_t)&ifr) < 0) syserr("etcspeed"); } else if (strcmp(av[optind], "phyrd") == 0) { int cmd = -1; if ((ac < (optind + 2)) || (ac > (optind + 3))) { usage(av[0]); } else if (ac == (optind + 3)) { /* PHY address provided */ vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; cmd = SIOCGETCPHYRD2; } else { /* "My" PHY address implied */ vecarg[0] = strtoul(av[optind + 1], NULL, 0); cmd = SIOCGETCPHYRD; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphyrd"); printf("0x%04x\n", vecarg[1]); } else if (strcmp(av[optind], "phywr") == 0) { int cmd = -1; if ((ac < (optind + 3)) || (ac > (optind + 4))) { usage(av[0]); } else if (ac == (optind + 4)) { vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; vecarg[1] = strtoul(av[optind + 3], NULL, 0); cmd = SIOCSETCPHYWR2; } else { vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); cmd = SIOCSETCPHYWR; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphywr"); } else if (strcmp(av[optind], "robord") == 0) { if ((ac != (optind + 3)) && (ac != (optind + 4))) usage(av[0]); vecarg[1] = 2; if (av[optind + 3]) vecarg[1] = strtoul(av[optind + 3], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. For SPI mode, " "the length can only be 1, 2, and 4 bytes.\n"); else printf("0x%0.*llx\n", (2*vecarg[1]), *((unsigned long long *)&vecarg[2])); } else if (strcmp(av[optind], "robowr") == 0) { if ((ac != (optind + 4)) && (ac != (optind + 5))) usage(av[0]); vecarg[1] = 2; if (av[optind + 4]) vecarg[1] = strtoul(av[optind + 4], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; *((unsigned long long *)&vecarg[2]) = strtoull(av[optind + 3], NULL, 0); ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCSETCROBOWR, (caddr_t)&ifr) < 0) syserr("etcrobowr"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. " "For SPI mode, the length can only be 1, 2, and 4 bytes.\n"); } else if (strcmp(av[optind], "macrd") == 0) { uint offset; if (ac != (optind + 2)) { usage(av[0]); } vecarg[0] = strtoul(av[optind + 1], NULL, 0); offset = vecarg[0]; var.set = 0; var.len = sizeof(int); var.cmd = IOV_MACRD; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcmacrd"); printf("Offset[0x%08x] = 0x%08x\n", offset, vecarg[0]); } else if (strcmp(av[optind], "macwr") == 0) { if (ac != (optind + 3)) { usage(av[0]); } vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); var.set = 1; var.len = 2 * sizeof(int); var.cmd = IOV_MACWR; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcmacwr"); } else if (strcmp(av[optind], "port_status") == 0) { if (ac >= (optind + 3)) usage(av[0]); var.set = 0; var.cmd = IOV_PORTSTATS; var.buf = buf; if (ac == (optind + 1) || (strcmp(av[optind+1], "all") == 0)) *(uint *)buf = 0xFF; else *(uint *)buf = atoi(av[optind + 1]); var.len = sizeof(buf); ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcportstats"); printf("%s\n", buf); } else if (strcmp(av[optind], "sw_mctbl") == 0) { if ((ac > (optind + 3))) usage(av[0]); if (ac == (optind + 1)) { *(uint *)buf = 0xff; } else if (ac == (optind + 3) && strcmp(av[optind+1], "port") == 0) { *(uint *)buf = 1 << 16; *(uint *)buf |= atoi(av[optind + 2]) & 0xffff; } else if (ac == (optind + 3) && strcmp(av[optind+1], "vid") == 0) { *(uint *)buf = atoi(av[optind + 2]) & 0xffff; } else { usage(av[0]); } var.set = 0; var.cmd = IOV_SW_MCTBL; var.buf = buf; var.len = sizeof(buf); ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswmctbl"); printf("%s\n", buf); } else if (strcmp(av[optind], "clear_dump") == 0) { if ((ac > (optind + 2))) usage(av[0]); var.set = 1; var.cmd = IOV_ET_CLEAR_DUMP; var.buf = NULL; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etccleardump"); } else if ((strcmp(av[optind], "pktc") == 0) || (strcmp(av[optind], "pktcbnd") == 0)) { /* Get pktc or pktcbnd */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = strcmp(av[optind], "pktc") == 0 ? IOV_PKTC : IOV_PKTCBND; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "quota") == 0) { if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXQUOTA; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("quota"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "rxlazyto") == 0) { /* rxlazy timeout */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXLAZYTO; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("rxlazyto"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "rxlazyfc") == 0) { /* rxlazy framecnt */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXLAZYFC; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("rxlazyfc"); if (!var.set) printf("%d\n", vecarg[0]); } else if ((strcmp(av[optind], "counters") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("counters"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_COUNTERS; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("counters"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if ((strcmp(av[optind], "dump") == 0) && (optind < (ac - 1))) { if (strcmp(av[optind + 1], "oops") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump oops"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_OOPS; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump oops"); } printf("done\n"); } else if (strcmp(av[optind + 1], "ctf") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctf"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTF; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctf"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "ctrace") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctrace"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTRACE; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctrace"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "fa") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump fa"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_FA_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump fa"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "fwd") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump fwd"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_FWDER; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump fwd"); } printf("%s\n", dbuf); } DUMP_BUF_FREE(dbuf_alloc, dbuf); #ifdef ET_INGRESS_QOS } else if ((strcmp(av[optind], "dma_rx_thresh") == 0) || (strcmp(av[optind], "dma_rx_policy") == 0)) { /* Get case */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = (strcmp(av[optind], "dma_rx_thresh") == 0) ? IOV_DMA_RX_THRESH : IOV_DMA_RX_POLICY; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("dma_rx_policy_usage"); if (!var.set) printf("%d\n", vecarg[0]); #endif /* ET_INGRESS_QOS */ } else if ((strcmp(av[optind], "cap") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("cap"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_CAP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("cap"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else { if (strcmp(av[optind], "switch_mode") == 0) { int all = 0; /* GET case */ if (ac == (optind + 1)) { var.set = 0; vecarg[0] = VECLEN; all = 1; } else if (ac == (optind + 2)) { var.set = 0; vecarg[0] = strtoul(av[optind + 1], NULL, 0); all = (int)(vecarg[0] == VECLEN); } else { if (ac != (optind + 3)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); if (vecarg[1] > 3) usage(av[0]); var.set = 1; } var.len = VECLEN * sizeof(int); var.cmd = IOV_ET_POWER_SAVE_MODE; var.buf = &vecarg; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswitchmode"); if (!var.set) { if (all) printf("phy power save mode for all phys:" " %d %d %d %d %d \n", vecarg[0], vecarg[1], vecarg[2], vecarg[3], vecarg[4]); else printf("phy power save mode for phy %d mode %d\n", vecarg[0], vecarg[1]); } } else { usage(av[0]); } } return (0); }