qcacld-3.0: Fix a beacon template update dead loop

When sap is started, a dead loop for beacon template updating
can happen due to the following conditions:

  1) before vdev start happens for sap, he_ops will be retrieved
     from the ie buffer imposed by upper layer, and bss color
     initial setup will also be retrieved here and then updated
     to session->he_op;

  2) and it happens at least in some cases, that session->he_op.
     bss_col_disabled will be set to true, but due to there is
     actually no bss color changing really happening here, no
     new color will be setup here;

  3) later when sap is running and starts to do beaconing, it
     will start to check if session->he_op.bss_col_disabled is
     setup to true, and if yes, new beacon template will be
     issued to fw;

  4) later on, fw finishes the beacon template setup and sends
     a notification to driver in beacon tx success event, and
     driver will go back to steps 3) to check
     session->he_op.bss_col_disabled again;

If no real bss color change happens here, step 3) and 4) will
loop forever.

Fix the above dead loop by introducing check of
session->he_bss_color_change.new_color before driver code starts
to inspect the bss color change countdown value and updating
beacon template to fw.

Change-Id: I4a32ce9f547e988087c769ad8fab2973582ce6e4
CRs-Fixed: 2764896
diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c
index b8ae8a9..4f10d98 100644
--- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c
+++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c
@@ -2085,30 +2085,31 @@
 
 	/* handle bss color change IE */
 	if (LIM_IS_AP_ROLE(session) &&
-			session->he_op.bss_col_disabled) {
+	    session->he_op.bss_col_disabled &&
+	    session->he_bss_color_change.new_color) {
+		pe_debug("countdown: %d, new_color: %d",
+			 session->he_bss_color_change.countdown,
+			 session->he_bss_color_change.new_color);
 		if (session->he_bss_color_change.countdown > 0) {
 			session->he_bss_color_change.countdown--;
 		} else {
 			session->bss_color_changing = 0;
 			qdf_mem_zero(&beacon_params, sizeof(beacon_params));
-			if (session->he_bss_color_change.new_color != 0) {
-				session->he_op.bss_col_disabled = 0;
-				session->he_op.bss_color =
-					session->he_bss_color_change.new_color;
-				beacon_params.paramChangeBitmap |=
-					PARAM_BSS_COLOR_CHANGED;
-				beacon_params.bss_color_disabled = 0;
-				beacon_params.bss_color =
-					session->he_op.bss_color;
-				lim_send_beacon_params(mac_ctx,
-						       &beacon_params,
-						       session);
-				lim_send_obss_color_collision_cfg(mac_ctx,
-						session,
-						OBSS_COLOR_COLLISION_DETECTION);
-			}
+			session->he_op.bss_col_disabled = 0;
+			session->he_op.bss_color =
+				session->he_bss_color_change.new_color;
+			session->he_bss_color_change.new_color = 0;
+			beacon_params.paramChangeBitmap |=
+				PARAM_BSS_COLOR_CHANGED;
+			beacon_params.bss_color_disabled = 0;
+			beacon_params.bss_color = session->he_op.bss_color;
+			lim_send_beacon_params(mac_ctx,
+					       &beacon_params,
+					       session);
+			lim_send_obss_color_collision_cfg(
+				mac_ctx, session,
+				OBSS_COLOR_COLLISION_DETECTION);
 		}
-
 		lim_send_bss_color_change_ie_update(mac_ctx, session);
 	}
 }