Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Paolo Abeni <pabeni@redhat.com>

+37 -8
+9 -6
drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
··· 93 93 bars[i].len = 0; 94 94 } 95 95 } 96 + ionic->num_bars = 0; 96 97 } 97 98 98 99 void __iomem *ionic_bus_map_dbpage(struct ionic *ionic, int page_num) ··· 216 215 217 216 static void ionic_clear_pci(struct ionic *ionic) 218 217 { 219 - ionic->idev.dev_info_regs = NULL; 220 - ionic->idev.dev_cmd_regs = NULL; 221 - ionic->idev.intr_status = NULL; 222 - ionic->idev.intr_ctrl = NULL; 218 + if (ionic->num_bars) { 219 + ionic->idev.dev_info_regs = NULL; 220 + ionic->idev.dev_cmd_regs = NULL; 221 + ionic->idev.intr_status = NULL; 222 + ionic->idev.intr_ctrl = NULL; 223 223 224 - ionic_unmap_bars(ionic); 225 - pci_release_regions(ionic->pdev); 224 + ionic_unmap_bars(ionic); 225 + pci_release_regions(ionic->pdev); 226 + } 226 227 227 228 if (pci_is_enabled(ionic->pdev)) 228 229 pci_disable_device(ionic->pdev);
+10
drivers/net/ethernet/pensando/ionic/ionic_dev.c
··· 319 319 320 320 u8 ionic_dev_cmd_status(struct ionic_dev *idev) 321 321 { 322 + if (!idev->dev_cmd_regs) 323 + return (u8)PCI_ERROR_RESPONSE; 322 324 return ioread8(&idev->dev_cmd_regs->comp.comp.status); 323 325 } 324 326 325 327 bool ionic_dev_cmd_done(struct ionic_dev *idev) 326 328 { 329 + if (!idev->dev_cmd_regs) 330 + return false; 327 331 return ioread32(&idev->dev_cmd_regs->done) & IONIC_DEV_CMD_DONE; 328 332 } 329 333 330 334 void ionic_dev_cmd_comp(struct ionic_dev *idev, union ionic_dev_cmd_comp *comp) 331 335 { 336 + if (!idev->dev_cmd_regs) 337 + return; 332 338 memcpy_fromio(comp, &idev->dev_cmd_regs->comp, sizeof(*comp)); 333 339 } 334 340 335 341 void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd) 336 342 { 337 343 idev->opcode = cmd->cmd.opcode; 344 + 345 + if (!idev->dev_cmd_regs) 346 + return; 347 + 338 348 memcpy_toio(&idev->dev_cmd_regs->cmd, cmd, sizeof(*cmd)); 339 349 iowrite32(0, &idev->dev_cmd_regs->done); 340 350 iowrite32(1, &idev->dev_cmd_regs->doorbell);
+6 -1
drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
··· 90 90 void *p) 91 91 { 92 92 struct ionic_lif *lif = netdev_priv(netdev); 93 + struct ionic_dev *idev; 93 94 unsigned int offset; 94 95 unsigned int size; 95 96 96 97 regs->version = IONIC_DEV_CMD_REG_VERSION; 98 + 99 + idev = &lif->ionic->idev; 100 + if (!idev->dev_info_regs) 101 + return; 97 102 98 103 offset = 0; 99 104 size = IONIC_DEV_INFO_REG_COUNT * sizeof(u32); ··· 106 101 107 102 offset += size; 108 103 size = IONIC_DEV_CMD_REG_COUNT * sizeof(u32); 109 - memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size); 104 + memcpy_fromio(p + offset, idev->dev_cmd_regs->words, size); 110 105 } 111 106 112 107 static void ionic_get_link_ext_stats(struct net_device *netdev,
+5
drivers/net/ethernet/pensando/ionic/ionic_fw.c
··· 109 109 dl = priv_to_devlink(ionic); 110 110 devlink_flash_update_status_notify(dl, "Preparing to flash", NULL, 0, 0); 111 111 112 + if (!idev->dev_cmd_regs) { 113 + err = -ENXIO; 114 + goto err_out; 115 + } 116 + 112 117 buf_sz = sizeof(idev->dev_cmd_regs->data); 113 118 114 119 netdev_dbg(netdev,
+4 -1
drivers/net/ethernet/pensando/ionic/ionic_lif.c
··· 3559 3559 goto err_out_notifyq_deinit; 3560 3560 } 3561 3561 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); 3563 3566 if (err) 3564 3567 goto err_out_notifyq_deinit; 3565 3568
+3
drivers/net/ethernet/pensando/ionic/ionic_main.c
··· 416 416 { 417 417 struct ionic_dev *idev = &ionic->idev; 418 418 419 + if (!idev->dev_cmd_regs) 420 + return; 421 + 419 422 iowrite32(0, &idev->dev_cmd_regs->doorbell); 420 423 memset_io(&idev->dev_cmd_regs->cmd, 0, sizeof(idev->dev_cmd_regs->cmd)); 421 424 }