Skip to content

Commit

Permalink
bnx2: Dump all FTQ_CTL registers during tx_timeout
Browse files Browse the repository at this point in the history
to help debug tx timeouts reported in the field.

Reviewed-by Benjamin Li <benli@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Michael Chan authored and David S. Miller committed Jun 17, 2012
1 parent 82f437b commit 555069d
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 0 deletions.
71 changes: 71 additions & 0 deletions drivers/net/ethernet/broadcom/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/module.h>
#include <linux/moduleparam.h>

#include <linux/stringify.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/errno.h>
Expand Down Expand Up @@ -6405,6 +6406,75 @@ bnx2_reset_task(struct work_struct *work)
rtnl_unlock();
}

#define BNX2_FTQ_ENTRY(ftq) { __stringify(ftq##FTQ_CTL), BNX2_##ftq##FTQ_CTL }

static void
bnx2_dump_ftq(struct bnx2 *bp)
{
int i;
u32 reg, bdidx, cid, valid;
struct net_device *dev = bp->dev;
static const struct ftq_reg {
char *name;
u32 off;
} ftq_arr[] = {
BNX2_FTQ_ENTRY(RV2P_P),
BNX2_FTQ_ENTRY(RV2P_T),
BNX2_FTQ_ENTRY(RV2P_M),
BNX2_FTQ_ENTRY(TBDR_),
BNX2_FTQ_ENTRY(TDMA_),
BNX2_FTQ_ENTRY(TXP_),
BNX2_FTQ_ENTRY(TXP_),
BNX2_FTQ_ENTRY(TPAT_),
BNX2_FTQ_ENTRY(RXP_C),
BNX2_FTQ_ENTRY(RXP_),
BNX2_FTQ_ENTRY(COM_COMXQ_),
BNX2_FTQ_ENTRY(COM_COMTQ_),
BNX2_FTQ_ENTRY(COM_COMQ_),
BNX2_FTQ_ENTRY(CP_CPQ_),
};

netdev_err(dev, "<--- start FTQ dump --->\n");
for (i = 0; i < ARRAY_SIZE(ftq_arr); i++)
netdev_err(dev, "%s %08x\n", ftq_arr[i].name,
bnx2_reg_rd_ind(bp, ftq_arr[i].off));

netdev_err(dev, "CPU states:\n");
for (reg = BNX2_TXP_CPU_MODE; reg <= BNX2_CP_CPU_MODE; reg += 0x40000)
netdev_err(dev, "%06x mode %x state %x evt_mask %x pc %x pc %x instr %x\n",
reg, bnx2_reg_rd_ind(bp, reg),
bnx2_reg_rd_ind(bp, reg + 4),
bnx2_reg_rd_ind(bp, reg + 8),
bnx2_reg_rd_ind(bp, reg + 0x1c),
bnx2_reg_rd_ind(bp, reg + 0x1c),
bnx2_reg_rd_ind(bp, reg + 0x20));

netdev_err(dev, "<--- end FTQ dump --->\n");
netdev_err(dev, "<--- start TBDC dump --->\n");
netdev_err(dev, "TBDC free cnt: %ld\n",
REG_RD(bp, BNX2_TBDC_STATUS) & BNX2_TBDC_STATUS_FREE_CNT);
netdev_err(dev, "LINE CID BIDX CMD VALIDS\n");
for (i = 0; i < 0x20; i++) {
int j = 0;

REG_WR(bp, BNX2_TBDC_BD_ADDR, i);
REG_WR(bp, BNX2_TBDC_CAM_OPCODE,
BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_READ);
REG_WR(bp, BNX2_TBDC_COMMAND, BNX2_TBDC_COMMAND_CMD_REG_ARB);
while ((REG_RD(bp, BNX2_TBDC_COMMAND) &
BNX2_TBDC_COMMAND_CMD_REG_ARB) && j < 100)
j++;

cid = REG_RD(bp, BNX2_TBDC_CID);
bdidx = REG_RD(bp, BNX2_TBDC_BIDX);
valid = REG_RD(bp, BNX2_TBDC_CAM_OPCODE);
netdev_err(dev, "%02x %06x %04lx %02x [%x]\n",
i, cid, bdidx & BNX2_TBDC_BDIDX_BDIDX,
bdidx >> 24, (valid >> 8) & 0x0ff);
}
netdev_err(dev, "<--- end TBDC dump --->\n");
}

static void
bnx2_dump_state(struct bnx2 *bp)
{
Expand Down Expand Up @@ -6434,6 +6504,7 @@ bnx2_tx_timeout(struct net_device *dev)
{
struct bnx2 *bp = netdev_priv(dev);

bnx2_dump_ftq(bp);
bnx2_dump_state(bp);
bnx2_dump_mcp_state(bp);

Expand Down
41 changes: 41 additions & 0 deletions drivers/net/ethernet/broadcom/bnx2.h
Original file line number Diff line number Diff line change
Expand Up @@ -4642,6 +4642,47 @@ struct l2_fhdr {
#define BNX2_TBDR_FTQ_CTL_CUR_DEPTH (0x3ffL<<22)


/*
* tbdc definition
* offset: 0x5400
*/
#define BNX2_TBDC_COMMAND 0x5400
#define BNX2_TBDC_COMMAND_CMD_ENABLED (1UL<<0)
#define BNX2_TBDC_COMMAND_CMD_FLUSH (1UL<<1)
#define BNX2_TBDC_COMMAND_CMD_SOFT_RST (1UL<<2)
#define BNX2_TBDC_COMMAND_CMD_REG_ARB (1UL<<3)
#define BNX2_TBDC_COMMAND_WRCHK_RANGE_ERROR (1UL<<4)
#define BNX2_TBDC_COMMAND_WRCHK_ALL_ONES_ERROR (1UL<<5)
#define BNX2_TBDC_COMMAND_WRCHK_ALL_ZEROS_ERROR (1UL<<6)
#define BNX2_TBDC_COMMAND_WRCHK_ANY_ONES_ERROR (1UL<<7)
#define BNX2_TBDC_COMMAND_WRCHK_ANY_ZEROS_ERROR (1UL<<8)

#define BNX2_TBDC_STATUS 0x5404
#define BNX2_TBDC_STATUS_FREE_CNT (0x3fUL<<0)

#define BNX2_TBDC_BD_ADDR 0x5424

#define BNX2_TBDC_BIDX 0x542c
#define BNX2_TBDC_BDIDX_BDIDX (0xffffUL<<0)
#define BNX2_TBDC_BDIDX_CMD (0xffUL<<24)

#define BNX2_TBDC_CID 0x5430

#define BNX2_TBDC_CAM_OPCODE 0x5434
#define BNX2_TBDC_CAM_OPCODE_OPCODE (0x7UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_SEARCH (0UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_CACHE_WRITE (1UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_INVALIDATE (2UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_WRITE (4UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_READ (5UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_RAM_WRITE (6UL<<0)
#define BNX2_TBDC_CAM_OPCODE_OPCODE_RAM_READ (7UL<<0)
#define BNX2_TBDC_CAM_OPCODE_SMASK_BDIDX (1UL<<4)
#define BNX2_TBDC_CAM_OPCODE_SMASK_CID (1UL<<5)
#define BNX2_TBDC_CAM_OPCODE_SMASK_CMD (1UL<<6)
#define BNX2_TBDC_CAM_OPCODE_WMT_FAILED (1UL<<7)
#define BNX2_TBDC_CAM_OPCODE_CAM_VALIDS (0xffUL<<8)


/*
* tdma_reg definition
Expand Down

0 comments on commit 555069d

Please sign in to comment.