📄 skgepnmi.c
字号:
pAC->Pnmi.PciBusWidth = 32; } /* Get chipset. */ switch (pAC->GIni.GIChipId) { case CHIP_ID_YUKON: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON; break; case CHIP_ID_YUKON_LITE: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LITE; break; case CHIP_ID_YUKON_LP: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LP; break; case CHIP_ID_YUKON_XL: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_XL; break; case CHIP_ID_YUKON_EC: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_EC; break; case CHIP_ID_YUKON_FE: pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_FE; break; default: break; } /* Get PMD and Device Type. */ switch (pAC->GIni.GIPmdTyp) { case 'S': pAC->Pnmi.PMD = 3; pAC->Pnmi.DeviceType = 0x00020001; break; case 'L': pAC->Pnmi.PMD = 2; pAC->Pnmi.DeviceType = 0x00020003; break; case 'C': pAC->Pnmi.PMD = 4; pAC->Pnmi.DeviceType = 0x00020005; break; case 'T': pAC->Pnmi.PMD = 5; pAC->Pnmi.DeviceType = 0x00020007; break; default : pAC->Pnmi.PMD = 1; pAC->Pnmi.DeviceType = 0; break; } if (pAC->GIni.GIMacsFound > 1) { pAC->Pnmi.DeviceType++; } /* Get connector type. */ switch (pAC->GIni.GIConTyp) { case 'C': pAC->Pnmi.Connector = 2; break; case 'D': pAC->Pnmi.Connector = 3; break; case 'F': pAC->Pnmi.Connector = 4; break; case 'J': pAC->Pnmi.Connector = 5; break; case 'V': pAC->Pnmi.Connector = 6; break; default: pAC->Pnmi.Connector = 1; break; } break; case SK_INIT_RUN: /* Start timer for RLMT change counter. */ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer, SK_PNMI_EVT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, EventParam); break; default: break; /* Nothing to do. */ } return (0);}/***************************************************************************** * * SkPnmiGetVar - Retrieves the value of a single OID * * Description: * Calls a general sub-function for all this stuff. If the instance * -1 is passed, the values of all instances are returned in an * array of values. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed * SK_PNMI_ERR_GENERAL A general severe internal error occured * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take * the data. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't * exist (e.g. port instance 3 on a two port * adapter. */int SkPnmiGetVar(SK_AC *pAC, /* Pointer to adapter context */SK_IOC IoC, /* IO context handle */SK_U32 Id, /* Object ID that is to be processed */void *pBuf, /* Buffer to which the management data will be copied */unsigned int *pLen, /* On call: buffer length. On return: used buffer */SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */{ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiGetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", Id, *pLen, Instance, NetIndex)); return (PnmiVar(pAC, IoC, SK_PNMI_GET, Id, (char *)pBuf, pLen, Instance, NetIndex));}/***************************************************************************** * * SkPnmiPreSetVar - Presets the value of a single OID * * Description: * Calls a general sub-function for all this stuff. The preset does * the same as a set, but returns just before finally setting the * new value. This is usefull to check if a set might be successfull. * If the instance -1 is passed, an array of values is supposed and * all instances of the OID will be set. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed. * SK_PNMI_ERR_GENERAL A general severe internal error occured. * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't * exist (e.g. port instance 3 on a two port * adapter. */int SkPnmiPreSetVar(SK_AC *pAC, /* Pointer to adapter context */SK_IOC IoC, /* IO context handle */SK_U32 Id, /* Object ID that is to be processed */void *pBuf, /* Buffer to which the management data will be copied */unsigned int *pLen, /* Total length of management data */SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */{ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", Id, *pLen, Instance, NetIndex)); return (PnmiVar(pAC, IoC, SK_PNMI_PRESET, Id, (char *)pBuf, pLen, Instance, NetIndex));}/***************************************************************************** * * SkPnmiSetVar - Sets the value of a single OID * * Description: * Calls a general sub-function for all this stuff. The preset does * the same as a set, but returns just before finally setting the * new value. This is usefull to check if a set might be successfull. * If the instance -1 is passed, an array of values is supposed and * all instances of the OID will be set. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed. * SK_PNMI_ERR_GENERAL A general severe internal error occured. * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't * exist (e.g. port instance 3 on a two port * adapter. */int SkPnmiSetVar(SK_AC *pAC, /* Pointer to adapter context */SK_IOC IoC, /* IO context handle */SK_U32 Id, /* Object ID that is to be processed */void *pBuf, /* Buffer to which the management data will be copied */unsigned int *pLen, /* Total length of management data */SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */{ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", Id, *pLen, Instance, NetIndex)); return (PnmiVar(pAC, IoC, SK_PNMI_SET, Id, (char *)pBuf, pLen, Instance, NetIndex));}/***************************************************************************** * * SkPnmiGetStruct - Retrieves the management database in SK_PNMI_STRUCT_DATA * * Description: * Runs through the IdTable, queries the single OIDs and stores the * returned data into the management database structure * SK_PNMI_STRUCT_DATA. The offset of the OID in the structure * is stored in the IdTable. The return value of the function will also * be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the * minimum size of SK_PNMI_MIN_STRUCT_SIZE. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed * SK_PNMI_ERR_GENERAL A general severe internal error occured * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take * the data. * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist */int SkPnmiGetStruct(SK_AC *pAC, /* Pointer to adapter context */SK_IOC IoC, /* IO context handle */void *pBuf, /* Buffer to which the management data will be copied. */unsigned int *pLen, /* Length of buffer */SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */{ int Ret; unsigned int TableIndex; unsigned int DstOffset; unsigned int InstanceNo; unsigned int InstanceCnt; SK_U32 Instance; unsigned int TmpLen; char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE]; SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiGetStruct: Called, BufLen=%d, NetIndex=%d\n", *pLen, NetIndex)); if (*pLen < SK_PNMI_STRUCT_SIZE) { if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) { SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, (SK_U32)(-1)); } *pLen = SK_PNMI_STRUCT_SIZE; return (SK_PNMI_ERR_TOO_SHORT); } /* Check NetIndex. */ if (NetIndex >= pAC->Rlmt.NumNets) { return (SK_PNMI_ERR_UNKNOWN_NET); } /* Update statistics. */ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On call"); if ((Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1)) != SK_PNMI_ERR_OK) { SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); *pLen = SK_PNMI_MIN_STRUCT_SIZE; return (Ret); } if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) { SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); *pLen = SK_PNMI_MIN_STRUCT_SIZE; return (Ret); } if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) { SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); *pLen = SK_PNMI_MIN_STRUCT_SIZE; return (Ret); } /* Increment semaphores to indicate that an update was already done. */ pAC->Pnmi.MacUpdatedFlag ++; pAC->Pnmi.RlmtUpdatedFlag ++; pAC->Pnmi.SirqUpdatedFlag ++; /* * Get VPD keys for instance calculation. * Please read comment in Vpd(). */ if (pAC->Pnmi.VpdKeyReadError == SK_FALSE) { Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen); if ((Ret != SK_PNMI_ERR_OK) && (pAC->Pnmi.VpdKeyReadError == SK_FALSE)){ pAC->Pnmi.MacUpdatedFlag --; pAC->Pnmi.RlmtUpdatedFlag --; pAC->Pnmi.SirqUpdatedFlag --; SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return"); SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); *pLen = SK_PNMI_MIN_STRUCT_SIZE; return (SK_PNMI_ERR_GENERAL); } } /* Retrieve values. */ SK_MEMSET((char *)pBuf, 0, SK_PNMI_STRUCT_SIZE); for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) { InstanceNo = IdTable[TableIndex].InstanceNo; for (InstanceCnt = 1; InstanceCnt <= InstanceNo; InstanceCnt ++) { DstOffset = IdTable[TableIndex].Offset + (InstanceCnt - 1) * IdTable[TableIndex].StructSize; /* * For the VPD the instance is not an index number * but the key itself. Determin with the instance * counter the VPD key to be used. */ if (IdTable[TableIndex].Id == OID_SKGE_VPD_KEY || IdTable[TableIndex].Id == OID_SKGE_VPD_VALUE || IdTable[TableIndex].Id == OID_SKGE_VPD_ACCESS || IdTable[TableIndex].Id == OID_SKGE_VPD_ACTION) { SK_STRNCPY((char *)&Instance, KeyArr[InstanceCnt - 1], 4); } else { Instance = (SK_U32)InstanceCnt; } TmpLen = *pLen - DstOffset; Ret = IdTable[TableIndex].Func(pAC, IoC, SK_PNMI_GET, IdTable[TableIndex].Id, (char *)pBuf + DstOffset, &TmpLen, Instance, TableIndex, NetIndex); /* * An unknown instance error means that we reached * the last instance of that variable. Proceed with * the next OID in the table and ignore the return * code. */ if (Ret == SK_PNMI_ERR_UNKNOWN_INST) { break; } if (Ret != SK_PNMI_ERR_OK) { pAC->Pnmi.MacUpdatedFlag --; pAC->Pnmi.RlmtUpdatedFlag --; pAC->Pnmi.SirqUpdatedFlag --; SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return"); SK_PNMI_SET_STAT(pBuf, Ret, DstOffset); *pLen = SK_PNMI_MIN_STRUCT_SIZE; return (Ret); } } } pAC->Pnmi.MacUpdatedFlag --; pAC->Pnmi.RlmtUpdatedFlag --; pAC->Pnmi.SirqUpdatedFlag --; *pLen = SK_PNMI_STRUCT_SIZE; SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return"); SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1)); return (SK_PNMI_ERR_OK);}/***************************************************************************** * * SkPnmiPreSetStruct - Presets the management database in SK_PNMI_STRUCT_DATA * * Description: * Calls a general sub-function for all this set stuff. The preset does * the same as a set, but returns just before finally setting the * new value. This is usefull to check if a set might be successfull. * The sub-function runs through the IdTable, checks which OIDs are able * to set, and calls the handler function of the OID to perform the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -