2 * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
\r
3 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
\r
4 * Portions Copyright (c) 2008 Microsoft Corporation. All rights reserved.
\r
6 * This software is available to you under the OpenIB.org BSD license
\r
9 * Redistribution and use in source and binary forms, with or
\r
10 * without modification, are permitted provided that the following
\r
11 * conditions are met:
\r
13 * - Redistributions of source code must retain the above
\r
14 * copyright notice, this list of conditions and the following
\r
17 * - Redistributions in binary form must reproduce the above
\r
18 * copyright notice, this list of conditions and the following
\r
19 * disclaimer in the documentation and/or other materials
\r
20 * provided with the distribution.
\r
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
\r
26 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
\r
27 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
\r
28 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
\r
41 #include <iba/ib_types.h>
\r
42 #include <iba/ib_al.h>
\r
44 #include <complib/cl_device.h>
\r
46 #include <mthca/mthca_vc.h>
\r
49 #define VEND_ID_MELLNOX 0x02c9
\r
50 #define VEND_ID_VOLTAIRE 0x08f1
\r
53 /*******************************************************************
\r
54 *******************************************************************/
\r
57 void print64bit(ib_net64_t u64, BOOLEAN hexFormat){
\r
58 ib_net64_t mask = (1<<16)-1;
\r
62 tmp = (uint16_t)((u64>>(i*16))& mask);
\r
64 printf("%04x",cl_hton16(tmp));
\r
71 printf("%02d", tmp>>8);
\r
73 printf("%03d", tmp>>8);
\r
76 if((tmp&(mask<<8)) <100){
\r
77 printf("%02d", tmp&(mask<<8));
\r
79 printf("%03d", tmp&(mask<<8));
\r
86 void printGUID(char *title, ib_net64_t guid){
\r
88 print64bit(guid, TRUE);
\r
92 void printPortGID(ib_net64_t subnetPrefix, ib_net64_t portGuid){
\r
93 printf("\t\tGID[0]=");
\r
94 print64bit(subnetPrefix, TRUE);
\r
96 print64bit(portGuid, TRUE);
\r
101 void printPortLinkState(int portState){ //TODO: check that these are all the options and that they are correct
\r
104 printf("\t\tport_state=PORT_DOWN (%d)\n",portState);
\r
107 printf("\t\tport_state=PORT_INITIALIZE (%d)\n",portState);
\r
110 printf("\t\tport_state=PORT_ARMED (%d)\n",portState);
\r
113 printf("\t\tport_state=PORT_ACTIVE (%d)\n",portState);
\r
116 printf("\t\tport_state=PORT_ACTDEFER (%d)\n",portState);
\r
119 printf("\t\tport_state=UNKNOWN (%d)\n",portState);
\r
123 void printPortPhysState(uint8_t physState){
\r
126 printf("\t\tport_phys_state=SLEEP (%d)\n",physState);
\r
129 printf("\t\tport_phys_state=POLLING (%d)\n",physState);
\r
132 printf("\t\tport_phys_state=DISABLED (%d)\n",physState);
\r
135 printf("\t\tport_phys_state=CFG_TRAINING (%d)\n",physState);
\r
138 printf("\t\tport_phys_state=LINK_UP (%d)\n",physState);
\r
141 printf("\t\tport_phys_state=LINK_ERROR_RECOVERY (%d)\n",physState);
\r
144 printf("\t\tport_phys_state=PHY_TEST (%d)\n",physState);
\r
147 printf("\t\tport_phys_state=UNKNOWN (%d)\n",physState);
\r
151 void printPortRate(int speed, int width, int portState){
\r
152 if (portState == 1){ /* In case the port is in Down state */
\r
153 printf("\t\tlink_speed=NA\n");
\r
154 printf("\t\tlink_width=NA \n\t\trate=NA\n");
\r
158 printf("\t\tlink_speed=2.5 Gbps (%d)\n",speed);
\r
161 printf("\t\tlink_speed=5.0 Gbps (%d)\n",speed);
\r
164 printf("\t\tlink_speed=10.0 Gbps (%d)\n",speed);
\r
167 printf("\t\tlink_speed=UNKNOWN (%d)\n",speed);
\r
172 printf("\t\tlink_width=1x (%f) \n\t\trate=%d Gbps\n",width,2.5*speed);
\r
175 printf("\t\tlink_width=4x (%d) \n\t\trate=%d Gbps\n",width,10*speed);
\r
178 printf("\t\tlink_width=8x (%d) \n\t\trate=%d Gbps\n",width,20*speed);
\r
181 printf("\t\tlink_width=12x (%d) \n\t\trate=%d Gbps\n",width,30*speed);
\r
184 printf("\t\tlink_width=UNKNOWN (%d)\n",width);
\r
192 void printPortMTU(int mtu){ //TODO: check that these are all the options and that they are correct
\r
195 printf("\t\tmax_mtu=256 (%d)\n",mtu);
\r
198 printf("\t\tmax_mtu=512 (%d)\n",mtu);
\r
201 printf("\t\tmax_mtu=1024 (%d)\n",mtu);
\r
204 printf("\t\tmax_mtu=2048 (%d)\n",mtu);
\r
207 printf("\t\tmax_mtu=4096 (%d)\n",mtu);
\r
210 printf("\t\tmax_mtu=UNKNOWN (%d)\n",mtu);
\r
214 void printPortCaps(ib_port_cap_t *ibal_port_cap_p)
\r
216 #define PRINT_CAP(cap, name) if (ibal_port_cap_p->cap) printf( #name "," )
\r
218 printf("\t\tcapabilities: ");
\r
220 PRINT_CAP(snmp, SNMP_TUNNEL);
\r
221 PRINT_CAP(dev_mgmt, DEVICE_MGMT);
\r
222 PRINT_CAP(sm_disable, SM_DISABLED);
\r
224 PRINT_CAP(vend, VENDOR_CLASS);
\r
225 PRINT_CAP(notice, NOTICE);
\r
226 PRINT_CAP(trap, TRAP);
\r
227 PRINT_CAP(apm, APM);
\r
228 PRINT_CAP(slmap, SL_MAP);
\r
229 PRINT_CAP(ledinfo, LED_INFO);
\r
230 PRINT_CAP(client_reregister, CLIENT_REG);
\r
231 PRINT_CAP(sysguid, SYSGUID);
\r
232 PRINT_CAP(boot_mgmt, BOOT_MGMT);
\r
233 PRINT_CAP(pkey_switch_ext_port, PKEY_SW_EXT_PORT_TRAP);
\r
234 PRINT_CAP(link_rtl, LINK_LATENCY);
\r
235 PRINT_CAP(reinit, REINIT);
\r
236 PRINT_CAP(ipd, OPT_IPD);
\r
237 PRINT_CAP(mkey_nvram, MKEY_NVRAM);
\r
238 PRINT_CAP(pkey_nvram, PKEY_NVRAM);
\r
242 void printPortActiveSpeed(uint8_t speed){
\r
245 printf("\t\tactive_speed=2.5 Gbps (%d)\n",speed);
\r
248 printf("\t\tactive_speed=5.0 Gbps (%d)\n",speed);
\r
251 printf("\t\tactive_speed=10.0 Gbps (%d)\n",speed);
\r
254 printf("\t\tactive_speed=UNKNOWN (%d)\n",speed);
\r
258 void printPortInfo(ib_port_attr_t* portPtr, ib_port_info_t portInfo, BOOLEAN fullPrint){
\r
259 printf("\t\tport=%d\n", portPtr->port_num);
\r
260 printPortLinkState(portPtr->link_state);
\r
261 printPortRate(portInfo.link_speed>>4,portInfo.link_width_active, portPtr->link_state);
\r
262 printPortPhysState(portPtr->phys_state);
\r
263 printPortActiveSpeed(portPtr->active_speed);
\r
264 printf("\t\tsm_lid=0x%04x\n", cl_ntoh16(portPtr->sm_lid));
\r
265 printf("\t\tport_lid=0x%04x\n", cl_ntoh16(portPtr->lid));
\r
266 printf("\t\tport_lmc=0x%x\n", portPtr->lmc);
\r
267 printPortMTU(portPtr->mtu);
\r
269 printf("\t\tmax_msg_sz=0x%x (Max message size)\n", portPtr->max_msg_size);
\r
270 printPortCaps( &portPtr->cap );
\r
271 printf("\t\tmax_vl_num=0x%x (Maximum number of VL supported by this port)\n", portPtr->max_vls);
\r
272 printf("\t\tbad_pkey_counter=0x%x (Bad PKey counter)\n", portPtr->pkey_ctr);
\r
273 printf("\t\tqkey_viol_counter=0x%x (QKey violation counter)\n", portPtr->qkey_ctr);
\r
274 printf("\t\tsm_sl=0x%x (IB_SL to be used in communication with subnet manager)\n", portPtr->sm_sl);
\r
275 printf("\t\tpkey_tbl_len=0x%x (Current size of pkey table)\n", portPtr->num_pkeys);
\r
276 printf("\t\tgid_tbl_len=0x%x (Current size of GID table)\n", portPtr->num_gids);
\r
277 printf("\t\tsubnet_timeout=0x%x (Subnet Timeout for this port (see PortInfo))\n", portPtr->subnet_timeout);
\r
278 printf("\t\tinitTypeReply=0x%x (optional InitTypeReply value. 0 if not supported)\n", portPtr->init_type_reply);
\r
279 printPortGID(portPtr->p_gid_table->unicast.prefix, portPtr->p_gid_table->unicast.interface_id);
\r
284 void print_uplink_info(ib_ca_attr_t* ca_attr)
\r
286 uplink_info_t*p_uplink_info = mthca_get_uplink_info(ca_attr);
\r
287 char *bus_type, *link_speed, cap;
\r
290 switch (p_uplink_info->bus_type) {
\r
291 case UPLINK_BUS_PCI: bus_type = "PCI"; break;
\r
292 case UPLINK_BUS_PCIX: bus_type = "PCI_X"; break;
\r
293 case UPLINK_BUS_PCIE: bus_type = "PCI_E"; break;
\r
294 default: printf("\tuplink={BUS=UNRECOGNIZED (%d)}\n", p_uplink_info->bus_type); return;
\r
297 switch (p_uplink_info->bus_type) {
\r
298 case UPLINK_BUS_PCI:
\r
299 case UPLINK_BUS_PCIX:
\r
300 if (p_uplink_info->u.pci_x.capabilities == UPLINK_BUS_PCIX_133)
\r
304 printf("\tuplink={BUS=%s, CAPS=%d MHz}\n", bus_type, freq );
\r
307 case UPLINK_BUS_PCIE:
\r
308 cap = p_uplink_info->u.pci_e.capabilities;
\r
309 if (p_uplink_info->u.pci_e.link_speed == UPLINK_BUS_PCIE_SDR)
\r
310 link_speed = "2.5 Gbps";
\r
312 if (p_uplink_info->u.pci_e.link_speed == UPLINK_BUS_PCIE_DDR)
\r
313 link_speed = "5.0 Gbps";
\r
315 link_speed = "unknown";
\r
316 printf("\tuplink={BUS=%s, SPEED=%s, WIDTH=x%d, CAPS=%s*x%d}\n",
\r
317 bus_type, link_speed, p_uplink_info->u.pci_e.link_width,
\r
318 (cap&1) ? "2.5" : "5", cap>>2 );
\r
323 void vstat_print_ca_attr(int idx, ib_ca_attr_t* ca_attr, ib_port_info_t* vstat_port_info, BOOLEAN fullPrint){
\r
326 printf("\n\thca_idx=%d\n", idx);
\r
327 if (ca_attr->dev_id & 1)
\r
328 printf("\tATTENTION! \n\t The device is in 'Flash Recovery' mode, probably due to an incorrect firmware."
\r
329 "\n\t Use firmware tools to solve the problem.\n",idx);
\r
330 /*printf("\tpci_location={BUS=NA,DEV/FUNC=NA}\n");*/
\r
331 print_uplink_info(ca_attr);
\r
332 printf("\tvendor_id=0x%04x\n", ca_attr->vend_id);
\r
333 printf("\tvendor_part_id=0x%04x\n", ca_attr->dev_id);
\r
334 printf("\thw_ver=0x%x\n", ca_attr->revision); //TODO: ???
\r
335 if(ca_attr->vend_id == VEND_ID_MELLNOX || ca_attr->vend_id == VEND_ID_VOLTAIRE) {
\r
336 printf("\tfw_ver=%d.%.2d.%.4d\n",
\r
337 (uint16_t)(ca_attr->fw_ver>>32),
\r
338 (uint16_t)(ca_attr->fw_ver>>16),
\r
339 (uint16_t)(ca_attr->fw_ver));
\r
340 printf("\tPSID=%s\n",mthca_get_board_id(ca_attr));
\r
342 printf("\tfw_ver=0x%I64x\n",ca_attr->fw_ver);
\r
344 printGUID("\tnode_guid=", ca_attr->ca_guid);
\r
346 printGUID("\tsys_image_guid=", ca_attr->system_image_guid);
\r
347 printf("\tnum_phys_ports = %d\n",ca_attr->num_ports);
\r
348 printf("\tmax_num_qp = 0x%x (Maximum Number of QPs supported)\n", ca_attr->max_qps);
\r
349 printf("\tmax_qp_ous_wr = 0x%x (Maximum Number of outstanding WR on any WQ)\n", ca_attr->max_wrs);
\r
350 printf("\tmax_num_sg_ent = 0x%x (Max num of scatter/gather entries for WQE other than RD)\n", ca_attr->max_sges);
\r
351 printf("\tmax_num_sg_ent_rd = 0x%x (Max num of scatter/gather entries for RD WQE)\n", ca_attr->max_rd_sges);
\r
352 printf("\tmax_num_srq = 0x%x (Maximum Number of SRQs supported)\n", ca_attr->max_srq);
\r
353 printf("\tmax_wqe_per_srq = 0x%x (Maximum Number of outstanding WR on any SRQ)\n", ca_attr->max_srq_wrs);
\r
354 printf("\tmax_srq_sentries = 0x%x (Maximum Number of scatter/gather entries for SRQ WQE)\n", ca_attr->max_srq_sges);
\r
355 printf("\tsrq_resize_supported = %d (SRQ resize supported)\n", ca_attr->modify_srq_depth);
\r
356 printf("\tmax_num_cq = 0x%x (Max num of supported CQs)\n", ca_attr->max_cqs);
\r
357 printf("\tmax_num_ent_cq = 0x%x (Max num of supported entries per CQ)\n", ca_attr->max_cqes);
\r
358 printf("\tmax_num_mr = 0x%x (Maximum number of memory region supported)\n", ca_attr->init_regions);
\r
359 printf("\tmax_mr_size = 0x%x (Largest contiguous block of memory region in bytes)\n", ca_attr->init_region_size);
\r
360 printf("\tmax_pd_num = 0x%x (Maximum number of protection domains supported)\n", ca_attr->max_pds);
\r
361 printf("\tpage_size_cap = 0x%x (Largest page size supported by this HCA)\n",ca_attr->p_page_size[ca_attr->num_page_sizes-1]);
\r
363 printf("\tlocal_ca_ack_delay = 0x%x (Log2 4.096usec Max. RX to ACK or NAK delay)\n", ca_attr->local_ack_delay);
\r
364 printf("\tmax_qp_ous_rd_atom = 0x%x (Maximum number of oust. RDMA read/atomic as target)\n",ca_attr->max_qp_resp_res);
\r
365 printf("\tmax_ee_ous_rd_atom = 0 (EE Maximum number of outs. RDMA read/atomic as target)\n");
\r
366 printf("\tmax_res_rd_atom = 0x%x (Max. Num. of resources used for RDMA read/atomic as target)\n",ca_attr->max_resp_res);
\r
367 printf("\tmax_qp_init_rd_atom = 0x%x (Max. Num. of outs. RDMA read/atomic as initiator)\n",ca_attr->max_qp_init_depth);
\r
368 printf("\tmax_ee_init_rd_atom = 0 (EE Max. Num. of outs. RDMA read/atomic as initiator)\n");
\r
369 printf("\tatomic_cap = %s (Level of Atomicity supported)\n",ca_attr->atomicity == IB_ATOMIC_GLOBAL?"GLOBAL":
\r
370 ca_attr->atomicity == IB_ATOMIC_LOCAL?"LOCAL":"NORMAL");
\r
371 printf("\tmax_ee_num = 0x0 (Maximum number of EEC supported)\n");
\r
372 printf("\tmax_rdd_num = 0x0 (Maximum number of IB_RDD supported)\n");
\r
373 printf("\tmax_mw_num = 0x%x (Maximum Number of memory windows supported)\n", ca_attr->init_windows);
\r
374 printf("\tmax_raw_ipv6_qp = 0x%x (Maximum number of Raw IPV6 QPs supported)\n", ca_attr->max_ipv6_qps);
\r
375 printf("\tmax_raw_ethy_qp = 0x%x (Maximum number of Raw Ethertypes QPs supported)\n", ca_attr->max_ether_qps);
\r
376 printf("\tmax_mcast_grp_num = 0x%x (Maximum Number of multicast groups)\n", ca_attr->max_mcast_grps);
\r
377 printf("\tmax_mcast_qp_attach_num = 0x%x (Maximum number of QP per multicast group)\n", ca_attr->max_qps_per_mcast_grp);
\r
378 printf("\tmax_ah_num = 0x%x (Maximum number of address handles)\n", ca_attr->max_addr_handles);
\r
379 printf("\tmax_num_fmr = 0x%x (Maximum number FMRs)\n", ca_attr->max_fmr);
\r
380 printf("\tmax_num_map_per_fmr = 0x%x (Maximum number of (re)maps per FMR before an unmap operation in required)\n", ca_attr->max_map_per_fmr);
\r
381 printf("\tmodify_wr_depth = %d (Capabilities: change QP depth during a modify QP)\n", !!ca_attr->modify_wr_depth);
\r
382 printf("\tmodify_srq_depth = %d (Capabilities: change SRQ depth - Not supported by driver!)\n", !!ca_attr->modify_srq_depth);
\r
383 printf("\tchange_primary_port = %d (Capabilities: change primary port for a QP during a SQD->RTS transition)\n", !!ca_attr->change_primary_port);
\r
384 printf("\tav_port_check = %d (Capabilities: check port number in address handles)\n", !!ca_attr->av_port_check);
\r
385 printf("\tinit_type_support = %d (Capabilities: set init_type)\n", !!ca_attr->init_type_support);
\r
386 printf("\tshutdown_port = %d (Capabilities: shutdown port support)\n", !!ca_attr->shutdown_port_capability);
\r
388 printf("\tnum_phys_ports=%d\n", ca_attr->num_ports);
\r
390 for (i = 0; i<ca_attr->num_ports; i++){
\r
391 printPortInfo(ca_attr->p_port_attr+i, vstat_port_info[i], fullPrint);
\r
394 /* Internal Functions */
\r
396 void vstat_get_counters(ib_ca_handle_t h_ca,uint8_t port_num)
\r
398 ib_mad_t *mad_in = NULL;
\r
399 ib_mad_t *mad_out = NULL;
\r
400 ib_port_counters_t *port_counters;
\r
401 ib_api_status_t ib_status = IB_SUCCESS;
\r
404 mad_out = (ib_mad_t*)cl_zalloc(256);
\r
405 CL_ASSERT(mad_out);
\r
407 mad_in = (ib_mad_t*)cl_zalloc(256);
\r
411 mad_in->attr_id = IB_MAD_ATTR_PORT_CNTRS;
\r
412 mad_in->method = IB_MAD_METHOD_GET;
\r
413 mad_in->base_ver = 1;
\r
414 mad_in->class_ver =1;
\r
415 mad_in->mgmt_class = IB_MCLASS_PERF;
\r
417 port_counters = (ib_port_counters_t*)(((ib_gmp_t*)mad_in)->data);
\r
419 port_counters->port_select= port_num;
\r
420 port_counters->counter_select= 0xff;
\r
422 ib_status = ib_local_mad(h_ca ,port_num ,mad_in ,mad_out);
\r
423 if(ib_status != IB_SUCCESS)
\r
425 printf("ib_local_mad failed with status = %d\n", ib_status);
\r
429 port_counters = (ib_port_counters_t*)(((ib_gmp_t*)mad_out)->data);
\r
431 printf("\n\tport counters for port %d\n",port_num);
\r
432 printf("\t\tlink_error_recovery_counter\t0x%x \n",port_counters->link_error_recovery_counter);
\r
433 printf("\t\tlink_down_counter\t\t0x%x \n",port_counters->link_down_counter);
\r
434 printf("\t\tport_rcv_errors\t\t\t0x%x \n",CL_NTOH16(port_counters->port_rcv_errors));
\r
435 printf("\t\tport_rcv_remote_physical_errors\t0x%x \n",CL_NTOH16(port_counters->port_rcv_remote_physical_errors));
\r
436 printf("\t\tport_rcv_switch_relay_errors\t0x%x \n",CL_NTOH16(port_counters->port_rcv_switch_relay_errors));
\r
437 printf("\t\tport_xmit_discard\t\t0x%x \n",CL_NTOH16(port_counters->port_xmit_discard));
\r
438 printf("\t\tport_xmit_constraint_errors\t0x%x \n",port_counters->port_xmit_constraint_errors);
\r
439 printf("\t\tport_rcv_constraint_errors\t0x%x \n",port_counters->port_rcv_constraint_errors);
\r
440 printf("\t\tvl15_dropped\t\t\t0x%x \n",CL_NTOH16(port_counters->vl15_dropped));
\r
441 printf("\t\tport_rcv_data\t\t\t0x%x \n",CL_NTOH32(port_counters->port_rcv_data));
\r
442 printf("\t\tport_xmit_data\t\t\t0x%x \n",CL_NTOH32(port_counters->port_xmit_data));
\r
443 printf("\t\tport_rcv_pkts\t\t\t0x%x \n",CL_NTOH32(port_counters->port_rcv_pkts));
\r
444 printf("\t\tport_xmit_pkts\t\t\t0x%x \n\n",CL_NTOH32(port_counters->port_xmit_pkts));
\r
449 void vstat_get_port_info(ib_ca_handle_t h_ca,uint8_t port_num, ib_port_info_t* vstat_port_info)
\r
451 ib_mad_t *mad_in = NULL;
\r
452 ib_mad_t *mad_out = NULL;
\r
453 ib_api_status_t ib_status = IB_SUCCESS;
\r
456 mad_out = (ib_mad_t*)cl_zalloc(256);
\r
457 CL_ASSERT(mad_out);
\r
459 mad_in = (ib_mad_t*)cl_zalloc(256);
\r
463 mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;
\r
464 mad_in->method = IB_MAD_METHOD_GET;
\r
465 mad_in->base_ver = 1;
\r
466 mad_in->class_ver =1;
\r
467 mad_in->mgmt_class = IB_MCLASS_SUBN_LID;
\r
471 ib_status = ib_local_mad(h_ca ,port_num ,mad_in ,mad_out);
\r
472 if(ib_status != IB_SUCCESS && 0 != mad_in->status )
\r
474 printf("ib_local_mad failed with status = %d mad status = %d\n", ib_status,mad_in->status);
\r
478 cl_memcpy(vstat_port_info,(ib_port_info_t*)(((ib_smp_t*)mad_out)->data),sizeof(ib_port_info_t));
\r
486 boolean_t modify_attr,
\r
488 BOOLEAN getCounters
\r
491 ib_al_handle_t h_al = NULL;
\r
492 ib_api_status_t ib_status = IB_SUCCESS;
\r
493 ib_api_status_t ret_status = IB_SUCCESS;
\r
495 ib_net64_t *ca_guid_array;
\r
496 ib_ca_attr_t *vstat_ca_attr;
\r
497 ib_port_info_t vstat_port_info[2];
\r
499 ib_ca_handle_t h_ca = NULL;
\r
501 ib_port_attr_mod_t port_attr_mod;
\r
507 * Open the AL instance
\r
509 ib_status = ib_open_al(&h_al);
\r
510 if(ib_status != IB_SUCCESS)
\r
512 printf("ib_open_al failed status = %d\n", ib_status);
\r
513 ret_status = ib_status;
\r
517 //printf("ib_open_al PASSED.\n");
\r
522 * Get the Local CA Guids
\r
524 ib_status = ib_get_ca_guids(h_al, NULL, &guid_count);
\r
525 if(ib_status != IB_INSUFFICIENT_MEMORY)
\r
527 printf("ib_get_ca_guids1 failed status = %d\n", (uint32_t)ib_status);
\r
528 ret_status = ib_status;
\r
535 * If no CA's Present then return
\r
538 if(guid_count == 0)
\r
542 ca_guid_array = (ib_net64_t*)cl_malloc(sizeof(ib_net64_t) * guid_count);
\r
543 CL_ASSERT(ca_guid_array);
\r
545 ib_status = ib_get_ca_guids(h_al, ca_guid_array, &guid_count);
\r
546 if(ib_status != IB_SUCCESS)
\r
548 printf("ib_get_ca_guids2 failed with status = %d\n", ib_status);
\r
549 ret_status = ib_status;
\r
556 * For Each CA Guid found Open the CA,
\r
557 * Query the CA Attribute and close the CA
\r
559 for(i=0; i < guid_count; i++)
\r
563 ib_status = ib_open_ca(h_al,
\r
569 if(ib_status != IB_SUCCESS)
\r
571 printf("ib_open_ca failed with status = %d\n", ib_status);
\r
572 ret_status = ib_status;
\r
577 //printf("ib_open_ca passed i=%d\n",i);
\r
583 ib_status = ib_query_ca(h_ca, NULL, &bsize);
\r
584 if(ib_status != IB_INSUFFICIENT_MEMORY)
\r
586 printf("ib_query_ca failed with status = %d\n", ib_status);
\r
587 ret_status = ib_status;
\r
592 //printf("ib_query_ca PASSED bsize = 0x%x.\n",bsize);
\r
594 /* Allocate the memory needed for query_ca */
\r
596 vstat_ca_attr = (ib_ca_attr_t *)cl_zalloc(bsize);
\r
597 CL_ASSERT(vstat_ca_attr);
\r
599 ib_status = ib_query_ca(h_ca, vstat_ca_attr, &bsize);
\r
600 if(ib_status != IB_SUCCESS)
\r
602 printf("ib_query_ca failed with status = %d\n", ib_status);
\r
603 ret_status = ib_status;
\r
607 for(port_idx =0; port_idx< vstat_ca_attr->num_ports;port_idx++){
\r
608 vstat_get_port_info(h_ca ,port_idx+1,&vstat_port_info[port_idx]);
\r
611 vstat_print_ca_attr((int)i, vstat_ca_attr, vstat_port_info, fullPrint);
\r
614 for(port_idx =0; port_idx< vstat_ca_attr->num_ports;port_idx++){
\r
615 vstat_get_counters(h_ca ,port_idx+1);
\r
619 /* Free the memory */
\r
620 cl_free(vstat_ca_attr);
\r
621 vstat_ca_attr = NULL;
\r
622 /* Close the current open CA */
\r
623 ib_status = ib_close_ca(h_ca, NULL);
\r
624 if(ib_status != IB_SUCCESS)
\r
626 printf("ib_close_ca failed status = %d", ib_status);
\r
627 ret_status = ib_status;
\r
636 ib_status = ib_close_ca(h_ca, NULL);
\r
637 if(ib_status != IB_SUCCESS)
\r
639 printf("ib_close_ca failed status = %d", ib_status);
\r
644 cl_free(ca_guid_array);
\r
645 ib_status = ib_close_al(h_al);
\r
647 if(ib_status != IB_SUCCESS)
\r
649 printf("ib_close_al failed status = %d", ib_status);
\r
654 } //End of while(1)
\r
662 printf("\n\tUsage: vstat [-v] [-c]\n");
\r
663 printf("\t\t -v - verbose mode\n");
\r
664 printf("\t\t -c - HCA error/statistic counters\n");
\r
672 ib_api_status_t ib_status;
\r
673 BOOLEAN fullPrint = FALSE;
\r
674 BOOLEAN getCounters = FALSE;
\r
675 BOOLEAN showHelp = FALSE;
\r
679 if(!_stricmp(argv[i-1], "-v")){
\r
682 }else if(!_stricmp(argv[i-1], "-h") ||
\r
683 !_stricmp(argv[i-1], "-help")){
\r
686 }else if(!_stricmp(argv[i-1], "-c")){
\r
687 getCounters = TRUE;
\r
697 ib_status = vstat_ca_attr(FALSE, fullPrint,getCounters);
\r