Skip to content

Commit 5b58749

Browse files
jwrdegoedeKalle Valo
authored andcommitted
brcmfmac: Remove recursion from firmware load error handling
Before this commit brcmf_fw_request_done would call brcmf_fw_request_next_item to load the next item, which on an error would call brcmf_fw_request_done, which if the error is recoverable (*) will then continue calling brcmf_fw_request_next_item for the next item again which on an error will call brcmf_fw_request_done again... This does not blow up because we only have a limited number of items so we never recurse too deep. But the recursion is still quite ugly and frankly is giving me a headache, so lets fix this. This commit fixes this by removing brcmf_fw_request_next_item and by making brcmf_fw_get_firmwares and brcmf_fw_request_done directly call firmware_request_nowait resp. firmware_request themselves. *) brcmf_fw_request_nvram_done fallback path succeeds or BRCMF_FW_REQF_OPTIONAL is set Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
1 parent a1a3b76 commit 5b58749

File tree

1 file changed

+19
-46
lines changed
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

1 file changed

+19
-46
lines changed

drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c

Lines changed: 19 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -532,33 +532,6 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
532532
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
533533
}
534534

535-
static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
536-
{
537-
struct brcmf_fw_item *cur;
538-
const struct firmware *fw = NULL;
539-
int ret;
540-
541-
cur = &fwctx->req->items[fwctx->curpos];
542-
543-
brcmf_dbg(TRACE, "%srequest for %s\n", async ? "async " : "",
544-
cur->path);
545-
546-
if (async)
547-
ret = request_firmware_nowait(THIS_MODULE, true, cur->path,
548-
fwctx->dev, GFP_KERNEL, fwctx,
549-
brcmf_fw_request_done);
550-
else
551-
ret = request_firmware(&fw, cur->path, fwctx->dev);
552-
553-
if (ret < 0) {
554-
brcmf_fw_request_done(NULL, fwctx);
555-
} else if (!async && fw) {
556-
brcmf_fw_complete_request(fw, fwctx);
557-
return -EAGAIN;
558-
}
559-
return 0;
560-
}
561-
562535
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
563536
{
564537
struct brcmf_fw *fwctx = ctx;
@@ -568,26 +541,19 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
568541
cur = &fwctx->req->items[fwctx->curpos];
569542

570543
ret = brcmf_fw_complete_request(fw, fwctx);
571-
if (ret < 0)
572-
goto fail;
573-
574-
do {
575-
if (++fwctx->curpos == fwctx->req->n_items) {
576-
ret = 0;
577-
goto done;
578-
}
579544

580-
ret = brcmf_fw_request_next_item(fwctx, false);
581-
} while (ret == -EAGAIN);
582-
583-
return;
545+
while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
546+
cur = &fwctx->req->items[fwctx->curpos];
547+
request_firmware(&fw, cur->path, fwctx->dev);
548+
ret = brcmf_fw_complete_request(fw, ctx);
549+
}
584550

585-
fail:
586-
brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
587-
dev_name(fwctx->dev), cur->path);
588-
brcmf_fw_free_request(fwctx->req);
589-
fwctx->req = NULL;
590-
done:
551+
if (ret) {
552+
brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
553+
dev_name(fwctx->dev), cur->path);
554+
brcmf_fw_free_request(fwctx->req);
555+
fwctx->req = NULL;
556+
}
591557
fwctx->done(fwctx->dev, ret, fwctx->req);
592558
kfree(fwctx);
593559
}
@@ -611,7 +577,9 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
611577
void (*fw_cb)(struct device *dev, int err,
612578
struct brcmf_fw_request *req))
613579
{
580+
struct brcmf_fw_item *first = &req->items[0];
614581
struct brcmf_fw *fwctx;
582+
int ret;
615583

616584
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
617585
if (!fw_cb)
@@ -628,7 +596,12 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
628596
fwctx->req = req;
629597
fwctx->done = fw_cb;
630598

631-
brcmf_fw_request_next_item(fwctx, true);
599+
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
600+
fwctx->dev, GFP_KERNEL, fwctx,
601+
brcmf_fw_request_done);
602+
if (ret < 0)
603+
brcmf_fw_request_done(NULL, fwctx);
604+
632605
return 0;
633606
}
634607

0 commit comments

Comments
 (0)