Make iwm_newstate() recover from state transition errors.
authorstsp <stsp@openbsd.org>
Thu, 7 Dec 2017 14:12:39 +0000 (14:12 +0000)
committerstsp <stsp@openbsd.org>
Thu, 7 Dec 2017 14:12:39 +0000 (14:12 +0000)
On error, we now schedule the init task which will whack the interface when
it gets to run, which prevents the driver from stalling in such situations.

ok phessler@

sys/dev/pci/if_iwm.c

index cf1749b..036ecf4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_iwm.c,v 1.217 2017/10/26 15:00:28 mpi Exp $        */
+/*     $OpenBSD: if_iwm.c,v 1.218 2017/12/07 14:12:39 stsp Exp $       */
 
 /*
  * Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
@@ -6056,8 +6056,12 @@ iwm_newstate_task(void *psc)
        }
 
 out:
-       if (err == 0 && (sc->sc_flags & IWM_FLAG_SHUTDOWN) == 0)
-               sc->sc_newstate(ic, nstate, arg);
+       if ((sc->sc_flags & IWM_FLAG_SHUTDOWN) == 0) {
+               if (err)
+                       task_add(systq, &sc->init_task);
+               else
+                       sc->sc_newstate(ic, nstate, arg);
+       }
        refcnt_rele_wake(&sc->task_refs);
        splx(s);
 }