示例#1
0
Boolean RPC_IsRegisteredClient(UInt8 channel, PACKET_BufHandle_t dataBufHandle)
{
	Boolean ret = FALSE;

	UInt8 xdrReqClient =
	    RPC_PACKET_GetContext(INTERFACE_CAPI2, dataBufHandle);
	UInt16 msgId = RPC_PACKET_GetContextEx(INTERFACE_CAPI2, dataBufHandle);
	Boolean isValid = RPC_IsValidMsg((MsgType_t)msgId);
	UInt8 clientHandle = RPC_SYS_GetClientHandle(channel);
	UInt8 clientAckHandle = RPC_SYS_GetClientHandle(xdrReqClient);

	if (msgId == MSG_CAPI2_ACK_RSP) {
		ret = (xdrReqClient > 0 && clientAckHandle > 0);

	} else {
		if (channel > 0)
			ret = (clientHandle != 0) ? TRUE : FALSE;
		else
			ret = isValid;
	}

	if (ret)
		_DBG_(RPC_TRACE
		      ("RPC_IsRegisteredClient[ret=%d] ch=%d xdrClient=%d msgId=0x%x validMsg=%d validClient=%d validAckClient=%d",
		       ret, channel, xdrReqClient, msgId, isValid, clientHandle,
		       clientAckHandle));
	return ret;
}
示例#2
0
void RPC_AckCPReset(UInt8 clientID)
{
	UInt8 index = RPC_SYS_GetClientHandle(clientID);
	int i;
	Boolean bReady = TRUE;

	_DBG_(RPC_TRACE("RPC_AckCPReset client %d index %d\n",
			clientID, index));

	if (index <= gClientIndex)
		gClientLocalMap[index].ackdCPReset = TRUE;

	/* check if all for given PACKET_InterfaceType_t have ack'd;
	   if so, ack to rpc_ipc layer
	 */
	for (i = 1; i <= gClientIndex; i++)
		if (gClientMap[index].iType == gClientMap[i].iType &&
		    gClientMap[i].cpResetCb &&
		    !gClientLocalMap[i].ackdCPReset) {
			/* at least one client for given
			   interface type has not yet ack'd
			   so we're not ready yet
			 */
			_DBG_(RPC_TRACE("RPC_AckCPReset fail index %d\n", i));
			bReady = FALSE;
			break;
		} else {
			_DBG_(RPC_TRACE("RPC_AckCPReset %d %d %d %d %d\n",
					i, index, gClientMap[index].iType,
					gClientMap[i].iType,
					gClientLocalMap[i].ackdCPReset));
		}

	if (bReady) {
		_DBG_(RPC_TRACE
		      ("RPC_AckCPReset calling RPC_PACKET_AckReadyForCPReset\n"));
		RPC_PACKET_AckReadyForCPReset(0,
					      (PACKET_InterfaceType_t)
					      gClientMap[index].iType);
	}
}
示例#3
0
/****************************************************************************
*
*  CAPI2_ClientInit(void);
*
*  Register IPC module.
*
***************************************************************************/
UInt32 KPDPCAPI2_ClientInit(void)
{
    UInt32 ret = 0;
    UInt8  clientID;
    Boolean bEnabled;
    
    clientID = CAPI2_SYS_RegisterClient(NULL, KPDP_RPC_RespCbk, KPDP_Capi2HandleAckCbk, KPDP_Capi2HandleFlowCtrl);
    bEnabled = RPC_EnableUnsolicitedMsgs(RPC_SYS_GetClientHandle(clientID), TRUE);

    KPDPSetClientID(clientID);
    
    KPDP_DEBUG(DBG_INFO, "CAPI2_ClientInit clientID:0x%x UnsolEnabled:%s\n", clientID, (bEnabled?"TRUE":"FALSE"));
    
    // initialize additional RPC interfaces needed for CIB
    // **FIXME** capirpc channel appears to no longer be required (only had SMS ME, which
    // isn't needed under Android)
//    KPDP_CapiRpc_Init();
    //KPDP_SysRpc_Init();
    //KPDP_ADCRpc_Init();
    
    return(ret);
}
示例#4
0
/* cp silent reset callback for sync rpc layer */
static void RPC_SyncNotification(
	struct RpcNotificationEvent_t event, UInt8 clientID)
{
	TaskRequestMap_t *taskMap = (TaskRequestMap_t *) NULL;
	UInt8 i;
	RPC_SyncParams_t *internalParam;
	UInt8 clientIndex;

	_DBG_(RPC_TRACE("RPC_SyncNotification event %d param %d",
			(int) event.event, (int) event.param));

	switch (event.event) {
	case RPC_CPRESET_EVT:
		for (i = 0; i < MAX_TASKS_NUM; i++) {
			taskMap = (sTaskRequestMap + i);

			if (taskMap != NULL &&
				taskMap->task != NULL) {
				_DBG_(RPC_TRACE(
	      "RPC_SyncNotification i=%d tid=%d msg=%d ack=%d\r\n",
			       i, (int)taskMap->tid, (int)taskMap->msgType,
			       taskMap->ack));
				_DBG_(RPC_TRACE(
	      "RPC_SyncNotification pend=%d sz=%d rs=%d task=0x%p\r\n",
			       taskMap->isResultPending, (int)taskMap->rspSize,
			       (int)taskMap->result, (void *)taskMap->task));

			if (event.param == RPC_CPRESET_START) {
				switch (taskMap->state) {
				case RPC_SYNC_STATE_WAITING_FOR_ACK:
					_DBG_(RPC_TRACE(
	      "RPC_SyncNotification waiting for ack\n"));
					taskMap->ack = ACK_CRITICAL_ERROR;
					taskMap->state = RPC_SYNC_STATE_DONE;
					if (taskMap->ackSema)
						OSSEMAPHORE_Release(taskMap->
								    ackSema);
					_DBG_(RPC_TRACE(
	      "RPC_SyncNotification after sema rel\n"));
					break;
				case RPC_SYNC_STATE_WAITING_FOR_RSP:
					_DBG_(RPC_TRACE(
	      "RPC_SyncNotification waiting for rsp\n"));
					taskMap->result = RESULT_ERROR;
					taskMap->tid = 0;
					taskMap->state = RPC_SYNC_STATE_DONE;
					OSSEMAPHORE_Release(taskMap->rspSema);
					break;
				default:
					_DBG_(RPC_TRACE(
	      "RPC_SyncNotification state=%d\n",
					       taskMap->state));
					break;
				}
			} else {
			}
		}
	}

	clientIndex = RPC_SYS_GetClientHandle(clientID);
	internalParam = (RPC_SyncParams_t *)
	    RPC_GetUserData(clientIndex);
	if (internalParam && internalParam->clientParams.rpcNtfFn)
		internalParam->clientParams.rpcNtfFn(event, clientID);
		break;
	default:
		_DBG_(RPC_TRACE(
			"RPC_SyncNotification: Unsupported event %d\n",
			(int) event.event));
		break;
	}
}