In iwm(4), send PHY DB commands as async commands.
authorstsp <stsp@openbsd.org>
Mon, 20 Jun 2016 11:54:36 +0000 (11:54 +0000)
committerstsp <stsp@openbsd.org>
Mon, 20 Jun 2016 11:54:36 +0000 (11:54 +0000)
This means we won't sleep and wait for the firmware to send an interrupt
when it's done processing the command. For unknown reasons, sometimes the
firmware never wakes the driver after a phy db command so the driver gives
up partway through the hardware init sequence.

We already have a DELAY in place after each phy db command we send to give
the firmware some time for processing, so skipping the sleep is not expected
to cause problems. If it does, we'll have to revisit this change.
For now, this change makes iwm(4) work better in bsd.rd.

Problem reported by Remi Locherer on bugs@, and confirmed by kettenis@.
Lots of help with testing and ok tb@

sys/dev/pci/if_iwm.c

index 08d99ff..88cdd0e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_iwm.c,v 1.88 2016/06/19 12:05:25 stsp Exp $        */
+/*     $OpenBSD: if_iwm.c,v 1.89 2016/06/20 11:54:36 stsp Exp $        */
 
 /*
  * Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
@@ -2161,7 +2161,7 @@ iwm_send_phy_db_cmd(struct iwm_softc *sc, uint16_t type,
        struct iwm_phy_db_cmd phy_db_cmd;
        struct iwm_host_cmd cmd = {
                .id = IWM_PHY_DB_CMD,
-               .flags = IWM_CMD_SYNC,
+               .flags = IWM_CMD_ASYNC,
        };
 
        DPRINTFN(10, ("Sending PHY-DB hcmd of type %d, of length %d\n", type, length));