qcacmn: Enable wds changes in Beryllium

wds in Beryllium is managed by hardware.
Make use of hardware managedwds and disable
the corresponding wds handling done in host
for Beryllium.

Change-Id: I39f23cb40c6c5f85ada8ce59c92ff2855bb18da3
This commit is contained in:
Pavankumar Nandeshwar
2021-09-07 23:52:36 -07:00
committed by Madan Koyyalamudi
parent 591f8bb3a1
commit 6b1d142d98
12 changed files with 272 additions and 77 deletions

View File

@@ -2142,21 +2142,21 @@ void cdp_if_mgmt_drain(ol_txrx_soc_handle soc,
* @soc: opaque soc handle
* @max_peers: number of peers created in FW
* @max_ast_index: max number of AST index supported in FW
* @peer_map_unmap_v2: flag indicates HTT peer map v2 is enabled in FW
* @peer_map_unmap_v: Indicates HTT peer map/unmap versions enabled in FW
*
*
* Return: QDF_STATUS
*/
static inline QDF_STATUS
cdp_peer_map_attach(ol_txrx_soc_handle soc, uint32_t max_peers,
uint32_t max_ast_index, bool peer_map_unmap_v2)
uint32_t max_ast_index, uint8_t peer_map_unmap_v)
{
if (soc && soc->ops && soc->ops->cmn_drv_ops &&
soc->ops->cmn_drv_ops->txrx_peer_map_attach)
return soc->ops->cmn_drv_ops->txrx_peer_map_attach(soc,
max_peers,
max_ast_index,
peer_map_unmap_v2);
peer_map_unmap_v);
return QDF_STATUS_SUCCESS;
}

View File

@@ -513,7 +513,7 @@ struct cdp_cmn_ops {
QDF_STATUS (*txrx_peer_map_attach)(ol_txrx_soc_handle soc,
uint32_t num_peers,
uint32_t max_ast_index,
bool peer_map_unmap_v2);
uint8_t peer_map_unmap_v);
QDF_STATUS (*set_soc_param)(ol_txrx_soc_handle soc,
enum cdp_soc_param_t param,

View File

@@ -39,6 +39,35 @@
#include "dp_hist.h"
#include "dp_rx_buffer_pool.h"
#ifndef AST_OFFLOAD_ENABLE
static void
dp_rx_wds_learn(struct dp_soc *soc,
struct dp_vdev *vdev,
uint8_t *rx_tlv_hdr,
struct dp_peer *peer,
qdf_nbuf_t nbuf,
struct hal_rx_msdu_metadata msdu_metadata)
{
/* WDS Source Port Learning */
if (qdf_likely(vdev->wds_enabled))
dp_rx_wds_srcport_learn(soc,
rx_tlv_hdr,
peer,
nbuf,
msdu_metadata);
}
#else
static void
dp_rx_wds_learn(struct dp_soc *soc,
struct dp_vdev *vdev,
uint8_t *rx_tlv_hdr,
struct dp_peer *ta_peer,
qdf_nbuf_t nbuf,
struct hal_rx_msdu_metadata msdu_metadata)
{
}
#endif
/**
* dp_rx_process_be() - Brain of the Rx processing functionality
* Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
@@ -676,16 +705,11 @@ done:
if (qdf_likely(vdev->rx_decap_type ==
htt_cmn_pkt_type_ethernet) &&
qdf_likely(!vdev->mesh_vdev)) {
/* WDS Destination Address Learning */
dp_rx_da_learn(soc, rx_tlv_hdr, peer, nbuf);
/* WDS Source Port Learning */
if (qdf_likely(vdev->wds_enabled))
dp_rx_wds_srcport_learn(soc,
rx_tlv_hdr,
peer,
nbuf,
msdu_metadata);
dp_rx_wds_learn(soc, vdev,
rx_tlv_hdr,
peer,
nbuf,
msdu_metadata);
/* Intrabss-fwd */
if (dp_rx_check_ap_bridge(vdev))

View File

@@ -285,7 +285,8 @@ void dp_tx_get_vdev_bank_config(struct dp_vdev_be *be_vdev,
bank_config->src_buffer_swap = 0;
bank_config->link_meta_swap = 0;
if (soc->is_peer_map_unmap_v2 && vdev->opmode == wlan_op_mode_sta) {
if ((soc->sta_mode_search_policy == HAL_TX_ADDR_INDEX_SEARCH) &&
vdev->opmode == wlan_op_mode_sta) {
bank_config->index_lookup_enable = 1;
bank_config->mcast_pkt_ctrl = HAL_TX_MCAST_CTRL_MEC_NOTIFY;
bank_config->addrx_en = 0;

View File

@@ -2726,10 +2726,11 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
* Update ast indexes for flow override support
* Applicable only for non wds peers
*/
dp_peer_ast_index_flow_queue_map_create(
soc->dp_soc, is_wds,
peer_id, peer_mac_addr,
&ast_flow_info);
if (!soc->dp_soc->ast_offload_support)
dp_peer_ast_index_flow_queue_map_create(
soc->dp_soc, is_wds,
peer_id, peer_mac_addr,
&ast_flow_info);
break;
}

View File

@@ -656,9 +656,14 @@ static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl,
int status = -1;
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
struct dp_ast_entry *ast_entry = NULL;
struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc_hdl,
peer_mac, 0, vdev_id,
DP_MOD_ID_CDP);
struct dp_peer *peer;
if (soc->ast_offload_support)
return status;
peer = dp_peer_find_hash_find((struct dp_soc *)soc_hdl,
peer_mac, 0, vdev_id,
DP_MOD_ID_CDP);
if (!peer) {
dp_peer_debug("Peer is NULL!");
@@ -719,8 +724,12 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
struct dp_ast_entry *ast_entry = NULL;
struct dp_peer *peer;
struct dp_pdev *pdev;
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
DP_MOD_ID_CDP);
struct dp_vdev *vdev;
if (soc->ast_offload_support)
return QDF_STATUS_E_FAILURE;
vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
if (!vdev)
return QDF_STATUS_E_FAILURE;
@@ -770,6 +779,9 @@ dp_wds_reset_ast_table_wifi3(struct cdp_soc_t *soc_hdl,
{
struct dp_soc *soc = (struct dp_soc *) soc_hdl;
if (soc->ast_offload_support)
return QDF_STATUS_SUCCESS;
qdf_spin_lock_bh(&soc->ast_lock);
dp_soc_iterate_peer(soc, dp_peer_reset_ast_entries, NULL,
@@ -846,6 +858,9 @@ static bool dp_peer_get_ast_info_by_soc_wifi3
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
struct dp_peer *peer = NULL;
if (soc->ast_offload_support)
return false;
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_soc(soc, ast_mac_addr);
@@ -897,6 +912,9 @@ static bool dp_peer_get_ast_info_by_pdevid_wifi3
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
struct dp_peer *peer = NULL;
if (soc->ast_offload_support)
return false;
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, ast_mac_addr,
@@ -951,6 +969,9 @@ static QDF_STATUS dp_peer_ast_entry_del_by_soc(struct cdp_soc_t *soc_handle,
txrx_ast_free_cb cb = NULL;
void *arg = NULL;
if (soc->ast_offload_support)
return -QDF_STATUS_E_INVAL;
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_soc(soc, mac_addr);
if (!ast_entry) {
@@ -1011,6 +1032,9 @@ static QDF_STATUS dp_peer_ast_entry_del_by_pdev(struct cdp_soc_t *soc_handle,
txrx_ast_free_cb cb = NULL;
void *arg = NULL;
if (soc->ast_offload_support)
return -QDF_STATUS_E_INVAL;
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, mac_addr, pdev_id);
@@ -5251,6 +5275,8 @@ static void dp_soc_deinit(void *txrx_soc)
/* free peer tables & AST tables allocated during peer_map_attach */
if (soc->peer_map_attach_success) {
if (soc->arch_ops.txrx_peer_detach)
soc->arch_ops.txrx_peer_detach(soc);
dp_peer_find_detach(soc);
soc->peer_map_attach_success = FALSE;
}
@@ -6240,6 +6266,9 @@ static inline void dp_peer_ast_handle_roam_del(struct dp_soc *soc,
{
struct dp_ast_entry *ast_entry;
if (soc->ast_offload_support)
return;
qdf_spin_lock_bh(&soc->ast_lock);
if (soc->ast_override_support)
ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, peer_mac_addr,
@@ -6701,6 +6730,9 @@ static QDF_STATUS dp_cp_peer_del_resp_handler(struct cdp_soc_t *soc_hdl,
txrx_ast_free_cb cb = NULL;
void *cookie;
if (soc->ast_offload_support)
return QDF_STATUS_E_INVAL;
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry =
@@ -10263,7 +10295,7 @@ dp_dump_rx_flow_tag_stats(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t *soc_hdl,
uint32_t max_peers,
uint32_t max_ast_index,
bool peer_map_unmap_v2)
uint8_t peer_map_unmap_versions)
{
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
@@ -10276,7 +10308,15 @@ static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t *soc_hdl,
if (dp_peer_find_attach(soc))
return QDF_STATUS_E_FAILURE;
soc->is_peer_map_unmap_v2 = peer_map_unmap_v2;
if (soc->arch_ops.txrx_peer_attach) {
QDF_STATUS status;
status = soc->arch_ops.txrx_peer_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_peer_find_detach(soc);
return QDF_STATUS_E_FAILURE;
}
}
soc->peer_map_unmap_versions = peer_map_unmap_versions;
soc->peer_map_attach_success = TRUE;
return QDF_STATUS_SUCCESS;
@@ -11862,6 +11902,7 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle,
soc->cce_disable = false;
soc->max_ast_ageout_count = MAX_AST_AGEOUT_COUNT;
soc->sta_mode_search_policy = DP_TX_ADDR_SEARCH_ADDR_POLICY;
qdf_mem_zero(&soc->vdev_id_map, sizeof(soc->vdev_id_map));
qdf_spinlock_create(&soc->vdev_map_lock);
qdf_atomic_init(&soc->num_tx_outstanding);
@@ -13082,6 +13123,7 @@ static void dp_soc_cfg_init(struct dp_soc *soc)
soc->per_tid_basize_max_tid = 8;
soc->wbm_release_desc_rx_sg_support = 1;
soc->rxdma2sw_rings_not_supported = 1;
soc->ast_offload_support = AST_OFFLOAD_ENABLE_STATUS;
break;
default:

View File

@@ -73,11 +73,11 @@ dp_peer_ast_free_in_unmap_supported(struct dp_soc *soc,
return false;
}
static void dp_soc_wds_attach(struct dp_soc *soc)
void dp_soc_wds_attach(struct dp_soc *soc)
{
}
static void dp_soc_wds_detach(struct dp_soc *soc)
void dp_soc_wds_detach(struct dp_soc *soc)
{
}
#endif
@@ -175,7 +175,7 @@ static inline int dp_peer_find_mac_addr_cmp(
& (mac_addr1->align4.bytes_ef == mac_addr2->align4.bytes_ef));
}
static QDF_STATUS dp_peer_ast_table_attach(struct dp_soc *soc)
QDF_STATUS dp_peer_ast_table_attach(struct dp_soc *soc)
{
uint32_t max_ast_index;
@@ -504,7 +504,7 @@ static bool dp_peer_exist_on_pdev(struct dp_soc *soc,
*
* Return: QDF_STATUS
*/
static QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc)
QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc)
{
int log2, hash_elems, i;
@@ -684,7 +684,7 @@ void dp_peer_mec_free_list(struct dp_soc *soc, void *ptr)
*
* Return: None
*/
static void dp_peer_mec_hash_detach(struct dp_soc *soc)
void dp_peer_mec_hash_detach(struct dp_soc *soc)
{
dp_peer_mec_flush_entries(soc);
qdf_mem_free(soc->mec_hash.bins);
@@ -701,12 +701,12 @@ void dp_peer_mec_spinlock_create(struct dp_soc *soc)
qdf_spinlock_create(&soc->mec_lock);
}
#else
static QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc)
QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static void dp_peer_mec_hash_detach(struct dp_soc *soc)
void dp_peer_mec_hash_detach(struct dp_soc *soc)
{
}
#endif
@@ -718,7 +718,7 @@ static void dp_peer_mec_hash_detach(struct dp_soc *soc)
*
* Return: QDF_STATUS
*/
static QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc)
QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc)
{
int i, hash_elems, log2;
unsigned int max_ast_idx = wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx);
@@ -782,7 +782,7 @@ static inline void dp_peer_ast_cleanup(struct dp_soc *soc,
*
* Return: None
*/
static void dp_peer_ast_hash_detach(struct dp_soc *soc)
void dp_peer_ast_hash_detach(struct dp_soc *soc)
{
unsigned int index;
struct dp_ast_entry *ast, *ast_next;
@@ -868,6 +868,9 @@ void dp_peer_ast_hash_remove(struct dp_soc *soc,
struct dp_ast_entry *tmpase;
int found = 0;
if (soc->ast_offload_support)
return;
index = dp_peer_ast_hash_index(soc, &ase->mac_addr);
/* Check if tail is not empty before delete*/
QDF_ASSERT(!TAILQ_EMPTY(&soc->ast_hash.bins[index]));
@@ -1008,6 +1011,9 @@ static inline QDF_STATUS dp_peer_map_ast(struct dp_soc *soc,
txrx_ast_free_cb cb = NULL;
QDF_STATUS err = QDF_STATUS_SUCCESS;
if (soc->ast_offload_support)
return QDF_STATUS_SUCCESS;
if (!peer) {
return QDF_STATUS_E_INVAL;
}
@@ -1164,6 +1170,9 @@ QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
struct dp_peer *vap_bss_peer = NULL;
bool is_peer_found = false;
if (soc->ast_offload_support)
return QDF_STATUS_E_INVAL;
vdev = peer->vdev;
if (!vdev) {
dp_peer_err("%pK: Peers vdev is NULL", soc);
@@ -1493,6 +1502,9 @@ 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;
@@ -1573,6 +1585,9 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
int ret = -1;
struct dp_peer *old_peer;
if (soc->ast_offload_support)
return QDF_STATUS_E_INVAL;
dp_peer_debug("%pK: ast_entry->type: %d pdevid: %u vdevid: %u flags: 0x%x mac_addr: " QDF_MAC_ADDR_FMT " peer_mac: " QDF_MAC_ADDR_FMT "\n",
soc, ast_entry->type, peer->vdev->pdev->pdev_id,
peer->vdev->vdev_id, flags,
@@ -1709,7 +1724,7 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
return NULL;
}
static QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc)
QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
@@ -1725,7 +1740,7 @@ static inline QDF_STATUS dp_peer_map_ast(struct dp_soc *soc,
return QDF_STATUS_SUCCESS;
}
static void dp_peer_ast_hash_detach(struct dp_soc *soc)
void dp_peer_ast_hash_detach(struct dp_soc *soc)
{
}
@@ -1858,6 +1873,9 @@ dp_peer_clean_wds_entries(struct dp_soc *soc, struct dp_peer *peer,
{
uint32_t wds_deleted = 0;
if (soc->ast_offload_support)
return;
wds_deleted = dp_peer_ast_free_wds_entries(soc, peer);
if ((DP_PEER_WDS_COUNT_INVALID != free_wds_count) &&
(free_wds_count != wds_deleted)) {
@@ -2073,7 +2091,7 @@ void dp_peer_find_hash_erase(struct dp_soc *soc)
}
}
static void dp_peer_ast_table_detach(struct dp_soc *soc)
void dp_peer_ast_table_detach(struct dp_soc *soc)
{
if (soc->ast_table) {
qdf_mem_free(soc->ast_table);
@@ -2087,7 +2105,7 @@ static void dp_peer_ast_table_detach(struct dp_soc *soc)
*
* return: none
*/
static void dp_peer_find_map_detach(struct dp_soc *soc)
void dp_peer_find_map_detach(struct dp_soc *soc)
{
if (soc->peer_id_to_obj_map) {
qdf_mem_free(soc->peer_id_to_obj_map);
@@ -2096,6 +2114,7 @@ static void dp_peer_find_map_detach(struct dp_soc *soc)
}
}
#ifndef AST_OFFLOAD_ENABLE
QDF_STATUS dp_peer_find_attach(struct dp_soc *soc)
{
QDF_STATUS status;
@@ -2132,6 +2151,26 @@ map_detach:
return status;
}
#else
QDF_STATUS dp_peer_find_attach(struct dp_soc *soc)
{
QDF_STATUS status;
status = dp_peer_find_map_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status))
return status;
status = dp_peer_find_hash_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status))
goto map_detach;
return status;
map_detach:
dp_peer_find_map_detach(soc);
return status;
}
#endif
void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
union hal_reo_status *reo_status)
@@ -2321,13 +2360,16 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
* obj map
*/
if (is_wds) {
peer = dp_peer_get_ref_by_id(soc, peer_id,
DP_MOD_ID_HTT);
if (!soc->ast_offload_support) {
peer = dp_peer_get_ref_by_id(soc, peer_id,
DP_MOD_ID_HTT);
err = dp_peer_map_ast(soc, peer, peer_mac_addr, hw_peer_id,
vdev_id, ast_hash, is_wds);
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_HTT);
err = dp_peer_map_ast(soc, peer, peer_mac_addr,
hw_peer_id,
vdev_id, ast_hash, is_wds);
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_HTT);
}
} else {
/*
* It's the responsibility of the CP and FW to ensure
@@ -2335,9 +2377,9 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
* not hit the below condition for directly assocaited
* peers.
*/
if ((hw_peer_id < 0) ||
if ((!soc->ast_offload_support) && ((hw_peer_id < 0) ||
(hw_peer_id >=
wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx))) {
wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)))) {
dp_peer_err("%pK: invalid hw_peer_id: %d", soc, hw_peer_id);
qdf_assert_always(0);
}
@@ -2367,7 +2409,8 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
* parllel with peer map, no lock need before
* referring it
*/
if (!peer->self_ast_entry) {
if (!soc->ast_offload_support &&
!peer->self_ast_entry) {
dp_info("Add self ast from map "QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(peer_mac_addr));
dp_peer_add_ast(soc, peer,
@@ -2401,6 +2444,9 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
struct dp_peer *peer;
struct dp_vdev *vdev = NULL;
if (soc->ast_offload_support && is_wds)
return;
peer = __dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_HTT);
/*
@@ -2414,7 +2460,8 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
return;
}
/* If V2 Peer map messages are enabled AST entry has to be freed here
/* If V2 Peer map messages are enabled AST entry has to be
* freed here
*/
if (is_wds) {
if (!dp_peer_ast_free_entry_by_mac(soc, peer, vdev_id,
@@ -2424,17 +2471,17 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
}
dp_alert("AST entry not found with peer %pK peer_id %u peer_mac "QDF_MAC_ADDR_FMT" mac_addr "QDF_MAC_ADDR_FMT" vdev_id %u next_hop %u",
peer, peer->peer_id,
QDF_MAC_ADDR_REF(peer->mac_addr.raw),
QDF_MAC_ADDR_REF(mac_addr), vdev_id,
is_wds);
peer, peer->peer_id,
QDF_MAC_ADDR_REF(peer->mac_addr.raw),
QDF_MAC_ADDR_REF(mac_addr), vdev_id,
is_wds);
dp_peer_unref_delete(peer, DP_MOD_ID_HTT);
return;
} else {
dp_peer_clean_wds_entries(soc, peer, free_wds_count);
}
dp_peer_clean_wds_entries(soc, peer, free_wds_count);
dp_info("peer_unmap_event (soc:%pK) peer_id %d peer %pK",
soc, peer_id, peer);
@@ -2444,7 +2491,8 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
/*
* Reset ast flow mapping table
*/
dp_peer_reset_flowq_map(peer);
if (!soc->ast_offload_support)
dp_peer_reset_flowq_map(peer);
if (soc->cdp_soc.ol_ops->peer_unmap_event) {
soc->cdp_soc.ol_ops->peer_unmap_event(soc->ctrl_psoc,
@@ -2463,6 +2511,7 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
}
#ifndef AST_OFFLOAD_ENABLE
void
dp_peer_find_detach(struct dp_soc *soc)
{
@@ -2473,6 +2522,14 @@ dp_peer_find_detach(struct dp_soc *soc)
dp_peer_ast_table_detach(soc);
dp_peer_mec_hash_detach(soc);
}
#else
void
dp_peer_find_detach(struct dp_soc *soc)
{
dp_peer_find_map_detach(soc);
dp_peer_find_hash_detach(soc);
}
#endif
static void dp_rx_tid_update_cb(struct dp_soc *soc, void *cb_ctxt,
union hal_reo_status *reo_status)

View File

@@ -835,6 +835,16 @@ struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
struct dp_vdev *vdev,
enum dp_mod_id mod_id);
void dp_peer_ast_table_detach(struct dp_soc *soc);
void dp_peer_find_map_detach(struct dp_soc *soc);
void dp_soc_wds_detach(struct dp_soc *soc);
QDF_STATUS dp_peer_ast_table_attach(struct dp_soc *soc);
QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc);
QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc);
void dp_soc_wds_attach(struct dp_soc *soc);
void dp_peer_mec_hash_detach(struct dp_soc *soc);
void dp_peer_ast_hash_detach(struct dp_soc *soc);
#ifdef FEATURE_AST
/*
* dp_peer_delete_ast_entries(): Delete all AST entries for a peer

View File

@@ -2968,15 +2968,16 @@ void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
struct dp_ast_entry *ast_entry = NULL;
qdf_ether_header_t *eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf);
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_by_pdevid
(soc,
(uint8_t *)(eh->ether_shost),
vdev->pdev->pdev_id);
if (ast_entry)
sa_peer_id = ast_entry->peer_id;
qdf_spin_unlock_bh(&soc->ast_lock);
if (!soc->ast_offload_support) {
qdf_spin_lock_bh(&soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_by_pdevid
(soc,
(uint8_t *)(eh->ether_shost),
vdev->pdev->pdev_id);
if (ast_entry)
sa_peer_id = ast_entry->peer_id;
qdf_spin_unlock_bh(&soc->ast_lock);
}
qdf_spin_lock_bh(&vdev->peer_list_lock);
TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
@@ -2985,11 +2986,15 @@ void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
/* Multicast packets needs to be
* dropped in case of intra bss forwarding
*/
if (sa_peer_id == peer->peer_id) {
dp_tx_debug("multicast packet");
DP_STATS_INC(peer, tx.nawds_mcast_drop, 1);
continue;
if (!soc->ast_offload_support) {
if (sa_peer_id == peer->peer_id) {
dp_tx_debug("multicast packet");
DP_STATS_INC(peer, tx.nawds_mcast_drop,
1);
continue;
}
}
nbuf_clone = qdf_nbuf_clone(nbuf);
if (!nbuf_clone) {
@@ -4895,12 +4900,8 @@ void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
else
vdev->hal_desc_addr_search_flags = HAL_TX_DESC_ADDRX_EN;
/* Set search type only when peer map v2 messaging is enabled
* as we will have the search index (AST hash) only when v2 is
* enabled
*/
if (soc->is_peer_map_unmap_v2 && vdev->opmode == wlan_op_mode_sta)
vdev->search_type = HAL_TX_ADDR_INDEX_SEARCH;
if (vdev->opmode == wlan_op_mode_sta)
vdev->search_type = soc->sta_mode_search_policy;
else
vdev->search_type = HAL_TX_ADDR_SEARCH_DEFAULT;
}

View File

@@ -155,6 +155,9 @@ static void dp_ast_aging_timer_fn(void *soc_hdl)
*/
void dp_soc_wds_attach(struct dp_soc *soc)
{
if (soc->ast_offload_support)
return;
soc->wds_ast_aging_timer_cnt = 0;
soc->pending_ageout = false;
qdf_timer_init(soc->osdev, &soc->ast_aging_timer,

View File

@@ -103,6 +103,12 @@
#define MAX_AST_AGEOUT_COUNT 128
#ifdef TX_ADDR_INDEX_SEARCH
#define DP_TX_ADDR_SEARCH_ADDR_POLICY HAL_TX_ADDR_INDEX_SEARCH
#else
#define DP_TX_ADDR_SEARCH_ADDR_POLICY HAL_TX_ADDR_SEARCH_DEFAULT
#endif
#define WBM_INT_ERROR_ALL 0
#define WBM_INT_ERROR_REO_NULL_BUFFER 1
#define WBM_INT_ERROR_REO_NULL_LINK_DESC 2
@@ -114,6 +120,12 @@
/* Maximum retries for Delba per tid per peer */
#define DP_MAX_DELBA_RETRY 3
#ifdef AST_OFFLOAD_ENABLE
#define AST_OFFLOAD_ENABLE_STATUS 1
#else
#define AST_OFFLOAD_ENABLE_STATUS 0
#endif
#define PCP_TID_MAP_MAX 8
#define MAX_MU_USERS 37
@@ -1578,6 +1590,8 @@ struct dp_arch_ops {
struct dp_vdev *vdev);
QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc,
struct dp_vdev *vdev);
QDF_STATUS (*txrx_peer_attach)(struct dp_soc *soc);
void (*txrx_peer_detach)(struct dp_soc *soc);
QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
void (*soc_cfg_attach)(struct dp_soc *soc);
@@ -1916,9 +1930,11 @@ struct dp_soc {
/*Timer counter for WDS AST entry ageout*/
uint8_t wds_ast_aging_timer_cnt;
bool pending_ageout;
bool ast_offload_support;
uint32_t max_ast_ageout_count;
uint8_t eapol_over_control_port;
uint8_t sta_mode_search_policy;
qdf_timer_t lmac_reap_timer;
uint8_t lmac_timer_init;
qdf_timer_t int_timer;
@@ -1971,8 +1987,8 @@ struct dp_soc {
bool is_last_stats_ctx_init;
#endif /* WLAN_FEATURE_STATS_EXT */
/* Flag to indicate if HTT v2 is enabled*/
bool is_peer_map_unmap_v2;
/* Indicates HTT map/unmap versions*/
uint8_t peer_map_unmap_versions;
/* Per peer per Tid ba window size support */
uint8_t per_tid_basize_max_tid;
/* Soc level flag to enable da_war */

View File

@@ -22,6 +22,7 @@
#include "dp_li.h"
#include "dp_li_tx.h"
#include "dp_li_rx.h"
#include "dp_peer.h"
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
@@ -99,6 +100,41 @@ static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev)
return QDF_STATUS_SUCCESS;
}
#ifdef AST_OFFLOAD_ENABLE
static void dp_peer_detach_li(struct dp_soc *soc)
{
dp_soc_wds_detach(soc);
dp_peer_ast_hash_detach(soc);
dp_peer_mec_hash_detach(soc);
}
static QDF_STATUS dp_peer_attach_li(struct dp_soc *soc)
{
QDF_STATUS status;
status = dp_peer_ast_table_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status))
goto hash_detach;
status = dp_peer_ast_hash_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status))
goto ast_table_detach;
status = dp_peer_mec_hash_attach(soc);
if (QDF_IS_STATUS_SUCCESS(status)) {
dp_soc_wds_attach(soc);
return status;
}
hash_detach:
dp_peer_ast_hash_detach(soc);
ast_table_detach:
dp_peer_ast_table_detach(soc);
return status;
}
#endif
qdf_size_t dp_get_soc_context_size_li(void)
{
return sizeof(struct dp_soc);
@@ -327,6 +363,10 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
arch_ops->txrx_pdev_detach = dp_pdev_detach_li;
arch_ops->txrx_vdev_attach = dp_vdev_attach_li;
arch_ops->txrx_vdev_detach = dp_vdev_detach_li;
#ifdef AST_OFFLOAD_ENABLE
arch_ops->txrx_peer_attach = dp_peer_attach_li;
arch_ops->txrx_peer_detach = dp_peer_detach_li;
#endif
arch_ops->dp_rx_desc_cookie_2_va =
dp_rx_desc_cookie_2_va_li;
arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li;