From d8779e44ee61b6435c33fcbb6bcd23e859aa6593 Mon Sep 17 00:00:00 2001 From: Kyle Ambroff-Kao Date: Sun, 13 Oct 2019 12:23:12 -0700 Subject: [PATCH] Drop requirement for specifying firmware map size The HAIKU_FIRMWARE_NAME_MAP macro takes a size parameter to define the firmware map array type, and then a multi-dimensional array literal is assigned to the array defined by that macro. This is error-prone. The idualwifi7260 driver, before this patch, had the size incorrectly set to 6 when the number of entries was 7, which sliced the last entry off of the map, making it unavailable to the driver. After fixing this size, the driver properly loads the iwm-8265-22.ucode firmware on my computer. This patch changes that macro to take a const char[][2] literal as its only parameter, making it less likely for this sort of bug to be re-introduced. Fixes #15413. Change-Id: I78a75e692a8637af0f13d1eb16180ce8d95d0852 Reviewed-on: https://review.haiku-os.org/c/haiku/+/1917 Reviewed-by: Adrien Destugues --- .../drivers/network/wlan/idualwifi7260/glue.c | 4 ++-- .../drivers/network/wlan/iprowifi2100/glue.c | 4 ++-- .../drivers/network/wlan/iprowifi2200/glue.c | 7 +++++-- .../drivers/network/wlan/iprowifi3945/glue.c | 2 +- .../drivers/network/wlan/iprowifi4965/glue.c | 4 ++-- .../kernel/drivers/network/wlan/ralinkwifi/glue.c | 4 ++-- .../kernel/drivers/network/wlan/realtekwifi/glue.c | 4 ++-- .../freebsd_network/compat/sys/haiku-module.h | 14 +++++++++++--- 8 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c index 5a40cf1812..a221c129a1 100644 --- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c @@ -26,7 +26,7 @@ NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(1); -HAIKU_FIRMWARE_NAME_MAP(6) = { +HAIKU_FIRMWARE_NAME_MAP({ {"iwm3160fw", "iwm-3160-17.ucode"}, {"iwm3168fw", "iwm-3168-22.ucode"}, {"iwm7260fw", "iwm-7260-17.ucode"}, @@ -34,7 +34,7 @@ HAIKU_FIRMWARE_NAME_MAP(6) = { {"iwm7265Dfw", "iwm-7265D-22.ucode"}, {"iwm8000Cfw", "iwm-8000C-22.ucode"}, {"iwm8265fw", "iwm-8265-22.ucode"}, -}; +}); int diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c index 1d26d7be64..e324a7f93a 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c @@ -23,11 +23,11 @@ NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(130); -HAIKU_FIRMWARE_NAME_MAP(3) = { +HAIKU_FIRMWARE_NAME_MAP({ {"ipw_bss", "ipw2100-1.3.fw"}, {"ipw_ibss", "ipw2100-1.3-i.fw"}, {"ipw_monitor", "ipw2100-1.3-p.fw"} -}; +}); int diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/glue.c index 8eca0d0851..02cbf47f6b 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/glue.c @@ -22,8 +22,11 @@ HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi2200, iwi, pci) NO_HAIKU_FBSD_MII_DRIVER(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(300); -HAIKU_FIRMWARE_NAME_MAP(3) = {{"iwi_bss", "ipw2200-bss.fw"}, - {"iwi_ibss", "ipw2200-ibss.fw"}, {"iwi_monitor", "ipw2200-sniffer.fw"}}; +HAIKU_FIRMWARE_NAME_MAP({ + {"iwi_bss", "ipw2200-bss.fw"}, + {"iwi_ibss", "ipw2200-ibss.fw"}, + {"iwi_monitor", "ipw2200-sniffer.fw"} +}); int diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c index f3b84110ef..8a2e994fc3 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c @@ -25,7 +25,7 @@ NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(2144); -HAIKU_FIRMWARE_NAME_MAP(1) = {{"wpifw", "iwlwifi-3945-2.ucode"}}; +HAIKU_FIRMWARE_NAME_MAP({{"wpifw", "iwlwifi-3945-2.ucode"}}); int diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c index d67d05469a..80387322e4 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c @@ -26,7 +26,7 @@ NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(44417); -HAIKU_FIRMWARE_NAME_MAP(13) = { +HAIKU_FIRMWARE_NAME_MAP({ {"iwn100fw", "iwlwifi-100-5.ucode"}, {"iwn105fw", "iwlwifi-105-6.ucode"}, {"iwn135fw", "iwlwifi-135-6.ucode"}, @@ -40,7 +40,7 @@ HAIKU_FIRMWARE_NAME_MAP(13) = { {"iwn6000g2afw", "iwlwifi-6000g2a-6.ucode"}, {"iwn6000g2bfw", "iwlwifi-6000g2b-6.ucode"}, {"iwn6050fw", "iwlwifi-6050-5.ucode"} -}; +}); int diff --git a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c index 3c906eb7b4..f3893c5f27 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c @@ -28,12 +28,12 @@ HAIKU_FBSD_WLAN_DRIVER_GLUE(ralinkwifi, ral, pci) HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(0); -HAIKU_FIRMWARE_NAME_MAP(4) = { +HAIKU_FIRMWARE_NAME_MAP({ {"rt2561fw", "rt2561.bin"}, {"rt2561sfw", "rt2561s.bin"}, {"rt2661fw", "rt2661.bin"}, {"rt2860fw", "rt2860.bin"} -}; +}); NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); diff --git a/src/add-ons/kernel/drivers/network/wlan/realtekwifi/glue.c b/src/add-ons/kernel/drivers/network/wlan/realtekwifi/glue.c index e67e085ccc..e89a2b1c55 100644 --- a/src/add-ons/kernel/drivers/network/wlan/realtekwifi/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/realtekwifi/glue.c @@ -24,11 +24,11 @@ HAIKU_FBSD_WLAN_DRIVER_GLUE(realtekwifi, rtwn_pci, pci) HAIKU_DRIVER_REQUIREMENTS(FBSD_WLAN); HAIKU_FIRMWARE_VERSION(0); -HAIKU_FIRMWARE_NAME_MAP(3) = { +HAIKU_FIRMWARE_NAME_MAP({ {"rtwn-rtl8188eefw", "rtl8188eefw.ucode"}, {"rtwn-rtl8192cfwE", "rtl8192cfwE.ucode"}, {"rtwn-rtl8192cfwE_B", "rtl8192cfwE_B.ucode"}, -}; +}); NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_REENABLE_INTERRUPTS(); diff --git a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h index 5c569de0cf..ef28192c2a 100644 --- a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h +++ b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h @@ -234,9 +234,17 @@ extern const uint __haiku_firmware_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] +/* + * Provide a firmware name mapping as a multi-dimentional const char* array. + * + * HAIKU_FIRMWARE_NAME_MAP({ + * {"name-used-by-driver", "actual-name-of-firmware-file-on-disk"}, + * ... + * }); + */ +#define HAIKU_FIRMWARE_NAME_MAP(...) \ + const char* __haiku_firmware_name_map[][2] = __VA_ARGS__; \ + const uint __haiku_firmware_parts_count = B_COUNT_OF(__haiku_firmware_name_map) #define NO_HAIKU_FIRMWARE_NAME_MAP() \ const uint __haiku_firmware_parts_count = 0; \