Blame IbaTools/opainfo/opainfo.c

Packit 857059
/* BEGIN_ICS_COPYRIGHT7 ****************************************
Packit 857059
Packit 857059
Copyright (c) 2015-2017, Intel Corporation
Packit 857059
Packit 857059
Redistribution and use in source and binary forms, with or without
Packit 857059
modification, are permitted provided that the following conditions are met:
Packit 857059
Packit 857059
    * Redistributions of source code must retain the above copyright notice,
Packit 857059
      this list of conditions and the following disclaimer.
Packit 857059
    * Redistributions in binary form must reproduce the above copyright
Packit 857059
      notice, this list of conditions and the following disclaimer in the
Packit 857059
      documentation and/or other materials provided with the distribution.
Packit 857059
    * Neither the name of Intel Corporation nor the names of its contributors
Packit 857059
      may be used to endorse or promote products derived from this software
Packit 857059
      without specific prior written permission.
Packit 857059
Packit 857059
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 857059
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit 857059
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Packit 857059
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
Packit 857059
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit 857059
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Packit 857059
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Packit 857059
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit 857059
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 857059
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 857059
Packit 857059
** END_ICS_COPYRIGHT7   ****************************************/
Packit 857059
Packit 857059
#include <stdio.h>
Packit 857059
#include <string.h>
Packit 857059
#include <getopt.h>
Packit 857059
#include <limits.h>
Packit 857059
#include <errno.h>
Packit 857059
Packit 857059
/* work around conflicting names */
Packit 857059
#include "infiniband/umad.h"
Packit 857059
#include "infiniband/verbs.h"
Packit 857059
Packit 857059
#include "iba/ib_types.h"
Packit 857059
#include "iba/ib_sm_priv.h"
Packit 857059
#include "iba/ib_helper.h"
Packit 857059
#include "opamgt_priv.h"
Packit 857059
#include "ibprint.h"
Packit 857059
#include "stl_print.h"
Packit 857059
#include "iba/stl_pm.h"
Packit 857059
Packit 857059
#define RESP_WAIT_TIME 1000	/* in ms */
Packit 857059
#define MAD_ATTEMPTS 1	/* 1 attempt, no retries */
Packit 857059
Packit 857059
// bit mask
Packit 857059
#define OTYPE_INFO 1
Packit 857059
#define OTYPE_STATS 2
Packit 857059
Packit 857059
PrintDest_t g_dest;
Packit 857059
int g_printLineByLine = 0;
Packit 857059
uint8_t g_detail = 0;
Packit 857059
unsigned g_verbose = 0;
Packit 857059
uint64_t g_transactID = 0xffffffff1234000;	// Upper half overwritten by umad
Packit 857059
uint16_t g_pkey;	// mgmt pkey to use
Packit 857059
uint8_t g_cableInfo[STL_CIB_STD_LEN];
Packit 857059
uint8_t g_pm_sl = 0xFF;
Packit 857059
Packit 857059
#if defined(DBGPRINT)
Packit 857059
#undef DBGPRINT
Packit 857059
#endif
Packit 857059
#define VRBSE_PRINT(format, args...) do { if (g_verbose) { fflush(stdout); fprintf(stdout, format, ##args); } } while (0)
Packit 857059
#define DBGPRINT(format, args...) do { if (g_verbose>1) { fflush(stdout); fprintf(stderr, format, ##args); } } while (0)
Packit 857059
Packit 857059
const char *get_port_name(struct omgt_port *portHandle)
Packit 857059
{
Packit 857059
	static char buf[IBV_SYSFS_NAME_MAX + 6];
Packit 857059
	char hfi_name[IBV_SYSFS_NAME_MAX] = {0};
Packit 857059
	uint8_t port_num;
Packit 857059
	(void)omgt_port_get_hfi_port_num(portHandle, &port_num);
Packit 857059
	(void)omgt_port_get_hfi_name(portHandle, hfi_name);
Packit 857059
	snprintf(buf, sizeof(buf), "%.*s:%u", IBV_SYSFS_NAME_MAX, hfi_name, port_num);
Packit 857059
	return buf;
Packit 857059
}
Packit 857059
Packit 857059
void stl_set_local_route(OUT STL_SMP* smp)
Packit 857059
{
Packit 857059
	// local directed route
Packit 857059
	smp->common.MgmtClass = MCLASS_SM_DIRECTED_ROUTE;
Packit 857059
	smp->common.u.DR.s.D = 0;
Packit 857059
	smp->common.u.DR.s.Status = 0;
Packit 857059
	smp->common.u.DR.HopPointer = 0;
Packit 857059
	smp->common.u.DR.HopCount = 0;
Packit 857059
	smp->SmpExt.DirectedRoute.DrSLID = STL_LID_PERMISSIVE;
Packit 857059
	smp->SmpExt.DirectedRoute.DrDLID = STL_LID_PERMISSIVE;
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
FSTATUS perform_local_stl_sma_query( IN struct omgt_port *portHandle,
Packit 857059
						   IN uint16 attrid,
Packit 857059
						   IN uint32 attrmod,
Packit 857059
						   OUT STL_SMP* smp )
Packit 857059
{
Packit 857059
	FSTATUS status;
Packit 857059
Packit 857059
	smp->common.BaseVersion = STL_BASE_VERSION;
Packit 857059
	smp->common.ClassVersion = STL_SM_CLASS_VERSION;
Packit 857059
	stl_set_local_route(smp);
Packit 857059
	smp->common.mr.AsReg8 = 0;
Packit 857059
	smp->common.mr.s.Method = MMTHD_GET;
Packit 857059
	smp->common.AttributeID = attrid;
Packit 857059
	smp->common.AttributeModifier = attrmod;
Packit 857059
	smp->common.TransactionID = (++g_transactID);
Packit 857059
Packit 857059
	STL_BSWAP_SMP_HEADER(smp);
Packit 857059
	{
Packit 857059
		struct omgt_mad_addr addr = {
Packit 857059
			.lid = 0,
Packit 857059
			.qpn = 0,
Packit 857059
			.qkey = 0,
Packit 857059
			.pkey = g_pkey
Packit 857059
		};
Packit 857059
        size_t recv_size = sizeof(*smp);
Packit 857059
		size_t send_size = STL_MIN_SMP_DR_MAD; // no payload.
Packit 857059
		status = omgt_send_recv_mad_no_alloc(portHandle, (uint8_t *)smp, send_size, &addr,
Packit 857059
											(uint8_t *)smp, &recv_size, RESP_WAIT_TIME, MAD_ATTEMPTS-1);
Packit 857059
		if (FSUCCESS != status)
Packit 857059
			fprintf(stderr, "opainfo: MAD failed on hfi:port %s with Status: %s\n",
Packit 857059
							get_port_name(portHandle), iba_fstatus_msg(status));
Packit 857059
	}
Packit 857059
	
Packit 857059
	STL_BSWAP_SMP_HEADER(smp);
Packit 857059
Packit 857059
	if (FSUCCESS == status && smp->common.u.DR.s.Status != MAD_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "MAD returned with Bad Status: %s\n",
Packit 857059
						iba_mad_status_msg2(smp->common.u.DR.s.Status));
Packit 857059
		return FERROR;
Packit 857059
	}
Packit 857059
	return status;
Packit 857059
}
Packit 857059
Packit 857059
FSTATUS get_local_stl_port_info( IN struct omgt_port *portHandle,
Packit 857059
						   OUT STL_SMP* smp )
Packit 857059
{
Packit 857059
	FSTATUS status;
Packit 857059
Packit 857059
	if (g_verbose) {
Packit 857059
		VRBSE_PRINT("Sending Get(PortInfo) to hfi:port %s\n",
Packit 857059
						get_port_name(portHandle));
Packit 857059
	}
Packit 857059
Packit 857059
	MemoryClear(smp, sizeof(*smp));
Packit 857059
	
Packit 857059
	status = perform_local_stl_sma_query(portHandle,
Packit 857059
							STL_MCLASS_ATTRIB_ID_PORT_INFO, 1<<24, smp);
Packit 857059
	BSWAP_STL_PORT_INFO((STL_PORT_INFO*)stl_get_smp_data(smp));
Packit 857059
	return status;
Packit 857059
}
Packit 857059
Packit 857059
FSTATUS get_local_stl_cable_info ( IN struct omgt_port *portHandle,
Packit 857059
							 IN unsigned cabaddr,
Packit 857059
							 OUT STL_SMP* smp )
Packit 857059
{
Packit 857059
	FSTATUS status;
Packit 857059
Packit 857059
	if (g_verbose) {
Packit 857059
		VRBSE_PRINT("Sending Get(CableInfo) to hfi:port %s\n",
Packit 857059
						get_port_name(portHandle));
Packit 857059
	}
Packit 857059
	MemoryClear(smp, sizeof(*smp));
Packit 857059
Packit 857059
	status = perform_local_stl_sma_query(portHandle,
Packit 857059
							STL_MCLASS_ATTRIB_ID_CABLE_INFO,
Packit 857059
							(cabaddr & 0x7ff)<<19 | (STL_CABLE_INFO_MAXLEN)<<13,
Packit 857059
							smp);
Packit 857059
	BSWAP_STL_CABLE_INFO((STL_CABLE_INFO*)stl_get_smp_data(smp));
Packit 857059
Packit 857059
	return status;
Packit 857059
}
Packit 857059
Packit 857059
FSTATUS perform_local_stl_pma_query( IN struct omgt_port *portHandle,
Packit 857059
						   IN uint16 attrid,
Packit 857059
						   IN uint32 attrmod,
Packit 857059
						   OUT STL_PERF_MAD* mad )
Packit 857059
{
Packit 857059
	FSTATUS status;
Packit 857059
	STL_LID dlid;
Packit 857059
	uint8_t port_state;
Packit 857059
Packit 857059
	mad->common.BaseVersion = STL_BASE_VERSION;
Packit 857059
	mad->common.MgmtClass = MCLASS_PERF;
Packit 857059
	mad->common.ClassVersion = STL_PM_CLASS_VERSION;
Packit 857059
	mad->common.u.NS.Status.AsReg16 = 0;
Packit 857059
	mad->common.mr.AsReg8 = 0;
Packit 857059
	mad->common.mr.s.Method = MMTHD_GET;
Packit 857059
	mad->common.AttributeID = attrid;
Packit 857059
	mad->common.AttributeModifier = attrmod;
Packit 857059
	mad->common.TransactionID = (++g_transactID);
Packit 857059
	// rest of fields should be ignored for a Get, zero'ed above
Packit 857059
Packit 857059
	(void)omgt_port_get_port_state(portHandle, &port_state);
Packit 857059
	if (port_state != IB_PORT_ACTIVE) {
Packit 857059
		dlid = STL_LID_PERMISSIVE; // special case for local query
Packit 857059
	} else {
Packit 857059
		(void)omgt_port_get_port_lid(portHandle, &dlid);
Packit 857059
	}
Packit 857059
		
Packit 857059
	BSWAP_MAD_HEADER((MAD*)mad);
Packit 857059
	{
Packit 857059
		struct omgt_mad_addr addr = {
Packit 857059
			.lid = dlid, 
Packit 857059
			.qpn = 1,
Packit 857059
			.qkey = QP1_WELL_KNOWN_Q_KEY,
Packit 857059
			.pkey = g_pkey,
Packit 857059
			.sl = g_pm_sl,
Packit 857059
		};
Packit 857059
		size_t recv_size = sizeof(*mad);
Packit 857059
		size_t send_size = STL_GS_HDRSIZE + sizeof(STL_PORT_STATUS_REQ);
Packit 857059
		status = omgt_send_recv_mad_no_alloc(portHandle, (uint8_t *)mad, send_size, &addr,
Packit 857059
										(uint8_t *)mad, &recv_size, RESP_WAIT_TIME, MAD_ATTEMPTS-1);
Packit 857059
		if (FSUCCESS != status)
Packit 857059
			fprintf(stderr, "opainfo: MAD failed on hfi:port %s with Status: %s\n",
Packit 857059
							get_port_name(portHandle), iba_fstatus_msg(status));
Packit 857059
Packit 857059
	}
Packit 857059
	BSWAP_MAD_HEADER((MAD*)mad);
Packit 857059
	
Packit 857059
	if (FSUCCESS == status && mad->common.u.NS.Status.AsReg16 != MAD_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "MAD returned with Bad Status: %s\n",
Packit 857059
						iba_mad_status_msg2(mad->common.u.NS.Status.AsReg16));
Packit 857059
		return FERROR;
Packit 857059
	}
Packit 857059
	return status;
Packit 857059
}
Packit 857059
Packit 857059
FSTATUS get_local_stl_port_status( IN struct omgt_port *portHandle,
Packit 857059
						   OUT STL_PERF_MAD* mad )
Packit 857059
{
Packit 857059
	FSTATUS status;
Packit 857059
	STL_PORT_STATUS_REQ *pPortCounterReq = (STL_PORT_STATUS_REQ *)&(mad->PerfData);
Packit 857059
Packit 857059
	MemoryClear(mad, sizeof(*mad));
Packit 857059
Packit 857059
	if (g_verbose) {
Packit 857059
		VRBSE_PRINT("Sending Get(PortStatus) to hfi:port %s\n",
Packit 857059
						get_port_name(portHandle));
Packit 857059
	}
Packit 857059
	(void)omgt_port_get_hfi_port_num(portHandle, &pPortCounterReq->PortNumber);
Packit 857059
	//pPortCounterReq->VLSelectMask = 0x8001; // Mask for VL15 & VL0 by default (same as pmaquery).
Packit 857059
Packit 857059
	BSWAP_STL_PORT_STATUS_REQ(pPortCounterReq);
Packit 857059
Packit 857059
	status = perform_local_stl_pma_query(portHandle,
Packit 857059
						STL_PM_ATTRIB_ID_PORT_STATUS, 1<<24, mad);
Packit 857059
	BSWAP_STL_PORT_STATUS_RSP((STL_PORT_STATUS_RSP*)&(mad->PerfData));
Packit 857059
	return status;
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
void show_info( struct omgt_port *portHandle,
Packit 857059
					 IN int outputType,
Packit 857059
					 IN STL_PORT_INFO* pPortInfo,
Packit 857059
					 IN uint8_t* cableInfo,
Packit 857059
					 IN STL_PORT_STATUS_RSP *pPortStatusRsp)
Packit 857059
{
Packit 857059
	uint64_t portGUID = 0;
Packit 857059
	(void)omgt_port_get_port_guid(portHandle, &portGUID);
Packit 857059
Packit 857059
	if (! outputType) {
Packit 857059
		uint8_t detail = g_detail;
Packit 857059
Packit 857059
		if (detail > CABLEINFO_DETAIL_ALL)
Packit 857059
			detail = CABLEINFO_DETAIL_ALL;
Packit 857059
Packit 857059
		PrintStlPortSummary(&g_dest, 0, get_port_name(portHandle),
Packit 857059
				pPortInfo, portGUID, g_pkey,
Packit 857059
				cableInfo, STL_CIB_STD_HIGH_PAGE_ADDR, STL_CIB_STD_LEN, 
Packit 857059
 				pPortStatusRsp, detail, g_printLineByLine);
Packit 857059
	}
Packit 857059
Packit 857059
	if (outputType & (OTYPE_INFO|OTYPE_STATS))
Packit 857059
		PrintFunc(&g_dest, "%s\n", get_port_name(portHandle));
Packit 857059
	if ((outputType & OTYPE_INFO) && pPortInfo)
Packit 857059
		PrintStlPortInfo(&g_dest, 3, pPortInfo, portGUID, g_printLineByLine);
Packit 857059
	if ((outputType & OTYPE_STATS) && pPortStatusRsp)
Packit 857059
		PrintStlPortStatusRsp(&g_dest, 3, pPortStatusRsp);
Packit 857059
	fflush(stdout);
Packit 857059
}
Packit 857059
Packit 857059
void Usage(void)
Packit 857059
{
Packit 857059
Packit 857059
	fprintf(stderr, "Usage: opainfo [-h hfi] [-p port] [-o type] [-g] [-d detail] [-s pm_sl] [-v [-v]...]\n");
Packit 857059
	fprintf(stderr, "    -h hfi     hfi, numbered 1..n, 0=system wide port num\n");
Packit 857059
	fprintf(stderr, "               (default is 0)\n");
Packit 857059
	fprintf(stderr, "    -p port    port, numbered 1..n, 0=1st active\n");
Packit 857059
	fprintf(stderr, "               (default is all ports on selected hfi)\n");
Packit 857059
	fprintf(stderr, "    -o type    output type specified (can appear more than once)\n");
Packit 857059
	fprintf(stderr, "               info - output detailed portinfo\n");
Packit 857059
	fprintf(stderr, "               stats - output detailed port counters\n");
Packit 857059
	fprintf(stderr, "               (behavior without -o gives a brief summary of portinfo,\n");
Packit 857059
	fprintf(stderr, "               counters and cableinfo)\n");
Packit 857059
	fprintf(stderr, "    -g         Display in line-by-line format (default is summary format)\n");
Packit 857059
	fprintf(stderr, "    -d detail  output detail level 0-2 for CableInfo only (default 0):\n");
Packit 857059
	fprintf(stderr, "               (-d option ignored when used with -o type)\n");
Packit 857059
	fprintf(stderr, "                   0 - minimal crucial info (e.g. cable length, vendor)\n");
Packit 857059
	fprintf(stderr, "                   1 - brief summary\n");
Packit 857059
	fprintf(stderr, "                   2 - extended brief summary\n");
Packit 857059
	fprintf(stderr, "    -s pm_sl   Specify different Service Level for PMA traffic\n");
Packit 857059
	fprintf(stderr, "    -v         verbose output. Additional invocations will turn on debugging,\n");
Packit 857059
	fprintf(stderr, "               openib debugging and libibumad debugging.\n");
Packit 857059
	fprintf(stderr, "\n");
Packit 857059
	fprintf(stderr, "The -h and -p options permit a variety of selections:\n");
Packit 857059
	fprintf(stderr, "    -h 0       all ports on all HFIs (this is the default)\n");
Packit 857059
	fprintf(stderr, "    -h 0 -p 0  1st active port in system\n");
Packit 857059
	fprintf(stderr, "    -h x       all ports on HFI x\n");
Packit 857059
	fprintf(stderr, "    -h x -p 0  1st active port on HFI x\n");
Packit 857059
	fprintf(stderr, "    -h 0 -p y  port y within system (irrespective of which ports are active)\n");
Packit 857059
	fprintf(stderr, "    -h x -p y  HFI x, port y\n");
Packit 857059
	exit(0);
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
/**
Packit 857059
 * find the output type requested
Packit 857059
 * 
Packit 857059
 * @param name
Packit 857059
 * 
Packit 857059
 * @return int
Packit 857059
 */
Packit 857059
int checkOutputType(const char *name)
Packit 857059
{
Packit 857059
	if ( 0 == strcmp(name, "info") )
Packit 857059
		return OTYPE_INFO;
Packit 857059
	else if ( 0 == strcmp(name, "stats") )
Packit 857059
		return OTYPE_STATS;
Packit 857059
	else
Packit 857059
		return -1;
Packit 857059
}  // int checkOutputType(const char *name)
Packit 857059
Packit 857059
// command line options
Packit 857059
struct option options[] = {
Packit 857059
		{ "help", no_argument, NULL, '$' },	// use an invalid option character
Packit 857059
		{ 0 }
Packit 857059
};
Packit 857059
Packit 857059
int main(int argc, char *argv[])
Packit 857059
{
Packit 857059
	uint8 hfi = 0;	// all HFIs
Packit 857059
	uint8 port = 0;
Packit 857059
	int allPorts = 1;
Packit 857059
	int outputType = 0;
Packit 857059
	uint8 pm_sl = 0xFF;
Packit 857059
Packit 857059
	int c;
Packit 857059
	int index;
Packit 857059
	int ret;
Packit 857059
	FSTATUS             fstatus;
Packit 857059
	uint32_t portCount;
Packit 857059
	STL_SMP smpPortInfo;
Packit 857059
	STL_SMP smpCableInfo;
Packit 857059
	STL_PERF_MAD madPortStatusRsp;
Packit 857059
	STL_PORT_INFO* pPortInfo;
Packit 857059
	int have_cableinfo;
Packit 857059
	STL_PORT_STATUS_RSP *pPortStatusRsp = 0;
Packit 857059
    struct omgt_port     *portHandle = NULL;
Packit 857059
Packit 857059
	while (-1 != (c = getopt_long(argc,argv, "h:p:o:d:gvs:", options, &index)))
Packit 857059
	{
Packit 857059
		switch (c) {
Packit 857059
		case '$':
Packit 857059
			Usage();
Packit 857059
			break;
Packit 857059
		case 'h':
Packit 857059
			if (FSUCCESS != StringToUint8(&hfi, optarg, NULL, 0, TRUE)) {
Packit 857059
				fprintf(stderr, "opainfo: Invalid HFI Number: %s\n", optarg);
Packit 857059
				Usage();
Packit 857059
			}
Packit 857059
			break;
Packit 857059
		case 'p':
Packit 857059
			if (FSUCCESS != StringToUint8(&port, optarg, NULL, 0, TRUE)) {
Packit 857059
				fprintf(stderr, "opainfo: Invalid Port Number: %s\n", optarg);
Packit 857059
				Usage();
Packit 857059
			}
Packit 857059
			allPorts = 0;
Packit 857059
			break;
Packit 857059
		case 'o':
Packit 857059
			outputType |= checkOutputType(optarg);
Packit 857059
			if (outputType < 0)
Packit 857059
				Usage();
Packit 857059
			break;
Packit 857059
		case 'g':
Packit 857059
			g_printLineByLine = 1;
Packit 857059
			break;
Packit 857059
		case 'd':
Packit 857059
			if (FSUCCESS != StringToUint8(&g_detail, optarg, NULL, 0, TRUE)) {
Packit 857059
				fprintf(stderr, "opainfo: Invalid Detail: %s\n", optarg);
Packit 857059
				Usage();
Packit 857059
			}
Packit 857059
			break;
Packit 857059
		case 'v':
Packit 857059
			g_verbose++;
Packit 857059
			if (g_verbose > 3) umad_debug(g_verbose - 3);
Packit 857059
			break;
Packit 857059
		case 's':
Packit 857059
			if (FSUCCESS != StringToUint8(&pm_sl, optarg, NULL, 0, TRUE)) {
Packit 857059
				fprintf(stderr, "opainfo: Invalid PM SL: %s\n", optarg);
Packit 857059
				Usage();
Packit 857059
			}
Packit 857059
			break;
Packit 857059
		default:
Packit 857059
			fprintf(stderr, "opainfo: Invalid option -%c\n", c);
Packit 857059
			Usage();
Packit 857059
			break;
Packit 857059
		}   // switch
Packit 857059
	}  // while
Packit 857059
Packit 857059
	if (optind < argc)
Packit 857059
	{
Packit 857059
		Usage();
Packit 857059
	}
Packit 857059
Packit 857059
	PrintDestInitFile(&g_dest, stdout);
Packit 857059
Packit 857059
	if (allPorts) {
Packit 857059
		// determine port count for selected hfi
Packit 857059
		// if hfi==0, its system wide port count
Packit 857059
		// if port!=0, we get a specific port (fstatus parsing easier below)
Packit 857059
		fstatus = omgt_get_portguid( hfi, 1, NULL, NULL, NULL, NULL,
Packit 857059
									NULL, NULL, NULL, &portCount,
Packit 857059
									NULL, NULL, NULL );
Packit 857059
Packit 857059
		if (hfi && FSUCCESS != fstatus) {
Packit 857059
			fprintf(stderr, "opainfo: Failed to find hfi %d\n", hfi);
Packit 857059
			exit(1);
Packit 857059
		} else if (FSUCCESS != fstatus && FNOT_FOUND != fstatus) {
Packit 857059
			fprintf(stderr, "opainfo: Failed to determine number of HFIs\n");
Packit 857059
			exit(1);
Packit 857059
		} else if (portCount == 0) {
Packit 857059
			fprintf(stderr, "opainfo: No HFIs found\n");
Packit 857059
			exit(1);
Packit 857059
		}
Packit 857059
		port = 1;	// start at 1st port
Packit 857059
	} else {
Packit 857059
		portCount = 1;
Packit 857059
	}
Packit 857059
Packit 857059
	for (; portCount > 0; port++, portCount--)
Packit 857059
	{
Packit 857059
		have_cableinfo = FALSE;
Packit 857059
		struct omgt_params params = {.debug_file = g_verbose > 2 ? stderr : NULL};
Packit 857059
		ret = omgt_open_port_by_num(&portHandle, hfi, port, &params);
Packit 857059
		if (port == 0 && ret == OMGT_STATUS_NOT_DONE) {
Packit 857059
			// asked for 1st active, but none active, use 1st port
Packit 857059
			port = 1;
Packit 857059
			ret = omgt_open_port_by_num(&portHandle, hfi, port, &params);
Packit 857059
		}
Packit 857059
		if (ret != 0) {
Packit 857059
			printf("opainfo: Unable to open hfi:port %u:%u\n", hfi, port);
Packit 857059
			continue;
Packit 857059
		}
Packit 857059
Packit 857059
    	// Determine which pkey to use (full or limited)
Packit 857059
    	// Attempt to use full at all times, otherwise, can
Packit 857059
    	// use the limited for queries of the local port.
Packit 857059
    	g_pkey = omgt_get_mgmt_pkey(portHandle, 0, 0);
Packit 857059
    	if (g_pkey==0) {
Packit 857059
        	fprintf(stderr, "opainfo: Unable to find mgmt pkey on hfi:port %s\n",
Packit 857059
					get_port_name(portHandle));
Packit 857059
			goto next;
Packit 857059
    	}
Packit 857059
Packit 857059
		fstatus = get_local_stl_port_info( portHandle, &smpPortInfo);
Packit 857059
		if (FSUCCESS != fstatus)
Packit 857059
		{
Packit 857059
			fprintf(stderr, "opainfo: Failed to get Portinfo for hfi:port %s\n", 
Packit 857059
					get_port_name(portHandle));
Packit 857059
			goto next;	// skip to next port, if any
Packit 857059
		}
Packit 857059
		pPortInfo = (STL_PORT_INFO *)stl_get_smp_data(&smpPortInfo);
Packit 857059
Packit 857059
		if (IsCableInfoAvailable(pPortInfo)) {
Packit 857059
			uint16_t addr;
Packit 857059
			uint8_t *data;
Packit 857059
			have_cableinfo = TRUE;	// assume success
Packit 857059
			for (addr = STL_CIB_STD_HIGH_PAGE_ADDR, data=g_cableInfo;
Packit 857059
				 addr + STL_CABLE_INFO_MAXLEN <= STL_CIB_STD_END_ADDR; addr += STL_CABLE_INFO_DATA_SIZE, data += STL_CABLE_INFO_DATA_SIZE)
Packit 857059
			{
Packit 857059
				fstatus = get_local_stl_cable_info(portHandle, addr, &smpCableInfo);
Packit 857059
				if (FSUCCESS != fstatus) {
Packit 857059
					fprintf(stderr, "opainfo: Failed to get Cableinfo for hfi:port %s\n", 
Packit 857059
							get_port_name(portHandle));
Packit 857059
					have_cableinfo = FALSE;
Packit 857059
				} else  {
Packit 857059
					memcpy(data, ((STL_CABLE_INFO *)stl_get_smp_data(&smpCableInfo))->Data, STL_CABLE_INFO_DATA_SIZE);
Packit 857059
				}
Packit 857059
			}
Packit 857059
		} else {
Packit 857059
			have_cableinfo = FALSE;
Packit 857059
		}
Packit 857059
Packit 857059
		// If PM SL not set, use SM's SL
Packit 857059
		if (pm_sl == 0xFF) {
Packit 857059
			(void)omgt_port_get_port_sm_sl(portHandle, &pm_sl);
Packit 857059
		}
Packit 857059
		g_pm_sl = pm_sl;
Packit 857059
		fstatus = get_local_stl_port_status(portHandle, &madPortStatusRsp); 
Packit 857059
		if (FSUCCESS != fstatus) {
Packit 857059
			fprintf(stderr, "opainfo: Failed to get PMA Port Status for hfi:port %s\n", 
Packit 857059
					get_port_name(portHandle));
Packit 857059
			pPortStatusRsp = NULL;
Packit 857059
		} else  {
Packit 857059
			pPortStatusRsp = (STL_PORT_STATUS_RSP *)&(madPortStatusRsp.PerfData);
Packit 857059
		}
Packit 857059
Packit 857059
		show_info(portHandle, outputType, pPortInfo, have_cableinfo?g_cableInfo:NULL, pPortStatusRsp);
Packit 857059
next:
Packit 857059
		omgt_close_port(portHandle);
Packit 857059
		portHandle = NULL;
Packit 857059
	}
Packit 857059
Packit 857059
	return 0 ;
Packit 857059
Packit 857059
}  // main