|
@@ -5292,6 +5292,150 @@ fail:
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
+static WMI_EDCA_PARAM_TYPE
|
|
|
+wmi_convert_edca_pifs_param_type(enum host_edca_param_type type)
|
|
|
+{
|
|
|
+ switch (type) {
|
|
|
+ case HOST_EDCA_PARAM_TYPE_AGGRESSIVE:
|
|
|
+ return WMI_EDCA_PARAM_TYPE_AGGRESSIVE;
|
|
|
+ case HOST_EDCA_PARAM_TYPE_PIFS:
|
|
|
+ return WMI_EDCA_PARAM_TYPE_PIFS;
|
|
|
+ default:
|
|
|
+ return WMI_EDCA_PARAM_TYPE_AGGRESSIVE;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * send_update_edca_pifs_param_cmd_tlv() - update EDCA params
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @edca_pifs: edca/pifs parameters
|
|
|
+ *
|
|
|
+ * This function updates EDCA/PIFS parameters to the target
|
|
|
+ *
|
|
|
+ * Return: QDF Status
|
|
|
+ */
|
|
|
+
|
|
|
+static QDF_STATUS
|
|
|
+send_update_edca_pifs_param_cmd_tlv(wmi_unified_t wmi_handle,
|
|
|
+ struct edca_pifs_vparam *edca_pifs)
|
|
|
+{
|
|
|
+ uint8_t *buf_ptr;
|
|
|
+ wmi_buf_t buf = NULL;
|
|
|
+ wmi_vdev_set_twt_edca_params_cmd_fixed_param *cmd;
|
|
|
+ wmi_wmm_params *wmm_params;
|
|
|
+ wmi_pifs_params *pifs_params;
|
|
|
+ uint16_t len;
|
|
|
+
|
|
|
+ if (!edca_pifs) {
|
|
|
+ wmi_debug("edca_pifs is NULL");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ len = sizeof(wmi_vdev_set_twt_edca_params_cmd_fixed_param);
|
|
|
+ if (edca_pifs->param.edca_param_type ==
|
|
|
+ HOST_EDCA_PARAM_TYPE_AGGRESSIVE) {
|
|
|
+ len += WMI_TLV_HDR_SIZE;
|
|
|
+ len += sizeof(wmi_wmm_params);
|
|
|
+ } else {
|
|
|
+ len += WMI_TLV_HDR_SIZE;
|
|
|
+ }
|
|
|
+ if (edca_pifs->param.edca_param_type ==
|
|
|
+ HOST_EDCA_PARAM_TYPE_PIFS) {
|
|
|
+ len += WMI_TLV_HDR_SIZE;
|
|
|
+ len += sizeof(wmi_pifs_params);
|
|
|
+ } else {
|
|
|
+ len += WMI_TLV_HDR_SIZE;
|
|
|
+ }
|
|
|
+
|
|
|
+ buf = wmi_buf_alloc(wmi_handle, len);
|
|
|
+
|
|
|
+ if (!buf)
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+
|
|
|
+ cmd = (wmi_vdev_set_twt_edca_params_cmd_fixed_param *)wmi_buf_data(buf);
|
|
|
+ buf_ptr = (uint8_t *)cmd;
|
|
|
+
|
|
|
+ WMITLV_SET_HDR(&cmd->tlv_header,
|
|
|
+ WMITLV_TAG_STRUC_wmi_vdev_set_twt_edca_params_cmd_fixed_param,
|
|
|
+ WMITLV_GET_STRUCT_TLVLEN
|
|
|
+ (wmi_vdev_set_twt_edca_params_cmd_fixed_param));
|
|
|
+
|
|
|
+ cmd->vdev_id = edca_pifs->vdev_id;
|
|
|
+ cmd->type = wmi_convert_edca_pifs_param_type(
|
|
|
+ edca_pifs->param.edca_param_type);
|
|
|
+ buf_ptr += sizeof(wmi_vdev_set_twt_edca_params_cmd_fixed_param);
|
|
|
+
|
|
|
+ if (cmd->type == WMI_EDCA_PARAM_TYPE_AGGRESSIVE) {
|
|
|
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
|
|
|
+ sizeof(*wmm_params));
|
|
|
+ buf_ptr += WMI_TLV_HDR_SIZE;
|
|
|
+ wmm_params = (wmi_wmm_params *)buf_ptr;
|
|
|
+ WMITLV_SET_HDR(&wmm_params->tlv_header,
|
|
|
+ WMITLV_TAG_STRUC_wmi_wmm_params,
|
|
|
+ WMITLV_GET_STRUCT_TLVLEN(wmi_wmm_params));
|
|
|
+
|
|
|
+ wmm_params->cwmin =
|
|
|
+ edca_pifs->param.edca_pifs_param.eparam.acvo_cwmin;
|
|
|
+ wmm_params->cwmax =
|
|
|
+ edca_pifs->param.edca_pifs_param.eparam.acvo_cwmax;
|
|
|
+ wmm_params->aifs =
|
|
|
+ edca_pifs->param.edca_pifs_param.eparam.acvo_aifsn;
|
|
|
+ wmm_params->txoplimit =
|
|
|
+ edca_pifs->param.edca_pifs_param.eparam.acvo_txoplimit;
|
|
|
+ wmm_params->acm =
|
|
|
+ edca_pifs->param.edca_pifs_param.eparam.acvo_acm;
|
|
|
+ wmm_params->no_ack = 0;
|
|
|
+ wmi_debug("vdev_id %d type %d cwmin %d cwmax %d aifsn %d txoplimit %d acm %d no_ack %d",
|
|
|
+ cmd->vdev_id, cmd->type, wmm_params->cwmin,
|
|
|
+ wmm_params->cwmax, wmm_params->aifs,
|
|
|
+ wmm_params->txoplimit, wmm_params->acm,
|
|
|
+ wmm_params->no_ack);
|
|
|
+ buf_ptr += sizeof(*wmm_params);
|
|
|
+ } else {
|
|
|
+ /* set zero TLV's for wmm_params */
|
|
|
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
|
|
|
+ WMITLV_GET_STRUCT_TLVLEN(0));
|
|
|
+ buf_ptr += WMI_TLV_HDR_SIZE;
|
|
|
+ }
|
|
|
+ if (cmd->type == WMI_EDCA_PARAM_TYPE_PIFS) {
|
|
|
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
|
|
|
+ sizeof(*pifs_params));
|
|
|
+ buf_ptr += WMI_TLV_HDR_SIZE;
|
|
|
+ pifs_params = (wmi_pifs_params *)buf_ptr;
|
|
|
+ WMITLV_SET_HDR(&pifs_params->tlv_header,
|
|
|
+ WMITLV_TAG_STRUC_wmi_pifs_params,
|
|
|
+ WMITLV_GET_STRUCT_TLVLEN(wmi_pifs_params));
|
|
|
+
|
|
|
+ pifs_params->sap_pifs_offset =
|
|
|
+ edca_pifs->param.edca_pifs_param.pparam.sap_pifs_offset;
|
|
|
+ pifs_params->leb_pifs_offset =
|
|
|
+ edca_pifs->param.edca_pifs_param.pparam.leb_pifs_offset;
|
|
|
+ pifs_params->reb_pifs_offset =
|
|
|
+ edca_pifs->param.edca_pifs_param.pparam.reb_pifs_offset;
|
|
|
+ wmi_debug("vdev_id %d type %d sap_offset %d leb_offset %d reb_offset %d",
|
|
|
+ cmd->vdev_id, cmd->type, pifs_params->sap_pifs_offset,
|
|
|
+ pifs_params->leb_pifs_offset,
|
|
|
+ pifs_params->reb_pifs_offset);
|
|
|
+ } else {
|
|
|
+ /* set zero TLV's for pifs_params */
|
|
|
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
|
|
|
+ WMITLV_GET_STRUCT_TLVLEN(0));
|
|
|
+ buf_ptr += WMI_TLV_HDR_SIZE;
|
|
|
+ }
|
|
|
+
|
|
|
+ wmi_mtrace(WMI_VDEV_SET_TWT_EDCA_PARAMS_CMDID, cmd->vdev_id, 0);
|
|
|
+ if (wmi_unified_cmd_send(wmi_handle, buf, len,
|
|
|
+ WMI_VDEV_SET_TWT_EDCA_PARAMS_CMDID))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+fail:
|
|
|
+ wmi_buf_free(buf);
|
|
|
+ wmi_err("Failed to set EDCA/PIFS Parameters");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* send_probe_rsp_tmpl_send_cmd_tlv() - send probe response template to fw
|
|
|
* @wmi_handle: wmi handle
|
|
@@ -20132,6 +20276,8 @@ struct wmi_ops tlv_ops = {
|
|
|
#endif /* HEALTH_MON_SUPPORT */
|
|
|
.send_multiple_vdev_param_cmd = send_multiple_vdev_param_cmd_tlv,
|
|
|
.set_mac_addr_rx_filter = send_set_mac_addr_rx_filter_cmd_tlv,
|
|
|
+ .send_update_edca_pifs_param_cmd =
|
|
|
+ send_update_edca_pifs_param_cmd_tlv,
|
|
|
};
|
|
|
|
|
|
#ifdef WLAN_FEATURE_11BE_MLO
|