Skip to content

Commit 237274f

Browse files
author
Paolo Abeni
committed
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/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
2 parents 3980cf1 + 155a1ef commit 237274f

File tree

6 files changed

+38
-9
lines changed

6 files changed

+38
-9
lines changed

drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ static void ionic_unmap_bars(struct ionic *ionic)
9393
bars[i].len = 0;
9494
}
9595
}
96+
ionic->num_bars = 0;
9697
}
9798

9899
void __iomem *ionic_bus_map_dbpage(struct ionic *ionic, int page_num)
@@ -215,13 +216,15 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs)
215216

216217
static void ionic_clear_pci(struct ionic *ionic)
217218
{
218-
ionic->idev.dev_info_regs = NULL;
219-
ionic->idev.dev_cmd_regs = NULL;
220-
ionic->idev.intr_status = NULL;
221-
ionic->idev.intr_ctrl = NULL;
222-
223-
ionic_unmap_bars(ionic);
224-
pci_release_regions(ionic->pdev);
219+
if (ionic->num_bars) {
220+
ionic->idev.dev_info_regs = NULL;
221+
ionic->idev.dev_cmd_regs = NULL;
222+
ionic->idev.intr_status = NULL;
223+
ionic->idev.intr_ctrl = NULL;
224+
225+
ionic_unmap_bars(ionic);
226+
pci_release_regions(ionic->pdev);
227+
}
225228

226229
if (pci_is_enabled(ionic->pdev))
227230
pci_disable_device(ionic->pdev);

drivers/net/ethernet/pensando/ionic/ionic_dev.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,22 +319,32 @@ int ionic_heartbeat_check(struct ionic *ionic)
319319

320320
u8 ionic_dev_cmd_status(struct ionic_dev *idev)
321321
{
322+
if (!idev->dev_cmd_regs)
323+
return (u8)PCI_ERROR_RESPONSE;
322324
return ioread8(&idev->dev_cmd_regs->comp.comp.status);
323325
}
324326

325327
bool ionic_dev_cmd_done(struct ionic_dev *idev)
326328
{
329+
if (!idev->dev_cmd_regs)
330+
return false;
327331
return ioread32(&idev->dev_cmd_regs->done) & IONIC_DEV_CMD_DONE;
328332
}
329333

330334
void ionic_dev_cmd_comp(struct ionic_dev *idev, union ionic_dev_cmd_comp *comp)
331335
{
336+
if (!idev->dev_cmd_regs)
337+
return;
332338
memcpy_fromio(comp, &idev->dev_cmd_regs->comp, sizeof(*comp));
333339
}
334340

335341
void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd)
336342
{
337343
idev->opcode = cmd->cmd.opcode;
344+
345+
if (!idev->dev_cmd_regs)
346+
return;
347+
338348
memcpy_toio(&idev->dev_cmd_regs->cmd, cmd, sizeof(*cmd));
339349
iowrite32(0, &idev->dev_cmd_regs->done);
340350
iowrite32(1, &idev->dev_cmd_regs->doorbell);

drivers/net/ethernet/pensando/ionic/ionic_ethtool.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,23 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
9090
void *p)
9191
{
9292
struct ionic_lif *lif = netdev_priv(netdev);
93+
struct ionic_dev *idev;
9394
unsigned int offset;
9495
unsigned int size;
9596

9697
regs->version = IONIC_DEV_CMD_REG_VERSION;
9798

99+
idev = &lif->ionic->idev;
100+
if (!idev->dev_info_regs)
101+
return;
102+
98103
offset = 0;
99104
size = IONIC_DEV_INFO_REG_COUNT * sizeof(u32);
100105
memcpy_fromio(p + offset, lif->ionic->idev.dev_info_regs->words, size);
101106

102107
offset += size;
103108
size = IONIC_DEV_CMD_REG_COUNT * sizeof(u32);
104-
memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
109+
memcpy_fromio(p + offset, idev->dev_cmd_regs->words, size);
105110
}
106111

107112
static void ionic_get_link_ext_stats(struct net_device *netdev,

drivers/net/ethernet/pensando/ionic/ionic_fw.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ int ionic_firmware_update(struct ionic_lif *lif, const struct firmware *fw,
109109
dl = priv_to_devlink(ionic);
110110
devlink_flash_update_status_notify(dl, "Preparing to flash", NULL, 0, 0);
111111

112+
if (!idev->dev_cmd_regs) {
113+
err = -ENXIO;
114+
goto err_out;
115+
}
116+
112117
buf_sz = sizeof(idev->dev_cmd_regs->data);
113118

114119
netdev_dbg(netdev,

drivers/net/ethernet/pensando/ionic/ionic_lif.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3559,7 +3559,10 @@ int ionic_lif_init(struct ionic_lif *lif)
35593559
goto err_out_notifyq_deinit;
35603560
}
35613561

3562-
err = ionic_init_nic_features(lif);
3562+
if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
3563+
err = ionic_set_nic_features(lif, lif->netdev->features);
3564+
else
3565+
err = ionic_init_nic_features(lif);
35633566
if (err)
35643567
goto err_out_notifyq_deinit;
35653568

drivers/net/ethernet/pensando/ionic/ionic_main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ static void ionic_dev_cmd_clean(struct ionic *ionic)
416416
{
417417
struct ionic_dev *idev = &ionic->idev;
418418

419+
if (!idev->dev_cmd_regs)
420+
return;
421+
419422
iowrite32(0, &idev->dev_cmd_regs->doorbell);
420423
memset_io(&idev->dev_cmd_regs->cmd, 0, sizeof(idev->dev_cmd_regs->cmd));
421424
}

0 commit comments

Comments
 (0)