From c1f4eb589cba77ae0cfcc42ce98429181b3c1765 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 8 Mar 2012 10:36:44 -0800 Subject: [PATCH] 3.0-stable patches added patches: media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch media-staging-lirc_serial-fix-init-exit-order.patch media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch --- ...-error-codes-returned-by-request_irq.patch | 51 +++++++ ...erial-fix-deadlock-on-resume-failure.patch | 35 +++++ ...ging-lirc_serial-fix-init-exit-order.patch | 141 ++++++++++++++++++ ...n-failure-paths-of-lirc_serial_probe.patch | 59 ++++++++ queue-3.0/series | 4 + 5 files changed, 290 insertions(+) create mode 100644 queue-3.0/media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch create mode 100644 queue-3.0/media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch create mode 100644 queue-3.0/media-staging-lirc_serial-fix-init-exit-order.patch create mode 100644 queue-3.0/media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch diff --git a/queue-3.0/media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch b/queue-3.0/media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch new file mode 100644 index 00000000000..bd3d7d44364 --- /dev/null +++ b/queue-3.0/media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch @@ -0,0 +1,51 @@ +From affc9a0d59ac49bd304e2137bd5e4ffdd6fdfa52 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Wed, 16 Nov 2011 01:54:04 -0300 +Subject: media: staging: lirc_serial: Do not assume error codes returned by request_irq() + +From: Ben Hutchings + +commit affc9a0d59ac49bd304e2137bd5e4ffdd6fdfa52 upstream. + +lirc_serial_probe() must fail if request_irq() returns an error, even if +it isn't EBUSY or EINVAL, + +Signed-off-by: Ben Hutchings +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Jonathan Nieder +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/lirc/lirc_serial.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +--- a/drivers/staging/lirc/lirc_serial.c ++++ b/drivers/staging/lirc/lirc_serial.c +@@ -843,18 +843,15 @@ static int __devinit lirc_serial_probe(s + result = request_irq(irq, irq_handler, + IRQF_DISABLED | (share_irq ? IRQF_SHARED : 0), + LIRC_DRIVER_NAME, (void *)&hardware); +- +- switch (result) { +- case -EBUSY: +- printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", irq); +- return -EBUSY; +- case -EINVAL: +- printk(KERN_ERR LIRC_DRIVER_NAME +- ": Bad irq number or handler\n"); +- return -EINVAL; +- default: +- break; +- }; ++ if (result < 0) { ++ if (result == -EBUSY) ++ printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", ++ irq); ++ else if (result == -EINVAL) ++ printk(KERN_ERR LIRC_DRIVER_NAME ++ ": Bad irq number or handler\n"); ++ return result; ++ } + + /* Reserve io region. */ + /* diff --git a/queue-3.0/media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch b/queue-3.0/media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch new file mode 100644 index 00000000000..a070ada2b8a --- /dev/null +++ b/queue-3.0/media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch @@ -0,0 +1,35 @@ +From 1ff1d88e862948ae5bfe490248c023ff8ac2855d Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Wed, 16 Nov 2011 01:53:25 -0300 +Subject: media: staging: lirc_serial: Fix deadlock on resume failure + +From: Ben Hutchings + +commit 1ff1d88e862948ae5bfe490248c023ff8ac2855d upstream. + +A resume function cannot remove the device it is resuming! + +Signed-off-by: Ben Hutchings +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Jonathan Nieder +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/staging/lirc/lirc_serial.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/staging/lirc/lirc_serial.c ++++ b/drivers/staging/lirc/lirc_serial.c +@@ -1127,10 +1127,8 @@ static int lirc_serial_resume(struct pla + { + unsigned long flags; + +- if (hardware_init_port() < 0) { +- lirc_serial_exit(); ++ if (hardware_init_port() < 0) + return -EINVAL; +- } + + spin_lock_irqsave(&hardware[type].lock, flags); + /* Enable Interrupt */ diff --git a/queue-3.0/media-staging-lirc_serial-fix-init-exit-order.patch b/queue-3.0/media-staging-lirc_serial-fix-init-exit-order.patch new file mode 100644 index 00000000000..187ada0a614 --- /dev/null +++ b/queue-3.0/media-staging-lirc_serial-fix-init-exit-order.patch @@ -0,0 +1,141 @@ +From 9105b8b200410383d0854bbe237ee385d7d33ba6 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Wed, 16 Nov 2011 01:49:41 -0300 +Subject: media: staging: lirc_serial: Fix init/exit order + +From: Ben Hutchings + +commit 9105b8b200410383d0854bbe237ee385d7d33ba6 upstream. + +Currently the module init function registers a platform_device and +only then allocates its IRQ and I/O region. This allows allocation to +race with the device's suspend() function. Instead, allocate +resources in the platform driver's probe() function and free them in +the remove() function. + +The module exit function removes the platform device before the +character device that provides access to it. Change it to reverse the +order of initialisation. + +Signed-off-by: Ben Hutchings +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Jonathan Nieder +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/lirc/lirc_serial.c | 56 +++++++++++++------------------------ + 1 file changed, 21 insertions(+), 35 deletions(-) + +--- a/drivers/staging/lirc/lirc_serial.c ++++ b/drivers/staging/lirc/lirc_serial.c +@@ -836,7 +836,7 @@ static int hardware_init_port(void) + return 0; + } + +-static int init_port(void) ++static int __devinit lirc_serial_probe(struct platform_device *dev) + { + int i, nlow, nhigh, result; + +@@ -913,6 +913,18 @@ static int init_port(void) + return 0; + } + ++static int __devexit lirc_serial_remove(struct platform_device *dev) ++{ ++ free_irq(irq, (void *)&hardware); ++ ++ if (iommap != 0) ++ release_mem_region(iommap, 8 << ioshift); ++ else ++ release_region(io, 8); ++ ++ return 0; ++} ++ + static int set_use_inc(void *data) + { + unsigned long flags; +@@ -1076,16 +1088,6 @@ static struct lirc_driver driver = { + + static struct platform_device *lirc_serial_dev; + +-static int __devinit lirc_serial_probe(struct platform_device *dev) +-{ +- return 0; +-} +- +-static int __devexit lirc_serial_remove(struct platform_device *dev) +-{ +- return 0; +-} +- + static int lirc_serial_suspend(struct platform_device *dev, + pm_message_t state) + { +@@ -1188,10 +1190,6 @@ static int __init lirc_serial_init_modul + { + int result; + +- result = lirc_serial_init(); +- if (result) +- return result; +- + switch (type) { + case LIRC_HOMEBREW: + case LIRC_IRDEO: +@@ -1211,8 +1209,7 @@ static int __init lirc_serial_init_modul + break; + #endif + default: +- result = -EINVAL; +- goto exit_serial_exit; ++ return -EINVAL; + } + if (!softcarrier) { + switch (type) { +@@ -1228,37 +1225,26 @@ static int __init lirc_serial_init_modul + } + } + +- result = init_port(); +- if (result < 0) +- goto exit_serial_exit; ++ result = lirc_serial_init(); ++ if (result) ++ return result; ++ + driver.features = hardware[type].features; + driver.dev = &lirc_serial_dev->dev; + driver.minor = lirc_register_driver(&driver); + if (driver.minor < 0) { + printk(KERN_ERR LIRC_DRIVER_NAME + ": register_chrdev failed!\n"); +- result = -EIO; +- goto exit_release; ++ lirc_serial_exit(); ++ return -EIO; + } + return 0; +-exit_release: +- release_region(io, 8); +-exit_serial_exit: +- lirc_serial_exit(); +- return result; + } + + static void __exit lirc_serial_exit_module(void) + { +- lirc_serial_exit(); +- +- free_irq(irq, (void *)&hardware); +- +- if (iommap != 0) +- release_mem_region(iommap, 8 << ioshift); +- else +- release_region(io, 8); + lirc_unregister_driver(driver.minor); ++ lirc_serial_exit(); + dprintk("cleaned up module\n"); + } + diff --git a/queue-3.0/media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch b/queue-3.0/media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch new file mode 100644 index 00000000000..389613283b7 --- /dev/null +++ b/queue-3.0/media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch @@ -0,0 +1,59 @@ +From c8e57e1b766c2321aa76ee5e6878c69bd2313d62 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Wed, 16 Nov 2011 01:52:11 -0300 +Subject: media: staging: lirc_serial: Free resources on failure paths of lirc_serial_probe() + +From: Ben Hutchings + +commit c8e57e1b766c2321aa76ee5e6878c69bd2313d62 upstream. + +Failure to allocate the I/O region leaves the IRQ allocated. +A later failure leaves them both allocated. + +Reported-by: Torsten Crass +Signed-off-by: Ben Hutchings +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Jonathan Nieder +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/lirc/lirc_serial.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +--- a/drivers/staging/lirc/lirc_serial.c ++++ b/drivers/staging/lirc/lirc_serial.c +@@ -875,11 +875,14 @@ static int __devinit lirc_serial_probe(s + ": or compile the serial port driver as module and\n"); + printk(KERN_WARNING LIRC_DRIVER_NAME + ": make sure this module is loaded first\n"); +- return -EBUSY; ++ result = -EBUSY; ++ goto exit_free_irq; + } + +- if (hardware_init_port() < 0) +- return -EINVAL; ++ if (hardware_init_port() < 0) { ++ result = -EINVAL; ++ goto exit_release_region; ++ } + + /* Initialize pulse/space widths */ + init_timing_params(duty_cycle, freq); +@@ -911,6 +914,16 @@ static int __devinit lirc_serial_probe(s + + dprintk("Interrupt %d, port %04x obtained\n", irq, io); + return 0; ++ ++exit_release_region: ++ if (iommap != 0) ++ release_mem_region(iommap, 8 << ioshift); ++ else ++ release_region(io, 8); ++exit_free_irq: ++ free_irq(irq, (void *)&hardware); ++ ++ return result; + } + + static int __devexit lirc_serial_remove(struct platform_device *dev) diff --git a/queue-3.0/series b/queue-3.0/series index 14ad9fdb66f..520e4bb0e39 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -51,3 +51,7 @@ omap-4430sdp-panda-setup-hdmi-gpio-muxes.patch omap-4430sdp-panda-add-hdmi-hpd-gpio.patch omapdss-hdmi-phy-burnout-fix.patch arm-7345-1-errata-update-workaround-for-a9-erratum-743622.patch +media-staging-lirc_serial-fix-init-exit-order.patch +media-staging-lirc_serial-free-resources-on-failure-paths-of-lirc_serial_probe.patch +media-staging-lirc_serial-fix-deadlock-on-resume-failure.patch +media-staging-lirc_serial-do-not-assume-error-codes-returned-by-request_irq.patch -- 2.47.3