Log beacon info.

Change-Id: If21686400245a0cf93db45edc5c135ff489f26d8
diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h
index 50f43b5..f7e2bc7 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -35,6 +35,9 @@
 	ATH10K_DBG_BMI		= 0x00000400,
 	ATH10K_DBG_REGULATORY	= 0x00000800,
 	ATH10K_DBG_ANY		= 0xffffffff,
+
+	// Use high bit so conflicts are less likely with upstream updates.
+	ATH10K_DBG_BEACON	= 0x10000000,
 };
 
 extern unsigned int ath10k_debug_mask;
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 0a2d04c..268f416 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -557,25 +557,27 @@
 	return ret;
 }
 
-static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
+/* Returns -1 on failure, 0 on success, or 1 if already sent. */
+static int ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
 {
 	int ret;
 
 	lockdep_assert_held(&arvif->ar->data_lock);
 
 	if (arvif->beacon == NULL)
-		return;
+		return -1;
 
 	if (arvif->beacon_sent)
-		return;
+		return 1;
 
 	ret = ath10k_wmi_beacon_send_ref_nowait(arvif);
 	if (ret)
-		return;
+		return -1;
 
 	/* We need to retain the arvif->beacon reference for DMA unmapping and
 	 * freeing the skbuff later. */
 	arvif->beacon_sent = true;
+	return 0;
 }
 
 static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
@@ -1362,6 +1364,9 @@
 	struct sk_buff *bcn;
 	int ret, vdev_id = 0;
 
+	int attempted_to_send_beacon = 0;
+	static int beacon_count = 0;
+
 	ev = (struct wmi_host_swba_event *)skb->data;
 	map = __le32_to_cpu(ev->vdev_map);
 
@@ -1448,9 +1453,24 @@
 		arvif->beacon = bcn;
 		arvif->beacon_sent = false;
 
-		ath10k_wmi_tx_beacon_nowait(arvif);
+		ret = ath10k_wmi_tx_beacon_nowait(arvif);
+		attempted_to_send_beacon = 1;
+		if (ret == 1) {
+			ath10k_warn("beacon_sent should have been false\n");
+		} else if (ret == -1) {
+			ath10k_warn("failed to send beacon\n");
+		} else {
+			++beacon_count;
+                }
 skip:
 		spin_unlock_bh(&ar->data_lock);
+
+		if (attempted_to_send_beacon == 0) {
+			ath10k_warn("beacon callback led to no beacon\n");
+		} else if ((ath10k_debug_mask & ATH10K_DBG_BEACON) && beacon_count >= 50) {
+			beacon_count = 0;
+			ath10k_dbg(ATH10K_DBG_BEACON, "50 beacons sent\n");
+		}
 	}
 }