[kernel] r10443 - in dists/sid/linux-2.6/debian: . patches/bugfix/all/stable patches/series

Bastian Blank waldi at alioth.debian.org
Fri Feb 8 21:29:27 UTC 2008


Author: waldi
Date: Fri Feb  8 21:29:26 2008
New Revision: 10443

Log:
Add stable release 2.6.24.1

* debian/changelog: Update.
* debian/patches/bugfix/all/stable/2.6.24.1.patch, debian/patches/series/4:
  Add.


Added:
   dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.24.1.patch
   dists/sid/linux-2.6/debian/patches/series/4
Modified:
   dists/sid/linux-2.6/debian/changelog

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Fri Feb  8 21:29:26 2008
@@ -1,3 +1,54 @@
+linux-2.6 (2.6.24-4) UNRELEASED; urgency=low
+
+  * Add stable release 2.6.24.1:
+    - splice: missing user pointer access verification (CVE-2008-0009/10)
+    - drm: the drm really should call pci_set_master..
+    - Driver core: Revert "Fix Firmware class name collision"
+    - fix writev regression: pan hanging unkillable and un-straceable
+    - sched: fix high wake up latencies with FAIR_USER_SCHED
+    - sched: let +nice tasks have smaller impact
+    - b43: Reject new firmware early
+    - selinux: fix labeling of /proc/net inodes
+    - b43legacy: fix DMA slot resource leakage
+    - b43legacy: drop packets we are not able to encrypt
+    - b43legacy: fix suspend/resume
+    - b43legacy: fix PIO crash
+    - b43: Fix dma-slot resource leakage
+    - b43: Drop packets we are not able to encrypt
+    - b43: Fix suspend/resume
+    - sky2: fix for WOL on some devices
+    - sky2: restore multicast addresses after recovery
+    - x86: restore correct module name for apm
+    - ACPI: update ACPI blacklist
+    - PCI: Fix fakephp deadlock
+    - sys_remap_file_pages: fix ->vm_file accounting
+    - lockdep: annotate epoll
+    - forcedeth: mac address mcp77/79
+    - USB: Fix usb_serial_driver structure for Kobil cardreader driver.
+    - USB: handle idVendor of 0x0000
+    - USB: fix usbtest halt check on big endian systems
+    - USB: storage: Add unusual_dev for HP r707
+    - USB: Variant of the Dell Wireless 5520 driver
+    - USB: use GFP_NOIO in reset path
+    - USB: ftdi driver - add support for optical probe device
+    - USB: pl2303: add support for RATOC REX-USB60F
+    - USB: remove duplicate entry in Option driver and Pl2303 driver for Huawei modem
+    - USB: sierra: add support for Onda H600/Zte MF330 datacard to USB Driver for Sierra Wireless
+    - USB: ftdi-sio: Patch to add vendor/device id for ATK_16IC CCD
+    - USB: ftdi_sio - enabling multiple ELV devices, adding EM1010PC
+    - USB: sierra driver - add devices
+    - USB: Adding YC Cable USB Serial device to pl2303
+    - USB: Sierra - Add support for Aircard 881U
+    - USB: add support for 4348:5523 WinChipHead USB->RS 232 adapter
+    - USB: CP2101 New Device IDs
+    - usb gadget: fix fsl_usb2_udc potential OOPS
+    - USB: keyspan: Fix oops
+    - vm audit: add VM_DONTEXPAND to mmap for drivers that need it (CVE-2008-0007)
+    - slab: fix bootstrap on memoryless node
+    - DVB: cx23885: add missing subsystem ID for Hauppauge HVR1800 Retail
+
+ -- Bastian Blank <waldi at debian.org>  Fri, 08 Feb 2008 22:26:16 +0100
+
 linux-2.6 (2.6.24-3) unstable; urgency=low
 
   [ maximilian attems ]

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.24.1.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.24.1.patch	Fri Feb  8 21:29:26 2008
@@ -0,0 +1,1628 @@
+diff --git a/Documentation/video4linux/CARDLIST.cx23885 b/Documentation/video4linux/CARDLIST.cx23885
+index 00cb646..986ea57 100644
+--- a/Documentation/video4linux/CARDLIST.cx23885
++++ b/Documentation/video4linux/CARDLIST.cx23885
+@@ -1,5 +1,5 @@
+   0 -> UNKNOWN/GENERIC                                     [0070:3400]
+   1 -> Hauppauge WinTV-HVR1800lp                           [0070:7600]
+-  2 -> Hauppauge WinTV-HVR1800                             [0070:7800,0070:7801]
++  2 -> Hauppauge WinTV-HVR1800                             [0070:7800,0070:7801,0070:7809]
+   3 -> Hauppauge WinTV-HVR1250                             [0070:7911]
+   4 -> DViCO FusionHDTV5 Express                           [18ac:d500]
+diff --git a/Makefile b/Makefile
+index 189d8ef..e6a6eec 100644
+diff --git a/arch/x86/kernel/Makefile_32 b/arch/x86/kernel/Makefile_32
+index a7bc93c..5e48bd2 100644
+--- a/arch/x86/kernel/Makefile_32
++++ b/arch/x86/kernel/Makefile_32
+@@ -19,7 +19,8 @@ obj-$(CONFIG_X86_MSR)		+= msr.o
+ obj-$(CONFIG_X86_CPUID)		+= cpuid.o
+ obj-$(CONFIG_MICROCODE)		+= microcode.o
+ obj-$(CONFIG_PCI)		+= early-quirks.o
+-obj-$(CONFIG_APM)		+= apm_32.o
++apm-y				:= apm_32.o
++obj-$(CONFIG_APM)		+= apm.o
+ obj-$(CONFIG_X86_SMP)		+= smp_32.o smpboot_32.o tsc_sync.o
+ obj-$(CONFIG_SMP)		+= smpcommon_32.o
+ obj-$(CONFIG_X86_TRAMPOLINE)	+= trampoline_32.o
+diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c
+index 8809654..bd12c8e 100644
+--- a/drivers/acpi/blacklist.c
++++ b/drivers/acpi/blacklist.c
+@@ -208,24 +208,24 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
+ 	 * Disable OSI(Linux) warnings on all "Acer, inc."
+ 	 *
+ 	 * _OSI(Linux) disables the latest Windows BIOS code:
++	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
++	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
+ 	 * _OSI(Linux) effect unknown:
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
+ 	 */
+-	{
+-	.callback = dmi_disable_osi_linux,
+-	.ident = "Acer, inc.",
+-	.matches = {
+-		     DMI_MATCH(DMI_SYS_VENDOR, "Acer, inc."),
+-		},
+-	},
++	/*
++	 * note that dmi_check_system() uses strstr()
++	 * to match sub-strings rather than !strcmp(),
++	 * so "Acer" below matches "Acer, inc." above.
++	 */
+ 	/*
+ 	 * Disable OSI(Linux) warnings on all "Acer"
+ 	 *
+ 	 * _OSI(Linux) effect unknown:
+-	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
++	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
+@@ -300,7 +300,7 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
+ 		     DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
+ 		},
+ 	},
+-	{ /* OSI(Linux) touches USB, breaks suspend to disk */
++	{ /* OSI(Linux) touches USB, unknown side-effect */
+ 	.callback = dmi_disable_osi_linux,
+ 	.ident = "Dell Dimension 5150",
+ 	.matches = {
+@@ -474,6 +474,11 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
+ 	 *
+ 	 * _OSI(Linux) confirmed to be a NOP:
+ 	 * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
++	 * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
++	 *
++	 * unknown:
++	 * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
++	 * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
+ 	 */
+ 	{
+ 	.callback = dmi_disable_osi_linux,
+diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
+index e53fb51..fde7ac8 100644
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -120,7 +120,7 @@ static char osi_additional_string[OSI_STRING_LENGTH_MAX];
+  */
+ #define OSI_LINUX_ENABLE 0
+ 
+-struct osi_linux {
++static struct osi_linux {
+ 	unsigned int	enable:1;
+ 	unsigned int	dmi:1;
+ 	unsigned int	cmdline:1;
+@@ -1213,24 +1213,24 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
+  *
+  *	Returns 0 on success
+  */
+-int acpi_dmi_dump(void)
++static int acpi_dmi_dump(void)
+ {
+ 
+ 	if (!dmi_available)
+ 		return -1;
+ 
+ 	printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
+-		dmi_get_slot(DMI_SYS_VENDOR));
++		dmi_get_system_info(DMI_SYS_VENDOR));
+ 	printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
+-		dmi_get_slot(DMI_PRODUCT_NAME));
++		dmi_get_system_info(DMI_PRODUCT_NAME));
+ 	printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
+-		dmi_get_slot(DMI_PRODUCT_VERSION));
++		dmi_get_system_info(DMI_PRODUCT_VERSION));
+ 	printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
+-		dmi_get_slot(DMI_BOARD_NAME));
++		dmi_get_system_info(DMI_BOARD_NAME));
+ 	printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
+-		dmi_get_slot(DMI_BIOS_VENDOR));
++		dmi_get_system_info(DMI_BIOS_VENDOR));
+ 	printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
+-		dmi_get_slot(DMI_BIOS_DATE));
++		dmi_get_system_info(DMI_BIOS_DATE));
+ 
+ 	return 0;
+ }
+diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
+index 0295855..4a1b9bf 100644
+--- a/drivers/base/firmware_class.c
++++ b/drivers/base/firmware_class.c
+@@ -292,7 +292,8 @@ firmware_class_timeout(u_long data)
+ 
+ static inline void fw_setup_device_id(struct device *f_dev, struct device *dev)
+ {
+-	snprintf(f_dev->bus_id, BUS_ID_SIZE, "firmware-%s", dev->bus_id);
++	/* XXX warning we should watch out for name collisions */
++	strlcpy(f_dev->bus_id, dev->bus_id, BUS_ID_SIZE);
+ }
+ 
+ static int fw_register_device(struct device **dev_p, const char *fw_name,
+diff --git a/drivers/char/drm/drm_stub.c b/drivers/char/drm/drm_stub.c
+index ee83ff9..a157ee5 100644
+--- a/drivers/char/drm/drm_stub.c
++++ b/drivers/char/drm/drm_stub.c
+@@ -218,6 +218,7 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
+ 	if (ret)
+ 		goto err_g1;
+ 
++	pci_set_master(pdev);
+ 	if ((ret = drm_fill_in_dev(dev, pdev, ent, driver))) {
+ 		printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
+ 		goto err_g2;
+diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c
+index e8d50af..ef5e6b1 100644
+--- a/drivers/char/drm/drm_vm.c
++++ b/drivers/char/drm/drm_vm.c
+@@ -506,6 +506,7 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma)
+ 	vma->vm_ops = &drm_vm_dma_ops;
+ 
+ 	vma->vm_flags |= VM_RESERVED;	/* Don't swap */
++	vma->vm_flags |= VM_DONTEXPAND;
+ 
+ 	vma->vm_file = filp;	/* Needed for drm_vm_open() */
+ 	drm_vm_open_locked(vma);
+@@ -655,6 +656,7 @@ static int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
+ 		return -EINVAL;	/* This should never happen. */
+ 	}
+ 	vma->vm_flags |= VM_RESERVED;	/* Don't swap */
++	vma->vm_flags |= VM_DONTEXPAND;
+ 
+ 	vma->vm_file = filp;	/* Needed for drm_vm_open() */
+ 	drm_vm_open_locked(vma);
+diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c
+index 82f2e27..ff146c2 100644
+--- a/drivers/char/mspec.c
++++ b/drivers/char/mspec.c
+@@ -283,7 +283,7 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma,
+ 	vdata->refcnt = ATOMIC_INIT(1);
+ 	vma->vm_private_data = vdata;
+ 
+-	vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP);
++	vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP | VM_DONTEXPAND);
+ 	if (vdata->type == MSPEC_FETCHOP || vdata->type == MSPEC_UNCACHED)
+ 		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+ 	vma->vm_ops = &mspec_vm_ops;
+diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
+index 5e596a7..b2fb6ba 100644
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -469,12 +469,3 @@ int dmi_get_year(int field)
+ 
+ 	return year;
+ }
+-
+-/**
+- *	dmi_get_slot - return dmi_ident[slot]
+- *	@slot:	index into dmi_ident[]
+- */
+-char *dmi_get_slot(int slot)
+-{
+-	return(dmi_ident[slot]);
+-}
+diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c
+index b9012ac..db00193 100644
+--- a/drivers/media/video/cx23885/cx23885-cards.c
++++ b/drivers/media/video/cx23885/cx23885-cards.c
+@@ -138,6 +138,10 @@ struct cx23885_subid cx23885_subids[] = {
+ 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
+ 	},{
+ 		.subvendor = 0x0070,
++		.subdevice = 0x7809,
++		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
++	},{
++		.subvendor = 0x0070,
+ 		.subdevice = 0x7911,
+ 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1250,
+ 	},{
+diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
+index f84c752..399592d 100644
+--- a/drivers/net/forcedeth.c
++++ b/drivers/net/forcedeth.c
+@@ -5593,35 +5593,35 @@ static struct pci_device_id pci_tbl[] = {
+ 	},
+ 	{	/* MCP77 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP77 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP77 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP77 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP79 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP79 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP79 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{	/* MCP79 Ethernet Controller */
+ 		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39),
+-		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
++		.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
+ 	},
+ 	{0,},
+ };
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index bc15940..962e28b 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -621,6 +621,7 @@ static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff)
+ 	static const u32 phy_power[] = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD };
+ 	static const u32 coma_mode[] = { PCI_Y2_PHY1_COMA, PCI_Y2_PHY2_COMA };
+ 
++	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+ 	reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
+ 	/* Turn on/off phy power saving */
+ 	if (onoff)
+@@ -632,7 +633,8 @@ static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff)
+ 		reg1 |= coma_mode[port];
+ 
+ 	sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
+-	reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
++	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
++	sky2_pci_read32(hw, PCI_DEV_REG1);
+ 
+ 	udelay(100);
+ }
+@@ -1412,6 +1414,7 @@ static int sky2_up(struct net_device *dev)
+ 	imask |= portirq_msk[port];
+ 	sky2_write32(hw, B0_IMSK, imask);
+ 
++	sky2_set_multicast(dev);
+ 	return 0;
+ 
+ err_out:
+@@ -2426,6 +2429,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
+ 	if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
+ 		u16 pci_err;
+ 
++		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+ 		pci_err = sky2_pci_read16(hw, PCI_STATUS);
+ 		if (net_ratelimit())
+ 			dev_err(&pdev->dev, "PCI hardware error (0x%x)\n",
+@@ -2433,12 +2437,14 @@ static void sky2_hw_intr(struct sky2_hw *hw)
+ 
+ 		sky2_pci_write16(hw, PCI_STATUS,
+ 				      pci_err | PCI_STATUS_ERROR_BITS);
++		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+ 	}
+ 
+ 	if (status & Y2_IS_PCI_EXP) {
+ 		/* PCI-Express uncorrectable Error occurred */
+ 		u32 err;
+ 
++		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+ 		err = sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
+ 		sky2_write32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS,
+ 			     0xfffffffful);
+@@ -2446,6 +2452,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
+ 			dev_err(&pdev->dev, "PCI Express error (0x%x)\n", err);
+ 
+ 		sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
++		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+ 	}
+ 
+ 	if (status & Y2_HWE_L1_MASK)
+@@ -2811,6 +2818,7 @@ static void sky2_reset(struct sky2_hw *hw)
+ 	}
+ 
+ 	sky2_power_on(hw);
++	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+ 
+ 	for (i = 0; i < hw->ports; i++) {
+ 		sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
+@@ -3533,8 +3541,6 @@ static int sky2_set_ringparam(struct net_device *dev,
+ 		err = sky2_up(dev);
+ 		if (err)
+ 			dev_close(dev);
+-		else
+-			sky2_set_multicast(dev);
+ 	}
+ 
+ 	return err;
+@@ -4368,8 +4374,6 @@ static int sky2_resume(struct pci_dev *pdev)
+ 				dev_close(dev);
+ 				goto out;
+ 			}
+-
+-			sky2_set_multicast(dev);
+ 		}
+ 	}
+ 
+diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
+index 5e8f8ac..559a9a9 100644
+--- a/drivers/net/wireless/b43/dma.c
++++ b/drivers/net/wireless/b43/dma.c
+@@ -1106,7 +1106,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
+ {
+ 	const struct b43_dma_ops *ops = ring->ops;
+ 	u8 *header;
+-	int slot;
++	int slot, old_top_slot, old_used_slots;
+ 	int err;
+ 	struct b43_dmadesc_generic *desc;
+ 	struct b43_dmadesc_meta *meta;
+@@ -1116,20 +1116,31 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
+ #define SLOTS_PER_PACKET  2
+ 	B43_WARN_ON(skb_shinfo(skb)->nr_frags);
+ 
++	old_top_slot = ring->current_slot;
++	old_used_slots = ring->used_slots;
++
+ 	/* Get a slot for the header. */
+ 	slot = request_slot(ring);
+ 	desc = ops->idx2desc(ring, slot, &meta_hdr);
+ 	memset(meta_hdr, 0, sizeof(*meta_hdr));
+ 
+ 	header = &(ring->txhdr_cache[slot * sizeof(struct b43_txhdr_fw4)]);
+-	b43_generate_txhdr(ring->dev, header,
++	err = b43_generate_txhdr(ring->dev, header,
+ 			   skb->data, skb->len, ctl,
+ 			   generate_cookie(ring, slot));
++	if (unlikely(err)) {
++		ring->current_slot = old_top_slot;
++		ring->used_slots = old_used_slots;
++		return err;
++	}
+ 
+ 	meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
+ 					   sizeof(struct b43_txhdr_fw4), 1);
+-	if (dma_mapping_error(meta_hdr->dmaaddr))
++	if (dma_mapping_error(meta_hdr->dmaaddr)) {
++		ring->current_slot = old_top_slot;
++		ring->used_slots = old_used_slots;
+ 		return -EIO;
++	}
+ 	ops->fill_descriptor(ring, desc, meta_hdr->dmaaddr,
+ 			     sizeof(struct b43_txhdr_fw4), 1, 0, 0);
+ 
+@@ -1147,6 +1158,8 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
+ 	if (dma_mapping_error(meta->dmaaddr)) {
+ 		bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
+ 		if (!bounce_skb) {
++			ring->current_slot = old_top_slot;
++			ring->used_slots = old_used_slots;
+ 			err = -ENOMEM;
+ 			goto out_unmap_hdr;
+ 		}
+@@ -1157,6 +1170,8 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
+ 		meta->skb = skb;
+ 		meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
+ 		if (dma_mapping_error(meta->dmaaddr)) {
++			ring->current_slot = old_top_slot;
++			ring->used_slots = old_used_slots;
+ 			err = -EIO;
+ 			goto out_free_bounce;
+ 		}
+@@ -1219,6 +1234,13 @@ int b43_dma_tx(struct b43_wldev *dev,
+ 	B43_WARN_ON(ring->stopped);
+ 
+ 	err = dma_tx_fragment(ring, skb, ctl);
++	if (unlikely(err == -ENOKEY)) {
++		/* Drop this packet, as we don't have the encryption key
++		 * anymore and must not transmit it unencrypted. */
++		dev_kfree_skb_any(skb);
++		err = 0;
++		goto out_unlock;
++	}
+ 	if (unlikely(err)) {
+ 		b43err(dev->wl, "DMA tx mapping failure\n");
+ 		goto out_unlock;
+diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
+index 1c93b4f..69795fd 100644
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -1800,6 +1800,18 @@ static int b43_upload_microcode(struct b43_wldev *dev)
+ 		err = -EOPNOTSUPP;
+ 		goto out;
+ 	}
++	if (fwrev > 351) {
++		b43err(dev->wl, "YOUR FIRMWARE IS TOO NEW. Please downgrade your "
++		       "firmware.\n");
++		b43err(dev->wl, "Use this firmware tarball: "
++		       "http://downloads.openwrt.org/sources/broadcom-wl-4.80.53.0.tar.bz2\n");
++		b43err(dev->wl, "Use this b43-fwcutter tarball: "
++		       "http://bu3sch.de/b43/fwcutter/b43-fwcutter-009.tar.bz2\n");
++		b43err(dev->wl, "Read, understand and _do_ what this message says, please.\n");
++		b43_write32(dev, B43_MMIO_MACCTL, 0);
++		err = -EOPNOTSUPP;
++		goto out;
++	}
+ 	b43dbg(dev->wl, "Loading firmware version %u.%u "
+ 	       "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
+ 	       fwrev, fwpatch,
+@@ -3395,8 +3407,6 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
+ 	b43_bluetooth_coext_enable(dev);
+ 
+ 	ssb_bus_powerup(bus, 1);	/* Enable dynamic PCTL */
+-	memset(wl->bssid, 0, ETH_ALEN);
+-	memset(wl->mac_addr, 0, ETH_ALEN);
+ 	b43_upload_card_macaddress(dev);
+ 	b43_security_init(dev);
+ 	b43_rng_init(wl);
+@@ -3493,6 +3503,13 @@ static int b43_start(struct ieee80211_hw *hw)
+ 	int did_init = 0;
+ 	int err = 0;
+ 
++	/* Kill all old instance specific information to make sure
++	 * the card won't use it in the short timeframe between start
++	 * and mac80211 reconfiguring it. */
++	memset(wl->bssid, 0, ETH_ALEN);
++	memset(wl->mac_addr, 0, ETH_ALEN);
++	wl->filter_flags = 0;
++
+ 	/* First register RFkill.
+ 	 * LEDs that are registered later depend on it. */
+ 	b43_rfkill_init(dev);
+diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c
+index 3307ba1..a856b9f 100644
+--- a/drivers/net/wireless/b43/xmit.c
++++ b/drivers/net/wireless/b43/xmit.c
+@@ -177,7 +177,7 @@ static u8 b43_calc_fallback_rate(u8 bitrate)
+ 	return 0;
+ }
+ 
+-static void generate_txhdr_fw4(struct b43_wldev *dev,
++static int generate_txhdr_fw4(struct b43_wldev *dev,
+ 			       struct b43_txhdr_fw4 *txhdr,
+ 			       const unsigned char *fragment_data,
+ 			       unsigned int fragment_len,
+@@ -235,7 +235,15 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
+ 
+ 		B43_WARN_ON(key_idx >= dev->max_nr_keys);
+ 		key = &(dev->key[key_idx]);
+-		B43_WARN_ON(!key->keyconf);
++
++		if (unlikely(!key->keyconf)) {
++			/* This key is invalid. This might only happen
++			 * in a short timeframe after machine resume before
++			 * we were able to reconfigure keys.
++			 * Drop this packet completely. Do not transmit it
++			 * unencrypted to avoid leaking information. */
++			return -ENOKEY;
++		}
+ 
+ 		/* Hardware appends ICV. */
+ 		plcp_fragment_len += txctl->icv_len;
+@@ -352,16 +360,18 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
+ 	txhdr->mac_ctl = cpu_to_le32(mac_ctl);
+ 	txhdr->phy_ctl = cpu_to_le16(phy_ctl);
+ 	txhdr->extra_ft = extra_ft;
++
++	return 0;
+ }
+ 
+-void b43_generate_txhdr(struct b43_wldev *dev,
++int b43_generate_txhdr(struct b43_wldev *dev,
+ 			u8 * txhdr,
+ 			const unsigned char *fragment_data,
+ 			unsigned int fragment_len,
+ 			const struct ieee80211_tx_control *txctl, u16 cookie)
+ {
+-	generate_txhdr_fw4(dev, (struct b43_txhdr_fw4 *)txhdr,
+-			   fragment_data, fragment_len, txctl, cookie);
++	return generate_txhdr_fw4(dev, (struct b43_txhdr_fw4 *)txhdr,
++				  fragment_data, fragment_len, txctl, cookie);
+ }
+ 
+ static s8 b43_rssi_postprocess(struct b43_wldev *dev,
+diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h
+index 6dc0793..e3bac08 100644
+--- a/drivers/net/wireless/b43/xmit.h
++++ b/drivers/net/wireless/b43/xmit.h
+@@ -82,7 +82,7 @@ struct b43_txhdr_fw4 {
+ #define  B43_TX4_PHY_ANT1		0x0100	/* Use antenna 1 */
+ #define  B43_TX4_PHY_ANTLAST	0x0300	/* Use last used antenna */
+ 
+-void b43_generate_txhdr(struct b43_wldev *dev,
++int b43_generate_txhdr(struct b43_wldev *dev,
+ 			u8 * txhdr,
+ 			const unsigned char *fragment_data,
+ 			unsigned int fragment_len,
+diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c
+index 83161d9..6e08405 100644
+--- a/drivers/net/wireless/b43legacy/dma.c
++++ b/drivers/net/wireless/b43legacy/dma.c
+@@ -1164,7 +1164,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
+ {
+ 	const struct b43legacy_dma_ops *ops = ring->ops;
+ 	u8 *header;
+-	int slot;
++	int slot, old_top_slot, old_used_slots;
+ 	int err;
+ 	struct b43legacy_dmadesc_generic *desc;
+ 	struct b43legacy_dmadesc_meta *meta;
+@@ -1174,6 +1174,9 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
+ #define SLOTS_PER_PACKET  2
+ 	B43legacy_WARN_ON(skb_shinfo(skb)->nr_frags != 0);
+ 
++	old_top_slot = ring->current_slot;
++	old_used_slots = ring->used_slots;
++
+ 	/* Get a slot for the header. */
+ 	slot = request_slot(ring);
+ 	desc = ops->idx2desc(ring, slot, &meta_hdr);
+@@ -1181,9 +1184,14 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
+ 
+ 	header = &(ring->txhdr_cache[slot * sizeof(
+ 			       struct b43legacy_txhdr_fw3)]);
+-	b43legacy_generate_txhdr(ring->dev, header,
++	err = b43legacy_generate_txhdr(ring->dev, header,
+ 				 skb->data, skb->len, ctl,
+ 				 generate_cookie(ring, slot));
++	if (unlikely(err)) {
++		ring->current_slot = old_top_slot;
++		ring->used_slots = old_used_slots;
++		return err;
++	}
+ 
+ 	meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
+ 				       sizeof(struct b43legacy_txhdr_fw3), 1);
+@@ -1206,6 +1214,8 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
+ 	if (dma_mapping_error(meta->dmaaddr)) {
+ 		bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
+ 		if (!bounce_skb) {
++			ring->current_slot = old_top_slot;
++			ring->used_slots = old_used_slots;
+ 			err = -ENOMEM;
+ 			goto out_unmap_hdr;
+ 		}
+@@ -1216,6 +1226,8 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
+ 		meta->skb = skb;
+ 		meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
+ 		if (dma_mapping_error(meta->dmaaddr)) {
++			ring->current_slot = old_top_slot;
++			ring->used_slots = old_used_slots;
+ 			err = -EIO;
+ 			goto out_free_bounce;
+ 		}
+@@ -1282,6 +1294,13 @@ int b43legacy_dma_tx(struct b43legacy_wldev *dev,
+ 	B43legacy_BUG_ON(ring->stopped);
+ 
+ 	err = dma_tx_fragment(ring, skb, ctl);
++	if (unlikely(err == -ENOKEY)) {
++		/* Drop this packet, as we don't have the encryption key
++		 * anymore and must not transmit it unencrypted. */
++		dev_kfree_skb_any(skb);
++		err = 0;
++		goto out_unlock;
++	}
+ 	if (unlikely(err)) {
+ 		b43legacyerr(dev->wl, "DMA tx mapping failure\n");
+ 		goto out_unlock;
+diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
+index 32d5e17..cdb0497 100644
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -3215,8 +3215,6 @@ static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev)
+ 	b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0414, 0x01F4);
+ 
+ 	ssb_bus_powerup(bus, 1); /* Enable dynamic PCTL */
+-	memset(wl->bssid, 0, ETH_ALEN);
+-	memset(wl->mac_addr, 0, ETH_ALEN);
+ 	b43legacy_upload_card_macaddress(dev);
+ 	b43legacy_security_init(dev);
+ 	b43legacy_rng_init(wl);
+@@ -3311,6 +3309,13 @@ static int b43legacy_start(struct ieee80211_hw *hw)
+ 	int did_init = 0;
+ 	int err = 0;
+ 
++	/* Kill all old instance specific information to make sure
++	 * the card won't use it in the short timeframe between start
++	 * and mac80211 reconfiguring it. */
++	memset(wl->bssid, 0, ETH_ALEN);
++	memset(wl->mac_addr, 0, ETH_ALEN);
++	wl->filter_flags = 0;
++
+ 	mutex_lock(&wl->mutex);
+ 
+ 	if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) {
+diff --git a/drivers/net/wireless/b43legacy/pio.c b/drivers/net/wireless/b43legacy/pio.c
+index de843ac..3034503 100644
+--- a/drivers/net/wireless/b43legacy/pio.c
++++ b/drivers/net/wireless/b43legacy/pio.c
+@@ -181,7 +181,7 @@ union txhdr_union {
+ 	struct b43legacy_txhdr_fw3 txhdr_fw3;
+ };
+ 
+-static void pio_tx_write_fragment(struct b43legacy_pioqueue *queue,
++static int pio_tx_write_fragment(struct b43legacy_pioqueue *queue,
+ 				  struct sk_buff *skb,
+ 				  struct b43legacy_pio_txpacket *packet,
+ 				  size_t txhdr_size)
+@@ -189,14 +189,17 @@ static void pio_tx_write_fragment(struct b43legacy_pioqueue *queue,
+ 	union txhdr_union txhdr_data;
+ 	u8 *txhdr = NULL;
+ 	unsigned int octets;
++	int err;
+ 
+ 	txhdr = (u8 *)(&txhdr_data.txhdr_fw3);
+ 
+ 	B43legacy_WARN_ON(skb_shinfo(skb)->nr_frags != 0);
+-	b43legacy_generate_txhdr(queue->dev,
++	err = b43legacy_generate_txhdr(queue->dev,
+ 				 txhdr, skb->data, skb->len,
+ 				 &packet->txstat.control,
+ 				 generate_cookie(queue, packet));
++	if (err)
++		return err;
+ 
+ 	tx_start(queue);
+ 	octets = skb->len + txhdr_size;
+@@ -204,6 +207,8 @@ static void pio_tx_write_fragment(struct b43legacy_pioqueue *queue,
+ 		octets--;
+ 	tx_data(queue, txhdr, (u8 *)skb->data, octets);
+ 	tx_complete(queue, skb);
++
++	return 0;
+ }
+ 
+ static void free_txpacket(struct b43legacy_pio_txpacket *packet,
+@@ -226,6 +231,7 @@ static int pio_tx_packet(struct b43legacy_pio_txpacket *packet)
+ 	struct b43legacy_pioqueue *queue = packet->queue;
+ 	struct sk_buff *skb = packet->skb;
+ 	u16 octets;
++	int err;
+ 
+ 	octets = (u16)skb->len + sizeof(struct b43legacy_txhdr_fw3);
+ 	if (queue->tx_devq_size < octets) {
+@@ -247,8 +253,14 @@ static int pio_tx_packet(struct b43legacy_pio_txpacket *packet)
+ 	if (queue->tx_devq_used + octets > queue->tx_devq_size)
+ 		return -EBUSY;
+ 	/* Now poke the device. */
+-	pio_tx_write_fragment(queue, skb, packet,
++	err = pio_tx_write_fragment(queue, skb, packet,
+ 			      sizeof(struct b43legacy_txhdr_fw3));
++	if (unlikely(err == -ENOKEY)) {
++		/* Drop this packet, as we don't have the encryption key
++		 * anymore and must not transmit it unencrypted. */
++		free_txpacket(packet, 1);
++		return 0;
++	}
+ 
+ 	/* Account for the packet size.
+ 	 * (We must not overflow the device TX queue)
+@@ -486,6 +498,9 @@ void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
+ 	queue = parse_cookie(dev, status->cookie, &packet);
+ 	B43legacy_WARN_ON(!queue);
+ 
++	if (!packet->skb)
++		return;
++
+ 	queue->tx_devq_packets--;
+ 	queue->tx_devq_used -= (packet->skb->len +
+ 				sizeof(struct b43legacy_txhdr_fw3));
+diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c
+index fa1e656..f10d637 100644
+--- a/drivers/net/wireless/b43legacy/xmit.c
++++ b/drivers/net/wireless/b43legacy/xmit.c
+@@ -181,7 +181,7 @@ static u8 b43legacy_calc_fallback_rate(u8 bitrate)
+ 	return 0;
+ }
+ 
+-static void generate_txhdr_fw3(struct b43legacy_wldev *dev,
++static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
+ 			       struct b43legacy_txhdr_fw3 *txhdr,
+ 			       const unsigned char *fragment_data,
+ 			       unsigned int fragment_len,
+@@ -252,6 +252,13 @@ static void generate_txhdr_fw3(struct b43legacy_wldev *dev,
+ 			iv_len = min((size_t)txctl->iv_len,
+ 				     ARRAY_SIZE(txhdr->iv));
+ 			memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len);
++		} else {
++			/* This key is invalid. This might only happen
++			 * in a short timeframe after machine resume before
++			 * we were able to reconfigure keys.
++			 * Drop this packet completely. Do not transmit it
++			 * unencrypted to avoid leaking information. */
++			return -ENOKEY;
+ 		}
+ 	}
+ 	b43legacy_generate_plcp_hdr((struct b43legacy_plcp_hdr4 *)
+@@ -344,16 +351,18 @@ static void generate_txhdr_fw3(struct b43legacy_wldev *dev,
+ 	/* Apply the bitfields */
+ 	txhdr->mac_ctl = cpu_to_le32(mac_ctl);
+ 	txhdr->phy_ctl = cpu_to_le16(phy_ctl);
++
++	return 0;
+ }
+ 
+-void b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
++int b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
+ 			      u8 *txhdr,
+ 			      const unsigned char *fragment_data,
+ 			      unsigned int fragment_len,
+ 			      const struct ieee80211_tx_control *txctl,
+ 			      u16 cookie)
+ {
+-	generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr,
++	return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr,
+ 			   fragment_data, fragment_len,
+ 			   txctl, cookie);
+ }
+diff --git a/drivers/net/wireless/b43legacy/xmit.h b/drivers/net/wireless/b43legacy/xmit.h
+index 8a155d0..bab4792 100644
+--- a/drivers/net/wireless/b43legacy/xmit.h
++++ b/drivers/net/wireless/b43legacy/xmit.h
+@@ -76,7 +76,7 @@ struct b43legacy_txhdr_fw3 {
+ 
+ 
+ 
+-void b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
++int b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
+ 			      u8 *txhdr,
+ 			      const unsigned char *fragment_data,
+ 			      unsigned int fragment_len,
+diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
+index d7a293e..94b6401 100644
+--- a/drivers/pci/hotplug/fakephp.c
++++ b/drivers/pci/hotplug/fakephp.c
+@@ -39,6 +39,7 @@
+ #include <linux/init.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
++#include <linux/workqueue.h>
+ #include "../pci.h"
+ 
+ #if !defined(MODULE)
+@@ -63,10 +64,16 @@ struct dummy_slot {
+ 	struct list_head node;
+ 	struct hotplug_slot *slot;
+ 	struct pci_dev *dev;
++	struct work_struct remove_work;
++	unsigned long removed;
+ };
+ 
+ static int debug;
+ static LIST_HEAD(slot_list);
++static struct workqueue_struct *dummyphp_wq;
++
++static void pci_rescan_worker(struct work_struct *work);
++static DECLARE_WORK(pci_rescan_work, pci_rescan_worker);
+ 
+ static int enable_slot (struct hotplug_slot *slot);
+ static int disable_slot (struct hotplug_slot *slot);
+@@ -109,7 +116,7 @@ static int add_slot(struct pci_dev *dev)
+ 	slot->name = &dev->dev.bus_id[0];
+ 	dbg("slot->name = %s\n", slot->name);
+ 
+-	dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
++	dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
+ 	if (!dslot)
+ 		goto error_info;
+ 
+@@ -164,6 +171,14 @@ static void remove_slot(struct dummy_slot *dslot)
+ 		err("Problem unregistering a slot %s\n", dslot->slot->name);
+ }
+ 
++/* called from the single-threaded workqueue handler to remove a slot */
++static void remove_slot_worker(struct work_struct *work)
++{
++	struct dummy_slot *dslot =
++		container_of(work, struct dummy_slot, remove_work);
++	remove_slot(dslot);
++}
++
+ /**
+  * pci_rescan_slot - Rescan slot
+  * @temp: Device template. Should be set: bus and devfn.
+@@ -267,11 +282,17 @@ static inline void pci_rescan(void) {
+ 	pci_rescan_buses(&pci_root_buses);
+ }
+ 
++/* called from the single-threaded workqueue handler to rescan all pci buses */
++static void pci_rescan_worker(struct work_struct *work)
++{
++	pci_rescan();
++}
+ 
+ static int enable_slot(struct hotplug_slot *hotplug_slot)
+ {
+ 	/* mis-use enable_slot for rescanning of the pci bus */
+-	pci_rescan();
++	cancel_work_sync(&pci_rescan_work);
++	queue_work(dummyphp_wq, &pci_rescan_work);
+ 	return -ENODEV;
+ }
+ 
+@@ -306,6 +327,10 @@ static int disable_slot(struct hotplug_slot *slot)
+ 		err("Can't remove PCI devices with other PCI devices behind it yet.\n");
+ 		return -ENODEV;
+ 	}
++	if (test_and_set_bit(0, &dslot->removed)) {
++		dbg("Slot already scheduled for removal\n");
++		return -ENODEV;
++	}
+ 	/* search for subfunctions and disable them first */
+ 	if (!(dslot->dev->devfn & 7)) {
+ 		for (func = 1; func < 8; func++) {
+@@ -328,8 +353,9 @@ static int disable_slot(struct hotplug_slot *slot)
+ 	/* remove the device from the pci core */
+ 	pci_remove_bus_device(dslot->dev);
+ 
+-	/* blow away this sysfs entry and other parts. */
+-	remove_slot(dslot);
++	/* queue work item to blow away this sysfs entry and other parts. */
++	INIT_WORK(&dslot->remove_work, remove_slot_worker);
++	queue_work(dummyphp_wq, &dslot->remove_work);
+ 
+ 	return 0;
+ }
+@@ -340,6 +366,7 @@ static void cleanup_slots (void)
+ 	struct list_head *next;
+ 	struct dummy_slot *dslot;
+ 
++	destroy_workqueue(dummyphp_wq);
+ 	list_for_each_safe (tmp, next, &slot_list) {
+ 		dslot = list_entry (tmp, struct dummy_slot, node);
+ 		remove_slot(dslot);
+@@ -351,6 +378,10 @@ static int __init dummyphp_init(void)
+ {
+ 	info(DRIVER_DESC "\n");
+ 
++	dummyphp_wq = create_singlethread_workqueue(MY_NAME);
++	if (!dummyphp_wq)
++		return -ENOMEM;
++
+ 	return pci_scan_buses();
+ }
+ 
+diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
+index c51f8e9..b469718 100644
+--- a/drivers/usb/core/driver.c
++++ b/drivers/usb/core/driver.c
+@@ -534,8 +534,8 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface,
+ 	   id->driver_info is the way to create an entry that
+ 	   indicates that the driver want to examine every
+ 	   device and interface. */
+-	for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
+-	       id->driver_info; id++) {
++	for (; id->idVendor || id->idProduct || id->bDeviceClass ||
++	       id->bInterfaceClass || id->driver_info; id++) {
+ 		if (usb_match_one_id(interface, id))
+ 			return id;
+ 	}
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index b04d232..1b17f63 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -2946,7 +2946,7 @@ static int config_descriptors_changed(struct usb_device *udev)
+ 		if (len < le16_to_cpu(udev->config[index].desc.wTotalLength))
+ 			len = le16_to_cpu(udev->config[index].desc.wTotalLength);
+ 	}
+-	buf = kmalloc (len, GFP_KERNEL);
++	buf = kmalloc(len, GFP_NOIO);
+ 	if (buf == NULL) {
+ 		dev_err(&udev->dev, "no mem to re-read configs after reset\n");
+ 		/* assume the worst */
+diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c
+index 038e7d7..d59eb92 100644
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -776,7 +776,7 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
+ 		VDBG("%s, bad params\n", __FUNCTION__);
+ 		return -EINVAL;
+ 	}
+-	if (!_ep || (!ep->desc && ep_index(ep))) {
++	if (unlikely(!_ep || !ep->desc)) {
+ 		VDBG("%s, bad ep\n", __FUNCTION__);
+ 		return -EINVAL;
+ 	}
+diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
+index ea31621..81755d0 100644
+--- a/drivers/usb/misc/usbtest.c
++++ b/drivers/usb/misc/usbtest.c
+@@ -1151,6 +1151,7 @@ static int verify_halted (int ep, struct urb *urb)
+ 		dbg ("ep %02x couldn't get halt status, %d", ep, retval);
+ 		return retval;
+ 	}
++	le16_to_cpus(&status);
+ 	if (status != 1) {
+ 		dbg ("ep %02x bogus status: %04x != 1", ep, status);
+ 		return -EINVAL;
+diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
+index 2283358..cd5f71b 100644
+--- a/drivers/usb/serial/cp2101.c
++++ b/drivers/usb/serial/cp2101.c
+@@ -59,6 +59,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
+ 	{ USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
+ 	{ USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */
++	{ USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */
+ 	{ USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */
+ 	{ USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */
+ 	{ USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
+@@ -76,8 +77,13 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */
+ 	{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
+ 	{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
++	{ USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
++	{ USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
++	{ USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */
++	{ USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */
+ 	{ USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */
+ 	{ USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */
++	{ USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
+ 	{ USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
+ 	{ } /* Terminating Entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index c40e77d..1382af9 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -471,30 +471,28 @@ static struct usb_device_id id_table_combined [] = {
+ 	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
+ 	/*
+-	 * These will probably use user-space drivers.  Uncomment them if
+-	 * you need them or use the user-specified vendor/product module
+-	 * parameters (see ftdi_sio.h for the numbers).  Make a fuss if
+-	 * you think the driver should recognize any of them by default.
++	 * Due to many user requests for multiple ELV devices we enable
++	 * them by default.
+ 	 */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, */
+-	/* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, */
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
+ 	{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
+ 	{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
+ 	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
+@@ -545,6 +543,7 @@ static struct usb_device_id id_table_combined [] = {
+ 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
+ 	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
+ 	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
+ 	{ USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
+@@ -569,6 +568,7 @@ static struct usb_device_id id_table_combined [] = {
+ 	{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
+ 	{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
+ 	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
+ 		.driver_info = (kernel_ulong_t)&ftdi_olimex_quirk },
+ 	{ },					/* Optional parameter entry */
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index b51cbb0..f6053da 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -245,6 +245,7 @@
+ #define FTDI_ELV_WS300PC_PID	0xE0F6	/* PC-Wetterstation (WS 300 PC) */
+ #define FTDI_ELV_FHZ1300PC_PID	0xE0E8	/* FHZ 1300 PC */
+ #define FTDI_ELV_WS500_PID	0xE0E9	/* PC-Wetterstation (WS 500) */
++#define FTDI_ELV_EM1010PC_PID	0xE0EF	/* Engery monitor EM 1010 PC */
+ 
+ /*
+  * Definitions for ID TECH (www.idt-net.com) devices
+@@ -278,6 +279,7 @@
+ #define FTDI_ATIK_ATK16C_PID	0xDF32	/* ATIK ATK-16C Colour Camera */
+ #define FTDI_ATIK_ATK16HR_PID	0xDF31	/* ATIK ATK-16HR Grayscale Camera */
+ #define FTDI_ATIK_ATK16HRC_PID	0xDF33	/* ATIK ATK-16HRC Colour Camera */
++#define FTDI_ATIK_ATK16IC_PID   0xDF35  /* ATIK ATK-16IC Grayscale Camera */
+ 
+ /*
+  * Protego product ids
+@@ -534,6 +536,8 @@
+ #define OLIMEX_VID			0x15BA
+ #define OLIMEX_ARM_USB_OCD_PID		0x0003
+ 
++/* www.elsterelectricity.com Elster Unicom III Optical Probe */
++#define FTDI_ELSTER_UNICOM_PID		0xE700 /* Product Id */
+ 
+ /*
+  * The Mobility Lab (TML)
+diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
+index 7c069a0..ea7bba6 100644
+--- a/drivers/usb/serial/keyspan.c
++++ b/drivers/usb/serial/keyspan.c
+@@ -838,7 +838,7 @@ static void	usa49_indat_callback(struct urb *urb)
+ 
+ 	port = (struct usb_serial_port *) urb->context;
+ 	tty = port->tty;
+-	if (urb->actual_length) {
++	if (tty && urb->actual_length) {
+ 		/* 0x80 bit is error flag */
+ 		if ((data[0] & 0x80) == 0) {
+ 			/* no error on any byte */
+diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
+index aee4502..17b3bae 100644
+--- a/drivers/usb/serial/kobil_sct.c
++++ b/drivers/usb/serial/kobil_sct.c
+@@ -114,6 +114,7 @@ static struct usb_serial_driver kobil_device = {
+ 	.usb_driver = 		&kobil_driver,
+ 	.id_table =		id_table,
+ 	.num_interrupt_in =	NUM_DONT_CARE,
++	.num_interrupt_out = 	NUM_DONT_CARE,
+ 	.num_bulk_in =		0,
+ 	.num_bulk_out =		0,
+ 	.num_ports =		1,
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index d1185f5..bbbe1b9 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -180,6 +180,7 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8117) },	/* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8118) },	/* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8128) },	/* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
++	{ USB_DEVICE(DELL_VENDOR_ID, 0x8136) },	/* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8137) },	/* Dell Wireless HSDPA 5520 */
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
+index 0da1df9..b7da8b5 100644
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -65,6 +65,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
+ 	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
+ 	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
++	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
+ 	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
+ 	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
+ 	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
+@@ -84,9 +85,10 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
+ 	{ USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
+ 	{ USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ID) },
+ 	{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
+ 	{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
++	{ USB_DEVICE(HL340_VENDOR_ID, HL340_PRODUCT_ID) },
++	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
+ 	{ }					/* Terminating entry */
+ };
+ 
+diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
+index d31f5d2..237a41f 100644
+--- a/drivers/usb/serial/pl2303.h
++++ b/drivers/usb/serial/pl2303.h
+@@ -35,6 +35,7 @@
+ 
+ #define RATOC_VENDOR_ID		0x0584
+ #define RATOC_PRODUCT_ID	0xb000
++#define RATOC_PRODUCT_ID_USB60F	0xb020
+ 
+ #define TRIPP_VENDOR_ID		0x2478
+ #define TRIPP_PRODUCT_ID	0x2008
+@@ -96,10 +97,6 @@
+ #define ALCOR_VENDOR_ID		0x058F
+ #define ALCOR_PRODUCT_ID	0x9720
+ 
+-/* Huawei E620 UMTS/HSDPA card (ID: 12d1:1001) */
+-#define HUAWEI_VENDOR_ID	0x12d1
+-#define HUAWEI_PRODUCT_ID	0x1001
+-
+ /* Willcom WS002IN Data Driver (by NetIndex Inc.) */
+ #define WS002IN_VENDOR_ID	0x11f6
+ #define WS002IN_PRODUCT_ID	0x2001
+@@ -107,3 +104,11 @@
+ /* Corega CG-USBRS232R Serial Adapter */
+ #define COREGA_VENDOR_ID	0x07aa
+ #define COREGA_PRODUCT_ID	0x002a
++
++/* HL HL-340 (ID: 4348:5523) */
++#define HL340_VENDOR_ID		0x4348
++#define HL340_PRODUCT_ID	0x5523
++
++/* Y.C. Cable U.S.A., Inc - USB to RS-232 */
++#define YCCABLE_VENDOR_ID	0x05ad
++#define YCCABLE_PRODUCT_ID	0x0fba
+diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
+index c295d04..b4d7ac9 100644
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -104,6 +104,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x1199, 0x0019) },	/* Sierra Wireless AirCard 595 */
+ 	{ USB_DEVICE(0x1199, 0x0021) },	/* Sierra Wireless AirCard 597E */
+ 	{ USB_DEVICE(0x1199, 0x0120) },	/* Sierra Wireless USB Dongle 595U */
++	{ USB_DEVICE(0x1199, 0x0023) },	/* Sierra Wireless AirCard */
+ 
+ 	{ USB_DEVICE(0x1199, 0x6802) },	/* Sierra Wireless MC8755 */
+ 	{ USB_DEVICE(0x1199, 0x6804) },	/* Sierra Wireless MC8755 */
+@@ -117,9 +118,15 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x1199, 0x6851) },	/* Sierra Wireless AirCard 881 */
+ 	{ USB_DEVICE(0x1199, 0x6852) },	/* Sierra Wireless AirCard 880 E */
+ 	{ USB_DEVICE(0x1199, 0x6853) },	/* Sierra Wireless AirCard 881 E */
++	{ USB_DEVICE(0x1199, 0x6855) },	/* Sierra Wireless AirCard 880 U */
++	{ USB_DEVICE(0x1199, 0x6856) },	/* Sierra Wireless AirCard 881 U */
++
++	{ USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
++	{ USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */
+ 
+ 	{ USB_DEVICE(0x1199, 0x0112), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 580 */
+ 	{ USB_DEVICE(0x0F3D, 0x0112), .driver_info = DEVICE_1_PORT }, /* Airprime/Sierra PC 5220 */
++	{ USB_DEVICE(0x05C6, 0x6613), .driver_info = DEVICE_1_PORT }, /* Onda H600/ZTE MF330 */
+ 
+ 	{ USB_DEVICE(0x1199, 0x0FFF), .driver_info = DEVICE_INSTALLER},
+ 	{ }
+@@ -129,6 +136,7 @@ MODULE_DEVICE_TABLE(usb, id_table);
+ static struct usb_device_id id_table_1port [] = {
+ 	{ USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
+ 	{ USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra PC 5220 */
++	{ USB_DEVICE(0x05C6, 0x6613) }, /* Onda H600/ZTE MF330 */
+ 	{ }
+ };
+ 
+@@ -142,6 +150,7 @@ static struct usb_device_id id_table_3port [] = {
+ 	{ USB_DEVICE(0x1199, 0x0019) },	/* Sierra Wireless AirCard 595 */
+ 	{ USB_DEVICE(0x1199, 0x0021) },	/* Sierra Wireless AirCard 597E */
+ 	{ USB_DEVICE(0x1199, 0x0120) },	/* Sierra Wireless USB Dongle 595U*/
++	{ USB_DEVICE(0x1199, 0x0023) },	/* Sierra Wireless AirCard */
+ 
+ 	{ USB_DEVICE(0x1199, 0x6802) },	/* Sierra Wireless MC8755 */
+ 	{ USB_DEVICE(0x1199, 0x6804) },	/* Sierra Wireless MC8755 */
+@@ -155,6 +164,10 @@ static struct usb_device_id id_table_3port [] = {
+ 	{ USB_DEVICE(0x1199, 0x6851) },	/* Sierra Wireless AirCard 881 */
+ 	{ USB_DEVICE(0x1199, 0x6852) },	/* Sierra Wireless AirCard 880E */
+ 	{ USB_DEVICE(0x1199, 0x6853) },	/* Sierra Wireless AirCard 881E */
++	{ USB_DEVICE(0x1199, 0x6855) },	/* Sierra Wireless AirCard 880 U */
++	{ USB_DEVICE(0x1199, 0x6856) },	/* Sierra Wireless AirCard 881U */
++	{ USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
++	{ USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */
+ 	{ }
+ };
+ 
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 6d6108b..fe12737 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -86,6 +86,14 @@ UNUSUAL_DEV(  0x03f0, 0x0307, 0x0001, 0x0001,
+ 		US_SC_8070, US_PR_USBAT, init_usbat_cd, 0),
+ #endif
+ 
++/* Reported by Grant Grundler <grundler at parisc-linux.org>
++ * HP r707 camera in "Disk" mode with 2.00.23 or 2.00.24 firmware.
++ */
++UNUSUAL_DEV(  0x03f0, 0x4002, 0x0001, 0x0001,
++		"HP",
++		"PhotoSmart R707",
++		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY),
++
+ /* Reported by Sebastian Kapfer <sebastian_kapfer at gmx.net>
+  * and Olaf Hering <olh at suse.de> (different bcd's, same vendor/product)
+  * for USB floppies that need the SINGLE_LUN enforcement.
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index 34f68f3..0a98389 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -353,7 +353,7 @@ static void ep_poll_safewake(struct poll_safewake *psw, wait_queue_head_t *wq)
+ 	spin_unlock_irqrestore(&psw->lock, flags);
+ 
+ 	/* Do really wake up now */
+-	wake_up(wq);
++	wake_up_nested(wq, 1 + wake_nests);
+ 
+ 	/* Remove the current task from the list */
+ 	spin_lock_irqsave(&psw->lock, flags);
+diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c
+index a94473d..5d8dcb9 100644
+--- a/fs/ncpfs/mmap.c
++++ b/fs/ncpfs/mmap.c
+@@ -50,10 +50,6 @@ static int ncp_file_mmap_fault(struct vm_area_struct *area,
+ 	pos = vmf->pgoff << PAGE_SHIFT;
+ 
+ 	count = PAGE_SIZE;
+-	if ((unsigned long)vmf->virtual_address + PAGE_SIZE > area->vm_end) {
+-		WARN_ON(1); /* shouldn't happen? */
+-		count = area->vm_end - (unsigned long)vmf->virtual_address;
+-	}
+ 	/* what we can read in one go */
+ 	bufsize = NCP_SERVER(inode)->buffer_size;
+ 
+diff --git a/fs/splice.c b/fs/splice.c
+index 6bdcb61..36fdc61 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -1184,6 +1184,9 @@ static int copy_from_user_mmap_sem(void *dst, const void __user *src, size_t n)
+ {
+ 	int partial;
+ 
++	if (!access_ok(VERIFY_READ, src, n))
++		return -EFAULT;
++
+ 	pagefault_disable();
+ 	partial = __copy_from_user_inatomic(dst, src, n);
+ 	pagefault_enable();
+@@ -1392,6 +1395,11 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
+ 			break;
+ 		}
+ 
++		if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
++			error = -EFAULT;
++			break;
++		}
++
+ 		sd.len = 0;
+ 		sd.total_len = len;
+ 		sd.flags = flags;
+diff --git a/include/linux/dmi.h b/include/linux/dmi.h
+index 5b42a65..b1251b2 100644
+--- a/include/linux/dmi.h
++++ b/include/linux/dmi.h
+@@ -79,7 +79,6 @@ extern void dmi_scan_machine(void);
+ extern int dmi_get_year(int field);
+ extern int dmi_name_in_vendors(const char *str);
+ extern int dmi_available;
+-extern char *dmi_get_slot(int slot);
+ 
+ #else
+ 
+@@ -90,7 +89,6 @@ static inline const struct dmi_device * dmi_find_device(int type, const char *na
+ static inline int dmi_get_year(int year) { return 0; }
+ static inline int dmi_name_in_vendors(const char *s) { return 0; }
+ #define dmi_available 0
+-static inline char *dmi_get_slot(int slot) { return NULL; }
+ 
+ #endif
+ 
+diff --git a/include/linux/wait.h b/include/linux/wait.h
+index 0e68628..8eb6420 100644
+--- a/include/linux/wait.h
++++ b/include/linux/wait.h
+@@ -161,6 +161,22 @@ wait_queue_head_t *FASTCALL(bit_waitqueue(void *, int));
+ #define	wake_up_locked(x)		__wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
+ #define wake_up_interruptible_sync(x)   __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
+ 
++#ifdef CONFIG_DEBUG_LOCK_ALLOC
++/*
++ * macro to avoid include hell
++ */
++#define wake_up_nested(x, s)						\
++do {									\
++	unsigned long flags;						\
++									\
++	spin_lock_irqsave_nested(&(x)->lock, flags, (s));		\
++	wake_up_locked(x); 						\
++	spin_unlock_irqrestore(&(x)->lock, flags);			\
++} while (0)
++#else
++#define wake_up_nested(x, s)		wake_up(x)
++#endif
++
+ #define __wait_event(wq, condition) 					\
+ do {									\
+ 	DEFINE_WAIT(__wait);						\
+diff --git a/kernel/relay.c b/kernel/relay.c
+index 61134eb..7c03733 100644
+--- a/kernel/relay.c
++++ b/kernel/relay.c
+@@ -92,6 +92,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
+ 		return -EINVAL;
+ 
+ 	vma->vm_ops = &relay_file_mmap_ops;
++	vma->vm_flags |= VM_DONTEXPAND;
+ 	vma->vm_private_data = buf;
+ 	buf->chan->cb->buf_mapped(buf, filp);
+ 
+diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
+index da7c061..2288ad8 100644
+--- a/kernel/sched_fair.c
++++ b/kernel/sched_fair.c
+@@ -511,7 +511,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
+ 
+ 	if (!initial) {
+ 		/* sleeps upto a single latency don't count. */
+-		if (sched_feat(NEW_FAIR_SLEEPERS) && entity_is_task(se))
++		if (sched_feat(NEW_FAIR_SLEEPERS))
+ 			vruntime -= sysctl_sched_latency;
+ 
+ 		/* ensure we never gain time by being placed backwards. */
+@@ -867,7 +867,11 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p)
+ 	}
+ 
+ 	gran = sysctl_sched_wakeup_granularity;
+-	if (unlikely(se->load.weight != NICE_0_LOAD))
++	/*
++	 * More easily preempt - nice tasks, while not making
++	 * it harder for + nice tasks.
++	 */
++	if (unlikely(se->load.weight > NICE_0_LOAD))
+ 		gran = calc_delta_fair(gran, &se->load);
+ 
+ 	if (pse->vruntime + gran < se->vruntime)
+diff --git a/mm/filemap.c b/mm/filemap.c
+index f4d0cde..69430d2 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -1733,7 +1733,11 @@ static void __iov_iter_advance_iov(struct iov_iter *i, size_t bytes)
+ 		const struct iovec *iov = i->iov;
+ 		size_t base = i->iov_offset;
+ 
+-		while (bytes) {
++		/*
++		 * The !iov->iov_len check ensures we skip over unlikely
++		 * zero-length segments.
++		 */
++		while (bytes || !iov->iov_len) {
+ 			int copy = min(bytes, iov->iov_len - base);
+ 
+ 			bytes -= copy;
+@@ -2251,6 +2255,7 @@ again:
+ 
+ 		cond_resched();
+ 
++		iov_iter_advance(i, copied);
+ 		if (unlikely(copied == 0)) {
+ 			/*
+ 			 * If we were unable to copy any data at all, we must
+@@ -2264,7 +2269,6 @@ again:
+ 						iov_iter_single_seg_count(i));
+ 			goto again;
+ 		}
+-		iov_iter_advance(i, copied);
+ 		pos += copied;
+ 		written += copied;
+ 
+diff --git a/mm/fremap.c b/mm/fremap.c
+index 14bd3bf..69a37c2 100644
+--- a/mm/fremap.c
++++ b/mm/fremap.c
+@@ -190,10 +190,13 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
+ 		 */
+ 		if (mapping_cap_account_dirty(mapping)) {
+ 			unsigned long addr;
++			struct file *file = vma->vm_file;
+ 
+ 			flags &= MAP_NONBLOCK;
+-			addr = mmap_region(vma->vm_file, start, size,
++			get_file(file);
++			addr = mmap_region(file, start, size,
+ 					flags, vma->vm_flags, pgoff, 1);
++			fput(file);
+ 			if (IS_ERR_VALUE(addr)) {
+ 				err = addr;
+ 			} else {
+diff --git a/mm/mmap.c b/mm/mmap.c
+index 15678aa..555b3e7 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -2215,7 +2215,7 @@ int install_special_mapping(struct mm_struct *mm,
+ 	vma->vm_start = addr;
+ 	vma->vm_end = addr + len;
+ 
+-	vma->vm_flags = vm_flags | mm->def_flags;
++	vma->vm_flags = vm_flags | mm->def_flags | VM_DONTEXPAND;
+ 	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
+ 
+ 	vma->vm_ops = &special_mapping_vmops;
+diff --git a/mm/slab.c b/mm/slab.c
+index b03b2e4..ff31261 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -304,11 +304,11 @@ struct kmem_list3 {
+ /*
+  * Need this for bootstrapping a per node allocator.
+  */
+-#define NUM_INIT_LISTS (2 * MAX_NUMNODES + 1)
++#define NUM_INIT_LISTS (3 * MAX_NUMNODES)
+ struct kmem_list3 __initdata initkmem_list3[NUM_INIT_LISTS];
+ #define	CACHE_CACHE 0
+-#define	SIZE_AC 1
+-#define	SIZE_L3 (1 + MAX_NUMNODES)
++#define	SIZE_AC MAX_NUMNODES
++#define	SIZE_L3 (2 * MAX_NUMNODES)
+ 
+ static int drain_freelist(struct kmem_cache *cache,
+ 			struct kmem_list3 *l3, int tofree);
+@@ -1410,6 +1410,22 @@ static void init_list(struct kmem_cache *cachep, struct kmem_list3 *list,
+ }
+ 
+ /*
++ * For setting up all the kmem_list3s for cache whose buffer_size is same as
++ * size of kmem_list3.
++ */
++static void __init set_up_list3s(struct kmem_cache *cachep, int index)
++{
++	int node;
++
++	for_each_online_node(node) {
++		cachep->nodelists[node] = &initkmem_list3[index + node];
++		cachep->nodelists[node]->next_reap = jiffies +
++		    REAPTIMEOUT_LIST3 +
++		    ((unsigned long)cachep) % REAPTIMEOUT_LIST3;
++	}
++}
++
++/*
+  * Initialisation.  Called after the page allocator have been initialised and
+  * before smp_init().
+  */
+@@ -1432,6 +1448,7 @@ void __init kmem_cache_init(void)
+ 		if (i < MAX_NUMNODES)
+ 			cache_cache.nodelists[i] = NULL;
+ 	}
++	set_up_list3s(&cache_cache, CACHE_CACHE);
+ 
+ 	/*
+ 	 * Fragmentation resistance on low memory - only use bigger
+@@ -1587,10 +1604,9 @@ void __init kmem_cache_init(void)
+ 	{
+ 		int nid;
+ 
+-		/* Replace the static kmem_list3 structures for the boot cpu */
+-		init_list(&cache_cache, &initkmem_list3[CACHE_CACHE], node);
+-
+ 		for_each_online_node(nid) {
++			init_list(&cache_cache, &initkmem_list3[CACHE_CACHE], nid);
++
+ 			init_list(malloc_sizes[INDEX_AC].cs_cachep,
+ 				  &initkmem_list3[SIZE_AC + nid], nid);
+ 
+@@ -1960,22 +1976,6 @@ static void slab_destroy(struct kmem_cache *cachep, struct slab *slabp)
+ 	}
+ }
+ 
+-/*
+- * For setting up all the kmem_list3s for cache whose buffer_size is same as
+- * size of kmem_list3.
+- */
+-static void __init set_up_list3s(struct kmem_cache *cachep, int index)
+-{
+-	int node;
+-
+-	for_each_online_node(node) {
+-		cachep->nodelists[node] = &initkmem_list3[index + node];
+-		cachep->nodelists[node]->next_reap = jiffies +
+-		    REAPTIMEOUT_LIST3 +
+-		    ((unsigned long)cachep) % REAPTIMEOUT_LIST3;
+-	}
+-}
+-
+ static void __kmem_cache_destroy(struct kmem_cache *cachep)
+ {
+ 	int i;
+@@ -2099,7 +2099,7 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep)
+ 			g_cpucache_up = PARTIAL_L3;
+ 		} else {
+ 			int node;
+-			for_each_node_state(node, N_NORMAL_MEMORY) {
++			for_each_online_node(node) {
+ 				cachep->nodelists[node] =
+ 				    kmalloc_node(sizeof(struct kmem_list3),
+ 						GFP_KERNEL, node);
+diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
+index d802b5a..9ddf944 100644
+--- a/scripts/mod/file2alias.c
++++ b/scripts/mod/file2alias.c
+@@ -155,7 +155,7 @@ static void do_usb_entry_multi(struct usb_device_id *id, struct module *mod)
+ 	 * Some modules (visor) have empty slots as placeholder for
+ 	 * run-time specification that results in catch-all alias
+ 	 */
+-	if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass))
++	if (!(id->idVendor | id->idProduct | id->bDeviceClass | id->bInterfaceClass))
+ 		return;
+ 
+ 	/* Convert numeric bcdDevice range into fnmatch-able pattern(s) */
+diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
+index f83b19d..4bf715d 100644
+--- a/security/selinux/ss/services.c
++++ b/security/selinux/ss/services.c
+@@ -1744,6 +1744,9 @@ int security_genfs_sid(const char *fstype,
+ 	struct ocontext *c;
+ 	int rc = 0, cmp = 0;
+ 
++	while (path[0] == '/' && path[1] == '/')
++		path++;
++
+ 	POLICY_RDLOCK;
+ 
+ 	for (genfs = policydb.genfs; genfs; genfs = genfs->next) {
+diff --git a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c
+index 5d3c037..f95aa09 100644
+--- a/sound/oss/via82cxxx_audio.c
++++ b/sound/oss/via82cxxx_audio.c
+@@ -2104,6 +2104,7 @@ static struct page * via_mm_nopage (struct vm_area_struct * vma,
+ {
+ 	struct via_info *card = vma->vm_private_data;
+ 	struct via_channel *chan = &card->ch_out;
++	unsigned long max_bufs;
+ 	struct page *dmapage;
+ 	unsigned long pgoff;
+ 	int rd, wr;
+@@ -2127,14 +2128,11 @@ static struct page * via_mm_nopage (struct vm_area_struct * vma,
+ 	rd = card->ch_in.is_mapped;
+ 	wr = card->ch_out.is_mapped;
+ 
+-#ifndef VIA_NDEBUG
+-	{
+-	unsigned long max_bufs = chan->frag_number;
+-	if (rd && wr) max_bufs *= 2;
+-	/* via_dsp_mmap() should ensure this */
+-	assert (pgoff < max_bufs);
+-	}
+-#endif
++	max_bufs = chan->frag_number;
++	if (rd && wr)
++		max_bufs *= 2;
++	if (pgoff >= max_bufs)
++		return NOPAGE_SIGBUS;
+ 
+ 	/* if full-duplex (read+write) and we have two sets of bufs,
+ 	 * then the playback buffers come first, sez soundcard.c */
+diff --git a/sound/usb/usx2y/usX2Yhwdep.c b/sound/usb/usx2y/usX2Yhwdep.c
+index b76b3dd..e617d7e 100644
+--- a/sound/usb/usx2y/usX2Yhwdep.c
++++ b/sound/usb/usx2y/usX2Yhwdep.c
+@@ -88,7 +88,7 @@ static int snd_us428ctls_mmap(struct snd_hwdep * hw, struct file *filp, struct v
+ 		us428->us428ctls_sharedmem->CtlSnapShotLast = -2;
+ 	}
+ 	area->vm_ops = &us428ctls_vm_ops;
+-	area->vm_flags |= VM_RESERVED;
++	area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
+ 	area->vm_private_data = hw->private_data;
+ 	return 0;
+ }
+diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c
+index a5e7bcd..6e70520 100644
+--- a/sound/usb/usx2y/usx2yhwdeppcm.c
++++ b/sound/usb/usx2y/usx2yhwdeppcm.c
+@@ -728,7 +728,7 @@ static int snd_usX2Y_hwdep_pcm_mmap(struct snd_hwdep * hw, struct file *filp, st
+ 		return -ENODEV;
+ 	}
+ 	area->vm_ops = &snd_usX2Y_hwdep_pcm_vm_ops;
+-	area->vm_flags |= VM_RESERVED;
++	area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
+ 	area->vm_private_data = hw->private_data;
+ 	return 0;
+ }

Added: dists/sid/linux-2.6/debian/patches/series/4
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/series/4	Fri Feb  8 21:29:26 2008
@@ -0,0 +1,2 @@
+- bugfix/all/slab-fix-bootstrap-on-memoryless-node.patch
++ bugfix/all/stable/2.6.24.1.patch



More information about the Kernel-svn-changes mailing list