qcacmn: Remove dependency on WMA layer for green AP component

Remove dependency on WMA layer for green AP component by registering
green AP events through target_if layer.

Change-Id: I8fe9079c6ba6b23cd5f1d98a7d1b333fde31f19b
CRs-Fixed: 2178143
This commit is contained in:
Himanshu Agarwal
2018-01-24 22:24:17 +05:30
committed by snandini
parent f31b24105b
commit c4cec662cf
10 changed files with 157 additions and 41 deletions

View File

@@ -37,6 +37,16 @@
QDF_STATUS target_if_register_green_ap_tx_ops(
struct wlan_lmac_if_tx_ops *tx_ops);
/**
* target_if_green_ap_register_egap_event_handler() - registers enhanced
* green ap event handler
* @pdev: objmgr pdev
*
* Return: QDF_STATUS in case of success
*/
QDF_STATUS target_if_green_ap_register_egap_event_handler(
struct wlan_objmgr_pdev *pdev);
/**
* target_if_green_ap_enable_egap() - enable enhanced green ap
* @pdev: pdev pointer

View File

@@ -48,6 +48,79 @@ QDF_STATUS target_if_register_green_ap_tx_ops(
return QDF_STATUS_SUCCESS;
}
/**
* target_if_green_ap_egap_status_info_event() - egap status info event
* @scn: pointer to scn handle
* @evt_buf: pointer to event buffer
* @data_len: data len of the event buffer
*
* Return: 0 for success, otherwise appropriate error code
*/
static int target_if_green_ap_egap_status_info_event(
ol_scn_t scn, uint8_t *evt_buf, uint32_t data_len)
{
struct wlan_objmgr_pdev *pdev;
struct wlan_green_ap_egap_status_info egap_status_info_params;
pdev = target_if_get_pdev_from_scn_hdl(scn);
if (!pdev) {
green_ap_err("pdev is null");
return QDF_STATUS_E_FAILURE;
}
if (wmi_extract_green_ap_egap_status_info(GET_WMI_HDL_FROM_PDEV(pdev),
evt_buf,
&egap_status_info_params) !=
QDF_STATUS_SUCCESS) {
green_ap_err("unable to extract green ap egap status info");
return QDF_STATUS_E_FAILURE;
}
green_ap_debug("mac_id: %d, status: %d, tx_mask: %x, rx_mask: %d",
egap_status_info_params.mac_id,
egap_status_info_params.status,
egap_status_info_params.tx_chainmask,
egap_status_info_params.rx_chainmask);
return 0;
}
QDF_STATUS target_if_green_ap_register_egap_event_handler(
struct wlan_objmgr_pdev *pdev)
{
struct wlan_pdev_green_ap_ctx *green_ap_ctx;
struct wlan_green_ap_egap_params *egap_params;
int ret;
if (!pdev || !GET_WMI_HDL_FROM_PDEV(pdev)) {
green_ap_err("pdev or pdev->tgt_if_handle is null");
return QDF_STATUS_E_INVAL;
}
green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
pdev, WLAN_UMAC_COMP_GREEN_AP);
if (!green_ap_ctx) {
green_ap_err("green ap context obtained is NULL");
return QDF_STATUS_E_FAILURE;
}
egap_params = &green_ap_ctx->egap_params;
ret = wmi_unified_register_event_handler(
GET_WMI_HDL_FROM_PDEV(pdev),
wmi_ap_ps_egap_info_event_id,
target_if_green_ap_egap_status_info_event,
WMI_RX_UMAC_CTX);
if (ret < 0) {
green_ap_err("Failed to register Enhance Green AP event");
egap_params->fw_egap_support = false;
} else {
green_ap_info("Set the Enhance Green AP event handler");
egap_params->fw_egap_support = true;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS target_if_green_ap_enable_egap(
struct wlan_objmgr_pdev *pdev,
struct wlan_green_ap_egap_params *egap_params)

View File

@@ -199,16 +199,16 @@ QDF_STATUS wlan_green_ap_state_mc(struct wlan_pdev_green_ap_ctx *green_ap_ctx,
/* Confirm that power save is enabled before doing state transitions */
if (!green_ap_ctx->ps_enable) {
green_ap_debug("Green-AP is disabled");
wlan_green_ap_ps_event_state_update(
green_ap_ctx,
WLAN_GREEN_AP_PS_IDLE_STATE,
WLAN_GREEN_AP_PS_WAIT_EVENT);
if (green_ap_ctx->ps_state == WLAN_GREEN_AP_PS_ON_STATE) {
if (green_ap_tx_ops->ps_on_off_send(green_ap_ctx->pdev,
false, pdev_id))
green_ap_err("failed to set green ap mode");
wlan_green_ap_ant_ps_reset(green_ap_ctx);
}
wlan_green_ap_ps_event_state_update(
green_ap_ctx,
WLAN_GREEN_AP_PS_IDLE_STATE,
WLAN_GREEN_AP_PS_WAIT_EVENT);
goto done;
}

View File

@@ -43,6 +43,20 @@ struct wlan_green_ap_egap_params {
uint32_t egap_feature_flags;
};
/**
* struct wlan_green_ap_egap_status_info - enhance green ap params
* @status: egap status
* @mac_id: mac id
* @tx_chainmask: tx chainmask
* @rx_chainmask: rx chainmask
*/
struct wlan_green_ap_egap_status_info {
uint32_t status;
uint32_t mac_id;
uint32_t tx_chainmask;
uint32_t rx_chainmask;
};
/**
* wlan_green_ap_init() - initialize green ap component
*

View File

@@ -61,19 +61,6 @@ QDF_STATUS ucfg_green_ap_update_user_config(
*/
QDF_STATUS ucfg_green_ap_enable_egap(struct wlan_objmgr_pdev *pdev);
/**
* ucfg_green_ap_target_config() - Handle Green AP target configuration
* @pdev: pdev pointer
* @fw_egap_support: fw egap support
*
* This API stores the fw enhanced green AP support capability
* in green ap ctx.
*
* Return: Success or Failure
*/
QDF_STATUS ucfg_green_ap_target_config(struct wlan_objmgr_pdev *pdev,
bool fw_egap_support);
/**
* ucfg_green_ap_set_ps_config() - Set ps value
* @pdev: pdev pointer

View File

@@ -86,30 +86,6 @@ QDF_STATUS ucfg_green_ap_enable_egap(struct wlan_objmgr_pdev *pdev)
return green_ap_tx_ops->enable_egap(pdev, &green_ap_ctx->egap_params);
}
QDF_STATUS ucfg_green_ap_target_config(struct wlan_objmgr_pdev *pdev,
bool fw_egap_support)
{
struct wlan_pdev_green_ap_ctx *green_ap_ctx;
if (!pdev) {
green_ap_err("pdev context passed is NULL");
return QDF_STATUS_E_INVAL;
}
green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
pdev, WLAN_UMAC_COMP_GREEN_AP);
if (!green_ap_ctx) {
green_ap_err("green ap context obtained is NULL");
return QDF_STATUS_E_FAILURE;
}
qdf_spin_lock_bh(&green_ap_ctx->lock);
green_ap_ctx->egap_params.fw_egap_support = fw_egap_support;
qdf_spin_unlock_bh(&green_ap_ctx->lock);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_green_ap_set_ps_config(struct wlan_objmgr_pdev *pdev,
uint8_t value)
{

View File

@@ -2091,6 +2091,12 @@ QDF_STATUS wmi_unified_extract_obss_detection_info(void *wmi_hdl,
struct wmi_obss_detect_info
*info);
#ifdef WLAN_SUPPORT_GREEN_AP
QDF_STATUS wmi_extract_green_ap_egap_status_info(
void *wmi_hdl, uint8_t *evt_buf,
struct wlan_green_ap_egap_status_info *egap_status_info_params);
#endif
#ifdef WLAN_SUPPORT_FILS
/**
* wmi_unified_fils_vdev_config_send_cmd() - send FILS config cmd to fw

View File

@@ -239,6 +239,10 @@ QDF_STATUS (*send_peer_create_cmd)(wmi_unified_t wmi,
#ifdef WLAN_SUPPORT_GREEN_AP
QDF_STATUS (*send_green_ap_ps_cmd)(wmi_unified_t wmi_handle,
uint32_t value, uint8_t pdev_id);
QDF_STATUS (*extract_green_ap_egap_status_info)(
uint8_t *evt_buf,
struct wlan_green_ap_egap_status_info *egap_status_info_params);
#endif
QDF_STATUS

View File

@@ -7351,3 +7351,18 @@ QDF_STATUS wmi_unified_invoke_neighbor_report_cmd(void *wmi_hdl,
return QDF_STATUS_E_FAILURE;
}
#ifdef WLAN_SUPPORT_GREEN_AP
QDF_STATUS wmi_extract_green_ap_egap_status_info(
void *wmi_hdl, uint8_t *evt_buf,
struct wlan_green_ap_egap_status_info *egap_status_info_params)
{
wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
if (wmi_handle->ops->extract_green_ap_egap_status_info)
return wmi_handle->ops->extract_green_ap_egap_status_info(
evt_buf, egap_status_info_params);
return QDF_STATUS_E_FAILURE;
}
#endif

View File

@@ -21665,6 +21665,35 @@ static QDF_STATUS send_invoke_neighbor_report_cmd_tlv(wmi_unified_t wmi_handle,
return status;
}
#ifdef WLAN_SUPPORT_GREEN_AP
static QDF_STATUS extract_green_ap_egap_status_info_tlv(
uint8_t *evt_buf,
struct wlan_green_ap_egap_status_info *egap_status_info_params)
{
WMI_AP_PS_EGAP_INFO_EVENTID_param_tlvs *param_buf;
wmi_ap_ps_egap_info_event_fixed_param *egap_info_event;
wmi_ap_ps_egap_info_chainmask_list *chainmask_event;
param_buf = (WMI_AP_PS_EGAP_INFO_EVENTID_param_tlvs *)evt_buf;
if (!param_buf) {
WMI_LOGE("Invalid EGAP Info status event buffer");
return QDF_STATUS_E_INVAL;
}
egap_info_event = (wmi_ap_ps_egap_info_event_fixed_param *)
param_buf->fixed_param;
chainmask_event = (wmi_ap_ps_egap_info_chainmask_list *)
param_buf->chainmask_list;
egap_status_info_params->status = egap_info_event->status;
egap_status_info_params->mac_id = chainmask_event->mac_id;
egap_status_info_params->tx_chainmask = chainmask_event->tx_chainmask;
egap_status_info_params->rx_chainmask = chainmask_event->rx_chainmask;
return QDF_STATUS_SUCCESS;
}
#endif
struct wmi_ops tlv_ops = {
.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
.send_vdev_delete_cmd = send_vdev_delete_cmd_tlv,
@@ -21842,6 +21871,8 @@ struct wmi_ops tlv_ops = {
#ifdef WLAN_SUPPORT_GREEN_AP
.send_egap_conf_params_cmd = send_egap_conf_params_cmd_tlv,
.send_green_ap_ps_cmd = send_green_ap_ps_cmd_tlv,
.extract_green_ap_egap_status_info =
extract_green_ap_egap_status_info_tlv,
#endif
.send_fw_profiling_cmd = send_fw_profiling_cmd_tlv,
.send_csa_offload_enable_cmd = send_csa_offload_enable_cmd_tlv,