static int genwqe_sriov_configure(struct pci_dev *dev, int numvfs) { struct genwqe_dev *cd = dev_get_drvdata(&dev->dev); if (numvfs > 0) { genwqe_setup_vf_jtimer(cd); pci_enable_sriov(dev, numvfs); return numvfs; } if (numvfs == 0) { pci_disable_sriov(dev); return 0; } return 0; }
static int genwqe_start(struct genwqe_dev *cd) { int err; struct pci_dev *pci_dev = cd->pci_dev; err = genwqe_read_ids(cd); if (err) return err; if (genwqe_is_privileged(cd)) { /* do this after the tweaks. alloc fail is acceptable */ genwqe_ffdc_buffs_alloc(cd); genwqe_stop_traps(cd); /* Collect registers e.g. FIRs, UNITIDs, traces ... */ genwqe_read_ffdc_regs(cd, cd->ffdc[GENWQE_DBG_REGS].regs, cd->ffdc[GENWQE_DBG_REGS].entries, 0); genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT0, cd->ffdc[GENWQE_DBG_UNIT0].regs, cd->ffdc[GENWQE_DBG_UNIT0].entries); genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT1, cd->ffdc[GENWQE_DBG_UNIT1].regs, cd->ffdc[GENWQE_DBG_UNIT1].entries); genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT2, cd->ffdc[GENWQE_DBG_UNIT2].regs, cd->ffdc[GENWQE_DBG_UNIT2].entries); genwqe_start_traps(cd); if (cd->card_state == GENWQE_CARD_FATAL_ERROR) { dev_warn(&pci_dev->dev, "[%s] chip reload/recovery!\n", __func__); /* * Stealth Mode: Reload chip on either hot * reset or PERST. */ cd->softreset = 0x7Cull; __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, cd->softreset); err = genwqe_bus_reset(cd); if (err != 0) { dev_err(&pci_dev->dev, "[%s] err: bus reset failed!\n", __func__); goto out; } /* * Re-read the IDs because * it could happen that the bitstream load * failed! */ err = genwqe_read_ids(cd); if (err) goto out; } } err = genwqe_setup_service_layer(cd); /* does a reset to the card */ if (err != 0) { dev_err(&pci_dev->dev, "[%s] err: could not setup servicelayer!\n", __func__); err = -ENODEV; goto out; } if (genwqe_is_privileged(cd)) { /* code is running _after_ reset */ genwqe_tweak_hardware(cd); genwqe_setup_pf_jtimer(cd); genwqe_setup_vf_jtimer(cd); } err = genwqe_device_create(cd); if (err < 0) { dev_err(&pci_dev->dev, "err: chdev init failed! (err=%d)\n", err); goto out_release_service_layer; } return 0; out_release_service_layer: genwqe_release_service_layer(cd); out: if (genwqe_is_privileged(cd)) genwqe_ffdc_buffs_free(cd); return -EIO; }