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

Merge "qca-wifi: call dp_vdev_get_ref_by_id API to get vdev object"

Linux Build Service Account 4 éve
szülő
commit
4f44beeb31
3 módosított fájl, 77 hozzáadás és 66 törlés
  1. 36 23
      dp/wifi3.0/dp_tx_capture.c
  2. 11 22
      dp/wifi3.0/dp_txrx_me.c
  3. 30 21
      dp/wifi3.0/dp_txrx_wds.c

+ 36 - 23
dp/wifi3.0/dp_tx_capture.c

@@ -2576,8 +2576,6 @@ static inline
 QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev,
 					    void *desc, uint8_t usr_idx)
 {
-	struct dp_peer *peer;
-	struct dp_vdev *vdev = NULL;
 	struct cdp_tx_completion_ppdu *ppdu_desc = desc;
 	struct cdp_tx_completion_ppdu_user *user = &ppdu_desc->user[usr_idx];
 	struct ieee80211_ctlframe_addr2 *wh_min;
@@ -2663,20 +2661,29 @@ QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev,
 		qdf_nbuf_set_pktlen(tx_capture_info.mpdu_nbuf,
 				    sizeof(struct ieee80211_frame_min_one));
 	else {
+		struct dp_peer *peer;
+		struct dp_vdev *vdev = NULL;
+
 		peer = dp_peer_get_ref_by_id(pdev->soc, user->peer_id,
 					     DP_MOD_ID_TX_CAPTURE);
 		if (peer) {
 			vdev = peer->vdev;
+
+			if (vdev)
+				qdf_mem_copy(wh_min->i_addr2,
+					     vdev->mac_addr.raw,
+					     QDF_MAC_ADDR_SIZE);
 			dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
 		} else {
 			vdev =
-			dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
-							   ppdu_desc->vdev_id);
+			dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id);
+			if (vdev) {
+				qdf_mem_copy(wh_min->i_addr2,
+					     vdev->mac_addr.raw,
+					     QDF_MAC_ADDR_SIZE);
+				dp_vdev_unref_delete(pdev->soc, vdev);
+			}
 		}
-		if (vdev)
-			qdf_mem_copy(wh_min->i_addr2,
-				     vdev->mac_addr.raw,
-				     QDF_MAC_ADDR_SIZE);
 		qdf_nbuf_set_pktlen(tx_capture_info.mpdu_nbuf, sizeof(*wh_min));
 	}
 
@@ -2710,7 +2717,7 @@ QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev,
 static
 void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev,
 				 struct cdp_tx_completion_ppdu *cur_ppdu_desc,
-				 uint8_t usr_idx)
+				 uint8_t usr_id)
 {
 	struct cdp_tx_completion_ppdu *ppdu_desc;
 	struct dp_pdev_tx_capture *ptr_tx_cap;
@@ -2725,7 +2732,7 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev,
 	ppdu_desc->channel = cur_ppdu_desc->channel;
 	ppdu_desc->num_mpdu = 1;
 	ppdu_desc->num_msdu = 1;
-	ppdu_desc->user[usr_idx].ppdu_type = HTT_PPDU_STATS_PPDU_TYPE_SU;
+	ppdu_desc->user[usr_id].ppdu_type = HTT_PPDU_STATS_PPDU_TYPE_SU;
 	ppdu_desc->bar_num_users = 0;
 	ppdu_desc->num_users = 1;
 
@@ -2744,22 +2751,22 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev,
 		ppdu_desc->ppdu_end_timestamp =
 				cur_ppdu_desc->ppdu_end_timestamp;
 		ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration;
-		ppdu_desc->user[usr_idx].peer_id =
-				cur_ppdu_desc->user[usr_idx].peer_id;
+		ppdu_desc->user[usr_id].peer_id =
+				cur_ppdu_desc->user[usr_id].peer_id;
 		ppdu_desc->frame_ctrl = (IEEE80211_FC0_SUBTYPE_RTS |
 					 IEEE80211_FC0_TYPE_CTL);
-		qdf_mem_copy(&ppdu_desc->user[usr_idx].mac_addr,
-			     &cur_ppdu_desc->user[usr_idx].mac_addr,
+		qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr,
+			     &cur_ppdu_desc->user[usr_id].mac_addr,
 			     QDF_MAC_ADDR_SIZE);
 
-		dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_idx);
+		dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_id);
 	}
 
 	if ((rts_send && cur_ppdu_desc->rts_success) ||
 	    cur_ppdu_desc->mprot_type == SEND_WIFICTS2SELF_E) {
 		uint16_t peer_id;
 
-		peer_id = cur_ppdu_desc->user[usr_idx].peer_id;
+		peer_id = cur_ppdu_desc->user[usr_id].peer_id;
 		/* send dummy CTS frame */
 		ppdu_desc->htt_frame_type = HTT_STATS_FTYPE_SGEN_CTS;
 		ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL;
@@ -2771,25 +2778,31 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev,
 				cur_ppdu_desc->ppdu_end_timestamp;
 		ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration -
 					 (RTS_INTERVAL + SIFS_INTERVAL);
-		ppdu_desc->user[usr_idx].peer_id = peer_id;
+		ppdu_desc->user[usr_id].peer_id = peer_id;
 		peer = dp_peer_get_ref_by_id(pdev->soc, peer_id,
 					     DP_MOD_ID_TX_CAPTURE);
 		if (peer) {
 			vdev = peer->vdev;
+			if (vdev)
+				qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr,
+					     vdev->mac_addr.raw,
+					     QDF_MAC_ADDR_SIZE);
 			dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
 		} else {
 			uint8_t vdev_id;
 
 			vdev_id = ppdu_desc->vdev_id;
-			vdev = dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
-								  vdev_id);
+			vdev = dp_vdev_get_ref_by_id(pdev->soc, vdev_id);
+			if (vdev) {
+				qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr,
+					     vdev->mac_addr.raw,
+					     QDF_MAC_ADDR_SIZE);
+				dp_vdev_unref_delete(pdev->soc, vdev);
+			}
 		}
 
-		if (vdev)
-			qdf_mem_copy(&ppdu_desc->user[usr_idx].mac_addr,
-				     vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE);
 
-		dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_idx);
+		dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_id);
 	}
 }
 

+ 11 - 22
dp/wifi3.0/dp_txrx_me.c

@@ -253,11 +253,12 @@ static void dp_tx_me_mem_free(struct dp_pdev *pdev,
  * return: no of converted packets
  */
 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_hdl, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
 			    uint8_t new_mac_cnt)
 {
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_pdev *pdev;
 	qdf_ether_header_t *eh;
 	uint8_t *data;
@@ -280,31 +281,15 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 	qdf_dma_addr_t paddr_mcbuf = 0;
 	uint8_t empty_entry_mac[QDF_MAC_ADDR_SIZE] = {0};
 	QDF_STATUS status;
-	struct dp_vdev *vdev =
-		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
-						   vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
 
-	if (!vdev) {
-		qdf_nbuf_free(nbuf);
-		return 1;
-	}
-
-	pdev = vdev->pdev;
-
-	if (!pdev) {
-		qdf_nbuf_free(nbuf);
-		return 1;
-	}
-
-	vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
-						  vdev_id);
 	if (!vdev)
-		return 1;
+		goto free_return;
 
 	pdev = vdev->pdev;
 
 	if (!pdev)
-		return 1;
+		goto free_return;
 
 	qdf_mem_zero(&msdu_info, sizeof(msdu_info));
 
@@ -421,7 +406,7 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 	}
 
 	if (!seg_info_head) {
-		goto free_return;
+		goto unmap_free_return;
 	}
 
 	msdu_info.u.sg_info.curr_seg = seg_info_head;
@@ -445,6 +430,7 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 
 	qdf_nbuf_unmap(pdev->soc->osdev, nbuf, QDF_DMA_TO_DEVICE);
 	qdf_nbuf_free(nbuf);
+	dp_vdev_unref_delete(soc, vdev);
 	return new_mac_cnt;
 
 fail_map:
@@ -459,8 +445,11 @@ fail_buf_alloc:
 fail_seg_alloc:
 	dp_tx_me_mem_free(pdev, seg_info_head);
 
-free_return:
+unmap_free_return:
 	qdf_nbuf_unmap(pdev->soc->osdev, nbuf, QDF_DMA_TO_DEVICE);
+free_return:
+	if (vdev)
+		dp_vdev_unref_delete(soc, vdev);
 	qdf_nbuf_free(nbuf);
 	return 1;
 }

+ 30 - 21
dp/wifi3.0/dp_txrx_wds.c

@@ -228,12 +228,12 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
  */
 #ifdef WDS_VENDOR_EXTENSION
 QDF_STATUS
-dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc, uint8_t vdev_id, u_int32_t val)
+dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+			  u_int32_t val)
 {
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_peer *peer;
-	struct dp_vdev *vdev =
-		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
-						    vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			  FL("vdev is NULL for vdev_id %d"), vdev_id);
@@ -251,6 +251,7 @@ dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc, uint8_t vdev_id, u_int32_t val)
 		dp_peer_unref_delete(peer, DP_MOD_ID_AST);
 	}
 
+	dp_vdev_unref_delete(soc, vdev);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -694,13 +695,12 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
 {
 	struct dp_soc *soc = (struct dp_soc *)cdp_soc;
 	struct dp_vdev *vdev =
-		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
-						   vdev_id);
-
-	if (!vdev || !vdev->multipass_en)
-		return;
+		dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id);
 
-	dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id);
+	if (vdev && vdev->multipass_en) {
+		dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id);
+		dp_vdev_unref_delete(soc, vdev);
+	}
 }
 
 /**
@@ -712,15 +712,17 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
  *
  * return: set success/failure
  */
-QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
-		uint16_t vlan_id, uint16_t group_key)
+QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+				uint16_t vlan_id, uint16_t group_key)
 {
-	struct dp_vdev *vdev =
-		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
-						    vdev_id);
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	QDF_STATUS status;
 
-	if (!vdev || !vdev->multipass_en)
-		return QDF_STATUS_E_INVAL;
+	if (!vdev || !vdev->multipass_en) {
+		status = QDF_STATUS_E_INVAL;
+		goto fail;
+	}
 
 	if (!vdev->iv_vlan_map) {
 		uint16_t vlan_map_size = (sizeof(uint16_t))*DP_MAX_VLAN_IDS;
@@ -728,7 +730,8 @@ QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
 
 		if (!vdev->iv_vlan_map) {
 			QDF_TRACE_ERROR(QDF_MODULE_ID_DP, "iv_vlan_map");
-			return QDF_STATUS_E_NOMEM;
+			status = QDF_STATUS_E_NOMEM;
+			goto fail;
 		}
 
 		/*
@@ -738,11 +741,17 @@ QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
 		qdf_mem_zero(vdev->iv_vlan_map, vlan_map_size);
 	}
 
-	if (vlan_id >= DP_MAX_VLAN_IDS)
-		return QDF_STATUS_E_INVAL;
+	if (vlan_id >= DP_MAX_VLAN_IDS) {
+		status = QDF_STATUS_E_INVAL;
+		goto fail;
+	}
 
 	vdev->iv_vlan_map[vlan_id] = group_key;
-	return QDF_STATUS_SUCCESS;
+	status = QDF_STATUS_SUCCESS;
+fail:
+	if (vdev)
+		dp_vdev_unref_delete(soc, vdev);
+	return status;
 }
 
 /**