qcacld-3.0: Implement DP component infra support

Implement DP component infra support, So that
DP component gets allocated and initialiazed.

Change-Id: Icdcbf92956dcf0984dd14262f3c7f29554b4eba8
CRs-Fixed: 3164965
This commit is contained in:
Karthik Kantamneni
2022-04-04 15:13:26 +05:30
committed by Madan Koyyalamudi
parent c3269eb28d
commit 6b43ef6a50
7 changed files with 1229 additions and 63 deletions

View File

@@ -26,7 +26,6 @@
#include "wlan_cmn.h"
#include "wlan_objmgr_cmn.h"
#include "wlan_objmgr_global_obj.h"
#include "wmi_unified.h"
#include "qdf_status.h"
/**
@@ -39,10 +38,18 @@ struct wlan_dp_psoc_callbacks {
bool flush_gro);
};
/**
* struct wlan_dp_psoc_sb_ops - struct containing callback
* to south bound APIs. callbacks to call traget_if APIs
*/
struct wlan_dp_psoc_sb_ops {
/*TODO to add target if TX ops*/
};
/**
* struct wlan_dp_psoc_nb_ops - struct containing callback
* to north bound APIs. callbacks APIs to be called by target_if APIs
*/
struct wlan_dp_psoc_nb_ops {
/*TODO to add target if RX ops*/
};

View File

@@ -32,19 +32,36 @@
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_dp_public_struct.h>
/**
* ucfg_dp_create_intf() - update DP interface MAC address
* @psoc: psoc handle
* @cur_mac: Curent MAC address
* @new_mac: new MAC address
*
*/
void ucfg_dp_update_inf_mac(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *cur_mac,
struct qdf_mac_addr *new_mac);
/**
* ucfg_dp_destroy_intf() - DP module interface deletion
* @psoc: psoc handle
* @intf_addr: Interface MAC address
*
*/
QDF_STATUS ucfg_dp_destroy_intf(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *intf_addr);
/**
* ucfg_dp_create_intf() - DP module interface creation
* @psoc: psoc handle
* @intf_addr: Interface MAC address
* @ndev : netdev object
*
*/
QDF_STATUS ucfg_dp_create_intf(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *intf_addr);
struct qdf_mac_addr *intf_addr,
qdf_netdev_t ndev);
/**
* ucfg_dp_init() - DP module initialization API
@@ -60,8 +77,42 @@ QDF_STATUS ucfg_dp_init(void);
*/
QDF_STATUS ucfg_dp_deinit(void);
/**
* ucfg_dp_psoc_open() - DP component Open
* @psoc: pointer to psoc object
*
* Return: QDF Status
*/
QDF_STATUS ucfg_dp_psoc_open(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_psoc_close() - DP component Close
* @psoc: pointer to psoc object
*
* Return: QDF Status
*/
QDF_STATUS ucfg_dp_psoc_close(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_suspend_wlan() - update suspend state in DP component
* @psoc: pointer to psoc object
*
* Return: None
*/
void ucfg_dp_suspend_wlan(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_resume_wlan() - update resume state in DP component
* @psoc: pointer to psoc object
*
* Return: None
*/
void ucfg_dp_resume_wlan(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_update_config() - DP module config update
* @psoc: pointer to psoc object
* @req : user config
*
* Return: QDF_STATUS
*/
@@ -69,6 +120,12 @@ QDF_STATUS
ucfg_dp_update_config(struct wlan_objmgr_psoc *psoc,
struct wlan_dp_user_config *req);
/**
* ucfg_dp_get_rx_softirq_yield_duration() - Get rx soft IRQ yield duration
* @psoc: pointer to psoc object
*
* Return: soft IRQ yield duration
*/
uint64_t
ucfg_dp_get_rx_softirq_yield_duration(struct wlan_objmgr_psoc *psoc);

View File

@@ -25,17 +25,57 @@
#include "wlan_dp_objmgr.h"
#include "cdp_txrx_cmn.h"
#include "cfg_ucfg_api.h"
#include "wlan_pmo_obj_mgmt_api.h"
void ucfg_dp_update_inf_mac(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *cur_mac,
struct qdf_mac_addr *new_mac)
{
struct wlan_dp_intf *dp_intf;
struct wlan_dp_psoc_context *dp_ctx;
dp_info("MAC update");
dp_ctx = dp_psoc_get_priv(psoc);
dp_intf = dp_get_intf_by_macaddr(dp_ctx, cur_mac);
if (!dp_intf) {
dp_err("DP interface not found addr:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(cur_mac));
return;
}
qdf_copy_macaddr(&dp_intf->mac_addr, new_mac);
}
QDF_STATUS
ucfg_dp_create_intf(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *intf_addr)
struct qdf_mac_addr *intf_addr,
qdf_netdev_t ndev)
{
struct wlan_dp_intf *dp_intf;
struct wlan_dp_psoc_context *dp_ctx;
dp_ctx = dp_get_context();
dp_info("DP interface create addr:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(intf_addr));
dp_intf = __qdf_mem_malloc(sizeof(*dp_intf), __func__, __LINE__);
if (!dp_intf) {
dp_err("DP intf memory alloc failed addr:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(intf_addr));
return QDF_STATUS_E_FAILURE;
}
dp_intf->dp_ctx = dp_ctx;
dp_intf->dev = ndev;
dp_intf->intf_id = WLAN_UMAC_VDEV_ID_MAX;
qdf_copy_macaddr(&dp_intf->mac_addr, intf_addr);
qdf_spin_lock_bh(&dp_ctx->intf_list_lock);
qdf_list_insert_front(&dp_ctx->intf_list, &dp_intf->node);
qdf_spin_unlock_bh(&dp_ctx->intf_list_lock);
return QDF_STATUS_SUCCESS;
}
@@ -43,28 +83,385 @@ QDF_STATUS
ucfg_dp_destroy_intf(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *intf_addr)
{
struct wlan_dp_intf *dp_intf;
struct wlan_dp_psoc_context *dp_ctx;
dp_ctx = dp_get_context();
dp_info("DP interface destroy addr:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(intf_addr));
dp_intf = dp_get_intf_by_macaddr(dp_ctx, intf_addr);
if (!dp_intf) {
dp_err("DP interface not found addr:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(intf_addr));
return QDF_STATUS_E_FAILURE;
}
qdf_spin_lock_bh(&dp_ctx->intf_list_lock);
qdf_list_remove_node(&dp_ctx->intf_list, &dp_intf->node);
qdf_spin_unlock_bh(&dp_ctx->intf_list_lock);
__qdf_mem_free(dp_intf);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_dp_init(void)
{
return QDF_STATUS_SUCCESS;
QDF_STATUS status;
dp_info("DP module dispatcher init");
if (dp_allocate_ctx() != QDF_STATUS_SUCCESS) {
dp_err("DP ctx allocation failed");
return QDF_STATUS_E_FAULT;
}
status = wlan_objmgr_register_psoc_create_handler(
WLAN_COMP_DP,
dp_psoc_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register psoc create handler for DP");
return status;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_COMP_DP,
dp_psoc_obj_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register psoc destroy handler for DP");
goto fail_destroy_psoc;
}
status = wlan_objmgr_register_pdev_create_handler(
WLAN_COMP_DP,
dp_pdev_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register pdev create handler for DP");
goto fail_create_pdev;
}
status = wlan_objmgr_register_pdev_destroy_handler(
WLAN_COMP_DP,
dp_pdev_obj_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register pdev destroy handler for DP");
goto fail_destroy_pdev;
}
status = wlan_objmgr_register_vdev_create_handler(
WLAN_COMP_DP,
dp_vdev_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register vdev create handler");
goto fail_create_vdev;
}
status = wlan_objmgr_register_vdev_destroy_handler(
WLAN_COMP_DP,
dp_vdev_obj_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to register vdev destroy handler");
goto fail_destroy_vdev;
}
return status;
fail_destroy_vdev:
wlan_objmgr_unregister_vdev_create_handler(
WLAN_COMP_DP,
dp_vdev_obj_create_notification, NULL);
fail_create_vdev:
wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_COMP_DP,
dp_pdev_obj_destroy_notification, NULL);
fail_destroy_pdev:
wlan_objmgr_unregister_pdev_create_handler(
WLAN_COMP_DP,
dp_pdev_obj_create_notification, NULL);
fail_create_pdev:
wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_COMP_DP,
dp_psoc_obj_destroy_notification, NULL);
fail_destroy_psoc:
wlan_objmgr_unregister_psoc_create_handler(
WLAN_COMP_DP,
dp_psoc_obj_create_notification, NULL);
dp_free_ctx();
return status;
}
QDF_STATUS ucfg_dp_deinit(void)
{
QDF_STATUS status;
dp_info("DP module dispatcher deinit");
status = wlan_objmgr_unregister_vdev_destroy_handler(
WLAN_COMP_DP,
dp_vdev_obj_destroy_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister vdev delete handler:%d", status);
status = wlan_objmgr_unregister_vdev_create_handler(
WLAN_COMP_DP,
dp_vdev_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister vdev create handler:%d", status);
status = wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_COMP_DP,
dp_pdev_obj_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister pdev destroy handler:%d", status);
status = wlan_objmgr_unregister_pdev_create_handler(
WLAN_COMP_DP,
dp_pdev_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister pdev create handler:%d", status);
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_COMP_DP,
dp_psoc_obj_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister DP psoc delete handle:%d", status);
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_COMP_DP,
dp_psoc_obj_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status))
dp_err("Failed to unregister DP psoc create handle:%d", status);
dp_free_ctx();
return status;
}
/**
* ucfg_dp_suspend_handler() - suspend handler regsitered with PMO component
* @psoc: psoc handle
* @arg: Arguments passed by the suspend handler.
*
* This handler is used to update the wiphy suspend state in DP context
*
* Return: QDF_STATUS status -in case of success else return error
*/
static QDF_STATUS
ucfg_dp_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct wlan_dp_psoc_context *dp_ctx;
dp_ctx = dp_psoc_get_priv(psoc);
if (!dp_ctx) {
dp_err("DP context not found");
return QDF_STATUS_E_FAILURE;
}
dp_ctx->is_wiphy_suspended = true;
return QDF_STATUS_SUCCESS;
}
/**
* ucfg_dp_resume_handler() - resume handler regsitered with PMO component
* @psoc: psoc handle
* @arg: Arguments passed by the resume handler.
*
* This handler is used to update the wiphy resume state in DP context
*
* Return: QDF_STATUS status -in case of success else return error
*/
static QDF_STATUS
ucfg_dp_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct wlan_dp_psoc_context *dp_ctx;
dp_ctx = dp_psoc_get_priv(psoc);
if (!dp_ctx) {
dp_err("DP context not found");
return QDF_STATUS_E_FAILURE;
}
dp_ctx->is_wiphy_suspended = false;
return QDF_STATUS_SUCCESS;
}
/**
* dp_register_pmo_handler() - register suspend and resume handler
* with PMO component
*
* Return: None
*/
static inline void dp_register_pmo_handler(void)
{
pmo_register_suspend_handler(WLAN_COMP_DP,
ucfg_dp_suspend_handler, NULL);
pmo_register_resume_handler(WLAN_COMP_DP,
ucfg_dp_resume_handler, NULL);
}
/**
* dp_unregister_pmo_handler() - unregister suspend and resume handler
* with PMO component
*
* Return: None
*/
static inline void dp_unregister_pmo_handler(void)
{
pmo_unregister_suspend_handler(WLAN_COMP_DP, ucfg_dp_suspend_handler);
pmo_unregister_resume_handler(WLAN_COMP_DP, ucfg_dp_resume_handler);
}
/**
* ucfg_dp_store_qdf_dev() - Store qdf device instance in DP component
* @psoc: psoc handle
*
* Return: QDF_STATUS status -in case of success else return error
*/
static inline QDF_STATUS
ucfg_dp_store_qdf_dev(struct wlan_objmgr_psoc *psoc)
{
struct wlan_dp_psoc_context *dp_ctx;
dp_ctx = dp_psoc_get_priv(psoc);
if (!dp_ctx) {
dp_err("DP context not found");
return QDF_STATUS_E_FAILURE;
}
dp_ctx->qdf_dev = wlan_psoc_get_qdf_dev(psoc);
if (!dp_ctx->qdf_dev) {
dp_err("QDF_DEV is NULL");
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_dp_psoc_open(struct wlan_objmgr_psoc *psoc)
{
ucfg_dp_store_qdf_dev(psoc);
dp_register_pmo_handler();
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_dp_psoc_close(struct wlan_objmgr_psoc *psoc)
{
dp_unregister_pmo_handler();
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT
/**
* dp_get_config_rx_softirq_limits() - Update DP rx softirq limit config
* datapath
* @psoc: psoc handle
* @params: DP Configuration parameters
*
* Return: None
*/
static
void dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc *psoc,
struct cdp_config_params *params)
{
params->tx_comp_loop_pkt_limit = cfg_get(psoc,
CFG_DP_TX_COMP_LOOP_PKT_LIMIT);
params->rx_reap_loop_pkt_limit = cfg_get(psoc,
CFG_DP_RX_REAP_LOOP_PKT_LIMIT);
params->rx_hp_oos_update_limit = cfg_get(psoc,
CFG_DP_RX_HP_OOS_UPDATE_LIMIT);
}
#else
static
void dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc *psoc,
struct cdp_config_params *params)
{
}
#endif /* WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT */
#if defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(QCA_LL_PDEV_TX_FLOW_CONTROL)
/**
* dp_get_config_queue_threshold() - Update DP tx flow limit config
* datapath
* @psoc: psoc handle
* @params: DP Configuration parameters
*
* Return: None
*/
static void
dp_get_config_queue_threshold(struct wlan_objmgr_psoc *psoc,
struct cdp_config_params *params)
{
params->tx_flow_stop_queue_threshold =
cfg_get(psoc, CFG_DP_TX_FLOW_STOP_QUEUE_TH);
params->tx_flow_start_queue_offset =
cfg_get(psoc, CFG_DP_TX_FLOW_START_QUEUE_OFFSET);
}
#else
static inline void
dp_get_config_queue_threshold(struct wlan_objmgr_psoc *psoc,
struct cdp_config_params *params)
{
}
#endif
QDF_STATUS
ucfg_dp_update_config(struct wlan_objmgr_psoc *psoc,
struct wlan_dp_user_config *req)
{
struct cdp_config_params params = {0};
struct wlan_dp_psoc_context *dp_ctx;
QDF_STATUS status;
void *soc;
dp_ctx = dp_psoc_get_priv(psoc);
soc = cds_get_context(QDF_MODULE_ID_SOC);
params.tso_enable = cfg_get(psoc, CFG_DP_TSO);
params.lro_enable = cfg_get(psoc, CFG_DP_LRO);
dp_get_config_queue_threshold(psoc, &params);
params.flow_steering_enable =
cfg_get(psoc, CFG_DP_FLOW_STEERING_ENABLED);
params.napi_enable = dp_ctx->napi_enable;
params.p2p_tcp_udp_checksumoffload =
cfg_get(psoc, CFG_DP_P2P_TCP_UDP_CKSUM_OFFLOAD);
params.nan_tcp_udp_checksumoffload =
cfg_get(psoc, CFG_DP_NAN_TCP_UDP_CKSUM_OFFLOAD);
params.tcp_udp_checksumoffload =
cfg_get(psoc, CFG_DP_TCP_UDP_CKSUM_OFFLOAD);
params.ipa_enable = req->ipa_enable;
params.gro_enable = cfg_get(psoc, CFG_DP_GRO);
params.tx_comp_loop_pkt_limit = cfg_get(psoc,
CFG_DP_TX_COMP_LOOP_PKT_LIMIT);
params.rx_reap_loop_pkt_limit = cfg_get(psoc,
CFG_DP_RX_REAP_LOOP_PKT_LIMIT);
params.rx_hp_oos_update_limit = cfg_get(psoc,
CFG_DP_RX_HP_OOS_UPDATE_LIMIT);
dp_get_config_rx_softirq_limits(psoc, &params);
status = cdp_update_config_parameters(soc, &params);
if (status) {
dp_err("Failed to attach config parameters");
return status;
}
return QDF_STATUS_SUCCESS;
}
uint64_t
ucfg_dp_get_rx_softirq_yield_duration(struct wlan_objmgr_psoc *psoc)
{
return 0;
struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
return dp_ctx->dp_cfg.rx_softirq_max_yield_duration_ns;
}