Commit a786b38d authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

brcmfmac: correct error handling in brcmf_fws_init()

In brcmf_fws_init() the error flows were not properly handled
and the caller ignored the return value. The only action that
is allowed to fail in brcmf_fws_init() is setting the tlv in
firmware as the feature is not supported on all devices.

Cc: Wei Yongjun <>
Reviewed-by: default avatarHante Meuleman <>
Reviewed-by: default avatarPieter-Paul Giesberts <>
Signed-off-by: default avatarArend van Spriel <>
Signed-off-by: default avatarJohn W. Linville <>
parent 9a83f1ec
......@@ -899,7 +899,10 @@ int brcmf_bus_start(struct device *dev)
goto fail;
drvr->fw_signals = true;
ret = brcmf_fws_init(drvr);
if (ret < 0)
goto fail;
drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev);
......@@ -1897,16 +1897,20 @@ int brcmf_fws_init(struct brcmf_pub *drvr)
rc = brcmf_fil_iovar_int_set(drvr->iflist[0], "tlv", tlv);
rc = brcmf_fweh_register(drvr, BRCMF_E_FIFO_CREDIT_MAP,
if (rc < 0) {
brcmf_err("failed to set bdcv2 tlv signaling\n");
brcmf_err("register credit map handler failed\n");
goto fail;
if (brcmf_fweh_register(drvr, BRCMF_E_FIFO_CREDIT_MAP,
brcmf_fws_notify_credit_map)) {
brcmf_err("register credit map handler failed\n");
goto fail;
/* setting the iovar may fail if feature is unsupported
* so leave the rc as is so driver initialization can
* continue.
if (brcmf_fil_iovar_int_set(drvr->iflist[0], "tlv", tlv)) {
brcmf_err("failed to set bdcv2 tlv signaling\n");
goto fail_event;
......@@ -1922,9 +1926,9 @@ int brcmf_fws_init(struct brcmf_pub *drvr)
drvr->fw_signals ? "enabled" : "disabled", tlv);
return 0;
brcmf_fweh_unregister(drvr, BRCMF_E_FIFO_CREDIT_MAP);
/* disable flow control entirely */
drvr->fw_signals = false;
return rc;
......@@ -1937,6 +1941,14 @@ void brcmf_fws_deinit(struct brcmf_pub *drvr)
if (!fws)
/* disable firmware signalling entirely
* to avoid using the workqueue.
drvr->fw_signals = false;
if (drvr->fws->fws_wq)
/* cleanup */
brcmf_fws_lock(drvr, flags);
brcmf_fws_cleanup(fws, -1);
Supports Markdown
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