Changes in uspace/lib/usbhost/src/ddf_helpers.c [3f74275:e657635] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/ddf_helpers.c
r3f74275 re657635 748 748 * @param[in] gen_irq_code IRQ code generator. 749 749 * 750 * @return IRQ capability handle on success. 751 * @return Negative error code. 750 * @return EOK on success or negative error code 752 751 */ 753 752 int hcd_ddf_setup_interrupts(ddf_dev_t *device, … … 771 770 772 771 /* Register handler to avoid interrupt lockup */ 773 const int irq_cap = register_interrupt_handler(device, irq, handler, 774 &irq_code); 772 int ret = register_interrupt_handler(device, irq, handler, &irq_code); 775 773 irq_code_clean(&irq_code); 776 if (irq_cap < 0) {777 usb_log_error("Failed to register interrupt handler: %s.\n",778 str_error(irq_cap));779 return irq_cap;780 }781 782 /* Enable interrupts */783 int ret = hcd_ddf_enable_interrupts(device);784 774 if (ret != EOK) { 785 775 usb_log_error("Failed to register interrupt handler: %s.\n", 786 776 str_error(ret)); 787 unregister_interrupt_handler(device, irq_cap); 788 return ret; 789 } 790 return irq_cap; 777 return ret; 778 } 779 780 /* Enable interrupts */ 781 ret = hcd_ddf_enable_interrupts(device); 782 if (ret != EOK) { 783 usb_log_error("Failed to register interrupt handler: %s.\n", 784 str_error(ret)); 785 unregister_interrupt_handler(device, irq); 786 return ret; 787 } 788 assert(irq > 0); 789 return irq; 791 790 } 792 791 … … 883 882 interrupt_handler_t *irq_handler = 884 883 driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler; 885 const int irq_cap = hcd_ddf_setup_interrupts(device, &hw_res, 886 irq_handler, driver->irq_code_gen); 887 bool irqs_enabled = !(irq_cap < 0); 888 if (irqs_enabled) { 884 const int irq = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler, 885 driver->irq_code_gen); 886 if (!(irq < 0)) { 889 887 usb_log_debug("Hw interrupts enabled.\n"); 890 888 } … … 901 899 /* Init hw driver */ 902 900 hcd_t *hcd = dev_to_hcd(device); 903 ret = driver->init(hcd, &hw_res, irqs_enabled);901 ret = driver->init(hcd, &hw_res, !(irq < 0)); 904 902 hw_res_list_parsed_clean(&hw_res); 905 903 if (ret != EOK) { … … 909 907 910 908 /* Need working irq replacement to setup root hub */ 911 if ( !irqs_enabled&& hcd->ops.status_hook) {909 if ((irq < 0) && hcd->ops.status_hook) { 912 910 hcd->polling_fibril = fibril_create(interrupt_polling, hcd); 913 911 if (hcd->polling_fibril == 0) { … … 918 916 fibril_add_ready(hcd->polling_fibril); 919 917 usb_log_warning("Failed to enable interrupts: %s." 920 " Falling back to polling.\n", str_error(irq _cap));918 " Falling back to polling.\n", str_error(irq)); 921 919 } 922 920 … … 932 930 irq_unregister: 933 931 /* Unregistering non-existent should be ok */ 934 unregister_interrupt_handler(device, irq _cap);932 unregister_interrupt_handler(device, irq); 935 933 hcd_ddf_clean_hc(device); 936 934 return ret;
Note:
See TracChangeset
for help on using the changeset viewer.