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

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'pds_core-AER-handling'

Shannon Nelson says:

====================
pds_core: AER handling

Add simple handlers for the PCI AER callbacks, and improve
the reset handling.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+62 -9
+17 -1
drivers/net/ethernet/amd/pds_core/auxbus.c
··· 184 184 struct pds_auxiliary_dev *padev; 185 185 int err = 0; 186 186 187 + if (!cf) 188 + return -ENODEV; 189 + 187 190 mutex_lock(&pf->config_lock); 188 191 189 192 padev = pf->vfs[cf->vf_id].padev; ··· 205 202 int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf) 206 203 { 207 204 struct pds_auxiliary_dev *padev; 208 - enum pds_core_vif_types vt; 209 205 char devname[PDS_DEVNAME_LEN]; 206 + enum pds_core_vif_types vt; 207 + unsigned long mask; 210 208 u16 vt_support; 211 209 int client_id; 212 210 int err = 0; 213 211 212 + if (!cf) 213 + return -ENODEV; 214 + 214 215 mutex_lock(&pf->config_lock); 216 + 217 + mask = BIT_ULL(PDSC_S_FW_DEAD) | 218 + BIT_ULL(PDSC_S_STOPPING_DRIVER); 219 + if (cf->state & mask) { 220 + dev_err(pf->dev, "%s: can't add dev, VF client in bad state %#lx\n", 221 + __func__, cf->state); 222 + err = -ENXIO; 223 + goto out_unlock; 224 + } 215 225 216 226 /* We only support vDPA so far, so it is the only one to 217 227 * be verified that it is available in the Core device and
+1 -2
drivers/net/ethernet/amd/pds_core/core.c
··· 607 607 if (fw_status != PDS_RC_BAD_PCI) 608 608 return; 609 609 610 - pdsc_reset_prepare(pdsc->pdev); 611 - pdsc_reset_done(pdsc->pdev); 610 + pci_reset_function(pdsc->pdev); 612 611 } 613 612 614 613 void pdsc_health_thread(struct work_struct *work)
-3
drivers/net/ethernet/amd/pds_core/core.h
··· 284 284 int pdsc_dev_init(struct pdsc *pdsc); 285 285 void pdsc_dev_uninit(struct pdsc *pdsc); 286 286 287 - void pdsc_reset_prepare(struct pci_dev *pdev); 288 - void pdsc_reset_done(struct pci_dev *pdev); 289 - 290 287 int pdsc_intr_alloc(struct pdsc *pdsc, char *name, 291 288 irq_handler_t handler, void *data); 292 289 void pdsc_intr_free(struct pdsc *pdsc, int index);
+44 -3
drivers/net/ethernet/amd/pds_core/main.c
··· 45 45 for (i = 0; i < PDS_CORE_BARS_MAX; i++) { 46 46 if (bars[i].vaddr) 47 47 pci_iounmap(pdsc->pdev, bars[i].vaddr); 48 + bars[i].vaddr = NULL; 48 49 } 49 50 } 50 51 ··· 469 468 mod_timer(&pdsc->wdtimer, jiffies + 1); 470 469 } 471 470 472 - void pdsc_reset_prepare(struct pci_dev *pdev) 471 + static void pdsc_reset_prepare(struct pci_dev *pdev) 473 472 { 474 473 struct pdsc *pdsc = pci_get_drvdata(pdev); 475 474 476 475 pdsc_stop_health_thread(pdsc); 477 476 pdsc_fw_down(pdsc); 478 477 478 + if (pdev->is_virtfn) { 479 + struct pdsc *pf; 480 + 481 + pf = pdsc_get_pf_struct(pdsc->pdev); 482 + if (!IS_ERR(pf)) 483 + pdsc_auxbus_dev_del(pdsc, pf); 484 + } 485 + 479 486 pdsc_unmap_bars(pdsc); 480 487 pci_release_regions(pdev); 481 - pci_disable_device(pdev); 488 + if (pci_is_enabled(pdev)) 489 + pci_disable_device(pdev); 482 490 } 483 491 484 - void pdsc_reset_done(struct pci_dev *pdev) 492 + static void pdsc_reset_done(struct pci_dev *pdev) 485 493 { 486 494 struct pdsc *pdsc = pci_get_drvdata(pdev); 487 495 struct device *dev = pdsc->dev; ··· 520 510 521 511 pdsc_fw_up(pdsc); 522 512 pdsc_restart_health_thread(pdsc); 513 + 514 + if (pdev->is_virtfn) { 515 + struct pdsc *pf; 516 + 517 + pf = pdsc_get_pf_struct(pdsc->pdev); 518 + if (!IS_ERR(pf)) 519 + pdsc_auxbus_dev_add(pdsc, pf); 520 + } 521 + } 522 + 523 + static pci_ers_result_t pdsc_pci_error_detected(struct pci_dev *pdev, 524 + pci_channel_state_t error) 525 + { 526 + if (error == pci_channel_io_frozen) { 527 + pdsc_reset_prepare(pdev); 528 + return PCI_ERS_RESULT_NEED_RESET; 529 + } 530 + 531 + return PCI_ERS_RESULT_NONE; 532 + } 533 + 534 + static void pdsc_pci_error_resume(struct pci_dev *pdev) 535 + { 536 + struct pdsc *pdsc = pci_get_drvdata(pdev); 537 + 538 + if (test_bit(PDSC_S_FW_DEAD, &pdsc->state)) 539 + pci_reset_function_locked(pdev); 523 540 } 524 541 525 542 static const struct pci_error_handlers pdsc_err_handler = { 526 543 /* FLR handling */ 527 544 .reset_prepare = pdsc_reset_prepare, 528 545 .reset_done = pdsc_reset_done, 546 + 547 + /* AER handling */ 548 + .error_detected = pdsc_pci_error_detected, 549 + .resume = pdsc_pci_error_resume, 529 550 }; 530 551 531 552 static struct pci_driver pdsc_driver = {