qcacmn: add new fields to flow rule HAL API to support PPE

waikiki supports sending a packet from REO2PPE if a flow
rule matches. these changes are added to take advantage of
this HW feature when ever we are adding a flow rule

CRs-Fixed: 3359141
Change-Id: I8fedfcc759bc0427d71d3bb615e61ba38577c5c0
This commit is contained in:
Tallapragada Kalyan
2022-12-01 08:50:18 +05:30
committed by Madan Koyyalamudi
parent 73e6b1ef7c
commit 80e1cfff99
6 changed files with 66 additions and 2 deletions

View File

@@ -2982,12 +2982,18 @@ struct cdp_rx_flow_tuple_info {
* @op_code: add/delete/enable/disable operation requested * @op_code: add/delete/enable/disable operation requested
* @flow_tuple_info: structure containing tuple info * @flow_tuple_info: structure containing tuple info
* @fse_metadata: metadata to be set in RX flow * @fse_metadata: metadata to be set in RX flow
* @use_ppe_ds: use DS mode
* @priority_vld: is priority valid
* @service_code: service code for DS
*/ */
struct cdp_rx_flow_info { struct cdp_rx_flow_info {
bool is_addr_ipv4; bool is_addr_ipv4;
enum cdp_flow_fst_operation op_code; enum cdp_flow_fst_operation op_code;
struct cdp_rx_flow_tuple_info flow_tuple_info; struct cdp_rx_flow_tuple_info flow_tuple_info;
uint16_t fse_metadata; uint16_t fse_metadata;
uint8_t use_ppe_ds;
uint8_t priority_vld;
uint16_t service_code;
}; };
#ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS

View File

@@ -525,9 +525,13 @@ static QDF_STATUS dp_peer_ppeds_default_route_be(struct dp_soc *soc,
{ {
uint16_t service_code; uint16_t service_code;
uint8_t priority_valid; uint8_t priority_valid;
uint8_t use_ppe = PEER_ROUTING_USE_PPE; uint8_t use_ppe_ds = PEER_ROUTING_USE_PPE;
uint8_t peer_routing_enabled = PEER_ROUTING_ENABLED; uint8_t peer_routing_enabled = PEER_ROUTING_ENABLED;
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_cfg_dp_soc_ctxt *cfg = soc->wlan_cfg_ctx;
struct dp_vdev_be *be_vdev;
be_vdev = dp_get_be_vdev_from_dp_vdev(be_peer->peer.vdev);
/* /*
* Program service code bypass to avoid L2 new mac address * Program service code bypass to avoid L2 new mac address
@@ -536,13 +540,23 @@ static QDF_STATUS dp_peer_ppeds_default_route_be(struct dp_soc *soc,
service_code = PPE_DRV_SC_SPF_BYPASS; service_code = PPE_DRV_SC_SPF_BYPASS;
priority_valid = be_peer->priority_valid; priority_valid = be_peer->priority_valid;
/*
* if FST is enabled and MLO is disabled then
* let flow rule take the decision of routing
* the pkt to DS or host
*/
if (wlan_cfg_is_rx_flow_tag_enabled(cfg) &&
qdf_is_macaddr_zero((struct qdf_mac_addr *)
be_vdev->vdev.mld_mac_addr.raw))
use_ppe_ds = 0;
if (soc->cdp_soc.ol_ops->peer_set_ppeds_default_routing) { if (soc->cdp_soc.ol_ops->peer_set_ppeds_default_routing) {
status = status =
soc->cdp_soc.ol_ops->peer_set_ppeds_default_routing soc->cdp_soc.ol_ops->peer_set_ppeds_default_routing
(soc->ctrl_psoc, (soc->ctrl_psoc,
be_peer->peer.mac_addr.raw, be_peer->peer.mac_addr.raw,
service_code, priority_valid, service_code, priority_valid,
src_info, vdev_id, use_ppe, src_info, vdev_id, use_ppe_ds,
peer_routing_enabled); peer_routing_enabled);
if (status != QDF_STATUS_SUCCESS) { if (status != QDF_STATUS_SUCCESS) {
qdf_err("vdev_id: %d, PPE peer routing mac:" qdf_err("vdev_id: %d, PPE peer routing mac:"

View File

@@ -7633,6 +7633,20 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
dp_monitor_print_pdev_tx_capture_stats(pdev); dp_monitor_print_pdev_tx_capture_stats(pdev);
} }
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
{
DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d",
qdf_atomic_read(&pdev->soc->ipv4_fse_cnt));
DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d",
qdf_atomic_read(&pdev->soc->ipv6_fse_cnt));
}
#else
static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
{
}
#endif
void void
dp_print_pdev_rx_stats(struct dp_pdev *pdev) dp_print_pdev_rx_stats(struct dp_pdev *pdev)
{ {
@@ -7717,6 +7731,8 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev)
pdev->stats.rx_buffer_pool.num_bufs_alloc_success); pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu", DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
pdev->stats.rx_buffer_pool.num_pool_bufs_replenish); pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
dp_rx_basic_fst_stats(pdev);
} }
#ifdef WLAN_SUPPORT_PPEDS #ifdef WLAN_SUPPORT_PPEDS

View File

@@ -2627,6 +2627,13 @@ struct dp_soc {
bool high_throughput; bool high_throughput;
#endif #endif
bool is_tx_pause; bool is_tx_pause;
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
/* number of IPv4 flows inserted */
qdf_atomic_t ipv4_fse_cnt;
/* number of IPv6 flows inserted */
qdf_atomic_t ipv6_fse_cnt;
#endif
}; };
#ifdef IPA_OFFLOAD #ifdef IPA_OFFLOAD

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 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
@@ -32,12 +33,18 @@
* @reo_destination_handler: REO destination for this flow * @reo_destination_handler: REO destination for this flow
* @reo_destination_indication: REO indication for this flow * @reo_destination_indication: REO indication for this flow
* @fse_metadata: Flow metadata or tag passed to HW for marking packets * @fse_metadata: Flow metadata or tag passed to HW for marking packets
* @use_ppe_ds: send the pkt to REO2PPE instead of REO2HOST
* @priority_vld: field used by DS
* @service_code: field used by DS
*/ */
struct hal_rx_flow { struct hal_rx_flow {
struct hal_flow_tuple_info tuple_info; struct hal_flow_tuple_info tuple_info;
uint8_t reo_destination_handler; uint8_t reo_destination_handler;
uint8_t reo_destination_indication; uint8_t reo_destination_indication;
uint32_t fse_metadata; uint32_t fse_metadata;
uint8_t use_ppe_ds;
uint8_t priority_vld;
uint16_t service_code;
}; };
/** /**

View File

@@ -1203,6 +1203,20 @@ hal_rx_flow_setup_fse_9224(uint8_t *rx_fst, uint32_t table_offset,
HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL, HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
flow->tuple_info.l4_protocol); flow->tuple_info.l4_protocol);
HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, USE_PPE);
HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, USE_PPE) |=
HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, USE_PPE, flow->use_ppe_ds);
HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID);
HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID) |=
HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID,
flow->priority_vld);
HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SERVICE_CODE);
HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SERVICE_CODE) |=
HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SERVICE_CODE,
flow->service_code);
HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER); HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER);
HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |= HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |=
HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER, HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,