diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index d161c0c8c711..041e75f4e39c 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -831,6 +831,56 @@ static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add) } #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ +static const wmi_channel_width mode_to_width[MODE_MAX] = { + [MODE_11A] = WMI_CHAN_WIDTH_20, + [MODE_11G] = WMI_CHAN_WIDTH_20, + [MODE_11B] = WMI_CHAN_WIDTH_20, + [MODE_11GONLY] = WMI_CHAN_WIDTH_20, + [MODE_11NA_HT20] = WMI_CHAN_WIDTH_20, + [MODE_11NG_HT20] = WMI_CHAN_WIDTH_20, + [MODE_11AC_VHT20] = WMI_CHAN_WIDTH_20, + [MODE_11AC_VHT20_2G] = WMI_CHAN_WIDTH_20, + [MODE_11NA_HT40] = WMI_CHAN_WIDTH_40, + [MODE_11NG_HT40] = WMI_CHAN_WIDTH_40, + [MODE_11AC_VHT40] = WMI_CHAN_WIDTH_40, + [MODE_11AC_VHT40_2G] = WMI_CHAN_WIDTH_40, + [MODE_11AC_VHT80] = WMI_CHAN_WIDTH_80, + [MODE_11AC_VHT80_2G] = WMI_CHAN_WIDTH_80, +#if CONFIG_160MHZ_SUPPORT + [MODE_11AC_VHT80_80] = WMI_CHAN_WIDTH_80P80, + [MODE_11AC_VHT160] = WMI_CHAN_WIDTH_160, +#endif + +#if SUPPORT_11AX + [MODE_11AX_HE20] = WMI_CHAN_WIDTH_20, + [MODE_11AX_HE40] = WMI_CHAN_WIDTH_40, + [MODE_11AX_HE80] = WMI_CHAN_WIDTH_80, + [MODE_11AX_HE80_80] = WMI_CHAN_WIDTH_80P80, + [MODE_11AX_HE160] = WMI_CHAN_WIDTH_160, + [MODE_11AX_HE20_2G] = WMI_CHAN_WIDTH_20, + [MODE_11AX_HE40_2G] = WMI_CHAN_WIDTH_40, + [MODE_11AX_HE80_2G] = WMI_CHAN_WIDTH_80, +#endif +}; + +/** + * chanmode_to_chanwidth() - get channel width through channel mode + * @chanmode: channel phy mode + * + * Return: channel width + */ +static wmi_channel_width chanmode_to_chanwidth(WLAN_PHY_MODE chanmode) +{ + wmi_channel_width chan_width; + + if (chanmode >= MODE_11A && chanmode < MODE_MAX) + chan_width = mode_to_width[chanmode]; + else + chan_width = WMI_CHAN_WIDTH_20; + + return chan_width; +} + /** * wma_vdev_start_resp_handler() - vdev start response handler * @handle: wma handle @@ -849,6 +899,8 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, struct wma_txrx_node *iface; struct vdev_up_params param = {0}; QDF_STATUS status; + int err; + wmi_channel_width chanwidth; #ifdef FEATURE_AP_MCC_CH_AVOIDANCE tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE); @@ -988,6 +1040,23 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, (iface->type == WMI_VDEV_TYPE_STA)) || ((resp_event->resp_type == WMI_VDEV_START_RESP_EVENT) && (iface->type == WMI_VDEV_TYPE_MONITOR))) { + err = wma_set_peer_param(wma, iface->bssid, + WMI_PEER_PHYMODE, iface->chanmode, + resp_event->vdev_id); + + WMA_LOGD("%s:vdev_id %d chanmode %d status %d", + __func__, resp_event->vdev_id, + iface->chanmode, err); + + chanwidth = chanmode_to_chanwidth(iface->chanmode); + err = wma_set_peer_param(wma, iface->bssid, + WMI_PEER_CHWIDTH, chanwidth, + resp_event->vdev_id); + + WMA_LOGD("%s:vdev_id %d chanwidth %d status %d", + __func__, resp_event->vdev_id, + chanwidth, err); + param.vdev_id = resp_event->vdev_id; param.assoc_id = iface->aid; status = wmi_unified_vdev_up_send(wma->wmi_handle,