qcacld-3.0: Send Peer TWT caps in PEER ASSOC

Parse the association response frame to read the
peer TWT extended capabilities and fill them in
the WMI PEER ASSOC command and send it to the
firmware.

Change-Id: I07f21010abbdaa20e212abae127009dd11e6ab7d
CRs-Fixed: 2264690
这个提交包含在:
Varun Reddy Yeturu
2018-06-15 18:08:37 -07:00
提交者 nshrivas
父节点 ba0b4fc472
当前提交 4f849e5032
修改 12 个文件,包含 93 行新增8 行删除

查看文件

@@ -1215,7 +1215,7 @@ static inline QDF_STATUS populate_dot11f_he_bss_color_change(
* populate_dot11f_twt_extended_caps() - populate TWT extended capabilities * populate_dot11f_twt_extended_caps() - populate TWT extended capabilities
* @mac_ctx: Global MAC context. * @mac_ctx: Global MAC context.
* @pe_session: Pointer to the PE session. * @pe_session: Pointer to the PE session.
* @p_ext_cap: Pointer to the extended capabilities of the session. * @dot11f: Pointer to the extended capabilities of the session.
* *
* Populate the TWT extended capabilities based on the target and INI support. * Populate the TWT extended capabilities based on the target and INI support.
* *
@@ -1223,12 +1223,12 @@ static inline QDF_STATUS populate_dot11f_he_bss_color_change(
*/ */
tSirRetStatus populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx, tSirRetStatus populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx,
tpPESession pe_session, tpPESession pe_session,
struct s_ext_cap *p_ext_cap); tDot11fIEExtCap *dot11f);
#else #else
static inline tSirRetStatus static inline tSirRetStatus
populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx, populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx,
tpPESession pe_session, tpPESession pe_session,
struct s_ext_cap *p_ext_cap) tDot11fIEExtCap *dot11f)
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

查看文件

@@ -555,6 +555,10 @@ typedef struct sPESession /* Added to Support BT-AMP */
enum wmi_obss_color_collision_evt_type obss_color_collision_dec_evt; enum wmi_obss_color_collision_evt_type obss_color_collision_dec_evt;
bool is_session_obss_color_collision_det_enabled; bool is_session_obss_color_collision_det_enabled;
int8_t def_max_tx_pwr; int8_t def_max_tx_pwr;
#ifdef WLAN_SUPPORT_TWT
uint8_t peer_twt_requestor;
uint8_t peer_twt_responder;
#endif
} tPESession, *tpPESession; } tPESession, *tpPESession;
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------

查看文件

@@ -3554,6 +3554,26 @@ static void lim_update_vht_oper_assoc_resp(tpAniSirGlobal mac_ctx,
pe_debug("Updating VHT Operation in assoc Response"); pe_debug("Updating VHT Operation in assoc Response");
} }
#ifdef WLAN_SUPPORT_TWT
/**
* lim_set_sta_ctx_twt() - Save the TWT settings in STA context
* @sta_ctx: Pointer to Station Context
* @session: Pointer to PE session
*
* Return: None
*/
static void lim_set_sta_ctx_twt(tAddStaParams *sta_ctx, tpPESession session)
{
sta_ctx->twt_requestor = session->peer_twt_requestor;
sta_ctx->twt_responder = session->peer_twt_responder;
}
#else
static inline void lim_set_sta_ctx_twt(tAddStaParams *sta_ctx,
tpPESession session)
{
}
#endif
/** /**
* limSendAddBss() * limSendAddBss()
* *
@@ -4098,6 +4118,7 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
pAddBssParams->ch_width = CH_WIDTH_10MHZ; pAddBssParams->ch_width = CH_WIDTH_10MHZ;
pAddBssParams->staContext.ch_width = CH_WIDTH_10MHZ; pAddBssParams->staContext.ch_width = CH_WIDTH_10MHZ;
} }
lim_set_sta_ctx_twt(&pAddBssParams->staContext, psessionEntry);
msgQ.type = WMA_ADD_BSS_REQ; msgQ.type = WMA_ADD_BSS_REQ;
/** @ToDo : Update the Global counter to keeptrack of the PE <--> HAL messages*/ /** @ToDo : Update the Global counter to keeptrack of the PE <--> HAL messages*/

查看文件

@@ -454,6 +454,7 @@ static void lim_update_stads_ext_cap(tpAniSirGlobal mac_ctx,
ext_cap->tdls_prohibited, ext_cap->tdls_prohibited,
ext_cap->tdls_chan_swit_prohibited); ext_cap->tdls_chan_swit_prohibited);
#endif #endif
lim_set_peer_twt_cap(session_entry, ext_cap);
} }
/** /**

查看文件

@@ -1955,6 +1955,14 @@ lim_send_assoc_req_mgmt_frame(tpAniSirGlobal mac_ctx,
lim_merge_extcap_struct(&frm->ExtCap, &bcn_ext_cap, lim_merge_extcap_struct(&frm->ExtCap, &bcn_ext_cap,
false); false);
} }
/*
* TWT extended capabilities should be populated after the
* intersection of beacon caps and self caps is done because
* the bits for TWT are unique to STA and AP and cannot be
* intersected.
*/
populate_dot11f_twt_extended_caps(mac_ctx, pe_session,
&frm->ExtCap);
} }
if (eSIR_SUCCESS != lim_strip_supp_op_class_update_struct(mac_ctx, if (eSIR_SUCCESS != lim_strip_supp_op_class_update_struct(mac_ctx,

查看文件

@@ -6308,6 +6308,18 @@ void lim_set_stads_rtt_cap(tpDphHashNode sta_ds, struct s_ext_cap *ext_cap,
ext_cap->fine_time_meas_responder); ext_cap->fine_time_meas_responder);
} }
#ifdef WLAN_SUPPORT_TWT
void lim_set_peer_twt_cap(tpPESession session, struct s_ext_cap *ext_cap)
{
session->peer_twt_requestor = ext_cap->twt_requestor_support;
session->peer_twt_responder = ext_cap->twt_responder_support;
pe_debug("Ext Cap peer TWT requestor: %d, responder: %d",
ext_cap->twt_requestor_support,
ext_cap->twt_responder_support);
}
#endif
/** /**
* lim_send_ie() - sends IE to wma * lim_send_ie() - sends IE to wma
* @mac_ctx: global MAC context * @mac_ctx: global MAC context

查看文件

@@ -1413,4 +1413,13 @@ QDF_STATUS lim_obss_generate_detection_config(tpAniSirGlobal mac_ctx,
void lim_enable_obss_detection_config(tpAniSirGlobal mac_ctx, void lim_enable_obss_detection_config(tpAniSirGlobal mac_ctx,
tpPESession session); tpPESession session);
#ifdef WLAN_SUPPORT_TWT
void lim_set_peer_twt_cap(tpPESession session, struct s_ext_cap *ext_cap);
#else
static inline void lim_set_peer_twt_cap(tpPESession session,
struct s_ext_cap *ext_cap)
{
}
#endif
#endif /* __LIM_UTILS_H */ #endif /* __LIM_UTILS_H */

查看文件

@@ -1215,10 +1215,6 @@ populate_dot11f_ext_cap(tpAniSirGlobal pMac,
if (psessionEntry && psessionEntry->enable_bcast_probe_rsp) if (psessionEntry && psessionEntry->enable_bcast_probe_rsp)
p_ext_cap->fils_capability = 1; p_ext_cap->fils_capability = 1;
if (psessionEntry)
populate_dot11f_twt_extended_caps(pMac, psessionEntry,
p_ext_cap);
/* Need to calculate the num_bytes based on bits set */ /* Need to calculate the num_bytes based on bits set */
if (pDot11f->present) if (pDot11f->present)
pDot11f->num_bytes = lim_compute_ext_cap_ie_length(pDot11f); pDot11f->num_bytes = lim_compute_ext_cap_ie_length(pDot11f);
@@ -6411,10 +6407,14 @@ QDF_STATUS populate_dot11f_he_bss_color_change(tpAniSirGlobal mac_ctx,
#ifdef WLAN_SUPPORT_TWT #ifdef WLAN_SUPPORT_TWT
tSirRetStatus populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx, tSirRetStatus populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx,
tpPESession pe_session, tpPESession pe_session,
struct s_ext_cap *p_ext_cap) tDot11fIEExtCap *dot11f)
{ {
uint32_t value = 0; uint32_t value = 0;
tSirRetStatus status; tSirRetStatus status;
struct s_ext_cap *p_ext_cap;
dot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
if (pe_session->pePersona == QDF_STA_MODE) { if (pe_session->pePersona == QDF_STA_MODE) {
CFG_GET_INT(status, mac_ctx, WNI_CFG_TWT_REQUESTOR, value); CFG_GET_INT(status, mac_ctx, WNI_CFG_TWT_REQUESTOR, value);
@@ -6424,6 +6424,7 @@ tSirRetStatus populate_dot11f_twt_extended_caps(tpAniSirGlobal mac_ctx,
CFG_GET_INT(status, mac_ctx, WNI_CFG_TWT_RESPONDER, value); CFG_GET_INT(status, mac_ctx, WNI_CFG_TWT_RESPONDER, value);
p_ext_cap->twt_responder_support = value; p_ext_cap->twt_responder_support = value;
} }
dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
return status; return status;
} }

查看文件

@@ -309,6 +309,10 @@ typedef struct {
#endif #endif
uint8_t stbc_capable; uint8_t stbc_capable;
uint8_t max_amsdu_num; uint8_t max_amsdu_num;
#ifdef WLAN_SUPPORT_TWT
uint8_t twt_requestor;
uint8_t twt_responder;
#endif
} tAddStaParams, *tpAddStaParams; } tAddStaParams, *tpAddStaParams;
/** /**

查看文件

@@ -30,12 +30,27 @@
* Return: None * Return: None
*/ */
void wma_send_twt_enable_cmd(uint32_t pdev_id, uint32_t congestion_timeout); void wma_send_twt_enable_cmd(uint32_t pdev_id, uint32_t congestion_timeout);
/**
* wma_set_twt_peer_caps() - Fill the peer TWT capabilities
* @params: STA context params which will store the capabilities
* @cmd: Command in which the capabilities should be populated
*
* Return: None
*/
void wma_set_twt_peer_caps(tpAddStaParams params,
struct peer_assoc_params *cmd);
#else #else
static inline void wma_send_twt_enable_cmd(uint32_t pdev_id, static inline void wma_send_twt_enable_cmd(uint32_t pdev_id,
uint32_t congestion_timeout) uint32_t congestion_timeout)
{ {
WMA_LOGD(FL("TWT not supported as WLAN_SUPPORT_TWT is disabled")); WMA_LOGD(FL("TWT not supported as WLAN_SUPPORT_TWT is disabled"));
} }
static inline void wma_set_twt_peer_caps(tpAddStaParams params,
struct peer_assoc_params *cmd)
{
}
#endif #endif
#endif /* __WMA_HE_H */ #endif /* __WMA_HE_H */

查看文件

@@ -71,6 +71,7 @@
#include <cdp_txrx_handle.h> #include <cdp_txrx_handle.h>
#include "wma_he.h" #include "wma_he.h"
#include <qdf_crypto.h> #include <qdf_crypto.h>
#include "wma_twt.h"
/** /**
* wma_send_bcn_buf_ll() - prepare and send beacon buffer to fw for LL * wma_send_bcn_buf_ll() - prepare and send beacon buffer to fw for LL
@@ -1373,6 +1374,7 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
break; break;
} }
wma_set_twt_peer_caps(params, cmd);
#ifdef FEATURE_WLAN_TDLS #ifdef FEATURE_WLAN_TDLS
if (STA_ENTRY_TDLS_PEER == params->staType) if (STA_ENTRY_TDLS_PEER == params->staType)
cmd->peer_flags |= WMI_PEER_AUTH; cmd->peer_flags |= WMI_PEER_AUTH;

查看文件

@@ -72,3 +72,11 @@ int wma_twt_en_complete_event_handler(void *handle,
return status; return status;
} }
void wma_set_twt_peer_caps(tpAddStaParams params, struct peer_assoc_params *cmd)
{
if (params->twt_requestor)
cmd->peer_flags |= WMI_PEER_TWT_REQ;
if (params->twt_responder)
cmd->peer_flags |= WMI_PEER_TWT_RESP;
}