Explorar o código

qcacmn: Add support for nl callback for cfr data

Host add support to send cfr data via nl events to userspace
applications. Host registers callback when user send vendor
command to set transport mode.

Change-Id: Ieed3b6e09d871639af58336074313120d51762e2
CRs-Fixed: 2952096
Abhishek Ambure %!s(int64=4) %!d(string=hai) anos
pai
achega
606c708af6

+ 8 - 1
umac/cfr/core/src/cfr_common.c

@@ -425,7 +425,6 @@ QDF_STATUS cfr_streamfs_write(struct pdev_cfr *pa, const void *write_data,
 			      size_t write_len)
 {
 	if (pa->chan_ptr) {
-
 	/* write to channel buffer */
 		qdf_streamfs_write(pa->chan_ptr, (const void *)write_data,
 				   write_len);
@@ -460,6 +459,14 @@ QDF_STATUS cfr_stop_indication(struct wlan_objmgr_vdev *vdev)
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (pa->nl_cb.cfr_nl_cb) {
+		pa->nl_cb.cfr_nl_cb(pa->nl_cb.vdev_id, pa->nl_cb.pid,
+				    (const void *)CFR_STOP_STR,
+				    sizeof(CFR_STOP_STR));
+
+		return QDF_STATUS_SUCCESS;
+	}
+
 	status = cfr_streamfs_write(pa, (const void *)CFR_STOP_STR,
 				    sizeof(CFR_STOP_STR));
 

+ 15 - 0
umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h

@@ -524,6 +524,19 @@ struct cfr_rcc_param {
 };
 #endif /* WLAN_ENH_CFR_ENABLE */
 
+/**
+ * struct nl_event_cb - nl event cb for cfr data
+ * vdev_id: vdev id
+ * pid: PID to which data is sent via unicast nl evnet
+ * cfr_nl_cb: callback to send nl evnet
+ */
+struct nl_event_cb {
+	uint8_t vdev_id;
+	uint32_t pid;
+	void (*cfr_nl_cb)(uint8_t vdev_id, uint32_t pid,
+			  const void *data, uint32_t data_len);
+};
+
 /**
  * struct pdev_cfr - private pdev object for cfr
  * pdev_obj: pointer to pdev object
@@ -571,6 +584,7 @@ struct cfr_rcc_param {
  * capture_count and capture_duration modes with a nob provided to configure.
  * unassoc_pool: Pool of un-associated clients used when capture method is
  * CFR_CAPTURE_METHOD_PROBE_RESPONSE
+ * nl_cb: call back to register for nl event for cfr data
  * lut_lock: Lock to protect access to cfr lookup table
  */
 /*
@@ -618,6 +632,7 @@ struct pdev_cfr {
 	uint8_t is_mo_marking_support;
 #endif
 	struct unassoc_pool_entry unassoc_pool[MAX_CFR_ENABLED_CLIENTS];
+	struct nl_event_cb nl_cb;
 	qdf_spinlock_t lut_lock;
 };
 

+ 29 - 1
umac/cfr/dispatcher/src/wlan_cfr_tgt_api.c

@@ -31,7 +31,8 @@ uint32_t tgt_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head,
 			   size_t tlen)
 {
 	struct pdev_cfr *pa;
-	uint32_t status;
+	uint32_t status, total_len;
+	uint8_t *nl_data = NULL;
 
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 
@@ -40,6 +41,33 @@ uint32_t tgt_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head,
 		return -1;
 	}
 
+	/* If CFR data transport mode is NL event then send single event*/
+	if (pa->nl_cb.cfr_nl_cb) {
+		total_len = hlen + dlen + tlen;
+
+		nl_data = qdf_mem_malloc(total_len);
+		if (!nl_data) {
+			cfr_err("failed to alloc memory, len %d, vdev_id %d",
+				total_len, pa->nl_cb.vdev_id);
+			return QDF_STATUS_E_FAILURE;
+		}
+
+		if (hlen)
+			qdf_mem_copy(nl_data, head, hlen);
+
+		if (dlen)
+			qdf_mem_copy(nl_data + hlen, data, dlen);
+
+		if (tlen)
+			qdf_mem_copy(nl_data + hlen + dlen, tail, tlen);
+
+		pa->nl_cb.cfr_nl_cb(pa->nl_cb.vdev_id, pa->nl_cb.pid,
+				    (const void *)nl_data, total_len);
+		qdf_mem_free(nl_data);
+
+		return QDF_STATUS_SUCCESS;
+	}
+
 	if (head)
 		status = cfr_streamfs_write(pa, (const void *)head, hlen);