diff options
author | Stephen Chu <stephen.chu@synaptics.corp-partner.google.com> | 2023-05-03 16:55:42 +0800 |
---|---|---|
committer | Norman Liu <normanwhl@google.com> | 2023-05-18 07:02:02 +0000 |
commit | 4079c39f4735c69a770a409f3898908e4a504adf (patch) | |
tree | 9cfd311b3ab9223f0045b30dbefc69bc9fdb21de | |
parent | 49a9b01bc59e7b2cad342f99a386aafbaddae2e1 (diff) | |
download | dhd43752p-4079c39f4735c69a770a409f3898908e4a504adf.tar.gz |
DHD: De-initialize NAN when it failed to start
Handle the case when exception happens in starting NAN to
prevent kernel panic.
Bug: 277332320
Test: Trigger firmware trap when starting NAN, no KP
Change-Id: I192eae7e1a582a832f86bbecb0fcd8c874b228eb
Signed-off-by: Stephen Chu <stephen.chu@synaptics.corp-partner.google.com>
-rw-r--r-- | wl_cfgnan.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/wl_cfgnan.c b/wl_cfgnan.c index 1fa316d..e386f94 100644 --- a/wl_cfgnan.c +++ b/wl_cfgnan.c @@ -3119,7 +3119,7 @@ wl_cfgnan_start_handler(struct net_device *ndev, struct bcm_cfg80211 *cfg, nan_buf_size -= nan_iov_data->nan_iov_len; memset(resp_buf, 0, sizeof(resp_buf)); - /* Reset conditon variable */ + /* Reset condition variable */ ret = wl_cfgnan_execute_ioctl(ndev, cfg, nan_buf, nan_buf_size, &(cmd_data->status), (void*)resp_buf, NAN_IOCTL_BUF_SIZE); if (unlikely(ret) || unlikely(cmd_data->status)) { @@ -3210,12 +3210,12 @@ wl_cfgnan_start_handler(struct net_device *ndev, struct bcm_cfg80211 *cfg, ret = wl_cfgnan_config_control_flag(ndev, cfg, WL_NAN_CTRL2_FLAG1_NDPE_CAP, 0, WL_NAN_CMD_CFG_NAN_CONFIG2, &(cmd_data->status), false); + nancfg->ndpe_enabled = false; if (unlikely(ret) || unlikely(cmd_data->status)) { WL_ERR((" nan ctrl2 config flags resetting failed, ret = %d status = %d \n", ret, cmd_data->status)); goto fail; } - nancfg->ndpe_enabled = false; } /* set CFG CTRL2 flags1 and flags2 */ @@ -3248,13 +3248,9 @@ wl_cfgnan_start_handler(struct net_device *ndev, struct bcm_cfg80211 *cfg, nancfg->nan_enable = true; WL_INFORM_MEM(("[NAN] Enable successfull \n")); + goto done; fail: - /* Enable back TDLS if connected interface is <= 1 */ - wl_cfg80211_tdls_config(cfg, TDLS_STATE_IF_DELETE, false); - - /* reset conditon variable */ - nancfg->nan_event_recvd = false; if (unlikely(ret) || unlikely(cmd_data->status)) { mutex_lock(&cfg->if_sync); ret = wl_cfg80211_delete_iface(cfg, WL_IF_TYPE_NAN); @@ -3280,7 +3276,18 @@ fail: if (ret != BCME_OK) { WL_ERR(("failed to stop nan[%d]\n", ret)); } + ret = wl_cfgnan_deinit(cfg, dhdp->up); + if (ret != BCME_OK) { + WL_ERR(("failed to de-initialize NAN[%d]\n", ret)); + } } +done: + /* Enable back TDLS if connected interface is <= 1 */ + wl_cfg80211_tdls_config(cfg, TDLS_STATE_IF_DELETE, false); + + /* reset condition variable */ + nancfg->nan_event_recvd = false; + if (nan_buf) { MFREE(cfg->osh, nan_buf, NAN_IOCTL_BUF_SIZE); } |