so habe jetzt nochmal ein wenig getestet.
kKötzchen kommen bei mir _immer_ sobal die Meldung auftaucht. (mit dem "laufenden" 2.6.33 nur ganz selten, dann ist das Bild meist OK, oder hat mal ein ganz kleines Klötzchen unten)
mit plain 2.6.32 kriege ich gar kein Bild mehr hin (vdr startet, macht nur noch Fehler auf dem usb bus, zeigt aber kein Bild, über streamdev kommen noch Daten, aber nichts mehr was zu erkennen ist.) gleiches gilt für 2.6.38_rc3
hab nun noch den 2.6.37 getestet. Problem bleibt, Klötzer und Fehlermeldung. Den patch von Seite 1 habe ich auch probiert (USB fix für 2.6.38, aber ohne Veränderung).
NUn dachet ich schliesse ich wenigstens eine TT 3650 und eine Terratec Cinery USB DVB-S2 HD an ( die super läuft an meinem anderen Linux Rechner mit 2.6.37). Gleicher Treiberstand hier auf dem Asrock und es macht nur
[ 302.406880] dw2102: i2c transfer failed.
[ 302.406886] b0 00 00 00 00 00
[ 304.406835] dvb-usb: bulk message failed: -110 (6/0)
[ 304.406843] dw2102: i2c transfer failed.
[ 304.406849] b0 1d 00 00 00 00
[ 306.406792] dvb-usb: bulk message failed: -110 (6/0)
[ 306.406800] dw2102: i2c transfer failed.
[ 306.406806] b0 1d 1d 00 00 00
[ 308.406754] dvb-usb: bulk message failed: -110 (6/0)
[ 308.406762] dw2102: i2c transfer failed.
Da die gleich Zusammenstellung auf einem anderen Rechner geht und mit 2.6.33 das Problem auch noch nicht auftrat, schliesse ich daraus, das irgendwas mit dem USB für den ION Chipsatz seit 2.6.34 "im Eimer" ist.
Kann das jemand bestätigen, ob es nut ION's trifft oder auch andere Chipsätze ?
Update:
ich habe nochmal gesucht as der unterschied zwischen dem 2.6.33 und 34 ist und wie das zu den Änderungen zum Vanilla 32 mit dem 32-r25 unter gentoo passt. dabei ist in beiden Fällen folgender Patch mit eingeflossen
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index 1e391e6..805ec63 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -510,6 +510,8 @@ static int disable_periodic (struct ehci_hcd *ehci)
ehci_writel(ehci, cmd, &ehci->regs->command);
/* posted write ... */
+ free_cached_lists(ehci);
+
ehci->next_uframe = -1;
return 0;
}
@@ -1121,8 +1123,8 @@ iso_stream_find (struct ehci_hcd *ehci, struct urb *urb)
urb->interval);
}
- /* if dev->ep [epnum] is a QH, info1.maxpacket is nonzero */
- } else if (unlikely (stream->hw_info1 != 0)) {
+ /* if dev->ep [epnum] is a QH, hw is set */
+ } else if (unlikely (stream->hw != NULL)) {
ehci_dbg (ehci, "dev %s ep%d%s, not iso??\n",
urb->dev->devpath, epnum,
usb_pipein(urb->pipe) ? "in" : "out");
@@ -1563,13 +1565,27 @@ itd_patch(
static inline void
itd_link (struct ehci_hcd *ehci, unsigned frame, struct ehci_itd *itd)
{
- /* always prepend ITD/SITD ... only QH tree is order-sensitive */
- itd->itd_next = ehci->pshadow [frame];
- itd->hw_next = ehci->periodic [frame];
- ehci->pshadow [frame].itd = itd;
+ union ehci_shadow *prev = &ehci->pshadow[frame];
+ __hc32 *hw_p = &ehci->periodic[frame];
+ union ehci_shadow here = *prev;
+ __hc32 type = 0;
+
+ /* skip any iso nodes which might belong to previous microframes */
+ while (here.ptr) {
+ type = Q_NEXT_TYPE(ehci, *hw_p);
+ if (type == cpu_to_hc32(ehci, Q_TYPE_QH))
+ break;
+ prev = periodic_next_shadow(ehci, prev, type);
+ hw_p = shadow_next_periodic(ehci, &here, type);
+ here = *prev;
+ }
+
+ itd->itd_next = here;
+ itd->hw_next = *hw_p;
+ prev->itd = itd;
itd->frame = frame;
wmb ();
- ehci->periodic[frame] = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD);
+ *hw_p = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD);
}
/* fit urb's itds into the selected schedule slot; activate as needed */
@@ -2123,13 +2139,27 @@ sitd_complete (
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
}
iso_stream_put (ehci, stream);
- /* OK to recycle this SITD now that its completion callback ran. */
+
done:
sitd->urb = NULL;
- sitd->stream = NULL;
- list_move(&sitd->sitd_list, &stream->free_list);
- iso_stream_put(ehci, stream);
-
+ if (ehci->clock_frame != sitd->frame) {
+ /* OK to recycle this SITD now. */
+ sitd->stream = NULL;
+ list_move(&sitd->sitd_list, &stream->free_list);
+ iso_stream_put(ehci, stream);
+ } else {
+ /* HW might remember this SITD, so we can't recycle it yet.
+ * Move it to a safe place until a new frame starts.
+ */
+ list_move(&sitd->sitd_list, &ehci->cached_sitd_list);
+ if (stream->refcount == 2) {
+ /* If iso_stream_put() were called here, stream
+ * would be freed. Instead, just prevent reuse.
+ */
+ stream->ep->hcpriv = NULL;
+ stream->ep = NULL;
+ }
+ }
return retval;
}
@@ -2195,9 +2225,10 @@ done:
/*-------------------------------------------------------------------------*/
-static void free_cached_itd_list(struct ehci_hcd *ehci)
+static void free_cached_lists(struct ehci_hcd *ehci)
{
struct ehci_itd *itd, *n;
+ struct ehci_sitd *sitd, *sn;
list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) {
struct ehci_iso_stream *stream = itd->stream;
@@ -2205,6 +2236,13 @@ static void free_cached_itd_list(struct ehci_hcd *ehci)
list_move(&itd->itd_list, &stream->free_list);
iso_stream_put(ehci, stream);
}
+
+ list_for_each_entry_safe(sitd, sn, &ehci->cached_sitd_list, sitd_list) {
+ struct ehci_iso_stream *stream = sitd->stream;
+ sitd->stream = NULL;
+ list_move(&sitd->sitd_list, &stream->free_list);
+ iso_stream_put(ehci, stream);
+ }
}
/*-------------------------------------------------------------------------*/
@@ -2231,7 +2269,7 @@ scan_periodic (struct ehci_hcd *ehci)
clock_frame = -1;
}
if (ehci->clock_frame != clock_frame) {
- free_cached_itd_list(ehci);
+ free_cached_lists(ehci);
ehci->clock_frame = clock_frame;
}
clock %= mod;
@@ -2322,9 +2360,13 @@ restart:
* No need to check for activity unless the
* frame is current.
*/
- if (frame == clock_frame && live &&
- (q.sitd->hw_results &
- SITD_ACTIVE(ehci))) {
+ if (((frame == clock_frame) ||
+ (((frame + 1) % ehci->periodic_size)
+ == clock_frame))
+ && live
+ && (q.sitd->hw_results &
+ SITD_ACTIVE(ehci))) {
+
incomplete = true;
q_p = &q.sitd->sitd_next;
hw_p = &q.sitd->hw_next;
@@ -2394,7 +2436,7 @@ restart:
clock = now;
clock_frame = clock >> 3;
if (ehci->clock_frame != clock_frame) {
- free_cached_itd_list(ehci);
+ free_cached_lists(ehci);
ehci->clock_frame = clock_frame;
}
} else {
Display More
beim nächsten Test werde ich diesen mal wieder rausnehmen, zumal ja hier in ISO Stream (also bei TT -36x0 Datenströmen, Mircroframes ausgelassen werden) Ich hoffe, das brint Änderungen.