qcacld-3.0: Set to_fw bit in DP vdev for Direct link use case

Set to_fw bit in DP vdev for direct link use case
and also set it when the use case is unspecified as
well.

Change-Id: I7306e22e81303720830cfce4ce19b15d2080d93c
CRs-Fixed: 3369891
This commit is contained in:
Yeshwanth Sriram Guntuka
2022-12-28 18:53:05 +05:30
committed by Madan Koyyalamudi
parent 150cbe51be
commit 9972a80234
5 changed files with 103 additions and 33 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@@ -38,6 +38,7 @@
#include <htc_api.h> #include <htc_api.h>
#ifdef FEATURE_DIRECT_LINK #ifdef FEATURE_DIRECT_LINK
#include "dp_internal.h" #include "dp_internal.h"
#include "cdp_txrx_ctrl.h"
#endif #endif
/* Global DP context */ /* Global DP context */
@@ -1731,6 +1732,8 @@ QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf,
struct direct_link_info *config = &dp_intf->direct_link_config; struct direct_link_info *config = &dp_intf->direct_link_config;
void *htc_handle; void *htc_handle;
bool prev_ll, update_ll; bool prev_ll, update_ll;
cdp_config_param_type vdev_param = {0};
QDF_STATUS status;
if (!dp_ctx || !dp_ctx->psoc) { if (!dp_ctx || !dp_ctx->psoc) {
dp_err("DP Handle is NULL"); dp_err("DP Handle is NULL");
@@ -1753,6 +1756,10 @@ QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf,
update_ll = config_direct_link ? enable_low_latency : prev_ll; update_ll = config_direct_link ? enable_low_latency : prev_ll;
config->config_set = config_direct_link; config->config_set = config_direct_link;
config->low_latency = enable_low_latency; config->low_latency = enable_low_latency;
vdev_param.cdp_vdev_tx_to_fw = config_direct_link;
status = cdp_txrx_set_vdev_param(wlan_psoc_get_dp_handle(dp_ctx->psoc),
dp_intf->intf_id, CDP_VDEV_TX_TO_FW,
vdev_param);
qdf_spin_unlock(&dp_intf->vdev_lock); qdf_spin_unlock(&dp_intf->vdev_lock);
if (config_direct_link) { if (config_direct_link) {
@@ -1773,6 +1780,6 @@ QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf,
dp_info("Direct link config cleared."); dp_info("Direct link config cleared.");
} }
return QDF_STATUS_SUCCESS; return status;
} }
#endif #endif

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@@ -610,20 +610,6 @@ dp_softap_inspect_traffic_end_indication_pkt(struct wlan_dp_intf *dp_intf,
{} {}
#endif #endif
#ifdef FEATURE_DIRECT_LINK
static inline void dp_intf_tx_to_fw(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf)
{
if (qdf_unlikely(dp_intf->direct_link_config.config_set))
QDF_NBUF_CB_TX_PACKET_TO_FW(nbuf) = 1;
}
#else
static inline void dp_intf_tx_to_fw(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf)
{
}
#endif
/** /**
* dp_softap_start_xmit() - Transmit a frame * dp_softap_start_xmit() - Transmit a frame
* @nbuf: pointer to Network buffer * @nbuf: pointer to Network buffer
@@ -686,8 +672,6 @@ QDF_STATUS dp_softap_start_xmit(qdf_nbuf_t nbuf, struct wlan_dp_intf *dp_intf)
if (dp_softap_traffic_end_indication_enabled(dp_intf)) if (dp_softap_traffic_end_indication_enabled(dp_intf))
dp_softap_inspect_traffic_end_indication_pkt(dp_intf, nbuf); dp_softap_inspect_traffic_end_indication_pkt(dp_intf, nbuf);
dp_intf_tx_to_fw(dp_intf, nbuf);
dp_softap_config_tx_pkt_tracing(dp_intf, nbuf); dp_softap_config_tx_pkt_tracing(dp_intf, nbuf);
/* check whether need to linearize skb, like non-linear udp data */ /* check whether need to linearize skb, like non-linear udp data */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@@ -40,6 +40,39 @@
#include "wlan_dp_prealloc.h" #include "wlan_dp_prealloc.h"
#include "wlan_dp_rx_thread.h" #include "wlan_dp_rx_thread.h"
#ifdef FEATURE_DIRECT_LINK
/**
* wlan_dp_set_vdev_direct_link_cfg() - Set direct link config in DP vdev
* @psoc: objmgr psoc handle
* @dp_intf: pointer to DP component interface handle
*
* Return: direct link configuration
*/
static inline
QDF_STATUS wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_dp_intf *dp_intf)
{
cdp_config_param_type vdev_param = {0};
if (dp_intf->device_mode != QDF_SAP_MODE ||
!dp_intf->dp_ctx->dp_direct_link_ctx)
return QDF_STATUS_SUCCESS;
vdev_param.cdp_vdev_tx_to_fw = dp_intf->direct_link_config.config_set;
return cdp_txrx_set_vdev_param(wlan_psoc_get_dp_handle(psoc),
dp_intf->intf_id, CDP_VDEV_TX_TO_FW,
vdev_param);
}
#else
static inline
QDF_STATUS wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_dp_intf *dp_intf)
{
return QDF_STATUS_SUCCESS;
}
#endif
void ucfg_dp_update_inf_mac(struct wlan_objmgr_psoc *psoc, void ucfg_dp_update_inf_mac(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *cur_mac, struct qdf_mac_addr *cur_mac,
struct qdf_mac_addr *new_mac) struct qdf_mac_addr *new_mac)
@@ -62,6 +95,8 @@ void ucfg_dp_update_inf_mac(struct wlan_objmgr_psoc *psoc,
QDF_MAC_ADDR_REF(new_mac->bytes)); QDF_MAC_ADDR_REF(new_mac->bytes));
qdf_copy_macaddr(&dp_intf->mac_addr, new_mac); qdf_copy_macaddr(&dp_intf->mac_addr, new_mac);
wlan_dp_set_vdev_direct_link_cfg(psoc, dp_intf);
} }
QDF_STATUS QDF_STATUS

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@@ -352,6 +352,18 @@ QDF_STATUS ucfg_mlme_set_ap_policy(struct wlan_objmgr_vdev *vdev,
return wlan_mlme_set_ap_policy(vdev, ap_cfg_policy); return wlan_mlme_set_ap_policy(vdev, ap_cfg_policy);
} }
/**
* ucfg_mlme_get_ap_policy() - Get the AP policy value
* @vdev: pointer to vdev object
*
* Return: enum host_concurrent_ap_policy
*/
static inline enum host_concurrent_ap_policy
ucfg_mlme_get_ap_policy(struct wlan_objmgr_vdev *vdev)
{
return wlan_mlme_get_ap_policy(vdev);
}
/** /**
* ucfg_mlme_get_prevent_link_down() - Get the prevent link down config * ucfg_mlme_get_prevent_link_down() - Get the prevent link down config
* @psoc: pointer to psoc object * @psoc: pointer to psoc object

View File

@@ -14182,19 +14182,50 @@ uint8_t hdd_get_sap_operating_band(struct hdd_context *hdd_ctx)
return operating_band; return operating_band;
} }
static inline static inline QDF_STATUS
QDF_STATUS wlan_hdd_config_dp_direct_link_profile(struct wlan_objmgr_vdev *vdev, wlan_hdd_config_dp_direct_link_profile(struct wlan_objmgr_vdev *vdev,
uint8_t ap_config) enum host_concurrent_ap_policy ap_policy)
{ {
switch (ap_config) { enum host_concurrent_ap_policy prev_ap_policy;
case QCA_WLAN_CONCURRENT_AP_POLICY_GAMING_AUDIO:
return ucfg_dp_config_direct_link(vdev, true, true); prev_ap_policy = ucfg_mlme_get_ap_policy(vdev);
case QCA_WLAN_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
return ucfg_dp_config_direct_link(vdev, true, false); hdd_debug("Current AP policy %d prev AP policy %d", ap_policy,
case QCA_WLAN_CONCURRENT_AP_POLICY_UNSPECIFIED: prev_ap_policy);
switch (prev_ap_policy) {
case HOST_CONCURRENT_AP_POLICY_UNSPECIFIED:
switch (ap_policy) {
case HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
return ucfg_dp_config_direct_link(vdev, true, false);
case HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO:
return ucfg_dp_config_direct_link(vdev, true, true);
default:
break;
}
break;
case HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO:
switch (ap_policy) {
case HOST_CONCURRENT_AP_POLICY_UNSPECIFIED:
case HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
return ucfg_dp_config_direct_link(vdev, true, false);
default:
break;
}
break;
case HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
switch (ap_policy) {
case HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO:
return ucfg_dp_config_direct_link(vdev, true, true);
default:
break;
}
break;
default: default:
return ucfg_dp_config_direct_link(vdev, false, false); break;
} }
return QDF_STATUS_SUCCESS;
} }
const struct nla_policy const struct nla_policy
@@ -14390,13 +14421,14 @@ static int __wlan_hdd_cfg80211_ap_policy(struct wlan_objmgr_vdev *vdev,
return -EINVAL; return -EINVAL;
} }
status = wlan_hdd_config_dp_direct_link_profile(vdev, ap_config); ap_cfg_policy = wlan_mlme_convert_ap_policy_config(ap_config);
status = wlan_hdd_config_dp_direct_link_profile(vdev, ap_cfg_policy);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("failed to set DP ap config"); hdd_err("failed to set DP ap config");
return -EINVAL; return -EINVAL;
} }
ap_cfg_policy = wlan_mlme_convert_ap_policy_config(ap_config);
status = ucfg_mlme_set_ap_policy(vdev, ap_cfg_policy); status = ucfg_mlme_set_ap_policy(vdev, ap_cfg_policy);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("failed to set MLME ap config"); hdd_err("failed to set MLME ap config");