qcacld-3.0: Refactor vdev create code

Refactor vdev create code to target_if common code. Remove legacy
code for vdev create.

Change-Id: I57caf0c5fa2da7b6ba640a9d2edb72363959c585
CRs-Fixed: 2460786
This commit is contained in:
Abhishek Ambure
2019-05-27 19:43:26 +05:30
committed by nshrivas
parent 2ac5dec407
commit 7470976006
25 changed files with 576 additions and 795 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -361,7 +361,7 @@ QDF_STATUS target_if_p2p_set_noa(struct wlan_objmgr_psoc *psoc,
target_if_debug("psoc:%pK, vdev_id:%d disable_noa:%d", target_if_debug("psoc:%pK, vdev_id:%d disable_noa:%d",
psoc, vdev_id, disable_noa); psoc, vdev_id, disable_noa);
param.if_id = vdev_id; param.vdev_id = vdev_id;
param.param_id = WMI_VDEV_PARAM_DISABLE_NOA_P2P_GO; param.param_id = WMI_VDEV_PARAM_DISABLE_NOA_P2P_GO;
param.param_value = (uint32_t)disable_noa; param.param_value = (uint32_t)disable_noa;

View File

@@ -74,7 +74,7 @@ QDF_STATUS target_if_pmo_send_vdev_update_param_req(
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
param.if_id = vdev_id; param.vdev_id = vdev_id;
param.param_id = param_id; param.param_id = param_id;
param.param_value = param_value; param.param_value = param_value;
target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d", target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d",
@@ -127,7 +127,7 @@ QDF_STATUS target_if_pmo_send_vdev_ps_param_req(
} }
sta_ps_param.vdev_id = vdev_id; sta_ps_param.vdev_id = vdev_id;
sta_ps_param.param = param_id; sta_ps_param.param_id = param_id;
sta_ps_param.value = param_value; sta_ps_param.value = param_value;
target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d", target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d",
vdev_id, param_value, param_id); vdev_id, param_value, param_id);

View File

@@ -329,8 +329,26 @@ QDF_STATUS cds_free_context(QDF_MODULE_ID module_id, void *module_context);
QDF_STATUS cds_set_context(QDF_MODULE_ID module_id, void *context); QDF_STATUS cds_set_context(QDF_MODULE_ID module_id, void *context);
QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint32_t *type, /**
uint32_t *subType); * cds_get_vdev_types() - get vdev type and subtype from it's operation mode
* @mode: operation mode of vdev
* @type: type of vdev
* @sub_type: sub_type of vdev
*
* This API is called to get vdev type and subtype from it's operation mode.
* Vdev operation modes are defined in enum QDF_OPMODE.
*
* Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA,
* WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR,
* WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI
*
* Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE,
* WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO,
* WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH
* Return: QDF_STATUS
*/
QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type,
uint8_t *sub_type);
void cds_flush_work(void *work); void cds_flush_work(void *work);
void cds_flush_delayed_work(void *dwork); void cds_flush_delayed_work(void *dwork);

View File

@@ -1607,16 +1607,8 @@ QDF_STATUS cds_free_context(QDF_MODULE_ID module_id, void *module_context)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} /* cds_free_context() */ } /* cds_free_context() */
/** QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type,
* cds_get_vdev_types() - get vdev type uint8_t *sub_type)
* @mode: mode
* @type: type
* @sub_type: sub_type
*
* Return: WMI vdev type
*/
QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint32_t *type,
uint32_t *sub_type)
{ {
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
*type = 0; *type = 0;
@@ -1624,34 +1616,34 @@ QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint32_t *type,
switch (mode) { switch (mode) {
case QDF_STA_MODE: case QDF_STA_MODE:
*type = WMI_VDEV_TYPE_STA; *type = WLAN_VDEV_MLME_TYPE_STA;
break; break;
case QDF_SAP_MODE: case QDF_SAP_MODE:
*type = WMI_VDEV_TYPE_AP; *type = WLAN_VDEV_MLME_TYPE_AP;
break; break;
case QDF_P2P_DEVICE_MODE: case QDF_P2P_DEVICE_MODE:
*type = WMI_VDEV_TYPE_AP; *type = WLAN_VDEV_MLME_TYPE_AP;
*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE;
break; break;
case QDF_P2P_CLIENT_MODE: case QDF_P2P_CLIENT_MODE:
*type = WMI_VDEV_TYPE_STA; *type = WLAN_VDEV_MLME_TYPE_STA;
*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT;
break; break;
case QDF_P2P_GO_MODE: case QDF_P2P_GO_MODE:
*type = WMI_VDEV_TYPE_AP; *type = WLAN_VDEV_MLME_TYPE_AP;
*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO;
break; break;
case QDF_OCB_MODE: case QDF_OCB_MODE:
*type = WMI_VDEV_TYPE_OCB; *type = WLAN_VDEV_MLME_TYPE_OCB;
break; break;
case QDF_IBSS_MODE: case QDF_IBSS_MODE:
*type = WMI_VDEV_TYPE_IBSS; *type = WLAN_VDEV_MLME_TYPE_IBSS;
break; break;
case QDF_MONITOR_MODE: case QDF_MONITOR_MODE:
*type = WMI_VDEV_TYPE_MONITOR; *type = WMI_HOST_VDEV_TYPE_MONITOR;
break; break;
case QDF_NDI_MODE: case QDF_NDI_MODE:
*type = WMI_VDEV_TYPE_NDI; *type = WLAN_VDEV_MLME_TYPE_NDI;
break; break;
default: default:
cds_err("Invalid device mode %d", mode); cds_err("Invalid device mode %d", mode);

View File

@@ -5885,7 +5885,6 @@ static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter,
struct nlattr *rx_attr = struct nlattr *rx_attr =
tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]; tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION];
uint8_t tx_size, rx_size; uint8_t tx_size, rx_size;
struct sir_set_tx_rx_aggregation_size request;
QDF_STATUS status; QDF_STATUS status;
/* nothing to do if neither attribute is present */ /* nothing to do if neither attribute is present */
@@ -5909,15 +5908,10 @@ static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter,
return -EINVAL; return -EINVAL;
} }
qdf_mem_zero(&request, sizeof(request)); status = wma_set_tx_rx_aggr_size(adapter->vdev_id,
request.tx_aggregation_size = tx_size; tx_size,
request.rx_aggregation_size = rx_size; rx_size,
request.vdev_id = adapter->vdev_id; WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
request.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
status = wma_set_tx_rx_aggregation_size(&request);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("failed to set aggr sizes err %d", status);
return qdf_status_to_os_return(status); return qdf_status_to_os_return(status);
} }

View File

@@ -4381,24 +4381,13 @@ static int hdd_set_sme_session_param(struct hdd_adapter *adapter,
csr_roam_complete_cb callback, csr_roam_complete_cb callback,
void *callback_ctx) void *callback_ctx)
{ {
uint32_t type; session_param->vdev_id = adapter->vdev_id;
uint32_t sub_type;
QDF_STATUS status;
/* determine vdev (sub)type */
status = cds_get_vdev_types(adapter->device_mode, &type, &sub_type);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("failed to get vdev type: %d", status);
return qdf_status_to_os_return(status);
}
session_param->sme_session_id = adapter->vdev_id;
session_param->self_mac_addr = (uint8_t *)&adapter->mac_addr; session_param->self_mac_addr = (uint8_t *)&adapter->mac_addr;
session_param->type_of_persona = type;
session_param->subtype_of_persona = sub_type;
session_param->session_open_cb = hdd_sme_open_session_callback; session_param->session_open_cb = hdd_sme_open_session_callback;
session_param->session_close_cb = hdd_sme_close_session_callback; session_param->session_close_cb = hdd_sme_close_session_callback;
session_param->callback = callback; session_param->callback = callback;
session_param->callback_ctx = callback_ctx; session_param->callback_ctx = callback_ctx;
session_param->vdev = adapter->vdev;
return 0; return 0;
} }
@@ -4470,14 +4459,15 @@ int hdd_vdev_create(struct hdd_adapter *adapter,
hdd_err("failed to populating SME params"); hdd_err("failed to populating SME params");
goto objmgr_vdev_destroy_procedure; goto objmgr_vdev_destroy_procedure;
} }
status = sme_open_session(hdd_ctx->mac_handle, &sme_session_params); status = sme_create_vdev(hdd_ctx->mac_handle,
&sme_session_params);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("failed to open sme session: %d", status); hdd_err("failed to create vdev: %d", status);
errno = qdf_status_to_os_return(status); errno = qdf_status_to_os_return(status);
goto objmgr_vdev_destroy_procedure; goto objmgr_vdev_destroy_procedure;
} }
/* block on a completion variable until sme session is opened */ /* block on a completion variable until vdev is created in firmware */
status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event, status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event,
SME_CMD_VDEV_CREATE_DELETE_TIMEOUT); SME_CMD_VDEV_CREATE_DELETE_TIMEOUT);
if (QDF_STATUS_SUCCESS != status) { if (QDF_STATUS_SUCCESS != status) {

View File

@@ -120,7 +120,7 @@ int hdd_objmgr_release_and_destroy_pdev(struct hdd_context *hdd_ctx);
* Return: 0 for success, negative error code for failure * Return: 0 for success, negative error code for failure
*/ */
int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
struct hdd_adapter *adapter); struct hdd_adapter *adapter);
/** /**
* hdd_objmgr_release_and_destroy_vdev() - Delete vdev and remove from adapter * hdd_objmgr_release_and_destroy_vdev() - Delete vdev and remove from adapter

View File

@@ -5041,56 +5041,6 @@ struct sme_ndp_peer_ind {
}; };
#endif /* WLAN_FEATURE_NAN */ #endif /* WLAN_FEATURE_NAN */
/**
* struct sir_set_tx_rx_aggregation_size - sets tx rx aggregation size
* @vdev_id: vdev id of the session
* @aggr_type: TX Aggregation Type (0=A-MPDU, 1=A-MSDU)
* @tx_aggregation_size: Tx aggregation size
* @tx_aggregation_size_be: Tx aggregation size for be queue
* @tx_aggregation_size_bk: Tx aggregation size for bk queue
* @tx_aggregation_size_vi: Tx aggregation size for vi queue
* @tx_aggregation_size_vo: Tx aggregation size for vo queue
* @rx_aggregation_size: Rx aggregation size
*/
struct sir_set_tx_rx_aggregation_size {
uint8_t vdev_id;
wmi_vdev_custom_aggr_type_t aggr_type;
uint32_t tx_aggregation_size;
uint32_t tx_aggregation_size_be;
uint32_t tx_aggregation_size_bk;
uint32_t tx_aggregation_size_vi;
uint32_t tx_aggregation_size_vo;
uint32_t rx_aggregation_size;
};
/**
* struct sir_set_tx_sw_retry_threshold - set sw retry threshold
* @vdev_id: vdev id of the session
* @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for BE
* @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for BK
* @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for VI
* @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for VO
* @tx_aggr_sw_retry_threshold: aggr sw retry threshold
* @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for BE
* @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for BK
* @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for VI
* @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for VO
* @tx_non_aggr_sw_retry_threshold: non aggr sw retry threshold
*/
struct sir_set_tx_sw_retry_threshold {
uint8_t vdev_id;
uint32_t tx_aggr_sw_retry_threshold_be;
uint32_t tx_aggr_sw_retry_threshold_bk;
uint32_t tx_aggr_sw_retry_threshold_vi;
uint32_t tx_aggr_sw_retry_threshold_vo;
uint32_t tx_aggr_sw_retry_threshold;
uint32_t tx_non_aggr_sw_retry_threshold_be;
uint32_t tx_non_aggr_sw_retry_threshold_bk;
uint32_t tx_non_aggr_sw_retry_threshold_vi;
uint32_t tx_non_aggr_sw_retry_threshold_vo;
uint32_t tx_non_aggr_sw_retry_threshold;
};
/** /**
* struct sir_p2p_lo_start - p2p listen offload start * struct sir_p2p_lo_start - p2p listen offload start
* @vdev_id: vdev identifier * @vdev_id: vdev identifier

View File

@@ -87,7 +87,7 @@ enum eWniMsgTypes {
eWNI_SME_BEACON_REPORT_REQ_IND = SIR_SME_MSG_TYPES_BEGIN + 45, eWNI_SME_BEACON_REPORT_REQ_IND = SIR_SME_MSG_TYPES_BEGIN + 45,
eWNI_SME_BEACON_REPORT_RESP_XMIT_IND = SIR_SME_MSG_TYPES_BEGIN + 46, eWNI_SME_BEACON_REPORT_RESP_XMIT_IND = SIR_SME_MSG_TYPES_BEGIN + 46,
eWNI_SME_ADD_STA_SELF_RSP = SIR_SME_MSG_TYPES_BEGIN + 47, /* unused SIR_SME_MSG_TYPES_BEGIN + 47, */
eWNI_SME_DEL_STA_SELF_RSP = SIR_SME_MSG_TYPES_BEGIN + 48, eWNI_SME_DEL_STA_SELF_RSP = SIR_SME_MSG_TYPES_BEGIN + 48,
eWNI_SME_FT_PRE_AUTH_REQ = SIR_SME_MSG_TYPES_BEGIN + 49, eWNI_SME_FT_PRE_AUTH_REQ = SIR_SME_MSG_TYPES_BEGIN + 49,
@@ -240,7 +240,9 @@ enum eWniMsgTypes {
WNI_SME_REGISTER_BCN_REPORT_SEND_CB = SIR_SME_MSG_TYPES_BEGIN + 154, WNI_SME_REGISTER_BCN_REPORT_SEND_CB = SIR_SME_MSG_TYPES_BEGIN + 154,
eWNI_SME_ANTENNA_ISOLATION_RSP = SIR_SME_MSG_TYPES_BEGIN + 155, eWNI_SME_ANTENNA_ISOLATION_RSP = SIR_SME_MSG_TYPES_BEGIN + 155,
eWNI_SME_MON_DEINIT_SESSION = SIR_SME_MSG_TYPES_BEGIN + 156, eWNI_SME_MON_DEINIT_SESSION = SIR_SME_MSG_TYPES_BEGIN + 156,
eWNI_SME_MSG_TYPES_END = SIR_SME_MSG_TYPES_BEGIN + 157 eWNI_SME_VDEV_CREATE_REQ = SIR_SME_MSG_TYPES_BEGIN + 157,
eWNI_SME_VDEV_CREATE_RSP = SIR_SME_MSG_TYPES_BEGIN + 158,
eWNI_SME_MSG_TYPES_END = SIR_SME_MSG_TYPES_BEGIN + 159
}; };
typedef struct sAniCfgTxRateCtrs { typedef struct sAniCfgTxRateCtrs {

View File

@@ -298,8 +298,8 @@ struct sir_cfg_action_frm_tb_ppdu {
/* / PE <-> HAL Host Offload message */ /* / PE <-> HAL Host Offload message */
#define SIR_HAL_SET_HOST_OFFLOAD (SIR_HAL_ITC_MSG_TYPES_BEGIN + 100) #define SIR_HAL_SET_HOST_OFFLOAD (SIR_HAL_ITC_MSG_TYPES_BEGIN + 100)
#define SIR_HAL_ADD_STA_SELF_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 101) /* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 101) is unused */
#define SIR_HAL_ADD_STA_SELF_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 102) /* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 102) is unused */
#define SIR_HAL_DEL_STA_SELF_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 103) #define SIR_HAL_DEL_STA_SELF_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 103)
/* /*
* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 104) thru * (SIR_HAL_ITC_MSG_TYPES_BEGIN + 104) thru

View File

@@ -59,6 +59,7 @@
#include "cds_ieee80211_common.h" #include "cds_ieee80211_common.h"
#include <wlan_scan_ucfg_api.h> #include <wlan_scan_ucfg_api.h>
#include "wlan_mlme_public_struct.h" #include "wlan_mlme_public_struct.h"
#include "../../core/src/vdev_mgr_ops.h"
void lim_log_session_states(struct mac_context *mac); void lim_log_session_states(struct mac_context *mac);
static void lim_process_normal_hdd_msg(struct mac_context *mac_ctx, static void lim_process_normal_hdd_msg(struct mac_context *mac_ctx,
@@ -1541,6 +1542,60 @@ static void lim_process_sme_obss_scan_ind(struct mac_context *mac_ctx,
return; return;
} }
static void
lim_process_vdev_create(struct mac_context *mac_ctx,
struct vdev_create_req_param *vdev_create_param)
{
struct wlan_objmgr_vdev *vdev;
struct vdev_mlme_obj *vdev_mlme = NULL;
struct scheduler_msg message = {0};
QDF_STATUS status = QDF_STATUS_SUCCESS;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
vdev_create_param->vdev_id,
WLAN_LEGACY_MAC_ID);
if (!vdev) {
pe_err("Failed to get vdev obj for vdev id %d",
vdev_create_param->vdev_id);
status = QDF_STATUS_E_INVAL;
goto end;
}
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
pe_err("Failed to get vdev mlme obj for vdev id %d",
vdev_create_param->vdev_id);
status = QDF_STATUS_E_INVAL;
goto end;
}
status = vdev_mgr_create_send(vdev_mlme);
if (QDF_IS_STATUS_ERROR(vdev_create_param->status)) {
pe_err("Failed to create vdev for vdev id %d",
vdev_create_param->vdev_id);
goto end;
}
status = wma_post_vdev_create_setup(vdev);
if (QDF_IS_STATUS_ERROR(status))
vdev_mgr_delete_send(vdev_mlme);
end:
if (vdev)
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
vdev_create_param->status = status;
message.type = eWNI_SME_VDEV_CREATE_RSP;
message.bodyptr = vdev_create_param;
status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
QDF_MODULE_ID_SME, &message);
if (!QDF_IS_STATUS_SUCCESS(status)) {
qdf_mem_free(vdev_create_param);
pe_err("scheduler_post_msg failed!(err=%d)", status);
}
}
/** /**
* lim_process_messages() - Process messages from upper layers. * lim_process_messages() - Process messages from upper layers.
* *
@@ -2097,6 +2152,11 @@ static void lim_process_messages(struct mac_context *mac_ctx,
qdf_mem_free((void *)msg->bodyptr); qdf_mem_free((void *)msg->bodyptr);
msg->bodyptr = NULL; msg->bodyptr = NULL;
break; break;
case eWNI_SME_VDEV_CREATE_REQ:
lim_process_vdev_create(mac_ctx, msg->bodyptr);
/* Do not free msg->bodyptr, same memory used to send resp */
msg->bodyptr = NULL;
break;
default: default:
qdf_mem_free((void *)msg->bodyptr); qdf_mem_free((void *)msg->bodyptr);
msg->bodyptr = NULL; msg->bodyptr = NULL;

View File

@@ -256,7 +256,6 @@ uint8_t *mac_trace_get_sme_msg_string(uint16_t sme_msg)
CASE_RETURN_STRING(eWNI_SME_NEIGHBOR_REPORT_IND); CASE_RETURN_STRING(eWNI_SME_NEIGHBOR_REPORT_IND);
CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_REQ_IND); CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_REQ_IND);
CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_RESP_XMIT_IND); CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_RESP_XMIT_IND);
CASE_RETURN_STRING(eWNI_SME_ADD_STA_SELF_RSP);
CASE_RETURN_STRING(eWNI_SME_DEL_STA_SELF_RSP); CASE_RETURN_STRING(eWNI_SME_DEL_STA_SELF_RSP);
CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_REQ); CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_REQ);
CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_RSP); CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_RSP);
@@ -388,7 +387,6 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
switch (wma_msg) { switch (wma_msg) {
CASE_RETURN_STRING(WMA_ADD_STA_REQ); CASE_RETURN_STRING(WMA_ADD_STA_REQ);
CASE_RETURN_STRING(WMA_ADD_STA_RSP); CASE_RETURN_STRING(WMA_ADD_STA_RSP);
CASE_RETURN_STRING(WMA_ADD_STA_SELF_RSP);
CASE_RETURN_STRING(WMA_DELETE_STA_REQ); CASE_RETURN_STRING(WMA_DELETE_STA_REQ);
CASE_RETURN_STRING(WMA_DELETE_STA_RSP); CASE_RETURN_STRING(WMA_DELETE_STA_RSP);
CASE_RETURN_STRING(WMA_ADD_BSS_REQ); CASE_RETURN_STRING(WMA_ADD_BSS_REQ);
@@ -453,7 +451,6 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
#ifdef WLAN_NS_OFFLOAD #ifdef WLAN_NS_OFFLOAD
CASE_RETURN_STRING(WMA_SET_NS_OFFLOAD); CASE_RETURN_STRING(WMA_SET_NS_OFFLOAD);
#endif /* WLAN_NS_OFFLOAD */ #endif /* WLAN_NS_OFFLOAD */
CASE_RETURN_STRING(WMA_ADD_STA_SELF_REQ);
CASE_RETURN_STRING(WMA_DEL_STA_SELF_REQ); CASE_RETURN_STRING(WMA_DEL_STA_SELF_REQ);
CASE_RETURN_STRING(WMA_WLAN_SUSPEND_IND); CASE_RETURN_STRING(WMA_WLAN_SUSPEND_IND);
CASE_RETURN_STRING(WMA_WLAN_RESUME_REQ); CASE_RETURN_STRING(WMA_WLAN_RESUME_REQ);

View File

@@ -212,21 +212,19 @@ struct sme_5g_band_pref_params {
* @session_open_cb: callback to be registered with SME for opening the session * @session_open_cb: callback to be registered with SME for opening the session
* @session_close_cb: callback to be registered with SME for closing the session * @session_close_cb: callback to be registered with SME for closing the session
* @callback: callback to be invoked for roaming events * @callback: callback to be invoked for roaming events
* @vdev: pointer to vdev object
* @callback_ctx: user-supplied context to be passed back on roaming events * @callback_ctx: user-supplied context to be passed back on roaming events
* @self_mac_addr: Self mac address * @self_mac_addr: Self mac address
* @sme_session_id: SME session id * @vdev_id: vdev id
* @type_of_persona: person type
* @subtype_of_persona: sub type of persona
*/ */
struct sme_session_params { struct sme_session_params {
csr_session_open_cb session_open_cb; csr_session_open_cb session_open_cb;
csr_session_close_cb session_close_cb; csr_session_close_cb session_close_cb;
csr_roam_complete_cb callback; csr_roam_complete_cb callback;
struct wlan_objmgr_vdev *vdev;
void *callback_ctx; void *callback_ctx;
uint8_t *self_mac_addr; uint8_t *self_mac_addr;
uint8_t sme_session_id; uint8_t vdev_id;
uint32_t type_of_persona;
uint32_t subtype_of_persona;
}; };
#define MAX_CANDIDATE_INFO 10 #define MAX_CANDIDATE_INFO 10
@@ -370,21 +368,19 @@ sme_nss_chains_update(mac_handle_t mac_handle,
uint8_t vdev_id); uint8_t vdev_id);
/** /**
* sme_open_session() - Open a session for given persona * sme_create_vdev() - Create vdev for given persona
* @mac_handle: The handle returned by mac_open
* @params: to initialize the session open params
* *
* This is a synchronous API. For any protocol stack related activity * This is a synchronous API. For any protocol stack related activity
* requires session to be opened. This API needs to be called to open * requires vdev to be created. This API needs to be called to create
* the session in SME module. * vdev in SME module.
* *
* mac_handle: The handle returned by mac_open. * Return: QDF_STATUS_SUCCESS - vdev is created
* params: to initialize the session open params * Other status means SME is failed to create vdev
*
* Return:
* QDF_STATUS_SUCCESS - session is opened.
* Other status means SME is failed to open the session.
*/ */
QDF_STATUS sme_open_session(mac_handle_t mac_handle, QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
struct sme_session_params *params); struct sme_session_params *params);
/** /**
* sme_close_session() - Close a session for given persona * sme_close_session() - Close a session for given persona

View File

@@ -163,7 +163,6 @@ QDF_STATUS csr_is_valid_channel(struct mac_context *mac, uint8_t chnNum);
QDF_STATUS sme_acquire_global_lock(struct sme_context *sme); QDF_STATUS sme_acquire_global_lock(struct sme_context *sme);
QDF_STATUS sme_release_global_lock(struct sme_context *sme); QDF_STATUS sme_release_global_lock(struct sme_context *sme);
QDF_STATUS csr_process_add_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg);
QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg); QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg);
QDF_STATUS csr_flush_cfg_bg_scan_roam_channel_list(struct mac_context *mac, QDF_STATUS csr_flush_cfg_bg_scan_roam_channel_list(struct mac_context *mac,

View File

@@ -1997,10 +1997,9 @@ QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
sme_err("Empty message for: %d", pMsg->type); sme_err("Empty message for: %d", pMsg->type);
} }
break; break;
case eWNI_SME_ADD_STA_SELF_RSP: case eWNI_SME_VDEV_CREATE_RSP:
if (pMsg->bodyptr) { if (pMsg->bodyptr) {
status = csr_process_add_sta_session_rsp(mac, status = csr_vdev_create_resp(mac, pMsg->bodyptr);
pMsg->bodyptr);
qdf_mem_free(pMsg->bodyptr); qdf_mem_free(pMsg->bodyptr);
} else { } else {
sme_err("Empty message for: %d", pMsg->type); sme_err("Empty message for: %d", pMsg->type);
@@ -4486,8 +4485,8 @@ release_ref:
return status; return status;
} }
QDF_STATUS sme_open_session(mac_handle_t mac_handle, QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
struct sme_session_params *params) struct sme_session_params *params)
{ {
QDF_STATUS status = QDF_STATUS_E_INVAL; QDF_STATUS status = QDF_STATUS_E_INVAL;
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
@@ -4496,17 +4495,13 @@ QDF_STATUS sme_open_session(mac_handle_t mac_handle,
uint8_t peer_id; uint8_t peer_id;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, sme_debug("vdev_id %d addr:%pM", params->vdev_id,
"%s: type=%d, session_id %d subType=%d addr:%pM",
__func__, params->type_of_persona,
params->sme_session_id, params->subtype_of_persona,
params->self_mac_addr); params->self_mac_addr);
pdev = cds_get_context(QDF_MODULE_ID_TXRX); pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) { if (!pdev) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, sme_err("Failed to get pdev handler");
"%s: Failed to get pdev handler", __func__);
return status; return status;
} }
@@ -4517,17 +4512,15 @@ QDF_STATUS sme_open_session(mac_handle_t mac_handle,
peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr, peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
&peer_id); &peer_id);
if (peer) { if (peer) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, sme_err("Peer=%d exist with same MAC", peer_id);
"%s: Peer=%d exist with same MAC",
__func__, peer_id);
status = QDF_STATUS_E_INVAL; status = QDF_STATUS_E_INVAL;
} else { } else {
status = csr_roam_open_session(mac_ctx, params); status = csr_create_vdev(mac_ctx, params->vdev, params);
} }
sme_release_global_lock(&mac_ctx->sme); sme_release_global_lock(&mac_ctx->sme);
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION, MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
params->sme_session_id, 0)); params->vdev_id, 0));
return status; return status;
} }

View File

@@ -16785,47 +16785,86 @@ static void csr_store_oce_cfg_flags_in_vdev(struct mac_context *mac,
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
} }
QDF_STATUS csr_process_add_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg) static void csr_send_set_ie(uint8_t type, uint8_t sub_type,
uint8_t vdev_id)
{ {
struct add_sta_self_params *rsp;
struct send_extcap_ie *msg; struct send_extcap_ie *msg;
QDF_STATUS status; QDF_STATUS status;
if (!pMsg) { sme_debug("send SET IE msg to PE");
sme_err("in %s msg ptr is NULL", __func__);
if (!(type == WLAN_VDEV_MLME_TYPE_STA ||
(type == WLAN_VDEV_MLME_TYPE_AP &&
sub_type == WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE))) {
sme_err("Failed to send set IE req for vdev_%d", vdev_id);
return;
}
msg = qdf_mem_malloc(sizeof(*msg));
if (!msg)
return;
msg->msg_type = eWNI_SME_SET_IE_REQ;
msg->session_id = vdev_id;
msg->length = sizeof(*msg);
status = umac_send_mb_message_to_mac(msg);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("Failed to send set IE req for vdev_%d", vdev_id);
}
QDF_STATUS csr_vdev_create_resp(struct mac_context *mac, uint8_t *pmsg)
{
struct vdev_create_req_param *rsp;
struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_vdev *vdev;
if (!pmsg) {
sme_err("msg ptr is NULL");
return QDF_STATUS_E_FAILURE;
}
rsp = (struct vdev_create_req_param *)pmsg;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
rsp->vdev_id,
WLAN_LEGACY_MAC_ID);
if (!vdev) {
sme_err("Failed to get vdev obj for vdev id %d",
rsp->vdev_id);
csr_cleanup_session(mac, rsp->vdev_id);
csr_roam_session_opened(mac, QDF_STATUS_E_FAILURE,
rsp->vdev_id);
return QDF_STATUS_E_FAILURE;
}
sme_debug("create vdev status = %d", rsp->status);
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
sme_err("Fail to get vdev priv object");
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
csr_cleanup_session(mac, rsp->vdev_id);
csr_roam_session_opened(mac, QDF_STATUS_E_FAILURE,
rsp->vdev_id);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
rsp = (struct add_sta_self_params *) pMsg;
sme_debug("Add Sta self rsp status = %d", rsp->status);
if (QDF_IS_STATUS_SUCCESS(rsp->status)) { if (QDF_IS_STATUS_SUCCESS(rsp->status)) {
if ((WMI_VDEV_TYPE_STA == rsp->type || csr_send_set_ie(vdev_mlme->mgmt.generic.type,
(WMI_VDEV_TYPE_AP == rsp->type && vdev_mlme->mgmt.generic.subtype,
WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE == rsp->sub_type))) { rsp->vdev_id);
sme_debug("send SET IE msg to PE");
msg = qdf_mem_malloc(sizeof(*msg));
if (!msg)
return QDF_STATUS_E_NOMEM;
msg->msg_type = eWNI_SME_SET_IE_REQ; if (vdev_mlme->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_STA) {
msg->session_id = rsp->session_id; csr_store_oce_cfg_flags_in_vdev(mac, mac->pdev,
msg->length = sizeof(*msg); rsp->vdev_id);
status = umac_send_mb_message_to_mac(msg); wlan_mlme_update_oce_flags(mac->pdev);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("Failed to send down the set IE req ");
} }
} }
csr_roam_session_opened(mac, rsp->status, rsp->session_id); csr_roam_session_opened(mac, rsp->status, rsp->vdev_id);
if (QDF_IS_STATUS_SUCCESS(rsp->status) &&
rsp->type == WMI_VDEV_TYPE_STA) {
csr_store_oce_cfg_flags_in_vdev(mac, mac->pdev,
rsp->session_id);
wlan_mlme_update_oce_flags(mac->pdev);
}
if (QDF_IS_STATUS_ERROR(rsp->status)) if (QDF_IS_STATUS_ERROR(rsp->status))
csr_cleanup_session(mac, rsp->session_id); csr_cleanup_session(mac, rsp->vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -16889,118 +16928,73 @@ void csr_get_vdev_type_nss(struct mac_context *mac_ctx,
break; break;
} }
sme_debug("mode - %d: nss_2g - %d, 5g - %d", sme_debug("mode - %d: nss_2g - %d, 5g - %d",
dev_mode, *nss_2g, *nss_5g); dev_mode, *nss_2g, *nss_5g);
} }
static static
QDF_STATUS csr_issue_add_sta_for_session_req(struct mac_context *mac, QDF_STATUS csr_issue_vdev_create_req(struct mac_context *mac,
uint32_t sessionId, uint32_t vdev_id)
tSirMacAddr sessionMacAddr,
uint32_t type, uint32_t subType)
{ {
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
struct add_sta_self_params *add_sta_self_req; struct vdev_create_req_param *vdev_create_req;
struct wlan_mlme_qos *qos_aggr = &mac->mlme_cfg->qos_mlme_params; struct scheduler_msg message = {0};
uint8_t nss_2g;
uint8_t nss_5g;
struct scheduler_msg msg = {0};
add_sta_self_req = qdf_mem_malloc(sizeof(struct add_sta_self_params)); vdev_create_req = qdf_mem_malloc(sizeof(*vdev_create_req));
if (!add_sta_self_req) if (!vdev_create_req)
return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM;
if (!(mac->mlme_cfg)) { vdev_create_req->vdev_id = vdev_id;
pe_err("Mlme cfg NULL"); /* Serialize the req through MC thread */
return QDF_STATUS_E_FAILURE; message.type = eWNI_SME_VDEV_CREATE_REQ;
message.bodyptr = vdev_create_req;
status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
QDF_MODULE_ID_PE, &message);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("scheduler_post_msg failed!(err=%d)", status);
qdf_mem_free(vdev_create_req);
status = QDF_STATUS_E_FAILURE;
} }
csr_get_vdev_type_nss(mac, mac->sme.curr_device_mode,
&nss_2g, &nss_5g);
qdf_mem_copy(add_sta_self_req->self_mac_addr, sessionMacAddr,
sizeof(tSirMacAddr));
add_sta_self_req->curr_device_mode = mac->sme.curr_device_mode;
add_sta_self_req->session_id = sessionId;
add_sta_self_req->type = type;
add_sta_self_req->sub_type = subType;
add_sta_self_req->nss_2g = nss_2g;
add_sta_self_req->nss_5g = nss_5g;
add_sta_self_req->tx_aggregation_size = qos_aggr->tx_aggregation_size;
add_sta_self_req->tx_aggregation_size_be =
qos_aggr->tx_aggregation_size_be;
add_sta_self_req->tx_aggregation_size_bk =
qos_aggr->tx_aggregation_size_bk;
add_sta_self_req->tx_aggregation_size_vi =
qos_aggr->tx_aggregation_size_vi;
add_sta_self_req->tx_aggregation_size_vo =
qos_aggr->tx_aggregation_size_vo;
add_sta_self_req->rx_aggregation_size = qos_aggr->rx_aggregation_size;
add_sta_self_req->tx_aggr_sw_retry_threshold_be =
qos_aggr->tx_aggr_sw_retry_threshold_be;
add_sta_self_req->tx_aggr_sw_retry_threshold_bk =
qos_aggr->tx_aggr_sw_retry_threshold_bk;
add_sta_self_req->tx_aggr_sw_retry_threshold_vi =
qos_aggr->tx_aggr_sw_retry_threshold_vi;
add_sta_self_req->tx_aggr_sw_retry_threshold_vo =
qos_aggr->tx_aggr_sw_retry_threshold_vo;
add_sta_self_req->tx_aggr_sw_retry_threshold =
qos_aggr->tx_aggr_sw_retry_threshold;
add_sta_self_req->tx_non_aggr_sw_retry_threshold_be =
qos_aggr->tx_non_aggr_sw_retry_threshold_be;
add_sta_self_req->tx_non_aggr_sw_retry_threshold_bk =
qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
add_sta_self_req->tx_non_aggr_sw_retry_threshold_vi =
qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
add_sta_self_req->tx_non_aggr_sw_retry_threshold_vo =
qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
add_sta_self_req->tx_non_aggr_sw_retry_threshold =
qos_aggr->tx_non_aggr_sw_retry_threshold;
add_sta_self_req->enable_bcast_probe_rsp =
mac->mlme_cfg->oce.enable_bcast_probe_rsp;
add_sta_self_req->fils_max_chan_guard_time =
mac->mlme_cfg->sta.fils_max_chan_guard_time;
add_sta_self_req->pkt_err_disconn_th =
mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh;
add_sta_self_req->oce_feature_bitmap =
mac->mlme_cfg->oce.feature_bitmap;
msg.type = WMA_ADD_STA_SELF_REQ;
msg.reserved = 0;
msg.bodyptr = add_sta_self_req;
msg.bodyval = 0;
sme_debug(
"Send WMA_ADD_STA_SELF_REQ for selfMac=" QDF_MAC_ADDR_STR,
QDF_MAC_ADDR_ARRAY(add_sta_self_req->self_mac_addr));
status = scheduler_post_message(QDF_MODULE_ID_SME,
QDF_MODULE_ID_WMA,
QDF_MODULE_ID_WMA, &msg);
if (status != QDF_STATUS_SUCCESS) {
sme_err("wma_post_ctrl_msg failed");
qdf_mem_free(add_sta_self_req);
add_sta_self_req = NULL;
}
return status; return status;
} }
QDF_STATUS csr_roam_open_session(struct mac_context *mac_ctx, QDF_STATUS csr_create_vdev(struct mac_context *mac_ctx,
struct sme_session_params *session_param) struct wlan_objmgr_vdev *vdev,
struct sme_session_params *session_param)
{ {
QDF_STATUS status; QDF_STATUS status;
uint32_t existing_session_id; uint32_t existing_session_id;
struct mlme_ht_capabilities_info *ht_cap_info; struct mlme_ht_capabilities_info *ht_cap_info;
struct csr_roam_session *session; struct csr_roam_session *session;
struct mlme_vht_capabilities_info *vht_cap_info; struct mlme_vht_capabilities_info *vht_cap_info;
struct vdev_mlme_obj *vdev_mlme;
enum QDF_OPMODE op_mode;
if (!(mac_ctx->mlme_cfg)) { if (!(mac_ctx->mlme_cfg)) {
pe_err("invalid mlme cfg"); sme_err("invalid mlme cfg");
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info; vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
sme_err("Failed to get cmpt obj");
return QDF_STATUS_E_FAILURE;
}
op_mode = wlan_vdev_mlme_get_opmode(vdev);
csr_get_vdev_type_nss(mac_ctx, op_mode,
&vdev_mlme->proto.generic.nss_2g,
&vdev_mlme->proto.generic.nss_5g);
status = cds_get_vdev_types(op_mode,
&vdev_mlme->mgmt.generic.type,
&vdev_mlme->mgmt.generic.subtype);
if (QDF_IS_STATUS_ERROR(status)) {
sme_err("Get vdev type failed; status:%d", status);
return status;
}
/* check to see if the mac address already belongs to a session */ /* check to see if the mac address already belongs to a session */
status = csr_roam_get_session_id_from_bssid(mac_ctx, status = csr_roam_get_session_id_from_bssid(mac_ctx,
(struct qdf_mac_addr *)session_param->self_mac_addr, (struct qdf_mac_addr *)session_param->self_mac_addr,
@@ -17013,22 +17007,22 @@ QDF_STATUS csr_roam_open_session(struct mac_context *mac_ctx,
} }
/* attempt to retrieve session for Id */ /* attempt to retrieve session for Id */
session = CSR_GET_SESSION(mac_ctx, session_param->sme_session_id); session = CSR_GET_SESSION(mac_ctx, session_param->vdev_id);
if (!session) { if (!session) {
sme_err("Session does not exist for interface %d", sme_err("Session does not exist for interface %d",
session_param->sme_session_id); session_param->vdev_id);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
/* check to see if the session is already active */ /* check to see if the session is already active */
if (session->sessionActive) { if (session->sessionActive) {
sme_err("Cannot re-open active session with Id %d", sme_err("Cannot re-open active session with Id %d",
session_param->sme_session_id); session_param->vdev_id);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
session->sessionActive = true; session->sessionActive = true;
session->sessionId = session_param->sme_session_id; session->sessionId = session_param->vdev_id;
/* Initialize FT related data structures only in STA mode */ /* Initialize FT related data structures only in STA mode */
sme_ft_open(MAC_HANDLE(mac_ctx), session->sessionId); sme_ft_open(MAC_HANDLE(mac_ctx), session->sessionId);
@@ -17095,13 +17089,9 @@ QDF_STATUS csr_roam_open_session(struct mac_context *mac_ctx,
* Do not advertise requester role for SAP & responder role * Do not advertise requester role for SAP & responder role
* for STA * for STA
*/ */
csr_init_session_twt_cap(session, session_param->type_of_persona); csr_init_session_twt_cap(session, vdev_mlme->mgmt.generic.type);
return csr_issue_add_sta_for_session_req(mac_ctx, return csr_issue_vdev_create_req(mac_ctx, session->sessionId);
session_param->sme_session_id,
session_param->self_mac_addr,
session_param->type_of_persona,
session_param->subtype_of_persona);
} }
QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac_ctx, QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac_ctx,

View File

@@ -248,6 +248,17 @@ csr_roam_save_connected_information(struct mac_context *mac,
void csr_roam_check_for_link_status_change(struct mac_context *mac, void csr_roam_check_for_link_status_change(struct mac_context *mac,
tSirSmeRsp *pSirMsg); tSirSmeRsp *pSirMsg);
/**
* csr_vdev_create_resp() - Vdev create response handler
* @mac_ctx: global mac context
* @pMsg: pointer to response data
*
* This API handles vdev create response.
*
* Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE
*/
QDF_STATUS csr_vdev_create_resp(struct mac_context *mac, uint8_t *pmsg);
QDF_STATUS csr_roam_issue_start_bss(struct mac_context *mac, uint32_t sessionId, QDF_STATUS csr_roam_issue_start_bss(struct mac_context *mac, uint32_t sessionId,
struct csr_roamstart_bssparams *pParam, struct csr_roamstart_bssparams *pParam,
struct csr_roam_profile *pProfile, struct csr_roam_profile *pProfile,
@@ -355,8 +366,6 @@ QDF_STATUS csr_save_to_channel_power2_g_5_g(struct mac_context *mac,
*channelTable); *channelTable);
QDF_STATUS csr_roam_set_key(struct mac_context *mac, uint32_t sessionId, QDF_STATUS csr_roam_set_key(struct mac_context *mac, uint32_t sessionId,
tCsrRoamSetKey *pSetKey, uint32_t roamId); tCsrRoamSetKey *pSetKey, uint32_t roamId);
QDF_STATUS csr_roam_open_session(struct mac_context *mac,
struct sme_session_params *session_param);
QDF_STATUS csr_roam_close_session(struct mac_context *mac_ctx, QDF_STATUS csr_roam_close_session(struct mac_context *mac_ctx,
uint32_t session_id, bool sync); uint32_t session_id, bool sync);
void csr_cleanup_session(struct mac_context *mac, uint32_t sessionId); void csr_cleanup_session(struct mac_context *mac, uint32_t sessionId);
@@ -1017,6 +1026,17 @@ uint8_t
csr_scan_get_channel_for_hw_mode_change( csr_scan_get_channel_for_hw_mode_change(
struct mac_context *mac_ctx, uint32_t session_id, struct mac_context *mac_ctx, uint32_t session_id,
struct csr_roam_profile *profile); struct csr_roam_profile *profile);
/**
* csr_create_vdev() - API to create vdev
* @mac_ctx: pointer to mac context
* @vdev: vdev object
* @session_param: Session params
*
* Returns: QDF_STATUS
*/
QDF_STATUS csr_create_vdev(struct mac_context *mac,
struct wlan_objmgr_vdev *vdev,
struct sme_session_params *session_param);
#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
/** /**

View File

@@ -266,23 +266,44 @@ void wma_process_pdev_hw_mode_trans_ind(void *wma,
*/ */
QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle, QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle,
uint32_t cts2self_for_p2p_go); uint32_t cts2self_for_p2p_go);
QDF_STATUS wma_set_tx_rx_aggregation_size
(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size);
/** /**
* wma_set_tx_rx_aggregation_size_per_ac() - set aggregation size per ac * wma_set_tx_rx_aggr_size() - set tx rx aggregation size
* @tx_rx_aggregation_size: the parameter for aggregation size * @vdev_id: vdev id
* @tx_size: tx aggr size
* @rx_size: rx aggr size
* @aggr_type: aggregation type
* *
* This function try to set the aggregation size per AC. * This function try to set the aggregation size.
* *
* Return: QDF_STATUS enumeration * Return: QDF_STATUS enumeration
*/ */
QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size); uint32_t tx_size,
uint32_t rx_size,
wmi_vdev_custom_aggr_type_t aggr_type);
/**
* wma_set_tx_rx_aggr_size_per_ac() - set aggregation size per ac
* @wma_handle: pointer to wma handle.
* @vdev_id: vdev_id
* @qos_aggr: QoS data
* @aggr_type: aggregation type
*
* This function try to set the aggregation size per AC.
*
* Return: QDF_STATUS enumeration
*/
QDF_STATUS
wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE wma_handle,
uint8_t vdev_id,
struct wlan_mlme_qos *qos_aggr,
wmi_vdev_custom_aggr_type_t aggr_type);
/** /**
* wma_set_sw_retry_threshold_per_ac() - set sw retry threshold per AC for tx * wma_set_sw_retry_threshold_per_ac() - set sw retry threshold per AC for tx
* @handle: wma handle * @handle: wma handle
* @tx_sw_retry_threshold: value needs to set to firmware * @vdev_id: vdev id
* @qos_aggr: pointer to QOS TX/RX aggregation values
* *
* This function sends WMI command to set the sw retry threshold per AC * This function sends WMI command to set the sw retry threshold per AC
* for Tx. * for Tx.
@@ -291,19 +312,20 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac
*/ */
QDF_STATUS wma_set_sw_retry_threshold_per_ac QDF_STATUS wma_set_sw_retry_threshold_per_ac
(WMA_HANDLE handle, (WMA_HANDLE handle,
struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold); uint8_t vdev_id, struct wlan_mlme_qos *qos_aggr);
/** /**
* wma_set_sw_retry_threshold() - set sw retry threshold for tx * wma_set_sw_retry_threshold() - set sw retry threshold for tx
* @vdev_id: vdev * @vdev_id: vdev
* @retry: retry number * @retry: retry number
* @param: for aggregation or non-aggregation * @param_id: aggregrate sw retry threshold param id
* *
* This function sends WMI command to set the sw retry threshold for Tx. * This function sends WMI command to set the sw retry threshold for Tx.
* *
* Return: QDF_STATUS. * Return: QDF_STATUS.
*/ */
QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry, QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry,
uint32_t param); uint32_t param_id);
/** /**
* wma_get_sar_limit() - get SAR limits from the target * wma_get_sar_limit() - get SAR limits from the target
* @handle: wma handle * @handle: wma handle
@@ -576,6 +598,17 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme,
*/ */
QDF_STATUS wma_sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, QDF_STATUS wma_sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data); uint16_t data_len, void *data);
/**
* wma_post_vdev_create_setup() - Post vdev create setup
* @vdev: vdev obj
*
* This API is invoked after vded is created to perform post
* vdev create operations i.e. creating peer and setting vdev params.
*
* Return: SUCCESS on successful post vdev operations, FAILURE, if it
* fails due to any
*/
QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev);
/** /**
* wma_mon_mlme_vdev_start_continue() - VDEV start response handling * wma_mon_mlme_vdev_start_continue() - VDEV start response handling

View File

@@ -875,60 +875,13 @@ typedef struct sMaxTxPowerPerBandParams {
} tMaxTxPowerPerBandParams, *tpMaxTxPowerPerBandParams; } tMaxTxPowerPerBandParams, *tpMaxTxPowerPerBandParams;
/** /**
* struct add_sta_self_params - Add Sta Self params * struct vdev_create_req_param - vdev create request params
* @self_mac_addr: self MAC Address * @vdev_id: vdev_id
* @curr_device_mode: operating device mode
* @type: Vdev Type
* @sub_type: Vdev Sub Type
* @session_id: SME Session ID
* @nss_2g: vdev nss in 2.4G
* @nss_5g: vdev nss in 5G
* @status: response status code * @status: response status code
* @tx_aggregation_size: Tx aggregation size
* @rx_aggregation_size: Rx aggregation size
* @enable_bcast_probe_rsp: enable broadcast probe response
* @fils_max_chan_guard_time: FILS max channel guard time
* @pkt_err_disconn_th: packet drop threshold
* @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for be
* @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for bk
* @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for vi
* @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for vo
* @tx_aggr_sw_retry_threshold: aggr sw retry threshold
* @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for be
* @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for bk
* @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for vi
* @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for vo
* @tx_non_aggr_sw_retry_threshold: non aggr sw retry threshold
*/ */
struct add_sta_self_params { struct vdev_create_req_param {
tSirMacAddr self_mac_addr; uint32_t vdev_id;
enum QDF_OPMODE curr_device_mode; QDF_STATUS status;
uint32_t type;
uint32_t sub_type;
uint8_t session_id;
uint8_t nss_2g;
uint8_t nss_5g;
uint32_t status;
uint32_t tx_aggregation_size;
uint32_t tx_aggregation_size_be;
uint32_t tx_aggregation_size_bk;
uint32_t tx_aggregation_size_vi;
uint32_t tx_aggregation_size_vo;
uint32_t rx_aggregation_size;
bool enable_bcast_probe_rsp;
uint8_t fils_max_chan_guard_time;
uint16_t pkt_err_disconn_th;
uint8_t oce_feature_bitmap;
uint32_t tx_aggr_sw_retry_threshold_be;
uint32_t tx_aggr_sw_retry_threshold_bk;
uint32_t tx_aggr_sw_retry_threshold_vi;
uint32_t tx_aggr_sw_retry_threshold_vo;
uint32_t tx_aggr_sw_retry_threshold;
uint32_t tx_non_aggr_sw_retry_threshold_be;
uint32_t tx_non_aggr_sw_retry_threshold_bk;
uint32_t tx_non_aggr_sw_retry_threshold_vi;
uint32_t tx_non_aggr_sw_retry_threshold_vo;
uint32_t tx_non_aggr_sw_retry_threshold;
}; };
/** /**

View File

@@ -641,10 +641,6 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event);
int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
uint32_t len); uint32_t len);
struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
struct add_sta_self_params *self_sta_req,
uint8_t generateRsp);
QDF_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req, QDF_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req,
bool isRestart); bool isRestart);

View File

@@ -116,7 +116,6 @@
#define WMA_ADD_STA_REQ SIR_HAL_ADD_STA_REQ #define WMA_ADD_STA_REQ SIR_HAL_ADD_STA_REQ
#define WMA_ADD_STA_RSP SIR_HAL_ADD_STA_RSP #define WMA_ADD_STA_RSP SIR_HAL_ADD_STA_RSP
#define WMA_ADD_STA_SELF_RSP SIR_HAL_ADD_STA_SELF_RSP
#define WMA_DELETE_STA_REQ SIR_HAL_DELETE_STA_REQ #define WMA_DELETE_STA_REQ SIR_HAL_DELETE_STA_REQ
#define WMA_DELETE_STA_RSP SIR_HAL_DELETE_STA_RSP #define WMA_DELETE_STA_RSP SIR_HAL_DELETE_STA_RSP
#define WMA_ADD_BSS_REQ SIR_HAL_ADD_BSS_REQ #define WMA_ADD_BSS_REQ SIR_HAL_ADD_BSS_REQ
@@ -208,7 +207,6 @@
#ifdef WLAN_NS_OFFLOAD #ifdef WLAN_NS_OFFLOAD
#define WMA_SET_NS_OFFLOAD SIR_HAL_SET_NS_OFFLOAD #define WMA_SET_NS_OFFLOAD SIR_HAL_SET_NS_OFFLOAD
#endif /* WLAN_NS_OFFLOAD */ #endif /* WLAN_NS_OFFLOAD */
#define WMA_ADD_STA_SELF_REQ SIR_HAL_ADD_STA_SELF_REQ
#define WMA_DEL_STA_SELF_REQ SIR_HAL_DEL_STA_SELF_REQ #define WMA_DEL_STA_SELF_REQ SIR_HAL_DEL_STA_SELF_REQ
#ifdef FEATURE_WLAN_TDLS #ifdef FEATURE_WLAN_TDLS

View File

@@ -188,45 +188,6 @@ struct cdp_vdev *wma_find_vdev_by_bssid(tp_wma_handle wma, uint8_t *bssid,
return NULL; return NULL;
} }
/**
* wma_get_txrx_vdev_type() - return operating mode of vdev
* @type: vdev_type
*
* Return: return operating mode as enum wlan_op_mode type
*/
static enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
{
enum wlan_op_mode vdev_type = wlan_op_mode_unknown;
switch (type) {
case WMI_VDEV_TYPE_AP:
vdev_type = wlan_op_mode_ap;
break;
case WMI_VDEV_TYPE_STA:
vdev_type = wlan_op_mode_sta;
break;
#ifdef QCA_IBSS_SUPPORT
case WMI_VDEV_TYPE_IBSS:
vdev_type = wlan_op_mode_ibss;
break;
#endif /* QCA_IBSS_SUPPORT */
case WMI_VDEV_TYPE_OCB:
vdev_type = wlan_op_mode_ocb;
break;
case WMI_VDEV_TYPE_MONITOR:
vdev_type = wlan_op_mode_monitor;
break;
case WMI_VDEV_TYPE_NDI:
vdev_type = wlan_op_mode_ndi;
break;
default:
WMA_LOGE("Invalid vdev type %u", type);
vdev_type = wlan_op_mode_unknown;
}
return vdev_type;
}
/** /**
* wma_find_req_on_timer_expiry() - find request by address * wma_find_req_on_timer_expiry() - find request by address
* @wma: wma handle * @wma: wma handle
@@ -692,13 +653,12 @@ error:
static void static void
wma_cdp_vdev_detach(ol_txrx_soc_handle soc, wma_cdp_vdev_detach(ol_txrx_soc_handle soc,
tp_wma_handle wma_handle, tp_wma_handle wma_handle,
uint8_t vdev_id) uint8_t vdev_id)
{ {
struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id]; struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
cdp_vdev_detach(soc, cdp_vdev_detach(soc, iface->handle, NULL, NULL);
iface->handle, NULL, NULL);
iface->handle = NULL; iface->handle = NULL;
} }
@@ -769,7 +729,7 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
goto out; goto out;
} }
WMA_LOGD("vdev_id:%hu vdev_hdl:%pK", vdev_id, iface->handle); WMA_LOGD("vdev_id:%hu", vdev_id);
if (!generate_rsp) { if (!generate_rsp) {
WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id); WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
goto out; goto out;
@@ -793,6 +753,7 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION); WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
} }
WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id); WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
wlan_vdev_set_dp_handle(iface->vdev, NULL);
wma_release_vdev_ref(iface); wma_release_vdev_ref(iface);
wma_cdp_vdev_detach(soc, wma_handle, vdev_id); wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
@@ -807,6 +768,7 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
out: out:
WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u", WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u",
vdev_id, generate_rsp); vdev_id, generate_rsp);
wlan_vdev_set_dp_handle(iface->vdev, NULL);
wma_release_vdev_ref(iface); wma_release_vdev_ref(iface);
wma_cdp_vdev_detach(soc, wma_handle, vdev_id); wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
@@ -981,6 +943,7 @@ QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
* CDP Vdev. * CDP Vdev.
*/ */
if (!cds_is_target_ready()) { if (!cds_is_target_ready()) {
wlan_vdev_set_dp_handle(iface->vdev, NULL);
wma_release_vdev_and_peer_ref(wma_handle, iface); wma_release_vdev_and_peer_ref(wma_handle, iface);
wma_cdp_vdev_detach(soc, wma_handle, vdev_id); wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
goto send_rsp; goto send_rsp;
@@ -1527,7 +1490,7 @@ wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
param.if_id = if_id; param.vdev_id = if_id;
param.param_id = param_id; param.param_id = param_id;
param.param_value = param_value; param.param_value = param_value;
@@ -1564,16 +1527,19 @@ QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
{ {
tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx; tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
struct peer_set_params param = {0}; struct peer_set_params param = {0};
int err; QDF_STATUS status;
param.vdev_id = vdev_id; param.vdev_id = vdev_id;
param.param_value = param_value; param.param_value = param_value;
param.param_id = param_id; param.param_id = param_id;
err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr, status = wmi_set_peer_param_send(wma_handle->wmi_handle,
&param); peer_addr,
&param);
return err; if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("vdev_id: %d peer set failed, id %d, val %d",
vdev_id, param_id, param_value);
return status;
} }
/** /**
@@ -2675,280 +2641,174 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
return 0; return 0;
} }
/** QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
* wma_vdev_attach() - create vdev in fw
* @wma_handle: wma handle
* @self_sta_req: self sta request
* @generateRsp: generate response
*
* This function creates vdev in target and
* attach this vdev to txrx module. It also set
* vdev related params to fw.
*
* Return: txrx vdev handle
*/
struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
struct add_sta_self_params *self_sta_req,
uint8_t generateRsp)
{ {
struct cdp_vdev *txrx_vdev_handle = NULL; struct cdp_vdev *txrx_vdev_handle = NULL;
struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX); struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
enum wlan_op_mode txrx_vdev_type;
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE); struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
uint32_t cfg_val; uint32_t cfg_val;
uint8_t mcc_adapt_sch; uint8_t mcc_adapt_sch;
QDF_STATUS ret; QDF_STATUS ret;
struct mlme_ht_capabilities_info *ht_cap_info; struct mlme_ht_capabilities_info *ht_cap_info;
struct scheduler_msg sme_msg = { 0 };
struct vdev_create_params params = { 0 };
u_int8_t vdev_id; u_int8_t vdev_id;
struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
struct sir_set_tx_sw_retry_threshold tx_sw_retry_threshold;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct wlan_objmgr_peer *obj_peer; struct wlan_objmgr_peer *obj_peer;
struct wlan_objmgr_vdev *vdev; struct wlan_mlme_qos *qos_aggr;
uint32_t retry; struct vdev_mlme_obj *vdev_mlme;
tp_wma_handle wma_handle;
qdf_mem_zero(&tx_rx_aggregation_size, sizeof(tx_rx_aggregation_size));
WMA_LOGD("mac %pM, vdev_id %hu, type %d, sub_type %d, nss 2g %d, 5g %d",
self_sta_req->self_mac_addr, self_sta_req->session_id,
self_sta_req->type, self_sta_req->sub_type,
self_sta_req->nss_2g, self_sta_req->nss_5g);
if (!mac) { if (!mac) {
WMA_LOGE("%s: Failed to get mac", __func__); WMA_LOGE("%s: Failed to get mac", __func__);
status = QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
goto end;
} }
vdev_id = self_sta_req->session_id; wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (wma_is_vdev_valid(vdev_id)) { if (!wma_handle) {
WMA_LOGE("%s: vdev %d already active", __func__, vdev_id); WMA_LOGE("%s: WMA context is invalid", __func__);
status = QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
goto end;
} }
params.if_id = self_sta_req->session_id; if (!soc) {
params.type = self_sta_req->type; WMA_LOGE("%s: SOC context is invalid", __func__);
params.subtype = self_sta_req->sub_type; return QDF_STATUS_E_FAILURE;
params.nss_2g = self_sta_req->nss_2g;
params.nss_5g = self_sta_req->nss_5g;
/* Create a vdev in target */
ret = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
self_sta_req->self_mac_addr,
&params);
if (QDF_IS_STATUS_ERROR(ret)) {
WMA_LOGE("%s: Unable to add an interface for ath_dev",
__func__);
status = QDF_STATUS_E_FAILURE;
goto end;
} }
txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type); if (wlan_objmgr_vdev_try_get_ref(vdev, WLAN_LEGACY_WMA_ID) !=
QDF_STATUS_SUCCESS)
return QDF_STATUS_E_FAILURE;
if (wlan_op_mode_unknown == txrx_vdev_type) { vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
WMA_LOGE("Failed to get txrx vdev type"); if (!vdev_mlme) {
wmi_unified_vdev_delete_send(wma_handle->wmi_handle, WMA_LOGE("%s: Failed to get vdev mlme obj!", __func__);
self_sta_req->session_id); return QDF_STATUS_E_FAILURE;
status = QDF_STATUS_E_FAILURE;
goto end;
} }
txrx_vdev_handle = cdp_vdev_attach(soc, txrx_pdev, vdev_id = wlan_vdev_get_id(vdev);
self_sta_req->self_mac_addr, txrx_vdev_handle = wlan_vdev_get_dp_handle(vdev);
vdev_id, txrx_vdev_type);
WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %pK", vdev_id,
txrx_vdev_handle);
if (!txrx_vdev_handle) {
WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
status = QDF_STATUS_E_FAILURE;
wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
self_sta_req->session_id);
goto end;
}
wma_handle->interfaces[vdev_id].vdev_active = true; wma_handle->interfaces[vdev_id].vdev_active = true;
wma_handle->interfaces[vdev_id].handle = txrx_vdev_handle; wma_handle->interfaces[vdev_id].handle = txrx_vdev_handle;
wma_vdev_update_pause_bitmap(vdev_id, 0); wma_vdev_update_pause_bitmap(vdev_id, 0);
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma_handle->psoc, vdev_id,
WLAN_LEGACY_WMA_ID);
if (!vdev) {
WMA_LOGE(FL("vdev obj is NULL for vdev_id: %u"), vdev_id);
status = QDF_STATUS_E_FAILURE;
wma_handle->interfaces[vdev_id].vdev_active = false;
wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
goto end;
}
wma_handle->interfaces[vdev_id].vdev = vdev; wma_handle->interfaces[vdev_id].vdev = vdev;
wma_handle->interfaces[vdev_id].type =
vdev_mlme->mgmt.generic.type;
wma_handle->interfaces[vdev_id].sub_type =
vdev_mlme->mgmt.generic.subtype;
qdf_mem_copy(wma_handle->interfaces[vdev_id].addr, qdf_mem_copy(wma_handle->interfaces[vdev_id].addr,
self_sta_req->self_mac_addr, vdev->vdev_mlme.macaddr,
sizeof(wma_handle->interfaces[vdev_id].addr)); sizeof(wma_handle->interfaces[vdev_id].addr));
tx_rx_aggregation_size.tx_aggregation_size = qos_aggr = &mac->mlme_cfg->qos_mlme_params;
self_sta_req->tx_aggregation_size; status = wma_set_tx_rx_aggr_size(vdev_id, qos_aggr->tx_aggregation_size,
tx_rx_aggregation_size.rx_aggregation_size = qos_aggr->rx_aggregation_size,
self_sta_req->rx_aggregation_size; WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
tx_rx_aggregation_size.vdev_id = self_sta_req->session_id; if (QDF_IS_STATUS_ERROR(status))
tx_rx_aggregation_size.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU; WMA_LOGE("failed to set aggregation sizes(status = %d)",
status);
ret = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size); if (wma_vdev_uses_self_peer(vdev_mlme->mgmt.generic.type,
if (QDF_IS_STATUS_ERROR(ret)) vdev_mlme->mgmt.generic.subtype)) {
WMA_LOGE("failed to set aggregation sizes(err=%d)", ret); ret = wma_create_peer(wma_handle, txrx_pdev, txrx_vdev_handle,
vdev->vdev_mlme.macaddr,
WMI_PEER_TYPE_DEFAULT,
vdev_id, false);
if (QDF_IS_STATUS_ERROR(ret)) {
WMA_LOGE("%s: Failed to create peer", __func__);
goto end;
}
} else if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA) {
status = wma_set_tx_rx_aggr_size_per_ac(
wma_handle, vdev_id,
qos_aggr,
WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
tx_rx_aggregation_size.tx_aggregation_size_be = if (QDF_IS_STATUS_ERROR(status))
self_sta_req->tx_aggregation_size_be; WMA_LOGE("failed to set aggr size per ac(status = %d)",
tx_rx_aggregation_size.tx_aggregation_size_bk = status);
self_sta_req->tx_aggregation_size_bk;
tx_rx_aggregation_size.tx_aggregation_size_vi =
self_sta_req->tx_aggregation_size_vi;
tx_rx_aggregation_size.tx_aggregation_size_vo =
self_sta_req->tx_aggregation_size_vo;
tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_be = wma_set_sta_keep_alive(
self_sta_req->tx_aggr_sw_retry_threshold_be; wma_handle, vdev_id,
tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk = SIR_KEEP_ALIVE_NULL_PKT,
self_sta_req->tx_aggr_sw_retry_threshold_bk; mac->mlme_cfg->sta.sta_keep_alive_period,
tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi = NULL, NULL, NULL);
self_sta_req->tx_aggr_sw_retry_threshold_vi;
tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo =
self_sta_req->tx_aggr_sw_retry_threshold_vo;
tx_sw_retry_threshold.tx_aggr_sw_retry_threshold =
self_sta_req->tx_aggr_sw_retry_threshold;
tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_be =
self_sta_req->tx_non_aggr_sw_retry_threshold_be;
tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_bk =
self_sta_req->tx_non_aggr_sw_retry_threshold_bk;
tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vi =
self_sta_req->tx_non_aggr_sw_retry_threshold_vi;
tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vo =
self_sta_req->tx_non_aggr_sw_retry_threshold_vo;
tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold =
self_sta_req->tx_non_aggr_sw_retry_threshold;
tx_sw_retry_threshold.vdev_id = self_sta_req->session_id;
switch (self_sta_req->type) {
case WMI_VDEV_TYPE_STA:
ret = wma_set_tx_rx_aggregation_size_per_ac(
&tx_rx_aggregation_size);
if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("set aggr sizes per ac(err=%d) failed", ret);
cfg_val = mac->mlme_cfg->sta.sta_keep_alive_period;
wma_set_sta_keep_alive(wma_handle,
self_sta_req->session_id,
SIR_KEEP_ALIVE_NULL_PKT,
cfg_val, NULL, NULL, NULL);
/* offload STA SA query related params to fwr */ /* offload STA SA query related params to fwr */
if (wmi_service_enabled(wma_handle->wmi_handle, if (wmi_service_enabled(wma_handle->wmi_handle,
wmi_service_sta_pmf_offload)) { wmi_service_sta_pmf_offload)) {
wma_set_sta_sa_query_param(wma_handle, vdev_id); wma_set_sta_sa_query_param(wma_handle, vdev_id);
} }
vdev_id = tx_sw_retry_threshold.vdev_id; status = wma_set_sw_retry_threshold(
retry = tx_sw_retry_threshold.tx_aggr_sw_retry_threshold; vdev_id,
if (retry) { qos_aggr->tx_aggr_sw_retry_threshold,
ret = wma_set_sw_retry_threshold(vdev_id, retry,
WMI_PDEV_PARAM_AGG_SW_RETRY_TH); WMI_PDEV_PARAM_AGG_SW_RETRY_TH);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed set agg retry threshold"); WMA_LOGE("failed to set sw retry threshold (status = %d)",
} status);
retry = tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold; status = wma_set_sw_retry_threshold(
if (retry) { vdev_id,
ret = wma_set_sw_retry_threshold(vdev_id, retry, qos_aggr->tx_non_aggr_sw_retry_threshold,
WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH); WMI_PDEV_PARAM_AGG_SW_RETRY_TH);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed set non-agg retry threshold"); WMA_LOGE("failed to set sw retry threshold tx non aggr(status = %d)",
} status);
ret = wma_set_sw_retry_threshold_per_ac(wma_handle, status = wma_set_sw_retry_threshold_per_ac(wma_handle, vdev_id,
&tx_sw_retry_threshold); qos_aggr);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed to set retry threshold(err=%d)", ret); WMA_LOGE("failed to set sw retry threshold per ac(status = %d)",
break; status);
}
wma_handle->interfaces[vdev_id].type = self_sta_req->type;
wma_handle->interfaces[vdev_id].sub_type = self_sta_req->sub_type;
qdf_atomic_init(&wma_handle->interfaces[vdev_id].bss_status);
if (wma_vdev_uses_self_peer(self_sta_req->type,
self_sta_req->sub_type)) {
ret = wma_create_peer(wma_handle, txrx_pdev, txrx_vdev_handle,
self_sta_req->self_mac_addr,
WMI_PEER_TYPE_DEFAULT,
self_sta_req->session_id, false);
if (QDF_IS_STATUS_ERROR(ret)) {
WMA_LOGE("%s: Failed to create peer", __func__);
status = QDF_STATUS_E_FAILURE;
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
self_sta_req->session_id);
wma_handle->interfaces[vdev_id].vdev_active = false;
wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
wma_handle->interfaces[vdev_id].vdev = NULL;
txrx_vdev_handle = NULL;
goto end;
}
} else if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
obj_peer = wma_create_objmgr_peer(wma_handle, vdev_id, obj_peer = wma_create_objmgr_peer(wma_handle, vdev_id,
self_sta_req->self_mac_addr, vdev->vdev_mlme.macaddr,
WMI_PEER_TYPE_DEFAULT); WMI_PEER_TYPE_DEFAULT);
if (!obj_peer) { if (!obj_peer) {
WMA_LOGE("%s: Failed to create obj mgr peer for self sta", WMA_LOGE("%s: Failed to create obj mgr peer for self sta",
__func__); __func__);
status = QDF_STATUS_E_FAILURE;
wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
self_sta_req->session_id);
wma_handle->interfaces[vdev_id].vdev_active = false;
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
wma_handle->interfaces[vdev_id].vdev = NULL;
wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
txrx_vdev_handle = NULL;
goto end; goto end;
} }
} }
WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d", WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
self_sta_req->pkt_err_disconn_th); mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh);
ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id, status = wma_vdev_set_param(
WMI_VDEV_PARAM_DISCONNECT_TH, wma_handle->wmi_handle, vdev_id,
self_sta_req->pkt_err_disconn_th); WMI_VDEV_PARAM_DISCONNECT_TH,
if (ret) mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh);
WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH"); if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed to set DISCONNECT_TH(status = %d)", status);
ret = wma_vdev_set_param(wma_handle->wmi_handle, status = wma_vdev_set_param(
self_sta_req->session_id, wma_handle->wmi_handle,
WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE, vdev_id,
mac->roam.configParam.mcc_rts_cts_prot_enable); WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
if (QDF_IS_STATUS_ERROR(ret)) mac->roam.configParam.mcc_rts_cts_prot_enable);
WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE"); if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed to set MCC_RTSCTS_PROTECTION_ENABLE(status = %d)",
status);
ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id, status = wma_vdev_set_param(
wma_handle->wmi_handle, vdev_id,
WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE, WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
mac->roam.configParam.mcc_bcast_prob_resp_enable); mac->roam.configParam.mcc_bcast_prob_resp_enable);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE"); WMA_LOGE("failed to set MCC_BROADCAST_PROBE_ENABLE(status = %d)",
status);
if (wlan_mlme_get_rts_threshold(mac->psoc, if (wlan_mlme_get_rts_threshold(mac->psoc,
&cfg_val) == &cfg_val) ==
QDF_STATUS_SUCCESS) { QDF_STATUS_SUCCESS) {
ret = wma_vdev_set_param(wma_handle->wmi_handle, status = wma_vdev_set_param(wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_RTS_THRESHOLD, WMI_VDEV_PARAM_RTS_THRESHOLD,
cfg_val); cfg_val);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD"); WMA_LOGE("failed to set RTS_THRESHOLD(status = %d)",
status);
} else { } else {
WMA_LOGE("Fail to get val for rts threshold, leave unchanged"); WMA_LOGE("Fail to get val for rts threshold, leave unchanged");
} }
@@ -2956,27 +2816,23 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
if (wlan_mlme_get_frag_threshold(mac->psoc, if (wlan_mlme_get_frag_threshold(mac->psoc,
&cfg_val) == &cfg_val) ==
QDF_STATUS_SUCCESS) { QDF_STATUS_SUCCESS) {
ret = wma_vdev_set_param(wma_handle->wmi_handle, wma_vdev_set_param(wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD, WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
cfg_val); cfg_val);
if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD");
} else { } else {
WMA_LOGE("Fail to get val for frag threshold, leave unchanged"); WMA_LOGE("Fail to get val for frag threshold, leave unchanged");
} }
ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info; ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info;
status = wma_vdev_set_param(wma_handle->wmi_handle,
vdev_id,
WMI_VDEV_PARAM_TX_STBC,
ht_cap_info->tx_stbc);
if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("failed to set TX_STBC(status = %d)", status);
ret = wma_vdev_set_param(wma_handle->wmi_handle, wma_set_vdev_mgmt_rate(wma_handle, vdev_id);
self_sta_req->session_id,
WMI_VDEV_PARAM_TX_STBC,
ht_cap_info->tx_stbc);
if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) { if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
/* /*
* Enable / disable trigger access for a AP vdev's peers. * Enable / disable trigger access for a AP vdev's peers.
@@ -2994,39 +2850,40 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
* Rx OFDMA trigger receive & UL response * Rx OFDMA trigger receive & UL response
* 6 | UL MUMIMO * 6 | UL MUMIMO
*/ */
ret = wma_vdev_set_param(wma_handle->wmi_handle, status = wma_vdev_set_param(wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_SET_HEMU_MODE, WMI_VDEV_PARAM_SET_HEMU_MODE,
0x37); 0x37);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(status))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_SET_HEMU_MODE"); WMA_LOGE("failed to set HEMU_MODE(status = %d)",
status);
} }
/* Initialize roaming offload state */ /* Initialize roaming offload state */
if ((self_sta_req->type == WMI_VDEV_TYPE_STA) && if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
(self_sta_req->sub_type == 0)) { vdev_mlme->mgmt.generic.subtype == 0) {
/* Pass down enable/disable bcast probe rsp to FW */ /* Pass down enable/disable bcast probe rsp to FW */
ret = wma_vdev_set_param( ret = wma_vdev_set_param(
wma_handle->wmi_handle, wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE, WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
self_sta_req->enable_bcast_probe_rsp); mac->mlme_cfg->oce.enable_bcast_probe_rsp);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE"); WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
/* Pass down the FILS max channel guard time to FW */ /* Pass down the FILS max channel guard time to FW */
ret = wma_vdev_set_param( ret = wma_vdev_set_param(
wma_handle->wmi_handle, wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME, WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
self_sta_req->fils_max_chan_guard_time); mac->mlme_cfg->sta.fils_max_chan_guard_time);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME"); WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
/* Pass down the Probe Request tx delay(in ms) to FW */ /* Pass down the Probe Request tx delay(in ms) to FW */
ret = wma_vdev_set_param( ret = wma_vdev_set_param(
wma_handle->wmi_handle, wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_PROBE_DELAY, WMI_VDEV_PARAM_PROBE_DELAY,
PROBE_REQ_TX_DELAY); PROBE_REQ_TX_DELAY);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(ret))
@@ -3035,37 +2892,35 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
/* Pass down the probe request tx time gap(in ms) to FW */ /* Pass down the probe request tx time gap(in ms) to FW */
ret = wma_vdev_set_param( ret = wma_vdev_set_param(
wma_handle->wmi_handle, wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_REPEAT_PROBE_TIME, WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
PROBE_REQ_TX_TIME_GAP); PROBE_REQ_TX_TIME_GAP);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME"); WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
} }
if ((self_sta_req->type == WMI_VDEV_TYPE_STA || if ((vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA ||
self_sta_req->type == WMI_VDEV_TYPE_AP) && vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_AP) &&
self_sta_req->sub_type == 0) { vdev_mlme->mgmt.generic.subtype == 0) {
ret = wma_vdev_set_param(wma_handle->wmi_handle, wma_vdev_set_param(wma_handle->wmi_handle,
self_sta_req->session_id, vdev_id,
WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES, WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
self_sta_req->oce_feature_bitmap); mac->mlme_cfg->oce.feature_bitmap);
if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
} }
/* Initialize BMISS parameters */ /* Initialize BMISS parameters */
if ((self_sta_req->type == WMI_VDEV_TYPE_STA) && if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
(self_sta_req->sub_type == 0)) vdev_mlme->mgmt.generic.subtype == 0)
wma_roam_scan_bmiss_cnt(wma_handle, wma_roam_scan_bmiss_cnt(wma_handle,
mac->mlme_cfg->lfr.roam_bmiss_first_bcnt, mac->mlme_cfg->lfr.roam_bmiss_first_bcnt,
mac->mlme_cfg->lfr.roam_bmiss_final_bcnt, mac->mlme_cfg->lfr.roam_bmiss_final_bcnt,
self_sta_req->session_id); vdev_id);
if (policy_mgr_get_mcc_adaptive_sch(mac->psoc, if (policy_mgr_get_mcc_adaptive_sch(mac->psoc,
&mcc_adapt_sch) == &mcc_adapt_sch) ==
QDF_STATUS_SUCCESS) { QDF_STATUS_SUCCESS) {
WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d", WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
__func__, mcc_adapt_sch); __func__, mcc_adapt_sch);
ret = ret =
wma_set_enable_disable_mcc_adaptive_scheduler(mcc_adapt_sch); wma_set_enable_disable_mcc_adaptive_scheduler(mcc_adapt_sch);
if (QDF_IS_STATUS_ERROR(ret)) { if (QDF_IS_STATUS_ERROR(ret)) {
@@ -3075,66 +2930,59 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged"); WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
} }
if ((self_sta_req->type == WMI_VDEV_TYPE_STA) && if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
(ucfg_pmo_is_apf_enabled(wma_handle->psoc))) { ucfg_pmo_is_apf_enabled(wma_handle->psoc)) {
ret = wma_config_active_apf_mode(wma_handle, ret = wma_config_active_apf_mode(wma_handle,
self_sta_req->session_id); vdev_id);
if (QDF_IS_STATUS_ERROR(ret)) if (QDF_IS_STATUS_ERROR(ret))
WMA_LOGE("Failed to configure active APF mode"); WMA_LOGE("Failed to configure active APF mode");
} }
cdp_data_tx_cb_set(soc, txrx_vdev_handle,
wma_data_tx_ack_comp_hdlr,
wma_handle);
return QDF_STATUS_SUCCESS;
end: end:
self_sta_req->status = status; wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
wma_handle->interfaces[vdev_id].vdev_active = false;
txrx_vdev_handle = NULL;
#ifdef QCA_IBSS_SUPPORT return QDF_STATUS_E_FAILURE;
if (generateRsp)
#endif
{
sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
sme_msg.bodyptr = self_sta_req;
sme_msg.bodyval = 0;
status = scheduler_post_message(QDF_MODULE_ID_WMA,
QDF_MODULE_ID_SME,
QDF_MODULE_ID_SME, &sme_msg);
if (!QDF_IS_STATUS_SUCCESS(status)) {
WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
qdf_mem_free(self_sta_req);
}
}
return txrx_vdev_handle;
} }
uint32_t wma_get_bcn_rate_code(uint16_t rate) enum mlme_bcn_tx_rate_code wma_get_bcn_rate_code(uint16_t rate)
{ {
/* rate in multiples of 100 Kbps */ /* rate in multiples of 100 Kbps */
switch (rate) { switch (rate) {
case WMA_BEACON_TX_RATE_1_M: case WMA_BEACON_TX_RATE_1_M:
return WMI_BCN_TX_RATE_CODE_1_M; return MLME_BCN_TX_RATE_CODE_1_M;
case WMA_BEACON_TX_RATE_2_M: case WMA_BEACON_TX_RATE_2_M:
return WMI_BCN_TX_RATE_CODE_2_M; return MLME_BCN_TX_RATE_CODE_2_M;
case WMA_BEACON_TX_RATE_5_5_M: case WMA_BEACON_TX_RATE_5_5_M:
return WMI_BCN_TX_RATE_CODE_5_5_M; return MLME_BCN_TX_RATE_CODE_5_5_M;
case WMA_BEACON_TX_RATE_11_M: case WMA_BEACON_TX_RATE_11_M:
return WMI_BCN_TX_RATE_CODE_11M; return MLME_BCN_TX_RATE_CODE_11M;
case WMA_BEACON_TX_RATE_6_M: case WMA_BEACON_TX_RATE_6_M:
return WMI_BCN_TX_RATE_CODE_6_M; return MLME_BCN_TX_RATE_CODE_6_M;
case WMA_BEACON_TX_RATE_9_M: case WMA_BEACON_TX_RATE_9_M:
return WMI_BCN_TX_RATE_CODE_9_M; return MLME_BCN_TX_RATE_CODE_9_M;
case WMA_BEACON_TX_RATE_12_M: case WMA_BEACON_TX_RATE_12_M:
return WMI_BCN_TX_RATE_CODE_12_M; return MLME_BCN_TX_RATE_CODE_12_M;
case WMA_BEACON_TX_RATE_18_M: case WMA_BEACON_TX_RATE_18_M:
return WMI_BCN_TX_RATE_CODE_18_M; return MLME_BCN_TX_RATE_CODE_18_M;
case WMA_BEACON_TX_RATE_24_M: case WMA_BEACON_TX_RATE_24_M:
return WMI_BCN_TX_RATE_CODE_24_M; return MLME_BCN_TX_RATE_CODE_24_M;
case WMA_BEACON_TX_RATE_36_M: case WMA_BEACON_TX_RATE_36_M:
return WMI_BCN_TX_RATE_CODE_36_M; return MLME_BCN_TX_RATE_CODE_36_M;
case WMA_BEACON_TX_RATE_48_M: case WMA_BEACON_TX_RATE_48_M:
return WMI_BCN_TX_RATE_CODE_48_M; return MLME_BCN_TX_RATE_CODE_48_M;
case WMA_BEACON_TX_RATE_54_M: case WMA_BEACON_TX_RATE_54_M:
return WMI_BCN_TX_RATE_CODE_54_M; return MLME_BCN_TX_RATE_CODE_54_M;
default: default:
return WMI_BCN_TX_RATE_CODE_1_M; return MLME_BCN_TX_RATE_CODE_1_M;
} }
} }
@@ -3252,7 +3100,7 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
req->vdev_id); req->vdev_id);
params.vdev_id = req->vdev_id; params.vdev_id = req->vdev_id;
intr[params.vdev_id].chanmode = params.channel.phy_mode; intr[params.vdev_id].chanmode = chan_mode;
intr[params.vdev_id].ht_capable = req->ht_capable; intr[params.vdev_id].ht_capable = req->ht_capable;
intr[params.vdev_id].vht_capable = req->vht_capable; intr[params.vdev_id].vht_capable = req->vht_capable;
intr[params.vdev_id].config.gtx_info.gtxRTMask[0] = intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
@@ -3314,7 +3162,7 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
params.channel.dfs_set = true; params.channel.dfs_set = true;
} }
params.beacon_intval = req->beacon_intval; params.beacon_interval = req->beacon_intval;
params.dtim_period = req->dtim_period; params.dtim_period = req->dtim_period;
if (req->beacon_tx_rate) { if (req->beacon_tx_rate) {
@@ -3339,7 +3187,7 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
/* TODO: Handle regulatory class, max antenna */ /* TODO: Handle regulatory class, max antenna */
if (!isRestart) { if (!isRestart) {
params.beacon_intval = req->beacon_intval; params.beacon_interval = req->beacon_intval;
params.dtim_period = req->dtim_period; params.dtim_period = req->dtim_period;
/* Copy the SSID */ /* Copy the SSID */

View File

@@ -4247,16 +4247,10 @@ QDF_STATUS wma_send_apf_read_work_memory_cmd(WMA_HANDLE handle,
} }
#endif /* FEATURE_WLAN_APF */ #endif /* FEATURE_WLAN_APF */
/** QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
* wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes uint32_t tx_size,
* @tx_rx_aggregation_size: aggregation size parameters uint32_t rx_size,
* wmi_vdev_custom_aggr_type_t aggr_type)
* This function sets tx rx aggregation sizes
*
* Return: QDF_STATUS
*/
QDF_STATUS wma_set_tx_rx_aggregation_size(
struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
{ {
tp_wma_handle wma_handle; tp_wma_handle wma_handle;
wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd; wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
@@ -4267,10 +4261,6 @@ QDF_STATUS wma_set_tx_rx_aggregation_size(
wma_handle = cds_get_context(QDF_MODULE_ID_WMA); wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (!tx_rx_aggregation_size) {
WMA_LOGE("%s: invalid pointer", __func__);
return QDF_STATUS_E_INVAL;
}
if (!wma_handle) { if (!wma_handle) {
WMA_LOGE("%s: WMA context is invald!", __func__); WMA_LOGE("%s: WMA context is invald!", __func__);
@@ -4291,12 +4281,11 @@ QDF_STATUS wma_set_tx_rx_aggregation_size(
WMITLV_GET_STRUCT_TLVLEN( WMITLV_GET_STRUCT_TLVLEN(
wmi_vdev_set_custom_aggr_size_cmd_fixed_param)); wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
cmd->vdev_id = tx_rx_aggregation_size->vdev_id; cmd->vdev_id = vdev_id;
cmd->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size; cmd->tx_aggr_size = tx_size;
cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size; cmd->rx_aggr_size = rx_size;
/* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
if (tx_rx_aggregation_size->aggr_type == if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
cmd->enable_bitmap |= 0x04; cmd->enable_bitmap |= 0x04;
WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d", WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
@@ -4313,10 +4302,11 @@ QDF_STATUS wma_set_tx_rx_aggregation_size(
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac( QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle,
struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size) uint8_t vdev_id,
struct wlan_mlme_qos *qos_aggr,
wmi_vdev_custom_aggr_type_t aggr_type)
{ {
tp_wma_handle wma_handle;
wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd; wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
int32_t len; int32_t len;
wmi_buf_t buf; wmi_buf_t buf;
@@ -4324,23 +4314,17 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac(
int ret; int ret;
int queue_num; int queue_num;
uint32_t tx_aggr_size[4]; uint32_t tx_aggr_size[4];
tp_wma_handle wma_handle = (tp_wma_handle)handle;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (!tx_rx_aggregation_size) {
WMA_LOGE("%s: invalid pointer", __func__);
return QDF_STATUS_E_INVAL;
}
if (!wma_handle) { if (!wma_handle) {
WMA_LOGE("%s: WMA context is invald!", __func__); WMA_LOGE("%s: WMA context is invald!", __func__);
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
tx_aggr_size[0] = tx_rx_aggregation_size->tx_aggregation_size_be; tx_aggr_size[0] = qos_aggr->tx_aggregation_size_be;
tx_aggr_size[1] = tx_rx_aggregation_size->tx_aggregation_size_bk; tx_aggr_size[1] = qos_aggr->tx_aggregation_size_bk;
tx_aggr_size[2] = tx_rx_aggregation_size->tx_aggregation_size_vi; tx_aggr_size[2] = qos_aggr->tx_aggregation_size_vi;
tx_aggr_size[3] = tx_rx_aggregation_size->tx_aggregation_size_vo; tx_aggr_size[3] = qos_aggr->tx_aggregation_size_vo;
for (queue_num = 0; queue_num < 4; queue_num++) { for (queue_num = 0; queue_num < 4; queue_num++) {
if (tx_aggr_size[queue_num] == 0) if (tx_aggr_size[queue_num] == 0)
@@ -4360,16 +4344,13 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac(
WMITLV_GET_STRUCT_TLVLEN( WMITLV_GET_STRUCT_TLVLEN(
wmi_vdev_set_custom_aggr_size_cmd_fixed_param)); wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
cmd->vdev_id = tx_rx_aggregation_size->vdev_id; cmd->vdev_id = vdev_id;
cmd->rx_aggr_size = cmd->rx_aggr_size = qos_aggr->rx_aggregation_size;
tx_rx_aggregation_size->rx_aggregation_size;
cmd->tx_aggr_size = tx_aggr_size[queue_num]; cmd->tx_aggr_size = tx_aggr_size[queue_num];
/* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
cmd->enable_bitmap = 0x20 | queue_num; cmd->enable_bitmap = 0x20 | queue_num;
/* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
if (tx_rx_aggregation_size->aggr_type == if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
cmd->enable_bitmap |= 0x04; cmd->enable_bitmap |= 0x04;
WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d", WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
@@ -4435,23 +4416,15 @@ static QDF_STATUS wma_set_sw_retry_by_qos(
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS wma_set_sw_retry_threshold_per_ac( QDF_STATUS wma_set_sw_retry_threshold_per_ac(WMA_HANDLE handle,
WMA_HANDLE handle, uint8_t vdev_id,
struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold) struct wlan_mlme_qos *qos_aggr)
{ {
QDF_STATUS ret; QDF_STATUS ret;
tp_wma_handle wma_handle;
uint8_t vdev_id;
int retry_type, queue_num; int retry_type, queue_num;
uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX]; uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX];
uint32_t sw_retry; uint32_t sw_retry;
tp_wma_handle wma_handle = (tp_wma_handle)handle;
wma_handle = (tp_wma_handle)handle;
if (!tx_sw_retry_threshold) {
wma_err("%s: invalid pointer", __func__);
return QDF_STATUS_E_INVAL;
}
if (!wma_handle) { if (!wma_handle) {
wma_err("%s: WMA context is invalid!", __func__); wma_err("%s: WMA context is invalid!", __func__);
@@ -4459,22 +4432,22 @@ QDF_STATUS wma_set_sw_retry_threshold_per_ac(
} }
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be; qos_aggr->tx_aggr_sw_retry_threshold_be;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk; qos_aggr->tx_aggr_sw_retry_threshold_bk;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi; qos_aggr->tx_aggr_sw_retry_threshold_vi;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo; qos_aggr->tx_aggr_sw_retry_threshold_vo;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] =
tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_be; qos_aggr->tx_non_aggr_sw_retry_threshold_be;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] =
tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_bk; qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] =
tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vi; qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] = tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] =
tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vo; qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR; retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR;
while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) { while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) {
@@ -4482,7 +4455,6 @@ QDF_STATUS wma_set_sw_retry_threshold_per_ac(
if (tx_sw_retry[retry_type][queue_num] == 0) if (tx_sw_retry[retry_type][queue_num] == 0)
continue; continue;
vdev_id = tx_sw_retry_threshold->vdev_id;
sw_retry = tx_sw_retry[retry_type][queue_num]; sw_retry = tx_sw_retry[retry_type][queue_num];
ret = wma_set_sw_retry_by_qos(wma_handle, ret = wma_set_sw_retry_by_qos(wma_handle,
vdev_id, vdev_id,
@@ -4522,6 +4494,7 @@ QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
/** /**
* wma_process_fw_test_cmd() - send unit test command to fw. * wma_process_fw_test_cmd() - send unit test command to fw.
* @handle: wma handle * @handle: wma handle
@@ -4972,6 +4945,8 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
struct mac_context *mac = NULL; struct mac_context *mac = NULL;
struct lim_channel_status *channel_status; struct lim_channel_status *channel_status;
bool snr_monitor_enabled; bool snr_monitor_enabled;
struct wlan_objmgr_vdev *vdev;
enum QDF_OPMODE mode;
WMA_LOGD("%s: Enter", __func__); WMA_LOGD("%s: Enter", __func__);
@@ -4983,21 +4958,20 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
return -EINVAL; return -EINVAL;
} }
param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
if (!param_buf) {
WMA_LOGE("Invalid chan info event buffer");
return -EINVAL;
}
event = param_buf->fixed_param;
if (!event) {
WMA_LOGA("%s: Invalid fixed param", __func__);
return -EINVAL;
}
snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc); snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc);
WMA_LOGD("%s: monitor:%d", __func__, snr_monitor_enabled); WMA_LOGD("%s: monitor:%d", __func__, snr_monitor_enabled);
if (snr_monitor_enabled && mac->chan_info_cb) { if (snr_monitor_enabled && mac->chan_info_cb) {
param_buf =
(WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
if (!param_buf) {
WMA_LOGA("%s: Invalid chan info event", __func__);
return -EINVAL;
}
event = param_buf->fixed_param;
if (!event) {
WMA_LOGA("%s: Invalid fixed param", __func__);
return -EINVAL;
}
buf.tx_frame_count = event->tx_frame_cnt; buf.tx_frame_count = event->tx_frame_cnt;
buf.clock_freq = event->mac_clk_mhz; buf.clock_freq = event->mac_clk_mhz;
buf.cmd_flag = event->cmd_flags; buf.cmd_flag = event->cmd_flags;
@@ -5008,14 +4982,19 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
mac->chan_info_cb(&buf); mac->chan_info_cb(&buf);
} }
if (mac->sap.acs_with_more_param && vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, event->vdev_id,
mac->sme.curr_device_mode == QDF_SAP_MODE) { WLAN_LEGACY_WMA_ID);
param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *) event_buf;
if (!param_buf) { if (!vdev) {
WMA_LOGE("Invalid chan info event buffer"); WMA_LOGE("%s: vdev is NULL for vdev %d",
return -EINVAL; __func__, event->vdev_id);
} return -EINVAL;
event = param_buf->fixed_param; }
mode = wlan_vdev_mlme_get_opmode(vdev);
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
WMA_LOGD("Vdevid %d mode %d", event->vdev_id, mode);
if (mac->sap.acs_with_more_param && mode == QDF_SAP_MODE) {
channel_status = qdf_mem_malloc(sizeof(*channel_status)); channel_status = qdf_mem_malloc(sizeof(*channel_status));
if (!channel_status) if (!channel_status)
return -ENOMEM; return -ENOMEM;

View File

@@ -954,10 +954,8 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
struct pdev_params pdev_param; struct pdev_params pdev_param;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct target_psoc_info *tgt_hdl; struct target_psoc_info *tgt_hdl;
struct sir_set_tx_rx_aggregation_size aggr;
WMA_LOGD("wmihandle %pK", wma->wmi_handle); WMA_LOGD("wmihandle %pK", wma->wmi_handle);
qdf_mem_zero(&aggr, sizeof(aggr));
if (!mac) { if (!mac) {
WMA_LOGE("%s: Failed to get mac", __func__); WMA_LOGE("%s: Failed to get mac", __func__);
@@ -1027,6 +1025,8 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
{ {
struct cdp_vdev *vdev = NULL; struct cdp_vdev *vdev = NULL;
struct wma_txrx_node *intr = wma->interfaces; struct wma_txrx_node *intr = wma->interfaces;
wmi_vdev_custom_aggr_type_t aggr_type =
WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id); vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
if (!vdev) { if (!vdev) {
@@ -1055,18 +1055,14 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
intr[privcmd->param_vdev_id].config. intr[privcmd->param_vdev_id].config.
ampdu = privcmd->param_value; ampdu = privcmd->param_value;
aggr.aggr_type = aggr_type =
WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU; WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
} else {
aggr.aggr_type =
WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
} }
aggr.vdev_id = vid; ret = wma_set_tx_rx_aggr_size(vid,
aggr.tx_aggregation_size = privcmd->param_value; privcmd->param_value,
aggr.rx_aggregation_size = privcmd->param_value; privcmd->param_value,
aggr_type);
ret = wma_set_tx_rx_aggregation_size(&aggr);
if (QDF_IS_STATUS_ERROR(ret)) { if (QDF_IS_STATUS_ERROR(ret)) {
WMA_LOGE("set_aggr_size failed ret %d", ret); WMA_LOGE("set_aggr_size failed ret %d", ret);
return; return;
@@ -8413,9 +8409,6 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
{ {
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
tp_wma_handle wma_handle; tp_wma_handle wma_handle;
struct cdp_vdev *txrx_vdev_handle = NULL;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
if (!msg) { if (!msg) {
WMA_LOGE("msg is NULL"); WMA_LOGE("msg is NULL");
@@ -8454,26 +8447,6 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr); wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
break; break;
#endif /* FEATURE_WLAN_ESE */ #endif /* FEATURE_WLAN_ESE */
case WMA_ADD_STA_SELF_REQ:
txrx_vdev_handle =
wma_vdev_attach(wma_handle,
(struct add_sta_self_params *) msg->
bodyptr, 1);
if (!txrx_vdev_handle) {
WMA_LOGE("Failed to attach vdev");
} else {
/* Register with TxRx Module for Data Ack Complete Cb */
if (soc) {
cdp_data_tx_cb_set(soc, txrx_vdev_handle,
wma_data_tx_ack_comp_hdlr,
wma_handle);
} else {
WMA_LOGE("%s: SOC context is NULL", __func__);
qdf_status = QDF_STATUS_E_FAILURE;
goto end;
}
}
break;
case WMA_DEL_STA_SELF_REQ: case WMA_DEL_STA_SELF_REQ:
wma_vdev_detach(wma_handle, wma_vdev_detach(wma_handle,
(struct del_sta_self_params *) msg->bodyptr, 1); (struct del_sta_self_params *) msg->bodyptr, 1);

View File

@@ -116,7 +116,7 @@ QDF_STATUS wma_unified_set_sta_ps_param(wmi_unified_t wmi_handle,
iface = &wma->interfaces[vdev_id]; iface = &wma->interfaces[vdev_id];
sta_ps_param.vdev_id = vdev_id; sta_ps_param.vdev_id = vdev_id;
sta_ps_param.param = param; sta_ps_param.param_id = param;
sta_ps_param.value = value; sta_ps_param.value = value;
status = wmi_unified_sta_ps_cmd_send(wmi_handle, &sta_ps_param); status = wmi_unified_sta_ps_cmd_send(wmi_handle, &sta_ps_param);
if (QDF_IS_STATUS_ERROR(status)) if (QDF_IS_STATUS_ERROR(status))