My commit adding RTL8188EU did introduce a regression after all.
authorstsp <stsp@openbsd.org>
Sun, 10 May 2015 15:10:46 +0000 (15:10 +0000)
committerstsp <stsp@openbsd.org>
Sun, 10 May 2015 15:10:46 +0000 (15:10 +0000)
Repair firmware reset on RTL8188CUS devices (and perhaps others) by
restoring the proper register write order in the non-8188EU code path.
Fixes "urtwn0: timeout waiting for firmware readiness" after device reset.

sys/dev/usb/if_urtwn.c

index 91f46fa..65f9e4c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_urtwn.c,v 1.44 2015/05/04 11:46:29 stsp Exp $      */
+/*     $OpenBSD: if_urtwn.c,v 1.45 2015/05/10 15:10:46 stsp Exp $      */
 
 /*-
  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
@@ -2413,9 +2413,6 @@ urtwn_fw_reset(struct urtwn_softc *sc)
        }
        /* Force 8051 reset. */
        urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
-       urtwn_write_2(sc, R92C_SYS_FUNC_EN,
-           urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
-           R92C_SYS_FUNC_EN_CPUEN);
 }
 
 
@@ -2505,6 +2502,10 @@ urtwn_load_firmware(struct urtwn_softc *sc)
                        urtwn_fw_reset(sc);
                urtwn_write_1(sc, R92C_MCUFWDL, 0);
        }
+       if (!(sc->chip & URTWN_CHIP_88E))
+               urtwn_write_2(sc, R92C_SYS_FUNC_EN,
+                   urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
+                   R92C_SYS_FUNC_EN_CPUEN);
 
        urtwn_write_1(sc, R92C_MCUFWDL,
            urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_EN);