static VOID AddFullResourcesToList(HWND hwnd) { PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor; TCHAR buffer[80]; LVITEM item; ULONG i; INT iItem; for (i = 0; i < resourceValueData->Count; i++) { pFullDescriptor = &resourceValueData->List[i]; wsprintf(buffer, _T("%lu"), pFullDescriptor->BusNumber); item.mask = LVIF_TEXT; item.iItem = i; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); iItem = ListView_InsertItem(hwnd, &item); if (iItem != -1) { GetInterfaceType(pFullDescriptor->InterfaceType, buffer, 80); ListView_SetItemText(hwnd, iItem, 1, buffer); } } }
static void RPC_FlowCntrl(IPC_BufferPool Pool, IPC_FlowCtrlEvent_T Event) { IPC_EndpointId_T epId = IPC_PoolSourceEndpointId(Pool); Int8 type = GetInterfaceType(epId); Int8 pool_index; if (type != -1) { pool_index = rpcGetPoolIndex((PACKET_InterfaceType_t)type, Pool); if (ipcInfoList[(int)type].flowControlCb != NULL) ipcInfoList[(int)type].flowControlCb((Event == IPC_FLOW_START) ? RPC_FLOW_START : RPC_FLOW_STOP, (UInt8)((pool_index >= 0) ? (pool_index + 1) : 0)); _DBG_(RPC_TRACE ("RPC_FlowCntrl(%c) type=%d event=%d\r\n", (gRpcProcType == RPC_COMMS) ? 'C' : 'A', type, Event)); } }
static void RPC_BufferDelivery(IPC_Buffer bufHandle) { RPC_Result_t result = RPC_RESULT_ERROR; UInt8* pCid = (UInt8*)IPC_BufferHeaderPointer(bufHandle); IPC_EndpointId_T destId = IPC_BufferDestinationEndpointId(bufHandle); Int8 type = GetInterfaceType(destId); if(type != -1 && ipcInfoList[type].pktIndCb != NULL) result = ipcInfoList[type].pktIndCb((PACKET_InterfaceType_t)type, (UInt8)pCid[0], (PACKET_BufHandle_t)bufHandle); else _DBG_(RPC_TRACE("RPC_BufferDelivery(%c) FAIL destIP=%d handle=%x",(gRpcProcType == RPC_COMMS)?'C':'A',destId, bufHandle)); if(result != RPC_RESULT_PENDING) IPC_FreeBuffer(bufHandle); }
static int rpcKthreadFn(MsgQueueHandle_t *mHandle, void *data) { IPC_Buffer bufHandle = (IPC_Buffer) data; RPC_Result_t result = RPC_RESULT_ERROR; UInt8 *pCid = (UInt8 *)IPC_BufferHeaderPointer(bufHandle); IPC_EndpointId_T destId = IPC_BufferDestinationEndpointId(bufHandle); Int8 type = GetInterfaceType(destId); /* _DBG_(RPC_TRACE ("RPC_BufferDelivery PROCESS mHandle=%x event=%d\n", (int)mHandle, (int)data));*/ if (ipcInfoList[(int)type].filterPktIndCb != NULL) { RpcDbgUpdatePktState((int)bufHandle, PKT_STATE_RPC_PROCESS); result = ipcInfoList[(int) type].filterPktIndCb((PACKET_InterfaceType_t) type, (UInt8)pCid[0], (PACKET_BufHandle_t) bufHandle); } if (result != RPC_RESULT_PENDING) { _DBG_(RPC_TRACE ("IPC_FreeBuffer (No Handling) h=%d\r\n", (int)bufHandle)); RpcDbgUpdatePktState((int)bufHandle, PKT_STATE_PKT_FREE); IPC_FreeBuffer(bufHandle); freeRpcPkts++; rpc_wake_lock_remove((UInt32)bufHandle); } return 0; }
static VOID ParseResources(HWND hwnd) { PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor; PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor; ULONG i; HWND hwndLV; TCHAR buffer[80]; LVITEM item; INT iItem; pFullDescriptor = &resourceValueData->List[fullResourceIndex]; pPartialResourceList = &pFullDescriptor->PartialResourceList; /* Interface type */ GetInterfaceType(pFullDescriptor->InterfaceType, buffer, 80); SetDlgItemText(hwnd, IDC_INTERFACETYPE, buffer); /* Busnumber */ SetDlgItemInt(hwnd, IDC_BUSNUMBER, (UINT)pFullDescriptor->BusNumber, FALSE); /* Version */ SetDlgItemInt(hwnd, IDC_VERSION, (UINT)pPartialResourceList->Version, FALSE); /* Revision */ SetDlgItemInt(hwnd, IDC_REVISION, (UINT)pPartialResourceList->Revision, FALSE); for (i = 0; i < pPartialResourceList->Count; i++) { pDescriptor = &pPartialResourceList->PartialDescriptors[i]; switch (pDescriptor->Type) { case CmResourceTypePort: hwndLV = GetDlgItem(hwnd, IDC_PORT_LIST); #ifdef _M_AMD64 wsprintf(buffer, _T("0x%16I64x"), pDescriptor->u.Port.Start.QuadPart); #else wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Port.Start.u.LowPart); #endif item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 1000; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); item.lParam = (LPARAM)pDescriptor; iItem = ListView_InsertItem(hwndLV, &item); if (iItem != -1) { wsprintf(buffer, _T("0x%lx"), pDescriptor->u.Port.Length); ListView_SetItemText(hwndLV, iItem, 1, buffer); if (pDescriptor->Flags & CM_RESOURCE_PORT_IO) LoadString(hInst, IDS_PORT_PORT_IO, buffer, sizeof(buffer)/sizeof(TCHAR)); else LoadString(hInst, IDS_PORT_MEMORY_IO, buffer, sizeof(buffer)/sizeof(TCHAR)); ListView_SetItemText(hwndLV, iItem, 2, buffer); } break; case CmResourceTypeInterrupt: hwndLV = GetDlgItem(hwnd, IDC_IRQ_LIST); wsprintf(buffer, _T("%lu"), pDescriptor->u.Interrupt.Vector); item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 1000; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); item.lParam = (LPARAM)pDescriptor; iItem = ListView_InsertItem(hwndLV, &item); if (iItem != -1) { wsprintf(buffer, _T("%lu"), pDescriptor->u.Interrupt.Level); ListView_SetItemText(hwndLV, iItem, 1, buffer); wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Interrupt.Affinity); ListView_SetItemText(hwndLV, iItem, 2, buffer); if (pDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) LoadString(hInst, IDS_INTERRUPT_EDGE_SENSITIVE, buffer, sizeof(buffer)/sizeof(TCHAR)); else LoadString(hInst, IDS_INTERRUPT_LEVEL_SENSITIVE, buffer, sizeof(buffer)/sizeof(TCHAR)); ListView_SetItemText(hwndLV, iItem, 3, buffer); } break; case CmResourceTypeMemory: hwndLV = GetDlgItem(hwnd, IDC_MEMORY_LIST); #ifdef _M_AMD64 wsprintf(buffer, _T("0x%16I64x"), pDescriptor->u.Memory.Start.QuadPart); #else wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Memory.Start.u.LowPart); #endif item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 1000; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); item.lParam = (LPARAM)pDescriptor; iItem = ListView_InsertItem(hwndLV, &item); if (iItem != -1) { wsprintf(buffer, _T("0x%lx"), pDescriptor->u.Memory.Length); ListView_SetItemText(hwndLV, iItem, 1, buffer); switch (pDescriptor->Flags & (CM_RESOURCE_MEMORY_READ_ONLY | CM_RESOURCE_MEMORY_WRITE_ONLY)) { case CM_RESOURCE_MEMORY_READ_ONLY: LoadString(hInst, IDS_MEMORY_READ_ONLY, buffer, sizeof(buffer)/sizeof(TCHAR)); break; case CM_RESOURCE_MEMORY_WRITE_ONLY: LoadString(hInst, IDS_MEMORY_WRITE_ONLY, buffer, sizeof(buffer)/sizeof(TCHAR)); break; default: LoadString(hInst, IDS_MEMORY_READ_WRITE, buffer, sizeof(buffer)/sizeof(TCHAR)); break; } ListView_SetItemText(hwndLV, iItem, 2, buffer); } break; case CmResourceTypeDma: hwndLV = GetDlgItem(hwnd, IDC_DMA_LIST); wsprintf(buffer, _T("%lu"), pDescriptor->u.Dma.Channel); item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 1000; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); item.lParam = (LPARAM)pDescriptor; iItem = ListView_InsertItem(hwndLV, &item); if (iItem != -1) { wsprintf(buffer, _T("%lu"), pDescriptor->u.Dma.Port); ListView_SetItemText(hwndLV, iItem, 1, buffer); } break; case CmResourceTypeDeviceSpecific: hwndLV = GetDlgItem(hwnd, IDC_DEVICE_LIST); wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.DeviceSpecificData.Reserved1); item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 1000; item.iSubItem = 0; item.state = 0; item.stateMask = 0; item.pszText = buffer; item.cchTextMax = (int)_tcslen(item.pszText); item.lParam = (LPARAM)pDescriptor; iItem = ListView_InsertItem(hwndLV, &item); if (iItem != -1) { wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.DeviceSpecificData.Reserved2); ListView_SetItemText(hwndLV, iItem, 1, buffer); wsprintf(buffer, _T("0x%lx"), pDescriptor->u.DeviceSpecificData.DataSize); ListView_SetItemText(hwndLV, iItem, 2, buffer); } break; } } }
static void RPC_BufferDelivery(IPC_Buffer bufHandle) { PACKET_InterfaceType_t ifType; RPC_IPCInfo_t *pInfo; Int32 isReservedPkt = 0; int ret; RPC_Result_t result = RPC_RESULT_ERROR; UInt8 *pCid = (UInt8 *)IPC_BufferHeaderPointer(bufHandle); IPC_EndpointId_T destId = IPC_BufferDestinationEndpointId(bufHandle); int type = GetInterfaceType(destId); PACKET_BufHandle_t pktBufHandle = (PACKET_BufHandle_t) bufHandle; if (type == -1 || pCid == NULL) { IPC_FreeBuffer(bufHandle); _DBG_(RPC_TRACE("RPC_BufferDelivery FAIL pkt=%d t=%d cid=%d", pktBufHandle, type, pCid)); return; } pInfo = &ipcInfoList[type]; ifType = (PACKET_InterfaceType_t)type; if (pInfo->pktIndCb == NULL && pInfo->filterPktIndCb == NULL) { IPC_FreeBuffer(bufHandle); _DBG_(RPC_TRACE("RPC_BufferDelivery FAIL No Cbk pkt=%d\r\n", pktBufHandle)); return; } if (ifType != INTERFACE_PACKET) { IPC_U32 uParam; /*For bckward compatibility, remove in future release */ uParam = IPC_BufferUserParameterGet(bufHandle); if (uParam == CAPI2_RESERVE_POOL_ID) { /* TBD: Add recovery mechanism */ IPC_FreeBuffer(bufHandle); _DBG_(RPC_TRACE ("RPC_BufferDelivery RESERVED (Drop) h=%d if=%d rcvPkts=%d freePkts=%d\r\n", (int)bufHandle, (int)type, (int)recvRpcPkts, (int)freeRpcPkts)); return; } isReservedPkt = RPC_PACKET_IsReservedPkt(pktBufHandle); /* Log incoming packet */ rpcLogNewPacket(pktBufHandle, ifType, pInfo, pCid, isReservedPkt); } if (pInfo->pktIndCb != NULL && isReservedPkt == 0) result = pInfo->pktIndCb((PACKET_InterfaceType_t)type, (UInt8)pCid[0], pktBufHandle); if (result == RPC_RESULT_PENDING) return; /* Sysrpc packet come here */ if (pInfo->filterPktIndCb == NULL) { IPC_FreeBuffer(bufHandle); rpcLogFreePacket((PACKET_InterfaceType_t)type, pktBufHandle); return; /* net or vt interface pkt come here */ } #ifdef USE_KTHREAD_HANDOVER if (isReservedPkt && MsgQueueCount(&rpcMQhandle) >= CFG_RPC_CMD_MAX_PACKETS) { IPC_FreeBuffer(bufHandle); rpcLogFreePacket((PACKET_InterfaceType_t)type, pktBufHandle); _DBG_(RPC_TRACE("RPC_BufferDelivery(rz) RpcQ FULL h=%d c=%d\n", (int)bufHandle, MsgQueueCount(&rpcMQhandle))); return; } /* Post it to RPC Thread */ ret = MsgQueueAdd(&rpcMQhandle, (void *)bufHandle); if (ret != 0) { IPC_FreeBuffer(bufHandle); rpcLogFreePacket((PACKET_InterfaceType_t)type, pktBufHandle); _DBG_(RPC_TRACE("RPC_BufferDelivery Queue FAIL h=%d r=%d\n", (int)bufHandle, ret)); return; } RpcDbgUpdatePktState((int)bufHandle, PKT_STATE_RPC_POST); result = RPC_RESULT_PENDING; #else /* If using workerqueue instead of tasklet, filterPktIndCb can be called directly */ result = pInfo->filterPktIndCb((PACKET_InterfaceType_t)type, (UInt8)pCid[0], (PACKET_BufHandle_t) bufHandle); #endif /* If Packet not consumed by secondary client then return */ //Coverity [DEADCODE] if (result != RPC_RESULT_PENDING) { /* Packet was never consumed */ /* coverity [dead_error_line] */ IPC_FreeBuffer(bufHandle); rpcLogFreePacket((PACKET_InterfaceType_t)type, pktBufHandle); _DBG_(RPC_TRACE("RPC_BufferDelivery filterCb FAIL h=%d r=%d\n", (int)bufHandle, ret)); return; } _DBG_(RPC_TRACE("RPC_BufferDelivery filterCb OK h=%d\n", (int)bufHandle)); return; }