qcacmn: Add support for HMWDS add and reset cmds in Beryllium

Add HMWDS add-addr, rem-addr, reset-addr and reset-table support
to add, reset and remove AST HMWDS mac entries in Beryllium
chipsets.

wlanconfig athX hmwds add-addr wds_ni_macaddr wds_macaddr
wlanconfig athX hmwds reset-addr macaddr
wlanconfig athX hmwds reset-table
wlanconfig athX hmwds rem-addr wds_macaddr

Change-Id: Iaa110ba26a477fc0b77647a712c377029b038940
CRs-Fixed: 3429510
This commit is contained in:
Vignesh C
2023-03-28 10:54:46 +05:30
committed by Madan Koyyalamudi
parent 2859221891
commit 070e8af74f
5 changed files with 136 additions and 30 deletions

View File

@@ -688,7 +688,6 @@ static inline QDF_STATUS cdp_peer_ast_delete_by_pdev
* @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
@@ -696,7 +695,7 @@ static inline QDF_STATUS cdp_peer_ast_delete_by_pdev
*/
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)
uint8_t type)
{
if (!soc || !soc->ops) {
dp_cdp_debug("Invalid Instance:");
@@ -712,8 +711,7 @@ static inline QDF_STATUS cdp_peer_HMWDS_ast_delete
(soc,
vdev_id,
dest_mac,
type,
delete_in_fw);
type);
}
static inline int cdp_peer_add_ast
@@ -741,7 +739,7 @@ static inline int cdp_peer_add_ast
static inline QDF_STATUS cdp_peer_reset_ast
(ol_txrx_soc_handle soc, uint8_t *wds_macaddr, uint8_t *peer_macaddr,
uint8_t vdev_id)
uint8_t vdev_id, enum cdp_txrx_ast_entry_type type)
{
if (!soc || !soc->ops) {
@@ -754,11 +752,12 @@ static inline QDF_STATUS cdp_peer_reset_ast
return QDF_STATUS_E_FAILURE;
return soc->ops->cmn_drv_ops->txrx_peer_reset_ast(soc, wds_macaddr,
peer_macaddr, vdev_id);
peer_macaddr, vdev_id, type);
}
static inline QDF_STATUS cdp_peer_reset_ast_table
(ol_txrx_soc_handle soc, uint8_t vdev_id)
(ol_txrx_soc_handle soc, uint8_t vdev_id,
enum cdp_txrx_ast_entry_type type)
{
if (!soc || !soc->ops) {
dp_cdp_debug("Invalid Instance:");
@@ -770,7 +769,8 @@ static inline QDF_STATUS cdp_peer_reset_ast_table
!soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table)
return QDF_STATUS_E_FAILURE;
return soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table(soc, vdev_id);
return soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table(soc, vdev_id,
type);
}
static inline void cdp_peer_flush_ast_table

View File

@@ -278,7 +278,7 @@ struct cdp_cmn_ops {
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);
uint8_t type);
QDF_STATUS
(*txrx_peer_delete)(struct cdp_soc_t *soc, uint8_t vdev_id,
@@ -593,10 +593,12 @@ struct cdp_cmn_ops {
QDF_STATUS (*txrx_peer_reset_ast)
(ol_txrx_soc_handle soc, uint8_t *ast_macaddr,
uint8_t *peer_macaddr, uint8_t vdev_id);
uint8_t *peer_macaddr, uint8_t vdev_id,
enum cdp_txrx_ast_entry_type type);
QDF_STATUS (*txrx_peer_reset_ast_table)(ol_txrx_soc_handle soc,
uint8_t vdev_id);
QDF_STATUS (*txrx_peer_reset_ast_table)
(ol_txrx_soc_handle soc, uint8_t vdev_id,
enum cdp_txrx_ast_entry_type type);
void (*txrx_peer_flush_ast_table)(ol_txrx_soc_handle soc);
void (*txrx_set_ba_aging_timeout)(struct cdp_soc_t *soc_handle,

View File

@@ -581,13 +581,15 @@ dp_peer_reset_ast_entries(struct dp_soc *soc, struct dp_peer *peer, void *arg)
* @wds_macaddr: WDS entry MAC Address
* @peer_mac_addr: WDS entry MAC Address
* @vdev_id: id of vdev handle
* @type: Type of AST entry
*
* Return: QDF_STATUS
*/
static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
uint8_t *wds_macaddr,
uint8_t *peer_mac_addr,
uint8_t vdev_id)
uint8_t vdev_id,
enum cdp_txrx_ast_entry_type type)
{
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
struct dp_ast_entry *ast_entry = NULL;
@@ -595,7 +597,7 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
struct dp_pdev *pdev;
struct dp_vdev *vdev;
if (soc->ast_offload_support)
if (soc->ast_offload_support && type != CDP_TXRX_AST_TYPE_WDS_HM)
return QDF_STATUS_E_FAILURE;
vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
@@ -639,16 +641,17 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
* dp_wds_reset_ast_table_wifi3() - Reset the is_active param for all ast entry
* @soc_hdl: Datapath SOC handle
* @vdev_id: id of vdev object
* @type: Type of AST entry
*
* Return: QDF_STATUS
*/
static QDF_STATUS
dp_wds_reset_ast_table_wifi3(struct cdp_soc_t *soc_hdl,
uint8_t vdev_id)
uint8_t vdev_id, enum cdp_txrx_ast_entry_type type)
{
struct dp_soc *soc = (struct dp_soc *) soc_hdl;
if (soc->ast_offload_support)
if (soc->ast_offload_support && type != CDP_TXRX_AST_TYPE_WDS_HM)
return QDF_STATUS_SUCCESS;
qdf_spin_lock_bh(&soc->ast_lock);
@@ -972,7 +975,6 @@ static QDF_STATUS dp_peer_ast_entry_del_by_pdev(struct cdp_soc_t *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
@@ -981,14 +983,13 @@ static QDF_STATUS dp_peer_ast_entry_del_by_pdev(struct cdp_soc_t *soc_handle,
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)
uint8_t type)
{
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);
dp_wds_reset_ast_wifi3(soc_handle, wds_macaddr, NULL, vdev_id,
type);
return QDF_STATUS_SUCCESS;
}

View File

@@ -201,11 +201,14 @@ dp_peer_ast_free_in_unmap_supported(struct dp_soc *soc,
* for the peer free ast entry from here only in this case
*/
if ((ast_entry->type != CDP_TXRX_AST_TYPE_WDS_HM_SEC) &&
(ast_entry->type != CDP_TXRX_AST_TYPE_SELF))
return true;
switch (ast_entry->type) {
case CDP_TXRX_AST_TYPE_WDS_HM_SEC:
case CDP_TXRX_AST_TYPE_SELF:
case CDP_TXRX_AST_TYPE_WDS_HM:
return false;
default:
return true;
}
}
#else
static inline bool
@@ -1557,6 +1560,71 @@ void dp_peer_free_hmwds_cb(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
qdf_mem_free(cookie);
}
QDF_STATUS dp_peer_add_ast_hmwds(struct dp_soc *soc,
struct dp_peer *peer,
uint8_t *mac_addr,
enum cdp_txrx_ast_entry_type type,
uint32_t flags)
{
struct dp_ast_entry *ast_entry = NULL;
struct dp_vdev *vdev = NULL;
struct dp_ast_entry *tmp_ast_entry;
int status = 0;
vdev = peer->vdev;
if (!vdev) {
dp_peer_err("%pK: Peers vdev is NULL", soc);
QDF_ASSERT(0);
return QDF_STATUS_E_INVAL;
}
qdf_spin_lock_bh(&soc->ast_lock);
/* Check if the mac_addr is already been part of ast_list_elem
* Return STATUS Already if found
*/
DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, tmp_ast_entry) {
if ((ast_entry->type == CDP_TXRX_AST_TYPE_WDS_HM) &&
(!ast_entry->delete_in_progress) &&
(qdf_mem_cmp(mac_addr, ast_entry->mac_addr.raw,
QDF_MAC_ADDR_SIZE) == 0)) {
qdf_spin_unlock_bh(&soc->ast_lock);
return QDF_STATUS_E_ALREADY;
}
}
ast_entry = (struct dp_ast_entry *)
qdf_mem_malloc(sizeof(struct dp_ast_entry));
if (!ast_entry) {
qdf_spin_unlock_bh(&soc->ast_lock);
dp_peer_err("%pK: fail to allocate ast_entry", soc);
QDF_ASSERT(0);
return QDF_STATUS_E_NOMEM;
}
qdf_mem_copy(&ast_entry->mac_addr.raw[0], mac_addr, QDF_MAC_ADDR_SIZE);
ast_entry->pdev_id = vdev->pdev->pdev_id;
ast_entry->is_mapped = false;
ast_entry->delete_in_progress = false;
ast_entry->peer_id = peer->peer_id;
ast_entry->next_hop = 0;
ast_entry->vdev_id = vdev->vdev_id;
ast_entry->type = CDP_TXRX_AST_TYPE_WDS_HM;
ast_entry->is_active = TRUE;
DP_STATS_INC(soc, ast.added, 1);
dp_peer_ast_hash_add(soc, ast_entry);
soc->num_ast_entries++;
TAILQ_INSERT_TAIL(&peer->ast_entry_list, ast_entry, ase_list_elem);
status = dp_update_wds_entry_wrapper(soc,
peer,
ast_entry->mac_addr.raw,
flags);
qdf_spin_unlock_bh(&soc->ast_lock);
return qdf_status_from_os_return(status);
}
QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
struct dp_peer *peer,
uint8_t *mac_addr,
@@ -1572,8 +1640,17 @@ QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
bool is_peer_found = false;
int status = 0;
if (soc->ast_offload_support)
if (soc->ast_offload_support) {
if (type == CDP_TXRX_AST_TYPE_WDS_HM) {
return dp_peer_add_ast_hmwds(soc,
peer,
mac_addr,
flags,
type);
} else {
return QDF_STATUS_E_INVAL;
}
}
vdev = peer->vdev;
if (!vdev) {
@@ -1857,14 +1934,15 @@ void dp_peer_del_ast(struct dp_soc *soc, struct dp_ast_entry *ast_entry)
{
struct dp_peer *peer = NULL;
if (soc->ast_offload_support)
return;
if (!ast_entry) {
dp_info_rl("NULL AST entry");
return;
}
if (soc->ast_offload_support && ast_entry->type !=
CDP_TXRX_AST_TYPE_WDS_HM)
return;
if (ast_entry->delete_in_progress) {
dp_info_rl("AST entry deletion in progress mac addr:"QDF_MAC_ADDR_FMT" type:%d",
QDF_MAC_ADDR_REF(ast_entry->mac_addr.raw),
@@ -2060,6 +2138,15 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_vdevid(struct dp_soc *soc,
return NULL;
}
QDF_STATUS dp_peer_add_ast_hmwds(struct dp_soc *soc,
struct dp_peer *peer,
uint8_t *mac_addr,
enum cdp_txrx_ast_entry_type type,
uint32_t flags)
{
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
struct dp_peer *peer,
uint8_t *mac_addr,

View File

@@ -710,6 +710,22 @@ QDF_STATUS dp_peer_add_ast(struct dp_soc *soc, struct dp_peer *peer,
uint8_t *mac_addr, enum cdp_txrx_ast_entry_type type,
uint32_t flags);
/**
* dp_peer_add_ast_hmwds() - Allocate and add hmwds AST entry into peer list
* @soc: SoC handle
* @peer: peer to which ast node belongs
* @mac_addr: MAC address of ast node
* @type: AST entry type
* @flags: AST configuration flags
*
* This function adds new HMWDS AST entry into peer AST list
*
* Return: QDF_STATUS code
*/
QDF_STATUS dp_peer_add_ast_hmwds(struct dp_soc *soc, struct dp_peer *peer,
uint8_t *mac_addr,
enum cdp_txrx_ast_entry_type type,
uint32_t flags);
/**
* dp_peer_del_ast() - Delete and free AST entry
* @soc: SoC handle