Index: sys/dev/iwn/if_iwn.c =================================================================== --- sys/dev/iwn/if_iwn.c +++ sys/dev/iwn/if_iwn.c @@ -8215,25 +8215,24 @@ static int iwn_read_firmware(struct iwn_softc *sc) { + const struct firmware *firmware; struct iwn_fw_info *fw = &sc->fw; int error; DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__); - IWN_UNLOCK(sc); - - memset(fw, 0, sizeof (*fw)); - /* Read firmware image from filesystem. */ - sc->fw_fp = firmware_get(sc->fwname); - if (sc->fw_fp == NULL) { + IWN_UNLOCK(sc); + firmware = firmware_get(sc->fwname); + IWN_LOCK(sc); + if (firmware == NULL) { device_printf(sc->sc_dev, "%s: could not read firmware %s\n", __func__, sc->fwname); - IWN_LOCK(sc); return EINVAL; } - IWN_LOCK(sc); + sc->fw_fp = firmware; + memset(fw, 0, sizeof (*fw)); fw->size = sc->fw_fp->datasize; fw->data = (const uint8_t *)sc->fw_fp->data; if (fw->size < sizeof (uint32_t)) { @@ -8280,6 +8279,12 @@ static void iwn_unload_firmware(struct iwn_softc *sc) { + + IWN_LOCK_ASSERT(sc); + + if (sc->fw_fp == NULL) + return; + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); sc->fw_fp = NULL; }