qcacmn: Add WAR to get the vdev in invalid peer path

For QCN9224 splitphy mode do not rely on rx_desc_pool_id
to get to the VDEV as desc pool is common across PDEVs

Change-Id: I2552878bd56696a8df463b35e2b273ed4e591050
CRs-Fixed: 3220690
This commit is contained in:
Chaithanya Garrepalli
2022-07-26 10:41:12 +05:30
committed by Madan Koyyalamudi
parent b4db8c7ec0
commit b34fe34b48

View File

@@ -1186,6 +1186,7 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu,
qdf_nbuf_t curr_nbuf, next_nbuf;
uint8_t *rx_tlv_hdr = qdf_nbuf_data(mpdu);
uint8_t *rx_pkt_hdr = NULL;
int i = 0;
if (!HAL_IS_DECAP_FORMAT_RAW(soc->hal_soc, rx_tlv_hdr)) {
dp_rx_debug("%pK: Drop decapped frames", soc);
@@ -1206,21 +1207,46 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu,
goto free;
}
pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
/* In DMAC case the rx_desc_pools are common across PDEVs
* so PDEV cannot be derived from the pool_id.
*
* link_id need to derived from the TLV tag word which is
* disabled by default. For now adding a WAR to get vdev
* with brute force this need to fixed with word based subscription
* support is added by enabling TLV tag word
*/
if (soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
for (i = 0; i < MAX_PDEV_CNT; i++) {
pdev = soc->pdev_list[i];
if (!pdev || qdf_unlikely(pdev->is_pdev_down)) {
dp_rx_err("%pK: PDEV %s", soc, !pdev ? "not found" : "down");
goto free;
}
if (!pdev || qdf_unlikely(pdev->is_pdev_down))
continue;
if (dp_monitor_filter_neighbour_peer(pdev, rx_pkt_hdr) ==
QDF_STATUS_SUCCESS)
return 0;
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
if (qdf_mem_cmp(wh->i_addr1, vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE) == 0) {
goto out;
}
}
}
} else {
pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
if (qdf_mem_cmp(wh->i_addr1, vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE) == 0) {
goto out;
if (!pdev || qdf_unlikely(pdev->is_pdev_down)) {
dp_rx_err("%pK: PDEV %s",
soc, !pdev ? "not found" : "down");
goto free;
}
if (dp_monitor_filter_neighbour_peer(pdev, rx_pkt_hdr) ==
QDF_STATUS_SUCCESS)
return 0;
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
if (qdf_mem_cmp(wh->i_addr1, vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE) == 0) {
goto out;
}
}
}
@@ -1228,7 +1254,6 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu,
dp_rx_err("%pK: VDEV not found", soc);
goto free;
}
out:
msg.wh = wh;
qdf_nbuf_pull_head(mpdu, soc->rx_pkt_tlv_size);