svn commit: r343477 - head/sys/dev/iwm
Bjoern A. Zeeb
bz at FreeBSD.org
Sat Jan 26 17:52:13 UTC 2019
Author: bz
Date: Sat Jan 26 17:52:12 2019
New Revision: 343477
URL: https://svnweb.freebsd.org/changeset/base/343477
Log:
Fix logic errors in iwm_pcie_load_firmware_chunk introduced in r314065.
* There's no reason to have a while() loop here, because:
- if msleep returns 0, that means we were woken up by the interrupt handler,
and we are going to exit immediately as sc_fw_chunk_done will now be 1
(there is nothing else that sleeps on sc_fw.)
- if msleep doesn't return 0 (i.e. it returned ETIMEDOUT) then we will
exit immediately because of the if-test.
So, just use a single msleep() and then check sc_fw_chunk_done as before.
* The comment said we were sleeping for 5 seconds, but the msleep was only
for 1. Before r314065, this was 1 second and so was the comment,
and in that commit the comment was changed and the function call wasn't.
Possibly fixes failures to initialize uCode on certain devices.
Submitted by: Augustin Cavalier (waddlesplash gmail.com)
Obtained from: Haiku 132990ecdcb072f2ce597b5d497ff3e5b1f09c20
MFC after: 10 days
Modified:
head/sys/dev/iwm/if_iwm.c
Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c Sat Jan 26 17:27:12 2019 (r343476)
+++ head/sys/dev/iwm/if_iwm.c Sat Jan 26 17:52:12 2019 (r343477)
@@ -2397,8 +2397,6 @@ static int
iwm_pcie_load_firmware_chunk(struct iwm_softc *sc, uint32_t dst_addr,
bus_addr_t phy_addr, uint32_t byte_cnt)
{
- int ret;
-
sc->sc_fw_chunk_done = 0;
if (!iwm_nic_lock(sc))
@@ -2430,14 +2428,9 @@ iwm_pcie_load_firmware_chunk(struct iwm_softc *sc, uin
iwm_nic_unlock(sc);
/* wait up to 5s for this segment to load */
- ret = 0;
- while (!sc->sc_fw_chunk_done) {
- ret = msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfw", hz);
- if (ret)
- break;
- }
+ msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfw", hz * 5);
- if (ret != 0) {
+ if (!sc->sc_fw_chunk_done) {
device_printf(sc->sc_dev,
"fw chunk addr 0x%x len %d failed to load\n",
dst_addr, byte_cnt);
More information about the svn-src-all
mailing list