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

Maximilian Attems maks at alioth.debian.org
Sat Dec 20 21:03:42 UTC 2008


Author: maks
Date: Sat Dec 20 21:03:40 2008
New Revision: 12516

Log:
add stable 2.6.27.10

ah how nice without external patches ;)

Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.10
Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	(original)
+++ dists/trunk/linux-2.6/debian/changelog	Sat Dec 20 21:03:40 2008
@@ -18,7 +18,7 @@
     EDAC_I5100, RTC_DRV_M41T94, RTC_DRV_DS1305, UBIFS.
   * [x86] set MOUSE_BCM5974, X86_RESERVE_LOW_64K.
   * [x86_64] set AMD_IOMMU, MTRR_SANITIZER.
-  * Add stable releases 2.6.27.1-2.6.27.9.
+  * Add stable releases 2.6.27.1-2.6.27.10.
 
   [ Martin Michlmayr ]
   * [mips/r4k-ip22, mips/sb1-bcm91250a] Don't build in ISO9660.

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.10
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.10	Sat Dec 20 21:03:40 2008
@@ -0,0 +1,1256 @@
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index 1150444..792be86 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -283,7 +283,7 @@ and is between 256 and 4096 characters. It is defined in the file
+ 			Possible values are:
+ 			isolate - enable device isolation (each device, as far
+ 			          as possible, will get its own protection
+-			          domain)
++			          domain) [default]
+ 	amd_iommu_size= [HW,X86-64]
+ 			Define the size of the aperture for the AMD IOMMU
+ 			driver. Possible values are:
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
+index bccd0ef..a1378c4 100644
+--- a/arch/x86/kernel/amd_iommu_init.c
++++ b/arch/x86/kernel/amd_iommu_init.c
+@@ -120,7 +120,7 @@ u16 amd_iommu_last_bdf;			/* largest PCI device id we have
+ LIST_HEAD(amd_iommu_unity_map);		/* a list of required unity mappings
+ 					   we find in ACPI */
+ unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */
+-int amd_iommu_isolate;			/* if 1, device isolation is enabled */
++int amd_iommu_isolate = 1;		/* if 1, device isolation is enabled */
+ 
+ LIST_HEAD(amd_iommu_list);		/* list of all AMD IOMMUs in the
+ 					   system */
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 7667443..6d5a3c4 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -634,6 +634,9 @@ void __init setup_arch(char **cmdline_p)
+ 	printk(KERN_INFO "Command line: %s\n", boot_command_line);
+ #endif
+ 
++	/* VMI may relocate the fixmap; do this before touching ioremap area */
++	vmi_init();
++
+ 	early_cpu_init();
+ 	early_ioremap_init();
+ 
+@@ -707,13 +710,8 @@ void __init setup_arch(char **cmdline_p)
+ 	check_efer();
+ #endif
+ 
+-#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
+-	/*
+-	 * Must be before kernel pagetables are setup
+-	 * or fixmap area is touched.
+-	 */
+-	vmi_init();
+-#endif
++	/* Must be before kernel pagetables are setup */
++	vmi_activate();
+ 
+ 	/* after early param, so could get panic from serial */
+ 	reserve_early_setup_data();
+diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
+index 7985c5b..259569f 100644
+--- a/arch/x86/kernel/smpboot.c
++++ b/arch/x86/kernel/smpboot.c
+@@ -289,9 +289,7 @@ static void __cpuinit start_secondary(void *unused)
+ 	 * fragile that we want to limit the things done here to the
+ 	 * most necessary things.
+ 	 */
+-#ifdef CONFIG_VMI
+ 	vmi_bringup();
+-#endif
+ 	cpu_init();
+ 	preempt_disable();
+ 	smp_callin();
+diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
+index edfb09f..f370d38 100644
+--- a/arch/x86/kernel/vmi_32.c
++++ b/arch/x86/kernel/vmi_32.c
+@@ -960,8 +960,6 @@ static inline int __init activate_vmi(void)
+ 
+ void __init vmi_init(void)
+ {
+-	unsigned long flags;
+-
+ 	if (!vmi_rom)
+ 		probe_vmi_rom();
+ 	else
+@@ -973,13 +971,21 @@ void __init vmi_init(void)
+ 
+ 	reserve_top_address(-vmi_rom->virtual_top);
+ 
+-	local_irq_save(flags);
+-	activate_vmi();
+-
+ #ifdef CONFIG_X86_IO_APIC
+ 	/* This is virtual hardware; timer routing is wired correctly */
+ 	no_timer_check = 1;
+ #endif
++}
++
++void vmi_activate(void)
++{
++	unsigned long flags;
++
++	if (!vmi_rom)
++		return;
++
++	local_irq_save(flags);
++	activate_vmi();
+ 	local_irq_restore(flags & X86_EFLAGS_IF);
+ }
+ 
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index b551cda..f38e2af 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -3979,17 +3979,70 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+ 	{ "ST3160023AS",	"3.42",		ATA_HORKAGE_NONCQ },
+ 
+ 	/* Seagate NCQ + FLUSH CACHE firmware bug */
+-	{ "ST31500341AS",	"9JU138",	ATA_HORKAGE_NONCQ |
++	{ "ST31500341AS",	"SD15",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+-	{ "ST31000333AS",	"9FZ136",	ATA_HORKAGE_NONCQ |
++	{ "ST31500341AS",	"SD16",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+-	{ "ST3640623AS",	"9FZ164",	ATA_HORKAGE_NONCQ |
++	{ "ST31500341AS",	"SD17",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+-	{ "ST3640323AS",	"9FZ134",	ATA_HORKAGE_NONCQ |
++	{ "ST31500341AS",	"SD18",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+-	{ "ST3320813AS",	"9FZ182",	ATA_HORKAGE_NONCQ |
++	{ "ST31500341AS",	"SD19",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+-	{ "ST3320613AS",	"9FZ162",	ATA_HORKAGE_NONCQ |
++
++	{ "ST31000333AS",	"SD15",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST31000333AS",	"SD16",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST31000333AS",	"SD17",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST31000333AS",	"SD18",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST31000333AS",	"SD19",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++
++	{ "ST3640623AS",	"SD15",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640623AS",	"SD16",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640623AS",	"SD17",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640623AS",	"SD18",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640623AS",	"SD19",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++
++	{ "ST3640323AS",	"SD15",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640323AS",	"SD16",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640323AS",	"SD17",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640323AS",	"SD18",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3640323AS",	"SD19",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++
++	{ "ST3320813AS",	"SD15",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320813AS",	"SD16",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320813AS",	"SD17",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320813AS",	"SD18",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320813AS",	"SD19",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++
++	{ "ST3320613AS",	"SD15",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320613AS",	"SD16",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320613AS",	"SD17",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320613AS",	"SD18",		ATA_HORKAGE_NONCQ |
++						ATA_HORKAGE_FIRMWARE_WARN },
++	{ "ST3320613AS",	"SD19",		ATA_HORKAGE_NONCQ |
+ 						ATA_HORKAGE_FIRMWARE_WARN },
+ 
+ 	/* Blacklist entries taken from Silicon Image 3124/3132
+diff --git a/drivers/char/cp437.uni b/drivers/char/cp437.uni
+index 1f06889..bc61634 100644
+--- a/drivers/char/cp437.uni
++++ b/drivers/char/cp437.uni
+@@ -27,7 +27,7 @@
+ 0x0c	U+2640
+ 0x0d	U+266a
+ 0x0e	U+266b
+-0x0f	U+263c
++0x0f	U+263c U+00a4
+ 0x10	U+25b6 U+25ba
+ 0x11	U+25c0 U+25c4
+ 0x12	U+2195
+@@ -55,7 +55,7 @@
+ 0x24	U+0024
+ 0x25	U+0025
+ 0x26	U+0026
+-0x27	U+0027
++0x27	U+0027 U+00b4
+ 0x28	U+0028
+ 0x29	U+0029
+ 0x2a	U+002a
+@@ -84,7 +84,7 @@
+ 0x41	U+0041 U+00c0 U+00c1 U+00c2 U+00c3
+ 0x42	U+0042
+ 0x43	U+0043 U+00a9
+-0x44	U+0044
++0x44	U+0044 U+00d0
+ 0x45	U+0045 U+00c8 U+00ca U+00cb
+ 0x46	U+0046
+ 0x47	U+0047
+@@ -140,7 +140,7 @@
+ 0x79	U+0079 U+00fd
+ 0x7a	U+007a
+ 0x7b	U+007b
+-0x7c	U+007c U+00a5
++0x7c	U+007c U+00a6
+ 0x7d	U+007d
+ 0x7e	U+007e
+ #
+@@ -263,10 +263,10 @@
+ 0xe8	U+03a6 U+00d8
+ 0xe9	U+0398
+ 0xea	U+03a9 U+2126
+-0xeb	U+03b4
++0xeb	U+03b4 U+00f0
+ 0xec	U+221e
+ 0xed	U+03c6 U+00f8
+-0xee	U+03b5
++0xee	U+03b5 U+2208
+ 0xef	U+2229
+ 0xf0	U+2261
+ 0xf1	U+00b1
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index 60359c3..d429499 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -2287,7 +2287,7 @@ rescan_last_byte:
+ 				    continue; /* nothing to display */
+ 				}
+ 				/* Glyph not found */
+-				if ((!(vc->vc_utf && !vc->vc_disp_ctrl) || c < 128) && !(c & ~charmask)) {
++				if ((!(vc->vc_utf && !vc->vc_disp_ctrl) && c < 128) && !(c & ~charmask)) {
+ 				    /* In legacy mode use the glyph we get by a 1:1 mapping.
+ 				       This would make absolutely no sense with Unicode in mind,
+ 				       but do this for ASCII characters since a font may lack
+diff --git a/drivers/char/xilinx_hwicap/buffer_icap.c b/drivers/char/xilinx_hwicap/buffer_icap.c
+index aa7f796..05d8977 100644
+--- a/drivers/char/xilinx_hwicap/buffer_icap.c
++++ b/drivers/char/xilinx_hwicap/buffer_icap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/buffer_icap.h b/drivers/char/xilinx_hwicap/buffer_icap.h
+index 8b0252b..d4f419e 100644
+--- a/drivers/char/xilinx_hwicap/buffer_icap.h
++++ b/drivers/char/xilinx_hwicap/buffer_icap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/fifo_icap.c b/drivers/char/xilinx_hwicap/fifo_icap.c
+index 776b505..02225eb 100644
+--- a/drivers/char/xilinx_hwicap/fifo_icap.c
++++ b/drivers/char/xilinx_hwicap/fifo_icap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/fifo_icap.h b/drivers/char/xilinx_hwicap/fifo_icap.h
+index 62bda45..4c9dd9a 100644
+--- a/drivers/char/xilinx_hwicap/fifo_icap.h
++++ b/drivers/char/xilinx_hwicap/fifo_icap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
+index 278c985..15ead99 100644
+--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c
++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2002 Xilinx Inc., Systems Engineering Group
+  *     (c) Copyright 2004 Xilinx Inc., Systems Engineering Group
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h
+index 24d0d9b..8cca119 100644
+--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h
++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2007 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
+index 251416f..595759c 100644
+--- a/drivers/firewire/fw-ohci.c
++++ b/drivers/firewire/fw-ohci.c
+@@ -958,6 +958,7 @@ at_context_queue_packet(struct context *ctx, struct fw_packet *packet)
+ 			packet->ack = RCODE_SEND_ERROR;
+ 			return -1;
+ 		}
++		packet->payload_bus = payload_bus;
+ 
+ 		d[2].req_count    = cpu_to_le16(packet->payload_length);
+ 		d[2].data_address = cpu_to_le32(payload_bus);
+@@ -1009,7 +1010,6 @@ static int handle_at_packet(struct context *context,
+ 	struct driver_data *driver_data;
+ 	struct fw_packet *packet;
+ 	struct fw_ohci *ohci = context->ohci;
+-	dma_addr_t payload_bus;
+ 	int evt;
+ 
+ 	if (last->transfer_status == 0)
+@@ -1022,9 +1022,8 @@ static int handle_at_packet(struct context *context,
+ 		/* This packet was cancelled, just continue. */
+ 		return 1;
+ 
+-	payload_bus = le32_to_cpu(last->data_address);
+-	if (payload_bus != 0)
+-		dma_unmap_single(ohci->card.device, payload_bus,
++	if (packet->payload_bus)
++		dma_unmap_single(ohci->card.device, packet->payload_bus,
+ 				 packet->payload_length, DMA_TO_DEVICE);
+ 
+ 	evt = le16_to_cpu(last->transfer_status) & 0x1f;
+@@ -1681,6 +1680,10 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)
+ 	if (packet->ack != 0)
+ 		goto out;
+ 
++	if (packet->payload_bus)
++		dma_unmap_single(ohci->card.device, packet->payload_bus,
++				 packet->payload_length, DMA_TO_DEVICE);
++
+ 	log_ar_at_event('T', packet->speed, packet->header, 0x20);
+ 	driver_data->packet = NULL;
+ 	packet->ack = RCODE_CANCELLED;
+diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
+index e5d1a0b..27f7c7e 100644
+--- a/drivers/firewire/fw-transaction.c
++++ b/drivers/firewire/fw-transaction.c
+@@ -207,6 +207,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
+ 	packet->speed = speed;
+ 	packet->generation = generation;
+ 	packet->ack = 0;
++	packet->payload_bus = 0;
+ }
+ 
+ /**
+@@ -541,6 +542,8 @@ fw_fill_response(struct fw_packet *response, u32 *request_header,
+ 		BUG();
+ 		return;
+ 	}
++
++	response->payload_bus = 0;
+ }
+ EXPORT_SYMBOL(fw_fill_response);
+ 
+diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
+index 81b15ba..04cc9b0 100644
+--- a/drivers/firewire/fw-transaction.h
++++ b/drivers/firewire/fw-transaction.h
+@@ -27,6 +27,7 @@
+ #include <linux/list.h>
+ #include <linux/spinlock_types.h>
+ #include <linux/timer.h>
++#include <linux/types.h>
+ #include <linux/workqueue.h>
+ 
+ #define TCODE_IS_READ_REQUEST(tcode)	(((tcode) & ~1) == 4)
+@@ -153,6 +154,7 @@ struct fw_packet {
+ 	size_t header_length;
+ 	void *payload;
+ 	size_t payload_length;
++	dma_addr_t payload_bus;
+ 	u32 timestamp;
+ 
+ 	/*
+diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
+index 16240a7..3d3c3bc 100644
+--- a/drivers/ieee1394/nodemgr.c
++++ b/drivers/ieee1394/nodemgr.c
+@@ -115,8 +115,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length,
+ 	return error;
+ }
+ 
++#define OUI_FREECOM_TECHNOLOGIES_GMBH 0x0001db
++
+ static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci)
+ {
++	/* Freecom FireWire Hard Drive firmware bug */
++	if (be32_to_cpu(bus_info_data[3]) >> 8 == OUI_FREECOM_TECHNOLOGIES_GMBH)
++		return 0;
++
+ 	return (be32_to_cpu(bus_info_data[2]) >> 8) & 0x3;
+ }
+ 
+diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c
+index 1e288ee..6461a32 100644
+--- a/drivers/isdn/hardware/avm/b1isa.c
++++ b/drivers/isdn/hardware/avm/b1isa.c
+@@ -233,10 +233,8 @@ static void __exit b1isa_exit(void)
+ 	int i;
+ 
+ 	for (i = 0; i < MAX_CARDS; i++) {
+-		if (!io[i])
+-			break;
+-
+-		b1isa_remove(&isa_dev[i]);
++		if (isa_dev[i].resource[0].start)
++			b1isa_remove(&isa_dev[i]);
+ 	}
+ 	unregister_capi_driver(&capi_driver_b1isa);
+ }
+diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
+index d74df58..bec489e 100644
+--- a/drivers/media/video/tvaudio.c
++++ b/drivers/media/video/tvaudio.c
+@@ -152,7 +152,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+ {
+ 	unsigned char buffer[2];
+ 
+-	if (-1 == subaddr) {
++	if (subaddr < 0) {
+ 		v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n",
+ 			chip->c->name, val);
+ 		chip->shadow.bytes[1] = val;
+@@ -163,6 +163,13 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+ 			return -1;
+ 		}
+ 	} else {
++		if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++			v4l_info(chip->c,
++				"Tried to access a non-existent register: %d\n",
++				subaddr);
++			return -EINVAL;
++		}
++
+ 		v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n",
+ 			chip->c->name, subaddr, val);
+ 		chip->shadow.bytes[subaddr+1] = val;
+@@ -177,12 +184,20 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+ 	return 0;
+ }
+ 
+-static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask)
++static int chip_write_masked(struct CHIPSTATE *chip,
++			     int subaddr, int val, int mask)
+ {
+ 	if (mask != 0) {
+-		if (-1 == subaddr) {
++		if (subaddr < 0) {
+ 			val = (chip->shadow.bytes[1] & ~mask) | (val & mask);
+ 		} else {
++			if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++				v4l_info(chip->c,
++					"Tried to access a non-existent register: %d\n",
++					subaddr);
++				return -EINVAL;
++			}
++
+ 			val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask);
+ 		}
+ 	}
+@@ -228,6 +243,15 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
+ 	if (0 == cmd->count)
+ 		return 0;
+ 
++	if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++		v4l_info(chip->c,
++			 "Tried to access a non-existent register range: %d to %d\n",
++			 cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1);
++		return -EINVAL;
++	}
++
++	/* FIXME: it seems that the shadow bytes are wrong bellow !*/
++
+ 	/* update our shadow register set; print bytes if (debug > 0) */
+ 	v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:",
+ 		chip->c->name, name,cmd->bytes[0]);
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index c792138..1b9c4dc 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -2370,6 +2370,9 @@ static void bond_miimon_commit(struct bonding *bond)
+ 			continue;
+ 
+ 		case BOND_LINK_DOWN:
++			if (slave->link_failure_count < UINT_MAX)
++				slave->link_failure_count++;
++
+ 			slave->link = BOND_LINK_DOWN;
+ 
+ 			if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
+diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
+index bcd2bc4..79be768 100644
+--- a/drivers/net/e1000e/ich8lan.c
++++ b/drivers/net/e1000e/ich8lan.c
+@@ -1791,12 +1791,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
+ 		ctrl |= E1000_CTRL_PHY_RST;
+ 	}
+ 	ret_val = e1000_acquire_swflag_ich8lan(hw);
++	/* Whether or not the swflag was acquired, we need to reset the part */
+ 	hw_dbg(hw, "Issuing a global reset to ich8lan");
+ 	ew32(CTRL, (ctrl | E1000_CTRL_RST));
+ 	msleep(20);
+ 
+-	/* release the swflag because it is not reset by hardware reset */
+-	e1000_release_swflag_ich8lan(hw);
++	if (!ret_val) {
++		/* release the swflag because it is not reset by
++		 * hardware reset
++		 */
++		e1000_release_swflag_ich8lan(hw);
++	}
+ 
+ 	ret_val = e1000e_get_auto_rd_done(hw);
+ 	if (ret_val) {
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index cf7056e..79b7ae3 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv)
+ 
+ 		rxq->queue[i] = NULL;
+ 
+-		pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
++		pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr,
+ 					    priv->hw_params.rx_buf_size,
+ 					    PCI_DMA_FROMDEVICE);
+ 		pkt = (struct iwl_rx_packet *)rxb->skb->data;
+@@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv)
+ 			rxb->skb = NULL;
+ 		}
+ 
+-		pci_unmap_single(priv->pci_dev, rxb->dma_addr,
+-				 priv->hw_params.rx_buf_size,
++		pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
++				 priv->hw_params.rx_buf_size + 256,
+ 				 PCI_DMA_FROMDEVICE);
+ 		spin_lock_irqsave(&rxq->lock, flags);
+ 		list_add_tail(&rxb->list, &priv->rxq.rx_used);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
+index 1383fd1..b346268 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -290,6 +290,9 @@ void iwl_clear_stations_table(struct iwl_priv *priv)
+ 	priv->num_stations = 0;
+ 	memset(priv->stations, 0, sizeof(priv->stations));
+ 
++	/* clean ucode key table bit map */
++	priv->ucode_key_table = 0;
++
+ 	spin_unlock_irqrestore(&priv->sta_lock, flags);
+ }
+ EXPORT_SYMBOL(iwl_clear_stations_table);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
+index 09bdf8e..cf7757f 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
+@@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg;
+ #define	DEFAULT_LONG_RETRY_LIMIT  4U
+ 
+ struct iwl_rx_mem_buffer {
+-	dma_addr_t dma_addr;
++	dma_addr_t real_dma_addr;
++	dma_addr_t aligned_dma_addr;
+ 	struct sk_buff *skb;
+ 	struct list_head list;
+ };
+diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
+index e81bfc4..ce25379 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
+@@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv)
+ 		list_del(element);
+ 
+ 		/* Point to Rx buffer via next RBD in circular buffer */
+-		rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr);
++		rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr);
+ 		rxq->queue[rxq->write] = rxb;
+ 		rxq->write = (rxq->write + 1) & RX_QUEUE_MASK;
+ 		rxq->free_count--;
+@@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+ 		rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
+ 
+ 		/* Alloc a new receive buffer */
+-		rxb->skb = alloc_skb(priv->hw_params.rx_buf_size,
++		rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
+ 				__GFP_NOWARN | GFP_ATOMIC);
+ 		if (!rxb->skb) {
+ 			if (net_ratelimit())
+@@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+ 		list_del(element);
+ 
+ 		/* Get physical address of RB/SKB */
+-		rxb->dma_addr =
+-		    pci_map_single(priv->pci_dev, rxb->skb->data,
+-			   priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE);
++		rxb->real_dma_addr = pci_map_single(
++					priv->pci_dev,
++					rxb->skb->data,
++					priv->hw_params.rx_buf_size + 256,
++					PCI_DMA_FROMDEVICE);
++		/* dma address must be no more than 36 bits */
++		BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36));
++		/* and also 256 byte aligned! */
++		rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256);
++		skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr);
++
+ 		list_add_tail(&rxb->list, &rxq->rx_free);
+ 		rxq->free_count++;
+ 	}
+@@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
+ 	for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
+ 		if (rxq->pool[i].skb != NULL) {
+ 			pci_unmap_single(priv->pci_dev,
+-					 rxq->pool[i].dma_addr,
+-					 priv->hw_params.rx_buf_size,
++					 rxq->pool[i].real_dma_addr,
++					 priv->hw_params.rx_buf_size + 256,
+ 					 PCI_DMA_FROMDEVICE);
+ 			dev_kfree_skb(rxq->pool[i].skb);
+ 		}
+@@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
+ 		 * to an SKB, so we need to unmap and free potential storage */
+ 		if (rxq->pool[i].skb != NULL) {
+ 			pci_unmap_single(priv->pci_dev,
+-					 rxq->pool[i].dma_addr,
+-					 priv->hw_params.rx_buf_size,
++					 rxq->pool[i].real_dma_addr,
++					 priv->hw_params.rx_buf_size + 256,
+ 					 PCI_DMA_FROMDEVICE);
+ 			priv->alloc_rxb_skb--;
+ 			dev_kfree_skb(rxq->pool[i].skb);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
+index 6283a3a..f2d473c 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
++++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
+@@ -475,7 +475,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv)
+ 		if (!test_and_set_bit(i, &priv->ucode_key_table))
+ 			return i;
+ 
+-	return -1;
++	return WEP_INVALID_OFFSET;
+ }
+ 
+ int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty)
+@@ -620,6 +620,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv,
+ 	/* else, we are overriding an existing key => no need to allocated room
+ 	 * in uCode. */
+ 
++	WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++		"no space for new kew");
++
+ 	priv->stations[sta_id].sta.key.key_flags = key_flags;
+ 	priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
+ 	priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+@@ -637,6 +640,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
+ {
+ 	unsigned long flags;
+ 	__le16 key_flags = 0;
++	int ret;
+ 
+ 	key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK);
+ 	key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
+@@ -664,14 +668,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
+ 	/* else, we are overriding an existing key => no need to allocated room
+ 	 * in uCode. */
+ 
++	WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++		"no space for new kew");
++
+ 	priv->stations[sta_id].sta.key.key_flags = key_flags;
+ 	priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
+ 	priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+ 
++	ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
++
+ 	spin_unlock_irqrestore(&priv->sta_lock, flags);
+ 
+-	IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n");
+-	return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
++	return ret;
+ }
+ 
+ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
+@@ -696,6 +704,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
+ 	/* else, we are overriding an existing key => no need to allocated room
+ 	 * in uCode. */
+ 
++	WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++		"no space for new kew");
++
+ 	/* This copy is acutally not needed: we get the key with each TX */
+ 	memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16);
+ 
+@@ -734,6 +745,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
+ 		return 0;
+ 	}
+ 
++	if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) {
++		IWL_WARNING("Removing wrong key %d 0x%x\n",
++			    keyconf->keyidx, key_flags);
++		spin_unlock_irqrestore(&priv->sta_lock, flags);
++		return 0;
++	}
++
+ 	if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset,
+ 		&priv->ucode_key_table))
+ 		IWL_ERROR("index %d not used in uCode key table.\n",
+diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c
+index b790ddf..ee380d5 100644
+--- a/drivers/video/macfb.c
++++ b/drivers/video/macfb.c
+@@ -164,7 +164,6 @@ static struct fb_var_screeninfo macfb_defined = {
+ };
+ 
+ static struct fb_fix_screeninfo macfb_fix = {
+-	.id	= "Macintosh ",
+ 	.type	= FB_TYPE_PACKED_PIXELS,
+ 	.accel	= FB_ACCEL_NONE,
+ };
+@@ -760,22 +759,22 @@ static int __init macfb_init(void)
+ 
+ 		switch(ndev->dr_hw) {
+ 		case NUBUS_DRHW_APPLE_MDC:
+-			strcat( macfb_fix.id, "Display Card" );
++			strcpy(macfb_fix.id, "Mac Disp. Card");
+ 			macfb_setpalette = mdc_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			break;
+ 		case NUBUS_DRHW_APPLE_TFB:
+-			strcat( macfb_fix.id, "Toby" );
++			strcpy(macfb_fix.id, "Toby");
+ 			macfb_setpalette = toby_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			break;
+ 		case NUBUS_DRHW_APPLE_JET:
+-			strcat( macfb_fix.id, "Jet");
++			strcpy(macfb_fix.id, "Jet");
+ 			macfb_setpalette = jet_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			break;			
+ 		default:
+-			strcat( macfb_fix.id, "Generic NuBus" );
++			strcpy(macfb_fix.id, "Generic NuBus");
+ 			break;
+ 		}
+ 	}
+@@ -786,21 +785,11 @@ static int __init macfb_init(void)
+ 	if (!video_is_nubus)
+ 		switch( mac_bi_data.id )
+ 		{
+-			/* These don't have onboard video.  Eventually, we may
+-			   be able to write separate framebuffer drivers for
+-			   them (tobyfb.c, hiresfb.c, etc, etc) */
+-		case MAC_MODEL_II:
+-		case MAC_MODEL_IIX:
+-		case MAC_MODEL_IICX:
+-		case MAC_MODEL_IIFX:
+-			strcat( macfb_fix.id, "Generic NuBus" );
+-			break;
+-
+ 			/* Valkyrie Quadras */
+ 		case MAC_MODEL_Q630:
+ 			/* I'm not sure about this one */
+ 		case MAC_MODEL_P588:
+-			strcat( macfb_fix.id, "Valkyrie built-in" );
++			strcpy(macfb_fix.id, "Valkyrie");
+ 			macfb_setpalette = valkyrie_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			valkyrie_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -823,7 +812,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_Q700:
+ 		case MAC_MODEL_Q900:
+ 		case MAC_MODEL_Q950:
+-			strcat( macfb_fix.id, "DAFB built-in" );
++			strcpy(macfb_fix.id, "DAFB");
+ 			macfb_setpalette = dafb_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000);
+@@ -831,7 +820,7 @@ static int __init macfb_init(void)
+ 
+ 			/* LC II uses the V8 framebuffer */
+ 		case MAC_MODEL_LCII:
+-			strcat( macfb_fix.id, "V8 built-in" );
++			strcpy(macfb_fix.id, "V8");
+ 			macfb_setpalette = v8_brazil_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -843,7 +832,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_IIVI:
+ 		case MAC_MODEL_IIVX:
+ 		case MAC_MODEL_P600:
+-			strcat( macfb_fix.id, "Brazil built-in" );
++			strcpy(macfb_fix.id, "Brazil");
+ 			macfb_setpalette = v8_brazil_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+ 			v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -860,7 +849,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_P460:
+ 			macfb_setpalette = v8_brazil_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+-			strcat( macfb_fix.id, "Sonora built-in" );
++			strcpy(macfb_fix.id, "Sonora");
+ 			v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+ 			break;
+ 
+@@ -871,7 +860,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_IISI:
+ 			macfb_setpalette = rbv_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+-			strcat( macfb_fix.id, "RBV built-in" );
++			strcpy(macfb_fix.id, "RBV");
+ 			rbv_cmap_regs = ioremap(DAC_BASE, 0x1000);
+ 			break;
+ 
+@@ -880,7 +869,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_C660:
+ 			macfb_setpalette = civic_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+-			strcat( macfb_fix.id, "Civic built-in" );
++			strcpy(macfb_fix.id, "Civic");
+ 			civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000);
+ 			break;
+ 
+@@ -901,7 +890,7 @@ static int __init macfb_init(void)
+ 				v8_brazil_cmap_regs =
+ 					ioremap(DAC_BASE, 0x1000);
+ 			}
+-			strcat( macfb_fix.id, "LC built-in" );
++			strcpy(macfb_fix.id, "LC");
+ 			break;
+ 			/* We think this may be like the LC II */
+ 		case MAC_MODEL_CCL:
+@@ -911,18 +900,18 @@ static int __init macfb_init(void)
+ 				v8_brazil_cmap_regs =
+ 					ioremap(DAC_BASE, 0x1000);
+ 			}
+-			strcat( macfb_fix.id, "Color Classic built-in" );
++			strcpy(macfb_fix.id, "Color Classic");
+ 			break;
+ 
+ 			/* And we *do* mean "weirdos" */
+ 		case MAC_MODEL_TV:
+-			strcat( macfb_fix.id, "Mac TV built-in" );
++			strcpy(macfb_fix.id, "Mac TV");
+ 			break;
+ 
+ 			/* These don't have colour, so no need to worry */
+ 		case MAC_MODEL_SE30:
+ 		case MAC_MODEL_CLII:
+-			strcat( macfb_fix.id, "Monochrome built-in" );
++			strcpy(macfb_fix.id, "Monochrome");
+ 			break;
+ 
+ 			/* Powerbooks are particularly difficult.  Many of
+@@ -935,7 +924,7 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_PB140:
+ 		case MAC_MODEL_PB145:
+ 		case MAC_MODEL_PB170:
+-			strcat( macfb_fix.id, "DDC built-in" );
++			strcpy(macfb_fix.id, "DDC");
+ 			break;
+ 
+ 			/* Internal is GSC, External (if present) is ViSC */
+@@ -945,13 +934,13 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_PB180:
+ 		case MAC_MODEL_PB210:
+ 		case MAC_MODEL_PB230:
+-			strcat( macfb_fix.id, "GSC built-in" );
++			strcpy(macfb_fix.id, "GSC");
+ 			break;
+ 
+ 			/* Internal is TIM, External is ViSC */
+ 		case MAC_MODEL_PB165C:
+ 		case MAC_MODEL_PB180C:
+-			strcat( macfb_fix.id, "TIM built-in" );
++			strcpy(macfb_fix.id, "TIM");
+ 			break;
+ 
+ 			/* Internal is CSC, External is Keystone+Ariel. */
+@@ -963,12 +952,12 @@ static int __init macfb_init(void)
+ 		case MAC_MODEL_PB280C:
+ 			macfb_setpalette = csc_setpalette;
+ 			macfb_defined.activate = FB_ACTIVATE_NOW;
+-			strcat( macfb_fix.id, "CSC built-in" );
++			strcpy(macfb_fix.id, "CSC");
+ 			csc_cmap_regs = ioremap(CSC_BASE, 0x1000);
+ 			break;
+ 		
+ 		default:
+-			strcat( macfb_fix.id, "Unknown/Unsupported built-in" );
++			strcpy(macfb_fix.id, "Unknown");
+ 			break;
+ 		}
+ 
+@@ -978,16 +967,23 @@ static int __init macfb_init(void)
+ 	fb_info.pseudo_palette	= pseudo_palette;
+ 	fb_info.flags		= FBINFO_DEFAULT;
+ 
+-	fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0);
++	err = fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0);
++	if (err)
++		goto fail_unmap;
+ 	
+ 	err = register_framebuffer(&fb_info);
+-	if (!err)
+-		printk("fb%d: %s frame buffer device\n",
+-		       fb_info.node, fb_info.fix.id);
+-	else {
+-		iounmap(fb_info.screen_base);
+-		iounmap_macfb();
+-	}
++	if (err)
++		goto fail_dealloc;
++
++	printk("fb%d: %s frame buffer device\n",
++	       fb_info.node, fb_info.fix.id);
++	return 0;
++
++fail_dealloc:
++	fb_dealloc_cmap(&fb_info.cmap);
++fail_unmap:
++	iounmap(fb_info.screen_base);
++	iounmap_macfb();
+ 	return err;
+ }
+ 
+diff --git a/include/asm-x86/vmi.h b/include/asm-x86/vmi.h
+index b7c0dea..61e08c0 100644
+--- a/include/asm-x86/vmi.h
++++ b/include/asm-x86/vmi.h
+@@ -223,9 +223,15 @@ struct pci_header {
+ } __attribute__((packed));
+ 
+ /* Function prototypes for bootstrapping */
++#ifdef CONFIG_VMI
+ extern void vmi_init(void);
++extern void vmi_activate(void);
+ extern void vmi_bringup(void);
+-extern void vmi_apply_boot_page_allocations(void);
++#else
++static inline void vmi_init(void) {}
++static inline void vmi_activate(void) {}
++static inline void vmi_bringup(void) {}
++#endif
+ 
+ /* State needed to start an application processor in an SMP system. */
+ struct vmi_ap_state {
+diff --git a/include/linux/can/core.h b/include/linux/can/core.h
+index e9ca210..f50785a 100644
+--- a/include/linux/can/core.h
++++ b/include/linux/can/core.h
+@@ -19,7 +19,7 @@
+ #include <linux/skbuff.h>
+ #include <linux/netdevice.h>
+ 
+-#define CAN_VERSION "20071116"
++#define CAN_VERSION "20081130"
+ 
+ /* increment this number each time you change some user-space interface */
+ #define CAN_ABI_VERSION "8"
+diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
+index 8178724..e8ab096 100644
+--- a/kernel/sched_clock.c
++++ b/kernel/sched_clock.c
+@@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now)
+ 
+ 	/*
+ 	 * scd->clock = clamp(scd->tick_gtod + delta,
+-	 *		      max(scd->tick_gtod, scd->clock),
+-	 *		      max(scd->clock, scd->tick_gtod + TICK_NSEC));
++	 * 		      max(scd->tick_gtod, scd->clock),
++	 * 		      scd->tick_gtod + TICK_NSEC);
+ 	 */
+ 
+ 	clock = scd->tick_gtod + delta;
+ 	min_clock = wrap_max(scd->tick_gtod, scd->clock);
+-	max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC);
++	max_clock = scd->tick_gtod + TICK_NSEC;
+ 
+ 	clock = wrap_max(clock, min_clock);
+ 	clock = wrap_min(clock, max_clock);
+diff --git a/lib/idr.c b/lib/idr.c
+index 7a785a0..1c4f928 100644
+--- a/lib/idr.c
++++ b/lib/idr.c
+@@ -220,8 +220,14 @@ build_up:
+ 	 */
+ 	while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {
+ 		layers++;
+-		if (!p->count)
++		if (!p->count) {
++			/* special case: if the tree is currently empty,
++			 * then we grow the tree by moving the top node
++			 * upwards.
++			 */
++			p->layer++;
+ 			continue;
++		}
+ 		if (!(new = get_from_free_list(idp))) {
+ 			/*
+ 			 * The allocation failed.  If we built part of
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index ed5cdae..51daae5 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -4224,7 +4224,7 @@ void setup_per_zone_pages_min(void)
+ 	for_each_zone(zone) {
+ 		u64 tmp;
+ 
+-		spin_lock_irqsave(&zone->lru_lock, flags);
++		spin_lock_irqsave(&zone->lock, flags);
+ 		tmp = (u64)pages_min * zone->present_pages;
+ 		do_div(tmp, lowmem_pages);
+ 		if (is_highmem(zone)) {
+@@ -4256,7 +4256,7 @@ void setup_per_zone_pages_min(void)
+ 		zone->pages_low   = zone->pages_min + (tmp >> 2);
+ 		zone->pages_high  = zone->pages_min + (tmp >> 1);
+ 		setup_zone_migrate_reserve(zone);
+-		spin_unlock_irqrestore(&zone->lru_lock, flags);
++		spin_unlock_irqrestore(&zone->lock, flags);
+ 	}
+ 
+ 	/* update totalreserve_pages */
+diff --git a/net/can/af_can.c b/net/can/af_can.c
+index 8035fbf..150f0b2 100644
+--- a/net/can/af_can.c
++++ b/net/can/af_can.c
+@@ -319,23 +319,52 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
+ 	return n ? d : NULL;
+ }
+ 
++/**
++ * find_rcv_list - determine optimal filterlist inside device filter struct
++ * @can_id: pointer to CAN identifier of a given can_filter
++ * @mask: pointer to CAN mask of a given can_filter
++ * @d: pointer to the device filter struct
++ *
++ * Description:
++ *  Returns the optimal filterlist to reduce the filter handling in the
++ *  receive path. This function is called by service functions that need
++ *  to register or unregister a can_filter in the filter lists.
++ *
++ *  A filter matches in general, when
++ *
++ *          <received_can_id> & mask == can_id & mask
++ *
++ *  so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe
++ *  relevant bits for the filter.
++ *
++ *  The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
++ *  filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames
++ *  there is a special filterlist and a special rx path filter handling.
++ *
++ * Return:
++ *  Pointer to optimal filterlist for the given can_id/mask pair.
++ *  Constistency checked mask.
++ *  Reduced can_id to have a preprocessed filter compare value.
++ */
+ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
+ 					struct dev_rcv_lists *d)
+ {
+ 	canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
+ 
+-	/* filter error frames */
++	/* filter for error frames in extra filterlist */
+ 	if (*mask & CAN_ERR_FLAG) {
+-		/* clear CAN_ERR_FLAG in list entry */
++		/* clear CAN_ERR_FLAG in filter entry */
+ 		*mask &= CAN_ERR_MASK;
+ 		return &d->rx[RX_ERR];
+ 	}
+ 
+-	/* ensure valid values in can_mask */
+-	if (*mask & CAN_EFF_FLAG)
+-		*mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
+-	else
+-		*mask &= (CAN_SFF_MASK | CAN_RTR_FLAG);
++	/* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */
++
++#define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG)
++
++	/* ensure valid values in can_mask for 'SFF only' frame filtering */
++	if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG))
++		*mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS);
+ 
+ 	/* reduce condition testing at receive time */
+ 	*can_id &= *mask;
+@@ -348,15 +377,19 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
+ 	if (!(*mask))
+ 		return &d->rx[RX_ALL];
+ 
+-	/* use extra filterset for the subscription of exactly *ONE* can_id */
+-	if (*can_id & CAN_EFF_FLAG) {
+-		if (*mask == (CAN_EFF_MASK | CAN_EFF_FLAG)) {
+-			/* RFC: a use-case for hash-tables in the future? */
+-			return &d->rx[RX_EFF];
++	/* extra filterlists for the subscription of a single non-RTR can_id */
++	if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS)
++	    && !(*can_id & CAN_RTR_FLAG)) {
++
++		if (*can_id & CAN_EFF_FLAG) {
++			if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) {
++				/* RFC: a future use-case for hash-tables? */
++				return &d->rx[RX_EFF];
++			}
++		} else {
++			if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS))
++				return &d->rx_sff[*can_id];
+ 		}
+-	} else {
+-		if (*mask == CAN_SFF_MASK)
+-			return &d->rx_sff[*can_id];
+ 	}
+ 
+ 	/* default: filter via can_id/can_mask */
+@@ -589,7 +622,10 @@ static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
+ 		}
+ 	}
+ 
+-	/* check CAN_ID specific entries */
++	/* check filterlists for single non-RTR can_ids */
++	if (can_id & CAN_RTR_FLAG)
++		return matches;
++
+ 	if (can_id & CAN_EFF_FLAG) {
+ 		hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) {
+ 			if (r->can_id == can_id) {
+diff --git a/net/can/bcm.c b/net/can/bcm.c
+index d0dd382..da0d426 100644
+--- a/net/can/bcm.c
++++ b/net/can/bcm.c
+@@ -64,10 +64,11 @@
+ #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */
+ 
+ /* get best masking value for can_rx_register() for a given single can_id */
+-#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \
+-			(CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK))
++#define REGMASK(id) ((id & CAN_EFF_FLAG) ? \
++		     (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \
++		     (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG))
+ 
+-#define CAN_BCM_VERSION "20080415"
++#define CAN_BCM_VERSION CAN_VERSION
+ static __initdata const char banner[] = KERN_INFO
+ 	"can: broadcast manager protocol (rev " CAN_BCM_VERSION ")\n";
+ 
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 0ae08d3..5a25896 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -3990,7 +3990,7 @@ int register_netdevice(struct net_device *dev)
+ 		dev->features &= ~NETIF_F_TSO;
+ 	}
+ 	if (dev->features & NETIF_F_UFO) {
+-		if (!(dev->features & NETIF_F_HW_CSUM)) {
++		if (!(dev->features & NETIF_F_GEN_CSUM)) {
+ 			printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
+ 					"NETIF_F_HW_CSUM feature.\n",
+ 							dev->name);
+diff --git a/net/key/af_key.c b/net/key/af_key.c
+index b7f5a1c..ef3b4d5 100644
+--- a/net/key/af_key.c
++++ b/net/key/af_key.c
+@@ -2051,7 +2051,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in
+ 			req_size += socklen * 2;
+ 		} else {
+ 			size -= 2*socklen;
+-			socklen = 0;
+ 		}
+ 		rq = (void*)skb_put(skb, req_size);
+ 		pol->sadb_x_policy_len += req_size/8;
+diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c
+index 744b79f..4028502 100644
+--- a/net/sunrpc/auth_generic.c
++++ b/net/sunrpc/auth_generic.c
+@@ -133,13 +133,29 @@ static int
+ generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags)
+ {
+ 	struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base);
++	int i;
+ 
+ 	if (gcred->acred.uid != acred->uid ||
+ 	    gcred->acred.gid != acred->gid ||
+-	    gcred->acred.group_info != acred->group_info ||
+ 	    gcred->acred.machine_cred != acred->machine_cred)
+-		return 0;
++		goto out_nomatch;
++
++	/* Optimisation in the case where pointers are identical... */
++	if (gcred->acred.group_info == acred->group_info)
++		goto out_match;
++
++	/* Slow path... */
++	if (gcred->acred.group_info->ngroups != acred->group_info->ngroups)
++		goto out_nomatch;
++	for (i = 0; i < gcred->acred.group_info->ngroups; i++) {
++		if (GROUP_AT(gcred->acred.group_info, i) !=
++				GROUP_AT(acred->group_info, i))
++			goto out_nomatch;
++	}
++out_match:
+ 	return 1;
++out_nomatch:
++	return 0;
+ }
+ 
+ void __init rpc_init_generic_auth(void)

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Sat Dec 20 21:03:40 2008
@@ -34,3 +34,4 @@
 + bugfix/all/stable/patch-2.6.27.7
 + bugfix/all/stable/patch-2.6.27.8
 + bugfix/all/stable/patch-2.6.27.9
++ bugfix/all/stable/patch-2.6.27.10



More information about the Kernel-svn-changes mailing list