Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b4c7879 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by Greg Kroah-Hartman
Browse files

cxgb4: avoid collecting SGE_QBASE regs during traffic



[ Upstream commit 1bfb3dea965ff9f6226fd1709338f227363b6061 ]

Accessing SGE_QBASE_MAP[0-3] and SGE_QBASE_INDEX registers can lead
to SGE missing doorbells under heavy traffic. So, only collect them
when adapter is idle. Also update the regdump range to skip collecting
these registers.

Fixes: 80a95a80 ("cxgb4: collect SGE PF/VF queue map")
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 255fe564
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -1400,11 +1400,25 @@ int cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init,
	struct cudbg_buffer temp_buff = { 0 };
	struct sge_qbase_reg_field *sge_qbase;
	struct ireg_buf *ch_sge_dbg;
	u8 padap_running = 0;
	int i, rc;
	u32 size;

	rc = cudbg_get_buff(pdbg_init, dbg_buff,
			    sizeof(*ch_sge_dbg) * 2 + sizeof(*sge_qbase),
			    &temp_buff);
	/* Accessing SGE_QBASE_MAP[0-3] and SGE_QBASE_INDEX regs can
	 * lead to SGE missing doorbells under heavy traffic. So, only
	 * collect them when adapter is idle.
	 */
	for_each_port(padap, i) {
		padap_running = netif_running(padap->port[i]);
		if (padap_running)
			break;
	}

	size = sizeof(*ch_sge_dbg) * 2;
	if (!padap_running)
		size += sizeof(*sge_qbase);

	rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
	if (rc)
		return rc;

@@ -1426,7 +1440,8 @@ int cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init,
		ch_sge_dbg++;
	}

	if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5) {
	if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5 &&
	    !padap_running) {
		sge_qbase = (struct sge_qbase_reg_field *)ch_sge_dbg;
		/* 1 addr reg SGE_QBASE_INDEX and 4 data reg
		 * SGE_QBASE_MAP[0-3]
+2 −1
Original line number Diff line number Diff line
@@ -2093,7 +2093,8 @@ void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
		0x1190, 0x1194,
		0x11a0, 0x11a4,
		0x11b0, 0x11b4,
		0x11fc, 0x1274,
		0x11fc, 0x123c,
		0x1254, 0x1274,
		0x1280, 0x133c,
		0x1800, 0x18fc,
		0x3000, 0x302c,