Changeset 3f03199 in mainline for uspace/drv/bus/usb/uhci/uhci.c
- Timestamp:
- 2013-09-15T06:33:53Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9348862
- Parents:
- dd7078c (diff), 1c0cef0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/uhci.c
rdd7078c r3f03199 80 80 return EBADMEM; 81 81 82 #define CHECK_RET_RETURN(ret, message...) \ 83 if (ret != EOK) { \ 84 usb_log_error(message); \ 85 return ret; \ 86 } else (void)0 87 88 uintptr_t reg_base = 0; 89 size_t reg_size = 0; 82 addr_range_t regs; 90 83 int irq = 0; 91 84 92 int ret = get_my_registers(device, ®_base, ®_size, &irq); 93 CHECK_RET_RETURN(ret, "Failed to get I/O region for %" PRIun ": %s.\n", 94 ddf_dev_get_handle(device), str_error(ret)); 95 usb_log_debug("I/O regs at 0x%p (size %zu), IRQ %d.\n", 96 (void *) reg_base, reg_size, irq); 85 int ret = get_my_registers(device, ®s, &irq); 86 if (ret != EOK) { 87 usb_log_error("Failed to get I/O addresses for %" PRIun ": %s.\n", 88 ddf_dev_get_handle(device), str_error(ret)); 89 return ret; 90 } 91 usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n", 92 RNGABSPTR(regs), RNGSZ(regs), irq); 97 93 98 const size_t ranges_count = hc_irq_pio_range_count(); 99 const size_t cmds_count = hc_irq_cmd_count(); 100 irq_pio_range_t irq_ranges[ranges_count]; 101 irq_cmd_t irq_cmds[cmds_count]; 102 ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 103 sizeof(irq_cmds), reg_base, reg_size); 104 CHECK_RET_RETURN(ret, "Failed to generate IRQ commands: %s.\n", 105 str_error(ret)); 94 ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL, 95 BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11); 96 if (ret != EOK) { 97 usb_log_error("Failed to setup generic HCD.\n"); 98 return ret; 99 } 106 100 107 irq_code_t irq_code = {108 .rangecount = ranges_count,109 .ranges = irq_ranges,110 .cmdcount = cmds_count,111 .cmds = irq_cmds112 } ;101 hc_t *hc = malloc(sizeof(hc_t)); 102 if (!hc) { 103 usb_log_error("Failed to allocate UHCI HC structure.\n"); 104 hcd_ddf_clean_hc(device); 105 return ENOMEM; 106 } 113 107 114 /* Register handler to avoid interrupt lockup */ 115 ret = register_interrupt_handler(device, irq, irq_handler, &irq_code); 116 CHECK_RET_RETURN(ret, "Failed to register interrupt handler: %s.\n", 117 str_error(ret)); 118 119 ret = disable_legacy(device); 120 CHECK_RET_RETURN(ret, "Failed to disable legacy USB: %s.\n", 121 str_error(ret)); 108 ret = hc_register_irq_handler(device, ®s, irq, irq_handler); 109 if (ret != EOK) { 110 usb_log_error("Failed to register interrupt handler: %s.\n", 111 str_error(ret)); 112 hcd_ddf_clean_hc(device); 113 return ret; 114 } 122 115 123 116 bool interrupts = false; … … 131 124 } 132 125 133 ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,134 BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);135 CHECK_RET_RETURN(ret, "Failed to setup UHCI HCD.\n");136 137 hc_t *hc = malloc(sizeof(hc_t));138 ret = hc ? EOK : ENOMEM;139 CHECK_RET_RETURN(ret, "Failed to allocate UHCI HC structure.\n");126 ret = disable_legacy(device); 127 if (ret != EOK) { 128 usb_log_error("Failed to disable legacy USB: %s.\n", 129 str_error(ret)); 130 hcd_ddf_clean_hc(device); 131 return ret; 132 } 140 133 141 ret = hc_init(hc, (void*)reg_base, reg_size, interrupts); 142 CHECK_RET_RETURN(ret, 143 "Failed to init uhci_hcd: %s.\n", str_error(ret)); 134 ret = hc_init(hc, ®s, interrupts); 135 if (ret != EOK) { 136 usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret)); 137 hcd_ddf_clean_hc(device); 138 // TODO unregister interrupt handler 139 return ret; 140 } 144 141 145 142 hcd_set_implementation(dev_to_hcd(device), hc, hc_schedule, NULL, NULL); … … 151 148 ret = hcd_ddf_setup_root_hub(device); 152 149 if (ret != EOK) { 153 // TODO: Undo hcd_setup_device154 150 hc_fini(hc); 155 CHECK_RET_RETURN(ret, "Failed to setup UHCI root hub: %s.\n", 151 hcd_ddf_clean_hc(device); 152 // TODO unregister interrupt handler 153 usb_log_error("Failed to setup UHCI root hub: %s.\n", 156 154 str_error(ret)); 157 155 return ret;
Note:
See TracChangeset
for help on using the changeset viewer.