Lines Matching refs:edev

84 static __printf(2, 3) void eeh_edev_info(const struct eeh_dev *edev,  in eeh_edev_info()  argument
95 printk(KERN_INFO "EEH: PE#%x (PCI %s): %pV\n", edev->pe_config_addr, in eeh_edev_info()
96 edev->pdev ? dev_name(&edev->pdev->dev) : "none", &vaf); in eeh_edev_info()
109 static bool eeh_dev_removed(struct eeh_dev *edev) in eeh_dev_removed() argument
111 return !edev || (edev->mode & EEH_DEV_REMOVED); in eeh_dev_removed()
114 static bool eeh_edev_actionable(struct eeh_dev *edev) in eeh_edev_actionable() argument
116 return (edev->pdev && !eeh_dev_removed(edev) && in eeh_edev_actionable()
117 !eeh_pe_passed(edev->pe)); in eeh_edev_actionable()
165 static void eeh_disable_irq(struct eeh_dev *edev) in eeh_disable_irq() argument
171 if (edev->pdev->msi_enabled || edev->pdev->msix_enabled) in eeh_disable_irq()
174 if (!irq_has_action(edev->pdev->irq)) in eeh_disable_irq()
177 edev->mode |= EEH_DEV_IRQ_DISABLED; in eeh_disable_irq()
178 disable_irq_nosync(edev->pdev->irq); in eeh_disable_irq()
188 static void eeh_enable_irq(struct eeh_dev *edev) in eeh_enable_irq() argument
190 if ((edev->mode) & EEH_DEV_IRQ_DISABLED) { in eeh_enable_irq()
191 edev->mode &= ~EEH_DEV_IRQ_DISABLED; in eeh_enable_irq()
212 if (irqd_irq_disabled(irq_get_irq_data(edev->pdev->irq))) in eeh_enable_irq()
213 enable_irq(edev->pdev->irq); in eeh_enable_irq()
217 static void *eeh_dev_save_state(struct eeh_dev *edev, void *userdata) in eeh_dev_save_state() argument
221 if (!edev) in eeh_dev_save_state()
231 if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED)) in eeh_dev_save_state()
234 pdev = eeh_dev_to_pci_dev(edev); in eeh_dev_save_state()
245 struct eeh_dev *edev, *tmp; in eeh_set_channel_state() local
248 eeh_pe_for_each_dev(pe, edev, tmp) in eeh_set_channel_state()
249 if (eeh_edev_actionable(edev)) in eeh_set_channel_state()
250 edev->pdev->error_state = s; in eeh_set_channel_state()
256 struct eeh_dev *edev, *tmp; in eeh_set_irq_state() local
259 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_set_irq_state()
260 if (!eeh_edev_actionable(edev)) in eeh_set_irq_state()
263 if (!eeh_pcid_get(edev->pdev)) in eeh_set_irq_state()
267 eeh_enable_irq(edev); in eeh_set_irq_state()
269 eeh_disable_irq(edev); in eeh_set_irq_state()
271 eeh_pcid_put(edev->pdev); in eeh_set_irq_state()
278 static void eeh_pe_report_edev(struct eeh_dev *edev, eeh_report_fn fn,
284 device_lock(&edev->pdev->dev);
285 if (eeh_edev_actionable(edev)) {
286 driver = eeh_pcid_get(edev->pdev);
289 eeh_edev_info(edev, "no driver");
291 eeh_edev_info(edev, "driver not EEH aware");
292 else if (edev->mode & EEH_DEV_NO_HANDLER)
293 eeh_edev_info(edev, "driver bound too late");
295 new_result = fn(edev, driver);
296 eeh_edev_info(edev, "%s driver reports: '%s'",
304 eeh_pcid_put(edev->pdev);
306 eeh_edev_info(edev, "not actionable (%d,%d,%d)", !!edev->pdev,
307 !eeh_dev_removed(edev), !eeh_pe_passed(edev->pe));
309 device_unlock(&edev->pdev->dev);
316 struct eeh_dev *edev, *tmp; in eeh_pe_report() local
319 eeh_for_each_pe(root, pe) eeh_pe_for_each_dev(pe, edev, tmp) in eeh_pe_report()
320 eeh_pe_report_edev(edev, fn, result); in eeh_pe_report()
335 static enum pci_ers_result eeh_report_error(struct eeh_dev *edev, in eeh_report_error() argument
339 struct pci_dev *dev = edev->pdev; in eeh_report_error()
344 eeh_edev_info(edev, "Invoking %s->error_detected(IO frozen)", in eeh_report_error()
348 edev->in_error = true; in eeh_report_error()
361 static enum pci_ers_result eeh_report_mmio_enabled(struct eeh_dev *edev, in eeh_report_mmio_enabled() argument
366 eeh_edev_info(edev, "Invoking %s->mmio_enabled()", driver->name); in eeh_report_mmio_enabled()
367 return driver->err_handler->mmio_enabled(edev->pdev); in eeh_report_mmio_enabled()
380 static enum pci_ers_result eeh_report_reset(struct eeh_dev *edev, in eeh_report_reset() argument
383 if (!driver->err_handler->slot_reset || !edev->in_error) in eeh_report_reset()
385 eeh_edev_info(edev, "Invoking %s->slot_reset()", driver->name); in eeh_report_reset()
386 return driver->err_handler->slot_reset(edev->pdev); in eeh_report_reset()
389 static void *eeh_dev_restore_state(struct eeh_dev *edev, void *userdata) in eeh_dev_restore_state() argument
393 if (!edev) in eeh_dev_restore_state()
402 if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED)) { in eeh_dev_restore_state()
403 if (list_is_last(&edev->list, &edev->pe->edevs)) in eeh_dev_restore_state()
404 eeh_pe_restore_bars(edev->pe); in eeh_dev_restore_state()
409 pdev = eeh_dev_to_pci_dev(edev); in eeh_dev_restore_state()
426 static enum pci_ers_result eeh_report_resume(struct eeh_dev *edev, in eeh_report_resume() argument
429 if (!driver->err_handler->resume || !edev->in_error) in eeh_report_resume()
432 eeh_edev_info(edev, "Invoking %s->resume()", driver->name); in eeh_report_resume()
433 driver->err_handler->resume(edev->pdev); in eeh_report_resume()
435 pci_uevent_ers(edev->pdev, PCI_ERS_RESULT_RECOVERED); in eeh_report_resume()
437 if (eeh_ops->notify_resume && eeh_dev_to_pdn(edev)) in eeh_report_resume()
438 eeh_ops->notify_resume(eeh_dev_to_pdn(edev)); in eeh_report_resume()
451 static enum pci_ers_result eeh_report_failure(struct eeh_dev *edev, in eeh_report_failure() argument
459 eeh_edev_info(edev, "Invoking %s->error_detected(permanent failure)", in eeh_report_failure()
461 rc = driver->err_handler->error_detected(edev->pdev, in eeh_report_failure()
464 pci_uevent_ers(edev->pdev, PCI_ERS_RESULT_DISCONNECT); in eeh_report_failure()
471 struct eeh_dev *edev = (struct eeh_dev *)data; in eeh_add_virt_device() local
472 struct pci_dev *dev = eeh_dev_to_pci_dev(edev); in eeh_add_virt_device()
473 struct pci_dn *pdn = eeh_dev_to_pdn(edev); in eeh_add_virt_device()
475 if (!(edev->physfn)) { in eeh_add_virt_device()
492 pci_iov_add_virtfn(edev->physfn, pdn->vf_index); in eeh_add_virt_device()
497 static void *eeh_rmv_device(struct eeh_dev *edev, void *userdata) in eeh_rmv_device() argument
500 struct pci_dev *dev = eeh_dev_to_pci_dev(edev); in eeh_rmv_device()
521 if (eeh_dev_removed(edev)) in eeh_rmv_device()
525 if (eeh_pe_passed(edev->pe)) in eeh_rmv_device()
542 edev->bus = dev->bus; in eeh_rmv_device()
543 edev->mode |= EEH_DEV_DISCONNECTED; in eeh_rmv_device()
547 if (edev->physfn) { in eeh_rmv_device()
549 struct pci_dn *pdn = eeh_dev_to_pdn(edev); in eeh_rmv_device()
551 pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); in eeh_rmv_device()
552 edev->pdev = NULL; in eeh_rmv_device()
561 list_add(&edev->rmv_list, &rmv_data->edev_list); in eeh_rmv_device()
573 struct eeh_dev *edev, *tmp; in eeh_pe_detach_dev() local
575 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_pe_detach_dev()
576 if (!(edev->mode & EEH_DEV_DISCONNECTED)) in eeh_pe_detach_dev()
579 edev->mode &= ~(EEH_DEV_DISCONNECTED | EEH_DEV_IRQ_DISABLED); in eeh_pe_detach_dev()
580 eeh_rmv_from_parent_pe(edev); in eeh_pe_detach_dev()
677 struct eeh_dev *edev; in eeh_reset_device() local
740 edev = list_first_entry(&pe->edevs, struct eeh_dev, list); in eeh_reset_device()
743 eeh_add_virt_device(edev, NULL); in eeh_reset_device()
788 struct eeh_dev *edev, *tmp; in eeh_handle_normal_event() local
935 list_for_each_entry_safe(edev, tmp, &rmv_data.edev_list, rmv_list) { in eeh_handle_normal_event()
936 eeh_add_virt_device(edev, NULL); in eeh_handle_normal_event()
937 list_del(&edev->rmv_list); in eeh_handle_normal_event()
946 eeh_pe_for_each_dev(tmp_pe, edev, tmp) { in eeh_handle_normal_event()
947 edev->mode &= ~EEH_DEV_NO_HANDLER; in eeh_handle_normal_event()
948 edev->in_error = false; in eeh_handle_normal_event()