1
0

qcacmn: Host Static Memory Optimization (in NSS offload mode)

Low memory profiles like 256M and 16M profiles support
only NSS Wi-Fi offload mode and HOST data path APIs are
not used in NSS offload mode

Disable HOST data path APIs which are not used in both
NSS Wi-Fi offload mode and in HOST mode (in NSS offload mode)

CRs-Fixed: 2831478
Change-Id: I6895054a6c96bd446c2df7761ce65feef662a3cc
Este cometimento está contido em:
phadiman
2020-12-12 15:54:49 +05:30
cometido por snandini
ascendente 21de33ef5d
cometimento d1bb528ae7
6 ficheiros modificados com 270 adições e 191 eliminações

Ver ficheiro

@@ -1957,6 +1957,8 @@ budget_done:
return total_budget - budget;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/*
* dp_service_srngs() - Top level interrupt handler for DP Ring interrupts
* @dp_ctx: DP SOC handle
@@ -2093,6 +2095,43 @@ budget_done:
return dp_budget - budget;
}
#else /* QCA_HOST_MODE_WIFI_DISABLED */
/*
* dp_service_srngs() - Top level handler for DP Monitor Ring interrupts
* @dp_ctx: DP SOC handle
* @budget: Number of frames/descriptors that can be processed in one shot
*
* Return: remaining budget/quota for the soc device
*/
static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
{
struct dp_intr *int_ctx = (struct dp_intr *)dp_ctx;
struct dp_intr_stats *intr_stats = &int_ctx->intr_stats;
struct dp_soc *soc = int_ctx->soc;
uint32_t remaining_quota = dp_budget;
uint32_t work_done = 0;
int budget = dp_budget;
if (qdf_unlikely(!(soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING))) {
work_done = dp_process_lmac_rings(int_ctx, remaining_quota);
if (work_done) {
budget -= work_done;
if (budget <= 0)
goto budget_done;
remaining_quota = budget;
}
}
qdf_lro_flush(int_ctx->lro_ctx);
intr_stats->num_masks++;
budget_done:
return dp_budget - budget;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/* dp_mon_vdev_timer()- timer poll for interrupts
*
* @arg: SoC Handle
@@ -5564,6 +5603,7 @@ fail0:
return QDF_STATUS_E_FAILURE;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_vdev_register_tx_handler() - Register Tx handler
* @vdev: struct dp_vdev *
@@ -5575,7 +5615,6 @@ static inline void dp_vdev_register_tx_handler(struct dp_vdev *vdev,
struct ol_txrx_ops *txrx_ops)
{
/* Enable vdev_id check only for ap, if flag is enabled */
if (vdev->mesh_vdev)
txrx_ops->tx.tx = dp_tx_send_mesh;
else if ((wlan_cfg_is_tx_per_pkt_vdev_id_check_enabled(soc->wlan_cfg_ctx)) &&
@@ -5595,6 +5634,13 @@ static inline void dp_vdev_register_tx_handler(struct dp_vdev *vdev,
wlan_cfg_is_tx_per_pkt_vdev_id_check_enabled(soc->wlan_cfg_ctx),
vdev->opmode, vdev->vdev_id);
}
#else /* QCA_HOST_MODE_WIFI_DISABLED */
static inline void dp_vdev_register_tx_handler(struct dp_vdev *vdev,
struct dp_soc *soc,
struct ol_txrx_ops *txrx_ops)
{
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dp_vdev_register_wifi3() - Register VDEV operations from osif layer
@@ -11021,8 +11067,12 @@ static struct cdp_cmn_ops dp_ops_cmn = {
.txrx_soc_detach = dp_soc_detach_wifi3,
.txrx_soc_deinit = dp_soc_deinit_wifi3,
.txrx_soc_init = dp_soc_init_wifi3,
#ifndef QCA_HOST_MODE_WIFI_DISABLED
.txrx_tso_soc_attach = dp_tso_soc_attach,
.txrx_tso_soc_detach = dp_tso_soc_detach,
.tx_send = dp_tx_send,
.tx_send_exc = dp_tx_send_exception,
#endif
.txrx_pdev_init = dp_pdev_init_wifi3,
.txrx_get_vdev_mac_addr = dp_get_vdev_mac_addr_wifi3,
.txrx_get_mon_vdev_from_pdev = dp_get_mon_vdev_from_pdev_wifi3,
@@ -11060,7 +11110,6 @@ static struct cdp_cmn_ops dp_ops_cmn = {
.set_pdev_status_down = dp_soc_set_pdev_status_down,
.txrx_set_ba_aging_timeout = dp_set_ba_aging_timeout,
.txrx_get_ba_aging_timeout = dp_get_ba_aging_timeout,
.tx_send = dp_tx_send,
.txrx_peer_reset_ast = dp_wds_reset_ast_wifi3,
.txrx_peer_reset_ast_table = dp_wds_reset_ast_table_wifi3,
.txrx_peer_flush_ast_table = dp_wds_flush_ast_table_wifi3,
@@ -11085,7 +11134,6 @@ static struct cdp_cmn_ops dp_ops_cmn = {
.set_vlan_groupkey = dp_set_vlan_groupkey,
#endif
.get_peer_mac_list = dp_get_peer_mac_list,
.tx_send_exc = dp_tx_send_exception,
#ifdef QCA_SUPPORT_WDS_EXTENDED
.get_wds_ext_peer_id = dp_wds_ext_get_peer_id,
.set_wds_ext_peer_rx = dp_wds_ext_set_peer_rx,
@@ -11156,11 +11204,13 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
};
static struct cdp_me_ops dp_ops_me = {
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef ATH_SUPPORT_IQUE
.tx_me_alloc_descriptor = dp_tx_me_alloc_descriptor,
.tx_me_free_descriptor = dp_tx_me_free_descriptor,
.tx_me_convert_ucast = dp_tx_me_send_convert_ucast,
#endif
#endif
};
static struct cdp_mon_ops dp_ops_mon = {

Ver ficheiro

@@ -35,6 +35,8 @@
#include "dp_hist.h"
#include "dp_rx_buffer_pool.h"
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef ATH_RX_PRI_SAVE
#define DP_RX_TID_SAVE(_nbuf, _tid) \
(qdf_nbuf_set_priority(_nbuf, _tid))
@@ -65,6 +67,8 @@ static inline bool dp_rx_check_ap_bridge(struct dp_vdev *vdev)
return vdev->ap_bridge_enabled;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifdef DUP_RX_DESC_WAR
void dp_rx_dump_info_and_assert(struct dp_soc *soc,
hal_ring_handle_t hal_ring,
@@ -91,6 +95,7 @@ void dp_rx_dump_info_and_assert(struct dp_soc *soc,
}
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef RX_DESC_SANITY_WAR
static inline
QDF_STATUS dp_rx_desc_sanity(struct dp_soc *soc, hal_soc_handle_t hal_soc,
@@ -136,6 +141,8 @@ QDF_STATUS dp_rx_desc_sanity(struct dp_soc *soc, hal_soc_handle_t hal_soc,
}
#endif
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dp_pdev_frag_alloc_and_map() - Allocate frag for desc buffer and map
*
@@ -483,6 +490,8 @@ dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list,
vdev->osif_rx(vdev->osif_vdev, deliver_list_head);
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifndef FEATURE_WDS
static void
dp_rx_da_learn(struct dp_soc *soc,
@@ -652,6 +661,8 @@ end:
return false;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifdef MESH_MODE_SUPPORT
/**
@@ -1090,6 +1101,8 @@ void dp_rx_process_invalid_peer_wrapper(struct dp_soc *soc,
}
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef RECEIVE_OFFLOAD
/**
* dp_rx_print_offload_info() - Print offload info from RX TLV
@@ -1288,6 +1301,8 @@ qdf_nbuf_t dp_rx_sg_create(struct dp_soc *soc, qdf_nbuf_t nbuf)
return parent;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifdef QCA_PEER_EXT_STATS
/*
* dp_rx_compute_tid_delay - Computer per TID delay stats
@@ -1696,6 +1711,8 @@ void dp_rx_deliver_to_stack(struct dp_soc *soc,
dp_rx_check_delivery_to_stack(soc, vdev, peer, nbuf_head);
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_rx_cksum_offload() - set the nbuf checksum as defined by hardware.
* @nbuf: pointer to the first msdu of an amsdu.
@@ -2078,6 +2095,8 @@ uint32_t dp_rx_srng_get_num_pending(hal_soc_handle_t hal_soc,
return num_pending;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifdef WLAN_SUPPORT_RX_FISA
void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding)
{
@@ -2109,6 +2128,8 @@ void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding)
}
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef DP_RX_DROP_RAW_FRM
/**
* dp_rx_is_raw_frame_dropped() - if raw frame nbuf, free and drop
@@ -2904,6 +2925,8 @@ done:
return rx_bufs_used; /* Assume no scale factor for now */
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
QDF_STATUS dp_rx_vdev_detach(struct dp_vdev *vdev)
{
QDF_STATUS ret;

Ver ficheiro

@@ -73,6 +73,7 @@ enum dp_rx_desc_state {
RX_DESC_IN_FREELIST,
};
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* struct dp_rx_desc_dbg_info
*
@@ -91,6 +92,8 @@ struct dp_rx_desc_dbg_info {
uint64_t replenish_ts;
};
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* struct dp_rx_desc
*
@@ -127,6 +130,8 @@ struct dp_rx_desc {
in_err_state:1;
};
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/* RX Descriptor Multi Page memory alloc related */
#define DP_RX_DESC_OFFSET_NUM_BITS 8
#define DP_RX_DESC_PAGE_ID_NUM_BITS 8
@@ -151,6 +156,8 @@ struct dp_rx_desc {
#define DP_RX_DESC_MULTI_PAGE_COOKIE_GET_OFFSET(_cookie) \
((_cookie) & RX_DESC_MULTI_PAGE_COOKIE_OFFSET_MASK)
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#define RX_DESC_COOKIE_INDEX_SHIFT 0
#define RX_DESC_COOKIE_INDEX_MASK 0x3ffff /* 18 bits */
#define RX_DESC_COOKIE_POOL_ID_SHIFT 18
@@ -246,6 +253,8 @@ bool dp_rx_deliver_special_frame(struct dp_soc *soc, struct dp_peer *peer,
*/
#define DP_SKIP_VLAN 8
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* struct dp_rx_cached_buf - rx cached buffer
* @list: linked list node
@@ -256,6 +265,8 @@ struct dp_rx_cached_buf {
qdf_nbuf_t buf;
};
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/*
*dp_rx_xor_block() - xor block of data
*@b: destination data block
@@ -540,6 +551,8 @@ void *dp_rx_cookie_2_va_mon_status(struct dp_soc *soc, uint32_t cookie)
}
#endif /* RX_DESC_MULTI_PAGE_ALLOC */
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef DP_RX_DESC_COOKIE_INVALIDATE
static inline QDF_STATUS
dp_rx_cookie_check_and_invalidate(hal_ring_desc_t ring_desc)
@@ -558,6 +571,8 @@ dp_rx_cookie_check_and_invalidate(hal_ring_desc_t ring_desc)
}
#endif
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
QDF_STATUS dp_rx_desc_pool_is_allocated(struct rx_desc_pool *rx_desc_pool);
QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc,
uint32_t pool_size,
@@ -580,7 +595,6 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
union dp_rx_desc_list_elem_t **desc_list,
union dp_rx_desc_list_elem_t **tail);
QDF_STATUS dp_rx_pdev_desc_pool_alloc(struct dp_pdev *pdev);
void dp_rx_pdev_desc_pool_free(struct dp_pdev *pdev);
@@ -606,6 +620,8 @@ void dp_print_napi_stats(struct dp_soc *soc);
*/
QDF_STATUS dp_rx_vdev_detach(struct dp_vdev *vdev);
#ifndef QCA_HOST_MODE_WIFI_DISABLED
uint32_t
dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
uint8_t reo_ring_num,
@@ -669,6 +685,8 @@ qdf_nbuf_t dp_rx_sg_create(struct dp_soc *soc, qdf_nbuf_t nbuf);
void dp_rx_desc_nbuf_and_pool_free(struct dp_soc *soc, uint32_t pool_id,
struct rx_desc_pool *rx_desc_pool);
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/*
* dp_rx_desc_nbuf_free() - free the sw rx desc nbufs called during
* de-initialization of wifi module.
@@ -1017,6 +1035,8 @@ void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
return link_desc_va;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_rx_defrag_concat() - Concatenate the fragments
*
@@ -1047,6 +1067,8 @@ static inline QDF_STATUS dp_rx_defrag_concat(qdf_nbuf_t dst, qdf_nbuf_t src)
return QDF_STATUS_E_DEFRAG_ERROR;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifndef FEATURE_WDS
static inline QDF_STATUS dp_rx_ast_set_active(struct dp_soc *soc, uint16_t sa_idx, bool is_active)
{
@@ -1075,6 +1097,8 @@ static inline void dp_rx_desc_dump(struct dp_rx_desc *rx_desc)
rx_desc->in_use, rx_desc->unmapped);
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/*
* check_qwrap_multicast_loopback() - Check if rx packet is a loopback packet.
* In qwrap mode, packets originated from
@@ -1120,6 +1144,8 @@ static inline bool check_qwrap_multicast_loopback(struct dp_vdev *vdev,
}
#endif
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
defined(WLAN_SUPPORT_RX_TAG_STATISTICS) ||\
defined(WLAN_SUPPORT_RX_FLOW_TAG)
@@ -1415,6 +1441,8 @@ bool dp_rx_multipass_process(struct dp_peer *peer, qdf_nbuf_t nbuf,
uint8_t tid);
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifndef WLAN_RX_PKT_CAPTURE_ENH
static inline
QDF_STATUS dp_peer_set_rx_capture_enabled(struct dp_pdev *pdev,
@@ -1425,6 +1453,8 @@ QDF_STATUS dp_peer_set_rx_capture_enabled(struct dp_pdev *pdev,
}
#endif
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dp_rx_deliver_to_stack() - deliver pkts to network stack
* Caller to hold peer refcount and check for valid peer
@@ -1442,6 +1472,8 @@ void dp_rx_deliver_to_stack(struct dp_soc *soc,
qdf_nbuf_t nbuf_head,
qdf_nbuf_t nbuf_tail);
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef QCA_OL_RX_LOCK_LESS_ACCESS
/*
* dp_rx_ring_access_start()- Wrapper function to log access start of a hal ring
@@ -1488,6 +1520,8 @@ dp_rx_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *soc,
}
#endif
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/*
* dp_rx_wbm_sg_list_reset() - Initialize sg list
*
@@ -1520,6 +1554,8 @@ static inline void dp_rx_wbm_sg_list_deinit(struct dp_soc *soc)
}
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL
#define DP_RX_PROCESS_NBUF(soc, head, tail, ebuf_head, ebuf_tail, rx_desc) \
do { \
@@ -1542,6 +1578,8 @@ static inline void dp_rx_wbm_sg_list_deinit(struct dp_soc *soc)
DP_RX_LIST_APPEND(head, tail, rx_desc->nbuf)
#endif /* WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL */
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/*
* dp_rx_link_desc_refill_duplicate_check() - check if link desc duplicate
to refill

Ver ficheiro

@@ -33,6 +33,8 @@
#include "qdf_net_types.h"
#include "dp_rx_buffer_pool.h"
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/* Max buffer in invalid peer SG list*/
#define DP_MAX_INVALID_BUFFERS 10
@@ -158,6 +160,8 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
return false;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
void dp_rx_link_desc_refill_duplicate_check(
struct dp_soc *soc,
struct hal_buf_info *buf_info,
@@ -268,6 +272,8 @@ dp_rx_link_desc_return(struct dp_soc *soc, hal_ring_desc_t ring_desc,
return dp_rx_link_desc_return_by_addr(soc, buf_addr_info, bm_action);
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_rx_msdus_drop() - Drops all MSDU's per MPDU
*
@@ -889,6 +895,8 @@ next:
qdf_nbuf_free(nbuf);
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dp_2k_jump_handle() - Function to handle 2k jump exception
* on WBM ring
@@ -1066,6 +1074,8 @@ bool dp_rx_check_pkt_len(struct dp_soc *soc, uint32_t pkt_len)
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_rx_null_q_desc_handle() - Function to handle NULL Queue
* descriptor violation on either a
@@ -1297,6 +1307,8 @@ drop_nbuf:
return QDF_STATUS_E_FAILURE;
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dp_rx_process_rxdma_err() - Function to deliver rxdma unencrypted_err
* frames to OS or wifi parse errors.
@@ -1553,6 +1565,8 @@ fail:
return;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
#ifdef DP_RX_DESC_COOKIE_INVALIDATE
/**
* dp_rx_link_cookie_check() - Validate link desc cookie
@@ -2344,6 +2358,8 @@ done:
return rx_bufs_used; /* Assume no scale factor for now */
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* dup_desc_dbg() - dump and assert if duplicate rx desc found
*
@@ -2588,6 +2604,8 @@ dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
return work_done;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
static inline uint32_t
dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
hal_rxdma_desc_t rxdma_dst_ring_desc,
@@ -2744,3 +2762,5 @@ dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
&head, &tail);
}
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */

Ver ficheiro

@@ -310,6 +310,7 @@ static void dp_tx_tso_desc_release(struct dp_soc *soc,
{
}
#endif
/**
* dp_tx_desc_release() - Release Tx Descriptor
* @tx_desc : Tx Descriptor
@@ -3355,133 +3356,6 @@ static void dp_tx_inspect_handler(struct dp_soc *soc,
dp_tx_desc_release(tx_desc, tx_desc->pool_id);
}
#ifdef FEATURE_PERPKT_INFO
/**
* dp_get_completion_indication_for_stack() - send completion to stack
* @soc : dp_soc handle
* @pdev: dp_pdev handle
* @peer: dp peer handle
* @ts: transmit completion status structure
* @netbuf: Buffer pointer for free
*
* This function is used for indication whether buffer needs to be
* sent to stack for freeing or not
*/
QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer,
struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf,
uint64_t time_latency)
{
struct tx_capture_hdr *ppdu_hdr;
uint16_t peer_id = ts->peer_id;
uint32_t ppdu_id = ts->ppdu_id;
uint8_t first_msdu = ts->first_msdu;
uint8_t last_msdu = ts->last_msdu;
uint32_t txcap_hdr_size = sizeof(struct tx_capture_hdr);
if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode &&
!pdev->latency_capture_enable))
return QDF_STATUS_E_NOSUPPORT;
if (!peer) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("Peer Invalid"));
return QDF_STATUS_E_INVAL;
}
if (pdev->mcopy_mode) {
/* If mcopy is enabled and mcopy_mode is M_COPY deliver 1st MSDU
* per PPDU. If mcopy_mode is M_COPY_EXTENDED deliver 1st MSDU
* for each MPDU
*/
if (pdev->mcopy_mode == M_COPY) {
if ((pdev->m_copy_id.tx_ppdu_id == ppdu_id) &&
(pdev->m_copy_id.tx_peer_id == peer_id)) {
return QDF_STATUS_E_INVAL;
}
}
if (!first_msdu)
return QDF_STATUS_E_INVAL;
pdev->m_copy_id.tx_ppdu_id = ppdu_id;
pdev->m_copy_id.tx_peer_id = peer_id;
}
if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) {
netbuf = qdf_nbuf_realloc_headroom(netbuf, txcap_hdr_size);
if (!netbuf) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("No headroom"));
return QDF_STATUS_E_NOMEM;
}
}
if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("No headroom"));
return QDF_STATUS_E_NOMEM;
}
ppdu_hdr = (struct tx_capture_hdr *)qdf_nbuf_data(netbuf);
qdf_mem_copy(ppdu_hdr->ta, peer->vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE);
qdf_mem_copy(ppdu_hdr->ra, peer->mac_addr.raw,
QDF_MAC_ADDR_SIZE);
ppdu_hdr->ppdu_id = ppdu_id;
ppdu_hdr->peer_id = peer_id;
ppdu_hdr->first_msdu = first_msdu;
ppdu_hdr->last_msdu = last_msdu;
if (qdf_unlikely(pdev->latency_capture_enable)) {
ppdu_hdr->tsf = ts->tsf;
ppdu_hdr->time_latency = time_latency;
}
return QDF_STATUS_SUCCESS;
}
/**
* dp_send_completion_to_stack() - send completion to stack
* @soc : dp_soc handle
* @pdev: dp_pdev handle
* @peer_id: peer_id of the peer for which completion came
* @ppdu_id: ppdu_id
* @netbuf: Buffer pointer for free
*
* This function is used to send completion to stack
* to free buffer
*/
void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
qdf_nbuf_t netbuf)
{
dp_wdi_event_handler(WDI_EVENT_TX_DATA, soc,
netbuf, peer_id,
WDI_NO_VAL, pdev->pdev_id);
}
#else
static QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer,
struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf,
uint64_t time_latency)
{
return QDF_STATUS_E_NOSUPPORT;
}
static void
dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id, qdf_nbuf_t netbuf)
{
}
#endif
#ifdef MESH_MODE_SUPPORT
/**
* dp_tx_comp_fill_tx_completion_stats() - Fill per packet Tx completion stats
@@ -4178,6 +4052,7 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc,
out:
return;
}
/**
* dp_tx_comp_process_desc_list() - Tx complete software descriptor handler
* @soc: core txrx main context
@@ -4739,10 +4614,10 @@ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
* Fill HTT TCL Metadata with Vdev ID and MAC ID
*/
HTT_TX_TCL_METADATA_TYPE_SET(vdev->htt_tcl_metadata,
HTT_TCL_METADATA_TYPE_VDEV_BASED);
HTT_TCL_METADATA_TYPE_VDEV_BASED);
HTT_TX_TCL_METADATA_VDEV_ID_SET(vdev->htt_tcl_metadata,
vdev->vdev_id);
vdev->vdev_id);
pdev_id =
dp_get_target_pdev_id_for_host_pdev_id(vdev->pdev->soc,
@@ -4993,29 +4868,6 @@ QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)
return QDF_STATUS_SUCCESS;
}
/**
* dp_tx_pdev_attach() - attach pdev to dp tx
* @pdev: physical device instance
*
* Return: QDF_STATUS_SUCCESS: success
* QDF_STATUS_E_RESOURCES: Error return
*/
QDF_STATUS dp_tx_pdev_init(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
/* Initialize Flow control counters */
qdf_atomic_init(&pdev->num_tx_outstanding);
pdev->tx_descs_max = 0;
if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) {
/* Initialize descriptors in TCL Ring */
hal_tx_init_data_ring(soc->hal_soc,
soc->tcl_data_ring[pdev->pdev_id].hal_srng);
}
return QDF_STATUS_SUCCESS;
}
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
/* Pools will be allocated dynamically */
static QDF_STATUS dp_tx_alloc_static_pools(struct dp_soc *soc, int num_pool,
@@ -5368,4 +5220,3 @@ QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc)
return QDF_STATUS_SUCCESS;
}

Ver ficheiro

@@ -21,7 +21,10 @@
#include <qdf_types.h>
#include <qdf_nbuf.h>
#include "dp_types.h"
#if defined(MESH_MODE_SUPPORT) || defined(FEATURE_PERPKT_INFO)
#include "if_meta_hdr.h"
#endif
#include "dp_internal.h"
#define DP_INVALID_VDEV_ID 0xFF
@@ -71,6 +74,8 @@ do { \
/* number of dwords for htt_tx_msdu_desc_ext2_t */
#define DP_TX_MSDU_INFO_META_DATA_DWORDS 7
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* struct dp_tx_frag_info_s
* @vaddr: hlos vritual address for buffer
@@ -101,6 +106,8 @@ struct dp_tx_seg_info_s {
struct dp_tx_seg_info_s *next;
};
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
/**
* struct dp_tx_sg_info_s - Scatter Gather Descriptor
* @num_segs: Number of segments (TSO/ME) in the frame
@@ -167,6 +174,7 @@ struct dp_tx_msdu_info_s {
uint16_t ppdu_cookie;
};
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_tx_deinit_pair_by_index() - Deinit TX rings based on index
* @soc: core txrx context
@@ -180,10 +188,8 @@ struct dp_tx_msdu_info_s {
* Return: none
*/
void dp_tx_deinit_pair_by_index(struct dp_soc *soc, int index);
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev);
QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev);
void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev);
void dp_tx_tso_cmn_desc_pool_deinit(struct dp_soc *soc, uint8_t num_pool);
void dp_tx_tso_cmn_desc_pool_free(struct dp_soc *soc, uint8_t num_pool);
QDF_STATUS dp_tx_tso_cmn_desc_pool_alloc(struct dp_soc *soc,
@@ -195,17 +201,14 @@ QDF_STATUS dp_tx_tso_cmn_desc_pool_init(struct dp_soc *soc,
void dp_tx_tso_cmn_desc_pool_deinit(struct dp_soc *soc, uint8_t num_pool);
void dp_tx_tso_cmn_desc_pool_free(struct dp_soc *soc, uint8_t num_pool);
void dp_soc_tx_desc_sw_pools_free(struct dp_soc *soc);
void dp_soc_tx_desc_sw_pools_deinit(struct dp_soc *soc);
QDF_STATUS dp_tx_tso_cmn_desc_pool_alloc(struct dp_soc *soc,
uint8_t num_pool,
uint16_t num_desc);
QDF_STATUS dp_tx_tso_cmn_desc_pool_init(struct dp_soc *soc,
uint8_t num_pool,
uint16_t num_desc);
QDF_STATUS dp_soc_tx_desc_sw_pools_alloc(struct dp_soc *soc);
QDF_STATUS dp_soc_tx_desc_sw_pools_init(struct dp_soc *soc);
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_tso_attach() - TSO Attach handler
* @txrx_soc: Opaque Dp handle
@@ -228,8 +231,6 @@ QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc);
*/
QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc);
QDF_STATUS dp_tx_pdev_init(struct dp_pdev *pdev);
qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf);
qdf_nbuf_t dp_tx_send_vdev_id_check(struct cdp_soc_t *soc, uint8_t vdev_id,
@@ -299,15 +300,41 @@ dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
QDF_STATUS
dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
#ifndef FEATURE_WDS
static inline void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#if defined(QCA_HOST_MODE_WIFI_DISABLED) || !defined(ATH_SUPPORT_IQUE)
static inline void dp_tx_me_exit(struct dp_pdev *pdev)
{
return;
}
#endif
#ifndef ATH_SUPPORT_IQUE
static inline void dp_tx_me_exit(struct dp_pdev *pdev)
/**
* dp_tx_pdev_init() - dp tx pdev init
* @pdev: physical device instance
*
* Return: QDF_STATUS_SUCCESS: success
* QDF_STATUS_E_RESOURCES: Error return
*/
static inline QDF_STATUS dp_tx_pdev_init(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
/* Initialize Flow control counters */
qdf_atomic_init(&pdev->num_tx_outstanding);
pdev->tx_descs_max = 0;
if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) {
/* Initialize descriptors in TCL Ring */
hal_tx_init_data_ring(soc->hal_soc,
soc->tcl_data_ring[pdev->pdev_id].hal_srng);
}
return QDF_STATUS_SUCCESS;
}
#ifndef FEATURE_WDS
static inline void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
{
return;
}
@@ -356,6 +383,7 @@ static inline enum qdf_dp_tx_rx_status dp_tx_hw_to_qdf(uint16_t status)
}
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/**
* dp_tx_get_queue() - Returns Tx queue IDs to be used for this Tx frame
* @vdev: DP Virtual device handle
@@ -504,20 +532,6 @@ static inline void dp_tx_hal_ring_access_end_reap(struct dp_soc *soc,
}
#endif
#ifdef FEATURE_PERPKT_INFO
QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer,
struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf,
uint64_t time_latency);
void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
qdf_nbuf_t netbuf);
#endif
void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl);
#ifdef ATH_TX_PRI_OVERRIDE
@@ -527,10 +541,6 @@ void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl);
#define DP_TX_TID_OVERRIDE(_msdu_info, _nbuf)
#endif
void
dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
uint32_t buf_type);
/* TODO TX_FEATURE_NOT_YET */
static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
{
@@ -538,6 +548,94 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
}
/* TODO TX_FEATURE_NOT_YET */
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
bool force_free);
QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev);
QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev);
void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev);
QDF_STATUS dp_soc_tx_desc_sw_pools_alloc(struct dp_soc *soc);
QDF_STATUS dp_soc_tx_desc_sw_pools_init(struct dp_soc *soc);
void dp_soc_tx_desc_sw_pools_free(struct dp_soc *soc);
void dp_soc_tx_desc_sw_pools_deinit(struct dp_soc *soc);
void
dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
uint32_t buf_type);
#else /* QCA_HOST_MODE_WIFI_DISABLED */
static inline
QDF_STATUS dp_soc_tx_desc_sw_pools_alloc(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS dp_soc_tx_desc_sw_pools_init(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static inline void dp_soc_tx_desc_sw_pools_free(struct dp_soc *soc)
{
}
static inline void dp_soc_tx_desc_sw_pools_deinit(struct dp_soc *soc)
{
}
static inline
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
bool force_free)
{
}
static inline QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)
{
return QDF_STATUS_SUCCESS;
}
static inline void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
{
}
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
#ifdef FEATURE_PERPKT_INFO
QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer,
struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf,
uint64_t time_latency);
void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
qdf_nbuf_t netbuf);
#else
static inline
QDF_STATUS dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer,
struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf,
uint64_t time_latency)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline
void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
qdf_nbuf_t netbuf)
{
}
#endif
#ifndef WLAN_TX_PKT_CAPTURE_ENH
static inline
QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev,
@@ -547,6 +645,5 @@ QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev,
return QDF_STATUS_SUCCESS;
}
#endif
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
bool force_free);
#endif