Changes in uspace/drv/bus/usb/uhci/hc.c [7de1988c:1ae74c6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/hc.c
r7de1988c r1ae74c6 90 90 static int hc_debug_checker(void *arg); 91 91 92 enum { 93 /** Number of PIO ranges used in IRQ code */ 94 hc_irq_pio_range_count = 95 sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t), 96 97 /* Number of commands used in IRQ code */ 98 hc_irq_cmd_count = 99 sizeof(uhci_irq_commands) / sizeof(irq_cmd_t) 100 }; 92 93 /** Get number of PIO ranges used in IRQ code. 94 * @return Number of ranges. 95 */ 96 size_t hc_irq_pio_range_count(void) 97 { 98 return sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t); 99 } 100 101 /** Get number of commands used in IRQ code. 102 * @return Number of commands. 103 */ 104 size_t hc_irq_cmd_count(void) 105 { 106 return sizeof(uhci_irq_commands) / sizeof(irq_cmd_t); 107 } 101 108 102 109 /** Generate IRQ code. … … 105 112 * @param[out] cmds Commands buffer. 106 113 * @param[in] cmds_size Size of the commands buffer (bytes). 107 * @param[in] regs Device's register range. 114 * @param[in] regs Physical address of device's registers. 115 * @param[in] reg_size Size of the register area (bytes). 108 116 * 109 117 * @return Error code. … … 111 119 int 112 120 hc_get_irq_code(irq_pio_range_t ranges[], size_t ranges_size, irq_cmd_t cmds[], 113 size_t cmds_size, addr_range_t *regs)121 size_t cmds_size, uintptr_t regs, size_t reg_size) 114 122 { 115 123 if ((ranges_size < sizeof(uhci_irq_pio_ranges)) || 116 124 (cmds_size < sizeof(uhci_irq_commands)) || 117 ( RNGSZ(*regs)< sizeof(uhci_regs_t)))125 (reg_size < sizeof(uhci_regs_t))) 118 126 return EOVERFLOW; 119 127 120 128 memcpy(ranges, uhci_irq_pio_ranges, sizeof(uhci_irq_pio_ranges)); 121 ranges[0].base = RNGABS(*regs);129 ranges[0].base = regs; 122 130 123 131 memcpy(cmds, uhci_irq_commands, sizeof(uhci_irq_commands)); 124 uhci_regs_t *registers = (uhci_regs_t *) RNGABSPTR(*regs);132 uhci_regs_t *registers = (uhci_regs_t *) regs; 125 133 cmds[0].addr = ®isters->usbsts; 126 134 cmds[3].addr = ®isters->usbsts; 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 int rc;144 irq_pio_range_t irq_ranges[hc_irq_pio_range_count];145 irq_cmd_t irq_cmds[hc_irq_cmd_count];146 rc = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,147 sizeof(irq_cmds), regs);148 if (rc != EOK) {149 usb_log_error("Failed to generate IRQ commands: %s.\n",150 str_error(rc));151 return rc;152 }153 154 irq_code_t irq_code = {155 .rangecount = hc_irq_pio_range_count,156 .ranges = irq_ranges,157 .cmdcount = hc_irq_cmd_count,158 .cmds = irq_cmds159 };160 161 /* Register handler to avoid interrupt lockup */162 rc = register_interrupt_handler(device, irq, handler, &irq_code);163 if (rc != EOK) {164 usb_log_error("Failed to register interrupt handler: %s.\n",165 str_error(rc));166 return rc;167 }168 135 169 136 return EOK; … … 230 197 * 231 198 * @param[in] instance Memory place to initialize. 232 * @param[in] regs Range of device's I/O control registers. 199 * @param[in] regs Address of I/O control registers. 200 * @param[in] reg_size Size of I/O control registers. 233 201 * @param[in] interrupts True if hw interrupts should be used. 234 202 * @return Error code. … … 238 206 * interrupt fibrils. 239 207 */ 240 int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts) 241 { 242 assert(regs->size >= sizeof(uhci_regs_t)); 243 int rc; 208 int hc_init(hc_t *instance, void *regs, size_t reg_size, bool interrupts) 209 { 210 assert(reg_size >= sizeof(uhci_regs_t)); 211 int ret; 212 213 #define CHECK_RET_RETURN(ret, message...) \ 214 if (ret != EOK) { \ 215 usb_log_error(message); \ 216 return ret; \ 217 } else (void) 0 244 218 245 219 instance->hw_interrupts = interrupts; … … 248 222 /* allow access to hc control registers */ 249 223 uhci_regs_t *io; 250 rc = pio_enable_range(regs, (void **) &io); 251 if (rc != EOK) { 252 usb_log_error("Failed to gain access to registers at %p: %s.\n", 253 io, str_error(rc)); 254 return rc; 255 } 256 224 ret = pio_enable(regs, reg_size, (void **)&io); 225 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p: %s.\n", 226 io, str_error(ret)); 257 227 instance->registers = io; 258 228 usb_log_debug( 259 "Device registers at %p (%zuB) accessible.\n", io, reg s->size);260 261 r c= hc_init_mem_structures(instance);262 if (rc != EOK) {263 usb_log_error("Failed to initialize UHCI memory structures: %s.\n",264 str_error(rc));265 return rc; 266 } 229 "Device registers at %p (%zuB) accessible.\n", io, reg_size); 230 231 ret = hc_init_mem_structures(instance); 232 CHECK_RET_RETURN(ret, 233 "Failed to initialize UHCI memory structures: %s.\n", 234 str_error(ret)); 235 236 #undef CHECK_RET_RETURN 267 237 268 238 hcd_init(&instance->generic, USB_SPEED_FULL, … … 427 397 428 398 return EOK; 399 #undef CHECK_RET_CLEAR_RETURN 429 400 } 430 401
Note:
See TracChangeset
for help on using the changeset viewer.