From: Greg Kroah-Hartman Date: Wed, 30 Sep 2009 22:36:11 +0000 (-0700) Subject: start the .31 queue X-Git-Tag: v2.6.27.36~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=62cfa3fdb85e1fcd47f519ae759d1bca3f67f74d;p=thirdparty%2Fkernel%2Fstable-queue.git start the .31 queue --- diff --git a/queue-2.6.31/acpi-pci_slot.ko-wants-a-64-bit-_sun.patch b/queue-2.6.31/acpi-pci_slot.ko-wants-a-64-bit-_sun.patch new file mode 100644 index 00000000000..19a3509efb6 --- /dev/null +++ b/queue-2.6.31/acpi-pci_slot.ko-wants-a-64-bit-_sun.patch @@ -0,0 +1,45 @@ +From 7e24bc1ce669b2876ffa475ea1147f2bb9ffdc52 Mon Sep 17 00:00:00 2001 +From: Alex Chiang +Date: Tue, 4 Aug 2009 14:44:17 -0600 +Subject: ACPI: pci_slot.ko wants a 64-bit _SUN + +From: Alex Chiang + +commit 7e24bc1ce669b2876ffa475ea1147f2bb9ffdc52 upstream. + +Similar to commit b6adc195 (PCI hotplug: acpiphp wants a 64-bit +_SUN), pci_slot.ko reads and creates sysfs directories based on +the _SUN method. + +Certain HP platforms return 64 bits in _SUN. This change to +pci_slot.ko allows us to see the correct sysfs directories. + +Reported-by: Chad Smith +Signed-off-by: Alex Chiang +Signed-off-by: Len Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/acpi/pci_slot.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/acpi/pci_slot.c ++++ b/drivers/acpi/pci_slot.c +@@ -57,7 +57,7 @@ ACPI_MODULE_NAME("pci_slot"); + MY_NAME , ## arg); \ + } while (0) + +-#define SLOT_NAME_SIZE 20 /* Inspired by #define in acpiphp.h */ ++#define SLOT_NAME_SIZE 21 /* Inspired by #define in acpiphp.h */ + + struct acpi_pci_slot { + acpi_handle root_handle; /* handle of the root bridge */ +@@ -149,7 +149,7 @@ register_slot(acpi_handle handle, u32 lv + return AE_OK; + } + +- snprintf(name, sizeof(name), "%u", (u32)sun); ++ snprintf(name, sizeof(name), "%llu", sun); + pci_slot = pci_create_slot(pci_bus, device, name, NULL); + if (IS_ERR(pci_slot)) { + err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot)); diff --git a/queue-2.6.31/agp-intel-fix-the-pre-9xx-chipset-flush.patch b/queue-2.6.31/agp-intel-fix-the-pre-9xx-chipset-flush.patch new file mode 100644 index 00000000000..65f0bb3dd14 --- /dev/null +++ b/queue-2.6.31/agp-intel-fix-the-pre-9xx-chipset-flush.patch @@ -0,0 +1,114 @@ +From e517a5e97080bbe52857bd0d7df9b66602d53c4d Mon Sep 17 00:00:00 2001 +From: Eric Anholt +Date: Thu, 10 Sep 2009 17:48:48 -0700 +Subject: agp/intel: Fix the pre-9xx chipset flush. + +From: Eric Anholt + +commit e517a5e97080bbe52857bd0d7df9b66602d53c4d upstream. + +Ever since we enabled GEM, the pre-9xx chipsets (particularly 865) have had +serious stability issues. Back in May a wbinvd was added to the DRM to +work around much of the problem. Some failure remained -- easily visible +by dragging a window around on an X -retro desktop, or by looking at bugzilla. + +The chipset flush was on the right track -- hitting the right amount of +memory, and it appears to be the only way to flush on these chipsets, but the +flush page was mapped uncached. As a result, the writes trying to clear the +writeback cache ended up bypassing the cache, and not flushing anything! The +wbinvd would flush out other writeback data and often cause the data we wanted +to get flushed, but not always. By removing the setting of the page to UC +and instead just clflushing the data we write to try to flush it, we get the +desired behavior with no wbinvd. + +This exports clflush_cache_range(), which was laying around and happened to +basically match the code I was otherwise going to copy from the DRM. + +Signed-off-by: Eric Anholt +Signed-off-by: Brice Goglin +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/mm/pageattr.c | 1 + + drivers/char/agp/intel-agp.c | 30 +++++++++++++++++++++++------- + drivers/gpu/drm/i915/i915_gem.c | 10 ---------- + 3 files changed, 24 insertions(+), 17 deletions(-) + +--- a/arch/x86/mm/pageattr.c ++++ b/arch/x86/mm/pageattr.c +@@ -143,6 +143,7 @@ void clflush_cache_range(void *vaddr, un + + mb(); + } ++EXPORT_SYMBOL_GPL(clflush_cache_range); + + static void __cpa_flush_all(void *arg) + { +--- a/drivers/char/agp/intel-agp.c ++++ b/drivers/char/agp/intel-agp.c +@@ -679,23 +679,39 @@ static void intel_i830_setup_flush(void) + if (!intel_private.i8xx_page) + return; + +- /* make page uncached */ +- map_page_into_agp(intel_private.i8xx_page); +- + intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); + if (!intel_private.i8xx_flush_page) + intel_i830_fini_flush(); + } + ++static void ++do_wbinvd(void *null) ++{ ++ wbinvd(); ++} ++ ++/* The chipset_flush interface needs to get data that has already been ++ * flushed out of the CPU all the way out to main memory, because the GPU ++ * doesn't snoop those buffers. ++ * ++ * The 8xx series doesn't have the same lovely interface for flushing the ++ * chipset write buffers that the later chips do. According to the 865 ++ * specs, it's 64 octwords, or 1KB. So, to get those previous things in ++ * that buffer out, we just fill 1KB and clflush it out, on the assumption ++ * that it'll push whatever was in there out. It appears to work. ++ */ + static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) + { + unsigned int *pg = intel_private.i8xx_flush_page; +- int i; + +- for (i = 0; i < 256; i += 2) +- *(pg + i) = i; ++ memset(pg, 0, 1024); + +- wmb(); ++ if (cpu_has_clflush) { ++ clflush_cache_range(pg, 1024); ++ } else { ++ if (on_each_cpu(do_wbinvd, NULL, 1) != 0) ++ printk(KERN_ERR "Timed out waiting for cache flush.\n"); ++ } + } + + /* The intel i830 automatically initializes the agp aperture during POST. +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -2505,16 +2505,6 @@ i915_gem_clflush_object(struct drm_gem_o + if (obj_priv->pages == NULL) + return; + +- /* XXX: The 865 in particular appears to be weird in how it handles +- * cache flushing. We haven't figured it out, but the +- * clflush+agp_chipset_flush doesn't appear to successfully get the +- * data visible to the PGU, while wbinvd + agp_chipset_flush does. +- */ +- if (IS_I865G(obj->dev)) { +- wbinvd(); +- return; +- } +- + drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); + } + diff --git a/queue-2.6.31/alpha-agp-update.patch b/queue-2.6.31/alpha-agp-update.patch new file mode 100644 index 00000000000..0c43aef479f --- /dev/null +++ b/queue-2.6.31/alpha-agp-update.patch @@ -0,0 +1,82 @@ +From d68721eb339e9237c11c1fea5f73f86211d14918 Mon Sep 17 00:00:00 2001 +From: Ivan Kokshaysky +Date: Wed, 23 Sep 2009 15:57:42 -0700 +Subject: alpha: AGP update (fixes compile failure) + +From: Ivan Kokshaysky + +commit d68721eb339e9237c11c1fea5f73f86211d14918 upstream. + +This brings Alpha AGP platforms in sync with the change to struct +agp_memory (unsigned long *memory => struct page **pages). + +Only compile tested (I don't have titan/marvel hardware), but this change +looks pretty straightforward, so hopefully it's ok. + +Signed-off-by: Ivan Kokshaysky +Cc: Richard Henderson +Cc: Dave Airlie +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + arch/alpha/kernel/core_marvel.c | 2 +- + arch/alpha/kernel/core_titan.c | 2 +- + arch/alpha/kernel/pci_impl.h | 2 +- + arch/alpha/kernel/pci_iommu.c | 4 ++-- + 4 files changed, 5 insertions(+), 5 deletions(-) + +--- a/arch/alpha/kernel/core_marvel.c ++++ b/arch/alpha/kernel/core_marvel.c +@@ -1016,7 +1016,7 @@ marvel_agp_bind_memory(alpha_agp_info *a + { + struct marvel_agp_aperture *aper = agp->aperture.sysdata; + return iommu_bind(aper->arena, aper->pg_start + pg_start, +- mem->page_count, mem->memory); ++ mem->page_count, mem->pages); + } + + static int +--- a/arch/alpha/kernel/core_titan.c ++++ b/arch/alpha/kernel/core_titan.c +@@ -680,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *ag + { + struct titan_agp_aperture *aper = agp->aperture.sysdata; + return iommu_bind(aper->arena, aper->pg_start + pg_start, +- mem->page_count, mem->memory); ++ mem->page_count, mem->pages); + } + + static int +--- a/arch/alpha/kernel/pci_impl.h ++++ b/arch/alpha/kernel/pci_impl.h +@@ -198,7 +198,7 @@ extern unsigned long size_for_memory(uns + + extern int iommu_reserve(struct pci_iommu_arena *, long, long); + extern int iommu_release(struct pci_iommu_arena *, long, long); +-extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *); ++extern int iommu_bind(struct pci_iommu_arena *, long, long, struct page **); + extern int iommu_unbind(struct pci_iommu_arena *, long, long); + + +--- a/arch/alpha/kernel/pci_iommu.c ++++ b/arch/alpha/kernel/pci_iommu.c +@@ -880,7 +880,7 @@ iommu_release(struct pci_iommu_arena *ar + + int + iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, +- unsigned long *physaddrs) ++ struct page **pages) + { + unsigned long flags; + unsigned long *ptes; +@@ -900,7 +900,7 @@ iommu_bind(struct pci_iommu_arena *arena + } + + for(i = 0, j = pg_start; i < pg_count; i++, j++) +- ptes[j] = mk_iommu_pte(physaddrs[i]); ++ ptes[j] = mk_iommu_pte(page_to_phys(pages[i])); + + spin_unlock_irqrestore(&arena->lock, flags); + diff --git a/queue-2.6.31/ar9170usb-add-usbid-for-tp-link-tl-wn821n-v2.patch b/queue-2.6.31/ar9170usb-add-usbid-for-tp-link-tl-wn821n-v2.patch new file mode 100644 index 00000000000..9b49702ccb3 --- /dev/null +++ b/queue-2.6.31/ar9170usb-add-usbid-for-tp-link-tl-wn821n-v2.patch @@ -0,0 +1,31 @@ +From fe9f6342c86292aee1941447f22dc5470735e5a1 Mon Sep 17 00:00:00 2001 +From: Christian Lamparter +Date: Thu, 17 Sep 2009 13:46:53 +0200 +Subject: ar9170usb: add usbid for TP-Link TL-WN821N v2 + +From: Christian Lamparter + +commit fe9f6342c86292aee1941447f22dc5470735e5a1 upstream. + +This patch adds the usbid for TP-Link TL-WN821N v2. + +Reported-by: Fabian Lenz +Signed-off-by: Christian Lamparter +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ar9170/usb.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/net/wireless/ath/ar9170/usb.c ++++ b/drivers/net/wireless/ath/ar9170/usb.c +@@ -64,6 +64,8 @@ static struct usb_device_id ar9170_usb_i + { USB_DEVICE(0x0cf3, 0x9170) }, + /* Atheros TG121N */ + { USB_DEVICE(0x0cf3, 0x1001) }, ++ /* TP-Link TL-WN821N v2 */ ++ { USB_DEVICE(0x0cf3, 0x1002) }, + /* Cace Airpcap NX */ + { USB_DEVICE(0xcace, 0x0300) }, + /* D-Link DWA 160A */ diff --git a/queue-2.6.31/can-fix-nohz-local_softirq_pending-08-warning.patch b/queue-2.6.31/can-fix-nohz-local_softirq_pending-08-warning.patch new file mode 100644 index 00000000000..4618bf937fc --- /dev/null +++ b/queue-2.6.31/can-fix-nohz-local_softirq_pending-08-warning.patch @@ -0,0 +1,63 @@ +From 481a8199142c050b72bff8a1956a49fd0a75bbe0 Mon Sep 17 00:00:00 2001 +From: Oliver Hartkopp +Date: Tue, 15 Sep 2009 01:31:34 -0700 +Subject: can: fix NOHZ local_softirq_pending 08 warning + +From: Oliver Hartkopp + +commit 481a8199142c050b72bff8a1956a49fd0a75bbe0 upstream. + +When using nanosleep() in an userspace application we get a ratelimit warning + +NOHZ: local_softirq_pending 08 + +for 10 times. + +The echo of CAN frames is done from process context and softirq context only. +Therefore the usage of netif_rx() was wrong (for years). + +This patch replaces netif_rx() with netif_rx_ni() which has to be used from +process/softirq context. It also adds a missing comment that can_send() must +no be used from hardirq context. + +Signed-off-by: Oliver Hartkopp +Signed-off-by: Urs Thuermann +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/vcan.c | 2 +- + net/can/af_can.c | 4 +++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/can/vcan.c ++++ b/drivers/net/can/vcan.c +@@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, + skb->dev = dev; + skb->ip_summed = CHECKSUM_UNNECESSARY; + +- netif_rx(skb); ++ netif_rx_ni(skb); + } + + static int vcan_tx(struct sk_buff *skb, struct net_device *dev) +--- a/net/can/af_can.c ++++ b/net/can/af_can.c +@@ -199,6 +199,8 @@ static int can_create(struct net *net, s + * @skb: pointer to socket buffer with CAN frame in data section + * @loop: loopback for listeners on local CAN sockets (recommended default!) + * ++ * Due to the loopback this routine must not be called from hardirq context. ++ * + * Return: + * 0 on success + * -ENETDOWN when the selected interface is down +@@ -278,7 +280,7 @@ int can_send(struct sk_buff *skb, int lo + } + + if (newskb) +- netif_rx(newskb); ++ netif_rx_ni(newskb); + + /* update statistics */ + can_stats.tx_frames++; diff --git a/queue-2.6.31/cdc_acm-fix-to-use-modern-speed-interfaces.patch b/queue-2.6.31/cdc_acm-fix-to-use-modern-speed-interfaces.patch new file mode 100644 index 00000000000..64dcc109630 --- /dev/null +++ b/queue-2.6.31/cdc_acm-fix-to-use-modern-speed-interfaces.patch @@ -0,0 +1,32 @@ +From 9b80fee149a875a6292b2556ab2c64dc7ab7d6f5 Mon Sep 17 00:00:00 2001 +From: Alan Cox +Date: Sat, 19 Sep 2009 13:13:23 -0700 +Subject: cdc_acm: Fix to use modern speed interfaces + +From: Alan Cox + +commit 9b80fee149a875a6292b2556ab2c64dc7ab7d6f5 upstream. + +This changed in 2006 so its about time the ACM driver caught up + +Signed-off-by: Alan Cox +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-acm.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -860,10 +860,7 @@ static void acm_tty_set_termios(struct t + if (!ACM_READY(acm)) + return; + +- /* FIXME: Needs to support the tty_baud interface */ +- /* FIXME: Broken on sparc */ +- newline.dwDTERate = cpu_to_le32p(acm_tty_speed + +- (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0)); ++ newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty)); + newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0; + newline.bParityType = termios->c_cflag & PARENB ? + (termios->c_cflag & PARODD ? 1 : 2) + diff --git a/queue-2.6.31/drivers-mfd-ab3100-core.c-fix-powerpc-build-error.patch b/queue-2.6.31/drivers-mfd-ab3100-core.c-fix-powerpc-build-error.patch new file mode 100644 index 00000000000..7228288b03e --- /dev/null +++ b/queue-2.6.31/drivers-mfd-ab3100-core.c-fix-powerpc-build-error.patch @@ -0,0 +1,33 @@ +From 00d3803b656a5f0935518d746f6bb27d5181d29d Mon Sep 17 00:00:00 2001 +From: Andrew Morton +Date: Mon, 21 Sep 2009 17:01:07 -0700 +Subject: drivers/mfd/ab3100-core.c: fix powerpc build error + +From: Andrew Morton + +commit 00d3803b656a5f0935518d746f6bb27d5181d29d upstream. + +drivers/mfd/ab3100-core.c:647: error: ab3100_init_settings causes a section type conflict + +Cc: Anton Vorontsov +Cc: Samuel Ortiz +Cc: Benjamin Herrenschmidt +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mfd/ab3100-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/mfd/ab3100-core.c ++++ b/drivers/mfd/ab3100-core.c +@@ -643,7 +643,7 @@ struct ab3100_init_setting { + u8 setting; + }; + +-static const struct ab3100_init_setting __initdata ++static const struct ab3100_init_setting __initconst + ab3100_init_settings[] = { + { + .abreg = AB3100_MCA, diff --git a/queue-2.6.31/drm-i915-add-buffer-to-inactive-list-immediately-during-fault.patch b/queue-2.6.31/drm-i915-add-buffer-to-inactive-list-immediately-during-fault.patch new file mode 100644 index 00000000000..1048b93bf0a --- /dev/null +++ b/queue-2.6.31/drm-i915-add-buffer-to-inactive-list-immediately-during-fault.patch @@ -0,0 +1,38 @@ +From 4960aaca14010b9ff92e5726dd178cbd6805d412 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Mon, 14 Sep 2009 16:50:25 +0100 +Subject: drm/i915: Add buffer to inactive list immediately during fault + +From: Chris Wilson + +commit 4960aaca14010b9ff92e5726dd178cbd6805d412 upstream. + +If we failed to set the domain, the buffer was no longer being tracked +on any list. + +Signed-off-by: Chris Wilson +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -1155,14 +1155,13 @@ int i915_gem_fault(struct vm_area_struct + mutex_unlock(&dev->struct_mutex); + return VM_FAULT_SIGBUS; + } ++ list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); + + ret = i915_gem_object_set_to_gtt_domain(obj, write); + if (ret) { + mutex_unlock(&dev->struct_mutex); + return VM_FAULT_SIGBUS; + } +- +- list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); + } + + /* Need a new fence register? */ diff --git a/queue-2.6.31/drm-i915-check-that-the-relocation-points-to-within-the-target.patch b/queue-2.6.31/drm-i915-check-that-the-relocation-points-to-within-the-target.patch new file mode 100644 index 00000000000..30312c5a251 --- /dev/null +++ b/queue-2.6.31/drm-i915-check-that-the-relocation-points-to-within-the-target.patch @@ -0,0 +1,42 @@ +From cd0b9fb400ba775737bdc3874c4cbee4047e66d8 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Tue, 15 Sep 2009 23:23:18 +0100 +Subject: drm/i915: Check that the relocation points to within the target + +From: Chris Wilson + +commit cd0b9fb400ba775737bdc3874c4cbee4047e66d8 upstream. + +Eric noted a potential concern with the low bits not being strictly used +as part of the absolute offset (instead part of the command stream to the +GPU), but in practice that should not be an issue. + +Signed-off-by: Chris Wilson +Tested-by: Andy Whitcroft +Cc: Eric Anholt +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -3006,6 +3006,16 @@ i915_gem_object_pin_and_relocate(struct + return -EINVAL; + } + ++ if (reloc->delta >= target_obj->size) { ++ DRM_ERROR("Relocation beyond target object bounds: " ++ "obj %p target %d delta %d size %d.\n", ++ obj, reloc->target_handle, ++ (int) reloc->delta, (int) target_obj->size); ++ drm_gem_object_unreference(target_obj); ++ i915_gem_object_unpin(obj); ++ return -EINVAL; ++ } ++ + if (reloc->write_domain & I915_GEM_DOMAIN_CPU || + reloc->read_domains & I915_GEM_DOMAIN_CPU) { + DRM_ERROR("reloc with read/write CPU domains: " diff --git a/queue-2.6.31/drm-i915-fix-lvds-panel-fitting-on-arrandale.patch b/queue-2.6.31/drm-i915-fix-lvds-panel-fitting-on-arrandale.patch new file mode 100644 index 00000000000..d505aa9841a --- /dev/null +++ b/queue-2.6.31/drm-i915-fix-lvds-panel-fitting-on-arrandale.patch @@ -0,0 +1,98 @@ +From 8dd81a381e8886129c0923f1fe22ff5ca36ae8da Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Sat, 19 Sep 2009 14:54:09 +0800 +Subject: drm/i915: Fix LVDS panel fitting on Arrandale + +From: Zhenyu Wang + +commit 8dd81a381e8886129c0923f1fe22ff5ca36ae8da upstream. + +Arrandale has new window based method for panel fitting. +This one enables full screen aspect scaling on LVDS. It fixes +standard mode display failure on LVDS for Arrandale. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_reg.h | 2 ++ + drivers/gpu/drm/i915/intel_display.c | 14 ++++++++++++++ + drivers/gpu/drm/i915/intel_lvds.c | 11 ++++++++--- + 3 files changed, 24 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -1867,6 +1867,8 @@ + #define PF_ENABLE (1<<31) + #define PFA_WIN_SZ 0x68074 + #define PFB_WIN_SZ 0x68874 ++#define PFA_WIN_POS 0x68070 ++#define PFB_WIN_POS 0x68870 + + /* legacy palette */ + #define LGC_PALETTE_A 0x4a000 +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -1154,6 +1154,7 @@ static void igdng_crtc_dpms(struct drm_c + int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; + int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; + int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; ++ int pf_win_pos = (pipe == 0) ? PFA_WIN_POS : PFB_WIN_POS; + int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; + int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; + int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; +@@ -1205,6 +1206,19 @@ static void igdng_crtc_dpms(struct drm_c + } + } + ++ /* Enable panel fitting for LVDS */ ++ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { ++ temp = I915_READ(pf_ctl_reg); ++ I915_WRITE(pf_ctl_reg, temp | PF_ENABLE); ++ ++ /* currently full aspect */ ++ I915_WRITE(pf_win_pos, 0); ++ ++ I915_WRITE(pf_win_size, ++ (dev_priv->panel_fixed_mode->hdisplay << 16) | ++ (dev_priv->panel_fixed_mode->vdisplay)); ++ } ++ + /* Enable CPU pipe */ + temp = I915_READ(pipeconf_reg); + if ((temp & PIPEACONF_ENABLE) == 0) { +--- a/drivers/gpu/drm/i915/intel_lvds.c ++++ b/drivers/gpu/drm/i915/intel_lvds.c +@@ -305,6 +305,10 @@ static bool intel_lvds_mode_fixup(struct + goto out; + } + ++ /* full screen scale for now */ ++ if (IS_IGDNG(dev)) ++ goto out; ++ + /* 965+ wants fuzzy fitting */ + if (IS_I965G(dev)) + pfit_control |= (intel_crtc->pipe << PFIT_PIPE_SHIFT) | +@@ -332,8 +336,10 @@ static bool intel_lvds_mode_fixup(struct + * to register description and PRM. + * Change the value here to see the borders for debugging + */ +- I915_WRITE(BCLRPAT_A, 0); +- I915_WRITE(BCLRPAT_B, 0); ++ if (!IS_IGDNG(dev)) { ++ I915_WRITE(BCLRPAT_A, 0); ++ I915_WRITE(BCLRPAT_B, 0); ++ } + + switch (lvds_priv->fitting_mode) { + case DRM_MODE_SCALE_NO_SCALE: +@@ -582,7 +588,6 @@ static void intel_lvds_mode_set(struct d + * settings. + */ + +- /* No panel fitting yet, fixme */ + if (IS_IGDNG(dev)) + return; + diff --git a/queue-2.6.31/drm-i915-fix-ssc-frequence-for-igdng.patch b/queue-2.6.31/drm-i915-fix-ssc-frequence-for-igdng.patch new file mode 100644 index 00000000000..f10d15bdab9 --- /dev/null +++ b/queue-2.6.31/drm-i915-fix-ssc-frequence-for-igdng.patch @@ -0,0 +1,32 @@ +From 339e5a4c78041cd7b473ddf0a81eb06a131127bb Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Sat, 19 Sep 2009 14:54:07 +0800 +Subject: drm/i915: Fix SSC frequence for IGDNG + +From: Zhenyu Wang + +commit 339e5a4c78041cd7b473ddf0a81eb06a131127bb upstream. + +IGDNG LVDS SSC uses 120Mhz freq. This fixes one +1600x900 LVDS panel black issue on IGDNG with SSC enabled. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_bios.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/i915/intel_bios.c ++++ b/drivers/gpu/drm/i915/intel_bios.c +@@ -217,6 +217,9 @@ parse_general_features(struct drm_i915_p + if (IS_I85X(dev_priv->dev)) + dev_priv->lvds_ssc_freq = + general->ssc_freq ? 66 : 48; ++ else if (IS_IGDNG(dev_priv->dev)) ++ dev_priv->lvds_ssc_freq = ++ general->ssc_freq ? 100 : 120; + else + dev_priv->lvds_ssc_freq = + general->ssc_freq ? 100 : 96; diff --git a/queue-2.6.31/drm-i915-fix-tiling-on-igdng.patch b/queue-2.6.31/drm-i915-fix-tiling-on-igdng.patch new file mode 100644 index 00000000000..30ad784a8ee --- /dev/null +++ b/queue-2.6.31/drm-i915-fix-tiling-on-igdng.patch @@ -0,0 +1,104 @@ +From 553bd149bb2de7848b2b84642876f27202421368 Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Wed, 2 Sep 2009 10:57:52 +0800 +Subject: drm/i915: fix tiling on IGDNG + +From: Zhenyu Wang + +commit 553bd149bb2de7848b2b84642876f27202421368 upstream. + +It seems that on IGDNG the same swizzling setup always applys. +And front buffer tiling needs to set address swizzle in display +arb control too. + +Fix plane tricle feed setting in v1 which should be disable bit, +and always setup address swizzle to let hardware care for buffer +tiling in all cases. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Eric Anholt +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem_tiling.c | 15 +++++++-------- + drivers/gpu/drm/i915/i915_reg.h | 4 ++++ + drivers/gpu/drm/i915/intel_display.c | 10 ++++++++++ + 3 files changed, 21 insertions(+), 8 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_gem_tiling.c ++++ b/drivers/gpu/drm/i915/i915_gem_tiling.c +@@ -234,7 +234,13 @@ i915_gem_detect_bit_6_swizzle(struct drm + uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; + bool need_disable; + +- if (!IS_I9XX(dev)) { ++ if (IS_IGDNG(dev)) { ++ /* On IGDNG whatever DRAM config, GPU always do ++ * same swizzling setup. ++ */ ++ swizzle_x = I915_BIT_6_SWIZZLE_9_10; ++ swizzle_y = I915_BIT_6_SWIZZLE_9; ++ } else if (!IS_I9XX(dev)) { + /* As far as we know, the 865 doesn't have these bit 6 + * swizzling issues. + */ +@@ -317,13 +323,6 @@ i915_gem_detect_bit_6_swizzle(struct drm + } + } + +- /* FIXME: check with memory config on IGDNG */ +- if (IS_IGDNG(dev)) { +- DRM_ERROR("disable tiling on IGDNG...\n"); +- swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; +- swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; +- } +- + dev_priv->mm.bit_6_swizzle_x = swizzle_x; + dev_priv->mm.bit_6_swizzle_y = swizzle_y; + } +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -1733,6 +1733,7 @@ + #define DISPPLANE_NO_LINE_DOUBLE 0 + #define DISPPLANE_STEREO_POLARITY_FIRST 0 + #define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) ++#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* IGDNG */ + #define DISPPLANE_TILED (1<<10) + #define DSPAADDR 0x70184 + #define DSPASTRIDE 0x70188 +@@ -1915,6 +1916,9 @@ + #define GTIIR 0x44018 + #define GTIER 0x4401c + ++#define DISP_ARB_CTL 0x45000 ++#define DISP_TILE_SURFACE_SWIZZLING (1<<13) ++ + /* PCH */ + + /* south display engine interrupt */ +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -1008,6 +1008,10 @@ intel_pipe_set_base(struct drm_crtc *crt + dspcntr &= ~DISPPLANE_TILED; + } + ++ if (IS_IGDNG(dev)) ++ /* must disable */ ++ dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; ++ + I915_WRITE(dspcntr_reg, dspcntr); + + Start = obj_priv->gtt_offset; +@@ -2637,6 +2641,12 @@ static int intel_crtc_mode_set(struct dr + + intel_wait_for_vblank(dev); + ++ if (IS_IGDNG(dev)) { ++ /* enable address swizzle for tiling buffer */ ++ temp = I915_READ(DISP_ARB_CTL); ++ I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING); ++ } ++ + I915_WRITE(dspcntr_reg, dspcntr); + + /* Flush the plane changes */ diff --git a/queue-2.6.31/drm-i915-fix-typo-for-wrong-lvds-clock-setting-on-igdng.patch b/queue-2.6.31/drm-i915-fix-typo-for-wrong-lvds-clock-setting-on-igdng.patch new file mode 100644 index 00000000000..b1df5f5450f --- /dev/null +++ b/queue-2.6.31/drm-i915-fix-typo-for-wrong-lvds-clock-setting-on-igdng.patch @@ -0,0 +1,32 @@ +From b09aea7fb38f328c02e9f9b79617cabed02455e4 Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Sat, 19 Sep 2009 14:54:06 +0800 +Subject: drm/i915: Fix typo for wrong LVDS clock setting on IGDNG + +From: Zhenyu Wang + +commit b09aea7fb38f328c02e9f9b79617cabed02455e4 upstream. + +New register for PCH LVDS on IGDNG should be used. +This is a copy-n-paste typo. This fixes possible dual +channel LVDS panel failure on IGDNG. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -818,7 +818,7 @@ intel_igdng_find_best_PLL(const intel_li + refclk, best_clock); + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { +- if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == ++ if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == + LVDS_CLKB_POWER_UP) + clock.p2 = limit->p2.p2_fast; + else diff --git a/queue-2.6.31/drm-i915-only-destroy-a-constructed-mmap-offset.patch b/queue-2.6.31/drm-i915-only-destroy-a-constructed-mmap-offset.patch new file mode 100644 index 00000000000..d47283e312c --- /dev/null +++ b/queue-2.6.31/drm-i915-only-destroy-a-constructed-mmap-offset.patch @@ -0,0 +1,40 @@ +From 7e61615857c6fb3afbcb43f5c4e97511a923f5a8 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Thu, 10 Sep 2009 08:53:04 +0100 +Subject: drm/i915: Only destroy a constructed mmap offset + +From: Chris Wilson + +commit 7e61615857c6fb3afbcb43f5c4e97511a923f5a8 upstream. + +drm_ht_remove_item() does not handle removing an absent item and the hlist +in particular is incorrectly initialised. The easy remedy is simply skip +calling i915_gem_free_mmap_offset() unless we have actually created the +offset and associated ht entry. + +This also fixes the mishandling of a partially constructed offset which +leaves pointers initialized after freeing them along the +i915_gem_create_mmap_offset() error paths. + +In particular this should fix the oops found here: +https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/415357/comments/8 + +Signed-off-by: Chris Wilson +Signed-off-by: Eric Anholt + +--- + drivers/gpu/drm/i915/i915_gem.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -3837,7 +3837,8 @@ void i915_gem_free_object(struct drm_gem + + i915_gem_object_unbind(obj); + +- i915_gem_free_mmap_offset(obj); ++ if (obj_priv->mmap_offset) ++ i915_gem_free_mmap_offset(obj); + + kfree(obj_priv->page_cpu_valid); + kfree(obj_priv->bit_17); diff --git a/queue-2.6.31/drm-i915-prevent-fifo-calculation-overflows-on-32-bits-with-high-dotclocks.patch b/queue-2.6.31/drm-i915-prevent-fifo-calculation-overflows-on-32-bits-with-high-dotclocks.patch new file mode 100644 index 00000000000..7043e0e6ab6 --- /dev/null +++ b/queue-2.6.31/drm-i915-prevent-fifo-calculation-overflows-on-32-bits-with-high-dotclocks.patch @@ -0,0 +1,41 @@ +From d660467c3ff2a0b7413e1b7a51452b34ffb49e5f Mon Sep 17 00:00:00 2001 +From: Jesse Barnes +Date: Fri, 11 Sep 2009 12:25:56 -0700 +Subject: drm/i915: prevent FIFO calculation overflows on 32 bits with high dotclocks + +From: Jesse Barnes + +commit d660467c3ff2a0b7413e1b7a51452b34ffb49e5f upstream. + +A very high dotclock (e.g. 229500kHz as reported by Anton) can cause +the entries_required variable to overflow, potentially leading to a +FIFO watermark value that's too low to support the given mode. Split +the division across the calculation to avoid this. + +Reported-by: Anton Khirnov +Tested-by: Anton Khirnov +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -1858,7 +1858,14 @@ static unsigned long intel_calculate_wm( + { + long entries_required, wm_size; + +- entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; ++ /* ++ * Note: we need to make sure we don't overflow for various clock & ++ * latency values. ++ * clocks go from a few thousand to several hundred thousand. ++ * latency is usually a few thousand ++ */ ++ entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) / ++ 1000; + entries_required /= wm->cacheline_size; + + DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); diff --git a/queue-2.6.31/drm-i915-remove-dac-disable-in-crt-force-detect-on-igdng.patch b/queue-2.6.31/drm-i915-remove-dac-disable-in-crt-force-detect-on-igdng.patch new file mode 100644 index 00000000000..097db7bb2c8 --- /dev/null +++ b/queue-2.6.31/drm-i915-remove-dac-disable-in-crt-force-detect-on-igdng.patch @@ -0,0 +1,48 @@ +From 730915d65f9e763de9dc26c5f1b8abaae775b243 Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Sat, 19 Sep 2009 14:54:08 +0800 +Subject: drm/i915: Remove DAC disable in CRT force detect on IGDNG + +From: Zhenyu Wang + +commit 730915d65f9e763de9dc26c5f1b8abaae775b243 upstream. + +This is not required on newer stepping hardware to get +reliable force detect status. Removing this fixes screen +blank flicker in CRT detect on IGDNG. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_crt.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_crt.c ++++ b/drivers/gpu/drm/i915/intel_crt.c +@@ -151,13 +151,10 @@ static bool intel_igdng_crt_detect_hotpl + { + struct drm_device *dev = connector->dev; + struct drm_i915_private *dev_priv = dev->dev_private; +- u32 adpa, temp; ++ u32 adpa; + bool ret; + +- temp = adpa = I915_READ(PCH_ADPA); +- +- adpa &= ~ADPA_DAC_ENABLE; +- I915_WRITE(PCH_ADPA, adpa); ++ adpa = I915_READ(PCH_ADPA); + + adpa &= ~ADPA_CRT_HOTPLUG_MASK; + +@@ -184,8 +181,6 @@ static bool intel_igdng_crt_detect_hotpl + else + ret = false; + +- /* restore origin register */ +- I915_WRITE(PCH_ADPA, temp); + return ret; + } + diff --git a/queue-2.6.31/drm-i915-remove-restore-in-resume.patch b/queue-2.6.31/drm-i915-remove-restore-in-resume.patch new file mode 100644 index 00000000000..d96ef52856c --- /dev/null +++ b/queue-2.6.31/drm-i915-remove-restore-in-resume.patch @@ -0,0 +1,33 @@ +From b7e53aba2f0e6abf23e3f07b38b241145c33a005 Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Mon, 14 Sep 2009 10:47:07 +0800 +Subject: drm/i915: remove restore in resume + +From: Zhenyu Wang + +commit b7e53aba2f0e6abf23e3f07b38b241145c33a005 upstream. + +Don't need extra config restore like for intel_agp, which +might cause resume hang issue found by Alan on 845G. + +Cc: Stable Team +Cc: Alan Stern +Signed-off-by: Zhenyu Wang +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_drv.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_drv.c ++++ b/drivers/gpu/drm/i915/i915_drv.c +@@ -94,8 +94,6 @@ static int i915_resume(struct drm_device + struct drm_i915_private *dev_priv = dev->dev_private; + int ret = 0; + +- pci_set_power_state(dev->pdev, PCI_D0); +- pci_restore_state(dev->pdev); + if (pci_enable_device(dev->pdev)) + return -1; + pci_set_master(dev->pdev); diff --git a/queue-2.6.31/drm-i915-use-the-crt-ddc-to-get-the-edid-for-dvi-connector-on-mac.patch b/queue-2.6.31/drm-i915-use-the-crt-ddc-to-get-the-edid-for-dvi-connector-on-mac.patch new file mode 100644 index 00000000000..c88436544fa --- /dev/null +++ b/queue-2.6.31/drm-i915-use-the-crt-ddc-to-get-the-edid-for-dvi-connector-on-mac.patch @@ -0,0 +1,177 @@ +From 57cdaf90f5f607eb029356074fefb66c9b1c0659 Mon Sep 17 00:00:00 2001 +From: Keith Packard +Date: Fri, 4 Sep 2009 13:07:54 +0800 +Subject: drm/I915: Use the CRT DDC to get the EDID for DVI-connector on Mac + +From: Keith Packard + +commit 57cdaf90f5f607eb029356074fefb66c9b1c0659 upstream. + +mac Mini's have a single DDC line on the DVI connector, shared between the +analog link and the digital link. So, if DDC isn't detected on GPIOE (the +usual SDVO DDC link), try GPIOA (the usual VGA DDC link) when there isn't a +VGA monitor connected. + +Signed-off-by: Keith Packard +Signed-off-by: Zhao Yakui +Signed-off-by: Eric Anholt +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_sdvo.c | 96 +++++++++++++++++++++++++++++--------- + 1 file changed, 74 insertions(+), 22 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_sdvo.c ++++ b/drivers/gpu/drm/i915/intel_sdvo.c +@@ -114,6 +114,9 @@ struct intel_sdvo_priv { + /* DDC bus used by this SDVO output */ + uint8_t ddc_bus; + ++ /* Mac mini hack -- use the same DDC as the analog connector */ ++ struct i2c_adapter *analog_ddc_bus; ++ + int save_sdvo_mult; + u16 save_active_outputs; + struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2; +@@ -1478,6 +1481,36 @@ intel_sdvo_multifunc_encoder(struct inte + return (caps > 1); + } + ++static struct drm_connector * ++intel_find_analog_connector(struct drm_device *dev) ++{ ++ struct drm_connector *connector; ++ struct intel_output *intel_output; ++ ++ list_for_each_entry(connector, &dev->mode_config.connector_list, head) { ++ intel_output = to_intel_output(connector); ++ if (intel_output->type == INTEL_OUTPUT_ANALOG) ++ return connector; ++ } ++ return NULL; ++} ++ ++static int ++intel_analog_is_connected(struct drm_device *dev) ++{ ++ struct drm_connector *analog_connector; ++ analog_connector = intel_find_analog_connector(dev); ++ ++ if (!analog_connector) ++ return false; ++ ++ if (analog_connector->funcs->detect(analog_connector) == ++ connector_status_disconnected) ++ return false; ++ ++ return true; ++} ++ + enum drm_connector_status + intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) + { +@@ -1488,6 +1521,15 @@ intel_sdvo_hdmi_sink_detect(struct drm_c + + edid = drm_get_edid(&intel_output->base, + intel_output->ddc_bus); ++ ++ /* when there is no edid and no monitor is connected with VGA ++ * port, try to use the CRT ddc to read the EDID for DVI-connector ++ */ ++ if (edid == NULL && ++ sdvo_priv->analog_ddc_bus && ++ !intel_analog_is_connected(intel_output->base.dev)) ++ edid = drm_get_edid(&intel_output->base, ++ sdvo_priv->analog_ddc_bus); + if (edid != NULL) { + /* Don't report the output as connected if it's a DVI-I + * connector with a non-digital EDID coming out. +@@ -1540,31 +1582,32 @@ static enum drm_connector_status intel_s + static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) + { + struct intel_output *intel_output = to_intel_output(connector); ++ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; ++ int num_modes; + + /* set the bus switch and get the modes */ +- intel_ddc_get_modes(intel_output); ++ num_modes = intel_ddc_get_modes(intel_output); + +-#if 0 +- struct drm_device *dev = encoder->dev; +- struct drm_i915_private *dev_priv = dev->dev_private; +- /* Mac mini hack. On this device, I get DDC through the analog, which +- * load-detects as disconnected. I fail to DDC through the SDVO DDC, +- * but it does load-detect as connected. So, just steal the DDC bits +- * from analog when we fail at finding it the right way. ++ /* ++ * Mac mini hack. On this device, the DVI-I connector shares one DDC ++ * link between analog and digital outputs. So, if the regular SDVO ++ * DDC fails, check to see if the analog output is disconnected, in ++ * which case we'll look there for the digital DDC data. + */ +- crt = xf86_config->output[0]; +- intel_output = crt->driver_private; +- if (intel_output->type == I830_OUTPUT_ANALOG && +- crt->funcs->detect(crt) == XF86OutputStatusDisconnected) { +- I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A"); +- edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus); +- xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true); +- } +- if (edid_mon) { +- xf86OutputSetEDID(output, edid_mon); +- modes = xf86OutputGetEDIDModes(output); ++ if (num_modes == 0 && ++ sdvo_priv->analog_ddc_bus && ++ !intel_analog_is_connected(intel_output->base.dev)) { ++ struct i2c_adapter *digital_ddc_bus; ++ ++ /* Switch to the analog ddc bus and try that ++ */ ++ digital_ddc_bus = intel_output->ddc_bus; ++ intel_output->ddc_bus = sdvo_priv->analog_ddc_bus; ++ ++ (void) intel_ddc_get_modes(intel_output); ++ ++ intel_output->ddc_bus = digital_ddc_bus; + } +-#endif + } + + /** +@@ -1748,6 +1791,8 @@ static void intel_sdvo_destroy(struct dr + intel_i2c_destroy(intel_output->i2c_bus); + if (intel_output->ddc_bus) + intel_i2c_destroy(intel_output->ddc_bus); ++ if (sdvo_priv->analog_ddc_bus) ++ intel_i2c_destroy(sdvo_priv->analog_ddc_bus); + + if (sdvo_priv->sdvo_lvds_fixed_mode != NULL) + drm_mode_destroy(connector->dev, +@@ -2074,10 +2119,15 @@ bool intel_sdvo_init(struct drm_device * + } + + /* setup the DDC bus. */ +- if (output_device == SDVOB) ++ if (output_device == SDVOB) { + intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS"); +- else ++ sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, ++ "SDVOB/VGA DDC BUS"); ++ } else { + intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS"); ++ sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, ++ "SDVOC/VGA DDC BUS"); ++ } + + if (intel_output->ddc_bus == NULL) + goto err_i2c; +@@ -2143,6 +2193,8 @@ bool intel_sdvo_init(struct drm_device * + return true; + + err_i2c: ++ if (sdvo_priv->analog_ddc_bus != NULL) ++ intel_i2c_destroy(sdvo_priv->analog_ddc_bus); + if (intel_output->ddc_bus != NULL) + intel_i2c_destroy(intel_output->ddc_bus); + if (intel_output->i2c_bus != NULL) diff --git a/queue-2.6.31/ecryptfs-check-for-o_rdonly-lower-inodes-when-opening-lower-files.patch b/queue-2.6.31/ecryptfs-check-for-o_rdonly-lower-inodes-when-opening-lower-files.patch new file mode 100644 index 00000000000..1488a8a6d8f --- /dev/null +++ b/queue-2.6.31/ecryptfs-check-for-o_rdonly-lower-inodes-when-opening-lower-files.patch @@ -0,0 +1,93 @@ +From ac22ba23b659e34a5961aec8c945608e471b0d5b Mon Sep 17 00:00:00 2001 +From: Tyler Hicks +Date: Wed, 12 Aug 2009 01:06:54 -0500 +Subject: eCryptfs: Check for O_RDONLY lower inodes when opening lower files + +From: Tyler Hicks + +commit ac22ba23b659e34a5961aec8c945608e471b0d5b upstream. + +If the lower inode is read-only, don't attempt to open the lower file +read/write and don't hand off the open request to the privileged +eCryptfs kthread for opening it read/write. Instead, only try an +unprivileged, read-only open of the file and give up if that fails. +This patch fixes an oops when eCryptfs is mounted on top of a read-only +mount. + +Acked-by: Serge Hallyn +Cc: Eric Sandeen +Cc: Dave Kleikamp +Cc: ecryptfs-devel@lists.launchpad.net +Signed-off-by: Tyler Hicks +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ecryptfs/kthread.c | 24 ++++++++---------------- + fs/ecryptfs/main.c | 3 +-- + 2 files changed, 9 insertions(+), 18 deletions(-) + +--- a/fs/ecryptfs/kthread.c ++++ b/fs/ecryptfs/kthread.c +@@ -136,6 +136,7 @@ int ecryptfs_privileged_open(struct file + const struct cred *cred) + { + struct ecryptfs_open_req *req; ++ int flags = O_LARGEFILE; + int rc = 0; + + /* Corresponding dput() and mntput() are done when the +@@ -143,10 +144,14 @@ int ecryptfs_privileged_open(struct file + * destroyed. */ + dget(lower_dentry); + mntget(lower_mnt); +- (*lower_file) = dentry_open(lower_dentry, lower_mnt, +- (O_RDWR | O_LARGEFILE), cred); ++ flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; ++ (*lower_file) = dentry_open(lower_dentry, lower_mnt, flags, cred); + if (!IS_ERR(*lower_file)) + goto out; ++ if (flags & O_RDONLY) { ++ rc = PTR_ERR((*lower_file)); ++ goto out; ++ } + req = kmem_cache_alloc(ecryptfs_open_req_cache, GFP_KERNEL); + if (!req) { + rc = -ENOMEM; +@@ -180,21 +185,8 @@ int ecryptfs_privileged_open(struct file + __func__); + goto out_unlock; + } +- if (IS_ERR(*req->lower_file)) { ++ if (IS_ERR(*req->lower_file)) + rc = PTR_ERR(*req->lower_file); +- dget(lower_dentry); +- mntget(lower_mnt); +- (*lower_file) = dentry_open(lower_dentry, lower_mnt, +- (O_RDONLY | O_LARGEFILE), cred); +- if (IS_ERR(*lower_file)) { +- rc = PTR_ERR(*req->lower_file); +- (*lower_file) = NULL; +- printk(KERN_WARNING "%s: Error attempting privileged " +- "open of lower file with either RW or RO " +- "perms; rc = [%d]. Giving up.\n", +- __func__, rc); +- } +- } + out_unlock: + mutex_unlock(&req->mux); + out_free: +--- a/fs/ecryptfs/main.c ++++ b/fs/ecryptfs/main.c +@@ -129,11 +129,10 @@ int ecryptfs_init_persistent_file(struct + lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry); + rc = ecryptfs_privileged_open(&inode_info->lower_file, + lower_dentry, lower_mnt, cred); +- if (rc || IS_ERR(inode_info->lower_file)) { ++ if (rc) { + printk(KERN_ERR "Error opening lower persistent file " + "for lower_dentry [0x%p] and lower_mnt [0x%p]; " + "rc = [%d]\n", lower_dentry, lower_mnt, rc); +- rc = PTR_ERR(inode_info->lower_file); + inode_info->lower_file = NULL; + } + } diff --git a/queue-2.6.31/ecryptfs-filename-encryption-only-supports-password-auth-tokens.patch b/queue-2.6.31/ecryptfs-filename-encryption-only-supports-password-auth-tokens.patch new file mode 100644 index 00000000000..4ed71275a33 --- /dev/null +++ b/queue-2.6.31/ecryptfs-filename-encryption-only-supports-password-auth-tokens.patch @@ -0,0 +1,75 @@ +From df6ad33ba1b9846bd5f0e2b9016c30c20bc2d948 Mon Sep 17 00:00:00 2001 +From: Tyler Hicks +Date: Fri, 21 Aug 2009 04:27:46 -0500 +Subject: eCryptfs: Filename encryption only supports password auth tokens + +From: Tyler Hicks + +commit df6ad33ba1b9846bd5f0e2b9016c30c20bc2d948 upstream. + +Returns -ENOTSUPP when attempting to use filename encryption with +something other than a password authentication token, such as a private +token from openssl. Using filename encryption with a userspace eCryptfs +key module is a future goal. Until then, this patch handles the +situation a little better than simply using a BUG_ON(). + +Acked-by: Serge Hallyn +Cc: ecryptfs-devel@lists.launchpad.net +Signed-off-by: Tyler Hicks +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ecryptfs/crypto.c | 4 ++-- + fs/ecryptfs/keystore.c | 14 ++++++++++++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +--- a/fs/ecryptfs/crypto.c ++++ b/fs/ecryptfs/crypto.c +@@ -1703,7 +1703,7 @@ ecryptfs_encrypt_filename(struct ecryptf + } else { + printk(KERN_ERR "%s: No support for requested filename " + "encryption method in this release\n", __func__); +- rc = -ENOTSUPP; ++ rc = -EOPNOTSUPP; + goto out; + } + out: +@@ -2167,7 +2167,7 @@ int ecryptfs_encrypt_and_encode_filename + (*encoded_name)[(*encoded_name_size)] = '\0'; + (*encoded_name_size)++; + } else { +- rc = -ENOTSUPP; ++ rc = -EOPNOTSUPP; + } + if (rc) { + printk(KERN_ERR "%s: Error attempting to encode " +--- a/fs/ecryptfs/keystore.c ++++ b/fs/ecryptfs/keystore.c +@@ -612,7 +612,12 @@ ecryptfs_write_tag_70_packet(char *dest, + } + /* TODO: Support other key modules than passphrase for + * filename encryption */ +- BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); ++ if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { ++ rc = -EOPNOTSUPP; ++ printk(KERN_INFO "%s: Filename encryption only supports " ++ "password tokens\n", __func__); ++ goto out_free_unlock; ++ } + sg_init_one( + &s->hash_sg, + (u8 *)s->auth_tok->token.password.session_key_encryption_key, +@@ -910,7 +915,12 @@ ecryptfs_parse_tag_70_packet(char **file + } + /* TODO: Support other key modules than passphrase for + * filename encryption */ +- BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); ++ if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { ++ rc = -EOPNOTSUPP; ++ printk(KERN_INFO "%s: Filename encryption only supports " ++ "password tokens\n", __func__); ++ goto out_free_unlock; ++ } + rc = crypto_blkcipher_setkey( + s->desc.tfm, + s->auth_tok->token.password.session_key_encryption_key, diff --git a/queue-2.6.31/ecryptfs-handle-unrecognized-tag-3-cipher-codes.patch b/queue-2.6.31/ecryptfs-handle-unrecognized-tag-3-cipher-codes.patch new file mode 100644 index 00000000000..e6fdb5b192f --- /dev/null +++ b/queue-2.6.31/ecryptfs-handle-unrecognized-tag-3-cipher-codes.patch @@ -0,0 +1,60 @@ +From b0105eaefa7cce8f4a941d0fc6354b250d30e745 Mon Sep 17 00:00:00 2001 +From: Tyler Hicks +Date: Tue, 11 Aug 2009 00:36:32 -0500 +Subject: eCryptfs: Handle unrecognized tag 3 cipher codes + +From: Tyler Hicks + +commit b0105eaefa7cce8f4a941d0fc6354b250d30e745 upstream. + +Returns an error when an unrecognized cipher code is present in a tag 3 +packet or an ecryptfs_crypt_stat cannot be initialized. Also sets an +crypt_stat->tfm error pointer to NULL to ensure that it will not be +incorrectly freed in ecryptfs_destroy_crypt_stat(). + +Acked-by: Serge Hallyn +Cc: ecryptfs-devel@lists.launchpad.net +Signed-off-by: Tyler Hicks +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ecryptfs/crypto.c | 1 + + fs/ecryptfs/keystore.c | 10 +++++++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +--- a/fs/ecryptfs/crypto.c ++++ b/fs/ecryptfs/crypto.c +@@ -797,6 +797,7 @@ int ecryptfs_init_crypt_ctx(struct ecryp + kfree(full_alg_name); + if (IS_ERR(crypt_stat->tfm)) { + rc = PTR_ERR(crypt_stat->tfm); ++ crypt_stat->tfm = NULL; + ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " + "Error initializing cipher [%s]\n", + crypt_stat->cipher); +--- a/fs/ecryptfs/keystore.c ++++ b/fs/ecryptfs/keystore.c +@@ -1316,8 +1316,10 @@ parse_tag_3_packet(struct ecryptfs_crypt + rc = -EINVAL; + goto out_free; + } +- ecryptfs_cipher_code_to_string(crypt_stat->cipher, +- (u16)data[(*packet_size)]); ++ rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher, ++ (u16)data[(*packet_size)]); ++ if (rc) ++ goto out_free; + /* A little extra work to differentiate among the AES key + * sizes; see RFC2440 */ + switch(data[(*packet_size)++]) { +@@ -1328,7 +1330,9 @@ parse_tag_3_packet(struct ecryptfs_crypt + crypt_stat->key_size = + (*new_auth_tok)->session_key.encrypted_key_size; + } +- ecryptfs_init_crypt_ctx(crypt_stat); ++ rc = ecryptfs_init_crypt_ctx(crypt_stat); ++ if (rc) ++ goto out_free; + if (unlikely(data[(*packet_size)++] != 0x03)) { + printk(KERN_WARNING "Only S2K ID 3 is currently supported\n"); + rc = -ENOSYS; diff --git a/queue-2.6.31/ecryptfs-prevent-lower-dentry-from-going-negative-during-unlink.patch b/queue-2.6.31/ecryptfs-prevent-lower-dentry-from-going-negative-during-unlink.patch new file mode 100644 index 00000000000..3e3895d44bf --- /dev/null +++ b/queue-2.6.31/ecryptfs-prevent-lower-dentry-from-going-negative-during-unlink.patch @@ -0,0 +1,60 @@ +From 9c2d2056647790c5034d722bd24e9d913ebca73c Mon Sep 17 00:00:00 2001 +From: Tyler Hicks +Date: Tue, 22 Sep 2009 12:52:17 -0500 +Subject: eCryptfs: Prevent lower dentry from going negative during unlink +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tyler Hicks + +commit 9c2d2056647790c5034d722bd24e9d913ebca73c upstream. + +When calling vfs_unlink() on the lower dentry, d_delete() turns the +dentry into a negative dentry when the d_count is 1. This eventually +caused a NULL pointer deref when a read() or write() was done and the +negative dentry's d_inode was dereferenced in +ecryptfs_read_update_atime() or ecryptfs_getxattr(). + +Placing mutt's tmpdir in an eCryptfs mount is what initially triggered +the oops and I was able to reproduce it with the following sequence: + +open("/tmp/upper/foo", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 3 +link("/tmp/upper/foo", "/tmp/upper/bar") = 0 +unlink("/tmp/upper/foo") = 0 +open("/tmp/upper/bar", O_RDWR|O_CREAT|O_NOFOLLOW, 0600) = 4 +unlink("/tmp/upper/bar") = 0 +write(4, "eCryptfs test\n"..., 14 ++++ killed by SIGKILL +++ + +https://bugs.launchpad.net/ecryptfs/+bug/387073 + +Reported-by: Loïc Minier +Cc: Serge Hallyn +Cc: Dave Kleikamp +Cc: ecryptfs-devel@lists.launchpad.net +Signed-off-by: Tyler Hicks +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ecryptfs/inode.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/fs/ecryptfs/inode.c ++++ b/fs/ecryptfs/inode.c +@@ -476,6 +476,7 @@ static int ecryptfs_unlink(struct inode + struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir); + struct dentry *lower_dir_dentry; + ++ dget(lower_dentry); + lower_dir_dentry = lock_parent(lower_dentry); + rc = vfs_unlink(lower_dir_inode, lower_dentry); + if (rc) { +@@ -489,6 +490,7 @@ static int ecryptfs_unlink(struct inode + d_drop(dentry); + out_unlock: + unlock_dir(lower_dir_dentry); ++ dput(lower_dentry); + return rc; + } + diff --git a/queue-2.6.31/ecryptfs-validate-global-auth-tok-keys.patch b/queue-2.6.31/ecryptfs-validate-global-auth-tok-keys.patch new file mode 100644 index 00000000000..560f1492f74 --- /dev/null +++ b/queue-2.6.31/ecryptfs-validate-global-auth-tok-keys.patch @@ -0,0 +1,36 @@ +From 3891959846709a19f76628e33478cd85edb0e79f Mon Sep 17 00:00:00 2001 +From: Tyler Hicks +Date: Wed, 26 Aug 2009 01:54:56 -0500 +Subject: eCryptfs: Validate global auth tok keys + +From: Tyler Hicks + +commit 3891959846709a19f76628e33478cd85edb0e79f upstream. + +When searching through the global authentication tokens for a given key +signature, verify that a matching key has not been revoked and has not +expired. This allows the `keyctl revoke` command to be properly used on +keys in use by eCryptfs. + +Acked-by: Serge Hallyn +Cc: ecryptfs-devel@lists.launchpad.net +Signed-off-by: Tyler Hicks +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ecryptfs/keystore.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/fs/ecryptfs/keystore.c ++++ b/fs/ecryptfs/keystore.c +@@ -416,7 +416,9 @@ ecryptfs_find_global_auth_tok_for_sig( + &mount_crypt_stat->global_auth_tok_list, + mount_crypt_stat_list) { + if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) { +- (*global_auth_tok) = walker; ++ rc = key_validate(walker->global_auth_tok_key); ++ if (!rc) ++ (*global_auth_tok) = walker; + goto out; + } + } diff --git a/queue-2.6.31/fbcon-only-unbind-from-console-if-successfully-registered.patch b/queue-2.6.31/fbcon-only-unbind-from-console-if-successfully-registered.patch new file mode 100644 index 00000000000..81ef8021a7b --- /dev/null +++ b/queue-2.6.31/fbcon-only-unbind-from-console-if-successfully-registered.patch @@ -0,0 +1,72 @@ +From 2ddce3fd0acbdc1be684fb5f919ae3d2e9518aac Mon Sep 17 00:00:00 2001 +From: Ian Armstrong +Date: Tue, 22 Sep 2009 16:47:52 -0700 +Subject: fbcon: only unbind from console if successfully registered + +From: Ian Armstrong + +commit 2ddce3fd0acbdc1be684fb5f919ae3d2e9518aac upstream. + +Attempting to unload a framebuffer module calls unregister_framebuffer() +which in turn gets fbcon to release it. If fbcon has no framebuffers +linked to a console, it will also unbind itself from the console driver. +However, if fbcon never registered itself as a console driver, the unbind +will fail causing the framebuffer device entry to persist. In most cases +this failure will result in an oops when attempting to access the now +non-existent device. + +This patch ensures that the fbcon unbind request will succeed even if a +bind was never done. It tracks if a successful bind ever occurred & will +only attempt to unbind if needed. If there never was a bind, it simply +returns with no error. + +Signed-off-by: Ian Armstrong +Cc: Krzysztof Helt +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/video/console/fbcon.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/video/console/fbcon.c ++++ b/drivers/video/console/fbcon.c +@@ -114,6 +114,7 @@ static int last_fb_vc = MAX_NR_CONSOLES + static int fbcon_is_default = 1; + static int fbcon_has_exited; + static int primary_device = -1; ++static int fbcon_has_console_bind; + + #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY + static int map_override; +@@ -544,6 +545,8 @@ static int fbcon_takeover(int show_logo) + con2fb_map[i] = -1; + } + info_idx = -1; ++ } else { ++ fbcon_has_console_bind = 1; + } + + return err; +@@ -2923,6 +2926,10 @@ static int fbcon_unbind(void) + + ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc, + fbcon_is_default); ++ ++ if (!ret) ++ fbcon_has_console_bind = 0; ++ + return ret; + } + #else +@@ -2936,6 +2943,9 @@ static int fbcon_fb_unbind(int idx) + { + int i, new_idx = -1, ret = 0; + ++ if (!fbcon_has_console_bind) ++ return 0; ++ + for (i = first_fb_vc; i <= last_fb_vc; i++) { + if (con2fb_map[i] != idx && + con2fb_map[i] != -1) { diff --git a/queue-2.6.31/fs-make-sure-data-stored-into-inode-is-properly-seen-before-unlocking-new-inode.patch b/queue-2.6.31/fs-make-sure-data-stored-into-inode-is-properly-seen-before-unlocking-new-inode.patch new file mode 100644 index 00000000000..f84248468d7 --- /dev/null +++ b/queue-2.6.31/fs-make-sure-data-stored-into-inode-is-properly-seen-before-unlocking-new-inode.patch @@ -0,0 +1,47 @@ +From 580be0837a7a59b207c3d5c661d044d8dd0a6a30 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Mon, 21 Sep 2009 17:01:06 -0700 +Subject: fs: make sure data stored into inode is properly seen before unlocking new inode + +From: Jan Kara + +commit 580be0837a7a59b207c3d5c661d044d8dd0a6a30 upstream. + +In theory it could happen that on one CPU we initialize a new inode but +clearing of I_NEW | I_LOCK gets reordered before some of the +initialization. Thus on another CPU we return not fully uptodate inode +from iget_locked(). + +This seems to fix a corruption issue on ext3 mounted over NFS. + +[akpm@linux-foundation.org: add some commentary] +Signed-off-by: Jan Kara +Cc: Christoph Hellwig +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -695,13 +695,15 @@ void unlock_new_inode(struct inode *inode) + } + #endif + /* +- * This is special! We do not need the spinlock +- * when clearing I_LOCK, because we're guaranteed +- * that nobody else tries to do anything about the +- * state of the inode when it is locked, as we +- * just created it (so there can be no old holders +- * that haven't tested I_LOCK). ++ * This is special! We do not need the spinlock when clearing I_LOCK, ++ * because we're guaranteed that nobody else tries to do anything about ++ * the state of the inode when it is locked, as we just created it (so ++ * there can be no old holders that haven't tested I_LOCK). ++ * However we must emit the memory barrier so that other CPUs reliably ++ * see the clearing of I_LOCK after the other inode initialisation has ++ * completed. + */ ++ smp_mb(); + WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); + inode->i_state &= ~(I_LOCK|I_NEW); + wake_up_inode(inode); diff --git a/queue-2.6.31/kallsyms-fix-segfault-in-prefix_underscores_count.patch b/queue-2.6.31/kallsyms-fix-segfault-in-prefix_underscores_count.patch new file mode 100644 index 00000000000..19dcd8d0a04 --- /dev/null +++ b/queue-2.6.31/kallsyms-fix-segfault-in-prefix_underscores_count.patch @@ -0,0 +1,52 @@ +From a9ece53c4089ef23d4002d34c4c7148d94622a40 Mon Sep 17 00:00:00 2001 +From: Paul Mundt +Date: Tue, 22 Sep 2009 16:44:12 -0700 +Subject: kallsyms: fix segfault in prefix_underscores_count() + +From: Paul Mundt + +commit a9ece53c4089ef23d4002d34c4c7148d94622a40 upstream. + +Commit b478b782e110fdb4135caa3062b6d687e989d994 "kallsyms, tracing: output +more proper symbol name" introduces a "bugfix" that introduces a segfault +in kallsyms in my configurations. + +The cause is the introduction of prefix_underscores_count() which attempts +to count underscores, even in symbols that do not have them. As a result, +it just uselessly runs past the end of the buffer until it crashes: + + CC init/version.o + LD init/built-in.o + LD .tmp_vmlinux1 + KSYM .tmp_kallsyms1.S +/bin/sh: line 1: 16934 Done sh-linux-gnu-nm -n .tmp_vmlinux1 + 16935 Segmentation fault | scripts/kallsyms > .tmp_kallsyms1.S +make: *** [.tmp_kallsyms1.S] Error 139 + +This simplifies the logic and just does a straightforward count. + +Signed-off-by: Paul Mundt +Reviewed-by: Li Zefan +Cc: Lai Jiangshan +Cc: Sam Ravnborg +Cc: Paulo Marques +Cc: Ingo Molnar +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + scripts/kallsyms.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/scripts/kallsyms.c ++++ b/scripts/kallsyms.c +@@ -585,7 +585,7 @@ static int prefix_underscores_count(cons + { + const char *tail = str; + +- while (*tail != '_') ++ while (*tail == '_') + tail++; + + return tail - str; diff --git a/queue-2.6.31/kaweth-fix-memory-leak-in-kaweth_control.patch b/queue-2.6.31/kaweth-fix-memory-leak-in-kaweth_control.patch new file mode 100644 index 00000000000..37757bddcc1 --- /dev/null +++ b/queue-2.6.31/kaweth-fix-memory-leak-in-kaweth_control.patch @@ -0,0 +1,66 @@ +From 051b982bcc620695de629d29c333c95b66e9b95e Mon Sep 17 00:00:00 2001 +From: Kevin Cernekee +Date: Sat, 19 Sep 2009 11:18:21 +0000 +Subject: kaweth: Fix memory leak in kaweth_control() + +From: Kevin Cernekee + +commit 051b982bcc620695de629d29c333c95b66e9b95e upstream. + +kaweth_control() never frees the buffer that it allocates for the USB +control message. Test case: + +while :; do ifconfig eth2 down ; ifconfig eth2 up ; done + +This is a tiny buffer so it is a slow leak. If you want to speed up the +process, you can change the allocation size to e.g. 16384 bytes, and it +will consume several megabytes within a few minutes. + +Signed-off-by: Kevin Cernekee +Acked-by: Oliver Neukum +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/usb/kaweth.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +--- a/drivers/net/usb/kaweth.c ++++ b/drivers/net/usb/kaweth.c +@@ -263,6 +263,7 @@ static int kaweth_control(struct kaweth_ + int timeout) + { + struct usb_ctrlrequest *dr; ++ int retval; + + dbg("kaweth_control()"); + +@@ -278,18 +279,21 @@ static int kaweth_control(struct kaweth_ + return -ENOMEM; + } + +- dr->bRequestType= requesttype; ++ dr->bRequestType = requesttype; + dr->bRequest = request; + dr->wValue = cpu_to_le16(value); + dr->wIndex = cpu_to_le16(index); + dr->wLength = cpu_to_le16(size); + +- return kaweth_internal_control_msg(kaweth->dev, +- pipe, +- dr, +- data, +- size, +- timeout); ++ retval = kaweth_internal_control_msg(kaweth->dev, ++ pipe, ++ dr, ++ data, ++ size, ++ timeout); ++ ++ kfree(dr); ++ return retval; + } + + /**************************************************************** diff --git a/queue-2.6.31/kbuild-fix-cc1-options-check-to-ensure-we-do-not-use-fpic-when-compiling.patch b/queue-2.6.31/kbuild-fix-cc1-options-check-to-ensure-we-do-not-use-fpic-when-compiling.patch new file mode 100644 index 00000000000..c66d1b31732 --- /dev/null +++ b/queue-2.6.31/kbuild-fix-cc1-options-check-to-ensure-we-do-not-use-fpic-when-compiling.patch @@ -0,0 +1,47 @@ +From c47efe5548abbf53c2f66e06dcb46183b11d6b22 Mon Sep 17 00:00:00 2001 +From: Jory A. Pratt +Date: Fri, 18 Sep 2009 12:49:31 -0700 +Subject: kbuild: fix cc1 options check to ensure we do not use -fPIC when compiling + +From: Jory A. Pratt + +commit c47efe5548abbf53c2f66e06dcb46183b11d6b22 upstream. + +The arch/*/boot/Makefile use cc-options to check for GCC command options +and cc-options use the hardened specs when checking for GCC command +options. When -fPIE is pass to cc1 it can't use -ffreestanding or +-fno-toplevel-reorder. Then it fail to build stuff with -ffreestanding +and -fno-toplevel-reorder. + +Thanks to Fredric Johansson for finding the main problem behind a failed +build using a hardened toolchain. + +Signed-off-by: Magnus Granberg +Signed-off-by: Jory A. Pratt +Cc: Fredric Johansson +Cc: "H. Peter Anvin" +Signed-off-by: Andrew Morton +Signed-off-by: Sam Ravnborg +Signed-off-by: Greg Kroah-Hartman + +--- + scripts/Kbuild.include | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/scripts/Kbuild.include ++++ b/scripts/Kbuild.include +@@ -105,12 +105,12 @@ as-instr = $(call try-run,\ + # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) + + cc-option = $(call try-run,\ +- $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) ++ $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) + + # cc-option-yn + # Usage: flag := $(call cc-option-yn,-march=winchip-c6) + cc-option-yn = $(call try-run,\ +- $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) ++ $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) + + # cc-option-align + # Prefix align with either -falign or -malign diff --git a/queue-2.6.31/mmc_spi-fail-gracefully-if-host-or-card-do-not-support-the-switch-command.patch b/queue-2.6.31/mmc_spi-fail-gracefully-if-host-or-card-do-not-support-the-switch-command.patch new file mode 100644 index 00000000000..750a73c88c9 --- /dev/null +++ b/queue-2.6.31/mmc_spi-fail-gracefully-if-host-or-card-do-not-support-the-switch-command.patch @@ -0,0 +1,78 @@ +From d08ebeddfb3293fa4bdfca9c610daf1e8ec8b233 Mon Sep 17 00:00:00 2001 +From: Wolfgang Muees +Date: Tue, 22 Sep 2009 16:45:26 -0700 +Subject: mmc_spi: fail gracefully if host or card do not support the switch command + +From: Wolfgang Muees + +commit d08ebeddfb3293fa4bdfca9c610daf1e8ec8b233 upstream. + +Some time ago, I have send a patch to the mmc_spi subsystem changing the +error codes. This was after a discussion with Pierre about using EINVAL +only for non-recoverable errors. This patch was accepted as + +http://git.kernel.org/linus/fdd858db7113ca64132de390188d7ca00701013d + +Unfortunately, several weeks later, I realized that this patch has opened +a little can of worms because there are SD cards on the market which + +a) claim that they support the switch command +AND +b) refuse to execute this command if operating in SPI mode. + +So, such a card would get unusuable in an embedded linux system in SPI +mode, because the init sequence terminates with an error. + +This patch adds the missing error codes to the caller of the switch +command and restores the old behaviour to fail gracefully if these +commands can not execute. + +Signed-off-by: Wolfgang Muees +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mmc/core/mmc.c | 10 +++++----- + drivers/mmc/core/sd.c | 10 +++++----- + 2 files changed, 10 insertions(+), 10 deletions(-) + +--- a/drivers/mmc/core/mmc.c ++++ b/drivers/mmc/core/mmc.c +@@ -180,11 +180,11 @@ static int mmc_read_ext_csd(struct mmc_c + + err = mmc_send_ext_csd(card, ext_csd); + if (err) { +- /* +- * We all hosts that cannot perform the command +- * to fail more gracefully +- */ +- if (err != -EINVAL) ++ /* If the host or the card can't do the switch, ++ * fail more gracefully. */ ++ if ((err != -EINVAL) ++ && (err != -ENOSYS) ++ && (err != -EFAULT)) + goto out; + + /* +--- a/drivers/mmc/core/sd.c ++++ b/drivers/mmc/core/sd.c +@@ -210,11 +210,11 @@ static int mmc_read_switch(struct mmc_ca + + err = mmc_sd_switch(card, 0, 0, 1, status); + if (err) { +- /* +- * We all hosts that cannot perform the command +- * to fail more gracefully +- */ +- if (err != -EINVAL) ++ /* If the host or the card can't do the switch, ++ * fail more gracefully. */ ++ if ((err != -EINVAL) ++ && (err != -ENOSYS) ++ && (err != -EFAULT)) + goto out; + + printk(KERN_WARNING "%s: problem reading switch " diff --git a/queue-2.6.31/mtd-cfi_cmdset_0002-add-0xff-intolerance-for-m29w128g.patch b/queue-2.6.31/mtd-cfi_cmdset_0002-add-0xff-intolerance-for-m29w128g.patch new file mode 100644 index 00000000000..e9354ea8daf --- /dev/null +++ b/queue-2.6.31/mtd-cfi_cmdset_0002-add-0xff-intolerance-for-m29w128g.patch @@ -0,0 +1,66 @@ +From 23af51ecfb04ff65bae51bd8e2270f4449abc789 Mon Sep 17 00:00:00 2001 +From: Massimo Cirillo +Date: Thu, 3 Sep 2009 16:34:39 +0200 +Subject: mtd: cfi_cmdset_0002: add 0xFF intolerance for M29W128G + +From: Massimo Cirillo + +commit 23af51ecfb04ff65bae51bd8e2270f4449abc789 upstream. + +The M29W128G Numonyx flash devices are intolerant to any 0xFF command: +in the Cfi_util.c the function cfi_qry_mode_off() (that resets the device +after the autoselect mode) must have a 0xF0 command after the 0xFF command. +This fix solves also the cause of the fixup_M29W128G_write_buffer() fix, +that can be removed now. +The following patch applies to 2.6.30 kernel. + +Signed-off-by: Massimo Cirillo +Acked-by: Alexey Korolev +Signed-off-by: David Woodhouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mtd/chips/cfi_cmdset_0002.c | 11 ----------- + drivers/mtd/chips/cfi_util.c | 4 ++++ + 2 files changed, 4 insertions(+), 11 deletions(-) + +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -282,16 +282,6 @@ static void fixup_s29gl032n_sectors(stru + } + } + +-static void fixup_M29W128G_write_buffer(struct mtd_info *mtd, void *param) +-{ +- struct map_info *map = mtd->priv; +- struct cfi_private *cfi = map->fldrv_priv; +- if (cfi->cfiq->BufWriteTimeoutTyp) { +- pr_warning("Don't use write buffer on ST flash M29W128G\n"); +- cfi->cfiq->BufWriteTimeoutTyp = 0; +- } +-} +- + static struct cfi_fixup cfi_fixup_table[] = { + { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, + #ifdef AMD_BOOTLOC_BUG +@@ -308,7 +298,6 @@ static struct cfi_fixup cfi_fixup_table[ + { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, }, + { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, }, + { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, }, +- { CFI_MFR_ST, 0x227E, fixup_M29W128G_write_buffer, NULL, }, + #if !FORCE_WORD_WRITE + { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, + #endif +--- a/drivers/mtd/chips/cfi_util.c ++++ b/drivers/mtd/chips/cfi_util.c +@@ -81,6 +81,10 @@ void __xipram cfi_qry_mode_off(uint32_t + { + cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); + cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL); ++ /* M29W128G flashes require an additional reset command ++ when exit qry mode */ ++ if ((cfi->mfr == CFI_MFR_ST) && (cfi->id == 0x227E || cfi->id == 0x7E)) ++ cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); + } + EXPORT_SYMBOL_GPL(cfi_qry_mode_off); + diff --git a/queue-2.6.31/mtd-nand-fix-ecc-correction-bug-for-smc-ordering-for-ndfc-driver.patch b/queue-2.6.31/mtd-nand-fix-ecc-correction-bug-for-smc-ordering-for-ndfc-driver.patch new file mode 100644 index 00000000000..d9f123280f9 --- /dev/null +++ b/queue-2.6.31/mtd-nand-fix-ecc-correction-bug-for-smc-ordering-for-ndfc-driver.patch @@ -0,0 +1,49 @@ +From 76c23c32e3b3ad48e07e07897075ab19ae1ef117 Mon Sep 17 00:00:00 2001 +From: Feng Kan +Date: Tue, 25 Aug 2009 11:27:20 -0700 +Subject: mtd: nand: fix ECC Correction bug for SMC ordering for NDFC driver + +From: Feng Kan + +commit 76c23c32e3b3ad48e07e07897075ab19ae1ef117 upstream. + +Fix ECC Correction bug where the byte offset location were double +fliped causing correction routine to toggle the wrong byte location +in the ECC segment. The ndfc_calculate_ecc routine change the order +of getting the ECC code. + /* The NDFC uses Smart Media (SMC) bytes order */ + ecc_code[0] = p[2]; + ecc_code[1] = p[1]; + ecc_code[2] = p[3]; +But in the Correction algorithm when calculating the byte offset +location, the b1 is used as the upper part of the address. Which +again reverse the order making the final byte offset address +location incorrect. + byte_addr = (addressbits[b1] << 4) + addressbits[b0]; +The order is change to read it in straight and let the correction +function to revert it to SMC order. + +Signed-off-by: Feng Kan +Acked-by: Victor Gallardo +Acked-by: Prodyut Hazarika +Acked-by: Stefan Roese +Signed-off-by: David Woodhouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mtd/nand/ndfc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/nand/ndfc.c ++++ b/drivers/mtd/nand/ndfc.c +@@ -102,8 +102,8 @@ static int ndfc_calculate_ecc(struct mtd + wmb(); + ecc = in_be32(ndfc->ndfcbase + NDFC_ECC); + /* The NDFC uses Smart Media (SMC) bytes order */ +- ecc_code[0] = p[2]; +- ecc_code[1] = p[1]; ++ ecc_code[0] = p[1]; ++ ecc_code[1] = p[2]; + ecc_code[2] = p[3]; + + return 0; diff --git a/queue-2.6.31/mtd-ofpart-check-availability-of-reg-property-instead-of-name-property.patch b/queue-2.6.31/mtd-ofpart-check-availability-of-reg-property-instead-of-name-property.patch new file mode 100644 index 00000000000..090fb9aa2bf --- /dev/null +++ b/queue-2.6.31/mtd-ofpart-check-availability-of-reg-property-instead-of-name-property.patch @@ -0,0 +1,62 @@ +From ebd5a74db74ee2db833d43ea35108a4be9cab42f Mon Sep 17 00:00:00 2001 +From: Benjamin Krill +Date: Tue, 25 Aug 2009 15:52:41 +0200 +Subject: mtd: ofpart: Check availability of reg property instead of name property + +From: Benjamin Krill + +commit ebd5a74db74ee2db833d43ea35108a4be9cab42f upstream. + +The previous implementation breaks the dts binding "mtd-physmap.txt". This +implementation fixes the issue by checking the availability of the reg +property instead of the name property. + +Signed-off-by: Benjamin Krill +Signed-off-by: David Woodhouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mtd/ofpart.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +--- a/drivers/mtd/ofpart.c ++++ b/drivers/mtd/ofpart.c +@@ -46,21 +46,12 @@ int __devinit of_mtd_parse_partitions(st + const u32 *reg; + int len; + +- /* check if this is a partition node */ +- partname = of_get_property(pp, "name", &len); +- if (strcmp(partname, "partition") != 0) { ++ reg = of_get_property(pp, "reg", &len); ++ if (!reg) { + nr_parts--; + continue; + } + +- reg = of_get_property(pp, "reg", &len); +- if (!reg || (len != 2 * sizeof(u32))) { +- of_node_put(pp); +- dev_err(dev, "Invalid 'reg' on %s\n", node->full_name); +- kfree(*pparts); +- *pparts = NULL; +- return -EINVAL; +- } + (*pparts)[i].offset = reg[0]; + (*pparts)[i].size = reg[1]; + +@@ -75,6 +66,14 @@ int __devinit of_mtd_parse_partitions(st + i++; + } + ++ if (!i) { ++ of_node_put(pp); ++ dev_err(dev, "No valid partition found on %s\n", node->full_name); ++ kfree(*pparts); ++ *pparts = NULL; ++ return -EINVAL; ++ } ++ + return nr_parts; + } + EXPORT_SYMBOL(of_mtd_parse_partitions); diff --git a/queue-2.6.31/nfsd4-fix-null-dereference-creating-nfsv4-callback-client.patch b/queue-2.6.31/nfsd4-fix-null-dereference-creating-nfsv4-callback-client.patch new file mode 100644 index 00000000000..68921365809 --- /dev/null +++ b/queue-2.6.31/nfsd4-fix-null-dereference-creating-nfsv4-callback-client.patch @@ -0,0 +1,46 @@ +From 886e3b7fe6054230c89ae078a09565ed183ecc73 Mon Sep 17 00:00:00 2001 +From: J. Bruce Fields +Date: Tue, 15 Sep 2009 12:22:42 -0400 +Subject: nfsd4: fix null dereference creating nfsv4 callback client + +From: J. Bruce Fields + +commit 886e3b7fe6054230c89ae078a09565ed183ecc73 upstream. + +On setting up the callback to the client, we attempt to use the same +authentication flavor the client did. We find an rpc cred to use by +calling rpcauth_lookup_credcache(), which assumes that the given +authentication flavor has a credentials cache. However, this is not +required to be true--in particular, auth_null does not use one. +Instead, we should call the auth's lookup_cred() method. + +Without this, a client attempting to mount using nfsv4 and auth_null +triggers a null dereference. + +Signed-off-by: J. Bruce Fields +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfsd/nfs4callback.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/fs/nfsd/nfs4callback.c ++++ b/fs/nfsd/nfs4callback.c +@@ -444,6 +444,7 @@ static struct rpc_cred *lookup_cb_cred(s + struct auth_cred acred = { + .machine_cred = 1 + }; ++ struct rpc_auth *auth = cb->cb_client->cl_auth; + + /* + * Note in the gss case this doesn't actually have to wait for a +@@ -451,8 +452,7 @@ static struct rpc_cred *lookup_cb_cred(s + * non-uptodate cred which the rpc state machine will fill in with + * a refresh_upcall later. + */ +- return rpcauth_lookup_credcache(cb->cb_client->cl_auth, &acred, +- RPCAUTH_LOOKUP_NEW); ++ return auth->au_ops->lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW); + } + + void do_probe_callback(struct nfs4_client *clp) diff --git a/queue-2.6.31/nilfs2-fix-missing-zero-fill-initialization-of-btree-node-cache.patch b/queue-2.6.31/nilfs2-fix-missing-zero-fill-initialization-of-btree-node-cache.patch new file mode 100644 index 00000000000..3ce87d5fcfa --- /dev/null +++ b/queue-2.6.31/nilfs2-fix-missing-zero-fill-initialization-of-btree-node-cache.patch @@ -0,0 +1,47 @@ +From 1f28fcd925b2b3157411bbd08f0024b55b70d8dd Mon Sep 17 00:00:00 2001 +From: Ryusuke Konishi +Date: Mon, 28 Sep 2009 01:46:11 +0900 +Subject: nilfs2: fix missing zero-fill initialization of btree node cache + +From: Ryusuke Konishi + +commit 1f28fcd925b2b3157411bbd08f0024b55b70d8dd upstream. + +This will fix file system corruption which infrequently happens after +mount. The problem was reported from users with the title "[NILFS +users] Fail to mount NILFS." (Message-ID: +<200908211918.34720.yuri@itinteg.net>), and so forth. I've also +experienced the corruption multiple times on kernel 2.6.30 and 2.6.31. + +The problem turned out to be caused due to discordance between +mapping->nrpages of a btree node cache and the actual number of pages +hung on the cache; if the mapping->nrpages becomes zero even as it has +pages, truncate_inode_pages() returns without doing anything. Usually +this is harmless except it may cause page leak, but garbage collection +fairly infrequently sees a stale page remained in the btree node cache +of DAT (i.e. disk address translation file of nilfs), and induces the +corruption. + +I identified a missing initialization in btree node caches was the +root cause. This corrects the bug. + +I've tested this for kernel 2.6.30 and 2.6.31. + +Reported-by: Yuri Chislov +Signed-off-by: Ryusuke Konishi +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nilfs2/btnode.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/fs/nilfs2/btnode.c ++++ b/fs/nilfs2/btnode.c +@@ -36,6 +36,7 @@ + + void nilfs_btnode_cache_init_once(struct address_space *btnc) + { ++ memset(btnc, 0, sizeof(*btnc)); + INIT_RADIX_TREE(&btnc->page_tree, GFP_ATOMIC); + spin_lock_init(&btnc->tree_lock); + INIT_LIST_HEAD(&btnc->private_list); diff --git a/queue-2.6.31/p54usb-add-zcomax-xg-705a-usbid.patch b/queue-2.6.31/p54usb-add-zcomax-xg-705a-usbid.patch new file mode 100644 index 00000000000..1884c1591e1 --- /dev/null +++ b/queue-2.6.31/p54usb-add-zcomax-xg-705a-usbid.patch @@ -0,0 +1,30 @@ +From f7f71173ea69d4dabf166533beffa9294090b7ef Mon Sep 17 00:00:00 2001 +From: Christian Lamparter +Date: Mon, 14 Sep 2009 23:08:43 +0200 +Subject: p54usb: add Zcomax XG-705A usbid + +From: Christian Lamparter + +commit f7f71173ea69d4dabf166533beffa9294090b7ef upstream. + +This patch adds a new usbid for Zcomax XG-705A to the device table. + +Reported-by: Jari Jaakola +Signed-off-by: Christian Lamparter +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/p54/p54usb.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/wireless/p54/p54usb.c ++++ b/drivers/net/wireless/p54/p54usb.c +@@ -66,6 +66,7 @@ static struct usb_device_id p54u_table[] + {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/ + {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ + {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ ++ {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */ + {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ + {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ + {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ diff --git a/queue-2.6.31/pata_amd-do-not-filter-out-valid-modes-in-nv_mode_filter.patch b/queue-2.6.31/pata_amd-do-not-filter-out-valid-modes-in-nv_mode_filter.patch new file mode 100644 index 00000000000..ebecc3de11b --- /dev/null +++ b/queue-2.6.31/pata_amd-do-not-filter-out-valid-modes-in-nv_mode_filter.patch @@ -0,0 +1,45 @@ +From 90950a2504b66d626a73f55ca949a2e79ff4b7c4 Mon Sep 17 00:00:00 2001 +From: Robert Hancock +Date: Sat, 12 Sep 2009 23:54:47 -0600 +Subject: pata_amd: do not filter out valid modes in nv_mode_filter + +From: Robert Hancock + +commit 90950a2504b66d626a73f55ca949a2e79ff4b7c4 upstream. + +On a Compaq Presario V3000 laptop (NVIDIA MCP51 chipset), pata_amd selects +PIO0 mode for the PATA DVD-RAM drive instead of MWDMA2 which it supports: + +ata4.00: ATAPI: HL-DT-ST DVDRAM GSA-4084N, KQ09, max MWDMA2 +ata4: nv_mode_filter: 0x39f&0x7001->0x1, BIOS=0x0 (0x0) ACPI=0x7001 (60:600:0x11) +ata4.00: configured for PIO0 + +For some reason, the BIOS-set UDMA configuration returns 0 and the ACPI _GTM +reports that UDMA2 and PIO0 are enabled. This causes nv_mode_filter to end up +allowing only PIO0 and UDMA0-2. Since the drive doesn't support UDMA we end up +using PIO0. + +Since the controllers should always support PIO4, MWDMA2 and UDMA2 regardless +of what cable type is used, let's make sure we don't filter out these modes +regardless of what wacky settings the BIOS is using. + +Signed-off-by: Robert Hancock +Signed-off-by: Jeff Garzik +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/pata_amd.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/ata/pata_amd.c ++++ b/drivers/ata/pata_amd.c +@@ -307,6 +307,9 @@ static unsigned long nv_mode_filter(stru + limit |= ATA_MASK_PIO; + if (!(limit & (ATA_MASK_MWDMA | ATA_MASK_UDMA))) + limit |= ATA_MASK_MWDMA | ATA_MASK_UDMA; ++ /* PIO4, MWDMA2, UDMA2 should always be supported regardless of ++ cable detection result */ ++ limit |= ata_pack_xfermask(ATA_PIO4, ATA_MWDMA2, ATA_UDMA2); + + ata_port_printk(ap, KERN_DEBUG, "nv_mode_filter: 0x%lx&0x%lx->0x%lx, " + "BIOS=0x%lx (0x%x) ACPI=0x%lx%s\n", diff --git a/queue-2.6.31/perf-tools-fix-buffer-allocation.patch b/queue-2.6.31/perf-tools-fix-buffer-allocation.patch new file mode 100644 index 00000000000..dc43cb68999 --- /dev/null +++ b/queue-2.6.31/perf-tools-fix-buffer-allocation.patch @@ -0,0 +1,34 @@ +From a255a9981a8566a1efabec983b7811e937e662d2 Mon Sep 17 00:00:00 2001 +From: Eric Dumazet +Date: Thu, 24 Sep 2009 15:05:59 +0200 +Subject: perf tools: Fix buffer allocation + +From: Eric Dumazet + +commit a255a9981a8566a1efabec983b7811e937e662d2 upstream. + +"perf top" cores dump on my dev machine, if run from a directory +where vmlinux is present: + + *** glibc detected *** malloc(): memory corruption: 0x085670d0 *** + +Signed-off-by: Eric Dumazet +LKML-Reference: <4ABB6EB7.7000002@gmail.com> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + tools/perf/util/module.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tools/perf/util/module.c ++++ b/tools/perf/util/module.c +@@ -422,7 +422,7 @@ static int mod_dso__load_module_paths(st + len += strlen(uts.release); + len += strlen("/modules.dep"); + +- path = calloc(1, len); ++ path = calloc(1, len + 1); + if (path == NULL) + goto out_failure; + diff --git a/queue-2.6.31/perf_counter-fix-perf_copy_attr-pointer-arithmetic.patch b/queue-2.6.31/perf_counter-fix-perf_copy_attr-pointer-arithmetic.patch new file mode 100644 index 00000000000..c5591129ca2 --- /dev/null +++ b/queue-2.6.31/perf_counter-fix-perf_copy_attr-pointer-arithmetic.patch @@ -0,0 +1,73 @@ +From cdf8073d6b2c6c5a3cd6ce0e6c1297157f7f99ba Mon Sep 17 00:00:00 2001 +From: Ian Schram +Date: Fri, 18 Sep 2009 21:26:26 +0200 +Subject: perf_counter: Fix perf_copy_attr() pointer arithmetic + +From: Ian Schram + +commit cdf8073d6b2c6c5a3cd6ce0e6c1297157f7f99ba upstream. + +There is still some weird code in per_copy_attr(). Which supposedly +checks that all bytes trailing a struct are zero. + +It doesn't seem to get pointer arithmetic right. Since it +increments an iterating pointer by sizeof(unsigned long) rather +than 1. + +Signed-off-by: Ian Schram +[ v2: clean up the messy PTR_ALIGN logic as well. ] +Signed-off-by: Peter Zijlstra +Cc: Mike Galbraith +Cc: Paul Mackerras +Cc: Arnaldo Carvalho de Melo +Cc: Frederic Weisbecker +LKML-Reference: <4AB3DEE2.3030600@telenet.be> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/perf_counter.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +--- a/kernel/perf_counter.c ++++ b/kernel/perf_counter.c +@@ -4143,8 +4143,8 @@ done: + static int perf_copy_attr(struct perf_counter_attr __user *uattr, + struct perf_counter_attr *attr) + { +- int ret; + u32 size; ++ int ret; + + if (!access_ok(VERIFY_WRITE, uattr, PERF_ATTR_SIZE_VER0)) + return -EFAULT; +@@ -4169,19 +4169,19 @@ static int perf_copy_attr(struct perf_co + + /* + * If we're handed a bigger struct than we know of, +- * ensure all the unknown bits are 0. ++ * ensure all the unknown bits are 0 - i.e. new ++ * user-space does not rely on any kernel feature ++ * extensions we dont know about yet. + */ + if (size > sizeof(*attr)) { +- unsigned long val; +- unsigned long __user *addr; +- unsigned long __user *end; +- +- addr = PTR_ALIGN((void __user *)uattr + sizeof(*attr), +- sizeof(unsigned long)); +- end = PTR_ALIGN((void __user *)uattr + size, +- sizeof(unsigned long)); ++ unsigned char __user *addr; ++ unsigned char __user *end; ++ unsigned char val; ++ ++ addr = (void __user *)uattr + sizeof(*attr); ++ end = (void __user *)uattr + size; + +- for (; addr < end; addr += sizeof(unsigned long)) { ++ for (; addr < end; addr++) { + ret = get_user(val, addr); + if (ret) + return ret; diff --git a/queue-2.6.31/pm-pcmcia-drop-second-argument-of-pcmcia_socket_dev_suspend.patch b/queue-2.6.31/pm-pcmcia-drop-second-argument-of-pcmcia_socket_dev_suspend.patch new file mode 100644 index 00000000000..e8f808804ff --- /dev/null +++ b/queue-2.6.31/pm-pcmcia-drop-second-argument-of-pcmcia_socket_dev_suspend.patch @@ -0,0 +1,236 @@ +From 827b4649d4626bf97b203b4bcd69476bb9b4e760 Mon Sep 17 00:00:00 2001 +From: Rafael J. Wysocki +Date: Tue, 29 Sep 2009 00:10:41 +0200 +Subject: PM / PCMCIA: Drop second argument of pcmcia_socket_dev_suspend() + +From: Rafael J. Wysocki + +commit 827b4649d4626bf97b203b4bcd69476bb9b4e760 upstream. + +pcmcia_socket_dev_suspend() doesn't use its second argument, so it +may be dropped safely. + +This change is necessary for the subsequent yenta suspend/resume fix. + +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pcmcia/at91_cf.c | 2 +- + drivers/pcmcia/au1000_generic.c | 2 +- + drivers/pcmcia/bfin_cf_pcmcia.c | 2 +- + drivers/pcmcia/cs.c | 2 +- + drivers/pcmcia/i82092.c | 2 +- + drivers/pcmcia/i82365.c | 2 +- + drivers/pcmcia/m32r_cfc.c | 2 +- + drivers/pcmcia/m32r_pcc.c | 2 +- + drivers/pcmcia/m8xx_pcmcia.c | 2 +- + drivers/pcmcia/omap_cf.c | 2 +- + drivers/pcmcia/pd6729.c | 2 +- + drivers/pcmcia/pxa2xx_base.c | 2 +- + drivers/pcmcia/sa1100_generic.c | 2 +- + drivers/pcmcia/sa1111_generic.c | 2 +- + drivers/pcmcia/tcic.c | 2 +- + drivers/pcmcia/vrc4171_card.c | 2 +- + drivers/pcmcia/yenta_socket.c | 2 +- + include/pcmcia/ss.h | 2 +- + 18 files changed, 18 insertions(+), 18 deletions(-) + +--- a/drivers/pcmcia/at91_cf.c ++++ b/drivers/pcmcia/at91_cf.c +@@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platfo + struct at91_cf_socket *cf = platform_get_drvdata(pdev); + struct at91_cf_data *board = cf->board; + +- pcmcia_socket_dev_suspend(&pdev->dev, mesg); ++ pcmcia_socket_dev_suspend(&pdev->dev); + if (device_may_wakeup(&pdev->dev)) { + enable_irq_wake(board->det_pin); + if (board->irq_pin) +--- a/drivers/pcmcia/au1000_generic.c ++++ b/drivers/pcmcia/au1000_generic.c +@@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struc + static int au1x00_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int au1x00_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/bfin_cf_pcmcia.c ++++ b/drivers/pcmcia/bfin_cf_pcmcia.c +@@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(stru + + static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg) + { +- return pcmcia_socket_dev_suspend(&pdev->dev, mesg); ++ return pcmcia_socket_dev_suspend(&pdev->dev); + } + + static int bfin_cf_resume(struct platform_device *pdev) +--- a/drivers/pcmcia/cs.c ++++ b/drivers/pcmcia/cs.c +@@ -101,7 +101,7 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem); + static int socket_resume(struct pcmcia_socket *skt); + static int socket_suspend(struct pcmcia_socket *skt); + +-int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) ++int pcmcia_socket_dev_suspend(struct device *dev) + { + struct pcmcia_socket *socket; + +--- a/drivers/pcmcia/i82092.c ++++ b/drivers/pcmcia/i82092.c +@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_id + #ifdef CONFIG_PM + static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int i82092aa_socket_resume (struct pci_dev *dev) +--- a/drivers/pcmcia/i82365.c ++++ b/drivers/pcmcia/i82365.c +@@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socke + static int i82365_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int i82365_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/m32r_cfc.c ++++ b/drivers/pcmcia/m32r_cfc.c +@@ -699,7 +699,7 @@ static struct pccard_operations pcc_oper + static int cfc_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int cfc_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/m32r_pcc.c ++++ b/drivers/pcmcia/m32r_pcc.c +@@ -675,7 +675,7 @@ static struct pccard_operations pcc_oper + static int pcc_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int pcc_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/m8xx_pcmcia.c ++++ b/drivers/pcmcia/m8xx_pcmcia.c +@@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device + #ifdef CONFIG_PM + static int m8xx_suspend(struct platform_device *pdev, pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&pdev->dev, state); ++ return pcmcia_socket_dev_suspend(&pdev->dev); + } + + static int m8xx_resume(struct platform_device *pdev) +--- a/drivers/pcmcia/omap_cf.c ++++ b/drivers/pcmcia/omap_cf.c +@@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct + + static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg) + { +- return pcmcia_socket_dev_suspend(&pdev->dev, mesg); ++ return pcmcia_socket_dev_suspend(&pdev->dev); + } + + static int omap_cf_resume(struct platform_device *pdev) +--- a/drivers/pcmcia/pd6729.c ++++ b/drivers/pcmcia/pd6729.c +@@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove( + #ifdef CONFIG_PM + static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int pd6729_socket_resume(struct pci_dev *dev) +--- a/drivers/pcmcia/pxa2xx_base.c ++++ b/drivers/pcmcia/pxa2xx_base.c +@@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(stru + + static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/sa1100_generic.c ++++ b/drivers/pcmcia/sa1100_generic.c +@@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(stru + static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int sa11x0_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/sa1111_generic.c ++++ b/drivers/pcmcia/sa1111_generic.c +@@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struc + + static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int pcmcia_resume(struct sa1111_dev *dev) +--- a/drivers/pcmcia/tcic.c ++++ b/drivers/pcmcia/tcic.c +@@ -366,7 +366,7 @@ static int __init get_tcic_id(void) + static int tcic_drv_pcmcia_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int tcic_drv_pcmcia_resume(struct platform_device *dev) +--- a/drivers/pcmcia/vrc4171_card.c ++++ b/drivers/pcmcia/vrc4171_card.c +@@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_se + static int vrc4171_card_suspend(struct platform_device *dev, + pm_message_t state) + { +- return pcmcia_socket_dev_suspend(&dev->dev, state); ++ return pcmcia_socket_dev_suspend(&dev->dev); + } + + static int vrc4171_card_resume(struct platform_device *dev) +--- a/drivers/pcmcia/yenta_socket.c ++++ b/drivers/pcmcia/yenta_socket.c +@@ -1230,7 +1230,7 @@ static int yenta_dev_suspend (struct pci + struct yenta_socket *socket = pci_get_drvdata(dev); + int ret; + +- ret = pcmcia_socket_dev_suspend(&dev->dev, state); ++ ret = pcmcia_socket_dev_suspend(&dev->dev); + + if (socket) { + if (socket->type && socket->type->save_state) +--- a/include/pcmcia/ss.h ++++ b/include/pcmcia/ss.h +@@ -279,7 +279,7 @@ extern struct pccard_resource_ops pccard + extern struct pccard_resource_ops pccard_nonstatic_ops; + + /* socket drivers are expected to use these callbacks in their .drv struct */ +-extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state); ++extern int pcmcia_socket_dev_suspend(struct device *dev); + extern int pcmcia_socket_dev_resume(struct device *dev); + + /* socket drivers use this callback in their IRQ handler */ diff --git a/queue-2.6.31/pm-yenta-fix-cardbus-suspend-resume-regression.patch b/queue-2.6.31/pm-yenta-fix-cardbus-suspend-resume-regression.patch new file mode 100644 index 00000000000..9c777375e98 --- /dev/null +++ b/queue-2.6.31/pm-yenta-fix-cardbus-suspend-resume-regression.patch @@ -0,0 +1,158 @@ +From 0c570cdeb8fdfcb354a3e9cd81bfc6a09c19de0c Mon Sep 17 00:00:00 2001 +From: Rafael J. Wysocki +Date: Tue, 29 Sep 2009 00:11:03 +0200 +Subject: PM / yenta: Fix cardbus suspend/resume regression + +From: Rafael J. Wysocki + +commit 0c570cdeb8fdfcb354a3e9cd81bfc6a09c19de0c upstream. + +Since 2.6.29 the PCI PM core have been restoring the standard +configuration registers of PCI devices in the early phase of +resume. In particular, PCI devices without drivers have been handled +this way since commit 355a72d75b3b4f4877db4c9070c798238028ecb5 +(PCI: Rework default handling of suspend and resume). Unfortunately, +this leads to post-resume problems with CardBus devices which cannot +be accessed in the early phase of resume, because the sockets they +are on have not been woken up yet at that point. + +To solve this problem, move the yenta socket resume to the early +phase of resume and, analogously, move the suspend of it to the late +phase of suspend. Additionally, remove some unnecessary PCI code +from the yenta socket's resume routine. + +Fixes http://bugzilla.kernel.org/show_bug.cgi?id=13092, which is a +post-2.6.28 regression. + +Signed-off-by: Rafael J. Wysocki +Reported-by: Florian +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pcmcia/yenta_socket.c | 92 ++++++++++++++++++++++-------------------- + 1 file changed, 50 insertions(+), 42 deletions(-) + +--- a/drivers/pcmcia/yenta_socket.c ++++ b/drivers/pcmcia/yenta_socket.c +@@ -1225,60 +1225,71 @@ static int __devinit yenta_probe (struct + } + + #ifdef CONFIG_PM +-static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) ++static int yenta_dev_suspend_noirq(struct device *dev) + { +- struct yenta_socket *socket = pci_get_drvdata(dev); ++ struct pci_dev *pdev = to_pci_dev(dev); ++ struct yenta_socket *socket = pci_get_drvdata(pdev); + int ret; + +- ret = pcmcia_socket_dev_suspend(&dev->dev); ++ ret = pcmcia_socket_dev_suspend(dev); + +- if (socket) { +- if (socket->type && socket->type->save_state) +- socket->type->save_state(socket); +- +- /* FIXME: pci_save_state needs to have a better interface */ +- pci_save_state(dev); +- pci_read_config_dword(dev, 16*4, &socket->saved_state[0]); +- pci_read_config_dword(dev, 17*4, &socket->saved_state[1]); +- pci_disable_device(dev); +- +- /* +- * Some laptops (IBM T22) do not like us putting the Cardbus +- * bridge into D3. At a guess, some other laptop will +- * probably require this, so leave it commented out for now. +- */ +- /* pci_set_power_state(dev, 3); */ +- } ++ if (!socket) ++ return ret; ++ ++ if (socket->type && socket->type->save_state) ++ socket->type->save_state(socket); ++ ++ pci_save_state(pdev); ++ pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]); ++ pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]); ++ pci_disable_device(pdev); ++ ++ /* ++ * Some laptops (IBM T22) do not like us putting the Cardbus ++ * bridge into D3. At a guess, some other laptop will ++ * probably require this, so leave it commented out for now. ++ */ ++ /* pci_set_power_state(dev, 3); */ + + return ret; + } + +- +-static int yenta_dev_resume (struct pci_dev *dev) ++static int yenta_dev_resume_noirq(struct device *dev) + { +- struct yenta_socket *socket = pci_get_drvdata(dev); ++ struct pci_dev *pdev = to_pci_dev(dev); ++ struct yenta_socket *socket = pci_get_drvdata(pdev); ++ int ret; + +- if (socket) { +- int rc; ++ if (!socket) ++ return 0; + +- pci_set_power_state(dev, 0); +- /* FIXME: pci_restore_state needs to have a better interface */ +- pci_restore_state(dev); +- pci_write_config_dword(dev, 16*4, socket->saved_state[0]); +- pci_write_config_dword(dev, 17*4, socket->saved_state[1]); ++ pci_write_config_dword(pdev, 16*4, socket->saved_state[0]); ++ pci_write_config_dword(pdev, 17*4, socket->saved_state[1]); + +- rc = pci_enable_device(dev); +- if (rc) +- return rc; ++ ret = pci_enable_device(pdev); ++ if (ret) ++ return ret; + +- pci_set_master(dev); ++ pci_set_master(pdev); + +- if (socket->type && socket->type->restore_state) +- socket->type->restore_state(socket); +- } ++ if (socket->type && socket->type->restore_state) ++ socket->type->restore_state(socket); + +- return pcmcia_socket_dev_resume(&dev->dev); ++ return pcmcia_socket_dev_resume(dev); + } ++ ++static struct dev_pm_ops yenta_pm_ops = { ++ .suspend_noirq = yenta_dev_suspend_noirq, ++ .resume_noirq = yenta_dev_resume_noirq, ++ .freeze_noirq = yenta_dev_suspend_noirq, ++ .thaw_noirq = yenta_dev_resume_noirq, ++ .poweroff_noirq = yenta_dev_suspend_noirq, ++ .restore_noirq = yenta_dev_resume_noirq, ++}; ++ ++#define YENTA_PM_OPS (¥ta_pm_ops) ++#else ++#define YENTA_PM_OPS NULL + #endif + + #define CB_ID(vend,dev,type) \ +@@ -1376,10 +1387,7 @@ static struct pci_driver yenta_cardbus_d + .id_table = yenta_table, + .probe = yenta_probe, + .remove = __devexit_p(yenta_close), +-#ifdef CONFIG_PM +- .suspend = yenta_dev_suspend, +- .resume = yenta_dev_resume, +-#endif ++ .driver.pm = YENTA_PM_OPS, + }; + + diff --git a/queue-2.6.31/re-enable-lanman-security.patch b/queue-2.6.31/re-enable-lanman-security.patch new file mode 100644 index 00000000000..afcbca98e27 --- /dev/null +++ b/queue-2.6.31/re-enable-lanman-security.patch @@ -0,0 +1,36 @@ +From 20d1752f3d6bd32beb90949559e0d14a0b234445 Mon Sep 17 00:00:00 2001 +From: Chuck Ebbert +Date: Tue, 15 Sep 2009 01:53:21 -0400 +Subject: [CIFS] Re-enable Lanman security + +From: Chuck Ebbert + +commit 20d1752f3d6bd32beb90949559e0d14a0b234445 upstream. + +commit ac68392460ffefed13020967bae04edc4d3add06 ("[CIFS] Allow raw +ntlmssp code to be enabled with sec=ntlmssp") added a new bit to the +allowed security flags mask but seems to have inadvertently removed +Lanman security from the allowed flags. Add it back. + +Signed-off-by: Chuck Ebbert +Signed-off-by: Steve French +Signed-off-by: Greg Kroah-Hartman + +--- + fs/cifs/cifsglob.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/fs/cifs/cifsglob.h ++++ b/fs/cifs/cifsglob.h +@@ -572,9 +572,9 @@ require use of the stronger protocol */ + #define CIFSSEC_MUST_LANMAN 0x10010 + #define CIFSSEC_MUST_PLNTXT 0x20020 + #ifdef CONFIG_CIFS_UPCALL +-#define CIFSSEC_MASK 0xAF0AF /* allows weak security but also krb5 */ ++#define CIFSSEC_MASK 0xBF0BF /* allows weak security but also krb5 */ + #else +-#define CIFSSEC_MASK 0xA70A7 /* current flags supported if weak */ ++#define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ + #endif /* UPCALL */ + #else /* do not allow weak pw hash */ + #ifdef CONFIG_CIFS_UPCALL diff --git a/queue-2.6.31/serial-bfin_5xx-fix-building-as-module-when-early-printk-is-enabled.patch b/queue-2.6.31/serial-bfin_5xx-fix-building-as-module-when-early-printk-is-enabled.patch new file mode 100644 index 00000000000..c2bb52442cc --- /dev/null +++ b/queue-2.6.31/serial-bfin_5xx-fix-building-as-module-when-early-printk-is-enabled.patch @@ -0,0 +1,36 @@ +From 0271edd4b1b16f255162029359bb69c1ee4d9c3b Mon Sep 17 00:00:00 2001 +From: Mike Frysinger +Date: Thu, 6 Aug 2009 15:20:05 -0700 +Subject: serial: bfin_5xx: fix building as module when early printk is enabled + +From: Mike Frysinger + +commit 0271edd4b1b16f255162029359bb69c1ee4d9c3b upstream. + +Since early printk only makes sense/works when the serial driver is built +into the kernel, disable the option for this driver when it is going to be +built as a module. Otherwise we get build failures due to the ifdef +handling. + +Signed-off-by: Mike Frysinger +Cc: Alan Cox +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/serial/bfin_5xx.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/serial/bfin_5xx.c ++++ b/drivers/serial/bfin_5xx.c +@@ -42,6 +42,10 @@ + # undef CONFIG_EARLY_PRINTK + #endif + ++#ifdef CONFIG_SERIAL_BFIN_MODULE ++# undef CONFIG_EARLY_PRINTK ++#endif ++ + /* UART name and device definitions */ + #define BFIN_SERIAL_NAME "ttyBF" + #define BFIN_SERIAL_MAJOR 204 diff --git a/queue-2.6.31/series b/queue-2.6.31/series new file mode 100644 index 00000000000..d419e7f3b11 --- /dev/null +++ b/queue-2.6.31/series @@ -0,0 +1,67 @@ +pata_amd-do-not-filter-out-valid-modes-in-nv_mode_filter.patch +p54usb-add-zcomax-xg-705a-usbid.patch +x86-increase-min_gap-to-include-randomized-stack.patch +serial-bfin_5xx-fix-building-as-module-when-early-printk-is-enabled.patch +usb-option.c-add-support-for-zte-ac2726-evdo-modem.patch +usb-option-telit-uc864g-support.patch +video-s3c_fb.c-fix-build-with-config_hotplug-n.patch +kbuild-fix-cc1-options-check-to-ensure-we-do-not-use-fpic-when-compiling.patch +drivers-mfd-ab3100-core.c-fix-powerpc-build-error.patch +thinkpad-acpi-don-t-ask-about-brightness_mode-for-fw.-1v-and-1r.patch +acpi-pci_slot.ko-wants-a-64-bit-_sun.patch +fbcon-only-unbind-from-console-if-successfully-registered.patch +kallsyms-fix-segfault-in-prefix_underscores_count.patch +sisfb-change-sis_ddc_port-type-to-sisioaddress.patch +mmc_spi-fail-gracefully-if-host-or-card-do-not-support-the-switch-command.patch +alpha-agp-update.patch +fs-make-sure-data-stored-into-inode-is-properly-seen-before-unlocking-new-inode.patch +ecryptfs-handle-unrecognized-tag-3-cipher-codes.patch +ecryptfs-check-for-o_rdonly-lower-inodes-when-opening-lower-files.patch +ecryptfs-filename-encryption-only-supports-password-auth-tokens.patch +ecryptfs-validate-global-auth-tok-keys.patch +ecryptfs-prevent-lower-dentry-from-going-negative-during-unlink.patch +re-enable-lanman-security.patch +xen-make-fstack-protector-work-under-xen.patch +xen-only-enable-interrupts-while-actually-blocking-for-spinlock.patch +xen-use-stronger-barrier-after-unlocking-lock.patch +xen-check-efer-for-nx-before-setting-up-gdt-mapping.patch +perf_counter-fix-perf_copy_attr-pointer-arithmetic.patch +perf-tools-fix-buffer-allocation.patch +tty-serial-pcmcia-add-id-for-advantech-card.patch +pm-pcmcia-drop-second-argument-of-pcmcia_socket_dev_suspend.patch +pm-yenta-fix-cardbus-suspend-resume-regression.patch +sony-laptop-check-for-rfkill-hard-block-at-load-time.patch +nilfs2-fix-missing-zero-fill-initialization-of-btree-node-cache.patch +ar9170usb-add-usbid-for-tp-link-tl-wn821n-v2.patch +mtd-nand-fix-ecc-correction-bug-for-smc-ordering-for-ndfc-driver.patch +mtd-ofpart-check-availability-of-reg-property-instead-of-name-property.patch +mtd-cfi_cmdset_0002-add-0xff-intolerance-for-m29w128g.patch +usb-serial-ftdi_sio-new-hardware-support-hameg-power-supply.patch +usb-add-pids-for-ftdi-based-opendcc-hardware.patch +usb-serial-ftdi-handle-gnice-jtag-adaptors.patch +usb-cdc-wdm-driver-doesn-t-support-non-blocking-reads.patch +usb-fix-cdc-acm-regression-in-open.patch +cdc_acm-fix-to-use-modern-speed-interfaces.patch +tty-remove-dtr-rts-use-from-the-driver-open-methods.patch +tty-gigaset-really-fix-chars_in_buffer.patch +kaweth-fix-memory-leak-in-kaweth_control.patch +x86-sgi-uv-fix-ipi-macros.patch +usb-serial-pl2303-new-hardware-support-sanwa-multimeter.patch +usb-storage-fix-a-resume-path-gfp_noio-must-be-used.patch +usb-usb-storage-fails-to-attach-to-huawei-datacard-cdrom-device.patch +usb-usbtmc-sanity-checks-for-dev_dep_msg_in-urbs.patch +usb-sl811-hcd-fix-device-disconnect.patch +drm-i915-remove-restore-in-resume.patch +drm-i915-only-destroy-a-constructed-mmap-offset.patch +drm-i915-prevent-fifo-calculation-overflows-on-32-bits-with-high-dotclocks.patch +drm-i915-add-buffer-to-inactive-list-immediately-during-fault.patch +drm-i915-check-that-the-relocation-points-to-within-the-target.patch +drm-i915-fix-typo-for-wrong-lvds-clock-setting-on-igdng.patch +drm-i915-fix-ssc-frequence-for-igdng.patch +drm-i915-remove-dac-disable-in-crt-force-detect-on-igdng.patch +drm-i915-fix-lvds-panel-fitting-on-arrandale.patch +drm-i915-use-the-crt-ddc-to-get-the-edid-for-dvi-connector-on-mac.patch +drm-i915-fix-tiling-on-igdng.patch +agp-intel-fix-the-pre-9xx-chipset-flush.patch +nfsd4-fix-null-dereference-creating-nfsv4-callback-client.patch +can-fix-nohz-local_softirq_pending-08-warning.patch diff --git a/queue-2.6.31/sisfb-change-sis_ddc_port-type-to-sisioaddress.patch b/queue-2.6.31/sisfb-change-sis_ddc_port-type-to-sisioaddress.patch new file mode 100644 index 00000000000..cda05880aa1 --- /dev/null +++ b/queue-2.6.31/sisfb-change-sis_ddc_port-type-to-sisioaddress.patch @@ -0,0 +1,85 @@ +From 532f649f148bf70e6a5816d95fe55e6a065e8754 Mon Sep 17 00:00:00 2001 +From: Aaro Koskinen +Date: Tue, 22 Sep 2009 16:47:58 -0700 +Subject: sisfb: change SiS_DDC_Port type to SISIOADDRESS + +From: Aaro Koskinen + +commit 532f649f148bf70e6a5816d95fe55e6a065e8754 upstream. + +The patch enables the driver to be used on platforms such as ARM where an +I/O address is a 32-bit memory address. + +The patch avoids the following kernel oops: + +debian:~# modprobe sisfb +[ 73.070000] sisfb: Video ROM found +[ 73.080000] sisfb: Video RAM at 0x80000000, mapped to 0xe0a00000, size 1024k +[ 73.090000] sisfb: MMIO at 0x84080000, mapped to 0xe0b80000, size 256k +[ 73.090000] sisfb: Memory heap starting at 800K, size 32K +[ 73.360000] Unable to handle kernel paging request at virtual address 6e000844 +[ 73.380000] pgd = df230000 +[ 73.380000] [6e000844] *pgd=00000000 +[ 73.380000] Internal error: Oops: 8f5 [#1] +[ 73.380000] Modules linked in: sisfb(+) fb cfbcopyarea cfbimgblt cfbfillrect +[ 73.380000] CPU: 0 Not tainted (2.6.31-iop32x #1) +[ 73.380000] PC is at SiS_SetRegANDOR+0x10/0x38 [sisfb] +[ 73.380000] LR is at SiS_SetSCLKHigh+0x38/0x94 [sisfb] +[ 73.380000] pc : [] lr : [] psr: 60000013 +[ 73.380000] sp : df38fd00 ip : 6e000000 fp : 00000002 +[ 73.380000] r10: 00000108 r9 : 00000000 r8 : 00000108 +[ 73.380000] r7 : df064258 r6 : 00000110 r5 : 6e000844 r4 : 0000010a +[ 73.380000] r3 : 00000001 r2 : 0000000e r1 : 00000011 r0 : 00000844 +[ 73.380000] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user +[ 73.380000] Control: 0000397f Table: bf230000 DAC: 00000015 +[ 73.380000] Process modprobe (pid: 1849, stack limit = 0xdf38e270) +[ 73.380000] Stack: (0xdf38fd00 to 0xdf390000) +[ 73.380000] fd00: 0000010a 00000108 df064258 df064258 df064258 00000000 00000000 bf02c4e0 +[ 73.380000] fd20: 00000114 bf02c50c 00000013 00000114 0000010a df064258 00000000 bf02c980 +[ 73.380000] fd40: 00009c66 00000004 00000001 df064250 a0010000 a6a2a0a0 df064250 00000003 +[ 73.380000] fd60: df064250 00000000 df064258 0000fffd 00000000 00000000 00000000 bf033948 +[ 73.380000] fd80: 00000000 00000000 00000000 bf019e2c 00000000 df064a70 bf03b470 00010000 +[ 73.380000] fda0: 00000000 df064250 00000000 df831c00 00000012 bf039f70 00000000 c00abed8 +[ 73.380000] fdc0: 000008a6 000008a4 df0649b0 df064878 df064258 df064000 00000000 00000000 +[ 73.380000] fde0: 00000001 00008000 00000001 00030000 df81c930 bf049f88 df831c00 00000000 +[ 73.380000] fe00: bf049f58 df3952a0 c0447708 bf049f88 bf049fe0 c0191980 df831c00 c0191b10 +[ 73.380000] fe20: df831c58 bf049f58 df831c00 bf04aca8 df3952a0 df831c58 df831c58 bf049f88 +[ 73.380000] fe40: c01ba1b4 c01ba0a0 df831c58 df831c8c bf049f88 c01ba1b4 df3952a0 00000000 +[ 73.380000] fe60: c03e265c c01ba240 00000000 df38fe78 bf049f88 c01b990c df812938 df81b8d0 +[ 73.380000] fe80: df3952a0 df807780 00000000 00000060 bf049f88 c01b9224 bf0429c8 00000000 +[ 73.380000] fea0: bf049f58 00000000 bf049f88 00000000 00000000 bf04aea8 00000000 c01ba4e4 +[ 73.380000] fec0: e09861a0 bf049f58 00000000 bf049f88 00000000 c0191f20 00000000 00000000 +[ 73.380000] fee0: c03f7bac bf04d418 0000fff2 0000fff1 bf04ad08 0002f260 0002f260 e0986038 +[ 73.380000] ff00: e0986150 e098568b df143340 e0990280 00000036 c03d8b00 fffffffd 00000000 +[ 73.380000] ff20: bf04acfc 00000000 fffffffc 0003cf4b 00018098 c03f7bac 00000000 bf04d000 +[ 73.380000] ff40: df38e000 00000000 bedc0984 c00272a4 ffffffff c005bc88 00000000 00000000 +[ 73.380000] ff60: 0003cf4b 0003cf4b 00018098 bf04acfc 00000000 c0027fe8 df38e000 00000000 +[ 73.380000] ff80: bedc0984 c006882c 00001000 00000003 00000000 00009064 00000000 00008edc +[ 73.380000] ffa0: 00000080 c0027e20 00009064 00000000 4014e000 0003cf4b 00018098 0003cf4b +[ 73.380000] ffc0: 00009064 00000000 00008edc 00000080 00000000 00000000 40025000 bedc0984 +[ 73.380000] ffe0: 00000000 bedc08fc 0000b6b0 400e8f34 60000010 4014e000 00000000 00000000 +[ 73.380000] [] (SiS_SetRegANDOR+0x10/0x38 [sisfb]) from [] (0xdf064258) +[ 73.380000] Code: e92d0030 e20110ff e280546e e3a0c46e (e5c51000) +[ 73.680000] ---[ end trace 62a93e01df37a5f2 ]--- + +Signed-off-by: Aaro Koskinen +Cc: Thomas Winischhofer +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/video/sis/vstruct.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/video/sis/vstruct.h ++++ b/drivers/video/sis/vstruct.h +@@ -342,7 +342,7 @@ struct SiS_Private + unsigned short SiS_RY4COE; + unsigned short SiS_LCDHDES; + unsigned short SiS_LCDVDES; +- unsigned short SiS_DDC_Port; ++ SISIOADDRESS SiS_DDC_Port; + unsigned short SiS_DDC_Index; + unsigned short SiS_DDC_Data; + unsigned short SiS_DDC_NData; diff --git a/queue-2.6.31/sony-laptop-check-for-rfkill-hard-block-at-load-time.patch b/queue-2.6.31/sony-laptop-check-for-rfkill-hard-block-at-load-time.patch new file mode 100644 index 00000000000..c80553075cd --- /dev/null +++ b/queue-2.6.31/sony-laptop-check-for-rfkill-hard-block-at-load-time.patch @@ -0,0 +1,52 @@ +From 50fab0760a6c07cded229357a1351c325a575770 Mon Sep 17 00:00:00 2001 +From: Alan Jenkins +Date: Thu, 24 Sep 2009 20:15:24 +0100 +Subject: sony-laptop: check for rfkill hard block at load time + +From: Alan Jenkins + +commit 50fab0760a6c07cded229357a1351c325a575770 upstream. + +"I recently (on a flight) I found out that when I boot with the hard-switch +activated, so turning off all wireless activity on my laptop, the state +is not correctly announced in /dev/rfkill (reading it with rfkill command, +or my own gnome applet)... + +After turning off and on again the hard-switch the events were right." + +We can fix this by querying the firmware at load time and calling +rfkill_set_hw_state(). + +Signed-off-by: Alan Jenkins +Tested-by: Norbert Preining +Acked-by: Johannes Berg +Acked-by: Mattia Dongili +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/sony-laptop.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/platform/x86/sony-laptop.c ++++ b/drivers/platform/x86/sony-laptop.c +@@ -1081,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct a + struct rfkill *rfk; + enum rfkill_type type; + const char *name; ++ int result; ++ bool hwblock; + + switch (nc_type) { + case SONY_WIFI: +@@ -1108,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct a + if (!rfk) + return -ENOMEM; + ++ sony_call_snc_handle(0x124, 0x200, &result); ++ hwblock = !(result & 0x1); ++ rfkill_set_hw_state(rfk, hwblock); ++ + err = rfkill_register(rfk); + if (err) { + rfkill_destroy(rfk); diff --git a/queue-2.6.31/thinkpad-acpi-don-t-ask-about-brightness_mode-for-fw.-1v-and-1r.patch b/queue-2.6.31/thinkpad-acpi-don-t-ask-about-brightness_mode-for-fw.-1v-and-1r.patch new file mode 100644 index 00000000000..6980210263b --- /dev/null +++ b/queue-2.6.31/thinkpad-acpi-don-t-ask-about-brightness_mode-for-fw.-1v-and-1r.patch @@ -0,0 +1,49 @@ +From 6da25bf51689a5cc60370d30275dbb9e6852e0cb Mon Sep 17 00:00:00 2001 +From: Henrique de Moraes Holschuh +Date: Sat, 12 Sep 2009 15:22:11 -0300 +Subject: thinkpad-acpi: don't ask about brightness_mode for fw. 1V and 1R + +From: Henrique de Moraes Holschuh + +commit 6da25bf51689a5cc60370d30275dbb9e6852e0cb upstream. + +X40 (firmware 1V) and T41 (firmware 1R) have been confirmed to work +well with the new defaults, so we can stop pestering people to confirm +that fact. + +For now, whitelist just these two firmware types. It is best to have +at least one more firmware type confirmed for Radeon 9xxx and Intel +GMA-2 ThinkPads before removing the confirmation requests entirely. + +Reported-by: Robert de Rooy +Signed-off-by: Henrique de Moraes Holschuh +Signed-off-by: Len Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/thinkpad_acpi.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/platform/x86/thinkpad_acpi.c ++++ b/drivers/platform/x86/thinkpad_acpi.c +@@ -5655,16 +5655,16 @@ static const struct tpacpi_quirk brightn + /* Models with ATI GPUs known to require ECNVRAM mode */ + TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */ + +- /* Models with ATI GPUs (waiting confirmation) */ +- TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), ++ /* Models with ATI GPUs that can use ECNVRAM */ ++ TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC), + TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), + TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), + TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), + +- /* Models with Intel Extreme Graphics 2 (waiting confirmation) */ ++ /* Models with Intel Extreme Graphics 2 */ ++ TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_NOEC), + TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), + TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), +- TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), + + /* Models with Intel GMA900 */ + TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */ diff --git a/queue-2.6.31/tty-gigaset-really-fix-chars_in_buffer.patch b/queue-2.6.31/tty-gigaset-really-fix-chars_in_buffer.patch new file mode 100644 index 00000000000..6ff7bbcd8f6 --- /dev/null +++ b/queue-2.6.31/tty-gigaset-really-fix-chars_in_buffer.patch @@ -0,0 +1,65 @@ +From a4304f2d5a3823deea894026ec95e43b33912357 Mon Sep 17 00:00:00 2001 +From: Tilman Schmidt +Date: Thu, 6 Aug 2009 20:33:33 -0700 +Subject: tty: gigaset: really fix chars_in_buffer + +From: Tilman Schmidt + +commit a4304f2d5a3823deea894026ec95e43b33912357 upstream. + +The tty_operation chars_in_buffer() is not allowed to return a negative +value to signal an error. Corrects the problem flagged by commit +23198fda7182969b619613a555f8645fdc3dc334, "tty: fix chars_in_buffers". + +Signed-off-by: Tilman Schmidt +Cc: "David S. Miller" +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/isdn/gigaset/interface.c | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +--- a/drivers/isdn/gigaset/interface.c ++++ b/drivers/isdn/gigaset/interface.c +@@ -408,33 +408,28 @@ static int if_write_room(struct tty_stru + return retval; + } + +-/* FIXME: This function does not have error returns */ +- + static int if_chars_in_buffer(struct tty_struct *tty) + { + struct cardstate *cs; +- int retval = -ENODEV; ++ int retval = 0; + + cs = (struct cardstate *) tty->driver_data; + if (!cs) { + pr_err("%s: no cardstate\n", __func__); +- return -ENODEV; ++ return 0; + } + + gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__); + +- if (mutex_lock_interruptible(&cs->mutex)) +- return -ERESTARTSYS; // FIXME -EINTR? ++ mutex_lock(&cs->mutex); + +- if (!cs->connected) { ++ if (!cs->connected) + gig_dbg(DEBUG_IF, "not connected"); +- retval = -ENODEV; +- } else if (!cs->open_count) ++ else if (!cs->open_count) + dev_warn(cs->dev, "%s: device not opened\n", __func__); +- else if (cs->mstate != MS_LOCKED) { ++ else if (cs->mstate != MS_LOCKED) + dev_warn(cs->dev, "can't write to unlocked device\n"); +- retval = -EBUSY; +- } else ++ else + retval = cs->ops->chars_in_buffer(cs); + + mutex_unlock(&cs->mutex); diff --git a/queue-2.6.31/tty-remove-dtr-rts-use-from-the-driver-open-methods.patch b/queue-2.6.31/tty-remove-dtr-rts-use-from-the-driver-open-methods.patch new file mode 100644 index 00000000000..04f6d53db39 --- /dev/null +++ b/queue-2.6.31/tty-remove-dtr-rts-use-from-the-driver-open-methods.patch @@ -0,0 +1,34 @@ +From 9a68e39d4a701fb3be03cae9b462408664ebd205 Mon Sep 17 00:00:00 2001 +From: Alan Cox +Date: Sat, 19 Sep 2009 13:13:24 -0700 +Subject: tty: remove dtr/rts use from the driver open methods + +From: Alan Cox + +commit 9a68e39d4a701fb3be03cae9b462408664ebd205 upstream. + +These are handled by the tty_port core code which will raise and lower the +carrier correctly in tty_wait_until_ready + +Signed-off-by: Alan Cox +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/cp210x.c | 6 ------ + 1 file changed, 6 deletions(-) + +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -399,12 +399,6 @@ static int cp210x_open(struct tty_struct + + /* Configure the termios structure */ + cp210x_get_termios(tty, port); +- +- /* Set the DTR and RTS pins low */ +- cp210x_tiocmset_port(tty ? (struct usb_serial_port *) tty->driver_data +- : port, +- NULL, TIOCM_DTR | TIOCM_RTS, 0); +- + return 0; + } + diff --git a/queue-2.6.31/tty-serial-pcmcia-add-id-for-advantech-card.patch b/queue-2.6.31/tty-serial-pcmcia-add-id-for-advantech-card.patch new file mode 100644 index 00000000000..4ee1b39ca44 --- /dev/null +++ b/queue-2.6.31/tty-serial-pcmcia-add-id-for-advantech-card.patch @@ -0,0 +1,31 @@ +From 7a4b23104bd2624d16681158a9b338c502c103a0 Mon Sep 17 00:00:00 2001 +From: Wolfram Sang +Date: Sat, 1 Aug 2009 15:28:35 +0200 +Subject: tty: serial/pcmcia: add ID for Advantech card + +From: Wolfram Sang + +commit 7a4b23104bd2624d16681158a9b338c502c103a0 upstream. + +Add ID as reported in: + +http://lists.infradead.org/pipermail/linux-pcmcia/2009-May/006127.html + +Reported-by: Kenneth Moorman +Signed-off-by: Wolfram Sang +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/serial/serial_cs.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/serial/serial_cs.c ++++ b/drivers/serial/serial_cs.c +@@ -884,6 +884,7 @@ static struct pcmcia_device_id serial_id + PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ + PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ + PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), ++ PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"), + PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), + PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), + PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"), diff --git a/queue-2.6.31/usb-add-pids-for-ftdi-based-opendcc-hardware.patch b/queue-2.6.31/usb-add-pids-for-ftdi-based-opendcc-hardware.patch new file mode 100644 index 00000000000..9a146468fc0 --- /dev/null +++ b/queue-2.6.31/usb-add-pids-for-ftdi-based-opendcc-hardware.patch @@ -0,0 +1,47 @@ +From ec3815c3e14dc68d49428e6505ae99e86e5dd067 Mon Sep 17 00:00:00 2001 +From: mail@rainerkeller.de +Date: Thu, 3 Sep 2009 11:55:17 +0200 +Subject: USB: add PIDs for FTDI based OpenDCC hardware + +From: mail@rainerkeller.de + +commit ec3815c3e14dc68d49428e6505ae99e86e5dd067 upstream. + +Some devices from the OpenDCC project are missing in the list +of the FTDI PIDs. These PIDs are listed at +http://www.opendcc.de/elektronik/usb/opendcc_usb.html +(Sorry for the german only page.) +This patch adds the three missing devices. + +Signed-off-by: Rainer Keller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 3 +++ + drivers/usb/serial/ftdi_sio.h | 3 +++ + 2 files changed, 6 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -176,6 +176,9 @@ static struct usb_device_id id_table_com + { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, + { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, + { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, +--- a/drivers/usb/serial/ftdi_sio.h ++++ b/drivers/usb/serial/ftdi_sio.h +@@ -81,6 +81,9 @@ + + /* OpenDCC (www.opendcc.de) product id */ + #define FTDI_OPENDCC_PID 0xBFD8 ++#define FTDI_OPENDCC_SNIFFER_PID 0xBFD9 ++#define FTDI_OPENDCC_THROTTLE_PID 0xBFDA ++#define FTDI_OPENDCC_GATEWAY_PID 0xBFDB + + /* Sprog II (Andrew Crosland's SprogII DCC interface) */ + #define FTDI_SPROG_II 0xF0C8 diff --git a/queue-2.6.31/usb-cdc-wdm-driver-doesn-t-support-non-blocking-reads.patch b/queue-2.6.31/usb-cdc-wdm-driver-doesn-t-support-non-blocking-reads.patch new file mode 100644 index 00000000000..0a51a16408d --- /dev/null +++ b/queue-2.6.31/usb-cdc-wdm-driver-doesn-t-support-non-blocking-reads.patch @@ -0,0 +1,83 @@ +From 7f1dc313d01f5f0f84c06051343a3b8623932d3c Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Wed, 9 Sep 2009 10:12:48 +0200 +Subject: USB: CDC WDM driver doesn't support non-blocking reads + +From: Oliver Neukum + +commit 7f1dc313d01f5f0f84c06051343a3b8623932d3c upstream. + +support for O_NONBLOCK in read and write path +by simply not waiting for data in read or availability +of the write urb in write but returning -EAGAIN + +Signed-off-by: Oliver Neukum +Tested-by: Marcel Holtmann +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-wdm.c | 30 ++++++++++++++++++++++++------ + 1 file changed, 24 insertions(+), 6 deletions(-) + +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -313,8 +313,13 @@ static ssize_t wdm_write + r = usb_autopm_get_interface(desc->intf); + if (r < 0) + goto outnp; +- r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, +- &desc->flags)); ++ ++ if (!file->f_flags && O_NONBLOCK) ++ r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, ++ &desc->flags)); ++ else ++ if (test_bit(WDM_IN_USE, &desc->flags)) ++ r = -EAGAIN; + if (r < 0) + goto out; + +@@ -377,7 +382,7 @@ outnl: + static ssize_t wdm_read + (struct file *file, char __user *buffer, size_t count, loff_t *ppos) + { +- int rv, cntr; ++ int rv, cntr = 0; + int i = 0; + struct wdm_device *desc = file->private_data; + +@@ -389,10 +394,23 @@ static ssize_t wdm_read + if (desc->length == 0) { + desc->read = 0; + retry: ++ if (test_bit(WDM_DISCONNECTING, &desc->flags)) { ++ rv = -ENODEV; ++ goto err; ++ } + i++; +- rv = wait_event_interruptible(desc->wait, +- test_bit(WDM_READ, &desc->flags)); ++ if (file->f_flags & O_NONBLOCK) { ++ if (!test_bit(WDM_READ, &desc->flags)) { ++ rv = cntr ? cntr : -EAGAIN; ++ goto err; ++ } ++ rv = 0; ++ } else { ++ rv = wait_event_interruptible(desc->wait, ++ test_bit(WDM_READ, &desc->flags)); ++ } + ++ /* may have happened while we slept */ + if (test_bit(WDM_DISCONNECTING, &desc->flags)) { + rv = -ENODEV; + goto err; +@@ -448,7 +466,7 @@ retry: + + err: + mutex_unlock(&desc->rlock); +- if (rv < 0) ++ if (rv < 0 && rv != -EAGAIN) + dev_err(&desc->intf->dev, "wdm_read: exit error\n"); + return rv; + } diff --git a/queue-2.6.31/usb-fix-cdc-acm-regression-in-open.patch b/queue-2.6.31/usb-fix-cdc-acm-regression-in-open.patch new file mode 100644 index 00000000000..cfd96260b83 --- /dev/null +++ b/queue-2.6.31/usb-fix-cdc-acm-regression-in-open.patch @@ -0,0 +1,39 @@ +From 7af25b4b34a2439020d78da765a3bed0ff73f25c Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Tue, 8 Sep 2009 23:51:28 +0200 +Subject: USB: fix cdc-acm regression in open + +From: Oliver Neukum + +commit 7af25b4b34a2439020d78da765a3bed0ff73f25c upstream. + +cdc-acm needs to set a flag during open to tell the +tty layer that the device is initialized + +Signed-off-by: Oliver Neukum +Cc: Marcel Holtmann +Cc: Paul Martin +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-acm.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -59,6 +59,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -609,6 +610,7 @@ static int acm_tty_open(struct tty_struc + acm->throttle = 0; + + tasklet_schedule(&acm->urb_task); ++ set_bit(ASYNCB_INITIALIZED, &acm->port.flags); + rv = tty_port_block_til_ready(&acm->port, tty, filp); + done: + mutex_unlock(&acm->mutex); diff --git a/queue-2.6.31/usb-option-telit-uc864g-support.patch b/queue-2.6.31/usb-option-telit-uc864g-support.patch new file mode 100644 index 00000000000..49c43c87a96 --- /dev/null +++ b/queue-2.6.31/usb-option-telit-uc864g-support.patch @@ -0,0 +1,37 @@ +From ce60c48871d2b3a15ab3fa2450e783bebb4ae407 Mon Sep 17 00:00:00 2001 +From: Manuel Lauss +Date: Tue, 1 Sep 2009 09:04:35 +0200 +Subject: USB: option: TELIT UC864G support + +From: Manuel Lauss + +commit ce60c48871d2b3a15ab3fa2450e783bebb4ae407 upstream. + +Add ID for Telit UC-864G GPS/UMTS/WCDMA modem and GPS receiver +to the option driver. + +Signed-off-by: Manuel Lauss +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -292,6 +292,7 @@ static int option_resume(struct usb_ser + + #define TELIT_VENDOR_ID 0x1bc7 + #define TELIT_PRODUCT_UC864E 0x1003 ++#define TELIT_PRODUCT_UC864G 0x1004 + + /* ZTE PRODUCTS */ + #define ZTE_VENDOR_ID 0x19d2 +@@ -504,6 +505,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ + { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, ++ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) }, diff --git a/queue-2.6.31/usb-option.c-add-support-for-zte-ac2726-evdo-modem.patch b/queue-2.6.31/usb-option.c-add-support-for-zte-ac2726-evdo-modem.patch new file mode 100644 index 00000000000..54da9da9408 --- /dev/null +++ b/queue-2.6.31/usb-option.c-add-support-for-zte-ac2726-evdo-modem.patch @@ -0,0 +1,37 @@ +From a67d8e6c1e49dc919c9d5480583fad8a46fc00aa Mon Sep 17 00:00:00 2001 +From: Huzaifa Sidhpurwala +Date: Tue, 1 Sep 2009 10:07:41 +0530 +Subject: USB: option.c Add support for ZTE AC2726 EVDO modem + +From: Huzaifa Sidhpurwala + +commit a67d8e6c1e49dc919c9d5480583fad8a46fc00aa upstream. + +A few days ago i got the latest ZTE EVDO modem shown at: +http://img.alibaba.com/photo/240150115/ZTE_AC2726_EVDO_USB_Data_Modem.jpg + +It seems that the latest kernel does not have support for it. +I wrote a small patch for the options.c module to add the relevant usb +ids to it. + +From: Huzaifa Sidhpurwala +Signed-off-by: Greg Kroah-Hartman + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -299,6 +299,7 @@ static int option_resume(struct usb_serial *serial); + #define ZTE_PRODUCT_MF626 0x0031 + #define ZTE_PRODUCT_CDMA_TECH 0xfffe + #define ZTE_PRODUCT_AC8710 0xfff1 ++#define ZTE_PRODUCT_AC2726 0xfff5 + + #define BENQ_VENDOR_ID 0x04a5 + #define BENQ_PRODUCT_H10 0x4068 +@@ -571,6 +572,7 @@ static struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, + { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, + { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, + { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) }, diff --git a/queue-2.6.31/usb-serial-ftdi-handle-gnice-jtag-adaptors.patch b/queue-2.6.31/usb-serial-ftdi-handle-gnice-jtag-adaptors.patch new file mode 100644 index 00000000000..54a52eb4795 --- /dev/null +++ b/queue-2.6.31/usb-serial-ftdi-handle-gnice-jtag-adaptors.patch @@ -0,0 +1,42 @@ +From 11eaf170363d264ff587f300e41c927ba5a33967 Mon Sep 17 00:00:00 2001 +From: Michael Hennerich +Date: Mon, 14 Sep 2009 10:39:53 -0400 +Subject: USB: serial: ftdi: handle gnICE+ JTAG adaptors + +From: Michael Hennerich + +commit 11eaf170363d264ff587f300e41c927ba5a33967 upstream. + +Detect the UART on interface1 and blacklist interface0 (as that is the +JTAG port). + +Signed-off-by: Michael Hennerich +Signed-off-by: Mike Frysinger +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 2 ++ + drivers/usb/serial/ftdi_sio.h | 1 + + 2 files changed, 3 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -697,6 +697,8 @@ static struct usb_device_id id_table_com + { USB_DEVICE(DE_VID, WHT_PID) }, + { USB_DEVICE(ADI_VID, ADI_GNICE_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, ++ { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), ++ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, + { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, +--- a/drivers/usb/serial/ftdi_sio.h ++++ b/drivers/usb/serial/ftdi_sio.h +@@ -933,6 +933,7 @@ + */ + #define ADI_VID 0x0456 + #define ADI_GNICE_PID 0xF000 ++#define ADI_GNICEPLUS_PID 0xF001 + + /* + * JETI SPECTROMETER SPECBOS 1201 diff --git a/queue-2.6.31/usb-serial-ftdi_sio-new-hardware-support-hameg-power-supply.patch b/queue-2.6.31/usb-serial-ftdi_sio-new-hardware-support-hameg-power-supply.patch new file mode 100644 index 00000000000..db2fc08e36e --- /dev/null +++ b/queue-2.6.31/usb-serial-ftdi_sio-new-hardware-support-hameg-power-supply.patch @@ -0,0 +1,46 @@ +From e7d7fcc09ebde1ea1773521ecab5a3f0ad6bef6e Mon Sep 17 00:00:00 2001 +From: Pawel Ludwikow +Date: Thu, 27 Aug 2009 14:15:50 +0200 +Subject: USB: serial: ftdi_sio: new hardware support - hameg power supply + +From: Pawel Ludwikow + +commit e7d7fcc09ebde1ea1773521ecab5a3f0ad6bef6e upstream. + +I'd like to present my small patch enabling to use Hameg HM8143 programmable +power supply with linux. + +Signed-off-by: Pawel Ludwikow +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 2 ++ + drivers/usb/serial/ftdi_sio.h | 6 ++++++ + 2 files changed, 8 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -702,6 +702,8 @@ static struct usb_device_id id_table_com + { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, + { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, ++ { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, ++ { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, + { }, /* Optional parameter entry */ + { } /* Terminating entry */ + }; +--- a/drivers/usb/serial/ftdi_sio.h ++++ b/drivers/usb/serial/ftdi_sio.h +@@ -968,6 +968,12 @@ + #define MARVELL_OPENRD_PID 0x9e90 + + /* ++ * Hameg HO820 and HO870 interface (using VID 0x0403) ++ */ ++#define HAMEG_HO820_PID 0xed74 ++#define HAMEG_HO870_PID 0xed71 ++ ++/* + * BmRequestType: 1100 0000b + * bRequest: FTDI_E2_READ + * wValue: 0 diff --git a/queue-2.6.31/usb-serial-pl2303-new-hardware-support-sanwa-multimeter.patch b/queue-2.6.31/usb-serial-pl2303-new-hardware-support-sanwa-multimeter.patch new file mode 100644 index 00000000000..af7b864bbb7 --- /dev/null +++ b/queue-2.6.31/usb-serial-pl2303-new-hardware-support-sanwa-multimeter.patch @@ -0,0 +1,40 @@ +From 35904e6b5106fda51b04c8b8080c04466865415f Mon Sep 17 00:00:00 2001 +From: Pawel Ludwikow +Date: Thu, 27 Aug 2009 14:15:50 +0200 +Subject: USB: serial: pl2303: new hardware support - sanwa multimeter + +From: Pawel Ludwikow + +commit 35904e6b5106fda51b04c8b8080c04466865415f upstream. + +I'd like to present my small patch enabling to use Sanwa PC5000 +mulitimeter with linux. + +Signed-off-by: Pawel Ludwikow +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/pl2303.c | 1 + + drivers/usb/serial/pl2303.h | 4 ++++ + 2 files changed, 5 insertions(+) + +--- a/drivers/usb/serial/pl2303.c ++++ b/drivers/usb/serial/pl2303.c +@@ -96,6 +96,7 @@ static struct usb_device_id id_table [] + { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, + { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, + { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, ++ { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, + { } /* Terminating entry */ + }; + +--- a/drivers/usb/serial/pl2303.h ++++ b/drivers/usb/serial/pl2303.h +@@ -130,3 +130,7 @@ + /* Sony, USB data cable for CMD-Jxx mobile phones */ + #define SONY_VENDOR_ID 0x054c + #define SONY_QN3USB_PRODUCT_ID 0x0437 ++ ++/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */ ++#define SANWA_VENDOR_ID 0x11ad ++#define SANWA_PRODUCT_ID 0x0001 diff --git a/queue-2.6.31/usb-sl811-hcd-fix-device-disconnect.patch b/queue-2.6.31/usb-sl811-hcd-fix-device-disconnect.patch new file mode 100644 index 00000000000..a413db42482 --- /dev/null +++ b/queue-2.6.31/usb-sl811-hcd-fix-device-disconnect.patch @@ -0,0 +1,42 @@ +From eb661bc88252e5c6dc69df732e77e42981dd4d8b Mon Sep 17 00:00:00 2001 +From: Hennerich, Michael +Date: Wed, 2 Sep 2009 09:26:21 +0100 +Subject: USB: sl811-hcd: Fix device disconnect: + +From: Hennerich, Michael + +commit eb661bc88252e5c6dc69df732e77e42981dd4d8b upstream. + +SL811 Device detected after removal used to be working in linux-2.6.22 +but then broke somewhere between 2.6.22 and 2.6.28. Current +hub_port_connect_change() in drivers/usb/core/hub.c won't call +usb_disconnect() in case the SL811 driver sets portstatus +USB_PORT_FEAT_CONNECTION upon removal. +AFAIK the SL811 has only a combined Device Insert/Remove +detection bit, therefore use a count to distinguish insert or remove. + + +Signed-Off-By: Michael Hennerich +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/sl811-hcd.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +--- a/drivers/usb/host/sl811-hcd.c ++++ b/drivers/usb/host/sl811-hcd.c +@@ -719,8 +719,12 @@ retry: + /* port status seems weird until after reset, so + * force the reset and make khubd clean up later. + */ +- sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION) +- | (1 << USB_PORT_FEAT_CONNECTION); ++ if (sl811->stat_insrmv & 1) ++ sl811->port1 |= 1 << USB_PORT_FEAT_CONNECTION; ++ else ++ sl811->port1 &= ~(1 << USB_PORT_FEAT_CONNECTION); ++ ++ sl811->port1 |= 1 << USB_PORT_FEAT_C_CONNECTION; + + } else if (irqstat & SL11H_INTMASK_RD) { + if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)) { diff --git a/queue-2.6.31/usb-storage-fix-a-resume-path-gfp_noio-must-be-used.patch b/queue-2.6.31/usb-storage-fix-a-resume-path-gfp_noio-must-be-used.patch new file mode 100644 index 00000000000..a2b89c78db6 --- /dev/null +++ b/queue-2.6.31/usb-storage-fix-a-resume-path-gfp_noio-must-be-used.patch @@ -0,0 +1,31 @@ +From e5dc8ae121592239c2a2521d383bcb789849b2a3 Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Wed, 26 Aug 2009 19:56:12 +0200 +Subject: USB: storage: fix a resume path GFP_NOIO must be used + +From: Oliver Neukum + +commit e5dc8ae121592239c2a2521d383bcb789849b2a3 upstream. + +In the resume path of a block driver GFP_NOIO must be used to +avoid a possible deadlock. The onetouch subdriver of storage violates +the requirement. + +Signed-off-by: Oliver Neukum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/storage/onetouch.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/storage/onetouch.c ++++ b/drivers/usb/storage/onetouch.c +@@ -163,7 +163,7 @@ static void usb_onetouch_pm_hook(struct + usb_kill_urb(onetouch->irq); + break; + case US_RESUME: +- if (usb_submit_urb(onetouch->irq, GFP_KERNEL) != 0) ++ if (usb_submit_urb(onetouch->irq, GFP_NOIO) != 0) + dev_err(&onetouch->irq->dev->dev, + "usb_submit_urb failed\n"); + break; diff --git a/queue-2.6.31/usb-usb-storage-fails-to-attach-to-huawei-datacard-cdrom-device.patch b/queue-2.6.31/usb-usb-storage-fails-to-attach-to-huawei-datacard-cdrom-device.patch new file mode 100644 index 00000000000..8d2f082ca9d --- /dev/null +++ b/queue-2.6.31/usb-usb-storage-fails-to-attach-to-huawei-datacard-cdrom-device.patch @@ -0,0 +1,29 @@ +From d0defb855c8504c49b92bdc0203689ce9b4cf7ba Mon Sep 17 00:00:00 2001 +From: fangxiaozhi +Date: Fri, 7 Aug 2009 12:30:35 +0800 +Subject: USB: usb-storage fails to attach to Huawei Datacard cdrom device + +From: fangxiaozhi + +commit d0defb855c8504c49b92bdc0203689ce9b4cf7ba upstream. + +In this patch, we always make the return value of function +usb_stor_huawei_e220_init to be zero. Then it will not prevent usb-storage +driver from attaching to the CDROM device of Huawei Datacard. + +Signed-off-by: fangxiaozhi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/storage/initializers.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/storage/initializers.c ++++ b/drivers/usb/storage/initializers.c +@@ -102,5 +102,5 @@ int usb_stor_huawei_e220_init(struct us_ + USB_TYPE_STANDARD | USB_RECIP_DEVICE, + 0x01, 0x0, NULL, 0x0, 1000); + US_DEBUGP("Huawei mode set result is %d\n", result); +- return (result ? 0 : -ENODEV); ++ return 0; + } diff --git a/queue-2.6.31/usb-usbtmc-sanity-checks-for-dev_dep_msg_in-urbs.patch b/queue-2.6.31/usb-usbtmc-sanity-checks-for-dev_dep_msg_in-urbs.patch new file mode 100644 index 00000000000..60b13fb3d48 --- /dev/null +++ b/queue-2.6.31/usb-usbtmc-sanity-checks-for-dev_dep_msg_in-urbs.patch @@ -0,0 +1,74 @@ +From 665d7662d15441b4b3e54131a9418a1a198d0d31 Mon Sep 17 00:00:00 2001 +From: Guus Sliepen +Date: Wed, 22 Jul 2009 17:39:42 +0200 +Subject: USB: usbtmc: sanity checks for DEV_DEP_MSG_IN urbs + +From: Guus Sliepen + +commit 665d7662d15441b4b3e54131a9418a1a198d0d31 upstream. + +According to the specifications, an instrument should not return more data in a +DEV_DEP_MSG_IN urb than requested. However, some instruments can send more +than requested. This could cause the kernel to write the extra data past the +end of the buffer provided by read(). + +Fix this by checking that the value of the TranserSize field is not larger than +the urb itself and not larger than the size of the userspace buffer. Also +correctly decrement the remaining size of the buffer when userspace read()s +more than USBTMC_SIZE_IOBUFFER. + +Signed-off-by: Guus Sliepen +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/usbtmc.c | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +--- a/drivers/usb/class/usbtmc.c ++++ b/drivers/usb/class/usbtmc.c +@@ -367,13 +367,13 @@ static ssize_t usbtmc_read(struct file * + { + struct usbtmc_device_data *data; + struct device *dev; +- unsigned long int n_characters; ++ u32 n_characters; + u8 *buffer; + int actual; +- int done; +- int remaining; ++ size_t done; ++ size_t remaining; + int retval; +- int this_part; ++ size_t this_part; + + /* Get pointer to private data structure */ + data = filp->private_data; +@@ -455,6 +455,18 @@ static ssize_t usbtmc_read(struct file * + (buffer[6] << 16) + + (buffer[7] << 24); + ++ /* Ensure the instrument doesn't lie about it */ ++ if(n_characters > actual - 12) { ++ dev_err(dev, "Device lies about message size: %zu > %zu\n", n_characters, actual - 12); ++ n_characters = actual - 12; ++ } ++ ++ /* Ensure the instrument doesn't send more back than requested */ ++ if(n_characters > this_part) { ++ dev_err(dev, "Device returns more than requested: %zu > %zu\n", done + n_characters, done + this_part); ++ n_characters = this_part; ++ } ++ + /* Copy buffer to user space */ + if (copy_to_user(buf + done, &buffer[12], n_characters)) { + /* There must have been an addressing problem */ +@@ -465,6 +477,8 @@ static ssize_t usbtmc_read(struct file * + done += n_characters; + if (n_characters < USBTMC_SIZE_IOBUFFER) + remaining = 0; ++ else ++ remaining -= n_characters; + } + + /* Update file position value */ diff --git a/queue-2.6.31/video-s3c_fb.c-fix-build-with-config_hotplug-n.patch b/queue-2.6.31/video-s3c_fb.c-fix-build-with-config_hotplug-n.patch new file mode 100644 index 00000000000..23d9630fc40 --- /dev/null +++ b/queue-2.6.31/video-s3c_fb.c-fix-build-with-config_hotplug-n.patch @@ -0,0 +1,37 @@ +From 3163eaba34943967aebb1eefa0d4bdc4e5dc197c Mon Sep 17 00:00:00 2001 +From: Peter Korsgaard +Date: Tue, 22 Sep 2009 16:47:55 -0700 +Subject: video: s3c_fb.c: fix build with CONFIG_HOTPLUG=n + +From: Peter Korsgaard + +commit 3163eaba34943967aebb1eefa0d4bdc4e5dc197c upstream. + +Fixes `s3c_fb_remove' referenced in section `.data' of +drivers/built-in.o: defined in discarded section `.devexit.text' of +drivers/built-in.o + +With CONFIG_HOTPLUG=n, functions marked with __devexit gets removed, +so make sure we use __devexit_p when referencing pointers to them. + +Signed-off-by: Peter Korsgaard +Acked-by: Ben Dooks +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/video/s3c-fb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/video/s3c-fb.c ++++ b/drivers/video/s3c-fb.c +@@ -1036,7 +1036,7 @@ static int s3c_fb_resume(struct platform + + static struct platform_driver s3c_fb_driver = { + .probe = s3c_fb_probe, +- .remove = s3c_fb_remove, ++ .remove = __devexit_p(s3c_fb_remove), + .suspend = s3c_fb_suspend, + .resume = s3c_fb_resume, + .driver = { diff --git a/queue-2.6.31/x86-increase-min_gap-to-include-randomized-stack.patch b/queue-2.6.31/x86-increase-min_gap-to-include-randomized-stack.patch new file mode 100644 index 00000000000..51cb8a651ef --- /dev/null +++ b/queue-2.6.31/x86-increase-min_gap-to-include-randomized-stack.patch @@ -0,0 +1,73 @@ +From 80938332d8cf652f6b16e0788cf0ca136befe0b5 Mon Sep 17 00:00:00 2001 +From: Michal Hocko +Date: Tue, 8 Sep 2009 11:01:55 +0200 +Subject: x86: Increase MIN_GAP to include randomized stack + +From: Michal Hocko + +commit 80938332d8cf652f6b16e0788cf0ca136befe0b5 upstream. + +Currently we are not including randomized stack size when calculating +mmap_base address in arch_pick_mmap_layout for topdown case. This might +cause that mmap_base starts in the stack reserved area because stack is +randomized by 1GB for 64b (8MB for 32b) and the minimum gap is 128MB. + +If the stack really grows down to mmap_base then we can get silent mmap +region overwrite by the stack values. + +Let's include maximum stack randomization size into MIN_GAP which is +used as the low bound for the gap in mmap. + +Signed-off-by: Michal Hocko +LKML-Reference: <1252400515-6866-1-git-send-email-mhocko@suse.cz> +Acked-by: Jiri Kosina +Signed-off-by: H. Peter Anvin +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/include/asm/elf.h | 2 ++ + arch/x86/mm/mmap.c | 17 +++++++++++++++-- + 2 files changed, 17 insertions(+), 2 deletions(-) + +--- a/arch/x86/include/asm/elf.h ++++ b/arch/x86/include/asm/elf.h +@@ -299,6 +299,8 @@ do { \ + + #ifdef CONFIG_X86_32 + ++#define STACK_RND_MASK (0x7ff) ++ + #define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO)) + + #define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled) +--- a/arch/x86/mm/mmap.c ++++ b/arch/x86/mm/mmap.c +@@ -29,13 +29,26 @@ + #include + #include + #include ++#include ++ ++static unsigned int stack_maxrandom_size(void) ++{ ++ unsigned int max = 0; ++ if ((current->flags & PF_RANDOMIZE) && ++ !(current->personality & ADDR_NO_RANDOMIZE)) { ++ max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT; ++ } ++ ++ return max; ++} ++ + + /* + * Top of mmap area (just below the process stack). + * +- * Leave an at least ~128 MB hole. ++ * Leave an at least ~128 MB hole with possible stack randomization. + */ +-#define MIN_GAP (128*1024*1024) ++#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) + #define MAX_GAP (TASK_SIZE/6*5) + + /* diff --git a/queue-2.6.31/x86-sgi-uv-fix-ipi-macros.patch b/queue-2.6.31/x86-sgi-uv-fix-ipi-macros.patch new file mode 100644 index 00000000000..b57f1c9281e --- /dev/null +++ b/queue-2.6.31/x86-sgi-uv-fix-ipi-macros.patch @@ -0,0 +1,33 @@ +From d2374aecda3f6c9b0d13287027132a37311da300 Mon Sep 17 00:00:00 2001 +From: Jack Steiner +Date: Wed, 9 Sep 2009 10:41:05 -0500 +Subject: x86: SGI UV: Fix IPI macros + +From: Jack Steiner + +commit d2374aecda3f6c9b0d13287027132a37311da300 upstream. + +The UV BIOS has changed the way interrupt remapping is being done. +This affects the id used for sending IPIs. The upper id bits no +longer need to be masked off. + +Signed-off-by: Jack Steiner +LKML-Reference: <20090909154104.GA25083@sgi.com> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/include/asm/uv/uv_hub.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/x86/include/asm/uv/uv_hub.h ++++ b/arch/x86/include/asm/uv/uv_hub.h +@@ -422,7 +422,7 @@ static inline void uv_hub_send_ipi(int p + unsigned long val; + + val = (1UL << UVH_IPI_INT_SEND_SHFT) | +- ((apicid & 0x3f) << UVH_IPI_INT_APIC_ID_SHFT) | ++ ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | + (vector << UVH_IPI_INT_VECTOR_SHFT); + uv_write_global_mmr64(pnode, UVH_IPI_INT, val); + } diff --git a/queue-2.6.31/xen-check-efer-for-nx-before-setting-up-gdt-mapping.patch b/queue-2.6.31/xen-check-efer-for-nx-before-setting-up-gdt-mapping.patch new file mode 100644 index 00000000000..4f36dbd2585 --- /dev/null +++ b/queue-2.6.31/xen-check-efer-for-nx-before-setting-up-gdt-mapping.patch @@ -0,0 +1,60 @@ +From b75fe4e5b869f8dbebd36df64a7fcda0c5b318ed Mon Sep 17 00:00:00 2001 +From: Jeremy Fitzhardinge +Date: Mon, 21 Sep 2009 13:34:06 -0700 +Subject: xen: check EFER for NX before setting up GDT mapping + +From: Jeremy Fitzhardinge + +commit b75fe4e5b869f8dbebd36df64a7fcda0c5b318ed upstream. + +x86-64 assumes NX is available by default, so we need to +explicitly check for it before using NX. Some first-generation +Intel x86-64 processors didn't support NX, and even recent systems +allow it to be disabled in BIOS. + +[ Impact: prevent Xen crash on NX-less 64-bit machines ] + +Signed-off-by: Jeremy Fitzhardinge +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/mm/Makefile | 1 + + arch/x86/xen/enlighten.c | 10 +++++----- + 2 files changed, 6 insertions(+), 5 deletions(-) + +--- a/arch/x86/mm/Makefile ++++ b/arch/x86/mm/Makefile +@@ -4,6 +4,7 @@ obj-y := init.o init_$(BITS).o fault.o + # Make sure __phys_addr has no stackprotector + nostackp := $(call cc-option, -fno-stack-protector) + CFLAGS_ioremap.o := $(nostackp) ++CFLAGS_init.o := $(nostackp) + + obj-$(CONFIG_SMP) += tlb.o + +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -1083,6 +1083,11 @@ asmlinkage void __init xen_start_kernel( + + __supported_pte_mask |= _PAGE_IOMAP; + ++#ifdef CONFIG_X86_64 ++ /* Work out if we support NX */ ++ check_efer(); ++#endif ++ + xen_setup_features(); + + /* Get mfn list */ +@@ -1123,11 +1128,6 @@ asmlinkage void __init xen_start_kernel( + + pgd = (pgd_t *)xen_start_info->pt_base; + +-#ifdef CONFIG_X86_64 +- /* Work out if we support NX */ +- check_efer(); +-#endif +- + /* Don't do the full vcpu_info placement stuff until we have a + possible map and a non-dummy shared_info. */ + per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; diff --git a/queue-2.6.31/xen-make-fstack-protector-work-under-xen.patch b/queue-2.6.31/xen-make-fstack-protector-work-under-xen.patch new file mode 100644 index 00000000000..cf429d67aec --- /dev/null +++ b/queue-2.6.31/xen-make-fstack-protector-work-under-xen.patch @@ -0,0 +1,294 @@ +From 577eebeae34d340685d8985dfdb7dfe337c511e8 Mon Sep 17 00:00:00 2001 +From: Jeremy Fitzhardinge +Date: Thu, 27 Aug 2009 12:46:35 -0700 +Subject: xen: make -fstack-protector work under Xen + +From: Jeremy Fitzhardinge + +commit 577eebeae34d340685d8985dfdb7dfe337c511e8 upstream. + +-fstack-protector uses a special per-cpu "stack canary" value. +gcc generates special code in each function to test the canary to make +sure that the function's stack hasn't been overrun. + +On x86-64, this is simply an offset of %gs, which is the usual per-cpu +base segment register, so setting it up simply requires loading %gs's +base as normal. + +On i386, the stack protector segment is %gs (rather than the usual kernel +percpu %fs segment register). This requires setting up the full kernel +GDT and then loading %gs accordingly. We also need to make sure %gs is +initialized when bringing up secondary cpus too. + +To keep things consistent, we do the full GDT/segment register setup on +both architectures. + +Because we need to avoid -fstack-protected code before setting up the GDT +and because there's no way to disable it on a per-function basis, several +files need to have stack-protector inhibited. + +[ Impact: allow Xen booting with stack-protector enabled ] + +Signed-off-by: Jeremy Fitzhardinge +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/mm/Makefile | 4 + + arch/x86/xen/Makefile | 2 + arch/x86/xen/enlighten.c | 131 ++++++++++++++++++++++++++++++++++++++++------- + arch/x86/xen/smp.c | 1 + drivers/xen/Makefile | 3 + + 5 files changed, 122 insertions(+), 19 deletions(-) + +--- a/arch/x86/mm/Makefile ++++ b/arch/x86/mm/Makefile +@@ -1,6 +1,10 @@ + obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ + pat.o pgtable.o gup.o + ++# Make sure __phys_addr has no stackprotector ++nostackp := $(call cc-option, -fno-stack-protector) ++CFLAGS_ioremap.o := $(nostackp) ++ + obj-$(CONFIG_SMP) += tlb.o + + obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -51,6 +51,7 @@ + #include + #include + #include ++#include + + #include "xen-ops.h" + #include "mmu.h" +@@ -330,18 +331,28 @@ static void xen_load_gdt(const struct de + unsigned long frames[pages]; + int f; + +- /* A GDT can be up to 64k in size, which corresponds to 8192 +- 8-byte entries, or 16 4k pages.. */ ++ /* ++ * A GDT can be up to 64k in size, which corresponds to 8192 ++ * 8-byte entries, or 16 4k pages.. ++ */ + + BUG_ON(size > 65536); + BUG_ON(va & ~PAGE_MASK); + + for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { + int level; +- pte_t *ptep = lookup_address(va, &level); ++ pte_t *ptep; + unsigned long pfn, mfn; + void *virt; + ++ /* ++ * The GDT is per-cpu and is in the percpu data area. ++ * That can be virtually mapped, so we need to do a ++ * page-walk to get the underlying MFN for the ++ * hypercall. The page can also be in the kernel's ++ * linear range, so we need to RO that mapping too. ++ */ ++ ptep = lookup_address(va, &level); + BUG_ON(ptep == NULL); + + pfn = pte_pfn(*ptep); +@@ -358,6 +369,44 @@ static void xen_load_gdt(const struct de + BUG(); + } + ++/* ++ * load_gdt for early boot, when the gdt is only mapped once ++ */ ++static __init void xen_load_gdt_boot(const struct desc_ptr *dtr) ++{ ++ unsigned long va = dtr->address; ++ unsigned int size = dtr->size + 1; ++ unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; ++ unsigned long frames[pages]; ++ int f; ++ ++ /* ++ * A GDT can be up to 64k in size, which corresponds to 8192 ++ * 8-byte entries, or 16 4k pages.. ++ */ ++ ++ BUG_ON(size > 65536); ++ BUG_ON(va & ~PAGE_MASK); ++ ++ for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { ++ pte_t pte; ++ unsigned long pfn, mfn; ++ ++ pfn = virt_to_pfn(va); ++ mfn = pfn_to_mfn(pfn); ++ ++ pte = pfn_pte(pfn, PAGE_KERNEL_RO); ++ ++ if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0)) ++ BUG(); ++ ++ frames[f] = mfn; ++ } ++ ++ if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) ++ BUG(); ++} ++ + static void load_TLS_descriptor(struct thread_struct *t, + unsigned int cpu, unsigned int i) + { +@@ -581,6 +630,29 @@ static void xen_write_gdt_entry(struct d + preempt_enable(); + } + ++/* ++ * Version of write_gdt_entry for use at early boot-time needed to ++ * update an entry as simply as possible. ++ */ ++static __init void xen_write_gdt_entry_boot(struct desc_struct *dt, int entry, ++ const void *desc, int type) ++{ ++ switch (type) { ++ case DESC_LDT: ++ case DESC_TSS: ++ /* ignore */ ++ break; ++ ++ default: { ++ xmaddr_t maddr = virt_to_machine(&dt[entry]); ++ ++ if (HYPERVISOR_update_descriptor(maddr.maddr, *(u64 *)desc)) ++ dt[entry] = *(struct desc_struct *)desc; ++ } ++ ++ } ++} ++ + static void xen_load_sp0(struct tss_struct *tss, + struct thread_struct *thread) + { +@@ -965,6 +1037,23 @@ static const struct machine_ops __initda + .emergency_restart = xen_emergency_restart, + }; + ++/* ++ * Set up the GDT and segment registers for -fstack-protector. Until ++ * we do this, we have to be careful not to call any stack-protected ++ * function, which is most of the kernel. ++ */ ++static void __init xen_setup_stackprotector(void) ++{ ++ pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot; ++ pv_cpu_ops.load_gdt = xen_load_gdt_boot; ++ ++ setup_stack_canary_segment(0); ++ switch_to_new_gdt(0); ++ ++ pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry; ++ pv_cpu_ops.load_gdt = xen_load_gdt; ++} ++ + /* First C function to be called on Xen boot */ + asmlinkage void __init xen_start_kernel(void) + { +@@ -983,13 +1072,28 @@ asmlinkage void __init xen_start_kernel( + pv_apic_ops = xen_apic_ops; + pv_mmu_ops = xen_mmu_ops; + +-#ifdef CONFIG_X86_64 + /* +- * Setup percpu state. We only need to do this for 64-bit +- * because 32-bit already has %fs set properly. ++ * Set up some pagetable state before starting to set any ptes. + */ +- load_percpu_segment(0); +-#endif ++ ++ /* Prevent unwanted bits from being set in PTEs. */ ++ __supported_pte_mask &= ~_PAGE_GLOBAL; ++ if (!xen_initial_domain()) ++ __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); ++ ++ __supported_pte_mask |= _PAGE_IOMAP; ++ ++ xen_setup_features(); ++ ++ /* Get mfn list */ ++ if (!xen_feature(XENFEAT_auto_translated_physmap)) ++ xen_build_dynamic_phys_to_machine(); ++ ++ /* ++ * Set up kernel GDT and segment registers, mainly so that ++ * -fstack-protector code can be executed. ++ */ ++ xen_setup_stackprotector(); + + xen_init_irq_ops(); + xen_init_cpuid_mask(); +@@ -1001,8 +1105,6 @@ asmlinkage void __init xen_start_kernel( + set_xen_basic_apic_ops(); + #endif + +- xen_setup_features(); +- + if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { + pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; + pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; +@@ -1019,17 +1121,8 @@ asmlinkage void __init xen_start_kernel( + + xen_smp_init(); + +- /* Get mfn list */ +- if (!xen_feature(XENFEAT_auto_translated_physmap)) +- xen_build_dynamic_phys_to_machine(); +- + pgd = (pgd_t *)xen_start_info->pt_base; + +- /* Prevent unwanted bits from being set in PTEs. */ +- __supported_pte_mask &= ~_PAGE_GLOBAL; +- if (!xen_initial_domain()) +- __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); +- + #ifdef CONFIG_X86_64 + /* Work out if we support NX */ + check_efer(); +--- a/arch/x86/xen/Makefile ++++ b/arch/x86/xen/Makefile +@@ -8,6 +8,7 @@ endif + # Make sure early boot has no stackprotector + nostackp := $(call cc-option, -fno-stack-protector) + CFLAGS_enlighten.o := $(nostackp) ++CFLAGS_mmu.o := $(nostackp) + + obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ + time.o xen-asm.o xen-asm_$(BITS).o \ +@@ -16,3 +17,4 @@ obj-y := enlighten.o setup.o multicalls + obj-$(CONFIG_SMP) += smp.o + obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o + obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o ++ +--- a/arch/x86/xen/smp.c ++++ b/arch/x86/xen/smp.c +@@ -236,6 +236,7 @@ cpu_initialize_context(unsigned int cpu, + ctxt->user_regs.ss = __KERNEL_DS; + #ifdef CONFIG_X86_32 + ctxt->user_regs.fs = __KERNEL_PERCPU; ++ ctxt->user_regs.gs = __KERNEL_STACK_CANARY; + #else + ctxt->gs_base_kernel = per_cpu_offset(cpu); + #endif +--- a/drivers/xen/Makefile ++++ b/drivers/xen/Makefile +@@ -1,6 +1,9 @@ + obj-y += grant-table.o features.o events.o manage.o + obj-y += xenbus/ + ++nostackp := $(call cc-option, -fno-stack-protector) ++CFLAGS_features.o := $(nostackp) ++ + obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o + obj-$(CONFIG_XEN_XENCOMM) += xencomm.o + obj-$(CONFIG_XEN_BALLOON) += balloon.o diff --git a/queue-2.6.31/xen-only-enable-interrupts-while-actually-blocking-for-spinlock.patch b/queue-2.6.31/xen-only-enable-interrupts-while-actually-blocking-for-spinlock.patch new file mode 100644 index 00000000000..7d06d764d5e --- /dev/null +++ b/queue-2.6.31/xen-only-enable-interrupts-while-actually-blocking-for-spinlock.patch @@ -0,0 +1,89 @@ +From 4d576b57b50a92801e6493e76e5243d6cff193d2 Mon Sep 17 00:00:00 2001 +From: Jeremy Fitzhardinge +Date: Wed, 9 Sep 2009 12:33:51 -0700 +Subject: xen: only enable interrupts while actually blocking for spinlock + +From: Jeremy Fitzhardinge + +commit 4d576b57b50a92801e6493e76e5243d6cff193d2 upstream. + +Where possible we enable interrupts while waiting for a spinlock to +become free, in order to reduce big latency spikes in interrupt handling. + +However, at present if we manage to pick up the spinlock just before +blocking, we'll end up holding the lock with interrupts enabled for a +while. This will cause a deadlock if we recieve an interrupt in that +window, and the interrupt handler tries to take the lock too. + +Solve this by shrinking the interrupt-enabled region to just around the +blocking call. + +[ Impact: avoid race/deadlock when using Xen PV spinlocks ] + +Reported-by: "Yang, Xiaowei" +Signed-off-by: Jeremy Fitzhardinge +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/xen/spinlock.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +--- a/arch/x86/xen/spinlock.c ++++ b/arch/x86/xen/spinlock.c +@@ -187,7 +187,6 @@ static noinline int xen_spin_lock_slow(s + struct xen_spinlock *prev; + int irq = __get_cpu_var(lock_kicker_irq); + int ret; +- unsigned long flags; + u64 start; + + /* If kicker interrupts not initialized yet, just spin */ +@@ -199,16 +198,12 @@ static noinline int xen_spin_lock_slow(s + /* announce we're spinning */ + prev = spinning_lock(xl); + +- flags = __raw_local_save_flags(); +- if (irq_enable) { +- ADD_STATS(taken_slow_irqenable, 1); +- raw_local_irq_enable(); +- } +- + ADD_STATS(taken_slow, 1); + ADD_STATS(taken_slow_nested, prev != NULL); + + do { ++ unsigned long flags; ++ + /* clear pending */ + xen_clear_irq_pending(irq); + +@@ -228,6 +223,12 @@ static noinline int xen_spin_lock_slow(s + goto out; + } + ++ flags = __raw_local_save_flags(); ++ if (irq_enable) { ++ ADD_STATS(taken_slow_irqenable, 1); ++ raw_local_irq_enable(); ++ } ++ + /* + * Block until irq becomes pending. If we're + * interrupted at this point (after the trylock but +@@ -238,13 +239,15 @@ static noinline int xen_spin_lock_slow(s + * pending. + */ + xen_poll_irq(irq); ++ ++ raw_local_irq_restore(flags); ++ + ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq)); + } while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */ + + kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); + + out: +- raw_local_irq_restore(flags); + unspinning_lock(xl, prev); + spin_time_accum_blocked(start); + diff --git a/queue-2.6.31/xen-use-stronger-barrier-after-unlocking-lock.patch b/queue-2.6.31/xen-use-stronger-barrier-after-unlocking-lock.patch new file mode 100644 index 00000000000..3e26bf132f1 --- /dev/null +++ b/queue-2.6.31/xen-use-stronger-barrier-after-unlocking-lock.patch @@ -0,0 +1,50 @@ +From 2496afbf1e50c70f80992656bcb730c8583ddac3 Mon Sep 17 00:00:00 2001 +From: Yang Xiaowei +Date: Wed, 9 Sep 2009 12:44:52 -0700 +Subject: xen: use stronger barrier after unlocking lock + +From: Yang Xiaowei + +commit 2496afbf1e50c70f80992656bcb730c8583ddac3 upstream. + +We need to have a stronger barrier between releasing the lock and +checking for any waiting spinners. A compiler barrier is not sufficient +because the CPU's ordering rules do not prevent the read xl->spinners +from happening before the unlock assignment, as they are different +memory locations. + +We need to have an explicit barrier to enforce the write-read ordering +to different memory locations. + +Because of it, I can't bring up > 4 HVM guests on one SMP machine. + +[ Code and commit comments expanded -J ] + +[ Impact: avoid deadlock when using Xen PV spinlocks ] + +Signed-off-by: Yang Xiaowei +Signed-off-by: Jeremy Fitzhardinge +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/xen/spinlock.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- a/arch/x86/xen/spinlock.c ++++ b/arch/x86/xen/spinlock.c +@@ -326,8 +326,13 @@ static void xen_spin_unlock(struct raw_s + smp_wmb(); /* make sure no writes get moved after unlock */ + xl->lock = 0; /* release lock */ + +- /* make sure unlock happens before kick */ +- barrier(); ++ /* ++ * Make sure unlock happens before checking for waiting ++ * spinners. We need a strong barrier to enforce the ++ * write-read ordering to different memory locations, as the ++ * CPU makes no implied guarantees about their ordering. ++ */ ++ mb(); + + if (unlikely(xl->spinners)) + xen_spin_unlock_slow(xl);