svn commit: r296048 - stable/9/sys/dev/bxe
David C Somayajulu
davidcs at FreeBSD.org
Thu Feb 25 18:25:37 UTC 2016
Author: davidcs
Date: Thu Feb 25 18:25:36 2016
New Revision: 296048
URL: https://svnweb.freebsd.org/changeset/base/296048
Log:
MFC r295823
Modified the use of bxe_grc_dump() function so that it can be invoked directly at any potential error path, where a fwdump is needed. The fwdump (a.k.a grcdump) is stored in a driver buffer. The sysctl grcdump_done indicates if a fwdump was taken and waiting to be retrieved.
The sysctl trigger_grcdump can be used to manually trigger a fwdump.
Modified:
stable/9/sys/dev/bxe/bxe.c
stable/9/sys/dev/bxe/bxe.h
Directory Properties:
stable/9/ (props changed)
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/bxe/bxe.c
==============================================================================
--- stable/9/sys/dev/bxe/bxe.c Thu Feb 25 18:23:40 2016 (r296047)
+++ stable/9/sys/dev/bxe/bxe.c Thu Feb 25 18:25:36 2016 (r296048)
@@ -749,6 +749,7 @@ static void bxe_handle_fp_tq(void *conte
static int bxe_add_cdev(struct bxe_softc *sc);
static void bxe_del_cdev(struct bxe_softc *sc);
+static int bxe_grc_dump(struct bxe_softc *sc);
/* calculate crc32 on a buffer (NOTE: crc32_length MUST be aligned to 8) */
uint32_t
@@ -7949,6 +7950,16 @@ bxe_chk_parity_attn(struct bxe_softc *sc
attn.sig[2] = REG_RD(sc, MISC_REG_AEU_AFTER_INVERT_3_FUNC_0 + port*4);
attn.sig[3] = REG_RD(sc, MISC_REG_AEU_AFTER_INVERT_4_FUNC_0 + port*4);
+ /*
+ * Since MCP attentions can't be disabled inside the block, we need to
+ * read AEU registers to see whether they're currently disabled
+ */
+ attn.sig[3] &= ((REG_RD(sc, (!port ? MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0
+ : MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0)) &
+ MISC_AEU_ENABLE_MCP_PRTY_BITS) |
+ ~MISC_AEU_ENABLE_MCP_PRTY_BITS);
+
+
if (!CHIP_IS_E1x(sc))
attn.sig[4] = REG_RD(sc, MISC_REG_AEU_AFTER_INVERT_5_FUNC_0 + port*4);
@@ -16189,6 +16200,30 @@ bxe_sysctl_state(SYSCTL_HANDLER_ARGS)
}
static int
+bxe_sysctl_trigger_grcdump(SYSCTL_HANDLER_ARGS)
+{
+ struct bxe_softc *sc;
+ int error, result;
+
+ result = 0;
+ error = sysctl_handle_int(oidp, &result, 0, req);
+
+ if (error || !req->newptr) {
+ return (error);
+ }
+
+ if (result == 1) {
+ sc = (struct bxe_softc *)arg1;
+
+ BLOGI(sc, "... grcdump start ...\n");
+ bxe_grc_dump(sc);
+ BLOGI(sc, "... grcdump done ...\n");
+ }
+
+ return (error);
+}
+
+static int
bxe_sysctl_eth_stat(SYSCTL_HANDLER_ARGS)
{
struct bxe_softc *sc = (struct bxe_softc *)arg1;
@@ -16320,11 +16355,15 @@ bxe_add_sysctls(struct bxe_softc *sc)
CTLFLAG_RW, &sc->debug,
"debug logging mode");
- sc->trigger_grcdump = 0;
- SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "trigger_grcdump",
- CTLFLAG_RW, &sc->trigger_grcdump, 0,
+ SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "trigger_grcdump",
+ CTLTYPE_UINT | CTLFLAG_RW, sc, 0,
+ bxe_sysctl_trigger_grcdump, "IU",
"set by driver when a grcdump is needed");
+ sc->grcdump_done = 0;
+ SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "grcdump_done",
+ CTLFLAG_RW, &sc->grcdump_done, 0,
+ "set by driver when grcdump is done");
sc->rx_budget = bxe_rx_budget;
SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "rx_budget",
@@ -18942,26 +18981,6 @@ bxe_get_preset_regs_len(struct bxe_softc
}
static int
-bxe_get_max_regs_len(struct bxe_softc *sc)
-{
- uint32_t preset_idx;
- int regdump_len32, len32;
-
- regdump_len32 = bxe_get_preset_regs_len(sc, 1);
-
- /* Calculate the total preset regs length */
- for (preset_idx = 2; preset_idx <= DUMP_MAX_PRESETS; preset_idx++) {
-
- len32 = bxe_get_preset_regs_len(sc, preset_idx);
-
- if (regdump_len32 < len32)
- regdump_len32 = len32;
- }
-
- return regdump_len32;
-}
-
-static int
bxe_get_total_regs_len32(struct bxe_softc *sc)
{
uint32_t preset_idx;
@@ -19188,18 +19207,21 @@ bxe_get_preset_regs(struct bxe_softc *sc
}
static int
-bxe_grc_dump(struct bxe_softc *sc, bxe_grcdump_t *dump)
+bxe_grc_dump(struct bxe_softc *sc)
{
int rval = 0;
uint32_t preset_idx;
uint8_t *buf;
uint32_t size;
struct dump_header *d_hdr;
+
+ if (sc->grcdump_done)
+ return (rval);
ecore_disable_blocks_parity(sc);
- buf = dump->grcdump;
- d_hdr = dump->grcdump;
+ buf = sc->grc_dump;
+ d_hdr = sc->grc_dump;
d_hdr->header_size = (sizeof(struct dump_header) >> 2) - 1;
d_hdr->version = BNX2X_DUMP_VERSION;
@@ -19220,7 +19242,6 @@ bxe_grc_dump(struct bxe_softc *sc, bxe_g
(BXE_PATH(sc) ? DUMP_PATH_1 : DUMP_PATH_0);
}
- dump->grcdump_dwords = sizeof(struct dump_header) >> 2;
buf += sizeof(struct dump_header);
for (preset_idx = 1; preset_idx <= DUMP_MAX_PRESETS; preset_idx++) {
@@ -19237,13 +19258,6 @@ bxe_grc_dump(struct bxe_softc *sc, bxe_g
size = bxe_get_preset_regs_len(sc, preset_idx) * (sizeof (uint32_t));
- rval = copyout(sc->grc_dump, buf, size);
-
- if (rval)
- break;
-
- dump->grcdump_dwords += (size / (sizeof (uint32_t)));
-
buf += size;
}
@@ -19257,11 +19271,12 @@ bxe_grc_dump(struct bxe_softc *sc, bxe_g
static int
bxe_add_cdev(struct bxe_softc *sc)
{
- int max_preset_size;
+ int grc_dump_size;
- max_preset_size = bxe_get_max_regs_len(sc) * (sizeof (uint32_t));
+ grc_dump_size = (bxe_get_total_regs_len32(sc) * sizeof(uint32_t)) +
+ sizeof(struct dump_header);
- sc->grc_dump = malloc(max_preset_size, M_DEVBUF, M_NOWAIT);
+ sc->grc_dump = malloc(grc_dump_size, M_DEVBUF, M_NOWAIT);
if (sc->grc_dump == NULL)
return (-1);
@@ -19329,12 +19344,13 @@ bxe_eioctl(struct cdev *dev, u_long cmd,
sizeof(struct dump_header);
if ((sc->grc_dump == NULL) || (dump->grcdump == NULL) ||
- (dump->grcdump_size < grc_dump_size)) {
+ (dump->grcdump_size < grc_dump_size) || (!sc->grcdump_done)) {
rval = EINVAL;
break;
}
-
- rval = bxe_grc_dump(sc, dump);
+ dump->grcdump_dwords = grc_dump_size >> 2;
+ rval = copyout(sc->grc_dump, dump->grcdump, grc_dump_size);
+ sc->grcdump_done = 0;
break;
Modified: stable/9/sys/dev/bxe/bxe.h
==============================================================================
--- stable/9/sys/dev/bxe/bxe.h Thu Feb 25 18:23:40 2016 (r296047)
+++ stable/9/sys/dev/bxe/bxe.h Thu Feb 25 18:25:36 2016 (r296048)
@@ -1833,7 +1833,6 @@ struct bxe_softc {
struct cdev *ioctl_dev;
void *grc_dump;
- int trigger_grcdump;
int grcdump_done;
}; /* struct bxe_softc */
@@ -2301,7 +2300,6 @@ void ecore_storm_memset_struct(struct bx
"ERROR: " format, \
## args); \
} \
- sc->trigger_grcdump |= 0x1; \
} while(0)
#ifdef ECORE_STOP_ON_ERROR
More information about the svn-src-stable-9
mailing list