Changeset e9d15d9 in mainline for uspace/lib
- Timestamp:
- 2017-08-18T21:15:26Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 24abb85d
- Parents:
- 1c85bae
- Location:
- uspace/lib
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
r1c85bae re9d15d9 1027 1027 * @param ucode Top-half pseudocode handler. 1028 1028 * 1029 * @return Zero on success or a negative error code. 1029 * @return IRQ capability on success. 1030 * @return Negative error code. 1030 1031 * 1031 1032 */ … … 1056 1057 /** Unsubscribe from IRQ notification. 1057 1058 * 1058 * @param inr IRQ number. 1059 * @param devno Device number of the device generating inr. 1059 * @param cap IRQ capability. 1060 1060 * 1061 1061 * @return Zero on success or a negative error code. 1062 1062 * 1063 1063 */ 1064 int async_irq_unsubscribe(int inr, int devno)1064 int async_irq_unsubscribe(int cap) 1065 1065 { 1066 1066 // TODO: Remove entry from hash table 1067 1067 // to avoid memory leak 1068 1068 1069 return ipc_irq_unsubscribe( inr, devno);1069 return ipc_irq_unsubscribe(cap); 1070 1070 } 1071 1071 -
uspace/lib/c/generic/irq.c
r1c85bae re9d15d9 59 59 * @param ucode Top-half pseudocode handler. 60 60 * 61 * @return Value returned by the kernel. 61 * @return IRQ capability returned by the kernel. 62 * @return Error code returned by the kernel. 62 63 * 63 64 */ … … 74 75 /** Unsubscribe from IRQ notification. 75 76 * 76 * @param inr IRQ number. 77 * @param devno Device number of the device generating inr. 77 * @param cap IRQ capability. 78 78 * 79 79 * @return Value returned by the kernel. 80 80 * 81 81 */ 82 int ipc_irq_unsubscribe(int inr, int devno)82 int ipc_irq_unsubscribe(int cap) 83 83 { 84 return __SYSCALL 2(SYS_IPC_IRQ_UNSUBSCRIBE, inr, devno);84 return __SYSCALL1(SYS_IPC_IRQ_UNSUBSCRIBE, cap); 85 85 } 86 86 -
uspace/lib/c/include/async.h
r1c85bae re9d15d9 168 168 extern int async_irq_subscribe(int, int, async_notification_handler_t, void *, 169 169 const irq_code_t *); 170 extern int async_irq_unsubscribe(int , int);170 extern int async_irq_unsubscribe(int); 171 171 172 172 extern int async_event_subscribe(event_type_t, async_notification_handler_t, -
uspace/lib/c/include/ipc/irq.h
r1c85bae re9d15d9 40 40 41 41 extern int ipc_irq_subscribe(int, int, sysarg_t, const irq_code_t *); 42 extern int ipc_irq_unsubscribe(int , int);42 extern int ipc_irq_unsubscribe(int); 43 43 44 44 #endif -
uspace/lib/drv/generic/interrupt.c
r1c85bae re9d15d9 44 44 45 45 int register_interrupt_handler(ddf_dev_t *dev, int irq, 46 interrupt_handler_t *handler, const irq_code_t * pseudocode)46 interrupt_handler_t *handler, const irq_code_t *irq_code) 47 47 { 48 48 return async_irq_subscribe(irq, dev->handle, 49 (async_notification_handler_t) handler, dev, pseudocode);49 (async_notification_handler_t) handler, dev, irq_code); 50 50 } 51 51 52 int unregister_interrupt_handler(ddf_dev_t *dev, int irq)52 int unregister_interrupt_handler(ddf_dev_t *dev, int cap) 53 53 { 54 return async_irq_unsubscribe( irq, dev->handle);54 return async_irq_unsubscribe(cap); 55 55 } 56 56 -
uspace/lib/usbhost/src/ddf_helpers.c
r1c85bae re9d15d9 748 748 * @param[in] gen_irq_code IRQ code generator. 749 749 * 750 * @return EOK on success or negative error code 750 * @return IRQ kernel object capability on success. 751 * @return Negative error code. 751 752 */ 752 753 int hcd_ddf_setup_interrupts(ddf_dev_t *device, … … 770 771 771 772 /* Register handler to avoid interrupt lockup */ 772 int ret = register_interrupt_handler(device, irq, handler, &irq_code); 773 const int irq_cap = register_interrupt_handler(device, irq, handler, 774 &irq_code); 773 775 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); 774 784 if (ret != EOK) { 775 785 usb_log_error("Failed to register interrupt handler: %s.\n", 776 786 str_error(ret)); 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; 787 unregister_interrupt_handler(device, irq_cap); 788 return ret; 789 } 790 return irq_cap; 790 791 } 791 792 … … 882 883 interrupt_handler_t *irq_handler = 883 884 driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler; 884 const int irq = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler, 885 driver->irq_code_gen); 886 if (!(irq < 0)) { 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) { 887 889 usb_log_debug("Hw interrupts enabled.\n"); 888 890 } … … 899 901 /* Init hw driver */ 900 902 hcd_t *hcd = dev_to_hcd(device); 901 ret = driver->init(hcd, &hw_res, !(irq < 0));903 ret = driver->init(hcd, &hw_res, irqs_enabled); 902 904 hw_res_list_parsed_clean(&hw_res); 903 905 if (ret != EOK) { … … 907 909 908 910 /* Need working irq replacement to setup root hub */ 909 if ( (irq < 0)&& hcd->ops.status_hook) {911 if (!irqs_enabled && hcd->ops.status_hook) { 910 912 hcd->polling_fibril = fibril_create(interrupt_polling, hcd); 911 913 if (hcd->polling_fibril == 0) { … … 916 918 fibril_add_ready(hcd->polling_fibril); 917 919 usb_log_warning("Failed to enable interrupts: %s." 918 " Falling back to polling.\n", str_error(irq ));920 " Falling back to polling.\n", str_error(irq_cap)); 919 921 } 920 922 … … 930 932 irq_unregister: 931 933 /* Unregistering non-existent should be ok */ 932 unregister_interrupt_handler(device, irq );934 unregister_interrupt_handler(device, irq_cap); 933 935 hcd_ddf_clean_hc(device); 934 936 return ret;
Note:
See TracChangeset
for help on using the changeset viewer.