diff --git a/sys/compat/linuxkpi/common/src/linux_firmware.c b/sys/compat/linuxkpi/common/src/linux_firmware.c --- a/sys/compat/linuxkpi/common/src/linux_firmware.c +++ b/sys/compat/linuxkpi/common/src/linux_firmware.c @@ -94,11 +94,11 @@ fwimg++; if (fwimg == NULL || *fwimg == '\0') fwimg = fw_name; - fbdfw = firmware_get_flags(fwimg, flags); + fbdfw = firmware_get_flags(fw_name, fwimg, flags); /* (2) Try the original name if we have not yet. */ if (fbdfw == NULL && fwimg != fw_name) { fwimg = fw_name; - fbdfw = firmware_get_flags(fwimg, flags); + fbdfw = firmware_get_flags(fw_name, fwimg, flags); } /* (3) Flatten '/', '.' and '-' to '_' and try with adjusted name. */ if (fbdfw == NULL && @@ -108,16 +108,16 @@ if (fwimg != NULL) { while ((p = strchr(fwimg, '/')) != NULL) *p = '_'; - fbdfw = firmware_get_flags(fwimg, flags); + fbdfw = firmware_get_flags(fw_name, fwimg, flags); if (fbdfw == NULL) { while ((p = strchr(fwimg, '.')) != NULL) *p = '_'; - fbdfw = firmware_get_flags(fwimg, flags); + fbdfw = firmware_get_flags(fw_name, fwimg, flags); } if (fbdfw == NULL) { while ((p = strchr(fwimg, '-')) != NULL) *p = '_'; - fbdfw = firmware_get_flags(fwimg, flags); + fbdfw = firmware_get_flags(fw_name, fwimg, flags); } free(__DECONST(void *, fwimg), M_LKPI_FW); } diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c --- a/sys/kern/subr_firmware.c +++ b/sys/kern/subr_firmware.c @@ -237,6 +237,7 @@ } struct fw_loadimage { + const char *fwname; const char *imagename; uint32_t flags; }; @@ -259,7 +260,7 @@ } mtx_lock(&firmware_mtx); - fp = lookup(fwli->imagename); + fp = lookup(fwli->fwname); if (fp == NULL || fp->file != NULL) { mtx_unlock(&firmware_mtx); if (fp == NULL) @@ -283,14 +284,24 @@ * release this reference for the image to be eligible for removal/unload. */ const struct firmware * -firmware_get_flags(const char *imagename, uint32_t flags) +firmware_get_flags(const char *fwname, const char *imagename, uint32_t flags) { struct task fwload_task; struct thread *td; struct priv_fw *fp; + linker_file_t result; + int error = 0; + + error = linker_reference_module(imagename, NULL, &result); + if (error != 0) { + if (bootverbose || (flags & FIRMWARE_GET_NOWARN) == 0) + printf("%s: could not load firmware image, error %d\n", + imagename, error); + return NULL; + } mtx_lock(&firmware_mtx); - fp = lookup(imagename); + fp = lookup(fwname); if (fp != NULL) goto found; /* @@ -312,6 +323,7 @@ if (!cold) { struct fw_loadimage fwli; + fwli.fwname = fwname; fwli.imagename = imagename; fwli.flags = flags; TASK_INIT(&fwload_task, 0, loadimage, (void *)&fwli); @@ -323,7 +335,7 @@ /* * After attempting to load the module, see if the image is registered. */ - fp = lookup(imagename); + fp = lookup(fwname); if (fp == NULL) { mtx_unlock(&firmware_mtx); return NULL; @@ -340,7 +352,7 @@ firmware_get(const char *imagename) { - return (firmware_get_flags(imagename, 0)); + return (firmware_get_flags(imagename, imagename, 0)); } /* diff --git a/sys/sys/firmware.h b/sys/sys/firmware.h --- a/sys/sys/firmware.h +++ b/sys/sys/firmware.h @@ -60,7 +60,8 @@ int firmware_unregister(const char *); #define FIRMWARE_GET_NOWARN 0x0001 /* Do not warn if firmware not found. */ -const struct firmware *firmware_get_flags(const char *, uint32_t flags); +const struct firmware *firmware_get_flags(const char *, + const char *, uint32_t flags); const struct firmware *firmware_get(const char *); #define FIRMWARE_UNLOAD 0x0001 /* unload if unreferenced */