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=3156ce960dd2beb20b9e19e985d73785dff30741;hpb=a07af753a21de9deade5e9694863c0daedfafe3f;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 3156ce96..6e6ec42c 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c @@ -2,9 +2,11 @@ * \file meta_mgmt.c * \author John Hodge (thePowersGang) */ +#define DEBUG 0 #include #include #include "../udi_internal.h" +#include "../udi_ma.h" // === EXPORTS === EXPORT(udi_usage_ind); @@ -18,41 +20,95 @@ EXPORT(udi_devmgmt_ack); EXPORT(udi_final_cleanup_req); EXPORT(udi_final_cleanup_ack); +tUDI_MetaLang cMetaLang_Management = { + "udi_mgmt", + + 1, + { + {sizeof(udi_enumerate_cb_t), NULL} + } +}; + // === CODE === void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level) { - const udi_mgmt_ops_t *ops; - if( !(ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), METALANG_MGMT, 0 )) ) { - Log_Warning("UDI", "udi_usage_ind on wrong channel type"); + LOG("cb=%p{...}, resource_level=%i", cb, resource_level); + const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 ); + if(!ops) { + 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) { - UNIMPLEMENTED(); + LOG("cb=%p{...}, enumeration_level=%i", cb, enumeration_level); + const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 ); + if(!ops) { + Log_Warning("UDI", "%s on wrong channel type", __func__); + return ; + } + + 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) { - UNIMPLEMENTED(); + udi_enumerate_ack(cb, UDI_ENUMERATE_LEAF, 0); } 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 )