Rev 1605 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1605 | Rev 1613 | ||
---|---|---|---|
Line 122... | Line 122... | ||
122 | void hc_interrupt() |
122 | void hc_interrupt() |
123 | { |
123 | { |
124 | hc_t *hc; |
124 | hc_t *hc; |
Line 125... | Line 125... | ||
125 | 125 | ||
Line 126... | Line 126... | ||
126 | printf("USB interrupt\n"); |
126 | // printf("USB interrupt\n"); |
Line 127... | Line 127... | ||
127 | 127 | ||
128 | hc = (hc_t*)hc_list.next; |
128 | hc = (hc_t*)hc_list.next; |
129 | 129 | ||
- | 130 | while( &hc->list != &hc_list) |
|
130 | while( &hc->list != &hc_list) |
131 | { |
Line 131... | Line 132... | ||
131 | { |
132 | hc_t *htmp; |
- | 133 | request_t *rq; |
|
132 | hc_t *tmp; |
134 | u16_t status; |
Line 133... | Line 135... | ||
133 | u16_t status; |
135 | |
134 | 136 | htmp = hc; |
|
135 | tmp = hc; |
137 | |
136 | hc = (hc_t*)hc->list.next; |
138 | hc = (hc_t*)hc->list.next; |
- | 139 | ||
- | 140 | status = in16(htmp->iobase + USBSTS); |
|
- | 141 | if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */ |
|
- | 142 | continue; |
|
137 | 143 | out16(htmp->iobase + USBSTS, status); /* Clear it */ |
|
- | 144 | ||
- | 145 | rq = (request_t*)htmp->rq_list.next; |
|
Line -... | Line 146... | ||
- | 146 | ||
- | 147 | while( &rq->list != &htmp->rq_list) |
|
- | 148 | { |
|
- | 149 | request_t *rtmp; |
|
- | 150 | td_t *td; |
|
- | 151 | ||
- | 152 | rtmp = rq; |
|
- | 153 | rq = (request_t*)rq->list.next; |
|
- | 154 | ||
- | 155 | td = rtmp->td_tail; |
|
- | 156 | ||
- | 157 | if( td->status & TD_CTRL_ACTIVE) |
|
- | 158 | continue; |
|
138 | status = in16(tmp->iobase + USBSTS); |
159 | |
Line 139... | Line 160... | ||
139 | if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */ |
160 | list_del(&rtmp->list); |
Line 420... | Line 441... | ||
420 | }; |
441 | }; |
421 | 442 | ||
Line 422... | Line 443... | ||
422 | td->status |= TD_CTRL_IOC; |
443 | td->status |= TD_CTRL_IOC; |
423 | rq->td_tail = td; |
444 | rq->td_tail = td; |
- | 445 | ||
- | 446 | rq->evh = CreateEvent(NULL, MANUAL_DESTROY); |
|
- | 447 | ||
- | 448 | if(rq->evh.handle == 0) |
|
- | 449 | printf("%s: epic fail\n", __FUNCTION__); |
|
- | 450 | ||
- | 451 | rq->event.code = 0xFF000001; |
|
- | 452 | rq->event.data[0] = (addr_t)rq; |
|
- | 453 | ||
424 | return rq; |
454 | return rq; |
425 | } |
455 | } |
Line 426... | Line 456... | ||
426 | 456 | ||
427 | bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
457 | bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
Line 435... | Line 465... | ||
435 | qh_t *qh; |
465 | qh_t *qh; |
436 | addr_t data_dma = 0; |
466 | addr_t data_dma = 0; |
437 | bool retval; |
467 | bool retval; |
438 | 468 | ||
Line -... | Line 469... | ||
- | 469 | ||
- | 470 | request_t *rq = (request_t*)kmalloc(sizeof(request_t),0); |
|
- | 471 | ||
- | 472 | INIT_LIST_HEAD(&rq->list); |
|
- | 473 | ||
- | 474 | rq->data = (addr_t)data; |
|
- | 475 | rq->size = req_size; |
|
- | 476 | rq->dev = dev; |
|
- | 477 | ||
439 | td0 = alloc_td(); |
478 | td0 = alloc_td(); |
Line 440... | Line 479... | ||
440 | 479 | ||
441 | td0->status = 0x00800000 | dev->speed; |
480 | td0->status = 0x00800000 | dev->speed; |
442 | td0->token = TOKEN( 8, DATA0, 0, dev->addr, 0x2D); |
481 | td0->token = TOKEN( 8, DATA0, 0, dev->addr, 0x2D); |
Line 479... | Line 518... | ||
479 | td->token = (0x7FF<<21)|DATA1|(dev->addr<<8)|pid; |
518 | td->token = (0x7FF<<21)|DATA1|(dev->addr<<8)|pid; |
480 | td->buffer = 0; |
519 | td->buffer = 0; |
481 | td->bk = td_prev; |
520 | td->bk = td_prev; |
482 | 521 | ||
Line -... | Line 522... | ||
- | 522 | rq->td_head = td0; |
|
- | 523 | rq->td_tail = td; |
|
- | 524 | ||
- | 525 | rq->evh = CreateEvent(NULL, MANUAL_DESTROY); |
|
- | 526 | ||
- | 527 | if(rq->evh.handle == 0) |
|
- | 528 | printf("%s: epic fail\n", __FUNCTION__); |
|
- | 529 | ||
- | 530 | rq->event.code = 0xFF000001; |
|
- | 531 | rq->event.data[0] = (addr_t)rq; |
|
- | 532 | ||
- | 533 | u32_t efl = safe_cli(); |
|
- | 534 | ||
- | 535 | list_add_tail(&rq->list, &dev->host->rq_list); |
|
- | 536 | ||
483 | qh = dev->host->qh[SKEL_ASYNC]; |
537 | qh = dev->host->qh[SKEL_ASYNC]; |
Line 484... | Line 538... | ||
484 | 538 | ||
Line 485... | Line 539... | ||
485 | qh->qelem = td0->dma; |
539 | qh->qelem = td0->dma; |
486 | - | ||
Line 487... | Line -... | ||
487 | mb(); |
- | |
488 | // __asm__ __volatile__ ("":::"memory"); |
540 | |
- | 541 | mb(); |
|
489 | 542 | ||
- | 543 | safe_sti(efl); |
|
490 | count_t timeout = 25; |
544 | |
491 | while(timeout--){ |
545 | WaitEvent(rq->evh.handle, rq->evh.euid); |
492 | delay(10/10); |
- | |
Line 493... | Line 546... | ||
493 | if( !(td->status & TD_CTRL_ACTIVE)) |
546 | |
494 | break; |
547 | dbgprintf("td0 status 0x%0x\n", td0->status); |
495 | } |
548 | dbgprintf("td status 0x%0x\n", td->status); |
496 | 549 | ||
Line 511... | Line 564... | ||
511 | 564 | ||
Line 512... | Line 565... | ||
512 | retval = false; |
565 | retval = false; |
513 | } else retval = true; |
566 | } else retval = true; |
Line -... | Line 567... | ||
- | 567 | ||
- | 568 | qh->qelem = 1; |
|
- | 569 | ||
- | 570 | mb(); |
|
514 | 571 | ||
515 | do |
572 | do |
516 | { |
573 | { |
517 | td_prev = td->bk; |
574 | td_prev = td->bk; |
518 | free_td(td); |
575 | free_td(td); |
519 | td = td_prev; |
576 | td = td_prev; |
Line -... | Line 577... | ||
- | 577 | }while( td != NULL); |
|
- | 578 | ||
- | 579 | /* |
|
- | 580 | delete event; |
|
- | 581 | */ |
|
520 | }while( td != NULL); |
582 | kfree(rq); |
521 | 583 | ||
Line 522... | Line 584... | ||
522 | return retval; |
584 | return retval; |
Line 543... | Line 605... | ||
543 | dbgprintf("\ninit device %x, host %x, port %d\n\n", |
605 | dbgprintf("\ninit device %x, host %x, port %d\n\n", |
544 | dev->id, dev->host->pciId, dev->port); |
606 | dev->id, dev->host->pciId, dev->port); |
Line 545... | Line 607... | ||
545 | 607 | ||
- | 608 | if( !ctrl_request(dev, req_descr, DIN, &descr, 18)) |
|
- | 609 | { |
|
546 | if( !ctrl_request(dev, req_descr, DIN, &descr, 18)) |
610 | dbgprintf("%s epic fail\n",__FUNCTION__); |
- | 611 | return; |
|
Line 547... | Line 612... | ||
547 | return; |
612 | }; |
Line 548... | Line 613... | ||
548 | 613 | ||
549 | dev->dev_descr = descr; |
614 | dev->dev_descr = descr; |