[linux dev-6.6 v1] usb: chipidea: udc: enforce write to the memory.
Tomer Maimon
tmaimon77 at gmail.com
Wed Jul 17 00:21:43 AEST 2024
Hi Paul,
Thanks a lot for your comments, it will be addressed in the next version.
Tomer
On Wed, 10 Jul 2024 at 16:52, Paul Menzel <pmenzel at molgen.mpg.de> wrote:
>
> Dear Tomer,
>
>
> Thank you for your patch.
>
> Am 10.07.24 um 14:41 schrieb Tomer Maimon:
> > In the prime endpoint function, we need to read from qh.ptr->td.token
> > to ensure that the previous write to it has indeed been committed
> > to memory.
>
> Please document the datasheet name, revision and section. If this
> actually caused user visible problems, please also document the test case.
>
> > Signed-off-by: Tomer Maimon <tmaimon77 at gmail.com>
> > ---
> > drivers/usb/chipidea/udc.c | 15 ++++++++++++---
> > 1 file changed, 12 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
> > index 0b7bd3c643c3..0b14a1d54d59 100644
> > --- a/drivers/usb/chipidea/udc.c
> > +++ b/drivers/usb/chipidea/udc.c
> > @@ -190,12 +190,21 @@ static int hw_ep_get_halt(struct ci_hdrc *ci, int num, int dir)
> > *
> > * This function returns an error code
> > */
> > -static int hw_ep_prime(struct ci_hdrc *ci, int num, int dir, int is_ctrl)
> > +static int hw_ep_prime(struct ci_hdrc *ci, struct ci_hw_ep *hwep, int num,
> > + int dir, int is_ctrl)
> > {
> > int n = hw_ep_bit(num, dir);
> >
> > /* Synchronize before ep prime */
> > wmb();
> > +
> > + /*
> > + * We add the read from qh.ptr->td.token to make sure the previous
> > + * write to it indeed got into the mamory so when we prime the DMA
>
> m*e*mory
>
> > + * will read the updated data
> > + */
> > + if (hwep->qh.ptr->td.token & 0x80000000)
> > + pr_info("%s(): hwep->qh.ptr->td.token=%08x\n", __func__, hwep->qh.ptr->td.token);
> >
> > if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num)))
> > return -EAGAIN;
> > @@ -632,7 +641,7 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
> > hwep->qh.ptr->cap |= cpu_to_le32(mul << __ffs(QH_MULT));
> > }
> >
> > - ret = hw_ep_prime(ci, hwep->num, hwep->dir,
> > + ret = hw_ep_prime(ci, hwep, hwep->num, hwep->dir,
> > hwep->type == USB_ENDPOINT_XFER_CONTROL);
> > done:
> > return ret;
> > @@ -658,7 +667,7 @@ static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep,
> > hwep->qh.ptr->td.token &=
> > cpu_to_le32(~(TD_STATUS_HALTED | TD_STATUS_ACTIVE));
> >
> > - return hw_ep_prime(ci, hwep->num, hwep->dir,
> > + return hw_ep_prime(ci, hwep, hwep->num, hwep->dir,
> > hwep->type == USB_ENDPOINT_XFER_CONTROL);
> > }
> >
>
>
> Kind regards,
>
> Paul
More information about the openbmc
mailing list