diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 0a5c700440..698a5d332a 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/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, diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 7b191c2009..bb808ec9bf 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/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, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 61c03b7589..f02428ae42 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 4084bccfcc..202038271f 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/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 diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index c5a741059c..80fcc99578 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/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); /**