Browse Source

Merge "qca-wifi: VoW IGMP improvements"

Linux Build Service Account 4 years ago
parent
commit
cdf12bb10f
3 changed files with 39 additions and 6 deletions
  1. 28 5
      dp/wifi3.0/dp_txrx_me.c
  2. 8 1
      dp/wifi3.0/dp_txrx_me.h
  3. 3 0
      tools/linux/cfg80211_ven_cmd.h

+ 28 - 5
dp/wifi3.0/dp_txrx_me.c

@@ -210,6 +210,24 @@ dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
 
 
+/**
+ * dp_tx_prepare_send_igmp_me(): Call to check igmp ,convert mcast to ucast
+ * @vdev: DP VDEV handle
+ * @nbuf: Multicast buffer
+ *
+ * Return: no of packets transmitted
+ */
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
+{
+	if (dp_igmp_me_mcast_convert((struct cdp_soc_t *)(vdev->pdev->soc),
+				     vdev->vdev_id, vdev->pdev->pdev_id,
+				     nbuf) > 0)
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 /*
 /*
  * dp_tx_me_mem_free(): Function to free allocated memory in mcast enahncement
  * dp_tx_me_mem_free(): Function to free allocated memory in mcast enahncement
  * pdev: pointer to DP PDEV structure
  * pdev: pointer to DP PDEV structure
@@ -249,6 +267,7 @@ static void dp_tx_me_mem_free(struct dp_pdev *pdev,
  * @nbuf: Multicast nbuf
  * @nbuf: Multicast nbuf
  * @newmac: Table of the clients to which packets have to be sent
  * @newmac: Table of the clients to which packets have to be sent
  * @new_mac_cnt: No of clients
  * @new_mac_cnt: No of clients
+ * @tid: desired tid
  *
  *
  * return: no of converted packets
  * return: no of converted packets
  */
  */
@@ -256,7 +275,7 @@ uint16_t
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt)
+			    uint8_t new_mac_cnt, uint8_t tid)
 {
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_pdev *pdev;
 	struct dp_pdev *pdev;
@@ -414,10 +433,14 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	msdu_info.num_seg = new_mac_cnt;
 	msdu_info.num_seg = new_mac_cnt;
 	msdu_info.frm_type = dp_tx_frm_me;
 	msdu_info.frm_type = dp_tx_frm_me;
 
 
-	msdu_info.tid = HTT_INVALID_TID;
-	if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
-	    qdf_unlikely(pdev->hmmc_tid_override_en))
-		msdu_info.tid = pdev->hmmc_tid;
+	if (tid == HTT_INVALID_TID) {
+		msdu_info.tid = HTT_INVALID_TID;
+		if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
+		    qdf_unlikely(pdev->hmmc_tid_override_en))
+			msdu_info.tid = pdev->hmmc_tid;
+	} else {
+		msdu_info.tid = tid;
+	}
 
 
 	DP_STATS_INC(vdev, tx_i.mcast_en.ucast, new_mac_cnt);
 	DP_STATS_INC(vdev, tx_i.mcast_en.ucast, new_mac_cnt);
 	dp_tx_send_msdu_multiple(vdev, nbuf, &msdu_info);
 	dp_tx_send_msdu_multiple(vdev, nbuf, &msdu_info);

+ 8 - 1
dp/wifi3.0/dp_txrx_me.h

@@ -21,15 +21,22 @@ uint16_t
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt);
+			    uint8_t new_mac_cnt, uint8_t tid);
 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_exit(struct dp_pdev *pdev);
 void dp_tx_me_exit(struct dp_pdev *pdev);
 QDF_STATUS
 QDF_STATUS
 dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
 dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
 extern int
 extern int
 dp_me_mcast_convert(struct cdp_soc_t *soc,
 dp_me_mcast_convert(struct cdp_soc_t *soc,
 		    uint8_t vdev_id,
 		    uint8_t vdev_id,
 		    uint8_t pdev_id,
 		    uint8_t pdev_id,
 		    qdf_nbuf_t wbuf);
 		    qdf_nbuf_t wbuf);
+extern int
+dp_igmp_me_mcast_convert(struct cdp_soc_t *soc,
+			 uint8_t vdev_id,
+			 uint8_t pdev_id,
+			 qdf_nbuf_t wbuf);
 #endif
 #endif

+ 3 - 0
tools/linux/cfg80211_ven_cmd.h

@@ -777,6 +777,7 @@ enum {
 	IEEE80211_PARAM_TX_VAP                     = 708, /* Current Tx Vap */
 	IEEE80211_PARAM_TX_VAP                     = 708, /* Current Tx Vap */
 	IEEE80211_PARAM_FILS_IS_ENABLE            = 709, /* Fils enable frames*/
 	IEEE80211_PARAM_FILS_IS_ENABLE            = 709, /* Fils enable frames*/
 	IEEE80211_PARAM_MBSS_TXVDEV                = 710,
 	IEEE80211_PARAM_MBSS_TXVDEV                = 710,
+	IEEE80211_PARAM_IGMP_ME      = 711, /* Set IGMP Mcast enhancement option: 0 disable, 1 enable */
 };
 };
 
 
 enum {
 enum {
@@ -2211,6 +2212,8 @@ struct vendor_commands vap_vendor_cmds[] = {
 	{"rxtimeout",           35839, SET_PARAM, 1},
 	{"rxtimeout",           35839, SET_PARAM, 1},
 	{"oce_version_override ",     IEEE80211_PARAM_OCE_VERSION_OVERRIDE, SET_PARAM, 1},
 	{"oce_version_override ",     IEEE80211_PARAM_OCE_VERSION_OVERRIDE, SET_PARAM, 1},
 	{"g_oce_version_override ",   IEEE80211_PARAM_OCE_VERSION_OVERRIDE, GET_PARAM, 0},
 	{"g_oce_version_override ",   IEEE80211_PARAM_OCE_VERSION_OVERRIDE, GET_PARAM, 0},
+	{"igmpmcasten",         IEEE80211_PARAM_IGMP_ME, SET_PARAM, 1},
+	{"g_igmpmcasten",       IEEE80211_PARAM_IGMP_ME, GET_PARAM, 0},
 };
 };
 
 
 struct vendor_commands radio_vendor_cmds[] = {
 struct vendor_commands radio_vendor_cmds[] = {