X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fudi_lib%2Fmeta_mgmt.c;h=6e6ec42c58311a0a3bef79e686e366154c1ef30e;hb=8d3b2c5f55f648f964afe7540a9fca97ab0b17d6;hp=11d35a2c953ccdc1eb7851ee60f01f84ad0b763c;hpb=c0f20e1d9a03ae5026b345748d1e30b7dc142596;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c index 11d35a2c..6e6ec42c 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c @@ -2,10 +2,11 @@ * \file meta_mgmt.c * \author John Hodge (thePowersGang) */ -#define DEBUG 1 +#define DEBUG 0 #include #include #include "../udi_internal.h" +#include "../udi_ma.h" // === EXPORTS === EXPORT(udi_usage_ind); @@ -21,8 +22,11 @@ EXPORT(udi_final_cleanup_ack); tUDI_MetaLang cMetaLang_Management = { "udi_mgmt", + 1, - {NULL} + { + {sizeof(udi_enumerate_cb_t), NULL} + } }; // === CODE === @@ -34,18 +38,22 @@ void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level) Log_Warning("UDI", "%s on wrong channel type", __func__); return ; } - + + // Non-deferred because it's usually called with a stack allocated cb + UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) ); ops->usage_ind_op(cb, resource_level); } void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level) { - UNIMPLEMENTED(); + cb->trace_mask = 0; + udi_usage_res(cb); } void udi_usage_res(udi_usage_cb_t *cb) { - UNIMPLEMENTED(); + // TODO: Update trace mask from cb + LOG("cb=%p{cb->trace_mask=%x}", cb, cb->trace_mask); } void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) @@ -57,7 +65,7 @@ void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) return ; } - ops->enumerate_req_op(cb, enumeration_level); + UDI_int_MakeDeferredCbU8( UDI_GCB(cb), (udi_op_t*)ops->enumerate_req_op, enumeration_level ); } void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) @@ -67,7 +75,40 @@ void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_l void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx) { - UNIMPLEMENTED(); + UDI_int_ChannelFlip( UDI_GCB(cb) ); + LOG("cb=%p, enumeration_result=%i, ops_idx=%i", cb, enumeration_result, ops_idx); + switch( enumeration_result ) + { + case UDI_ENUMERATE_OK: + #if DEBUG && 0 + for( int i = 0; i < cb->attr_valid_length; i ++ ) + { + udi_instance_attr_list_t *at = &cb->attr_list[i]; + switch(at->attr_type) + { + case UDI_ATTR_STRING: + LOG("[%i] String '%.*s'", i, at->attr_length, at->attr_value); + break; + case UDI_ATTR_UBIT32: + LOG("[%i] UBit32 0x%08x", i, UDI_ATTR32_GET(at->attr_value)); + break; + default: + LOG("[%i] %i", i, at->attr_type); + break; + } + } + #endif + // Returned a device + UDI_MA_AddChild(cb, ops_idx); + udi_enumerate_req(cb, UDI_ENUMERATE_NEXT); + return ; + case UDI_ENUMERATE_DONE: + // All done. Chain terminates + return ; + default: + Log_Notice("UDI", "Unknown enumeration_result %i", enumeration_result); + return ; + } } void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )