Changeset 772a172 in mainline
- Timestamp:
- 2013-09-21T05:22:43Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f65d9cc
- Parents:
- 19d21728
- Location:
- uspace/drv/bus/usb
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ohci/hc.c
r19d21728 r772a172 125 125 code->cmds[3].addr = (void *) ®isters->interrupt_status; 126 126 OHCI_WR(code->cmds[1].value, OHCI_USED_INTERRUPTS); 127 128 return EOK;129 }130 131 /** Register interrupt handler.132 *133 * @param[in] device Host controller DDF device134 * @param[in] regs Register range135 * @param[in] irq Interrupt number136 * @paran[in] handler Interrupt handler137 *138 * @return EOK on success or negative error code139 */140 int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,141 interrupt_handler_t handler)142 {143 irq_code_t irq_code = { 0 };144 145 int ret = hc_gen_irq_code(&irq_code, regs);146 if (ret != EOK) {147 usb_log_error("Failed to generate IRQ code: %s.\n",148 str_error(ret));149 return ret;150 }151 152 //TODO we leak memory here153 154 /* Register handler to avoid interrupt lockup */155 ret = register_interrupt_handler(device, irq, handler, &irq_code);156 if (ret != EOK) {157 usb_log_error("Failed to register interrupt handler: %s.\n",158 str_error(ret));159 return ret;160 }161 127 162 128 return EOK; -
uspace/drv/bus/usb/ohci/hc.h
r19d21728 r772a172 73 73 74 74 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs); 75 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,76 interrupt_handler_t);77 75 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun); 78 76 int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts); -
uspace/drv/bus/usb/ohci/ohci.c
r19d21728 r772a172 103 103 } 104 104 105 ret = hc_register_irq_handler(device, ®s, irq, irq_handler);106 if ( ret != EOK) {107 usb_log_error("Failed to register interrupt handler: %s.\n",108 str_error(ret));105 hc_t *hc = malloc(sizeof(hc_t)); 106 if (!hc) { 107 usb_log_error("Failed to allocate driver structure.\n"); 108 ret = ENOMEM; 109 109 goto ddf_hc_clean; 110 110 } … … 112 112 /* Try to enable interrupts */ 113 113 bool interrupts = false; 114 ret = hcd_ddf_enable_interrupts(device); 114 ret = hcd_ddf_setup_interrupts(device, ®s, irq, irq_handler, 115 hc_gen_irq_code); 115 116 if (ret != EOK) { 116 117 usb_log_warning("Failed to enable interrupts: %s." … … 123 124 } 124 125 125 hc_t *hc = malloc(sizeof(hc_t));126 if (!hc) {127 usb_log_error("Failed to allocate driver structure.\n");128 ret = ENOMEM;129 goto unregister_irq;130 }131 132 126 /* Initialize OHCI HC */ 133 127 ret = hc_init(hc, ®s, interrupts); 134 128 if (ret != EOK) { 135 129 usb_log_error("Failed to init hc: %s.\n", str_error(ret)); 136 goto hc_free;130 goto unregister_irq; 137 131 } 138 132 … … 147 141 str_error(ret)); 148 142 hc_fini(hc); 149 hc_free:150 free(hc);151 143 unregister_irq: 152 144 unregister_interrupt_handler(device, irq); 145 free(hc); 153 146 ddf_hc_clean: 154 147 hcd_ddf_clean_hc(device); -
uspace/drv/bus/usb/uhci/hc.c
r19d21728 r772a172 127 127 } 128 128 129 /** Register interrupt handler.130 *131 * @param[in] device Host controller DDF device132 * @param[in] regs Register range133 * @param[in] irq Interrupt number134 * @paran[in] handler Interrupt handler135 *136 * @return EOK on success or negative error code137 */138 int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,139 interrupt_handler_t handler)140 {141 assert(device);142 143 irq_code_t irq_code = { 0 };144 145 int ret = hc_gen_irq_code(&irq_code, regs);146 if (ret != EOK) {147 usb_log_error("Failed to generate IRQ commands: %s.\n",148 str_error(ret));149 return ret;150 }151 //TODO we leak memory here152 153 /* Register handler to avoid interrupt lockup */154 ret = register_interrupt_handler(device, irq, handler, &irq_code);155 if (ret != EOK) {156 usb_log_error("Failed to register interrupt handler: %s.\n",157 str_error(ret));158 return ret;159 }160 161 return EOK;162 }163 164 129 /** Take action based on the interrupt cause. 165 130 * -
uspace/drv/bus/usb/uhci/hc.h
r19d21728 r772a172 124 124 } hc_t; 125 125 126 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,127 interrupt_handler_t);128 126 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs); 129 127 void hc_interrupt(hc_t *instance, uint16_t status); -
uspace/drv/bus/usb/uhci/uhci.c
r19d21728 r772a172 109 109 } 110 110 111 ret = hc_register_irq_handler(device, ®s, irq, irq_handler);112 if (ret != EOK) {113 usb_log_error("Failed to register interrupt handler: %s.\n",114 str_error(ret));115 goto hc_free;116 }117 118 111 bool interrupts = false; 119 ret = hcd_ddf_enable_interrupts(device); 112 ret = hcd_ddf_setup_interrupts(device, ®s, irq, irq_handler, 113 hc_gen_irq_code); 120 114 if (ret != EOK) { 121 115 usb_log_warning("Failed to enable interrupts: %s." … … 154 148 irq_unregister: 155 149 unregister_interrupt_handler(device, irq); 156 hc_free:157 150 free(hc); 158 151 ddf_hc_clean:
Note:
See TracChangeset
for help on using the changeset viewer.