Changeset eadaeae8 in mainline for uspace/lib/usbhost/src/hcd.c
- Timestamp:
- 2018-03-21T20:58:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3be9d10
- Parents:
- 874381a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/hcd.c
r874381a readaeae8 149 149 * If this method fails, a polling fibril is started instead. 150 150 * 151 * @param[in] hcdHost controller device.152 * @param[in] hw_resResources to be used.153 * 154 * @return IRQ capability handle on success.155 * @return Negative error code.151 * @param[in] hcd Host controller device. 152 * @param[in] hw_res Resources to be used. 153 * @param[out] irq_handle Storage for the returned IRQ handle 154 * 155 * @return Error code. 156 156 */ 157 157 static errno_t hcd_ddf_setup_interrupts(hc_device_t *hcd, 158 const hw_res_list_parsed_t *hw_res )158 const hw_res_list_parsed_t *hw_res, cap_irq_handle_t *irq_handle) 159 159 { 160 160 assert(hcd); … … 169 169 if (ret != EOK) { 170 170 usb_log_error("Failed to generate IRQ code: %s.", 171 str_error( irq));172 return irq;171 str_error(ret)); 172 return ret; 173 173 } 174 174 175 175 /* Register handler to avoid interrupt lockup */ 176 int irq_cap;176 cap_irq_handle_t ihandle; 177 177 ret = register_interrupt_handler(hcd->ddf_dev, irq, irq_handler, 178 &irq_code, &i rq_cap);178 &irq_code, &ihandle); 179 179 irq_code_clean(&irq_code); 180 180 if (ret != EOK) { 181 181 usb_log_error("Failed to register interrupt handler: %s.", 182 str_error( irq_cap));183 return irq_cap;182 str_error(ret)); 183 return ret; 184 184 } 185 185 … … 189 189 usb_log_error("Failed to enable interrupts: %s.", 190 190 str_error(ret)); 191 unregister_interrupt_handler(hcd->ddf_dev, i rq_cap);191 unregister_interrupt_handler(hcd->ddf_dev, ihandle); 192 192 return ret; 193 193 } 194 return irq_cap; 194 195 *irq_handle = ihandle; 196 return EOK; 195 197 } 196 198 … … 245 247 246 248 /* Setup interrupts */ 247 hcd->irq_cap = hcd_ddf_setup_interrupts(hcd, &hw_res); 248 if (hcd->irq_cap >= 0) { 249 hcd->irq_handle = CAP_NIL; 250 errno_t irqerr = hcd_ddf_setup_interrupts(hcd, &hw_res, 251 &hcd->irq_handle); 252 if (irqerr == EOK) { 249 253 usb_log_debug("Hw interrupts enabled."); 250 254 } … … 270 274 271 275 /* Need working irq replacement to setup root hub */ 272 if ( hcd->irq_cap < 0&& ops->status) {276 if (irqerr != EOK && ops->status) { 273 277 hcd->polling_fibril = fibril_create(interrupt_polling, hcd->bus); 274 278 if (!hcd->polling_fibril) { … … 279 283 fibril_add_ready(hcd->polling_fibril); 280 284 usb_log_warning("Failed to enable interrupts: %s." 281 " Falling back to polling.", str_error( hcd->irq_cap));285 " Falling back to polling.", str_error(irqerr)); 282 286 } 283 287 … … 305 309 hc_driver->stop(hcd); 306 310 err_irq: 307 unregister_interrupt_handler(device, hcd->irq_ cap);311 unregister_interrupt_handler(device, hcd->irq_handle); 308 312 if (hc_driver->hc_remove) 309 313 hc_driver->hc_remove(hcd); … … 324 328 return err; 325 329 326 unregister_interrupt_handler(dev, hcd->irq_ cap);330 unregister_interrupt_handler(dev, hcd->irq_handle); 327 331 328 332 if (hc_driver->hc_remove)
Note:
See TracChangeset
for help on using the changeset viewer.