Merge "qcawifi: Process full mon via nr_frags"

This commit is contained in:
Linux Build Service Account
2020-08-11 19:37:03 -07:00
committed by Gerrit - the friendly Code Review server
3 changed files with 120 additions and 42 deletions

View File

@@ -422,13 +422,14 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
uint16_t num_msdus = 0, msdu_index, rx_hdr_tlv_len, l3_hdr_pad;
uint32_t total_frag_len = 0, frag_len = 0;
bool drop_mpdu = false;
bool msdu_frag = false;
bool msdu_frag = false, is_first_msdu = true, is_frag_non_raw = false;
void *link_desc_va;
uint8_t *rx_tlv_hdr;
qdf_nbuf_t msdu = NULL, last_msdu = NULL;
uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
struct hal_rx_mon_desc_info *desc_info;
uint16_t prev_ppdu_id;
struct rx_desc_pool *rx_desc_pool = NULL;
desc_info = pdev->mon_desc;
@@ -478,24 +479,43 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
qdf_assert_always(rx_desc);
msdu = rx_desc->nbuf;
msdu = DP_RX_MON_GET_NBUF_FROM_DESC(rx_desc);
if (rx_desc->unmapped == 0) {
qdf_nbuf_unmap_single(soc->osdev,
msdu,
QDF_DMA_FROM_DEVICE);
rx_desc_pool = dp_rx_get_mon_desc_pool(
soc, mac_id, pdev->pdev_id);
dp_rx_mon_buffer_unmap(soc, rx_desc,
rx_desc_pool->buf_size);
rx_desc->unmapped = 1;
}
if (drop_mpdu) {
qdf_nbuf_free(msdu);
dp_rx_mon_buffer_free(rx_desc);
msdu = NULL;
desc_info->msdu_count--;
goto next_msdu;
}
rx_tlv_hdr = qdf_nbuf_data(msdu);
rx_tlv_hdr = dp_rx_mon_get_buffer_data(rx_desc);
if (is_first_msdu) {
if (dp_rx_mon_alloc_parent_buffer(head_msdu)
!= QDF_STATUS_SUCCESS) {
DP_STATS_INC(pdev,
replenish.nbuf_alloc_fail,
1);
qdf_frag_free(rx_tlv_hdr);
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_DEBUG,
"[%s] failed to allocate parent buffer to hold all frag",
__func__);
drop_mpdu = true;
desc_info->msdu_count--;
goto next_msdu;
}
is_first_msdu = false;
}
if (hal_rx_desc_is_first_msdu(soc->hal_soc,
rx_tlv_hdr))
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc,
@@ -508,23 +528,16 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
* b. calculate the number of fragmented buffers for
* a msdu and decrement one msdu_count
*/
if (msdu_list.msdu_info[msdu_index].msdu_flags
& HAL_MSDU_F_MSDU_CONTINUATION) {
if (!msdu_frag) {
total_frag_len = msdu_list.msdu_info[msdu_index].msdu_len;
msdu_frag = true;
}
dp_mon_adjust_frag_len(&total_frag_len,
&frag_len);
} else {
if (msdu_frag)
dp_mon_adjust_frag_len(&total_frag_len,
&frag_len);
else
frag_len = msdu_list.msdu_info[msdu_index].msdu_len;
msdu_frag = false;
dp_rx_mon_parse_desc_buffer(soc,
&(msdu_list.msdu_info[msdu_index]),
&msdu_frag,
&total_frag_len,
&frag_len,
&l3_hdr_pad,
rx_tlv_hdr,
&is_frag_non_raw, rx_tlv_hdr);
if (!msdu_frag)
desc_info->msdu_count--;
}
rx_hdr_tlv_len = SIZE_OF_MONITOR_TLV;
@@ -535,9 +548,6 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
* header begins.
*/
l3_hdr_pad = hal_rx_msdu_end_l3_hdr_padding_get(
soc->hal_soc,
rx_tlv_hdr);
/*******************************************************
* RX_PACKET *
@@ -546,17 +556,14 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
* ----------------------------------------------------*
******************************************************/
qdf_nbuf_set_pktlen(msdu,
rx_hdr_tlv_len +
l3_hdr_pad +
frag_len);
dp_rx_mon_buffer_set_pktlen(msdu,
rx_hdr_tlv_len +
l3_hdr_pad +
frag_len);
if (head_msdu && !*head_msdu)
*head_msdu = msdu;
else if (last_msdu)
qdf_nbuf_set_next(last_msdu, msdu);
last_msdu = msdu;
dp_rx_mon_add_msdu_to_list(head_msdu, msdu, &last_msdu,
rx_tlv_hdr, frag_len,
l3_hdr_pad);
next_msdu:
rx_buf_reaped++;
@@ -592,10 +599,8 @@ next_msdu:
}
pdev->rx_mon_stats.dest_mpdu_done++;
if (last_msdu)
qdf_nbuf_set_next(last_msdu, NULL);
*tail_msdu = msdu;
dp_rx_mon_init_tail_msdu(msdu, last_msdu, tail_msdu);
dp_rx_mon_remove_raw_frame_fcs_len(head_msdu);
return rx_buf_reaped;
}

View File

@@ -96,6 +96,39 @@ void dp_rx_update_rx_err_protocol_tag_stats(struct dp_pdev *pdev,
* Return: void
*/
#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
#ifdef DP_RX_MON_MEM_FRAG
/**
* dp_rx_update_proto_tag() - Update protocol tag to nbuf cb or to headroom
*
* @nbuf: QDF pkt buffer on which the protocol tag should be set
* @protocol_tag: Protocol tag
*/
static inline
void dp_rx_update_proto_tag(qdf_nbuf_t nbuf, uint16_t protocol_tag)
{
uint8_t idx;
uint8_t *nbuf_head = NULL;
if (qdf_nbuf_get_nr_frags(nbuf)) {
/* Get frag index, which was saved while restitch */
idx = QDF_NBUF_CB_RX_CTX_ID(nbuf);
nbuf_head = qdf_nbuf_head(nbuf);
nbuf_head += (idx * DP_RX_MON_PF_TAG_SIZE);
*((uint16_t *)nbuf_head) = protocol_tag;
} else {
qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
}
}
#else
static inline
void dp_rx_update_proto_tag(qdf_nbuf_t nbuf, uint16_t protocol_tag)
{
qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
}
#endif
void
dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr,
@@ -156,7 +189,8 @@ dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
* received protocol type.
*/
protocol_tag = pdev->rx_proto_tag_map[cce_metadata].tag;
qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
dp_rx_update_proto_tag(nbuf, protocol_tag);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
"Seq:%u dcap:%u CCE Match:%u ProtoID:%u Tag:%u stats:%u",
hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr),
@@ -189,6 +223,41 @@ dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
* Return: void
*/
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
#ifdef DP_RX_MON_MEM_FRAG
/**
* dp_rx_update_flow_tags() - Update protocol tag to nbuf cb or to headroom
*
* @nbuf: QDF pkt buffer on which the protocol tag should be set
* @flow_tag: Flow tag
*/
static inline
void dp_rx_update_flow_tags(qdf_nbuf_t nbuf, uint32_t flow_tag)
{
uint8_t idx;
uint8_t *nbuf_head = NULL;
uint16_t updated_flow_tag = (uint16_t)(flow_tag & 0xFFFF);
if (qdf_nbuf_get_nr_frags(nbuf)) {
/* Get frag index, which was saved while restitch */
idx = QDF_NBUF_CB_RX_CTX_ID(nbuf);
nbuf_head = qdf_nbuf_head(nbuf);
nbuf_head += ((idx * DP_RX_MON_PF_TAG_SIZE) +
sizeof(uint16_t));
*((uint16_t *)nbuf_head) = updated_flow_tag;
} else {
qdf_nbuf_set_rx_flow_tag(nbuf, flow_tag);
}
}
#else
static inline
void dp_rx_update_flow_tags(qdf_nbuf_t nbuf, uint16_t flow_tag)
{
qdf_nbuf_set_rx_flow_tag(nbuf, flow_tag);
}
#endif
void
dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev,
qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, bool update_stats)
@@ -240,7 +309,7 @@ dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev,
fse_metadata = hal_rx_msdu_fse_metadata_get(soc->hal_soc, rx_tlv_hdr) & 0xFFFF;
/* update the skb->cb with the user-specified tag/metadata */
qdf_nbuf_set_rx_flow_tag(nbuf, fse_metadata);
dp_rx_update_flow_tags(nbuf, fse_metadata);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
"Seq:%u dcap:%u invalid:%u timeout:%u flow:%u tag:%u stat:%u",

View File

@@ -22,6 +22,10 @@
#include "dp_internal.h"
#include "dp_types.h"
#ifdef DP_RX_MON_MEM_FRAG
#define DP_RX_MON_PF_TAG_SIZE (4)
#endif
#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
/**
* dp_update_pdev_rx_protocol_tag - Add/remove a protocol tag that should be