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:

committed by
Madan Koyyalamudi

parent
591f8bb3a1
commit
6b1d142d98
@@ -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;
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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))
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user