qcacmn: Bypass cds to create AST entry for WDS station
The qcacld driver does not register ol_if_ops callbacks to handle wds AST request. Call target if APIs directly to add, delete, and update the AST entries for the WDS stations. Change-Id: Ib4d5e1fdd6598e3390dbd2be0f24a72ccf01f202 CRs-Fixed: 3133839
This commit is contained in:

committed by
Madan Koyyalamudi

parent
63b2260b64
commit
b657bc4223
@@ -40,6 +40,9 @@
|
|||||||
#ifdef QCA_PEER_EXT_STATS
|
#ifdef QCA_PEER_EXT_STATS
|
||||||
#include "dp_hist.h"
|
#include "dp_hist.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BYPASS_OL_OPS
|
||||||
|
#include <target_if_dp.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef REO_QDESC_HISTORY
|
#ifdef REO_QDESC_HISTORY
|
||||||
#define REO_QDESC_HISTORY_SIZE 512
|
#define REO_QDESC_HISTORY_SIZE 512
|
||||||
@@ -47,6 +50,140 @@ uint64_t reo_qdesc_history_idx;
|
|||||||
struct reo_qdesc_event reo_qdesc_history[REO_QDESC_HISTORY_SIZE];
|
struct reo_qdesc_event reo_qdesc_history[REO_QDESC_HISTORY_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BYPASS_OL_OPS
|
||||||
|
/*
|
||||||
|
* dp_add_wds_entry_wrapper() - Add new AST entry for the wds station
|
||||||
|
* @soc: DP soc structure pointer
|
||||||
|
* @peer: dp peer structure
|
||||||
|
* @dest_mac: MAC address of ast node
|
||||||
|
* @flags: wds or hmwds
|
||||||
|
* @type: type from enum cdp_txrx_ast_entry_type
|
||||||
|
*
|
||||||
|
* This API is used by WDS source port learning function to
|
||||||
|
* add a new AST entry in the fw.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, error code otherwise.
|
||||||
|
*/
|
||||||
|
static int dp_add_wds_entry_wrapper(struct dp_soc *soc,
|
||||||
|
struct dp_peer *peer,
|
||||||
|
const uint8_t *dest_macaddr,
|
||||||
|
uint32_t flags,
|
||||||
|
uint8_t type)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = target_if_add_wds_entry(soc->ctrl_psoc,
|
||||||
|
peer->vdev->vdev_id,
|
||||||
|
peer->mac_addr.raw,
|
||||||
|
dest_macaddr,
|
||||||
|
WMI_HOST_WDS_FLAG_STATIC,
|
||||||
|
type);
|
||||||
|
|
||||||
|
return qdf_status_to_os_return(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dp_update_wds_entry_wrapper() - update an existing wds entry with new peer
|
||||||
|
* @soc: DP soc structure pointer
|
||||||
|
* @peer: dp peer structure
|
||||||
|
* @dest_macaddr: MAC address of ast node
|
||||||
|
* @flags: wds or hmwds
|
||||||
|
*
|
||||||
|
* This API is used by update the peer mac address for the ast
|
||||||
|
* in the fw.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, error code otherwise.
|
||||||
|
*/
|
||||||
|
static int dp_update_wds_entry_wrapper(struct dp_soc *soc,
|
||||||
|
struct dp_peer *peer,
|
||||||
|
uint8_t *dest_macaddr,
|
||||||
|
uint32_t flags)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = target_if_update_wds_entry(soc->ctrl_psoc,
|
||||||
|
peer->vdev->vdev_id,
|
||||||
|
dest_macaddr,
|
||||||
|
peer->mac_addr.raw,
|
||||||
|
WMI_HOST_WDS_FLAG_STATIC);
|
||||||
|
|
||||||
|
return qdf_status_to_os_return(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dp_del_wds_entry_wrapper() - delete a WSD 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
|
||||||
|
*/
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
target_if_del_wds_entry(soc->ctrl_psoc, vdev_id,
|
||||||
|
wds_macaddr, type, delete_in_fw);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static int dp_add_wds_entry_wrapper(struct dp_soc *soc,
|
||||||
|
struct dp_peer *peer,
|
||||||
|
const uint8_t *dest_macaddr,
|
||||||
|
uint32_t flags,
|
||||||
|
uint8_t type)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = soc->cdp_soc.ol_ops->peer_add_wds_entry(
|
||||||
|
soc->ctrl_psoc,
|
||||||
|
peer->vdev->vdev_id,
|
||||||
|
peer->mac_addr.raw,
|
||||||
|
peer->peer_id,
|
||||||
|
dest_macaddr,
|
||||||
|
peer->mac_addr.raw,
|
||||||
|
flags,
|
||||||
|
type);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dp_update_wds_entry_wrapper(struct dp_soc *soc,
|
||||||
|
struct dp_peer *peer,
|
||||||
|
uint8_t *dest_macaddr,
|
||||||
|
uint32_t flags)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = soc->cdp_soc.ol_ops->peer_update_wds_entry(
|
||||||
|
soc->ctrl_psoc,
|
||||||
|
peer->vdev->vdev_id,
|
||||||
|
dest_macaddr,
|
||||||
|
peer->mac_addr.raw,
|
||||||
|
flags);
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
soc->cdp_soc.ol_ops->peer_del_wds_entry(soc->ctrl_psoc,
|
||||||
|
vdev_id,
|
||||||
|
wds_macaddr,
|
||||||
|
type,
|
||||||
|
delete_in_fw);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FEATURE_WDS
|
#ifdef FEATURE_WDS
|
||||||
static inline bool
|
static inline bool
|
||||||
dp_peer_ast_free_in_unmap_supported(struct dp_soc *soc,
|
dp_peer_ast_free_in_unmap_supported(struct dp_soc *soc,
|
||||||
@@ -1460,11 +1597,11 @@ QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
|
|||||||
struct dp_ast_entry *ast_entry = NULL;
|
struct dp_ast_entry *ast_entry = NULL;
|
||||||
struct dp_vdev *vdev = NULL;
|
struct dp_vdev *vdev = NULL;
|
||||||
struct dp_pdev *pdev = NULL;
|
struct dp_pdev *pdev = NULL;
|
||||||
uint8_t next_node_mac[6];
|
|
||||||
txrx_ast_free_cb cb = NULL;
|
txrx_ast_free_cb cb = NULL;
|
||||||
void *cookie = NULL;
|
void *cookie = NULL;
|
||||||
struct dp_peer *vap_bss_peer = NULL;
|
struct dp_peer *vap_bss_peer = NULL;
|
||||||
bool is_peer_found = false;
|
bool is_peer_found = false;
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
if (soc->ast_offload_support)
|
if (soc->ast_offload_support)
|
||||||
return QDF_STATUS_E_INVAL;
|
return QDF_STATUS_E_INVAL;
|
||||||
@@ -1671,36 +1808,21 @@ add_ast_entry:
|
|||||||
soc->num_ast_entries++;
|
soc->num_ast_entries++;
|
||||||
dp_peer_ast_hash_add(soc, ast_entry);
|
dp_peer_ast_hash_add(soc, ast_entry);
|
||||||
|
|
||||||
qdf_copy_macaddr((struct qdf_mac_addr *)next_node_mac,
|
|
||||||
(struct qdf_mac_addr *)peer->mac_addr.raw);
|
|
||||||
|
|
||||||
if ((ast_entry->type != CDP_TXRX_AST_TYPE_STATIC) &&
|
if ((ast_entry->type != CDP_TXRX_AST_TYPE_STATIC) &&
|
||||||
(ast_entry->type != CDP_TXRX_AST_TYPE_SELF) &&
|
(ast_entry->type != CDP_TXRX_AST_TYPE_SELF) &&
|
||||||
(ast_entry->type != CDP_TXRX_AST_TYPE_STA_BSS) &&
|
(ast_entry->type != CDP_TXRX_AST_TYPE_STA_BSS) &&
|
||||||
(ast_entry->type != CDP_TXRX_AST_TYPE_WDS_HM_SEC)) {
|
(ast_entry->type != CDP_TXRX_AST_TYPE_WDS_HM_SEC))
|
||||||
if (QDF_STATUS_SUCCESS ==
|
status = dp_add_wds_entry_wrapper(soc,
|
||||||
soc->cdp_soc.ol_ops->peer_add_wds_entry(
|
peer,
|
||||||
soc->ctrl_psoc,
|
mac_addr,
|
||||||
peer->vdev->vdev_id,
|
flags,
|
||||||
peer->mac_addr.raw,
|
ast_entry->type);
|
||||||
peer->peer_id,
|
|
||||||
mac_addr,
|
|
||||||
next_node_mac,
|
|
||||||
flags,
|
|
||||||
ast_entry->type)) {
|
|
||||||
if (vap_bss_peer)
|
|
||||||
dp_peer_unref_delete(vap_bss_peer,
|
|
||||||
DP_MOD_ID_AST);
|
|
||||||
qdf_spin_unlock_bh(&soc->ast_lock);
|
|
||||||
return QDF_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vap_bss_peer)
|
if (vap_bss_peer)
|
||||||
dp_peer_unref_delete(vap_bss_peer, DP_MOD_ID_AST);
|
dp_peer_unref_delete(vap_bss_peer, DP_MOD_ID_AST);
|
||||||
|
|
||||||
qdf_spin_unlock_bh(&soc->ast_lock);
|
qdf_spin_unlock_bh(&soc->ast_lock);
|
||||||
return QDF_STATUS_E_FAILURE;
|
return qdf_status_from_os_return(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_export_symbol(dp_peer_add_ast);
|
qdf_export_symbol(dp_peer_add_ast);
|
||||||
@@ -1931,12 +2053,10 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
|
|||||||
ast_entry->is_active = TRUE;
|
ast_entry->is_active = TRUE;
|
||||||
TAILQ_INSERT_TAIL(&peer->ast_entry_list, ast_entry, ase_list_elem);
|
TAILQ_INSERT_TAIL(&peer->ast_entry_list, ast_entry, ase_list_elem);
|
||||||
|
|
||||||
ret = soc->cdp_soc.ol_ops->peer_update_wds_entry(
|
ret = dp_update_wds_entry_wrapper(soc,
|
||||||
soc->ctrl_psoc,
|
peer,
|
||||||
peer->vdev->vdev_id,
|
ast_entry->mac_addr.raw,
|
||||||
ast_entry->mac_addr.raw,
|
flags);
|
||||||
peer->mac_addr.raw,
|
|
||||||
flags);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -2070,7 +2190,6 @@ void dp_peer_ast_send_wds_del(struct dp_soc *soc,
|
|||||||
struct dp_ast_entry *ast_entry,
|
struct dp_ast_entry *ast_entry,
|
||||||
struct dp_peer *peer)
|
struct dp_peer *peer)
|
||||||
{
|
{
|
||||||
struct cdp_soc_t *cdp_soc = &soc->cdp_soc;
|
|
||||||
bool delete_in_fw = false;
|
bool delete_in_fw = false;
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_TRACE,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_TRACE,
|
||||||
@@ -2093,13 +2212,12 @@ void dp_peer_ast_send_wds_del(struct dp_soc *soc,
|
|||||||
else
|
else
|
||||||
delete_in_fw = true;
|
delete_in_fw = true;
|
||||||
|
|
||||||
cdp_soc->ol_ops->peer_del_wds_entry(soc->ctrl_psoc,
|
dp_del_wds_entry_wrapper(soc,
|
||||||
ast_entry->vdev_id,
|
ast_entry->vdev_id,
|
||||||
ast_entry->mac_addr.raw,
|
ast_entry->mac_addr.raw,
|
||||||
ast_entry->type,
|
ast_entry->type,
|
||||||
delete_in_fw);
|
delete_in_fw);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_MULTI_AST_DEL
|
#ifdef WLAN_FEATURE_MULTI_AST_DEL
|
||||||
|
@@ -182,8 +182,7 @@ target_if_update_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
|
|||||||
#else
|
#else
|
||||||
static inline QDF_STATUS
|
static inline QDF_STATUS
|
||||||
target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
|
target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
|
||||||
uint8_t *peer_mac, uint16_t peer_id,
|
uint8_t *peer_mac, const uint8_t *dest_mac,
|
||||||
const uint8_t *dest_mac, uint8_t *next_node_mac,
|
|
||||||
uint32_t flags, uint8_t type)
|
uint32_t flags, uint8_t type)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
Reference in New Issue
Block a user