static VCHIQ_STATUS_T shim_callback(VCHIQ_REASON_T reason, VCHIQ_HEADER_T *header, VCHIQ_SERVICE_HANDLE_T handle, void *bulk_user) { struct shim_service *service = (struct shim_service *)VCHIQ_GET_SERVICE_USERDATA(handle); if (!service->callback) goto release; switch (reason) { case VCHIQ_MESSAGE_AVAILABLE: vchiu_queue_push(&service->queue, header); service->callback(service->callback_param, VCHI_CALLBACK_MSG_AVAILABLE, NULL); goto done; break; case VCHIQ_BULK_TRANSMIT_DONE: service->callback(service->callback_param, VCHI_CALLBACK_BULK_SENT, bulk_user); break; case VCHIQ_BULK_RECEIVE_DONE: service->callback(service->callback_param, VCHI_CALLBACK_BULK_RECEIVED, bulk_user); break; case VCHIQ_SERVICE_CLOSED: service->callback(service->callback_param, VCHI_CALLBACK_SERVICE_CLOSED, NULL); break; case VCHIQ_SERVICE_OPENED: /* No equivalent VCHI reason */ break; case VCHIQ_BULK_TRANSMIT_ABORTED: service->callback(service->callback_param, VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, bulk_user); break; case VCHIQ_BULK_RECEIVE_ABORTED: service->callback(service->callback_param, VCHI_CALLBACK_BULK_RECEIVE_ABORTED, bulk_user); break; default: WARN(1, "not supported\n"); break; } release: vchiq_release_message(service->handle, header); done: return VCHIQ_SUCCESS; }
VCHIQ_STATUS_T khhn_callback(VCHIQ_REASON_T reason, VCHIQ_HEADER_T *header, VCHIQ_SERVICE_HANDLE_T handle, void *bulk_userdata) { switch (reason) { case VCHIQ_MESSAGE_AVAILABLE: vchiu_queue_push(&khhn_queue, header); break; case VCHIQ_BULK_TRANSMIT_DONE: case VCHIQ_BULK_RECEIVE_DONE: vcos_event_signal(&bulk_event); break; } return VCHIQ_SUCCESS; }