From owner-svn-src-all@FreeBSD.ORG Tue Apr 6 01:17:47 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D0BD3106564A; Tue, 6 Apr 2010 01:17:47 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BD0438FC0C; Tue, 6 Apr 2010 01:17:47 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o361HlmG001992; Tue, 6 Apr 2010 01:17:47 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o361Hl2L001987; Tue, 6 Apr 2010 01:17:47 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201004060117.o361Hl2L001987@svn.freebsd.org> From: Navdeep Parhar Date: Tue, 6 Apr 2010 01:17:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r206237 - stable/7/usr.sbin/cxgbtool X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Apr 2010 01:17:48 -0000 Author: np Date: Tue Apr 6 01:17:47 2010 New Revision: 206237 URL: http://svn.freebsd.org/changeset/base/206237 Log: MFC r189643,r194928,r204267 r189643: commands to fetch uP logic analyzer and IOQs information. r194928: "stdio" mode. r204267: Allow cxgbtool to build with WARNS=6 Modified: stable/7/usr.sbin/cxgbtool/cxgbtool.c stable/7/usr.sbin/cxgbtool/reg_defs.c stable/7/usr.sbin/cxgbtool/reg_defs_t3.c stable/7/usr.sbin/cxgbtool/reg_defs_t3b.c stable/7/usr.sbin/cxgbtool/reg_defs_t3c.c stable/7/usr.sbin/cxgbtool/version.h Directory Properties: stable/7/usr.sbin/cxgbtool/ (props changed) Modified: stable/7/usr.sbin/cxgbtool/cxgbtool.c ============================================================================== --- stable/7/usr.sbin/cxgbtool/cxgbtool.c Tue Apr 6 01:14:49 2010 (r206236) +++ stable/7/usr.sbin/cxgbtool/cxgbtool.c Tue Apr 6 01:17:47 2010 (r206237) @@ -1,6 +1,6 @@ /************************************************************************** -Copyright (c) 2007-2008, Chelsio Inc. +Copyright (c) 2007-2009, Chelsio Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -85,13 +85,16 @@ struct reg_info { static const char *progname; -static void __attribute__((noreturn)) usage(FILE *fp) +static void +usage(FILE *fp) { fprintf(fp, "Usage: %s [operation]\n", progname); fprintf(fp, "\tclearstats clear MAC statistics\n" "\tcontext show an SGE context\n" "\tdesc [] dump SGE descriptors\n" + "\tioqs dump uP IOQs\n" + "\tla dump uP logic analyzer info\n" "\tloadboot download boot image\n" "\tloadfw download firmware\n" "\tmdio \n" @@ -134,7 +137,8 @@ doit(const char *iff_name, unsigned long return ioctl(fd, cmd, data) < 0 ? -1 : 0; } -static int get_int_arg(const char *s, uint32_t *valp) +static int +get_int_arg(const char *s, uint32_t *valp) { char *p; @@ -170,11 +174,12 @@ write_reg(const char *iff_name, uint32_t err(1, "register write"); } -static int register_io(int argc, char *argv[], int start_arg, +static int +register_io(int argc, char *argv[], int start_arg, const char *iff_name) { char *p; - uint32_t addr, val = 0, write = 0; + uint32_t addr, val = 0, w = 0; if (argc != start_arg + 1) return -1; @@ -182,14 +187,14 @@ static int register_io(int argc, char *a if (p == argv[start_arg]) return -1; if (*p == '=' && p[1]) { val = strtoul(p + 1, &p, 0); - write = 1; + w = 1; } if (*p) { warnx("bad parameter \"%s\"", argv[start_arg]); return -1; } - if (write) + if (w) write_reg(iff_name, addr, val); else { val = read_reg(iff_name, addr); @@ -198,9 +203,9 @@ static int register_io(int argc, char *a return 0; } -static int mdio_io(int argc, char *argv[], int start_arg, const char *iff_name) +static int +mdio_io(int argc, char *argv[], int start_arg, const char *iff_name) { - struct ifreq ifr; struct ch_mii_data p; unsigned int cmd, phy_addr, reg, mmd, val; @@ -228,12 +233,14 @@ static int mdio_io(int argc, char *argv[ return 0; } -static inline uint32_t xtract(uint32_t val, int shift, int len) +static inline +uint32_t xtract(uint32_t val, int shift, int len) { return (val >> shift) & ((1 << len) - 1); } -static int dump_block_regs(const struct reg_info *reg_array, uint32_t *regs) +static int +dump_block_regs(const struct reg_info *reg_array, uint32_t *regs) { uint32_t reg_val = 0; // silence compiler warning @@ -252,7 +259,8 @@ static int dump_block_regs(const struct return 1; } -static int dump_regs_t2(int argc, char *argv[], int start_arg, uint32_t *regs) +static int +dump_regs_t2(int argc, char *argv[], int start_arg, uint32_t *regs) { int match = 0; char *block_name = NULL; @@ -290,8 +298,8 @@ static int dump_regs_t2(int argc, char * } #if defined(CONFIG_T3_REGS) -static int dump_regs_t3(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3(int argc, char *argv[], int start_arg, uint32_t *regs, int is_pcie) { int match = 0; char *block_name = NULL; @@ -351,8 +359,9 @@ static int dump_regs_t3(int argc, char * return 0; } -static int dump_regs_t3b(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3b(int argc, char *argv[], int start_arg, uint32_t *regs, + int is_pcie) { int match = 0; char *block_name = NULL; @@ -412,8 +421,9 @@ static int dump_regs_t3b(int argc, char return 0; } -static int dump_regs_t3c(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3c(int argc, char *argv[], int start_arg, uint32_t *regs, + int is_pcie) { int match = 0; char *block_name = NULL; @@ -477,7 +487,7 @@ static int dump_regs_t3c(int argc, char static int dump_regs(int argc, char *argv[], int start_arg, const char *iff_name) { - int i, vers, revision, is_pcie; + int vers, revision, is_pcie; struct ch_ifconf_regs regs; regs.len = REGDUMP_SIZE; @@ -512,7 +522,8 @@ dump_regs(int argc, char *argv[], int st return 0; } -static int t3_meminfo(const uint32_t *regs) +static int +t3_meminfo(const uint32_t *regs) { enum { SG_EGR_CNTX_BADDR = 0x58, @@ -590,11 +601,16 @@ static int t3_meminfo(const uint32_t *re return 0; } -static int meminfo(int argc, char *argv[], int start_arg, const char *iff_name) +static int +meminfo(int argc, char *argv[], int start_arg, const char *iff_name) { int vers; struct ch_ifconf_regs regs; + (void) argc; + (void) argv; + (void) start_arg; + regs.len = REGDUMP_SIZE; if ((regs.data = malloc(regs.len)) == NULL) err(1, "can't malloc"); @@ -610,11 +626,11 @@ static int meminfo(int argc, char *argv[ return 0; } -static int mtu_tab_op(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +mtu_tab_op(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_mtus m; - int i; + unsigned int i; if (argc == start_arg) { if (doit(iff_name, CHELSIO_GETMTUTAB, &m) < 0) @@ -647,13 +663,14 @@ static int mtu_tab_op(int argc, char *ar } #ifdef CHELSIO_INTERNAL -static void show_egress_cntxt(uint32_t data[]) +static void +show_egress_cntxt(uint32_t data[]) { printf("credits: %u\n", data[0] & 0x7fff); printf("GTS: %u\n", (data[0] >> 15) & 1); printf("index: %u\n", data[0] >> 16); printf("queue size: %u\n", data[1] & 0xffff); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((data[1] >> 16) | ((uint64_t)data[2] << 16) | (((uint64_t)data[3] & 0xf) << 48)) << 12); printf("rsp queue #: %u\n", (data[3] >> 4) & 7); @@ -665,24 +682,26 @@ static void show_egress_cntxt(uint32_t d printf("valid: %u\n", (data[3] >> 31) & 1); } -static void show_fl_cntxt(uint32_t data[]) +static void +show_fl_cntxt(uint32_t data[]) { - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[0] | ((uint64_t)data[1] & 0xfffff) << 32) << 12); printf("index: %u\n", (data[1] >> 20) | ((data[2] & 0xf) << 12)); printf("queue size: %u\n", (data[2] >> 4) & 0xffff); printf("generation: %u\n", (data[2] >> 20) & 1); printf("entry size: %u\n", - ((data[2] >> 21) & 0x7ff) | (data[3] & 0x1fffff)); + (data[2] >> 21) | (data[3] & 0x1fffff) << 11); printf("congest thr: %u\n", (data[3] >> 21) & 0x3ff); printf("GTS: %u\n", (data[3] >> 31) & 1); } -static void show_response_cntxt(uint32_t data[]) +static void +show_response_cntxt(uint32_t data[]) { printf("index: %u\n", data[0] & 0xffff); printf("size: %u\n", data[0] >> 16); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[1] | ((uint64_t)data[2] & 0xfffff) << 32) << 12); printf("MSI-X/RspQ: %u\n", (data[2] >> 20) & 0x3f); printf("intr enable: %u\n", (data[2] >> 26) & 1); @@ -692,11 +711,12 @@ static void show_response_cntxt(uint32_t printf("FL threshold: %u\n", data[3]); } -static void show_cq_cntxt(uint32_t data[]) +static void +show_cq_cntxt(uint32_t data[]) { printf("index: %u\n", data[0] & 0xffff); printf("size: %u\n", data[0] >> 16); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[1] | ((uint64_t)data[2] & 0xfffff) << 32) << 12); printf("rsp queue #: %u\n", (data[2] >> 20) & 0x3f); printf("AN: %u\n", (data[2] >> 26) & 1); @@ -708,8 +728,8 @@ static void show_cq_cntxt(uint32_t data[ printf("credit threshold: %u\n", data[3] >> 16); } -static int get_sge_context(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +get_sge_context(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_cntxt ctx; @@ -748,8 +768,8 @@ static int get_sge_context(int argc, cha #define ntohll(x) be64toh((x)) -static int get_sge_desc(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +get_sge_desc(int argc, char *argv[], int start_arg, const char *iff_name) { uint64_t *p, wr_hdr; unsigned int n = 1, qset, qnum; @@ -794,7 +814,8 @@ static int get_sge_desc(int argc, char * } #endif -static int get_tcb2(int argc, char *argv[], int start_arg, const char *iff_name) +static int +get_tcb2(int argc, char *argv[], int start_arg, const char *iff_name) { uint64_t *d; unsigned int i; @@ -833,8 +854,9 @@ static int get_tcb2(int argc, char *argv return 0; } -static int get_pm_page_spec(const char *s, unsigned int *page_size, - unsigned int *num_pages) +static int +get_pm_page_spec(const char *s, unsigned int *page_size, + unsigned int *num_pages) { char *p; unsigned long val; @@ -852,7 +874,8 @@ static int get_pm_page_spec(const char * return *p; } -static int conf_pm(int argc, char *argv[], int start_arg, const char *iff_name) +static int +conf_pm(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_pm pm; @@ -882,8 +905,8 @@ static int conf_pm(int argc, char *argv[ } #ifdef CHELSIO_INTERNAL -static int dump_tcam(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +dump_tcam(int argc, char *argv[], int start_arg, const char *iff_name) { unsigned int nwords; struct ch_tcam_word op; @@ -905,7 +928,8 @@ static int dump_tcam(int argc, char *arg return 0; } -static void hexdump_8b(unsigned int start, uint64_t *data, unsigned int len) +static void +hexdump_8b(unsigned int start, uint64_t *data, unsigned int len) { int i; @@ -918,8 +942,8 @@ static void hexdump_8b(unsigned int star } } -static int dump_mc7(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +dump_mc7(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_mem_range mem; unsigned int mem_id, addr, len; @@ -957,10 +981,11 @@ static int dump_mc7(int argc, char *argv } #endif -/* Max FW size is 32K including version, +4 bytes for the checksum. */ -#define MAX_FW_IMAGE_SIZE (32768 + 4) +/* Max FW size is 64K including version, +4 bytes for the checksum. */ +#define MAX_FW_IMAGE_SIZE (64 * 1024) -static int load_fw(int argc, char *argv[], int start_arg, const char *iff_name) +static int +load_fw(int argc, char *argv[], int start_arg, const char *iff_name) { int fd, len; struct ch_mem_range op; @@ -977,12 +1002,13 @@ static int load_fw(int argc, char *argv[ if (!op.buf) err(1, "load firmware"); - op.len = read(fd, op.buf, MAX_FW_IMAGE_SIZE + 1); - if (op.len < 0) + len = read(fd, op.buf, MAX_FW_IMAGE_SIZE + 1); + if (len < 0) err(1, "load firmware"); - if (op.len > MAX_FW_IMAGE_SIZE) + if (len > MAX_FW_IMAGE_SIZE) errx(1, "FW image too large"); + op.len = len; if (doit(iff_name, CHELSIO_LOAD_FW, &op) < 0) err(1, "load firmware"); return 0; @@ -991,8 +1017,8 @@ static int load_fw(int argc, char *argv[ /* Max BOOT size is 255*512 bytes including the BIOS boot ROM basic header */ #define MAX_BOOT_IMAGE_SIZE (0xff * 512) -static int load_boot(int argc, char *argv[], - int start_arg, const char *iff_name) +static int +load_boot(int argc, char *argv[], int start_arg, const char *iff_name) { int fd, len; struct ch_mem_range op; @@ -1022,7 +1048,8 @@ static int load_boot(int argc, char *arg return 0; } -static int dump_proto_sram(const char *iff_name) +static int +dump_proto_sram(const char *iff_name) { int i, j; uint8_t buf[PROTO_SRAM_SIZE]; @@ -1052,15 +1079,20 @@ static int dump_proto_sram(const char *i return 0; } -static int proto_sram_op(int argc, char *argv[], int start_arg, +static int +proto_sram_op(int argc, char *argv[], int start_arg, const char *iff_name) { + (void) argv; + (void) start_arg; + if (argc == start_arg) return dump_proto_sram(iff_name); return -1; } -static int dump_qset_params(const char *iff_name) +static int +dump_qset_params(const char *iff_name) { struct ch_qset_params qp; @@ -1082,10 +1114,10 @@ static int dump_qset_params(const char * return 0; } -static int qset_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +qset_config(int argc, char *argv[], int start_arg, const char *iff_name) { - struct ch_qset_params qp; + (void) argv; if (argc == start_arg) return dump_qset_params(iff_name); @@ -1093,11 +1125,13 @@ static int qset_config(int argc, char *a return -1; } -static int qset_num_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +qset_num_config(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_reg reg; + (void) argv; + if (argc == start_arg) { if (doit(iff_name, CHELSIO_GET_QSET_NUM, ®) < 0) err(1, "get qsets"); @@ -1111,7 +1145,8 @@ static int qset_num_config(int argc, cha /* * Parse a string containing an IP address with an optional network prefix. */ -static int parse_ipaddr(const char *s, uint32_t *addr, uint32_t *mask) +static int +parse_ipaddr(const char *s, uint32_t *addr, uint32_t *mask) { char *p, *slash; struct in_addr ia; @@ -1141,7 +1176,8 @@ static int parse_ipaddr(const char *s, u /* * Parse a string containing a value and an optional colon separated mask. */ -static int parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask) +static int +parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask) { char *p; @@ -1154,14 +1190,15 @@ static int parse_val_mask_param(const ch return *p ? -1 : 0; } -static int parse_trace_param(const char *s, uint32_t *val, uint32_t *mask) +static int +parse_trace_param(const char *s, uint32_t *val, uint32_t *mask) { return strchr(s, '.') ? parse_ipaddr(s, val, mask) : parse_val_mask_param(s, val, mask); } -static int trace_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +trace_config(int argc, char *argv[], int start_arg, const char *iff_name) { uint32_t val, mask; struct ch_trace trace; @@ -1236,7 +1273,8 @@ static int trace_config(int argc, char * return 0; } -static int get_sched_param(int argc, char *argv[], int pos, unsigned int *valp) +static int +get_sched_param(int argc, char *argv[], int pos, unsigned int *valp) { if (pos + 1 >= argc) errx(1, "missing value for %s", argv[pos]); @@ -1245,7 +1283,8 @@ static int get_sched_param(int argc, cha return 0; } -static int tx_sched(int argc, char *argv[], int start_arg, const char *iff_name) +static int +tx_sched(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_hw_sched op; unsigned int idx, val; @@ -1291,7 +1330,8 @@ static int tx_sched(int argc, char *argv return 0; } -static int pktsched(int argc, char *argv[], int start_arg, const char *iff_name) +static int +pktsched(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_pktsched_params op; unsigned int idx, min = -1, max, binding = -1; @@ -1330,35 +1370,101 @@ static int pktsched(int argc, char *argv return 0; } -static int clear_stats(int argc, char *argv[], int start_arg, - const char *iff_name) + +static int +clear_stats(int argc, char *argv[], int start_arg, const char *iff_name) { + (void) argc; + (void) argv; + (void) start_arg; + if (doit(iff_name, CHELSIO_CLEAR_STATS, NULL) < 0) err(1, "clearstats"); return 0; } -int main(int argc, char *argv[]) +static int +get_up_la(int argc, char *argv[], int start_arg, const char *iff_name) { - int r = -1; - const char *iff_name; + struct ch_up_la la; + int i, idx, max_idx, entries; - progname = argv[0]; + (void) argc; + (void) argv; + (void) start_arg; + + la.stopped = 0; + la.idx = -1; + la.bufsize = LA_BUFSIZE; + la.data = malloc(la.bufsize); + if (!la.data) + err(1, "uP_LA malloc"); + + if (doit(iff_name, CHELSIO_GET_UP_LA, &la) < 0) + err(1, "uP_LA"); + + if (la.stopped) + printf("LA is not running\n"); + + entries = la.bufsize / 4; + idx = (int)la.idx; + max_idx = (entries / 4) - 1; + for (i = 0; i < max_idx; i++) { + printf("%04x %08x %08x\n", + la.data[idx], la.data[idx+2], la.data[idx+1]); + idx = (idx + 4) & (entries - 1); + } - if (argc == 2) { - if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) - usage(stdout); - if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - exit(0); - } + return 0; +} + +static int +get_up_ioqs(int argc, char *argv[], int start_arg, const char *iff_name) +{ + struct ch_up_ioqs ioqs; + int i, entries; + + (void) argc; + (void) argv; + (void) start_arg; + + bzero(&ioqs, sizeof(ioqs)); + ioqs.bufsize = IOQS_BUFSIZE; + ioqs.data = malloc(IOQS_BUFSIZE); + if (!ioqs.data) + err(1, "uP_IOQs malloc"); + + if (doit(iff_name, CHELSIO_GET_UP_IOQS, &ioqs) < 0) + err(1, "uP_IOQs"); + + printf("ioq_rx_enable : 0x%08x\n", ioqs.ioq_rx_enable); + printf("ioq_tx_enable : 0x%08x\n", ioqs.ioq_tx_enable); + printf("ioq_rx_status : 0x%08x\n", ioqs.ioq_rx_status); + printf("ioq_tx_status : 0x%08x\n", ioqs.ioq_tx_status); + + entries = ioqs.bufsize / sizeof(struct t3_ioq_entry); + for (i = 0; i < entries; i++) { + printf("\nioq[%d].cp : 0x%08x\n", i, + ioqs.data[i].ioq_cp); + printf("ioq[%d].pp : 0x%08x\n", i, + ioqs.data[i].ioq_pp); + printf("ioq[%d].alen : 0x%08x\n", i, + ioqs.data[i].ioq_alen); + printf("ioq[%d].stats : 0x%08x\n", i, + ioqs.data[i].ioq_stats); + printf(" sop %u\n", ioqs.data[i].ioq_stats >> 16); + printf(" eop %u\n", ioqs.data[i].ioq_stats & 0xFFFF); } - if (argc < 3) usage(stderr); + return 0; +} + +static int +run_cmd(int argc, char *argv[], const char *iff_name) +{ + int r = -1; - iff_name = argv[1]; if (!strcmp(argv[2], "reg")) r = register_io(argc, argv, 3, iff_name); else if (!strcmp(argv[2], "mdio")) @@ -1397,9 +1503,92 @@ int main(int argc, char *argv[]) r = get_tcb2(argc, argv, 3, iff_name); else if (!strcmp(argv[2], "clearstats")) r = clear_stats(argc, argv, 3, iff_name); + else if (!strcmp(argv[2], "la")) + r = get_up_la(argc, argv, 3, iff_name); + else if (!strcmp(argv[2], "ioqs")) + r = get_up_ioqs(argc, argv, 3, iff_name); if (r == -1) usage(stderr); - return 0; + return (0); +} + +static int +run_cmd_loop(int argc, char *argv[], const char *iff_name) +{ + int n; + unsigned int i; + char buf[64]; + char *args[8], *s; + + (void) argc; + args[0] = argv[0]; + args[1] = argv[1]; + + /* + * Fairly simplistic loop. Displays a "> " prompt and processes any + * input as a cxgbtool command. You're supposed to enter only the part + * after "cxgbtool cxgbX". Use "quit" or "exit" to exit. Any error in + * the command will also terminate cxgbtool. + */ + for (;;) { + fprintf(stdout, "> "); + fflush(stdout); + n = read(STDIN_FILENO, buf, sizeof(buf) - 1); + if (n <= 0) + return (0); + + if (buf[--n] != '\n') + continue; + else + buf[n] = 0; + + s = &buf[0]; + for (i = 2; i < sizeof(args)/sizeof(args[0]) - 1; i++) { + while (s && (*s == ' ' || *s == '\t')) + s++; + if ((args[i] = strsep(&s, " \t")) == NULL) + break; + } + args[sizeof(args)/sizeof(args[0]) - 1] = 0; + + if (!strcmp(args[2], "quit") || !strcmp(args[2], "exit")) + return (0); + + (void) run_cmd(i, args, iff_name); + } + + /* Can't really get here */ + return (0); +} + +int +main(int argc, char *argv[]) +{ + int r = -1; + const char *iff_name; + + progname = argv[0]; + + if (argc == 2) { + if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) + usage(stdout); + if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) { + printf("%s version %s\n", PROGNAME, VERSION); + printf("%s\n", COPYRIGHT); + exit(0); + } + } + + if (argc < 3) usage(stderr); + + iff_name = argv[1]; + + if (argc == 3 && !strcmp(argv[2], "stdio")) + r = run_cmd_loop(argc, argv, iff_name); + else + r = run_cmd(argc, argv, iff_name); + + return (r); } Modified: stable/7/usr.sbin/cxgbtool/reg_defs.c ============================================================================== --- stable/7/usr.sbin/cxgbtool/reg_defs.c Tue Apr 6 01:14:49 2010 (r206236) +++ stable/7/usr.sbin/cxgbtool/reg_defs.c Tue Apr 6 01:17:47 2010 (r206237) @@ -106,7 +106,7 @@ struct reg_info sge_regs[] = { { "Packet_Too_Big", 3, 1 }, { "Packet_Mismatch", 4, 1 }, { "SG_RESPACCUTIMER", 0xc0, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc3_regs[] = { @@ -196,7 +196,7 @@ struct reg_info mc3_regs[] = { { "MC3_Uncorr_Err", 1, 1 }, { "MC3_Parity_Err", 2, 8 }, { "MC3_Addr_Err", 10, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc4_regs[] = { @@ -276,7 +276,7 @@ struct reg_info mc4_regs[] = { { "MC4_Corr_Err", 0, 1 }, { "MC4_Uncorr_Err", 1, 1 }, { "MC4_Addr_Err", 2, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tpi_regs[] = { @@ -290,7 +290,7 @@ struct reg_info tpi_regs[] = { { "INT_DIR", 31, 1 }, { "TPI_PAR", 0x29c, 0 }, { "TPIPAR", 0, 7 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tp_regs[] = { @@ -509,7 +509,7 @@ struct reg_info tp_regs[] = { { "DROP_TICKS_CNT", 4, 26 }, { "NUM_PKTS_DROPPED", 0, 4 }, { "TP_TX_DROP_COUNT", 0x4bc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info rat_regs[] = { @@ -532,7 +532,7 @@ struct reg_info rat_regs[] = { { "CspiFramingError", 1, 1 }, { "SgeFramingError", 2, 1 }, { "TpFramingError", 3, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cspi_regs[] = { @@ -560,7 +560,7 @@ struct reg_info cspi_regs[] = { { "TXDrop", 2, 1 }, { "RXOverflow", 3, 1 }, { "RAMParityErr", 4, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info espi_regs[] = { @@ -660,7 +660,7 @@ struct reg_info espi_regs[] = { { "Error_Ack", 9, 1 }, { "Unmapped_Err", 10, 1 }, { "Transaction_Timer", 16, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp_regs[] = { @@ -682,7 +682,7 @@ struct reg_info ulp_regs[] = { { "Pm_E2C_Wrt_Full", 24, 1 }, { "Pm_C2E_Wrt_Full", 25, 1 }, { "ULP_PIO_CTRL", 0x998, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pl_regs[] = { @@ -712,7 +712,7 @@ struct reg_info pl_regs[] = { { "PL_Intr_CSPI", 9, 1 }, { "PL_Intr_PCIX", 10, 1 }, { "PL_Intr_EXT", 11, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc5_regs[] = { @@ -833,5 +833,5 @@ struct reg_info mc5_regs[] = { { "MC5_DATA_WRITE_CMD", 0xcf4, 0 }, { "MC5_DATA_READ_CMD", 0xcf8, 0 }, { "MC5_MASK_WRITE_CMD", 0xcfc, 0 }, - { NULL } + { NULL, 0, 0 } }; Modified: stable/7/usr.sbin/cxgbtool/reg_defs_t3.c ============================================================================== --- stable/7/usr.sbin/cxgbtool/reg_defs_t3.c Tue Apr 6 01:14:49 2010 (r206236) +++ stable/7/usr.sbin/cxgbtool/reg_defs_t3.c Tue Apr 6 01:17:47 2010 (r206237) @@ -140,7 +140,7 @@ struct reg_info sge3_regs[] = { { "DrbPriThrsh", 0, 16 }, { "SG_DEBUG_INDEX", 0x78, 0 }, { "SG_DEBUG_DATA", 0x7c, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pcix1_regs[] = { @@ -212,7 +212,7 @@ struct reg_info pcix1_regs[] = { { "WakeUp0", 2, 1 }, { "SleepMode1", 1, 1 }, { "SleepMode0", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pcie0_regs[] = { @@ -411,7 +411,7 @@ struct reg_info pcie0_regs[] = { { "BISTDone", 24, 8 }, { "BISTCycleThresh", 3, 16 }, { "BISTMode", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3dbg_regs[] = { @@ -557,7 +557,7 @@ struct reg_info t3dbg_regs[] = { { "PMON_CDEL_MANUAL", 4, 1 }, { "PMON_MANUAL", 1, 1 }, { "PMON_AUTO", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_pmrx_regs[] = { @@ -674,7 +674,7 @@ struct reg_info mc7_pmrx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_pmtx_regs[] = { @@ -791,7 +791,7 @@ struct reg_info mc7_pmtx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_cm_regs[] = { @@ -908,7 +908,7 @@ struct reg_info mc7_cm_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cim_regs[] = { @@ -1024,7 +1024,7 @@ struct reg_info cim_regs[] = { { "CIM_CDEBUGDATA", 0x2d0, 0 }, { "CDebugDataH", 16, 16 }, { "CDebugDataL", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tp1_regs[] = { @@ -1384,7 +1384,7 @@ struct reg_info tp1_regs[] = { { "TP_EMBED_OP_FIELD3", 0x4f4, 0 }, { "TP_EMBED_OP_FIELD4", 0x4f8, 0 }, { "TP_EMBED_OP_FIELD5", 0x4fc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp2_rx_regs[] = { @@ -1428,7 +1428,7 @@ struct reg_info ulp2_rx_regs[] = { { "ULPRX_RQ_ULIMIT", 0x538, 0 }, { "ULPRX_PBL_LLIMIT", 0x53c, 0 }, { "ULPRX_PBL_ULIMIT", 0x540, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp2_tx_regs[] = { @@ -1456,7 +1456,7 @@ struct reg_info ulp2_tx_regs[] = { { "ULPTX_DMA_WEIGHT", 0x5ac, 0 }, { "D1_WEIGHT", 16, 16 }, { "D0_WEIGHT", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pm1_rx_regs[] = { @@ -1500,7 +1500,7 @@ struct reg_info pm1_rx_regs[] = { { "ocspi1_ofifo2x_Tx_framing_error", 6, 1 }, { "iespi_par_error", 3, 3 }, { "ocspi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pm1_tx_regs[] = { @@ -1544,7 +1544,7 @@ struct reg_info pm1_tx_regs[] = { { "oespi1_ofifo2x_Tx_framing_error", 6, 1 }, { "icspi_par_error", 3, 3 }, { "oespi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mps0_regs[] = { @@ -1585,7 +1585,7 @@ struct reg_info mps0_regs[] = { { "RXTpParErr", 4, 2 }, { "TX1TpParErr", 2, 2 }, { "TX0TpParErr", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cpl_switch_regs[] = { @@ -1616,7 +1616,7 @@ struct reg_info cpl_switch_regs[] = { { "cpl_map_tbl_idx", 0, 8 }, { "CPL_MAP_TBL_DATA", 0x65c, 0 }, { "cpl_map_tbl_data", 0, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info smb0_regs[] = { @@ -1682,7 +1682,7 @@ struct reg_info smb0_regs[] = { { "DebugDataL", 0, 16 }, { "SMB_DEBUG_LA", 0x69c, 0 }, { "DebugLAReqAddr", 0, 10 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info i2cm0_regs[] = { @@ -1695,7 +1695,7 @@ struct reg_info i2cm0_regs[] = { { "Ack", 30, 1 }, { "Cont", 1, 1 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mi1_regs[] = { @@ -1714,7 +1714,7 @@ struct reg_info mi1_regs[] = { { "Busy", 31, 1 }, { "Inc", 2, 1 }, { "Op", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info jm1_regs[] = { @@ -1727,7 +1727,7 @@ struct reg_info jm1_regs[] = { { "JM_OP", 0x6cc, 0 }, { "Busy", 31, 1 }, { "Cnt", 0, 5 }, *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***