|
@@ -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,
|