From: Greg Kroah-Hartman Date: Mon, 30 Oct 2006 23:10:17 +0000 (-0800) Subject: more patches for queue X-Git-Tag: v2.6.18.2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63fac8b9b3b080f3cebffa5baaf30afd4bf96c15;p=thirdparty%2Fkernel%2Fstable-queue.git more patches for queue --- diff --git a/queue-2.6.18/alsa-snd_rtctimer-handle-rtc-interrupts-with-a-tasklet.patch b/queue-2.6.18/alsa-snd_rtctimer-handle-rtc-interrupts-with-a-tasklet.patch new file mode 100644 index 00000000000..3202389faeb --- /dev/null +++ b/queue-2.6.18/alsa-snd_rtctimer-handle-rtc-interrupts-with-a-tasklet.patch @@ -0,0 +1,81 @@ +From stable-bounces@linux.kernel.org Fri Oct 27 05:18:49 2006 +Message-Id: <1161951335.22005.274364635@webmail.messagingengine.com> +From: "Clemens Ladisch" +To: stable@kernel.org +Content-Disposition: inline +MIME-Version: 1.0 +Date: Fri, 27 Oct 2006 14:15:35 +0200 +Subject: ALSA: snd_rtctimer: handle RTC interrupts with a tasklet +Content-Type: text/plain; charset="us-ascii" + +The calls to rtc_control() from inside the interrupt handler can +deadlock the RTC code, so move our interrupt handling code to a tasklet. + +Signed-off-by: Clemens Ladisch +Signed-off-by: Greg Kroah-Hartman + +--- + sound/core/rtctimer.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +--- linux-2.6.18.1.orig/sound/core/rtctimer.c ++++ linux-2.6.18.1/sound/core/rtctimer.c +@@ -50,7 +50,9 @@ static int rtctimer_stop(struct snd_time + * The hardware dependent description for this timer. + */ + static struct snd_timer_hardware rtc_hw = { +- .flags = SNDRV_TIMER_HW_FIRST|SNDRV_TIMER_HW_AUTO, ++ .flags = SNDRV_TIMER_HW_AUTO | ++ SNDRV_TIMER_HW_FIRST | ++ SNDRV_TIMER_HW_TASKLET, + .ticks = 100000000L, /* FIXME: XXX */ + .open = rtctimer_open, + .close = rtctimer_close, +@@ -60,6 +62,7 @@ static struct snd_timer_hardware rtc_hw + + static int rtctimer_freq = RTC_FREQ; /* frequency */ + static struct snd_timer *rtctimer; ++static struct tasklet_struct rtc_tasklet; + static rtc_task_t rtc_task; + + +@@ -81,6 +84,7 @@ rtctimer_close(struct snd_timer *t) + rtc_task_t *rtc = t->private_data; + if (rtc) { + rtc_unregister(rtc); ++ tasklet_kill(&rtc_tasklet); + t->private_data = NULL; + } + return 0; +@@ -105,12 +109,17 @@ rtctimer_stop(struct snd_timer *timer) + return 0; + } + ++static void rtctimer_tasklet(unsigned long data) ++{ ++ snd_timer_interrupt((struct snd_timer *)data, 1); ++} ++ + /* + * interrupt + */ + static void rtctimer_interrupt(void *private_data) + { +- snd_timer_interrupt(private_data, 1); ++ tasklet_hi_schedule(private_data); + } + + +@@ -139,9 +148,11 @@ static int __init rtctimer_init(void) + timer->hw = rtc_hw; + timer->hw.resolution = NANO_SEC / rtctimer_freq; + ++ tasklet_init(&rtc_tasklet, rtctimer_tasklet, (unsigned long)timer); ++ + /* set up RTC callback */ + rtc_task.func = rtctimer_interrupt; +- rtc_task.private_data = timer; ++ rtc_task.private_data = &rtc_tasklet; + + err = snd_timer_global_register(timer); + if (err < 0) { diff --git a/queue-2.6.18/fix-intel-rng-detection.patch b/queue-2.6.18/fix-intel-rng-detection.patch new file mode 100644 index 00000000000..1a6ad638f6d --- /dev/null +++ b/queue-2.6.18/fix-intel-rng-detection.patch @@ -0,0 +1,258 @@ +From stable-bounces@linux.kernel.org Sat Oct 21 09:24:17 2006 +Date: Sat, 21 Oct 2006 09:23:38 -0700 +From: Jan Beulich +To: stable@kernel.org +Message-Id: <20061021092338.5c4748a6.akpm@osdl.org> +Mime-Version: 1.0 +Cc: Jan Beulich , Metathronius Galabant +Subject: fix Intel RNG detection +Content-Type: text/plain; charset="us-ascii" + +From: Jan Beulich + +[PATCH] fix Intel RNG detection + +Previously, since determination whether there was an Intel random number +generator was based on a single bit, on systems with a matching bridge +device but without a firmware hub, there was a 50% chance that the code +would incorrectly decide that the system had an RNG. This patch adds +detection of the firmware hub to better qualify the existence of an RNG. + +There is one issue with the patch: I was unable to determine the LPC +equivalent for the PCI bridge 8086:2430 (since the old code didn't care +about which of the many devices provided by the ICH/ESB it was chose to use +the PCI bridge device, but the FWH settings live in the LPC device, so the +device list needed to be changed). + +Signed-off-by: Jan Beulich +Signed-off-by: Michael Buesch +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/hw_random/intel-rng.c | 186 +++++++++++++++++++++++++++++++++++-- + 1 file changed, 177 insertions(+), 9 deletions(-) + +--- linux-2.6.18.1.orig/drivers/char/hw_random/intel-rng.c ++++ linux-2.6.18.1/drivers/char/hw_random/intel-rng.c +@@ -50,6 +50,43 @@ + #define INTEL_RNG_ADDR_LEN 3 + + /* ++ * LPC bridge PCI config space registers ++ */ ++#define FWH_DEC_EN1_REG_OLD 0xe3 ++#define FWH_DEC_EN1_REG_NEW 0xd9 /* high byte of 16-bit register */ ++#define FWH_F8_EN_MASK 0x80 ++ ++#define BIOS_CNTL_REG_OLD 0x4e ++#define BIOS_CNTL_REG_NEW 0xdc ++#define BIOS_CNTL_WRITE_ENABLE_MASK 0x01 ++#define BIOS_CNTL_LOCK_ENABLE_MASK 0x02 ++ ++/* ++ * Magic address at which Intel Firmware Hubs get accessed ++ */ ++#define INTEL_FWH_ADDR 0xffff0000 ++#define INTEL_FWH_ADDR_LEN 2 ++ ++/* ++ * Intel Firmware Hub command codes (write to any address inside the device) ++ */ ++#define INTEL_FWH_RESET_CMD 0xff /* aka READ_ARRAY */ ++#define INTEL_FWH_READ_ID_CMD 0x90 ++ ++/* ++ * Intel Firmware Hub Read ID command result addresses ++ */ ++#define INTEL_FWH_MANUFACTURER_CODE_ADDRESS 0x000000 ++#define INTEL_FWH_DEVICE_CODE_ADDRESS 0x000001 ++ ++/* ++ * Intel Firmware Hub Read ID command result values ++ */ ++#define INTEL_FWH_MANUFACTURER_CODE 0x89 ++#define INTEL_FWH_DEVICE_CODE_8M 0xac ++#define INTEL_FWH_DEVICE_CODE_4M 0xad ++ ++/* + * Data for PCI driver interface + * + * This data only exists for exporting the supported +@@ -58,12 +95,50 @@ + * want to register another driver on the same PCI id. + */ + static const struct pci_device_id pci_tbl[] = { +- { 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +- { 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +- { 0x8086, 0x2430, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +- { 0x8086, 0x2448, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +- { 0x8086, 0x244e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +- { 0x8086, 0x245e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, ++/* AA ++ { 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++ { 0x8086, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* AA */ ++/* AB ++ { 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++ { 0x8086, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* AB */ ++/* ?? ++ { 0x8086, 0x2430, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++/* BAM, CAM, DBM, FBM, GxM ++ { 0x8086, 0x2448, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++ { 0x8086, 0x244c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* BAM */ ++ { 0x8086, 0x248c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CAM */ ++ { 0x8086, 0x24cc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* DBM */ ++ { 0x8086, 0x2641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* FBM */ ++ { 0x8086, 0x27b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* GxM */ ++ { 0x8086, 0x27bd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* GxM DH */ ++/* BA, CA, DB, Ex, 6300, Fx, 631x/632x, Gx ++ { 0x8086, 0x244e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++ { 0x8086, 0x2440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* BA */ ++ { 0x8086, 0x2480, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CA */ ++ { 0x8086, 0x24c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* DB */ ++ { 0x8086, 0x24d0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Ex */ ++ { 0x8086, 0x25a1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 6300 */ ++ { 0x8086, 0x2640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Fx */ ++ { 0x8086, 0x2670, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2671, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2672, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2673, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2674, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2675, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2676, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2677, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2678, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x2679, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x267f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */ ++ { 0x8086, 0x27b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Gx */ ++/* E ++ { 0x8086, 0x245e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */ ++ { 0x8086, 0x2450, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* E */ + { 0, }, /* terminate list */ + }; + MODULE_DEVICE_TABLE(pci, pci_tbl); +@@ -138,22 +213,115 @@ static struct hwrng intel_rng = { + }; + + ++#ifdef CONFIG_SMP ++static char __initdata waitflag; ++ ++static void __init intel_init_wait(void *unused) ++{ ++ while (waitflag) ++ cpu_relax(); ++} ++#endif ++ + static int __init mod_init(void) + { + int err = -ENODEV; ++ unsigned i; ++ struct pci_dev *dev = NULL; + void __iomem *mem; +- u8 hw_status; ++ unsigned long flags; ++ u8 bios_cntl_off, fwh_dec_en1_off; ++ u8 bios_cntl_val = 0xff, fwh_dec_en1_val = 0xff; ++ u8 hw_status, mfc, dvc; ++ ++ for (i = 0; !dev && pci_tbl[i].vendor; ++i) ++ dev = pci_get_device(pci_tbl[i].vendor, pci_tbl[i].device, NULL); + +- if (!pci_dev_present(pci_tbl)) ++ if (!dev) + goto out; /* Device not found. */ + ++ /* Check for Intel 82802 */ ++ if (dev->device < 0x2640) { ++ fwh_dec_en1_off = FWH_DEC_EN1_REG_OLD; ++ bios_cntl_off = BIOS_CNTL_REG_OLD; ++ } else { ++ fwh_dec_en1_off = FWH_DEC_EN1_REG_NEW; ++ bios_cntl_off = BIOS_CNTL_REG_NEW; ++ } ++ ++ pci_read_config_byte(dev, fwh_dec_en1_off, &fwh_dec_en1_val); ++ pci_read_config_byte(dev, bios_cntl_off, &bios_cntl_val); ++ ++ mem = ioremap_nocache(INTEL_FWH_ADDR, INTEL_FWH_ADDR_LEN); ++ if (mem == NULL) { ++ pci_dev_put(dev); ++ err = -EBUSY; ++ goto out; ++ } ++ ++ /* ++ * Since the BIOS code/data is going to disappear from its normal ++ * location with the Read ID command, all activity on the system ++ * must be stopped until the state is back to normal. ++ */ ++#ifdef CONFIG_SMP ++ set_mb(waitflag, 1); ++ if (smp_call_function(intel_init_wait, NULL, 1, 0) != 0) { ++ set_mb(waitflag, 0); ++ pci_dev_put(dev); ++ printk(KERN_ERR PFX "cannot run on all processors\n"); ++ err = -EAGAIN; ++ goto err_unmap; ++ } ++#endif ++ local_irq_save(flags); ++ ++ if (!(fwh_dec_en1_val & FWH_F8_EN_MASK)) ++ pci_write_config_byte(dev, ++ fwh_dec_en1_off, ++ fwh_dec_en1_val | FWH_F8_EN_MASK); ++ if (!(bios_cntl_val & ++ (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK))) ++ pci_write_config_byte(dev, ++ bios_cntl_off, ++ bios_cntl_val | BIOS_CNTL_WRITE_ENABLE_MASK); ++ ++ writeb(INTEL_FWH_RESET_CMD, mem); ++ writeb(INTEL_FWH_READ_ID_CMD, mem); ++ mfc = readb(mem + INTEL_FWH_MANUFACTURER_CODE_ADDRESS); ++ dvc = readb(mem + INTEL_FWH_DEVICE_CODE_ADDRESS); ++ writeb(INTEL_FWH_RESET_CMD, mem); ++ ++ if (!(bios_cntl_val & ++ (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK))) ++ pci_write_config_byte(dev, bios_cntl_off, bios_cntl_val); ++ if (!(fwh_dec_en1_val & FWH_F8_EN_MASK)) ++ pci_write_config_byte(dev, fwh_dec_en1_off, fwh_dec_en1_val); ++ ++ local_irq_restore(flags); ++#ifdef CONFIG_SMP ++ /* Tell other CPUs to resume. */ ++ set_mb(waitflag, 0); ++#endif ++ ++ iounmap(mem); ++ pci_dev_put(dev); ++ ++ if (mfc != INTEL_FWH_MANUFACTURER_CODE || ++ (dvc != INTEL_FWH_DEVICE_CODE_8M && ++ dvc != INTEL_FWH_DEVICE_CODE_4M)) { ++ printk(KERN_ERR PFX "FWH not detected\n"); ++ err = -ENODEV; ++ goto out; ++ } ++ + err = -ENOMEM; + mem = ioremap(INTEL_RNG_ADDR, INTEL_RNG_ADDR_LEN); + if (!mem) + goto out; + intel_rng.priv = (unsigned long)mem; + +- /* Check for Intel 82802 */ ++ /* Check for Random Number Generator */ + err = -ENODEV; + hw_status = hwstatus_get(mem); + if ((hw_status & INTEL_RNG_PRESENT) == 0) diff --git a/queue-2.6.18/series b/queue-2.6.18/series index 278e7ad92e9..85fb75e1645 100644 --- a/queue-2.6.18/series +++ b/queue-2.6.18/series @@ -39,3 +39,8 @@ audit-fix-missing-ifdefs-in-syscall-classes-hookup-for-generic-targets.patch net-fix-skb_segment-handling-of-fully-linear-skbs.patch sctp-always-linearise-packet-on-input.patch x86-64-fix-c3-timer-test.patch +uml-make-uml-compile-on-fc6-kernel-headers.patch +uml-remove-warnings-added-by-previous-stable-patch.patch +alsa-snd_rtctimer-handle-rtc-interrupts-with-a-tasklet.patch +watchdog-sc1200wdt-fix-missing-pnp_unregister_driver.patch +fix-intel-rng-detection.patch diff --git a/queue-2.6.18/uml-make-uml-compile-on-fc6-kernel-headers.patch b/queue-2.6.18/uml-make-uml-compile-on-fc6-kernel-headers.patch new file mode 100644 index 00000000000..b10258b5887 --- /dev/null +++ b/queue-2.6.18/uml-make-uml-compile-on-fc6-kernel-headers.patch @@ -0,0 +1,50 @@ +From stable-bounces@linux.kernel.org Tue Oct 17 12:49:35 2006 +From: Ulrich Drepper +To: stable@kernel.org +Date: Tue, 17 Oct 2006 17:01:13 +0200 +Message-Id: <11610972733507-git-send-email-blaisorblade@yahoo.it> +Cc: Andrew Morton , Jeff Dike , Ulrich Drepper +Subject: uml: make Uml compile on FC6 kernel headers +MIME-Version: 1.0 +Content-Type: text/plain; charset="us-ascii" + +From: Ulrich Drepper + +I need this patch to get a UML kernel to compile. This is with the kernel +headers in FC6 which are automatically generated from the kernel tree. +Some headers are missing but those files don't need them. At least it +appears so since the resulting kernel works fine. + +Tested on x86-64. + +Signed-off-by: Ulrich Drepper +Cc: Jeff Dike +Cc: Paolo 'Blaisorblade' Giarrusso +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman + +--- + arch/um/include/kern_util.h | 1 - + arch/um/sys-x86_64/stub_segv.c | 1 - + 2 files changed, 2 deletions(-) + +--- linux-2.6.18.1.orig/arch/um/include/kern_util.h ++++ linux-2.6.18.1/arch/um/include/kern_util.h +@@ -6,7 +6,6 @@ + #ifndef __KERN_UTIL_H__ + #define __KERN_UTIL_H__ + +-#include "linux/threads.h" + #include "sysdep/ptrace.h" + #include "sysdep/faultinfo.h" + +--- linux-2.6.18.1.orig/arch/um/sys-x86_64/stub_segv.c ++++ linux-2.6.18.1/arch/um/sys-x86_64/stub_segv.c +@@ -5,7 +5,6 @@ + + #include + #include +-#include + #include + #include "uml-config.h" + #include "sysdep/sigcontext.h" diff --git a/queue-2.6.18/uml-remove-warnings-added-by-previous-stable-patch.patch b/queue-2.6.18/uml-remove-warnings-added-by-previous-stable-patch.patch new file mode 100644 index 00000000000..8705279aa46 --- /dev/null +++ b/queue-2.6.18/uml-remove-warnings-added-by-previous-stable-patch.patch @@ -0,0 +1,44 @@ +From stable-bounces@linux.kernel.org Tue Oct 17 12:49:37 2006 +From: "Paolo 'Blaisorblade' Giarrusso" +To: stable@kernel.org +Date: Tue, 17 Oct 2006 17:05:31 +0200 +Message-Id: <11610975311236-git-send-email-blaisorblade@yahoo.it> +Cc: Jeff Dike , "Paolo 'Blaisorblade' Giarrusso" +Subject: uml: remove warnings added by previous -stable patch +MIME-Version: 1.0 +Content-Type: text/plain; charset="us-ascii" + +From: Paolo 'Blaisorblade' Giarrusso + +Add needed includes for syscall() function, also to remove warnings spit out by +GCC; they were added by previous -stable patch, and at least on my system +(Ubuntu x86-64) these warnings do show up. + +Signed-off-by: Paolo 'Blaisorblade' Giarrusso +Signed-off-by: Greg Kroah-Hartman + +--- + arch/um/os-Linux/sys-i386/tls.c | 2 ++ + arch/um/os-Linux/tls.c | 2 ++ + 2 files changed, 4 insertions(+) + +--- linux-2.6.18.1.orig/arch/um/os-Linux/sys-i386/tls.c ++++ linux-2.6.18.1/arch/um/os-Linux/sys-i386/tls.c +@@ -1,4 +1,6 @@ + #include ++#include ++#include + #include + #include "sysdep/tls.h" + #include "user_util.h" +--- linux-2.6.18.1.orig/arch/um/os-Linux/tls.c ++++ linux-2.6.18.1/arch/um/os-Linux/tls.c +@@ -1,6 +1,8 @@ + #include + #include ++#include + #include ++#include + #include "sysdep/tls.h" + #include "uml-config.h" + diff --git a/queue-2.6.18/watchdog-sc1200wdt-fix-missing-pnp_unregister_driver.patch b/queue-2.6.18/watchdog-sc1200wdt-fix-missing-pnp_unregister_driver.patch new file mode 100644 index 00000000000..2532288bd4e --- /dev/null +++ b/queue-2.6.18/watchdog-sc1200wdt-fix-missing-pnp_unregister_driver.patch @@ -0,0 +1,60 @@ +From stable-bounces@linux.kernel.org Sun Oct 29 13:50:07 2006 +Date: Sun, 29 Oct 2006 22:48:49 +0100 +From: Akinobu Mita +To: Linus Torvalds , Greg KH , stable@kernel.org +Message-ID: <20061029214849.GB4532@infomag.infomag.iguana.be> +Mime-Version: 1.0 +Content-Disposition: inline +Cc: Andrew Morton , Akinobu Mita +Subject: Watchdog: sc1200wdt - fix missing pnp_unregister_driver() +Content-Type: text/plain; charset="us-ascii" + +From: Akinobu Mita + +[WATCHDOG] sc1200wdt.c pnp unregister fix. + +If no devices found or invalid parameter is specified, +scl200wdt_pnp_driver is left unregistered. +It breaks global list of pnp drivers. + +Signed-off-by: Akinobu Mita +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/watchdog/sc1200wdt.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- linux-2.6.18.1.orig/drivers/char/watchdog/sc1200wdt.c ++++ linux-2.6.18.1/drivers/char/watchdog/sc1200wdt.c +@@ -392,7 +392,7 @@ static int __init sc1200wdt_init(void) + if (io == -1) { + printk(KERN_ERR PFX "io parameter must be specified\n"); + ret = -EINVAL; +- goto out_clean; ++ goto out_pnp; + } + + #if defined CONFIG_PNP +@@ -405,7 +405,7 @@ static int __init sc1200wdt_init(void) + if (!request_region(io, io_len, SC1200_MODULE_NAME)) { + printk(KERN_ERR PFX "Unable to register IO port %#x\n", io); + ret = -EBUSY; +- goto out_clean; ++ goto out_pnp; + } + + ret = sc1200wdt_probe(); +@@ -435,6 +435,11 @@ out_rbt: + out_io: + release_region(io, io_len); + ++out_pnp: ++#if defined CONFIG_PNP ++ if (isapnp) ++ pnp_unregister_driver(&scl200wdt_pnp_driver); ++#endif + goto out_clean; + } +