| From d6f816720b1484be9ee6dc1fa80217c0b0b1e0e2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 11 Dec 2023 10:57:57 -0800 |
| Subject: ionic: pass opcode to devcmd_wait |
| |
| From: Shannon Nelson <shannon.nelson@amd.com> |
| |
| [ Upstream commit 24f110240c03c6b5368f1203bac72883d511e606 ] |
| |
| 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. |
| |
| Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> |
| Reviewed-by: Brett Creeley <brett.creeley@amd.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/pensando/ionic/ionic_dev.c | 1 + |
| drivers/net/ethernet/pensando/ionic/ionic_dev.h | 1 + |
| drivers/net/ethernet/pensando/ionic/ionic_main.c | 2 +- |
| 3 files changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.c b/drivers/net/ethernet/pensando/ionic/ionic_dev.c |
| index dc5fbc2704f3..b5f681918f6e 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_dev.c |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.c |
| @@ -200,6 +200,7 @@ void ionic_dev_cmd_comp(struct ionic_dev *idev, union ionic_dev_cmd_comp *comp) |
| |
| void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd) |
| { |
| + idev->opcode = cmd->cmd.opcode; |
| memcpy_toio(&idev->dev_cmd_regs->cmd, cmd, sizeof(*cmd)); |
| iowrite32(0, &idev->dev_cmd_regs->done); |
| iowrite32(1, &idev->dev_cmd_regs->doorbell); |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.h b/drivers/net/ethernet/pensando/ionic/ionic_dev.h |
| index 64d27e8e0772..1ce0d307a9d0 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_dev.h |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.h |
| @@ -136,6 +136,7 @@ struct ionic_dev { |
| unsigned long last_hb_time; |
| u32 last_hb; |
| u8 last_fw_status; |
| + u8 opcode; |
| |
| u64 __iomem *db_pages; |
| dma_addr_t phy_db_pages; |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c |
| index 00b6985edea0..694e710244e6 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_main.c |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c |
| @@ -333,7 +333,7 @@ int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds) |
| */ |
| max_wait = jiffies + (max_seconds * HZ); |
| try_again: |
| - opcode = readb(&idev->dev_cmd_regs->cmd.cmd.opcode); |
| + opcode = idev->opcode; |
| start_time = jiffies; |
| do { |
| done = ionic_dev_cmd_done(idev); |
| -- |
| 2.43.0 |
| |