Selaa lähdekoodia

qcacmn: Increment peer ref count for mgmt Tx frame

The peer ref count needs to be incremented in the
mgmt_txrx tx_frame API.The decrement happens in the
tx_completion API.

Change-Id: I604150ce4d238ec84e24f2b8ba807d929860438e
CR's Fixed:2019110
Debasis Das 8 vuotta sitten
vanhempi
sitoutus
3968e9abd7

+ 4 - 5
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_tgt_api.c

@@ -990,12 +990,11 @@ QDF_STATUS tgt_mgmt_txrx_tx_completion_handler(
 		ota_comp_cb(cb_context, nbuf, status, tx_compl_params);
 
 no_registered_cb:
-	/**
-	 * decremneting the peer ref count that has been incremented while
-	 * passing peer in wlan_mgmt_txrx_mgmt_frame_tx or
-	 * wlan_mgmt_txrx_beacon_frame_tx APIs.
+	/*
+	 * decrementing the peer ref count that was incremented while
+	 * accessing peer in wlan_mgmt_txrx_mgmt_frame_tx
 	 */
-	wlan_objmgr_peer_release_ref(mgmt_desc->peer, WLAN_MGMT_NB_ID);
+	wlan_objmgr_peer_release_ref(mgmt_desc->peer, WLAN_MGMT_SB_ID);
 	wlan_mgmt_txrx_desc_put(mgmt_txrx_ctx, desc_id);
 	return QDF_STATUS_SUCCESS;
 }

+ 10 - 1
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c

@@ -224,9 +224,12 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	wlan_objmgr_peer_get_ref(peer, WLAN_MGMT_SB_ID);
+
 	vdev = wlan_peer_get_vdev(peer);
 	if (!vdev) {
 		mgmt_txrx_err("vdev unavailable for peer %p", peer);
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
@@ -234,6 +237,7 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
 	if (!psoc) {
 		mgmt_txrx_err("psoc unavailable for peer %p vdev %p",
 				peer, vdev);
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
@@ -243,12 +247,15 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
 	if (!txrx_ctx) {
 		mgmt_txrx_err("No txrx context for peer %p psoc %p",
 				peer, psoc);
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
 	desc = wlan_mgmt_txrx_desc_get(txrx_ctx);
-	if (!desc)
+	if (!desc) {
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		return QDF_STATUS_E_RESOURCES;
+	}
 
 	desc->nbuf = buf;
 	desc->tx_ota_cmpl_cb = tx_ota_comp_cb;
@@ -260,6 +267,7 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
 	if (!psoc->soc_cb.tx_ops.mgmt_txrx_tx_ops.mgmt_tx_send) {
 		mgmt_txrx_err("mgmt txrx tx op to send mgmt frame is NULL for psoc: %p",
 				psoc);
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		wlan_mgmt_txrx_desc_put(txrx_ctx, desc->desc_id);
 		return QDF_STATUS_E_FAILURE;
 	}
@@ -268,6 +276,7 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
 			vdev, buf, desc->desc_id, mgmt_tx_params)) {
 		mgmt_txrx_err("Mgmt send fail for peer %p psoc %p",
 				peer, psoc);
+		wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
 		wlan_mgmt_txrx_desc_put(txrx_ctx, desc->desc_id);
 		return QDF_STATUS_E_FAILURE;
 	}