[haiku-commits] r35170 - in haiku/trunk/src/libs/compat/freebsd_network: . compat/sys

  • From: coling@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 19 Jan 2010 18:44:38 +0100 (CET)

Author: colin
Date: 2010-01-19 18:44:38 +0100 (Tue, 19 Jan 2010)
New Revision: 35170
Changeset: http://dev.haiku-os.org/changeset/35170/haiku

Modified:
   haiku/trunk/src/libs/compat/freebsd_network/compat/sys/haiku-module.h
   haiku/trunk/src/libs/compat/freebsd_network/firmware.c
Log:
* Reworked firmware loading. This gets rid of the need for the settings files.
  Name mapping is now defined in the glue code.
* Adding two macros for handling firmware name mapping completely in the glue
  code:
  - HAIKU_FIRMWARE_NAME_MAP(firmwarePartsCount) is used when mapping is
    required. Have a look to iprowifi2100's glue code for an example.
  - NO_HAIKU_FIRMWARE_NAME_MAP() is used when the firmware names don't need to
    be mapped. For example: broadcom43xx
* Discard usage of vm_map_file() and use the previously read() method again.
  After Axel and Ingo agree that both methods are fine in this particular use
  case, using read() looks easier on the eye. It needs only 3 parameters, where
  vm_map_file() takes 10.


Modified: haiku/trunk/src/libs/compat/freebsd_network/compat/sys/haiku-module.h
===================================================================
--- haiku/trunk/src/libs/compat/freebsd_network/compat/sys/haiku-module.h       
2010-01-19 16:57:59 UTC (rev 35169)
+++ haiku/trunk/src/libs/compat/freebsd_network/compat/sys/haiku-module.h       
2010-01-19 17:44:38 UTC (rev 35170)
@@ -173,11 +173,36 @@
 
 #define HAIKU_DRIVER_REQUIRES(flag) (__haiku_driver_requirements & (flag))
 
+
+/* #pragma mark - firmware loading */
+
+
+/*
+ * Only needed to be specified in the glue code of drivers which actually need
+ * to load firmware. See iprowifi2100 for an example.
+ */
+
 extern const uint __haiku_firmware_version;
 
+/* Use 0 if driver doesn't care about firmware version. */
 #define HAIKU_FIRMWARE_VERSION(version) \
        const uint __haiku_firmware_version = (version)
 
+extern const uint __haiku_firmware_parts_count;
+extern const char* __haiku_firmware_name_map[][2];
+
+#define HAIKU_FIRMWARE_NAME_MAP(firmwarePartsCount) \
+       const uint __haiku_firmware_parts_count = firmwarePartsCount; \
+       const char* __haiku_firmware_name_map[firmwarePartsCount][2]
+
+#define NO_HAIKU_FIRMWARE_NAME_MAP() \
+       const uint __haiku_firmware_parts_count = 0; \
+       const char* __haiku_firmware_name_map[0][2] = {NULL}
+
+
+/* #pragma mark - synchronization */
+
+
 #define HAIKU_INTR_REGISTER_STATE \
        cpu_status __haiku_cpu_state = 0
 

Modified: haiku/trunk/src/libs/compat/freebsd_network/firmware.c
===================================================================
--- haiku/trunk/src/libs/compat/freebsd_network/firmware.c      2010-01-19 
16:57:59 UTC (rev 35169)
+++ haiku/trunk/src/libs/compat/freebsd_network/firmware.c      2010-01-19 
17:44:38 UTC (rev 35170)
@@ -18,47 +18,45 @@
 #include <StorageDefs.h>
 #include <SupportDefs.h>
 
-#include <driver_settings.h>
-#include <kernel/vm/vm.h>
-#include <syscalls.h>
-#include <vm_defs.h>
-
 #include <device.h>
 
 
-
 #define MAX_FBSD_FIRMWARE_NAME_CHARS 64
        // For strndup, beeing cautious in kernel code is a good thing.
        // NB: This constant doesn't exist in FreeBSD.
 
 
+static const char*
+getHaikuFirmwareName(const char* fbsdFirmwareName,
+       const char* unknownFirmwareName)
+{
+       int i;
+
+       if (__haiku_firmware_name_map == NULL)
+               return unknownFirmwareName;
+
+       for (i = 0; i < __haiku_firmware_parts_count; i++) {
+               if (strcmp(__haiku_firmware_name_map[i][0], fbsdFirmwareName) 
== 0)
+                       return __haiku_firmware_name_map[i][1];
+       }
+       return unknownFirmwareName;
+}
+
+
 const struct firmware*
 firmware_get(const char* fbsdFirmwareName)
 {
-       area_id                         area;
-       void*                           driverSettings = NULL;
        char*                           fbsdFirmwareNameCopy = NULL;
        int                                     fileDescriptor = 0;
        struct firmware*        firmware = NULL;
        int32                           firmwareFileSize;
        char*                           firmwarePath = NULL;
        const char*                     haikuFirmwareName = NULL;
+       ssize_t                         readCount = 0;
 
-       driverSettings = load_driver_settings(gDriverName);
-       if (driverSettings == NULL) {
-               driver_printf("%s: settings file %s is missing.\n", __func__,
-                       gDriverName);
-               return NULL;
-       }
+       haikuFirmwareName = getHaikuFirmwareName(fbsdFirmwareName,
+               fbsdFirmwareName);
 
-       haikuFirmwareName = get_driver_parameter(driverSettings, 
fbsdFirmwareName,
-               NULL, NULL);
-       if (haikuFirmwareName == NULL) {
-               driver_printf("%s: settings file %s file contains no mapping 
for %s.\n", 
-                       __func__, gDriverName, fbsdFirmwareName);
-               goto cleanup;
-       }
-
        firmwarePath = (char*)malloc(B_PATH_NAME_LENGTH);
        if (firmwarePath == NULL)
                goto cleanup;
@@ -88,20 +86,22 @@
        if (firmware == NULL)
                goto cleanup;
 
-       firmware->data = NULL;
-       area = _user_map_file("mmap area", (void*)&firmware->data, 
B_ANY_ADDRESS,
-               firmwareFileSize, B_READ_AREA, REGION_PRIVATE_MAP, true, 
fileDescriptor,
-               0);
-       if (area < 0)
+       firmware->data = malloc(firmwareFileSize);
+       if (firmware->data == NULL)
                goto cleanup;
 
+       readCount = read(fileDescriptor, (void*)firmware->data, 
firmwareFileSize);
+       if (readCount == -1 || readCount < firmwareFileSize) {
+               free((void*)firmware->data);
+               goto cleanup;
+       }
+
        firmware->datasize = firmwareFileSize;
        firmware->name = fbsdFirmwareNameCopy;
        firmware->version = __haiku_firmware_version;
 
        close(fileDescriptor);
        free(firmwarePath);
-       unload_driver_settings(driverSettings);
        return firmware;
 
 cleanup:
@@ -113,8 +113,6 @@
                free(firmwarePath);
        if (fileDescriptor)
                close(fileDescriptor);
-       if (driverSettings)
-               unload_driver_settings(driverSettings);
        return NULL;
 }
 
@@ -125,7 +123,8 @@
        if (firmware == NULL)
                return;
 
-       _user_unmap_memory((void*)firmware->data, firmware->datasize);
+       if (firmware->data)
+               free((void*)firmware->data);
        if (firmware->name)
                free((void*)firmware->name);
        free((void*)firmware);


Other related posts:

  • » [haiku-commits] r35170 - in haiku/trunk/src/libs/compat/freebsd_network: . compat/sys - coling