bnx2x: validate FW trace prior to its printing
authorDmitry Kravkov <dmitry@broadcom.com>
Sun, 18 Mar 2012 10:33:45 +0000 (10:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 Mar 2012 20:53:07 +0000 (16:53 -0400)
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index 0c5f1211559ad13f37e85ca5187ed21fab3ec7a8..5d71b7d43237f807cb45d1cc1e764d5439451c35 100644 (file)
@@ -1129,6 +1129,8 @@ struct shm_dev_info {                             /* size */
 
 #define FW_ACK_NUM_OF_POLL  (FW_ACK_TIME_OUT_MS/FW_ACK_POLL_TIME_MS)
 
+#define MFW_TRACE_SIGNATURE     0x54524342
+
 /****************************************************************************
  * Driver <-> FW Mailbox                                                    *
  ****************************************************************************/
index df350708022ef04d6b89cdcd7e7127659f5b7528..f7f9aa807264f51d8faef59a1f7297fa509d1b4f 100644 (file)
@@ -719,7 +719,17 @@ void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl)
                trace_shmem_base = bp->common.shmem_base;
        else
                trace_shmem_base = SHMEM2_RD(bp, other_shmem_base_addr);
-       addr = trace_shmem_base - 0x0800 + 4;
+       addr = trace_shmem_base - 0x800;
+
+       /* validate TRCB signature */
+       mark = REG_RD(bp, addr);
+       if (mark != MFW_TRACE_SIGNATURE) {
+               BNX2X_ERR("Trace buffer signature is missing.");
+               return ;
+       }
+
+       /* read cyclic buffer pointer */
+       addr += 4;
        mark = REG_RD(bp, addr);
        mark = (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH)
                        + ((mark + 0x3) & ~0x3) - 0x08000000;