浏览代码

qcacmn: Enable WDS learning only when configured

Add support to make WDS source port learning in lithium datapath
to be configurable.

Change-Id: I63eb64d6f46560a31f8e40a806d05d1dceddd784
CRs-Fixed: 2004658
Karunakar Dasineni 8 年之前
父节点
当前提交
ca792543cf
共有 6 个文件被更改,包括 46 次插入13 次删除
  1. 1 1
      dp/inc/cdp_txrx_ops.h
  2. 17 0
      dp/inc/cdp_txrx_wds.h
  3. 19 5
      dp/wifi3.0/dp_main.c
  4. 4 3
      dp/wifi3.0/dp_rx.c
  5. 2 4
      dp/wifi3.0/dp_rx_err.c
  6. 3 0
      dp/wifi3.0/dp_types.h

+ 1 - 1
dp/inc/cdp_txrx_ops.h

@@ -521,7 +521,7 @@ struct cdp_wds_ops {
 	void
 		(*txrx_set_wds_rx_policy)(struct cdp_vdev *vdev,
 				u_int32_t val);
-
+	int (*vdev_set_wds)(void *vdev, uint32_t val);
 };
 
 struct cdp_raw_ops {

+ 17 - 0
dp/inc/cdp_txrx_wds.h

@@ -58,4 +58,21 @@ cdp_set_wds_rx_policy(ol_txrx_soc_handle soc,
 	return;
 }
 
+/**
+ * cdp_vdev_set_wds() - Set/unset wds_enable flag in vdev
+ * @soc - data path soc handle
+ * @vdev - data path vap handle
+ * @val - value to be set in wds_en flag
+ *
+ *  This flag enables WDS source port learning feature on a vdev
+ *
+ * return 1 on success
+ */
+static inline int
+cdp_vdev_set_wds(ol_txrx_soc_handle soc, void *vdev, uint32_t val)
+{
+	if (soc->ops->wds_ops->vdev_set_wds)
+		return soc->ops->wds_ops->vdev_set_wds(vdev, val);
+	return 0;
+}
 #endif

+ 19 - 5
dp/wifi3.0/dp_main.c

@@ -2116,10 +2116,24 @@ static void dp_peer_delete_wifi3(void *peer_handle)
 static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_vdev *pvdev)
 {
 	struct dp_vdev *vdev = (struct dp_vdev *)pvdev;
-
 	return vdev->mac_addr.raw;
 }
 
+/*
+ * dp_vdev_set_wds() - Enable per packet stats
+ * @vdev_handle: DP VDEV handle
+ * @val: value
+ *
+ * Return: none
+ */
+static int dp_vdev_set_wds(void *vdev_handle, uint32_t val)
+{
+	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
+
+	vdev->wds_enabled = val;
+	return 0;
+}
+
 /*
  * dp_get_vdev_from_vdev_id_wifi3() – Detach txrx peer
  * @peer_handle:		Datapath peer handle
@@ -3332,6 +3346,10 @@ static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value)
 
 }
 
+static struct cdp_wds_ops dp_ops_wds = {
+	.vdev_set_wds = dp_vdev_set_wds,
+};
+
 static struct cdp_cmn_ops dp_ops_cmn = {
 	.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
 	.txrx_vdev_attach = dp_vdev_attach_wifi3,
@@ -3400,10 +3418,6 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
 	/* TODO */
 };
 
-static struct cdp_wds_ops dp_ops_wds = {
-	/* TODO */
-};
-
 static struct cdp_raw_ops dp_ops_raw = {
 	/* TODO */
 };

+ 4 - 3
dp/wifi3.0/dp_rx.c

@@ -964,10 +964,11 @@ done:
 #endif /* NAPIER_EMULATION */
 
 			/* WDS Source Port Learning */
-			if (qdf_likely(vdev->rx_decap_type ==
-						htt_cmn_pkt_type_ethernet))
+			if (qdf_likely((vdev->wds_enabled) &&
+						(vdev->rx_decap_type ==
+						htt_cmn_pkt_type_ethernet)))
 				dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer,
-									nbuf);
+						nbuf);
 
 			/* Intrabss-fwd */
 			if (vdev->opmode != wlan_op_mode_sta)

+ 2 - 4
dp/wifi3.0/dp_rx_err.c

@@ -298,7 +298,8 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc,
 		__func__, __LINE__, sgi, rate_mcs, tid);
 
 	/* WDS Source Port Learning */
-	if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet))
+	if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet) &&
+			(vdev->wds_enabled))
 		dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf);
 
 	/*
@@ -310,9 +311,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc,
 	if (l2_hdr_offset)
 		qdf_nbuf_pull_head(nbuf, l2_hdr_offset);
 
-	/* WDS Source Port Learning */
-	dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf);
-
 	if (hal_rx_mpdu_start_mpdu_qos_control_valid_get(
 		rx_desc->rx_buf_start)) {
 		/* TODO: Assuming that qos_control_valid also indicates

+ 3 - 0
dp/wifi3.0/dp_types.h

@@ -896,6 +896,9 @@ struct dp_vdev {
 	/* BSS peer */
 	struct dp_peer *vap_bss_peer;
 
+	/* WDS enabled */
+	bool wds_enabled;
+
 	/* NAWDS enabled */
 	bool nawds_enabled;