qcacmn: compact tlv support for QCN9224
Adding compact tlv support for QCN9224, As part of this change Rx tlv size will reduce from 384 bytes to 128 bytes. Change-Id: I3f42a781e42b2e696a5b25d9c5f333c8cc83b7fe CRs-Fixed: 3274152
This commit is contained in:

committed by
Madan Koyyalamudi

父節點
ca6127c6de
當前提交
12c8b0d0be
@@ -1013,3 +1013,79 @@ QDF_STATUS dp_wbm_get_rx_desc_from_hal_desc_li(
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
bool dp_rx_chain_msdus_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
||||
uint8_t *rx_tlv_hdr, uint8_t mac_id)
|
||||
{
|
||||
bool mpdu_done = false;
|
||||
qdf_nbuf_t curr_nbuf = NULL;
|
||||
qdf_nbuf_t tmp_nbuf = NULL;
|
||||
|
||||
/* TODO: Currently only single radio is supported, hence
|
||||
* pdev hard coded to '0' index
|
||||
*/
|
||||
struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
|
||||
|
||||
if (!dp_pdev) {
|
||||
dp_rx_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
|
||||
return mpdu_done;
|
||||
}
|
||||
/* if invalid peer SG list has max values free the buffers in list
|
||||
* and treat current buffer as start of list
|
||||
*
|
||||
* current logic to detect the last buffer from attn_tlv is not reliable
|
||||
* in OFDMA UL scenario hence add max buffers check to avoid list pile
|
||||
* up
|
||||
*/
|
||||
if (!dp_pdev->first_nbuf ||
|
||||
(dp_pdev->invalid_peer_head_msdu &&
|
||||
QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST
|
||||
(dp_pdev->invalid_peer_head_msdu) >= DP_MAX_INVALID_BUFFERS)) {
|
||||
qdf_nbuf_set_rx_chfrag_start(nbuf, 1);
|
||||
dp_pdev->ppdu_id = hal_rx_get_ppdu_id(soc->hal_soc,
|
||||
rx_tlv_hdr);
|
||||
dp_pdev->first_nbuf = true;
|
||||
|
||||
/* If the new nbuf received is the first msdu of the
|
||||
* amsdu and there are msdus in the invalid peer msdu
|
||||
* list, then let us free all the msdus of the invalid
|
||||
* peer msdu list.
|
||||
* This scenario can happen when we start receiving
|
||||
* new a-msdu even before the previous a-msdu is completely
|
||||
* received.
|
||||
*/
|
||||
curr_nbuf = dp_pdev->invalid_peer_head_msdu;
|
||||
while (curr_nbuf) {
|
||||
tmp_nbuf = curr_nbuf->next;
|
||||
dp_rx_nbuf_free(curr_nbuf);
|
||||
curr_nbuf = tmp_nbuf;
|
||||
}
|
||||
|
||||
dp_pdev->invalid_peer_head_msdu = NULL;
|
||||
dp_pdev->invalid_peer_tail_msdu = NULL;
|
||||
|
||||
dp_monitor_get_mpdu_status(dp_pdev, soc, rx_tlv_hdr);
|
||||
}
|
||||
|
||||
if (dp_pdev->ppdu_id == hal_rx_attn_phy_ppdu_id_get(soc->hal_soc,
|
||||
rx_tlv_hdr) &&
|
||||
hal_rx_attn_msdu_done_get(soc->hal_soc, rx_tlv_hdr)) {
|
||||
qdf_nbuf_set_rx_chfrag_end(nbuf, 1);
|
||||
qdf_assert_always(dp_pdev->first_nbuf);
|
||||
dp_pdev->first_nbuf = false;
|
||||
mpdu_done = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* For MCL, invalid_peer_head_msdu and invalid_peer_tail_msdu
|
||||
* should be NULL here, add the checking for debugging purpose
|
||||
* in case some corner case.
|
||||
*/
|
||||
DP_PDEV_INVALID_PEER_MSDU_CHECK(dp_pdev->invalid_peer_head_msdu,
|
||||
dp_pdev->invalid_peer_tail_msdu);
|
||||
DP_RX_LIST_APPEND(dp_pdev->invalid_peer_head_msdu,
|
||||
dp_pdev->invalid_peer_tail_msdu,
|
||||
nbuf);
|
||||
|
||||
return mpdu_done;
|
||||
}
|
||||
|
Reference in New Issue
Block a user