X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fudi_lib%2Fimc.c;h=31fd6e2d0ac8c9f93efb9c99842897f65f787251;hb=8d3b2c5f55f648f964afe7540a9fca97ab0b17d6;hp=cd15e0709f0323bc3ba5a5aacd1ccccc02f4aedb;hpb=301dc9a238658b902d9d394b6e930d1ec4832190;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c index cd15e070..31fd6e2d 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c @@ -2,8 +2,10 @@ * \file imc.c * \author John Hodge (thePowersGang) */ +#define DEBUG 1 #include #include +#include "../udi_internal.h" // === EXPORTS === EXPORT(udi_channel_anchor); @@ -22,7 +24,7 @@ void udi_channel_anchor( udi_channel_t channel, udi_index_t ops_idx, void *channel_context ) { - Warning("%s Unimplemented", __func__); + UNIMPLEMENTED(); } /** @@ -33,7 +35,24 @@ extern void udi_channel_spawn( udi_index_t ops_idx, void *channel_context ) { - Warning("%s Unimplemented", __func__); + LOG("gcb=%p,channel=%p", gcb, channel, spawn_idx, ops_idx, channel_context); + + // Search existing channel for a matching spawn_idx + udi_channel_t ret = UDI_CreateChannel_Linked(channel, spawn_idx); + + // Bind local end of channel to ops_idx (with channel_context) + if( ops_idx != 0 ) + { + udi_index_t region_idx; + tUDI_DriverInstance *inst = UDI_int_ChannelGetInstance(gcb, false, ®ion_idx); + UDI_BindChannel(ret, false, inst, ops_idx, region_idx, channel_context, false,0); + } + else + { + // leave unbound + } + + callback(gcb, ret); } /** @@ -43,14 +62,19 @@ void udi_channel_set_context( udi_channel_t target_channel, void *channel_context ) { - Warning("%s Unimplemented", __func__); + LOG("target_channel=%p,channel_context=%p", target_channel, channel_context); + UDI_int_ChannelSetContext(target_channel, channel_context); } void udi_channel_op_abort( udi_channel_t target_channel, udi_cb_t *orig_cb ) { - Warning("%s Unimplemented", __func__); + udi_channel_event_cb_t cb; + cb.gcb.channel = target_channel; + cb.event = UDI_CHANNEL_CLOSED; + cb.params.orig_cb = orig_cb; + udi_channel_event_ind(&cb); } void udi_channel_close(udi_channel_t channel) @@ -60,10 +84,22 @@ void udi_channel_close(udi_channel_t channel) void udi_channel_event_ind(udi_channel_event_cb_t *cb) { - udi_channel_event_complete(cb, UDI_OK); + LOG("cb=%p{...}", cb); + const struct { + udi_channel_event_ind_op_t *channel_event_ind_op; + } *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), NULL, 0 ); + if(!ops) { + Log_Warning("UDI", "udi_channel_event_ind on wrong channel type"); + return ; + } + + // UDI_int_MakeDeferredCb( UDI_GCB(cb), ops->channel_event_ind_op ); + + UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) ); + ops->channel_event_ind_op(cb); } void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status) { - Warning("%s Unimplemented", __func__); + UNIMPLEMENTED(); }