Add Mellanox vendor class config space records access options (-R for read and -W for write). Example of usage:
vendstat -R 0x12345,0xffff <lid> - will read low 16 bits of config space record at address 0x12345 vendstat -W 0x12345,0,0xfff <lid> - will zero low 12 bits of config space record at address 0x12345 Signed-off-by: Sasha Khapyorsky <sas...@voltaire.com> --- infiniband-diags/src/vendstat.c | 45 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/infiniband-diags/src/vendstat.c b/infiniband-diags/src/vendstat.c index 0de5722..0add06c 100644 --- a/infiniband-diags/src/vendstat.c +++ b/infiniband-diags/src/vendstat.c @@ -144,6 +144,27 @@ static int do_vendor(ib_portid_t *portid, struct ibmad_port *srcport, return 0; } +static unsigned int conf_addr, conf_val, conf_mask; + +static void do_config_space_record(ib_portid_t *portid, unsigned set) +{ + is3_config_space_t cs; + + memset(&cs, 0, sizeof(cs)); + cs.record[0].address = htonl(conf_addr); + cs.record[0].data = htonl(conf_val); + cs.record[0].mask = htonl(conf_mask); + + if (do_vendor(portid, srcport, IB_MLX_VENDOR_CLASS, + set ? IB_MAD_METHOD_SET : IB_MAD_METHOD_GET, + IB_MLX_IS3_CONFIG_SPACE_ACCESS, 2 << 22 | 1 << 16, &cs)) + IBERROR("cannot %s config space record", set ? "set" : "get"); + + printf("Config space record at 0x%x: 0x%x\n", + ntohl(cs.record[0].address), + ntohl(cs.record[0].data & cs.record[0].mask)); +} + static void counter_groups_info(ib_portid_t * portid, int port) { char buf[1024]; @@ -203,6 +224,7 @@ static void config_counter_groups(ib_portid_t * portid, int port) } static int general_info, xmit_wait, counter_group_info, config_counter_group; +static unsigned int config_space_read, config_space_write; static int process_opt(void *context, int ch, char *optarg) { @@ -223,6 +245,22 @@ static int process_opt(void *context, int ch, char *optarg) if (ret != 2) return -1; break; + case 'R': + config_space_read = 1; + ret = sscanf(optarg, "%x,%x", &conf_addr, &conf_mask); + if (ret < 1) + return -1; + else if (ret == 1) + conf_mask = 0xffffffff; + break; + case 'W': + config_space_write = 1; + ret = sscanf(optarg, "%x,%x,%x", &conf_addr, &conf_val, &conf_mask); + if (ret < 2) + return -1; + else if (ret == 2) + conf_mask = 0xffffffff; + break; default: return -1; } @@ -244,6 +282,8 @@ int main(int argc, char **argv) {"w", 'w', 0, NULL, "show IS3 port xmit wait counters"}, {"i", 'i', 0, NULL, "show IS4 counter group info"}, {"c", 'c', 1, "<num,num>", "configure IS4 counter groups"}, + {"Read", 'R', 1, "<addr,mask>", "Read configuration space record at addr"}, + {"Write", 'W', 1, "<addr,val,mask>", "Write configuration space record at addr"}, {0} }; @@ -289,6 +329,11 @@ int main(int argc, char **argv) exit(0); } + if (config_space_read || config_space_write) { + do_config_space_record(&portid, config_space_write); + exit(0); + } + /* These are Mellanox specific vendor MADs */ /* but vendors change the VendorId so how know for sure ? */ /* Only General Info and Port Xmit Wait Counters */ -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html