Commit 237274fa authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'ionic-pci-error-handling-fixes'

Shannon Nelson says:

====================
ionic: PCI error handling fixes

These are a few things to make our PCI reset handling better.
====================

Link: https://lore.kernel.org/r/20240223222742.13923-1-shannon.nelson@amd.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 3980cf16 155a1efc
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ static void ionic_unmap_bars(struct ionic *ionic)
			bars[i].len = 0;
		}
	}
	ionic->num_bars = 0;
}

void __iomem *ionic_bus_map_dbpage(struct ionic *ionic, int page_num)
@@ -215,6 +216,7 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs)

static void ionic_clear_pci(struct ionic *ionic)
{
	if (ionic->num_bars) {
		ionic->idev.dev_info_regs = NULL;
		ionic->idev.dev_cmd_regs = NULL;
		ionic->idev.intr_status = NULL;
@@ -222,6 +224,7 @@ static void ionic_clear_pci(struct ionic *ionic)

		ionic_unmap_bars(ionic);
		pci_release_regions(ionic->pdev);
	}

	if (pci_is_enabled(ionic->pdev))
		pci_disable_device(ionic->pdev);
+10 −0
Original line number Diff line number Diff line
@@ -319,22 +319,32 @@ int ionic_heartbeat_check(struct ionic *ionic)

u8 ionic_dev_cmd_status(struct ionic_dev *idev)
{
	if (!idev->dev_cmd_regs)
		return (u8)PCI_ERROR_RESPONSE;
	return ioread8(&idev->dev_cmd_regs->comp.comp.status);
}

bool ionic_dev_cmd_done(struct ionic_dev *idev)
{
	if (!idev->dev_cmd_regs)
		return false;
	return ioread32(&idev->dev_cmd_regs->done) & IONIC_DEV_CMD_DONE;
}

void ionic_dev_cmd_comp(struct ionic_dev *idev, union ionic_dev_cmd_comp *comp)
{
	if (!idev->dev_cmd_regs)
		return;
	memcpy_fromio(comp, &idev->dev_cmd_regs->comp, sizeof(*comp));
}

void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd)
{
	idev->opcode = cmd->cmd.opcode;

	if (!idev->dev_cmd_regs)
		return;

	memcpy_toio(&idev->dev_cmd_regs->cmd, cmd, sizeof(*cmd));
	iowrite32(0, &idev->dev_cmd_regs->done);
	iowrite32(1, &idev->dev_cmd_regs->doorbell);
+6 −1
Original line number Diff line number Diff line
@@ -90,18 +90,23 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
			   void *p)
{
	struct ionic_lif *lif = netdev_priv(netdev);
	struct ionic_dev *idev;
	unsigned int offset;
	unsigned int size;

	regs->version = IONIC_DEV_CMD_REG_VERSION;

	idev = &lif->ionic->idev;
	if (!idev->dev_info_regs)
		return;

	offset = 0;
	size = IONIC_DEV_INFO_REG_COUNT * sizeof(u32);
	memcpy_fromio(p + offset, lif->ionic->idev.dev_info_regs->words, size);

	offset += size;
	size = IONIC_DEV_CMD_REG_COUNT * sizeof(u32);
	memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
	memcpy_fromio(p + offset, idev->dev_cmd_regs->words, size);
}

static void ionic_get_link_ext_stats(struct net_device *netdev,
+5 −0
Original line number Diff line number Diff line
@@ -109,6 +109,11 @@ int ionic_firmware_update(struct ionic_lif *lif, const struct firmware *fw,
	dl = priv_to_devlink(ionic);
	devlink_flash_update_status_notify(dl, "Preparing to flash", NULL, 0, 0);

	if (!idev->dev_cmd_regs) {
		err = -ENXIO;
		goto err_out;
	}

	buf_sz = sizeof(idev->dev_cmd_regs->data);

	netdev_dbg(netdev,
+4 −1
Original line number Diff line number Diff line
@@ -3559,6 +3559,9 @@ int ionic_lif_init(struct ionic_lif *lif)
			goto err_out_notifyq_deinit;
	}

	if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
		err = ionic_set_nic_features(lif, lif->netdev->features);
	else
		err = ionic_init_nic_features(lif);
	if (err)
		goto err_out_notifyq_deinit;
Loading