Hi All, 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). Regards, Hans > --- > 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, " (->"); >