ソースを参照

qcacmn: Update the fixed param for UTF command and event id

Update the fixed param for UTF WMI command and event id.
Update the pdev_id in UTF command id.

Change-Id: I67d1e5698a31acd630a4c4f60410dff454999c5d
CRs-Fixed: 3648165
Madhavan Ganesan 1 年間 前
コミット
86db3eda0e
2 ファイル変更60 行追加18 行削除
  1. 1 0
      wmi/inc/wmi_unified_param.h
  2. 59 18
      wmi/src/wmi_unified_tlv.c

+ 1 - 0
wmi/inc/wmi_unified_param.h

@@ -6472,6 +6472,7 @@ typedef enum {
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 	wmi_service_5ghz_hi_rssi_roam_support,
 #endif
+	wmi_service_pdev_param_in_utf_wmi,
 	wmi_services_max,
 } wmi_conv_service_ids;
 #define WMI_SERVICE_UNAVAILABLE 0xFFFF

+ 59 - 18
wmi/src/wmi_unified_tlv.c

@@ -85,6 +85,8 @@
 static const uint32_t multi_svc_ids[] = {WMI_CONTROL_SVC,
 				WMI_CONTROL_SVC_WMAC1,
 				WMI_CONTROL_SVC_WMAC2};
+static bool is_service_enabled_tlv(wmi_unified_t wmi_handle,
+				   uint32_t service_id);
 
 #ifdef ENABLE_HOST_TO_TARGET_CONVERSION
 /*Populate peer_param array whose index as host id and
@@ -2168,6 +2170,9 @@ send_pdev_utf_cmd_tlv(wmi_unified_t wmi_handle,
 	uint16_t chunk_len, total_bytes;
 	uint8_t *bufpos;
 	struct seg_hdr_info segHdrInfo;
+	wmi_pdev_utf_cmd_fixed_param *utf_cmd;
+	uint16_t len;
+	bool is_pdev_id_over_utf;
 
 	bufpos = param->utf_payload;
 	total_bytes = param->len;
@@ -2184,9 +2189,15 @@ send_pdev_utf_cmd_tlv(wmi_unified_t wmi_handle,
 		else
 			chunk_len = param->len;
 
-		buf = wmi_buf_alloc(wmi_handle,
-				    (chunk_len + sizeof(segHdrInfo) +
-				     WMI_TLV_HDR_SIZE));
+		is_pdev_id_over_utf = is_service_enabled_tlv(wmi_handle,
+					WMI_SERVICE_PDEV_PARAM_IN_UTF_WMI);
+		if (is_pdev_id_over_utf)
+			len = chunk_len + sizeof(segHdrInfo) +
+					WMI_TLV_HDR_SIZE + sizeof(*utf_cmd);
+		else
+			len = chunk_len + sizeof(segHdrInfo) + WMI_TLV_HDR_SIZE;
+
+		buf = wmi_buf_alloc(wmi_handle, len);
 		if (!buf)
 			return QDF_STATUS_E_NOMEM;
 
@@ -2198,28 +2209,40 @@ send_pdev_utf_cmd_tlv(wmi_unified_t wmi_handle,
 		segHdrInfo.segmentInfo = segInfo;
 		segHdrInfo.pad = 0;
 
-		wmi_debug("segHdrInfo.len = %d, segHdrInfo.msgref = %d,"
-			 " segHdrInfo.segmentInfo = %d",
-			 segHdrInfo.len, segHdrInfo.msgref,
-			 segHdrInfo.segmentInfo);
+		wmi_debug("segHdrInfo.len = %u, segHdrInfo.msgref = %u, segHdrInfo.segmentInfo = %u",
+			  segHdrInfo.len, segHdrInfo.msgref,
+			  segHdrInfo.segmentInfo);
 
-		wmi_debug("total_bytes %d segNumber %d totalSegments %d"
-			 " chunk len %d", total_bytes, segNumber,
-			 numSegments, chunk_len);
+		wmi_debug("total_bytes %u segNumber %u totalSegments %u chunk len %u",
+			  total_bytes, segNumber, numSegments, chunk_len);
 
 		segNumber++;
 
 		WMITLV_SET_HDR(cmd, WMITLV_TAG_ARRAY_BYTE,
 			       (chunk_len + sizeof(segHdrInfo)));
 		cmd += WMI_TLV_HDR_SIZE;
-		memcpy(cmd, &segHdrInfo, sizeof(segHdrInfo));   /* 4 bytes */
-		WMI_HOST_IF_MSG_COPY_CHAR_ARRAY(&cmd[sizeof(segHdrInfo)],
+		memcpy(cmd, &segHdrInfo, sizeof(segHdrInfo));   /* 4 words */
+		cmd += sizeof(segHdrInfo);
+		WMI_HOST_IF_MSG_COPY_CHAR_ARRAY(cmd,
 						bufpos, chunk_len);
 
+		if (is_pdev_id_over_utf) {
+			cmd += chunk_len;
+			utf_cmd = (wmi_pdev_utf_cmd_fixed_param *)cmd;
+			WMITLV_SET_HDR(&utf_cmd->tlv_header,
+				WMITLV_TAG_STRUC_wmi_pdev_utf_cmd_fixed_param,
+				WMITLV_GET_STRUCT_TLVLEN(
+					wmi_pdev_utf_cmd_fixed_param));
+
+			if (wmi_handle->ops->convert_host_pdev_id_to_target)
+				utf_cmd->pdev_id =
+					wmi_handle->ops->convert_host_pdev_id_to_target(
+							wmi_handle, mac_id);
+
+			wmi_debug("pdev_id %u", utf_cmd->pdev_id);
+		}
 		wmi_mtrace(WMI_PDEV_UTF_CMDID, NO_SESSION, 0);
-		ret = wmi_unified_cmd_send(wmi_handle, buf,
-					   (chunk_len + sizeof(segHdrInfo) +
-					    WMI_TLV_HDR_SIZE),
+		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
 					   WMI_PDEV_UTF_CMDID);
 
 		if (QDF_IS_STATUS_ERROR(ret)) {
@@ -14239,6 +14262,8 @@ static QDF_STATUS extract_pdev_utf_event_tlv(wmi_unified_t wmi_handle,
 {
 	WMI_PDEV_UTF_EVENTID_param_tlvs *param_buf;
 	struct wmi_host_utf_seg_header_info *seg_hdr;
+	wmi_pdev_utf_event_fixed_param *ev_param;
+	bool is_pdev_id_over_utf;
 
 	param_buf = (WMI_PDEV_UTF_EVENTID_param_tlvs *)evt_buf;
 	event->data = param_buf->data;
@@ -14248,11 +14273,25 @@ static QDF_STATUS extract_pdev_utf_event_tlv(wmi_unified_t wmi_handle,
 		wmi_err("Invalid datalen: %d", event->datalen);
 		return QDF_STATUS_E_INVAL;
 	}
-	seg_hdr = (struct wmi_host_utf_seg_header_info *)param_buf->data;
-	/* Set pdev_id=1 until FW adds support to include pdev_id */
-	event->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
+
+	is_pdev_id_over_utf = is_service_enabled_tlv(wmi_handle,
+			WMI_SERVICE_PDEV_PARAM_IN_UTF_WMI);
+	if (is_pdev_id_over_utf && param_buf->fixed_param &&
+			param_buf->num_fixed_param) {
+		ev_param =
+			(wmi_pdev_utf_event_fixed_param *)param_buf->fixed_param;
+		event->pdev_id =
+			wmi_handle->ops->convert_pdev_id_target_to_host(
+							wmi_handle,
+							ev_param->pdev_id);
+	} else {
+		seg_hdr =
+			(struct wmi_host_utf_seg_header_info *)param_buf->data;
+		event->pdev_id =
+			wmi_handle->ops->convert_pdev_id_target_to_host(
 							wmi_handle,
 							seg_hdr->pdev_id);
+	}
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -22861,6 +22900,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
 	wmi_service[wmi_service_5ghz_hi_rssi_roam_support] =
 					WMI_SERVICE_5GHZ_HI_RSSI_ROAM_SUPPORT;
 #endif
+	wmi_service[wmi_service_pdev_param_in_utf_wmi] =
+			WMI_SERVICE_PDEV_PARAM_IN_UTF_WMI;
 }
 
 /**