Changeset bfc5c9dd in mainline for uspace/drv/bus/usb/ohci/hc.c
- Timestamp:
- 2012-02-23T20:42:30Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 815b244a
- Parents:
- ffcc5776
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ohci/hc.c
rffcc5776 rbfc5c9dd 242 242 switch (ep->transfer_type) { 243 243 case USB_TRANSFER_CONTROL: 244 instance->registers->control &= ~C_CLE;244 OHCI_CLR(instance->registers->control, C_CLE); 245 245 endpoint_list_add_ep(list, ohci_ep); 246 instance->registers->control_current = 0;247 instance->registers->control |= C_CLE;246 OHCI_WR(instance->registers->control_current, 0); 247 OHCI_SET(instance->registers->control, C_CLE); 248 248 break; 249 249 case USB_TRANSFER_BULK: 250 instance->registers->control &= ~C_BLE;250 OHCI_CLR(instance->registers->control, C_BLE); 251 251 endpoint_list_add_ep(list, ohci_ep); 252 instance->registers->control |= C_BLE; 252 OHCI_WR(instance->registers->bulk_current, 0); 253 OHCI_SET(instance->registers->control, C_BLE); 253 254 break; 254 255 case USB_TRANSFER_ISOCHRONOUS: 255 256 case USB_TRANSFER_INTERRUPT: 256 instance->registers->control &= (~C_PLE & ~C_IE);257 OHCI_CLR(instance->registers->control, C_PLE | C_IE); 257 258 endpoint_list_add_ep(list, ohci_ep); 258 instance->registers->control |= C_PLE | C_IE;259 OHCI_SET(instance->registers->control, C_PLE | C_IE); 259 260 break; 260 261 } … … 274 275 switch (ep->transfer_type) { 275 276 case USB_TRANSFER_CONTROL: 276 instance->registers->control &= ~C_CLE;277 OHCI_CLR(instance->registers->control, C_CLE); 277 278 endpoint_list_remove_ep(list, ohci_ep); 278 instance->registers->control_current = 0;279 instance->registers->control |= C_CLE;279 OHCI_WR(instance->registers->control_current, 0); 280 OHCI_SET(instance->registers->control, C_CLE); 280 281 break; 281 282 case USB_TRANSFER_BULK: 282 instance->registers->control &= ~C_BLE;283 OHCI_CLR(instance->registers->control, C_BLE); 283 284 endpoint_list_remove_ep(list, ohci_ep); 284 instance->registers->control |= C_BLE; 285 OHCI_WR(instance->registers->bulk_current, 0); 286 OHCI_SET(instance->registers->control, C_BLE); 285 287 break; 286 288 case USB_TRANSFER_ISOCHRONOUS: 287 289 case USB_TRANSFER_INTERRUPT: 288 instance->registers->control &= (~C_PLE & ~C_IE);290 OHCI_CLR(instance->registers->control, C_PLE | C_IE); 289 291 endpoint_list_remove_ep(list, ohci_ep); 290 instance->registers->control |= C_PLE | C_IE;292 OHCI_SET(instance->registers->control, C_PLE | C_IE); 291 293 break; 292 294 default: … … 325 327 { 326 328 case USB_TRANSFER_CONTROL: 327 instance->registers->command_status |= CS_CLF;329 OHCI_SET(instance->registers->command_status, CS_CLF); 328 330 break; 329 331 case USB_TRANSFER_BULK: 330 instance->registers->command_status |= CS_BLF;332 OHCI_SET(instance->registers->command_status, CS_BLF); 331 333 break; 332 334 default: … … 344 346 void hc_interrupt(hc_t *instance, uint32_t status) 345 347 { 348 status = ohci_reg2host(status); 346 349 assert(instance); 347 350 if ((status & ~I_SF) == 0) /* ignore sof status */ … … 354 357 fibril_mutex_lock(&instance->guard); 355 358 usb_log_debug2("HCCA: %p-%#" PRIx32 " (%p).\n", instance->hcca, 356 instance->registers->hcca,359 OHCI_RD(instance->registers->hcca), 357 360 (void *) addr_to_phys(instance->hcca)); 358 361 usb_log_debug2("Periodic current: %#" PRIx32 ".\n", 359 instance->registers->periodic_current);362 OHCI_RD(instance->registers->periodic_current)); 360 363 361 364 link_t *current = list_first(&instance->pending_batches); … … 412 415 413 416 usb_log_debug("Requesting OHCI control.\n"); 414 if ( instance->registers->revision& R_LEGACY_FLAG) {417 if (OHCI_RD(instance->registers->revision) & R_LEGACY_FLAG) { 415 418 /* Turn off legacy emulation, it should be enough to zero 416 419 * the lowest bit, but it caused problems. Thus clear all … … 421 424 (uint32_t*)((char*)instance->registers + LEGACY_REGS_OFFSET); 422 425 usb_log_debug("OHCI legacy register %p: %x.\n", 423 ohci_emulation_reg, *ohci_emulation_reg);426 ohci_emulation_reg, OHCI_RD(*ohci_emulation_reg)); 424 427 /* Zero everything but A20State */ 425 *ohci_emulation_reg &= 0x100;428 OHCI_CLR(*ohci_emulation_reg, ~0x100); 426 429 usb_log_debug( 427 430 "OHCI legacy register (should be 0 or 0x100) %p: %x.\n", 428 ohci_emulation_reg, *ohci_emulation_reg);431 ohci_emulation_reg, OHCI_RD(*ohci_emulation_reg)); 429 432 } 430 433 431 434 /* Interrupt routing enabled => smm driver is active */ 432 if ( instance->registers->control& C_IR) {435 if (OHCI_RD(instance->registers->control) & C_IR) { 433 436 usb_log_debug("SMM driver: request ownership change.\n"); 434 instance->registers->command_status |= CS_OCR;437 OHCI_SET(instance->registers->command_status, CS_OCR); 435 438 /* Hope that SMM actually knows its stuff or we can hang here */ 436 while ( instance->registers->control & C_IR) {439 while (OHCI_RD(instance->registers->control & C_IR)) { 437 440 async_usleep(1000); 438 441 } … … 442 445 return; 443 446 } 444 445 447 const unsigned hc_status = C_HCFS_GET(instance->registers->control); 446 448 /* Interrupt routing disabled && status != USB_RESET => BIOS active */ … … 451 453 return; 452 454 } 453 /* HC is suspended assert resume for 20ms ,*/455 /* HC is suspended assert resume for 20ms */ 454 456 C_HCFS_SET(instance->registers->control, C_HCFS_RESUME); 455 457 async_usleep(20000); … … 475 477 476 478 /* Save contents of fm_interval register */ 477 const uint32_t fm_interval = instance->registers->fm_interval;479 const uint32_t fm_interval = OHCI_RD(instance->registers->fm_interval); 478 480 usb_log_debug2("Old value of HcFmInterval: %x.\n", fm_interval); 479 481 … … 481 483 usb_log_debug2("HC reset.\n"); 482 484 size_t time = 0; 483 instance->registers->command_status = CS_HCR;484 while ( instance->registers->command_status& CS_HCR) {485 OHCI_WR(instance->registers->command_status, CS_HCR); 486 while (OHCI_RD(instance->registers->command_status) & CS_HCR) { 485 487 async_usleep(10); 486 488 time += 10; … … 489 491 490 492 /* Restore fm_interval */ 491 instance->registers->fm_interval = fm_interval;492 assert(( instance->registers->command_status& CS_HCR) == 0);493 OHCI_WR(instance->registers->fm_interval, fm_interval); 494 assert((OHCI_RD(instance->registers->command_status) & CS_HCR) == 0); 493 495 494 496 /* hc is now in suspend state */ 495 497 usb_log_debug2("HC should be in suspend state(%x).\n", 496 instance->registers->control);498 OHCI_RD(instance->registers->control)); 497 499 498 500 /* Use HCCA */ 499 instance->registers->hcca = addr_to_phys(instance->hcca);501 OHCI_WR(instance->registers->hcca, addr_to_phys(instance->hcca)); 500 502 501 503 /* Use queues */ 502 instance->registers->bulk_head =503 instance->lists[USB_TRANSFER_BULK].list_head_pa ;504 OHCI_WR(instance->registers->bulk_head, 505 instance->lists[USB_TRANSFER_BULK].list_head_pa); 504 506 usb_log_debug2("Bulk HEAD set to: %p (%#" PRIx32 ").\n", 505 507 instance->lists[USB_TRANSFER_BULK].list_head, 506 508 instance->lists[USB_TRANSFER_BULK].list_head_pa); 507 509 508 instance->registers->control_head =509 instance->lists[USB_TRANSFER_CONTROL].list_head_pa ;510 OHCI_WR(instance->registers->control_head, 511 instance->lists[USB_TRANSFER_CONTROL].list_head_pa); 510 512 usb_log_debug2("Control HEAD set to: %p (%#" PRIx32 ").\n", 511 513 instance->lists[USB_TRANSFER_CONTROL].list_head, … … 513 515 514 516 /* Enable queues */ 515 // instance->registers->control |= (C_PLE | C_IE | C_CLE | C_BLE);516 // usb_log_debug 2("All queues enabled(%x).\n",517 // instance->registers->control);517 // OHCI_SET(instance->registers->control, (C_PLE | C_IE | C_CLE | C_BLE)); 518 // usb_log_debug("Queues enabled(%x).\n", 519 // OHCI_RD(instance->registers->control)); 518 520 519 521 /* Enable interrupts */ 520 instance->registers->interrupt_enable = OHCI_USED_INTERRUPTS;521 usb_log_debug 2("Enabled interrupts: %x.\n",522 instance->registers->interrupt_enable);523 instance->registers->interrupt_enable = I_MI;522 OHCI_WR(instance->registers->interrupt_enable, OHCI_USED_INTERRUPTS); 523 usb_log_debug("Enabled interrupts: %x.\n", 524 OHCI_RD(instance->registers->interrupt_enable)); 525 OHCI_WR(instance->registers->interrupt_enable, I_MI); 524 526 525 527 /* Set periodic start to 90% */ 526 const uint32_t frame_length = FMI_FL_GET(fm_interval); 527 PS_SET(instance->registers->periodic_start, (frame_length / 10) * 9); 528 const uint32_t frame_length = 529 (fm_interval >> FMI_FI_SHIFT) & FMI_FI_MASK; 530 OHCI_WR(instance->registers->periodic_start, 531 ((frame_length / 10) * 9) & PS_MASK << PS_SHIFT); 528 532 usb_log_debug2("All periodic start set to: %x(%u - 90%% of %d).\n", 529 PS_GET(instance->registers->periodic_start), 530 PS_GET(instance->registers->periodic_start), frame_length); 531 533 OHCI_RD(instance->registers->periodic_start), 534 OHCI_RD(instance->registers->periodic_start), frame_length); 532 535 C_HCFS_SET(instance->registers->control, C_HCFS_OPERATIONAL); 533 536 usb_log_debug("OHCI HC up and running (ctl_reg=0x%x).\n", 534 instance->registers->control);537 OHCI_RD(instance->registers->control)); 535 538 } 536 539 /*----------------------------------------------------------------------------*/
Note:
See TracChangeset
for help on using the changeset viewer.