summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Chu <stephen.chu@synaptics.corp-partner.google.com>2023-05-03 16:55:42 +0800
committerNorman Liu <normanwhl@google.com>2023-05-18 07:02:02 +0000
commit4079c39f4735c69a770a409f3898908e4a504adf (patch)
tree9cfd311b3ab9223f0045b30dbefc69bc9fdb21de
parent49a9b01bc59e7b2cad342f99a386aafbaddae2e1 (diff)
downloaddhd43752p-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.c21
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);
}