idualwifi7260: Fix logic errors in iwm_pcie_load_firmware_chunk.

* 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 the "sync firmware loading" FreeBSD commit, this was 1
   second and so was the comment, and in that commit the comment was changed
   and the function call wasn't.

The bugs here were introduced in the same FreeBSD commit as the "sizeof" bug
that I merged a fix for earlier.

Possibly fixes failures to initialize uCode on certain devices.
This commit is contained in:
Augustin Cavalier 2019-01-25 10:43:54 -05:00
parent aa7f93c54c
commit 132990ecdc

View File

@ -2404,8 +2404,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))
@ -2437,14 +2435,9 @@ iwm_pcie_load_firmware_chunk(struct iwm_softc *sc, uint32_t dst_addr,
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);