Missed Service Error event handling

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

 



Hi Sarah,

I'm debugging a Missed Service Error event related these days. It's
cause by some buggy HW behavior, which falsely return a overrun event
following a MSE event, while the ep ring is actually not empty.

Currently xhci driver handles MSE event in the following ways:

1. When encounter a MSE event, set ep->skip flag, update event ring
dequeue pointer and return.

2. When encounter the next event on this ep, the driver will run the
do-while loop, fetch td from ep's td_list to find the td corresponding
to this event. All tds missed are marked as short transfer(-EXDEV).

The do-while loop will end in two ways:
1. If the td pointed by the event trb is found;
2. If the ep ring's td_list is empty.

If the next event is a overrun event, the driver will never find the td,
and it will loop until the td_list is empty.

Unfortunately, the spinlock is dropped when give back a urb in the
do-while loop. During the spinlock released period, there are urbs
submitted and tds added to the td_list. This causes disaster, since the
td_list will never be empty and the loop never ends, and the system
hangs.

There is workaround for this, only run the loop if the event points to a
valid td, so there is guarantee the loop will end at some point.
However, this is not acceptable. If there is only several TDs left
on the ring, and a MSE event occurs and the HW just skip all the TDs.
There is no valid event following the MSE event, only a overrun/underrun
event occurs. In this case driver must process all the tds. This issue
is caused by wrong HW behavior, but I don't want an infinite loop and
system hang in this case. 

Do you have any suggestions on MSE event handling?

Thanks,
Andiry


--
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