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

Maximilian Attems maks at alioth.debian.org
Wed Jan 16 00:02:30 UTC 2008


Author: maks
Date: Wed Jan 16 00:02:30 2008
New Revision: 10112

Log:
update to 2.6.24-rc7-git8


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git8
      - copied, changed from r10109, /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7
Removed:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Copied: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git8 (from r10109, /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7)
==============================================================================
--- /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7	(original)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git8	Wed Jan 16 00:02:30 2008
@@ -124,6 +124,77 @@
  L:	netdev at vger.kernel.org
  S:	Supported
  
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index c4de2d4..3a75a0b 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -1076,7 +1076,7 @@ endmenu
+ 
+ source "fs/Kconfig"
+ 
+-source "kernel/Kconfig.instrumentation"
++source "arch/arm/Kconfig.instrumentation"
+ 
+ source "arch/arm/Kconfig.debug"
+ 
+diff --git a/arch/arm/Kconfig.instrumentation b/arch/arm/Kconfig.instrumentation
+new file mode 100644
+index 0000000..63b8c6d
+--- /dev/null
++++ b/arch/arm/Kconfig.instrumentation
+@@ -0,0 +1,52 @@
++menuconfig INSTRUMENTATION
++	bool "Instrumentation Support"
++	default y
++	---help---
++	  Say Y here to get to see options related to performance measurement,
++	  system-wide debugging, and testing. This option alone does not add any
++	  kernel code.
++
++	  If you say N, all options in this submenu will be skipped and
++	  disabled. If you're trying to debug the kernel itself, go see the
++	  Kernel Hacking menu.
++
++if INSTRUMENTATION
++
++config PROFILING
++	bool "Profiling support (EXPERIMENTAL)"
++	help
++	  Say Y here to enable the extended profiling support mechanisms used
++	  by profilers such as OProfile.
++
++config OPROFILE
++	tristate "OProfile system profiling (EXPERIMENTAL)"
++	depends on PROFILING && !UML
++	help
++	  OProfile is a profiling system capable of profiling the
++	  whole system, include the kernel, kernel modules, libraries,
++	  and applications.
++
++	  If unsure, say N.
++
++config OPROFILE_ARMV6
++	bool
++	depends on OPROFILE && CPU_V6 && !SMP
++	default y
++	select OPROFILE_ARM11_CORE
++
++config OPROFILE_MPCORE
++	bool
++	depends on OPROFILE && CPU_V6 && SMP
++	default y
++	select OPROFILE_ARM11_CORE
++
++config OPROFILE_ARM11_CORE
++	bool
++
++config MARKERS
++	bool "Activate markers"
++	help
++	  Place an empty function call at each marker site. Can be
++	  dynamically changed for a probe function.
++
++endif # INSTRUMENTATION
 diff --git a/arch/arm/mach-at91/board-ek.c b/arch/arm/mach-at91/board-ek.c
 index d05b1b2..53a5ef9 100644
 --- a/arch/arm/mach-at91/board-ek.c
@@ -1431,6 +1502,56 @@
  	return platform_device_register(&uart8250_device);
  }
  
+diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
+index 2d0c9ef..79a85d6 100644
+--- a/arch/powerpc/kernel/iommu.c
++++ b/arch/powerpc/kernel/iommu.c
+@@ -278,6 +278,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+ 	unsigned long flags;
+ 	struct scatterlist *s, *outs, *segstart;
+ 	int outcount, incount, i;
++	unsigned int align;
+ 	unsigned long handle;
+ 
+ 	BUG_ON(direction == DMA_NONE);
+@@ -309,7 +310,12 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+ 		/* Allocate iommu entries for that segment */
+ 		vaddr = (unsigned long) sg_virt(s);
+ 		npages = iommu_num_pages(vaddr, slen);
+-		entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0);
++		align = 0;
++		if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE &&
++		    (vaddr & ~PAGE_MASK) == 0)
++			align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
++		entry = iommu_range_alloc(tbl, npages, &handle,
++					  mask >> IOMMU_PAGE_SHIFT, align);
+ 
+ 		DBG("  - vaddr: %lx, size: %lx\n", vaddr, slen);
+ 
+@@ -572,7 +578,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
+ {
+ 	dma_addr_t dma_handle = DMA_ERROR_CODE;
+ 	unsigned long uaddr;
+-	unsigned int npages;
++	unsigned int npages, align;
+ 
+ 	BUG_ON(direction == DMA_NONE);
+ 
+@@ -580,8 +586,13 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
+ 	npages = iommu_num_pages(uaddr, size);
+ 
+ 	if (tbl) {
++		align = 0;
++		if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && size >= PAGE_SIZE &&
++		    ((unsigned long)vaddr & ~PAGE_MASK) == 0)
++			align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
++
+ 		dma_handle = iommu_alloc(tbl, vaddr, npages, direction,
+-					 mask >> IOMMU_PAGE_SHIFT, 0);
++					 mask >> IOMMU_PAGE_SHIFT, align);
+ 		if (dma_handle == DMA_ERROR_CODE) {
+ 			if (printk_ratelimit())  {
+ 				printk(KERN_INFO "iommu_alloc failed, "
 diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
 index 1add6ef..5d89a21 100644
 --- a/arch/powerpc/kernel/prom_init.c
@@ -1482,24 +1603,18 @@
  #else
  #define fixup_device_tree_efika()
 diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
-index 27922df..a282bc2 100644
+index 27922df..50d7372 100644
 --- a/arch/powerpc/mm/slb.c
 +++ b/arch/powerpc/mm/slb.c
-@@ -82,6 +82,14 @@ static inline void slb_shadow_clear(unsigned long entry)
- 	get_slb_shadow()->save_area[entry].esid = 0;
- }
+@@ -292,6 +292,8 @@ void slb_initialize(void)
  
-+void slb_shadow_clear_all(void)
-+{
-+	int i;
-+
-+	for (i = 0; i < SLB_NUM_BOLTED; i++)
-+		slb_shadow_clear(i);
-+}
+ 	create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
+ 
++	slb_shadow_clear(2);
 +
- static inline void create_shadowed_slbe(unsigned long ea, int ssize,
- 					unsigned long flags,
- 					unsigned long entry)
+ 	/* We don't bolt the stack for the time being - we're in boot,
+ 	 * so the stack is in the bolted segment.  By the time it goes
+ 	 * elsewhere, we'll call _switch() which will bolt in the new
 diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
 index fc48b96..412e6b4 100644
 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -1520,18 +1635,69 @@
  	rtas_stop_self();
  	/* Should never get here... */
  	BUG();
-diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
-index 9a455d4..34317aa 100644
---- a/arch/powerpc/platforms/pseries/lpar.c
-+++ b/arch/powerpc/platforms/pseries/lpar.c
-@@ -272,6 +272,7 @@ void vpa_init(int cpu)
- 	 */
- 	addr = __pa(&slb_shadow[cpu]);
- 	if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
-+		slb_shadow_clear_all();
- 		ret = register_slb_shadow(hwcpu, addr);
- 		if (ret)
- 			printk(KERN_ERR
+diff --git a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c
+index 45cb7c5..00b393c 100644
+--- a/arch/sparc/kernel/time.c
++++ b/arch/sparc/kernel/time.c
+@@ -436,7 +436,14 @@ void __init time_init(void)
+ 
+ static inline unsigned long do_gettimeoffset(void)
+ {
+-	return (*master_l10_counter >> 10) & 0x1fffff;
++	unsigned long val = *master_l10_counter;
++	unsigned long usec = (val >> 10) & 0x1fffff;
++
++	/* Limit hit?  */
++	if (val & 0x80000000)
++		usec += 1000000 / HZ;
++
++	return usec;
+ }
+ 
+ /* Ok, my cute asm atomicity trick doesn't work anymore.
+diff --git a/arch/sparc64/kernel/ktlb.S b/arch/sparc64/kernel/ktlb.S
+index 964527d..cef8def 100644
+--- a/arch/sparc64/kernel/ktlb.S
++++ b/arch/sparc64/kernel/ktlb.S
+@@ -1,6 +1,6 @@
+ /* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling.
+  *
+- * Copyright (C) 1995, 1997, 2005 David S. Miller <davem at davemloft.net>
++ * Copyright (C) 1995, 1997, 2005, 2008 David S. Miller <davem at davemloft.net>
+  * Copyright (C) 1996 Eddie C. Dost        (ecd at brainaid.de)
+  * Copyright (C) 1996 Miguel de Icaza      (miguel at nuclecu.unam.mx)
+  * Copyright (C) 1996,98,99 Jakub Jelinek  (jj at sunsite.mff.cuni.cz)
+@@ -226,6 +226,7 @@ kvmap_dtlb_load:
+ 	ba,pt		%xcc, sun4v_dtlb_load
+ 	 mov		%g5, %g3
+ 
++#ifdef CONFIG_SPARSEMEM_VMEMMAP
+ kvmap_vmemmap:
+ 	sub		%g4, %g5, %g5
+ 	srlx		%g5, 22, %g5
+@@ -234,6 +235,7 @@ kvmap_vmemmap:
+ 	or		%g1, %lo(vmemmap_table), %g1
+ 	ba,pt		%xcc, kvmap_dtlb_load
+ 	 ldx		[%g1 + %g5], %g5
++#endif
+ 
+ kvmap_dtlb_nonlinear:
+ 	/* Catch kernel NULL pointer derefs.  */
+@@ -242,12 +244,14 @@ kvmap_dtlb_nonlinear:
+ 	bleu,pn		%xcc, kvmap_dtlb_longpath
+ 	 nop
+ 
++#ifdef CONFIG_SPARSEMEM_VMEMMAP
+ 	/* Do not use the TSB for vmemmap.  */
+ 	mov		(VMEMMAP_BASE >> 24), %g5
+ 	sllx		%g5, 24, %g5
+ 	cmp		%g4,%g5
+ 	bgeu,pn		%xcc, kvmap_vmemmap
+ 	 nop
++#endif
+ 
+ 	KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
+ 
 diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
 index 17089a0..af045ca 100644
 --- a/arch/x86/kernel/apm_32.c
@@ -1564,6 +1730,19 @@
  }
  
  module_init(apm_init);
+diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
+index 4a86ffd..2f99ee2 100644
+--- a/arch/x86/kernel/hpet.c
++++ b/arch/x86/kernel/hpet.c
+@@ -657,7 +657,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
+ 		hpet_pie_count = 0;
+ 	}
+ 
+-	if (hpet_rtc_flags & RTC_PIE &&
++	if (hpet_rtc_flags & RTC_AIE &&
+ 	    (curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
+ 	    (curr_time.tm_min == hpet_alarm_time.tm_min) &&
+ 	    (curr_time.tm_hour == hpet_alarm_time.tm_hour))
 diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
 index 9663c2a..46d391d 100644
 --- a/arch/x86/kernel/process_32.c
@@ -1635,6 +1814,26 @@
  {
  	struct create_idle *c_idle =
  		container_of(work, struct create_idle, work);
+diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
+index c7d1947..3c76d19 100644
+--- a/arch/x86/mm/init_32.c
++++ b/arch/x86/mm/init_32.c
+@@ -321,8 +321,13 @@ extern void set_highmem_pages_init(int);
+ static void __init set_highmem_pages_init(int bad_ppro)
+ {
+ 	int pfn;
+-	for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
+-		add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
++	for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) {
++		/*
++		 * Holes under sparsemem might not have no mem_map[]:
++		 */
++		if (pfn_valid(pfn))
++			add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
++	}
+ 	totalram_pages += totalhigh_pages;
+ }
+ #endif /* CONFIG_FLATMEM */
 diff --git a/block/blktrace.c b/block/blktrace.c
 index 498a0a5..9b4da4a 100644
 --- a/block/blktrace.c
@@ -2748,6 +2947,48 @@
  	if (!bio)
  		return -ENOMEM;
  	init_completion(&w.wait);
+diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c
+index 8c3e62a..b91d45a 100644
+--- a/drivers/bluetooth/hci_ll.c
++++ b/drivers/bluetooth/hci_ll.c
+@@ -204,6 +204,19 @@ static void ll_device_want_to_wakeup(struct hci_uart *hu)
+ 	spin_lock_irqsave(&ll->hcill_lock, flags);
+ 
+ 	switch (ll->hcill_state) {
++	case HCILL_ASLEEP_TO_AWAKE:
++		/*
++		 * This state means that both the host and the BRF chip
++		 * have simultaneously sent a wake-up-indication packet.
++		 * Traditionaly, in this case, receiving a wake-up-indication
++		 * was enough and an additional wake-up-ack wasn't needed.
++		 * This has changed with the BRF6350, which does require an
++		 * explicit wake-up-ack. Other BRF versions, which do not
++		 * require an explicit ack here, do accept it, thus it is
++		 * perfectly safe to always send one.
++		 */
++		BT_DBG("dual wake-up-indication");
++		/* deliberate fall-through - do not add break */
+ 	case HCILL_ASLEEP:
+ 		/* acknowledge device wake up */
+ 		if (send_hcill_cmd(HCILL_WAKE_UP_ACK, hu) < 0) {
+@@ -211,16 +224,8 @@ static void ll_device_want_to_wakeup(struct hci_uart *hu)
+ 			goto out;
+ 		}
+ 		break;
+-	case HCILL_ASLEEP_TO_AWAKE:
+-		/*
+-		 * this state means that a wake-up-indication
+-		 * is already on its way to the device,
+-		 * and will serve as the required wake-up-ack
+-		 */
+-		BT_DBG("dual wake-up-indication");
+-		break;
+ 	default:
+-		/* any other state are illegal */
++		/* any other state is illegal */
+ 		BT_ERR("received HCILL_WAKE_UP_IND in state %ld", ll->hcill_state);
+ 		break;
+ 	}
 diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
 index 39564b7..c88424a 100644
 --- a/drivers/char/tpm/tpm.c
@@ -3824,6 +4065,24 @@
  	dev->ethtool_ops	= &loopback_ethtool_ops;
  	dev->header_ops		= &eth_header_ops;
  	dev->init = loopback_dev_init;
+diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
+index 2e4bcd5..e8dc2f4 100644
+--- a/drivers/net/macvlan.c
++++ b/drivers/net/macvlan.c
+@@ -384,6 +384,13 @@ static int macvlan_newlink(struct net_device *dev,
+ 	if (lowerdev == NULL)
+ 		return -ENODEV;
+ 
++	/* Don't allow macvlans on top of other macvlans - its not really
++	 * wrong, but lockdep can't handle it and its not useful for anything
++	 * you couldn't do directly on top of the real device.
++	 */
++	if (lowerdev->rtnl_link_ops == dev->rtnl_link_ops)
++		return -ENODEV;
++
+ 	if (!tb[IFLA_MTU])
+ 		dev->mtu = lowerdev->mtu;
+ 	else if (dev->mtu > lowerdev->mtu)
 diff --git a/drivers/net/meth.c b/drivers/net/meth.c
 index 0c89b02..cdaa8fc 100644
 --- a/drivers/net/meth.c
@@ -4249,7 +4508,7 @@
  	return 0;
  }
 diff --git a/drivers/net/niu.c b/drivers/net/niu.c
-index abfc61c..9a0c6d3 100644
+index abfc61c..3bbcea1 100644
 --- a/drivers/net/niu.c
 +++ b/drivers/net/niu.c
 @@ -33,8 +33,8 @@
@@ -4263,7 +4522,263 @@
  
  static char version[] __devinitdata =
  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
-@@ -2241,6 +2241,8 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp)
+@@ -801,22 +801,90 @@ static int bcm8704_init_user_dev3(struct niu *np)
+ 	return 0;
+ }
+ 
+-static int xcvr_init_10g(struct niu *np)
++static int mrvl88x2011_act_led(struct niu *np, int val)
++{
++	int	err;
++
++	err  = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
++		MRVL88X2011_LED_8_TO_11_CTL);
++	if (err < 0)
++		return err;
++
++	err &= ~MRVL88X2011_LED(MRVL88X2011_LED_ACT,MRVL88X2011_LED_CTL_MASK);
++	err |=  MRVL88X2011_LED(MRVL88X2011_LED_ACT,val);
++
++	return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
++			  MRVL88X2011_LED_8_TO_11_CTL, err);
++}
++
++static int mrvl88x2011_led_blink_rate(struct niu *np, int rate)
++{
++	int	err;
++
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
++			MRVL88X2011_LED_BLINK_CTL);
++	if (err >= 0) {
++		err &= ~MRVL88X2011_LED_BLKRATE_MASK;
++		err |= (rate << 4);
++
++		err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
++				 MRVL88X2011_LED_BLINK_CTL, err);
++	}
++
++	return err;
++}
++
++static int xcvr_init_10g_mrvl88x2011(struct niu *np)
++{
++	int	err;
++
++	/* Set LED functions */
++	err = mrvl88x2011_led_blink_rate(np, MRVL88X2011_LED_BLKRATE_134MS);
++	if (err)
++		return err;
++
++	/* led activity */
++	err = mrvl88x2011_act_led(np, MRVL88X2011_LED_CTL_OFF);
++	if (err)
++		return err;
++
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
++			MRVL88X2011_GENERAL_CTL);
++	if (err < 0)
++		return err;
++
++	err |= MRVL88X2011_ENA_XFPREFCLK;
++
++	err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
++			 MRVL88X2011_GENERAL_CTL, err);
++	if (err < 0)
++		return err;
++
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
++			MRVL88X2011_PMA_PMD_CTL_1);
++	if (err < 0)
++		return err;
++
++	if (np->link_config.loopback_mode == LOOPBACK_MAC)
++		err |= MRVL88X2011_LOOPBACK;
++	else
++		err &= ~MRVL88X2011_LOOPBACK;
++
++	err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
++			 MRVL88X2011_PMA_PMD_CTL_1, err);
++	if (err < 0)
++		return err;
++
++	/* Enable PMD  */
++	return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
++			  MRVL88X2011_10G_PMD_TX_DIS, MRVL88X2011_ENA_PMDTX);
++}
++
++static int xcvr_init_10g_bcm8704(struct niu *np)
+ {
+ 	struct niu_link_config *lp = &np->link_config;
+ 	u16 analog_stat0, tx_alarm_status;
+ 	int err;
+-	u64 val;
+-
+-	val = nr64_mac(XMAC_CONFIG);
+-	val &= ~XMAC_CONFIG_LED_POLARITY;
+-	val |= XMAC_CONFIG_FORCE_LED_ON;
+-	nw64_mac(XMAC_CONFIG, val);
+-
+-	/* XXX shared resource, lock parent XXX */
+-	val = nr64(MIF_CONFIG);
+-	val |= MIF_CONFIG_INDIRECT_MODE;
+-	nw64(MIF_CONFIG, val);
+ 
+ 	err = bcm8704_reset(np);
+ 	if (err)
+@@ -896,6 +964,38 @@ static int xcvr_init_10g(struct niu *np)
+ 	return 0;
+ }
+ 
++static int xcvr_init_10g(struct niu *np)
++{
++	int phy_id, err;
++	u64 val;
++
++	val = nr64_mac(XMAC_CONFIG);
++	val &= ~XMAC_CONFIG_LED_POLARITY;
++	val |= XMAC_CONFIG_FORCE_LED_ON;
++	nw64_mac(XMAC_CONFIG, val);
++
++	/* XXX shared resource, lock parent XXX */
++	val = nr64(MIF_CONFIG);
++	val |= MIF_CONFIG_INDIRECT_MODE;
++	nw64(MIF_CONFIG, val);
++
++	phy_id = phy_decode(np->parent->port_phy, np->port);
++	phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
++
++	/* handle different phy types */
++	switch (phy_id & NIU_PHY_ID_MASK) {
++	case NIU_PHY_ID_MRVL88X2011:
++		err = xcvr_init_10g_mrvl88x2011(np);
++		break;
++
++	default: /* bcom 8704 */
++		err = xcvr_init_10g_bcm8704(np);
++		break;
++	}
++
++	return 0;
++}
++
+ static int mii_reset(struct niu *np)
+ {
+ 	int limit, err;
+@@ -1082,19 +1182,68 @@ static int niu_link_status_common(struct niu *np, int link_up)
+ 	return 0;
+ }
+ 
+-static int link_status_10g(struct niu *np, int *link_up_p)
++static int link_status_10g_mrvl(struct niu *np, int *link_up_p)
+ {
+-	unsigned long flags;
+-	int err, link_up;
++	int err, link_up, pma_status, pcs_status;
+ 
+ 	link_up = 0;
+ 
+-	spin_lock_irqsave(&np->lock, flags);
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
++			MRVL88X2011_10G_PMD_STATUS_2);
++	if (err < 0)
++		goto out;
+ 
+-	err = -EINVAL;
+-	if (np->link_config.loopback_mode != LOOPBACK_DISABLED)
++	/* Check PMA/PMD Register: 1.0001.2 == 1 */
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
++			MRVL88X2011_PMA_PMD_STATUS_1);
++	if (err < 0)
+ 		goto out;
+ 
++	pma_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
++
++        /* Check PMC Register : 3.0001.2 == 1: read twice */
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
++			MRVL88X2011_PMA_PMD_STATUS_1);
++	if (err < 0)
++		goto out;
++
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
++			MRVL88X2011_PMA_PMD_STATUS_1);
++	if (err < 0)
++		goto out;
++
++	pcs_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
++
++        /* Check XGXS Register : 4.0018.[0-3,12] */
++	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV4_ADDR,
++			MRVL88X2011_10G_XGXS_LANE_STAT);
++	if (err < 0)
++		goto out;
++
++	if (err == (PHYXS_XGXS_LANE_STAT_ALINGED | PHYXS_XGXS_LANE_STAT_LANE3 |
++		    PHYXS_XGXS_LANE_STAT_LANE2 | PHYXS_XGXS_LANE_STAT_LANE1 |
++		    PHYXS_XGXS_LANE_STAT_LANE0 | PHYXS_XGXS_LANE_STAT_MAGIC |
++		    0x800))
++		link_up = (pma_status && pcs_status) ? 1 : 0;
++
++	np->link_config.active_speed = SPEED_10000;
++	np->link_config.active_duplex = DUPLEX_FULL;
++	err = 0;
++out:
++	mrvl88x2011_act_led(np, (link_up ?
++				 MRVL88X2011_LED_CTL_PCS_ACT :
++				 MRVL88X2011_LED_CTL_OFF));
++
++	*link_up_p = link_up;
++	return err;
++}
++
++static int link_status_10g_bcom(struct niu *np, int *link_up_p)
++{
++	int err, link_up;
++
++	link_up = 0;
++
+ 	err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
+ 			BCM8704_PMD_RCV_SIGDET);
+ 	if (err < 0)
+@@ -1134,9 +1283,37 @@ static int link_status_10g(struct niu *np, int *link_up_p)
+ 	err = 0;
+ 
+ out:
++	*link_up_p = link_up;
++	return err;
++}
++
++static int link_status_10g(struct niu *np, int *link_up_p)
++{
++	unsigned long flags;
++	int err = -EINVAL;
++
++	spin_lock_irqsave(&np->lock, flags);
++
++	if (np->link_config.loopback_mode == LOOPBACK_DISABLED) {
++		int phy_id;
++
++		phy_id = phy_decode(np->parent->port_phy, np->port);
++		phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
++
++		/* handle different phy types */
++		switch (phy_id & NIU_PHY_ID_MASK) {
++		case NIU_PHY_ID_MRVL88X2011:
++			err = link_status_10g_mrvl(np, link_up_p);
++			break;
++
++		default: /* bcom 8704 */
++			err = link_status_10g_bcom(np, link_up_p);
++			break;
++		}
++	}
++
+ 	spin_unlock_irqrestore(&np->lock, flags);
+ 
+-	*link_up_p = link_up;
+ 	return err;
+ }
+ 
+@@ -2241,6 +2418,8 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp)
  	skb->protocol = eth_type_trans(skb, np->dev);
  	netif_receive_skb(skb);
  
@@ -4272,7 +4787,7 @@
  	return num_rcr;
  }
  
-@@ -2508,15 +2510,19 @@ static int niu_rx_error(struct niu *np, struct rx_ring_info *rp)
+@@ -2508,15 +2687,19 @@ static int niu_rx_error(struct niu *np, struct rx_ring_info *rp)
  	u64 stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel));
  	int err = 0;
  
@@ -4296,7 +4811,7 @@
  	nw64(RX_DMA_CTL_STAT(rp->rx_channel),
  	     stat & RX_DMA_CTL_WRITE_CLEAR_ERRS);
  
-@@ -2749,13 +2755,16 @@ static int niu_device_error(struct niu *np)
+@@ -2749,13 +2932,16 @@ static int niu_device_error(struct niu *np)
  	return -ENODEV;
  }
  
@@ -4317,7 +4832,7 @@
  	if (v1 & 0x00000000ffffffffULL) {
  		u32 rx_vec = (v1 & 0xffffffff);
  
-@@ -2764,8 +2773,13 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
+@@ -2764,8 +2950,13 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
  
  			if (rx_vec & (1 << rp->rx_channel)) {
  				int r = niu_rx_error(np, rp);
@@ -4332,7 +4847,7 @@
  			}
  		}
  	}
-@@ -2803,7 +2817,7 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
+@@ -2803,7 +2994,7 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
  	if (err)
  		niu_enable_interrupts(np, 0);
  
@@ -4341,7 +4856,7 @@
  }
  
  static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp,
-@@ -2905,7 +2919,7 @@ static irqreturn_t niu_interrupt(int irq, void *dev_id)
+@@ -2905,7 +3096,7 @@ static irqreturn_t niu_interrupt(int irq, void *dev_id)
  	}
  
  	if (unlikely((v0 & ((u64)1 << LDN_MIF)) || v1 || v2)) {
@@ -4350,7 +4865,7 @@
  		if (err)
  			goto out;
  	}
-@@ -5194,7 +5208,8 @@ static int niu_start_xmit(struct sk_buff *skb, struct net_device *dev)
+@@ -5194,7 +5385,8 @@ static int niu_start_xmit(struct sk_buff *skb, struct net_device *dev)
  		}
  		kfree_skb(skb);
  		skb = skb_new;
@@ -4360,6 +4875,60 @@
  
  	align = ((unsigned long) skb->data & (16 - 1));
  	headroom = align + sizeof(struct tx_pkt_hdr);
+@@ -6282,7 +6474,8 @@ static int __devinit phy_record(struct niu_parent *parent,
+ 	if (dev_id_1 < 0 || dev_id_2 < 0)
+ 		return 0;
+ 	if (type == PHY_TYPE_PMA_PMD || type == PHY_TYPE_PCS) {
+-		if ((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_BCM8704)
++		if (((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_BCM8704) &&
++		    ((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_MRVL88X2011))
+ 			return 0;
+ 	} else {
+ 		if ((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_BCM5464R)
+diff --git a/drivers/net/niu.h b/drivers/net/niu.h
+index 10e3f11..0e8626a 100644
+--- a/drivers/net/niu.h
++++ b/drivers/net/niu.h
+@@ -2538,6 +2538,39 @@ struct fcram_hash_ipv6 {
+ #define NIU_PHY_ID_MASK			0xfffff0f0
+ #define NIU_PHY_ID_BCM8704		0x00206030
+ #define NIU_PHY_ID_BCM5464R		0x002060b0
++#define NIU_PHY_ID_MRVL88X2011		0x01410020
++
++/* MRVL88X2011 register addresses */
++#define MRVL88X2011_USER_DEV1_ADDR	1
++#define MRVL88X2011_USER_DEV2_ADDR	2
++#define MRVL88X2011_USER_DEV3_ADDR	3
++#define MRVL88X2011_USER_DEV4_ADDR	4
++#define MRVL88X2011_PMA_PMD_CTL_1	0x0000
++#define MRVL88X2011_PMA_PMD_STATUS_1	0x0001
++#define MRVL88X2011_10G_PMD_STATUS_2	0x0008
++#define MRVL88X2011_10G_PMD_TX_DIS	0x0009
++#define MRVL88X2011_10G_XGXS_LANE_STAT	0x0018
++#define MRVL88X2011_GENERAL_CTL		0x8300
++#define MRVL88X2011_LED_BLINK_CTL	0x8303
++#define MRVL88X2011_LED_8_TO_11_CTL	0x8306
++
++/* MRVL88X2011 register control */
++#define MRVL88X2011_ENA_XFPREFCLK	0x0001
++#define MRVL88X2011_ENA_PMDTX		0x0000
++#define MRVL88X2011_LOOPBACK            0x1
++#define MRVL88X2011_LED_ACT		0x1
++#define MRVL88X2011_LNK_STATUS_OK	0x4
++#define MRVL88X2011_LED_BLKRATE_MASK	0x70
++#define MRVL88X2011_LED_BLKRATE_034MS	0x0
++#define MRVL88X2011_LED_BLKRATE_067MS	0x1
++#define MRVL88X2011_LED_BLKRATE_134MS	0x2
++#define MRVL88X2011_LED_BLKRATE_269MS	0x3
++#define MRVL88X2011_LED_BLKRATE_538MS	0x4
++#define MRVL88X2011_LED_CTL_OFF		0x0
++#define MRVL88X2011_LED_CTL_PCS_ACT	0x5
++#define MRVL88X2011_LED_CTL_MASK	0x7
++#define MRVL88X2011_LED(n,v)		((v)<<((n)*4))
++#define MRVL88X2011_LED_STAT(n,v)	((v)>>((n)*4))
+ 
+ #define BCM8704_PMA_PMD_DEV_ADDR	1
+ #define BCM8704_PCS_DEV_ADDR		2
 diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c
 index ff92aca..90498ff 100644
 --- a/drivers/net/pcnet32.c
@@ -6332,18 +6901,6 @@
   *
   * Cacheops 0x02, 0x06, 0x0a, 0x0c-0x0e, 0x16, 0x1a and 0x1e are unused.
   * Most of the _S cacheops are identical to the R4000SC _SD cacheops.
-diff --git a/include/asm-powerpc/mmu-hash64.h b/include/asm-powerpc/mmu-hash64.h
-index 82328de..951e248 100644
---- a/include/asm-powerpc/mmu-hash64.h
-+++ b/include/asm-powerpc/mmu-hash64.h
-@@ -286,6 +286,7 @@ extern void hpte_init_iSeries(void);
- extern void hpte_init_beat(void);
- extern void hpte_init_beat_v3(void);
- 
-+extern void slb_shadow_clear_all(void);
- extern void stabs_alloc(void);
- extern void slb_initialize(void);
- extern void slb_flush_and_rebolt(void);
 diff --git a/include/asm-sh/cacheflush.h b/include/asm-sh/cacheflush.h
 index 9d528ad..e034c36 100644
 --- a/include/asm-sh/cacheflush.h
@@ -6419,6 +6976,21 @@
  }
  #endif /* CONFIG_MMU */
  
+diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h
+index 664a2fa..80b0270 100644
+--- a/include/asm-x86/msr.h
++++ b/include/asm-x86/msr.h
+@@ -3,6 +3,10 @@
+ 
+ #include <asm/msr-index.h>
+ 
++#ifndef __ASSEMBLY__
++# include <linux/types.h>
++#endif
++
+ #ifdef __i386__
+ 
+ #ifdef __KERNEL__
 diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h
 index 88c8140..e18017d 100644
 --- a/include/linux/i2c-id.h
@@ -7140,6 +7712,44 @@
  	max = node_free_pages / FRACTION_OF_NODE_MEM;
  	return max(max, min_pages);
  }
+diff --git a/net/802/tr.c b/net/802/tr.c
+index a2bd0f2..1e115e5 100644
+--- a/net/802/tr.c
++++ b/net/802/tr.c
+@@ -642,7 +642,7 @@ struct net_device *alloc_trdev(int sizeof_priv)
+ static int __init rif_init(void)
+ {
+ 	init_timer(&rif_timer);
+-	rif_timer.expires  = sysctl_tr_rif_timeout;
++	rif_timer.expires  = jiffies + sysctl_tr_rif_timeout;
+ 	rif_timer.data     = 0L;
+ 	rif_timer.function = rif_check_expire;
+ 	add_timer(&rif_timer);
+diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
+index 4add9bd..032bf44 100644
+--- a/net/8021q/vlan.c
++++ b/net/8021q/vlan.c
+@@ -323,6 +323,7 @@ static const struct header_ops vlan_header_ops = {
+ static int vlan_dev_init(struct net_device *dev)
+ {
+ 	struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev;
++	int subclass = 0;
+ 
+ 	/* IFF_BROADCAST|IFF_MULTICAST; ??? */
+ 	dev->flags  = real_dev->flags & ~IFF_UP;
+@@ -349,7 +350,11 @@ static int vlan_dev_init(struct net_device *dev)
+ 		dev->hard_start_xmit = vlan_dev_hard_start_xmit;
+ 	}
+ 
+-	lockdep_set_class(&dev->_xmit_lock, &vlan_netdev_xmit_lock_key);
++	if (real_dev->priv_flags & IFF_802_1Q_VLAN)
++		subclass = 1;
++
++	lockdep_set_class_and_subclass(&dev->_xmit_lock,
++				&vlan_netdev_xmit_lock_key, subclass);
+ 	return 0;
+ }
+ 
 diff --git a/net/atm/mpc.c b/net/atm/mpc.c
 index 2086396..9c7f712 100644
 --- a/net/atm/mpc.c
@@ -7158,6 +7768,180 @@
  	while (i < mpc->number_of_mps_macs) {
  		if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN)))
  			if ( send_via_shortcut(skb, mpc) == 0 )           /* try shortcut */
+diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
+index 8378afd..b4725ff 100644
+--- a/net/ax25/af_ax25.c
++++ b/net/ax25/af_ax25.c
+@@ -87,10 +87,22 @@ static void ax25_kill_by_device(struct net_device *dev)
+ 		return;
+ 
+ 	spin_lock_bh(&ax25_list_lock);
++again:
+ 	ax25_for_each(s, node, &ax25_list) {
+ 		if (s->ax25_dev == ax25_dev) {
+ 			s->ax25_dev = NULL;
++			spin_unlock_bh(&ax25_list_lock);
+ 			ax25_disconnect(s, ENETUNREACH);
++			spin_lock_bh(&ax25_list_lock);
++
++			/* The entry could have been deleted from the
++			 * list meanwhile and thus the next pointer is
++			 * no longer valid.  Play it safe and restart
++			 * the scan.  Forward progress is ensured
++			 * because we set s->ax25_dev to NULL and we
++			 * are never passed a NULL 'dev' argument.
++			 */
++			goto again;
+ 		}
+ 	}
+ 	spin_unlock_bh(&ax25_list_lock);
+@@ -1109,21 +1121,19 @@ static int __must_check ax25_connect(struct socket *sock,
+ 	 * some sanity checks. code further down depends on this
+ 	 */
+ 
+-	if (addr_len == sizeof(struct sockaddr_ax25)) {
+-		/* support for this will go away in early 2.5.x */
+-		printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
+-			current->comm);
+-	}
+-	else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
+-		/* support for old structure may go away some time */
++	if (addr_len == sizeof(struct sockaddr_ax25))
++		/* support for this will go away in early 2.5.x
++		 * ax25_connect(): uses obsolete socket structure
++		 */
++		;
++	else if (addr_len != sizeof(struct full_sockaddr_ax25))
++		/* support for old structure may go away some time
++		 * ax25_connect(): uses old (6 digipeater) socket structure.
++		 */
+ 		if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
+-		    (addr_len > sizeof(struct full_sockaddr_ax25))) {
++		    (addr_len > sizeof(struct full_sockaddr_ax25)))
+ 			return -EINVAL;
+-		}
+ 
+-		printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
+-			current->comm);
+-	}
+ 
+ 	if (fsa->fsa_ax25.sax25_family != AF_AX25)
+ 		return -EINVAL;
+@@ -1467,21 +1477,20 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
+ 			goto out;
+ 		}
+ 
+-		if (addr_len == sizeof(struct sockaddr_ax25)) {
+-			printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
+-				current->comm);
+-		}
+-		else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
+-			/* support for old structure may go away some time */
++		if (addr_len == sizeof(struct sockaddr_ax25))
++			/* ax25_sendmsg(): uses obsolete socket structure */
++			;
++		else if (addr_len != sizeof(struct full_sockaddr_ax25))
++			/* support for old structure may go away some time
++			 * ax25_sendmsg(): uses old (6 digipeater)
++			 * socket structure.
++			 */
+ 			if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
+ 			    (addr_len > sizeof(struct full_sockaddr_ax25))) {
+ 				err = -EINVAL;
+ 				goto out;
+ 			}
+ 
+-			printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
+-				current->comm);
+-		}
+ 
+ 		if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
+ 			int ct           = 0;
+diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
+index e447651..a6a758d 100644
+--- a/net/bluetooth/rfcomm/tty.c
++++ b/net/bluetooth/rfcomm/tty.c
+@@ -95,9 +95,10 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
+ 
+ 	BT_DBG("dev %p dlc %p", dev, dlc);
+ 
+-	write_lock_bh(&rfcomm_dev_lock);
+-	list_del_init(&dev->list);
+-	write_unlock_bh(&rfcomm_dev_lock);
++	/* Refcount should only hit zero when called from rfcomm_dev_del()
++	   which will have taken us off the list. Everything else are
++	   refcounting bugs. */
++	BUG_ON(!list_empty(&dev->list));
+ 
+ 	rfcomm_dlc_lock(dlc);
+ 	/* Detach DLC if it's owned by this dev */
+@@ -109,11 +110,6 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
+ 
+ 	tty_unregister_device(rfcomm_tty_driver, dev->id);
+ 
+-	/* Refcount should only hit zero when called from rfcomm_dev_del()
+-	   which will have taken us off the list. Everything else are
+-	   refcounting bugs. */
+-	BUG_ON(!list_empty(&dev->list));
+-
+ 	kfree(dev);
+ 
+ 	/* It's safe to call module_put() here because socket still
+@@ -313,7 +309,15 @@ static void rfcomm_dev_del(struct rfcomm_dev *dev)
+ {
+ 	BT_DBG("dev %p", dev);
+ 
+-	set_bit(RFCOMM_TTY_RELEASED, &dev->flags);
++	if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags))
++		BUG_ON(1);
++	else
++		set_bit(RFCOMM_TTY_RELEASED, &dev->flags);
++
++	write_lock_bh(&rfcomm_dev_lock);
++	list_del_init(&dev->list);
++	write_unlock_bh(&rfcomm_dev_lock);
++
+ 	rfcomm_dev_put(dev);
+ }
+ 
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index c1757c7..5d8b939 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -247,8 +247,9 @@ static void __br_dnat_complain(void)
+  * Let us first consider the case that ip_route_input() succeeds:
+  *
+  * If skb->dst->dev equals the logical bridge device the packet
+- * came in on, we can consider this bridging. We then call
+- * skb->dst->output() which will make the packet enter br_nf_local_out()
++ * came in on, we can consider this bridging. The packet is passed
++ * through the neighbour output function to build a new destination
++ * MAC address, which will make the packet enter br_nf_local_out()
+  * not much later. In that function it is assured that the iptables
+  * FORWARD chain is traversed for the packet.
+  *
+@@ -285,12 +286,17 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
+ 	skb->nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
+ 
+ 	skb->dev = bridge_parent(skb->dev);
+-	if (!skb->dev)
+-		kfree_skb(skb);
+-	else {
++	if (skb->dev) {
++		struct dst_entry *dst = skb->dst;
++
+ 		nf_bridge_pull_encap_header(skb);
+-		skb->dst->output(skb);
++
++		if (dst->hh)
++			return neigh_hh_output(dst->hh, skb);
++		else if (dst->neighbour)
++			return dst->neighbour->output(skb);
+ 	}
++	kfree_skb(skb);
+ 	return 0;
+ }
+ 
 diff --git a/net/core/dev.c b/net/core/dev.c
 index be9d301..0879f52 100644
 --- a/net/core/dev.c
@@ -7177,6 +7961,28 @@
  
  		netpoll_poll_unlock(have);
  	}
+diff --git a/net/core/neighbour.c b/net/core/neighbour.c
+index 29b8ee4..cc8a2f1 100644
+--- a/net/core/neighbour.c
++++ b/net/core/neighbour.c
+@@ -1316,8 +1316,6 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
+ 			*p = parms->next;
+ 			parms->dead = 1;
+ 			write_unlock_bh(&tbl->lock);
+-			if (parms->dev)
+-				dev_put(parms->dev);
+ 			call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
+ 			return;
+ 		}
+@@ -1328,6 +1326,8 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
+ 
+ void neigh_parms_destroy(struct neigh_parms *parms)
+ {
++	if (parms->dev)
++		dev_put(parms->dev);
+ 	kfree(parms);
+ }
+ 
 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
 index 5b4ce9b..b628377 100644
 --- a/net/core/skbuff.c
@@ -7204,6 +8010,34 @@
  
  	atomic_inc(&(skb_shinfo(skb)->dataref));
  	skb->cloned = 1;
+diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
+index 66663e5..0e10ff2 100644
+--- a/net/decnet/dn_route.c
++++ b/net/decnet/dn_route.c
+@@ -1665,12 +1665,12 @@ static struct dn_route *dn_rt_cache_get_first(struct seq_file *seq)
+ 			break;
+ 		rcu_read_unlock_bh();
+ 	}
+-	return rt;
++	return rcu_dereference(rt);
+ }
+ 
+ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt)
+ {
+-	struct dn_rt_cache_iter_state *s = rcu_dereference(seq->private);
++	struct dn_rt_cache_iter_state *s = seq->private;
+ 
+ 	rt = rt->u.dst.dn_next;
+ 	while(!rt) {
+@@ -1680,7 +1680,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou
+ 		rcu_read_lock_bh();
+ 		rt = dn_rt_hash_table[s->bucket].chain;
+ 	}
+-	return rt;
++	return rcu_dereference(rt);
+ }
+ 
+ static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
 diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c
 index 9a96c27..4a4d49f 100644
 --- a/net/ipv4/inet_lro.c
@@ -7353,9 +8187,33 @@
  			iph->saddr = rt->rt_src;
  		iph->check   = 0;
 diff --git a/net/ipv4/route.c b/net/ipv4/route.c
-index d2bc614..d337706 100644
+index d2bc614..28484f3 100644
 --- a/net/ipv4/route.c
 +++ b/net/ipv4/route.c
+@@ -283,12 +283,12 @@ static struct rtable *rt_cache_get_first(struct seq_file *seq)
+ 			break;
+ 		rcu_read_unlock_bh();
+ 	}
+-	return r;
++	return rcu_dereference(r);
+ }
+ 
+ static struct rtable *rt_cache_get_next(struct seq_file *seq, struct rtable *r)
+ {
+-	struct rt_cache_iter_state *st = rcu_dereference(seq->private);
++	struct rt_cache_iter_state *st = seq->private;
+ 
+ 	r = r->u.dst.rt_next;
+ 	while (!r) {
+@@ -298,7 +298,7 @@ static struct rtable *rt_cache_get_next(struct seq_file *seq, struct rtable *r)
+ 		rcu_read_lock_bh();
+ 		r = rt_hash_table[st->bucket].chain;
+ 	}
+-	return r;
++	return rcu_dereference(r);
+ }
+ 
+ static struct rtable *rt_cache_get_idx(struct seq_file *seq, loff_t pos)
 @@ -2626,11 +2626,10 @@ int ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb)
  	int idx, s_idx;
  
@@ -7398,6 +8256,19 @@
  		/* Connect to link-local address requires an interface */
  		if (!sk->sk_bound_dev_if) {
  			err = -EINVAL;
+diff --git a/net/ipv6/netfilter/ip6t_eui64.c b/net/ipv6/netfilter/ip6t_eui64.c
+index 34ba150..41df9a5 100644
+--- a/net/ipv6/netfilter/ip6t_eui64.c
++++ b/net/ipv6/netfilter/ip6t_eui64.c
+@@ -47,7 +47,7 @@ match(const struct sk_buff *skb,
+ 			memcpy(eui64 + 5, eth_hdr(skb)->h_source + 3, 3);
+ 			eui64[3] = 0xff;
+ 			eui64[4] = 0xfe;
+-			eui64[0] |= 0x02;
++			eui64[0] ^= 0x02;
+ 
+ 			i = 0;
+ 			while (ipv6_hdr(skb)->saddr.s6_addr[8 + i] == eui64[i]
 diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
 index 48ce59a..d5e4dd7 100644
 --- a/net/irda/af_irda.c
@@ -7437,6 +8308,21 @@
  }
  
  static int ieee80211_ioctl_giwrate(struct net_device *dev,
+diff --git a/net/netfilter/xt_helper.c b/net/netfilter/xt_helper.c
+index 0a1f4c6..d842c4a 100644
+--- a/net/netfilter/xt_helper.c
++++ b/net/netfilter/xt_helper.c
+@@ -56,8 +56,8 @@ match(const struct sk_buff *skb,
+ 	if (info->name[0] == '\0')
+ 		ret = !ret;
+ 	else
+-		ret ^= !strncmp(master_help->helper->name, info->name,
+-				strlen(master_help->helper->name));
++		ret ^= !strncmp(helper->name, info->name,
++				strlen(helper->name));
+ 	return ret;
+ }
+ 
 diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
 index ed7c9e3..3cc629d 100644
 --- a/net/sctp/sm_make_chunk.c

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	Wed Jan 16 00:02:30 2008
@@ -42,4 +42,4 @@
 + bugfix/all/fw-ohci-dyn-buffers-dma-descriptors.patch
 + features/at76.patch
 + features/ath5k.patch
-+ bugfix/all/patch-2.6.24-rc7-git7
++ bugfix/all/patch-2.6.24-rc7-git8



More information about the Kernel-svn-changes mailing list