qcacmn: Update address search flags for TDLS

Add support to set address search flags in WLAN Tx Descriptor
for TDLS operation

Change-Id: Iafb15fb1efd84a4bef436062368401a5496e4468
CRs-Fixed: 2041759
This commit is contained in:
Kabilan Kannan 2017-04-26 13:26:47 -07:00 • committed by snandini
commit 56bfd8fdb3
9 changed files with 54 additions and 2 deletions

View file

@ -440,13 +440,16 @@ struct cdp_soc_t {
* to set values in vdev
* @CDP_ENABLE_NAWDS: set nawds enable/disable
* @CDP_ENABLE_MCAST_EN: enable/disable multicast enhancement
*
* @CDP_ENABLE_WDS: wds sta
* @CDP_ENABLE_PROXYSTA: proxy sta
* @CDP_UPDATE_TDLS_FLAGS: tdls link flags
*/
enum cdp_vdev_param_type {
CDP_ENABLE_NAWDS,
CDP_ENABLE_MCAST_EN,
CDP_ENABLE_WDS,
CDP_ENABLE_PROXYSTA,
CDP_UPDATE_TDLS_FLAGS,
};
#define TXRX_FW_STATS_TXSTATS 1

View file

@ -3212,6 +3212,8 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle,
case CDP_ENABLE_PROXYSTA:
vdev->proxysta_vdev = val;
break;
case CDP_UPDATE_TDLS_FLAGS:
vdev->tdls_link_connected = val;
default:
break;
}

View file

@ -1995,13 +1995,20 @@ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
{
/*
* Enable both AddrY (SA based search) and AddrX (Da based search)
* for TDLS link
*
* Enable AddrY (SA based search) only for non-WDS STA and
* ProxySTA VAP modes.
*
* In all other VAP modes, only DA based search should be
* enabled
*/
if ((vdev->opmode == wlan_op_mode_sta &&
if (vdev->opmode == wlan_op_mode_sta &&
vdev->tdls_link_connected)
vdev->hal_desc_addr_search_flags =
(HAL_TX_DESC_ADDRX_EN | HAL_TX_DESC_ADDRY_EN);
else if ((vdev->opmode == wlan_op_mode_sta &&
(!vdev->wds_enabled || vdev->proxysta_vdev)))
vdev->hal_desc_addr_search_flags = HAL_TX_DESC_ADDRY_EN;
else

View file

@ -920,6 +920,8 @@ struct dp_vdev {
privacy_exemption privacy_filters[MAX_PRIVACY_FILTERS];
uint32_t filters_num;
#endif
/* TDLS Link status */
bool tdls_link_connected;
/* VDEV operating mode */
enum wlan_op_mode opmode;

View file

@ -1693,6 +1693,13 @@ QDF_STATUS tdls_process_enable_link(struct tdls_oper_request *req)
tdls_increment_peer_count(soc_obj);
feature = soc_obj->tdls_configs.tdls_feature_flags;
if (soc_obj->tdls_dp_vdev_update)
soc_obj->tdls_dp_vdev_update(&soc_obj->soc,
peer->sta_id,
soc_obj->tdls_update_dp_vdev_flags,
((peer->link_status ==
TDLS_LINK_CONNECTED) ? true : false));
tdls_debug("TDLS buffer sta: %d, uapsd_mask %d",
TDLS_IS_BUFFER_STA_ENABLED(feature),
soc_obj->tdls_configs.tdls_uapsd_mask);
@ -1911,6 +1918,13 @@ QDF_STATUS tdls_process_remove_force_peer(struct tdls_oper_request *req)
tdls_set_peer_link_status(peer, TDLS_LINK_TEARING,
TDLS_LINK_UNSPECIFIED);
if (soc_obj->tdls_dp_vdev_update)
soc_obj->tdls_dp_vdev_update(&soc_obj->soc,
peer->sta_id,
soc_obj->tdls_update_dp_vdev_flags,
((peer->link_status ==
TDLS_LINK_CONNECTED) ? true : false));
if (soc_obj->tdls_event_cb) {
qdf_mem_copy(ind.peer_mac, macaddr, QDF_MAC_ADDR_SIZE);
ind.vdev = vdev;

View file

@ -536,6 +536,13 @@ void tdls_indicate_teardown(struct tdls_vdev_priv_obj *tdls_vdev,
TDLS_LINK_UNSPECIFIED);
tdls_notice("Teardown reason %d", reason);
if (tdls_soc->tdls_dp_vdev_update)
tdls_soc->tdls_dp_vdev_update(&tdls_soc->soc,
curr_peer->sta_id,
tdls_soc->tdls_update_dp_vdev_flags,
((curr_peer->link_status ==
TDLS_LINK_CONNECTED) ? true : false));
indication.reason = reason;
indication.vdev = tdls_vdev->vdev;
qdf_mem_copy(indication.peer_mac, curr_peer->peer_mac.bytes,

View file

@ -181,6 +181,7 @@ struct tdls_set_state_info {
* @tdls_del_sta_req: store eWNI_SME_TDLS_DEL_STA_REQ value
* @tdls_update_peer_state: store WMA_UPDATE_TDLS_PEER_STATE value
* @tdls_del_all_peers:store eWNI_SME_DEL_ALL_TDLS_PEERS
* @tdls_update_dp_vdev_flags store CDP_UPDATE_TDLS_FLAGS
* @tdls_idle_peer_data: provide information about idle peer
* @tdls_ct_spinlock: connection tracker spin lock
*/
@ -215,6 +216,7 @@ struct tdls_soc_priv_obj {
void *tdls_evt_cb_data;
tdls_register_tl_peer_callback tdls_reg_tl_peer;
tdls_deregister_tl_peer_callback tdls_dereg_tl_peer;
tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update;
void *tdls_tl_peer_data;
qdf_list_t tx_q_ack;
enum tdls_conc_cap tdls_con_cap;
@ -223,6 +225,7 @@ struct tdls_soc_priv_obj {
uint16_t tdls_del_sta_req;
uint16_t tdls_update_peer_state;
uint16_t tdls_del_all_peers;
uint32_t tdls_update_dp_vdev_flags;
struct tdls_ct_idle_peer_data tdls_idle_peer_data;
qdf_spinlock_t tdls_ct_spinlock;
};

View file

@ -530,6 +530,14 @@ typedef QDF_STATUS (*tdls_register_tl_peer_callback)(void *userdata,
typedef QDF_STATUS (*tdls_deregister_tl_peer_callback)(void *userdata,
uint32_t vdev_id,
uint8_t sta_id);
/* This callback is used to update datapath vdev flags */
typedef QDF_STATUS
(*tdls_dp_vdev_update_flags_callback)(void *cbk_data,
uint8_t sta_id,
uint32_t vdev_param,
bool is_link_up);
/**
* struct tdls_start_params - tdls start params
* @config: tdls user config
@ -537,12 +545,15 @@ typedef QDF_STATUS (*tdls_deregister_tl_peer_callback)(void *userdata,
* @tdls_add_sta_req: pass eWNI_SME_TDLS_ADD_STA_REQ value
* @tdls_del_sta_req: pass eWNI_SME_TDLS_DEL_STA_REQ value
* @tdls_update_peer_state: pass WMA_UPDATE_TDLS_PEER_STATE value
* @tdls_del_all_peers: pass eWNI_SME_DEL_ALL_TDLS_PEERS
* @tdls_update_dp_vdev_flags: pass CDP_UPDATE_TDLS_FLAGS
* @tdls_event_cb: tdls event callback
* @tdls_evt_cb_data: tdls event data
* @ack_cnf_cb: tdls tx ack callback to indicate the tx status
* @tx_ack_cnf_cb_data: tdls tx ack user data
* @tdls_reg_tl_peer: tdls register tdls peer
* @tdls_dereg_tl_peer: tdls deregister tdls peer
* @tdls_dp_vdev_update: update vdev flags in datapath
* @tdls_tl_peer_data: userdata for register/deregister TDLS peer
*/
struct tdls_start_params {
@ -552,6 +563,7 @@ struct tdls_start_params {
uint16_t tdls_del_sta_req;
uint16_t tdls_update_peer_state;
uint16_t tdls_del_all_peers;
uint32_t tdls_update_dp_vdev_flags;
tdls_rx_callback tdls_rx_cb;
void *tdls_rx_cb_data;
tdls_wmm_check tdls_wmm_cb;
@ -562,6 +574,7 @@ struct tdls_start_params {
void *tx_ack_cnf_cb_data;
tdls_register_tl_peer_callback tdls_reg_tl_peer;
tdls_deregister_tl_peer_callback tdls_dereg_tl_peer;
tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update;
void *tdls_tl_peer_data;
};

View file

@ -217,6 +217,7 @@ QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc,
soc_obj->tdls_del_sta_req = req->tdls_del_sta_req;
soc_obj->tdls_update_peer_state = req->tdls_update_peer_state;
soc_obj->tdls_del_all_peers = req->tdls_del_all_peers;
soc_obj->tdls_update_dp_vdev_flags = req->tdls_update_dp_vdev_flags;
tdls_pm_call_backs.tdls_notify_increment_session =
tdls_notify_increment_session;