pds_core: pass opcode to devcmd_wait
authorShannon Nelson <shannon.nelson@amd.com>
Thu, 24 Aug 2023 16:17:54 +0000 (09:17 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 26 Aug 2023 02:05:58 +0000 (19:05 -0700)
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: 523847df1b37 ("pds_core: add devcmd device interfaces")
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230824161754.34264-6-shannon.nelson@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/amd/pds_core/dev.c

index 524f422ee7ace5a7098b376c66024955bf0f65d1..f77cd9f5a2fda53a05dcfe3d8b202bb98c513c0b 100644 (file)
@@ -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)