AW: r8a66597-hcd panics when a USB device is removed from an attached hub

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

 



Hello Mr. Yoshihiro

patch works, many thanks.

Mit freundlichen Grüßen / Best Regards

Markus Pietrek
Software engineer

--
emtrion GmbH
Greschbachstr. 12
76229 Karlsruhe
GERMANY

Phone  +49 721 62725-45
Fax    +49 721 62725-19
E-mail Markus.Pietrek@xxxxxxxxxx
http://www.emtrion.de



> -----Ursprüngliche Nachricht-----
> Von: shimoda.yoshihiro@xxxxxxxxxxx
> [mailto:shimoda.yoshihiro@xxxxxxxxxxx]
> Gesendet: Dienstag, 16. März 2010 04:30
> An: Paul Mundt; Pietrek, Markus
> Cc: Alan Stern; linux-sh@xxxxxxxxxxxxxxx; USB list
> Betreff: Re: r8a66597-hcd panics when a USB device is removed from an
> attached hub
>
> Paul Mundt wrote:
> > On Mon, Mar 15, 2010 at 10:00:07AM -0400, Alan Stern wrote:
> >> Is there some reason why you guys haven't tried asking the author of
> >> r8a66597-hcd (CC'ed)?  He's in a better position than anyone else to
> >> fix the problem.
> >>
> > He's on the list as well, just unresponsive as of late, which is why
> I
> > waited some time before replying and adding linux-usb to the Cc.
> >
> I'm sorry for my lazy response.
> I check this issue, and I fixed it.
>
>
> Hello Mr. Markus,
>
> Thank you for your detail report!
> I made a patch. If possible, would you test it on your environment?
>
> Thanks,
> Yoshihiro Shimoda
> ---
>
> Subject: [PATCH] usb: r8a66597-hcd: fix removed from an attached hub
>
> fix the problem that when a USB hub is attached to the r8a66597-hcd and
> a device is removed from that hub, it's likely that a kernel panic
> follows.
>
> Reported-by: Markus Pietrek <Markus.Pietrek@xxxxxxxxxx>
> Signed-off-by: Yoshihiro Shimoda <shimoda.yoshihiro@xxxxxxxxxxx>
> ---
>  drivers/usb/host/r8a66597-hcd.c |   16 +++++++++++-----
>  1 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/usb/host/r8a66597-hcd.c
> b/drivers/usb/host/r8a66597-hcd.c
> index bee558a..f71a73a 100644
> --- a/drivers/usb/host/r8a66597-hcd.c
> +++ b/drivers/usb/host/r8a66597-hcd.c
> @@ -418,7 +418,7 @@ static u8 alloc_usb_address(struct r8a66597
> *r8a66597, struct urb *urb)
>
>  /* this function must be called with interrupt disabled */
>  static void free_usb_address(struct r8a66597 *r8a66597,
> -                          struct r8a66597_device *dev)
> +                          struct r8a66597_device *dev, int reset)
>  {
>       int port;
>
> @@ -430,7 +430,13 @@ static void free_usb_address(struct r8a66597
> *r8a66597,
>       dev->state = USB_STATE_DEFAULT;
>       r8a66597->address_map &= ~(1 << dev->address);
>       dev->address = 0;
> -     dev_set_drvdata(&dev->udev->dev, NULL);
> +     /*
> +      * Only when resetting USB, it is necessary to erase drvdata.
> When
> +      * a usb device with usb hub is disconnect, "dev->udev" is
> already
> +      * freed on usb_desconnect(). So we cannot access the data.
> +      */
> +     if (reset)
> +             dev_set_drvdata(&dev->udev->dev, NULL);
>       list_del(&dev->device_list);
>       kfree(dev);
>
> @@ -1069,7 +1075,7 @@ static void r8a66597_usb_disconnect(struct
> r8a66597 *r8a66597, int port)
>       struct r8a66597_device *dev = r8a66597->root_hub[port].dev;
>
>       disable_r8a66597_pipe_all(r8a66597, dev);
> -     free_usb_address(r8a66597, dev);
> +     free_usb_address(r8a66597, dev, 0);
>
>       start_root_hub_sampling(r8a66597, port, 0);
>  }
> @@ -2085,7 +2091,7 @@ static void update_usb_address_map(struct
> r8a66597 *r8a66597,
>                               spin_lock_irqsave(&r8a66597->lock, flags);
>                               dev = get_r8a66597_device(r8a66597, addr);
>                               disable_r8a66597_pipe_all(r8a66597, dev);
> -                             free_usb_address(r8a66597, dev);
> +                             free_usb_address(r8a66597, dev, 0);
>                               put_child_connect_map(r8a66597, addr);
>                               spin_unlock_irqrestore(&r8a66597->lock, flags);
>                       }
> @@ -2228,7 +2234,7 @@ static int r8a66597_hub_control(struct usb_hcd
> *hcd, u16 typeReq, u16 wValue,
>                       rh->port |= (1 << USB_PORT_FEAT_RESET);
>
>                       disable_r8a66597_pipe_all(r8a66597, dev);
> -                     free_usb_address(r8a66597, dev);
> +                     free_usb_address(r8a66597, dev, 1);
>
>                       r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT,
>                                     get_dvstctr_reg(port));
> --
> 1.5.5


_____________________________________

Amtsgericht Mannheim
HRB 110 300
Geschäftsführer: Dieter Baur, Ramona Maurer
_____________________________________

Important Note:
- This e-mail may contain trade secrets or privileged, undisclosed or otherwise confidential information.
- If you have received this e-mail in error, you are hereby notified that any review, copying or distribution of it is strictly prohibited.
- Please inform us immediately and destroy the original transmittal.

Thank you for your cooperation.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

  Powered by Linux