From d203e2d6abcf91b7f0c3ab857e1d771ca18972e6 Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Tue, 18 Sep 2018 14:23:17 +0530 Subject: [PATCH 1/2] qcacmn: changes in add ast to support HKv2 Changes to find the AST entry based on pdev_id as AST entry per pdev can exist in HKv2 Change-Id: I27e66f4671fe2c5eca4c496d6220e94f087f2c18 CRs-fixed: 2317790 --- dp/wifi3.0/dp_peer.c | 101 +++++++++++++++++++++++++++++++++---------- dp/wifi3.0/dp_peer.h | 4 ++ 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 6c5c6f75e2..6f61366ad4 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -338,6 +338,41 @@ static inline void dp_peer_ast_hash_remove(struct dp_soc *soc, TAILQ_REMOVE(&soc->ast_hash.bins[index], ase, hash_list_elem); } +/* + * dp_peer_ast_hash_find_by_pdevid() - Find AST entry by MAC address + * and pdev id + * @soc: SoC handle + * @ast_mac_addr: mac address + * @pdev_id: pdev_id + * + * It assumes caller has taken the ast lock to protect the access to + * AST hash table + * + * Return: AST entry + */ +struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, + uint8_t *ast_mac_addr, + uint8_t pdev_id) +{ + union dp_align_mac_addr local_mac_addr_aligned, *mac_addr; + uint32_t index; + struct dp_ast_entry *ase; + + qdf_mem_copy(&local_mac_addr_aligned.raw[0], + ast_mac_addr, DP_MAC_ADDR_LEN); + mac_addr = &local_mac_addr_aligned; + + index = dp_peer_ast_hash_index(soc, mac_addr); + TAILQ_FOREACH(ase, &soc->ast_hash.bins[index], hash_list_elem) { + if ((pdev_id == ase->pdev_id) && + !dp_peer_find_mac_addr_cmp(mac_addr, &ase->mac_addr)) { + return ase; + } + } + + return NULL; +} + /* * dp_peer_ast_hash_find() - Find AST entry by MAC address * @soc: SoC handle @@ -447,6 +482,7 @@ int dp_peer_add_ast(struct dp_soc *soc, { struct dp_ast_entry *ast_entry; struct dp_vdev *vdev = peer->vdev; + struct dp_pdev *pdev = NULL; uint8_t next_node_mac[6]; int ret = -1; @@ -457,6 +493,8 @@ int dp_peer_add_ast(struct dp_soc *soc, return ret; } + pdev = vdev->pdev; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: peer %pK mac %02x:%02x:%02x:%02x:%02x:%02x", __func__, peer, mac_addr[0], mac_addr[1], mac_addr[2], @@ -464,35 +502,50 @@ int dp_peer_add_ast(struct dp_soc *soc, qdf_spin_lock_bh(&soc->ast_lock); - /* If AST entry already exists , just return from here */ - ast_entry = dp_peer_ast_hash_find(soc, mac_addr); - - if (ast_entry) { - if (ast_entry->type == CDP_TXRX_AST_TYPE_MEC) { - ast_entry->is_active = TRUE; + /* If AST entry already exists , just return from here + * ast entry with same mac address can exist on different radios + * if ast_override support is enabled use search by pdev in this + * case + */ + if (soc->ast_override_support) { + ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, mac_addr, + pdev->pdev_id); + if (ast_entry) { qdf_spin_unlock_bh(&soc->ast_lock); return 0; } + } else { + ast_entry = dp_peer_ast_hash_find(soc, mac_addr); - /* - * WAR for HK 1.x AST issue - * If an AST entry with same mac address already exists and is - * mapped to a different radio, and if the current radio is - * primary radio , delete the existing AST entry and return. - * - * New AST entry will be created again on next SA_invalid - * frame - */ - if ((ast_entry->pdev_id != vdev->pdev->pdev_id) && - vdev->pdev->is_primary) { - qdf_print("Deleting ast_pdev=%d pdev=%d addr=%pM\n", - ast_entry->pdev_id, - vdev->pdev->pdev_id, mac_addr); - dp_peer_del_ast(soc, ast_entry); + if (ast_entry) { + if (ast_entry->type == CDP_TXRX_AST_TYPE_MEC) { + ast_entry->is_active = TRUE; + qdf_spin_unlock_bh(&soc->ast_lock); + return 0; + } + + /* + * WAR for HK 1.x AST issue + * If an AST entry with same mac address already + * exists and is mapped to a different radio, and + * if the current radio is primary radio , delete + * the existing AST entry and return. + * + * New AST entry will be created again on next + * SA_invalid frame + */ + if ((ast_entry->pdev_id != vdev->pdev->pdev_id) && + vdev->pdev->is_primary) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "Deleting ast_pdev=%d pdev=%d addr=%pM\n", + ast_entry->pdev_id, + vdev->pdev->pdev_id, mac_addr); + dp_peer_del_ast(soc, ast_entry); + } + + qdf_spin_unlock_bh(&soc->ast_lock); + return 0; } - - qdf_spin_unlock_bh(&soc->ast_lock); - return 0; } ast_entry = (struct dp_ast_entry *) diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index c7827f0b81..16ea4c62c1 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -93,6 +93,10 @@ void dp_peer_ast_unmap_handler(struct dp_soc *soc, int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer, struct dp_ast_entry *ast_entry, uint32_t flags); +struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, + uint8_t *ast_mac_addr, + uint8_t pdev_id); + struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc, uint8_t *ast_mac_addr); From 97d6a98c03f2d27607e733c2bc1f4eba8eebe758 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Tue, 25 Sep 2018 10:39:52 +0530 Subject: [PATCH 2/2] qcacmn: Fix compilation error in vdev state machine Fix the compilation error in vdev state machine and make state transition logs from debug to info. Change-Id: I7d7975931232f041206bdb64c639456bf9327b3f CRs-Fixed: 2321726 --- .../sm_engine/inc/wlan_sm_engine_dbg.h | 11 ++++++ .../sm_engine/src/wlan_sm_engine.c | 39 ++++++++++--------- umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c | 11 +++++- .../dispatcher/src/wlan_vdev_mlme_api.c | 1 + wmi/inc/wmi_unified_param.h | 2 + 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/umac/cmn_services/sm_engine/inc/wlan_sm_engine_dbg.h b/umac/cmn_services/sm_engine/inc/wlan_sm_engine_dbg.h index 5ecef9252f..1588df1648 100644 --- a/umac/cmn_services/sm_engine/inc/wlan_sm_engine_dbg.h +++ b/umac/cmn_services/sm_engine/inc/wlan_sm_engine_dbg.h @@ -39,6 +39,17 @@ #define sm_engine_debug(params...) \ QDF_TRACE_DEBUG(QDF_MODULE_ID_SM_ENGINE, params) +#define sm_engine_nofl_alert(params...) \ + QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_SM_ENGINE, params) +#define sm_engine_nofl_err(params...) \ + QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_SM_ENGINE, params) +#define sm_engine_nofl_warn(params...) \ + QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_SM_ENGINE, params) +#define sm_engine_nofl_info(params...) \ + QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_SM_ENGINE, params) +#define sm_engine_nofl_debug(params...) \ + QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_SM_ENGINE, params) + #define WLAN_SM_ENGINE_HISTORY_SIZE 50 struct wlan_sm; /** diff --git a/umac/cmn_services/sm_engine/src/wlan_sm_engine.c b/umac/cmn_services/sm_engine/src/wlan_sm_engine.c index e298713892..0894dc6b35 100644 --- a/umac/cmn_services/sm_engine/src/wlan_sm_engine.c +++ b/umac/cmn_services/sm_engine/src/wlan_sm_engine.c @@ -53,25 +53,24 @@ QDF_STATUS wlan_sm_dispatch(struct wlan_sm *sm, uint16_t event, if (event < sm->num_event_names) event_name = sm->event_names[event]; - sm_engine_debug("%s: current state %s event %s[%d]", - sm->name, - sm->state_info[sm->cur_state].name, - event_name ? event_name : "UNKNOWN_EVENT", - event); + sm_engine_nofl_info("%s: current state %s[%d] event %s[%d]", + sm->name, sm->state_info[state].name, state, + event_name ? event_name : "UNKNOWN_EVENT", + event); } else { - sm_engine_debug("%s: current state %s event %d", - sm->name, - sm->state_info[sm->cur_state].name, - event); + sm_engine_nofl_info("%s: current state %s[%d] event %d", + sm->name, + sm->state_info[state].name, state, + event); } if (state != WLAN_SM_ENGINE_STATE_NONE) { event_handled = (*sm->state_info[state].wlan_sm_event) ( sm->ctx, event, event_data_len, event_data); if (!event_handled) { - sm_engine_err("%s: event %d not handled in state %s", - sm->name, event, - sm->state_info[sm->cur_state].name); + sm_engine_nofl_err("%s: event %d not handled in state %s", + sm->name, event, + sm->state_info[sm->cur_state].name); return QDF_STATUS_E_INVAL; } } @@ -146,13 +145,15 @@ void wlan_sm_transition_to(struct wlan_sm *sm, uint8_t state) else new_sub_st = 0; - sm_engine_debug("%s: transition(state) %s => %s", - sm->name, state_info[old_state].name, - state_info[new_state].name); - sm_engine_debug("%s: transition(sub_state) %s => %s", - sm->name, - ol_sub_st ? state_info[ol_sub_st].name : "IDLE", - new_sub_st ? state_info[new_sub_st].name : "IDLE"); + sm_engine_nofl_info("%s: transition(state) %s[%d] => %s[%d]", + sm->name, state_info[old_state].name, old_state, + state_info[new_state].name, new_state); + sm_engine_nofl_info("%s: transition(sub_state) %s[%d] => %s[%d]", + sm->name, + ol_sub_st ? state_info[ol_sub_st].name : "IDLE", + ol_sub_st, + new_sub_st ? state_info[new_sub_st].name : "IDLE", + new_sub_st); /* * call the exit function(s) of the current state hierarchy diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c index 92662d7c09..4049027a73 100644 --- a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c +++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c @@ -1783,8 +1783,11 @@ void mlme_vdev_sm_history_print(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme) { struct wlan_sm *sm; + uint8_t name[WLAN_SM_ENGINE_MAX_NAME]; - sm = wlan_sm_create("VDEV MLME", vdev_mlme, + snprintf(name, sizeof(name), "VDEV%d-MLME", + wlan_vdev_get_id(vdev_mlme->vdev)); + sm = wlan_sm_create(name, vdev_mlme, WLAN_VDEV_S_INIT, sm_info, QDF_ARRAY_SIZE(sm_info), @@ -1806,8 +1809,12 @@ QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme) { struct wlan_sm *sm; + uint8_t name[WLAN_SM_ENGINE_MAX_NAME]; - sm = wlan_sm_create("VDEV MLME", vdev_mlme, 0, NULL, 0, NULL, 0); + snprintf(name, sizeof(name), "VDEV%d-MLME", + wlan_vdev_get_id(vdev_mlme->vdev)); + + sm = wlan_sm_create(name, vdev_mlme, 0, NULL, 0, NULL, 0); if (!sm) { mlme_err("VDEV MLME SM allocation failed"); return QDF_STATUS_E_FAILURE; diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c index ee967b82c0..9c09b1e0ba 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c @@ -25,6 +25,7 @@ #include "include/wlan_vdev_mlme.h" #include "../../core/src/vdev_mlme_sm.h" #include +#include struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev) { diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index fb4c68eddb..bd6c82d096 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -864,7 +864,9 @@ struct hidden_ssid_vdev_restart_params { uint32_t info; uint32_t reg_info_1; uint32_t reg_info_2; +#ifndef CONFIG_VDEV_SM qdf_atomic_t hidden_ssid_restart_in_progress; +#endif }; /**