Re: some question about EXDEV status in period schedule

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



SORRY for send the wrong mail :)


2013/11/23 yoma sophian <sophian.yoma@xxxxxxxxx>:
> 2013/11/19 Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>:
>> Please use Reply-To-All so that your message gets sent to the mailing
>> list as well as to me.
>>
>> On Sat, 16 Nov 2013, yoma sophian wrote:
>>
>>> hi alan:
>>>
>>> > There are other examples in the log like this one.  To fix the problem
>>> > you could put more packets in each URB, or use more URBs, or eliminate
>>> > the large interrupt latency.
>>> Thanks for your comment, it is really thoughtful explanation.
>>>
>>> >
>>> >> My questions are:
>>> >> 1. in usb driver,
>>> >>       ehci-sched.c --> itd_complete ->
>>> >>
>>> >>    if (unlikely (t & ISO_ERRS)) {
>>> >>     ......................
>>> >>    } else if (likely ((t & EHCI_ISOC_ACTIVE) == 0)) {
>>> >>     ........................
>>> >>    } else {
>>> >>      /* URB was too late */
>>> >>       urb->error_count++;
>>> >>     }
>>> >> EXDEV seems come from above comment  " /*URB was too late */"
>>> >
>>> > Actually, I expect it comes from the "t & ISO_ERRS" test.
>>>
>>> if it comes from "t & ISO_ERRS", after reading the case "t &
>>> ISO_ERRS", I found desc->status will be update to
>>> one fo -ENOSR , ECOMM, -EOVERFLW and -EPROTO.
>>
>> You're right; it can't be that case after all.  It must be the "URB was
>> too late case".
>>
>> However, that case should never occur when an URB is submitted with
>> URB_ISO_ASAP -- unless something is wrong with the EHCI hardware.
>>
>>> >> if my conclusion is correct, why we said "urb was too late"?
>>> >> Does it mean urb too late to send or too late to service?
>>> >
>>> > The comment means "too late to service".
>>>
>>> Does that mean
>>> 1. iso complete irq happen but
>>> 2. scan_isoc is too late to be called, such as delaying 30 ms, etc.
>>>
>>> if so, the EHCI_ISOC_ACTIVE will be 0 and should not run into this case.
>>
>> No, it means the URB was submitted too late for the hardware to carry
>> out the transfers at their scheduled times.
>>
>>> >> 2. In my case, the urbs are always submitted with URB_ISO_ASAP.
>>> >
>>> > URBs with ISO_ASAP are never too late to service.  That's part of the
>>> > reason I suspect the device stopped sending data.
>>
>> But that was wrong.  So it looks like the EHCI hardware is
>> malfunctioning.
>>
>>> >> Except itd_complete is there any place will let iso EXDEV happen?
>>> >
>>> > Yes, depending on which version of the kernel you are using,
>>> > iso_stream_schedule can also have that effect.
>>> My kernel version is 3.8.13
>>>
>>> >
>>> > However, the problem doesn't lie in the ehci-hcd driver.  The problem
>>> > lies in the fact that you aren't submitting URBs fast enough to keep
>>> > the isochronous pipeline filled.
>>> I got it. :)
>>>
>>>
>>> BTW, I have one question.
>>> 1. for iso in case:
>>> even iso in is too late to send, ehci driver still put those delay itd
>>> to the period scheduling list.
>>
>> This never happens with URB_ISO_ASAP.  Instead, if an URB is too late
>> to be sent, the driver reschedules it for a later time.
>>
>>> That mean in token will firing on the bus.
>>
>> No.  During the interval between when the URB _should_ have been
>> scheduled and when it actually _was_ scheduled, no IN tokens will be
>> sent.
>>
>> However, in your case it looks like the EHCI controller went crazy and
>> didn't send any IN tokens even when it should have.
>>
>> Here's the first place in your log where a problem occurs:
>>
>> d8a80400 78915228 C Zi:1:003:2 0:8:111:0 10 0:0:100 0:512:100
>> d8a80400 78923303 S Zi:1:003:2 -115:8:0 10 -18:0:512 -18:512:512
>> d8a80800 78925390 C Zi:1:003:2 0:8:191:0 10 0:0:100 0:512:100
>> d8a80800 78927016 S Zi:1:003:2 -115:8:0 10 -18:0:512 -18:512:512
>> d8a80400 78941545 C Zi:1:003:2 0:8:319:10 10 -18:0:0 -18:512:0
>>
>> In the first two lines, URB d8a80400 completes at 78.915 but doesn't
>> get resubmitted until 78.923, which is 8 ms later.  In the meantime,
>> URB d8a80800 was running, and it completes at 78.925.
>>
>> Because there is only 2 ms remaining in the pipeline when d8a80400 is
>> resubmitted, the URB_ISO_ASAP flag causes it to be delayed.  Normally
>> it would have been scheduled to start in uframe 271, but instead it was
>> scheduled to start in uframe 319, which was 6 ms later (I don't
>> understand why this delay was so large; it shouldn't be more than 2
>> ms).  This means that 6 schedule slots were left empty -- no IN tokens.
>>
>> On the last line, you can see where d8a80400 completed after the delay.
>> This line is full of -18 errors, which means the hardware did not carry
>> out the transfers even though they were added to the schedule well in
>> advance.  In fact, the hardware did not carry out any more transfers
>> until almost 3 seconds later!
>>
>>> if device response data, ehci driver will go into below a) or b)
>>
>> No.  If the host sends an IN token then the driver will go into case a
>> or case b.  If the host receives valid data from the device, the driver
>> will go into case b.
>>
>>> if device not response, scan_iso will be called by periodically
>>> ehci_work timer and clean it.
>>
>> If the device does not send data, the driver will go into case a.  The
>> only reason for the periodic timer to fire is if the hardware isn't
>> generating interrupts properly.  If that happens, the driver will go
>> into case c.
>>
>>> ehci driver will go in c) and -EXDEV will keep not modify.
>>>
>>> 1. for iso out case:
>>> even iso out is too late to send, ehci driver still put those delay
>>> itd to the period scheduling list.
>>> That mean out token and out data will firing on the bus.
>>
>> No, OUT works the same way as IN, except that the device never sends
>> anything.
>>
>>> if device response data, ehci driver will go into below a) or b)
>>
>> The device never sends anything.  If the hardware is working correctly,
>> the driver will always go into case b.
>>
>>> since there is no ACK in iso, ehci driver will never go in c)
>>
>> The driver will go into case c if the hardware isn't working right.
>>
>>>    if (unlikely (t & ISO_ERRS)) {
>>>      ...................... (case a)
>>>     } else if (likely ((t & EHCI_ISOC_ACTIVE) == 0)) {
>>>      ........................(case b)
>>>     } else {
>>>       ........................(case c)
>>>       /* URB was too late */
>>>        urb->error_count++;
>>>      }
>>>
>>> Appreciate your kind help,
>>
>> Have you tried running the same test using a regular PC, rather than an
>> embedded system?
>>
>> Alan Stern
>>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux