Browse Source

qcacmn: Add HMWDS rem-addr support in Beryllium

Add HMWDS rem-addr support to delete AST WDS mac entries in
Beryllium chipsets.

Change-Id: I5623bac02b326d1d668ad5e1fdcfc3a9f8cbbb9c
CRs-Fixed: 3397961
Abishek Ganapathy 2 năm trước cách đây
mục cha
commit
ee1493dc9c
5 tập tin đã thay đổi với 108 bổ sung12 xóa
  1. 36 0
      dp/inc/cdp_txrx_cmn.h
  2. 4 0
      dp/inc/cdp_txrx_ops.h
  3. 32 0
      dp/wifi3.0/dp_main.c
  4. 20 12
      dp/wifi3.0/dp_peer.c
  5. 16 0
      dp/wifi3.0/dp_peer.h

+ 36 - 0
dp/inc/cdp_txrx_cmn.h

@@ -680,6 +680,42 @@ static inline QDF_STATUS cdp_peer_ast_delete_by_pdev
 					 cookie);
 }
 
+/**
+ * cdp_peer_HMWDS_ast_delete() - delete the ast entry from soc AST hash table
+ *                               for HMWDS rem-addr command
+ *
+ * @soc: data path soc handle
+ * @vdev_id: vdev id
+ * @dest_mac: AST entry mac address to delete
+ * @type: cdp_txrx_ast_entry_type to send to FW
+ * @delete_in_fw: flag to indicate AST entry deletion in FW
+ *
+ * Return: QDF_STATUS_SUCCESS if ast entry found with ast_mac_addr and delete
+ *         is sent
+ *         QDF_STATUS_E_INVAL false if ast entry not found
+ */
+static inline QDF_STATUS cdp_peer_HMWDS_ast_delete
+	(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *dest_mac,
+	 uint8_t type, uint8_t delete_in_fw)
+{
+	if (!soc || !soc->ops) {
+		dp_cdp_debug("Invalid Instance:");
+		QDF_BUG(0);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->txrx_peer_HMWDS_ast_delete)
+		return QDF_STATUS_E_INVAL;
+
+	return soc->ops->cmn_drv_ops->txrx_peer_HMWDS_ast_delete
+					(soc,
+					 vdev_id,
+					 dest_mac,
+					 type,
+					 delete_in_fw);
+}
+
 static inline int cdp_peer_add_ast
 	(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac,
 	uint8_t *mac_addr,

+ 4 - 0
dp/inc/cdp_txrx_ops.h

@@ -276,6 +276,10 @@ struct cdp_cmn_ops {
 		txrx_ast_free_cb callback,
 		void *cookie);
 
+	QDF_STATUS (*txrx_peer_HMWDS_ast_delete)
+		(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *dest_mac,
+		 uint8_t type, uint8_t delete_in_fw);
+
 	QDF_STATUS
 	(*txrx_peer_delete)(struct cdp_soc_t *soc, uint8_t vdev_id,
 			    uint8_t *peer_mac, uint32_t bitmap,

+ 32 - 0
dp/wifi3.0/dp_main.c

@@ -1186,6 +1186,37 @@ static QDF_STATUS dp_peer_ast_entry_del_by_pdev(struct cdp_soc_t *soc_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * dp_peer_HMWDS_ast_entry_del() - delete the ast entry from soc AST hash
+ *                                 table if HMWDS rem-addr command is issued
+ *
+ * @soc_handle: data path soc handle
+ * @vdev_id: vdev id
+ * @wds_macaddr: AST entry mac address to delete
+ * @type: cdp_txrx_ast_entry_type to send to FW
+ * @delete_in_fw: flag to indicate AST entry deletion in FW
+ *
+ * Return: QDF_STATUS_SUCCESS if ast entry found with ast_mac_addr and delete
+ *         is sent
+ *         QDF_STATUS_E_INVAL false if ast entry not found
+ */
+static QDF_STATUS dp_peer_HMWDS_ast_entry_del(struct cdp_soc_t *soc_handle,
+					      uint8_t vdev_id,
+					      uint8_t *wds_macaddr,
+					      uint8_t type,
+					      uint8_t delete_in_fw)
+{
+	struct dp_soc *soc = (struct dp_soc *)soc_handle;
+
+	if (soc->ast_offload_support) {
+		dp_del_wds_entry_wrapper(soc, vdev_id, wds_macaddr, type,
+					 delete_in_fw);
+		return QDF_STATUS_SUCCESS;
+	}
+
+	return -QDF_STATUS_E_INVAL;
+}
+
 /**
  * dp_srng_find_ring_in_mask() - find which ext_group a ring belongs
  * @ring_num: ring num of the ring being queried
@@ -14040,6 +14071,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 		dp_peer_ast_entry_del_by_soc,
 	.txrx_peer_ast_delete_by_pdev =
 		dp_peer_ast_entry_del_by_pdev,
+	.txrx_peer_HMWDS_ast_delete = dp_peer_HMWDS_ast_entry_del,
 	.txrx_peer_delete = dp_peer_delete_wifi3,
 #ifdef DP_RX_UDP_OVER_PEER_ROAM
 	.txrx_update_roaming_peer = dp_update_roaming_peer_wifi3,

+ 20 - 12
dp/wifi3.0/dp_peer.c

@@ -123,11 +123,11 @@ static int dp_update_wds_entry_wrapper(struct dp_soc *soc,
  *
  * Return: None
  */
-static void dp_del_wds_entry_wrapper(struct dp_soc *soc,
-				     uint8_t vdev_id,
-				     uint8_t *wds_macaddr,
-				     uint8_t type,
-				     uint8_t delete_in_fw)
+void dp_del_wds_entry_wrapper(struct dp_soc *soc,
+			      uint8_t vdev_id,
+			      uint8_t *wds_macaddr,
+			      uint8_t type,
+			      uint8_t delete_in_fw)
 {
 	target_if_del_wds_entry(soc->ctrl_psoc, vdev_id,
 				wds_macaddr, type, delete_in_fw);
@@ -171,11 +171,11 @@ static int dp_update_wds_entry_wrapper(struct dp_soc *soc,
 	return status;
 }
 
-static void dp_del_wds_entry_wrapper(struct dp_soc *soc,
-				     uint8_t vdev_id,
-				     uint8_t *wds_macaddr,
-				     uint8_t type,
-				     uint8_t delete_in_fw)
+void dp_del_wds_entry_wrapper(struct dp_soc *soc,
+			      uint8_t vdev_id,
+			      uint8_t *wds_macaddr,
+			      uint8_t type,
+			      uint8_t delete_in_fw)
 {
 	soc->cdp_soc.ol_ops->peer_del_wds_entry(soc->ctrl_psoc,
 						vdev_id,
@@ -183,8 +183,16 @@ static void dp_del_wds_entry_wrapper(struct dp_soc *soc,
 						type,
 						delete_in_fw);
 }
-#endif
-#endif
+#endif /* BYPASS_OL_OPS */
+#else
+void dp_del_wds_entry_wrapper(struct dp_soc *soc,
+			      uint8_t vdev_id,
+			      uint8_t *wds_macaddr,
+			      uint8_t type,
+			      uint8_t delete_in_fw)
+{
+}
+#endif /* FEATURE_AST */
 
 #ifdef FEATURE_WDS
 static inline bool

+ 16 - 0
dp/wifi3.0/dp_peer.h

@@ -1258,6 +1258,22 @@ QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc);
  */
 QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc);
 
+/**
+ * dp_del_wds_entry_wrapper() - delete a WDS AST entry
+ * @soc: DP soc structure pointer
+ * @vdev_id: vdev_id
+ * @wds_macaddr: MAC address of ast node
+ * @type: type from enum cdp_txrx_ast_entry_type
+ * @delete_in_fw: Flag to indicate if entry needs to be deleted in fw
+ *
+ * This API is used to delete an AST entry from fw
+ *
+ * Return: None
+ */
+void dp_del_wds_entry_wrapper(struct dp_soc *soc, uint8_t vdev_id,
+			      uint8_t *wds_macaddr, uint8_t type,
+			      uint8_t delete_in_fw);
+
 void dp_soc_wds_attach(struct dp_soc *soc);
 
 /**