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 )
{
{
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;
}
}
// 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,
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);
}
}
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 ;
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 )
//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(
{
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,