On Wednesday 09 August 2006 20:36, David Brownell wrote:
> On Wednesday 09 August 2006 4:08 pm, Bjorn Helgaas wrote:
> > I think ohci-hcd (and likely ehci-hcd as well) has a bug in the
> > way it handles reboot notifiers.
>
> There's a patch addressing this for that's now in the MM tree
> and in Greg's USB patch queue (or at least in his mailbox).
Great, thanks!
> ------------------------------------------------------
> Subject: usb: Properly unregister reboot notifier in case of failure in ehci
> hcd
> From: Aleksey Gorelov <[EMAIL PROTECTED]>
>
> If some problem occurs during ehci startup, for instance, request_irq fails,
> echi hcd driver tries it best to cleanup, but fails to unregister reboot
> notifier, which in turn leads to crash on reboot/poweroff.
>
> The following patch resolves this problem by not using reboot notifiers
> anymore, but instead making ehci/ohci driver get its own shutdown method. For
> PCI, it is done through pci glue, for everything else through platform driver
> glue.
>
> One downside: sa1111 does not use platform driver stuff, and does not have its
> own shutdown hook, so no 'shutdown' is called for it now. I'm not sure if it
> is really necessary on that platform, though.
>
> Signed-off-by: Aleks Gorelov <[EMAIL PROTECTED]>
> Cc: Alan Stern <[EMAIL PROTECTED]>
> Cc: David Brownell <[EMAIL PROTECTED]>
> Cc: Greg KH <[EMAIL PROTECTED]>
> Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
> ---
>
> drivers/usb/core/hcd-pci.c | 16 ++++++++++++++++
> drivers/usb/core/hcd.c | 11 +++++++++++
> drivers/usb/core/hcd.h | 8 ++++++++
> drivers/usb/host/ehci-au1xxx.c | 2 ++
> drivers/usb/host/ehci-fsl.c | 2 ++
> drivers/usb/host/ehci-hcd.c | 16 +++++-----------
> drivers/usb/host/ehci-pci.c | 2 ++
> drivers/usb/host/ehci.h | 1 -
> drivers/usb/host/ohci-at91.c | 2 ++
> drivers/usb/host/ohci-au1xxx.c | 2 ++
> drivers/usb/host/ohci-ep93xx.c | 2 ++
> drivers/usb/host/ohci-hcd.c | 12 ++++--------
> drivers/usb/host/ohci-lh7a404.c | 2 ++
> drivers/usb/host/ohci-mem.c | 1 -
> drivers/usb/host/ohci-omap.c | 2 ++
> drivers/usb/host/ohci-pci.c | 3 +++
> drivers/usb/host/ohci-ppc-soc.c | 2 ++
> drivers/usb/host/ohci-pxa27x.c | 2 ++
> drivers/usb/host/ohci-s3c2410.c | 2 ++
> drivers/usb/host/ohci.h | 2 --
> 20 files changed, 69 insertions(+), 23 deletions(-)
>
> diff -puN
> drivers/usb/core/hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/core/hcd.c
> ---
> a/drivers/usb/core/hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/core/hcd.c
> @@ -36,6 +36,7 @@
> #include <linux/mutex.h>
> #include <asm/irq.h>
> #include <asm/byteorder.h>
> +#include <linux/platform_device.h>
>
> #include <linux/usb.h>
>
> @@ -1915,6 +1916,16 @@ void usb_remove_hcd(struct usb_hcd *hcd)
> }
> EXPORT_SYMBOL (usb_remove_hcd);
>
> +void
> +usb_hcd_platform_shutdown(struct platform_device* dev)
> +{
> + struct usb_hcd *hcd = platform_get_drvdata(dev);
> +
> + if (hcd->driver->shutdown)
> + hcd->driver->shutdown(hcd);
> +}
> +EXPORT_SYMBOL (usb_hcd_platform_shutdown);
> +
> /*-------------------------------------------------------------------------*/
>
> #if defined(CONFIG_USB_MON)
> diff -puN
> drivers/usb/core/hcd.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/core/hcd.h
> ---
> a/drivers/usb/core/hcd.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/core/hcd.h
> @@ -192,6 +192,9 @@ struct hc_driver {
> /* cleanly make HCD stop writing memory and doing I/O */
> void (*stop) (struct usb_hcd *hcd);
>
> + /* shutdown HCD */
> + void (*shutdown) (struct usb_hcd *hcd);
> +
> /* return current frame number */
> int (*get_frame_number) (struct usb_hcd *hcd);
>
> @@ -227,6 +230,9 @@ extern int usb_add_hcd(struct usb_hcd *h
> unsigned int irqnum, unsigned long irqflags);
> extern void usb_remove_hcd(struct usb_hcd *hcd);
>
> +struct platform_device;
> +extern void usb_hcd_platform_shutdown(struct platform_device* dev);
> +
> #ifdef CONFIG_PCI
> struct pci_dev;
> struct pci_device_id;
> @@ -239,6 +245,8 @@ extern int usb_hcd_pci_suspend (struct p
> extern int usb_hcd_pci_resume (struct pci_dev *dev);
> #endif /* CONFIG_PM */
>
> +extern void usb_hcd_pci_shutdown (struct pci_dev *dev);
> +
> #endif /* CONFIG_PCI */
>
> /* pci-ish (pdev null is ok) buffer alloc/mapping support */
> diff -puN
> drivers/usb/core/hcd-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/core/hcd-pci.c
> ---
> a/drivers/usb/core/hcd-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/core/hcd-pci.c
> @@ -413,4 +413,20 @@ EXPORT_SYMBOL (usb_hcd_pci_resume);
>
> #endif /* CONFIG_PM */
>
> +/**
> + * usb_hcd_pci_shutdown - shutdown host controller
> + * @dev: USB Host Controller being shutdown
> + */
> +void usb_hcd_pci_shutdown (struct pci_dev *dev)
> +{
> + struct usb_hcd *hcd;
> +
> + hcd = pci_get_drvdata(dev);
> + if (!hcd)
> + return;
> +
> + if (hcd->driver->shutdown)
> + hcd->driver->shutdown(hcd);
> +}
> +EXPORT_SYMBOL (usb_hcd_pci_shutdown);
>
> diff -puN
> drivers/usb/host/ehci-au1xxx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ehci-au1xxx.c
> ---
> a/drivers/usb/host/ehci-au1xxx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ehci-au1xxx.c
> @@ -200,6 +200,7 @@ static const struct hc_driver ehci_au1xx
> .reset = ehci_init,
> .start = ehci_run,
> .stop = ehci_stop,
> + .shutdown = ehci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -268,6 +269,7 @@ MODULE_ALIAS("au1xxx-ehci");
> static struct platform_driver ehci_hcd_au1xxx_driver = {
> .probe = ehci_hcd_au1xxx_drv_probe,
> .remove = ehci_hcd_au1xxx_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> /*.suspend = ehci_hcd_au1xxx_drv_suspend, */
> /*.resume = ehci_hcd_au1xxx_drv_resume, */
> .driver = {
> diff -puN
> drivers/usb/host/ehci-fsl.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ehci-fsl.c
> ---
> a/drivers/usb/host/ehci-fsl.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ehci-fsl.c
> @@ -285,6 +285,7 @@ static const struct hc_driver ehci_fsl_h
> .resume = ehci_bus_resume,
> #endif
> .stop = ehci_stop,
> + .shutdown = ehci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -329,6 +330,7 @@ MODULE_ALIAS("fsl-ehci");
> static struct platform_driver ehci_fsl_driver = {
> .probe = ehci_fsl_drv_probe,
> .remove = ehci_fsl_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> .driver = {
> .name = "fsl-ehci",
> },
> diff -puN
> drivers/usb/host/ehci.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ehci.h
> ---
> a/drivers/usb/host/ehci.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ehci.h
> @@ -82,7 +82,6 @@ struct ehci_hcd { /* one per controlle
> struct dma_pool *sitd_pool; /* sitd per split iso urb */
>
> struct timer_list watchdog;
> - struct notifier_block reboot_notifier;
> unsigned long actions;
> unsigned stamp;
> unsigned long next_statechange;
> diff -puN
> drivers/usb/host/ehci-hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ehci-hcd.c
> ---
> a/drivers/usb/host/ehci-hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ehci-hcd.c
> @@ -292,21 +292,20 @@ static void ehci_watchdog (unsigned long
> spin_unlock_irqrestore (&ehci->lock, flags);
> }
>
> -/* Reboot notifiers kick in for silicon on any bus (not just pci, etc).
> +/* ehci_shutdown kick in for silicon on any bus (not just pci, etc).
> * This forcibly disables dma and IRQs, helping kexec and other cases
> * where the next system software may expect clean state.
> */
> -static int
> -ehci_reboot (struct notifier_block *self, unsigned long code, void *null)
> +static void
> +ehci_shutdown (struct usb_hcd *hcd)
> {
> - struct ehci_hcd *ehci;
> + struct ehci_hcd *ehci;
>
> - ehci = container_of (self, struct ehci_hcd, reboot_notifier);
> + ehci = hcd_to_ehci (hcd);
> (void) ehci_halt (ehci);
>
> /* make BIOS/etc use companion controller during reboot */
> writel (0, &ehci->regs->configured_flag);
> - return 0;
> }
>
> static void ehci_port_power (struct ehci_hcd *ehci, int is_on)
> @@ -381,7 +380,6 @@ static void ehci_stop (struct usb_hcd *h
>
> /* let companion controllers work when we aren't */
> writel (0, &ehci->regs->configured_flag);
> - unregister_reboot_notifier (&ehci->reboot_notifier);
>
> remove_debug_files (ehci);
>
> @@ -483,9 +481,6 @@ static int ehci_init(struct usb_hcd *hcd
> }
> ehci->command = temp;
>
> - ehci->reboot_notifier.notifier_call = ehci_reboot;
> - register_reboot_notifier(&ehci->reboot_notifier);
> -
> return 0;
> }
>
> @@ -499,7 +494,6 @@ static int ehci_run (struct usb_hcd *hcd
>
> /* EHCI spec section 4.1 */
> if ((retval = ehci_reset(ehci)) != 0) {
> - unregister_reboot_notifier(&ehci->reboot_notifier);
> ehci_mem_cleanup(ehci);
> return retval;
> }
> diff -puN
> drivers/usb/host/ehci-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ehci-pci.c
> ---
> a/drivers/usb/host/ehci-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ehci-pci.c
> @@ -338,6 +338,7 @@ static const struct hc_driver ehci_pci_h
> .resume = ehci_pci_resume,
> #endif
> .stop = ehci_stop,
> + .shutdown = ehci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -384,4 +385,5 @@ static struct pci_driver ehci_pci_driver
> .suspend = usb_hcd_pci_suspend,
> .resume = usb_hcd_pci_resume,
> #endif
> + .shutdown = usb_hcd_pci_shutdown,
> };
> diff -puN
> drivers/usb/host/ohci-at91.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-at91.c
> ---
> a/drivers/usb/host/ohci-at91.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-at91.c
> @@ -221,6 +221,7 @@ static const struct hc_driver ohci_at91_
> */
> .start = ohci_at91_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -310,6 +311,7 @@ MODULE_ALIAS("at91_ohci");
> static struct platform_driver ohci_hcd_at91_driver = {
> .probe = ohci_hcd_at91_drv_probe,
> .remove = ohci_hcd_at91_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> .suspend = ohci_hcd_at91_drv_suspend,
> .resume = ohci_hcd_at91_drv_resume,
> .driver = {
> diff -puN
> drivers/usb/host/ohci-au1xxx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-au1xxx.c
> ---
> a/drivers/usb/host/ohci-au1xxx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-au1xxx.c
> @@ -274,6 +274,7 @@ static const struct hc_driver ohci_au1xx
> /* resume: ohci_au1xxx_resume, -- tbd */
> #endif /*CONFIG_PM*/
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -340,6 +341,7 @@ static int ohci_hcd_au1xxx_drv_resume(st
> static struct platform_driver ohci_hcd_au1xxx_driver = {
> .probe = ohci_hcd_au1xxx_drv_probe,
> .remove = ohci_hcd_au1xxx_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> /*.suspend = ohci_hcd_au1xxx_drv_suspend, */
> /*.resume = ohci_hcd_au1xxx_drv_resume, */
> .driver = {
> diff -puN
> drivers/usb/host/ohci-ep93xx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-ep93xx.c
> ---
> a/drivers/usb/host/ohci-ep93xx.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-ep93xx.c
> @@ -128,6 +128,7 @@ static struct hc_driver ohci_ep93xx_hc_d
> .flags = HCD_USB11 | HCD_MEMORY,
> .start = ohci_ep93xx_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
> .urb_enqueue = ohci_urb_enqueue,
> .urb_dequeue = ohci_urb_dequeue,
> .endpoint_disable = ohci_endpoint_disable,
> @@ -202,6 +203,7 @@ static int ohci_hcd_ep93xx_drv_resume(st
> static struct platform_driver ohci_hcd_ep93xx_driver = {
> .probe = ohci_hcd_ep93xx_drv_probe,
> .remove = ohci_hcd_ep93xx_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> #ifdef CONFIG_PM
> .suspend = ohci_hcd_ep93xx_drv_suspend,
> .resume = ohci_hcd_ep93xx_drv_resume,
> diff -puN
> drivers/usb/host/ohci.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci.h
> ---
> a/drivers/usb/host/ohci.h~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci.h
> @@ -389,8 +389,6 @@ struct ohci_hcd {
> unsigned long next_statechange; /* suspend/resume */
> u32 fminterval; /* saved register */
>
> - struct notifier_block reboot_notifier;
> -
> unsigned long flags; /* for HC bugs */
> #define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */
> #define OHCI_QUIRK_SUPERIO 0x02 /* natsemi */
> diff -puN
> drivers/usb/host/ohci-hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-hcd.c
> ---
> a/drivers/usb/host/ohci-hcd.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-hcd.c
> @@ -133,7 +133,6 @@ static const char hcd_name [] = "ohci_hc
> static void ohci_dump (struct ohci_hcd *ohci, int verbose);
> static int ohci_init (struct ohci_hcd *ohci);
> static void ohci_stop (struct usb_hcd *hcd);
> -static int ohci_reboot (struct notifier_block *, unsigned long , void *);
>
> #include "ohci-hub.c"
> #include "ohci-dbg.c"
> @@ -416,21 +415,20 @@ static void ohci_usb_reset (struct ohci_
> ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
> }
>
> -/* reboot notifier forcibly disables IRQs and DMA, helping kexec and
> +/* ohci_shutdown forcibly disables IRQs and DMA, helping kexec and
> * other cases where the next software may expect clean state from the
> * "firmware". this is bus-neutral, unlike shutdown() methods.
> */
> -static int
> -ohci_reboot (struct notifier_block *block, unsigned long code, void *null)
> +static void
> +ohci_shutdown (struct usb_hcd *hcd)
> {
> struct ohci_hcd *ohci;
>
> - ohci = container_of (block, struct ohci_hcd, reboot_notifier);
> + ohci = hcd_to_ohci (hcd);
> ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
> ohci_usb_reset (ohci);
> /* flush the writes */
> (void) ohci_readl (ohci, &ohci->regs->control);
> - return 0;
> }
>
> /*-------------------------------------------------------------------------*
> @@ -502,7 +500,6 @@ static int ohci_init (struct ohci_hcd *o
> if ((ret = ohci_mem_init (ohci)) < 0)
> ohci_stop (hcd);
> else {
> - register_reboot_notifier (&ohci->reboot_notifier);
> create_debug_files (ohci);
> }
>
> @@ -787,7 +784,6 @@ static void ohci_stop (struct usb_hcd *h
> ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
>
> remove_debug_files (ohci);
> - unregister_reboot_notifier (&ohci->reboot_notifier);
> ohci_mem_cleanup (ohci);
> if (ohci->hcca) {
> dma_free_coherent (hcd->self.controller,
> diff -puN
> drivers/usb/host/ohci-lh7a404.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-lh7a404.c
> ---
> a/drivers/usb/host/ohci-lh7a404.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-lh7a404.c
> @@ -178,6 +178,7 @@ static const struct hc_driver ohci_lh7a4
> /* resume: ohci_lh7a404_resume, -- tbd */
> #endif /*CONFIG_PM*/
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -245,6 +246,7 @@ static int ohci_hcd_lh7a404_drv_resume(s
> static struct platform_driver ohci_hcd_lh7a404_driver = {
> .probe = ohci_hcd_lh7a404_drv_probe,
> .remove = ohci_hcd_lh7a404_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> /*.suspend = ohci_hcd_lh7a404_drv_suspend, */
> /*.resume = ohci_hcd_lh7a404_drv_resume, */
> .driver = {
> diff -puN
> drivers/usb/host/ohci-mem.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-mem.c
> ---
> a/drivers/usb/host/ohci-mem.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-mem.c
> @@ -28,7 +28,6 @@ static void ohci_hcd_init (struct ohci_h
> ohci->next_statechange = jiffies;
> spin_lock_init (&ohci->lock);
> INIT_LIST_HEAD (&ohci->pending);
> - ohci->reboot_notifier.notifier_call = ohci_reboot;
> }
>
> /*-------------------------------------------------------------------------*/
> diff -puN
> drivers/usb/host/ohci-omap.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-omap.c
> ---
> a/drivers/usb/host/ohci-omap.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-omap.c
> @@ -411,6 +411,7 @@ static const struct hc_driver ohci_omap_
> */
> .start = ohci_omap_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -501,6 +502,7 @@ static int ohci_omap_resume(struct platf
> static struct platform_driver ohci_hcd_omap_driver = {
> .probe = ohci_hcd_omap_drv_probe,
> .remove = ohci_hcd_omap_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> #ifdef CONFIG_PM
> .suspend = ohci_omap_suspend,
> .resume = ohci_omap_resume,
> diff -puN
> drivers/usb/host/ohci-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-pci.c
> ---
> a/drivers/usb/host/ohci-pci.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-pci.c
> @@ -181,6 +181,7 @@ static const struct hc_driver ohci_pci_h
> .resume = ohci_pci_resume,
> #endif
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -230,6 +231,8 @@ static struct pci_driver ohci_pci_driver
> .suspend = usb_hcd_pci_suspend,
> .resume = usb_hcd_pci_resume,
> #endif
> +
> + .shutdown = usb_hcd_pci_shutdown,
> };
>
>
> diff -puN
> drivers/usb/host/ohci-ppc-soc.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-ppc-soc.c
> ---
> a/drivers/usb/host/ohci-ppc-soc.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-ppc-soc.c
> @@ -148,6 +148,7 @@ static const struct hc_driver ohci_ppc_s
> */
> .start = ohci_ppc_soc_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -196,6 +197,7 @@ static int ohci_hcd_ppc_soc_drv_remove(s
> static struct platform_driver ohci_hcd_ppc_soc_driver = {
> .probe = ohci_hcd_ppc_soc_drv_probe,
> .remove = ohci_hcd_ppc_soc_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> #ifdef CONFIG_PM
> /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/
> /*.resume = ohci_hcd_ppc_soc_drv_resume,*/
> diff -puN
> drivers/usb/host/ohci-pxa27x.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-pxa27x.c
> ---
> a/drivers/usb/host/ohci-pxa27x.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-pxa27x.c
> @@ -270,6 +270,7 @@ static const struct hc_driver ohci_pxa27
> */
> .start = ohci_pxa27x_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -358,6 +359,7 @@ static int ohci_hcd_pxa27x_drv_resume(st
> static struct platform_driver ohci_hcd_pxa27x_driver = {
> .probe = ohci_hcd_pxa27x_drv_probe,
> .remove = ohci_hcd_pxa27x_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> #ifdef CONFIG_PM
> .suspend = ohci_hcd_pxa27x_drv_suspend,
> .resume = ohci_hcd_pxa27x_drv_resume,
> diff -puN
> drivers/usb/host/ohci-s3c2410.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> drivers/usb/host/ohci-s3c2410.c
> ---
> a/drivers/usb/host/ohci-s3c2410.c~properly-unregister-reboot-notifier-in-case-of-failure-in-ehci-hcd
> +++ a/drivers/usb/host/ohci-s3c2410.c
> @@ -447,6 +447,7 @@ static const struct hc_driver ohci_s3c24
> */
> .start = ohci_s3c2410_start,
> .stop = ohci_stop,
> + .shutdown = ohci_shutdown,
>
> /*
> * managing i/o requests and associated device resources
> @@ -491,6 +492,7 @@ static int ohci_hcd_s3c2410_drv_remove(s
> static struct platform_driver ohci_hcd_s3c2410_driver = {
> .probe = ohci_hcd_s3c2410_drv_probe,
> .remove = ohci_hcd_s3c2410_drv_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> /*.suspend = ohci_hcd_s3c2410_drv_suspend, */
> /*.resume = ohci_hcd_s3c2410_drv_resume, */
> .driver = {
> _
>
>
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel