Bladeren bron

qcacmn: Add Support for Inspect Path for Lithium

Add peer-id in the meta data for the reinjected by the FW
and queue them to the HW.

Change-Id: I3f25d5f928b6891c06cad6ce3ed81df77d4e33ed
CRs-Fixed: 2024450
Ishank Jain 8 jaren geleden
bovenliggende
commit
997955e336
2 gewijzigde bestanden met toevoegingen van 53 en 4 verwijderingen
  1. 2 2
      dp/wifi3.0/dp_main.c
  2. 51 2
      dp/wifi3.0/dp_tx.c

+ 2 - 2
dp/wifi3.0/dp_main.c

@@ -1734,9 +1734,9 @@ static void dp_vdev_register_wifi3(struct cdp_vdev *vdev_handle,
 #if ATH_SUPPORT_WAPI
 	vdev->osif_check_wai = txrx_ops->rx.wai_check;
 #endif
-#if UMAC_SUPPORT_PROXY_ARP
-	vdev->osif_proxy_arp = txrx_ops->proxy_arp;
 #endif
+#ifdef UMAC_SUPPORT_PROXY_ARP
+	vdev->osif_proxy_arp = txrx_ops->proxy_arp;
 #endif
 	vdev->me_convert = txrx_ops->me_convert;
 

+ 51 - 2
dp/wifi3.0/dp_tx.c

@@ -1423,22 +1423,71 @@ static
 void dp_tx_reinject_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status)
 {
 	struct dp_vdev *vdev;
+	struct dp_peer *peer = NULL;
+	uint32_t peer_id = HTT_INVALID_PEER;
+	qdf_nbuf_t nbuf = tx_desc->nbuf;
+	qdf_nbuf_t nbuf_copy = NULL;
+	struct dp_tx_msdu_info_s msdu_info;
 
 	vdev = tx_desc->vdev;
 
 	qdf_assert(vdev);
 
+	qdf_mem_set(&msdu_info, sizeof(msdu_info), 0x0);
+
+	dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
+
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			"%s Tx reinject path\n", __func__);
 
 	DP_STATS_INC_PKT(vdev, tx_i.reinject_pkts, 1,
 			qdf_nbuf_len(tx_desc->nbuf));
 
+	if (!vdev->osif_proxy_arp) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				"function pointer to proxy arp not present\n");
+		return;
+	}
+
 	if (qdf_unlikely(vdev->mesh_vdev)) {
 		DP_TX_FREE_SINGLE_BUF(vdev->pdev->soc, tx_desc->nbuf);
-	} else
-		dp_tx_send(vdev, tx_desc->nbuf);
+	} else {
+		TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
+			if ((peer->peer_ids[0] != HTT_INVALID_PEER) &&
+					(peer->bss_peer || peer->nawds_enabled)
+					&& !(vdev->osif_proxy_arp(
+							vdev->osif_vdev,
+							nbuf))) {
+				nbuf_copy = qdf_nbuf_copy(nbuf);
+
+				if (!nbuf_copy) {
+					QDF_TRACE(QDF_MODULE_ID_DP,
+							QDF_TRACE_LEVEL_ERROR,
+							FL("nbuf copy failed"));
+					break;
+				}
 
+				if (peer->nawds_enabled)
+					peer_id = peer->peer_ids[0];
+				else
+					peer_id = HTT_INVALID_PEER;
+
+				nbuf_copy = dp_tx_send_msdu_single(vdev,
+						nbuf_copy, msdu_info.tid,
+						&msdu_info.tx_queue,
+						msdu_info.meta_data, peer_id);
+
+				if (nbuf_copy) {
+					QDF_TRACE(QDF_MODULE_ID_DP,
+							QDF_TRACE_LEVEL_ERROR,
+							FL("pkt send failed"));
+					qdf_nbuf_free(nbuf_copy);
+				}
+			}
+		}
+	}
+
+	qdf_nbuf_free(nbuf);
 	dp_tx_desc_release(tx_desc, tx_desc->pool_id);
 }