Hi all,

> Hi,
>
> On Thu, Mar 22, 2012 at 11:46:41AM -0700, [email protected]
> wrote:
>>
>> The patch below does not apply to the 3.2-stable tree.
>> If someone wants it applied there, or to any other stable or longterm
>> tree, then please email the backport, including the original git commit
>> id to <[email protected]>.
>>
>> thanks,
>>
>> greg k-h
>>
>> ------------------ original commit in Linus's tree ------------------
>>
>> From f9c56cdd3905c96c600456203637bd7ec8ec6383 Mon Sep 17 00:00:00 2001
>> From: Ido Shayevitz <[email protected]>
>> Date: Wed, 8 Feb 2012 13:56:48 +0200
>> Subject: [PATCH] usb: gadget: Clear usb_endpoint_descriptor inside the
>> struct
>>  usb_ep on disable
>>
>> This fix a bug in f_serial, which expect the ep->desc to be NULL after
>> disabling an endpoint.
>>
>> Cc: [email protected]
>> Signed-off-by: Ido Shayevitz <[email protected]>
>> Signed-off-by: Felipe Balbi <[email protected]>
>
> Ido, do you have extra time to take care of this ?
>
> --
> balbi
>

Sorry for the delay.
I indeed saw an applay problem in drivers/usb/dwc3/gadget.c when applaying
to linux stable 3.2.13

Here is the new patch format, let me know if there are more problems:

----------------------- New patch for 3.2.13 stable --------------------
>From b02cb8caaa84d8ba5f11abbd974adcb8a3152381 Mon Sep 17 00:00:00 2001
From: Ido Shayevitz <[email protected]>
Date: Sun, 1 Apr 2012 14:02:05 +0300
Subject: [PATCH] usb: gadget: Clear usb_endpoint_descriptor inside the struct
 usb_ep on disable

This fix a bug in f_serial, which expect the ep->desc to be NULL after
disabling an endpoint.

Signed-off-by: Ido Shayevitz <[email protected]>
---
 drivers/usb/dwc3/gadget.c           |    1 +
 drivers/usb/gadget/amd5536udc.c     |    1 +
 drivers/usb/gadget/at91_udc.c       |    1 +
 drivers/usb/gadget/atmel_usba_udc.c |    1 +
 drivers/usb/gadget/ci13xxx_udc.c    |    1 +
 drivers/usb/gadget/fsl_qe_udc.c     |    1 +
 drivers/usb/gadget/fsl_udc_core.c   |    1 +
 drivers/usb/gadget/goku_udc.c       |    1 +
 drivers/usb/gadget/langwell_udc.c   |    1 +
 drivers/usb/gadget/mv_udc_core.c    |    1 +
 drivers/usb/gadget/omap_udc.c       |    1 +
 drivers/usb/gadget/pch_udc.c        |    1 +
 drivers/usb/gadget/pxa25x_udc.c     |    2 ++
 drivers/usb/gadget/s3c-hsudc.c      |    2 ++
 drivers/usb/gadget/s3c2410_udc.c    |    2 ++
 15 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 25dbd86..6d29994 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -405,6 +405,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)

        dep->stream_capable = false;
        dep->desc = NULL;
+       dep->endpoint.desc = NULL;
        dep->type = 0;
        dep->flags = 0;

diff --git a/drivers/usb/gadget/amd5536udc.c
b/drivers/usb/gadget/amd5536udc.c
index 45f422a..c71972a 100644
--- a/drivers/usb/gadget/amd5536udc.c
+++ b/drivers/usb/gadget/amd5536udc.c
@@ -445,6 +445,7 @@ static void ep_init(struct udc_regs __iomem *regs,
struct udc_ep *ep)

        VDBG(ep->dev, "ep-%d reset\n", ep->num);
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->ep.ops = &udc_ep_ops;
        INIT_LIST_HEAD(&ep->queue);

diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index 8efe0fa..12ea7ce 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -558,6 +558,7 @@ static int at91_ep_disable (struct usb_ep * _ep)

        /* restore the endpoint's pristine config */
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->ep.maxpacket = ep->maxpacket;

        /* reset fifos and endpoint */
diff --git a/drivers/usb/gadget/atmel_usba_udc.c
b/drivers/usb/gadget/atmel_usba_udc.c
index 271a9d8..11d7f4b 100644
--- a/drivers/usb/gadget/atmel_usba_udc.c
+++ b/drivers/usb/gadget/atmel_usba_udc.c
@@ -659,6 +659,7 @@ static int usba_ep_disable(struct usb_ep *_ep)
                return -EINVAL;
        }
        ep->desc = NULL;
+       ep->ep.desc = NULL;

        list_splice_init(&ep->queue, &req_list);
        if (ep->can_dma) {
diff --git a/drivers/usb/gadget/ci13xxx_udc.c
b/drivers/usb/gadget/ci13xxx_udc.c
index 9a0c397..b3bd91c 100644
--- a/drivers/usb/gadget/ci13xxx_udc.c
+++ b/drivers/usb/gadget/ci13xxx_udc.c
@@ -2166,6 +2166,7 @@ static int ep_disable(struct usb_ep *ep)
        } while (mEp->dir != direction);

        mEp->desc = NULL;
+       mEp->ep.desc = NULL;

        spin_unlock_irqrestore(mEp->lock, flags);
        return retval;
diff --git a/drivers/usb/gadget/fsl_qe_udc.c
b/drivers/usb/gadget/fsl_qe_udc.c
index e00cf92..937adc1 100644
--- a/drivers/usb/gadget/fsl_qe_udc.c
+++ b/drivers/usb/gadget/fsl_qe_udc.c
@@ -1638,6 +1638,7 @@ static int qe_ep_disable(struct usb_ep *_ep)
        /* Nuke all pending requests (does flush) */
        nuke(ep, -ESHUTDOWN);
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;
        ep->tx_req = NULL;
        qe_ep_reset(udc, ep->epnum);
diff --git a/drivers/usb/gadget/fsl_udc_core.c
b/drivers/usb/gadget/fsl_udc_core.c
index dd28ef3..21a862d 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -659,6 +659,7 @@ static int fsl_ep_disable(struct usb_ep *_ep)
        nuke(ep, -ESHUTDOWN);

        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;
        spin_unlock_irqrestore(&udc->lock, flags);

diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c
index 7f87805..f462bc1 100644
--- a/drivers/usb/gadget/goku_udc.c
+++ b/drivers/usb/gadget/goku_udc.c
@@ -235,6 +235,7 @@ static void ep_reset(struct goku_udc_regs __iomem
*regs, struct goku_ep *ep)

        ep->ep.maxpacket = MAX_FIFO_SIZE;
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;
        ep->irqs = 0;
        ep->dma = 0;
diff --git a/drivers/usb/gadget/langwell_udc.c
b/drivers/usb/gadget/langwell_udc.c
index 6ad0ad6..e99b63f 100644
--- a/drivers/usb/gadget/langwell_udc.c
+++ b/drivers/usb/gadget/langwell_udc.c
@@ -492,6 +492,7 @@ static int langwell_ep_disable(struct usb_ep *_ep)
        nuke(ep, -ESHUTDOWN);

        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;

        spin_unlock_irqrestore(&dev->lock, flags);
diff --git a/drivers/usb/gadget/mv_udc_core.c
b/drivers/usb/gadget/mv_udc_core.c
index 8924121..81319a9 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -671,6 +671,7 @@ static int  mv_ep_disable(struct usb_ep *_ep)
        nuke(ep, -ESHUTDOWN);

        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;

        spin_unlock_irqrestore(&udc->lock, flags);
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c
index 788989a..b92dbcf 100644
--- a/drivers/usb/gadget/omap_udc.c
+++ b/drivers/usb/gadget/omap_udc.c
@@ -251,6 +251,7 @@ static int omap_ep_disable(struct usb_ep *_ep)

        spin_lock_irqsave(&ep->udc->lock, flags);
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        nuke (ep, -ESHUTDOWN);
        ep->ep.maxpacket = ep->maxpacket;
        ep->has_dma = 0;
diff --git a/drivers/usb/gadget/pch_udc.c b/drivers/usb/gadget/pch_udc.c
index 5048a0c..0bc5a82 100644
--- a/drivers/usb/gadget/pch_udc.c
+++ b/drivers/usb/gadget/pch_udc.c
@@ -1493,6 +1493,7 @@ static int pch_udc_pcd_ep_disable(struct usb_ep *usbep)
        pch_udc_ep_disable(ep);
        pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num));
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        INIT_LIST_HEAD(&ep->queue);
        spin_unlock_irqrestore(&ep->dev->lock, iflags);
        return 0;
diff --git a/drivers/usb/gadget/pxa25x_udc.c
b/drivers/usb/gadget/pxa25x_udc.c
index c090a7e..f25fc06 100644
--- a/drivers/usb/gadget/pxa25x_udc.c
+++ b/drivers/usb/gadget/pxa25x_udc.c
@@ -283,6 +283,7 @@ static int pxa25x_ep_disable (struct usb_ep *_ep)
        pxa25x_ep_fifo_flush (_ep);

        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->stopped = 1;

        local_irq_restore(flags);
@@ -1192,6 +1193,7 @@ static void udc_reinit(struct pxa25x_udc *dev)
                        list_add_tail (&ep->ep.ep_list, &dev->gadget.ep_list);

                ep->desc = NULL;
+               ep->ep.desc = NULL;
                ep->stopped = 0;
                INIT_LIST_HEAD (&ep->queue);
                ep->pio_irqs = 0;
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c
index 20a553b..93fcb7d 100644
--- a/drivers/usb/gadget/s3c-hsudc.c
+++ b/drivers/usb/gadget/s3c-hsudc.c
@@ -814,6 +814,7 @@ static int s3c_hsudc_ep_disable(struct usb_ep *_ep)
        s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN);

        hsep->desc = 0;
+       hsep->ep.desc = NULL;
        hsep->stopped = 1;

        spin_unlock_irqrestore(&hsudc->lock, flags);
@@ -1003,6 +1004,7 @@ static void s3c_hsudc_initep(struct s3c_hsudc *hsudc,
        hsep->ep.ops = &s3c_hsudc_ep_ops;
        hsep->fifo = hsudc->regs + S3C_BR(epnum);
        hsep->desc = 0;
+       hsep->ep.desc = NULL;
        hsep->stopped = 0;
        hsep->wedge = 0;

diff --git a/drivers/usb/gadget/s3c2410_udc.c
b/drivers/usb/gadget/s3c2410_udc.c
index b864377..ce677d8 100644
--- a/drivers/usb/gadget/s3c2410_udc.c
+++ b/drivers/usb/gadget/s3c2410_udc.c
@@ -1148,6 +1148,7 @@ static int s3c2410_udc_ep_disable(struct usb_ep *_ep)
        dprintk(DEBUG_NORMAL, "ep_disable: %s\n", _ep->name);

        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->halted = 1;

        s3c2410_udc_nuke (ep->dev, ep, -ESHUTDOWN);
@@ -1630,6 +1631,7 @@ static void s3c2410_udc_reinit(struct s3c2410_udc *dev)

                ep->dev = dev;
                ep->desc = NULL;
+               ep->ep.desc = NULL;
                ep->halted = 0;
                INIT_LIST_HEAD (&ep->queue);
        }
-- 
1.7.6


Thanks,
Ido
--
Consultant for Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum



--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to