Subversion Repositories Kolibri OS

Rev

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;