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:

committed by
Madan Koyyalamudi

parent
73e6b1ef7c
commit
80e1cfff99
@@ -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
|
||||||
|
@@ -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:"
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user