Changeset dfe4955 in mainline for uspace/drv/bus/usb/uhci/uhci.c
- Timestamp:
- 2011-07-12T18:38:27Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 26858040
- Parents:
- b4f291d
- File:
-
- 1 edited
-
uspace/drv/bus/usb/uhci/uhci.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/uhci.c
rb4f291d rdfe4955 64 64 { 65 65 assert(dev); 66 assert(dev->driver_data);67 66 return dev->driver_data; 68 67 } … … 78 77 assert(dev); 79 78 uhci_t *uhci = dev_to_uhci(dev); 79 if (!uhci) { 80 usb_log_error("Interrupt on not yet initialized device.\n"); 81 return; 82 } 80 83 hc_t *hc = &uhci->hc; 81 84 const uint16_t status = IPC_GET_ARG1(*call); 82 assert(hc);83 85 hc_interrupt(hc, status); 84 86 } … … 192 194 } \ 193 195 free(instance); \ 196 device->driver_data = NULL; \ 194 197 usb_log_error(message); \ 195 198 return ret; \ … … 222 225 ret = pci_disable_legacy(device); 223 226 CHECK_RET_DEST_FREE_RETURN(ret, 224 "Failed(%d) to disable legacy USB: %s.\n", ret, str_error(ret)); 227 "Failed to disable legacy USB: %s.\n", str_error(ret)); 228 229 const size_t cmd_count = hc_irq_cmd_count(); 230 irq_cmd_t irq_cmds[cmd_count]; 231 ret = 232 hc_get_irq_commands(irq_cmds, sizeof(irq_cmds), reg_base, reg_size); 233 CHECK_RET_DEST_FREE_RETURN(ret, 234 "Failed to generate IRQ commands: %s.\n", str_error(ret)); 235 236 irq_code_t irq_code = { .cmdcount = cmd_count, .cmds = irq_cmds }; 237 238 /* Register handler to avoid interrupt lockup */ 239 ret = register_interrupt_handler(device, irq, irq_handler, &irq_code); 240 CHECK_RET_DEST_FREE_RETURN(ret, 241 "Failed to register interrupt handler: %s.\n", str_error(ret)); 225 242 226 243 bool interrupts = false; 227 #ifdef CONFIG_USBHC_NO_INTERRUPTS228 usb_log_warning("Interrupts disabled in OS config, " \229 "falling back to polling.\n");230 #else231 244 ret = pci_enable_interrupts(device); 232 245 if (ret != EOK) { 233 usb_log_warning("Failed to enable interrupts: %s.\n", 234 str_error(ret)); 235 usb_log_info("HW interrupts not available, " \ 236 "falling back to polling.\n"); 246 usb_log_warning("Failed to enable interrupts: %s." 247 " Falling back to polling.\n", str_error(ret)); 237 248 } else { 238 249 usb_log_debug("Hw interrupts enabled.\n"); 239 250 interrupts = true; 240 251 } 241 #endif242 243 252 244 253 ret = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts); 245 254 CHECK_RET_DEST_FREE_RETURN(ret, 246 255 "Failed(%d) to init uhci_hcd: %s.\n", ret, str_error(ret)); 256 257 device->driver_data = instance; 247 258 248 259 #define CHECK_RET_FINI_RETURN(ret, message...) \ … … 253 264 } else (void)0 254 265 255 /* It does no harm if we register this on polling */256 ret = register_interrupt_handler(device, irq, irq_handler,257 &instance->hc.interrupt_code);258 CHECK_RET_FINI_RETURN(ret,259 "Failed(%d) to register interrupt handler: %s.\n",260 ret, str_error(ret));261 262 266 ret = ddf_fun_bind(instance->hc_fun); 263 267 CHECK_RET_FINI_RETURN(ret, … … 278 282 "Failed(%d) to register UHCI root hub: %s.\n", ret, str_error(ret)); 279 283 280 device->driver_data = instance;281 284 return EOK; 282 285 #undef CHECK_RET_FINI_RETURN
Note:
See TracChangeset
for help on using the changeset viewer.
