[brcmfmac] Rework dbg_hexdump

Reorganize hexdump functionality so that it:
- doesn't double-print when BRCMF_INFO_VAL is enabled
- prints addresses
- properly handles the header annotation
- prints 16 bytes/line
- Made all brcmf_hexdumps invocations conditional so that just enabling
  debug wouldn't cause logfile spew
- Removed hexdumps that were used for previous experiments but are no
  longer needed

Note that CONFIG_BRCMFMAC_DBG is enabled by default now, to make life
easier for us during debugging. No additional output will be generated,
but it means that only one variable (brcmf_msg_filter) needs to be set
to get log messages instead of two. There should be minimal impact on
performance since this pulls in a single conditional check.

WLAN-733

Test: Builds, smoke test with Netgear router. Verified that no messages
are produced with brcmf_msg_filter == 0 and reasonable spew is produced
with debug flags enabled (tried BRCMF_BYTES_VAL | BRCMF_DATA_VAL).

Change-Id: I3d15ad1f76da8584b496fea80c0a8c87ac84e67f
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn b/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
index b02048a..e4fac6b 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/BUILD.gn
@@ -23,7 +23,7 @@
     "CONFIG_BRCMFMAC_USB=1",
     "CONFIG_BRCMFMAC_SDIO=1",
     "CONFIG_BRCMFMAC_PCIE=1",
-    "CONFIG_BRCMFMAC_DBG=0",
+    "CONFIG_BRCMFMAC_DBG=1",
     "ENABLE_DRIVER_TRACING=true",
   ]
 
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c b/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
index d474958..3c0d18e 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/cfg80211.c
@@ -2258,8 +2258,8 @@
             brcmf_dbg(TEMP, " * * ie 0 (name), len %d", length);
             brcmf_alphadump(ie + offset + 2, length);
         } else {
-            //brcmf_dbg(TEMP, "ie %d, len %d", type, length);
-            //brcmf_hexdump(ie + offset + 2, length);
+            brcmf_dbg_hex_dump(BRCMF_BYTES_ON(), ie + offset + 2, length,
+                               "IE (length %zd):\n", length);
             if (ieinfoptr < ieinfo + sizeof(ieinfo)) {
                 ieinfoptr += snprintf(ieinfoptr, sizeof(ieinfo) - (ieinfoptr - ieinfo),
                     "ie %d, len %d. ", ie[offset], length);
@@ -2278,9 +2278,9 @@
 
 void brcmf_cfg80211_rx(struct brcmf_if* ifp, struct brcmf_netbuf* packet) {
     struct net_device* ndev = ifp->ndev;
-    THROTTLE(10, brcmf_dbg(TEMP, "Calling data_recv with data 0x%016lx %016lx len %d",
-              *(uint64_t*)packet->data, *(uint64_t*)(packet->data+8), packet->len););
-    THROTTLE(10, brcmf_hexdump(packet->data, min(packet->len, 64)););
+    THROTTLE(10, brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(), packet->data,
+                                    min(packet->len, 64),
+                                    "Data received (%d bytes, max 64 shown):\n", packet->len););
     // IEEE Std. 802.3-2015, 3.1.1
     uint16_t eth_type = ((uint16_t*)(packet->data))[6];
     if (eth_type == EAPOL_ETHERNET_TYPE_UINT16) {
@@ -4608,7 +4608,7 @@
     brcmf_dbg(TRACE, "Enter");
     if (req->rsne_len != 0) {
         brcmf_dbg(TEMP, " * * RSNE non-zero! %ld", req->rsne_len);
-        brcmf_hexdump(req->rsne, req->rsne_len);
+        brcmf_dbg_hex_dump(BRCMF_BYTES_ON(), req->rsne, req->rsne_len, "RSNE:\n");
     }
     if (memcmp(req->peer_sta_address, ifp->bss.bssid, ETH_ALEN)) {
         brcmf_dbg(TEMP, " * * ERROR * * Requested MAC %lx !=  connected MAC %lx",
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/common.c b/drivers/wlan/third_party/broadcom/brcmfmac/common.c
index 8c32a74..bc07486 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/common.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/common.c
@@ -46,11 +46,6 @@
 /* default boost value for RSSI_DELTA in preferred join selection */
 #define BRCMF_JOIN_PREF_RSSI_BOOST 8
 
-/* Debug level configuration. See debug.h for bits, sysfs modifiable */
-int brcmf_msg_filter;
-module_param_named(debug, brcmf_msg_filter, int, S_IRUSR | S_IWUSR);
-MODULE_PARM_DESC(debug, "Level of debug output");
-
 static int brcmf_p2p_enable;
 module_param_named(p2pon, brcmf_p2p_enable, int, 0);
 MODULE_PARM_DESC(p2pon, "Enable legacy p2p management functionality");
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/core.c b/drivers/wlan/third_party/broadcom/brcmfmac/core.c
index 36d8414..4b9a800 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/core.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/core.c
@@ -262,7 +262,6 @@
     brcmf_netbuf_grow_tail(netbuf, ethmac_netbuf->data_size + drvr->hdrlen);
     brcmf_netbuf_shrink_head(netbuf, drvr->hdrlen);
     memcpy(netbuf->data, ethmac_netbuf->data_buffer, ethmac_netbuf->data_size);
-    brcmf_hexdump(netbuf->data, 32);
 
     /* Make sure there's enough writeable headroom */
     if (brcmf_netbuf_head_space(netbuf) < drvr->hdrlen) {
@@ -377,9 +376,6 @@
     // and that we don't worry about "older Novell" IPX.
     // TODO(cphoenix): This is an ugly hack, probably buggy, to replace some of eth_type_trans.
     // See https://elixir.bootlin.com/linux/v4.17-rc7/source/net/ethernet/eth.c#L156
-    //brcmf_dbg(TEMP, "Packet header:");
-    //brcmf_hexdump(netbuf->data, min(netbuf->len, 32));
-    //brcmf_alphadump(netbuf->data, netbuf->len);
     if (address_is_multicast(netbuf->data)) {
         if (address_is_broadcast(netbuf->data)) {
             netbuf->pkt_type = ADDRESSED_TO_BROADCAST;
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/debug.c b/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
index 90f89d5..6e0082d 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/debug.c
@@ -24,6 +24,11 @@
 #include "linuxisms.h"
 #include "fweh.h"
 
+#define BRCMF_HEXDUMP_WIDTH 16
+
+// Debug level configuration. See debug.h for bits
+int brcmf_msg_filter;
+
 static zx_handle_t root_folder;
 
 bool __brcm_dbg_err_flag = false;
@@ -69,33 +74,29 @@
 }
 
 void brcmf_hexdump(const void* buf, size_t len) {
-    if (!(brcmf_msg_filter & BRCMF_INFO_VAL)) {
-        return;
-    }
-
     if (len > 4096) {
-        brcmf_dbg(INFO, "Truncating hexdump to 4096 bytes");
+        zxlogf(INFO, "brcmfmac: Truncating hexdump to 4096 bytes\n");
         len = 4096;
     }
     if (len == 0) {
-        brcmf_dbg(INFO, "Empty hexdump %p", buf);
+        zxlogf(INFO, "brcmfmac: Empty hexdump %p\n", buf);
         return;
     }
-    char output[120];
+    char output[64 + BRCMF_HEXDUMP_WIDTH * 3];
     uint8_t* bytes = (uint8_t*)buf;
     size_t i;
     char* next = output;
     for (i = 0; i < len; i++) {
-        next += sprintf(next, "%02x ", *bytes++);
-        if ((i % 32) == 31) {
-            brcmf_dbg(INFO, "%s", output);
-            // Give the serial-line log time to drain on long dumps.
-            zx_nanosleep(zx_deadline_after(ZX_MSEC(1)));
+        next += sprintf(next, "%02x ", bytes[i % BRCMF_HEXDUMP_WIDTH]);
+        if ((i % BRCMF_HEXDUMP_WIDTH) == (BRCMF_HEXDUMP_WIDTH - 1)) {
+            // For larger dumps over serial, a delay may need to be added
+            zxlogf(INFO, "%p: %s\n", bytes, output);
             next = output;
+            bytes += BRCMF_HEXDUMP_WIDTH;
         }
     }
-    if ((i % 32) != 0) {
-        brcmf_dbg(INFO, "%s", output);
+    if ((i % BRCMF_HEXDUMP_WIDTH) != 0) {
+        zxlogf(INFO, "%p: %s\n", bytes, output);
     }
 }
 
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/debug.h b/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
index 2db7ce4..c969155 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/debug.h
@@ -43,6 +43,7 @@
 #define BRCMF_MSGBUF_VAL  0x00040000
 #define BRCMF_PCIE_VAL    0x00080000
 #define BRCMF_FWCON_VAL   0x00100000
+#define BRCMF_ALL_VAL     0xffffffff
 
 // clang-format on
 
@@ -97,12 +98,12 @@
 
 #endif /* defined(DEBUG) || defined(CONFIG_BRCMFMAC_DBG) */
 
-// TODO(cphoenix): The call to brcmf_hexdump was originally trace_brcmf_hexdump, so this is
-// probably too spammy.
 #define brcmf_dbg_hex_dump(test, data, len, fmt, ...)                \
     do {                                                             \
-        brcmf_hexdump((void*)data, len);                             \
-        if (test) brcmu_dbg_hex_dump(data, len, fmt, ##__VA_ARGS__); \
+        if (test) {                                                  \
+            zxlogf(INFO, "brcmfmac: " fmt, ##__VA_ARGS__);           \
+            brcmf_hexdump(data, len);                                \
+        }                                                            \
     } while (0)
 
 void brcm_dbg_clear_err();
diff --git a/drivers/wlan/third_party/broadcom/brcmfmac/utils.c b/drivers/wlan/third_party/broadcom/brcmfmac/utils.c
index 4430079..0b91422 100644
--- a/drivers/wlan/third_party/broadcom/brcmfmac/utils.c
+++ b/drivers/wlan/third_party/broadcom/brcmfmac/utils.c
@@ -284,23 +284,3 @@
 
     return buf;
 }
-
-#if defined(DEBUG)
-
-void brcmu_dbg_hex_dump(const void* data, size_t size, const char* fmt, ...) {
-    struct va_format vaf;
-    va_list args;
-
-    va_start(args, fmt);
-
-    vaf.fmt = fmt;
-    vaf.va = &args;
-
-    zxlogf(INFO, "brcmfmac: %pV", &vaf);
-
-    va_end(args);
-
-    brcmf_hexdump(data, size);
-}
-
-#endif /* defined(DEBUG) */