diff options
Diffstat (limited to 'drivers/usb/host/ehci-q.c')
| -rw-r--r-- | drivers/usb/host/ehci-q.c | 104 |
1 files changed, 73 insertions, 31 deletions
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 2e49de820b14..5ae689139dd0 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -242,7 +242,8 @@ __acquires(ehci->lock) | |||
| 242 | if (unlikely(urb->unlinked)) { | 242 | if (unlikely(urb->unlinked)) { |
| 243 | COUNT(ehci->stats.unlink); | 243 | COUNT(ehci->stats.unlink); |
| 244 | } else { | 244 | } else { |
| 245 | if (likely(status == -EINPROGRESS)) | 245 | /* report non-error and short read status as zero */ |
| 246 | if (status == -EINPROGRESS || status == -EREMOTEIO) | ||
| 246 | status = 0; | 247 | status = 0; |
| 247 | COUNT(ehci->stats.complete); | 248 | COUNT(ehci->stats.complete); |
| 248 | } | 249 | } |
| @@ -250,7 +251,7 @@ __acquires(ehci->lock) | |||
| 250 | #ifdef EHCI_URB_TRACE | 251 | #ifdef EHCI_URB_TRACE |
| 251 | ehci_dbg (ehci, | 252 | ehci_dbg (ehci, |
| 252 | "%s %s urb %p ep%d%s status %d len %d/%d\n", | 253 | "%s %s urb %p ep%d%s status %d len %d/%d\n", |
| 253 | __FUNCTION__, urb->dev->devpath, urb, | 254 | __func__, urb->dev->devpath, urb, |
| 254 | usb_pipeendpoint (urb->pipe), | 255 | usb_pipeendpoint (urb->pipe), |
| 255 | usb_pipein (urb->pipe) ? "in" : "out", | 256 | usb_pipein (urb->pipe) ? "in" : "out", |
| 256 | status, | 257 | status, |
| @@ -283,7 +284,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 283 | int last_status = -EINPROGRESS; | 284 | int last_status = -EINPROGRESS; |
| 284 | int stopped; | 285 | int stopped; |
| 285 | unsigned count = 0; | 286 | unsigned count = 0; |
| 286 | int do_status = 0; | ||
| 287 | u8 state; | 287 | u8 state; |
| 288 | u32 halt = HALT_BIT(ehci); | 288 | u32 halt = HALT_BIT(ehci); |
| 289 | 289 | ||
| @@ -309,7 +309,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 309 | struct ehci_qtd *qtd; | 309 | struct ehci_qtd *qtd; |
| 310 | struct urb *urb; | 310 | struct urb *urb; |
| 311 | u32 token = 0; | 311 | u32 token = 0; |
| 312 | int qtd_status; | ||
| 313 | 312 | ||
| 314 | qtd = list_entry (entry, struct ehci_qtd, qtd_list); | 313 | qtd = list_entry (entry, struct ehci_qtd, qtd_list); |
| 315 | urb = qtd->urb; | 314 | urb = qtd->urb; |
| @@ -336,11 +335,20 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 336 | /* always clean up qtds the hc de-activated */ | 335 | /* always clean up qtds the hc de-activated */ |
| 337 | if ((token & QTD_STS_ACTIVE) == 0) { | 336 | if ((token & QTD_STS_ACTIVE) == 0) { |
| 338 | 337 | ||
| 338 | /* on STALL, error, and short reads this urb must | ||
| 339 | * complete and all its qtds must be recycled. | ||
| 340 | */ | ||
| 339 | if ((token & QTD_STS_HALT) != 0) { | 341 | if ((token & QTD_STS_HALT) != 0) { |
| 340 | stopped = 1; | 342 | stopped = 1; |
| 341 | 343 | ||
| 342 | /* magic dummy for some short reads; qh won't advance. | 344 | /* magic dummy for some short reads; qh won't advance. |
| 343 | * that silicon quirk can kick in with this dummy too. | 345 | * that silicon quirk can kick in with this dummy too. |
| 346 | * | ||
| 347 | * other short reads won't stop the queue, including | ||
| 348 | * control transfers (status stage handles that) or | ||
| 349 | * most other single-qtd reads ... the queue stops if | ||
| 350 | * URB_SHORT_NOT_OK was set so the driver submitting | ||
| 351 | * the urbs could clean it up. | ||
| 344 | */ | 352 | */ |
| 345 | } else if (IS_SHORT_READ (token) | 353 | } else if (IS_SHORT_READ (token) |
| 346 | && !(qtd->hw_alt_next | 354 | && !(qtd->hw_alt_next |
| @@ -354,28 +362,21 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 354 | && HC_IS_RUNNING (ehci_to_hcd(ehci)->state))) { | 362 | && HC_IS_RUNNING (ehci_to_hcd(ehci)->state))) { |
| 355 | break; | 363 | break; |
| 356 | 364 | ||
| 365 | /* scan the whole queue for unlinks whenever it stops */ | ||
| 357 | } else { | 366 | } else { |
| 358 | stopped = 1; | 367 | stopped = 1; |
| 359 | 368 | ||
| 360 | if (unlikely (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state))) | 369 | /* cancel everything if we halt, suspend, etc */ |
| 370 | if (!HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) | ||
| 361 | last_status = -ESHUTDOWN; | 371 | last_status = -ESHUTDOWN; |
| 362 | 372 | ||
| 363 | /* ignore active urbs unless some previous qtd | 373 | /* this qtd is active; skip it unless a previous qtd |
| 364 | * for the urb faulted (including short read) or | 374 | * for its urb faulted, or its urb was canceled. |
| 365 | * its urb was canceled. we may patch qh or qtds. | ||
| 366 | */ | 375 | */ |
| 367 | if (likely(last_status == -EINPROGRESS && | 376 | else if (last_status == -EINPROGRESS && !urb->unlinked) |
| 368 | !urb->unlinked)) | ||
| 369 | continue; | ||
| 370 | |||
| 371 | /* issue status after short control reads */ | ||
| 372 | if (unlikely (do_status != 0) | ||
| 373 | && QTD_PID (token) == 0 /* OUT */) { | ||
| 374 | do_status = 0; | ||
| 375 | continue; | 377 | continue; |
| 376 | } | ||
| 377 | 378 | ||
| 378 | /* token in overlay may be most current */ | 379 | /* qh unlinked; token in overlay may be most current */ |
| 379 | if (state == QH_STATE_IDLE | 380 | if (state == QH_STATE_IDLE |
| 380 | && cpu_to_hc32(ehci, qtd->qtd_dma) | 381 | && cpu_to_hc32(ehci, qtd->qtd_dma) |
| 381 | == qh->hw_current) | 382 | == qh->hw_current) |
| @@ -392,21 +393,32 @@ halt: | |||
| 392 | } | 393 | } |
| 393 | } | 394 | } |
| 394 | 395 | ||
| 395 | /* remove it from the queue */ | 396 | /* unless we already know the urb's status, collect qtd status |
| 396 | qtd_status = qtd_copy_status(ehci, urb, qtd->length, token); | 397 | * and update count of bytes transferred. in common short read |
| 397 | if (unlikely(qtd_status == -EREMOTEIO)) { | 398 | * cases with only one data qtd (including control transfers), |
| 398 | do_status = (!urb->unlinked && | 399 | * queue processing won't halt. but with two or more qtds (for |
| 399 | usb_pipecontrol(urb->pipe)); | 400 | * example, with a 32 KB transfer), when the first qtd gets a |
| 400 | qtd_status = 0; | 401 | * short read the second must be removed by hand. |
| 402 | */ | ||
| 403 | if (last_status == -EINPROGRESS) { | ||
| 404 | last_status = qtd_copy_status(ehci, urb, | ||
| 405 | qtd->length, token); | ||
| 406 | if (last_status == -EREMOTEIO | ||
| 407 | && (qtd->hw_alt_next | ||
| 408 | & EHCI_LIST_END(ehci))) | ||
| 409 | last_status = -EINPROGRESS; | ||
| 401 | } | 410 | } |
| 402 | if (likely(last_status == -EINPROGRESS)) | ||
| 403 | last_status = qtd_status; | ||
| 404 | 411 | ||
| 412 | /* if we're removing something not at the queue head, | ||
| 413 | * patch the hardware queue pointer. | ||
| 414 | */ | ||
| 405 | if (stopped && qtd->qtd_list.prev != &qh->qtd_list) { | 415 | if (stopped && qtd->qtd_list.prev != &qh->qtd_list) { |
| 406 | last = list_entry (qtd->qtd_list.prev, | 416 | last = list_entry (qtd->qtd_list.prev, |
| 407 | struct ehci_qtd, qtd_list); | 417 | struct ehci_qtd, qtd_list); |
| 408 | last->hw_next = qtd->hw_next; | 418 | last->hw_next = qtd->hw_next; |
| 409 | } | 419 | } |
| 420 | |||
| 421 | /* remove qtd; it's recycled after possible urb completion */ | ||
| 410 | list_del (&qtd->qtd_list); | 422 | list_del (&qtd->qtd_list); |
| 411 | last = qtd; | 423 | last = qtd; |
| 412 | } | 424 | } |
| @@ -431,7 +443,15 @@ halt: | |||
| 431 | qh_refresh(ehci, qh); | 443 | qh_refresh(ehci, qh); |
| 432 | break; | 444 | break; |
| 433 | case QH_STATE_LINKED: | 445 | case QH_STATE_LINKED: |
| 434 | /* should be rare for periodic transfers, | 446 | /* We won't refresh a QH that's linked (after the HC |
| 447 | * stopped the queue). That avoids a race: | ||
| 448 | * - HC reads first part of QH; | ||
| 449 | * - CPU updates that first part and the token; | ||
| 450 | * - HC reads rest of that QH, including token | ||
| 451 | * Result: HC gets an inconsistent image, and then | ||
| 452 | * DMAs to/from the wrong memory (corrupting it). | ||
| 453 | * | ||
| 454 | * That should be rare for interrupt transfers, | ||
| 435 | * except maybe high bandwidth ... | 455 | * except maybe high bandwidth ... |
| 436 | */ | 456 | */ |
| 437 | if ((cpu_to_hc32(ehci, QH_SMASK) | 457 | if ((cpu_to_hc32(ehci, QH_SMASK) |
| @@ -549,6 +569,12 @@ qh_urb_transaction ( | |||
| 549 | this_qtd_len = qtd_fill(ehci, qtd, buf, len, token, maxpacket); | 569 | this_qtd_len = qtd_fill(ehci, qtd, buf, len, token, maxpacket); |
| 550 | len -= this_qtd_len; | 570 | len -= this_qtd_len; |
| 551 | buf += this_qtd_len; | 571 | buf += this_qtd_len; |
| 572 | |||
| 573 | /* | ||
| 574 | * short reads advance to a "magic" dummy instead of the next | ||
| 575 | * qtd ... that forces the queue to stop, for manual cleanup. | ||
| 576 | * (this will usually be overridden later.) | ||
| 577 | */ | ||
| 552 | if (is_input) | 578 | if (is_input) |
| 553 | qtd->hw_alt_next = ehci->async->hw_alt_next; | 579 | qtd->hw_alt_next = ehci->async->hw_alt_next; |
| 554 | 580 | ||
| @@ -568,8 +594,10 @@ qh_urb_transaction ( | |||
| 568 | list_add_tail (&qtd->qtd_list, head); | 594 | list_add_tail (&qtd->qtd_list, head); |
| 569 | } | 595 | } |
| 570 | 596 | ||
| 571 | /* unless the bulk/interrupt caller wants a chance to clean | 597 | /* |
| 572 | * up after short reads, hc should advance qh past this urb | 598 | * unless the caller requires manual cleanup after short reads, |
| 599 | * have the alt_next mechanism keep the queue running after the | ||
| 600 | * last data qtd (the only one, for control and most other cases). | ||
| 573 | */ | 601 | */ |
| 574 | if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0 | 602 | if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0 |
| 575 | || usb_pipecontrol (urb->pipe))) | 603 | || usb_pipecontrol (urb->pipe))) |
| @@ -657,6 +685,14 @@ qh_make ( | |||
| 657 | type = usb_pipetype (urb->pipe); | 685 | type = usb_pipetype (urb->pipe); |
| 658 | maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input); | 686 | maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input); |
| 659 | 687 | ||
| 688 | /* 1024 byte maxpacket is a hardware ceiling. High bandwidth | ||
| 689 | * acts like up to 3KB, but is built from smaller packets. | ||
| 690 | */ | ||
| 691 | if (max_packet(maxp) > 1024) { | ||
| 692 | ehci_dbg(ehci, "bogus qh maxpacket %d\n", max_packet(maxp)); | ||
| 693 | goto done; | ||
| 694 | } | ||
| 695 | |||
| 660 | /* Compute interrupt scheduling parameters just once, and save. | 696 | /* Compute interrupt scheduling parameters just once, and save. |
| 661 | * - allowing for high bandwidth, how many nsec/uframe are used? | 697 | * - allowing for high bandwidth, how many nsec/uframe are used? |
| 662 | * - split transactions need a second CSPLIT uframe; same question | 698 | * - split transactions need a second CSPLIT uframe; same question |
| @@ -757,7 +793,13 @@ qh_make ( | |||
| 757 | info2 |= (EHCI_TUNE_MULT_HS << 30); | 793 | info2 |= (EHCI_TUNE_MULT_HS << 30); |
| 758 | } else if (type == PIPE_BULK) { | 794 | } else if (type == PIPE_BULK) { |
| 759 | info1 |= (EHCI_TUNE_RL_HS << 28); | 795 | info1 |= (EHCI_TUNE_RL_HS << 28); |
| 760 | info1 |= 512 << 16; /* usb2 fixed maxpacket */ | 796 | /* The USB spec says that high speed bulk endpoints |
| 797 | * always use 512 byte maxpacket. But some device | ||
| 798 | * vendors decided to ignore that, and MSFT is happy | ||
| 799 | * to help them do so. So now people expect to use | ||
| 800 | * such nonconformant devices with Linux too; sigh. | ||
| 801 | */ | ||
| 802 | info1 |= max_packet(maxp) << 16; | ||
| 761 | info2 |= (EHCI_TUNE_MULT_HS << 30); | 803 | info2 |= (EHCI_TUNE_MULT_HS << 30); |
| 762 | } else { /* PIPE_INTERRUPT */ | 804 | } else { /* PIPE_INTERRUPT */ |
| 763 | info1 |= max_packet (maxp) << 16; | 805 | info1 |= max_packet (maxp) << 16; |
| @@ -932,7 +974,7 @@ submit_async ( | |||
| 932 | #ifdef EHCI_URB_TRACE | 974 | #ifdef EHCI_URB_TRACE |
| 933 | ehci_dbg (ehci, | 975 | ehci_dbg (ehci, |
| 934 | "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n", | 976 | "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n", |
| 935 | __FUNCTION__, urb->dev->devpath, urb, | 977 | __func__, urb->dev->devpath, urb, |
| 936 | epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out", | 978 | epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out", |
| 937 | urb->transfer_buffer_length, | 979 | urb->transfer_buffer_length, |
| 938 | qtd, urb->ep->hcpriv); | 980 | qtd, urb->ep->hcpriv); |
