RE: [EXT] Re: [PATCH] usb: typec: tcpm: fix create duplicate source/sink-capabilities file

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

 



> -----Original Message-----
> From: Guenter Roeck <groeck7@xxxxxxxxx> On Behalf Of Guenter Roeck
> Sent: Tuesday, January 10, 2023 11:02 PM
> To: Xu Yang <xu.yang_2@xxxxxxx>; heikki.krogerus@xxxxxxxxxxxxxxx
> Cc: gregkh@xxxxxxxxxxxxxxxxxxx; linux-usb@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>; Jun Li <jun.li@xxxxxxx>
> Subject: Re: [EXT] Re: [PATCH] usb: typec: tcpm: fix create duplicate source/sink-capabilities file
> 
> Caution: EXT Email
> 
> On 1/8/23 16:35, Xu Yang wrote:
> > Hi,
> >
> >> -----Original Message-----
> >> From: Xu Yang
> >> Sent: Friday, December 16, 2022 2:41 PM
> >> To: Guenter Roeck <linux@xxxxxxxxxxxx>; heikki.krogerus@xxxxxxxxxxxxxxx
> >> Cc: gregkh@xxxxxxxxxxxxxxxxxxx; linux-usb@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>; Jun Li <jun.li@xxxxxxx>
> >> Subject: RE: [EXT] Re: [PATCH] usb: typec: tcpm: fix create duplicate source/sink-capabilities file
> >>
> >> Hi Guenter,
> >>
> >>> -----Original Message-----
> >>> From: Guenter Roeck <groeck7@xxxxxxxxx> On Behalf Of Guenter Roeck
> >>> Sent: Friday, December 16, 2022 1:13 PM
> >>> To: Xu Yang <xu.yang_2@xxxxxxx>; heikki.krogerus@xxxxxxxxxxxxxxx
> >>> Cc: gregkh@xxxxxxxxxxxxxxxxxxx; linux-usb@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>; Jun Li <jun.li@xxxxxxx>
> >>> Subject: [EXT] Re: [PATCH] usb: typec: tcpm: fix create duplicate source/sink-capabilities file
> >>>
> >>> Caution: EXT Email
> >>>
> >>> On 12/15/22 19:31, Xu Yang wrote:
> >>>> After soft reset has completed, an Explicit Contract negotiation occurs.
> >>>> The sink device will receive source capabilitys again. This will cause
> >>>> a duplicate source-capabilities file be created.
> >>>>
> >>>> And the kernel will dump:
> >>>> sysfs: cannot create duplicate filename '/devices/virtual/usb_power_delivery/pd1/source-capabilities'
> >>>>
> >>>> This will unregister existing capabilities before register new one.
> >>>>
> >>>> Fixes: 8203d26905ee ("usb: typec: tcpm: Register USB Power Delivery Capabilities")
> >>>> cc: <stable@xxxxxxxxxxxxxxx>
> >>>> Signed-off-by: Xu Yang <xu.yang_2@xxxxxxx>
> >>>> ---
> >>>>    drivers/usb/typec/tcpm/tcpm.c | 6 ++++++
> >>>>    1 file changed, 6 insertions(+)
> >>>>
> >>>> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> >>>> index 904c7b4ce2f0..02d8a704db95 100644
> >>>> --- a/drivers/usb/typec/tcpm/tcpm.c
> >>>> +++ b/drivers/usb/typec/tcpm/tcpm.c
> >>>> @@ -2371,6 +2371,9 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
> >>>>        if (IS_ERR(port->partner_pd))
> >>>>                return PTR_ERR(port->partner_pd);
> >>>>
> >>>> +     /* remove existing capabilities since got new one */
> >>>> +     usb_power_delivery_unregister_capabilities(port->partner_source_caps);
> >>>> +
> >>>>        memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
> >>>>        caps.role = TYPEC_SOURCE;
> >>>>
> >>>> @@ -2394,6 +2397,9 @@ static int tcpm_register_sink_caps(struct tcpm_port *port)
> >>>>        if (IS_ERR(port->partner_pd))
> >>>>                return PTR_ERR(port->partner_pd);
> >>>>
> >>>> +     /* remove existing capabilities since got new one */
> >>>> +     usb_power_delivery_unregister_capabilities(port->partner_sink_caps);
> >>>> +
> >>>>        memcpy(caps.pdo, port->sink_caps, sizeof(u32) * port->nr_sink_caps);
> >>>>        caps.role = TYPEC_SINK;
> >>>>
> >>>
> >>> Shouldn't usb_power_delivery_unregister_capabilities() be called from
> >>> the SOFT_RESET state handler ?
> >>
> >> Although this issue is triggered by soft reset event, there is also
> >> other possibilities which may produce this behavior. Such as received
> >> 2rd source capability or use Get_Source_Cap message. It's a dynamic
> >> process even after source/sink is ready. So I think it's better to handle
> >> it in tcpm_register_source/sink_caps(). Not sure if this is reasonable.
> >>
> >> Thanks,
> >> Xu Yang
> >
> > Do you have any other comments or suggestions with this patch?
> >
> 
> First of all, the current code is obviously wrong. If soft reset results in
> pd capabilities to be invalid, that should be handled in soft reset,
> just like it is handled in hard reset. Otherwise there would be stale pd
> devices around which are no longer valid.
> 
> Second, if it can indeed happen that multiple source capabilities
> messages are received, this should be handled as defined by the protocol.
> Either the second set of messages is expected to be ignored, or it is
> expected to replace existing capabilities. Either case, that situation
> should be handled consciously: unregistering and re-registering
> capabilities results in removal and re-creation of devices. Just doing
> that unconditionally even if unnecessary (if capabilities are the same)
> needs more discussion, and should not be hidden in another patch which
> is supposed to address a different problem.

Thanks for your comments. According to the protocol , it's not possible
for the source to send multiple capabilities. Unless the source doesn't
follow the rule. That is indeed another problem. I agree with you that
it should be handled in soft reset handler if soft reset results in pd
capabilities to be invaild. I will prepare a v2 for this case.

Thanks,
Xu Yang

> 
> Guenter





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux