From c803f24b2841e13a429911071854fa510c6cd912 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Wed, 27 May 2015 22:30:21 +0000 Subject: [PATCH] To avoid sleeping in firmware_get() with bwi mutex held, call bwi_mac_fw_alloc() at the device attach, not in the interface init. --- sys/dev/bwi/bwimac.c | 7 +------ sys/dev/bwi/bwimac.h | 1 + sys/dev/bwi/if_bwi.c | 4 ++++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sys/dev/bwi/bwimac.c b/sys/dev/bwi/bwimac.c index 21f4333bbfb0..f39ef44d4174 100644 --- a/sys/dev/bwi/bwimac.c +++ b/sys/dev/bwi/bwimac.c @@ -101,7 +101,6 @@ static void bwi_mac_opmode_init(struct bwi_mac *); static void bwi_mac_hostflags_init(struct bwi_mac *); static void bwi_mac_bss_param_init(struct bwi_mac *); -static int bwi_mac_fw_alloc(struct bwi_mac *); static void bwi_mac_fw_free(struct bwi_mac *); static int bwi_mac_fw_load(struct bwi_mac *); static int bwi_mac_fw_init(struct bwi_mac *); @@ -325,10 +324,6 @@ bwi_mac_init(struct bwi_mac *mac) /* * Load and initialize firmwares */ - error = bwi_mac_fw_alloc(mac); - if (error) - return error; - error = bwi_mac_fw_load(mac); if (error) return error; @@ -879,7 +874,7 @@ bwi_fwimage_is_valid(struct bwi_softc *sc, const struct firmware *fw, /* * XXX Error cleanup */ -static int +int bwi_mac_fw_alloc(struct bwi_mac *mac) { struct bwi_softc *sc = mac->mac_sc; diff --git a/sys/dev/bwi/bwimac.h b/sys/dev/bwi/bwimac.h index 2c5275edfab7..a6d90083c60b 100644 --- a/sys/dev/bwi/bwimac.h +++ b/sys/dev/bwi/bwimac.h @@ -57,6 +57,7 @@ void bwi_mac_init_tpctl_11bg(struct bwi_mac *); void bwi_mac_dummy_xmit(struct bwi_mac *); void bwi_mac_reset_hwkeys(struct bwi_mac *); int bwi_mac_config_ps(struct bwi_mac *); +int bwi_mac_fw_alloc(struct bwi_mac *); uint16_t bwi_memobj_read_2(struct bwi_mac *, uint16_t, uint16_t); uint32_t bwi_memobj_read_4(struct bwi_mac *, uint16_t, uint16_t); diff --git a/sys/dev/bwi/if_bwi.c b/sys/dev/bwi/if_bwi.c index 9f66ff45da7f..53fb58faf783 100644 --- a/sys/dev/bwi/if_bwi.c +++ b/sys/dev/bwi/if_bwi.c @@ -446,6 +446,10 @@ bwi_attach(struct bwi_softc *sc) if (error) goto fail; + error = bwi_mac_fw_alloc(mac); + if (error) + goto fail; + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not if_alloc()\n");