socsvn commit: r257639 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve: . usb usb/gpl
syuu at FreeBSD.org
syuu at FreeBSD.org
Mon Sep 23 08:02:36 UTC 2013
Author: syuu
Date: Mon Sep 23 08:02:36 2013
New Revision: 257639
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257639
Log:
quick hack for enabling UHCI interrupt
Modified:
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c Mon Sep 23 07:53:58 2013 (r257638)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c Mon Sep 23 08:02:36 2013 (r257639)
@@ -106,10 +106,14 @@
*/
low = ioapic->redtbl[pin];
high = ioapic->redtbl[pin] >> 32;
+#if 0
if ((low & IOART_INTMASK) == IOART_INTMCLR &&
(low & IOART_TRGRMOD) == IOART_TRGREDG &&
(low & IOART_DESTMOD) == IOART_DESTPHY &&
(low & IOART_DELMOD) == IOART_DELFIXED) {
+#else
+ {
+#endif
vector = low & IOART_INTVEC;
apicid = high >> APIC_ID_SHIFT;
if (apicid != 0xff) {
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Mon Sep 23 07:53:58 2013 (r257638)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Mon Sep 23 08:02:36 2013 (r257639)
@@ -123,8 +123,8 @@
static int usb_device_init(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
if (klass->init) {
return klass->init(dev);
}
@@ -134,8 +134,8 @@
USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p addr=%x klass=%p\n",
-// __func__, __LINE__, dev, addr, klass);
+ fprintf(usblog, "%s:%d dev=%p addr=%x klass=%p\n",
+ __func__, __LINE__, dev, addr, klass);
if (klass->find_device) {
return klass->find_device(dev, addr);
}
@@ -145,8 +145,8 @@
static void usb_device_handle_destroy(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
if (klass->handle_destroy) {
klass->handle_destroy(dev);
}
@@ -155,8 +155,8 @@
void usb_device_cancel_packet(USBDevice *dev, USBPacket *p)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n",
-// __func__, __LINE__, dev, p, klass);
+ fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n",
+ __func__, __LINE__, dev, p, klass);
if (klass->cancel_packet) {
klass->cancel_packet(dev, p);
}
@@ -165,8 +165,8 @@
void usb_device_handle_attach(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
if (klass->handle_attach) {
klass->handle_attach(dev);
}
@@ -175,8 +175,8 @@
void usb_device_handle_reset(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
if (klass->handle_reset) {
klass->handle_reset(dev);
}
@@ -186,8 +186,8 @@
int value, int index, int length, uint8_t *data)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p p=%p request=%d value=%d index=%d length=%d data=%p klass=%p\n",
-// __func__, __LINE__, dev, p, request, value, index, length, data, klass);
+ fprintf(usblog, "%s:%d dev=%p p=%p request=%d value=%d index=%d length=%d data=%p klass=%p klass->handle_control:%p\n",
+ __func__, __LINE__, dev, p, request, value, index, length, data, klass, klass->handle_control);
if (klass->handle_control) {
klass->handle_control(dev, p, request, value, index, length, data);
}
@@ -196,8 +196,8 @@
void usb_device_handle_data(USBDevice *dev, USBPacket *p)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n",
-// __func__, __LINE__, dev, p, klass);
+ fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n",
+ __func__, __LINE__, dev, p, klass);
if (klass->handle_data) {
klass->handle_data(dev, p);
}
@@ -206,16 +206,16 @@
const char *usb_device_get_product_desc(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
return klass->product_desc;
}
const USBDesc *usb_device_get_usb_desc(USBDevice *dev)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p klass=%p\n",
-// __func__, __LINE__, dev, klass);
+ fprintf(usblog, "%s:%d dev=%p klass=%p\n",
+ __func__, __LINE__, dev, klass);
if (dev->usb_desc) {
return dev->usb_desc;
}
@@ -236,8 +236,8 @@
void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n",
-// __func__, __LINE__, dev, ep, klass);
+ fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n",
+ __func__, __LINE__, dev, ep, klass);
if (klass->flush_ep_queue) {
klass->flush_ep_queue(dev, ep);
}
@@ -246,8 +246,8 @@
void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
-// fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n",
-// __func__, __LINE__, dev, ep, klass);
+ fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n",
+ __func__, __LINE__, dev, ep, klass);
if (klass->ep_stopped) {
klass->ep_stopped(dev, ep);
}
@@ -363,8 +363,8 @@
USBBus *bus;
int i;
-// fprintf(usblog, "%s:%d masterbus:%s ports:%p portcount:%d firstport:%d opaqueue:%p ops:%p speedmask:%x\n",
-// __func__, __LINE__, masterbus, ports, portcount, firstport, opaque, ops, speedmask);
+ fprintf(usblog, "%s:%d masterbus:%s ports:%p portcount:%d firstport:%d opaqueue:%p ops:%p speedmask:%x\n",
+ __func__, __LINE__, masterbus, ports, portcount, firstport, opaque, ops, speedmask);
QTAILQ_FOREACH(bus, &busses, next) {
if (strcmp(bus->name, masterbus) == 0) {
break;
@@ -391,8 +391,8 @@
void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
{
-// fprintf(usblog, "%s:%d downstream:%p upstream:%p portnr:%d\n",
-// __func__, __LINE__, downstream, upstream, portnr);
+ fprintf(usblog, "%s:%d downstream:%p upstream:%p portnr:%d\n",
+ __func__, __LINE__, downstream, upstream, portnr);
if (upstream) {
snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
upstream->path, portnr);
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Mon Sep 23 07:53:58 2013 (r257638)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Mon Sep 23 08:02:36 2013 (r257639)
@@ -299,7 +299,7 @@
static int64_t get_clock_ns(void)
{
struct timespec ts;
- if (clock_gettime(CLOCK_REALTIME, &ts)) {
+ if (clock_gettime(CLOCK_MONOTONIC, &ts)) {
perror("clock_gettime");
exit(1);
}
@@ -342,7 +342,8 @@
struct itimerspec its;
// fprintf(usblog, "%s:%d timer:%p ns:%ld\n", __func__, __LINE__, timer, ns);
- its.it_value = its.it_interval = ns_to_timerspec(ns);
+ memset(&its, 0, sizeof(its));
+ its.it_value = ns_to_timerspec(ns);
timer_settime(timer->timerid, 0, &its, 0);
}
@@ -374,8 +375,8 @@
queue = (UHCIQueue *)calloc(sizeof(*queue), 1);
queue->uhci = s;
queue->qh_addr = qh_addr;
- fprintf(usblog, "%s:%d qh_addr:0x%x\n",
- __func__, __LINE__, qh_addr);
+// fprintf(usblog, "%s:%d qh_addr:0x%x\n",
+// __func__, __LINE__, qh_addr);
queue->token = uhci_queue_token(td);
queue->ep = ep;
QTAILQ_INIT(&queue->asyncs);
@@ -543,6 +544,7 @@
(s->status & UHCI_STS_HSERR) ||
(s->status & UHCI_STS_HCPERR)) {
level = 1;
+ fprintf(usblog, "%s:%d irq=1\n", __func__, __LINE__);
} else {
level = 0;
}
@@ -565,9 +567,9 @@
pci_set_cfgdata8(sc->sc_pi, 0x6b, 0x00);
s->cmd = 0;
s->status = 0;
-// fprintf(usblog, "%s s->status = 0\n", __func__);
s->status2 = 0;
s->intr = 0;
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
s->fl_base_addr = 0;
s->sof_timing = 64;
s->firstport = 0;
@@ -655,15 +657,12 @@
s->expire_time = get_clock_ns() +
(get_ticks_per_sec() / FRAME_TIMER_FREQ);
// fprintf(usblog, "%s s->expire_time:%ld\n", __func__, s->expire_time);
-// mod_timer(s->frame_timer, s->expire_time);
- mod_timer(s->frame_timer, get_ticks_per_sec() / FRAME_TIMER_FREQ);
+ mod_timer(s->frame_timer, (get_ticks_per_sec() / FRAME_TIMER_FREQ));
s->status &= ~UHCI_STS_HCHALTED;
-// fprintf(usblog, "%s status &= ~UHCI_STS_HCHALTED\n", __func__);
-// fprintf(usblog, "%s status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
} else if (!(val & UHCI_CMD_RS)) {
s->status |= UHCI_STS_HCHALTED;
-// fprintf(usblog, "%s status |= UHCI_STS_HCHALTED\n", __func__);
-// fprintf(usblog, "%s status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
}
if (val & UHCI_CMD_GRESET) {
UHCIPort *port;
@@ -688,17 +687,17 @@
case 0x02:
// fprintf(usblog, "%s USBSTS val:%lx\n", __func__, val);
s->status &= ~val;
-// fprintf(usblog, "%s s->status &= ~%lx\n", __func__, val);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
/* XXX: the chip spec is not coherent, so we add a hidden
register to distinguish between IOC and SPD */
if (val & UHCI_STS_USBINT)
s->status2 = 0;
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
break;
case 0x04:
// fprintf(usblog, "%s USBINTR val:%lx\n", __func__, val);
s->intr = val;
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
break;
case 0x06:
@@ -820,8 +819,7 @@
if (s->cmd & UHCI_CMD_EGSM) {
s->cmd |= UHCI_CMD_FGR;
s->status |= UHCI_STS_RD;
-// fprintf(usblog, "%s s->status |= UHCI_STS_RD\n", __func__);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
}
}
@@ -905,13 +903,14 @@
static void uhci_read_td(UHCIState *s, UHCI_TD *td, uint32_t link)
{
-// fprintf(usblog, "%s:%d s=%p td=%p link=%x\n",
-// __func__, __LINE__, s, td, link);
+ fprintf(usblog, "%s:%d s=%p td=%p link=%x\n",
+ __func__, __LINE__, s, td, link);
pci_dma_read(STATE_TO_SC(s), link & ~0xf, td, sizeof(*td));
le32_to_cpus(&td->link);
le32_to_cpus(&td->ctrl);
le32_to_cpus(&td->token);
le32_to_cpus(&td->buffer);
+ fprintf(usblog, "%s:%d td->link:%x td->ctrl:%x td->token:%x td->buffer:%x\n", __func__, __LINE__, td->link, td->ctrl, td->token, td->buffer);
}
static int uhci_handle_td_error(UHCIState *s, UHCI_TD *td, uint32_t td_addr,
@@ -922,54 +921,48 @@
switch (status) {
case USB_RET_NAK:
-// fprintf(usblog, "%s:%d USB_RET_NAK\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d USB_RET_NAK\n", __func__, __LINE__);
td->ctrl |= TD_CTRL_NAK;
-// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
return TD_RESULT_NEXT_QH;
case USB_RET_STALL:
-// fprintf(usblog, "%s:%d USB_RET_STALL\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d USB_RET_STALL\n", __func__, __LINE__);
td->ctrl |= TD_CTRL_STALL;
trace_usb_uhci_packet_complete_stall(queue_token, td_addr);
-// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
ret = TD_RESULT_NEXT_QH;
break;
case USB_RET_BABBLE:
-// fprintf(usblog, "%s:%d USB_RET_BABBLE\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d USB_RET_BABBLE\n", __func__, __LINE__);
td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
/* frame interrupted */
trace_usb_uhci_packet_complete_babble(queue_token, td_addr);
-// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__);
ret = TD_RESULT_STOP_FRAME;
break;
case USB_RET_IOERROR:
case USB_RET_NODEV:
default:
-#if 0
if (status == USB_RET_IOERROR)
fprintf(usblog, "%s:%d USB_RET_IOERROR\n", __func__, __LINE__);
else if (status == USB_RET_NODEV)
fprintf(usblog, "%s:%d USB_RET_NODEV\n", __func__, __LINE__);
else
fprintf(usblog, "%s:%d invalid\n", __func__, __LINE__);
-#endif
td->ctrl |= TD_CTRL_TIMEOUT;
td->ctrl &= ~(3 << TD_CTRL_ERROR_SHIFT);
trace_usb_uhci_packet_complete_error(queue_token, td_addr);
-// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
ret = TD_RESULT_NEXT_QH;
break;
}
td->ctrl &= ~TD_CTRL_ACTIVE;
s->status |= UHCI_STS_USBERR;
-// fprintf(usblog, "%s s->status |= UHCI_STS_USBERR\n", __func__);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
if (td->ctrl & TD_CTRL_IOC) {
*int_mask |= 0x01;
+ fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__);
}
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
return ret;
}
@@ -997,17 +990,19 @@
here. The docs are somewhat unclear, but win2k relies on this
behavior. */
td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
- if (td->ctrl & TD_CTRL_IOC)
+ if (td->ctrl & TD_CTRL_IOC) {
*int_mask |= 0x01;
+ fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__);
+ }
if (pid == USB_TOKEN_IN) {
pci_dma_write(STATE_TO_SC(s), td->buffer, async->buf, len);
if ((td->ctrl & TD_CTRL_SPD) && len < max_len) {
*int_mask |= 0x02;
+ fprintf(usblog, "%s:%d int_mask |= 2\n", __func__, __LINE__);
/* short packet: do not update QH */
trace_usb_uhci_packet_complete_shortxfer(async->queue->token,
async->td_addr);
-// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
return TD_RESULT_NEXT_QH;
}
}
@@ -1015,7 +1010,6 @@
/* success */
trace_usb_uhci_packet_complete_success(async->queue->token,
async->td_addr);
-// fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__);
return TD_RESULT_COMPLETE;
}
@@ -1029,7 +1023,7 @@
UHCIAsync *async = uhci_async_find_td(s, td_addr);
if (async) {
-// fprintf(usblog, "%s:%d async\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d async\n", __func__, __LINE__);
if (uhci_queue_verify(async->queue, qh_addr, td, td_addr, queuing)) {
assert(q == NULL || q == async->queue);
q = async->queue;
@@ -1040,7 +1034,7 @@
}
if (q == NULL) {
-// fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__);
q = uhci_queue_find(s, td);
if (q && !uhci_queue_verify(q, qh_addr, td, td_addr, queuing)) {
uhci_queue_free(q, "guest re-used qh");
@@ -1049,13 +1043,13 @@
}
if (q) {
-// fprintf(usblog, "%s:%d q\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d q\n", __func__, __LINE__);
q->valid = QH_VALID;
}
/* Is active ? */
if (!(td->ctrl & TD_CTRL_ACTIVE)) {
-// fprintf(usblog, "%s:%d !TD_CTRL_ACTIVE\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d !TD_CTRL_ACTIVE\n", __func__, __LINE__);
if (async) {
/* Guest marked a pending td non-active, cancel the queue */
uhci_queue_free(async->queue, "pending td non-active");
@@ -1066,25 +1060,24 @@
*/
if (td->ctrl & TD_CTRL_IOC) {
*int_mask |= 0x01;
+ fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__);
}
-// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
return TD_RESULT_NEXT_QH;
}
if (async) {
-// fprintf(usblog, "%s:%d async\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d async\n", __func__, __LINE__);
if (queuing) {
-// fprintf(usblog, "%s:%d queueing\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d queueing\n", __func__, __LINE__);
/* we are busy filling the queue, we are not prepared
to consume completed packages then, just leave them
in async state */
-// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__);
return TD_RESULT_ASYNC_CONT;
}
if (!async->done) {
UHCI_TD last_td;
UHCIAsync *last = QTAILQ_LAST(&async->queue->asyncs, asyncs_head);
-// fprintf(usblog, "%s:%d !async->done\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d !async->done\n", __func__, __LINE__);
/*
* While we are waiting for the current td to complete, the guest
* may have added more tds to the queue. Note we re-read the td
@@ -1093,7 +1086,6 @@
uhci_read_td(s, &last_td, last->td_addr);
uhci_queue_fill(async->queue, &last_td);
-// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__);
return TD_RESULT_ASYNC_CONT;
}
uhci_async_unlink(async);
@@ -1101,8 +1093,7 @@
}
if (s->completions_only) {
-// fprintf(usblog, "%s:%d completions_only\n", __func__, __LINE__);
-// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d completions_only\n", __func__, __LINE__);
return TD_RESULT_ASYNC_CONT;
}
@@ -1110,10 +1101,10 @@
if (q == NULL) {
USBDevice *dev = uhci_find_device(s, (td->token >> 8) & 0x7f);
USBEndpoint *ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf);
-// fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__);
if (ep == NULL) {
-// fprintf(usblog, "%s:%d eq == NULL\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d eq == NULL\n", __func__, __LINE__);
return uhci_handle_td_error(s, td, td_addr, USB_RET_NODEV,
int_mask);
}
@@ -1153,25 +1144,22 @@
/* invalid pid : frame interrupted */
uhci_async_free(async);
s->status |= UHCI_STS_HCPERR;
-// fprintf(usblog, "%s s->status |= UHCI_STS_USBERR\n", __func__);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
-// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__);
return TD_RESULT_STOP_FRAME;
}
if (async->packet.status == USB_RET_ASYNC) {
-// fprintf(usblog, "%s:%d USB_RET_ASYNC\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d USB_RET_ASYNC\n", __func__, __LINE__);
uhci_async_link(async);
if (!queuing) {
uhci_queue_fill(q, td);
}
-// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__);
return TD_RESULT_ASYNC_START;
}
done:
-// fprintf(usblog, "%s:%d done\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d done\n", __func__, __LINE__);
ret = uhci_complete_td(s, td, async, int_mask);
uhci_async_free(async);
return ret;
@@ -1276,10 +1264,10 @@
frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
-// fprintf(usblog, "%s:%d s:%p frame_addr:0x%x\n", __func__, __LINE__, s, frame_addr);
+ fprintf(usblog, "%s:%d s:%p frame_addr:0x%x\n", __func__, __LINE__, s, frame_addr);
pci_dma_read(STATE_TO_SC(s), frame_addr, &link, 4);
-// fprintf(usblog, "%s:%d link:%x\n", __func__, __LINE__, link);
le32_to_cpus(&link);
+ fprintf(usblog, "%s:%d link:%x\n", __func__, __LINE__, link);
int_mask = 0;
curr_qh = 0;
@@ -1287,7 +1275,7 @@
qhdb_reset(&qhdb);
for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) {
-// fprintf(usblog, "%s:%d cnt:%d is_valid(link):%d is_qh(link):%d\n", __func__, __LINE__, cnt, is_valid(link), is_qh(link));
+ fprintf(usblog, "%s:%d cnt:%d is_valid(link):%d is_qh(link):%d\n", __func__, __LINE__, cnt, is_valid(link), is_qh(link));
if (!s->completions_only && s->frame_bytes >= s->frame_bandwidth) {
/* We've reached the usb 1.1 bandwidth, which is
1280 bytes/frame, stop processing */
@@ -1354,24 +1342,24 @@
switch (ret) {
case TD_RESULT_STOP_FRAME: /* interrupted frame */
-// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__);
goto out;
case TD_RESULT_NEXT_QH:
case TD_RESULT_ASYNC_CONT:
-// fprintf(usblog, "%s:%d %s\n", __func__, __LINE__, ret == TD_RESULT_NEXT_QH ? "TD_RESULT_NEXT_QH" : "TD_RESULT_ASYNC_CONT");
+ fprintf(usblog, "%s:%d %s\n", __func__, __LINE__, ret == TD_RESULT_NEXT_QH ? "TD_RESULT_NEXT_QH" : "TD_RESULT_ASYNC_CONT");
trace_usb_uhci_td_nextqh(curr_qh & ~0xf, link & ~0xf);
link = curr_qh ? qh.link : td.link;
continue;
case TD_RESULT_ASYNC_START:
-// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__);
trace_usb_uhci_td_async(curr_qh & ~0xf, link & ~0xf);
link = curr_qh ? qh.link : td.link;
continue;
case TD_RESULT_COMPLETE:
-// fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__);
+ fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__);
trace_usb_uhci_td_complete(curr_qh & ~0xf, link & ~0xf);
link = td.link;
td_count++;
@@ -1402,6 +1390,7 @@
out:
s->pending_int_mask |= int_mask;
+ fprintf(usblog, "%s:%d pending_int_mask(%x) |= %x\n", __func__, __LINE__, s->pending_int_mask, int_mask);
}
static void uhci_bh(void *opaque)
@@ -1413,10 +1402,12 @@
static void uhci_frame_timer(void *opaque)
{
UHCIState *s = opaque;
+ struct pci_uhci_softc *sc = STATE_TO_SC(s);
uint64_t t_now, t_last_run;
int i, frames;
const uint64_t frame_t = get_ticks_per_sec() / FRAME_TIMER_FREQ;
+ pthread_mutex_lock(&sc->sc_mtx);
s->completions_only = false;
// qemu_bh_cancel(s->bh);
@@ -1427,8 +1418,8 @@
uhci_async_cancel_all(s);
/* set hchalted bit in status - UHCI11D 2.1.2 */
s->status |= UHCI_STS_HCHALTED;
-// fprintf(usblog, "%s s->status |= UHCI_STS_HCHALTED\n", __func__);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
+ pthread_mutex_unlock(&sc->sc_mtx);
return;
}
@@ -1438,20 +1429,17 @@
/* Process up to MAX_FRAMES_PER_TICK frames */
frames = (t_now - t_last_run) / frame_t;
-// fprintf(usblog, "%s:%d frame_t:%ld s->expire_time:%ld t_last_run:%ld t_now:%ld frames:%d\n", __func__, __LINE__, frame_t, s->expire_time, t_last_run, t_now, frames);
if (frames > s->maxframes) {
int skipped = frames - s->maxframes;
s->expire_time += skipped * frame_t;
s->frnum = (s->frnum + skipped) & 0x7ff;
frames -= skipped;
-// fprintf(usblog, "%s frames > s->maxframes skipped:%d s->expire_time:%ld frames:%d\n", __func__, skipped, s->expire_time, frames);
}
if (frames > MAX_FRAMES_PER_TICK) {
frames = MAX_FRAMES_PER_TICK;
}
for (i = 0; i < frames; i++) {
-// fprintf(usblog, "%s:%d %d\n", __func__, __LINE__, i);
s->frame_bytes = 0;
trace_usb_uhci_frame_start(s->frnum);
uhci_async_validate_begin(s);
@@ -1461,20 +1449,20 @@
* the guest must look at frnum - 1 on interrupt, so inc frnum now */
s->frnum = (s->frnum + 1) & 0x7ff;
s->expire_time += frame_t;
-// fprintf(usblog, "%s s->expire_time:%ld\n", __func__, s->expire_time);
}
/* Complete the previous frame(s) */
if (s->pending_int_mask) {
s->status2 |= s->pending_int_mask;
s->status |= UHCI_STS_USBINT;
-// fprintf(usblog, "%s s->status |= UHCI_STS_USBINT\n", __func__);
-// fprintf(usblog, "%s s->status = %x\n", __func__, s->status);
+ fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr);
uhci_update_irq(s);
}
s->pending_int_mask = 0;
+ fprintf(usblog, "%s:%d pending_int_mask = 0\n", __func__, __LINE__);
-// mod_timer(s->frame_timer, t_now + frame_t);
+ mod_timer(s->frame_timer, frame_t);
+ pthread_mutex_unlock(&sc->sc_mtx);
}
/*
@@ -1744,7 +1732,7 @@
pci_set_cfgdata8(pi, PCI_USBREV, PCI_USB_REV_1_0);
if (!pci_is_legacy(pi)) {
- fprintf(stderr, "hcd-uhci works only in legacy mode\n");
+ fprintf(usblog, "hcd-uhci works only in legacy mode\n");
} else {
pci_lintr_request(pi, 9);
}
More information about the svn-soc-all
mailing list