summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2012-06-06 13:38:19 +0100
committerBen Hutchings <ben@decadent.org.uk>2012-06-06 13:46:06 +0100
commit443b53442f77382a0de81d58154ec2187a21279a (patch)
tree0d3d4429b1e8da3f986dd3a4388ea629927f0f10
parent7448277c069086b884ca03de35a52528afb4c3e0 (diff)
downloadlinux-3.2.y-queue-443b53442f77382a0de81d58154ec2187a21279a.tar.gz
Add various patches requested for 3.2
-rw-r--r--queue-3.2/add-foxconn-hon-hai-ids-for-btusb-module.patch67
-rw-r--r--queue-3.2/bluetooth-add-support-for-ar3012.patch61
-rw-r--r--queue-3.2/bluetooth-add-support-for-atheros.patch60
-rw-r--r--queue-3.2/bluetooth-add-support-for-foxconn-hon-hai-ar5bbu22-0489-e03c.patch89
-rw-r--r--queue-3.2/bluetooth-btusb-add-support-for-bcm20702a0.patch43
-rw-r--r--queue-3.2/bluetooth-btusb-add-usb-device-id-0a5c-21e8.patch43
-rw-r--r--queue-3.2/bluetooth-btusb-add-vendor-specific-id-0489-e042-for-bcm20702a0.patch38
-rw-r--r--queue-3.2/bluetooth-btusb-add-vendor-specific-id-0a5c-21f3-for-bcm20702a0.patch39
-rw-r--r--queue-3.2/bluetooth-btusb-typo-in-broadcom-softsailing-id.patch62
-rw-r--r--queue-3.2/drm-i915-disable-fbc-on-sandybridge.patch30
-rw-r--r--queue-3.2/ipv4-do-not-use-dead-fib_info-entries.patch32
-rw-r--r--queue-3.2/ipv4-fix-the-rcu-race-between-free_fib_info-and-ip_route_output_slow.patch87
-rw-r--r--queue-3.2/ipv6-fix-incorrect-ipsec-fragment.patch177
-rw-r--r--queue-3.2/l2tp-fix-oops-in-l2tp-ip-sockets-for-connect-af_unspec-case.patch108
-rw-r--r--queue-3.2/r8169-fix-early-queue-wake-up.patch54
-rw-r--r--queue-3.2/r8169-fix-unsigned-int-wraparound-with-tso.patch78
-rw-r--r--queue-3.2/r8169-missing-barriers.patch43
-rw-r--r--queue-3.2/revert-net-maintain-namespace-isolation-between-vlan-and-real-device.patch133
-rw-r--r--queue-3.2/sctp-check-cached-dst-before-using-it.patch84
-rw-r--r--queue-3.2/series22
-rw-r--r--queue-3.2/set-fake_rtable-s-dst-to-null-to-avoid-kernel-oops.patch106
-rw-r--r--queue-3.2/skb-avoid-unnecessary-reallocations-in-__skb_cow.patch38
-rw-r--r--queue-3.2/xfrm-take-net-hdr-len-into-account-for-esp-payload-size-calculation.patch95
23 files changed, 1589 insertions, 0 deletions
diff --git a/queue-3.2/add-foxconn-hon-hai-ids-for-btusb-module.patch b/queue-3.2/add-foxconn-hon-hai-ids-for-btusb-module.patch
new file mode 100644
index 0000000..bd57007
--- /dev/null
+++ b/queue-3.2/add-foxconn-hon-hai-ids-for-btusb-module.patch
@@ -0,0 +1,67 @@
+From: Steven Harms <sjharms@gmail.com>
+Date: Fri, 13 Apr 2012 14:45:55 -0400
+Subject: Add Foxconn / Hon Hai IDs for btusb module
+
+commit 985140369be1e886754d8ac0375dd64e4f727311 upstream.
+
+This change adds 0x0489:0xe033 to the btusb module.
+
+This bluetooth usb device is integrated in the Acer TimelineX AS4830TG-6808 notebook.
+
+Output from /sys/kernel/debug/usb/devices:
+
+T: Bus=01 Lev=02 Prnt=02 Port=05 Cnt=02 Dev#= 4 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0489 ProdID=e033 Rev= 2.29
+S: Manufacturer=Broadcom Corp
+S: Product=Acer Module
+S: SerialNumber=60D819F74101
+C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr= 0mA
+I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
+E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
+E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
+E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
+I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
+I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
+I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
+I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 32 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 32 Ivl=1ms
+I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 64 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 64 Ivl=1ms
+I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 64 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 64 Ivl=1ms
+I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+E: Ad=84(I) Atr=02(Bulk) MxPS= 32 Ivl=0ms
+E: Ad=04(O) Atr=02(Bulk) MxPS= 32 Ivl=0ms
+I:* If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
+
+Signed-off-by: Steven Harms <sjharms@gmail.com>
+Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 93cc828..9217121 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -108,6 +108,9 @@ static struct usb_device_id btusb_table[] = {
+ { USB_DEVICE(0x0a5c, 0x21f3) },
+ { USB_DEVICE(0x413c, 0x8197) },
+
++ /* Foxconn - Hon Hai */
++ { USB_DEVICE(0x0489, 0xe033) },
++
+ { } /* Terminating entry */
+ };
+
diff --git a/queue-3.2/bluetooth-add-support-for-ar3012.patch b/queue-3.2/bluetooth-add-support-for-ar3012.patch
new file mode 100644
index 0000000..31cbf48
--- /dev/null
+++ b/queue-3.2/bluetooth-add-support-for-ar3012.patch
@@ -0,0 +1,61 @@
+From: AceLan Kao <acelan.kao@canonical.com>
+Date: Thu, 19 Apr 2012 14:53:45 +0800
+Subject: Bluetooth: Add support for AR3012 [0cf3:e004]
+
+commit ac71311e65e2c4c2dbac76db698fecbee755b016 upstream.
+
+Add another vendor specific ID for Atheros AR3012
+
+output of usb-devices:
+T: Bus=02 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 4 Spd=12 MxCh= 0
+D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0cf3 ProdID=e004 Rev=00.02
+S: Manufacturer=Atheros Communications
+S: Product=Bluetooth USB Host Controller
+S: SerialNumber=Alaska Day 2006
+C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+
+BugLink: https://bugs.launchpad.net/bugs/922715
+
+Signed-off-by: AceLan Kao <acelan.kao@canonical.com>
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/ath3k.c | 2 ++
+ drivers/bluetooth/btusb.c | 1 +
+ 2 files changed, 3 insertions(+)
+
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index 639a161..57fd867 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -76,6 +76,7 @@ static struct usb_device_id ath3k_table[] = {
+ { USB_DEVICE(0x13d3, 0x3375) },
+ { USB_DEVICE(0x04CA, 0x3005) },
+ { USB_DEVICE(0x13d3, 0x3362) },
++ { USB_DEVICE(0x0CF3, 0xE004) },
+
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xE02C) },
+@@ -96,6 +97,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
++ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
+
+ { } /* Terminating entry */
+ };
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index a497544..93cc828 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -135,6 +135,7 @@ static struct usb_device_id blacklist_table[] = {
+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
++ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
+
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
diff --git a/queue-3.2/bluetooth-add-support-for-atheros.patch b/queue-3.2/bluetooth-add-support-for-atheros.patch
new file mode 100644
index 0000000..5b7810d
--- /dev/null
+++ b/queue-3.2/bluetooth-add-support-for-atheros.patch
@@ -0,0 +1,60 @@
+From: AceLan Kao <acelan.kao@canonical.com>
+Date: Fri, 13 Apr 2012 17:39:57 +0800
+Subject: Bluetooth: Add support for Atheros [13d3:3362]
+
+commit 87522a433ba6886b5ccbb497e0a7cb8097def64e upstream.
+
+Add another vendor specific ID for Atheros AR3012 device.
+This chip is wrapped by IMC Networks.
+
+output of usb-devices:
+T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 5 Spd=12 MxCh= 0
+D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=13d3 ProdID=3362 Rev=00.02
+S: Manufacturer=Atheros Communications
+S: Product=Bluetooth USB Host Controller
+S: SerialNumber=Alaska Day 2006
+C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+
+Signed-off-by: AceLan Kao <acelan.kao@canonical.com>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/ath3k.c | 2 ++
+ drivers/bluetooth/btusb.c | 1 +
+ 2 files changed, 3 insertions(+)
+
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index ae9edca..639a161 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -75,6 +75,7 @@ static struct usb_device_id ath3k_table[] = {
+ { USB_DEVICE(0x0CF3, 0x311D) },
+ { USB_DEVICE(0x13d3, 0x3375) },
+ { USB_DEVICE(0x04CA, 0x3005) },
++ { USB_DEVICE(0x13d3, 0x3362) },
+
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xE02C) },
+@@ -94,6 +95,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
+ { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
++ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
+
+ { } /* Terminating entry */
+ };
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 9af450a..a497544 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -134,6 +134,7 @@ static struct usb_device_id blacklist_table[] = {
+ { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
++ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
+
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
diff --git a/queue-3.2/bluetooth-add-support-for-foxconn-hon-hai-ar5bbu22-0489-e03c.patch b/queue-3.2/bluetooth-add-support-for-foxconn-hon-hai-ar5bbu22-0489-e03c.patch
new file mode 100644
index 0000000..cdf9f4c
--- /dev/null
+++ b/queue-3.2/bluetooth-add-support-for-foxconn-hon-hai-ar5bbu22-0489-e03c.patch
@@ -0,0 +1,89 @@
+From: Michael Gruetzner <mgruetzn@gmx.de>
+Date: Wed, 2 May 2012 22:33:40 +0200
+Subject: Bluetooth: Add support for Foxconn/Hon Hai AR5BBU22 0489:E03C
+
+commit 85d59726c5c66016a507f1f4a60db8e374dd284d upstream.
+
+Add Foxconn/Hon Hai AR5BBU22 Bluetooth Module( 0x489:0xE03C) to
+the blacklist of btusb module and add it to the ath3k module to properly
+load the firmware in Kernel 3.3.4
+The device is integrated in e.g. some Acer Aspire 7750G.
+
+Output from /sys/kernel/debug/usb/devices:
+
+T: Bus=01 Lev=02 Prnt=02 Port=05 Cnt=02 Dev#= 6 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0489 ProdID=e03c Rev= 0.02
+S: Manufacturer=Atheros Communications
+S: Product=Bluetooth USB Host Controller
+S: SerialNumber=Alaska Day 2006
+C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
+I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
+E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
+E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
+I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
+I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
+I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
+I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
+I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
+I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
+E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
+E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
+
+Signed-off-by: Michael Gruetzner <mgruetzn@gmx.de>
+Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/ath3k.c | 6 ++++++
+ drivers/bluetooth/btusb.c | 3 +++
+ 2 files changed, 9 insertions(+)
+
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index 57fd867..aba22b2 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -81,6 +81,9 @@ static struct usb_device_id ath3k_table[] = {
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xE02C) },
+
++ /* Atheros AR5BBU22 with sflash firmware */
++ { USB_DEVICE(0x0489, 0xE03C) },
++
+ { } /* Terminating entry */
+ };
+
+@@ -99,6 +102,9 @@ static struct usb_device_id ath3k_blist_tbl[] = {
+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
+
++ /* Atheros AR5BBU22 with sflash firmware */
++ { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
++
+ { } /* Terminating entry */
+ };
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index de17121..cb480f1 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -143,6 +143,9 @@ static struct usb_device_id blacklist_table[] = {
+ /* Atheros AR5BBU12 with sflash firmware */
+ { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
+
++ /* Atheros AR5BBU12 with sflash firmware */
++ { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
++
+ /* Broadcom BCM2035 */
+ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
+ { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
diff --git a/queue-3.2/bluetooth-btusb-add-support-for-bcm20702a0.patch b/queue-3.2/bluetooth-btusb-add-support-for-bcm20702a0.patch
new file mode 100644
index 0000000..0da44e1
--- /dev/null
+++ b/queue-3.2/bluetooth-btusb-add-support-for-bcm20702a0.patch
@@ -0,0 +1,43 @@
+From: "James M. Leddy" <james.leddy@canonical.com>
+Date: Tue, 6 Mar 2012 02:41:33 +0200
+Subject: Bluetooth: btusb: add support for BCM20702A0 [0a5c:21e6]
+
+commit 0a4eaeeb993658a4d6cff054a863241f32d3d2fb upstream.
+
+Add another vendor specific ID for BCM20702A0. This has been tested and
+works on hardware with this device.
+
+output of usb-devices:
+T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=04 Dev#= 6 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0a5c ProdID=21e6 Rev=01.12
+S: Manufacturer=Broadcom Corp
+S: Product=BCM20702A0
+S: SerialNumber=D0DF9AFB227B
+C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
+
+Signed-off-by: James M. Leddy <james.leddy@canonical.com>
+Acked-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index c5606ef..22f695e 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = {
+
+ /* Broadcom BCM20702A0 */
+ { USB_DEVICE(0x0a5c, 0x21e3) },
++ { USB_DEVICE(0x0a5c, 0x21e6) },
+ { USB_DEVICE(0x0a5c, 0x21f3) },
+ { USB_DEVICE(0x413c, 0x8197) },
+
diff --git a/queue-3.2/bluetooth-btusb-add-usb-device-id-0a5c-21e8.patch b/queue-3.2/bluetooth-btusb-add-usb-device-id-0a5c-21e8.patch
new file mode 100644
index 0000000..030493c
--- /dev/null
+++ b/queue-3.2/bluetooth-btusb-add-usb-device-id-0a5c-21e8.patch
@@ -0,0 +1,43 @@
+From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@openbossa.org>
+Date: Wed, 14 Mar 2012 21:45:16 +0200
+Subject: Bluetooth: btusb: Add USB device ID "0a5c 21e8"
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 6dfc326f0605fd87e4c10ccde10de0ce4280d72d upstream.
+
+One more vendor-specific ID for BCM20702A0.
+
+T: Bus=01 Lev=03 Prnt=05 Port=02 Cnt=01 Dev#= 9 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0a5c ProdID=21e8 Rev=01.12
+S: Manufacturer=Broadcom Corp
+S: Product=BCM20702A0
+S: SerialNumber=00027221F4E2
+C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
+
+Signed-off-by: João Paulo Rechi Vita <jprvita@openbossa.org>
+Acked-by: Gustavo F. Padovan <padovan@profusion.mobi>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 480cad9..b633854 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -103,6 +103,7 @@ static struct usb_device_id btusb_table[] = {
+ /* Broadcom BCM20702A0 */
+ { USB_DEVICE(0x0a5c, 0x21e3) },
+ { USB_DEVICE(0x0a5c, 0x21e6) },
++ { USB_DEVICE(0x0a5c, 0x21e8) },
+ { USB_DEVICE(0x0a5c, 0x21f3) },
+ { USB_DEVICE(0x413c, 0x8197) },
+
diff --git a/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0489-e042-for-bcm20702a0.patch b/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0489-e042-for-bcm20702a0.patch
new file mode 100644
index 0000000..519f951
--- /dev/null
+++ b/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0489-e042-for-bcm20702a0.patch
@@ -0,0 +1,38 @@
+From: Manoj Iyer <manoj.iyer@canonical.com>
+Date: Mon, 9 Apr 2012 09:22:28 -0500
+Subject: Bluetooth: btusb: Add vendor specific ID (0489 e042) for BCM20702A0
+
+commit 79cd76022044f8177bb00e3fd590ec8d6b5f8c35 upstream.
+
+T: Bus=02 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0489 ProdID=e042 Rev=01.12
+S: Manufacturer=Broadcom Corp
+S: Product=BCM20702A0
+S: SerialNumber=E4D53DCA61B5
+C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
+
+Reported-by: Dennis Chua <dennis.chua@canonical.com>
+Signed-off-by: Manoj Iyer <manoj.iyer@canonical.com>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 3311b81..9af450a 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -101,6 +101,7 @@ static struct usb_device_id btusb_table[] = {
+ { USB_DEVICE(0x0c10, 0x0000) },
+
+ /* Broadcom BCM20702A0 */
++ { USB_DEVICE(0x0489, 0xe042) },
+ { USB_DEVICE(0x0a5c, 0x21e3) },
+ { USB_DEVICE(0x0a5c, 0x21e6) },
+ { USB_DEVICE(0x0a5c, 0x21e8) },
diff --git a/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0a5c-21f3-for-bcm20702a0.patch b/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0a5c-21f3-for-bcm20702a0.patch
new file mode 100644
index 0000000..1c9cef8
--- /dev/null
+++ b/queue-3.2/bluetooth-btusb-add-vendor-specific-id-0a5c-21f3-for-bcm20702a0.patch
@@ -0,0 +1,39 @@
+From: Manoj Iyer <manoj.iyer@canonical.com>
+Date: Thu, 2 Feb 2012 09:32:36 -0600
+Subject: Bluetooth: btusb: Add vendor specific ID (0a5c 21f3) for BCM20702A0
+
+commit 37305cf649689a4d2341dd6fd89b091c6007f9ba upstream.
+
+T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=03 Dev#= 5 Spd=12 MxCh= 0
+D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
+P: Vendor=0a5c ProdID=21f3 Rev=01.12
+S: Manufacturer=Broadcom Corp
+S: Product=BCM20702A0
+S: SerialNumber=74DE2B344A7B
+C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
+I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none)
+I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
+
+Signed-off-by: Manoj Iyer <manoj.iyer@canonical.com>
+Tested-by: Dennis Chua <dennis.chua@canonical.com>
+Acked-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index d7664ff..afcd281 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = {
+
+ /* Broadcom BCM20702A0 */
+ { USB_DEVICE(0x0a5c, 0x21e3) },
++ { USB_DEVICE(0x0a5c, 0x21f3) },
+ { USB_DEVICE(0x413c, 0x8197) },
+
+ { } /* Terminating entry */
diff --git a/queue-3.2/bluetooth-btusb-typo-in-broadcom-softsailing-id.patch b/queue-3.2/bluetooth-btusb-typo-in-broadcom-softsailing-id.patch
new file mode 100644
index 0000000..1233930
--- /dev/null
+++ b/queue-3.2/bluetooth-btusb-typo-in-broadcom-softsailing-id.patch
@@ -0,0 +1,62 @@
+From: Don Zickus <dzickus@redhat.com>
+Date: Wed, 28 Mar 2012 16:41:11 -0400
+Subject: Bluetooth: btusb: typo in Broadcom SoftSailing id
+
+commit 2e8b506310f6433d5558387fd568d4bfb1d6a799 upstream.
+
+I was trying to backport the following commit to RHEL-6
+
+ From 0cea73465cd22373c5cd43a3edd25fbd4bb532ef Mon Sep 17 00:00:00 2001
+ From: Oliver Neukum <oliver@neukum.org>
+ Date: Wed, 21 Sep 2011 11:37:15 +0200
+ Subject: [PATCH] btusb: add device entry for Broadcom SoftSailing
+
+and noticed it wasn't working on an HP Elitebook. Looking into the patch I
+noticed a very subtle typo in the ids. The patch has '0x05ac' instead of
+'0x0a5c'. A snippet of the lsusb -v output also shows this:
+
+Bus 002 Device 003: ID 0a5c:21e1 Broadcom Corp.
+Device Descriptor:
+ bLength 18
+ bDescriptorType 1
+ bcdUSB 2.00
+ bDeviceClass 255 Vendor Specific Class
+ bDeviceSubClass 1
+ bDeviceProtocol 1
+ bMaxPacketSize0 64
+ idVendor 0x0a5c Broadcom Corp.
+ idProduct 0x21e1
+ bcdDevice 1.12
+ iManufacturer 1 Broadcom Corp
+ iProduct 2 BCM20702A0
+ iSerial 3 60D819F0338C
+ bNumConfigurations 1
+
+Looking at other Broadcom ids, the fix matches them whereas the original patch
+matches Apple's ids.
+
+Tested on an HP Elitebook 8760w. The btusb binds and the userspace stuff loads
+correctly.
+
+Cc: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Don Zickus <dzickus@redhat.com>
+Acked-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/bluetooth/btusb.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index ba89cd0..3311b81 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = {
+ { USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
+
+ /* Broadcom SoftSailing reporting vendor specific */
+- { USB_DEVICE(0x05ac, 0x21e1) },
++ { USB_DEVICE(0x0a5c, 0x21e1) },
+
+ /* Apple MacBookPro 7,1 */
+ { USB_DEVICE(0x05ac, 0x8213) },
diff --git a/queue-3.2/drm-i915-disable-fbc-on-sandybridge.patch b/queue-3.2/drm-i915-disable-fbc-on-sandybridge.patch
new file mode 100644
index 0000000..6da0d38
--- /dev/null
+++ b/queue-3.2/drm-i915-disable-fbc-on-sandybridge.patch
@@ -0,0 +1,30 @@
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Tue, 8 Nov 2011 23:17:34 +0000
+Subject: drm/i915:: Disable FBC on SandyBridge
+
+commit d56d8b28e9247e7e35e02fbb12b12239a2c33ad1 upstream.
+
+Enabling FBC is causing the BLT ring to run between 10-100x slower than
+normal and frequently lockup. The interim solution is disable FBC once
+more until we know why.
+
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Signed-off-by: Keith Packard <keithp@keithp.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/gpu/drm/i915/intel_display.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index b3b51c4..19f35ec 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -1872,7 +1872,7 @@ static void intel_update_fbc(struct drm_device *dev)
+ if (enable_fbc < 0) {
+ DRM_DEBUG_KMS("fbc set to per-chip default\n");
+ enable_fbc = 1;
+- if (INTEL_INFO(dev)->gen <= 5)
++ if (INTEL_INFO(dev)->gen <= 6)
+ enable_fbc = 0;
+ }
+ if (!enable_fbc) {
diff --git a/queue-3.2/ipv4-do-not-use-dead-fib_info-entries.patch b/queue-3.2/ipv4-do-not-use-dead-fib_info-entries.patch
new file mode 100644
index 0000000..a71fefa
--- /dev/null
+++ b/queue-3.2/ipv4-do-not-use-dead-fib_info-entries.patch
@@ -0,0 +1,32 @@
+From: "David S. Miller" <davem@davemloft.net>
+Date: Thu, 10 May 2012 22:16:32 -0400
+Subject: ipv4: Do not use dead fib_info entries.
+
+[ Upstream commit dccd9ecc374462e5d6a5b8f8110415a86c2213d8 ]
+
+Due to RCU lookups and RCU based release, fib_info objects can
+be found during lookup which have fi->fib_dead set.
+
+We must ignore these entries, otherwise we risk dereferencing
+the parts of the entry which are being torn down.
+
+Reported-by: Yevgen Pronenko <yevgen.pronenko@sonymobile.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ net/ipv4/fib_trie.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
+index 3ce23f9..cd2d639 100644
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -1372,6 +1372,8 @@ static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l,
+
+ if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
+ continue;
++ if (fi->fib_dead)
++ continue;
+ if (fa->fa_info->fib_scope < flp->flowi4_scope)
+ continue;
+ fib_alias_accessed(fa);
diff --git a/queue-3.2/ipv4-fix-the-rcu-race-between-free_fib_info-and-ip_route_output_slow.patch b/queue-3.2/ipv4-fix-the-rcu-race-between-free_fib_info-and-ip_route_output_slow.patch
new file mode 100644
index 0000000..6fc7d30
--- /dev/null
+++ b/queue-3.2/ipv4-fix-the-rcu-race-between-free_fib_info-and-ip_route_output_slow.patch
@@ -0,0 +1,87 @@
+From: Yanmin Zhang <yanmin_zhang@linux.intel.com>
+Date: Wed, 23 May 2012 15:39:45 +0000
+Subject: ipv4: fix the rcu race between free_fib_info and ip_route_output_slow
+
+[ Upstream commit e49cc0da7283088c5e03d475ffe2fdcb24a6d5b1 ]
+
+We hit a kernel OOPS.
+
+<3>[23898.789643] BUG: sleeping function called from invalid context at
+/data/buildbot/workdir/ics/hardware/intel/linux-2.6/arch/x86/mm/fault.c:1103
+<3>[23898.862215] in_atomic(): 0, irqs_disabled(): 0, pid: 10526, name:
+Thread-6683
+<4>[23898.967805] HSU serial 0000:00:05.1: 0000:00:05.2:HSU serial prevented me
+to suspend...
+<4>[23899.258526] Pid: 10526, comm: Thread-6683 Tainted: G W
+3.0.8-137685-ge7742f9 #1
+<4>[23899.357404] HSU serial 0000:00:05.1: 0000:00:05.2:HSU serial prevented me
+to suspend...
+<4>[23899.904225] Call Trace:
+<4>[23899.989209] [<c1227f50>] ? pgtable_bad+0x130/0x130
+<4>[23900.000416] [<c1238c2a>] __might_sleep+0x10a/0x110
+<4>[23900.007357] [<c1228021>] do_page_fault+0xd1/0x3c0
+<4>[23900.013764] [<c18e9ba9>] ? restore_all+0xf/0xf
+<4>[23900.024024] [<c17c007b>] ? napi_complete+0x8b/0x690
+<4>[23900.029297] [<c1227f50>] ? pgtable_bad+0x130/0x130
+<4>[23900.123739] [<c1227f50>] ? pgtable_bad+0x130/0x130
+<4>[23900.128955] [<c18ea0c3>] error_code+0x5f/0x64
+<4>[23900.133466] [<c1227f50>] ? pgtable_bad+0x130/0x130
+<4>[23900.138450] [<c17f6298>] ? __ip_route_output_key+0x698/0x7c0
+<4>[23900.144312] [<c17f5f8d>] ? __ip_route_output_key+0x38d/0x7c0
+<4>[23900.150730] [<c17f63df>] ip_route_output_flow+0x1f/0x60
+<4>[23900.156261] [<c181de58>] ip4_datagram_connect+0x188/0x2b0
+<4>[23900.161960] [<c18e981f>] ? _raw_spin_unlock_bh+0x1f/0x30
+<4>[23900.167834] [<c18298d6>] inet_dgram_connect+0x36/0x80
+<4>[23900.173224] [<c14f9e88>] ? _copy_from_user+0x48/0x140
+<4>[23900.178817] [<c17ab9da>] sys_connect+0x9a/0xd0
+<4>[23900.183538] [<c132e93c>] ? alloc_file+0xdc/0x240
+<4>[23900.189111] [<c123925d>] ? sub_preempt_count+0x3d/0x50
+
+Function free_fib_info resets nexthop_nh->nh_dev to NULL before releasing
+fi. Other cpu might be accessing fi. Fixing it by delaying the releasing.
+
+With the patch, we ran MTBF testing on Android mobile for 12 hours
+and didn't trigger the issue.
+
+Thank Eric for very detailed review/checking the issue.
+
+Signed-off-by: Yanmin Zhang <yanmin_zhang@linux.intel.com>
+Signed-off-by: Kun Jiang <kunx.jiang@intel.com>
+Acked-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ net/ipv4/fib_semantics.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
+index 80106d8..d01f9c6 100644
+--- a/net/ipv4/fib_semantics.c
++++ b/net/ipv4/fib_semantics.c
+@@ -146,6 +146,12 @@ static void free_fib_info_rcu(struct rcu_head *head)
+ {
+ struct fib_info *fi = container_of(head, struct fib_info, rcu);
+
++ change_nexthops(fi) {
++ if (nexthop_nh->nh_dev)
++ dev_put(nexthop_nh->nh_dev);
++ } endfor_nexthops(fi);
++
++ release_net(fi->fib_net);
+ if (fi->fib_metrics != (u32 *) dst_default_metrics)
+ kfree(fi->fib_metrics);
+ kfree(fi);
+@@ -157,13 +163,7 @@ void free_fib_info(struct fib_info *fi)
+ pr_warning("Freeing alive fib_info %p\n", fi);
+ return;
+ }
+- change_nexthops(fi) {
+- if (nexthop_nh->nh_dev)
+- dev_put(nexthop_nh->nh_dev);
+- nexthop_nh->nh_dev = NULL;
+- } endfor_nexthops(fi);
+ fib_info_cnt--;
+- release_net(fi->fib_net);
+ call_rcu(&fi->rcu, free_fib_info_rcu);
+ }
+
diff --git a/queue-3.2/ipv6-fix-incorrect-ipsec-fragment.patch b/queue-3.2/ipv6-fix-incorrect-ipsec-fragment.patch
new file mode 100644
index 0000000..aa460c9
--- /dev/null
+++ b/queue-3.2/ipv6-fix-incorrect-ipsec-fragment.patch
@@ -0,0 +1,177 @@
+From: Gao feng <gaofeng@cn.fujitsu.com>
+Date: Sat, 26 May 2012 01:30:53 +0000
+Subject: ipv6: fix incorrect ipsec fragment
+
+[ Upstream commit 0c1833797a5a6ec23ea9261d979aa18078720b74 ]
+
+Since commit ad0081e43a
+"ipv6: Fragment locally generated tunnel-mode IPSec6 packets as needed"
+the fragment of packets is incorrect.
+because tunnel mode needs IPsec headers and trailer for all fragments,
+while on transport mode it is sufficient to add the headers to the
+first fragment and the trailer to the last.
+
+so modify mtu and maxfraglen base on ipsec mode and if fragment is first
+or last.
+
+with my test,it work well(every fragment's size is the mtu)
+and does not trigger slow fragment path.
+
+Changes from v1:
+ though optimization, mtu_prev and maxfraglen_prev can be delete.
+ replace xfrm mode codes with dst_entry's new frag DST_XFRM_TUNNEL.
+ add fuction ip6_append_data_mtu to make codes clearer.
+
+Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ include/net/dst.h | 1 +
+ net/ipv6/ip6_output.c | 68 +++++++++++++++++++++++++++++++++++-------------
+ net/xfrm/xfrm_policy.c | 3 +++
+ 3 files changed, 54 insertions(+), 18 deletions(-)
+
+diff --git a/include/net/dst.h b/include/net/dst.h
+index 65bca65..16010d1 100644
+--- a/include/net/dst.h
++++ b/include/net/dst.h
+@@ -55,6 +55,7 @@ struct dst_entry {
+ #define DST_NOCOUNT 0x0020
+ #define DST_NOPEER 0x0040
+ #define DST_FAKE_RTABLE 0x0080
++#define DST_XFRM_TUNNEL 0x0100
+
+ short error;
+ short obsolete;
+diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
+index f7f07e2..ae98e09 100644
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -1178,6 +1178,29 @@ static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
+ return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
+ }
+
++static void ip6_append_data_mtu(int *mtu,
++ int *maxfraglen,
++ unsigned int fragheaderlen,
++ struct sk_buff *skb,
++ struct rt6_info *rt)
++{
++ if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
++ if (skb == NULL) {
++ /* first fragment, reserve header_len */
++ *mtu = *mtu - rt->dst.header_len;
++
++ } else {
++ /*
++ * this fragment is not first, the headers
++ * space is regarded as data space.
++ */
++ *mtu = dst_mtu(rt->dst.path);
++ }
++ *maxfraglen = ((*mtu - fragheaderlen) & ~7)
++ + fragheaderlen - sizeof(struct frag_hdr);
++ }
++}
++
+ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+ int offset, int len, int odd, struct sk_buff *skb),
+ void *from, int length, int transhdrlen,
+@@ -1187,7 +1210,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+ struct inet_sock *inet = inet_sk(sk);
+ struct ipv6_pinfo *np = inet6_sk(sk);
+ struct inet_cork *cork;
+- struct sk_buff *skb;
++ struct sk_buff *skb, *skb_prev = NULL;
+ unsigned int maxfraglen, fragheaderlen;
+ int exthdrlen;
+ int dst_exthdrlen;
+@@ -1245,8 +1268,12 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+ inet->cork.fl.u.ip6 = *fl6;
+ np->cork.hop_limit = hlimit;
+ np->cork.tclass = tclass;
+- mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
+- rt->dst.dev->mtu : dst_mtu(&rt->dst);
++ if (rt->dst.flags & DST_XFRM_TUNNEL)
++ mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
++ rt->dst.dev->mtu : dst_mtu(&rt->dst);
++ else
++ mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
++ rt->dst.dev->mtu : dst_mtu(rt->dst.path);
+ if (np->frag_size < mtu) {
+ if (np->frag_size)
+ mtu = np->frag_size;
+@@ -1342,25 +1369,27 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+ unsigned int fraglen;
+ unsigned int fraggap;
+ unsigned int alloclen;
+- struct sk_buff *skb_prev;
+ alloc_new_skb:
+- skb_prev = skb;
+-
+ /* There's no room in the current skb */
+- if (skb_prev)
+- fraggap = skb_prev->len - maxfraglen;
++ if (skb)
++ fraggap = skb->len - maxfraglen;
+ else
+ fraggap = 0;
++ /* update mtu and maxfraglen if necessary */
++ if (skb == NULL || skb_prev == NULL)
++ ip6_append_data_mtu(&mtu, &maxfraglen,
++ fragheaderlen, skb, rt);
++
++ skb_prev = skb;
+
+ /*
+ * If remaining data exceeds the mtu,
+ * we know we need more fragment(s).
+ */
+ datalen = length + fraggap;
+- if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)
+- datalen = maxfraglen - fragheaderlen;
+
+- fraglen = datalen + fragheaderlen;
++ if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)
++ datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len;
+ if ((flags & MSG_MORE) &&
+ !(rt->dst.dev->features&NETIF_F_SG))
+ alloclen = mtu;
+@@ -1369,13 +1398,16 @@ alloc_new_skb:
+
+ alloclen += dst_exthdrlen;
+
+- /*
+- * The last fragment gets additional space at tail.
+- * Note: we overallocate on fragments with MSG_MODE
+- * because we have no idea if we're the last one.
+- */
+- if (datalen == length + fraggap)
+- alloclen += rt->dst.trailer_len;
++ if (datalen != length + fraggap) {
++ /*
++ * this is not the last fragment, the trailer
++ * space is regarded as data space.
++ */
++ datalen += rt->dst.trailer_len;
++ }
++
++ alloclen += rt->dst.trailer_len;
++ fraglen = datalen + fragheaderlen;
+
+ /*
+ * We just reserve space for fragment header.
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index 9049a5c..0174034 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -1919,6 +1919,9 @@ no_transform:
+ }
+ ok:
+ xfrm_pols_put(pols, drop_pols);
++ if (dst && dst->xfrm &&
++ dst->xfrm->props.mode == XFRM_MODE_TUNNEL)
++ dst->flags |= DST_XFRM_TUNNEL;
+ return dst;
+
+ nopol:
diff --git a/queue-3.2/l2tp-fix-oops-in-l2tp-ip-sockets-for-connect-af_unspec-case.patch b/queue-3.2/l2tp-fix-oops-in-l2tp-ip-sockets-for-connect-af_unspec-case.patch
new file mode 100644
index 0000000..87b95a5
--- /dev/null
+++ b/queue-3.2/l2tp-fix-oops-in-l2tp-ip-sockets-for-connect-af_unspec-case.patch
@@ -0,0 +1,108 @@
+From: James Chapman <jchapman@katalix.com>
+Date: Tue, 29 May 2012 23:13:23 +0000
+Subject: l2tp: fix oops in L2TP IP sockets for connect() AF_UNSPEC case
+
+[ Upstream commit c51ce49735c183ef2592db70f918ee698716276b ]
+
+An application may call connect() to disconnect a socket using an
+address with family AF_UNSPEC. The L2TP IP sockets were not handling
+this case when the socket is not bound and an attempt to connect()
+using AF_UNSPEC in such cases would result in an oops. This patch
+addresses the problem by protecting the sk_prot->disconnect() call
+against trying to unhash the socket before it is bound.
+
+The patch also adds more checks that the sockaddr supplied to bind()
+and connect() calls is valid.
+
+ RIP: 0010:[<ffffffff82e133b0>] [<ffffffff82e133b0>] inet_unhash+0x50/0xd0
+ RSP: 0018:ffff88001989be28 EFLAGS: 00010293
+ Stack:
+ ffff8800407a8000 0000000000000000 ffff88001989be78 ffffffff82e3a249
+ ffffffff82e3a050 ffff88001989bec8 ffff88001989be88 ffff8800407a8000
+ 0000000000000010 ffff88001989bec8 ffff88001989bea8 ffffffff82e42639
+ Call Trace:
+ [<ffffffff82e3a249>] udp_disconnect+0x1f9/0x290
+ [<ffffffff82e42639>] inet_dgram_connect+0x29/0x80
+ [<ffffffff82d012fc>] sys_connect+0x9c/0x100
+
+Reported-by: Sasha Levin <levinsasha928@gmail.com>
+Signed-off-by: James Chapman <jchapman@katalix.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ net/l2tp/l2tp_ip.c | 30 ++++++++++++++++++++++++------
+ 1 file changed, 24 insertions(+), 6 deletions(-)
+
+diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
+index 2a2a3e7..2fbbe1f 100644
+--- a/net/l2tp/l2tp_ip.c
++++ b/net/l2tp/l2tp_ip.c
+@@ -251,9 +251,16 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+ {
+ struct inet_sock *inet = inet_sk(sk);
+ struct sockaddr_l2tpip *addr = (struct sockaddr_l2tpip *) uaddr;
+- int ret = -EINVAL;
++ int ret;
+ int chk_addr_ret;
+
++ if (!sock_flag(sk, SOCK_ZAPPED))
++ return -EINVAL;
++ if (addr_len < sizeof(struct sockaddr_l2tpip))
++ return -EINVAL;
++ if (addr->l2tp_family != AF_INET)
++ return -EINVAL;
++
+ ret = -EADDRINUSE;
+ read_lock_bh(&l2tp_ip_lock);
+ if (__l2tp_ip_bind_lookup(&init_net, addr->l2tp_addr.s_addr, sk->sk_bound_dev_if, addr->l2tp_conn_id))
+@@ -283,6 +290,8 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+ sk_del_node_init(sk);
+ write_unlock_bh(&l2tp_ip_lock);
+ ret = 0;
++ sock_reset_flag(sk, SOCK_ZAPPED);
++
+ out:
+ release_sock(sk);
+
+@@ -303,13 +312,14 @@ static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len
+ __be32 saddr;
+ int oif, rc;
+
+- rc = -EINVAL;
++ if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
++ return -EINVAL;
++
+ if (addr_len < sizeof(*lsa))
+- goto out;
++ return -EINVAL;
+
+- rc = -EAFNOSUPPORT;
+ if (lsa->l2tp_family != AF_INET)
+- goto out;
++ return -EAFNOSUPPORT;
+
+ lock_sock(sk);
+
+@@ -363,6 +373,14 @@ out:
+ return rc;
+ }
+
++static int l2tp_ip_disconnect(struct sock *sk, int flags)
++{
++ if (sock_flag(sk, SOCK_ZAPPED))
++ return 0;
++
++ return udp_disconnect(sk, flags);
++}
++
+ static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr,
+ int *uaddr_len, int peer)
+ {
+@@ -598,7 +616,7 @@ static struct proto l2tp_ip_prot = {
+ .close = l2tp_ip_close,
+ .bind = l2tp_ip_bind,
+ .connect = l2tp_ip_connect,
+- .disconnect = udp_disconnect,
++ .disconnect = l2tp_ip_disconnect,
+ .ioctl = udp_ioctl,
+ .destroy = l2tp_ip_destroy_sock,
+ .setsockopt = ip_setsockopt,
diff --git a/queue-3.2/r8169-fix-early-queue-wake-up.patch b/queue-3.2/r8169-fix-early-queue-wake-up.patch
new file mode 100644
index 0000000..329efe4
--- /dev/null
+++ b/queue-3.2/r8169-fix-early-queue-wake-up.patch
@@ -0,0 +1,54 @@
+From: Francois Romieu <romieu@fr.zoreil.com>
+Date: Tue, 31 Jan 2012 00:00:19 +0100
+Subject: r8169: fix early queue wake-up.
+
+[ Upstream commit ae1f23fb433ac0aaff8aeaa5a7b14348e9aa8277 ]
+
+With infinite gratitude to Eric Dumazet for allowing me to identify
+the error.
+
+Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
+Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
+Cc: Hayes Wang <hayeswang@realtek.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/net/ethernet/realtek/r8169.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
+index 5104d76..5f3fa32 100644
+--- a/drivers/net/ethernet/realtek/r8169.c
++++ b/drivers/net/ethernet/realtek/r8169.c
+@@ -5561,7 +5561,18 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ RTL_W8(TxPoll, NPQ);
+
+ if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
++ /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
++ * not miss a ring update when it notices a stopped queue.
++ */
++ smp_wmb();
+ netif_stop_queue(dev);
++ /* Sync with rtl_tx:
++ * - publish queue status and cur_tx ring index (write barrier)
++ * - refresh dirty_tx ring index (read barrier).
++ * May the current thread have a pessimistic view of the ring
++ * status and forget to wake up queue, a racing rtl_tx thread
++ * can't.
++ */
+ smp_mb();
+ if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
+ netif_wake_queue(dev);
+@@ -5663,6 +5674,13 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
+
+ if (tp->dirty_tx != dirty_tx) {
+ tp->dirty_tx = dirty_tx;
++ /* Sync with rtl8169_start_xmit:
++ * - publish dirty_tx ring index (write barrier)
++ * - refresh cur_tx ring index and queue status (read barrier)
++ * May the current thread miss the stopped queue condition,
++ * a racing xmit thread can only have a right view of the
++ * ring status.
++ */
+ smp_mb();
+ if (netif_queue_stopped(dev) &&
+ (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
diff --git a/queue-3.2/r8169-fix-unsigned-int-wraparound-with-tso.patch b/queue-3.2/r8169-fix-unsigned-int-wraparound-with-tso.patch
new file mode 100644
index 0000000..5911926
--- /dev/null
+++ b/queue-3.2/r8169-fix-unsigned-int-wraparound-with-tso.patch
@@ -0,0 +1,78 @@
+From: Julien Ducourthial <jducourt@free.fr>
+Date: Wed, 9 May 2012 00:00:06 +0200
+Subject: r8169: fix unsigned int wraparound with TSO
+
+[ Upstream commit 477206a018f902895bfcd069dd820bfe94c187b1 ]
+
+The r8169 may get stuck or show bad behaviour after activating TSO :
+the net_device is not stopped when it has no more TX descriptors.
+This problem comes from TX_BUFS_AVAIL which may reach -1 when all
+transmit descriptors are in use. The patch simply tries to keep positive
+values.
+
+Tested with 8111d(onboard) on a D510MO, and with 8111e(onboard) on a
+Zotac 890GXITX.
+
+Signed-off-by: Julien Ducourthial <jducourt@free.fr>
+Acked-by: Francois Romieu <romieu@fr.zoreil.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/net/ethernet/realtek/r8169.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
+index 5f3fa32..cc2565c 100644
+--- a/drivers/net/ethernet/realtek/r8169.c
++++ b/drivers/net/ethernet/realtek/r8169.c
+@@ -62,8 +62,12 @@
+ #define R8169_MSG_DEFAULT \
+ (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
+
+-#define TX_BUFFS_AVAIL(tp) \
+- (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
++#define TX_SLOTS_AVAIL(tp) \
++ (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx)
++
++/* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */
++#define TX_FRAGS_READY_FOR(tp,nr_frags) \
++ (TX_SLOTS_AVAIL(tp) >= (nr_frags + 1))
+
+ /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
+ The RTL chips use a 64 element hash table based on the Ethernet CRC. */
+@@ -5512,7 +5516,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ u32 opts[2];
+ int frags;
+
+- if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
++ if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) {
+ netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
+ goto err_stop_0;
+ }
+@@ -5560,7 +5564,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+
+ RTL_W8(TxPoll, NPQ);
+
+- if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
++ if (!TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) {
+ /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
+ * not miss a ring update when it notices a stopped queue.
+ */
+@@ -5574,7 +5578,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ * can't.
+ */
+ smp_mb();
+- if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
++ if (TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS))
+ netif_wake_queue(dev);
+ }
+
+@@ -5683,7 +5687,7 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
+ */
+ smp_mb();
+ if (netif_queue_stopped(dev) &&
+- (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
++ TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) {
+ netif_wake_queue(dev);
+ }
+ /*
diff --git a/queue-3.2/r8169-missing-barriers.patch b/queue-3.2/r8169-missing-barriers.patch
new file mode 100644
index 0000000..3af188d
--- /dev/null
+++ b/queue-3.2/r8169-missing-barriers.patch
@@ -0,0 +1,43 @@
+From: Francois Romieu <romieu@fr.zoreil.com>
+Date: Fri, 27 Jan 2012 15:05:38 +0100
+Subject: r8169: missing barriers.
+
+[ Upstream commit 1e874e041fc7c222cbd85b20c4406070be1f687a ]
+
+Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
+Cc: Hayes Wang <hayeswang@realtek.com>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/net/ethernet/realtek/r8169.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
+index 697cae3..5104d76 100644
+--- a/drivers/net/ethernet/realtek/r8169.c
++++ b/drivers/net/ethernet/realtek/r8169.c
+@@ -5562,7 +5562,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+
+ if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
+ netif_stop_queue(dev);
+- smp_rmb();
++ smp_mb();
+ if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
+ netif_wake_queue(dev);
+ }
+@@ -5663,7 +5663,7 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
+
+ if (tp->dirty_tx != dirty_tx) {
+ tp->dirty_tx = dirty_tx;
+- smp_wmb();
++ smp_mb();
+ if (netif_queue_stopped(dev) &&
+ (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
+ netif_wake_queue(dev);
+@@ -5674,7 +5674,6 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
+ * of start_xmit activity is detected (if it is not detected,
+ * it is slow enough). -- FR
+ */
+- smp_rmb();
+ if (tp->cur_tx != dirty_tx)
+ RTL_W8(TxPoll, NPQ);
+ }
diff --git a/queue-3.2/revert-net-maintain-namespace-isolation-between-vlan-and-real-device.patch b/queue-3.2/revert-net-maintain-namespace-isolation-between-vlan-and-real-device.patch
new file mode 100644
index 0000000..414283f
--- /dev/null
+++ b/queue-3.2/revert-net-maintain-namespace-isolation-between-vlan-and-real-device.patch
@@ -0,0 +1,133 @@
+From: "David S. Miller" <davem@davemloft.net>
+Date: Thu, 10 May 2012 23:03:34 -0400
+Subject: Revert "net: maintain namespace isolation between vlan and real device"
+
+[ Upstream commit 59b9997baba5242997ddc7bd96b1391f5275a5a4 ]
+
+This reverts commit 8a83a00b0735190384a348156837918271034144.
+
+It causes regressions for S390 devices, because it does an
+unconditional DST drop on SKBs for vlans and the QETH device
+needs the neighbour entry hung off the DST for certain things
+on transmit.
+
+Arnd can't remember exactly why he even needed this change.
+
+Conflicts:
+
+ drivers/net/macvlan.c
+ net/8021q/vlan_dev.c
+ net/core/dev.c
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/net/macvlan.c | 2 +-
+ include/linux/netdevice.h | 9 ---------
+ net/8021q/vlan_dev.c | 2 +-
+ net/core/dev.c | 36 +++++-------------------------------
+ 4 files changed, 7 insertions(+), 42 deletions(-)
+
+diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
+index 959d448..97f342e 100644
+--- a/drivers/net/macvlan.c
++++ b/drivers/net/macvlan.c
+@@ -258,7 +258,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
+
+ xmit_world:
+ skb->ip_summed = ip_summed;
+- skb_set_dev(skb, vlan->lowerdev);
++ skb->dev = vlan->lowerdev;
+ return dev_queue_xmit(skb);
+ }
+
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index cbeb586..cb52340 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1420,15 +1420,6 @@ static inline bool netdev_uses_dsa_tags(struct net_device *dev)
+ return 0;
+ }
+
+-#ifndef CONFIG_NET_NS
+-static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev)
+-{
+- skb->dev = dev;
+-}
+-#else /* CONFIG_NET_NS */
+-void skb_set_dev(struct sk_buff *skb, struct net_device *dev);
+-#endif
+-
+ static inline bool netdev_uses_trailer_tags(struct net_device *dev)
+ {
+ #ifdef CONFIG_NET_DSA_TAG_TRAILER
+diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
+index bc25286..0cccca8 100644
+--- a/net/8021q/vlan_dev.c
++++ b/net/8021q/vlan_dev.c
+@@ -156,7 +156,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
+ skb = __vlan_hwaccel_put_tag(skb, vlan_tci);
+ }
+
+- skb_set_dev(skb, vlan_dev_info(dev)->real_dev);
++ skb->dev = vlan_dev_info(dev)->real_dev;
+ len = skb->len;
+ ret = dev_queue_xmit(skb);
+
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 61a7baa..1cbddc9 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -1607,10 +1607,14 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
+ kfree_skb(skb);
+ return NET_RX_DROP;
+ }
+- skb_set_dev(skb, dev);
++ skb->dev = dev;
++ skb_dst_drop(skb);
+ skb->tstamp.tv64 = 0;
+ skb->pkt_type = PACKET_HOST;
+ skb->protocol = eth_type_trans(skb, dev);
++ skb->mark = 0;
++ secpath_reset(skb);
++ nf_reset(skb);
+ return netif_rx(skb);
+ }
+ EXPORT_SYMBOL_GPL(dev_forward_skb);
+@@ -1865,36 +1869,6 @@ void netif_device_attach(struct net_device *dev)
+ }
+ EXPORT_SYMBOL(netif_device_attach);
+
+-/**
+- * skb_dev_set -- assign a new device to a buffer
+- * @skb: buffer for the new device
+- * @dev: network device
+- *
+- * If an skb is owned by a device already, we have to reset
+- * all data private to the namespace a device belongs to
+- * before assigning it a new device.
+- */
+-#ifdef CONFIG_NET_NS
+-void skb_set_dev(struct sk_buff *skb, struct net_device *dev)
+-{
+- skb_dst_drop(skb);
+- if (skb->dev && !net_eq(dev_net(skb->dev), dev_net(dev))) {
+- secpath_reset(skb);
+- nf_reset(skb);
+- skb_init_secmark(skb);
+- skb->mark = 0;
+- skb->priority = 0;
+- skb->nf_trace = 0;
+- skb->ipvs_property = 0;
+-#ifdef CONFIG_NET_SCHED
+- skb->tc_index = 0;
+-#endif
+- }
+- skb->dev = dev;
+-}
+-EXPORT_SYMBOL(skb_set_dev);
+-#endif /* CONFIG_NET_NS */
+-
+ /*
+ * Invalidate hardware checksum when packet is to be mangled, and
+ * complete checksum manually on outgoing path.
diff --git a/queue-3.2/sctp-check-cached-dst-before-using-it.patch b/queue-3.2/sctp-check-cached-dst-before-using-it.patch
new file mode 100644
index 0000000..8984ab6
--- /dev/null
+++ b/queue-3.2/sctp-check-cached-dst-before-using-it.patch
@@ -0,0 +1,84 @@
+From: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+Date: Fri, 4 May 2012 05:24:54 +0000
+Subject: sctp: check cached dst before using it
+
+[ Upstream commit e0268868ba064980488fc8c194db3d8e9fb2959c ]
+
+dst_check() will take care of SA (and obsolete field), hence
+IPsec rekeying scenario is taken into account.
+
+Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+Acked-by: Vlad Yaseivch <vyasevich@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ include/net/sctp/sctp.h | 13 +++++++++++++
+ net/sctp/output.c | 4 +---
+ net/sctp/transport.c | 17 -----------------
+ 3 files changed, 14 insertions(+), 20 deletions(-)
+
+diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
+index 6a72a58..ad03988 100644
+--- a/include/net/sctp/sctp.h
++++ b/include/net/sctp/sctp.h
+@@ -703,4 +703,17 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr)
+ addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);
+ }
+
++/* The cookie is always 0 since this is how it's used in the
++ * pmtu code.
++ */
++static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
++{
++ if (t->dst && !dst_check(t->dst, 0)) {
++ dst_release(t->dst);
++ t->dst = NULL;
++ }
++
++ return t->dst;
++}
++
+ #endif /* __net_sctp_h__ */
+diff --git a/net/sctp/output.c b/net/sctp/output.c
+index 817174e..8fc4dcd 100644
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -377,9 +377,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
+ */
+ skb_set_owner_w(nskb, sk);
+
+- /* The 'obsolete' field of dst is set to 2 when a dst is freed. */
+- if (!dst || (dst->obsolete > 1)) {
+- dst_release(dst);
++ if (!sctp_transport_dst_check(tp)) {
+ sctp_transport_route(tp, NULL, sctp_sk(sk));
+ if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) {
+ sctp_assoc_sync_pmtu(asoc);
+diff --git a/net/sctp/transport.c b/net/sctp/transport.c
+index 394c57c..8da4481 100644
+--- a/net/sctp/transport.c
++++ b/net/sctp/transport.c
+@@ -226,23 +226,6 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
+ transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
+ }
+
+-/* this is a complete rip-off from __sk_dst_check
+- * the cookie is always 0 since this is how it's used in the
+- * pmtu code
+- */
+-static struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
+-{
+- struct dst_entry *dst = t->dst;
+-
+- if (dst && dst->obsolete && dst->ops->check(dst, 0) == NULL) {
+- dst_release(t->dst);
+- t->dst = NULL;
+- return NULL;
+- }
+-
+- return dst;
+-}
+-
+ void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
+ {
+ struct dst_entry *dst;
diff --git a/queue-3.2/series b/queue-3.2/series
index 39b4b1c..765146a 100644
--- a/queue-3.2/series
+++ b/queue-3.2/series
@@ -52,3 +52,25 @@ drm-ttm-fix-spinlock-imbalance.patch
drm-vmwgfx-fix-nasty-write-past-alloced-memory-area.patch
mtd-of_parts-fix-breakage-in-kconfig.patch
fec_mpc52xx-fix-timestamp-filtering.patch
+bluetooth-btusb-add-vendor-specific-id-0a5c-21f3-for-bcm20702a0.patch
+bluetooth-btusb-add-support-for-bcm20702a0.patch
+bluetooth-btusb-add-usb-device-id-0a5c-21e8.patch
+bluetooth-btusb-typo-in-broadcom-softsailing-id.patch
+bluetooth-btusb-add-vendor-specific-id-0489-e042-for-bcm20702a0.patch
+bluetooth-add-support-for-atheros.patch
+bluetooth-add-support-for-ar3012.patch
+add-foxconn-hon-hai-ids-for-btusb-module.patch
+bluetooth-add-support-for-foxconn-hon-hai-ar5bbu22-0489-e03c.patch
+drm-i915-disable-fbc-on-sandybridge.patch
+ipv4-do-not-use-dead-fib_info-entries.patch
+ipv4-fix-the-rcu-race-between-free_fib_info-and-ip_route_output_slow.patch
+set-fake_rtable-s-dst-to-null-to-avoid-kernel-oops.patch
+ipv6-fix-incorrect-ipsec-fragment.patch
+l2tp-fix-oops-in-l2tp-ip-sockets-for-connect-af_unspec-case.patch
+r8169-missing-barriers.patch
+r8169-fix-early-queue-wake-up.patch
+r8169-fix-unsigned-int-wraparound-with-tso.patch
+revert-net-maintain-namespace-isolation-between-vlan-and-real-device.patch
+sctp-check-cached-dst-before-using-it.patch
+skb-avoid-unnecessary-reallocations-in-__skb_cow.patch
+xfrm-take-net-hdr-len-into-account-for-esp-payload-size-calculation.patch
diff --git a/queue-3.2/set-fake_rtable-s-dst-to-null-to-avoid-kernel-oops.patch b/queue-3.2/set-fake_rtable-s-dst-to-null-to-avoid-kernel-oops.patch
new file mode 100644
index 0000000..1f387fd
--- /dev/null
+++ b/queue-3.2/set-fake_rtable-s-dst-to-null-to-avoid-kernel-oops.patch
@@ -0,0 +1,106 @@
+From: "Peter Huang (Peng)" <peter.huangpeng@huawei.com>
+Date: Thu, 19 Apr 2012 20:12:51 +0000
+Subject: set fake_rtable's dst to NULL to avoid kernel Oops
+
+[ Upstream commit a881e963c7fe1f226e991ee9bbe8907acda93294 ]
+
+bridge: set fake_rtable's dst to NULL to avoid kernel Oops
+
+when bridge is deleted before tap/vif device's delete, kernel may
+encounter an oops because of NULL reference to fake_rtable's dst.
+Set fake_rtable's dst to NULL before sending packets out can solve
+this problem.
+
+v4 reformat, change br_drop_fake_rtable(skb) to {}
+
+v3 enrich commit header
+
+v2 introducing new flag DST_FAKE_RTABLE to dst_entry struct.
+
+[ Use "do { } while (0)" for nop br_drop_fake_rtable()
+ implementation -DaveM ]
+
+Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
+Signed-off-by: Peter Huang <peter.huangpeng@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ include/linux/netfilter_bridge.h | 9 +++++++++
+ include/net/dst.h | 1 +
+ net/bridge/br_forward.c | 1 +
+ net/bridge/br_netfilter.c | 8 ++------
+ 4 files changed, 13 insertions(+), 6 deletions(-)
+
+diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h
+index 0ddd161..31d2844 100644
+--- a/include/linux/netfilter_bridge.h
++++ b/include/linux/netfilter_bridge.h
+@@ -104,9 +104,18 @@ struct bridge_skb_cb {
+ } daddr;
+ };
+
++static inline void br_drop_fake_rtable(struct sk_buff *skb)
++{
++ struct dst_entry *dst = skb_dst(skb);
++
++ if (dst && (dst->flags & DST_FAKE_RTABLE))
++ skb_dst_drop(skb);
++}
++
+ #else
+ #define nf_bridge_maybe_copy_header(skb) (0)
+ #define nf_bridge_pad(skb) (0)
++#define br_drop_fake_rtable(skb) do { } while (0)
+ #endif /* CONFIG_BRIDGE_NETFILTER */
+
+ #endif /* __KERNEL__ */
+diff --git a/include/net/dst.h b/include/net/dst.h
+index 75766b4..65bca65 100644
+--- a/include/net/dst.h
++++ b/include/net/dst.h
+@@ -54,6 +54,7 @@ struct dst_entry {
+ #define DST_NOCACHE 0x0010
+ #define DST_NOCOUNT 0x0020
+ #define DST_NOPEER 0x0040
++#define DST_FAKE_RTABLE 0x0080
+
+ short error;
+ short obsolete;
+diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
+index ee64287..e221f88 100644
+--- a/net/bridge/br_forward.c
++++ b/net/bridge/br_forward.c
+@@ -47,6 +47,7 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
+ kfree_skb(skb);
+ } else {
+ skb_push(skb, ETH_HLEN);
++ br_drop_fake_rtable(skb);
+ dev_queue_xmit(skb);
+ }
+
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index fa8b8f7..577ea5d 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -147,7 +147,7 @@ void br_netfilter_rtable_init(struct net_bridge *br)
+ rt->dst.dev = br->dev;
+ rt->dst.path = &rt->dst;
+ dst_init_metrics(&rt->dst, br_dst_default_metrics, true);
+- rt->dst.flags = DST_NOXFRM | DST_NOPEER;
++ rt->dst.flags = DST_NOXFRM | DST_NOPEER | DST_FAKE_RTABLE;
+ rt->dst.ops = &fake_dst_ops;
+ }
+
+@@ -687,11 +687,7 @@ static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff *skb,
+ const struct net_device *out,
+ int (*okfn)(struct sk_buff *))
+ {
+- struct rtable *rt = skb_rtable(skb);
+-
+- if (rt && rt == bridge_parent_rtable(in))
+- skb_dst_drop(skb);
+-
++ br_drop_fake_rtable(skb);
+ return NF_ACCEPT;
+ }
+
diff --git a/queue-3.2/skb-avoid-unnecessary-reallocations-in-__skb_cow.patch b/queue-3.2/skb-avoid-unnecessary-reallocations-in-__skb_cow.patch
new file mode 100644
index 0000000..22f556f
--- /dev/null
+++ b/queue-3.2/skb-avoid-unnecessary-reallocations-in-__skb_cow.patch
@@ -0,0 +1,38 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 29 May 2012 03:35:08 +0000
+Subject: skb: avoid unnecessary reallocations in __skb_cow
+
+[ Upstream commit 617c8c11236716dcbda877e764b7bf37c6fd8063 ]
+
+At the beginning of __skb_cow, headroom gets set to a minimum of
+NET_SKB_PAD. This causes unnecessary reallocations if the buffer was not
+cloned and the headroom is just below NET_SKB_PAD, but still more than the
+amount requested by the caller.
+This was showing up frequently in my tests on VLAN tx, where
+vlan_insert_tag calls skb_cow_head(skb, VLAN_HLEN).
+
+Locally generated packets should have enough headroom, and for forward
+paths, we already have NET_SKB_PAD bytes of headroom, so we don't need to
+add any extra space here.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ include/linux/skbuff.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index e689b47..bdb4590 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -1866,8 +1866,6 @@ static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
+ {
+ int delta = 0;
+
+- if (headroom < NET_SKB_PAD)
+- headroom = NET_SKB_PAD;
+ if (headroom > skb_headroom(skb))
+ delta = headroom - skb_headroom(skb);
+
diff --git a/queue-3.2/xfrm-take-net-hdr-len-into-account-for-esp-payload-size-calculation.patch b/queue-3.2/xfrm-take-net-hdr-len-into-account-for-esp-payload-size-calculation.patch
new file mode 100644
index 0000000..846d01d
--- /dev/null
+++ b/queue-3.2/xfrm-take-net-hdr-len-into-account-for-esp-payload-size-calculation.patch
@@ -0,0 +1,95 @@
+From: Benjamin Poirier <bpoirier@suse.de>
+Date: Thu, 24 May 2012 11:32:38 +0000
+Subject: xfrm: take net hdr len into account for esp payload size calculation
+
+[ Upstream commit 91657eafb64b4cb53ec3a2fbc4afc3497f735788 ]
+
+Corrects the function that determines the esp payload size. The calculations
+done in esp{4,6}_get_mtu() lead to overlength frames in transport mode for
+certain mtu values and suboptimal frames for others.
+
+According to what is done, mainly in esp{,6}_output() and tcp_mtu_to_mss(),
+net_header_len must be taken into account before doing the alignment
+calculation.
+
+Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ net/ipv4/esp4.c | 24 +++++++++---------------
+ net/ipv6/esp6.c | 18 +++++++-----------
+ 2 files changed, 16 insertions(+), 26 deletions(-)
+
+diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
+index a5b4134..530787b 100644
+--- a/net/ipv4/esp4.c
++++ b/net/ipv4/esp4.c
+@@ -457,28 +457,22 @@ static u32 esp4_get_mtu(struct xfrm_state *x, int mtu)
+ struct esp_data *esp = x->data;
+ u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4);
+ u32 align = max_t(u32, blksize, esp->padlen);
+- u32 rem;
+-
+- mtu -= x->props.header_len + crypto_aead_authsize(esp->aead);
+- rem = mtu & (align - 1);
+- mtu &= ~(align - 1);
++ unsigned int net_adj;
+
+ switch (x->props.mode) {
+- case XFRM_MODE_TUNNEL:
+- break;
+- default:
+ case XFRM_MODE_TRANSPORT:
+- /* The worst case */
+- mtu -= blksize - 4;
+- mtu += min_t(u32, blksize - 4, rem);
+- break;
+ case XFRM_MODE_BEET:
+- /* The worst case. */
+- mtu += min_t(u32, IPV4_BEET_PHMAXLEN, rem);
++ net_adj = sizeof(struct iphdr);
+ break;
++ case XFRM_MODE_TUNNEL:
++ net_adj = 0;
++ break;
++ default:
++ BUG();
+ }
+
+- return mtu - 2;
++ return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) -
++ net_adj) & ~(align - 1)) + (net_adj - 2);
+ }
+
+ static void esp4_err(struct sk_buff *skb, u32 info)
+diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
+index 1ac7938..65dd543 100644
+--- a/net/ipv6/esp6.c
++++ b/net/ipv6/esp6.c
+@@ -411,19 +411,15 @@ static u32 esp6_get_mtu(struct xfrm_state *x, int mtu)
+ struct esp_data *esp = x->data;
+ u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4);
+ u32 align = max_t(u32, blksize, esp->padlen);
+- u32 rem;
++ unsigned int net_adj;
+
+- mtu -= x->props.header_len + crypto_aead_authsize(esp->aead);
+- rem = mtu & (align - 1);
+- mtu &= ~(align - 1);
+-
+- if (x->props.mode != XFRM_MODE_TUNNEL) {
+- u32 padsize = ((blksize - 1) & 7) + 1;
+- mtu -= blksize - padsize;
+- mtu += min_t(u32, blksize - padsize, rem);
+- }
++ if (x->props.mode != XFRM_MODE_TUNNEL)
++ net_adj = sizeof(struct ipv6hdr);
++ else
++ net_adj = 0;
+
+- return mtu - 2;
++ return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) -
++ net_adj) & ~(align - 1)) + (net_adj - 2);
+ }
+
+ static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,