X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fmain.c;h=1c9fc29cc332a5e04101c14454ea3d771b82c02e;hb=b5ef69daf12844e475918acf7e6a7fbe2ccb30b2;hp=fabdcbbeb2bc5795df8c1281c1ee9d3a3f44a441;hpb=e2ff5722101ae7dbb10f51f1477eac625fa30c1e;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/main.c b/KernelLand/Modules/Interfaces/UDI/main.c index fabdcbbe..1c9fc29c 100644 --- a/KernelLand/Modules/Interfaces/UDI/main.c +++ b/KernelLand/Modules/Interfaces/UDI/main.c @@ -14,11 +14,12 @@ #include #include #include +#include // === PROTOTYPES === int UDI_Install(char **Arguments); int UDI_DetectDriver(void *Base); - int UDI_LoadDriver(void *Base); + int UDI_LoadDriver(void *Base, const char *ArgumentString); tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, const char *udiprops, size_t udiprops_size); const tUDI_MetaLang *UDI_int_GetMetaLangByName(const char *Name); @@ -42,6 +43,7 @@ int UDI_Install(char **Arguments) UDI_int_LoadDriver(NULL, &pci_init, pci_udiprops, pci_udiprops_size); UDI_int_LoadDriver(NULL, &acessnsr_init, acessnsr_udiprops, acessnsr_udiprops_size); + UDI_int_LoadDriver(NULL, &acessuart_init, acessuart_udiprops, acessuart_udiprops_size); return MODULE_ERR_OK; } @@ -71,7 +73,7 @@ int UDI_DetectDriver(void *Base) /** * \fn int UDI_LoadDriver(void *Base) */ -int UDI_LoadDriver(void *Base) +int UDI_LoadDriver(void *Base, const char *ArgumentString) { udi_init_t *info; char *udiprops = NULL; @@ -88,6 +90,9 @@ int UDI_LoadDriver(void *Base) UDI_int_LoadDriver(Base, info, udiprops, udiprops_end - udiprops); + // TODO: Parse 'ArgumentString' and extract properties for module/instances + // - Including debug flag + return 0; } @@ -406,6 +411,7 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, co driver_module->Devices = NEW(tUDI_PropDevSpec*,* driver_module->nDevices); // Populate + bool error_hit = false; int cur_locale = 0; int msg_index = 0; int ml_index = 0; @@ -424,13 +430,13 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, co case UDIPROPS__properties_version: if( _get_token_uint32(str, &str) != 0x101 ) { Log_Warning("UDI", "Properties version mismatch."); + error_hit = true; } break; case UDIPROPS__module: driver_module->ModuleName = str; break; - case UDIPROPS__meta: - { + case UDIPROPS__meta: { tUDI_MetaLangRef *ml = &driver_module->MetaLangs[ml_index++]; ml->meta_idx = _get_token_idx(str, &str); if( !str ) continue; @@ -440,9 +446,10 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, co if( !ml->metalang ) { Log_Error("UDI", "Module %s referenced unsupported metalang %s", driver_module->ModuleName, ml->interface_name); + error_hit = true; + // TODO: error } - break; - } + break; } case UDIPROPS__message: { tUDI_PropMessage *msg = &driver_module->Messages[msg_index++]; @@ -641,6 +648,7 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, co // TODO: Array Log_Warning("UDI", "TODO: Parse 'array' attribute in 'device'"); _get_token_str(str, &str, NULL); + error_hit = true; break; case 3: // ubit32 at->attr_length = sizeof(udi_ubit32_t); @@ -666,6 +674,20 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, co } } free(udipropsptrs); + if( error_hit ) { + Log_Error("UDI", "Error encountered while parsing udiprops for '%s' (%p), bailing", + driver_module->ModuleName, LoadBase); + for( int i = 0; i < device_index; i ++ ) + free(driver_module->Devices[i]); + free(driver_module->Messages); + free(driver_module->RegionTypes); + free(driver_module->MetaLangs); + free(driver_module->Parents); + free(driver_module->ChildBindOps); + free(driver_module->Devices); + free(driver_module); + return NULL; + } for( int i = 0; i < driver_module->nDevices; i ++ ) driver_module->Devices[i]->Metalang = UDI_int_GetMetaLang(driver_module, @@ -790,9 +812,11 @@ const tUDI_MetaLang *UDI_int_GetMetaLangByName(const char *Name) { //extern tUDI_MetaLang cMetaLang_Management; extern tUDI_MetaLang cMetaLang_BusBridge; + extern tUDI_MetaLang cMetaLang_GIO; extern tUDI_MetaLang cMetaLang_NIC; const tUDI_MetaLang *langs[] = { &cMetaLang_BusBridge, + &cMetaLang_GIO, &cMetaLang_NIC, NULL };