X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fmanagement_agent.c;h=5ac91a42f666f177c43a2b027e92e9a6ad5457b5;hb=bf4936e107e62b9c03e8cbf78395ef462e50fb47;hp=512fda3ca88056ac280c760bca016c2dee74429b;hpb=26904c8992e45a3dbbafae273bef81e90d7d9692;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/management_agent.c b/KernelLand/Modules/Interfaces/UDI/management_agent.c index 512fda3c..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; } } @@ -49,9 +51,11 @@ tUDI_DriverInstance *UDI_MA_CreateInstance(tUDI_DriverModule *DriverModule, // UDI_BindChannel_Raw(inst->ManagementChannel, false, // NULL, 1, inst, &cUDI_MgmtOpsList); // TODO: ops list for management agent? - for( int i = 0; i < DriverModule->nRegions; i ++ ) - Log("Rgn %i: %p", i, inst->Regions[i]); +// for( int i = 0; i < DriverModule->nRegions; i ++ ) +// Log("Rgn %i: %p", i, inst->Regions[i]); + LOG("Inst %s %p MA state =%i", + inst->Module->ModuleName, inst, UDI_MASTATE_USAGEIND); inst->CurState = UDI_MASTATE_USAGEIND; // Next State: _SECBIND @@ -68,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, @@ -174,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 ; @@ -184,14 +193,17 @@ 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, 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 ) { for( int i = 0; i < module->nDevices; i ++ ) { - if( module->Devices[i]->Metalang != metalang ) + //LOG("%s:%i %p ?== %p", + // module->ModuleName, i, + // module->Devices[i]->Metalang, metalang); + if( module->Devices[i]->Metalang != child->Metalang ) continue ; int level = UDI_MA_CheckDeviceMatch( @@ -223,6 +235,8 @@ void UDI_MA_BindParents(tUDI_DriverModule *Module) { if( child->BoundInstance ) continue ; + if( Module->Devices[i]->Metalang != child->Metalang ) + continue ; // Check for match int level = UDI_MA_CheckDeviceMatch( Module->Devices[i]->nAttribs, Module->Devices[i]->Attribs, @@ -244,6 +258,9 @@ void UDI_MA_TransitionState(tUDI_DriverInstance *Inst, enum eUDI_MAState Src, en if( Inst->CurState != Src ) return ; + LOG("Inst %s %p MA state %i->%i", + Inst->Module->ModuleName, Inst, Src, Dst); + switch(Dst) { case UDI_MASTATE_USAGEIND: @@ -270,7 +287,7 @@ void UDI_MA_TransitionState(tUDI_DriverInstance *Inst, enum eUDI_MAState Src, en // Bind to parent tUDI_BindOps *parent = &Module->Parents[0]; - udi_channel_t channel = UDI_CreateChannel_Blank(UDI_int_GetMetaLang(Inst, parent->meta_idx)); + udi_channel_t channel = UDI_CreateChannel_Blank(UDI_int_GetMetaLang(Inst->Module, parent->meta_idx)); UDI_BindChannel(channel,true, Inst, parent->ops_idx, parent->region_idx, NULL,false,0); UDI_BindChannel(channel,false,