Hi Hans, On Wed, Mar 31, 2021 at 12:38:07PM +0200, Hans de Goede wrote: > On 3/8/21 11:31 AM, Hans de Goede wrote: > > From: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > > > > Some devices reference an output terminal as the source of extension > > units. This is incorrect, as output terminals only have an input pin, > > and thus can't be connected to any entity in the forward direction. The > > resulting topology would cause issues when registering the media > > controller graph. To avoid this problem, connect the extension unit to > > the source of the output terminal instead. > > > > While at it, and while no device has been reported to be affected by > > this issue, also handle forward scans where two output terminals would > > be connected together, and skip the terminals found through such an > > invalid connection. > > > > Reported-and-tested-by: John Nealy <jnealy3@xxxxxxxxx> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > > Ping? This is a bug-fix which fixes a WARN triggering, causing many > users to see a backtrace in their kernel-logs and reporting bugs about this: > > https://bugzilla.redhat.com/buglist.cgi?quicksearch=mc-entity.c > > Currently shows 12 open bugs for this and this is not counting all the > ones which have already been triaged and matched as dups. > > As such it would be really good if we can get this merged and on > its way to 5.12-rc# as a fix for 5.12 (and to be backported to the > stable series). The patch is included in "[GIT PULL FOR v5.13] Miscellaneous changes". I have no personal issue with it being merged in v5.12-rc, but technically it's not a regression fix, is it ? I'll let Mauro decide what works best for him. > > --- > > drivers/media/usb/uvc/uvc_driver.c | 32 ++++++++++++++++++++++++++++++ > > 1 file changed, 32 insertions(+) > > > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c > > index 30ef2a3110f7..8df58f04dac6 100644 > > --- a/drivers/media/usb/uvc/uvc_driver.c > > +++ b/drivers/media/usb/uvc/uvc_driver.c > > @@ -1716,6 +1716,31 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, > > return -EINVAL; > > } > > > > + /* > > + * Some devices reference an output terminal as the > > + * source of extension units. This is incorrect, as > > + * output terminals only have an input pin, and thus > > + * can't be connected to any entity in the forward > > + * direction. The resulting topology would cause issues > > + * when registering the media controller graph. To > > + * avoid this problem, connect the extension unit to > > + * the source of the output terminal instead. > > + */ > > + if (UVC_ENTITY_IS_OTERM(entity)) { > > + struct uvc_entity *source; > > + > > + source = uvc_entity_by_id(chain->dev, > > + entity->baSourceID[0]); > > + if (!source) { > > + uvc_dbg(chain->dev, DESCR, > > + "Can't connect extension unit %u in chain\n", > > + forward->id); > > + break; > > + } > > + > > + forward->baSourceID[0] = source->id; > > + } > > + > > list_add_tail(&forward->chain, &chain->entities); > > if (!found) > > uvc_dbg_cont(PROBE, " (->"); > > @@ -1735,6 +1760,13 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, > > return -EINVAL; > > } > > > > + if (UVC_ENTITY_IS_OTERM(entity)) { > > + uvc_dbg(chain->dev, DESCR, > > + "Unsupported connection between output terminals %u and %u\n", > > + entity->id, forward->id); > > + break; > > + } > > + > > list_add_tail(&forward->chain, &chain->entities); > > if (!found) > > uvc_dbg_cont(PROBE, " (->"); -- Regards, Laurent Pinchart