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

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