Commit 0ea064e7 authored by Shannon Nelson's avatar Shannon Nelson Committed by Jakub Kicinski
Browse files

pds_core: pass opcode to devcmd_wait



Don't rely on the PCI memory for the devcmd opcode because we
read a 0xff value if the PCI bus is broken, which can cause us
to report a bogus dev_cmd opcode later.

Fixes: 523847df ("pds_core: add devcmd device interfaces")
Signed-off-by: default avatarShannon Nelson <shannon.nelson@amd.com>
Reviewed-by: default avatarBrett Creeley <brett.creeley@amd.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230824161754.34264-6-shannon.nelson@amd.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 969cfd4c
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ static const char *pdsc_devcmd_str(int opcode)
	}
}

static int pdsc_devcmd_wait(struct pdsc *pdsc, int max_seconds)
static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcode, int max_seconds)
{
	struct device *dev = pdsc->dev;
	unsigned long start_time;
@@ -131,9 +131,6 @@ static int pdsc_devcmd_wait(struct pdsc *pdsc, int max_seconds)
	int done = 0;
	int err = 0;
	int status;
	int opcode;

	opcode = ioread8(&pdsc->cmd_regs->cmd.opcode);

	start_time = jiffies;
	max_wait = start_time + (max_seconds * HZ);
@@ -180,7 +177,7 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,

	memcpy_toio(&pdsc->cmd_regs->cmd, cmd, sizeof(*cmd));
	pdsc_devcmd_dbell(pdsc);
	err = pdsc_devcmd_wait(pdsc, max_seconds);
	err = pdsc_devcmd_wait(pdsc, cmd->opcode, max_seconds);
	memcpy_fromio(comp, &pdsc->cmd_regs->comp, sizeof(*comp));

	if ((err == -ENXIO || err == -ETIMEDOUT) && pdsc->wq)