Commit a1a3b762 authored by Hans de Goede's avatar Hans de Goede Committed by Kalle Valo

brcmfmac: Remove firmware-loading code duplication

brcmf_fw_request_next_item and brcmf_fw_request_done both have identical
code to complete the fw-request depending on the item-type.

This commit adds a new brcmf_fw_complete_request helper removing this code
duplication.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 65102238
...@@ -504,6 +504,34 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) ...@@ -504,6 +504,34 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
return -ENOENT; return -ENOENT;
} }
static int brcmf_fw_complete_request(const struct firmware *fw,
struct brcmf_fw *fwctx)
{
struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
int ret = 0;
brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path, fw ? "" : "not ");
switch (cur->type) {
case BRCMF_FW_TYPE_NVRAM:
ret = brcmf_fw_request_nvram_done(fw, fwctx);
break;
case BRCMF_FW_TYPE_BINARY:
if (fw)
cur->binary = fw;
else
ret = -ENOENT;
break;
default:
/* something fishy here so bail out early */
brcmf_err("unknown fw type: %d\n", cur->type);
release_firmware(fw);
ret = -EINVAL;
}
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
}
static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async) static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
{ {
struct brcmf_fw_item *cur; struct brcmf_fw_item *cur;
...@@ -525,15 +553,7 @@ static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async) ...@@ -525,15 +553,7 @@ static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
if (ret < 0) { if (ret < 0) {
brcmf_fw_request_done(NULL, fwctx); brcmf_fw_request_done(NULL, fwctx);
} else if (!async && fw) { } else if (!async && fw) {
brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path, brcmf_fw_complete_request(fw, fwctx);
fw ? "" : "not ");
if (cur->type == BRCMF_FW_TYPE_BINARY)
cur->binary = fw;
else if (cur->type == BRCMF_FW_TYPE_NVRAM)
brcmf_fw_request_nvram_done(fw, fwctx);
else
release_firmware(fw);
return -EAGAIN; return -EAGAIN;
} }
return 0; return 0;
...@@ -547,28 +567,8 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx) ...@@ -547,28 +567,8 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
cur = &fwctx->req->items[fwctx->curpos]; cur = &fwctx->req->items[fwctx->curpos];
brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path, ret = brcmf_fw_complete_request(fw, fwctx);
fw ? "" : "not "); if (ret < 0)
if (!fw)
ret = -ENOENT;
switch (cur->type) {
case BRCMF_FW_TYPE_NVRAM:
ret = brcmf_fw_request_nvram_done(fw, fwctx);
break;
case BRCMF_FW_TYPE_BINARY:
cur->binary = fw;
break;
default:
/* something fishy here so bail out early */
brcmf_err("unknown fw type: %d\n", cur->type);
release_firmware(fw);
ret = -EINVAL;
goto fail;
}
if (ret < 0 && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
goto fail; goto fail;
do { do {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment