Forráskód Böngészése

qcacmn: Fix issue on block ACK on response to BAR

Fix the issue on block ACK on response to BAR frame.
Parse BAR frame received from monitor destination ring and
generate block ack frame from BAR frame and previous block
ACK frame.

Change-Id: Ifc242b3850630aa25827b003a1e2078a9228358a
Kai Chen 5 éve
szülő
commit
b1a940fa76
2 módosított fájl, 44 hozzáadás és 3 törlés
  1. 24 2
      dp/wifi3.0/dp_rx_mon_dest.c
  2. 20 1
      hal/wifi3.0/hal_api_mon.h

+ 24 - 2
dp/wifi3.0/dp_rx_mon_dest.c

@@ -37,11 +37,25 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
 {
 	struct hal_rx_ppdu_info *ppdu_info = &pdev->ppdu_info;
 
-	if (pdev->tx_capture_enabled != CDP_TX_ENH_CAPTURE_DISABLED &&
-	    ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_CTRL_NDPA)
+	if (pdev->tx_capture_enabled
+	    == CDP_TX_ENH_CAPTURE_DISABLED)
+		return;
+
+	if ((ppdu_info->sw_frame_group_id ==
+	      HAL_MPDU_SW_FRAME_GROUP_CTRL_NDPA) ||
+	     (ppdu_info->sw_frame_group_id ==
+	      HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR))
 		dp_handle_tx_capture_from_dest(soc, pdev, mon_mpdu);
 }
 
+static void
+dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv)
+{
+	if (dp_pdev->tx_capture_enabled
+	    != CDP_TX_ENH_CAPTURE_DISABLED)
+		dp_pdev->ppdu_info.rx_info.user_id =
+			HAL_RX_HW_DESC_MPDU_USER_ID(rx_desc_tlv);
+}
 #else
 static inline void
 dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
@@ -49,6 +63,10 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
 {
 }
 
+static void
+dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv)
+{
+}
 #endif
 
 
@@ -299,6 +317,10 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 					*ppdu_id = msdu_ppdu_id;
 					return rx_bufs_used;
 				}
+
+				dp_tx_capture_get_user_id(dp_pdev,
+							  rx_desc_tlv);
+
 				dp_pdev->mon_last_linkdesc_paddr =
 					buf_info.paddr;
 			}

+ 20 - 1
hal/wifi3.0/hal_api_mon.h

@@ -224,6 +224,25 @@ bool HAL_RX_HW_DESC_MPDU_VALID(void *hw_desc_addr)
 	return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
 }
 
+/*
+ * HAL_RX_HW_DESC_MPDU_VALID() - check MPDU start TLV user id in MPDU
+ *			start TLV of Hardware TLV descriptor
+ * @hw_desc_addr: Hardware desciptor address
+ *
+ * Return: unit32_t: user id
+ */
+static inline
+uint32_t HAL_RX_HW_DESC_MPDU_USER_ID(void *hw_desc_addr)
+{
+	struct rx_mon_pkt_tlvs *rx_desc =
+		(struct rx_mon_pkt_tlvs *)hw_desc_addr;
+	uint32_t user_id;
+
+	user_id = HAL_RX_GET_USER_TLV32_USERID(
+		&rx_desc->mpdu_start_tlv);
+
+	return user_id;
+}
 
 /* TODO: Move all Rx descriptor functions to hal_rx.h to avoid duplication */
 
@@ -544,12 +563,12 @@ struct mon_rx_info {
 	uint16_t qos_control;
 	uint8_t mac_addr1_valid;
 	uint8_t mac_addr1[QDF_MAC_ADDR_SIZE];
+	uint32_t user_id;
 };
 
 struct mon_rx_user_info {
 	uint16_t qos_control;
 	uint8_t qos_control_info_valid;
-	uint32_t bar_frame:1;
 };
 
 struct hal_rx_ppdu_info {