X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fmanagement_agent.c;h=5ac91a42f666f177c43a2b027e92e9a6ad5457b5;hb=5cab4c07bc13888dc7956194ef9595508072a4eb;hp=536c28ffaa63763c4e7888f3edf9d29f358c7b03;hpb=e2ff5722101ae7dbb10f51f1477eac625fa30c1e;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/management_agent.c b/KernelLand/Modules/Interfaces/UDI/management_agent.c index 536c28ff..5ac91a42 100644 --- a/KernelLand/Modules/Interfaces/UDI/management_agent.c +++ b/KernelLand/Modules/Interfaces/UDI/management_agent.c @@ -26,6 +26,7 @@ tUDI_DriverInstance *UDI_MA_CreateInstance(tUDI_DriverModule *DriverModule, udi_primary_init_t *pri_init = DriverModule->InitInfo->primary_init_info; inst->Module = DriverModule; inst->Regions[0] = UDI_MA_InitRegion(inst, 0, 0, pri_init->rdata_size); + if( !inst->Regions[0] ) goto _error; udi_secondary_init_t *sec_init = DriverModule->InitInfo->secondary_init_list; if( sec_init ) { @@ -33,6 +34,7 @@ tUDI_DriverInstance *UDI_MA_CreateInstance(tUDI_DriverModule *DriverModule, { inst->Regions[1+i] = UDI_MA_InitRegion(inst, i, sec_init[i].region_idx, sec_init[i].rdata_size); + if( !inst->Regions[1+i] ) goto _error; } } @@ -70,6 +72,11 @@ tUDI_DriverInstance *UDI_MA_CreateInstance(tUDI_DriverModule *DriverModule, // udi_usage_res causes next state transition return inst; +_error: + for( int i = 0; i < DriverModule->nRegions; i++ ) + free(inst->Regions[i]); + free(inst); + return NULL; } tUDI_DriverRegion *UDI_MA_InitRegion(tUDI_DriverInstance *Inst, @@ -134,7 +141,7 @@ int UDI_MA_CheckDeviceMatch(int nDevAttr, udi_instance_attr_list_t *DevAttrs, else { // Attribute desired is missing, error? - LOG("attr '%s' missing", dev_attr->attr_name); + //LOG("attr '%s' missing", dev_attr->attr_name); } } //LOG("n_matches = %i", n_matches); @@ -176,7 +183,7 @@ void UDI_MA_AddChild(udi_enumerate_cb_t *cb, udi_index_t ops_idx) } } if( !child->BindOps ) { - Log_Error("UDI", "Driver '%s' doesn't have a 'child_bind_ops' for %i", + Log_Error("UDI", "Driver '%s' doesn't have a 'child_bind_ops' for ops_idx %i", inst->Module->ModuleName, ops_idx); free(child); return ; @@ -186,7 +193,7 @@ void UDI_MA_AddChild(udi_enumerate_cb_t *cb, udi_index_t ops_idx) inst->FirstChild = child; // and search for a handler - tUDI_MetaLang *metalang = UDI_int_GetMetaLang(inst->Module, child->Ops->meta_idx); + child->Metalang = UDI_int_GetMetaLang(inst->Module, child->Ops->meta_idx); int best_level = 0; tUDI_DriverModule *best_module = NULL; for( tUDI_DriverModule *module = gpUDI_LoadedModules; module; module = module->Next ) @@ -196,7 +203,7 @@ void UDI_MA_AddChild(udi_enumerate_cb_t *cb, udi_index_t ops_idx) //LOG("%s:%i %p ?== %p", // module->ModuleName, i, // module->Devices[i]->Metalang, metalang); - if( module->Devices[i]->Metalang != metalang ) + if( module->Devices[i]->Metalang != child->Metalang ) continue ; int level = UDI_MA_CheckDeviceMatch( @@ -228,7 +235,8 @@ void UDI_MA_BindParents(tUDI_DriverModule *Module) { if( child->BoundInstance ) continue ; - // TODO: Check metalangs + if( Module->Devices[i]->Metalang != child->Metalang ) + continue ; // Check for match int level = UDI_MA_CheckDeviceMatch( Module->Devices[i]->nAttribs, Module->Devices[i]->Attribs,