Эх сурвалжийг харах

qcacld-3.0: Remove peer if add bss fails

Currently peer is not removed if add bss fails. This can cause
assert in firmware as driver sends VDEV DELETE without peer delete.

Add changes to remove peer if add bss fails.

Change-Id: I7591af55f24919af9cf2d1f288a5bd9ff706adda
CRs-Fixed: 2029804
Padma, Santhosh Kumar 8 жил өмнө
parent
commit
881046193e

+ 23 - 0
core/wma/src/wma_dev_if.c

@@ -687,6 +687,10 @@ static void wma_vdev_start_rsp(tp_wma_handle wma,
 			       resp_event)
 {
 	struct beacon_info *bcn;
+	struct cdp_pdev *pdev;
+	void *peer = NULL;
+	uint8_t peer_id;
+	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
 #ifdef QCA_IBSS_SUPPORT
 	WMA_LOGD("%s: vdev start response received for %s mode", __func__,
@@ -743,6 +747,25 @@ static void wma_vdev_start_rsp(tp_wma_handle wma,
 	}
 	add_bss->smpsMode = host_map_smps_mode(resp_event->smps_mode);
 send_fail_resp:
+	if (add_bss->status != QDF_STATUS_SUCCESS) {
+		WMA_LOGE("%s: ADD BSS failure %d", __func__, add_bss->status);
+
+		pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+		if (NULL == pdev)
+			WMA_LOGE("%s: Failed to get pdev", __func__);
+
+		if (pdev)
+			peer = cdp_peer_find_by_addr(soc, pdev,
+				add_bss->bssId, &peer_id);
+		if (!peer)
+			WMA_LOGE("%s Failed to find peer %pM", __func__,
+				add_bss->bssId);
+
+		if (peer)
+			wma_remove_peer(wma, add_bss->bssId,
+				resp_event->vdev_id, peer, false);
+	}
+
 	/* Send vdev stop if vdev start was success */
 	if ((add_bss->status != QDF_STATUS_SUCCESS) &&
 	   !resp_event->status)