Changes in uspace/drv/uhci-hcd/hc.c [27205841:ea993d18] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/hc.c
r27205841 rea993d18 247 247 { 248 248 assert(instance); 249 #define SETUP_TRANSFER_LIST(type, name) \ 250 do { \ 251 int ret = transfer_list_init(&instance->transfers_##type, name); \ 249 #define CHECK_RET_CLEAR_RETURN(ret, message...) \ 252 250 if (ret != EOK) { \ 253 usb_log_error("Failed(%d) to setup %s transfer list: %s.\n", \ 254 ret, name, str_error(ret)); \ 251 usb_log_error(message); \ 255 252 transfer_list_fini(&instance->transfers_bulk_full); \ 256 253 transfer_list_fini(&instance->transfers_control_full); \ … … 258 255 transfer_list_fini(&instance->transfers_interrupt); \ 259 256 return ret; \ 260 } \ 261 } while (0) 262 263 SETUP_TRANSFER_LIST(bulk_full, "BULK FULL"); 264 SETUP_TRANSFER_LIST(control_full, "CONTROL FULL"); 265 SETUP_TRANSFER_LIST(control_slow, "CONTROL LOW"); 266 SETUP_TRANSFER_LIST(interrupt, "INTERRUPT"); 267 #undef SETUP_TRANSFER_LIST 268 /* Connect lists into one schedule */ 257 } else (void) 0 258 259 /* initialize TODO: check errors */ 260 int ret; 261 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); 262 CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list."); 263 264 ret = transfer_list_init( 265 &instance->transfers_control_full, "CONTROL_FULL"); 266 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list."); 267 268 ret = transfer_list_init( 269 &instance->transfers_control_slow, "CONTROL_SLOW"); 270 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list."); 271 272 ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT"); 273 CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list."); 274 269 275 transfer_list_set_next(&instance->transfers_control_full, 270 276 &instance->transfers_bulk_full); … … 331 337 assert(instance); 332 338 // status |= 1; //Uncomment to work around qemu hang 339 /* TODO: Resume interrupts are not supported */ 333 340 /* Lower 2 bits are transaction error and transaction complete */ 334 if (status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) {341 if (status & 0x3) { 335 342 LIST_INITIALIZE(done); 336 343 transfer_list_remove_finished( … … 351 358 } 352 359 } 353 /* Resume interrupts are not supported */ 354 355 /* Bits 4 and 5 indicate hc error */ 356 if (status & (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)) { 360 /* bits 4 and 5 indicate hc error */ 361 if (status & 0x18) { 357 362 usb_log_error("UHCI hardware failure!.\n"); 358 363 ++instance->hw_failures; … … 384 389 385 390 while (1) { 386 /* Readd and clear status register*/391 /* read and ack interrupts */ 387 392 uint16_t status = pio_read_16(&instance->registers->usbsts); 388 pio_write_16(&instance->registers->usbsts, status);393 pio_write_16(&instance->registers->usbsts, 0x1f); 389 394 if (status != 0) 390 395 usb_log_debug2("UHCI status: %x.\n", status); 391 396 hc_interrupt(instance, status); 392 async_usleep(UHCI_ INT_EMULATOR_TIMEOUT);397 async_usleep(UHCI_CLEANER_TIMEOUT); 393 398 } 394 399 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.