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
这个提交包含在:
Chaithanya Garrepalli
2022-07-26 10:41:12 +05:30
提交者 Madan Koyyalamudi
父节点 b4db8c7ec0
当前提交 b34fe34b48

查看文件

@@ -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; qdf_nbuf_t curr_nbuf, next_nbuf;
uint8_t *rx_tlv_hdr = qdf_nbuf_data(mpdu); uint8_t *rx_tlv_hdr = qdf_nbuf_data(mpdu);
uint8_t *rx_pkt_hdr = NULL; uint8_t *rx_pkt_hdr = NULL;
int i = 0;
if (!HAL_IS_DECAP_FORMAT_RAW(soc->hal_soc, rx_tlv_hdr)) { if (!HAL_IS_DECAP_FORMAT_RAW(soc->hal_soc, rx_tlv_hdr)) {
dp_rx_debug("%pK: Drop decapped frames", soc); 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; 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)) { if (!pdev || qdf_unlikely(pdev->is_pdev_down))
dp_rx_err("%pK: PDEV %s", soc, !pdev ? "not found" : "down"); continue;
goto free;
}
if (dp_monitor_filter_neighbour_peer(pdev, rx_pkt_hdr) == TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
QDF_STATUS_SUCCESS) if (qdf_mem_cmp(wh->i_addr1, vdev->mac_addr.raw,
return 0; 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 (!pdev || qdf_unlikely(pdev->is_pdev_down)) {
if (qdf_mem_cmp(wh->i_addr1, vdev->mac_addr.raw, dp_rx_err("%pK: PDEV %s",
QDF_MAC_ADDR_SIZE) == 0) { soc, !pdev ? "not found" : "down");
goto out; 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); dp_rx_err("%pK: VDEV not found", soc);
goto free; goto free;
} }
out: out:
msg.wh = wh; msg.wh = wh;
qdf_nbuf_pull_head(mpdu, soc->rx_pkt_tlv_size); qdf_nbuf_pull_head(mpdu, soc->rx_pkt_tlv_size);