|
@@ -87,6 +87,7 @@
|
|
|
#include "wlan_utility.h"
|
|
|
#include "wlan_coex_ucfg_api.h"
|
|
|
#include <wlan_cp_stats_mc_ucfg_api.h>
|
|
|
+#include "wmi_unified_vdev_api.h"
|
|
|
|
|
|
#ifdef DCS_INTERFERENCE_DETECTION
|
|
|
#include <wlan_dcs_ucfg_api.h>
|
|
@@ -1119,6 +1120,36 @@ static void wma_dcs_clear_vdev_starting(struct mac_context *mac_ctx,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+/*
|
|
|
+ * wma_get_ratemask_type() - convert user input ratemask type to FW type
|
|
|
+ * @type: User input ratemask type maintained in HDD
|
|
|
+ * @fwtype: Value return arg for fw ratemask type value
|
|
|
+ *
|
|
|
+ * Return: FW configurable ratemask type
|
|
|
+ */
|
|
|
+static QDF_STATUS wma_get_ratemask_type(enum wlan_mlme_ratemask_type type,
|
|
|
+ uint8_t *fwtype)
|
|
|
+{
|
|
|
+ switch (type) {
|
|
|
+ case WLAN_MLME_RATEMASK_TYPE_CCK:
|
|
|
+ *fwtype = WMI_RATEMASK_TYPE_CCK;
|
|
|
+ break;
|
|
|
+ case WLAN_MLME_RATEMASK_TYPE_HT:
|
|
|
+ *fwtype = WMI_RATEMASK_TYPE_HT;
|
|
|
+ break;
|
|
|
+ case WLAN_MLME_RATEMASK_TYPE_VHT:
|
|
|
+ *fwtype = WMI_RATEMASK_TYPE_VHT;
|
|
|
+ break;
|
|
|
+ case WLAN_MLME_RATEMASK_TYPE_HE:
|
|
|
+ *fwtype = WMI_RATEMASK_TYPE_HE;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
QDF_STATUS wma_vdev_start_resp_handler(struct vdev_mlme_obj *vdev_mlme,
|
|
|
struct vdev_start_response *rsp)
|
|
|
{
|
|
@@ -1130,6 +1161,9 @@ QDF_STATUS wma_vdev_start_resp_handler(struct vdev_mlme_obj *vdev_mlme,
|
|
|
QDF_STATUS status;
|
|
|
enum vdev_assoc_type assoc_type = VDEV_ASSOC;
|
|
|
struct vdev_mlme_obj *mlme_obj;
|
|
|
+ struct wlan_mlme_psoc_ext_obj *mlme_psoc_obj;
|
|
|
+ const struct wlan_mlme_ratemask *ratemask_cfg;
|
|
|
+ struct config_ratemask_params rparams = {0};
|
|
|
|
|
|
wma = cds_get_context(QDF_MODULE_ID_WMA);
|
|
|
if (!wma) {
|
|
@@ -1142,6 +1176,9 @@ QDF_STATUS wma_vdev_start_resp_handler(struct vdev_mlme_obj *vdev_mlme,
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ mlme_psoc_obj = mlme_get_psoc_ext_obj(psoc);
|
|
|
+ ratemask_cfg = &mlme_psoc_obj->cfg.ratemask_cfg;
|
|
|
+
|
|
|
if (!mac_ctx) {
|
|
|
wma_err("Failed to get mac_ctx");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
@@ -1254,6 +1291,38 @@ QDF_STATUS wma_vdev_start_resp_handler(struct vdev_mlme_obj *vdev_mlme,
|
|
|
if (iface->type == WMI_VDEV_TYPE_AP && wma_is_vdev_up(rsp->vdev_id))
|
|
|
wma_set_sap_keepalive(wma, rsp->vdev_id);
|
|
|
|
|
|
+ /* Send ratemask to firmware */
|
|
|
+ if ((ratemask_cfg->type > WLAN_MLME_RATEMASK_TYPE_NO_MASK) &&
|
|
|
+ (ratemask_cfg->type < WLAN_MLME_RATEMASK_TYPE_MAX)) {
|
|
|
+ struct wmi_unified *wmi_handle = wma->wmi_handle;
|
|
|
+
|
|
|
+ if (!wmi_handle) {
|
|
|
+ wma_err(FL("wmi_handle is null"));
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ rparams.vdev_id = rsp->vdev_id;
|
|
|
+ status = wma_get_ratemask_type(ratemask_cfg->type,
|
|
|
+ &rparams.type);
|
|
|
+
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err(FL("unable to map ratemask"));
|
|
|
+ /* don't fail, default rates will still work */
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ rparams.lower32 = ratemask_cfg->lower32;
|
|
|
+ rparams.higher32 = ratemask_cfg->higher32;
|
|
|
+ rparams.lower32_2 = ratemask_cfg->lower32_2;
|
|
|
+ rparams.higher32_2 = ratemask_cfg->higher32_2;
|
|
|
+
|
|
|
+ status = wmi_unified_vdev_config_ratemask_cmd_send(wmi_handle,
|
|
|
+ &rparams);
|
|
|
+ /* Only log failure. Do not abort */
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ wma_err(FL("failed to send ratemask"));
|
|
|
+ }
|
|
|
+
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|