Revision 079d0b7f
b/hw/usb-audio.c | ||
---|---|---|
607 | 607 |
|
608 | 608 |
switch (p->pid) { |
609 | 609 |
case USB_TOKEN_OUT: |
610 |
switch (p->devep) {
|
|
610 |
switch (p->ep->nr) {
|
|
611 | 611 |
case 1: |
612 | 612 |
ret = usb_audio_handle_dataout(s, p); |
613 | 613 |
break; |
... | ... | |
624 | 624 |
if (ret == USB_RET_STALL && s->debug) { |
625 | 625 |
fprintf(stderr, "usb-audio: failed data transaction: " |
626 | 626 |
"pid 0x%x ep 0x%x len 0x%zx\n", |
627 |
p->pid, p->devep, p->iov.size);
|
|
627 |
p->pid, p->ep->nr, p->iov.size);
|
|
628 | 628 |
} |
629 | 629 |
return ret; |
630 | 630 |
} |
b/hw/usb-bt.c | ||
---|---|---|
423 | 423 |
|
424 | 424 |
switch (p->pid) { |
425 | 425 |
case USB_TOKEN_IN: |
426 |
switch (p->devep & 0xf) {
|
|
426 |
switch (p->ep->nr) {
|
|
427 | 427 |
case USB_EVT_EP: |
428 | 428 |
ret = usb_bt_fifo_dequeue(&s->evt, p); |
429 | 429 |
break; |
... | ... | |
442 | 442 |
break; |
443 | 443 |
|
444 | 444 |
case USB_TOKEN_OUT: |
445 |
switch (p->devep & 0xf) {
|
|
445 |
switch (p->ep->nr) {
|
|
446 | 446 |
case USB_ACL_EP: |
447 | 447 |
usb_bt_fifo_out_enqueue(s, &s->outacl, s->hci->acl_send, |
448 | 448 |
usb_bt_hci_acl_complete, p); |
b/hw/usb-ccid.c | ||
---|---|---|
995 | 995 |
break; |
996 | 996 |
|
997 | 997 |
case USB_TOKEN_IN: |
998 |
switch (p->devep & 0xf) {
|
|
998 |
switch (p->ep->nr) {
|
|
999 | 999 |
case CCID_BULK_IN_EP: |
1000 | 1000 |
if (!p->iov.size) { |
1001 | 1001 |
ret = USB_RET_NAK; |
b/hw/usb-ehci.c | ||
---|---|---|
1357 | 1357 |
static int ehci_execute(EHCIQueue *q) |
1358 | 1358 |
{ |
1359 | 1359 |
USBDevice *dev; |
1360 |
USBEndpoint *ep; |
|
1360 | 1361 |
int ret; |
1361 | 1362 |
int endp; |
1362 | 1363 |
int devadr; |
... | ... | |
1387 | 1388 |
endp = get_field(q->qh.epchar, QH_EPCHAR_EP); |
1388 | 1389 |
devadr = get_field(q->qh.epchar, QH_EPCHAR_DEVADDR); |
1389 | 1390 |
|
1390 |
ret = USB_RET_NODEV; |
|
1391 |
/* TODO: associating device with ehci port */ |
|
1392 |
dev = ehci_find_device(q->ehci, devadr); |
|
1393 |
ep = usb_ep_get(dev, q->pid, endp); |
|
1391 | 1394 |
|
1392 |
usb_packet_setup(&q->packet, q->pid, devadr, endp);
|
|
1395 |
usb_packet_setup(&q->packet, q->pid, ep);
|
|
1393 | 1396 |
usb_packet_map(&q->packet, &q->sgl); |
1394 | 1397 |
|
1395 |
// TO-DO: associating device with ehci port |
|
1396 |
dev = ehci_find_device(q->ehci, q->packet.devaddr); |
|
1397 | 1398 |
ret = usb_handle_packet(dev, &q->packet); |
1398 | 1399 |
DPRINTF("submit: qh %x next %x qtd %x pid %x len %zd " |
1399 | 1400 |
"(total %d) endp %x ret %d\n", |
... | ... | |
1415 | 1416 |
EHCIitd *itd) |
1416 | 1417 |
{ |
1417 | 1418 |
USBDevice *dev; |
1419 |
USBEndpoint *ep; |
|
1418 | 1420 |
int ret; |
1419 | 1421 |
uint32_t i, len, pid, dir, devaddr, endp; |
1420 | 1422 |
uint32_t pg, off, ptr1, ptr2, max, mult; |
... | ... | |
1454 | 1456 |
|
1455 | 1457 |
pid = dir ? USB_TOKEN_IN : USB_TOKEN_OUT; |
1456 | 1458 |
|
1457 |
usb_packet_setup(&ehci->ipacket, pid, devaddr, endp); |
|
1459 |
dev = ehci_find_device(ehci, devaddr); |
|
1460 |
ep = usb_ep_get(dev, pid, endp); |
|
1461 |
usb_packet_setup(&ehci->ipacket, pid, ep); |
|
1458 | 1462 |
usb_packet_map(&ehci->ipacket, &ehci->isgl); |
1459 | 1463 |
|
1460 |
dev = ehci_find_device(ehci, ehci->ipacket.devaddr); |
|
1461 | 1464 |
ret = usb_handle_packet(dev, &ehci->ipacket); |
1462 | 1465 |
|
1463 | 1466 |
usb_packet_unmap(&ehci->ipacket); |
b/hw/usb-hid.c | ||
---|---|---|
463 | 463 |
|
464 | 464 |
switch (p->pid) { |
465 | 465 |
case USB_TOKEN_IN: |
466 |
if (p->devep == 1) {
|
|
466 |
if (p->ep->nr == 1) {
|
|
467 | 467 |
int64_t curtime = qemu_get_clock_ns(vm_clock); |
468 | 468 |
if (!hid_has_events(hs) && |
469 | 469 |
(!hs->idle || hs->next_idle_clock - curtime > 0)) { |
b/hw/usb-hub.c | ||
---|---|---|
416 | 416 |
|
417 | 417 |
switch(p->pid) { |
418 | 418 |
case USB_TOKEN_IN: |
419 |
if (p->devep == 1) {
|
|
419 |
if (p->ep->nr == 1) {
|
|
420 | 420 |
USBHubPort *port; |
421 | 421 |
unsigned int status; |
422 | 422 |
uint8_t buf[4]; |
b/hw/usb-msd.c | ||
---|---|---|
341 | 341 |
uint32_t tag; |
342 | 342 |
int ret = 0; |
343 | 343 |
struct usb_msd_cbw cbw; |
344 |
uint8_t devep = p->devep;
|
|
344 |
uint8_t devep = p->ep->nr;
|
|
345 | 345 |
|
346 | 346 |
switch (p->pid) { |
347 | 347 |
case USB_TOKEN_OUT: |
b/hw/usb-musb.c | ||
---|---|---|
606 | 606 |
int epnum, int pid, int len, USBCallback cb, int dir) |
607 | 607 |
{ |
608 | 608 |
USBDevice *dev; |
609 |
USBEndpoint *uep; |
|
609 | 610 |
int ret; |
610 | 611 |
int idx = epnum && dir; |
611 | 612 |
int ttype; |
... | ... | |
623 | 624 |
ep->delayed_cb[dir] = cb; |
624 | 625 |
|
625 | 626 |
/* A wild guess on the FADDR semantics... */ |
626 |
usb_packet_setup(&ep->packey[dir].p, pid, ep->faddr[idx], |
|
627 |
ep->type[idx] & 0xf); |
|
627 |
dev = usb_find_device(&s->port, ep->faddr[idx]); |
|
628 |
uep = usb_ep_get(dev, pid, ep->type[idx] & 0xf); |
|
629 |
usb_packet_setup(&ep->packey[dir].p, pid, uep); |
|
628 | 630 |
usb_packet_addbuf(&ep->packey[dir].p, ep->buf[idx], len); |
629 | 631 |
ep->packey[dir].ep = ep; |
630 | 632 |
ep->packey[dir].dir = dir; |
631 | 633 |
|
632 |
dev = usb_find_device(&s->port, ep->packey[dir].p.devaddr); |
|
633 | 634 |
ret = usb_handle_packet(dev, &ep->packey[dir].p); |
634 | 635 |
|
635 | 636 |
if (ret == USB_RET_ASYNC) { |
b/hw/usb-net.c | ||
---|---|---|
1210 | 1210 |
|
1211 | 1211 |
switch(p->pid) { |
1212 | 1212 |
case USB_TOKEN_IN: |
1213 |
switch (p->devep) {
|
|
1213 |
switch (p->ep->nr) {
|
|
1214 | 1214 |
case 1: |
1215 | 1215 |
ret = usb_net_handle_statusin(s, p); |
1216 | 1216 |
break; |
... | ... | |
1225 | 1225 |
break; |
1226 | 1226 |
|
1227 | 1227 |
case USB_TOKEN_OUT: |
1228 |
switch (p->devep) {
|
|
1228 |
switch (p->ep->nr) {
|
|
1229 | 1229 |
case 2: |
1230 | 1230 |
ret = usb_net_handle_dataout(s, p); |
1231 | 1231 |
break; |
... | ... | |
1243 | 1243 |
if (ret == USB_RET_STALL) |
1244 | 1244 |
fprintf(stderr, "usbnet: failed data transaction: " |
1245 | 1245 |
"pid 0x%x ep 0x%x len 0x%zx\n", |
1246 |
p->pid, p->devep, p->iov.size);
|
|
1246 |
p->pid, p->ep->nr, p->iov.size);
|
|
1247 | 1247 |
return ret; |
1248 | 1248 |
} |
1249 | 1249 |
|
b/hw/usb-ohci.c | ||
---|---|---|
657 | 657 |
int ret; |
658 | 658 |
int i; |
659 | 659 |
USBDevice *dev; |
660 |
USBEndpoint *ep; |
|
660 | 661 |
struct ohci_iso_td iso_td; |
661 | 662 |
uint32_t addr; |
662 | 663 |
uint16_t starting_frame; |
... | ... | |
796 | 797 |
if (completion) { |
797 | 798 |
ret = ohci->usb_packet.result; |
798 | 799 |
} else { |
799 |
usb_packet_setup(&ohci->usb_packet, pid,
|
|
800 |
OHCI_BM(ed->flags, ED_FA),
|
|
801 |
OHCI_BM(ed->flags, ED_EN));
|
|
800 |
dev = ohci_find_device(ohci, OHCI_BM(ed->flags, ED_FA));
|
|
801 |
ep = usb_ep_get(dev, pid, OHCI_BM(ed->flags, ED_EN));
|
|
802 |
usb_packet_setup(&ohci->usb_packet, pid, ep);
|
|
802 | 803 |
usb_packet_addbuf(&ohci->usb_packet, ohci->usb_buf, len); |
803 |
dev = ohci_find_device(ohci, ohci->usb_packet.devaddr); |
|
804 | 804 |
ret = usb_handle_packet(dev, &ohci->usb_packet); |
805 | 805 |
if (ret == USB_RET_ASYNC) { |
806 | 806 |
return 1; |
... | ... | |
889 | 889 |
int ret; |
890 | 890 |
int i; |
891 | 891 |
USBDevice *dev; |
892 |
USBEndpoint *ep; |
|
892 | 893 |
struct ohci_td td; |
893 | 894 |
uint32_t addr; |
894 | 895 |
int flag_r; |
... | ... | |
992 | 993 |
#endif |
993 | 994 |
return 1; |
994 | 995 |
} |
995 |
usb_packet_setup(&ohci->usb_packet, pid,
|
|
996 |
OHCI_BM(ed->flags, ED_FA),
|
|
997 |
OHCI_BM(ed->flags, ED_EN));
|
|
996 |
dev = ohci_find_device(ohci, OHCI_BM(ed->flags, ED_FA));
|
|
997 |
ep = usb_ep_get(dev, pid, OHCI_BM(ed->flags, ED_EN));
|
|
998 |
usb_packet_setup(&ohci->usb_packet, pid, ep);
|
|
998 | 999 |
usb_packet_addbuf(&ohci->usb_packet, ohci->usb_buf, pktlen); |
999 |
dev = ohci_find_device(ohci, ohci->usb_packet.devaddr); |
|
1000 | 1000 |
ret = usb_handle_packet(dev, &ohci->usb_packet); |
1001 | 1001 |
#ifdef DEBUG_PACKET |
1002 | 1002 |
DPRINTF("ret=%d\n", ret); |
b/hw/usb-serial.c | ||
---|---|---|
353 | 353 |
{ |
354 | 354 |
USBSerialState *s = (USBSerialState *)dev; |
355 | 355 |
int i, ret = 0; |
356 |
uint8_t devep = p->devep;
|
|
356 |
uint8_t devep = p->ep->nr;
|
|
357 | 357 |
struct iovec *iov; |
358 | 358 |
uint8_t header[2]; |
359 | 359 |
int first_len, len; |
b/hw/usb-uhci.c | ||
---|---|---|
761 | 761 |
int len = 0, max_len; |
762 | 762 |
uint8_t pid, isoc; |
763 | 763 |
uint32_t token; |
764 |
USBDevice *dev; |
|
765 |
USBEndpoint *ep; |
|
764 | 766 |
|
765 | 767 |
/* Is active ? */ |
766 | 768 |
if (!(td->ctrl & TD_CTRL_ACTIVE)) |
... | ... | |
805 | 807 |
max_len = ((td->token >> 21) + 1) & 0x7ff; |
806 | 808 |
pid = td->token & 0xff; |
807 | 809 |
|
808 |
usb_packet_setup(&async->packet, pid, (td->token >> 8) & 0x7f, |
|
809 |
(td->token >> 15) & 0xf); |
|
810 |
dev = uhci_find_device(s, (td->token >> 8) & 0x7f); |
|
811 |
ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf); |
|
812 |
usb_packet_setup(&async->packet, pid, ep); |
|
810 | 813 |
qemu_sglist_add(&async->sgl, td->buffer, max_len); |
811 | 814 |
usb_packet_map(&async->packet, &async->sgl); |
812 | 815 |
|
813 | 816 |
switch(pid) { |
814 | 817 |
case USB_TOKEN_OUT: |
815 | 818 |
case USB_TOKEN_SETUP: |
816 |
len = usb_handle_packet(uhci_find_device(s, async->packet.devaddr), |
|
817 |
&async->packet); |
|
819 |
len = usb_handle_packet(dev, &async->packet); |
|
818 | 820 |
if (len >= 0) |
819 | 821 |
len = max_len; |
820 | 822 |
break; |
821 | 823 |
|
822 | 824 |
case USB_TOKEN_IN: |
823 |
len = usb_handle_packet(uhci_find_device(s, async->packet.devaddr), |
|
824 |
&async->packet); |
|
825 |
len = usb_handle_packet(dev, &async->packet); |
|
825 | 826 |
break; |
826 | 827 |
|
827 | 828 |
default: |
b/hw/usb-wacom.c | ||
---|---|---|
306 | 306 |
|
307 | 307 |
switch (p->pid) { |
308 | 308 |
case USB_TOKEN_IN: |
309 |
if (p->devep == 1) {
|
|
309 |
if (p->ep->nr == 1) {
|
|
310 | 310 |
if (!(s->changed || s->idle)) |
311 | 311 |
return USB_RET_NAK; |
312 | 312 |
s->changed = 0; |
b/hw/usb-xhci.c | ||
---|---|---|
1336 | 1336 |
} |
1337 | 1337 |
#endif |
1338 | 1338 |
|
1339 |
static int xhci_setup_packet(XHCITransfer *xfer, XHCIPort *port, int ep)
|
|
1339 |
static int xhci_setup_packet(XHCITransfer *xfer, XHCIPort *port, USBDevice *dev)
|
|
1340 | 1340 |
{ |
1341 |
usb_packet_setup(&xfer->packet, |
|
1342 |
xfer->in_xfer ? USB_TOKEN_IN : USB_TOKEN_OUT, |
|
1343 |
xfer->xhci->slots[xfer->slotid-1].devaddr, |
|
1344 |
ep & 0x7f); |
|
1341 |
USBEndpoint *ep; |
|
1342 |
int dir; |
|
1343 |
|
|
1344 |
dir = xfer->in_xfer ? USB_TOKEN_IN : USB_TOKEN_OUT; |
|
1345 |
ep = usb_ep_get(dev, dir, xfer->epid >> 1); |
|
1346 |
usb_packet_setup(&xfer->packet, dir, ep); |
|
1345 | 1347 |
usb_packet_addbuf(&xfer->packet, xfer->data, xfer->data_length); |
1346 | 1348 |
DPRINTF("xhci: setup packet pid 0x%x addr %d ep %d\n", |
1347 |
xfer->packet.pid, xfer->packet.devaddr, xfer->packet.devep);
|
|
1349 |
xfer->packet.pid, dev->addr, ep->nr);
|
|
1348 | 1350 |
return 0; |
1349 | 1351 |
} |
1350 | 1352 |
|
... | ... | |
1462 | 1464 |
xfer->in_xfer = bmRequestType & USB_DIR_IN; |
1463 | 1465 |
xfer->iso_xfer = false; |
1464 | 1466 |
|
1465 |
xhci_setup_packet(xfer, port, 0);
|
|
1467 |
xhci_setup_packet(xfer, port, dev);
|
|
1466 | 1468 |
if (!xfer->in_xfer) { |
1467 | 1469 |
xhci_xfer_data(xfer, xfer->data, wLength, 0, 1, 0); |
1468 | 1470 |
} |
... | ... | |
1484 | 1486 |
int ret; |
1485 | 1487 |
|
1486 | 1488 |
DPRINTF("xhci_submit(slotid=%d,epid=%d)\n", xfer->slotid, xfer->epid); |
1487 |
uint8_t ep = xfer->epid>>1; |
|
1488 | 1489 |
|
1489 | 1490 |
xfer->in_xfer = epctx->type>>2; |
1490 |
if (xfer->in_xfer) { |
|
1491 |
ep |= 0x80; |
|
1492 |
} |
|
1493 | 1491 |
|
1494 | 1492 |
if (xfer->data && xfer->data_alloced < xfer->data_length) { |
1495 | 1493 |
xfer->data_alloced = 0; |
... | ... | |
1517 | 1515 |
return -1; |
1518 | 1516 |
} |
1519 | 1517 |
|
1520 |
xhci_setup_packet(xfer, port, ep);
|
|
1518 |
xhci_setup_packet(xfer, port, dev);
|
|
1521 | 1519 |
|
1522 | 1520 |
switch(epctx->type) { |
1523 | 1521 |
case ET_INTR_OUT: |
... | ... | |
1530 | 1528 |
FIXME(); |
1531 | 1529 |
break; |
1532 | 1530 |
default: |
1533 |
fprintf(stderr, "xhci: unknown or unhandled EP type %d (ep %02x)\n", |
|
1534 |
epctx->type, ep); |
|
1531 |
fprintf(stderr, "xhci: unknown or unhandled EP " |
|
1532 |
"(type %d, in %d, ep %02x)\n", |
|
1533 |
epctx->type, xfer->in_xfer, xfer->epid); |
|
1535 | 1534 |
return -1; |
1536 | 1535 |
} |
1537 | 1536 |
|
b/hw/usb.c | ||
---|---|---|
140 | 140 |
int request, value, index; |
141 | 141 |
int ret = 0; |
142 | 142 |
|
143 |
assert(p->devep == 0);
|
|
143 |
assert(p->ep->nr == 0);
|
|
144 | 144 |
|
145 | 145 |
request = (s->setup_buf[0] << 8) | s->setup_buf[1]; |
146 | 146 |
value = (s->setup_buf[3] << 8) | s->setup_buf[2]; |
... | ... | |
186 | 186 |
|
187 | 187 |
static int do_token_out(USBDevice *s, USBPacket *p) |
188 | 188 |
{ |
189 |
assert(p->devep == 0);
|
|
189 |
assert(p->ep->nr == 0);
|
|
190 | 190 |
|
191 | 191 |
switch(s->setup_state) { |
192 | 192 |
case SETUP_STATE_ACK: |
... | ... | |
289 | 289 |
if (dev == NULL) { |
290 | 290 |
return USB_RET_NODEV; |
291 | 291 |
} |
292 |
assert(dev->addr == p->devaddr);
|
|
292 |
assert(dev == p->ep->dev);
|
|
293 | 293 |
assert(dev->state == USB_STATE_DEFAULT); |
294 | 294 |
assert(p->state == USB_PACKET_SETUP); |
295 | 295 |
|
296 |
if (p->devep == 0) {
|
|
296 |
if (p->ep->nr == 0) {
|
|
297 | 297 |
/* control pipe */ |
298 | 298 |
switch (p->pid) { |
299 | 299 |
case USB_TOKEN_SETUP: |
... | ... | |
315 | 315 |
} |
316 | 316 |
|
317 | 317 |
if (ret == USB_RET_ASYNC) { |
318 |
p->ep = usb_ep_get(dev, p->pid, p->devep); |
|
319 | 318 |
p->state = USB_PACKET_ASYNC; |
320 | 319 |
} |
321 | 320 |
return ret; |
... | ... | |
347 | 346 |
qemu_iovec_init(&p->iov, 1); |
348 | 347 |
} |
349 | 348 |
|
350 |
void usb_packet_setup(USBPacket *p, int pid, uint8_t addr, uint8_t ep)
|
|
349 |
void usb_packet_setup(USBPacket *p, int pid, USBEndpoint *ep)
|
|
351 | 350 |
{ |
352 | 351 |
assert(!usb_packet_is_inflight(p)); |
353 | 352 |
p->state = USB_PACKET_SETUP; |
354 | 353 |
p->pid = pid; |
355 |
p->devaddr = addr; |
|
356 |
p->devep = ep; |
|
354 |
p->ep = ep; |
|
357 | 355 |
p->result = 0; |
358 | 356 |
qemu_iovec_reset(&p->iov); |
359 | 357 |
} |
... | ... | |
464 | 462 |
|
465 | 463 |
struct USBEndpoint *usb_ep_get(USBDevice *dev, int pid, int ep) |
466 | 464 |
{ |
467 |
struct USBEndpoint *eps = pid == USB_TOKEN_IN ? dev->ep_in : dev->ep_out; |
|
465 |
struct USBEndpoint *eps; |
|
466 |
|
|
467 |
if (dev == NULL) { |
|
468 |
return NULL; |
|
469 |
} |
|
470 |
eps = (pid == USB_TOKEN_IN) ? dev->ep_in : dev->ep_out; |
|
468 | 471 |
if (ep == 0) { |
469 | 472 |
return &dev->ep_ctl; |
470 | 473 |
} |
b/hw/usb.h | ||
---|---|---|
321 | 321 |
struct USBPacket { |
322 | 322 |
/* Data fields for use by the driver. */ |
323 | 323 |
int pid; |
324 |
uint8_t devaddr; |
|
325 |
uint8_t devep; |
|
326 | 324 |
USBEndpoint *ep; |
327 | 325 |
QEMUIOVector iov; |
328 | 326 |
int result; /* transfer length or USB_RET_* status code */ |
... | ... | |
331 | 329 |
}; |
332 | 330 |
|
333 | 331 |
void usb_packet_init(USBPacket *p); |
334 |
void usb_packet_setup(USBPacket *p, int pid, uint8_t addr, uint8_t ep);
|
|
332 |
void usb_packet_setup(USBPacket *p, int pid, USBEndpoint *ep);
|
|
335 | 333 |
void usb_packet_addbuf(USBPacket *p, void *ptr, size_t len); |
336 | 334 |
int usb_packet_map(USBPacket *p, QEMUSGList *sgl); |
337 | 335 |
void usb_packet_unmap(USBPacket *p); |
b/usb-bsd.c | ||
---|---|---|
214 | 214 |
int ret, fd, mode; |
215 | 215 |
int one = 1, shortpacket = 0, timeout = 50; |
216 | 216 |
sigset_t new_mask, old_mask; |
217 |
uint8_t devep = p->devep;
|
|
217 |
uint8_t devep = p->ep->nr;
|
|
218 | 218 |
|
219 | 219 |
/* protect data transfers from SIGALRM signal */ |
220 | 220 |
sigemptyset(&new_mask); |
b/usb-linux.c | ||
---|---|---|
137 | 137 |
[USB_ENDPOINT_XFER_BULK] = USBDEVFS_URB_TYPE_BULK, |
138 | 138 |
[USB_ENDPOINT_XFER_INT] = USBDEVFS_URB_TYPE_INTERRUPT, |
139 | 139 |
}; |
140 |
uint8_t type = usb_ep_get_type(&s->dev, p->pid, p->devep);
|
|
140 |
uint8_t type = p->ep->type;
|
|
141 | 141 |
assert(type < ARRAY_SIZE(usbfs)); |
142 | 142 |
return usbfs[type]; |
143 | 143 |
} |
... | ... | |
360 | 360 |
break; |
361 | 361 |
|
362 | 362 |
case -EPIPE: |
363 |
set_halt(s, p->pid, p->devep);
|
|
363 |
set_halt(s, p->pid, p->ep->nr);
|
|
364 | 364 |
p->result = USB_RET_STALL; |
365 | 365 |
break; |
366 | 366 |
|
... | ... | |
733 | 733 |
int i, j, ret, max_packet_size, offset, len = 0; |
734 | 734 |
uint8_t *buf; |
735 | 735 |
|
736 |
max_packet_size = usb_ep_get_max_packet_size(&s->dev, p->pid, p->devep);
|
|
736 |
max_packet_size = p->ep->max_packet_size;
|
|
737 | 737 |
if (max_packet_size == 0) |
738 | 738 |
return USB_RET_NAK; |
739 | 739 |
|
740 |
aurb = get_iso_urb(s, p->pid, p->devep);
|
|
740 |
aurb = get_iso_urb(s, p->pid, p->ep->nr);
|
|
741 | 741 |
if (!aurb) { |
742 |
aurb = usb_host_alloc_iso(s, p->pid, p->devep);
|
|
742 |
aurb = usb_host_alloc_iso(s, p->pid, p->ep->nr);
|
|
743 | 743 |
} |
744 | 744 |
|
745 |
i = get_iso_urb_idx(s, p->pid, p->devep);
|
|
745 |
i = get_iso_urb_idx(s, p->pid, p->ep->nr);
|
|
746 | 746 |
j = aurb[i].iso_frame_idx; |
747 | 747 |
if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) { |
748 | 748 |
if (in) { |
... | ... | |
769 | 769 |
} |
770 | 770 |
} else { |
771 | 771 |
len = p->iov.size; |
772 |
offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->pid, p->devep);
|
|
772 |
offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->pid, p->ep->nr);
|
|
773 | 773 |
|
774 | 774 |
/* Check the frame fits */ |
775 | 775 |
if (len > max_packet_size) { |
... | ... | |
781 | 781 |
usb_packet_copy(p, aurb[i].urb.buffer + offset, len); |
782 | 782 |
aurb[i].urb.iso_frame_desc[j].length = len; |
783 | 783 |
offset += len; |
784 |
set_iso_buffer_used(s, p->pid, p->devep, offset);
|
|
784 |
set_iso_buffer_used(s, p->pid, p->ep->nr, offset);
|
|
785 | 785 |
|
786 | 786 |
/* Start the stream once we have buffered enough data */ |
787 |
if (!is_iso_started(s, p->pid, p->devep) && i == 1 && j == 8) {
|
|
788 |
set_iso_started(s, p->pid, p->devep);
|
|
787 |
if (!is_iso_started(s, p->pid, p->ep->nr) && i == 1 && j == 8) {
|
|
788 |
set_iso_started(s, p->pid, p->ep->nr);
|
|
789 | 789 |
} |
790 | 790 |
} |
791 | 791 |
aurb[i].iso_frame_idx++; |
792 | 792 |
if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) { |
793 | 793 |
i = (i + 1) % s->iso_urb_count; |
794 |
set_iso_urb_idx(s, p->pid, p->devep, i);
|
|
794 |
set_iso_urb_idx(s, p->pid, p->ep->nr, i);
|
|
795 | 795 |
} |
796 | 796 |
} else { |
797 | 797 |
if (in) { |
798 |
set_iso_started(s, p->pid, p->devep);
|
|
798 |
set_iso_started(s, p->pid, p->ep->nr);
|
|
799 | 799 |
} else { |
800 | 800 |
DPRINTF("hubs: iso out error no free buffer, dropping packet\n"); |
801 | 801 |
} |
802 | 802 |
} |
803 | 803 |
|
804 |
if (is_iso_started(s, p->pid, p->devep)) {
|
|
804 |
if (is_iso_started(s, p->pid, p->ep->nr)) {
|
|
805 | 805 |
/* (Re)-submit all fully consumed / filled urbs */ |
806 | 806 |
for (i = 0; i < s->iso_urb_count; i++) { |
807 | 807 |
if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) { |
... | ... | |
821 | 821 |
break; |
822 | 822 |
} |
823 | 823 |
aurb[i].iso_frame_idx = -1; |
824 |
change_iso_inflight(s, p->pid, p->devep, 1);
|
|
824 |
change_iso_inflight(s, p->pid, p->ep->nr, 1);
|
|
825 | 825 |
} |
826 | 826 |
} |
827 | 827 |
} |
... | ... | |
840 | 840 |
|
841 | 841 |
trace_usb_host_req_data(s->bus_num, s->addr, |
842 | 842 |
p->pid == USB_TOKEN_IN, |
843 |
p->devep, p->iov.size);
|
|
843 |
p->ep->nr, p->iov.size);
|
|
844 | 844 |
|
845 |
if (!is_valid(s, p->pid, p->devep)) {
|
|
845 |
if (!is_valid(s, p->pid, p->ep->nr)) {
|
|
846 | 846 |
trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_NAK); |
847 | 847 |
return USB_RET_NAK; |
848 | 848 |
} |
849 | 849 |
|
850 | 850 |
if (p->pid == USB_TOKEN_IN) { |
851 |
ep = p->devep | 0x80;
|
|
851 |
ep = p->ep->nr | 0x80;
|
|
852 | 852 |
} else { |
853 |
ep = p->devep;
|
|
853 |
ep = p->ep->nr;
|
|
854 | 854 |
} |
855 | 855 |
|
856 |
if (is_halted(s, p->pid, p->devep)) {
|
|
856 |
if (is_halted(s, p->pid, p->ep->nr)) {
|
|
857 | 857 |
unsigned int arg = ep; |
858 | 858 |
ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &arg); |
859 | 859 |
if (ret < 0) { |
... | ... | |
861 | 861 |
trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_NAK); |
862 | 862 |
return USB_RET_NAK; |
863 | 863 |
} |
864 |
clear_halt(s, p->pid, p->devep);
|
|
864 |
clear_halt(s, p->pid, p->ep->nr);
|
|
865 | 865 |
} |
866 | 866 |
|
867 |
if (is_isoc(s, p->pid, p->devep)) {
|
|
867 |
if (is_isoc(s, p->pid, p->ep->nr)) {
|
|
868 | 868 |
return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN); |
869 | 869 |
} |
870 | 870 |
|
... | ... | |
1057 | 1057 |
urb = &aurb->urb; |
1058 | 1058 |
|
1059 | 1059 |
urb->type = USBDEVFS_URB_TYPE_CONTROL; |
1060 |
urb->endpoint = p->devep;
|
|
1060 |
urb->endpoint = p->ep->nr;
|
|
1061 | 1061 |
|
1062 | 1062 |
urb->buffer = &dev->setup_buf; |
1063 | 1063 |
urb->buffer_length = length + 8; |
b/usb-redir.c | ||
---|---|---|
610 | 610 |
USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); |
611 | 611 |
uint8_t ep; |
612 | 612 |
|
613 |
ep = p->devep;
|
|
613 |
ep = p->ep->nr;
|
|
614 | 614 |
if (p->pid == USB_TOKEN_IN) { |
615 | 615 |
ep |= USB_DIR_IN; |
616 | 616 |
} |
Also available in: Unified diff