static inline void
 brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip)
 {
+       int i;
        struct brcmf_core *core;
 
        brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4);
 
-       core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211);
-       brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET |
-                                  D11_BCMA_IOCTL_PHYCLOCKEN,
-                            D11_BCMA_IOCTL_PHYCLOCKEN,
-                            D11_BCMA_IOCTL_PHYCLOCKEN);
+       /* Disable the cores only and let the firmware enable them.
+        * Releasing reset ourselves breaks BCM4387 in weird ways.
+        */
+       for (i = 0; (core = brcmf_chip_get_d11core(&chip->pub, i)); i++)
+               brcmf_chip_coredisable(core, D11_BCMA_IOCTL_PHYRESET |
+                                      D11_BCMA_IOCTL_PHYCLOCKEN,
+                                      D11_BCMA_IOCTL_PHYCLOCKEN);
 }
 
 static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec)