Lines Matching refs:edev

76 static bool eeh_dev_removed(struct eeh_dev *edev)  in eeh_dev_removed()  argument
78 return !edev || (edev->mode & EEH_DEV_REMOVED); in eeh_dev_removed()
81 static bool eeh_edev_actionable(struct eeh_dev *edev) in eeh_edev_actionable() argument
83 if (!edev->pdev) in eeh_edev_actionable()
85 if (edev->pdev->error_state == pci_channel_io_perm_failure) in eeh_edev_actionable()
87 if (eeh_dev_removed(edev)) in eeh_edev_actionable()
89 if (eeh_pe_passed(edev->pe)) in eeh_edev_actionable()
140 static void eeh_disable_irq(struct eeh_dev *edev) in eeh_disable_irq() argument
146 if (edev->pdev->msi_enabled || edev->pdev->msix_enabled) in eeh_disable_irq()
149 if (!irq_has_action(edev->pdev->irq)) in eeh_disable_irq()
152 edev->mode |= EEH_DEV_IRQ_DISABLED; in eeh_disable_irq()
153 disable_irq_nosync(edev->pdev->irq); in eeh_disable_irq()
163 static void eeh_enable_irq(struct eeh_dev *edev) in eeh_enable_irq() argument
165 if ((edev->mode) & EEH_DEV_IRQ_DISABLED) { in eeh_enable_irq()
166 edev->mode &= ~EEH_DEV_IRQ_DISABLED; in eeh_enable_irq()
187 if (irqd_irq_disabled(irq_get_irq_data(edev->pdev->irq))) in eeh_enable_irq()
188 enable_irq(edev->pdev->irq); in eeh_enable_irq()
192 static void eeh_dev_save_state(struct eeh_dev *edev, void *userdata) in eeh_dev_save_state() argument
196 if (!edev) in eeh_dev_save_state()
206 if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED)) in eeh_dev_save_state()
209 pdev = eeh_dev_to_pci_dev(edev); in eeh_dev_save_state()
219 struct eeh_dev *edev, *tmp; in eeh_set_channel_state() local
222 eeh_pe_for_each_dev(pe, edev, tmp) in eeh_set_channel_state()
223 if (eeh_edev_actionable(edev)) in eeh_set_channel_state()
224 edev->pdev->error_state = s; in eeh_set_channel_state()
230 struct eeh_dev *edev, *tmp; in eeh_set_irq_state() local
233 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_set_irq_state()
234 if (!eeh_edev_actionable(edev)) in eeh_set_irq_state()
237 if (!eeh_pcid_get(edev->pdev)) in eeh_set_irq_state()
241 eeh_enable_irq(edev); in eeh_set_irq_state()
243 eeh_disable_irq(edev); in eeh_set_irq_state()
245 eeh_pcid_put(edev->pdev); in eeh_set_irq_state()
253 static void eeh_pe_report_edev(struct eeh_dev *edev, eeh_report_fn fn, in eeh_pe_report_edev() argument
261 pdev = edev->pdev; in eeh_pe_report_edev()
266 eeh_edev_info(edev, "no device"); in eeh_pe_report_edev()
270 if (eeh_edev_actionable(edev)) { in eeh_pe_report_edev()
274 eeh_edev_info(edev, "no driver"); in eeh_pe_report_edev()
276 eeh_edev_info(edev, "driver not EEH aware"); in eeh_pe_report_edev()
277 else if (edev->mode & EEH_DEV_NO_HANDLER) in eeh_pe_report_edev()
278 eeh_edev_info(edev, "driver bound too late"); in eeh_pe_report_edev()
280 new_result = fn(edev, pdev, driver); in eeh_pe_report_edev()
281 eeh_edev_info(edev, "%s driver reports: '%s'", in eeh_pe_report_edev()
291 eeh_edev_info(edev, "not actionable (%d,%d,%d)", !!pdev, in eeh_pe_report_edev()
292 !eeh_dev_removed(edev), !eeh_pe_passed(edev->pe)); in eeh_pe_report_edev()
295 if (edev->pdev != pdev) in eeh_pe_report_edev()
296 eeh_edev_warn(edev, "Device changed during processing!\n"); in eeh_pe_report_edev()
304 struct eeh_dev *edev, *tmp; in eeh_pe_report() local
307 eeh_for_each_pe(root, pe) eeh_pe_for_each_dev(pe, edev, tmp) in eeh_pe_report()
308 eeh_pe_report_edev(edev, fn, result); in eeh_pe_report()
323 static enum pci_ers_result eeh_report_error(struct eeh_dev *edev, in eeh_report_error() argument
332 eeh_edev_info(edev, "Invoking %s->error_detected(IO frozen)", in eeh_report_error()
336 edev->in_error = true; in eeh_report_error()
349 static enum pci_ers_result eeh_report_mmio_enabled(struct eeh_dev *edev, in eeh_report_mmio_enabled() argument
355 eeh_edev_info(edev, "Invoking %s->mmio_enabled()", driver->name); in eeh_report_mmio_enabled()
369 static enum pci_ers_result eeh_report_reset(struct eeh_dev *edev, in eeh_report_reset() argument
373 if (!driver->err_handler->slot_reset || !edev->in_error) in eeh_report_reset()
375 eeh_edev_info(edev, "Invoking %s->slot_reset()", driver->name); in eeh_report_reset()
379 static void eeh_dev_restore_state(struct eeh_dev *edev, void *userdata) in eeh_dev_restore_state() argument
383 if (!edev) in eeh_dev_restore_state()
392 if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED)) { in eeh_dev_restore_state()
393 if (list_is_last(&edev->entry, &edev->pe->edevs)) in eeh_dev_restore_state()
394 eeh_pe_restore_bars(edev->pe); in eeh_dev_restore_state()
399 pdev = eeh_dev_to_pci_dev(edev); in eeh_dev_restore_state()
415 static enum pci_ers_result eeh_report_resume(struct eeh_dev *edev, in eeh_report_resume() argument
419 if (!driver->err_handler->resume || !edev->in_error) in eeh_report_resume()
422 eeh_edev_info(edev, "Invoking %s->resume()", driver->name); in eeh_report_resume()
425 pci_uevent_ers(edev->pdev, PCI_ERS_RESULT_RECOVERED); in eeh_report_resume()
428 eeh_ops->notify_resume(edev); in eeh_report_resume()
441 static enum pci_ers_result eeh_report_failure(struct eeh_dev *edev, in eeh_report_failure() argument
450 eeh_edev_info(edev, "Invoking %s->error_detected(permanent failure)", in eeh_report_failure()
459 static void *eeh_add_virt_device(struct eeh_dev *edev) in eeh_add_virt_device() argument
462 struct pci_dev *dev = eeh_dev_to_pci_dev(edev); in eeh_add_virt_device()
464 if (!(edev->physfn)) { in eeh_add_virt_device()
465 eeh_edev_warn(edev, "Not for VF\n"); in eeh_add_virt_device()
479 pci_iov_add_virtfn(edev->physfn, edev->vf_index); in eeh_add_virt_device()
484 static void eeh_rmv_device(struct eeh_dev *edev, void *userdata) in eeh_rmv_device() argument
487 struct pci_dev *dev = eeh_dev_to_pci_dev(edev); in eeh_rmv_device()
497 if (!eeh_edev_actionable(edev) || in eeh_rmv_device()
517 edev->mode |= EEH_DEV_DISCONNECTED; in eeh_rmv_device()
521 if (edev->physfn) { in eeh_rmv_device()
523 pci_iov_remove_virtfn(edev->physfn, edev->vf_index); in eeh_rmv_device()
524 edev->pdev = NULL; in eeh_rmv_device()
527 list_add(&edev->rmv_entry, &rmv_data->removed_vf_list); in eeh_rmv_device()
537 struct eeh_dev *edev, *tmp; in eeh_pe_detach_dev() local
539 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_pe_detach_dev()
540 if (!(edev->mode & EEH_DEV_DISCONNECTED)) in eeh_pe_detach_dev()
543 edev->mode &= ~(EEH_DEV_DISCONNECTED | EEH_DEV_IRQ_DISABLED); in eeh_pe_detach_dev()
544 eeh_pe_tree_remove(edev); in eeh_pe_detach_dev()
629 struct eeh_dev *edev; in eeh_reset_device() local
697 edev = list_first_entry(&pe->edevs, struct eeh_dev, entry); in eeh_reset_device()
700 eeh_add_virt_device(edev); in eeh_reset_device()
838 struct eeh_dev *edev, *tmp; in eeh_handle_normal_event() local
863 eeh_pe_for_each_dev(tmp_pe, edev, tmp) in eeh_handle_normal_event()
864 if (eeh_slot_presence_check(edev->pdev)) in eeh_handle_normal_event()
917 eeh_pe_for_each_dev(tmp_pe, edev, tmp) in eeh_handle_normal_event()
918 edev->mode &= ~EEH_DEV_NO_HANDLER; in eeh_handle_normal_event()
1042 list_for_each_entry_safe(edev, tmp, &rmv_data.removed_vf_list, in eeh_handle_normal_event()
1044 eeh_add_virt_device(edev); in eeh_handle_normal_event()
1045 list_del(&edev->rmv_entry); in eeh_handle_normal_event()
1054 eeh_pe_for_each_dev(tmp_pe, edev, tmp) { in eeh_handle_normal_event()
1055 edev->mode &= ~EEH_DEV_NO_HANDLER; in eeh_handle_normal_event()
1056 edev->in_error = false; in eeh_handle_normal_event()
1113 eeh_pe_for_each_dev(tmp_pe, edev, tmp) in eeh_handle_normal_event()
1114 eeh_clear_slot_attention(edev->pdev); in eeh_handle_normal_event()
1129 struct eeh_dev *edev, *tmp_edev; in eeh_handle_special_event() local
1192 eeh_pe_for_each_dev(tmp_pe, edev, tmp_edev) in eeh_handle_special_event()
1193 edev->mode &= ~EEH_DEV_NO_HANDLER; in eeh_handle_special_event()