|
@@ -1513,9 +1513,17 @@ static void b43legacy_print_fw_helptext(struct b43legacy_wl *wl)
|
|
|
"and download the correct firmware (version 3).\n");
|
|
|
}
|
|
|
|
|
|
+static void b43legacy_fw_cb(const struct firmware *firmware, void *context)
|
|
|
+{
|
|
|
+ struct b43legacy_wldev *dev = context;
|
|
|
+
|
|
|
+ dev->fwp = firmware;
|
|
|
+ complete(&dev->fw_load_complete);
|
|
|
+}
|
|
|
+
|
|
|
static int do_request_fw(struct b43legacy_wldev *dev,
|
|
|
const char *name,
|
|
|
- const struct firmware **fw)
|
|
|
+ const struct firmware **fw, bool async)
|
|
|
{
|
|
|
char path[sizeof(modparam_fwpostfix) + 32];
|
|
|
struct b43legacy_fw_header *hdr;
|
|
@@ -1528,7 +1536,24 @@ static int do_request_fw(struct b43legacy_wldev *dev,
|
|
|
snprintf(path, ARRAY_SIZE(path),
|
|
|
"b43legacy%s/%s.fw",
|
|
|
modparam_fwpostfix, name);
|
|
|
- err = request_firmware(fw, path, dev->dev->dev);
|
|
|
+ b43legacyinfo(dev->wl, "Loading firmware %s\n", path);
|
|
|
+ if (async) {
|
|
|
+ init_completion(&dev->fw_load_complete);
|
|
|
+ err = request_firmware_nowait(THIS_MODULE, 1, path,
|
|
|
+ dev->dev->dev, GFP_KERNEL,
|
|
|
+ dev, b43legacy_fw_cb);
|
|
|
+ if (err) {
|
|
|
+ b43legacyerr(dev->wl, "Unable to load firmware\n");
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ /* stall here until fw ready */
|
|
|
+ wait_for_completion(&dev->fw_load_complete);
|
|
|
+ if (!dev->fwp)
|
|
|
+ err = -EINVAL;
|
|
|
+ *fw = dev->fwp;
|
|
|
+ } else {
|
|
|
+ err = request_firmware(fw, path, dev->dev->dev);
|
|
|
+ }
|
|
|
if (err) {
|
|
|
b43legacyerr(dev->wl, "Firmware file \"%s\" not found "
|
|
|
"or load failed.\n", path);
|
|
@@ -1580,7 +1605,7 @@ static void b43legacy_request_firmware(struct work_struct *work)
|
|
|
filename = "ucode4";
|
|
|
else
|
|
|
filename = "ucode5";
|
|
|
- err = do_request_fw(dev, filename, &fw->ucode);
|
|
|
+ err = do_request_fw(dev, filename, &fw->ucode, true);
|
|
|
if (err)
|
|
|
goto err_load;
|
|
|
}
|
|
@@ -1589,7 +1614,7 @@ static void b43legacy_request_firmware(struct work_struct *work)
|
|
|
filename = "pcm4";
|
|
|
else
|
|
|
filename = "pcm5";
|
|
|
- err = do_request_fw(dev, filename, &fw->pcm);
|
|
|
+ err = do_request_fw(dev, filename, &fw->pcm, false);
|
|
|
if (err)
|
|
|
goto err_load;
|
|
|
}
|
|
@@ -1607,7 +1632,7 @@ static void b43legacy_request_firmware(struct work_struct *work)
|
|
|
default:
|
|
|
goto err_no_initvals;
|
|
|
}
|
|
|
- err = do_request_fw(dev, filename, &fw->initvals);
|
|
|
+ err = do_request_fw(dev, filename, &fw->initvals, false);
|
|
|
if (err)
|
|
|
goto err_load;
|
|
|
}
|
|
@@ -1627,7 +1652,7 @@ static void b43legacy_request_firmware(struct work_struct *work)
|
|
|
default:
|
|
|
goto err_no_initvals;
|
|
|
}
|
|
|
- err = do_request_fw(dev, filename, &fw->initvals_band);
|
|
|
+ err = do_request_fw(dev, filename, &fw->initvals_band, false);
|
|
|
if (err)
|
|
|
goto err_load;
|
|
|
}
|