Kernel/PTYs - NL->CR translation (disabled)
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / main.c
index fabdcbb..1c9fc29 100644 (file)
 #include <udi_internal_ma.h>
 #include <trans_pci.h>
 #include <trans_nsr.h>
+#include <trans_uart.h>
 
 // === 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
        };

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