From d8455ce1fd9afd8a2fd7d1409c9eb1adf1a21f90 Mon Sep 17 00:00:00 2001 From: Deepak Dhamdhere Date: Wed, 2 Nov 2016 13:11:55 -0700 Subject: [PATCH] qcacld-3.0: set channel width and phy mode to fw in vdev restart qcacld-2.0 to qcacld-3.0 propagation If ap switches channel, sta will follow ap, as ap may change phymode and channel width in new channel, so host needs set new phymode and channel mode to fw. Change-Id: I87b28119e0f4a8005f9c80f8f32912747b28306c CRs-Fixed: 913325 --- core/wma/src/wma_dev_if.c | 69 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) 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,