aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2021-03-31 15:25:01 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2021-04-02 10:03:39 +0000
commit37c3241a43160dd236bd4767fce46e846cb17227 (patch)
tree6c55cadcfa451ee830112b953c75b98ec46e405e
parent4ded022d3b8948e92c8f8353364ff2c79d720e68 (diff)
downloadsrc-37c3241a43160dd236bd4767fce46e846cb17227.tar.gz
src-37c3241a43160dd236bd4767fce46e846cb17227.zip
LinuxKPI: treat firmware file names more lenient
A lot of firmware files have a "-" in the name. That "-" is a problem when dealing with shell variables or loader (e.g., auto-loading .ko). It may thus often be convenient to generate firmware kernel object files with s/-/_/g in the name. In order to automatically find them from drivers using LinuxKPI also substitue the '-' for a '_' like we do for '/' and '.' already. Reviewed-by: hselasky, manu (ok) MFC-after: 2 weeks Differential Revision: https://reviews.freebsd.org/D29514
-rw-r--r--sys/compat/linuxkpi/common/src/linux_firmware.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/compat/linuxkpi/common/src/linux_firmware.c b/sys/compat/linuxkpi/common/src/linux_firmware.c
index 75147a311827..289779c5246c 100644
--- a/sys/compat/linuxkpi/common/src/linux_firmware.c
+++ b/sys/compat/linuxkpi/common/src/linux_firmware.c
@@ -85,9 +85,10 @@ _linuxkpi_request_firmware(const char *fw_name, const struct linuxkpi_firmware *
fwimg = fw_name;
fbdfw = firmware_get_flags(fwimg, flags);
}
- /* (3) Flatten '/' and then '.' to '_' and try with adjusted name. */
+ /* (3) Flatten '/', '.' and '-' to '_' and try with adjusted name. */
if (fbdfw == NULL &&
- (strchr(fw_name, '/') != NULL || strchr(fw_name, '.') != NULL)) {
+ (strchr(fw_name, '/') != NULL || strchr(fw_name, '.') != NULL ||
+ strchr(fw_name, '-'))) {
fwimg = strdup(fw_name, M_LKPI_FW);
if (fwimg != NULL) {
while ((p = strchr(fwimg, '/')) != NULL)
@@ -98,6 +99,11 @@ _linuxkpi_request_firmware(const char *fw_name, const struct linuxkpi_firmware *
*p = '_';
fbdfw = firmware_get_flags(fwimg, flags);
}
+ if (fbdfw == NULL) {
+ while ((p = strchr(fwimg, '-')) != NULL)
+ *p = '_';
+ fbdfw = firmware_get_flags(fwimg, flags);
+ }
free(__DECONST(void *, fwimg), M_LKPI_FW);
}
}