UDI/buf - buf_copy/buf_free/fixes
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / management_agent.c
index 512fda3..5ac91a4 100644 (file)
@@ -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,

UCC git Repository :: git.ucc.asn.au