Blame Esm/ib/src/pm/include/pa_access.h

Packit 857059
/* BEGIN_ICS_COPYRIGHT3 ****************************************
Packit 857059
Packit 857059
Copyright (c) 2015-2018, 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_COPYRIGHT3   ****************************************/
Packit 857059
Packit 857059
/* [ICS VERSION STRING: unknown] */
Packit 857059
Packit 857059
#ifndef _PAACCESS_H
Packit 857059
#define _PAACCESS_H
Packit 857059
Packit 857059
#include <iba/ibt.h>
Packit 857059
Packit 857059
#include <iba/ipublic.h>
Packit 857059
#include <stdio.h>
Packit 857059
#include <stdlib.h>
Packit 857059
#include <stdarg.h>
Packit 857059
#include <unistd.h>
Packit 857059
#include <ctype.h>
Packit 857059
#define _GNU_SOURCE
Packit 857059
Packit 857059
#include <iba/stl_pm.h>
Packit 857059
#include <iba/stl_pa_priv.h>
Packit 857059
#include "pm_topology.h"
Packit 857059
Packit 857059
#ifdef __cplusplus
Packit 857059
extern "C" {
Packit 857059
#endif
Packit 857059
Packit 857059
// DEFINES
Packit 857059
Packit 857059
#define	BAD_IMAGE_ID	(uint64)-1
Packit 857059
Packit 857059
#define PA_INC_COUNTER_NO_OVERFLOW(cntr, max) do { if (cntr >= max) { cntr = max; } else { cntr++; } } while(0)
Packit 857059
Packit 857059
// DATA TYPES
Packit 857059
Packit 857059
typedef struct _pmNameListEntry_s {
Packit 857059
	char			Name[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
} PmNameListEntry_t;
Packit 857059
Packit 857059
typedef struct _pmGroupList_s {
Packit 857059
	uint32				NumGroups;
Packit 857059
	PmNameListEntry_t   *GroupList;
Packit 857059
} PmGroupList_t;
Packit 857059
Packit 857059
typedef struct _pmGroupInfo_s {
Packit 857059
	char			groupName[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumIntPorts;
Packit 857059
	uint32			NumExtPorts;
Packit 857059
	PmUtilStats_t	IntUtil;	// when both ports in group
Packit 857059
	PmUtilStats_t	SendUtil;	// send from group to outside
Packit 857059
	PmUtilStats_t	RecvUtil;	// recv by group from outside
Packit 857059
	// for Internal (in-group) we count one each port (both are in group)
Packit 857059
	// for External (between-group), we count worst of our port and its neighbor
Packit 857059
	PmErrStats_t	IntErr;// in group
Packit 857059
	PmErrStats_t	ExtErr;// between groups
Packit 857059
	uint8			MinIntRate;
Packit 857059
	uint8			MaxIntRate;
Packit 857059
	uint8			MinExtRate;
Packit 857059
	uint8			MaxExtRate;
Packit 857059
} PmGroupInfo_t;
Packit 857059
Packit 857059
typedef struct _pmPortConfig_s {
Packit 857059
	STL_LID 		lid;
Packit 857059
	uint8			portNum;
Packit 857059
	uint8			reserved2[3];
Packit 857059
	uint64			guid;
Packit 857059
	char			nodeDesc[64];	// can be 64 char w/o \0
Packit 857059
} PmPortConfig_t;
Packit 857059
Packit 857059
typedef struct _pmGroupConfig_s {
Packit 857059
	char			groupName[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumPorts;
Packit 857059
	uint32			portListSize;
Packit 857059
	PmPortConfig_t	*portList;
Packit 857059
} PmGroupConfig_t;
Packit 857059
Packit 857059
typedef struct _pmFocusPortEntry_s {
Packit 857059
	STL_LID 		lid;
Packit 857059
	uint8			portNum;
Packit 857059
	uint8   		rate;			// IB_STATIC_RATE
Packit 857059
	uint8   		maxVlMtu;		// enum STL MTU
Packit 857059
	uint8			neighborPortNum;
Packit 857059
	STL_LID 		neighborLid;
Packit 857059
	uint8			localStatus:4;
Packit 857059
	uint8			neighborStatus:4;
Packit 857059
	uint8           reserved[3];
Packit 857059
	uint64			value[MAX_NUM_FOCUS_PORT_TUPLES];
Packit 857059
	uint64			guid;
Packit 857059
	char			nodeDesc[64];	// can be 64 char w/o \0
Packit 857059
	uint64			neighborValue[MAX_NUM_FOCUS_PORT_TUPLES];
Packit 857059
	uint64			neighborGuid;
Packit 857059
	char			neighborNodeDesc[64];	// can be 64 char w/o \0
Packit 857059
} PmFocusPortEntry_t;
Packit 857059
Packit 857059
typedef struct _pmFocusPorts_s {
Packit 857059
	char			name[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumPorts;
Packit 857059
	uint32			portCntr;
Packit 857059
	PmFocusPortEntry_t	*portList;
Packit 857059
} PmFocusPorts_t;
Packit 857059
Packit 857059
typedef struct _focusArrayItem_s {
Packit 857059
	uint64 localValue;
Packit 857059
	uint64 neighborValue;
Packit 857059
	STL_LID localLID;
Packit 857059
	STL_LID neighborLID;
Packit 857059
	PmPort_t *localPort;
Packit 857059
	PmPort_t *neighborPort;
Packit 857059
} focusArrayItem_t;
Packit 857059
Packit 857059
typedef struct smInfo_s {
Packit 857059
	STL_LID	smLid;		// implies port, 0 if empty record
Packit 857059
	uint8	priority:4;		// present priority
Packit 857059
	uint8	state:4;		// present state
Packit 857059
	uint8	portNumber;
Packit 857059
	uint8	reserved2;
Packit 857059
	uint64	smPortGuid;
Packit 857059
	char	smNodeDesc[64];	// can be 64 char w/o \0
Packit 857059
} PmSmInfo_t;
Packit 857059
Packit 857059
typedef struct _pmImageInfo_s {
Packit 857059
	uint64						sweepStart;
Packit 857059
	uint32						sweepDuration;
Packit 857059
	uint16						numHFIPorts;
Packit 857059
//	TFI not included in Gen1
Packit 857059
//	uint16						numTFIPorts;
Packit 857059
	uint16						numSwitchNodes;
Packit 857059
	uint32						numSwitchPorts;
Packit 857059
	uint32						numLinks;
Packit 857059
	uint32						numSMs;
Packit 857059
	uint32						numNoRespNodes;
Packit 857059
	uint32						numNoRespPorts;
Packit 857059
	uint32						numSkippedNodes;
Packit 857059
	uint32						numSkippedPorts;
Packit 857059
	uint32						numUnexpectedClearPorts;
Packit 857059
	uint32						imageInterval;
Packit 857059
	PmSmInfo_t					SMInfo[2];
Packit 857059
} PmImageInfo_t;
Packit 857059
Packit 857059
typedef struct _pmVFList_s {
Packit 857059
	uint32			   NumVFs;
Packit 857059
	PmNameListEntry_t  *VfList;	// \0 terminated
Packit 857059
} PmVFList_t;
Packit 857059
Packit 857059
typedef struct _pmVFConfig_s {
Packit 857059
	char			vfName[STL_PM_VFNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumPorts;
Packit 857059
	uint32			portListSize;
Packit 857059
	PmPortConfig_t	*portList;
Packit 857059
} PmVFConfig_t;
Packit 857059
Packit 857059
typedef struct _pmVFInfo_s {
Packit 857059
	char			vfName[STL_PM_VFNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumPorts;
Packit 857059
	PmUtilStats_t	IntUtil;	// when both ports in group
Packit 857059
	PmErrStats_t	IntErr;
Packit 857059
	uint8			MinIntRate;
Packit 857059
	uint8			MaxIntRate;
Packit 857059
} PmVFInfo_t;
Packit 857059
Packit 857059
typedef struct _pmNodeInfo_s {
Packit 857059
	STL_LID 		nodeLid;
Packit 857059
	uint8			nodeType;
Packit 857059
	uint8			reserved2[3];
Packit 857059
	uint64			nodeGuid;
Packit 857059
	uint64		portSelectMask[4];
Packit 857059
	char			nodeDesc[64];	// can be 64 char w/o \0
Packit 857059
} PmNodeInfo_t;
Packit 857059
Packit 857059
Packit 857059
typedef struct _pmGroupNodeInfo_s {
Packit 857059
	char			groupName[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumNodes;
Packit 857059
	PmNodeInfo_t		*nodeList;
Packit 857059
} PmGroupNodeInfo_t;
Packit 857059
Packit 857059
typedef struct _pmLinkInfo_s {
Packit 857059
	STL_LID 		fromLid;
Packit 857059
	STL_LID 		toLid;
Packit 857059
	uint8			fromPort;
Packit 857059
	uint8			toPort;
Packit 857059
	uint8			mtu:4;
Packit 857059
	uint8			activeSpeed:4;
Packit 857059
	uint8			txLinkWidthDowngradeActive:4;
Packit 857059
	uint8			rxLinkWidthDowngradeActive:4;
Packit 857059
	uint8			localStatus:4;
Packit 857059
	uint8			neighborStatus:4;
Packit 857059
	uint8			reserved2[3];
Packit 857059
} PmLinkInfo_t;
Packit 857059
Packit 857059
Packit 857059
typedef struct _pmGroupLinkInfo_s {
Packit 857059
	char			groupName[STL_PM_GROUPNAMELEN];	// \0 terminated
Packit 857059
	uint32			NumLinks;
Packit 857059
	PmLinkInfo_t		*linkInfoList;
Packit 857059
} PmGroupLinkInfo_t;
Packit 857059
Packit 857059
Packit 857059
// FUNCTION PROTOTYPES
Packit 857059
Packit 857059
/* BEGIN pa_utility.c */
Packit 857059
const char *FSTATUS_ToString(FSTATUS status);
Packit 857059
Packit 857059
FSTATUS FindImage(Pm_t *pm, uint8 type, STL_PA_IMAGE_ID_DATA imageId, uint32 *imageIndex,
Packit 857059
	uint64 *retImageId, PmHistoryRecord_t **record, const char **msg, uint8 *clientId,
Packit 857059
	PmCompositeImage_t **cimg);
Packit 857059
FSTATUS FindPmImage(const char *func, Pm_t *pm, STL_PA_IMAGE_ID_DATA req_img,
Packit 857059
	STL_PA_IMAGE_ID_DATA *rsp_img, PmImage_t **pm_image, uint32 *imageIndex,
Packit 857059
	boolean *requiresLock);
Packit 857059
Packit 857059
int getCachedCimgIdx(Pm_t *pm, PmCompositeImage_t *cimg);
Packit 857059
uint64 BuildFreezeFrameImageId(Pm_t *pm, uint32 freezeIndex, uint8 clientId, uint32 *imageTime);
Packit 857059
FSTATUS LocateGroup(PmImage_t *pmimagep, const char *groupName, int *groupIndex);
Packit 857059
FSTATUS LocateVF(PmImage_t *pmimagep, const char *vfName, int *vfIdx);
Packit 857059
/* END pa_utility.c */
Packit 857059
Packit 857059
// Note - API expects caller to define a Pm_t structure, which apps will do for now
Packit 857059
//        Later, PM will handle this, and the parameter can be removed
Packit 857059
Packit 857059
// get group list - caller declares Pm_T and PmGroupList_t, and passes pointers
Packit 857059
FSTATUS paGetGroupList(Pm_t *pm, PmGroupList_t *GroupList, STL_PA_IMAGE_ID_DATA imageId,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get group info - caller declares Pm_T and PmGroupInfo_t, and passes pointers
Packit 857059
FSTATUS paGetGroupInfo(Pm_t *pm, char *groupName, PmGroupInfo_t *pmGroupInfo,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get group config - caller declares Pm_T and PmGroupConfig_t, and passes pointers
Packit 857059
FSTATUS paGetGroupConfig(Pm_t *pm, char *groupName, PmGroupConfig_t *pmGroupConfig,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get group node info - caller declares Pm_T and PmGroupConfig_t, and passes pointers
Packit 857059
FSTATUS paGetGroupNodeInfo(Pm_t *pm, char *groupName, uint64 nodeGUID, STL_LID nodeLID,
Packit 857059
	char *nodeDesc, PmGroupNodeInfo_t *pmGroupNodeInfo, STL_PA_IMAGE_ID_DATA imageId,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get group link info - caller declares Pm_T and PmGroupConfig_t, and passes pointers
Packit 857059
FSTATUS paGetGroupLinkInfo(Pm_t *pm, char *groupName, STL_LID inputLID, uint8 inputPort,
Packit 857059
	PmGroupLinkInfo_t *pmGroupLinkInfo, STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get port stats - caller declares Pm_T and PmCompositePortCounters_t
Packit 857059
//                  delta - 1 requests delta counters, 0 gets raw total
Packit 857059
//                  userCntrs - 1 requests PA user controled counters, 0 gets Pm Controlled Image Counters. if 1 delta and ofset must be 0
Packit 857059
FSTATUS paGetPortStats(Pm_t *pm, STL_LID lid, uint8 portNum, PmCompositePortCounters_t *portCountersP,
Packit 857059
	uint32 delta, uint32 userCntrs, STL_PA_IMAGE_ID_DATA imageId, uint32 *flagsp,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// Clear Running totals for a port.  This simulates a PMA clear so
Packit 857059
// that tools like opareport can work against the Running totals
Packit 857059
FSTATUS paClearPortStats(Pm_t *pm, STL_LID lid, uint8 portNum,
Packit 857059
	CounterSelectMask_t select);
Packit 857059
Packit 857059
// Clear Running totals for all Ports.  This simulates a PMA clear so
Packit 857059
// that tools like opareport can work against the Running totals
Packit 857059
FSTATUS paClearAllPortStats(Pm_t *pm, CounterSelectMask_t select);
Packit 857059
Packit 857059
FSTATUS paFreezeFrameRenew(Pm_t *pm, STL_PA_IMAGE_ID_DATA *imageId);
Packit 857059
Packit 857059
FSTATUS paFreezeFrameRelease(Pm_t *pm, STL_PA_IMAGE_ID_DATA *imageId);
Packit 857059
Packit 857059
FSTATUS paFreezeFrameCreate(Pm_t *pm, STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *retImageId);
Packit 857059
Packit 857059
FSTATUS paFreezeFrameMove(Pm_t *pm, STL_PA_IMAGE_ID_DATA ffImageId, STL_PA_IMAGE_ID_DATA imageId,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
FSTATUS paGetFocusPorts(Pm_t *pm, char *groupName, PmFocusPorts_t *pmFocusPorts,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId, uint32 select,
Packit 857059
	uint32 start, uint32 range);
Packit 857059
Packit 857059
FSTATUS paGetExtFocusPorts(Pm_t *pm, char *groupName, PmFocusPorts_t *pmFocusPorts,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId, uint32 select,
Packit 857059
	uint32 start, uint32 range);
Packit 857059
Packit 857059
FSTATUS paGetMultiFocusPorts(Pm_t *pm, char *groupName, PmFocusPorts_t *pmFocusPorts,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId, uint32 start,
Packit 857059
	uint32 range, STL_FOCUS_PORT_TUPLE *tple, uint8 oper);
Packit 857059
Packit 857059
FSTATUS paGetImageInfo(Pm_t *pm, STL_PA_IMAGE_ID_DATA imageId, PmImageInfo_t *imageInfo,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get vf list - caller declares Pm_T and PmGroupList_t, and passes pointers
Packit 857059
FSTATUS paGetVFList(Pm_t *pm, PmVFList_t *pmVFList, STL_PA_IMAGE_ID_DATA imageId,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get vf config - caller declares Pm_T and PmVFConfig_t, and passes pointers
Packit 857059
FSTATUS paGetVFConfig(Pm_t *pm, char *vfName, uint64 vfSid, PmVFConfig_t *pmVFConfig,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get vf info - caller declares Pm_T and PmGroupInfo_t, and passes pointers
Packit 857059
FSTATUS paGetVFInfo(Pm_t *pm, char *vfName, PmVFInfo_t *pmVFInfo, STL_PA_IMAGE_ID_DATA imageId,
Packit 857059
	STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
// get vf port stats - caller declares Pm_T and PmCompositeVLCounters_t
Packit 857059
//                  delta - 1 requests delta counters, 0 gets raw total
Packit 857059
//                  userCntrs - 1 requests PA user controled counters, 0 gets Pm Controlled Image Counters. if 1 delta and ofset must be 0
Packit 857059
FSTATUS paGetVFPortStats(Pm_t *pm, STL_LID lid, uint8 portNum, char *vfName,
Packit 857059
	PmCompositeVLCounters_t *vfPortCountersP, uint32 delta, uint32 userCntrs,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, uint32 *flagsp, STL_PA_IMAGE_ID_DATA *returnImageId);
Packit 857059
Packit 857059
FSTATUS paClearVFPortStats(Pm_t *pm, STL_LID lid, uint8 portNum, STLVlCounterSelectMask select,
Packit 857059
	char *vfName);
Packit 857059
Packit 857059
FSTATUS paGetVFFocusPorts(Pm_t *pm, char *vfName, PmFocusPorts_t *pmVFFocusPorts,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId, uint32 select,
Packit 857059
	uint32 start, uint32 range);
Packit 857059
Packit 857059
FSTATUS paGetExtVFFocusPorts(Pm_t *pm, char *vfName, PmFocusPorts_t *pmVFFocusPorts,
Packit 857059
	STL_PA_IMAGE_ID_DATA imageId, STL_PA_IMAGE_ID_DATA *returnImageId, uint32 select,
Packit 857059
	uint32 start, uint32 range);
Packit 857059
Packit 857059
static inline boolean pa_valid_port(PmPort_t *pmportp, boolean sth) {
Packit 857059
	if (!pmportp ||
Packit 857059
		/* if this is a sth image, the port may be 'empty' but not null
Packit 857059
		   'Empty' ports should be excluded from the count, and can be
Packit 857059
		   indentified by their having a port num and guid of 0 */
Packit 857059
		(sth && !pmportp->guid && !pmportp->portNum)) return FALSE;
Packit 857059
	return TRUE;
Packit 857059
}
Packit 857059
Packit 857059
static inline uint8_t pa_get_port_status(PmPort_t *pmportp, uint32_t imageIndex)
Packit 857059
{
Packit 857059
	PmPortImage_t *portImage;
Packit 857059
	if (!pmportp) {
Packit 857059
		return STL_PA_FOCUS_STATUS_TOPO_FAILURE;
Packit 857059
	} else if (pmportp->u.s.PmaAvoid) {
Packit 857059
		// This means the PM was told to ignore this port during a sweep
Packit 857059
		return STL_PA_FOCUS_STATUS_PMA_IGNORE;
Packit 857059
	} else {
Packit 857059
		portImage = &pmportp->Image[imageIndex];
Packit 857059
		if (portImage->u.s.queryStatus != PM_QUERY_STATUS_OK) {
Packit 857059
			// This means there was a failure during the PM sweep when querying this port
Packit 857059
			return STL_PA_FOCUS_STATUS_PMA_FAILURE;
Packit 857059
		} else if (portImage->u.s.UnexpectedClear) {
Packit 857059
			// This means unexpected clear was set
Packit 857059
			return STL_PA_FOCUS_STATUS_UNEXPECTED_CLEAR;
Packit 857059
		}
Packit 857059
	}
Packit 857059
	return STL_PA_FOCUS_STATUS_OK;
Packit 857059
}
Packit 857059
Packit 857059
/* PA STH MACROs for loops */
Packit 857059
#define for_some_pmports_sth(PMNODE, PMPORT, PORTNUM, START, END, STH_BOOL) \
Packit 857059
	for (PORTNUM = START, PMPORT = pm_get_port(PMNODE, PORTNUM); \
Packit 857059
		PORTNUM <= END; \
Packit 857059
		++PORTNUM, PMPORT = pm_get_port(PMNODE, PORTNUM)) \
Packit 857059
	if (pa_valid_port(PMPORT, STH_BOOL))
Packit 857059
Packit 857059
#define for_all_pmports_sth(PMNODE, PMPORT, PORTNUM, STH_BOOL) \
Packit 857059
	for_some_pmports_sth(PMNODE, PMPORT, PORTNUM, pm_get_port_idx(PMNODE), (PMNODE)->numPorts, STH_BOOL)
Packit 857059
Packit 857059
/** Example usage:
Packit 857059
 *
Packit 857059
 *  for_all_pmnodes(pmimagep, pmnodep lid) {
Packit 857059
 *  	for_all_pmports(pmnodep, pmportp, portnum, sth) {
Packit 857059
 *  		portImage = &pmportp->Image[imageIndex];
Packit 857059
 *  		// DO WORK
Packit 857059
 *  	}
Packit 857059
 *  }
Packit 857059
 */
Packit 857059
#ifdef __cplusplus
Packit 857059
};
Packit 857059
#endif
Packit 857059
Packit 857059
#endif /* _PAACCESS_H */
Packit 857059