Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1612 → Rev 1613

/drivers/usb/uhci/hcd.inc
124,25 → 124,46
{
hc_t *hc;
 
printf("USB interrupt\n");
// printf("USB interrupt\n");
 
hc = (hc_t*)hc_list.next;
 
while( &hc->list != &hc_list)
{
hc_t *tmp;
hc_t *htmp;
request_t *rq;
u16_t status;
 
tmp = hc;
htmp = hc;
 
hc = (hc_t*)hc->list.next;
 
status = in16(tmp->iobase + USBSTS);
status = in16(htmp->iobase + USBSTS);
if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */
continue;
out16(tmp->iobase + USBSTS, status); /* Clear it */
}
out16(htmp->iobase + USBSTS, status); /* Clear it */
 
rq = (request_t*)htmp->rq_list.next;
 
while( &rq->list != &htmp->rq_list)
{
request_t *rtmp;
td_t *td;
 
rtmp = rq;
rq = (request_t*)rq->list.next;
 
td = rtmp->td_tail;
 
if( td->status & TD_CTRL_ACTIVE)
continue;
 
list_del(&rtmp->list);
 
RaiseEvent(rtmp->evh, 0, &rtmp->event);
};
}
};
 
 
 
422,6 → 443,15
 
td->status |= TD_CTRL_IOC;
rq->td_tail = td;
 
rq->evh = CreateEvent(NULL, MANUAL_DESTROY);
 
if(rq->evh.handle == 0)
printf("%s: epic fail\n", __FUNCTION__);
 
rq->event.code = 0xFF000001;
rq->event.data[0] = (addr_t)rq;
 
return rq;
}
 
437,6 → 467,15
addr_t data_dma = 0;
bool retval;
 
 
request_t *rq = (request_t*)kmalloc(sizeof(request_t),0);
 
INIT_LIST_HEAD(&rq->list);
 
rq->data = (addr_t)data;
rq->size = req_size;
rq->dev = dev;
 
td0 = alloc_td();
 
td0->status = 0x00800000 | dev->speed;
481,20 → 520,34
td->buffer = 0;
td->bk = td_prev;
 
rq->td_head = td0;
rq->td_tail = td;
 
rq->evh = CreateEvent(NULL, MANUAL_DESTROY);
 
if(rq->evh.handle == 0)
printf("%s: epic fail\n", __FUNCTION__);
 
rq->event.code = 0xFF000001;
rq->event.data[0] = (addr_t)rq;
 
u32_t efl = safe_cli();
 
list_add_tail(&rq->list, &dev->host->rq_list);
 
qh = dev->host->qh[SKEL_ASYNC];
 
qh->qelem = td0->dma;
 
mb();
// __asm__ __volatile__ ("":::"memory");
 
count_t timeout = 25;
while(timeout--){
delay(10/10);
if( !(td->status & TD_CTRL_ACTIVE))
break;
}
safe_sti(efl);
 
WaitEvent(rq->evh.handle, rq->evh.euid);
 
dbgprintf("td0 status 0x%0x\n", td0->status);
dbgprintf("td status 0x%0x\n", td->status);
 
if( (td0->status & TD_ANY_ERROR) ||
(td_prev->status & TD_ANY_ERROR) ||
(td->status & TD_ANY_ERROR))
513,6 → 566,10
retval = false;
} else retval = true;
 
qh->qelem = 1;
 
mb();
 
do
{
td_prev = td->bk;
520,6 → 577,11
td = td_prev;
}while( td != NULL);
 
/*
delete event;
*/
kfree(rq);
 
return retval;
};
 
545,7 → 607,10
dev->id, dev->host->pciId, dev->port);
 
if( !ctrl_request(dev, req_descr, DIN, &descr, 18))
{
dbgprintf("%s epic fail\n",__FUNCTION__);
return;
};
 
dev->dev_descr = descr;