On Wed, 12 Mar 2025 11:30:03 +0100,
Marcus Glocker <[email protected]> wrote:
>
> On Wed, Mar 12, 2025 at 10:24:04AM GMT, Landry Breuil wrote:
>
> > Le Wed, Mar 12, 2025 at 10:05:30AM +0100, Landry Breuil a ?crit :
> > > hi,
> > >
> > > updated my t470s from '#564: Tue Feb 25 21:20:18 MST 2025' to '#591: Tue
> > > Mar 11 20:48:18 MDT 2025' and my webcam now shows weird 'stripes' on top
> > > of the image (that works).
> >
> > the 'weird stripes' only show up from some webrtc clients (ive noticed
> > it with jitsi in firefox 137.0b4), using video(1) i havent been able to
> > replicate (yet)..
> >
> > no issue in https://mozilla.github.io/webrtc-landing/gum_test.html so
> > might be the way jitsi queries the video device.
> >
> > Landry
>
> I have the same cam in my X1 Carbon. I can't reproduce the issue on
> video(1) either, because it's using YUYV422 as the default input format.
> When using ffplay with MJPEG as input format, I can reproduce the issue.
>
> I'll try to figure out which of the recent commits has introduced the
> regression.
>
Landry, may I ask you to try this two patch which reverts USB3 speed for
isoc devices?
Also, may I ask you to share output of ffplay -list_formats all -i /dev/videoX
with and without this diffs?
Notable to say that I see broken mjpeg stream from Jabra PanaCast 20 when I
connect it via CalDigit's Element Hub on 3840x2160 stream, and no issue at
all when I connect it via Hub in used external monitor LG UltraFine 5K.
But I haven't dig inti it yet.
--
wbr, Kirill
Index: sys/dev/usb/usb_subr.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/usb_subr.c,v
diff -u -p -r1.164 usb_subr.c
--- sys/dev/usb/usb_subr.c 1 Mar 2025 14:43:03 -0000 1.164
+++ sys/dev/usb/usb_subr.c 12 Mar 2025 13:04:26 -0000
@@ -514,8 +514,7 @@ int
usbd_parse_idesc(struct usbd_device *dev, struct usbd_interface *ifc)
{
#define ed ((usb_endpoint_descriptor_t *)p)
-#define essd ((usb_endpoint_ss_comp_descriptor_t *)pp)
- char *p, *pp, *end;
+ char *p, *end;
int i;
p = (char *)ifc->idesc + ifc->idesc->bLength;
@@ -535,11 +534,6 @@ usbd_parse_idesc(struct usbd_device *dev
if (p >= end)
return (-1);
- pp = p + ed->bLength;
- if (pp >= end || essd->bLength == 0 ||
- essd->bDescriptorType != UDESC_ENDPOINT_SS_COMP)
- pp = NULL;
-
if (dev->speed == USB_SPEED_HIGH) {
unsigned int mps;
@@ -563,7 +557,6 @@ usbd_parse_idesc(struct usbd_device *dev
}
ifc->endpoints[i].edesc = ed;
- ifc->endpoints[i].esscd = essd;
ifc->endpoints[i].refcnt = 0;
ifc->endpoints[i].savedtoggle = 0;
p += ed->bLength;
@@ -571,7 +564,6 @@ usbd_parse_idesc(struct usbd_device *dev
return (0);
#undef ed
-#undef essd
}
void
Index: sys/dev/usb/usbdivar.h
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/usbdivar.h,v
diff -u -p -r1.85 usbdivar.h
--- sys/dev/usb/usbdivar.h 1 Mar 2025 14:43:03 -0000 1.85
+++ sys/dev/usb/usbdivar.h 12 Mar 2025 13:04:26 -0000
@@ -55,7 +55,6 @@ struct usbd_pipe;
struct usbd_endpoint {
usb_endpoint_descriptor_t *edesc;
- usb_endpoint_ss_comp_descriptor_t *esscd;
int refcnt;
int savedtoggle;
};
Index: sys/dev/usb/xhci.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/xhci.c,v
diff -u -p -r1.136 xhci.c
--- sys/dev/usb/xhci.c 1 Mar 2025 14:43:03 -0000 1.136
+++ sys/dev/usb/xhci.c 12 Mar 2025 13:04:26 -0000
@@ -1355,7 +1355,6 @@ static inline uint32_t
xhci_get_txinfo(struct xhci_softc *sc, struct usbd_pipe *pipe)
{
usb_endpoint_descriptor_t *ed = pipe->endpoint->edesc;
- usb_endpoint_ss_comp_descriptor_t *esscd = pipe->endpoint->esscd;
uint32_t mep, atl, mps = UGETW(ed->wMaxPacketSize);
switch (UE_GET_XFERTYPE(ed->bmAttributes)) {
@@ -1365,10 +1364,8 @@ xhci_get_txinfo(struct xhci_softc *sc, s
break;
case UE_INTERRUPT:
case UE_ISOCHRONOUS:
- if (esscd && pipe->device->speed >= USB_SPEED_SUPER) {
- mep = UGETW(esscd->wBytesPerInterval);
- atl = mep;
- break;
+ if (pipe->device->speed == USB_SPEED_SUPER) {
+ /* XXX Read the companion descriptor */
}
mep = (UE_GET_TRANS(mps) + 1) * UE_GET_SIZE(mps);
@@ -1444,7 +1441,6 @@ uint32_t
xhci_pipe_maxburst(struct usbd_pipe *pipe)
{
usb_endpoint_descriptor_t *ed = pipe->endpoint->edesc;
- usb_endpoint_ss_comp_descriptor_t *esscd = pipe->endpoint->esscd;
uint32_t mps = UGETW(ed->wMaxPacketSize);
uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
uint32_t maxb = 0;
@@ -1455,9 +1451,7 @@ xhci_pipe_maxburst(struct usbd_pipe *pip
maxb = UE_GET_TRANS(mps);
break;
case USB_SPEED_SUPER:
- if (esscd &&
- (xfertype == UE_ISOCHRONOUS || xfertype == UE_INTERRUPT))
- maxb = esscd->bMaxBurst;
+ /* XXX Read the companion descriptor */
default:
break;
}
Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/uvideo.c,v
diff -u -p -r1.251 uvideo.c
--- sys/dev/usb/uvideo.c 10 Mar 2025 07:38:12 -0000 1.251
+++ sys/dev/usb/uvideo.c 12 Mar 2025 13:19:54 -0000
@@ -141,8 +141,7 @@ usbd_status uvideo_vs_parse_desc_format_
usbd_status uvideo_vs_parse_desc_frame(struct uvideo_softc *);
usbd_status uvideo_vs_parse_desc_frame_sub(struct uvideo_softc *,
const usb_descriptor_t *);
-uint32_t uvideo_vc_parse_max_packet_size(struct uvideo_softc *,
- usb_endpoint_descriptor_t *);
+uint32_t uvideo_vc_parse_max_packet_size(usb_endpoint_descriptor_t *);
usbd_status uvideo_vs_parse_desc_alt(struct uvideo_softc *, int, int, int);
usbd_status uvideo_vs_set_alt(struct uvideo_softc *,
struct usbd_interface *, int);
@@ -196,8 +195,6 @@ void uvideo_dump_desc_output(struct uvi
const usb_descriptor_t *);
void uvideo_dump_desc_endpoint(struct uvideo_softc *,
const usb_descriptor_t *);
-void uvideo_dump_desc_endpoint_ss_comp(struct uvideo_softc *,
- const usb_descriptor_t *);
void uvideo_dump_desc_iface_assoc(struct uvideo_softc *,
const usb_descriptor_t *);
void uvideo_dump_desc_interface(struct uvideo_softc *,
@@ -1315,39 +1312,12 @@ uvideo_vs_parse_desc_frame_sub(struct uv
}
uint32_t
-uvideo_vc_parse_max_packet_size(struct uvideo_softc *sc,
- usb_endpoint_descriptor_t *ed)
+uvideo_vc_parse_max_packet_size(usb_endpoint_descriptor_t *ed)
{
uint32_t psize;
- struct usbd_desc_iter iter;
- const usb_descriptor_t *desc;
- usb_endpoint_ss_comp_descriptor_t *esscd;
-
- /*
- * USB 3.0 Section 9.6.7 states that wBytesPerInterval is only
- * valid for periodic endpoints (isochronous and interrupt).
- */
- if (UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK)
- goto skip_ss_comp;
-
- usbd_desc_iter_init(sc->sc_udev, &iter);
- while ((desc = usbd_desc_iter_next(&iter))) {
- if (desc == (const usb_descriptor_t *)ed) {
- desc = usbd_desc_iter_next(&iter);
- break;
- }
- }
- if (desc && sc->sc_udev->speed >= USB_SPEED_SUPER &&
- desc->bDescriptorType == UDESC_ENDPOINT_SS_COMP) {
- esscd = (usb_endpoint_ss_comp_descriptor_t *)desc;
- psize = UGETW(esscd->wBytesPerInterval);
- DPRINTF(1, "%s: wBytesPerInterval=%d\n",
- DEVNAME(sc), psize);
- return psize;
- }
+ /* XXX: get USB 3.0 speed from wBytesPerInterval */
-skip_ss_comp:
psize = UGETW(ed->wMaxPacketSize);
psize = UE_GET_SIZE(psize) * (1 + UE_GET_TRANS(psize));
@@ -1426,7 +1396,7 @@ uvideo_vs_parse_desc_alt(struct uvideo_s
if (bulk_endpoint && !vs->bulk_endpoint)
goto next;
- psize = uvideo_vc_parse_max_packet_size(sc, ed);
+ psize = uvideo_vc_parse_max_packet_size(ed);
/* save endpoint with largest bandwidth */
if (psize > vs->psize) {
vs->ifaceh = &sc->sc_udev->ifaces[iface];
@@ -1504,7 +1474,7 @@ uvideo_vs_set_alt(struct uvideo_softc *s
goto next;
/* save endpoint with requested bandwidth */
- psize = uvideo_vc_parse_max_packet_size(sc, ed);
+ psize = uvideo_vc_parse_max_packet_size(ed);
if (psize >= max_packet_size)
diff = psize - max_packet_size;
else
@@ -2733,11 +2703,6 @@ uvideo_dump_desc_all(struct uvideo_softc
printf("|\n");
uvideo_dump_desc_endpoint(sc, desc);
break;
- case UDESC_ENDPOINT_SS_COMP:
- printf(" (UDESC_ENDPOINT_SS_COMP)\n");
- printf("|\n");
- uvideo_dump_desc_endpoint_ss_comp(sc, desc);
- break;
case UDESC_INTERFACE:
printf(" (UDESC_INTERFACE)\n");
printf("|\n");
@@ -2873,21 +2838,6 @@ uvideo_dump_desc_endpoint(struct uvideo_
printf(" (UE_INTERRUPT)\n");
printf("wMaxPacketSize=%d\n", UGETW(d->wMaxPacketSize));
printf("bInterval=0x%02x\n", d->bInterval);
-}
-
-void
-uvideo_dump_desc_endpoint_ss_comp(struct uvideo_softc *sc,
- const usb_descriptor_t *desc)
-{
- usb_endpoint_ss_comp_descriptor_t *d;
-
- d = (usb_endpoint_ss_comp_descriptor_t *)(uint8_t *)desc;
-
- printf("bLength=%d\n", d->bLength);
- printf("bDescriptorType=0x%02x\n", d->bDescriptorType);
- printf("bMaxBurst=0x%02x\n", d->bMaxBurst);
- printf("bmAttributes=0x%02x\n", d->bmAttributes);
- printf("wBytesPerInterval=%d\n", UGETW(d->wBytesPerInterval));
}
void