diff options
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 35 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 1 |
2 files changed, 28 insertions, 8 deletions
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index b4870d77e410..940a636c8a4f 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -543,14 +543,21 @@ static int wma_vdev_start_resp_handler(void *handle, u_int8_t *cmd_param_info, params->chainMask = resp_event->chain_mask; params->smpsMode = host_map_smps_mode(resp_event->smps_mode); params->status = resp_event->status; + if (resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT && + (iface->type == WMI_VDEV_TYPE_STA)) { + wmi_unified_vdev_up_send(wma->wmi_handle, + resp_event->vdev_id, + iface->aid, + iface->bssid); + } + /* + * Marking the VDEV UP STATUS to FALSE + * since, VDEV RESTART will do a VDEV DOWN + * in the firmware. + */ + else + iface->vdev_up = FALSE; - /* - * Marking the VDEV UP STATUS to FALSE - * since, VDEV RESTART will do a VDEV DOWN - * in the firmware. - */ - - iface->vdev_up = FALSE; wma_send_msg(wma, WDA_SWITCH_CHANNEL_RSP, (void *)params, 0); } else if (req_msg->msg_type == WDA_ADD_BSS_REQ) { tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data; @@ -1594,6 +1601,7 @@ static int wma_csa_offload_handler(void *handle, u_int8_t *event, u_int32_t len) csa_offload_event->channel = csa_ie->newchannel; csa_offload_event->switchmode = csa_ie->switchmode; + wma->interfaces[vdev_id].is_channel_switch = VOS_TRUE; wma_send_msg(wma, WDA_CSA_OFFLOAD_EVENT, (void *)csa_offload_event, 0); return 0; } @@ -5732,13 +5740,24 @@ static void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params) req.beacon_intval = 100; req.dtim_period = 1; req.is_dfs = params->isDfsChannel; - status = wma_vdev_start(wma, &req, VOS_TRUE); + + /* In case of AP mode, once radar is detected, we need to + * issuse VDEV RESTART, so we making is_channel_switch as + * TRUE + */ + if((wma->interfaces[req.vdev_id].type == WMI_VDEV_TYPE_AP ) && + (wma->interfaces[req.vdev_id].sub_type == 0)) + wma->interfaces[req.vdev_id].is_channel_switch = VOS_TRUE; + + status = wma_vdev_start(wma, &req, + wma->interfaces[req.vdev_id].is_channel_switch); if (status != VOS_STATUS_SUCCESS) { wma_remove_vdev_req(wma, req.vdev_id, WMA_TARGET_REQ_TYPE_VDEV_START); WMA_LOGP("vdev start failed status = %d\n", status); goto send_resp; } + wma->interfaces[req.vdev_id].is_channel_switch = VOS_FALSE; return; send_resp: WMA_LOGD("%s: channel %d offset %d txpower %d status %d\n", __func__, diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 3c8a3e1b801c..53524d1c943f 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -428,6 +428,7 @@ struct wma_txrx_node { tANI_U8 bss_status; tANI_U8 rate_flags; tANI_U8 nss; + v_BOOL_t is_channel_switch; }; #if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC) |
