diff options
author | Koen Kooi <koen@dominion.thruhere.net> | 2012-04-09 18:06:40 +0200 |
---|---|---|
committer | Denys Dmytriyenko <denys@ti.com> | 2012-04-10 15:10:45 -0400 |
commit | bb34e69f3d6b2a24e910c657e3385ece0a6e0f98 (patch) | |
tree | c51c955c7a46c7f93874c348ad0921f70283ab9e /recipes-kernel | |
parent | f5135a2cb76535c179fa8e442c1f8d6cd336a64d (diff) | |
download | meta-ti-bb34e69f3d6b2a24e910c657e3385ece0a6e0f98.tar.gz |
linux-ti335x-psp 3.2: update to 3.2.14
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
Signed-off-by: Denys Dmytriyenko <denys@ti.com>
Diffstat (limited to 'recipes-kernel')
148 files changed, 11110 insertions, 1 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0001-USB-option-Add-MediaTek-MT6276M-modem-app-interfaces.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0001-USB-option-Add-MediaTek-MT6276M-modem-app-interfaces.patch new file mode 100644 index 00000000..f523a33e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0001-USB-option-Add-MediaTek-MT6276M-modem-app-interfaces.patch | |||
@@ -0,0 +1,45 @@ | |||
1 | From cc33a57bd7f9104a9c2f77f11dc3e7f9c22b9340 Mon Sep 17 00:00:00 2001 | ||
2 | From: Meng Zhang <meng.zhang@mediatek.com> | ||
3 | Date: Mon, 27 Feb 2012 08:24:19 +0100 | ||
4 | Subject: [PATCH 001/147] USB: option: Add MediaTek MT6276M modem&app | ||
5 | interfaces | ||
6 | |||
7 | commit 0d8520a1d7f43328bc7085d4244d93c595064157 upstream. | ||
8 | |||
9 | Add MEDIATEK products to Option driver | ||
10 | |||
11 | Signed-off-by: Meng Zhang <meng.zhang@mediatek.com> | ||
12 | Signed-off-by: Matthias Urlichs <matthias@urlichs.de> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/serial/option.c | 7 +++++++ | ||
16 | 1 file changed, 7 insertions(+) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
19 | index 68fa8c7..547c9b9 100644 | ||
20 | --- a/drivers/usb/serial/option.c | ||
21 | +++ b/drivers/usb/serial/option.c | ||
22 | @@ -484,6 +484,9 @@ static void option_instat_callback(struct urb *urb); | ||
23 | #define LG_VENDOR_ID 0x1004 | ||
24 | #define LG_PRODUCT_L02C 0x618f | ||
25 | |||
26 | +/* MediaTek products */ | ||
27 | +#define MEDIATEK_VENDOR_ID 0x0e8d | ||
28 | + | ||
29 | /* some devices interfaces need special handling due to a number of reasons */ | ||
30 | enum option_blacklist_reason { | ||
31 | OPTION_BLACKLIST_NONE = 0, | ||
32 | @@ -1198,6 +1201,10 @@ static const struct usb_device_id option_ids[] = { | ||
33 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, | ||
34 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, | ||
35 | { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ | ||
36 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a1, 0xff, 0x00, 0x00) }, | ||
37 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a1, 0xff, 0x02, 0x01) }, | ||
38 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a2, 0xff, 0x00, 0x00) }, | ||
39 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a2, 0xff, 0x02, 0x01) }, /* MediaTek MT6276M modem & app port */ | ||
40 | { } /* Terminating entry */ | ||
41 | }; | ||
42 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
43 | -- | ||
44 | 1.7.9.4 | ||
45 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0002-USB-option-driver-adding-support-for-Telit-CC864-SIN.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0002-USB-option-driver-adding-support-for-Telit-CC864-SIN.patch new file mode 100644 index 00000000..2ee506ab --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0002-USB-option-driver-adding-support-for-Telit-CC864-SIN.patch | |||
@@ -0,0 +1,44 @@ | |||
1 | From 17ad305add28a63e155a74678178a6ce6a6a5998 Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniele Palmas <dnlplm@gmail.com> | ||
3 | Date: Wed, 29 Feb 2012 15:32:05 +0100 | ||
4 | Subject: [PATCH 002/147] USB: option driver: adding support for Telit | ||
5 | CC864-SINGLE, CC864-DUAL and DE910-DUAL modems | ||
6 | |||
7 | commit 7204cf584836c24b4b06e4ad4a8e6bb8ea84908e upstream. | ||
8 | |||
9 | Adding PID for Telit CC864-SINGLE, CC864-DUAL and DE910-DUAL | ||
10 | modems | ||
11 | |||
12 | Signed-off-by: Daniele Palmas <dnlplm@gmail.com> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/serial/option.c | 6 ++++++ | ||
16 | 1 file changed, 6 insertions(+) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
19 | index 547c9b9..3c4b7df 100644 | ||
20 | --- a/drivers/usb/serial/option.c | ||
21 | +++ b/drivers/usb/serial/option.c | ||
22 | @@ -307,6 +307,9 @@ static void option_instat_callback(struct urb *urb); | ||
23 | #define TELIT_VENDOR_ID 0x1bc7 | ||
24 | #define TELIT_PRODUCT_UC864E 0x1003 | ||
25 | #define TELIT_PRODUCT_UC864G 0x1004 | ||
26 | +#define TELIT_PRODUCT_CC864_DUAL 0x1005 | ||
27 | +#define TELIT_PRODUCT_CC864_SINGLE 0x1006 | ||
28 | +#define TELIT_PRODUCT_DE910_DUAL 0x1010 | ||
29 | |||
30 | /* ZTE PRODUCTS */ | ||
31 | #define ZTE_VENDOR_ID 0x19d2 | ||
32 | @@ -771,6 +774,9 @@ static const struct usb_device_id option_ids[] = { | ||
33 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | ||
34 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | ||
35 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, | ||
36 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, | ||
37 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, | ||
38 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, | ||
39 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ | ||
40 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), | ||
41 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
42 | -- | ||
43 | 1.7.9.4 | ||
44 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0003-USB-option-make-interface-blacklist-work-again.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0003-USB-option-make-interface-blacklist-work-again.patch new file mode 100644 index 00000000..944ea0a7 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0003-USB-option-make-interface-blacklist-work-again.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From ebdc22267ac3cd3aef9e300a553c0f32ac5da6f2 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no> | ||
3 | Date: Fri, 16 Mar 2012 12:56:44 +0100 | ||
4 | Subject: [PATCH 003/147] USB: option: make interface blacklist work again | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit 963940cf472d76eca2d36296e461202cc6997352 upstream. | ||
10 | |||
11 | commit 0d905fd "USB: option: convert Huawei K3765, K4505, K4605 | ||
12 | reservered interface to blacklist" accidentally ANDed two | ||
13 | blacklist tests by leaving out a return. This was not noticed | ||
14 | because the two consecutive bracketless if statements made it | ||
15 | syntactically correct. | ||
16 | |||
17 | Signed-off-by: Bj??rn Mork <bjorn@mork.no> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/usb/serial/option.c | 1 + | ||
21 | 1 file changed, 1 insertion(+) | ||
22 | |||
23 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
24 | index 3c4b7df..6410935 100644 | ||
25 | --- a/drivers/usb/serial/option.c | ||
26 | +++ b/drivers/usb/serial/option.c | ||
27 | @@ -1373,6 +1373,7 @@ static int option_probe(struct usb_serial *serial, | ||
28 | serial->interface->cur_altsetting->desc.bInterfaceNumber, | ||
29 | OPTION_BLACKLIST_RESERVED_IF, | ||
30 | (const struct option_blacklist_info *) id->driver_info)) | ||
31 | + return -ENODEV; | ||
32 | |||
33 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ | ||
34 | if (serial->dev->descriptor.idVendor == SAMSUNG_VENDOR_ID && | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0004-USB-option-add-ZTE-MF820D.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0004-USB-option-add-ZTE-MF820D.patch new file mode 100644 index 00000000..ae0d8735 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0004-USB-option-add-ZTE-MF820D.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From 0b49c52b5b44e5db6fe288173faec7136ea18c68 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no> | ||
3 | Date: Fri, 16 Mar 2012 15:41:26 +0100 | ||
4 | Subject: [PATCH 004/147] USB: option: add ZTE MF820D | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit 5889d3d4209c1050b4a3c96c41faf6c0976a4acf upstream. | ||
10 | |||
11 | This device presents a total of 5 interfaces with ff/ff/ff | ||
12 | class/subclass/protocol. The last one of these is verified | ||
13 | to be a QMI/wwan combined interface which should be handled | ||
14 | by the qmi_wwan driver, so we blacklist it here. | ||
15 | |||
16 | Signed-off-by: Bj??rn Mork <bjorn@mork.no> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | drivers/usb/serial/option.c | 2 ++ | ||
20 | 1 file changed, 2 insertions(+) | ||
21 | |||
22 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
23 | index 6410935..54898c9 100644 | ||
24 | --- a/drivers/usb/serial/option.c | ||
25 | +++ b/drivers/usb/serial/option.c | ||
26 | @@ -901,6 +901,8 @@ static const struct usb_device_id option_ids[] = { | ||
27 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, | ||
28 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, | ||
29 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | ||
30 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | ||
31 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
32 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, | ||
33 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, | ||
34 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0005-staging-zcache-avoid-AB-BA-deadlock-condition.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0005-staging-zcache-avoid-AB-BA-deadlock-condition.patch new file mode 100644 index 00000000..fb8bfe25 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0005-staging-zcache-avoid-AB-BA-deadlock-condition.patch | |||
@@ -0,0 +1,66 @@ | |||
1 | From 24c8eaa136cf3193f2719e9d04cc4efea3b2b732 Mon Sep 17 00:00:00 2001 | ||
2 | From: Andrea Righi <andrea@betterlinux.com> | ||
3 | Date: Mon, 20 Feb 2012 13:11:49 +0100 | ||
4 | Subject: [PATCH 005/147] staging: zcache: avoid AB-BA deadlock condition | ||
5 | |||
6 | commit cfbc6a92212e74b07aa76c9e2f20c542e36077fb upstream. | ||
7 | |||
8 | Commit 9256a47 fixed a deadlock condition, being sure that the buddy | ||
9 | list spinlock is always taken before the page spinlock. | ||
10 | |||
11 | However in zbud_free_and_delist() locking order is the opposite | ||
12 | (page lock -> list lock). | ||
13 | |||
14 | Possible unsafe locking scenario (reported by lockdep): | ||
15 | |||
16 | CPU0 CPU1 | ||
17 | ---- ---- | ||
18 | lock(&(&zbpg->lock)->rlock); | ||
19 | lock(zbud_budlists_spinlock); | ||
20 | lock(&(&zbpg->lock)->rlock); | ||
21 | lock(zbud_budlists_spinlock); | ||
22 | |||
23 | Fix by grabbing the locks in opposite order in zbud_free_and_delist(). | ||
24 | |||
25 | Signed-off-by: Andrea Righi <andrea@betterlinux.com> | ||
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
27 | --- | ||
28 | drivers/staging/zcache/zcache-main.c | 4 ++-- | ||
29 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
30 | |||
31 | diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c | ||
32 | index f5e469d..16ad9fe 100644 | ||
33 | --- a/drivers/staging/zcache/zcache-main.c | ||
34 | +++ b/drivers/staging/zcache/zcache-main.c | ||
35 | @@ -299,10 +299,12 @@ static void zbud_free_and_delist(struct zbud_hdr *zh) | ||
36 | struct zbud_page *zbpg = | ||
37 | container_of(zh, struct zbud_page, buddy[budnum]); | ||
38 | |||
39 | + spin_lock(&zbud_budlists_spinlock); | ||
40 | spin_lock(&zbpg->lock); | ||
41 | if (list_empty(&zbpg->bud_list)) { | ||
42 | /* ignore zombie page... see zbud_evict_pages() */ | ||
43 | spin_unlock(&zbpg->lock); | ||
44 | + spin_unlock(&zbud_budlists_spinlock); | ||
45 | return; | ||
46 | } | ||
47 | size = zbud_free(zh); | ||
48 | @@ -310,7 +312,6 @@ static void zbud_free_and_delist(struct zbud_hdr *zh) | ||
49 | zh_other = &zbpg->buddy[(budnum == 0) ? 1 : 0]; | ||
50 | if (zh_other->size == 0) { /* was unbuddied: unlist and free */ | ||
51 | chunks = zbud_size_to_chunks(size) ; | ||
52 | - spin_lock(&zbud_budlists_spinlock); | ||
53 | BUG_ON(list_empty(&zbud_unbuddied[chunks].list)); | ||
54 | list_del_init(&zbpg->bud_list); | ||
55 | zbud_unbuddied[chunks].count--; | ||
56 | @@ -318,7 +319,6 @@ static void zbud_free_and_delist(struct zbud_hdr *zh) | ||
57 | zbud_free_raw_page(zbpg); | ||
58 | } else { /* was buddied: move remaining buddy to unbuddied list */ | ||
59 | chunks = zbud_size_to_chunks(zh_other->size) ; | ||
60 | - spin_lock(&zbud_budlists_spinlock); | ||
61 | list_del_init(&zbpg->bud_list); | ||
62 | zcache_zbud_buddied_count--; | ||
63 | list_add_tail(&zbpg->bud_list, &zbud_unbuddied[chunks].list); | ||
64 | -- | ||
65 | 1.7.9.4 | ||
66 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0006-USB-ftdi_sio-fix-problem-when-the-manufacture-is-a-N.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0006-USB-ftdi_sio-fix-problem-when-the-manufacture-is-a-N.patch new file mode 100644 index 00000000..b22cdfb5 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0006-USB-ftdi_sio-fix-problem-when-the-manufacture-is-a-N.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | From 662c920fb175331db0c7813edd168390b51d3e31 Mon Sep 17 00:00:00 2001 | ||
2 | From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
3 | Date: Tue, 28 Feb 2012 09:20:09 -0800 | ||
4 | Subject: [PATCH 006/147] USB: ftdi_sio: fix problem when the manufacture is a | ||
5 | NULL string | ||
6 | |||
7 | commit 656d2b3964a9d0f9864d472f8dfa2dd7dd42e6c0 upstream. | ||
8 | |||
9 | On some misconfigured ftdi_sio devices, if the manufacturer string is | ||
10 | NULL, the kernel will oops when the device is plugged in. This patch | ||
11 | fixes the problem. | ||
12 | |||
13 | Reported-by: Wojciech M Zabolotny <W.Zabolotny@elka.pw.edu.pl> | ||
14 | Tested-by: Wojciech M Zabolotny <W.Zabolotny@elka.pw.edu.pl> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/usb/serial/ftdi_sio.c | 3 ++- | ||
18 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
19 | |||
20 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
21 | index f030471..d170b2a 100644 | ||
22 | --- a/drivers/usb/serial/ftdi_sio.c | ||
23 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
24 | @@ -1763,7 +1763,8 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) | ||
25 | |||
26 | dbg("%s", __func__); | ||
27 | |||
28 | - if (strcmp(udev->manufacturer, "CALAO Systems") == 0) | ||
29 | + if ((udev->manufacturer) && | ||
30 | + (strcmp(udev->manufacturer, "CALAO Systems") == 0)) | ||
31 | return ftdi_jtag_probe(serial); | ||
32 | |||
33 | return 0; | ||
34 | -- | ||
35 | 1.7.9.4 | ||
36 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0007-USB-ftdi_sio-add-support-for-BeagleBone-rev-A5.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0007-USB-ftdi_sio-add-support-for-BeagleBone-rev-A5.patch new file mode 100644 index 00000000..f87f426a --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0007-USB-ftdi_sio-add-support-for-BeagleBone-rev-A5.patch | |||
@@ -0,0 +1,35 @@ | |||
1 | From 5cabeb029a6230a2ade6a4e6821f444cc40816dd Mon Sep 17 00:00:00 2001 | ||
2 | From: Peter Korsgaard <jacmet@sunsite.dk> | ||
3 | Date: Wed, 29 Feb 2012 10:05:37 +0100 | ||
4 | Subject: [PATCH 007/147] USB: ftdi_sio: add support for BeagleBone rev A5+ | ||
5 | |||
6 | commit 444aa7fa9bd752d19ce472d3e02558b987c3cc67 upstream. | ||
7 | |||
8 | BeagleBone changed to the default FTDI 0403:6010 id in rev A5 to make life | ||
9 | easier for Windows users, so we need a similar workaround as the Calao | ||
10 | board to support it. | ||
11 | |||
12 | Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/serial/ftdi_sio.c | 4 ++-- | ||
16 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
19 | index d170b2a..30839d4 100644 | ||
20 | --- a/drivers/usb/serial/ftdi_sio.c | ||
21 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
22 | @@ -1763,8 +1763,8 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) | ||
23 | |||
24 | dbg("%s", __func__); | ||
25 | |||
26 | - if ((udev->manufacturer) && | ||
27 | - (strcmp(udev->manufacturer, "CALAO Systems") == 0)) | ||
28 | + if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || | ||
29 | + (udev->product && !strcmp(udev->product, "BeagleBone/XDS100"))) | ||
30 | return ftdi_jtag_probe(serial); | ||
31 | |||
32 | return 0; | ||
33 | -- | ||
34 | 1.7.9.4 | ||
35 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0008-USB-Microchip-VID-mislabeled-as-Hornby-VID-in-ftdi_s.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0008-USB-Microchip-VID-mislabeled-as-Hornby-VID-in-ftdi_s.patch new file mode 100644 index 00000000..7278bddf --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0008-USB-Microchip-VID-mislabeled-as-Hornby-VID-in-ftdi_s.patch | |||
@@ -0,0 +1,61 @@ | |||
1 | From f2f8f7f7d9dfc406b8e5a9a1b89e904318c8ac0f Mon Sep 17 00:00:00 2001 | ||
2 | From: Bruno Thomsen <bruno.thomsen@gmail.com> | ||
3 | Date: Sun, 4 Mar 2012 15:19:14 +0100 | ||
4 | Subject: [PATCH 008/147] USB: Microchip VID mislabeled as Hornby VID in | ||
5 | ftdi_sio. | ||
6 | |||
7 | commit c1cee1d84001815a1b4321c49b995254c0df3100 upstream. | ||
8 | |||
9 | Microchip VID (0x04d8) was mislabeled as Hornby VID according to USB-IDs. | ||
10 | |||
11 | A Full Speed USB Demo Board PID (0x000a) was mislabeled as | ||
12 | Hornby Elite (an Digital Command Controller Console for model railways). | ||
13 | |||
14 | Most likely the Hornby based their design on | ||
15 | PIC18F87J50 Full Speed USB Demo Board. | ||
16 | |||
17 | Signed-off-by: Bruno Thomsen <bruno.thomsen@gmail.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/usb/serial/ftdi_sio.c | 2 +- | ||
21 | drivers/usb/serial/ftdi_sio_ids.h | 10 +++++++--- | ||
22 | 2 files changed, 8 insertions(+), 4 deletions(-) | ||
23 | |||
24 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
25 | index 30839d4..363e995 100644 | ||
26 | --- a/drivers/usb/serial/ftdi_sio.c | ||
27 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
28 | @@ -797,7 +797,7 @@ static struct usb_device_id id_table_combined [] = { | ||
29 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
30 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), | ||
31 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
32 | - { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) }, | ||
33 | + { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) }, | ||
34 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, | ||
35 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), | ||
36 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
37 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
38 | index 4eb7715..df87939 100644 | ||
39 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
40 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
41 | @@ -532,10 +532,14 @@ | ||
42 | #define ADI_GNICEPLUS_PID 0xF001 | ||
43 | |||
44 | /* | ||
45 | - * Hornby Elite | ||
46 | + * Microchip Technology, Inc. | ||
47 | + * | ||
48 | + * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are also used by: | ||
49 | + * Hornby Elite - Digital Command Control Console | ||
50 | + * http://www.hornby.com/hornby-dcc/controllers/ | ||
51 | */ | ||
52 | -#define HORNBY_VID 0x04D8 | ||
53 | -#define HORNBY_ELITE_PID 0x000A | ||
54 | +#define MICROCHIP_VID 0x04D8 | ||
55 | +#define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */ | ||
56 | |||
57 | /* | ||
58 | * RATOC REX-USB60F | ||
59 | -- | ||
60 | 1.7.9.4 | ||
61 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0009-USB-ftdi_sio-new-PID-Distortec-JTAG-lock-pick.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0009-USB-ftdi_sio-new-PID-Distortec-JTAG-lock-pick.patch new file mode 100644 index 00000000..08fa95ca --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0009-USB-ftdi_sio-new-PID-Distortec-JTAG-lock-pick.patch | |||
@@ -0,0 +1,46 @@ | |||
1 | From 42eb98a4b9dc721f8565ce0d3063db8d141f516b Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Micha=C5=82=20Wr=C3=B3bel?= <michal.wrobel@flytronic.pl> | ||
3 | Date: Fri, 9 Mar 2012 14:40:18 +0100 | ||
4 | Subject: [PATCH 009/147] USB: ftdi_sio: new PID: Distortec JTAG-lock-pick | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit 47594d5528f28a4c025c2955c68104c75815637c upstream. | ||
10 | |||
11 | Signed-off-by: Micha?? Wr??bel <michal.wrobel@flytronic.pl> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | drivers/usb/serial/ftdi_sio.c | 2 ++ | ||
15 | drivers/usb/serial/ftdi_sio_ids.h | 2 ++ | ||
16 | 2 files changed, 4 insertions(+) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
19 | index 363e995..a319eaa 100644 | ||
20 | --- a/drivers/usb/serial/ftdi_sio.c | ||
21 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
22 | @@ -846,6 +846,8 @@ static struct usb_device_id id_table_combined [] = { | ||
23 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | ||
24 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | ||
25 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | ||
26 | + { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
27 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
28 | { }, /* Optional parameter entry */ | ||
29 | { } /* Terminating entry */ | ||
30 | }; | ||
31 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
32 | index df87939..bed1b1f 100644 | ||
33 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
34 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
35 | @@ -97,6 +97,8 @@ | ||
36 | #define FTDI_TACTRIX_OPENPORT_13S_PID 0xCC49 /* OpenPort 1.3 Subaru */ | ||
37 | #define FTDI_TACTRIX_OPENPORT_13U_PID 0xCC4A /* OpenPort 1.3 Universal */ | ||
38 | |||
39 | +#define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID 0xCFF8 | ||
40 | + | ||
41 | /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */ | ||
42 | /* the VID is the standard ftdi vid (FTDI_VID) */ | ||
43 | #define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */ | ||
44 | -- | ||
45 | 1.7.9.4 | ||
46 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0010-USB-ftdi_sio-add-support-for-FT-X-series-devices.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0010-USB-ftdi_sio-add-support-for-FT-X-series-devices.patch new file mode 100644 index 00000000..37f665bd --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0010-USB-ftdi_sio-add-support-for-FT-X-series-devices.patch | |||
@@ -0,0 +1,150 @@ | |||
1 | From a1460f8a00ab8864ee14c39d4dfaa0dea4cff95e Mon Sep 17 00:00:00 2001 | ||
2 | From: Jim Paris <jim@jtan.com> | ||
3 | Date: Wed, 14 Mar 2012 17:54:25 -0400 | ||
4 | Subject: [PATCH 010/147] USB: ftdi_sio: add support for FT-X series devices | ||
5 | |||
6 | commit dc0827c128c0ee5a58b822b99d662b59f4b8e970 upstream. | ||
7 | |||
8 | Add PID 0x6015, corresponding to the new series of FT-X chips | ||
9 | (FT220XD, FT201X, FT220X, FT221X, FT230X, FT231X, FT240X). They all | ||
10 | appear as serial devices, and seem indistinguishable except for the | ||
11 | default product string stored in their EEPROM. The baudrate | ||
12 | generation matches FT232RL devices. | ||
13 | |||
14 | Tested with a FT201X and FT230X at various baudrates (100 - 3000000). | ||
15 | |||
16 | Sample dmesg: | ||
17 | ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver | ||
18 | usb 2-1: new full-speed USB device number 6 using ohci_hcd | ||
19 | usb 2-1: New USB device found, idVendor=0403, idProduct=6015 | ||
20 | usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 | ||
21 | usb 2-1: Product: FT230X USB Half UART | ||
22 | usb 2-1: Manufacturer: FTDI | ||
23 | usb 2-1: SerialNumber: DC001WI6 | ||
24 | ftdi_sio 2-1:1.0: FTDI USB Serial Device converter detected | ||
25 | drivers/usb/serial/ftdi_sio.c: ftdi_sio_port_probe | ||
26 | drivers/usb/serial/ftdi_sio.c: ftdi_determine_type: bcdDevice = 0x1000, bNumInterfaces = 1 | ||
27 | usb 2-1: Detected FT-X | ||
28 | usb 2-1: Number of endpoints 2 | ||
29 | usb 2-1: Endpoint 1 MaxPacketSize 64 | ||
30 | usb 2-1: Endpoint 2 MaxPacketSize 64 | ||
31 | usb 2-1: Setting MaxPacketSize 64 | ||
32 | drivers/usb/serial/ftdi_sio.c: read_latency_timer | ||
33 | drivers/usb/serial/ftdi_sio.c: write_latency_timer: setting latency timer = 1 | ||
34 | drivers/usb/serial/ftdi_sio.c: create_sysfs_attrs | ||
35 | drivers/usb/serial/ftdi_sio.c: sysfs attributes for FT-X | ||
36 | usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0 | ||
37 | |||
38 | Signed-off-by: Jim Paris <jim@jtan.com> | ||
39 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
40 | --- | ||
41 | drivers/usb/serial/ftdi_sio.c | 20 +++++++++++++++----- | ||
42 | drivers/usb/serial/ftdi_sio.h | 3 ++- | ||
43 | drivers/usb/serial/ftdi_sio_ids.h | 1 + | ||
44 | 3 files changed, 18 insertions(+), 6 deletions(-) | ||
45 | |||
46 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
47 | index a319eaa..b64fddc 100644 | ||
48 | --- a/drivers/usb/serial/ftdi_sio.c | ||
49 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
50 | @@ -188,6 +188,7 @@ static struct usb_device_id id_table_combined [] = { | ||
51 | .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk }, | ||
52 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | ||
53 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | ||
54 | + { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) }, | ||
55 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | ||
56 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | ||
57 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | ||
58 | @@ -870,7 +871,8 @@ static const char *ftdi_chip_name[] = { | ||
59 | [FT232RL] = "FT232RL", | ||
60 | [FT2232H] = "FT2232H", | ||
61 | [FT4232H] = "FT4232H", | ||
62 | - [FT232H] = "FT232H" | ||
63 | + [FT232H] = "FT232H", | ||
64 | + [FTX] = "FT-X" | ||
65 | }; | ||
66 | |||
67 | |||
68 | @@ -1171,7 +1173,8 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | ||
69 | break; | ||
70 | case FT232BM: /* FT232BM chip */ | ||
71 | case FT2232C: /* FT2232C chip */ | ||
72 | - case FT232RL: | ||
73 | + case FT232RL: /* FT232RL chip */ | ||
74 | + case FTX: /* FT-X series */ | ||
75 | if (baud <= 3000000) { | ||
76 | __u16 product_id = le16_to_cpu( | ||
77 | port->serial->dev->descriptor.idProduct); | ||
78 | @@ -1460,10 +1463,14 @@ static void ftdi_determine_type(struct usb_serial_port *port) | ||
79 | } else if (version < 0x900) { | ||
80 | /* Assume it's an FT232RL */ | ||
81 | priv->chip_type = FT232RL; | ||
82 | - } else { | ||
83 | + } else if (version < 0x1000) { | ||
84 | /* Assume it's an FT232H */ | ||
85 | priv->chip_type = FT232H; | ||
86 | + } else { | ||
87 | + /* Assume it's an FT-X series device */ | ||
88 | + priv->chip_type = FTX; | ||
89 | } | ||
90 | + | ||
91 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); | ||
92 | } | ||
93 | |||
94 | @@ -1591,7 +1598,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) | ||
95 | priv->chip_type == FT232RL || | ||
96 | priv->chip_type == FT2232H || | ||
97 | priv->chip_type == FT4232H || | ||
98 | - priv->chip_type == FT232H)) { | ||
99 | + priv->chip_type == FT232H || | ||
100 | + priv->chip_type == FTX)) { | ||
101 | retval = device_create_file(&port->dev, | ||
102 | &dev_attr_latency_timer); | ||
103 | } | ||
104 | @@ -1613,7 +1621,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | ||
105 | priv->chip_type == FT232RL || | ||
106 | priv->chip_type == FT2232H || | ||
107 | priv->chip_type == FT4232H || | ||
108 | - priv->chip_type == FT232H) { | ||
109 | + priv->chip_type == FT232H || | ||
110 | + priv->chip_type == FTX) { | ||
111 | device_remove_file(&port->dev, &dev_attr_latency_timer); | ||
112 | } | ||
113 | } | ||
114 | @@ -2287,6 +2296,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) | ||
115 | case FT2232H: | ||
116 | case FT4232H: | ||
117 | case FT232H: | ||
118 | + case FTX: | ||
119 | len = 2; | ||
120 | break; | ||
121 | default: | ||
122 | diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h | ||
123 | index 19584fa..ed58c6f 100644 | ||
124 | --- a/drivers/usb/serial/ftdi_sio.h | ||
125 | +++ b/drivers/usb/serial/ftdi_sio.h | ||
126 | @@ -157,7 +157,8 @@ enum ftdi_chip_type { | ||
127 | FT232RL = 5, | ||
128 | FT2232H = 6, | ||
129 | FT4232H = 7, | ||
130 | - FT232H = 8 | ||
131 | + FT232H = 8, | ||
132 | + FTX = 9, | ||
133 | }; | ||
134 | |||
135 | enum ftdi_sio_baudrate { | ||
136 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
137 | index bed1b1f..ac1c42e 100644 | ||
138 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
139 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
140 | @@ -23,6 +23,7 @@ | ||
141 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ | ||
142 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ | ||
143 | #define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ | ||
144 | +#define FTDI_FTX_PID 0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */ | ||
145 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ | ||
146 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ | ||
147 | |||
148 | -- | ||
149 | 1.7.9.4 | ||
150 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0011-USB-ftdi_sio-new-PID-LUMEL-PD12.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0011-USB-ftdi_sio-new-PID-LUMEL-PD12.patch new file mode 100644 index 00000000..4af208d0 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0011-USB-ftdi_sio-new-PID-LUMEL-PD12.patch | |||
@@ -0,0 +1,45 @@ | |||
1 | From f1a77f929e5e9c5399bf0e0a589280719f96654c Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Micha=C5=82=20Wr=C3=B3bel?= <michal.wrobel@flytronic.pl> | ||
3 | Date: Thu, 15 Mar 2012 17:24:04 +0100 | ||
4 | Subject: [PATCH 011/147] USB: ftdi_sio: new PID: LUMEL PD12 | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit 57e596f3af88ef52dea9640ed5e34ecd38893a02 upstream. | ||
10 | |||
11 | Signed-off-by: Micha?? Wr??bel <michal.wrobel@flytronic.pl> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | drivers/usb/serial/ftdi_sio.c | 1 + | ||
15 | drivers/usb/serial/ftdi_sio_ids.h | 2 ++ | ||
16 | 2 files changed, 3 insertions(+) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
19 | index b64fddc..3f3ccf6 100644 | ||
20 | --- a/drivers/usb/serial/ftdi_sio.c | ||
21 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
22 | @@ -849,6 +849,7 @@ static struct usb_device_id id_table_combined [] = { | ||
23 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | ||
24 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
25 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
26 | + { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, | ||
27 | { }, /* Optional parameter entry */ | ||
28 | { } /* Terminating entry */ | ||
29 | }; | ||
30 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
31 | index ac1c42e..abf6bbc 100644 | ||
32 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
33 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
34 | @@ -30,6 +30,8 @@ | ||
35 | |||
36 | /*** third-party PIDs (using FTDI_VID) ***/ | ||
37 | |||
38 | +#define FTDI_LUMEL_PD12_PID 0x6002 | ||
39 | + | ||
40 | /* | ||
41 | * Marvell OpenRD Base, Client | ||
42 | * http://www.open-rd.org | ||
43 | -- | ||
44 | 1.7.9.4 | ||
45 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0012-powerpc-usb-fix-bug-of-kernel-hang-when-initializing.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0012-powerpc-usb-fix-bug-of-kernel-hang-when-initializing.patch new file mode 100644 index 00000000..f40aa0f0 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0012-powerpc-usb-fix-bug-of-kernel-hang-when-initializing.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | From 9091aa838fdba8fef22a629f43cd039daa714da6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Shengzhou Liu <Shengzhou.Liu@freescale.com> | ||
3 | Date: Thu, 16 Feb 2012 18:02:20 +0800 | ||
4 | Subject: [PATCH 012/147] powerpc/usb: fix bug of kernel hang when | ||
5 | initializing usb | ||
6 | |||
7 | commit 28c56ea1431421dec51b7b229369e991481453df upstream. | ||
8 | |||
9 | If USB UTMI PHY is not enable, writing to portsc register will lead to | ||
10 | kernel hang during boot up. | ||
11 | |||
12 | Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com> | ||
13 | Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/usb/host/ehci-fsl.c | 4 ++++ | ||
17 | drivers/usb/host/ehci-fsl.h | 1 + | ||
18 | 2 files changed, 5 insertions(+) | ||
19 | |||
20 | diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c | ||
21 | index b556a72..da487fd 100644 | ||
22 | --- a/drivers/usb/host/ehci-fsl.c | ||
23 | +++ b/drivers/usb/host/ehci-fsl.c | ||
24 | @@ -216,6 +216,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | ||
25 | unsigned int port_offset) | ||
26 | { | ||
27 | u32 portsc; | ||
28 | + struct usb_hcd *hcd = ehci_to_hcd(ehci); | ||
29 | + void __iomem *non_ehci = hcd->regs; | ||
30 | |||
31 | portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]); | ||
32 | portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW); | ||
33 | @@ -231,6 +233,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | ||
34 | portsc |= PORT_PTS_PTW; | ||
35 | /* fall through */ | ||
36 | case FSL_USB2_PHY_UTMI: | ||
37 | + /* enable UTMI PHY */ | ||
38 | + setbits32(non_ehci + FSL_SOC_USB_CTRL, CTRL_UTMI_PHY_EN); | ||
39 | portsc |= PORT_PTS_UTMI; | ||
40 | break; | ||
41 | case FSL_USB2_PHY_NONE: | ||
42 | diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h | ||
43 | index 4918062..bea5013 100644 | ||
44 | --- a/drivers/usb/host/ehci-fsl.h | ||
45 | +++ b/drivers/usb/host/ehci-fsl.h | ||
46 | @@ -45,5 +45,6 @@ | ||
47 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ | ||
48 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ | ||
49 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ | ||
50 | +#define CTRL_UTMI_PHY_EN (1<<9) | ||
51 | #define SNOOP_SIZE_2GB 0x1e | ||
52 | #endif /* _EHCI_FSL_H */ | ||
53 | -- | ||
54 | 1.7.9.4 | ||
55 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0013-staging-r8712u-Add-missing-initialization-and-remove.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0013-staging-r8712u-Add-missing-initialization-and-remove.patch new file mode 100644 index 00000000..a659fd50 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0013-staging-r8712u-Add-missing-initialization-and-remove.patch | |||
@@ -0,0 +1,107 @@ | |||
1 | From 737186258370f25f44b7aa152ae1bef1e308a929 Mon Sep 17 00:00:00 2001 | ||
2 | From: Larry Finger <Larry.Finger@lwfinger.net> | ||
3 | Date: Thu, 9 Feb 2012 16:37:17 -0600 | ||
4 | Subject: [PATCH 013/147] staging: r8712u: Add missing initialization and | ||
5 | remove configuration parameter CONFIG_R8712_AP | ||
6 | |||
7 | commit 073863432f7eaa23c7c09733414d4be2eabf5eef upstream. | ||
8 | |||
9 | When this driver was upgraded to the vendor 20100831 version in | ||
10 | commit 93c55dda092c7 et al,, one listhead initialization was missed. | ||
11 | This broke complete operation of the driver whenever AP mode was | ||
12 | enabled. This fixes https://bugs.archlinux.org/task/27996. | ||
13 | |||
14 | The configuration parameter R8712_AP is misleading as the driver cannot | ||
15 | function as an AP without a heavily hacked version of hostapd. Thus, it | ||
16 | makes sense to remove the parameter; however the code and data configured | ||
17 | for the option is left in. | ||
18 | |||
19 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | drivers/staging/rtl8712/Kconfig | 7 ------- | ||
23 | drivers/staging/rtl8712/rtl871x_sta_mgt.c | 5 +---- | ||
24 | drivers/staging/rtl8712/sta_info.h | 4 ---- | ||
25 | 3 files changed, 1 insertion(+), 15 deletions(-) | ||
26 | |||
27 | diff --git a/drivers/staging/rtl8712/Kconfig b/drivers/staging/rtl8712/Kconfig | ||
28 | index ea37473..6a43312 100644 | ||
29 | --- a/drivers/staging/rtl8712/Kconfig | ||
30 | +++ b/drivers/staging/rtl8712/Kconfig | ||
31 | @@ -9,13 +9,6 @@ config R8712U | ||
32 | This option adds the Realtek RTL8712 USB device such as the D-Link DWA-130. | ||
33 | If built as a module, it will be called r8712u. | ||
34 | |||
35 | -config R8712_AP | ||
36 | - bool "Realtek RTL8712U AP code" | ||
37 | - depends on R8712U | ||
38 | - default N | ||
39 | - ---help--- | ||
40 | - This option allows the Realtek RTL8712 USB device to be an Access Point. | ||
41 | - | ||
42 | config R8712_TX_AGGR | ||
43 | bool "Realtek RTL8712U Transmit Aggregation code" | ||
44 | depends on R8712U && BROKEN | ||
45 | diff --git a/drivers/staging/rtl8712/rtl871x_sta_mgt.c b/drivers/staging/rtl8712/rtl871x_sta_mgt.c | ||
46 | index 64f5696..1247b3d 100644 | ||
47 | --- a/drivers/staging/rtl8712/rtl871x_sta_mgt.c | ||
48 | +++ b/drivers/staging/rtl8712/rtl871x_sta_mgt.c | ||
49 | @@ -42,9 +42,8 @@ static void _init_stainfo(struct sta_info *psta) | ||
50 | _init_listhead(&psta->hash_list); | ||
51 | _r8712_init_sta_xmit_priv(&psta->sta_xmitpriv); | ||
52 | _r8712_init_sta_recv_priv(&psta->sta_recvpriv); | ||
53 | -#ifdef CONFIG_R8712_AP | ||
54 | + _init_listhead(&psta->asoc_list); | ||
55 | _init_listhead(&psta->auth_list); | ||
56 | -#endif | ||
57 | } | ||
58 | |||
59 | u32 _r8712_init_sta_priv(struct sta_priv *pstapriv) | ||
60 | @@ -71,10 +70,8 @@ u32 _r8712_init_sta_priv(struct sta_priv *pstapriv) | ||
61 | get_list_head(&pstapriv->free_sta_queue)); | ||
62 | psta++; | ||
63 | } | ||
64 | -#ifdef CONFIG_R8712_AP | ||
65 | _init_listhead(&pstapriv->asoc_list); | ||
66 | _init_listhead(&pstapriv->auth_list); | ||
67 | -#endif | ||
68 | return _SUCCESS; | ||
69 | } | ||
70 | |||
71 | diff --git a/drivers/staging/rtl8712/sta_info.h b/drivers/staging/rtl8712/sta_info.h | ||
72 | index 48d6a14..f8016e9 100644 | ||
73 | --- a/drivers/staging/rtl8712/sta_info.h | ||
74 | +++ b/drivers/staging/rtl8712/sta_info.h | ||
75 | @@ -90,7 +90,6 @@ struct sta_info { | ||
76 | * curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO | ||
77 | * sta_info: (AP & STA) CAP/INFO | ||
78 | */ | ||
79 | -#ifdef CONFIG_R8712_AP | ||
80 | struct list_head asoc_list; | ||
81 | struct list_head auth_list; | ||
82 | unsigned int expire_to; | ||
83 | @@ -98,7 +97,6 @@ struct sta_info { | ||
84 | unsigned int authalg; | ||
85 | unsigned char chg_txt[128]; | ||
86 | unsigned int tx_ra_bitmap; | ||
87 | -#endif | ||
88 | }; | ||
89 | |||
90 | struct sta_priv { | ||
91 | @@ -111,13 +109,11 @@ struct sta_priv { | ||
92 | struct __queue sleep_q; | ||
93 | struct __queue wakeup_q; | ||
94 | struct _adapter *padapter; | ||
95 | -#ifdef CONFIG_R8712_AP | ||
96 | struct list_head asoc_list; | ||
97 | struct list_head auth_list; | ||
98 | unsigned int auth_to; /* sec, time to expire in authenticating. */ | ||
99 | unsigned int assoc_to; /* sec, time to expire before associating. */ | ||
100 | unsigned int expire_to; /* sec , time to expire after associated. */ | ||
101 | -#endif | ||
102 | }; | ||
103 | |||
104 | static inline u32 wifi_mac_hash(u8 *mac) | ||
105 | -- | ||
106 | 1.7.9.4 | ||
107 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0014-staging-r8712u-Fix-regression-introduced-by-commit-a.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0014-staging-r8712u-Fix-regression-introduced-by-commit-a.patch new file mode 100644 index 00000000..8a983e96 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0014-staging-r8712u-Fix-regression-introduced-by-commit-a.patch | |||
@@ -0,0 +1,53 @@ | |||
1 | From 10fcebe06f12c7f87ad05084848c51d69f118505 Mon Sep 17 00:00:00 2001 | ||
2 | From: Larry Finger <Larry.Finger@lwfinger.net> | ||
3 | Date: Sat, 25 Feb 2012 18:10:20 -0600 | ||
4 | Subject: [PATCH 014/147] staging: r8712u: Fix regression introduced by commit | ||
5 | a5ee652 | ||
6 | |||
7 | commit 9f4bc8cf3fe750ed093856a5f5d41c11cc12ad22 upstream. | ||
8 | |||
9 | In commit a5ee652 "staging: r8712u: Interface-state not fully tracked", | ||
10 | the private boolean "bup" was set false when the interface was brought down, | ||
11 | as that seemed appropriate. This change has not caused any problems when | ||
12 | using NetworkManager or manual control of the device; however, when wicd | ||
13 | control is used, there is a locking problem in wpa_supplicant, as shown in | ||
14 | https://bugzilla.kernel.org/show_bug.cgi?id=42818. | ||
15 | |||
16 | This fix reverts the only code change in commit a5ee652. My | ||
17 | analysis is that "bup" is badly named. In its present form, it | ||
18 | seems to indicate the up/down state of the device, but its usage | ||
19 | is more consistent with an initialized/uninitialized state. That | ||
20 | problem will be addressed in a later patch. | ||
21 | |||
22 | Note: Commit 8c213fa, which introdued asynchronous firmware loading | ||
23 | for this driver, exposed this bug to a greater extent. That bug | ||
24 | is addressed in the next patch in this series. | ||
25 | |||
26 | This bug is also responsible for the bug in | ||
27 | https://bugzilla.kernel.org/show_bug.cgi?id=42815. and this bug is | ||
28 | also part of the problems discussed at https://bugs.archlinux.org/task/27996#comment89950. | ||
29 | |||
30 | Tested-by: Alberto Lago Ballesteros <saniukeokusainaya@gmail.com> | ||
31 | Tested-by: Adrian <agib@gmx.de> | ||
32 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
33 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
34 | --- | ||
35 | drivers/staging/rtl8712/os_intfs.c | 2 -- | ||
36 | 1 file changed, 2 deletions(-) | ||
37 | |||
38 | diff --git a/drivers/staging/rtl8712/os_intfs.c b/drivers/staging/rtl8712/os_intfs.c | ||
39 | index 98a3d68..fb11743 100644 | ||
40 | --- a/drivers/staging/rtl8712/os_intfs.c | ||
41 | +++ b/drivers/staging/rtl8712/os_intfs.c | ||
42 | @@ -476,8 +476,6 @@ static int netdev_close(struct net_device *pnetdev) | ||
43 | r8712_free_assoc_resources(padapter); | ||
44 | /*s2-4.*/ | ||
45 | r8712_free_network_queue(padapter); | ||
46 | - /* The interface is no longer Up: */ | ||
47 | - padapter->bup = false; | ||
48 | release_firmware(padapter->fw); | ||
49 | /* never exit with a firmware callback pending */ | ||
50 | wait_for_completion(&padapter->rtl8712_fw_ready); | ||
51 | -- | ||
52 | 1.7.9.4 | ||
53 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0015-staging-r8712u-Fix-regression-in-signal-level-after-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0015-staging-r8712u-Fix-regression-in-signal-level-after-.patch new file mode 100644 index 00000000..9cf3b16f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0015-staging-r8712u-Fix-regression-in-signal-level-after-.patch | |||
@@ -0,0 +1,47 @@ | |||
1 | From a8385f8f3089aba9d0d9b0faf580e89510648367 Mon Sep 17 00:00:00 2001 | ||
2 | From: Larry Finger <Larry.Finger@lwfinger.net> | ||
3 | Date: Sun, 26 Feb 2012 22:08:36 -0600 | ||
4 | Subject: [PATCH 015/147] staging: r8712u: Fix regression in signal level | ||
5 | after commit c6dc001 | ||
6 | |||
7 | commit da3e6ec2f443ac00aa623c5921e3521f5f38efe4 upstream. | ||
8 | |||
9 | In commit c6dc001 "staging: r8712u: Merging Realtek's latest (v2.6.6). | ||
10 | Various fixes", the returned qual.qual member of the iw_statistics | ||
11 | struct was changed. For strong signals, this change made no difference; | ||
12 | however for medium and weak signals it results in a low signal that | ||
13 | shows considerable fluctuation, When using wicd for a medium-strength | ||
14 | AP, the value reported in the status line is reduced from 100% to 60% by | ||
15 | this bug. | ||
16 | |||
17 | This problem is reported in https://bugzilla.kernel.org/show_bug.cgi?id=42826. | ||
18 | |||
19 | Reported-and-tested-by: Robert Crawford <wrc1944@gmail.com> | ||
20 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | drivers/staging/rtl8712/rtl871x_ioctl_linux.c | 8 +------- | ||
24 | 1 file changed, 1 insertion(+), 7 deletions(-) | ||
25 | |||
26 | diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
27 | index 507584b8..ef35bc2 100644 | ||
28 | --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
29 | +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
30 | @@ -2380,13 +2380,7 @@ static struct iw_statistics *r871x_get_wireless_stats(struct net_device *dev) | ||
31 | tmp_qual = padapter->recvpriv.signal; | ||
32 | tmp_noise = padapter->recvpriv.noise; | ||
33 | piwstats->qual.level = tmp_level; | ||
34 | - /*piwstats->qual.qual = tmp_qual; | ||
35 | - * The NetworkManager of Fedora 10, 13 will use the link | ||
36 | - * quality for its display. | ||
37 | - * So, use the fw_rssi on link quality variable because | ||
38 | - * fw_rssi will be updated per 2 seconds. | ||
39 | - */ | ||
40 | - piwstats->qual.qual = tmp_level; | ||
41 | + piwstats->qual.qual = tmp_qual; | ||
42 | piwstats->qual.noise = tmp_noise; | ||
43 | } | ||
44 | piwstats->qual.updated = IW_QUAL_ALL_UPDATED; | ||
45 | -- | ||
46 | 1.7.9.4 | ||
47 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0016-usb-dwc3-fix-bogus-test-in-dwc3_gadget_start_isoc.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0016-usb-dwc3-fix-bogus-test-in-dwc3_gadget_start_isoc.patch new file mode 100644 index 00000000..22a9c5cd --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0016-usb-dwc3-fix-bogus-test-in-dwc3_gadget_start_isoc.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From 0a7695bc47ddfdeaaa1b30b88912f38a481e3abd Mon Sep 17 00:00:00 2001 | ||
2 | From: Paul Zimmerman <Paul.Zimmerman@synopsys.com> | ||
3 | Date: Fri, 17 Feb 2012 14:10:16 -0800 | ||
4 | Subject: [PATCH 016/147] usb: dwc3: fix bogus test in dwc3_gadget_start_isoc | ||
5 | |||
6 | commit 9bafa56c7cee5c6fa68de5924220abb220c7e229 upstream. | ||
7 | |||
8 | Zero is a valid value for a microframe number. So remove the bogus | ||
9 | test for non-zero in dwc3_gadget_start_isoc(). | ||
10 | |||
11 | Signed-off-by: Paul Zimmerman <paulz@synopsys.com> | ||
12 | Signed-off-by: Felipe Balbi <balbi@ti.com> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/dwc3/gadget.c | 16 +++++----------- | ||
16 | 1 file changed, 5 insertions(+), 11 deletions(-) | ||
17 | |||
18 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
19 | index 5802720..41a2ea6 100644 | ||
20 | --- a/drivers/usb/dwc3/gadget.c | ||
21 | +++ b/drivers/usb/dwc3/gadget.c | ||
22 | @@ -1405,7 +1405,7 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc, | ||
23 | static void dwc3_gadget_start_isoc(struct dwc3 *dwc, | ||
24 | struct dwc3_ep *dep, const struct dwc3_event_depevt *event) | ||
25 | { | ||
26 | - u32 uf; | ||
27 | + u32 uf, mask; | ||
28 | |||
29 | if (list_empty(&dep->request_list)) { | ||
30 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", | ||
31 | @@ -1413,16 +1413,10 @@ static void dwc3_gadget_start_isoc(struct dwc3 *dwc, | ||
32 | return; | ||
33 | } | ||
34 | |||
35 | - if (event->parameters) { | ||
36 | - u32 mask; | ||
37 | - | ||
38 | - mask = ~(dep->interval - 1); | ||
39 | - uf = event->parameters & mask; | ||
40 | - /* 4 micro frames in the future */ | ||
41 | - uf += dep->interval * 4; | ||
42 | - } else { | ||
43 | - uf = 0; | ||
44 | - } | ||
45 | + mask = ~(dep->interval - 1); | ||
46 | + uf = event->parameters & mask; | ||
47 | + /* 4 micro frames in the future */ | ||
48 | + uf += dep->interval * 4; | ||
49 | |||
50 | __dwc3_gadget_kick_transfer(dep, uf, 1); | ||
51 | } | ||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0017-usb-dwc3-use-proper-function-for-setting-endpoint-na.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0017-usb-dwc3-use-proper-function-for-setting-endpoint-na.patch new file mode 100644 index 00000000..582b9f92 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0017-usb-dwc3-use-proper-function-for-setting-endpoint-na.patch | |||
@@ -0,0 +1,46 @@ | |||
1 | From cdbcc2f017a258caca6390e7353709a6603bc452 Mon Sep 17 00:00:00 2001 | ||
2 | From: Anton Tikhomirov <av.tikhomirov@samsung.com> | ||
3 | Date: Thu, 23 Feb 2012 15:38:46 +0900 | ||
4 | Subject: [PATCH 017/147] usb: dwc3: use proper function for setting endpoint | ||
5 | name | ||
6 | |||
7 | commit 27a78d6a283d6782438f72306746afe4bf44c215 upstream. | ||
8 | |||
9 | It's wrong to use the size of array as an argument for strncat. | ||
10 | Memory corruption is possible. strlcat is exactly what we need here. | ||
11 | |||
12 | Signed-off-by: Anton Tikhomirov <av.tikhomirov@samsung.com> | ||
13 | Signed-off-by: Felipe Balbi <balbi@ti.com> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/usb/dwc3/gadget.c | 8 ++++---- | ||
17 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
18 | |||
19 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
20 | index 41a2ea6..dfcda94 100644 | ||
21 | --- a/drivers/usb/dwc3/gadget.c | ||
22 | +++ b/drivers/usb/dwc3/gadget.c | ||
23 | @@ -449,16 +449,16 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep, | ||
24 | |||
25 | switch (usb_endpoint_type(desc)) { | ||
26 | case USB_ENDPOINT_XFER_CONTROL: | ||
27 | - strncat(dep->name, "-control", sizeof(dep->name)); | ||
28 | + strlcat(dep->name, "-control", sizeof(dep->name)); | ||
29 | break; | ||
30 | case USB_ENDPOINT_XFER_ISOC: | ||
31 | - strncat(dep->name, "-isoc", sizeof(dep->name)); | ||
32 | + strlcat(dep->name, "-isoc", sizeof(dep->name)); | ||
33 | break; | ||
34 | case USB_ENDPOINT_XFER_BULK: | ||
35 | - strncat(dep->name, "-bulk", sizeof(dep->name)); | ||
36 | + strlcat(dep->name, "-bulk", sizeof(dep->name)); | ||
37 | break; | ||
38 | case USB_ENDPOINT_XFER_INT: | ||
39 | - strncat(dep->name, "-int", sizeof(dep->name)); | ||
40 | + strlcat(dep->name, "-int", sizeof(dep->name)); | ||
41 | break; | ||
42 | default: | ||
43 | dev_err(dwc->dev, "invalid endpoint transfer type\n"); | ||
44 | -- | ||
45 | 1.7.9.4 | ||
46 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0018-usb-gadgetfs-return-number-of-bytes-on-ep0-read-requ.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0018-usb-gadgetfs-return-number-of-bytes-on-ep0-read-requ.patch new file mode 100644 index 00000000..c226f859 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0018-usb-gadgetfs-return-number-of-bytes-on-ep0-read-requ.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From 868208aaab0df10df8bff2cb3bc2ccae0fa0a16d Mon Sep 17 00:00:00 2001 | ||
2 | From: Thomas Faber <thfabba@gmx.de> | ||
3 | Date: Fri, 2 Mar 2012 09:41:50 +0100 | ||
4 | Subject: [PATCH 018/147] usb: gadgetfs: return number of bytes on ep0 read | ||
5 | request | ||
6 | |||
7 | commit 85b4b3c8c189e0159101f7628a71411af072ff69 upstream. | ||
8 | |||
9 | A read from GadgetFS endpoint 0 during the data stage of a control | ||
10 | request would always return 0 on success (as returned by | ||
11 | wait_event_interruptible) despite having written data into the user | ||
12 | buffer. | ||
13 | This patch makes it correctly set the return value to the number of | ||
14 | bytes read. | ||
15 | |||
16 | Signed-off-by: Thomas Faber <thfabba@gmx.de> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | drivers/usb/gadget/inode.c | 2 ++ | ||
20 | 1 file changed, 2 insertions(+) | ||
21 | |||
22 | diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c | ||
23 | index 9361251..2a96f57 100644 | ||
24 | --- a/drivers/usb/gadget/inode.c | ||
25 | +++ b/drivers/usb/gadget/inode.c | ||
26 | @@ -1043,6 +1043,8 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) | ||
27 | // FIXME don't call this with the spinlock held ... | ||
28 | if (copy_to_user (buf, dev->req->buf, len)) | ||
29 | retval = -EFAULT; | ||
30 | + else | ||
31 | + retval = len; | ||
32 | clean_req (dev->gadget->ep0, dev->req); | ||
33 | /* NOTE userspace can't yet choose to stall */ | ||
34 | } | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0019-USB-gadget-Make-g_hid-device-class-conform-to-spec.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0019-USB-gadget-Make-g_hid-device-class-conform-to-spec.patch new file mode 100644 index 00000000..4751b7fc --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0019-USB-gadget-Make-g_hid-device-class-conform-to-spec.patch | |||
@@ -0,0 +1,39 @@ | |||
1 | From 68f1d29a63c33ab9478d1d5b11d4ba522fa3d167 Mon Sep 17 00:00:00 2001 | ||
2 | From: Orjan Friberg <of@flatfrog.com> | ||
3 | Date: Wed, 7 Mar 2012 17:16:14 +0100 | ||
4 | Subject: [PATCH 019/147] USB: gadget: Make g_hid device class conform to | ||
5 | spec. | ||
6 | |||
7 | commit 33d2832ab0149a26418d360af3c444969a63fb28 upstream. | ||
8 | |||
9 | HID devices should specify this in their interface descriptors, not in the | ||
10 | device descriptor. This fixes a "missing hardware id" bug under Windows 7 with | ||
11 | a VIA VL800 (3.0) controller. | ||
12 | |||
13 | Signed-off-by: Orjan Friberg <of@flatfrog.com> | ||
14 | Cc: Felipe Balbi <balbi@ti.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/usb/gadget/hid.c | 6 +++--- | ||
18 | 1 file changed, 3 insertions(+), 3 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c | ||
21 | index f888c3e..3493adf 100644 | ||
22 | --- a/drivers/usb/gadget/hid.c | ||
23 | +++ b/drivers/usb/gadget/hid.c | ||
24 | @@ -60,9 +60,9 @@ static struct usb_device_descriptor device_desc = { | ||
25 | /* .bDeviceClass = USB_CLASS_COMM, */ | ||
26 | /* .bDeviceSubClass = 0, */ | ||
27 | /* .bDeviceProtocol = 0, */ | ||
28 | - .bDeviceClass = 0xEF, | ||
29 | - .bDeviceSubClass = 2, | ||
30 | - .bDeviceProtocol = 1, | ||
31 | + .bDeviceClass = USB_CLASS_PER_INTERFACE, | ||
32 | + .bDeviceSubClass = 0, | ||
33 | + .bDeviceProtocol = 0, | ||
34 | /* .bMaxPacketSize0 = f(hardware) */ | ||
35 | |||
36 | /* Vendor and product id can be overridden by module parameters. */ | ||
37 | -- | ||
38 | 1.7.9.4 | ||
39 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0020-futex-Cover-all-PI-opcodes-with-cmpxchg-enabled-chec.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0020-futex-Cover-all-PI-opcodes-with-cmpxchg-enabled-chec.patch new file mode 100644 index 00000000..878a9a50 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0020-futex-Cover-all-PI-opcodes-with-cmpxchg-enabled-chec.patch | |||
@@ -0,0 +1,64 @@ | |||
1 | From 67cc4b87ba54c6101c7fd5dbde9b2547463339d1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Thomas Gleixner <tglx@linutronix.de> | ||
3 | Date: Wed, 15 Feb 2012 12:08:34 +0100 | ||
4 | Subject: [PATCH 020/147] futex: Cover all PI opcodes with cmpxchg enabled | ||
5 | check | ||
6 | |||
7 | commit 59263b513c11398cd66a52d4c5b2b118ce1e0359 upstream. | ||
8 | |||
9 | Some of the newer futex PI opcodes do not check the cmpxchg enabled | ||
10 | variable and call unconditionally into the handling functions. Cover | ||
11 | all PI opcodes in a separate check. | ||
12 | |||
13 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
14 | Cc: Peter Zijlstra <peterz@infradead.org> | ||
15 | Cc: Darren Hart <dvhart@linux.intel.com> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | kernel/futex.c | 19 +++++++++++++------ | ||
19 | 1 file changed, 13 insertions(+), 6 deletions(-) | ||
20 | |||
21 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
22 | index 1614be2..0677023 100644 | ||
23 | --- a/kernel/futex.c | ||
24 | +++ b/kernel/futex.c | ||
25 | @@ -2641,6 +2641,16 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, | ||
26 | } | ||
27 | |||
28 | switch (cmd) { | ||
29 | + case FUTEX_LOCK_PI: | ||
30 | + case FUTEX_UNLOCK_PI: | ||
31 | + case FUTEX_TRYLOCK_PI: | ||
32 | + case FUTEX_WAIT_REQUEUE_PI: | ||
33 | + case FUTEX_CMP_REQUEUE_PI: | ||
34 | + if (!futex_cmpxchg_enabled) | ||
35 | + return -ENOSYS; | ||
36 | + } | ||
37 | + | ||
38 | + switch (cmd) { | ||
39 | case FUTEX_WAIT: | ||
40 | val3 = FUTEX_BITSET_MATCH_ANY; | ||
41 | case FUTEX_WAIT_BITSET: | ||
42 | @@ -2661,16 +2671,13 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, | ||
43 | ret = futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); | ||
44 | break; | ||
45 | case FUTEX_LOCK_PI: | ||
46 | - if (futex_cmpxchg_enabled) | ||
47 | - ret = futex_lock_pi(uaddr, flags, val, timeout, 0); | ||
48 | + ret = futex_lock_pi(uaddr, flags, val, timeout, 0); | ||
49 | break; | ||
50 | case FUTEX_UNLOCK_PI: | ||
51 | - if (futex_cmpxchg_enabled) | ||
52 | - ret = futex_unlock_pi(uaddr, flags); | ||
53 | + ret = futex_unlock_pi(uaddr, flags); | ||
54 | break; | ||
55 | case FUTEX_TRYLOCK_PI: | ||
56 | - if (futex_cmpxchg_enabled) | ||
57 | - ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); | ||
58 | + ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); | ||
59 | break; | ||
60 | case FUTEX_WAIT_REQUEUE_PI: | ||
61 | val3 = FUTEX_BITSET_MATCH_ANY; | ||
62 | -- | ||
63 | 1.7.9.4 | ||
64 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0021-sysfs-Fix-memory-leak-in-sysfs_sd_setsecdata.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0021-sysfs-Fix-memory-leak-in-sysfs_sd_setsecdata.patch new file mode 100644 index 00000000..5f58a38c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0021-sysfs-Fix-memory-leak-in-sysfs_sd_setsecdata.patch | |||
@@ -0,0 +1,92 @@ | |||
1 | From 58d245d715be41e6b0d736466a9589d75156f0ff Mon Sep 17 00:00:00 2001 | ||
2 | From: Masami Ichikawa <masami256@gmail.com> | ||
3 | Date: Tue, 21 Feb 2012 07:43:50 +0900 | ||
4 | Subject: [PATCH 021/147] sysfs: Fix memory leak in sysfs_sd_setsecdata(). | ||
5 | |||
6 | commit 93518dd2ebafcc761a8637b2877008cfd748c202 upstream. | ||
7 | |||
8 | This patch fixies follwing two memory leak patterns that reported by kmemleak. | ||
9 | sysfs_sd_setsecdata() is called during sys_lsetxattr() operation. | ||
10 | It checks sd->s_iattr is NULL or not. Then if it is NULL, it calls | ||
11 | sysfs_init_inode_attrs() to allocate memory. | ||
12 | That code is this. | ||
13 | |||
14 | iattrs = sd->s_iattr; | ||
15 | if (!iattrs) | ||
16 | iattrs = sysfs_init_inode_attrs(sd); | ||
17 | |||
18 | The iattrs recieves sysfs_init_inode_attrs()'s result, but sd->s_iattr | ||
19 | doesn't know the address. so it needs to set correct address to | ||
20 | sd->s_iattr to free memory in other function. | ||
21 | |||
22 | unreferenced object 0xffff880250b73e60 (size 32): | ||
23 | comm "systemd", pid 1, jiffies 4294683888 (age 94.553s) | ||
24 | hex dump (first 32 bytes): | ||
25 | 73 79 73 74 65 6d 5f 75 3a 6f 62 6a 65 63 74 5f system_u:object_ | ||
26 | 72 3a 73 79 73 66 73 5f 74 3a 73 30 00 00 00 00 r:sysfs_t:s0.... | ||
27 | backtrace: | ||
28 | [<ffffffff814cb1d0>] kmemleak_alloc+0x73/0x98 | ||
29 | [<ffffffff811270ab>] __kmalloc+0x100/0x12c | ||
30 | [<ffffffff8120775a>] context_struct_to_string+0x106/0x210 | ||
31 | [<ffffffff81207cc1>] security_sid_to_context_core+0x10b/0x129 | ||
32 | [<ffffffff812090ef>] security_sid_to_context+0x10/0x12 | ||
33 | [<ffffffff811fb0da>] selinux_inode_getsecurity+0x7d/0xa8 | ||
34 | [<ffffffff811fb127>] selinux_inode_getsecctx+0x22/0x2e | ||
35 | [<ffffffff811f4d62>] security_inode_getsecctx+0x16/0x18 | ||
36 | [<ffffffff81191dad>] sysfs_setxattr+0x96/0x117 | ||
37 | [<ffffffff811542f0>] __vfs_setxattr_noperm+0x73/0xd9 | ||
38 | [<ffffffff811543d9>] vfs_setxattr+0x83/0xa1 | ||
39 | [<ffffffff811544c6>] setxattr+0xcf/0x101 | ||
40 | [<ffffffff81154745>] sys_lsetxattr+0x6a/0x8f | ||
41 | [<ffffffff814efda9>] system_call_fastpath+0x16/0x1b | ||
42 | [<ffffffffffffffff>] 0xffffffffffffffff | ||
43 | unreferenced object 0xffff88024163c5a0 (size 96): | ||
44 | comm "systemd", pid 1, jiffies 4294683888 (age 94.553s) | ||
45 | hex dump (first 32 bytes): | ||
46 | 00 00 00 00 ed 41 00 00 00 00 00 00 00 00 00 00 .....A.......... | ||
47 | 00 00 00 00 00 00 00 00 0c 64 42 4f 00 00 00 00 .........dBO.... | ||
48 | backtrace: | ||
49 | [<ffffffff814cb1d0>] kmemleak_alloc+0x73/0x98 | ||
50 | [<ffffffff81127402>] kmem_cache_alloc_trace+0xc4/0xee | ||
51 | [<ffffffff81191cbe>] sysfs_init_inode_attrs+0x2a/0x83 | ||
52 | [<ffffffff81191dd6>] sysfs_setxattr+0xbf/0x117 | ||
53 | [<ffffffff811542f0>] __vfs_setxattr_noperm+0x73/0xd9 | ||
54 | [<ffffffff811543d9>] vfs_setxattr+0x83/0xa1 | ||
55 | [<ffffffff811544c6>] setxattr+0xcf/0x101 | ||
56 | [<ffffffff81154745>] sys_lsetxattr+0x6a/0x8f | ||
57 | [<ffffffff814efda9>] system_call_fastpath+0x16/0x1b | ||
58 | [<ffffffffffffffff>] 0xffffffffffffffff | ||
59 | ` | ||
60 | |||
61 | Signed-off-by: Masami Ichikawa <masami256@gmail.com> | ||
62 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
63 | --- | ||
64 | fs/sysfs/inode.c | 11 ++++++----- | ||
65 | 1 file changed, 6 insertions(+), 5 deletions(-) | ||
66 | |||
67 | diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c | ||
68 | index deb804b..9db61a4 100644 | ||
69 | --- a/fs/sysfs/inode.c | ||
70 | +++ b/fs/sysfs/inode.c | ||
71 | @@ -136,12 +136,13 @@ static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata, u32 *sec | ||
72 | void *old_secdata; | ||
73 | size_t old_secdata_len; | ||
74 | |||
75 | - iattrs = sd->s_iattr; | ||
76 | - if (!iattrs) | ||
77 | - iattrs = sysfs_init_inode_attrs(sd); | ||
78 | - if (!iattrs) | ||
79 | - return -ENOMEM; | ||
80 | + if (!sd->s_iattr) { | ||
81 | + sd->s_iattr = sysfs_init_inode_attrs(sd); | ||
82 | + if (!sd->s_iattr) | ||
83 | + return -ENOMEM; | ||
84 | + } | ||
85 | |||
86 | + iattrs = sd->s_iattr; | ||
87 | old_secdata = iattrs->ia_secdata; | ||
88 | old_secdata_len = iattrs->ia_secdata_len; | ||
89 | |||
90 | -- | ||
91 | 1.7.9.4 | ||
92 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0022-tty-moxa-fix-bit-test-in-moxa_start.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0022-tty-moxa-fix-bit-test-in-moxa_start.patch new file mode 100644 index 00000000..201e2b14 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0022-tty-moxa-fix-bit-test-in-moxa_start.patch | |||
@@ -0,0 +1,34 @@ | |||
1 | From 94f82d523fc497167379eb0624420a2bd535103d Mon Sep 17 00:00:00 2001 | ||
2 | From: Dan Carpenter <dan.carpenter@oracle.com> | ||
3 | Date: Wed, 7 Mar 2012 13:05:00 +0300 | ||
4 | Subject: [PATCH 022/147] tty: moxa: fix bit test in moxa_start() | ||
5 | |||
6 | commit 58112dfbfe02d803566a2c6c8bd97b5fa3c62cdc upstream. | ||
7 | |||
8 | This is supposed to be doing a shift before the comparison instead of | ||
9 | just doing a bitwise AND directly. The current code means the start() | ||
10 | just returns without doing anything. | ||
11 | |||
12 | Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> | ||
13 | Acked-by: Jiri Slaby <jslaby@suse.cz> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/tty/moxa.c | 2 +- | ||
17 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
18 | |||
19 | diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c | ||
20 | index d15a071..0174d2d 100644 | ||
21 | --- a/drivers/tty/moxa.c | ||
22 | +++ b/drivers/tty/moxa.c | ||
23 | @@ -1331,7 +1331,7 @@ static void moxa_start(struct tty_struct *tty) | ||
24 | if (ch == NULL) | ||
25 | return; | ||
26 | |||
27 | - if (!(ch->statusflags & TXSTOPPED)) | ||
28 | + if (!test_bit(TXSTOPPED, &ch->statusflags)) | ||
29 | return; | ||
30 | |||
31 | MoxaPortTxEnable(ch); | ||
32 | -- | ||
33 | 1.7.9.4 | ||
34 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0023-TTY-Wrong-unicode-value-copied-in-con_set_unimap.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0023-TTY-Wrong-unicode-value-copied-in-con_set_unimap.patch new file mode 100644 index 00000000..c688faaf --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0023-TTY-Wrong-unicode-value-copied-in-con_set_unimap.patch | |||
@@ -0,0 +1,119 @@ | |||
1 | From 7d00c6261eadb39ffffd02141aa566deda4d7cb3 Mon Sep 17 00:00:00 2001 | ||
2 | From: Liz Clark <liz.clark@hp.com> | ||
3 | Date: Thu, 15 Mar 2012 10:33:29 -0700 | ||
4 | Subject: [PATCH 023/147] TTY: Wrong unicode value copied in con_set_unimap() | ||
5 | |||
6 | commit 4a4c61b7ce26bfc9d49ea4bd121d52114bad9f99 upstream. | ||
7 | |||
8 | Bugzilla 40012: PIO_UNIMAP bug: error updating Unicode-to-font map | ||
9 | https://bugzilla.kernel.org/show_bug.cgi?id=40012 | ||
10 | |||
11 | The unicode font map for the virtual console is a 32x32x64 table which | ||
12 | allocates rows dynamically as entries are added. The unicode value | ||
13 | increases sequentially and should count all entries even in empty | ||
14 | rows. The defect is when copying the unicode font map in con_set_unimap(), | ||
15 | the unicode value is not incremented properly. The wrong unicode value | ||
16 | is entered in the new font map. | ||
17 | |||
18 | Signed-off-by: Liz Clark <liz.clark@hp.com> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | drivers/tty/vt/consolemap.c | 51 ++++++++++++++++++++++++++++++++++++------- | ||
22 | 1 file changed, 43 insertions(+), 8 deletions(-) | ||
23 | |||
24 | diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c | ||
25 | index 45d3e80..f343808 100644 | ||
26 | --- a/drivers/tty/vt/consolemap.c | ||
27 | +++ b/drivers/tty/vt/consolemap.c | ||
28 | @@ -516,6 +516,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | ||
29 | int err = 0, err1, i; | ||
30 | struct uni_pagedir *p, *q; | ||
31 | |||
32 | + /* Save original vc_unipagdir_loc in case we allocate a new one */ | ||
33 | p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; | ||
34 | if (p->readonly) return -EIO; | ||
35 | |||
36 | @@ -528,26 +529,57 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | ||
37 | err1 = con_clear_unimap(vc, NULL); | ||
38 | if (err1) return err1; | ||
39 | |||
40 | + /* | ||
41 | + * Since refcount was > 1, con_clear_unimap() allocated a | ||
42 | + * a new uni_pagedir for this vc. Re: p != q | ||
43 | + */ | ||
44 | q = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; | ||
45 | - for (i = 0, l = 0; i < 32; i++) | ||
46 | + | ||
47 | + /* | ||
48 | + * uni_pgdir is a 32*32*64 table with rows allocated | ||
49 | + * when its first entry is added. The unicode value must | ||
50 | + * still be incremented for empty rows. We are copying | ||
51 | + * entries from "p" (old) to "q" (new). | ||
52 | + */ | ||
53 | + l = 0; /* unicode value */ | ||
54 | + for (i = 0; i < 32; i++) | ||
55 | if ((p1 = p->uni_pgdir[i])) | ||
56 | for (j = 0; j < 32; j++) | ||
57 | - if ((p2 = p1[j])) | ||
58 | + if ((p2 = p1[j])) { | ||
59 | for (k = 0; k < 64; k++, l++) | ||
60 | if (p2[k] != 0xffff) { | ||
61 | + /* | ||
62 | + * Found one, copy entry for unicode | ||
63 | + * l with fontpos value p2[k]. | ||
64 | + */ | ||
65 | err1 = con_insert_unipair(q, l, p2[k]); | ||
66 | if (err1) { | ||
67 | p->refcount++; | ||
68 | *vc->vc_uni_pagedir_loc = (unsigned long)p; | ||
69 | con_release_unimap(q); | ||
70 | kfree(q); | ||
71 | - return err1; | ||
72 | + return err1; | ||
73 | } | ||
74 | - } | ||
75 | - p = q; | ||
76 | - } else if (p == dflt) | ||
77 | + } | ||
78 | + } else { | ||
79 | + /* Account for row of 64 empty entries */ | ||
80 | + l += 64; | ||
81 | + } | ||
82 | + else | ||
83 | + /* Account for empty table */ | ||
84 | + l += 32 * 64; | ||
85 | + | ||
86 | + /* | ||
87 | + * Finished copying font table, set vc_uni_pagedir to new table | ||
88 | + */ | ||
89 | + p = q; | ||
90 | + } else if (p == dflt) { | ||
91 | dflt = NULL; | ||
92 | - | ||
93 | + } | ||
94 | + | ||
95 | + /* | ||
96 | + * Insert user specified unicode pairs into new table. | ||
97 | + */ | ||
98 | while (ct--) { | ||
99 | unsigned short unicode, fontpos; | ||
100 | __get_user(unicode, &list->unicode); | ||
101 | @@ -557,11 +589,14 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | ||
102 | list++; | ||
103 | } | ||
104 | |||
105 | + /* | ||
106 | + * Merge with fontmaps of any other virtual consoles. | ||
107 | + */ | ||
108 | if (con_unify_unimap(vc, p)) | ||
109 | return err; | ||
110 | |||
111 | for (i = 0; i <= 3; i++) | ||
112 | - set_inverse_transl(vc, p, i); /* Update all inverse translations */ | ||
113 | + set_inverse_transl(vc, p, i); /* Update inverse translations */ | ||
114 | set_inverse_trans_unicode(vc, p); | ||
115 | |||
116 | return err; | ||
117 | -- | ||
118 | 1.7.9.4 | ||
119 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0024-USB-serial-fix-console-error-reporting.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0024-USB-serial-fix-console-error-reporting.patch new file mode 100644 index 00000000..3d057d3e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0024-USB-serial-fix-console-error-reporting.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | From 6a49ff9d91721997f9c625b79e70b9a37bfdf10f Mon Sep 17 00:00:00 2001 | ||
2 | From: Johan Hovold <jhovold@gmail.com> | ||
3 | Date: Fri, 10 Feb 2012 13:20:49 +0100 | ||
4 | Subject: [PATCH 024/147] USB: serial: fix console error reporting | ||
5 | |||
6 | commit 548dd4b6da8a8e428453d55f7fa7b8a46498d147 upstream. | ||
7 | |||
8 | Do not report errors in write path if port is used as a console as this | ||
9 | may trigger the same error (and error report) resulting in a loop. | ||
10 | |||
11 | Reported-by: Stephen Hemminger <shemminger@vyatta.com> | ||
12 | Signed-off-by: Johan Hovold <jhovold@gmail.com> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/serial/generic.c | 4 +++- | ||
16 | 1 file changed, 3 insertions(+), 1 deletion(-) | ||
17 | |||
18 | diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c | ||
19 | index e4db5ad..9f0b2bf 100644 | ||
20 | --- a/drivers/usb/serial/generic.c | ||
21 | +++ b/drivers/usb/serial/generic.c | ||
22 | @@ -215,8 +215,10 @@ retry: | ||
23 | clear_bit(i, &port->write_urbs_free); | ||
24 | result = usb_submit_urb(urb, GFP_ATOMIC); | ||
25 | if (result) { | ||
26 | - dev_err(&port->dev, "%s - error submitting urb: %d\n", | ||
27 | + if (!port->port.console) { | ||
28 | + dev_err(&port->dev, "%s - error submitting urb: %d\n", | ||
29 | __func__, result); | ||
30 | + } | ||
31 | set_bit(i, &port->write_urbs_free); | ||
32 | spin_lock_irqsave(&port->lock, flags); | ||
33 | port->tx_bytes -= count; | ||
34 | -- | ||
35 | 1.7.9.4 | ||
36 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0025-cdc-wdm-Fix-more-races-on-the-read-path.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0025-cdc-wdm-Fix-more-races-on-the-read-path.patch new file mode 100644 index 00000000..8e2bd773 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0025-cdc-wdm-Fix-more-races-on-the-read-path.patch | |||
@@ -0,0 +1,87 @@ | |||
1 | From 028d778c63336663590f673854c0e128e1b8fa34 Mon Sep 17 00:00:00 2001 | ||
2 | From: Ben Hutchings <ben@decadent.org.uk> | ||
3 | Date: Sun, 12 Feb 2012 06:00:41 +0000 | ||
4 | Subject: [PATCH 025/147] cdc-wdm: Fix more races on the read path | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit 711c68b3c0f7a924ffbee4aa962d8f62b85188ff upstream. | ||
10 | |||
11 | We must not allow the input buffer length to change while we're | ||
12 | shuffling the buffer contents. We also mustn't clear the WDM_READ | ||
13 | flag after more data might have arrived. Therefore move both of these | ||
14 | into the spinlocked region at the bottom of wdm_read(). | ||
15 | |||
16 | When reading desc->length without holding the iuspin lock, use | ||
17 | ACCESS_ONCE() to ensure the compiler doesn't re-read it with | ||
18 | inconsistent results. | ||
19 | |||
20 | Signed-off-by: Ben Hutchings <ben@decadent.org.uk> | ||
21 | Tested-by: Bj??rn Mork <bjorn@mork.no> | ||
22 | Cc: Oliver Neukum <oliver@neukum.org> | ||
23 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
24 | --- | ||
25 | drivers/usb/class/cdc-wdm.c | 16 +++++++++++----- | ||
26 | 1 file changed, 11 insertions(+), 5 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
29 | index fd4aee1..eb650b7 100644 | ||
30 | --- a/drivers/usb/class/cdc-wdm.c | ||
31 | +++ b/drivers/usb/class/cdc-wdm.c | ||
32 | @@ -397,7 +397,7 @@ outnl: | ||
33 | static ssize_t wdm_read | ||
34 | (struct file *file, char __user *buffer, size_t count, loff_t *ppos) | ||
35 | { | ||
36 | - int rv, cntr = 0; | ||
37 | + int rv, cntr; | ||
38 | int i = 0; | ||
39 | struct wdm_device *desc = file->private_data; | ||
40 | |||
41 | @@ -406,7 +406,8 @@ static ssize_t wdm_read | ||
42 | if (rv < 0) | ||
43 | return -ERESTARTSYS; | ||
44 | |||
45 | - if (desc->length == 0) { | ||
46 | + cntr = ACCESS_ONCE(desc->length); | ||
47 | + if (cntr == 0) { | ||
48 | desc->read = 0; | ||
49 | retry: | ||
50 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) { | ||
51 | @@ -457,25 +458,30 @@ retry: | ||
52 | goto retry; | ||
53 | } | ||
54 | clear_bit(WDM_READ, &desc->flags); | ||
55 | + cntr = desc->length; | ||
56 | spin_unlock_irq(&desc->iuspin); | ||
57 | } | ||
58 | |||
59 | - cntr = count > desc->length ? desc->length : count; | ||
60 | + if (cntr > count) | ||
61 | + cntr = count; | ||
62 | rv = copy_to_user(buffer, desc->ubuf, cntr); | ||
63 | if (rv > 0) { | ||
64 | rv = -EFAULT; | ||
65 | goto err; | ||
66 | } | ||
67 | |||
68 | + spin_lock_irq(&desc->iuspin); | ||
69 | + | ||
70 | for (i = 0; i < desc->length - cntr; i++) | ||
71 | desc->ubuf[i] = desc->ubuf[i + cntr]; | ||
72 | |||
73 | - spin_lock_irq(&desc->iuspin); | ||
74 | desc->length -= cntr; | ||
75 | - spin_unlock_irq(&desc->iuspin); | ||
76 | /* in case we had outstanding data */ | ||
77 | if (!desc->length) | ||
78 | clear_bit(WDM_READ, &desc->flags); | ||
79 | + | ||
80 | + spin_unlock_irq(&desc->iuspin); | ||
81 | + | ||
82 | rv = cntr; | ||
83 | |||
84 | err: | ||
85 | -- | ||
86 | 1.7.9.4 | ||
87 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0026-cdc-wdm-Don-t-clear-WDM_READ-unless-entire-read-buff.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0026-cdc-wdm-Don-t-clear-WDM_READ-unless-entire-read-buff.patch new file mode 100644 index 00000000..21eb3c98 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0026-cdc-wdm-Don-t-clear-WDM_READ-unless-entire-read-buff.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | From 77094c1a611d4c874a2903e9a702d35a4f5a6be9 Mon Sep 17 00:00:00 2001 | ||
2 | From: Ben Hutchings <ben@decadent.org.uk> | ||
3 | Date: Sun, 12 Feb 2012 06:02:43 +0000 | ||
4 | Subject: [PATCH 026/147] cdc-wdm: Don't clear WDM_READ unless entire read | ||
5 | buffer is emptied | ||
6 | MIME-Version: 1.0 | ||
7 | Content-Type: text/plain; charset=UTF-8 | ||
8 | Content-Transfer-Encoding: 8bit | ||
9 | |||
10 | commit b7a205545345578712611106b371538992e142ff upstream. | ||
11 | |||
12 | The WDM_READ flag is cleared later iff desc->length is reduced to 0. | ||
13 | |||
14 | Signed-off-by: Ben Hutchings <ben@decadent.org.uk> | ||
15 | Tested-by: Bj??rn Mork <bjorn@mork.no> | ||
16 | Cc: Oliver Neukum <oliver@neukum.org> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | drivers/usb/class/cdc-wdm.c | 1 - | ||
20 | 1 file changed, 1 deletion(-) | ||
21 | |||
22 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
23 | index eb650b7..9eb71d8 100644 | ||
24 | --- a/drivers/usb/class/cdc-wdm.c | ||
25 | +++ b/drivers/usb/class/cdc-wdm.c | ||
26 | @@ -457,7 +457,6 @@ retry: | ||
27 | spin_unlock_irq(&desc->iuspin); | ||
28 | goto retry; | ||
29 | } | ||
30 | - clear_bit(WDM_READ, &desc->flags); | ||
31 | cntr = desc->length; | ||
32 | spin_unlock_irq(&desc->iuspin); | ||
33 | } | ||
34 | -- | ||
35 | 1.7.9.4 | ||
36 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0027-usb-fsl_udc_core-Fix-scheduling-while-atomic-dump-me.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0027-usb-fsl_udc_core-Fix-scheduling-while-atomic-dump-me.patch new file mode 100644 index 00000000..b2cc8cc8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0027-usb-fsl_udc_core-Fix-scheduling-while-atomic-dump-me.patch | |||
@@ -0,0 +1,134 @@ | |||
1 | From 0e5ef14de4874bc31ca8ab4bd1759ead8151950e Mon Sep 17 00:00:00 2001 | ||
2 | From: Peter Chen <peter.chen@freescale.com> | ||
3 | Date: Thu, 16 Feb 2012 09:36:25 +0800 | ||
4 | Subject: [PATCH 027/147] usb: fsl_udc_core: Fix scheduling while atomic dump | ||
5 | message | ||
6 | |||
7 | commit c5cc5ed86667d4ae74fe40ee4ed893f4b46aba05 upstream. | ||
8 | |||
9 | When loading g_ether gadget, there is below message: | ||
10 | |||
11 | Backtrace: | ||
12 | [<80012248>] (dump_backtrace+0x0/0x10c) from [<803cb42c>] (dump_stack+0x18/0x1c) | ||
13 | r7:00000000 r6:80512000 r5:8052bef8 r4:80513f30 | ||
14 | [<803cb414>] (dump_stack+0x0/0x1c) from [<8000feb4>] (show_regs+0x44/0x50) | ||
15 | [<8000fe70>] (show_regs+0x0/0x50) from [<8004c840>] (__schedule_bug+0x68/0x84) | ||
16 | r5:8052bef8 r4:80513f30 | ||
17 | [<8004c7d8>] (__schedule_bug+0x0/0x84) from [<803cd0e4>] (__schedule+0x4b0/0x528) | ||
18 | r5:8052bef8 r4:809aad00 | ||
19 | [<803ccc34>] (__schedule+0x0/0x528) from [<803cd214>] (_cond_resched+0x44/0x58) | ||
20 | [<803cd1d0>] (_cond_resched+0x0/0x58) from [<800a9488>] (dma_pool_alloc+0x184/0x250) | ||
21 | r5:9f9b4000 r4:9fb4fb80 | ||
22 | [<800a9304>] (dma_pool_alloc+0x0/0x250) from [<802a8ad8>] (fsl_req_to_dtd+0xac/0x180) | ||
23 | [<802a8a2c>] (fsl_req_to_dtd+0x0/0x180) from [<802a8ce4>] (fsl_ep_queue+0x138/0x274) | ||
24 | [<802a8bac>] (fsl_ep_queue+0x0/0x274) from [<7f004328>] (composite_setup+0x2d4/0xfac [g_ether]) | ||
25 | [<7f004054>] (composite_setup+0x0/0xfac [g_ether]) from [<802a9bb4>] (fsl_udc_irq+0x8dc/0xd38) | ||
26 | [<802a92d8>] (fsl_udc_irq+0x0/0xd38) from [<800704f8>] (handle_irq_event_percpu+0x54/0x188) | ||
27 | [<800704a4>] (handle_irq_event_percpu+0x0/0x188) from [<80070674>] (handle_irq_event+0x48/0x68) | ||
28 | [<8007062c>] (handle_irq_event+0x0/0x68) from [<800738ec>] (handle_level_irq+0xb4/0x138) | ||
29 | r5:80514f94 r4:80514f40 | ||
30 | [<80073838>] (handle_level_irq+0x0/0x138) from [<8006ffa4>] (generic_handle_irq+0x38/0x44) | ||
31 | r7:00000012 r6:80510b1c r5:80529860 r4:80512000 | ||
32 | [<8006ff6c>] (generic_handle_irq+0x0/0x44) from [<8000f4c4>] (handle_IRQ+0x54/0xb4) | ||
33 | [<8000f470>] (handle_IRQ+0x0/0xb4) from [<800085b8>] (tzic_handle_irq+0x64/0x94) | ||
34 | r9:412fc085 r8:00000000 r7:80513f30 r6:00000001 r5:00000000 | ||
35 | r4:00000000 | ||
36 | [<80008554>] (tzic_handle_irq+0x0/0x94) from [<8000e680>] (__irq_svc+0x40/0x60) | ||
37 | |||
38 | The reason of above dump message is calling dma_poll_alloc with can-schedule | ||
39 | mem_flags at atomic context. | ||
40 | |||
41 | To fix this problem, below changes are made: | ||
42 | - fsl_req_to_dtd doesn't need to be protected by spin_lock_irqsave, | ||
43 | as struct usb_request can be access at process context. Move lock | ||
44 | to beginning of hardware visit (fsl_queue_td). | ||
45 | - Change the memory flag which using to allocate dTD descriptor buffer, | ||
46 | the memory flag can be from gadget layer. | ||
47 | |||
48 | It is tested at i.mx51 bbg board with g_mass_storage, g_ether, g_serial. | ||
49 | |||
50 | Signed-off-by: Peter Chen <peter.chen@freescale.com> | ||
51 | Acked-by: Li Yang <leoli@freescale.com> | ||
52 | Signed-off-by: Felipe Balbi <balbi@ti.com> | ||
53 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
54 | --- | ||
55 | drivers/usb/gadget/fsl_udc_core.c | 18 ++++++++---------- | ||
56 | 1 file changed, 8 insertions(+), 10 deletions(-) | ||
57 | |||
58 | diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c | ||
59 | index d7ea6c0..9085d14 100644 | ||
60 | --- a/drivers/usb/gadget/fsl_udc_core.c | ||
61 | +++ b/drivers/usb/gadget/fsl_udc_core.c | ||
62 | @@ -768,7 +768,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | ||
63 | * @is_last: return flag if it is the last dTD of the request | ||
64 | * return: pointer to the built dTD */ | ||
65 | static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | ||
66 | - dma_addr_t *dma, int *is_last) | ||
67 | + dma_addr_t *dma, int *is_last, gfp_t gfp_flags) | ||
68 | { | ||
69 | u32 swap_temp; | ||
70 | struct ep_td_struct *dtd; | ||
71 | @@ -777,7 +777,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | ||
72 | *length = min(req->req.length - req->req.actual, | ||
73 | (unsigned)EP_MAX_LENGTH_TRANSFER); | ||
74 | |||
75 | - dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma); | ||
76 | + dtd = dma_pool_alloc(udc_controller->td_pool, gfp_flags, dma); | ||
77 | if (dtd == NULL) | ||
78 | return dtd; | ||
79 | |||
80 | @@ -827,7 +827,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | ||
81 | } | ||
82 | |||
83 | /* Generate dtd chain for a request */ | ||
84 | -static int fsl_req_to_dtd(struct fsl_req *req) | ||
85 | +static int fsl_req_to_dtd(struct fsl_req *req, gfp_t gfp_flags) | ||
86 | { | ||
87 | unsigned count; | ||
88 | int is_last; | ||
89 | @@ -836,7 +836,7 @@ static int fsl_req_to_dtd(struct fsl_req *req) | ||
90 | dma_addr_t dma; | ||
91 | |||
92 | do { | ||
93 | - dtd = fsl_build_dtd(req, &count, &dma, &is_last); | ||
94 | + dtd = fsl_build_dtd(req, &count, &dma, &is_last, gfp_flags); | ||
95 | if (dtd == NULL) | ||
96 | return -ENOMEM; | ||
97 | |||
98 | @@ -910,13 +910,11 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | ||
99 | req->req.actual = 0; | ||
100 | req->dtd_count = 0; | ||
101 | |||
102 | - spin_lock_irqsave(&udc->lock, flags); | ||
103 | - | ||
104 | /* build dtds and push them to device queue */ | ||
105 | - if (!fsl_req_to_dtd(req)) { | ||
106 | + if (!fsl_req_to_dtd(req, gfp_flags)) { | ||
107 | + spin_lock_irqsave(&udc->lock, flags); | ||
108 | fsl_queue_td(ep, req); | ||
109 | } else { | ||
110 | - spin_unlock_irqrestore(&udc->lock, flags); | ||
111 | return -ENOMEM; | ||
112 | } | ||
113 | |||
114 | @@ -1295,7 +1293,7 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction) | ||
115 | ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
116 | req->mapped = 1; | ||
117 | |||
118 | - if (fsl_req_to_dtd(req) == 0) | ||
119 | + if (fsl_req_to_dtd(req, GFP_ATOMIC) == 0) | ||
120 | fsl_queue_td(ep, req); | ||
121 | else | ||
122 | return -ENOMEM; | ||
123 | @@ -1379,7 +1377,7 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, | ||
124 | req->mapped = 1; | ||
125 | |||
126 | /* prime the data phase */ | ||
127 | - if ((fsl_req_to_dtd(req) == 0)) | ||
128 | + if ((fsl_req_to_dtd(req, GFP_ATOMIC) == 0)) | ||
129 | fsl_queue_td(ep, req); | ||
130 | else /* no mem */ | ||
131 | goto stall; | ||
132 | -- | ||
133 | 1.7.9.4 | ||
134 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0028-usb-Fix-build-error-due-to-dma_mask-is-not-at-pdev_a.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0028-usb-Fix-build-error-due-to-dma_mask-is-not-at-pdev_a.patch new file mode 100644 index 00000000..2010a380 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0028-usb-Fix-build-error-due-to-dma_mask-is-not-at-pdev_a.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | From 14449b27e92835504278ce397b02ca2b183cbd31 Mon Sep 17 00:00:00 2001 | ||
2 | From: Peter Chen <peter.chen@freescale.com> | ||
3 | Date: Thu, 16 Feb 2012 09:41:52 +0800 | ||
4 | Subject: [PATCH 028/147] usb: Fix build error due to dma_mask is not at | ||
5 | pdev_archdata at ARM | ||
6 | |||
7 | commit e90fc3cb087ce5c5f81e814358222cd6d197b5db upstream. | ||
8 | |||
9 | When build i.mx platform with imx_v6_v7_defconfig, and after adding | ||
10 | USB Gadget support, it has below build error: | ||
11 | |||
12 | CC drivers/usb/host/fsl-mph-dr-of.o | ||
13 | drivers/usb/host/fsl-mph-dr-of.c: In function 'fsl_usb2_device_register': | ||
14 | drivers/usb/host/fsl-mph-dr-of.c:97: error: 'struct pdev_archdata' | ||
15 | has no member named 'dma_mask' | ||
16 | |||
17 | It has discussed at: http://www.spinics.net/lists/linux-usb/msg57302.html | ||
18 | |||
19 | For PowerPC, there is dma_mask at struct pdev_archdata, but there is | ||
20 | no dma_mask at struct pdev_archdata for ARM. The pdev_archdata is | ||
21 | related to specific platform, it should NOT be accessed by | ||
22 | cross platform drivers, like USB. | ||
23 | |||
24 | The code for pdev_archdata should be useless, as for PowerPC, | ||
25 | it has already gotten the value for pdev->dev.dma_mask at function | ||
26 | arch_setup_pdev_archdata of arch/powerpc/kernel/setup-common.c. | ||
27 | |||
28 | Tested-by: Ramneek Mehresh <ramneek.mehresh@freescale.com> | ||
29 | Signed-off-by: Peter Chen <peter.chen@freescale.com> | ||
30 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
31 | --- | ||
32 | drivers/usb/host/fsl-mph-dr-of.c | 1 - | ||
33 | 1 file changed, 1 deletion(-) | ||
34 | |||
35 | diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c | ||
36 | index 9037035..5a42cf0 100644 | ||
37 | --- a/drivers/usb/host/fsl-mph-dr-of.c | ||
38 | +++ b/drivers/usb/host/fsl-mph-dr-of.c | ||
39 | @@ -94,7 +94,6 @@ struct platform_device * __devinit fsl_usb2_device_register( | ||
40 | pdev->dev.parent = &ofdev->dev; | ||
41 | |||
42 | pdev->dev.coherent_dma_mask = ofdev->dev.coherent_dma_mask; | ||
43 | - pdev->dev.dma_mask = &pdev->archdata.dma_mask; | ||
44 | *pdev->dev.dma_mask = *ofdev->dev.dma_mask; | ||
45 | |||
46 | retval = platform_device_add_data(pdev, pdata, sizeof(*pdata)); | ||
47 | -- | ||
48 | 1.7.9.4 | ||
49 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0029-USB-ums_realtek-do-not-use-stack-memory-for-DMA-in-_.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0029-USB-ums_realtek-do-not-use-stack-memory-for-DMA-in-_.patch new file mode 100644 index 00000000..f14cf503 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0029-USB-ums_realtek-do-not-use-stack-memory-for-DMA-in-_.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From 1ae819c56089722e15e3fe2d84125e4f5aa32d4e Mon Sep 17 00:00:00 2001 | ||
2 | From: Josh Boyer <jwboyer@redhat.com> | ||
3 | Date: Mon, 20 Feb 2012 15:34:34 -0500 | ||
4 | Subject: [PATCH 029/147] USB: ums_realtek: do not use stack memory for DMA in | ||
5 | __do_config_autodelink | ||
6 | |||
7 | commit 4898e07174b79013afd2b422ef6c4336ef8e6783 upstream. | ||
8 | |||
9 | __do_config_autodelink passes the data variable to the transport function. | ||
10 | If the calling functions pass a stack variable, this will eventually trigger | ||
11 | a DMA-API debug backtrace for mapping stack memory in the DMA buffer. Fix | ||
12 | this by calling kmemdup for the passed data instead. | ||
13 | |||
14 | Signed-off-by: Josh Boyer <jwboyer@redhat.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/usb/storage/realtek_cr.c | 8 +++++++- | ||
18 | 1 file changed, 7 insertions(+), 1 deletion(-) | ||
19 | |||
20 | diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c | ||
21 | index 32c93d7..e39b188 100644 | ||
22 | --- a/drivers/usb/storage/realtek_cr.c | ||
23 | +++ b/drivers/usb/storage/realtek_cr.c | ||
24 | @@ -509,9 +509,14 @@ static int __do_config_autodelink(struct us_data *us, u8 *data, u16 len) | ||
25 | int retval; | ||
26 | u16 addr = 0xFE47; | ||
27 | u8 cmnd[12] = {0}; | ||
28 | + u8 *buf; | ||
29 | |||
30 | US_DEBUGP("%s, addr = 0x%x, len = %d\n", __FUNCTION__, addr, len); | ||
31 | |||
32 | + buf = kmemdup(data, len, GFP_NOIO); | ||
33 | + if (!buf) | ||
34 | + return USB_STOR_TRANSPORT_ERROR; | ||
35 | + | ||
36 | cmnd[0] = 0xF0; | ||
37 | cmnd[1] = 0x0E; | ||
38 | cmnd[2] = (u8)(addr >> 8); | ||
39 | @@ -519,7 +524,8 @@ static int __do_config_autodelink(struct us_data *us, u8 *data, u16 len) | ||
40 | cmnd[4] = (u8)(len >> 8); | ||
41 | cmnd[5] = (u8)len; | ||
42 | |||
43 | - retval = rts51x_bulk_transport_special(us, 0, cmnd, 12, data, len, DMA_TO_DEVICE, NULL); | ||
44 | + retval = rts51x_bulk_transport_special(us, 0, cmnd, 12, buf, len, DMA_TO_DEVICE, NULL); | ||
45 | + kfree(buf); | ||
46 | if (retval != USB_STOR_TRANSPORT_GOOD) { | ||
47 | return -EIO; | ||
48 | } | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0030-USB-qcserial-add-several-new-serial-devices.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0030-USB-qcserial-add-several-new-serial-devices.patch new file mode 100644 index 00000000..15bcffc3 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0030-USB-qcserial-add-several-new-serial-devices.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | From e3ed8846e20e35e9a94c80270d72b20befec0859 Mon Sep 17 00:00:00 2001 | ||
2 | From: Thomas Tuttle <ttuttle@chromium.org> | ||
3 | Date: Wed, 1 Feb 2012 16:07:17 -0500 | ||
4 | Subject: [PATCH 030/147] USB: qcserial: add several new serial devices | ||
5 | |||
6 | commit 2db4d87070e87d198ab630e66a898b45eff316d9 upstream. | ||
7 | |||
8 | Signed-off-by: Thomas Tuttle <ttuttle@chromium.org> | ||
9 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | ||
10 | --- | ||
11 | drivers/usb/serial/qcserial.c | 14 ++++++++++++++ | ||
12 | 1 file changed, 14 insertions(+) | ||
13 | |||
14 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
15 | index aa9367f..1e87d49 100644 | ||
16 | --- a/drivers/usb/serial/qcserial.c | ||
17 | +++ b/drivers/usb/serial/qcserial.c | ||
18 | @@ -36,6 +36,11 @@ static const struct usb_device_id id_table[] = { | ||
19 | {USB_DEVICE(0x413c, 0x8171)}, /* Dell Gobi QDL device */ | ||
20 | {USB_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | ||
21 | {USB_DEVICE(0x1410, 0xa008)}, /* Novatel Gobi QDL device */ | ||
22 | + {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi QDL device */ | ||
23 | + {USB_DEVICE(0x1410, 0xa011)}, /* Novatel Gobi QDL device */ | ||
24 | + {USB_DEVICE(0x1410, 0xa012)}, /* Novatel Gobi QDL device */ | ||
25 | + {USB_DEVICE(0x1410, 0xa013)}, /* Novatel Gobi QDL device */ | ||
26 | + {USB_DEVICE(0x1410, 0xa014)}, /* Novatel Gobi QDL device */ | ||
27 | {USB_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ | ||
28 | {USB_DEVICE(0x0b05, 0x1774)}, /* Asus Gobi QDL device */ | ||
29 | {USB_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ | ||
30 | @@ -86,7 +91,16 @@ static const struct usb_device_id id_table[] = { | ||
31 | {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ | ||
32 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ | ||
33 | {USB_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | ||
34 | + | ||
35 | + {USB_DEVICE(0x05c6, 0x920c)}, /* Gobi 3000 QDL */ | ||
36 | + {USB_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ | ||
37 | + {USB_DEVICE(0x1410, 0xa020)}, /* Novatel Gobi 3000 QDL */ | ||
38 | + {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */ | ||
39 | + {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */ | ||
40 | + {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ | ||
41 | {USB_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ | ||
42 | + {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */ | ||
43 | + {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */ | ||
44 | { } /* Terminating entry */ | ||
45 | }; | ||
46 | MODULE_DEVICE_TABLE(usb, id_table); | ||
47 | -- | ||
48 | 1.7.9.4 | ||
49 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0031-USB-qcserial-don-t-grab-QMI-port-on-Gobi-1000-device.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0031-USB-qcserial-don-t-grab-QMI-port-on-Gobi-1000-device.patch new file mode 100644 index 00000000..55df1d5a --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0031-USB-qcserial-don-t-grab-QMI-port-on-Gobi-1000-device.patch | |||
@@ -0,0 +1,177 @@ | |||
1 | From 8544c3691b838f3377a752b88365bb522eb04b72 Mon Sep 17 00:00:00 2001 | ||
2 | From: Dan Williams <dcbw@redhat.com> | ||
3 | Date: Fri, 24 Feb 2012 13:08:43 -0600 | ||
4 | Subject: [PATCH 031/147] USB: qcserial: don't grab QMI port on Gobi 1000 | ||
5 | devices | ||
6 | |||
7 | commit c192c8e71a2ded01170c1a992cd21aaedc822756 upstream. | ||
8 | |||
9 | Gobi 1000 devices have a different port layout, which wasn't respected | ||
10 | by the current driver, and thus it grabbed the QMI/net port. In the | ||
11 | near future we'll be attaching another driver to the QMI/net port for | ||
12 | these devices (cdc-wdm and qmi_wwan) so make sure the qcserial driver | ||
13 | doesn't claim them. This patch also prevents qcserial from binding to | ||
14 | interfaces 0 and 1 on 1K devices because those interfaces do not | ||
15 | respond. | ||
16 | |||
17 | Signed-off-by: Dan Williams <dcbw@redhat.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/usb/serial/qcserial.c | 105 ++++++++++++++++++++++++----------------- | ||
21 | 1 file changed, 62 insertions(+), 43 deletions(-) | ||
22 | |||
23 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
24 | index 1e87d49..3187d8b 100644 | ||
25 | --- a/drivers/usb/serial/qcserial.c | ||
26 | +++ b/drivers/usb/serial/qcserial.c | ||
27 | @@ -24,39 +24,44 @@ | ||
28 | |||
29 | static int debug; | ||
30 | |||
31 | +#define DEVICE_G1K(v, p) \ | ||
32 | + USB_DEVICE(v, p), .driver_info = 1 | ||
33 | + | ||
34 | static const struct usb_device_id id_table[] = { | ||
35 | - {USB_DEVICE(0x05c6, 0x9211)}, /* Acer Gobi QDL device */ | ||
36 | - {USB_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
37 | - {USB_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | ||
38 | - {USB_DEVICE(0x03f0, 0x201d)}, /* HP un2400 Gobi QDL Device */ | ||
39 | - {USB_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | ||
40 | - {USB_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | ||
41 | - {USB_DEVICE(0x04da, 0x250c)}, /* Panasonic Gobi QDL device */ | ||
42 | - {USB_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | ||
43 | - {USB_DEVICE(0x413c, 0x8171)}, /* Dell Gobi QDL device */ | ||
44 | - {USB_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | ||
45 | - {USB_DEVICE(0x1410, 0xa008)}, /* Novatel Gobi QDL device */ | ||
46 | - {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi QDL device */ | ||
47 | - {USB_DEVICE(0x1410, 0xa011)}, /* Novatel Gobi QDL device */ | ||
48 | - {USB_DEVICE(0x1410, 0xa012)}, /* Novatel Gobi QDL device */ | ||
49 | - {USB_DEVICE(0x1410, 0xa013)}, /* Novatel Gobi QDL device */ | ||
50 | - {USB_DEVICE(0x1410, 0xa014)}, /* Novatel Gobi QDL device */ | ||
51 | - {USB_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ | ||
52 | - {USB_DEVICE(0x0b05, 0x1774)}, /* Asus Gobi QDL device */ | ||
53 | - {USB_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ | ||
54 | - {USB_DEVICE(0x19d2, 0xfff2)}, /* ONDA Gobi QDL device */ | ||
55 | - {USB_DEVICE(0x1557, 0x0a80)}, /* OQO Gobi QDL device */ | ||
56 | - {USB_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ | ||
57 | - {USB_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ | ||
58 | - {USB_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ | ||
59 | - {USB_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ | ||
60 | - {USB_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ | ||
61 | - {USB_DEVICE(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ | ||
62 | - {USB_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ | ||
63 | - {USB_DEVICE(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ | ||
64 | - {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ | ||
65 | - {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ | ||
66 | - {USB_DEVICE(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ | ||
67 | + /* Gobi 1000 devices */ | ||
68 | + {DEVICE_G1K(0x05c6, 0x9211)}, /* Acer Gobi QDL device */ | ||
69 | + {DEVICE_G1K(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
70 | + {DEVICE_G1K(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | ||
71 | + {DEVICE_G1K(0x03f0, 0x201d)}, /* HP un2400 Gobi QDL Device */ | ||
72 | + {DEVICE_G1K(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | ||
73 | + {DEVICE_G1K(0x04da, 0x250c)}, /* Panasonic Gobi QDL device */ | ||
74 | + {DEVICE_G1K(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | ||
75 | + {DEVICE_G1K(0x413c, 0x8171)}, /* Dell Gobi QDL device */ | ||
76 | + {DEVICE_G1K(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | ||
77 | + {DEVICE_G1K(0x1410, 0xa008)}, /* Novatel Gobi QDL device */ | ||
78 | + {DEVICE_G1K(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ | ||
79 | + {DEVICE_G1K(0x0b05, 0x1774)}, /* Asus Gobi QDL device */ | ||
80 | + {DEVICE_G1K(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ | ||
81 | + {DEVICE_G1K(0x19d2, 0xfff2)}, /* ONDA Gobi QDL device */ | ||
82 | + {DEVICE_G1K(0x1557, 0x0a80)}, /* OQO Gobi QDL device */ | ||
83 | + {DEVICE_G1K(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ | ||
84 | + {DEVICE_G1K(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ | ||
85 | + {DEVICE_G1K(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ | ||
86 | + {DEVICE_G1K(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ | ||
87 | + {DEVICE_G1K(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ | ||
88 | + {DEVICE_G1K(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ | ||
89 | + {DEVICE_G1K(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ | ||
90 | + {DEVICE_G1K(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ | ||
91 | + {DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ | ||
92 | + {DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ | ||
93 | + {DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ | ||
94 | + | ||
95 | + /* Gobi 2000 devices */ | ||
96 | + {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */ | ||
97 | + {USB_DEVICE(0x1410, 0xa011)}, /* Novatel Gobi 2000 QDL device */ | ||
98 | + {USB_DEVICE(0x1410, 0xa012)}, /* Novatel Gobi 2000 QDL device */ | ||
99 | + {USB_DEVICE(0x1410, 0xa013)}, /* Novatel Gobi 2000 QDL device */ | ||
100 | + {USB_DEVICE(0x1410, 0xa014)}, /* Novatel Gobi 2000 QDL device */ | ||
101 | {USB_DEVICE(0x413c, 0x8185)}, /* Dell Gobi 2000 QDL device (N0218, VU936) */ | ||
102 | {USB_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ | ||
103 | {USB_DEVICE(0x05c6, 0x9208)}, /* Generic Gobi 2000 QDL device */ | ||
104 | @@ -92,6 +97,8 @@ static const struct usb_device_id id_table[] = { | ||
105 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ | ||
106 | {USB_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | ||
107 | |||
108 | + /* Gobi 3000 devices */ | ||
109 | + {USB_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Gobi 3000 QDL */ | ||
110 | {USB_DEVICE(0x05c6, 0x920c)}, /* Gobi 3000 QDL */ | ||
111 | {USB_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ | ||
112 | {USB_DEVICE(0x1410, 0xa020)}, /* Novatel Gobi 3000 QDL */ | ||
113 | @@ -122,8 +129,10 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | ||
114 | int retval = -ENODEV; | ||
115 | __u8 nintf; | ||
116 | __u8 ifnum; | ||
117 | + bool is_gobi1k = id->driver_info ? true : false; | ||
118 | |||
119 | dbg("%s", __func__); | ||
120 | + dbg("Is Gobi 1000 = %d", is_gobi1k); | ||
121 | |||
122 | nintf = serial->dev->actconfig->desc.bNumInterfaces; | ||
123 | dbg("Num Interfaces = %d", nintf); | ||
124 | @@ -171,15 +180,25 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | ||
125 | |||
126 | case 3: | ||
127 | case 4: | ||
128 | - /* Composite mode */ | ||
129 | - /* ifnum == 0 is a broadband network adapter */ | ||
130 | - if (ifnum == 1) { | ||
131 | - /* | ||
132 | - * Diagnostics Monitor (serial line 9600 8N1) | ||
133 | - * Qualcomm DM protocol | ||
134 | - * use "libqcdm" (ModemManager) for communication | ||
135 | - */ | ||
136 | - dbg("Diagnostics Monitor found"); | ||
137 | + /* Composite mode; don't bind to the QMI/net interface as that | ||
138 | + * gets handled by other drivers. | ||
139 | + */ | ||
140 | + | ||
141 | + /* Gobi 1K USB layout: | ||
142 | + * 0: serial port (doesn't respond) | ||
143 | + * 1: serial port (doesn't respond) | ||
144 | + * 2: AT-capable modem port | ||
145 | + * 3: QMI/net | ||
146 | + * | ||
147 | + * Gobi 2K+ USB layout: | ||
148 | + * 0: QMI/net | ||
149 | + * 1: DM/DIAG (use libqcdm from ModemManager for communication) | ||
150 | + * 2: AT-capable modem port | ||
151 | + * 3: NMEA | ||
152 | + */ | ||
153 | + | ||
154 | + if (ifnum == 1 && !is_gobi1k) { | ||
155 | + dbg("Gobi 2K+ DM/DIAG interface found"); | ||
156 | retval = usb_set_interface(serial->dev, ifnum, 0); | ||
157 | if (retval < 0) { | ||
158 | dev_err(&serial->dev->dev, | ||
159 | @@ -198,13 +217,13 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | ||
160 | retval = -ENODEV; | ||
161 | kfree(data); | ||
162 | } | ||
163 | - } else if (ifnum==3) { | ||
164 | + } else if (ifnum==3 && !is_gobi1k) { | ||
165 | /* | ||
166 | * NMEA (serial line 9600 8N1) | ||
167 | * # echo "\$GPS_START" > /dev/ttyUSBx | ||
168 | * # echo "\$GPS_STOP" > /dev/ttyUSBx | ||
169 | */ | ||
170 | - dbg("NMEA GPS interface found"); | ||
171 | + dbg("Gobi 2K+ NMEA GPS interface found"); | ||
172 | retval = usb_set_interface(serial->dev, ifnum, 0); | ||
173 | if (retval < 0) { | ||
174 | dev_err(&serial->dev->dev, | ||
175 | -- | ||
176 | 1.7.9.4 | ||
177 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0032-usb-serial-Add-support-for-the-Sealevel-SeaLINK-8-20.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0032-usb-serial-Add-support-for-the-Sealevel-SeaLINK-8-20.patch new file mode 100644 index 00000000..f1e4d7fd --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0032-usb-serial-Add-support-for-the-Sealevel-SeaLINK-8-20.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From 94b027170f277f8d39aa3e6b2fe0ec2d01ad90f9 Mon Sep 17 00:00:00 2001 | ||
2 | From: Scott Dial <scott.dial@scientiallc.com> | ||
3 | Date: Fri, 24 Feb 2012 19:04:09 -0500 | ||
4 | Subject: [PATCH 032/147] usb-serial: Add support for the Sealevel SeaLINK+8 | ||
5 | 2038-ROHS device | ||
6 | |||
7 | commit 6d161b99f875269ad4ffa44375e1e54bca6fd02e upstream. | ||
8 | |||
9 | This patch adds new device IDs to the ftdi_sio module to support | ||
10 | the new Sealevel SeaLINK+8 2038-ROHS device. | ||
11 | |||
12 | Signed-off-by: Scott Dial <scott.dial@scientiallc.com> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/usb/serial/ftdi_sio.c | 4 ++++ | ||
16 | drivers/usb/serial/ftdi_sio_ids.h | 4 ++++ | ||
17 | 2 files changed, 8 insertions(+) | ||
18 | |||
19 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
20 | index 3f3ccf6..f2c9ef7 100644 | ||
21 | --- a/drivers/usb/serial/ftdi_sio.c | ||
22 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
23 | @@ -537,6 +537,10 @@ static struct usb_device_id id_table_combined [] = { | ||
24 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) }, | ||
25 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) }, | ||
26 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, | ||
27 | + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) }, | ||
28 | + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) }, | ||
29 | + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) }, | ||
30 | + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) }, | ||
31 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, | ||
32 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, | ||
33 | { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, | ||
34 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
35 | index abf6bbc..c6dd18e 100644 | ||
36 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
37 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
38 | @@ -689,6 +689,10 @@ | ||
39 | #define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */ | ||
40 | #define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */ | ||
41 | #define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */ | ||
42 | +#define SEALEVEL_2803R_1_PID 0Xa02a /* SeaLINK+8 (2803-ROHS) Port 1+2 */ | ||
43 | +#define SEALEVEL_2803R_2_PID 0Xa02b /* SeaLINK+8 (2803-ROHS) Port 3+4 */ | ||
44 | +#define SEALEVEL_2803R_3_PID 0Xa02c /* SeaLINK+8 (2803-ROHS) Port 5+6 */ | ||
45 | +#define SEALEVEL_2803R_4_PID 0Xa02d /* SeaLINK+8 (2803-ROHS) Port 7+8 */ | ||
46 | |||
47 | /* | ||
48 | * JETI SPECTROMETER SPECBOS 1201 | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0033-usb-cp210x-Update-to-support-CP2105-and-multiple-int.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0033-usb-cp210x-Update-to-support-CP2105-and-multiple-int.patch new file mode 100644 index 00000000..4d50b8d9 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0033-usb-cp210x-Update-to-support-CP2105-and-multiple-int.patch | |||
@@ -0,0 +1,155 @@ | |||
1 | From 4d2e98ccb5f7c69868760e889389c5ba01a89bf5 Mon Sep 17 00:00:00 2001 | ||
2 | From: Preston Fick <preston.fick@silabs.com> | ||
3 | Date: Fri, 24 Feb 2012 13:42:39 -0600 | ||
4 | Subject: [PATCH 033/147] usb: cp210x: Update to support CP2105 and multiple | ||
5 | interface devices | ||
6 | |||
7 | commit a5360a53a7ccad5ed9ccef210b94fef13c6e5529 upstream. | ||
8 | |||
9 | This patch updates the cp210x driver to support CP210x multiple | ||
10 | interface devices devices from Silicon Labs. The existing driver | ||
11 | always sends control requests to interface 0, which is hardcoded in | ||
12 | the usb_control_msg function calls. This only allows for single | ||
13 | interface devices to be used, and causes a bug when using ports on an | ||
14 | interface other than 0 in the multiple interface devices. | ||
15 | |||
16 | Here are the changes included in this patch: | ||
17 | - Updated the device list to contain the Silicon Labs factory default | ||
18 | VID/PID for multiple interface CP210x devices | ||
19 | - Created a cp210x_port_private struct created for each port on | ||
20 | startup, this struct holds the interface number | ||
21 | - Added a cp210x_release function to clean up the cp210x_port_private | ||
22 | memory created on startup | ||
23 | - Modified usb_get_config and usb_set_config to get a pointer to the | ||
24 | cp210x_port_private struct, and use the interface number there in the | ||
25 | usb_control_message wIndex param | ||
26 | |||
27 | Signed-off-by: Preston Fick <preston.fick@silabs.com> | ||
28 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
29 | --- | ||
30 | drivers/usb/serial/cp210x.c | 44 ++++++++++++++++++++++++++++++++++++++++--- | ||
31 | 1 file changed, 41 insertions(+), 3 deletions(-) | ||
32 | |||
33 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
34 | index 33d25d4..4c12404 100644 | ||
35 | --- a/drivers/usb/serial/cp210x.c | ||
36 | +++ b/drivers/usb/serial/cp210x.c | ||
37 | @@ -49,6 +49,7 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, | ||
38 | unsigned int, unsigned int); | ||
39 | static void cp210x_break_ctl(struct tty_struct *, int); | ||
40 | static int cp210x_startup(struct usb_serial *); | ||
41 | +static void cp210x_release(struct usb_serial *); | ||
42 | static void cp210x_dtr_rts(struct usb_serial_port *p, int on); | ||
43 | |||
44 | static int debug; | ||
45 | @@ -121,6 +122,8 @@ static const struct usb_device_id id_table[] = { | ||
46 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | ||
47 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | ||
48 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | ||
49 | + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | ||
50 | + { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */ | ||
51 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ | ||
52 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ | ||
53 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ | ||
54 | @@ -149,6 +152,10 @@ static const struct usb_device_id id_table[] = { | ||
55 | |||
56 | MODULE_DEVICE_TABLE(usb, id_table); | ||
57 | |||
58 | +struct cp210x_port_private { | ||
59 | + __u8 bInterfaceNumber; | ||
60 | +}; | ||
61 | + | ||
62 | static struct usb_driver cp210x_driver = { | ||
63 | .name = "cp210x", | ||
64 | .probe = usb_serial_probe, | ||
65 | @@ -174,6 +181,7 @@ static struct usb_serial_driver cp210x_device = { | ||
66 | .tiocmget = cp210x_tiocmget, | ||
67 | .tiocmset = cp210x_tiocmset, | ||
68 | .attach = cp210x_startup, | ||
69 | + .release = cp210x_release, | ||
70 | .dtr_rts = cp210x_dtr_rts | ||
71 | }; | ||
72 | |||
73 | @@ -261,6 +269,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | ||
74 | unsigned int *data, int size) | ||
75 | { | ||
76 | struct usb_serial *serial = port->serial; | ||
77 | + struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | ||
78 | __le32 *buf; | ||
79 | int result, i, length; | ||
80 | |||
81 | @@ -276,7 +285,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | ||
82 | /* Issue the request, attempting to read 'size' bytes */ | ||
83 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
84 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, | ||
85 | - 0, buf, size, 300); | ||
86 | + port_priv->bInterfaceNumber, buf, size, 300); | ||
87 | |||
88 | /* Convert data into an array of integers */ | ||
89 | for (i = 0; i < length; i++) | ||
90 | @@ -304,6 +313,7 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | ||
91 | unsigned int *data, int size) | ||
92 | { | ||
93 | struct usb_serial *serial = port->serial; | ||
94 | + struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | ||
95 | __le32 *buf; | ||
96 | int result, i, length; | ||
97 | |||
98 | @@ -325,12 +335,12 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | ||
99 | result = usb_control_msg(serial->dev, | ||
100 | usb_sndctrlpipe(serial->dev, 0), | ||
101 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, | ||
102 | - 0, buf, size, 300); | ||
103 | + port_priv->bInterfaceNumber, buf, size, 300); | ||
104 | } else { | ||
105 | result = usb_control_msg(serial->dev, | ||
106 | usb_sndctrlpipe(serial->dev, 0), | ||
107 | request, REQTYPE_HOST_TO_DEVICE, data[0], | ||
108 | - 0, NULL, 0, 300); | ||
109 | + port_priv->bInterfaceNumber, NULL, 0, 300); | ||
110 | } | ||
111 | |||
112 | kfree(buf); | ||
113 | @@ -830,11 +840,39 @@ static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | ||
114 | |||
115 | static int cp210x_startup(struct usb_serial *serial) | ||
116 | { | ||
117 | + struct cp210x_port_private *port_priv; | ||
118 | + int i; | ||
119 | + | ||
120 | /* cp210x buffers behave strangely unless device is reset */ | ||
121 | usb_reset_device(serial->dev); | ||
122 | + | ||
123 | + for (i = 0; i < serial->num_ports; i++) { | ||
124 | + port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL); | ||
125 | + if (!port_priv) | ||
126 | + return -ENOMEM; | ||
127 | + | ||
128 | + memset(port_priv, 0x00, sizeof(*port_priv)); | ||
129 | + port_priv->bInterfaceNumber = | ||
130 | + serial->interface->cur_altsetting->desc.bInterfaceNumber; | ||
131 | + | ||
132 | + usb_set_serial_port_data(serial->port[i], port_priv); | ||
133 | + } | ||
134 | + | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | +static void cp210x_release(struct usb_serial *serial) | ||
139 | +{ | ||
140 | + struct cp210x_port_private *port_priv; | ||
141 | + int i; | ||
142 | + | ||
143 | + for (i = 0; i < serial->num_ports; i++) { | ||
144 | + port_priv = usb_get_serial_port_data(serial->port[i]); | ||
145 | + kfree(port_priv); | ||
146 | + usb_set_serial_port_data(serial->port[i], NULL); | ||
147 | + } | ||
148 | +} | ||
149 | + | ||
150 | static int __init cp210x_init(void) | ||
151 | { | ||
152 | int retval; | ||
153 | -- | ||
154 | 1.7.9.4 | ||
155 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0034-USB-serial-mos7840-Fixed-MCS7820-device-attach-probl.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0034-USB-serial-mos7840-Fixed-MCS7820-device-attach-probl.patch new file mode 100644 index 00000000..6c878a9d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0034-USB-serial-mos7840-Fixed-MCS7820-device-attach-probl.patch | |||
@@ -0,0 +1,148 @@ | |||
1 | From 7121306391cac4f482edc239e2c8b0f8ac310f92 Mon Sep 17 00:00:00 2001 | ||
2 | From: Donald Lee <donald@asix.com.tw> | ||
3 | Date: Wed, 14 Mar 2012 15:26:33 +0800 | ||
4 | Subject: [PATCH 034/147] USB: serial: mos7840: Fixed MCS7820 device attach | ||
5 | problem | ||
6 | |||
7 | commit 093ea2d3a766cb8a4c4de57efec6c0a127a58792 upstream. | ||
8 | |||
9 | A MCS7820 device supports two serial ports and a MCS7840 device supports | ||
10 | four serial ports. Both devices use the same driver, but the attach function | ||
11 | in driver was unable to correctly handle the port numbers for MCS7820 | ||
12 | device. This problem has been fixed in this patch and this fix has been | ||
13 | verified on x86 Linux kernel 3.2.9 with both MCS7820 and MCS7840 devices. | ||
14 | |||
15 | Signed-off-by: Donald Lee <donald@asix.com.tw> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/usb/serial/mos7840.c | 83 +++++++++++++++++++++++++++++------------- | ||
19 | 1 file changed, 57 insertions(+), 26 deletions(-) | ||
20 | |||
21 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c | ||
22 | index c72abd5..5c7d654 100644 | ||
23 | --- a/drivers/usb/serial/mos7840.c | ||
24 | +++ b/drivers/usb/serial/mos7840.c | ||
25 | @@ -174,6 +174,7 @@ | ||
26 | |||
27 | #define CLK_MULTI_REGISTER ((__u16)(0x02)) | ||
28 | #define CLK_START_VALUE_REGISTER ((__u16)(0x03)) | ||
29 | +#define GPIO_REGISTER ((__u16)(0x07)) | ||
30 | |||
31 | #define SERIAL_LCR_DLAB ((__u16)(0x0080)) | ||
32 | |||
33 | @@ -1103,14 +1104,25 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
34 | mos7840_port->read_urb = port->read_urb; | ||
35 | |||
36 | /* set up our bulk in urb */ | ||
37 | - | ||
38 | - usb_fill_bulk_urb(mos7840_port->read_urb, | ||
39 | - serial->dev, | ||
40 | - usb_rcvbulkpipe(serial->dev, | ||
41 | - port->bulk_in_endpointAddress), | ||
42 | - port->bulk_in_buffer, | ||
43 | - mos7840_port->read_urb->transfer_buffer_length, | ||
44 | - mos7840_bulk_in_callback, mos7840_port); | ||
45 | + if ((serial->num_ports == 2) | ||
46 | + && ((((__u16)port->number - | ||
47 | + (__u16)(port->serial->minor)) % 2) != 0)) { | ||
48 | + usb_fill_bulk_urb(mos7840_port->read_urb, | ||
49 | + serial->dev, | ||
50 | + usb_rcvbulkpipe(serial->dev, | ||
51 | + (port->bulk_in_endpointAddress) + 2), | ||
52 | + port->bulk_in_buffer, | ||
53 | + mos7840_port->read_urb->transfer_buffer_length, | ||
54 | + mos7840_bulk_in_callback, mos7840_port); | ||
55 | + } else { | ||
56 | + usb_fill_bulk_urb(mos7840_port->read_urb, | ||
57 | + serial->dev, | ||
58 | + usb_rcvbulkpipe(serial->dev, | ||
59 | + port->bulk_in_endpointAddress), | ||
60 | + port->bulk_in_buffer, | ||
61 | + mos7840_port->read_urb->transfer_buffer_length, | ||
62 | + mos7840_bulk_in_callback, mos7840_port); | ||
63 | + } | ||
64 | |||
65 | dbg("mos7840_open: bulkin endpoint is %d", | ||
66 | port->bulk_in_endpointAddress); | ||
67 | @@ -1521,13 +1533,25 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, | ||
68 | memcpy(urb->transfer_buffer, current_position, transfer_size); | ||
69 | |||
70 | /* fill urb with data and submit */ | ||
71 | - usb_fill_bulk_urb(urb, | ||
72 | - serial->dev, | ||
73 | - usb_sndbulkpipe(serial->dev, | ||
74 | - port->bulk_out_endpointAddress), | ||
75 | - urb->transfer_buffer, | ||
76 | - transfer_size, | ||
77 | - mos7840_bulk_out_data_callback, mos7840_port); | ||
78 | + if ((serial->num_ports == 2) | ||
79 | + && ((((__u16)port->number - | ||
80 | + (__u16)(port->serial->minor)) % 2) != 0)) { | ||
81 | + usb_fill_bulk_urb(urb, | ||
82 | + serial->dev, | ||
83 | + usb_sndbulkpipe(serial->dev, | ||
84 | + (port->bulk_out_endpointAddress) + 2), | ||
85 | + urb->transfer_buffer, | ||
86 | + transfer_size, | ||
87 | + mos7840_bulk_out_data_callback, mos7840_port); | ||
88 | + } else { | ||
89 | + usb_fill_bulk_urb(urb, | ||
90 | + serial->dev, | ||
91 | + usb_sndbulkpipe(serial->dev, | ||
92 | + port->bulk_out_endpointAddress), | ||
93 | + urb->transfer_buffer, | ||
94 | + transfer_size, | ||
95 | + mos7840_bulk_out_data_callback, mos7840_port); | ||
96 | + } | ||
97 | |||
98 | data1 = urb->transfer_buffer; | ||
99 | dbg("bulkout endpoint is %d", port->bulk_out_endpointAddress); | ||
100 | @@ -1840,7 +1864,7 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port, | ||
101 | |||
102 | } else { | ||
103 | #ifdef HW_flow_control | ||
104 | - / *setting h/w flow control bit to 0 */ | ||
105 | + /* setting h/w flow control bit to 0 */ | ||
106 | Data = 0xb; | ||
107 | mos7840_port->shadowMCR = Data; | ||
108 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, | ||
109 | @@ -2309,19 +2333,26 @@ static int mos7840_ioctl(struct tty_struct *tty, | ||
110 | |||
111 | static int mos7840_calc_num_ports(struct usb_serial *serial) | ||
112 | { | ||
113 | - int mos7840_num_ports = 0; | ||
114 | - | ||
115 | - dbg("numberofendpoints: cur %d, alt %d", | ||
116 | - (int)serial->interface->cur_altsetting->desc.bNumEndpoints, | ||
117 | - (int)serial->interface->altsetting->desc.bNumEndpoints); | ||
118 | - if (serial->interface->cur_altsetting->desc.bNumEndpoints == 5) { | ||
119 | - mos7840_num_ports = serial->num_ports = 2; | ||
120 | - } else if (serial->interface->cur_altsetting->desc.bNumEndpoints == 9) { | ||
121 | + __u16 Data = 0x00; | ||
122 | + int ret = 0; | ||
123 | + int mos7840_num_ports; | ||
124 | + | ||
125 | + ret = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
126 | + MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &Data, | ||
127 | + VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
128 | + | ||
129 | + if ((Data & 0x01) == 0) { | ||
130 | + mos7840_num_ports = 2; | ||
131 | + serial->num_bulk_in = 2; | ||
132 | + serial->num_bulk_out = 2; | ||
133 | + serial->num_ports = 2; | ||
134 | + } else { | ||
135 | + mos7840_num_ports = 4; | ||
136 | serial->num_bulk_in = 4; | ||
137 | serial->num_bulk_out = 4; | ||
138 | - mos7840_num_ports = serial->num_ports = 4; | ||
139 | + serial->num_ports = 4; | ||
140 | } | ||
141 | - dbg ("mos7840_num_ports = %d", mos7840_num_ports); | ||
142 | + | ||
143 | return mos7840_num_ports; | ||
144 | } | ||
145 | |||
146 | -- | ||
147 | 1.7.9.4 | ||
148 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0035-rt2x00-Add-support-for-D-Link-DWA-127-to-rt2800usb.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0035-rt2x00-Add-support-for-D-Link-DWA-127-to-rt2800usb.patch new file mode 100644 index 00000000..2805c1f0 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0035-rt2x00-Add-support-for-D-Link-DWA-127-to-rt2800usb.patch | |||
@@ -0,0 +1,33 @@ | |||
1 | From bdab95dd61b9879afe660d0f5d97bf5b6ab0533e Mon Sep 17 00:00:00 2001 | ||
2 | From: Gertjan van Wingerde <gwingerde@gmail.com> | ||
3 | Date: Sat, 11 Feb 2012 21:58:09 +0100 | ||
4 | Subject: [PATCH 035/147] rt2x00: Add support for D-Link DWA-127 to rt2800usb. | ||
5 | |||
6 | commit d42a179b941a9e4cc6cf41d0f3cbadd75fc48a89 upstream. | ||
7 | |||
8 | This is an RT3070 based device. | ||
9 | |||
10 | Reported-by: Mikhail Kryshen <mikhail@kryshen.net> | ||
11 | Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> | ||
12 | Acked-by: Ivo van Doorn <IvDoorn@gmail.com> | ||
13 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/net/wireless/rt2x00/rt2800usb.c | 1 + | ||
17 | 1 file changed, 1 insertion(+) | ||
18 | |||
19 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
20 | index 3265b34..cb71e88 100644 | ||
21 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c | ||
22 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
23 | @@ -935,6 +935,7 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
24 | { USB_DEVICE(0x07d1, 0x3c0f) }, | ||
25 | { USB_DEVICE(0x07d1, 0x3c11) }, | ||
26 | { USB_DEVICE(0x07d1, 0x3c16) }, | ||
27 | + { USB_DEVICE(0x2001, 0x3c1b) }, | ||
28 | /* Draytek */ | ||
29 | { USB_DEVICE(0x07fa, 0x7712) }, | ||
30 | /* DVICO */ | ||
31 | -- | ||
32 | 1.7.9.4 | ||
33 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0036-rtlwifi-rtl8192c_common-rtl8192de-Check-for-allocati.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0036-rtlwifi-rtl8192c_common-rtl8192de-Check-for-allocati.patch new file mode 100644 index 00000000..11a4531c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0036-rtlwifi-rtl8192c_common-rtl8192de-Check-for-allocati.patch | |||
@@ -0,0 +1,102 @@ | |||
1 | From a28aa8ba24d7303a4d8677ebf8b159014f19dca0 Mon Sep 17 00:00:00 2001 | ||
2 | From: Larry Finger <Larry.Finger@lwfinger.net> | ||
3 | Date: Sat, 7 Jan 2012 20:46:40 -0600 | ||
4 | Subject: [PATCH 036/147] rtlwifi: rtl8192c_common: rtl8192de: Check for | ||
5 | allocation failures | ||
6 | |||
7 | commit 76a92be537f1c8c259e393632301446257ca3ea9 upstream. | ||
8 | |||
9 | In https://bugzilla.redhat.com/show_bug.cgi?id=771656, a kernel bug was | ||
10 | triggered due to a failed skb allocation that was not checked. This event | ||
11 | lead to an audit of all memory allocations in the complete rtlwifi family | ||
12 | of drivers. This patch fixes the rest. | ||
13 | |||
14 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
15 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/net/wireless/rtlwifi/pci.c | 2 ++ | ||
19 | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 2 ++ | ||
20 | drivers/net/wireless/rtlwifi/rtl8192de/fw.c | 14 +++++++++----- | ||
21 | drivers/net/wireless/rtlwifi/usb.c | 12 +++++++----- | ||
22 | 4 files changed, 20 insertions(+), 10 deletions(-) | ||
23 | |||
24 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c | ||
25 | index eb61061..19bb550 100644 | ||
26 | --- a/drivers/net/wireless/rtlwifi/pci.c | ||
27 | +++ b/drivers/net/wireless/rtlwifi/pci.c | ||
28 | @@ -657,6 +657,8 @@ static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb, | ||
29 | return; | ||
30 | |||
31 | uskb = dev_alloc_skb(skb->len + 128); | ||
32 | + if (!uskb) | ||
33 | + return; /* exit if allocation failed */ | ||
34 | memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status)); | ||
35 | pdata = (u8 *)skb_put(uskb, skb->len); | ||
36 | memcpy(pdata, skb->data, skb->len); | ||
37 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | ||
38 | index 950c65a..13fc0f9 100644 | ||
39 | --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | ||
40 | +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | ||
41 | @@ -752,6 +752,8 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished) | ||
42 | |||
43 | |||
44 | skb = dev_alloc_skb(totalpacketlen); | ||
45 | + if (!skb) | ||
46 | + return; | ||
47 | memcpy((u8 *) skb_put(skb, totalpacketlen), | ||
48 | &reserved_page_packet, totalpacketlen); | ||
49 | |||
50 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c | ||
51 | index 82f060b..c44757f 100644 | ||
52 | --- a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c | ||
53 | +++ b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c | ||
54 | @@ -763,12 +763,16 @@ void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished) | ||
55 | "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n", | ||
56 | u1RsvdPageLoc, 3); | ||
57 | skb = dev_alloc_skb(totalpacketlen); | ||
58 | - memcpy((u8 *) skb_put(skb, totalpacketlen), &reserved_page_packet, | ||
59 | - totalpacketlen); | ||
60 | - rtstatus = _rtl92d_cmd_send_packet(hw, skb); | ||
61 | + if (!skb) { | ||
62 | + dlok = false; | ||
63 | + } else { | ||
64 | + memcpy((u8 *) skb_put(skb, totalpacketlen), | ||
65 | + &reserved_page_packet, totalpacketlen); | ||
66 | + rtstatus = _rtl92d_cmd_send_packet(hw, skb); | ||
67 | |||
68 | - if (rtstatus) | ||
69 | - dlok = true; | ||
70 | + if (rtstatus) | ||
71 | + dlok = true; | ||
72 | + } | ||
73 | if (dlok) { | ||
74 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, | ||
75 | ("Set RSVD page location to Fw.\n")); | ||
76 | diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c | ||
77 | index 54cb8a6..2b7bcc8 100644 | ||
78 | --- a/drivers/net/wireless/rtlwifi/usb.c | ||
79 | +++ b/drivers/net/wireless/rtlwifi/usb.c | ||
80 | @@ -481,12 +481,14 @@ static void _rtl_usb_rx_process_noagg(struct ieee80211_hw *hw, | ||
81 | u8 *pdata; | ||
82 | |||
83 | uskb = dev_alloc_skb(skb->len + 128); | ||
84 | - memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, | ||
85 | - sizeof(rx_status)); | ||
86 | - pdata = (u8 *)skb_put(uskb, skb->len); | ||
87 | - memcpy(pdata, skb->data, skb->len); | ||
88 | + if (uskb) { /* drop packet on allocation failure */ | ||
89 | + memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, | ||
90 | + sizeof(rx_status)); | ||
91 | + pdata = (u8 *)skb_put(uskb, skb->len); | ||
92 | + memcpy(pdata, skb->data, skb->len); | ||
93 | + ieee80211_rx_irqsafe(hw, uskb); | ||
94 | + } | ||
95 | dev_kfree_skb_any(skb); | ||
96 | - ieee80211_rx_irqsafe(hw, uskb); | ||
97 | } else { | ||
98 | dev_kfree_skb_any(skb); | ||
99 | } | ||
100 | -- | ||
101 | 1.7.9.4 | ||
102 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0037-rtlwifi-Handle-previous-allocation-failures-when-fre.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0037-rtlwifi-Handle-previous-allocation-failures-when-fre.patch new file mode 100644 index 00000000..c30c85db --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0037-rtlwifi-Handle-previous-allocation-failures-when-fre.patch | |||
@@ -0,0 +1,59 @@ | |||
1 | From 80ee9108bee3d22e90191a67036133de09faf7cc Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Graham <simon.graham@virtualcomputer.com> | ||
3 | Date: Tue, 7 Feb 2012 18:07:38 -0600 | ||
4 | Subject: [PATCH 037/147] rtlwifi: Handle previous allocation failures when | ||
5 | freeing device memory | ||
6 | |||
7 | commit 7f66c2f93e5779625c10d262c84537427a2673ca upstream. | ||
8 | |||
9 | Handle previous allocation failures when freeing device memory | ||
10 | |||
11 | Signed-off-by: Simon Graham <simon.graham@virtualcomputer.com> | ||
12 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
13 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/net/wireless/rtlwifi/pci.c | 16 ++++++++++------ | ||
17 | 1 file changed, 10 insertions(+), 6 deletions(-) | ||
18 | |||
19 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c | ||
20 | index 19bb550..9afcad3 100644 | ||
21 | --- a/drivers/net/wireless/rtlwifi/pci.c | ||
22 | +++ b/drivers/net/wireless/rtlwifi/pci.c | ||
23 | @@ -1155,10 +1155,12 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw, | ||
24 | ring->idx = (ring->idx + 1) % ring->entries; | ||
25 | } | ||
26 | |||
27 | - pci_free_consistent(rtlpci->pdev, | ||
28 | - sizeof(*ring->desc) * ring->entries, | ||
29 | - ring->desc, ring->dma); | ||
30 | - ring->desc = NULL; | ||
31 | + if (ring->desc) { | ||
32 | + pci_free_consistent(rtlpci->pdev, | ||
33 | + sizeof(*ring->desc) * ring->entries, | ||
34 | + ring->desc, ring->dma); | ||
35 | + ring->desc = NULL; | ||
36 | + } | ||
37 | } | ||
38 | |||
39 | static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci) | ||
40 | @@ -1182,12 +1184,14 @@ static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci) | ||
41 | kfree_skb(skb); | ||
42 | } | ||
43 | |||
44 | - pci_free_consistent(rtlpci->pdev, | ||
45 | + if (rtlpci->rx_ring[rx_queue_idx].desc) { | ||
46 | + pci_free_consistent(rtlpci->pdev, | ||
47 | sizeof(*rtlpci->rx_ring[rx_queue_idx]. | ||
48 | desc) * rtlpci->rxringcount, | ||
49 | rtlpci->rx_ring[rx_queue_idx].desc, | ||
50 | rtlpci->rx_ring[rx_queue_idx].dma); | ||
51 | - rtlpci->rx_ring[rx_queue_idx].desc = NULL; | ||
52 | + rtlpci->rx_ring[rx_queue_idx].desc = NULL; | ||
53 | + } | ||
54 | } | ||
55 | } | ||
56 | |||
57 | -- | ||
58 | 1.7.9.4 | ||
59 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0038-rtlwifi-rtl8192c-Prevent-sleeping-from-invalid-conte.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0038-rtlwifi-rtl8192c-Prevent-sleeping-from-invalid-conte.patch new file mode 100644 index 00000000..cec2e0fd --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0038-rtlwifi-rtl8192c-Prevent-sleeping-from-invalid-conte.patch | |||
@@ -0,0 +1,56 @@ | |||
1 | From 9d3a0177f72e20f06c844ede994dc3541bdae01b Mon Sep 17 00:00:00 2001 | ||
2 | From: Larry Finger <Larry.Finger@lwfinger.net> | ||
3 | Date: Fri, 2 Mar 2012 15:23:36 -0600 | ||
4 | Subject: [PATCH 038/147] rtlwifi: rtl8192c: Prevent sleeping from invalid | ||
5 | context in rtl8192cu | ||
6 | |||
7 | commit ebecdcc12fed5d3c81853dea61a0a78a5aefab52 upstream. | ||
8 | |||
9 | When driver rtl8192cu is used with the debug level set to 3 or greater, | ||
10 | the result is "sleeping function called from invalid context" due to | ||
11 | an rcu_read_lock() call in the DM refresh routine in driver rtl8192c. | ||
12 | This lock is not necessary as the USB driver does not use the struct | ||
13 | being protected, thus the lock is set only when a PCI interface is | ||
14 | active. | ||
15 | |||
16 | This bug is reported in https://bugzilla.kernel.org/show_bug.cgi?id=42775. | ||
17 | |||
18 | Reported-by: Ronald Wahl <ronald.wahl@raritan.com> | ||
19 | Tested-by: Ronald Wahl <ronald.wahl@raritan.com> | ||
20 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
21 | Cc: Ronald Wahl <ronald.wahl@raritan.com> | ||
22 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
23 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
24 | --- | ||
25 | drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 11 ++++++++--- | ||
26 | 1 file changed, 8 insertions(+), 3 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
29 | index 72a98ca..4de6b78 100644 | ||
30 | --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
31 | +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
32 | @@ -1219,13 +1219,18 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw) | ||
33 | ("PreState = %d, CurState = %d\n", | ||
34 | p_ra->pre_ratr_state, p_ra->ratr_state)); | ||
35 | |||
36 | - rcu_read_lock(); | ||
37 | - sta = ieee80211_find_sta(mac->vif, mac->bssid); | ||
38 | + /* Only the PCI card uses sta in the update rate table | ||
39 | + * callback routine */ | ||
40 | + if (rtlhal->interface == INTF_PCI) { | ||
41 | + rcu_read_lock(); | ||
42 | + sta = ieee80211_find_sta(mac->vif, mac->bssid); | ||
43 | + } | ||
44 | rtlpriv->cfg->ops->update_rate_tbl(hw, sta, | ||
45 | p_ra->ratr_state); | ||
46 | |||
47 | p_ra->pre_ratr_state = p_ra->ratr_state; | ||
48 | - rcu_read_unlock(); | ||
49 | + if (rtlhal->interface == INTF_PCI) | ||
50 | + rcu_read_unlock(); | ||
51 | } | ||
52 | } | ||
53 | } | ||
54 | -- | ||
55 | 1.7.9.4 | ||
56 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0039-rtlwifi-rtl8192ce-Fix-loss-of-receive-performance.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0039-rtlwifi-rtl8192ce-Fix-loss-of-receive-performance.patch new file mode 100644 index 00000000..1df8ca91 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0039-rtlwifi-rtl8192ce-Fix-loss-of-receive-performance.patch | |||
@@ -0,0 +1,42 @@ | |||
1 | From 83d83582d1097f305c41838a2ca01dde71d608a1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jingjun Wu <jingjun_wu@realsil.com.cn> | ||
3 | Date: Fri, 2 Mar 2012 20:52:14 -0600 | ||
4 | Subject: [PATCH 039/147] rtlwifi: rtl8192ce: Fix loss of receive performance | ||
5 | |||
6 | commit a9b89e2567c743483e6354f64d7a7e3a8c101e9e upstream. | ||
7 | |||
8 | Driver rtl8192ce when used with the RTL8188CE device would start at about | ||
9 | 20 Mbps on a 54 Mbps connection, but quickly drop to 1 Mbps. One of the | ||
10 | symptoms is that the AP would need to retransmit each packet 4 of 5 times | ||
11 | before the driver would acknowledge it. Recovery is possible only by | ||
12 | unloading and reloading the driver. This problem was reported at | ||
13 | https://bugzilla.redhat.com/show_bug.cgi?id=770207. | ||
14 | |||
15 | The problem is due to a missing update of the gain setting. | ||
16 | |||
17 | Signed-off-by: Jingjun Wu <jingjun_wu@realsil.com.cn> | ||
18 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> | ||
19 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 4 ++++ | ||
23 | 1 file changed, 4 insertions(+) | ||
24 | |||
25 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
26 | index 4de6b78..a004ad7 100644 | ||
27 | --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
28 | +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | ||
29 | @@ -524,6 +524,10 @@ void rtl92c_dm_write_dig(struct ieee80211_hw *hw) | ||
30 | dm_digtable.cur_igvalue, dm_digtable.pre_igvalue, | ||
31 | dm_digtable.backoff_val)); | ||
32 | |||
33 | + dm_digtable.cur_igvalue += 2; | ||
34 | + if (dm_digtable.cur_igvalue > 0x3f) | ||
35 | + dm_digtable.cur_igvalue = 0x3f; | ||
36 | + | ||
37 | if (dm_digtable.pre_igvalue != dm_digtable.cur_igvalue) { | ||
38 | rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, | ||
39 | dm_digtable.cur_igvalue); | ||
40 | -- | ||
41 | 1.7.9.4 | ||
42 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0040-iwlwifi-always-monitor-for-stuck-queues.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0040-iwlwifi-always-monitor-for-stuck-queues.patch new file mode 100644 index 00000000..2e4e29f8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0040-iwlwifi-always-monitor-for-stuck-queues.patch | |||
@@ -0,0 +1,65 @@ | |||
1 | From 3d581df915fb46fe7929371df85da52ec6d65d69 Mon Sep 17 00:00:00 2001 | ||
2 | From: Johannes Berg <johannes.berg@intel.com> | ||
3 | Date: Sun, 4 Mar 2012 08:50:46 -0800 | ||
4 | Subject: [PATCH 040/147] iwlwifi: always monitor for stuck queues | ||
5 | |||
6 | commit 342bbf3fee2fa9a18147e74b2e3c4229a4564912 upstream. | ||
7 | |||
8 | If we only monitor while associated, the following | ||
9 | can happen: | ||
10 | - we're associated, and the queue stuck check | ||
11 | runs, setting the queue "touch" time to X | ||
12 | - we disassociate, stopping the monitoring, | ||
13 | which leaves the time set to X | ||
14 | - almost 2s later, we associate, and enqueue | ||
15 | a frame | ||
16 | - before the frame is transmitted, we monitor | ||
17 | for stuck queues, and find the time set to | ||
18 | X, although it is now later than X + 2000ms, | ||
19 | so we decide that the queue is stuck and | ||
20 | erroneously restart the device | ||
21 | |||
22 | It happens more with P2P because there we can | ||
23 | go between associated/unassociated frequently. | ||
24 | |||
25 | Reported-by: Ben Cahill <ben.m.cahill@intel.com> | ||
26 | Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||
27 | Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> | ||
28 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
29 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
30 | --- | ||
31 | drivers/net/wireless/iwlwifi/iwl-core.c | 18 ++++-------------- | ||
32 | 1 file changed, 4 insertions(+), 14 deletions(-) | ||
33 | |||
34 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
35 | index fcf5416..3d75d4c 100644 | ||
36 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c | ||
37 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
38 | @@ -1787,20 +1787,10 @@ void iwl_bg_watchdog(unsigned long data) | ||
39 | if (timeout == 0) | ||
40 | return; | ||
41 | |||
42 | - /* monitor and check for stuck cmd queue */ | ||
43 | - if (iwl_check_stuck_queue(priv, priv->shrd->cmd_queue)) | ||
44 | - return; | ||
45 | - | ||
46 | - /* monitor and check for other stuck queues */ | ||
47 | - if (iwl_is_any_associated(priv)) { | ||
48 | - for (cnt = 0; cnt < hw_params(priv).max_txq_num; cnt++) { | ||
49 | - /* skip as we already checked the command queue */ | ||
50 | - if (cnt == priv->shrd->cmd_queue) | ||
51 | - continue; | ||
52 | - if (iwl_check_stuck_queue(priv, cnt)) | ||
53 | - return; | ||
54 | - } | ||
55 | - } | ||
56 | + /* monitor and check for stuck queues */ | ||
57 | + for (cnt = 0; cnt < hw_params(priv).max_txq_num; cnt++) | ||
58 | + if (iwl_check_stuck_queue(priv, cnt)) | ||
59 | + return; | ||
60 | |||
61 | mod_timer(&priv->watchdog, jiffies + | ||
62 | msecs_to_jiffies(IWL_WD_TICK(timeout))); | ||
63 | -- | ||
64 | 1.7.9.4 | ||
65 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0041-math-Introduce-div64_long.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0041-math-Introduce-div64_long.patch new file mode 100644 index 00000000..e46ab87e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0041-math-Introduce-div64_long.patch | |||
@@ -0,0 +1,45 @@ | |||
1 | From 0041e471301214d86b8d15b4da69899f47161df6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Sasha Levin <levinsasha928@gmail.com> | ||
3 | Date: Thu, 15 Mar 2012 12:36:13 -0400 | ||
4 | Subject: [PATCH 041/147] math: Introduce div64_long | ||
5 | |||
6 | commit f910381a55cdaa097030291f272f6e6e4380c39a upstream. | ||
7 | |||
8 | Add a div64_long macro which is used to devide a 64bit number by a long (which | ||
9 | can be 4 bytes on 32bit systems and 8 bytes on 64bit systems). | ||
10 | |||
11 | Suggested-by: Thomas Gleixner <tglx@linutronix.de> | ||
12 | Signed-off-by: Sasha Levin <levinsasha928@gmail.com> | ||
13 | Cc: johnstul@us.ibm.com | ||
14 | Link: http://lkml.kernel.org/r/1331829374-31543-1-git-send-email-levinsasha928@gmail.com | ||
15 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | include/linux/math64.h | 4 ++++ | ||
19 | 1 file changed, 4 insertions(+) | ||
20 | |||
21 | diff --git a/include/linux/math64.h b/include/linux/math64.h | ||
22 | index 23fcdfc..b8ba855 100644 | ||
23 | --- a/include/linux/math64.h | ||
24 | +++ b/include/linux/math64.h | ||
25 | @@ -6,6 +6,8 @@ | ||
26 | |||
27 | #if BITS_PER_LONG == 64 | ||
28 | |||
29 | +#define div64_long(x,y) div64_s64((x),(y)) | ||
30 | + | ||
31 | /** | ||
32 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder | ||
33 | * | ||
34 | @@ -45,6 +47,8 @@ static inline s64 div64_s64(s64 dividend, s64 divisor) | ||
35 | |||
36 | #elif BITS_PER_LONG == 32 | ||
37 | |||
38 | +#define div64_long(x,y) div_s64((x),(y)) | ||
39 | + | ||
40 | #ifndef div_u64_rem | ||
41 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | ||
42 | { | ||
43 | -- | ||
44 | 1.7.9.4 | ||
45 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0042-ntp-Fix-integer-overflow-when-setting-time.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0042-ntp-Fix-integer-overflow-when-setting-time.patch new file mode 100644 index 00000000..f8e3d0da --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0042-ntp-Fix-integer-overflow-when-setting-time.patch | |||
@@ -0,0 +1,39 @@ | |||
1 | From c763173b9ab87b7413e63a82be88987250677b89 Mon Sep 17 00:00:00 2001 | ||
2 | From: Sasha Levin <levinsasha928@gmail.com> | ||
3 | Date: Thu, 15 Mar 2012 12:36:14 -0400 | ||
4 | Subject: [PATCH 042/147] ntp: Fix integer overflow when setting time | ||
5 | |||
6 | commit a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33 upstream. | ||
7 | |||
8 | 'long secs' is passed as divisor to div_s64, which accepts a 32bit | ||
9 | divisor. On 64bit machines that value is trimmed back from 8 bytes | ||
10 | back to 4, causing a divide by zero when the number is bigger than | ||
11 | (1 << 32) - 1 and all 32 lower bits are 0. | ||
12 | |||
13 | Use div64_long() instead. | ||
14 | |||
15 | Signed-off-by: Sasha Levin <levinsasha928@gmail.com> | ||
16 | Cc: johnstul@us.ibm.com | ||
17 | Link: http://lkml.kernel.org/r/1331829374-31543-2-git-send-email-levinsasha928@gmail.com | ||
18 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | kernel/time/ntp.c | 2 +- | ||
22 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
23 | |||
24 | diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c | ||
25 | index f6117a4..4b85a7a 100644 | ||
26 | --- a/kernel/time/ntp.c | ||
27 | +++ b/kernel/time/ntp.c | ||
28 | @@ -275,7 +275,7 @@ static inline s64 ntp_update_offset_fll(s64 offset64, long secs) | ||
29 | |||
30 | time_status |= STA_MODE; | ||
31 | |||
32 | - return div_s64(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs); | ||
33 | + return div64_long(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs); | ||
34 | } | ||
35 | |||
36 | static void ntp_update_offset(long offset) | ||
37 | -- | ||
38 | 1.7.9.4 | ||
39 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0043-uevent-send-events-in-correct-order-according-to-seq.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0043-uevent-send-events-in-correct-order-according-to-seq.patch new file mode 100644 index 00000000..8105acaf --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0043-uevent-send-events-in-correct-order-according-to-seq.patch | |||
@@ -0,0 +1,97 @@ | |||
1 | From 30890ccb8ef54dedb2569535dbb781fa2f10a119 Mon Sep 17 00:00:00 2001 | ||
2 | From: Andrew Vagin <avagin@openvz.org> | ||
3 | Date: Wed, 7 Mar 2012 14:49:56 +0400 | ||
4 | Subject: [PATCH 043/147] uevent: send events in correct order according to | ||
5 | seqnum (v3) | ||
6 | |||
7 | commit 7b60a18da393ed70db043a777fd9e6d5363077c4 upstream. | ||
8 | |||
9 | The queue handling in the udev daemon assumes that the events are | ||
10 | ordered. | ||
11 | |||
12 | Before this patch uevent_seqnum is incremented under sequence_lock, | ||
13 | than an event is send uner uevent_sock_mutex. I want to say that code | ||
14 | contained a window between incrementing seqnum and sending an event. | ||
15 | |||
16 | This patch locks uevent_sock_mutex before incrementing uevent_seqnum. | ||
17 | |||
18 | v2: delete sequence_lock, uevent_seqnum is protected by uevent_sock_mutex | ||
19 | v3: unlock the mutex before the goto exit | ||
20 | |||
21 | Thanks for Kay for the comments. | ||
22 | |||
23 | Signed-off-by: Andrew Vagin <avagin@openvz.org> | ||
24 | Tested-By: Kay Sievers <kay.sievers@vrfy.org> | ||
25 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
26 | --- | ||
27 | lib/kobject_uevent.c | 19 +++++++++---------- | ||
28 | 1 file changed, 9 insertions(+), 10 deletions(-) | ||
29 | |||
30 | diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c | ||
31 | index ad72a03..6d40244 100644 | ||
32 | --- a/lib/kobject_uevent.c | ||
33 | +++ b/lib/kobject_uevent.c | ||
34 | @@ -29,16 +29,17 @@ | ||
35 | |||
36 | u64 uevent_seqnum; | ||
37 | char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH; | ||
38 | -static DEFINE_SPINLOCK(sequence_lock); | ||
39 | #ifdef CONFIG_NET | ||
40 | struct uevent_sock { | ||
41 | struct list_head list; | ||
42 | struct sock *sk; | ||
43 | }; | ||
44 | static LIST_HEAD(uevent_sock_list); | ||
45 | -static DEFINE_MUTEX(uevent_sock_mutex); | ||
46 | #endif | ||
47 | |||
48 | +/* This lock protects uevent_seqnum and uevent_sock_list */ | ||
49 | +static DEFINE_MUTEX(uevent_sock_mutex); | ||
50 | + | ||
51 | /* the strings here must match the enum in include/linux/kobject.h */ | ||
52 | static const char *kobject_actions[] = { | ||
53 | [KOBJ_ADD] = "add", | ||
54 | @@ -136,7 +137,6 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | ||
55 | struct kobject *top_kobj; | ||
56 | struct kset *kset; | ||
57 | const struct kset_uevent_ops *uevent_ops; | ||
58 | - u64 seq; | ||
59 | int i = 0; | ||
60 | int retval = 0; | ||
61 | #ifdef CONFIG_NET | ||
62 | @@ -243,17 +243,16 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | ||
63 | else if (action == KOBJ_REMOVE) | ||
64 | kobj->state_remove_uevent_sent = 1; | ||
65 | |||
66 | + mutex_lock(&uevent_sock_mutex); | ||
67 | /* we will send an event, so request a new sequence number */ | ||
68 | - spin_lock(&sequence_lock); | ||
69 | - seq = ++uevent_seqnum; | ||
70 | - spin_unlock(&sequence_lock); | ||
71 | - retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq); | ||
72 | - if (retval) | ||
73 | + retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)++uevent_seqnum); | ||
74 | + if (retval) { | ||
75 | + mutex_unlock(&uevent_sock_mutex); | ||
76 | goto exit; | ||
77 | + } | ||
78 | |||
79 | #if defined(CONFIG_NET) | ||
80 | /* send netlink message */ | ||
81 | - mutex_lock(&uevent_sock_mutex); | ||
82 | list_for_each_entry(ue_sk, &uevent_sock_list, list) { | ||
83 | struct sock *uevent_sock = ue_sk->sk; | ||
84 | struct sk_buff *skb; | ||
85 | @@ -287,8 +286,8 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | ||
86 | } else | ||
87 | retval = -ENOMEM; | ||
88 | } | ||
89 | - mutex_unlock(&uevent_sock_mutex); | ||
90 | #endif | ||
91 | + mutex_unlock(&uevent_sock_mutex); | ||
92 | |||
93 | /* call uevent_helper, usually only enabled during early boot */ | ||
94 | if (uevent_helper[0] && !kobj_usermode_filter(kobj)) { | ||
95 | -- | ||
96 | 1.7.9.4 | ||
97 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0044-genirq-Fix-long-term-regression-in-genirq-irq_set_ir.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0044-genirq-Fix-long-term-regression-in-genirq-irq_set_ir.patch new file mode 100644 index 00000000..a19b4b04 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0044-genirq-Fix-long-term-regression-in-genirq-irq_set_ir.patch | |||
@@ -0,0 +1,96 @@ | |||
1 | From 30baeed7abf879cdb6abc168307abd194d0d2668 Mon Sep 17 00:00:00 2001 | ||
2 | From: Russell King <linux@arm.linux.org.uk> | ||
3 | Date: Mon, 5 Mar 2012 15:07:25 -0800 | ||
4 | Subject: [PATCH 044/147] genirq: Fix long-term regression in genirq | ||
5 | irq_set_irq_type() handling | ||
6 | |||
7 | commit a09b659cd68c10ec6a30cb91ebd2c327fcd5bfe5 upstream. | ||
8 | |||
9 | In 2008, commit 0c5d1eb77a8be ("genirq: record trigger type") modified the | ||
10 | way set_irq_type() handles the 'no trigger' condition. However, this has | ||
11 | an adverse effect on PCMCIA support on Intel StrongARM and probably PXA | ||
12 | platforms. | ||
13 | |||
14 | PCMCIA has several status signals on the socket which can trigger | ||
15 | interrupts; some of these status signals depend on the card's mode | ||
16 | (whether it is configured in memory or IO mode). For example, cards have | ||
17 | a 'Ready/IRQ' signal: in memory mode, this provides an indication to | ||
18 | PCMCIA that the card has finished its power up initialization. In IO | ||
19 | mode, it provides the device interrupt signal. Other status signals | ||
20 | switch between on-board battery status and loud speaker output. | ||
21 | |||
22 | In classical PCMCIA implementations, where you have a specific socket | ||
23 | controller, the controller provides a method to mask interrupts from the | ||
24 | socket, and importantly ignore any state transitions on the pins which | ||
25 | correspond with interrupts once masked. This masking prevents unwanted | ||
26 | events caused by the removal and application of socket power being | ||
27 | forwarded. | ||
28 | |||
29 | However, on platforms where there is no socket controller, the PCMCIA | ||
30 | status and interrupt signals are routed to standard edge-triggered GPIOs. | ||
31 | These GPIOs can be configured to interrupt on rising edge, falling edge, | ||
32 | or never. This is where the problems start. | ||
33 | |||
34 | Edge triggered interrupts are required to record events while disabled via | ||
35 | the usual methods of {free,request,disable,enable}_irq() to prevent | ||
36 | problems with dropped interrupts (eg, the 8390 driver uses disable_irq() | ||
37 | to defer the delivery of interrupts). As a result, these interfaces can | ||
38 | not be used to implement the desired behaviour. | ||
39 | |||
40 | The side effect of this is that if the 'Ready/IRQ' GPIO is disabled via | ||
41 | disable_irq() on suspend, and enabled via enable_irq() after resume, we | ||
42 | will record the state transitions caused by powering events as valid | ||
43 | interrupts, and foward them to the card driver, which may attempt to | ||
44 | access a card which is not powered up. | ||
45 | |||
46 | This leads delays resume while drivers spin in their interrupt handlers, | ||
47 | and complaints from drivers before they realize what's happened. | ||
48 | |||
49 | Moreover, in the case of the 'Ready/IRQ' signal, this is requested and | ||
50 | freed by the card driver itself; the PCMCIA core has no idea whether the | ||
51 | interrupt is requested, and, therefore, whether a call to disable_irq() | ||
52 | would be valid. (We tried this around 2.4.17 / 2.5.1 kernel era, and | ||
53 | ended up throwing it out because of this problem.) | ||
54 | |||
55 | Therefore, it was decided back in around 2002 to disable the edge | ||
56 | triggering instead, resulting in all state transitions on the GPIO being | ||
57 | ignored. That's what we actually need the hardware to do. | ||
58 | |||
59 | The commit above changes this behaviour; it explicitly prevents the 'no | ||
60 | trigger' state being selected. | ||
61 | |||
62 | The reason that request_irq() does not accept the 'no trigger' state is | ||
63 | for compatibility with existing drivers which do not provide their desired | ||
64 | triggering configuration. The set_irq_type() function is 'new' and not | ||
65 | used by non-trigger aware drivers. | ||
66 | |||
67 | Therefore, revert this change, and restore previously working platforms | ||
68 | back to their former state. | ||
69 | |||
70 | Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||
71 | Cc: linux@arm.linux.org.uk | ||
72 | Cc: Ingo Molnar <mingo@elte.hu> | ||
73 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
74 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
75 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
76 | --- | ||
77 | kernel/irq/chip.c | 3 +-- | ||
78 | 1 file changed, 1 insertion(+), 2 deletions(-) | ||
79 | |||
80 | diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c | ||
81 | index fb7db75..25784d6 100644 | ||
82 | --- a/kernel/irq/chip.c | ||
83 | +++ b/kernel/irq/chip.c | ||
84 | @@ -61,8 +61,7 @@ int irq_set_irq_type(unsigned int irq, unsigned int type) | ||
85 | return -EINVAL; | ||
86 | |||
87 | type &= IRQ_TYPE_SENSE_MASK; | ||
88 | - if (type != IRQ_TYPE_NONE) | ||
89 | - ret = __irq_set_trigger(desc, irq, type); | ||
90 | + ret = __irq_set_trigger(desc, irq, type); | ||
91 | irq_put_desc_busunlock(desc, flags); | ||
92 | return ret; | ||
93 | } | ||
94 | -- | ||
95 | 1.7.9.4 | ||
96 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0045-genirq-Fix-incorrect-check-for-forced-IRQ-thread-han.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0045-genirq-Fix-incorrect-check-for-forced-IRQ-thread-han.patch new file mode 100644 index 00000000..16059a0f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0045-genirq-Fix-incorrect-check-for-forced-IRQ-thread-han.patch | |||
@@ -0,0 +1,35 @@ | |||
1 | From 8cc03040447868b0c8ca3f6ca027fdf45216f493 Mon Sep 17 00:00:00 2001 | ||
2 | From: Alexander Gordeev <agordeev@redhat.com> | ||
3 | Date: Fri, 9 Mar 2012 14:59:13 +0100 | ||
4 | Subject: [PATCH 045/147] genirq: Fix incorrect check for forced IRQ thread | ||
5 | handler | ||
6 | |||
7 | commit 540b60e24f3f4781d80e47122f0c4486a03375b8 upstream. | ||
8 | |||
9 | We do not want a bitwise AND between boolean operands | ||
10 | |||
11 | Signed-off-by: Alexander Gordeev <agordeev@redhat.com> | ||
12 | Cc: Oleg Nesterov <oleg@redhat.com> | ||
13 | Link: http://lkml.kernel.org/r/20120309135912.GA2114@dhcp-26-207.brq.redhat.com | ||
14 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | kernel/irq/manage.c | 2 +- | ||
18 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
19 | |||
20 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c | ||
21 | index ae95cd2..7600092 100644 | ||
22 | --- a/kernel/irq/manage.c | ||
23 | +++ b/kernel/irq/manage.c | ||
24 | @@ -773,7 +773,7 @@ static int irq_thread(void *data) | ||
25 | struct irqaction *action); | ||
26 | int wake; | ||
27 | |||
28 | - if (force_irqthreads & test_bit(IRQTF_FORCED_THREAD, | ||
29 | + if (force_irqthreads && test_bit(IRQTF_FORCED_THREAD, | ||
30 | &action->thread_flags)) | ||
31 | handler_fn = irq_forced_thread_fn; | ||
32 | else | ||
33 | -- | ||
34 | 1.7.9.4 | ||
35 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0046-rtc-Disable-the-alarm-in-the-hardware-v2.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0046-rtc-Disable-the-alarm-in-the-hardware-v2.patch new file mode 100644 index 00000000..c7db9c65 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0046-rtc-Disable-the-alarm-in-the-hardware-v2.patch | |||
@@ -0,0 +1,76 @@ | |||
1 | From 7d3eb8bf92abead3bd005400d600f32ea4bf9d63 Mon Sep 17 00:00:00 2001 | ||
2 | From: Rabin Vincent <rabin.vincent@stericsson.com> | ||
3 | Date: Tue, 22 Nov 2011 11:03:14 +0100 | ||
4 | Subject: [PATCH 046/147] rtc: Disable the alarm in the hardware (v2) | ||
5 | |||
6 | commit 41c7f7424259ff11009449f87c95656f69f9b186 upstream. | ||
7 | |||
8 | Currently, the RTC code does not disable the alarm in the hardware. | ||
9 | |||
10 | This means that after a sequence such as the one below (the files are in the | ||
11 | RTC sysfs), the box will boot up after 2 minutes even though we've | ||
12 | asked for the alarm to be turned off. | ||
13 | |||
14 | # echo $((`cat since_epoch`)+120) > wakealarm | ||
15 | # echo 0 > wakealarm | ||
16 | # poweroff | ||
17 | |||
18 | Fix this by disabling the alarm when there are no timers to run. | ||
19 | |||
20 | The original version of this patch was reverted. This version | ||
21 | disables the irq directly instead of setting a disabled timer | ||
22 | in the future. | ||
23 | |||
24 | Cc: John Stultz <john.stultz@linaro.org> | ||
25 | Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com> | ||
26 | [Merged in the second revision from Rabin] | ||
27 | Signed-off-by: John Stultz <john.stultz@linaro.org> | ||
28 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
29 | --- | ||
30 | drivers/rtc/interface.c | 15 +++++++++++++-- | ||
31 | 1 file changed, 13 insertions(+), 2 deletions(-) | ||
32 | |||
33 | diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c | ||
34 | index 8a1c031..c1edbf8 100644 | ||
35 | --- a/drivers/rtc/interface.c | ||
36 | +++ b/drivers/rtc/interface.c | ||
37 | @@ -763,6 +763,14 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) | ||
38 | return 0; | ||
39 | } | ||
40 | |||
41 | +static void rtc_alarm_disable(struct rtc_device *rtc) | ||
42 | +{ | ||
43 | + if (!rtc->ops || !rtc->ops->alarm_irq_enable) | ||
44 | + return; | ||
45 | + | ||
46 | + rtc->ops->alarm_irq_enable(rtc->dev.parent, false); | ||
47 | +} | ||
48 | + | ||
49 | /** | ||
50 | * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue | ||
51 | * @rtc rtc device | ||
52 | @@ -784,8 +792,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer) | ||
53 | struct rtc_wkalrm alarm; | ||
54 | int err; | ||
55 | next = timerqueue_getnext(&rtc->timerqueue); | ||
56 | - if (!next) | ||
57 | + if (!next) { | ||
58 | + rtc_alarm_disable(rtc); | ||
59 | return; | ||
60 | + } | ||
61 | alarm.time = rtc_ktime_to_tm(next->expires); | ||
62 | alarm.enabled = 1; | ||
63 | err = __rtc_set_alarm(rtc, &alarm); | ||
64 | @@ -847,7 +857,8 @@ again: | ||
65 | err = __rtc_set_alarm(rtc, &alarm); | ||
66 | if (err == -ETIME) | ||
67 | goto again; | ||
68 | - } | ||
69 | + } else | ||
70 | + rtc_alarm_disable(rtc); | ||
71 | |||
72 | mutex_unlock(&rtc->ops_lock); | ||
73 | } | ||
74 | -- | ||
75 | 1.7.9.4 | ||
76 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0047-p54spi-Release-GPIO-lines-and-IRQ-on-error-in-p54spi.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0047-p54spi-Release-GPIO-lines-and-IRQ-on-error-in-p54spi.patch new file mode 100644 index 00000000..2ecd9fe6 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0047-p54spi-Release-GPIO-lines-and-IRQ-on-error-in-p54spi.patch | |||
@@ -0,0 +1,71 @@ | |||
1 | From 4a8252cb16f69ca39f21e3bf65064d70046adf38 Mon Sep 17 00:00:00 2001 | ||
2 | From: Max Filippov <jcmvbkbc@gmail.com> | ||
3 | Date: Thu, 1 Mar 2012 00:40:08 +0400 | ||
4 | Subject: [PATCH 047/147] p54spi: Release GPIO lines and IRQ on error in | ||
5 | p54spi_probe | ||
6 | |||
7 | commit 62ebeed8d00aef75eac4fd6c161cae75a41965ca upstream. | ||
8 | |||
9 | This makes it possible to reload driver if insmod has failed due to | ||
10 | missing firmware. | ||
11 | |||
12 | Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> | ||
13 | Acked-by: Christian Lamparter <chunkeey@googlemail.com> | ||
14 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/net/wireless/p54/p54spi.c | 14 ++++++++++---- | ||
18 | 1 file changed, 10 insertions(+), 4 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/net/wireless/p54/p54spi.c b/drivers/net/wireless/p54/p54spi.c | ||
21 | index 78d0d69..428401b 100644 | ||
22 | --- a/drivers/net/wireless/p54/p54spi.c | ||
23 | +++ b/drivers/net/wireless/p54/p54spi.c | ||
24 | @@ -622,19 +622,19 @@ static int __devinit p54spi_probe(struct spi_device *spi) | ||
25 | ret = spi_setup(spi); | ||
26 | if (ret < 0) { | ||
27 | dev_err(&priv->spi->dev, "spi_setup failed"); | ||
28 | - goto err_free_common; | ||
29 | + goto err_free; | ||
30 | } | ||
31 | |||
32 | ret = gpio_request(p54spi_gpio_power, "p54spi power"); | ||
33 | if (ret < 0) { | ||
34 | dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret); | ||
35 | - goto err_free_common; | ||
36 | + goto err_free; | ||
37 | } | ||
38 | |||
39 | ret = gpio_request(p54spi_gpio_irq, "p54spi irq"); | ||
40 | if (ret < 0) { | ||
41 | dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret); | ||
42 | - goto err_free_common; | ||
43 | + goto err_free_gpio_power; | ||
44 | } | ||
45 | |||
46 | gpio_direction_output(p54spi_gpio_power, 0); | ||
47 | @@ -645,7 +645,7 @@ static int __devinit p54spi_probe(struct spi_device *spi) | ||
48 | priv->spi); | ||
49 | if (ret < 0) { | ||
50 | dev_err(&priv->spi->dev, "request_irq() failed"); | ||
51 | - goto err_free_common; | ||
52 | + goto err_free_gpio_irq; | ||
53 | } | ||
54 | |||
55 | irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING); | ||
56 | @@ -677,6 +677,12 @@ static int __devinit p54spi_probe(struct spi_device *spi) | ||
57 | return 0; | ||
58 | |||
59 | err_free_common: | ||
60 | + free_irq(gpio_to_irq(p54spi_gpio_irq), spi); | ||
61 | +err_free_gpio_irq: | ||
62 | + gpio_free(p54spi_gpio_irq); | ||
63 | +err_free_gpio_power: | ||
64 | + gpio_free(p54spi_gpio_power); | ||
65 | +err_free: | ||
66 | p54_free_common(priv->hw); | ||
67 | return ret; | ||
68 | } | ||
69 | -- | ||
70 | 1.7.9.4 | ||
71 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0048-rtnetlink-Fix-VF-IFLA-policy.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0048-rtnetlink-Fix-VF-IFLA-policy.patch new file mode 100644 index 00000000..f938d1c4 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0048-rtnetlink-Fix-VF-IFLA-policy.patch | |||
@@ -0,0 +1,38 @@ | |||
1 | From cf7eecb4e8e024ff0de45c29a63241a518ddf4a0 Mon Sep 17 00:00:00 2001 | ||
2 | From: Greg Rose <gregory.v.rose@intel.com> | ||
3 | Date: Wed, 8 Feb 2012 00:45:00 +0000 | ||
4 | Subject: [PATCH 048/147] rtnetlink: Fix VF IFLA policy | ||
5 | |||
6 | commit 48752f6513012a1b078da08b145d5c40a644f058 upstream. | ||
7 | |||
8 | Add VF spoof check to IFLA policy. The original patch I submitted to | ||
9 | add the spoof checking feature to rtnl failed to add the proper policy | ||
10 | rule that identifies the data type and len. This patch corrects that | ||
11 | oversight. No bugs have been reported against this but it may cause | ||
12 | some problem for the netlink message parsing that uses the policy | ||
13 | table. | ||
14 | |||
15 | Signed-off-by: Greg Rose <gregory.v.rose@intel.com> | ||
16 | Tested-by: Sibai Li <sibai.li@intel.com> | ||
17 | Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | net/core/rtnetlink.c | 2 ++ | ||
21 | 1 file changed, 2 insertions(+) | ||
22 | |||
23 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c | ||
24 | index 9083e82..2ef859a 100644 | ||
25 | --- a/net/core/rtnetlink.c | ||
26 | +++ b/net/core/rtnetlink.c | ||
27 | @@ -1116,6 +1116,8 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { | ||
28 | .len = sizeof(struct ifla_vf_vlan) }, | ||
29 | [IFLA_VF_TX_RATE] = { .type = NLA_BINARY, | ||
30 | .len = sizeof(struct ifla_vf_tx_rate) }, | ||
31 | + [IFLA_VF_SPOOFCHK] = { .type = NLA_BINARY, | ||
32 | + .len = sizeof(struct ifla_vf_spoofchk) }, | ||
33 | }; | ||
34 | |||
35 | static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = { | ||
36 | -- | ||
37 | 1.7.9.4 | ||
38 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0049-IB-iser-Post-initial-receive-buffers-before-sending-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0049-IB-iser-Post-initial-receive-buffers-before-sending-.patch new file mode 100644 index 00000000..8d3cd740 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0049-IB-iser-Post-initial-receive-buffers-before-sending-.patch | |||
@@ -0,0 +1,143 @@ | |||
1 | From de960f13b12a65cff5f74f1f7bb6871fbd9ac432 Mon Sep 17 00:00:00 2001 | ||
2 | From: Or Gerlitz <ogerlitz@mellanox.com> | ||
3 | Date: Mon, 5 Mar 2012 18:21:44 +0200 | ||
4 | Subject: [PATCH 049/147] IB/iser: Post initial receive buffers before sending | ||
5 | the final login request | ||
6 | |||
7 | commit 89e984e2c2cd14f77ccb26c47726ac7f13b70ae8 upstream. | ||
8 | |||
9 | An iser target may send iscsi NO-OP PDUs as soon as it marks the iSER | ||
10 | iSCSI session as fully operative. This means that there is window | ||
11 | where there are no posted receive buffers on the initiator side, so | ||
12 | it's possible for the iSER RC connection to break because of RNR NAK / | ||
13 | retry errors. To fix this, rely on the flags bits in the login | ||
14 | request to have FFP (0x3) in the lower nibble as a marker for the | ||
15 | final login request, and post an initial chunk of receive buffers | ||
16 | before sending that login request instead of after getting the login | ||
17 | response. | ||
18 | |||
19 | Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> | ||
20 | Signed-off-by: Roland Dreier <roland@purestorage.com> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | drivers/infiniband/ulp/iser/iscsi_iser.c | 18 ++++------------ | ||
24 | drivers/infiniband/ulp/iser/iscsi_iser.h | 1 + | ||
25 | drivers/infiniband/ulp/iser/iser_initiator.c | 30 +++++++++++++++----------- | ||
26 | 3 files changed, 22 insertions(+), 27 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
29 | index 7e7373a..d5f3b69 100644 | ||
30 | --- a/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
31 | +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
32 | @@ -364,6 +364,9 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session, | ||
33 | } | ||
34 | ib_conn = ep->dd_data; | ||
35 | |||
36 | + if (iser_alloc_rx_descriptors(ib_conn)) | ||
37 | + return -ENOMEM; | ||
38 | + | ||
39 | /* binds the iSER connection retrieved from the previously | ||
40 | * connected ep_handle to the iSCSI layer connection. exchanges | ||
41 | * connection pointers */ | ||
42 | @@ -398,19 +401,6 @@ iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) | ||
43 | iser_conn->ib_conn = NULL; | ||
44 | } | ||
45 | |||
46 | -static int | ||
47 | -iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn) | ||
48 | -{ | ||
49 | - struct iscsi_conn *conn = cls_conn->dd_data; | ||
50 | - int err; | ||
51 | - | ||
52 | - err = iser_conn_set_full_featured_mode(conn); | ||
53 | - if (err) | ||
54 | - return err; | ||
55 | - | ||
56 | - return iscsi_conn_start(cls_conn); | ||
57 | -} | ||
58 | - | ||
59 | static void iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session) | ||
60 | { | ||
61 | struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); | ||
62 | @@ -724,7 +714,7 @@ static struct iscsi_transport iscsi_iser_transport = { | ||
63 | .get_conn_param = iscsi_conn_get_param, | ||
64 | .get_ep_param = iscsi_iser_get_ep_param, | ||
65 | .get_session_param = iscsi_session_get_param, | ||
66 | - .start_conn = iscsi_iser_conn_start, | ||
67 | + .start_conn = iscsi_conn_start, | ||
68 | .stop_conn = iscsi_iser_conn_stop, | ||
69 | /* iscsi host params */ | ||
70 | .get_host_param = iscsi_host_get_param, | ||
71 | diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
72 | index db7ea37..296be43 100644 | ||
73 | --- a/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
74 | +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
75 | @@ -366,4 +366,5 @@ int iser_dma_map_task_data(struct iscsi_iser_task *iser_task, | ||
76 | void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task); | ||
77 | int iser_initialize_task_headers(struct iscsi_task *task, | ||
78 | struct iser_tx_desc *tx_desc); | ||
79 | +int iser_alloc_rx_descriptors(struct iser_conn *ib_conn); | ||
80 | #endif | ||
81 | diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
82 | index a607542..738a149 100644 | ||
83 | --- a/drivers/infiniband/ulp/iser/iser_initiator.c | ||
84 | +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
85 | @@ -170,7 +170,7 @@ static void iser_create_send_desc(struct iser_conn *ib_conn, | ||
86 | } | ||
87 | |||
88 | |||
89 | -static int iser_alloc_rx_descriptors(struct iser_conn *ib_conn) | ||
90 | +int iser_alloc_rx_descriptors(struct iser_conn *ib_conn) | ||
91 | { | ||
92 | int i, j; | ||
93 | u64 dma_addr; | ||
94 | @@ -242,23 +242,24 @@ void iser_free_rx_descriptors(struct iser_conn *ib_conn) | ||
95 | kfree(ib_conn->rx_descs); | ||
96 | } | ||
97 | |||
98 | -/** | ||
99 | - * iser_conn_set_full_featured_mode - (iSER API) | ||
100 | - */ | ||
101 | -int iser_conn_set_full_featured_mode(struct iscsi_conn *conn) | ||
102 | +static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req) | ||
103 | { | ||
104 | struct iscsi_iser_conn *iser_conn = conn->dd_data; | ||
105 | |||
106 | - iser_dbg("Initially post: %d\n", ISER_MIN_POSTED_RX); | ||
107 | - | ||
108 | - /* Check that there is no posted recv or send buffers left - */ | ||
109 | - /* they must be consumed during the login phase */ | ||
110 | - BUG_ON(iser_conn->ib_conn->post_recv_buf_count != 0); | ||
111 | - BUG_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0); | ||
112 | + iser_dbg("req op %x flags %x\n", req->opcode, req->flags); | ||
113 | + /* check if this is the last login - going to full feature phase */ | ||
114 | + if ((req->flags & ISCSI_FULL_FEATURE_PHASE) != ISCSI_FULL_FEATURE_PHASE) | ||
115 | + return 0; | ||
116 | |||
117 | - if (iser_alloc_rx_descriptors(iser_conn->ib_conn)) | ||
118 | - return -ENOMEM; | ||
119 | + /* | ||
120 | + * Check that there is one posted recv buffer (for the last login | ||
121 | + * response) and no posted send buffers left - they must have been | ||
122 | + * consumed during previous login phases. | ||
123 | + */ | ||
124 | + WARN_ON(iser_conn->ib_conn->post_recv_buf_count != 1); | ||
125 | + WARN_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0); | ||
126 | |||
127 | + iser_dbg("Initially post: %d\n", ISER_MIN_POSTED_RX); | ||
128 | /* Initial post receive buffers */ | ||
129 | if (iser_post_recvm(iser_conn->ib_conn, ISER_MIN_POSTED_RX)) | ||
130 | return -ENOMEM; | ||
131 | @@ -438,6 +439,9 @@ int iser_send_control(struct iscsi_conn *conn, | ||
132 | err = iser_post_recvl(iser_conn->ib_conn); | ||
133 | if (err) | ||
134 | goto send_control_error; | ||
135 | + err = iser_post_rx_bufs(conn, task->hdr); | ||
136 | + if (err) | ||
137 | + goto send_control_error; | ||
138 | } | ||
139 | |||
140 | err = iser_post_send(iser_conn->ib_conn, mdesc); | ||
141 | -- | ||
142 | 1.7.9.4 | ||
143 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0050-ima-fix-Kconfig-dependencies.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0050-ima-fix-Kconfig-dependencies.patch new file mode 100644 index 00000000..d1add071 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0050-ima-fix-Kconfig-dependencies.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | From 48128d2a875a34aeef5b89ed93e2887179534b33 Mon Sep 17 00:00:00 2001 | ||
2 | From: Fabio Estevam <festevam@gmail.com> | ||
3 | Date: Thu, 5 Jan 2012 12:49:54 -0200 | ||
4 | Subject: [PATCH 050/147] ima: fix Kconfig dependencies | ||
5 | |||
6 | commit f4a0391dfa91155bd961673b31eb42d9d45c799d upstream. | ||
7 | |||
8 | Fix the following build warning: | ||
9 | warning: (IMA) selects TCG_TPM which has unmet direct dependencies | ||
10 | (HAS_IOMEM && EXPERIMENTAL) | ||
11 | |||
12 | Suggested-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com> | ||
13 | Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> | ||
14 | Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com> | ||
15 | Signed-off-by: Mimi Zohar <zohar@us.ibm.com> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/char/tpm/Kconfig | 1 - | ||
19 | security/integrity/ima/Kconfig | 2 +- | ||
20 | 2 files changed, 1 insertion(+), 2 deletions(-) | ||
21 | |||
22 | diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig | ||
23 | index fa567f1..c9e045c 100644 | ||
24 | --- a/drivers/char/tpm/Kconfig | ||
25 | +++ b/drivers/char/tpm/Kconfig | ||
26 | @@ -5,7 +5,6 @@ | ||
27 | menuconfig TCG_TPM | ||
28 | tristate "TPM Hardware Support" | ||
29 | depends on HAS_IOMEM | ||
30 | - depends on EXPERIMENTAL | ||
31 | select SECURITYFS | ||
32 | ---help--- | ||
33 | If you have a TPM security chip in your system, which | ||
34 | diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig | ||
35 | index 4f554f2..063298a 100644 | ||
36 | --- a/security/integrity/ima/Kconfig | ||
37 | +++ b/security/integrity/ima/Kconfig | ||
38 | @@ -9,7 +9,7 @@ config IMA | ||
39 | select CRYPTO_HMAC | ||
40 | select CRYPTO_MD5 | ||
41 | select CRYPTO_SHA1 | ||
42 | - select TCG_TPM if !S390 && !UML | ||
43 | + select TCG_TPM if HAS_IOMEM && !UML | ||
44 | select TCG_TIS if TCG_TPM | ||
45 | help | ||
46 | The Trusted Computing Group(TCG) runtime Integrity | ||
47 | -- | ||
48 | 1.7.9.4 | ||
49 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0051-x86-ioapic-Add-register-level-checks-to-detect-bogus.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0051-x86-ioapic-Add-register-level-checks-to-detect-bogus.patch new file mode 100644 index 00000000..a5030626 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0051-x86-ioapic-Add-register-level-checks-to-detect-bogus.patch | |||
@@ -0,0 +1,113 @@ | |||
1 | From 817b882783a89bae08689d9eff2b5af91f44c4e1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Suresh Siddha <suresh.b.siddha@intel.com> | ||
3 | Date: Mon, 12 Mar 2012 11:36:33 -0700 | ||
4 | Subject: [PATCH 051/147] x86/ioapic: Add register level checks to detect | ||
5 | bogus io-apic entries | ||
6 | MIME-Version: 1.0 | ||
7 | Content-Type: text/plain; charset=UTF-8 | ||
8 | Content-Transfer-Encoding: 8bit | ||
9 | |||
10 | commit 73d63d038ee9f769f5e5b46792d227fe20e442c5 upstream. | ||
11 | |||
12 | With the recent changes to clear_IO_APIC_pin() which tries to | ||
13 | clear remoteIRR bit explicitly, some of the users started to see | ||
14 | "Unable to reset IRR for apic .." messages. | ||
15 | |||
16 | Close look shows that these are related to bogus IO-APIC entries | ||
17 | which return's all 1's for their io-apic registers. And the | ||
18 | above mentioned error messages are benign. But kernel should | ||
19 | have ignored such io-apic's in the first place. | ||
20 | |||
21 | Check if register 0, 1, 2 of the listed io-apic are all 1's and | ||
22 | ignore such io-apic. | ||
23 | |||
24 | Reported-by: ??lvaro Castillo <midgoon@gmail.com> | ||
25 | Tested-by: Jon Dufresne <jon@jondufresne.org> | ||
26 | Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> | ||
27 | Cc: yinghai@kernel.org | ||
28 | Cc: kernel-team@fedoraproject.org | ||
29 | Cc: Josh Boyer <jwboyer@redhat.com> | ||
30 | Link: http://lkml.kernel.org/r/1331577393.31585.94.camel@sbsiddha-desk.sc.intel.com | ||
31 | [ Performed minor cleanup of affected code. ] | ||
32 | Signed-off-by: Ingo Molnar <mingo@elte.hu> | ||
33 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
34 | --- | ||
35 | arch/x86/kernel/apic/io_apic.c | 40 ++++++++++++++++++++++++++++++++-------- | ||
36 | 1 file changed, 32 insertions(+), 8 deletions(-) | ||
37 | |||
38 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c | ||
39 | index 6d939d7..a25e276 100644 | ||
40 | --- a/arch/x86/kernel/apic/io_apic.c | ||
41 | +++ b/arch/x86/kernel/apic/io_apic.c | ||
42 | @@ -3963,18 +3963,36 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi) | ||
43 | static __init int bad_ioapic(unsigned long address) | ||
44 | { | ||
45 | if (nr_ioapics >= MAX_IO_APICS) { | ||
46 | - printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded " | ||
47 | - "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics); | ||
48 | + pr_warn("WARNING: Max # of I/O APICs (%d) exceeded (found %d), skipping\n", | ||
49 | + MAX_IO_APICS, nr_ioapics); | ||
50 | return 1; | ||
51 | } | ||
52 | if (!address) { | ||
53 | - printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address" | ||
54 | - " found in table, skipping!\n"); | ||
55 | + pr_warn("WARNING: Bogus (zero) I/O APIC address found in table, skipping!\n"); | ||
56 | return 1; | ||
57 | } | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | +static __init int bad_ioapic_register(int idx) | ||
62 | +{ | ||
63 | + union IO_APIC_reg_00 reg_00; | ||
64 | + union IO_APIC_reg_01 reg_01; | ||
65 | + union IO_APIC_reg_02 reg_02; | ||
66 | + | ||
67 | + reg_00.raw = io_apic_read(idx, 0); | ||
68 | + reg_01.raw = io_apic_read(idx, 1); | ||
69 | + reg_02.raw = io_apic_read(idx, 2); | ||
70 | + | ||
71 | + if (reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1) { | ||
72 | + pr_warn("I/O APIC 0x%x registers return all ones, skipping!\n", | ||
73 | + mpc_ioapic_addr(idx)); | ||
74 | + return 1; | ||
75 | + } | ||
76 | + | ||
77 | + return 0; | ||
78 | +} | ||
79 | + | ||
80 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | ||
81 | { | ||
82 | int idx = 0; | ||
83 | @@ -3991,6 +4009,12 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | ||
84 | ioapics[idx].mp_config.apicaddr = address; | ||
85 | |||
86 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | ||
87 | + | ||
88 | + if (bad_ioapic_register(idx)) { | ||
89 | + clear_fixmap(FIX_IO_APIC_BASE_0 + idx); | ||
90 | + return; | ||
91 | + } | ||
92 | + | ||
93 | ioapics[idx].mp_config.apicid = io_apic_unique_id(id); | ||
94 | ioapics[idx].mp_config.apicver = io_apic_get_version(idx); | ||
95 | |||
96 | @@ -4011,10 +4035,10 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | ||
97 | if (gsi_cfg->gsi_end >= gsi_top) | ||
98 | gsi_top = gsi_cfg->gsi_end + 1; | ||
99 | |||
100 | - printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | ||
101 | - "GSI %d-%d\n", idx, mpc_ioapic_id(idx), | ||
102 | - mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), | ||
103 | - gsi_cfg->gsi_base, gsi_cfg->gsi_end); | ||
104 | + pr_info("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, GSI %d-%d\n", | ||
105 | + idx, mpc_ioapic_id(idx), | ||
106 | + mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), | ||
107 | + gsi_cfg->gsi_base, gsi_cfg->gsi_end); | ||
108 | |||
109 | nr_ioapics++; | ||
110 | } | ||
111 | -- | ||
112 | 1.7.9.4 | ||
113 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0052-mm-thp-fix-pmd_bad-triggering-in-code-paths-holding-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0052-mm-thp-fix-pmd_bad-triggering-in-code-paths-holding-.patch new file mode 100644 index 00000000..d281a103 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0052-mm-thp-fix-pmd_bad-triggering-in-code-paths-holding-.patch | |||
@@ -0,0 +1,480 @@ | |||
1 | From 11c78e244603f384d1f8cebc627823cc01e952eb Mon Sep 17 00:00:00 2001 | ||
2 | From: Andrea Arcangeli <aarcange@redhat.com> | ||
3 | Date: Wed, 21 Mar 2012 16:33:42 -0700 | ||
4 | Subject: [PATCH 052/147] mm: thp: fix pmd_bad() triggering in code paths | ||
5 | holding mmap_sem read mode | ||
6 | |||
7 | commit 1a5a9906d4e8d1976b701f889d8f35d54b928f25 upstream. | ||
8 | |||
9 | In some cases it may happen that pmd_none_or_clear_bad() is called with | ||
10 | the mmap_sem hold in read mode. In those cases the huge page faults can | ||
11 | allocate hugepmds under pmd_none_or_clear_bad() and that can trigger a | ||
12 | false positive from pmd_bad() that will not like to see a pmd | ||
13 | materializing as trans huge. | ||
14 | |||
15 | It's not khugepaged causing the problem, khugepaged holds the mmap_sem | ||
16 | in write mode (and all those sites must hold the mmap_sem in read mode | ||
17 | to prevent pagetables to go away from under them, during code review it | ||
18 | seems vm86 mode on 32bit kernels requires that too unless it's | ||
19 | restricted to 1 thread per process or UP builds). The race is only with | ||
20 | the huge pagefaults that can convert a pmd_none() into a | ||
21 | pmd_trans_huge(). | ||
22 | |||
23 | Effectively all these pmd_none_or_clear_bad() sites running with | ||
24 | mmap_sem in read mode are somewhat speculative with the page faults, and | ||
25 | the result is always undefined when they run simultaneously. This is | ||
26 | probably why it wasn't common to run into this. For example if the | ||
27 | madvise(MADV_DONTNEED) runs zap_page_range() shortly before the page | ||
28 | fault, the hugepage will not be zapped, if the page fault runs first it | ||
29 | will be zapped. | ||
30 | |||
31 | Altering pmd_bad() not to error out if it finds hugepmds won't be enough | ||
32 | to fix this, because zap_pmd_range would then proceed to call | ||
33 | zap_pte_range (which would be incorrect if the pmd become a | ||
34 | pmd_trans_huge()). | ||
35 | |||
36 | The simplest way to fix this is to read the pmd in the local stack | ||
37 | (regardless of what we read, no need of actual CPU barriers, only | ||
38 | compiler barrier needed), and be sure it is not changing under the code | ||
39 | that computes its value. Even if the real pmd is changing under the | ||
40 | value we hold on the stack, we don't care. If we actually end up in | ||
41 | zap_pte_range it means the pmd was not none already and it was not huge, | ||
42 | and it can't become huge from under us (khugepaged locking explained | ||
43 | above). | ||
44 | |||
45 | All we need is to enforce that there is no way anymore that in a code | ||
46 | path like below, pmd_trans_huge can be false, but pmd_none_or_clear_bad | ||
47 | can run into a hugepmd. The overhead of a barrier() is just a compiler | ||
48 | tweak and should not be measurable (I only added it for THP builds). I | ||
49 | don't exclude different compiler versions may have prevented the race | ||
50 | too by caching the value of *pmd on the stack (that hasn't been | ||
51 | verified, but it wouldn't be impossible considering | ||
52 | pmd_none_or_clear_bad, pmd_bad, pmd_trans_huge, pmd_none are all inlines | ||
53 | and there's no external function called in between pmd_trans_huge and | ||
54 | pmd_none_or_clear_bad). | ||
55 | |||
56 | if (pmd_trans_huge(*pmd)) { | ||
57 | if (next-addr != HPAGE_PMD_SIZE) { | ||
58 | VM_BUG_ON(!rwsem_is_locked(&tlb->mm->mmap_sem)); | ||
59 | split_huge_page_pmd(vma->vm_mm, pmd); | ||
60 | } else if (zap_huge_pmd(tlb, vma, pmd, addr)) | ||
61 | continue; | ||
62 | /* fall through */ | ||
63 | } | ||
64 | if (pmd_none_or_clear_bad(pmd)) | ||
65 | |||
66 | Because this race condition could be exercised without special | ||
67 | privileges this was reported in CVE-2012-1179. | ||
68 | |||
69 | The race was identified and fully explained by Ulrich who debugged it. | ||
70 | I'm quoting his accurate explanation below, for reference. | ||
71 | |||
72 | ====== start quote ======= | ||
73 | mapcount 0 page_mapcount 1 | ||
74 | kernel BUG at mm/huge_memory.c:1384! | ||
75 | |||
76 | At some point prior to the panic, a "bad pmd ..." message similar to the | ||
77 | following is logged on the console: | ||
78 | |||
79 | mm/memory.c:145: bad pmd ffff8800376e1f98(80000000314000e7). | ||
80 | |||
81 | The "bad pmd ..." message is logged by pmd_clear_bad() before it clears | ||
82 | the page's PMD table entry. | ||
83 | |||
84 | 143 void pmd_clear_bad(pmd_t *pmd) | ||
85 | 144 { | ||
86 | -> 145 pmd_ERROR(*pmd); | ||
87 | 146 pmd_clear(pmd); | ||
88 | 147 } | ||
89 | |||
90 | After the PMD table entry has been cleared, there is an inconsistency | ||
91 | between the actual number of PMD table entries that are mapping the page | ||
92 | and the page's map count (_mapcount field in struct page). When the page | ||
93 | is subsequently reclaimed, __split_huge_page() detects this inconsistency. | ||
94 | |||
95 | 1381 if (mapcount != page_mapcount(page)) | ||
96 | 1382 printk(KERN_ERR "mapcount %d page_mapcount %d\n", | ||
97 | 1383 mapcount, page_mapcount(page)); | ||
98 | -> 1384 BUG_ON(mapcount != page_mapcount(page)); | ||
99 | |||
100 | The root cause of the problem is a race of two threads in a multithreaded | ||
101 | process. Thread B incurs a page fault on a virtual address that has never | ||
102 | been accessed (PMD entry is zero) while Thread A is executing an madvise() | ||
103 | system call on a virtual address within the same 2 MB (huge page) range. | ||
104 | |||
105 | virtual address space | ||
106 | .---------------------. | ||
107 | | | | ||
108 | | | | ||
109 | .-|---------------------| | ||
110 | | | | | ||
111 | | | |<-- B(fault) | ||
112 | | | | | ||
113 | 2 MB | |/////////////////////|-. | ||
114 | huge < |/////////////////////| > A(range) | ||
115 | page | |/////////////////////|-' | ||
116 | | | | | ||
117 | | | | | ||
118 | '-|---------------------| | ||
119 | | | | ||
120 | | | | ||
121 | '---------------------' | ||
122 | |||
123 | - Thread A is executing an madvise(..., MADV_DONTNEED) system call | ||
124 | on the virtual address range "A(range)" shown in the picture. | ||
125 | |||
126 | sys_madvise | ||
127 | // Acquire the semaphore in shared mode. | ||
128 | down_read(¤t->mm->mmap_sem) | ||
129 | ... | ||
130 | madvise_vma | ||
131 | switch (behavior) | ||
132 | case MADV_DONTNEED: | ||
133 | madvise_dontneed | ||
134 | zap_page_range | ||
135 | unmap_vmas | ||
136 | unmap_page_range | ||
137 | zap_pud_range | ||
138 | zap_pmd_range | ||
139 | // | ||
140 | // Assume that this huge page has never been accessed. | ||
141 | // I.e. content of the PMD entry is zero (not mapped). | ||
142 | // | ||
143 | if (pmd_trans_huge(*pmd)) { | ||
144 | // We don't get here due to the above assumption. | ||
145 | } | ||
146 | // | ||
147 | // Assume that Thread B incurred a page fault and | ||
148 | .---------> // sneaks in here as shown below. | ||
149 | | // | ||
150 | | if (pmd_none_or_clear_bad(pmd)) | ||
151 | | { | ||
152 | | if (unlikely(pmd_bad(*pmd))) | ||
153 | | pmd_clear_bad | ||
154 | | { | ||
155 | | pmd_ERROR | ||
156 | | // Log "bad pmd ..." message here. | ||
157 | | pmd_clear | ||
158 | | // Clear the page's PMD entry. | ||
159 | | // Thread B incremented the map count | ||
160 | | // in page_add_new_anon_rmap(), but | ||
161 | | // now the page is no longer mapped | ||
162 | | // by a PMD entry (-> inconsistency). | ||
163 | | } | ||
164 | | } | ||
165 | | | ||
166 | v | ||
167 | - Thread B is handling a page fault on virtual address "B(fault)" shown | ||
168 | in the picture. | ||
169 | |||
170 | ... | ||
171 | do_page_fault | ||
172 | __do_page_fault | ||
173 | // Acquire the semaphore in shared mode. | ||
174 | down_read_trylock(&mm->mmap_sem) | ||
175 | ... | ||
176 | handle_mm_fault | ||
177 | if (pmd_none(*pmd) && transparent_hugepage_enabled(vma)) | ||
178 | // We get here due to the above assumption (PMD entry is zero). | ||
179 | do_huge_pmd_anonymous_page | ||
180 | alloc_hugepage_vma | ||
181 | // Allocate a new transparent huge page here. | ||
182 | ... | ||
183 | __do_huge_pmd_anonymous_page | ||
184 | ... | ||
185 | spin_lock(&mm->page_table_lock) | ||
186 | ... | ||
187 | page_add_new_anon_rmap | ||
188 | // Here we increment the page's map count (starts at -1). | ||
189 | atomic_set(&page->_mapcount, 0) | ||
190 | set_pmd_at | ||
191 | // Here we set the page's PMD entry which will be cleared | ||
192 | // when Thread A calls pmd_clear_bad(). | ||
193 | ... | ||
194 | spin_unlock(&mm->page_table_lock) | ||
195 | |||
196 | The mmap_sem does not prevent the race because both threads are acquiring | ||
197 | it in shared mode (down_read). Thread B holds the page_table_lock while | ||
198 | the page's map count and PMD table entry are updated. However, Thread A | ||
199 | does not synchronize on that lock. | ||
200 | |||
201 | ====== end quote ======= | ||
202 | |||
203 | [akpm@linux-foundation.org: checkpatch fixes] | ||
204 | Reported-by: Ulrich Obergfell <uobergfe@redhat.com> | ||
205 | Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> | ||
206 | Acked-by: Johannes Weiner <hannes@cmpxchg.org> | ||
207 | Cc: Mel Gorman <mgorman@suse.de> | ||
208 | Cc: Hugh Dickins <hughd@google.com> | ||
209 | Cc: Dave Jones <davej@redhat.com> | ||
210 | Acked-by: Larry Woodman <lwoodman@redhat.com> | ||
211 | Acked-by: Rik van Riel <riel@redhat.com> | ||
212 | Cc: Mark Salter <msalter@redhat.com> | ||
213 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
214 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
215 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
216 | --- | ||
217 | arch/x86/kernel/vm86_32.c | 2 ++ | ||
218 | fs/proc/task_mmu.c | 9 ++++++ | ||
219 | include/asm-generic/pgtable.h | 61 +++++++++++++++++++++++++++++++++++++++++ | ||
220 | mm/memcontrol.c | 4 +++ | ||
221 | mm/memory.c | 16 ++++++++--- | ||
222 | mm/mempolicy.c | 2 +- | ||
223 | mm/mincore.c | 2 +- | ||
224 | mm/pagewalk.c | 2 +- | ||
225 | mm/swapfile.c | 4 +-- | ||
226 | 9 files changed, 92 insertions(+), 10 deletions(-) | ||
227 | |||
228 | diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c | ||
229 | index 863f875..04b8726 100644 | ||
230 | --- a/arch/x86/kernel/vm86_32.c | ||
231 | +++ b/arch/x86/kernel/vm86_32.c | ||
232 | @@ -172,6 +172,7 @@ static void mark_screen_rdonly(struct mm_struct *mm) | ||
233 | spinlock_t *ptl; | ||
234 | int i; | ||
235 | |||
236 | + down_write(&mm->mmap_sem); | ||
237 | pgd = pgd_offset(mm, 0xA0000); | ||
238 | if (pgd_none_or_clear_bad(pgd)) | ||
239 | goto out; | ||
240 | @@ -190,6 +191,7 @@ static void mark_screen_rdonly(struct mm_struct *mm) | ||
241 | } | ||
242 | pte_unmap_unlock(pte, ptl); | ||
243 | out: | ||
244 | + up_write(&mm->mmap_sem); | ||
245 | flush_tlb(); | ||
246 | } | ||
247 | |||
248 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
249 | index 7dcd2a2..3efa725 100644 | ||
250 | --- a/fs/proc/task_mmu.c | ||
251 | +++ b/fs/proc/task_mmu.c | ||
252 | @@ -409,6 +409,9 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | ||
253 | } else { | ||
254 | spin_unlock(&walk->mm->page_table_lock); | ||
255 | } | ||
256 | + | ||
257 | + if (pmd_trans_unstable(pmd)) | ||
258 | + return 0; | ||
259 | /* | ||
260 | * The mmap_sem held all the way back in m_start() is what | ||
261 | * keeps khugepaged out of here and from collapsing things | ||
262 | @@ -507,6 +510,8 @@ static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr, | ||
263 | struct page *page; | ||
264 | |||
265 | split_huge_page_pmd(walk->mm, pmd); | ||
266 | + if (pmd_trans_unstable(pmd)) | ||
267 | + return 0; | ||
268 | |||
269 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); | ||
270 | for (; addr != end; pte++, addr += PAGE_SIZE) { | ||
271 | @@ -670,6 +675,8 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | ||
272 | int err = 0; | ||
273 | |||
274 | split_huge_page_pmd(walk->mm, pmd); | ||
275 | + if (pmd_trans_unstable(pmd)) | ||
276 | + return 0; | ||
277 | |||
278 | /* find the first VMA at or above 'addr' */ | ||
279 | vma = find_vma(walk->mm, addr); | ||
280 | @@ -961,6 +968,8 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | ||
281 | spin_unlock(&walk->mm->page_table_lock); | ||
282 | } | ||
283 | |||
284 | + if (pmd_trans_unstable(pmd)) | ||
285 | + return 0; | ||
286 | orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); | ||
287 | do { | ||
288 | struct page *page = can_gather_numa_stats(*pte, md->vma, addr); | ||
289 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h | ||
290 | index 76bff2b..a03c098 100644 | ||
291 | --- a/include/asm-generic/pgtable.h | ||
292 | +++ b/include/asm-generic/pgtable.h | ||
293 | @@ -425,6 +425,8 @@ extern void untrack_pfn_vma(struct vm_area_struct *vma, unsigned long pfn, | ||
294 | unsigned long size); | ||
295 | #endif | ||
296 | |||
297 | +#ifdef CONFIG_MMU | ||
298 | + | ||
299 | #ifndef CONFIG_TRANSPARENT_HUGEPAGE | ||
300 | static inline int pmd_trans_huge(pmd_t pmd) | ||
301 | { | ||
302 | @@ -441,7 +443,66 @@ static inline int pmd_write(pmd_t pmd) | ||
303 | return 0; | ||
304 | } | ||
305 | #endif /* __HAVE_ARCH_PMD_WRITE */ | ||
306 | +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
307 | + | ||
308 | +/* | ||
309 | + * This function is meant to be used by sites walking pagetables with | ||
310 | + * the mmap_sem hold in read mode to protect against MADV_DONTNEED and | ||
311 | + * transhuge page faults. MADV_DONTNEED can convert a transhuge pmd | ||
312 | + * into a null pmd and the transhuge page fault can convert a null pmd | ||
313 | + * into an hugepmd or into a regular pmd (if the hugepage allocation | ||
314 | + * fails). While holding the mmap_sem in read mode the pmd becomes | ||
315 | + * stable and stops changing under us only if it's not null and not a | ||
316 | + * transhuge pmd. When those races occurs and this function makes a | ||
317 | + * difference vs the standard pmd_none_or_clear_bad, the result is | ||
318 | + * undefined so behaving like if the pmd was none is safe (because it | ||
319 | + * can return none anyway). The compiler level barrier() is critically | ||
320 | + * important to compute the two checks atomically on the same pmdval. | ||
321 | + */ | ||
322 | +static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd) | ||
323 | +{ | ||
324 | + /* depend on compiler for an atomic pmd read */ | ||
325 | + pmd_t pmdval = *pmd; | ||
326 | + /* | ||
327 | + * The barrier will stabilize the pmdval in a register or on | ||
328 | + * the stack so that it will stop changing under the code. | ||
329 | + */ | ||
330 | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
331 | + barrier(); | ||
332 | +#endif | ||
333 | + if (pmd_none(pmdval)) | ||
334 | + return 1; | ||
335 | + if (unlikely(pmd_bad(pmdval))) { | ||
336 | + if (!pmd_trans_huge(pmdval)) | ||
337 | + pmd_clear_bad(pmd); | ||
338 | + return 1; | ||
339 | + } | ||
340 | + return 0; | ||
341 | +} | ||
342 | + | ||
343 | +/* | ||
344 | + * This is a noop if Transparent Hugepage Support is not built into | ||
345 | + * the kernel. Otherwise it is equivalent to | ||
346 | + * pmd_none_or_trans_huge_or_clear_bad(), and shall only be called in | ||
347 | + * places that already verified the pmd is not none and they want to | ||
348 | + * walk ptes while holding the mmap sem in read mode (write mode don't | ||
349 | + * need this). If THP is not enabled, the pmd can't go away under the | ||
350 | + * code even if MADV_DONTNEED runs, but if THP is enabled we need to | ||
351 | + * run a pmd_trans_unstable before walking the ptes after | ||
352 | + * split_huge_page_pmd returns (because it may have run when the pmd | ||
353 | + * become null, but then a page fault can map in a THP and not a | ||
354 | + * regular page). | ||
355 | + */ | ||
356 | +static inline int pmd_trans_unstable(pmd_t *pmd) | ||
357 | +{ | ||
358 | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
359 | + return pmd_none_or_trans_huge_or_clear_bad(pmd); | ||
360 | +#else | ||
361 | + return 0; | ||
362 | #endif | ||
363 | +} | ||
364 | + | ||
365 | +#endif /* CONFIG_MMU */ | ||
366 | |||
367 | #endif /* !__ASSEMBLY__ */ | ||
368 | |||
369 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
370 | index de67e91..778554f 100644 | ||
371 | --- a/mm/memcontrol.c | ||
372 | +++ b/mm/memcontrol.c | ||
373 | @@ -5237,6 +5237,8 @@ static int mem_cgroup_count_precharge_pte_range(pmd_t *pmd, | ||
374 | spinlock_t *ptl; | ||
375 | |||
376 | split_huge_page_pmd(walk->mm, pmd); | ||
377 | + if (pmd_trans_unstable(pmd)) | ||
378 | + return 0; | ||
379 | |||
380 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); | ||
381 | for (; addr != end; pte++, addr += PAGE_SIZE) | ||
382 | @@ -5398,6 +5400,8 @@ static int mem_cgroup_move_charge_pte_range(pmd_t *pmd, | ||
383 | spinlock_t *ptl; | ||
384 | |||
385 | split_huge_page_pmd(walk->mm, pmd); | ||
386 | + if (pmd_trans_unstable(pmd)) | ||
387 | + return 0; | ||
388 | retry: | ||
389 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); | ||
390 | for (; addr != end; addr += PAGE_SIZE) { | ||
391 | diff --git a/mm/memory.c b/mm/memory.c | ||
392 | index 829d437..1b1ca17 100644 | ||
393 | --- a/mm/memory.c | ||
394 | +++ b/mm/memory.c | ||
395 | @@ -1228,16 +1228,24 @@ static inline unsigned long zap_pmd_range(struct mmu_gather *tlb, | ||
396 | do { | ||
397 | next = pmd_addr_end(addr, end); | ||
398 | if (pmd_trans_huge(*pmd)) { | ||
399 | - if (next-addr != HPAGE_PMD_SIZE) { | ||
400 | + if (next - addr != HPAGE_PMD_SIZE) { | ||
401 | VM_BUG_ON(!rwsem_is_locked(&tlb->mm->mmap_sem)); | ||
402 | split_huge_page_pmd(vma->vm_mm, pmd); | ||
403 | } else if (zap_huge_pmd(tlb, vma, pmd)) | ||
404 | - continue; | ||
405 | + goto next; | ||
406 | /* fall through */ | ||
407 | } | ||
408 | - if (pmd_none_or_clear_bad(pmd)) | ||
409 | - continue; | ||
410 | + /* | ||
411 | + * Here there can be other concurrent MADV_DONTNEED or | ||
412 | + * trans huge page faults running, and if the pmd is | ||
413 | + * none or trans huge it can change under us. This is | ||
414 | + * because MADV_DONTNEED holds the mmap_sem in read | ||
415 | + * mode. | ||
416 | + */ | ||
417 | + if (pmd_none_or_trans_huge_or_clear_bad(pmd)) | ||
418 | + goto next; | ||
419 | next = zap_pte_range(tlb, vma, pmd, addr, next, details); | ||
420 | +next: | ||
421 | cond_resched(); | ||
422 | } while (pmd++, addr = next, addr != end); | ||
423 | |||
424 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
425 | index c3fdbcb..b26aae2 100644 | ||
426 | --- a/mm/mempolicy.c | ||
427 | +++ b/mm/mempolicy.c | ||
428 | @@ -512,7 +512,7 @@ static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud, | ||
429 | do { | ||
430 | next = pmd_addr_end(addr, end); | ||
431 | split_huge_page_pmd(vma->vm_mm, pmd); | ||
432 | - if (pmd_none_or_clear_bad(pmd)) | ||
433 | + if (pmd_none_or_trans_huge_or_clear_bad(pmd)) | ||
434 | continue; | ||
435 | if (check_pte_range(vma, pmd, addr, next, nodes, | ||
436 | flags, private)) | ||
437 | diff --git a/mm/mincore.c b/mm/mincore.c | ||
438 | index 636a868..936b4ce 100644 | ||
439 | --- a/mm/mincore.c | ||
440 | +++ b/mm/mincore.c | ||
441 | @@ -164,7 +164,7 @@ static void mincore_pmd_range(struct vm_area_struct *vma, pud_t *pud, | ||
442 | } | ||
443 | /* fall through */ | ||
444 | } | ||
445 | - if (pmd_none_or_clear_bad(pmd)) | ||
446 | + if (pmd_none_or_trans_huge_or_clear_bad(pmd)) | ||
447 | mincore_unmapped_range(vma, addr, next, vec); | ||
448 | else | ||
449 | mincore_pte_range(vma, pmd, addr, next, vec); | ||
450 | diff --git a/mm/pagewalk.c b/mm/pagewalk.c | ||
451 | index 2f5cf10..aa9701e 100644 | ||
452 | --- a/mm/pagewalk.c | ||
453 | +++ b/mm/pagewalk.c | ||
454 | @@ -59,7 +59,7 @@ again: | ||
455 | continue; | ||
456 | |||
457 | split_huge_page_pmd(walk->mm, pmd); | ||
458 | - if (pmd_none_or_clear_bad(pmd)) | ||
459 | + if (pmd_none_or_trans_huge_or_clear_bad(pmd)) | ||
460 | goto again; | ||
461 | err = walk_pte_range(pmd, addr, next, walk); | ||
462 | if (err) | ||
463 | diff --git a/mm/swapfile.c b/mm/swapfile.c | ||
464 | index b1cd120..2015a1e 100644 | ||
465 | --- a/mm/swapfile.c | ||
466 | +++ b/mm/swapfile.c | ||
467 | @@ -931,9 +931,7 @@ static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud, | ||
468 | pmd = pmd_offset(pud, addr); | ||
469 | do { | ||
470 | next = pmd_addr_end(addr, end); | ||
471 | - if (unlikely(pmd_trans_huge(*pmd))) | ||
472 | - continue; | ||
473 | - if (pmd_none_or_clear_bad(pmd)) | ||
474 | + if (pmd_none_or_trans_huge_or_clear_bad(pmd)) | ||
475 | continue; | ||
476 | ret = unuse_pte_range(vma, pmd, addr, next, entry, page); | ||
477 | if (ret) | ||
478 | -- | ||
479 | 1.7.9.4 | ||
480 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0053-TPM-Zero-buffer-whole-after-copying-to-userspace.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0053-TPM-Zero-buffer-whole-after-copying-to-userspace.patch new file mode 100644 index 00000000..026e58dd --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0053-TPM-Zero-buffer-whole-after-copying-to-userspace.patch | |||
@@ -0,0 +1,46 @@ | |||
1 | From 6afa33c872ff109ed854c7dcec52130732f9e62e Mon Sep 17 00:00:00 2001 | ||
2 | From: Tim Gardner <tim.gardner@canonical.com> | ||
3 | Date: Tue, 6 Dec 2011 11:29:20 -0700 | ||
4 | Subject: [PATCH 053/147] TPM: Zero buffer whole after copying to userspace | ||
5 | |||
6 | commit 3ab1aff89477dafb1aaeafe8c8669114a02b7226 upstream. | ||
7 | |||
8 | Commit 3321c07ae5068568cd61ac9f4ba749006a7185c9 correctly clears the TPM | ||
9 | buffer if the user specified read length is >= the TPM buffer length. However, | ||
10 | if the user specified read length is < the TPM buffer length, then part of the | ||
11 | TPM buffer is left uncleared. | ||
12 | |||
13 | Reported-by: Seth Forshee <seth.forshee@canonical.com> | ||
14 | Cc: Debora Velarde <debora@linux.vnet.ibm.com> | ||
15 | Cc: Rajiv Andrade <srajiv@linux.vnet.ibm.com> | ||
16 | Cc: Marcel Selhorst <m.selhorst@sirrix.com> | ||
17 | Cc: tpmdd-devel@lists.sourceforge.net | ||
18 | Signed-off-by: Tim Gardner <tim.gardner@canonical.com> | ||
19 | Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | drivers/char/tpm/tpm.c | 3 ++- | ||
23 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
24 | |||
25 | diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c | ||
26 | index 361a1df..b366b34 100644 | ||
27 | --- a/drivers/char/tpm/tpm.c | ||
28 | +++ b/drivers/char/tpm/tpm.c | ||
29 | @@ -1115,12 +1115,13 @@ ssize_t tpm_read(struct file *file, char __user *buf, | ||
30 | ret_size = atomic_read(&chip->data_pending); | ||
31 | atomic_set(&chip->data_pending, 0); | ||
32 | if (ret_size > 0) { /* relay data */ | ||
33 | + ssize_t orig_ret_size = ret_size; | ||
34 | if (size < ret_size) | ||
35 | ret_size = size; | ||
36 | |||
37 | mutex_lock(&chip->buffer_mutex); | ||
38 | rc = copy_to_user(buf, chip->data_buffer, ret_size); | ||
39 | - memset(chip->data_buffer, 0, ret_size); | ||
40 | + memset(chip->data_buffer, 0, orig_ret_size); | ||
41 | if (rc) | ||
42 | ret_size = -EFAULT; | ||
43 | |||
44 | -- | ||
45 | 1.7.9.4 | ||
46 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0054-PM-Domains-Fix-handling-of-wakeup-devices-during-sys.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0054-PM-Domains-Fix-handling-of-wakeup-devices-during-sys.patch new file mode 100644 index 00000000..5541122d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0054-PM-Domains-Fix-handling-of-wakeup-devices-during-sys.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From 51962c5f291ab2abb638e6121c36fbaa93a9567c Mon Sep 17 00:00:00 2001 | ||
2 | From: "Rafael J. Wysocki" <rjw@sisk.pl> | ||
3 | Date: Tue, 13 Mar 2012 22:39:31 +0100 | ||
4 | Subject: [PATCH 054/147] PM / Domains: Fix handling of wakeup devices during | ||
5 | system resume | ||
6 | |||
7 | commit cc85b20780562d404e18a47b9b55b4a5102ae53e upstream. | ||
8 | |||
9 | During system suspend pm_genpd_suspend_noirq() checks if the given | ||
10 | device is in a wakeup path (i.e. it appears to be needed for one or | ||
11 | more wakeup devices to work or is a wakeup device itself) and if it | ||
12 | needs to be "active" for wakeup to work. If that is the case, the | ||
13 | function returns 0 without incrementing the device domain's counter | ||
14 | of suspended devices and without executing genpd_stop_dev() for the | ||
15 | device. In consequence, the device is not stopped (e.g. its clock | ||
16 | isn't disabled) and power is always supplied to its domain in the | ||
17 | resulting system sleep state. | ||
18 | |||
19 | However, pm_genpd_resume_noirq() doesn't repeat that check and it | ||
20 | runs genpd_start_dev() and decrements the domain's counter of | ||
21 | suspended devices even for the wakeup device that weren't stopped by | ||
22 | pm_genpd_suspend_noirq(). As a result, the start callback may be run | ||
23 | unnecessarily for them and their domains' counters of suspended | ||
24 | devices may become negative. Both outcomes aren't desirable, so fix | ||
25 | pm_genpd_resume_noirq() to look for wakeup devices that might not be | ||
26 | stopped by during system suspend. | ||
27 | |||
28 | Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> | ||
29 | Tested-by: Simon Horman <horms@verge.net.au> | ||
30 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
31 | --- | ||
32 | drivers/base/power/domain.c | 3 ++- | ||
33 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
34 | |||
35 | diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c | ||
36 | index 6790cf7..79038e5 100644 | ||
37 | --- a/drivers/base/power/domain.c | ||
38 | +++ b/drivers/base/power/domain.c | ||
39 | @@ -751,7 +751,8 @@ static int pm_genpd_resume_noirq(struct device *dev) | ||
40 | if (IS_ERR(genpd)) | ||
41 | return -EINVAL; | ||
42 | |||
43 | - if (genpd->suspend_power_off) | ||
44 | + if (genpd->suspend_power_off | ||
45 | + || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))) | ||
46 | return 0; | ||
47 | |||
48 | /* | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0055-bootmem-sparsemem-remove-limit-constraint-in-alloc_b.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0055-bootmem-sparsemem-remove-limit-constraint-in-alloc_b.patch new file mode 100644 index 00000000..0ec6e155 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0055-bootmem-sparsemem-remove-limit-constraint-in-alloc_b.patch | |||
@@ -0,0 +1,147 @@ | |||
1 | From ad2b33f9aee5de482d4077bcd81d6afde2935336 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com> | ||
3 | Date: Wed, 21 Mar 2012 16:34:07 -0700 | ||
4 | Subject: [PATCH 055/147] bootmem/sparsemem: remove limit constraint in | ||
5 | alloc_bootmem_section | ||
6 | |||
7 | commit f5bf18fa22f8c41a13eb8762c7373eb3a93a7333 upstream. | ||
8 | |||
9 | While testing AMS (Active Memory Sharing) / CMO (Cooperative Memory | ||
10 | Overcommit) on powerpc, we tripped the following: | ||
11 | |||
12 | kernel BUG at mm/bootmem.c:483! | ||
13 | cpu 0x0: Vector: 700 (Program Check) at [c000000000c03940] | ||
14 | pc: c000000000a62bd8: .alloc_bootmem_core+0x90/0x39c | ||
15 | lr: c000000000a64bcc: .sparse_early_usemaps_alloc_node+0x84/0x29c | ||
16 | sp: c000000000c03bc0 | ||
17 | msr: 8000000000021032 | ||
18 | current = 0xc000000000b0cce0 | ||
19 | paca = 0xc000000001d80000 | ||
20 | pid = 0, comm = swapper | ||
21 | kernel BUG at mm/bootmem.c:483! | ||
22 | enter ? for help | ||
23 | [c000000000c03c80] c000000000a64bcc | ||
24 | .sparse_early_usemaps_alloc_node+0x84/0x29c | ||
25 | [c000000000c03d50] c000000000a64f10 .sparse_init+0x12c/0x28c | ||
26 | [c000000000c03e20] c000000000a474f4 .setup_arch+0x20c/0x294 | ||
27 | [c000000000c03ee0] c000000000a4079c .start_kernel+0xb4/0x460 | ||
28 | [c000000000c03f90] c000000000009670 .start_here_common+0x1c/0x2c | ||
29 | |||
30 | This is | ||
31 | |||
32 | BUG_ON(limit && goal + size > limit); | ||
33 | |||
34 | and after some debugging, it seems that | ||
35 | |||
36 | goal = 0x7ffff000000 | ||
37 | limit = 0x80000000000 | ||
38 | |||
39 | and sparse_early_usemaps_alloc_node -> | ||
40 | sparse_early_usemaps_alloc_pgdat_section calls | ||
41 | |||
42 | return alloc_bootmem_section(usemap_size() * count, section_nr); | ||
43 | |||
44 | This is on a system with 8TB available via the AMS pool, and as a quirk | ||
45 | of AMS in firmware, all of that memory shows up in node 0. So, we end | ||
46 | up with an allocation that will fail the goal/limit constraints. | ||
47 | |||
48 | In theory, we could "fall-back" to alloc_bootmem_node() in | ||
49 | sparse_early_usemaps_alloc_node(), but since we actually have HOTREMOVE | ||
50 | defined, we'll BUG_ON() instead. A simple solution appears to be to | ||
51 | unconditionally remove the limit condition in alloc_bootmem_section, | ||
52 | meaning allocations are allowed to cross section boundaries (necessary | ||
53 | for systems of this size). | ||
54 | |||
55 | Johannes Weiner pointed out that if alloc_bootmem_section() no longer | ||
56 | guarantees section-locality, we need check_usemap_section_nr() to print | ||
57 | possible cross-dependencies between node descriptors and the usemaps | ||
58 | allocated through it. That makes the two loops in | ||
59 | sparse_early_usemaps_alloc_node() identical, so re-factor the code a | ||
60 | bit. | ||
61 | |||
62 | [akpm@linux-foundation.org: code simplification] | ||
63 | Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com> | ||
64 | Cc: Dave Hansen <haveblue@us.ibm.com> | ||
65 | Cc: Anton Blanchard <anton@au1.ibm.com> | ||
66 | Cc: Paul Mackerras <paulus@samba.org> | ||
67 | Cc: Ben Herrenschmidt <benh@kernel.crashing.org> | ||
68 | Cc: Robert Jennings <rcj@linux.vnet.ibm.com> | ||
69 | Acked-by: Johannes Weiner <hannes@cmpxchg.org> | ||
70 | Acked-by: Mel Gorman <mgorman@suse.de> | ||
71 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
72 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
73 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
74 | --- | ||
75 | mm/bootmem.c | 5 ++--- | ||
76 | mm/sparse.c | 30 +++++++++++------------------- | ||
77 | 2 files changed, 13 insertions(+), 22 deletions(-) | ||
78 | |||
79 | diff --git a/mm/bootmem.c b/mm/bootmem.c | ||
80 | index 1a77012..b863822 100644 | ||
81 | --- a/mm/bootmem.c | ||
82 | +++ b/mm/bootmem.c | ||
83 | @@ -768,14 +768,13 @@ void * __init alloc_bootmem_section(unsigned long size, | ||
84 | unsigned long section_nr) | ||
85 | { | ||
86 | bootmem_data_t *bdata; | ||
87 | - unsigned long pfn, goal, limit; | ||
88 | + unsigned long pfn, goal; | ||
89 | |||
90 | pfn = section_nr_to_pfn(section_nr); | ||
91 | goal = pfn << PAGE_SHIFT; | ||
92 | - limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT; | ||
93 | bdata = &bootmem_node_data[early_pfn_to_nid(pfn)]; | ||
94 | |||
95 | - return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit); | ||
96 | + return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, 0); | ||
97 | } | ||
98 | #endif | ||
99 | |||
100 | diff --git a/mm/sparse.c b/mm/sparse.c | ||
101 | index 61d7cde..a8bc7d3 100644 | ||
102 | --- a/mm/sparse.c | ||
103 | +++ b/mm/sparse.c | ||
104 | @@ -353,29 +353,21 @@ static void __init sparse_early_usemaps_alloc_node(unsigned long**usemap_map, | ||
105 | |||
106 | usemap = sparse_early_usemaps_alloc_pgdat_section(NODE_DATA(nodeid), | ||
107 | usemap_count); | ||
108 | - if (usemap) { | ||
109 | - for (pnum = pnum_begin; pnum < pnum_end; pnum++) { | ||
110 | - if (!present_section_nr(pnum)) | ||
111 | - continue; | ||
112 | - usemap_map[pnum] = usemap; | ||
113 | - usemap += size; | ||
114 | + if (!usemap) { | ||
115 | + usemap = alloc_bootmem_node(NODE_DATA(nodeid), size * usemap_count); | ||
116 | + if (!usemap) { | ||
117 | + printk(KERN_WARNING "%s: allocation failed\n", __func__); | ||
118 | + return; | ||
119 | } | ||
120 | - return; | ||
121 | } | ||
122 | |||
123 | - usemap = alloc_bootmem_node(NODE_DATA(nodeid), size * usemap_count); | ||
124 | - if (usemap) { | ||
125 | - for (pnum = pnum_begin; pnum < pnum_end; pnum++) { | ||
126 | - if (!present_section_nr(pnum)) | ||
127 | - continue; | ||
128 | - usemap_map[pnum] = usemap; | ||
129 | - usemap += size; | ||
130 | - check_usemap_section_nr(nodeid, usemap_map[pnum]); | ||
131 | - } | ||
132 | - return; | ||
133 | + for (pnum = pnum_begin; pnum < pnum_end; pnum++) { | ||
134 | + if (!present_section_nr(pnum)) | ||
135 | + continue; | ||
136 | + usemap_map[pnum] = usemap; | ||
137 | + usemap += size; | ||
138 | + check_usemap_section_nr(nodeid, usemap_map[pnum]); | ||
139 | } | ||
140 | - | ||
141 | - printk(KERN_WARNING "%s: allocation failed\n", __func__); | ||
142 | } | ||
143 | |||
144 | #ifndef CONFIG_SPARSEMEM_VMEMMAP | ||
145 | -- | ||
146 | 1.7.9.4 | ||
147 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0056-hugetlbfs-avoid-taking-i_mutex-from-hugetlbfs_read.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0056-hugetlbfs-avoid-taking-i_mutex-from-hugetlbfs_read.patch new file mode 100644 index 00000000..d5cfc261 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0056-hugetlbfs-avoid-taking-i_mutex-from-hugetlbfs_read.patch | |||
@@ -0,0 +1,140 @@ | |||
1 | From 2bc105d9e4132f8a07cec0b5df3d308c1b99455f Mon Sep 17 00:00:00 2001 | ||
2 | From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> | ||
3 | Date: Wed, 21 Mar 2012 16:34:08 -0700 | ||
4 | Subject: [PATCH 056/147] hugetlbfs: avoid taking i_mutex from | ||
5 | hugetlbfs_read() | ||
6 | |||
7 | commit a05b0855fd15504972dba2358e5faa172a1e50ba upstream. | ||
8 | |||
9 | Taking i_mutex in hugetlbfs_read() can result in deadlock with mmap as | ||
10 | explained below | ||
11 | |||
12 | Thread A: | ||
13 | read() on hugetlbfs | ||
14 | hugetlbfs_read() called | ||
15 | i_mutex grabbed | ||
16 | hugetlbfs_read_actor() called | ||
17 | __copy_to_user() called | ||
18 | page fault is triggered | ||
19 | Thread B, sharing address space with A: | ||
20 | mmap() the same file | ||
21 | ->mmap_sem is grabbed on task_B->mm->mmap_sem | ||
22 | hugetlbfs_file_mmap() is called | ||
23 | attempt to grab ->i_mutex and block waiting for A to give it up | ||
24 | Thread A: | ||
25 | pagefault handled blocked on attempt to grab task_A->mm->mmap_sem, | ||
26 | which happens to be the same thing as task_B->mm->mmap_sem. Block waiting | ||
27 | for B to give it up. | ||
28 | |||
29 | AFAIU the i_mutex locking was added to hugetlbfs_read() as per | ||
30 | http://lkml.indiana.edu/hypermail/linux/kernel/0707.2/3066.html to take | ||
31 | care of the race between truncate and read. This patch fixes this by | ||
32 | looking at page->mapping under lock_page() (find_lock_page()) to ensure | ||
33 | that the inode didn't get truncated in the range during a parallel read. | ||
34 | |||
35 | Ideally we can extend the patch to make sure we don't increase i_size in | ||
36 | mmap. But that will break userspace, because applications will now have | ||
37 | to use truncate(2) to increase i_size in hugetlbfs. | ||
38 | |||
39 | Based on the original patch from Hillf Danton. | ||
40 | |||
41 | Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | ||
42 | Cc: Hillf Danton <dhillf@gmail.com> | ||
43 | Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | ||
44 | Cc: Al Viro <viro@zeniv.linux.org.uk> | ||
45 | Cc: Hugh Dickins <hughd@google.com> | ||
46 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
47 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
48 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
49 | --- | ||
50 | fs/hugetlbfs/inode.c | 25 +++++++++---------------- | ||
51 | 1 file changed, 9 insertions(+), 16 deletions(-) | ||
52 | |||
53 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c | ||
54 | index 0be5a78..2d0ca24 100644 | ||
55 | --- a/fs/hugetlbfs/inode.c | ||
56 | +++ b/fs/hugetlbfs/inode.c | ||
57 | @@ -238,17 +238,10 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | ||
58 | loff_t isize; | ||
59 | ssize_t retval = 0; | ||
60 | |||
61 | - mutex_lock(&inode->i_mutex); | ||
62 | - | ||
63 | /* validate length */ | ||
64 | if (len == 0) | ||
65 | goto out; | ||
66 | |||
67 | - isize = i_size_read(inode); | ||
68 | - if (!isize) | ||
69 | - goto out; | ||
70 | - | ||
71 | - end_index = (isize - 1) >> huge_page_shift(h); | ||
72 | for (;;) { | ||
73 | struct page *page; | ||
74 | unsigned long nr, ret; | ||
75 | @@ -256,18 +249,21 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | ||
76 | |||
77 | /* nr is the maximum number of bytes to copy from this page */ | ||
78 | nr = huge_page_size(h); | ||
79 | + isize = i_size_read(inode); | ||
80 | + if (!isize) | ||
81 | + goto out; | ||
82 | + end_index = (isize - 1) >> huge_page_shift(h); | ||
83 | if (index >= end_index) { | ||
84 | if (index > end_index) | ||
85 | goto out; | ||
86 | nr = ((isize - 1) & ~huge_page_mask(h)) + 1; | ||
87 | - if (nr <= offset) { | ||
88 | + if (nr <= offset) | ||
89 | goto out; | ||
90 | - } | ||
91 | } | ||
92 | nr = nr - offset; | ||
93 | |||
94 | /* Find the page */ | ||
95 | - page = find_get_page(mapping, index); | ||
96 | + page = find_lock_page(mapping, index); | ||
97 | if (unlikely(page == NULL)) { | ||
98 | /* | ||
99 | * We have a HOLE, zero out the user-buffer for the | ||
100 | @@ -279,17 +275,18 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | ||
101 | else | ||
102 | ra = 0; | ||
103 | } else { | ||
104 | + unlock_page(page); | ||
105 | + | ||
106 | /* | ||
107 | * We have the page, copy it to user space buffer. | ||
108 | */ | ||
109 | ra = hugetlbfs_read_actor(page, offset, buf, len, nr); | ||
110 | ret = ra; | ||
111 | + page_cache_release(page); | ||
112 | } | ||
113 | if (ra < 0) { | ||
114 | if (retval == 0) | ||
115 | retval = ra; | ||
116 | - if (page) | ||
117 | - page_cache_release(page); | ||
118 | goto out; | ||
119 | } | ||
120 | |||
121 | @@ -299,16 +296,12 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | ||
122 | index += offset >> huge_page_shift(h); | ||
123 | offset &= ~huge_page_mask(h); | ||
124 | |||
125 | - if (page) | ||
126 | - page_cache_release(page); | ||
127 | - | ||
128 | /* short read or no more work */ | ||
129 | if ((ret != nr) || (len == 0)) | ||
130 | break; | ||
131 | } | ||
132 | out: | ||
133 | *ppos = ((loff_t)index << huge_page_shift(h)) + offset; | ||
134 | - mutex_unlock(&inode->i_mutex); | ||
135 | return retval; | ||
136 | } | ||
137 | |||
138 | -- | ||
139 | 1.7.9.4 | ||
140 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0057-ASoC-fsl-p1022ds-tell-the-WM8776-codec-driver-that-i.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0057-ASoC-fsl-p1022ds-tell-the-WM8776-codec-driver-that-i.patch new file mode 100644 index 00000000..a4c39dd7 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0057-ASoC-fsl-p1022ds-tell-the-WM8776-codec-driver-that-i.patch | |||
@@ -0,0 +1,89 @@ | |||
1 | From a7338f169446baa4311a9248017ab75ed417a46c Mon Sep 17 00:00:00 2001 | ||
2 | From: Timur Tabi <timur@freescale.com> | ||
3 | Date: Fri, 16 Mar 2012 16:32:52 -0500 | ||
4 | Subject: [PATCH 057/147] ASoC: fsl: p1022ds: tell the WM8776 codec driver | ||
5 | that it's the master | ||
6 | |||
7 | commit 70ac07bb633dee75ac554195b9a4d69adfa7803c upstream. | ||
8 | |||
9 | The WM8776 codec driver requires the machine driver to set one of the | ||
10 | SND_SOC_DAIFMT_CBx_xxx values. The P1022DS machine driver should be setting | ||
11 | SND_SOC_DAIFMT_CBM_CFM, but since that value was zero, no one noticed. | ||
12 | |||
13 | Commit 75d9ac46 ("ASoC: Allow DAI formats to be specified in the | ||
14 | dai_link"), however, changed the value of SND_SOC_DAIFMT_CBM_CFM from zero | ||
15 | to a non-zero value, which means that it now needs to be specifically set | ||
16 | by the machine driver. | ||
17 | |||
18 | We also set SND_SOC_DAIFMT_NB_NF, for the same reason. | ||
19 | |||
20 | Signed-off-by: Timur Tabi <timur@freescale.com> | ||
21 | Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | sound/soc/fsl/p1022_ds.c | 24 ++++++++++++++++-------- | ||
25 | 1 file changed, 16 insertions(+), 8 deletions(-) | ||
26 | |||
27 | diff --git a/sound/soc/fsl/p1022_ds.c b/sound/soc/fsl/p1022_ds.c | ||
28 | index 2c064a9..075677c 100644 | ||
29 | --- a/sound/soc/fsl/p1022_ds.c | ||
30 | +++ b/sound/soc/fsl/p1022_ds.c | ||
31 | @@ -392,7 +392,8 @@ static int p1022_ds_probe(struct platform_device *pdev) | ||
32 | } | ||
33 | |||
34 | if (strcasecmp(sprop, "i2s-slave") == 0) { | ||
35 | - mdata->dai_format = SND_SOC_DAIFMT_I2S; | ||
36 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
37 | + SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM; | ||
38 | mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; | ||
39 | mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; | ||
40 | |||
41 | @@ -409,31 +410,38 @@ static int p1022_ds_probe(struct platform_device *pdev) | ||
42 | } | ||
43 | mdata->clk_frequency = be32_to_cpup(iprop); | ||
44 | } else if (strcasecmp(sprop, "i2s-master") == 0) { | ||
45 | - mdata->dai_format = SND_SOC_DAIFMT_I2S; | ||
46 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
47 | + SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS; | ||
48 | mdata->codec_clk_direction = SND_SOC_CLOCK_IN; | ||
49 | mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; | ||
50 | } else if (strcasecmp(sprop, "lj-slave") == 0) { | ||
51 | - mdata->dai_format = SND_SOC_DAIFMT_LEFT_J; | ||
52 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
53 | + SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM; | ||
54 | mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; | ||
55 | mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; | ||
56 | } else if (strcasecmp(sprop, "lj-master") == 0) { | ||
57 | - mdata->dai_format = SND_SOC_DAIFMT_LEFT_J; | ||
58 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
59 | + SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBS_CFS; | ||
60 | mdata->codec_clk_direction = SND_SOC_CLOCK_IN; | ||
61 | mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; | ||
62 | } else if (strcasecmp(sprop, "rj-slave") == 0) { | ||
63 | - mdata->dai_format = SND_SOC_DAIFMT_RIGHT_J; | ||
64 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
65 | + SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_CBM_CFM; | ||
66 | mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; | ||
67 | mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; | ||
68 | } else if (strcasecmp(sprop, "rj-master") == 0) { | ||
69 | - mdata->dai_format = SND_SOC_DAIFMT_RIGHT_J; | ||
70 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
71 | + SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_CBS_CFS; | ||
72 | mdata->codec_clk_direction = SND_SOC_CLOCK_IN; | ||
73 | mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; | ||
74 | } else if (strcasecmp(sprop, "ac97-slave") == 0) { | ||
75 | - mdata->dai_format = SND_SOC_DAIFMT_AC97; | ||
76 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
77 | + SND_SOC_DAIFMT_AC97 | SND_SOC_DAIFMT_CBM_CFM; | ||
78 | mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; | ||
79 | mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; | ||
80 | } else if (strcasecmp(sprop, "ac97-master") == 0) { | ||
81 | - mdata->dai_format = SND_SOC_DAIFMT_AC97; | ||
82 | + mdata->dai_format = SND_SOC_DAIFMT_NB_NF | | ||
83 | + SND_SOC_DAIFMT_AC97 | SND_SOC_DAIFMT_CBS_CFS; | ||
84 | mdata->codec_clk_direction = SND_SOC_CLOCK_IN; | ||
85 | mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; | ||
86 | } else { | ||
87 | -- | ||
88 | 1.7.9.4 | ||
89 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0058-ASoC-pxa-ssp-atomically-set-stream-active-masks.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0058-ASoC-pxa-ssp-atomically-set-stream-active-masks.patch new file mode 100644 index 00000000..295a9096 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0058-ASoC-pxa-ssp-atomically-set-stream-active-masks.patch | |||
@@ -0,0 +1,122 @@ | |||
1 | From ab7d4a1c2c58f17a777947ef7e0ae242fea985e4 Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniel Mack <zonque@gmail.com> | ||
3 | Date: Mon, 19 Mar 2012 09:12:53 +0100 | ||
4 | Subject: [PATCH 058/147] ASoC: pxa-ssp: atomically set stream active masks | ||
5 | |||
6 | commit 273b72c8ce6b28df6b49423d775c3e59072c73c5 upstream. | ||
7 | |||
8 | PXA's SSP engine fails to take its current channel phase into account | ||
9 | when enabling a stream while the engine is already running. This | ||
10 | results in randomly swapped left/right channels on either the record | ||
11 | or the playback side, depending on which one was enabled first. | ||
12 | |||
13 | The following patch fixes this by factoring out the bit field | ||
14 | modifications in question to a separate function that pauses the | ||
15 | engine temporarily, modifies the bits and kicks it off again | ||
16 | afterwards. Appearantly, a transition of SSCR0_SSE syncs both | ||
17 | directions properly. | ||
18 | |||
19 | The patch has been rolled out to quite a number of devices over the | ||
20 | last weeks and seems to fix the issue reliably. | ||
21 | |||
22 | Signed-off-by: Daniel Mack <zonque@gmail.com> | ||
23 | Reported-and-tested-by: Sven Neumann <s.neumann@raumfeld.com> | ||
24 | Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
25 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
26 | --- | ||
27 | sound/soc/pxa/pxa-ssp.c | 61 ++++++++++++++++++++++++++++------------------- | ||
28 | 1 file changed, 36 insertions(+), 25 deletions(-) | ||
29 | |||
30 | diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c | ||
31 | index 8ad93ee..b583e60 100644 | ||
32 | --- a/sound/soc/pxa/pxa-ssp.c | ||
33 | +++ b/sound/soc/pxa/pxa-ssp.c | ||
34 | @@ -668,6 +668,38 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, | ||
35 | return 0; | ||
36 | } | ||
37 | |||
38 | +static void pxa_ssp_set_running_bit(struct snd_pcm_substream *substream, | ||
39 | + struct ssp_device *ssp, int value) | ||
40 | +{ | ||
41 | + uint32_t sscr0 = pxa_ssp_read_reg(ssp, SSCR0); | ||
42 | + uint32_t sscr1 = pxa_ssp_read_reg(ssp, SSCR1); | ||
43 | + uint32_t sspsp = pxa_ssp_read_reg(ssp, SSPSP); | ||
44 | + uint32_t sssr = pxa_ssp_read_reg(ssp, SSSR); | ||
45 | + | ||
46 | + if (value && (sscr0 & SSCR0_SSE)) | ||
47 | + pxa_ssp_write_reg(ssp, SSCR0, sscr0 & ~SSCR0_SSE); | ||
48 | + | ||
49 | + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
50 | + if (value) | ||
51 | + sscr1 |= SSCR1_TSRE; | ||
52 | + else | ||
53 | + sscr1 &= ~SSCR1_TSRE; | ||
54 | + } else { | ||
55 | + if (value) | ||
56 | + sscr1 |= SSCR1_RSRE; | ||
57 | + else | ||
58 | + sscr1 &= ~SSCR1_RSRE; | ||
59 | + } | ||
60 | + | ||
61 | + pxa_ssp_write_reg(ssp, SSCR1, sscr1); | ||
62 | + | ||
63 | + if (value) { | ||
64 | + pxa_ssp_write_reg(ssp, SSSR, sssr); | ||
65 | + pxa_ssp_write_reg(ssp, SSPSP, sspsp); | ||
66 | + pxa_ssp_write_reg(ssp, SSCR0, sscr0 | SSCR0_SSE); | ||
67 | + } | ||
68 | +} | ||
69 | + | ||
70 | static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd, | ||
71 | struct snd_soc_dai *cpu_dai) | ||
72 | { | ||
73 | @@ -681,42 +713,21 @@ static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd, | ||
74 | pxa_ssp_enable(ssp); | ||
75 | break; | ||
76 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | ||
77 | - val = pxa_ssp_read_reg(ssp, SSCR1); | ||
78 | - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
79 | - val |= SSCR1_TSRE; | ||
80 | - else | ||
81 | - val |= SSCR1_RSRE; | ||
82 | - pxa_ssp_write_reg(ssp, SSCR1, val); | ||
83 | + pxa_ssp_set_running_bit(substream, ssp, 1); | ||
84 | val = pxa_ssp_read_reg(ssp, SSSR); | ||
85 | pxa_ssp_write_reg(ssp, SSSR, val); | ||
86 | break; | ||
87 | case SNDRV_PCM_TRIGGER_START: | ||
88 | - val = pxa_ssp_read_reg(ssp, SSCR1); | ||
89 | - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
90 | - val |= SSCR1_TSRE; | ||
91 | - else | ||
92 | - val |= SSCR1_RSRE; | ||
93 | - pxa_ssp_write_reg(ssp, SSCR1, val); | ||
94 | - pxa_ssp_enable(ssp); | ||
95 | + pxa_ssp_set_running_bit(substream, ssp, 1); | ||
96 | break; | ||
97 | case SNDRV_PCM_TRIGGER_STOP: | ||
98 | - val = pxa_ssp_read_reg(ssp, SSCR1); | ||
99 | - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
100 | - val &= ~SSCR1_TSRE; | ||
101 | - else | ||
102 | - val &= ~SSCR1_RSRE; | ||
103 | - pxa_ssp_write_reg(ssp, SSCR1, val); | ||
104 | + pxa_ssp_set_running_bit(substream, ssp, 0); | ||
105 | break; | ||
106 | case SNDRV_PCM_TRIGGER_SUSPEND: | ||
107 | pxa_ssp_disable(ssp); | ||
108 | break; | ||
109 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | ||
110 | - val = pxa_ssp_read_reg(ssp, SSCR1); | ||
111 | - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
112 | - val &= ~SSCR1_TSRE; | ||
113 | - else | ||
114 | - val &= ~SSCR1_RSRE; | ||
115 | - pxa_ssp_write_reg(ssp, SSCR1, val); | ||
116 | + pxa_ssp_set_running_bit(substream, ssp, 0); | ||
117 | break; | ||
118 | |||
119 | default: | ||
120 | -- | ||
121 | 1.7.9.4 | ||
122 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0059-tcm_loop-Set-residual-field-for-SCSI-commands.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0059-tcm_loop-Set-residual-field-for-SCSI-commands.patch new file mode 100644 index 00000000..367ed766 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0059-tcm_loop-Set-residual-field-for-SCSI-commands.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From eb6dc69e78c98c8c61faba348a6eaf6cee1439d9 Mon Sep 17 00:00:00 2001 | ||
2 | From: Roland Dreier <roland@purestorage.com> | ||
3 | Date: Tue, 14 Feb 2012 15:30:31 -0800 | ||
4 | Subject: [PATCH 059/147] tcm_loop: Set residual field for SCSI commands | ||
5 | |||
6 | commit 6cf3fa6918baab0c447f1206f1cef9166ad04864 upstream. | ||
7 | |||
8 | If the target core signals an over- or under-run, tcm_loop should call | ||
9 | scsi_set_resid() to tell the SCSI midlayer about the residual data length. | ||
10 | |||
11 | The difference can be seen by doing something like | ||
12 | |||
13 | strace -eioctl sg_raw -r 1024 /dev/sda 8 0 0 0 1 0 > /dev/null | ||
14 | |||
15 | and looking at the "resid=" part of the SG_IO ioctl -- after this patch, | ||
16 | the field is correctly reported as 512. | ||
17 | |||
18 | Signed-off-by: Roland Dreier <roland@purestorage.com> | ||
19 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | drivers/target/loopback/tcm_loop.c | 6 ++++++ | ||
23 | 1 file changed, 6 insertions(+) | ||
24 | |||
25 | diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c | ||
26 | index 81d5832..5d1d4f2 100644 | ||
27 | --- a/drivers/target/loopback/tcm_loop.c | ||
28 | +++ b/drivers/target/loopback/tcm_loop.c | ||
29 | @@ -866,6 +866,9 @@ static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) | ||
30 | |||
31 | sc->result = SAM_STAT_GOOD; | ||
32 | set_host_byte(sc, DID_OK); | ||
33 | + if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || | ||
34 | + (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) | ||
35 | + scsi_set_resid(sc, se_cmd->residual_count); | ||
36 | sc->scsi_done(sc); | ||
37 | return 0; | ||
38 | } | ||
39 | @@ -891,6 +894,9 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd) | ||
40 | sc->result = se_cmd->scsi_status; | ||
41 | |||
42 | set_host_byte(sc, DID_OK); | ||
43 | + if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || | ||
44 | + (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) | ||
45 | + scsi_set_resid(sc, se_cmd->residual_count); | ||
46 | sc->scsi_done(sc); | ||
47 | return 0; | ||
48 | } | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0060-iscsi-target-Fix-iscsit_alloc_buffs-failure-cases.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0060-iscsi-target-Fix-iscsit_alloc_buffs-failure-cases.patch new file mode 100644 index 00000000..c4cbbea2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0060-iscsi-target-Fix-iscsit_alloc_buffs-failure-cases.patch | |||
@@ -0,0 +1,62 @@ | |||
1 | From eeb9b513b81a2ebbb3812150c091ff26ee28d912 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nicholas Bellinger <nab@linux-iscsi.org> | ||
3 | Date: Thu, 23 Feb 2012 17:28:43 -0800 | ||
4 | Subject: [PATCH 060/147] iscsi-target: Fix iscsit_alloc_buffs() failure cases | ||
5 | |||
6 | commit d335e6054db616bce3f040e659fa38440518ad1d upstream. | ||
7 | |||
8 | Make iscsit_alloc_buffs() failure case for page_alloc_failed use correct | ||
9 | __free_page() SGL pointer, and return -ENOMEM for iscsit_allocate_iovecs | ||
10 | failure to push se_cmd->t_mem_sg release into iscsit_release_cmd() | ||
11 | callback during iscsit_add_reject_from_cmd() connection reset. | ||
12 | |||
13 | Also drop cmd->t_mem_sg = NULL assignment from page_alloc_failed | ||
14 | failure case. | ||
15 | |||
16 | Reported-by: Roland Dreier <roland@purestorage.com> | ||
17 | Cc: Andy Grover <agrover@redhat.com> | ||
18 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | drivers/target/iscsi/iscsi_target.c | 14 ++++++-------- | ||
22 | 1 file changed, 6 insertions(+), 8 deletions(-) | ||
23 | |||
24 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
25 | index 03d3528..0842cc7 100644 | ||
26 | --- a/drivers/target/iscsi/iscsi_target.c | ||
27 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
28 | @@ -781,7 +781,7 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd) | ||
29 | struct scatterlist *sgl; | ||
30 | u32 length = cmd->se_cmd.data_length; | ||
31 | int nents = DIV_ROUND_UP(length, PAGE_SIZE); | ||
32 | - int i = 0, ret; | ||
33 | + int i = 0, j = 0, ret; | ||
34 | /* | ||
35 | * If no SCSI payload is present, allocate the default iovecs used for | ||
36 | * iSCSI PDU Header | ||
37 | @@ -822,17 +822,15 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd) | ||
38 | */ | ||
39 | ret = iscsit_allocate_iovecs(cmd); | ||
40 | if (ret < 0) | ||
41 | - goto page_alloc_failed; | ||
42 | + return -ENOMEM; | ||
43 | |||
44 | return 0; | ||
45 | |||
46 | page_alloc_failed: | ||
47 | - while (i >= 0) { | ||
48 | - __free_page(sg_page(&sgl[i])); | ||
49 | - i--; | ||
50 | - } | ||
51 | - kfree(cmd->t_mem_sg); | ||
52 | - cmd->t_mem_sg = NULL; | ||
53 | + while (j < i) | ||
54 | + __free_page(sg_page(&sgl[j++])); | ||
55 | + | ||
56 | + kfree(sgl); | ||
57 | return -ENOMEM; | ||
58 | } | ||
59 | |||
60 | -- | ||
61 | 1.7.9.4 | ||
62 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0061-iscsi-target-Fix-dynamic-explict-NodeACL-pointer-ref.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0061-iscsi-target-Fix-dynamic-explict-NodeACL-pointer-ref.patch new file mode 100644 index 00000000..016bab4d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0061-iscsi-target-Fix-dynamic-explict-NodeACL-pointer-ref.patch | |||
@@ -0,0 +1,46 @@ | |||
1 | From 43d63ac69fcc86c6b92dc1b923a3b0e5bd59dab5 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nicholas Bellinger <nab@linux-iscsi.org> | ||
3 | Date: Sun, 26 Feb 2012 22:16:07 -0800 | ||
4 | Subject: [PATCH 061/147] iscsi-target: Fix dynamic -> explict NodeACL pointer | ||
5 | reference | ||
6 | |||
7 | commit d06283341aee9e48eff1b068779d340785c635ce upstream. | ||
8 | |||
9 | This patch fixes a free after use in lio_target_make_nodeacl() where | ||
10 | iscsi_node_acl was referenced from the original se_nacl_new allocation, | ||
11 | instead of from core_tpg_add_initiator_node_acl() in the case of dynamic | ||
12 | -> explict NodeACL conversion. | ||
13 | |||
14 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/target/iscsi/iscsi_target_configfs.c | 6 ++---- | ||
18 | 1 file changed, 2 insertions(+), 4 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c | ||
21 | index db32784..83dcf49 100644 | ||
22 | --- a/drivers/target/iscsi/iscsi_target_configfs.c | ||
23 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c | ||
24 | @@ -816,9 +816,6 @@ static struct se_node_acl *lio_target_make_nodeacl( | ||
25 | if (!se_nacl_new) | ||
26 | return ERR_PTR(-ENOMEM); | ||
27 | |||
28 | - acl = container_of(se_nacl_new, struct iscsi_node_acl, | ||
29 | - se_node_acl); | ||
30 | - | ||
31 | cmdsn_depth = ISCSI_TPG_ATTRIB(tpg)->default_cmdsn_depth; | ||
32 | /* | ||
33 | * se_nacl_new may be released by core_tpg_add_initiator_node_acl() | ||
34 | @@ -829,7 +826,8 @@ static struct se_node_acl *lio_target_make_nodeacl( | ||
35 | if (IS_ERR(se_nacl)) | ||
36 | return se_nacl; | ||
37 | |||
38 | - stats_cg = &acl->se_node_acl.acl_fabric_stat_group; | ||
39 | + acl = container_of(se_nacl, struct iscsi_node_acl, se_node_acl); | ||
40 | + stats_cg = &se_nacl->acl_fabric_stat_group; | ||
41 | |||
42 | stats_cg->default_groups = kzalloc(sizeof(struct config_group) * 2, | ||
43 | GFP_KERNEL); | ||
44 | -- | ||
45 | 1.7.9.4 | ||
46 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0062-ALSA-hda-fix-printing-of-high-HDMI-sample-rates.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0062-ALSA-hda-fix-printing-of-high-HDMI-sample-rates.patch new file mode 100644 index 00000000..0eef1c08 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0062-ALSA-hda-fix-printing-of-high-HDMI-sample-rates.patch | |||
@@ -0,0 +1,43 @@ | |||
1 | From 6b3759def25d01a00d3a88701e97cb397f3aa805 Mon Sep 17 00:00:00 2001 | ||
2 | From: Anssi Hannula <anssi.hannula@iki.fi> | ||
3 | Date: Tue, 13 Mar 2012 17:43:02 +0200 | ||
4 | Subject: [PATCH 062/147] ALSA: hda - fix printing of high HDMI sample rates | ||
5 | |||
6 | commit 25dc16f69892182192b1234594fd3cf342ad4195 upstream. | ||
7 | |||
8 | A previous commit af65cbf296 (ALSA: hdmi: fix printout of SAD sampling | ||
9 | rates) fixed the sample rates shown in /proc/asound/cardX/eldY and | ||
10 | kernel log to not be entirely wrong. However, a missing rate from the | ||
11 | array added in the patch causes HDMI rates 88.2 kHz, 96 kHz, 176.4 kHz, | ||
12 | and 192 kHz to be shown as 96 kHz, 176.4 kHz, 192 kHz, and 384 kHz, | ||
13 | respectively. | ||
14 | |||
15 | Fix the reporting by adding the ALSA rate 64 kHz into the conversion | ||
16 | array between 48 kHz and 88.2 kHz. | ||
17 | |||
18 | Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> | ||
19 | Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | ||
20 | Signed-off-by: Takashi Iwai <tiwai@suse.de> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | sound/pci/hda/hda_eld.c | 4 ++-- | ||
24 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
25 | |||
26 | diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c | ||
27 | index c1da422..b58b4b1 100644 | ||
28 | --- a/sound/pci/hda/hda_eld.c | ||
29 | +++ b/sound/pci/hda/hda_eld.c | ||
30 | @@ -385,8 +385,8 @@ error: | ||
31 | static void hdmi_print_pcm_rates(int pcm, char *buf, int buflen) | ||
32 | { | ||
33 | static unsigned int alsa_rates[] = { | ||
34 | - 5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, | ||
35 | - 96000, 176400, 192000, 384000 | ||
36 | + 5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 64000, | ||
37 | + 88200, 96000, 176400, 192000, 384000 | ||
38 | }; | ||
39 | int i, j; | ||
40 | |||
41 | -- | ||
42 | 1.7.9.4 | ||
43 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0063-usb-gadget-fix-a-section-mismatch-when-compiling-g_f.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0063-usb-gadget-fix-a-section-mismatch-when-compiling-g_f.patch new file mode 100644 index 00000000..e17e8664 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0063-usb-gadget-fix-a-section-mismatch-when-compiling-g_f.patch | |||
@@ -0,0 +1,190 @@ | |||
1 | From 7086d25802a86ade70baa0edfa830e10ad7cd434 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Lothar=20Wa=C3=9Fmann?= <LW@KARO-electronics.de> | ||
3 | Date: Sun, 11 Mar 2012 15:08:46 +0100 | ||
4 | Subject: [PATCH 063/147] usb gadget: fix a section mismatch when compiling | ||
5 | g_ffs with CONFIG_USB_FUNCTIONFS_ETH | ||
6 | MIME-Version: 1.0 | ||
7 | Content-Type: text/plain; charset=UTF-8 | ||
8 | Content-Transfer-Encoding: 8bit | ||
9 | |||
10 | commit 8d0698428822ce63f7269e7fe81fc4580807b9ac upstream. | ||
11 | |||
12 | commit 28824b18ac4705e876a282a15ea0de8fc957551f: | ||
13 | |Author: Michal Nazarewicz <m.nazarewicz@samsung.com> | ||
14 | |Date: Wed May 5 12:53:13 2010 +0200 | ||
15 | | | ||
16 | | USB: gadget: __init and __exit tags removed | ||
17 | | | ||
18 | | __init, __initdata and __exit tags have have been removed from | ||
19 | | various files to make it possible for gadgets that do not use | ||
20 | | the __init/__exit tags to use those. | ||
21 | obviously missed (at least) this case leading to a section mismatch in | ||
22 | g_ffs.c when compiling with CONFIG_USB_FUNCTIONFS_ETH enabled. | ||
23 | |||
24 | Signed-off-by: Lothar Wa??mann <LW@KARO-electronics.de> | ||
25 | Acked-by: Michal Nazarewicz <mina86@mina86.com> | ||
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
27 | --- | ||
28 | drivers/usb/gadget/f_subset.c | 34 +++++++++++++++++----------------- | ||
29 | 1 file changed, 17 insertions(+), 17 deletions(-) | ||
30 | |||
31 | diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c | ||
32 | index 85bd9bd..160ba02 100644 | ||
33 | --- a/drivers/usb/gadget/f_subset.c | ||
34 | +++ b/drivers/usb/gadget/f_subset.c | ||
35 | @@ -74,7 +74,7 @@ static inline struct f_gether *func_to_geth(struct usb_function *f) | ||
36 | |||
37 | /* interface descriptor: */ | ||
38 | |||
39 | -static struct usb_interface_descriptor subset_data_intf __initdata = { | ||
40 | +static struct usb_interface_descriptor subset_data_intf = { | ||
41 | .bLength = sizeof subset_data_intf, | ||
42 | .bDescriptorType = USB_DT_INTERFACE, | ||
43 | |||
44 | @@ -87,7 +87,7 @@ static struct usb_interface_descriptor subset_data_intf __initdata = { | ||
45 | /* .iInterface = DYNAMIC */ | ||
46 | }; | ||
47 | |||
48 | -static struct usb_cdc_header_desc mdlm_header_desc __initdata = { | ||
49 | +static struct usb_cdc_header_desc mdlm_header_desc = { | ||
50 | .bLength = sizeof mdlm_header_desc, | ||
51 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
52 | .bDescriptorSubType = USB_CDC_HEADER_TYPE, | ||
53 | @@ -95,7 +95,7 @@ static struct usb_cdc_header_desc mdlm_header_desc __initdata = { | ||
54 | .bcdCDC = cpu_to_le16(0x0110), | ||
55 | }; | ||
56 | |||
57 | -static struct usb_cdc_mdlm_desc mdlm_desc __initdata = { | ||
58 | +static struct usb_cdc_mdlm_desc mdlm_desc = { | ||
59 | .bLength = sizeof mdlm_desc, | ||
60 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
61 | .bDescriptorSubType = USB_CDC_MDLM_TYPE, | ||
62 | @@ -111,7 +111,7 @@ static struct usb_cdc_mdlm_desc mdlm_desc __initdata = { | ||
63 | * can't really use its struct. All we do here is say that we're using | ||
64 | * the submode of "SAFE" which directly matches the CDC Subset. | ||
65 | */ | ||
66 | -static u8 mdlm_detail_desc[] __initdata = { | ||
67 | +static u8 mdlm_detail_desc[] = { | ||
68 | 6, | ||
69 | USB_DT_CS_INTERFACE, | ||
70 | USB_CDC_MDLM_DETAIL_TYPE, | ||
71 | @@ -121,7 +121,7 @@ static u8 mdlm_detail_desc[] __initdata = { | ||
72 | 0, /* network data capabilities ("raw" encapsulation) */ | ||
73 | }; | ||
74 | |||
75 | -static struct usb_cdc_ether_desc ether_desc __initdata = { | ||
76 | +static struct usb_cdc_ether_desc ether_desc = { | ||
77 | .bLength = sizeof ether_desc, | ||
78 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
79 | .bDescriptorSubType = USB_CDC_ETHERNET_TYPE, | ||
80 | @@ -136,7 +136,7 @@ static struct usb_cdc_ether_desc ether_desc __initdata = { | ||
81 | |||
82 | /* full speed support: */ | ||
83 | |||
84 | -static struct usb_endpoint_descriptor fs_subset_in_desc __initdata = { | ||
85 | +static struct usb_endpoint_descriptor fs_subset_in_desc = { | ||
86 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
87 | .bDescriptorType = USB_DT_ENDPOINT, | ||
88 | |||
89 | @@ -144,7 +144,7 @@ static struct usb_endpoint_descriptor fs_subset_in_desc __initdata = { | ||
90 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
91 | }; | ||
92 | |||
93 | -static struct usb_endpoint_descriptor fs_subset_out_desc __initdata = { | ||
94 | +static struct usb_endpoint_descriptor fs_subset_out_desc = { | ||
95 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
96 | .bDescriptorType = USB_DT_ENDPOINT, | ||
97 | |||
98 | @@ -152,7 +152,7 @@ static struct usb_endpoint_descriptor fs_subset_out_desc __initdata = { | ||
99 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
100 | }; | ||
101 | |||
102 | -static struct usb_descriptor_header *fs_eth_function[] __initdata = { | ||
103 | +static struct usb_descriptor_header *fs_eth_function[] = { | ||
104 | (struct usb_descriptor_header *) &subset_data_intf, | ||
105 | (struct usb_descriptor_header *) &mdlm_header_desc, | ||
106 | (struct usb_descriptor_header *) &mdlm_desc, | ||
107 | @@ -165,7 +165,7 @@ static struct usb_descriptor_header *fs_eth_function[] __initdata = { | ||
108 | |||
109 | /* high speed support: */ | ||
110 | |||
111 | -static struct usb_endpoint_descriptor hs_subset_in_desc __initdata = { | ||
112 | +static struct usb_endpoint_descriptor hs_subset_in_desc = { | ||
113 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
114 | .bDescriptorType = USB_DT_ENDPOINT, | ||
115 | |||
116 | @@ -173,7 +173,7 @@ static struct usb_endpoint_descriptor hs_subset_in_desc __initdata = { | ||
117 | .wMaxPacketSize = cpu_to_le16(512), | ||
118 | }; | ||
119 | |||
120 | -static struct usb_endpoint_descriptor hs_subset_out_desc __initdata = { | ||
121 | +static struct usb_endpoint_descriptor hs_subset_out_desc = { | ||
122 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
123 | .bDescriptorType = USB_DT_ENDPOINT, | ||
124 | |||
125 | @@ -181,7 +181,7 @@ static struct usb_endpoint_descriptor hs_subset_out_desc __initdata = { | ||
126 | .wMaxPacketSize = cpu_to_le16(512), | ||
127 | }; | ||
128 | |||
129 | -static struct usb_descriptor_header *hs_eth_function[] __initdata = { | ||
130 | +static struct usb_descriptor_header *hs_eth_function[] = { | ||
131 | (struct usb_descriptor_header *) &subset_data_intf, | ||
132 | (struct usb_descriptor_header *) &mdlm_header_desc, | ||
133 | (struct usb_descriptor_header *) &mdlm_desc, | ||
134 | @@ -194,7 +194,7 @@ static struct usb_descriptor_header *hs_eth_function[] __initdata = { | ||
135 | |||
136 | /* super speed support: */ | ||
137 | |||
138 | -static struct usb_endpoint_descriptor ss_subset_in_desc __initdata = { | ||
139 | +static struct usb_endpoint_descriptor ss_subset_in_desc = { | ||
140 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
141 | .bDescriptorType = USB_DT_ENDPOINT, | ||
142 | |||
143 | @@ -202,7 +202,7 @@ static struct usb_endpoint_descriptor ss_subset_in_desc __initdata = { | ||
144 | .wMaxPacketSize = cpu_to_le16(1024), | ||
145 | }; | ||
146 | |||
147 | -static struct usb_endpoint_descriptor ss_subset_out_desc __initdata = { | ||
148 | +static struct usb_endpoint_descriptor ss_subset_out_desc = { | ||
149 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
150 | .bDescriptorType = USB_DT_ENDPOINT, | ||
151 | |||
152 | @@ -210,7 +210,7 @@ static struct usb_endpoint_descriptor ss_subset_out_desc __initdata = { | ||
153 | .wMaxPacketSize = cpu_to_le16(1024), | ||
154 | }; | ||
155 | |||
156 | -static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc __initdata = { | ||
157 | +static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc = { | ||
158 | .bLength = sizeof ss_subset_bulk_comp_desc, | ||
159 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
160 | |||
161 | @@ -219,7 +219,7 @@ static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc __initdata = { | ||
162 | /* .bmAttributes = 0, */ | ||
163 | }; | ||
164 | |||
165 | -static struct usb_descriptor_header *ss_eth_function[] __initdata = { | ||
166 | +static struct usb_descriptor_header *ss_eth_function[] = { | ||
167 | (struct usb_descriptor_header *) &subset_data_intf, | ||
168 | (struct usb_descriptor_header *) &mdlm_header_desc, | ||
169 | (struct usb_descriptor_header *) &mdlm_desc, | ||
170 | @@ -290,7 +290,7 @@ static void geth_disable(struct usb_function *f) | ||
171 | |||
172 | /* serial function driver setup/binding */ | ||
173 | |||
174 | -static int __init | ||
175 | +static int | ||
176 | geth_bind(struct usb_configuration *c, struct usb_function *f) | ||
177 | { | ||
178 | struct usb_composite_dev *cdev = c->cdev; | ||
179 | @@ -405,7 +405,7 @@ geth_unbind(struct usb_configuration *c, struct usb_function *f) | ||
180 | * Caller must have called @gether_setup(). Caller is also responsible | ||
181 | * for calling @gether_cleanup() before module unload. | ||
182 | */ | ||
183 | -int __init geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | ||
184 | +int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | ||
185 | { | ||
186 | struct f_gether *geth; | ||
187 | int status; | ||
188 | -- | ||
189 | 1.7.9.4 | ||
190 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0064-udlfb-remove-sysfs-framebuffer-device-with-USB-.disc.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0064-udlfb-remove-sysfs-framebuffer-device-with-USB-.disc.patch new file mode 100644 index 00000000..42684c7c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0064-udlfb-remove-sysfs-framebuffer-device-with-USB-.disc.patch | |||
@@ -0,0 +1,120 @@ | |||
1 | From 65fc28a302c7d7220dbe8609899724edb9687162 Mon Sep 17 00:00:00 2001 | ||
2 | From: Kay Sievers <kay.sievers@vrfy.org> | ||
3 | Date: Sat, 28 Jan 2012 19:57:46 +0000 | ||
4 | Subject: [PATCH 064/147] udlfb: remove sysfs framebuffer device with USB | ||
5 | .disconnect() | ||
6 | |||
7 | commit ce880cb860f36694d2cdebfac9e6ae18176fe4c4 upstream. | ||
8 | |||
9 | The USB graphics card driver delays the unregistering of the framebuffer | ||
10 | device to a workqueue, which breaks the userspace visible remove uevent | ||
11 | sequence. Recent userspace tools started to support USB graphics card | ||
12 | hotplug out-of-the-box and rely on proper events sent by the kernel. | ||
13 | |||
14 | The framebuffer device is a direct child of the USB interface which is | ||
15 | removed immediately after the USB .disconnect() callback. But the fb device | ||
16 | in /sys stays around until its final cleanup, at a time where all the parent | ||
17 | devices have been removed already. | ||
18 | |||
19 | To work around that, we remove the sysfs fb device directly in the USB | ||
20 | .disconnect() callback and leave only the cleanup of the internal fb | ||
21 | data to the delayed work. | ||
22 | |||
23 | Before: | ||
24 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) | ||
25 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) | ||
26 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb0 (graphics) | ||
27 | remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) | ||
28 | remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) | ||
29 | remove /2-1.2:1.0/graphics/fb0 (graphics) | ||
30 | |||
31 | After: | ||
32 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) | ||
33 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) | ||
34 | add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb1 (graphics) | ||
35 | remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb1 (graphics) | ||
36 | remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb) | ||
37 | remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb) | ||
38 | |||
39 | Tested-by: Bernie Thompson <bernie@plugable.com> | ||
40 | Acked-by: Bernie Thompson <bernie@plugable.com> | ||
41 | Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> | ||
42 | Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
43 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
44 | --- | ||
45 | drivers/video/fbmem.c | 18 +++++++++++++++++- | ||
46 | drivers/video/udlfb.c | 2 +- | ||
47 | include/linux/fb.h | 1 + | ||
48 | 3 files changed, 19 insertions(+), 2 deletions(-) | ||
49 | |||
50 | diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c | ||
51 | index ad93629..7a41220 100644 | ||
52 | --- a/drivers/video/fbmem.c | ||
53 | +++ b/drivers/video/fbmem.c | ||
54 | @@ -1651,6 +1651,7 @@ static int do_unregister_framebuffer(struct fb_info *fb_info) | ||
55 | if (ret) | ||
56 | return -EINVAL; | ||
57 | |||
58 | + unlink_framebuffer(fb_info); | ||
59 | if (fb_info->pixmap.addr && | ||
60 | (fb_info->pixmap.flags & FB_PIXMAP_DEFAULT)) | ||
61 | kfree(fb_info->pixmap.addr); | ||
62 | @@ -1658,7 +1659,6 @@ static int do_unregister_framebuffer(struct fb_info *fb_info) | ||
63 | registered_fb[i] = NULL; | ||
64 | num_registered_fb--; | ||
65 | fb_cleanup_device(fb_info); | ||
66 | - device_destroy(fb_class, MKDEV(FB_MAJOR, i)); | ||
67 | event.info = fb_info; | ||
68 | fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); | ||
69 | |||
70 | @@ -1667,6 +1667,22 @@ static int do_unregister_framebuffer(struct fb_info *fb_info) | ||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | +int unlink_framebuffer(struct fb_info *fb_info) | ||
75 | +{ | ||
76 | + int i; | ||
77 | + | ||
78 | + i = fb_info->node; | ||
79 | + if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info) | ||
80 | + return -EINVAL; | ||
81 | + | ||
82 | + if (fb_info->dev) { | ||
83 | + device_destroy(fb_class, MKDEV(FB_MAJOR, i)); | ||
84 | + fb_info->dev = NULL; | ||
85 | + } | ||
86 | + return 0; | ||
87 | +} | ||
88 | +EXPORT_SYMBOL(unlink_framebuffer); | ||
89 | + | ||
90 | void remove_conflicting_framebuffers(struct apertures_struct *a, | ||
91 | const char *name, bool primary) | ||
92 | { | ||
93 | diff --git a/drivers/video/udlfb.c b/drivers/video/udlfb.c | ||
94 | index 3473e75..41746bb 100644 | ||
95 | --- a/drivers/video/udlfb.c | ||
96 | +++ b/drivers/video/udlfb.c | ||
97 | @@ -1739,7 +1739,7 @@ static void dlfb_usb_disconnect(struct usb_interface *interface) | ||
98 | for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) | ||
99 | device_remove_file(info->dev, &fb_device_attrs[i]); | ||
100 | device_remove_bin_file(info->dev, &edid_attr); | ||
101 | - | ||
102 | + unlink_framebuffer(info); | ||
103 | usb_set_intfdata(interface, NULL); | ||
104 | |||
105 | /* if clients still have us open, will be freed on last close */ | ||
106 | diff --git a/include/linux/fb.h b/include/linux/fb.h | ||
107 | index 1d6836c..73845ce 100644 | ||
108 | --- a/include/linux/fb.h | ||
109 | +++ b/include/linux/fb.h | ||
110 | @@ -997,6 +997,7 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf, | ||
111 | /* drivers/video/fbmem.c */ | ||
112 | extern int register_framebuffer(struct fb_info *fb_info); | ||
113 | extern int unregister_framebuffer(struct fb_info *fb_info); | ||
114 | +extern int unlink_framebuffer(struct fb_info *fb_info); | ||
115 | extern void remove_conflicting_framebuffers(struct apertures_struct *a, | ||
116 | const char *name, bool primary); | ||
117 | extern int fb_prepare_logo(struct fb_info *fb_info, int rotate); | ||
118 | -- | ||
119 | 1.7.9.4 | ||
120 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0065-tcm_fc-Fix-fc_exch-memory-leak-in-ft_send_resp_statu.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0065-tcm_fc-Fix-fc_exch-memory-leak-in-ft_send_resp_statu.patch new file mode 100644 index 00000000..e4311b46 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0065-tcm_fc-Fix-fc_exch-memory-leak-in-ft_send_resp_statu.patch | |||
@@ -0,0 +1,50 @@ | |||
1 | From a38ce1660f9b3f6abec9206118adc0a33bda9730 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nicholas Bellinger <nab@linux-iscsi.org> | ||
3 | Date: Fri, 9 Mar 2012 23:45:38 -0800 | ||
4 | Subject: [PATCH 065/147] tcm_fc: Fix fc_exch memory leak in | ||
5 | ft_send_resp_status | ||
6 | |||
7 | commit 031ed4d565b31880a4136bb7366bc89f5b1dba7d upstream. | ||
8 | |||
9 | This patch fixes a bug in tcm_fc where fc_exch memory from fc_exch_mgr->ep_pool | ||
10 | is currently being leaked by ft_send_resp_status() usage. Following current | ||
11 | code in ft_queue_status() response path, using lport->tt.seq_send() needs to be | ||
12 | followed by a lport->tt.exch_done() in order to release fc_exch memory back into | ||
13 | libfc_em kmem_cache. | ||
14 | |||
15 | ft_send_resp_status() code is currently used in pre submit se_cmd ft_send_work() | ||
16 | error exceptions, TM request setup exceptions, and main TM response callback | ||
17 | path in ft_queue_tm_resp(). This bugfix addresses the leak in these cases. | ||
18 | |||
19 | Cc: Mark D Rustad <mark.d.rustad@intel.com> | ||
20 | Cc: Kiran Patil <kiran.patil@intel.com> | ||
21 | Cc: Robert Love <robert.w.love@intel.com> | ||
22 | Cc: Andy Grover <agrover@redhat.com> | ||
23 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
24 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
25 | --- | ||
26 | drivers/target/tcm_fc/tfc_cmd.c | 6 ++++-- | ||
27 | 1 file changed, 4 insertions(+), 2 deletions(-) | ||
28 | |||
29 | diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c | ||
30 | index 71fc9ce..754b669 100644 | ||
31 | --- a/drivers/target/tcm_fc/tfc_cmd.c | ||
32 | +++ b/drivers/target/tcm_fc/tfc_cmd.c | ||
33 | @@ -329,10 +329,12 @@ static void ft_send_resp_status(struct fc_lport *lport, | ||
34 | |||
35 | fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_DD_CMD_STATUS, 0); | ||
36 | sp = fr_seq(fp); | ||
37 | - if (sp) | ||
38 | + if (sp) { | ||
39 | lport->tt.seq_send(lport, sp, fp); | ||
40 | - else | ||
41 | + lport->tt.exch_done(sp); | ||
42 | + } else { | ||
43 | lport->tt.frame_send(lport, fp); | ||
44 | + } | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | -- | ||
49 | 1.7.9.4 | ||
50 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0066-md-bitmap-ensure-to-load-bitmap-when-creating-via-sy.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0066-md-bitmap-ensure-to-load-bitmap-when-creating-via-sy.patch new file mode 100644 index 00000000..03c666b9 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0066-md-bitmap-ensure-to-load-bitmap-when-creating-via-sy.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From 850bfe24a75251acf10ad9dbacd4bc750005fd1b Mon Sep 17 00:00:00 2001 | ||
2 | From: NeilBrown <neilb@suse.de> | ||
3 | Date: Mon, 19 Mar 2012 12:46:37 +1100 | ||
4 | Subject: [PATCH 066/147] md/bitmap: ensure to load bitmap when creating via | ||
5 | sysfs. | ||
6 | |||
7 | commit 4474ca42e2577563a919fd3ed782e2ec55bf11a2 upstream. | ||
8 | |||
9 | When commit 69e51b449d383e (md/bitmap: separate out loading a bitmap...) | ||
10 | created bitmap_load, it missed calling it after bitmap_create when a | ||
11 | bitmap is created through the sysfs interface. | ||
12 | So if a bitmap is added this way, we don't allocate memory properly | ||
13 | and can crash. | ||
14 | |||
15 | This is suitable for any -stable release since 2.6.35. | ||
16 | Signed-off-by: NeilBrown <neilb@suse.de> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | drivers/md/bitmap.c | 2 ++ | ||
20 | 1 file changed, 2 insertions(+) | ||
21 | |||
22 | diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c | ||
23 | index 6d03774..2a8722b 100644 | ||
24 | --- a/drivers/md/bitmap.c | ||
25 | +++ b/drivers/md/bitmap.c | ||
26 | @@ -1904,6 +1904,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | ||
27 | if (mddev->pers) { | ||
28 | mddev->pers->quiesce(mddev, 1); | ||
29 | rv = bitmap_create(mddev); | ||
30 | + if (!rv) | ||
31 | + rv = bitmap_load(mddev); | ||
32 | if (rv) { | ||
33 | bitmap_destroy(mddev); | ||
34 | mddev->bitmap_info.offset = 0; | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0067-md-don-t-set-md-arrays-to-readonly-on-shutdown.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0067-md-don-t-set-md-arrays-to-readonly-on-shutdown.patch new file mode 100644 index 00000000..93145a1d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0067-md-don-t-set-md-arrays-to-readonly-on-shutdown.patch | |||
@@ -0,0 +1,82 @@ | |||
1 | From c52810052a2cbfeb2b8768081f8a22240c0d0abe Mon Sep 17 00:00:00 2001 | ||
2 | From: NeilBrown <neilb@suse.de> | ||
3 | Date: Mon, 19 Mar 2012 12:46:37 +1100 | ||
4 | Subject: [PATCH 067/147] md: don't set md arrays to readonly on shutdown. | ||
5 | |||
6 | commit c744a65c1e2d59acc54333ce80a5b0702a98010b upstream. | ||
7 | |||
8 | It seems that with recent kernel, writeback can still be happening | ||
9 | while shutdown is happening, and consequently data can be written | ||
10 | after the md reboot notifier switches all arrays to read-only. | ||
11 | This causes a BUG. | ||
12 | |||
13 | So don't switch them to read-only - just mark them clean and | ||
14 | set 'safemode' to '2' which mean that immediately after any | ||
15 | write the array will be switch back to 'clean'. | ||
16 | |||
17 | This could result in the shutdown happening when array is marked | ||
18 | dirty, thus forcing a resync on reboot. However if you reboot | ||
19 | without performing a "sync" first, you get to keep both halves. | ||
20 | |||
21 | This is suitable for any stable kernel (though there might be some | ||
22 | conflicts with obvious fixes in earlier kernels). | ||
23 | |||
24 | Signed-off-by: NeilBrown <neilb@suse.de> | ||
25 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
26 | --- | ||
27 | drivers/md/md.c | 37 +++++++++++++++---------------------- | ||
28 | 1 file changed, 15 insertions(+), 22 deletions(-) | ||
29 | |||
30 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
31 | index f47f1f8..65d552a 100644 | ||
32 | --- a/drivers/md/md.c | ||
33 | +++ b/drivers/md/md.c | ||
34 | @@ -8097,30 +8097,23 @@ static int md_notify_reboot(struct notifier_block *this, | ||
35 | struct mddev *mddev; | ||
36 | int need_delay = 0; | ||
37 | |||
38 | - if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) { | ||
39 | - | ||
40 | - printk(KERN_INFO "md: stopping all md devices.\n"); | ||
41 | - | ||
42 | - for_each_mddev(mddev, tmp) { | ||
43 | - if (mddev_trylock(mddev)) { | ||
44 | - /* Force a switch to readonly even array | ||
45 | - * appears to still be in use. Hence | ||
46 | - * the '100'. | ||
47 | - */ | ||
48 | - md_set_readonly(mddev, 100); | ||
49 | - mddev_unlock(mddev); | ||
50 | - } | ||
51 | - need_delay = 1; | ||
52 | + for_each_mddev(mddev, tmp) { | ||
53 | + if (mddev_trylock(mddev)) { | ||
54 | + __md_stop_writes(mddev); | ||
55 | + mddev->safemode = 2; | ||
56 | + mddev_unlock(mddev); | ||
57 | } | ||
58 | - /* | ||
59 | - * certain more exotic SCSI devices are known to be | ||
60 | - * volatile wrt too early system reboots. While the | ||
61 | - * right place to handle this issue is the given | ||
62 | - * driver, we do want to have a safe RAID driver ... | ||
63 | - */ | ||
64 | - if (need_delay) | ||
65 | - mdelay(1000*1); | ||
66 | + need_delay = 1; | ||
67 | } | ||
68 | + /* | ||
69 | + * certain more exotic SCSI devices are known to be | ||
70 | + * volatile wrt too early system reboots. While the | ||
71 | + * right place to handle this issue is the given | ||
72 | + * driver, we do want to have a safe RAID driver ... | ||
73 | + */ | ||
74 | + if (need_delay) | ||
75 | + mdelay(1000*1); | ||
76 | + | ||
77 | return NOTIFY_DONE; | ||
78 | } | ||
79 | |||
80 | -- | ||
81 | 1.7.9.4 | ||
82 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0068-md-raid1-raid10-avoid-deadlock-during-resync-recover.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0068-md-raid1-raid10-avoid-deadlock-during-resync-recover.patch new file mode 100644 index 00000000..0fe819c0 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0068-md-raid1-raid10-avoid-deadlock-during-resync-recover.patch | |||
@@ -0,0 +1,97 @@ | |||
1 | From 250082bf56c6157c888f21df27d73475cb6f0065 Mon Sep 17 00:00:00 2001 | ||
2 | From: NeilBrown <neilb@suse.de> | ||
3 | Date: Mon, 19 Mar 2012 12:46:38 +1100 | ||
4 | Subject: [PATCH 068/147] md/raid1,raid10: avoid deadlock during | ||
5 | resync/recovery. | ||
6 | |||
7 | commit d6b42dcb995e6acd7cc276774e751ffc9f0ef4bf upstream. | ||
8 | |||
9 | If RAID1 or RAID10 is used under LVM or some other stacking | ||
10 | block device, it is possible to enter a deadlock during | ||
11 | resync or recovery. | ||
12 | This can happen if the upper level block device creates | ||
13 | two requests to the RAID1 or RAID10. The first request gets | ||
14 | processed, blocks recovery and queue requests for underlying | ||
15 | requests in current->bio_list. A resync request then starts | ||
16 | which will wait for those requests and block new IO. | ||
17 | |||
18 | But then the second request to the RAID1/10 will be attempted | ||
19 | and it cannot progress until the resync request completes, | ||
20 | which cannot progress until the underlying device requests complete, | ||
21 | which are on a queue behind that second request. | ||
22 | |||
23 | So allow that second request to proceed even though there is | ||
24 | a resync request about to start. | ||
25 | |||
26 | This is suitable for any -stable kernel. | ||
27 | |||
28 | Reported-by: Ray Morris <support@bettercgi.com> | ||
29 | Tested-by: Ray Morris <support@bettercgi.com> | ||
30 | Signed-off-by: NeilBrown <neilb@suse.de> | ||
31 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
32 | --- | ||
33 | drivers/md/raid1.c | 17 +++++++++++++++-- | ||
34 | drivers/md/raid10.c | 17 +++++++++++++++-- | ||
35 | 2 files changed, 30 insertions(+), 4 deletions(-) | ||
36 | |||
37 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
38 | index 7d9e071..7af60ec 100644 | ||
39 | --- a/drivers/md/raid1.c | ||
40 | +++ b/drivers/md/raid1.c | ||
41 | @@ -731,9 +731,22 @@ static void wait_barrier(struct r1conf *conf) | ||
42 | spin_lock_irq(&conf->resync_lock); | ||
43 | if (conf->barrier) { | ||
44 | conf->nr_waiting++; | ||
45 | - wait_event_lock_irq(conf->wait_barrier, !conf->barrier, | ||
46 | + /* Wait for the barrier to drop. | ||
47 | + * However if there are already pending | ||
48 | + * requests (preventing the barrier from | ||
49 | + * rising completely), and the | ||
50 | + * pre-process bio queue isn't empty, | ||
51 | + * then don't wait, as we need to empty | ||
52 | + * that queue to get the nr_pending | ||
53 | + * count down. | ||
54 | + */ | ||
55 | + wait_event_lock_irq(conf->wait_barrier, | ||
56 | + !conf->barrier || | ||
57 | + (conf->nr_pending && | ||
58 | + current->bio_list && | ||
59 | + !bio_list_empty(current->bio_list)), | ||
60 | conf->resync_lock, | ||
61 | - ); | ||
62 | + ); | ||
63 | conf->nr_waiting--; | ||
64 | } | ||
65 | conf->nr_pending++; | ||
66 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
67 | index 685ddf3..b219449 100644 | ||
68 | --- a/drivers/md/raid10.c | ||
69 | +++ b/drivers/md/raid10.c | ||
70 | @@ -790,9 +790,22 @@ static void wait_barrier(struct r10conf *conf) | ||
71 | spin_lock_irq(&conf->resync_lock); | ||
72 | if (conf->barrier) { | ||
73 | conf->nr_waiting++; | ||
74 | - wait_event_lock_irq(conf->wait_barrier, !conf->barrier, | ||
75 | + /* Wait for the barrier to drop. | ||
76 | + * However if there are already pending | ||
77 | + * requests (preventing the barrier from | ||
78 | + * rising completely), and the | ||
79 | + * pre-process bio queue isn't empty, | ||
80 | + * then don't wait, as we need to empty | ||
81 | + * that queue to get the nr_pending | ||
82 | + * count down. | ||
83 | + */ | ||
84 | + wait_event_lock_irq(conf->wait_barrier, | ||
85 | + !conf->barrier || | ||
86 | + (conf->nr_pending && | ||
87 | + current->bio_list && | ||
88 | + !bio_list_empty(current->bio_list)), | ||
89 | conf->resync_lock, | ||
90 | - ); | ||
91 | + ); | ||
92 | conf->nr_waiting--; | ||
93 | } | ||
94 | conf->nr_pending++; | ||
95 | -- | ||
96 | 1.7.9.4 | ||
97 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0069-md-fix-clearing-of-the-changed-flags-for-the-bad-blo.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0069-md-fix-clearing-of-the-changed-flags-for-the-bad-blo.patch new file mode 100644 index 00000000..9dda7081 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0069-md-fix-clearing-of-the-changed-flags-for-the-bad-blo.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | From c1566b5f4f2d8cbc8badc75b774fa79d6c03477b Mon Sep 17 00:00:00 2001 | ||
2 | From: NeilBrown <neilb@suse.de> | ||
3 | Date: Mon, 19 Mar 2012 12:46:41 +1100 | ||
4 | Subject: [PATCH 069/147] md: fix clearing of the 'changed' flags for the bad | ||
5 | blocks list. | ||
6 | |||
7 | commit d0962936bff659d20522555b517582a2715fd23f upstream. | ||
8 | |||
9 | In super_1_sync (the first hunk) we need to clear 'changed' before | ||
10 | checking read_seqretry(), otherwise we might race with other code | ||
11 | adding a bad block and so won't retry later. | ||
12 | |||
13 | In md_update_sb (the second hunk), in the case where there is no | ||
14 | metadata (neither persistent nor external), we treat any bad blocks as | ||
15 | an error. However we need to clear the 'changed' flag before calling | ||
16 | md_ack_all_badblocks, else it won't do anything. | ||
17 | |||
18 | This patch is suitable for -stable release 3.0 and later. | ||
19 | |||
20 | Signed-off-by: NeilBrown <neilb@suse.de> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | drivers/md/md.c | 3 ++- | ||
24 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
25 | |||
26 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
27 | index 65d552a..6f37aa4 100644 | ||
28 | --- a/drivers/md/md.c | ||
29 | +++ b/drivers/md/md.c | ||
30 | @@ -1801,13 +1801,13 @@ retry: | ||
31 | | BB_LEN(internal_bb)); | ||
32 | *bbp++ = cpu_to_le64(store_bb); | ||
33 | } | ||
34 | + bb->changed = 0; | ||
35 | if (read_seqretry(&bb->lock, seq)) | ||
36 | goto retry; | ||
37 | |||
38 | bb->sector = (rdev->sb_start + | ||
39 | (int)le32_to_cpu(sb->bblog_offset)); | ||
40 | bb->size = le16_to_cpu(sb->bblog_size); | ||
41 | - bb->changed = 0; | ||
42 | } | ||
43 | } | ||
44 | |||
45 | @@ -2362,6 +2362,7 @@ repeat: | ||
46 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
47 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
48 | if (rdev->badblocks.changed) { | ||
49 | + rdev->badblocks.changed = 0; | ||
50 | md_ack_all_badblocks(&rdev->badblocks); | ||
51 | md_error(mddev, rdev); | ||
52 | } | ||
53 | -- | ||
54 | 1.7.9.4 | ||
55 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0070-drm-i915-Only-clear-the-GPU-domains-upon-a-successfu.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0070-drm-i915-Only-clear-the-GPU-domains-upon-a-successfu.patch new file mode 100644 index 00000000..197506ca --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0070-drm-i915-Only-clear-the-GPU-domains-upon-a-successfu.patch | |||
@@ -0,0 +1,64 @@ | |||
1 | From bee686c633c4875d2910e0559b7ce4bba5da1911 Mon Sep 17 00:00:00 2001 | ||
2 | From: Chris Wilson <chris@chris-wilson.co.uk> | ||
3 | Date: Wed, 14 Dec 2011 13:57:23 +0100 | ||
4 | Subject: [PATCH 070/147] drm/i915: Only clear the GPU domains upon a | ||
5 | successful finish | ||
6 | |||
7 | commit c501ae7f332cdaf42e31af30b72b4b66cbbb1604 upstream. | ||
8 | |||
9 | By clearing the GPU read domains before waiting upon the buffer, we run | ||
10 | the risk of the wait being interrupted and the domains prematurely | ||
11 | cleared. The next time we attempt to wait upon the buffer (after | ||
12 | userspace handles the signal), we believe that the buffer is idle and so | ||
13 | skip the wait. | ||
14 | |||
15 | There are a number of bugs across all generations which show signs of an | ||
16 | overly haste reuse of active buffers. | ||
17 | |||
18 | Such as: | ||
19 | |||
20 | https://bugs.freedesktop.org/show_bug.cgi?id=29046 | ||
21 | https://bugs.freedesktop.org/show_bug.cgi?id=35863 | ||
22 | https://bugs.freedesktop.org/show_bug.cgi?id=38952 | ||
23 | https://bugs.freedesktop.org/show_bug.cgi?id=40282 | ||
24 | https://bugs.freedesktop.org/show_bug.cgi?id=41098 | ||
25 | https://bugs.freedesktop.org/show_bug.cgi?id=41102 | ||
26 | https://bugs.freedesktop.org/show_bug.cgi?id=41284 | ||
27 | https://bugs.freedesktop.org/show_bug.cgi?id=42141 | ||
28 | |||
29 | A couple of those pre-date i915_gem_object_finish_gpu(), so may be | ||
30 | unrelated (such as a wild write from a userspace command buffer), but | ||
31 | this does look like a convincing cause for most of those bugs. | ||
32 | |||
33 | Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> | ||
34 | Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> | ||
35 | Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com> | ||
36 | Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> | ||
37 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
38 | --- | ||
39 | drivers/gpu/drm/i915/i915_gem.c | 7 +++++-- | ||
40 | 1 file changed, 5 insertions(+), 2 deletions(-) | ||
41 | |||
42 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
43 | index 8359dc7..3e7c478 100644 | ||
44 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
45 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
46 | @@ -3084,10 +3084,13 @@ i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj) | ||
47 | return ret; | ||
48 | } | ||
49 | |||
50 | + ret = i915_gem_object_wait_rendering(obj); | ||
51 | + if (ret) | ||
52 | + return ret; | ||
53 | + | ||
54 | /* Ensure that we invalidate the GPU's caches and TLBs. */ | ||
55 | obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; | ||
56 | - | ||
57 | - return i915_gem_object_wait_rendering(obj); | ||
58 | + return 0; | ||
59 | } | ||
60 | |||
61 | /** | ||
62 | -- | ||
63 | 1.7.9.4 | ||
64 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0071-drm-radeon-Restrict-offset-for-legacy-hardware-curso.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0071-drm-radeon-Restrict-offset-for-legacy-hardware-curso.patch new file mode 100644 index 00000000..b3701c82 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0071-drm-radeon-Restrict-offset-for-legacy-hardware-curso.patch | |||
@@ -0,0 +1,131 @@ | |||
1 | From 37e7d6645532f78e279da5f5257faf0ee0c0f8f3 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com> | ||
3 | Date: Wed, 14 Mar 2012 17:12:41 +0100 | ||
4 | Subject: [PATCH 071/147] drm/radeon: Restrict offset for legacy hardware | ||
5 | cursor. | ||
6 | MIME-Version: 1.0 | ||
7 | Content-Type: text/plain; charset=UTF-8 | ||
8 | Content-Transfer-Encoding: 8bit | ||
9 | |||
10 | commit c4353016dac10133fa5d8535af83f0c4845a2915 upstream. | ||
11 | |||
12 | The hardware only takes 27 bits for the offset, so larger offsets are | ||
13 | truncated, and the hardware cursor shows random bits other than the intended | ||
14 | ones. | ||
15 | |||
16 | Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=46796 | ||
17 | |||
18 | Signed-off-by: Michel D??nzer <michel.daenzer@amd.com> | ||
19 | Reviewed-by: Alex Deucher <alexander.deucher@amd.com> | ||
20 | Signed-off-by: Dave Airlie <airlied@redhat.com> | ||
21 | --- | ||
22 | drivers/gpu/drm/radeon/radeon_cursor.c | 13 +++++++++++-- | ||
23 | drivers/gpu/drm/radeon/radeon_object.c | 18 +++++++++++++++++- | ||
24 | drivers/gpu/drm/radeon/radeon_object.h | 2 ++ | ||
25 | 3 files changed, 30 insertions(+), 3 deletions(-) | ||
26 | |||
27 | diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
28 | index fde25c0..986d608 100644 | ||
29 | --- a/drivers/gpu/drm/radeon/radeon_cursor.c | ||
30 | +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
31 | @@ -151,7 +151,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, | ||
32 | uint32_t height) | ||
33 | { | ||
34 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
35 | + struct radeon_device *rdev = crtc->dev->dev_private; | ||
36 | struct drm_gem_object *obj; | ||
37 | + struct radeon_bo *robj; | ||
38 | uint64_t gpu_addr; | ||
39 | int ret; | ||
40 | |||
41 | @@ -173,7 +175,15 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, | ||
42 | return -ENOENT; | ||
43 | } | ||
44 | |||
45 | - ret = radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &gpu_addr); | ||
46 | + robj = gem_to_radeon_bo(obj); | ||
47 | + ret = radeon_bo_reserve(robj, false); | ||
48 | + if (unlikely(ret != 0)) | ||
49 | + goto fail; | ||
50 | + /* Only 27 bit offset for legacy cursor */ | ||
51 | + ret = radeon_bo_pin_restricted(robj, RADEON_GEM_DOMAIN_VRAM, | ||
52 | + ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, | ||
53 | + &gpu_addr); | ||
54 | + radeon_bo_unreserve(robj); | ||
55 | if (ret) | ||
56 | goto fail; | ||
57 | |||
58 | @@ -181,7 +191,6 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, | ||
59 | radeon_crtc->cursor_height = height; | ||
60 | |||
61 | radeon_lock_cursor(crtc, true); | ||
62 | - /* XXX only 27 bit offset for legacy cursor */ | ||
63 | radeon_set_cursor(crtc, obj, gpu_addr); | ||
64 | radeon_show_cursor(crtc); | ||
65 | radeon_lock_cursor(crtc, false); | ||
66 | diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c | ||
67 | index 1c85152..f3ae607 100644 | ||
68 | --- a/drivers/gpu/drm/radeon/radeon_object.c | ||
69 | +++ b/drivers/gpu/drm/radeon/radeon_object.c | ||
70 | @@ -204,7 +204,8 @@ void radeon_bo_unref(struct radeon_bo **bo) | ||
71 | *bo = NULL; | ||
72 | } | ||
73 | |||
74 | -int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
75 | +int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset, | ||
76 | + u64 *gpu_addr) | ||
77 | { | ||
78 | int r, i; | ||
79 | |||
80 | @@ -212,6 +213,7 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
81 | bo->pin_count++; | ||
82 | if (gpu_addr) | ||
83 | *gpu_addr = radeon_bo_gpu_offset(bo); | ||
84 | + WARN_ON_ONCE(max_offset != 0); | ||
85 | return 0; | ||
86 | } | ||
87 | radeon_ttm_placement_from_domain(bo, domain); | ||
88 | @@ -219,6 +221,15 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
89 | /* force to pin into visible video ram */ | ||
90 | bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT; | ||
91 | } | ||
92 | + if (max_offset) { | ||
93 | + u64 lpfn = max_offset >> PAGE_SHIFT; | ||
94 | + | ||
95 | + if (!bo->placement.lpfn) | ||
96 | + bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; | ||
97 | + | ||
98 | + if (lpfn < bo->placement.lpfn) | ||
99 | + bo->placement.lpfn = lpfn; | ||
100 | + } | ||
101 | for (i = 0; i < bo->placement.num_placement; i++) | ||
102 | bo->placements[i] |= TTM_PL_FLAG_NO_EVICT; | ||
103 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false, false); | ||
104 | @@ -232,6 +243,11 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
105 | return r; | ||
106 | } | ||
107 | |||
108 | +int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
109 | +{ | ||
110 | + return radeon_bo_pin_restricted(bo, domain, 0, gpu_addr); | ||
111 | +} | ||
112 | + | ||
113 | int radeon_bo_unpin(struct radeon_bo *bo) | ||
114 | { | ||
115 | int r, i; | ||
116 | diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h | ||
117 | index b07f0f9..fb3f433 100644 | ||
118 | --- a/drivers/gpu/drm/radeon/radeon_object.h | ||
119 | +++ b/drivers/gpu/drm/radeon/radeon_object.h | ||
120 | @@ -108,6 +108,8 @@ extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); | ||
121 | extern void radeon_bo_kunmap(struct radeon_bo *bo); | ||
122 | extern void radeon_bo_unref(struct radeon_bo **bo); | ||
123 | extern int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr); | ||
124 | +extern int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, | ||
125 | + u64 max_offset, u64 *gpu_addr); | ||
126 | extern int radeon_bo_unpin(struct radeon_bo *bo); | ||
127 | extern int radeon_bo_evict_vram(struct radeon_device *rdev); | ||
128 | extern void radeon_bo_force_delete(struct radeon_device *rdev); | ||
129 | -- | ||
130 | 1.7.9.4 | ||
131 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0072-drm-radeon-kms-fix-analog-load-detection-on-DVI-I-co.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0072-drm-radeon-kms-fix-analog-load-detection-on-DVI-I-co.patch new file mode 100644 index 00000000..db377d3c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0072-drm-radeon-kms-fix-analog-load-detection-on-DVI-I-co.patch | |||
@@ -0,0 +1,40 @@ | |||
1 | From de31bb0d8975b5a6b55c0c0fb10fb7f84ca15c5d Mon Sep 17 00:00:00 2001 | ||
2 | From: Alex Deucher <alexander.deucher@amd.com> | ||
3 | Date: Fri, 16 Mar 2012 12:22:09 -0400 | ||
4 | Subject: [PATCH 072/147] drm/radeon/kms: fix analog load detection on DVI-I | ||
5 | connectors | ||
6 | |||
7 | commit e00e8b5e760cbbe9067daeae5454d67c44c8d035 upstream. | ||
8 | |||
9 | We digital encoders have a detect function as well (for | ||
10 | DP to VGA bridges), so we make sure we choose the analog | ||
11 | one here. | ||
12 | |||
13 | Fixes: | ||
14 | https://bugs.freedesktop.org/show_bug.cgi?id=47007 | ||
15 | |||
16 | Signed-off-by: Alex Deucher <alexander.deucher@amd.com> | ||
17 | Signed-off-by: Dave Airlie <airlied@redhat.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/gpu/drm/radeon/radeon_connectors.c | 4 ++++ | ||
21 | 1 file changed, 4 insertions(+) | ||
22 | |||
23 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
24 | index e7cb3ab..f7d39ac 100644 | ||
25 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
26 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
27 | @@ -946,6 +946,10 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
28 | |||
29 | encoder = obj_to_encoder(obj); | ||
30 | |||
31 | + if (encoder->encoder_type != DRM_MODE_ENCODER_DAC || | ||
32 | + encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) | ||
33 | + continue; | ||
34 | + | ||
35 | encoder_funcs = encoder->helper_private; | ||
36 | if (encoder_funcs->detect) { | ||
37 | if (ret != connector_status_connected) { | ||
38 | -- | ||
39 | 1.7.9.4 | ||
40 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0073-drm-radeon-kms-add-connector-quirk-for-Fujitsu-D3003.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0073-drm-radeon-kms-add-connector-quirk-for-Fujitsu-D3003.patch new file mode 100644 index 00000000..a48a4852 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0073-drm-radeon-kms-add-connector-quirk-for-Fujitsu-D3003.patch | |||
@@ -0,0 +1,48 @@ | |||
1 | From 5efedf1eea47c18e516e55bbfb417e447e76fc0d Mon Sep 17 00:00:00 2001 | ||
2 | From: Alex Deucher <alexander.deucher@amd.com> | ||
3 | Date: Fri, 16 Mar 2012 12:22:10 -0400 | ||
4 | Subject: [PATCH 073/147] drm/radeon/kms: add connector quirk for Fujitsu | ||
5 | D3003-S2 board | ||
6 | |||
7 | commit 4c1b2d2da3451f5c8dd59bd7e05bd9729d2aee05 upstream. | ||
8 | |||
9 | vbios lists DVI-I port as VGA and DVI-D. | ||
10 | |||
11 | Fixes: | ||
12 | https://bugs.freedesktop.org/show_bug.cgi?id=47007 | ||
13 | |||
14 | Signed-off-by: Alex Deucher <alexander.deucher@amd.com> | ||
15 | Signed-off-by: Dave Airlie <airlied@redhat.com> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/gpu/drm/radeon/radeon_atombios.c | 14 ++++++++++++++ | ||
19 | 1 file changed, 14 insertions(+) | ||
20 | |||
21 | diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c | ||
22 | index 5082d17..8e1532f 100644 | ||
23 | --- a/drivers/gpu/drm/radeon/radeon_atombios.c | ||
24 | +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | ||
25 | @@ -442,6 +442,20 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | ||
26 | struct radeon_device *rdev = dev->dev_private; | ||
27 | *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93); | ||
28 | } | ||
29 | + | ||
30 | + /* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */ | ||
31 | + if ((dev->pdev->device == 0x9802) && | ||
32 | + (dev->pdev->subsystem_vendor == 0x1734) && | ||
33 | + (dev->pdev->subsystem_device == 0x11bd)) { | ||
34 | + if (*connector_type == DRM_MODE_CONNECTOR_VGA) { | ||
35 | + *connector_type = DRM_MODE_CONNECTOR_DVII; | ||
36 | + *line_mux = 0x3103; | ||
37 | + } else if (*connector_type == DRM_MODE_CONNECTOR_DVID) { | ||
38 | + *connector_type = DRM_MODE_CONNECTOR_DVII; | ||
39 | + } | ||
40 | + } | ||
41 | + | ||
42 | + | ||
43 | return true; | ||
44 | } | ||
45 | |||
46 | -- | ||
47 | 1.7.9.4 | ||
48 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0074-target-Don-t-set-WBUS16-or-SYNC-bits-in-INQUIRY-resp.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0074-target-Don-t-set-WBUS16-or-SYNC-bits-in-INQUIRY-resp.patch new file mode 100644 index 00000000..c1eac734 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0074-target-Don-t-set-WBUS16-or-SYNC-bits-in-INQUIRY-resp.patch | |||
@@ -0,0 +1,41 @@ | |||
1 | From 7f95ff0ee05801dd087ec704be16aae6383f0076 Mon Sep 17 00:00:00 2001 | ||
2 | From: Roland Dreier <roland@purestorage.com> | ||
3 | Date: Mon, 13 Feb 2012 16:18:16 -0800 | ||
4 | Subject: [PATCH 074/147] target: Don't set WBUS16 or SYNC bits in INQUIRY | ||
5 | response | ||
6 | |||
7 | commit effc6cc8828257c32c37635e737f14fd6e19ecd7 upstream. | ||
8 | |||
9 | SPC-4 says about the WBUS16 and SYNC bits: | ||
10 | |||
11 | The meanings of these fields are specific to SPI-5 (see 6.4.3). | ||
12 | For SCSI transport protocols other than the SCSI Parallel | ||
13 | Interface, these fields are reserved. | ||
14 | |||
15 | We don't have a SPI fabric module, so we should never set these bits. | ||
16 | (The comment was misleading, since it only mentioned Sync but the | ||
17 | actual code set WBUS16 too). | ||
18 | |||
19 | Signed-off-by: Roland Dreier <roland@purestorage.com> | ||
20 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | drivers/target/target_core_cdb.c | 2 +- | ||
24 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
25 | |||
26 | diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c | ||
27 | index 8facd33..65ea65a 100644 | ||
28 | --- a/drivers/target/target_core_cdb.c | ||
29 | +++ b/drivers/target/target_core_cdb.c | ||
30 | @@ -116,7 +116,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd) | ||
31 | goto out; | ||
32 | } | ||
33 | |||
34 | - buf[7] = 0x32; /* Sync=1 and CmdQue=1 */ | ||
35 | + buf[7] = 0x2; /* CmdQue=1 */ | ||
36 | |||
37 | /* | ||
38 | * Do not include vendor, product, reversion info in INQUIRY | ||
39 | -- | ||
40 | 1.7.9.4 | ||
41 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0075-target-fix-use-after-free-in-target_report_luns.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0075-target-fix-use-after-free-in-target_report_luns.patch new file mode 100644 index 00000000..af278253 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0075-target-fix-use-after-free-in-target_report_luns.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From 679e28aac79ff6dc71e84679bcd97e5246697ccf Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?J=C3=B6rn=20Engel?= <joern@logfs.org> | ||
3 | Date: Wed, 15 Feb 2012 16:51:32 -0500 | ||
4 | Subject: [PATCH 075/147] target: fix use after free in target_report_luns | ||
5 | |||
6 | commit 382436f8804fe1cb20b9a2a811a10eb2d8554721 upstream. | ||
7 | |||
8 | Fix possible NULL pointer dereference in target_report_luns failure path. | ||
9 | |||
10 | Signed-off-by: Joern Engel <joern@logfs.org> | ||
11 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | drivers/target/target_core_device.c | 2 +- | ||
15 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
16 | |||
17 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c | ||
18 | index 19f8aca..097178b 100644 | ||
19 | --- a/drivers/target/target_core_device.c | ||
20 | +++ b/drivers/target/target_core_device.c | ||
21 | @@ -696,12 +696,12 @@ int target_report_luns(struct se_task *se_task) | ||
22 | * See SPC3 r07, page 159. | ||
23 | */ | ||
24 | done: | ||
25 | - transport_kunmap_data_sg(se_cmd); | ||
26 | lun_count *= 8; | ||
27 | buf[0] = ((lun_count >> 24) & 0xff); | ||
28 | buf[1] = ((lun_count >> 16) & 0xff); | ||
29 | buf[2] = ((lun_count >> 8) & 0xff); | ||
30 | buf[3] = (lun_count & 0xff); | ||
31 | + transport_kunmap_data_sg(se_cmd); | ||
32 | |||
33 | se_task->task_scsi_status = GOOD; | ||
34 | transport_complete_task(se_task, 1); | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0076-target-prevent-NULL-pointer-dereference-in-target_re.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0076-target-prevent-NULL-pointer-dereference-in-target_re.patch new file mode 100644 index 00000000..1899a818 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0076-target-prevent-NULL-pointer-dereference-in-target_re.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From 238ac5c459c0204f5134a324f95588aed557b41c Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?J=C3=B6rn=20Engel?= <joern@logfs.org> | ||
3 | Date: Wed, 15 Feb 2012 16:52:11 -0500 | ||
4 | Subject: [PATCH 076/147] target: prevent NULL pointer dereference in | ||
5 | target_report_luns | ||
6 | |||
7 | commit 47f1b8803e1e358ebbf4f82bfdb98971c912a2c3 upstream. | ||
8 | |||
9 | transport_kmap_data_sg can return NULL. I never saw this trigger, but | ||
10 | returning -ENOMEM seems better than a crash. Also removes a pointless | ||
11 | case while at it. | ||
12 | |||
13 | Signed-off-by: Joern Engel <joern@logfs.org> | ||
14 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/target/target_core_device.c | 4 +++- | ||
18 | 1 file changed, 3 insertions(+), 1 deletion(-) | ||
19 | |||
20 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c | ||
21 | index 097178b..f8773ae 100644 | ||
22 | --- a/drivers/target/target_core_device.c | ||
23 | +++ b/drivers/target/target_core_device.c | ||
24 | @@ -658,7 +658,9 @@ int target_report_luns(struct se_task *se_task) | ||
25 | unsigned char *buf; | ||
26 | u32 cdb_offset = 0, lun_count = 0, offset = 8, i; | ||
27 | |||
28 | - buf = (unsigned char *) transport_kmap_data_sg(se_cmd); | ||
29 | + buf = transport_kmap_data_sg(se_cmd); | ||
30 | + if (!buf) | ||
31 | + return -ENOMEM; | ||
32 | |||
33 | /* | ||
34 | * If no struct se_session pointer is present, this struct se_cmd is | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0077-target-Fix-16-bit-target-ports-for-SET-TARGET-PORT-G.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0077-target-Fix-16-bit-target-ports-for-SET-TARGET-PORT-G.patch new file mode 100644 index 00000000..ec49efc1 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0077-target-Fix-16-bit-target-ports-for-SET-TARGET-PORT-G.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From 407e1b9350ad2124952f769ade034023a9155c71 Mon Sep 17 00:00:00 2001 | ||
2 | From: Roland Dreier <roland@purestorage.com> | ||
3 | Date: Thu, 23 Feb 2012 17:22:12 -0800 | ||
4 | Subject: [PATCH 077/147] target: Fix 16-bit target ports for SET TARGET PORT | ||
5 | GROUPS emulation | ||
6 | |||
7 | commit 33395fb8a13731c7ef7b175dbf5a4d8a6738fe6c upstream. | ||
8 | |||
9 | The old code did (MSB << 8) & 0xff, which always evaluates to 0. Just use | ||
10 | get_unaligned_be16() so we don't have to worry about whether our open-coded | ||
11 | version is correct or not. | ||
12 | |||
13 | Signed-off-by: Roland Dreier <roland@purestorage.com> | ||
14 | Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/target/target_core_alua.c | 7 +++---- | ||
18 | 1 file changed, 3 insertions(+), 4 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c | ||
21 | index 1d24512..5b05744 100644 | ||
22 | --- a/drivers/target/target_core_alua.c | ||
23 | +++ b/drivers/target/target_core_alua.c | ||
24 | @@ -30,6 +30,7 @@ | ||
25 | #include <linux/export.h> | ||
26 | #include <scsi/scsi.h> | ||
27 | #include <scsi/scsi_cmnd.h> | ||
28 | +#include <asm/unaligned.h> | ||
29 | |||
30 | #include <target/target_core_base.h> | ||
31 | #include <target/target_core_device.h> | ||
32 | @@ -268,8 +269,7 @@ int target_emulate_set_target_port_groups(struct se_task *task) | ||
33 | * changed. | ||
34 | */ | ||
35 | if (primary) { | ||
36 | - tg_pt_id = ((ptr[2] << 8) & 0xff); | ||
37 | - tg_pt_id |= (ptr[3] & 0xff); | ||
38 | + tg_pt_id = get_unaligned_be16(ptr + 2); | ||
39 | /* | ||
40 | * Locate the matching target port group ID from | ||
41 | * the global tg_pt_gp list | ||
42 | @@ -313,8 +313,7 @@ int target_emulate_set_target_port_groups(struct se_task *task) | ||
43 | * the Target Port in question for the the incoming | ||
44 | * SET_TARGET_PORT_GROUPS op. | ||
45 | */ | ||
46 | - rtpi = ((ptr[2] << 8) & 0xff); | ||
47 | - rtpi |= (ptr[3] & 0xff); | ||
48 | + rtpi = get_unaligned_be16(ptr + 2); | ||
49 | /* | ||
50 | * Locate the matching relative target port identifer | ||
51 | * for the struct se_device storage object. | ||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0078-Bluetooth-Add-AR30XX-device-ID-on-Asus-laptops.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0078-Bluetooth-Add-AR30XX-device-ID-on-Asus-laptops.patch new file mode 100644 index 00000000..b0094d10 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0078-Bluetooth-Add-AR30XX-device-ID-on-Asus-laptops.patch | |||
@@ -0,0 +1,67 @@ | |||
1 | From d559faa856c1c6f84dc400b9e77af843d3b79c10 Mon Sep 17 00:00:00 2001 | ||
2 | From: Keng-Yu Lin <kengyu@canonical.com> | ||
3 | Date: Wed, 30 Nov 2011 18:32:37 +0800 | ||
4 | Subject: [PATCH 078/147] Bluetooth: Add AR30XX device ID on Asus laptops | ||
5 | |||
6 | commit 6b6ba88b5bb8779156b21bb957520a448c3642e2 upstream. | ||
7 | |||
8 | The ID is found on Asus K54HR and K53U. | ||
9 | Blacklist the AR3011-based device ID [0489:e03d] | ||
10 | and add to ath3k.c for firmware loading. | ||
11 | |||
12 | Below is the output of usb-devices script: | ||
13 | |||
14 | Before the fiwmware loading: | ||
15 | |||
16 | T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0 | ||
17 | D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 | ||
18 | P: Vendor=0489 ProdID=e03d Rev=00.01 | ||
19 | C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA | ||
20 | I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb | ||
21 | I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb | ||
22 | |||
23 | After the fiwmware loading: | ||
24 | |||
25 | T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 5 Spd=12 MxCh= 0 | ||
26 | D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 | ||
27 | P: Vendor=0cf3 ProdID=3005 Rev=00.01 | ||
28 | C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA | ||
29 | I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb | ||
30 | I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb | ||
31 | |||
32 | Signed-off-by: Keng-Yu Lin <kengyu@canonical.com> | ||
33 | Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> | ||
34 | Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> | ||
35 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
36 | --- | ||
37 | drivers/bluetooth/ath3k.c | 1 + | ||
38 | drivers/bluetooth/btusb.c | 1 + | ||
39 | 2 files changed, 2 insertions(+) | ||
40 | |||
41 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c | ||
42 | index 106beb1..db811d2 100644 | ||
43 | --- a/drivers/bluetooth/ath3k.c | ||
44 | +++ b/drivers/bluetooth/ath3k.c | ||
45 | @@ -64,6 +64,7 @@ static struct usb_device_id ath3k_table[] = { | ||
46 | { USB_DEVICE(0x0CF3, 0x3002) }, | ||
47 | { USB_DEVICE(0x13d3, 0x3304) }, | ||
48 | { USB_DEVICE(0x0930, 0x0215) }, | ||
49 | + { USB_DEVICE(0x0489, 0xE03D) }, | ||
50 | |||
51 | /* Atheros AR9285 Malbec with sflash firmware */ | ||
52 | { USB_DEVICE(0x03F0, 0x311D) }, | ||
53 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
54 | index eabc437..11a925c 100644 | ||
55 | --- a/drivers/bluetooth/btusb.c | ||
56 | +++ b/drivers/bluetooth/btusb.c | ||
57 | @@ -119,6 +119,7 @@ static struct usb_device_id blacklist_table[] = { | ||
58 | { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, | ||
59 | { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE }, | ||
60 | { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, | ||
61 | + { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, | ||
62 | |||
63 | /* Atheros AR9285 Malbec with sflash firmware */ | ||
64 | { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, | ||
65 | -- | ||
66 | 1.7.9.4 | ||
67 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0079-HID-add-extra-hotkeys-in-Asus-AIO-keyboards.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0079-HID-add-extra-hotkeys-in-Asus-AIO-keyboards.patch new file mode 100644 index 00000000..47434eb5 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0079-HID-add-extra-hotkeys-in-Asus-AIO-keyboards.patch | |||
@@ -0,0 +1,71 @@ | |||
1 | From 5c473125260020cedb5e4285eea74fc4528eee85 Mon Sep 17 00:00:00 2001 | ||
2 | From: Keng-Yu Lin <kengyu@canonical.com> | ||
3 | Date: Thu, 2 Feb 2012 10:31:26 +0100 | ||
4 | Subject: [PATCH 079/147] HID: add extra hotkeys in Asus AIO keyboards | ||
5 | |||
6 | commit 3596bb929f2abd3433c2eaa5755fad48ac207af1 upstream. | ||
7 | |||
8 | The Asus All-In-One PC has a wireless keyboard with wifi toggle, | ||
9 | brightness up, brightness down and display off hotkeys. | ||
10 | |||
11 | This patch adds suppoort for these hotkeys. | ||
12 | |||
13 | Signed-off-by: Keng-Yu Lin <kengyu@canonical.com> | ||
14 | Signed-off-by: Jiri Kosina <jkosina@suse.cz> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/hid/hid-chicony.c | 5 +++++ | ||
18 | drivers/hid/hid-core.c | 1 + | ||
19 | drivers/hid/hid-ids.h | 1 + | ||
20 | 3 files changed, 7 insertions(+) | ||
21 | |||
22 | diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c | ||
23 | index 8965ad9..4162505 100644 | ||
24 | --- a/drivers/hid/hid-chicony.c | ||
25 | +++ b/drivers/hid/hid-chicony.c | ||
26 | @@ -45,6 +45,10 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | ||
27 | case 0xff09: ch_map_key_clear(BTN_9); break; | ||
28 | case 0xff0a: ch_map_key_clear(BTN_A); break; | ||
29 | case 0xff0b: ch_map_key_clear(BTN_B); break; | ||
30 | + case 0x00f1: ch_map_key_clear(KEY_WLAN); break; | ||
31 | + case 0x00f2: ch_map_key_clear(KEY_BRIGHTNESSDOWN); break; | ||
32 | + case 0x00f3: ch_map_key_clear(KEY_BRIGHTNESSUP); break; | ||
33 | + case 0x00f4: ch_map_key_clear(KEY_DISPLAY_OFF); break; | ||
34 | default: | ||
35 | return 0; | ||
36 | } | ||
37 | @@ -53,6 +57,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | ||
38 | |||
39 | static const struct hid_device_id ch_devices[] = { | ||
40 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | ||
41 | + { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, | ||
42 | { } | ||
43 | }; | ||
44 | MODULE_DEVICE_TABLE(hid, ch_devices); | ||
45 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c | ||
46 | index bb656d8..c27b402 100644 | ||
47 | --- a/drivers/hid/hid-core.c | ||
48 | +++ b/drivers/hid/hid-core.c | ||
49 | @@ -1394,6 +1394,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | ||
50 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
51 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | ||
52 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) }, | ||
53 | + { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, | ||
54 | { HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, | ||
55 | { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) }, | ||
56 | { HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) }, | ||
57 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
58 | index 3c3daec..fba3fc4 100644 | ||
59 | --- a/drivers/hid/hid-ids.h | ||
60 | +++ b/drivers/hid/hid-ids.h | ||
61 | @@ -192,6 +192,7 @@ | ||
62 | #define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418 | ||
63 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d | ||
64 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 | ||
65 | +#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 | ||
66 | |||
67 | #define USB_VENDOR_ID_CHUNGHWAT 0x2247 | ||
68 | #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 | ||
69 | -- | ||
70 | 1.7.9.4 | ||
71 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0080-HID-add-more-hotkeys-in-Asus-AIO-keyboards.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0080-HID-add-more-hotkeys-in-Asus-AIO-keyboards.patch new file mode 100644 index 00000000..0543141f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0080-HID-add-more-hotkeys-in-Asus-AIO-keyboards.patch | |||
@@ -0,0 +1,34 @@ | |||
1 | From 236648a7e4f6330831cb031c7c970b07db3cf39f Mon Sep 17 00:00:00 2001 | ||
2 | From: Keng-Yu Lin <kengyu@canonical.com> | ||
3 | Date: Mon, 30 Jan 2012 14:25:45 +0800 | ||
4 | Subject: [PATCH 080/147] HID: add more hotkeys in Asus AIO keyboards | ||
5 | |||
6 | commit 6c30d5a53229aad22bb675e0bd6eb518ecaa4316 upstream. | ||
7 | |||
8 | Add support for the camera key. The hotkey for | ||
9 | Asus S.H.E(Super Hybrid Engine) mode is mapped to KEY_KEY_PROG1 | ||
10 | just for notifying the userspace. | ||
11 | |||
12 | Signed-off-by: Keng-Yu Lin <kengyu@canonical.com> | ||
13 | Signed-off-by: Jiri Kosina <jkosina@suse.cz> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/hid/hid-chicony.c | 2 ++ | ||
17 | 1 file changed, 2 insertions(+) | ||
18 | |||
19 | diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c | ||
20 | index 4162505..b99af34 100644 | ||
21 | --- a/drivers/hid/hid-chicony.c | ||
22 | +++ b/drivers/hid/hid-chicony.c | ||
23 | @@ -49,6 +49,8 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | ||
24 | case 0x00f2: ch_map_key_clear(KEY_BRIGHTNESSDOWN); break; | ||
25 | case 0x00f3: ch_map_key_clear(KEY_BRIGHTNESSUP); break; | ||
26 | case 0x00f4: ch_map_key_clear(KEY_DISPLAY_OFF); break; | ||
27 | + case 0x00f7: ch_map_key_clear(KEY_CAMERA); break; | ||
28 | + case 0x00f8: ch_map_key_clear(KEY_PROG1); break; | ||
29 | default: | ||
30 | return 0; | ||
31 | } | ||
32 | -- | ||
33 | 1.7.9.4 | ||
34 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0081-pata_legacy-correctly-mask-recovery-field-for-HT6560.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0081-pata_legacy-correctly-mask-recovery-field-for-HT6560.patch new file mode 100644 index 00000000..daf2cc7e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0081-pata_legacy-correctly-mask-recovery-field-for-HT6560.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | From 9d312025d223d521d0f5a46ab994323646114050 Mon Sep 17 00:00:00 2001 | ||
2 | From: Sergei Shtylyov <sshtylyov@ru.mvista.com> | ||
3 | Date: Thu, 19 Jan 2012 19:09:56 +0300 | ||
4 | Subject: [PATCH 081/147] pata_legacy: correctly mask recovery field for | ||
5 | HT6560B | ||
6 | |||
7 | commit 9716387311c790de381214c03e7f1b72b91a8189 upstream. | ||
8 | |||
9 | According to the HT6560H datasheet, the recovery timing field is 4-bit wide, | ||
10 | with a value of 0 meaning 16 cycles. Correct obvious thinko in the recovery | ||
11 | field mask. | ||
12 | |||
13 | Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> | ||
14 | Signed-off-by: Jeff Garzik <jgarzik@redhat.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/ata/pata_legacy.c | 3 +-- | ||
18 | 1 file changed, 1 insertion(+), 2 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c | ||
21 | index 35aca7d..4fe9d21 100644 | ||
22 | --- a/drivers/ata/pata_legacy.c | ||
23 | +++ b/drivers/ata/pata_legacy.c | ||
24 | @@ -401,8 +401,7 @@ static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev) | ||
25 | ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000); | ||
26 | |||
27 | active = clamp_val(t.active, 2, 15); | ||
28 | - recover = clamp_val(t.recover, 2, 16); | ||
29 | - recover &= 0x15; | ||
30 | + recover = clamp_val(t.recover, 2, 16) & 0x0F; | ||
31 | |||
32 | inb(0x3E6); | ||
33 | inb(0x3E6); | ||
34 | -- | ||
35 | 1.7.9.4 | ||
36 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0082-firewire-ohci-fix-too-early-completion-of-IR-multich.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0082-firewire-ohci-fix-too-early-completion-of-IR-multich.patch new file mode 100644 index 00000000..0eefc068 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0082-firewire-ohci-fix-too-early-completion-of-IR-multich.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | From d98908a17ece4ec33e477158112adc527c365b83 Mon Sep 17 00:00:00 2001 | ||
2 | From: Clemens Ladisch <clemens@ladisch.de> | ||
3 | Date: Mon, 12 Mar 2012 21:45:47 +0100 | ||
4 | Subject: [PATCH 082/147] firewire: ohci: fix too-early completion of IR | ||
5 | multichannel buffers | ||
6 | |||
7 | commit 0c0efbacab8d70700d13301e0ae7975783c0cb0a upstream. | ||
8 | |||
9 | handle_ir_buffer_fill() assumed that a completed descriptor would be | ||
10 | indicated by a non-zero transfer_status (as in most other descriptors). | ||
11 | However, this field is written by the controller as soon as (the end of) | ||
12 | the first packet has been written into the buffer. As a consequence, if | ||
13 | we happen to run into such a descriptor when the interrupt handler is | ||
14 | executed after such a packet has completed, the descriptor would be | ||
15 | taken out of the list of active descriptors as soon as the buffer had | ||
16 | been partially filled, so the event for the buffer being completely | ||
17 | filled would never be sent. | ||
18 | |||
19 | To fix this, handle descriptors only when they have been completely | ||
20 | filled, i.e., when res_count == 0. (This also matches the condition | ||
21 | that is reported by the controller with an interrupt.) | ||
22 | |||
23 | Signed-off-by: Clemens Ladisch <clemens@ladisch.de> | ||
24 | Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> | ||
25 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
26 | --- | ||
27 | drivers/firewire/ohci.c | 5 ++--- | ||
28 | 1 file changed, 2 insertions(+), 3 deletions(-) | ||
29 | |||
30 | diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c | ||
31 | index 7f5f0da..0a0225a 100644 | ||
32 | --- a/drivers/firewire/ohci.c | ||
33 | +++ b/drivers/firewire/ohci.c | ||
34 | @@ -2748,7 +2748,7 @@ static int handle_ir_buffer_fill(struct context *context, | ||
35 | container_of(context, struct iso_context, context); | ||
36 | u32 buffer_dma; | ||
37 | |||
38 | - if (!last->transfer_status) | ||
39 | + if (last->res_count != 0) | ||
40 | /* Descriptor(s) not done yet, stop iteration */ | ||
41 | return 0; | ||
42 | |||
43 | @@ -2762,8 +2762,7 @@ static int handle_ir_buffer_fill(struct context *context, | ||
44 | if (le16_to_cpu(last->control) & DESCRIPTOR_IRQ_ALWAYS) | ||
45 | ctx->base.callback.mc(&ctx->base, | ||
46 | le32_to_cpu(last->data_address) + | ||
47 | - le16_to_cpu(last->req_count) - | ||
48 | - le16_to_cpu(last->res_count), | ||
49 | + le16_to_cpu(last->req_count), | ||
50 | ctx->base.callback_data); | ||
51 | |||
52 | return 1; | ||
53 | -- | ||
54 | 1.7.9.4 | ||
55 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0083-KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0083-KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch new file mode 100644 index 00000000..8e4c572a --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0083-KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch | |||
@@ -0,0 +1,82 @@ | |||
1 | From d76b5f6c352194eaec8afbe8397b43f1ee4130d0 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Stephan=20B=C3=A4rwolf?= <stephan.baerwolf@tu-ilmenau.de> | ||
3 | Date: Thu, 12 Jan 2012 16:43:03 +0100 | ||
4 | Subject: [PATCH 083/147] KVM: x86: extend "struct x86_emulate_ops" with | ||
5 | "get_cpuid" | ||
6 | |||
7 | commit bdb42f5afebe208eae90406959383856ae2caf2b upstream. | ||
8 | |||
9 | In order to be able to proceed checks on CPU-specific properties | ||
10 | within the emulator, function "get_cpuid" is introduced. | ||
11 | With "get_cpuid" it is possible to virtually call the guests | ||
12 | "cpuid"-opcode without changing the VM's context. | ||
13 | |||
14 | [mtosatti: cleanup/beautify code] | ||
15 | |||
16 | Signed-off-by: Stephan Baerwolf <stephan.baerwolf@tu-ilmenau.de> | ||
17 | Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> | ||
18 | Signed-off-by: Stefan Bader <stefan.bader@canonical.com> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | arch/x86/include/asm/kvm_emulate.h | 3 +++ | ||
22 | arch/x86/kvm/x86.c | 23 +++++++++++++++++++++++ | ||
23 | 2 files changed, 26 insertions(+) | ||
24 | |||
25 | diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h | ||
26 | index a026507..a440a7f 100644 | ||
27 | --- a/arch/x86/include/asm/kvm_emulate.h | ||
28 | +++ b/arch/x86/include/asm/kvm_emulate.h | ||
29 | @@ -189,6 +189,9 @@ struct x86_emulate_ops { | ||
30 | int (*intercept)(struct x86_emulate_ctxt *ctxt, | ||
31 | struct x86_instruction_info *info, | ||
32 | enum x86_intercept_stage stage); | ||
33 | + | ||
34 | + bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, | ||
35 | + u32 *eax, u32 *ebx, u32 *ecx, u32 *edx); | ||
36 | }; | ||
37 | |||
38 | typedef u32 __attribute__((vector_size(16))) sse128_t; | ||
39 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
40 | index 4c938da..e04cae1 100644 | ||
41 | --- a/arch/x86/kvm/x86.c | ||
42 | +++ b/arch/x86/kvm/x86.c | ||
43 | @@ -4655,6 +4655,28 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt, | ||
44 | return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage); | ||
45 | } | ||
46 | |||
47 | +static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt, | ||
48 | + u32 *eax, u32 *ebx, u32 *ecx, u32 *edx) | ||
49 | +{ | ||
50 | + struct kvm_cpuid_entry2 *cpuid = NULL; | ||
51 | + | ||
52 | + if (eax && ecx) | ||
53 | + cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt), | ||
54 | + *eax, *ecx); | ||
55 | + | ||
56 | + if (cpuid) { | ||
57 | + *eax = cpuid->eax; | ||
58 | + *ecx = cpuid->ecx; | ||
59 | + if (ebx) | ||
60 | + *ebx = cpuid->ebx; | ||
61 | + if (edx) | ||
62 | + *edx = cpuid->edx; | ||
63 | + return true; | ||
64 | + } | ||
65 | + | ||
66 | + return false; | ||
67 | +} | ||
68 | + | ||
69 | static struct x86_emulate_ops emulate_ops = { | ||
70 | .read_std = kvm_read_guest_virt_system, | ||
71 | .write_std = kvm_write_guest_virt_system, | ||
72 | @@ -4685,6 +4707,7 @@ static struct x86_emulate_ops emulate_ops = { | ||
73 | .get_fpu = emulator_get_fpu, | ||
74 | .put_fpu = emulator_put_fpu, | ||
75 | .intercept = emulator_intercept, | ||
76 | + .get_cpuid = emulator_get_cpuid, | ||
77 | }; | ||
78 | |||
79 | static void cache_all_regs(struct kvm_vcpu *vcpu) | ||
80 | -- | ||
81 | 1.7.9.4 | ||
82 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0084-KVM-x86-fix-missing-checks-in-syscall-emulation.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0084-KVM-x86-fix-missing-checks-in-syscall-emulation.patch new file mode 100644 index 00000000..bc72a838 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0084-KVM-x86-fix-missing-checks-in-syscall-emulation.patch | |||
@@ -0,0 +1,148 @@ | |||
1 | From 9dab57c31c4146a8d1118a8c833fb8a3e788fec6 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Stephan=20B=C3=A4rwolf?= <stephan.baerwolf@tu-ilmenau.de> | ||
3 | Date: Thu, 12 Jan 2012 16:43:04 +0100 | ||
4 | Subject: [PATCH 084/147] KVM: x86: fix missing checks in syscall emulation | ||
5 | |||
6 | commit c2226fc9e87ba3da060e47333657cd6616652b84 upstream. | ||
7 | |||
8 | On hosts without this patch, 32bit guests will crash (and 64bit guests | ||
9 | may behave in a wrong way) for example by simply executing following | ||
10 | nasm-demo-application: | ||
11 | |||
12 | [bits 32] | ||
13 | global _start | ||
14 | SECTION .text | ||
15 | _start: syscall | ||
16 | |||
17 | (I tested it with winxp and linux - both always crashed) | ||
18 | |||
19 | Disassembly of section .text: | ||
20 | |||
21 | 00000000 <_start>: | ||
22 | 0: 0f 05 syscall | ||
23 | |||
24 | The reason seems a missing "invalid opcode"-trap (int6) for the | ||
25 | syscall opcode "0f05", which is not available on Intel CPUs | ||
26 | within non-longmodes, as also on some AMD CPUs within legacy-mode. | ||
27 | (depending on CPU vendor, MSR_EFER and cpuid) | ||
28 | |||
29 | Because previous mentioned OSs may not engage corresponding | ||
30 | syscall target-registers (STAR, LSTAR, CSTAR), they remain | ||
31 | NULL and (non trapping) syscalls are leading to multiple | ||
32 | faults and finally crashs. | ||
33 | |||
34 | Depending on the architecture (AMD or Intel) pretended by | ||
35 | guests, various checks according to vendor's documentation | ||
36 | are implemented to overcome the current issue and behave | ||
37 | like the CPUs physical counterparts. | ||
38 | |||
39 | [mtosatti: cleanup/beautify code] | ||
40 | |||
41 | Signed-off-by: Stephan Baerwolf <stephan.baerwolf@tu-ilmenau.de> | ||
42 | Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> | ||
43 | Signed-off-by: Stefan Bader <stefan.bader@canonical.com> | ||
44 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
45 | --- | ||
46 | arch/x86/include/asm/kvm_emulate.h | 13 +++++++++ | ||
47 | arch/x86/kvm/emulate.c | 51 ++++++++++++++++++++++++++++++++++++ | ||
48 | 2 files changed, 64 insertions(+) | ||
49 | |||
50 | diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h | ||
51 | index a440a7f..70ea6fd 100644 | ||
52 | --- a/arch/x86/include/asm/kvm_emulate.h | ||
53 | +++ b/arch/x86/include/asm/kvm_emulate.h | ||
54 | @@ -300,6 +300,19 @@ struct x86_emulate_ctxt { | ||
55 | #define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \ | ||
56 | X86EMUL_MODE_PROT64) | ||
57 | |||
58 | +/* CPUID vendors */ | ||
59 | +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 | ||
60 | +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 | ||
61 | +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65 | ||
62 | + | ||
63 | +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41 | ||
64 | +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574 | ||
65 | +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273 | ||
66 | + | ||
67 | +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547 | ||
68 | +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e | ||
69 | +#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69 | ||
70 | + | ||
71 | enum x86_intercept_stage { | ||
72 | X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */ | ||
73 | X86_ICPT_PRE_EXCEPT, | ||
74 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
75 | index f1e3be18..f5302da 100644 | ||
76 | --- a/arch/x86/kvm/emulate.c | ||
77 | +++ b/arch/x86/kvm/emulate.c | ||
78 | @@ -1877,6 +1877,51 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt, | ||
79 | ss->p = 1; | ||
80 | } | ||
81 | |||
82 | +static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt) | ||
83 | +{ | ||
84 | + struct x86_emulate_ops *ops = ctxt->ops; | ||
85 | + u32 eax, ebx, ecx, edx; | ||
86 | + | ||
87 | + /* | ||
88 | + * syscall should always be enabled in longmode - so only become | ||
89 | + * vendor specific (cpuid) if other modes are active... | ||
90 | + */ | ||
91 | + if (ctxt->mode == X86EMUL_MODE_PROT64) | ||
92 | + return true; | ||
93 | + | ||
94 | + eax = 0x00000000; | ||
95 | + ecx = 0x00000000; | ||
96 | + if (ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx)) { | ||
97 | + /* | ||
98 | + * Intel ("GenuineIntel") | ||
99 | + * remark: Intel CPUs only support "syscall" in 64bit | ||
100 | + * longmode. Also an 64bit guest with a | ||
101 | + * 32bit compat-app running will #UD !! While this | ||
102 | + * behaviour can be fixed (by emulating) into AMD | ||
103 | + * response - CPUs of AMD can't behave like Intel. | ||
104 | + */ | ||
105 | + if (ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx && | ||
106 | + ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx && | ||
107 | + edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx) | ||
108 | + return false; | ||
109 | + | ||
110 | + /* AMD ("AuthenticAMD") */ | ||
111 | + if (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx && | ||
112 | + ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx && | ||
113 | + edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx) | ||
114 | + return true; | ||
115 | + | ||
116 | + /* AMD ("AMDisbetter!") */ | ||
117 | + if (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx && | ||
118 | + ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx && | ||
119 | + edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx) | ||
120 | + return true; | ||
121 | + } | ||
122 | + | ||
123 | + /* default: (not Intel, not AMD), apply Intel's stricter rules... */ | ||
124 | + return false; | ||
125 | +} | ||
126 | + | ||
127 | static int em_syscall(struct x86_emulate_ctxt *ctxt) | ||
128 | { | ||
129 | struct x86_emulate_ops *ops = ctxt->ops; | ||
130 | @@ -1890,9 +1935,15 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt) | ||
131 | ctxt->mode == X86EMUL_MODE_VM86) | ||
132 | return emulate_ud(ctxt); | ||
133 | |||
134 | + if (!(em_syscall_is_enabled(ctxt))) | ||
135 | + return emulate_ud(ctxt); | ||
136 | + | ||
137 | ops->get_msr(ctxt, MSR_EFER, &efer); | ||
138 | setup_syscalls_segments(ctxt, &cs, &ss); | ||
139 | |||
140 | + if (!(efer & EFER_SCE)) | ||
141 | + return emulate_ud(ctxt); | ||
142 | + | ||
143 | ops->get_msr(ctxt, MSR_STAR, &msr_data); | ||
144 | msr_data >>= 32; | ||
145 | cs_sel = (u16)(msr_data & 0xfffc); | ||
146 | -- | ||
147 | 1.7.9.4 | ||
148 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0085-NFS-Properly-handle-the-case-where-the-delegation-is.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0085-NFS-Properly-handle-the-case-where-the-delegation-is.patch new file mode 100644 index 00000000..ac42054c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0085-NFS-Properly-handle-the-case-where-the-delegation-is.patch | |||
@@ -0,0 +1,193 @@ | |||
1 | From 3876d640cb4c4f09bdc26a8befea1df94fd4e71e Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Mon, 5 Mar 2012 19:56:44 -0500 | ||
4 | Subject: [PATCH 085/147] NFS: Properly handle the case where the delegation | ||
5 | is revoked | ||
6 | |||
7 | commit a1d0b5eebc4fd6e0edb02688b35f17f67f42aea5 upstream. | ||
8 | |||
9 | If we know that the delegation stateid is bad or revoked, we need to | ||
10 | remove that delegation as soon as possible, and then mark all the | ||
11 | stateids that relied on that delegation for recovery. We cannot use | ||
12 | the delegation as part of the recovery process. | ||
13 | |||
14 | Also note that NFSv4.1 uses a different error code (NFS4ERR_DELEG_REVOKED) | ||
15 | to indicate that the delegation was revoked. | ||
16 | |||
17 | Finally, ensure that setlk() and setattr() can both recover safely from | ||
18 | a revoked delegation. | ||
19 | |||
20 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | fs/nfs/delegation.c | 11 +++++++++++ | ||
24 | fs/nfs/delegation.h | 1 + | ||
25 | fs/nfs/nfs4_fs.h | 2 ++ | ||
26 | fs/nfs/nfs4proc.c | 18 ++++++++++++++++-- | ||
27 | fs/nfs/nfs4state.c | 29 +++++++++++++++++++++++++++-- | ||
28 | 5 files changed, 57 insertions(+), 4 deletions(-) | ||
29 | |||
30 | diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c | ||
31 | index 7f26540..ac889af 100644 | ||
32 | --- a/fs/nfs/delegation.c | ||
33 | +++ b/fs/nfs/delegation.c | ||
34 | @@ -466,6 +466,17 @@ static void nfs_delegation_run_state_manager(struct nfs_client *clp) | ||
35 | nfs4_schedule_state_manager(clp); | ||
36 | } | ||
37 | |||
38 | +void nfs_remove_bad_delegation(struct inode *inode) | ||
39 | +{ | ||
40 | + struct nfs_delegation *delegation; | ||
41 | + | ||
42 | + delegation = nfs_detach_delegation(NFS_I(inode), NFS_SERVER(inode)); | ||
43 | + if (delegation) { | ||
44 | + nfs_inode_find_state_and_recover(inode, &delegation->stateid); | ||
45 | + nfs_free_delegation(delegation); | ||
46 | + } | ||
47 | +} | ||
48 | + | ||
49 | /** | ||
50 | * nfs_expire_all_delegation_types | ||
51 | * @clp: client to process | ||
52 | diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h | ||
53 | index d9322e4..691a796 100644 | ||
54 | --- a/fs/nfs/delegation.h | ||
55 | +++ b/fs/nfs/delegation.h | ||
56 | @@ -45,6 +45,7 @@ void nfs_expire_unreferenced_delegations(struct nfs_client *clp); | ||
57 | void nfs_handle_cb_pathdown(struct nfs_client *clp); | ||
58 | int nfs_client_return_marked_delegations(struct nfs_client *clp); | ||
59 | int nfs_delegations_present(struct nfs_client *clp); | ||
60 | +void nfs_remove_bad_delegation(struct inode *inode); | ||
61 | |||
62 | void nfs_delegation_mark_reclaim(struct nfs_client *clp); | ||
63 | void nfs_delegation_reap_unclaimed(struct nfs_client *clp); | ||
64 | diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h | ||
65 | index 693ae22..d6ba137f 100644 | ||
66 | --- a/fs/nfs/nfs4_fs.h | ||
67 | +++ b/fs/nfs/nfs4_fs.h | ||
68 | @@ -324,6 +324,8 @@ extern void nfs4_put_open_state(struct nfs4_state *); | ||
69 | extern void nfs4_close_state(struct nfs4_state *, fmode_t); | ||
70 | extern void nfs4_close_sync(struct nfs4_state *, fmode_t); | ||
71 | extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t); | ||
72 | +extern void nfs_inode_find_state_and_recover(struct inode *inode, | ||
73 | + const nfs4_stateid *stateid); | ||
74 | extern void nfs4_schedule_lease_recovery(struct nfs_client *); | ||
75 | extern void nfs4_schedule_state_manager(struct nfs_client *); | ||
76 | extern void nfs4_schedule_path_down_recovery(struct nfs_client *clp); | ||
77 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
78 | index e527030..a51e1dd 100644 | ||
79 | --- a/fs/nfs/nfs4proc.c | ||
80 | +++ b/fs/nfs/nfs4proc.c | ||
81 | @@ -263,8 +263,11 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc | ||
82 | switch(errorcode) { | ||
83 | case 0: | ||
84 | return 0; | ||
85 | + case -NFS4ERR_DELEG_REVOKED: | ||
86 | case -NFS4ERR_ADMIN_REVOKED: | ||
87 | case -NFS4ERR_BAD_STATEID: | ||
88 | + if (state != NULL) | ||
89 | + nfs_remove_bad_delegation(state->inode); | ||
90 | case -NFS4ERR_OPENMODE: | ||
91 | if (state == NULL) | ||
92 | break; | ||
93 | @@ -1316,8 +1319,11 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | ||
94 | * The show must go on: exit, but mark the | ||
95 | * stateid as needing recovery. | ||
96 | */ | ||
97 | + case -NFS4ERR_DELEG_REVOKED: | ||
98 | case -NFS4ERR_ADMIN_REVOKED: | ||
99 | case -NFS4ERR_BAD_STATEID: | ||
100 | + nfs_inode_find_state_and_recover(state->inode, | ||
101 | + stateid); | ||
102 | nfs4_schedule_stateid_recovery(server, state); | ||
103 | case -EKEYEXPIRED: | ||
104 | /* | ||
105 | @@ -1893,7 +1899,9 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, | ||
106 | struct nfs4_state *state) | ||
107 | { | ||
108 | struct nfs_server *server = NFS_SERVER(inode); | ||
109 | - struct nfs4_exception exception = { }; | ||
110 | + struct nfs4_exception exception = { | ||
111 | + .state = state, | ||
112 | + }; | ||
113 | int err; | ||
114 | do { | ||
115 | err = nfs4_handle_exception(server, | ||
116 | @@ -3707,8 +3715,11 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | ||
117 | if (task->tk_status >= 0) | ||
118 | return 0; | ||
119 | switch(task->tk_status) { | ||
120 | + case -NFS4ERR_DELEG_REVOKED: | ||
121 | case -NFS4ERR_ADMIN_REVOKED: | ||
122 | case -NFS4ERR_BAD_STATEID: | ||
123 | + if (state != NULL) | ||
124 | + nfs_remove_bad_delegation(state->inode); | ||
125 | case -NFS4ERR_OPENMODE: | ||
126 | if (state == NULL) | ||
127 | break; | ||
128 | @@ -4526,7 +4537,9 @@ out: | ||
129 | |||
130 | static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) | ||
131 | { | ||
132 | - struct nfs4_exception exception = { }; | ||
133 | + struct nfs4_exception exception = { | ||
134 | + .state = state, | ||
135 | + }; | ||
136 | int err; | ||
137 | |||
138 | do { | ||
139 | @@ -4619,6 +4632,7 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) | ||
140 | * The show must go on: exit, but mark the | ||
141 | * stateid as needing recovery. | ||
142 | */ | ||
143 | + case -NFS4ERR_DELEG_REVOKED: | ||
144 | case -NFS4ERR_ADMIN_REVOKED: | ||
145 | case -NFS4ERR_BAD_STATEID: | ||
146 | case -NFS4ERR_OPENMODE: | ||
147 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c | ||
148 | index a58eed7..0596fd6 100644 | ||
149 | --- a/fs/nfs/nfs4state.c | ||
150 | +++ b/fs/nfs/nfs4state.c | ||
151 | @@ -1071,12 +1071,37 @@ void nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4 | ||
152 | { | ||
153 | struct nfs_client *clp = server->nfs_client; | ||
154 | |||
155 | - if (test_and_clear_bit(NFS_DELEGATED_STATE, &state->flags)) | ||
156 | - nfs_async_inode_return_delegation(state->inode, &state->stateid); | ||
157 | nfs4_state_mark_reclaim_nograce(clp, state); | ||
158 | nfs4_schedule_state_manager(clp); | ||
159 | } | ||
160 | |||
161 | +void nfs_inode_find_state_and_recover(struct inode *inode, | ||
162 | + const nfs4_stateid *stateid) | ||
163 | +{ | ||
164 | + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; | ||
165 | + struct nfs_inode *nfsi = NFS_I(inode); | ||
166 | + struct nfs_open_context *ctx; | ||
167 | + struct nfs4_state *state; | ||
168 | + bool found = false; | ||
169 | + | ||
170 | + spin_lock(&inode->i_lock); | ||
171 | + list_for_each_entry(ctx, &nfsi->open_files, list) { | ||
172 | + state = ctx->state; | ||
173 | + if (state == NULL) | ||
174 | + continue; | ||
175 | + if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) | ||
176 | + continue; | ||
177 | + if (memcmp(state->stateid.data, stateid->data, sizeof(state->stateid.data)) != 0) | ||
178 | + continue; | ||
179 | + nfs4_state_mark_reclaim_nograce(clp, state); | ||
180 | + found = true; | ||
181 | + } | ||
182 | + spin_unlock(&inode->i_lock); | ||
183 | + if (found) | ||
184 | + nfs4_schedule_state_manager(clp); | ||
185 | +} | ||
186 | + | ||
187 | + | ||
188 | static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops) | ||
189 | { | ||
190 | struct inode *inode = state->inode; | ||
191 | -- | ||
192 | 1.7.9.4 | ||
193 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0086-NFSv4-Return-the-delegation-if-the-server-returns-NF.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0086-NFSv4-Return-the-delegation-if-the-server-returns-NF.patch new file mode 100644 index 00000000..ee59f30e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0086-NFSv4-Return-the-delegation-if-the-server-returns-NF.patch | |||
@@ -0,0 +1,77 @@ | |||
1 | From f56543c626d44b8ca33f2d37ee4758d1faab0e74 Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Wed, 7 Mar 2012 16:39:06 -0500 | ||
4 | Subject: [PATCH 086/147] NFSv4: Return the delegation if the server returns | ||
5 | NFS4ERR_OPENMODE | ||
6 | |||
7 | commit 3114ea7a24d3264c090556a2444fc6d2c06176d4 upstream. | ||
8 | |||
9 | If a setattr() fails because of an NFS4ERR_OPENMODE error, it is | ||
10 | probably due to us holding a read delegation. Ensure that the | ||
11 | recovery routines return that delegation in this case. | ||
12 | |||
13 | Reported-by: Miklos Szeredi <miklos@szeredi.hu> | ||
14 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | fs/nfs/nfs4_fs.h | 1 + | ||
18 | fs/nfs/nfs4proc.c | 13 ++++++++++++- | ||
19 | 2 files changed, 13 insertions(+), 1 deletion(-) | ||
20 | |||
21 | diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h | ||
22 | index d6ba137f..0983b25 100644 | ||
23 | --- a/fs/nfs/nfs4_fs.h | ||
24 | +++ b/fs/nfs/nfs4_fs.h | ||
25 | @@ -191,6 +191,7 @@ struct nfs4_exception { | ||
26 | long timeout; | ||
27 | int retry; | ||
28 | struct nfs4_state *state; | ||
29 | + struct inode *inode; | ||
30 | }; | ||
31 | |||
32 | struct nfs4_state_recovery_ops { | ||
33 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
34 | index a51e1dd..758e809 100644 | ||
35 | --- a/fs/nfs/nfs4proc.c | ||
36 | +++ b/fs/nfs/nfs4proc.c | ||
37 | @@ -257,18 +257,28 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc | ||
38 | { | ||
39 | struct nfs_client *clp = server->nfs_client; | ||
40 | struct nfs4_state *state = exception->state; | ||
41 | + struct inode *inode = exception->inode; | ||
42 | int ret = errorcode; | ||
43 | |||
44 | exception->retry = 0; | ||
45 | switch(errorcode) { | ||
46 | case 0: | ||
47 | return 0; | ||
48 | + case -NFS4ERR_OPENMODE: | ||
49 | + if (nfs_have_delegation(inode, FMODE_READ)) { | ||
50 | + nfs_inode_return_delegation(inode); | ||
51 | + exception->retry = 1; | ||
52 | + return 0; | ||
53 | + } | ||
54 | + if (state == NULL) | ||
55 | + break; | ||
56 | + nfs4_schedule_stateid_recovery(server, state); | ||
57 | + goto wait_on_recovery; | ||
58 | case -NFS4ERR_DELEG_REVOKED: | ||
59 | case -NFS4ERR_ADMIN_REVOKED: | ||
60 | case -NFS4ERR_BAD_STATEID: | ||
61 | if (state != NULL) | ||
62 | nfs_remove_bad_delegation(state->inode); | ||
63 | - case -NFS4ERR_OPENMODE: | ||
64 | if (state == NULL) | ||
65 | break; | ||
66 | nfs4_schedule_stateid_recovery(server, state); | ||
67 | @@ -1901,6 +1911,7 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, | ||
68 | struct nfs_server *server = NFS_SERVER(inode); | ||
69 | struct nfs4_exception exception = { | ||
70 | .state = state, | ||
71 | + .inode = inode, | ||
72 | }; | ||
73 | int err; | ||
74 | do { | ||
75 | -- | ||
76 | 1.7.9.4 | ||
77 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0087-xfs-fix-inode-lookup-race.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0087-xfs-fix-inode-lookup-race.patch new file mode 100644 index 00000000..0f9e2102 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0087-xfs-fix-inode-lookup-race.patch | |||
@@ -0,0 +1,101 @@ | |||
1 | From e5d6f5ef25f0e67126092de0837e7c8f2ecfbc86 Mon Sep 17 00:00:00 2001 | ||
2 | From: Dave Chinner <dchinner@redhat.com> | ||
3 | Date: Wed, 7 Mar 2012 04:50:25 +0000 | ||
4 | Subject: [PATCH 087/147] xfs: fix inode lookup race | ||
5 | |||
6 | commit f30d500f809eca67a21704347ab14bb35877b5ee upstream. | ||
7 | |||
8 | When we get concurrent lookups of the same inode that is not in the | ||
9 | per-AG inode cache, there is a race condition that triggers warnings | ||
10 | in unlock_new_inode() indicating that we are initialising an inode | ||
11 | that isn't in a the correct state for a new inode. | ||
12 | |||
13 | When we do an inode lookup via a file handle or a bulkstat, we don't | ||
14 | serialise lookups at a higher level through the dentry cache (i.e. | ||
15 | pathless lookup), and so we can get concurrent lookups of the same | ||
16 | inode. | ||
17 | |||
18 | The race condition is between the insertion of the inode into the | ||
19 | cache in the case of a cache miss and a concurrently lookup: | ||
20 | |||
21 | Thread 1 Thread 2 | ||
22 | xfs_iget() | ||
23 | xfs_iget_cache_miss() | ||
24 | xfs_iread() | ||
25 | lock radix tree | ||
26 | radix_tree_insert() | ||
27 | rcu_read_lock | ||
28 | radix_tree_lookup | ||
29 | lock inode flags | ||
30 | XFS_INEW not set | ||
31 | igrab() | ||
32 | unlock inode flags | ||
33 | rcu_read_unlock | ||
34 | use uninitialised inode | ||
35 | ..... | ||
36 | lock inode flags | ||
37 | set XFS_INEW | ||
38 | unlock inode flags | ||
39 | unlock radix tree | ||
40 | xfs_setup_inode() | ||
41 | inode flags = I_NEW | ||
42 | unlock_new_inode() | ||
43 | WARNING as inode flags != I_NEW | ||
44 | |||
45 | This can lead to inode corruption, inode list corruption, etc, and | ||
46 | is generally a bad thing to occur. | ||
47 | |||
48 | Fix this by setting XFS_INEW before inserting the inode into the | ||
49 | radix tree. This will ensure any concurrent lookup will find the new | ||
50 | inode with XFS_INEW set and that forces the lookup to wait until the | ||
51 | XFS_INEW flag is removed before allowing the lookup to succeed. | ||
52 | |||
53 | Signed-off-by: Dave Chinner <dchinner@redhat.com> | ||
54 | Reviewed-by: Christoph Hellwig <hch@lst.de> | ||
55 | Signed-off-by: Ben Myers <bpm@sgi.com> | ||
56 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
57 | --- | ||
58 | fs/xfs/xfs_iget.c | 18 ++++++++++++------ | ||
59 | 1 file changed, 12 insertions(+), 6 deletions(-) | ||
60 | |||
61 | diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c | ||
62 | index 0fa98b1..cfc4277 100644 | ||
63 | --- a/fs/xfs/xfs_iget.c | ||
64 | +++ b/fs/xfs/xfs_iget.c | ||
65 | @@ -353,9 +353,20 @@ xfs_iget_cache_miss( | ||
66 | BUG(); | ||
67 | } | ||
68 | |||
69 | - spin_lock(&pag->pag_ici_lock); | ||
70 | + /* | ||
71 | + * These values must be set before inserting the inode into the radix | ||
72 | + * tree as the moment it is inserted a concurrent lookup (allowed by the | ||
73 | + * RCU locking mechanism) can find it and that lookup must see that this | ||
74 | + * is an inode currently under construction (i.e. that XFS_INEW is set). | ||
75 | + * The ip->i_flags_lock that protects the XFS_INEW flag forms the | ||
76 | + * memory barrier that ensures this detection works correctly at lookup | ||
77 | + * time. | ||
78 | + */ | ||
79 | + ip->i_udquot = ip->i_gdquot = NULL; | ||
80 | + xfs_iflags_set(ip, XFS_INEW); | ||
81 | |||
82 | /* insert the new inode */ | ||
83 | + spin_lock(&pag->pag_ici_lock); | ||
84 | error = radix_tree_insert(&pag->pag_ici_root, agino, ip); | ||
85 | if (unlikely(error)) { | ||
86 | WARN_ON(error != -EEXIST); | ||
87 | @@ -363,11 +374,6 @@ xfs_iget_cache_miss( | ||
88 | error = EAGAIN; | ||
89 | goto out_preload_end; | ||
90 | } | ||
91 | - | ||
92 | - /* These values _must_ be set before releasing the radix tree lock! */ | ||
93 | - ip->i_udquot = ip->i_gdquot = NULL; | ||
94 | - xfs_iflags_set(ip, XFS_INEW); | ||
95 | - | ||
96 | spin_unlock(&pag->pag_ici_lock); | ||
97 | radix_tree_preload_end(); | ||
98 | |||
99 | -- | ||
100 | 1.7.9.4 | ||
101 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0088-CIFS-Respect-negotiated-MaxMpxCount.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0088-CIFS-Respect-negotiated-MaxMpxCount.patch new file mode 100644 index 00000000..5f2a0dd3 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0088-CIFS-Respect-negotiated-MaxMpxCount.patch | |||
@@ -0,0 +1,212 @@ | |||
1 | From 8ceb94d9185c4640cf49d48a06ddfb9ef94ec16d Mon Sep 17 00:00:00 2001 | ||
2 | From: Pavel Shilovsky <piastry@etersoft.ru> | ||
3 | Date: Tue, 20 Mar 2012 12:55:09 +0300 | ||
4 | Subject: [PATCH 088/147] CIFS: Respect negotiated MaxMpxCount | ||
5 | |||
6 | commit 10b9b98e41ba248a899f6175ce96ee91431b6194 upstream. | ||
7 | |||
8 | Some servers sets this value less than 50 that was hardcoded and | ||
9 | we lost the connection if when we exceed this limit. Fix this by | ||
10 | respecting this value - not sending more than the server allows. | ||
11 | |||
12 | Reviewed-by: Jeff Layton <jlayton@samba.org> | ||
13 | Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> | ||
14 | Signed-off-by: Steve French <sfrench@us.ibm.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | fs/cifs/cifsfs.c | 8 ++++---- | ||
18 | fs/cifs/cifsglob.h | 10 +++------- | ||
19 | fs/cifs/cifssmb.c | 9 +++++++-- | ||
20 | fs/cifs/connect.c | 11 ++++------- | ||
21 | fs/cifs/dir.c | 6 ++++-- | ||
22 | fs/cifs/file.c | 4 ++-- | ||
23 | fs/cifs/transport.c | 4 ++-- | ||
24 | 7 files changed, 26 insertions(+), 26 deletions(-) | ||
25 | |||
26 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c | ||
27 | index 8f1fe32..b4c2c99 100644 | ||
28 | --- a/fs/cifs/cifsfs.c | ||
29 | +++ b/fs/cifs/cifsfs.c | ||
30 | @@ -76,7 +76,7 @@ MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 " | ||
31 | unsigned int cifs_max_pending = CIFS_MAX_REQ; | ||
32 | module_param(cifs_max_pending, int, 0444); | ||
33 | MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. " | ||
34 | - "Default: 50 Range: 2 to 256"); | ||
35 | + "Default: 32767 Range: 2 to 32767."); | ||
36 | unsigned short echo_retries = 5; | ||
37 | module_param(echo_retries, ushort, 0644); | ||
38 | MODULE_PARM_DESC(echo_retries, "Number of echo attempts before giving up and " | ||
39 | @@ -1116,9 +1116,9 @@ init_cifs(void) | ||
40 | if (cifs_max_pending < 2) { | ||
41 | cifs_max_pending = 2; | ||
42 | cFYI(1, "cifs_max_pending set to min of 2"); | ||
43 | - } else if (cifs_max_pending > 256) { | ||
44 | - cifs_max_pending = 256; | ||
45 | - cFYI(1, "cifs_max_pending set to max of 256"); | ||
46 | + } else if (cifs_max_pending > CIFS_MAX_REQ) { | ||
47 | + cifs_max_pending = CIFS_MAX_REQ; | ||
48 | + cFYI(1, "cifs_max_pending set to max of %u", CIFS_MAX_REQ); | ||
49 | } | ||
50 | |||
51 | rc = cifs_fscache_register(); | ||
52 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h | ||
53 | index 8238aa1..c467ac8 100644 | ||
54 | --- a/fs/cifs/cifsglob.h | ||
55 | +++ b/fs/cifs/cifsglob.h | ||
56 | @@ -55,14 +55,9 @@ | ||
57 | |||
58 | /* | ||
59 | * MAX_REQ is the maximum number of requests that WE will send | ||
60 | - * on one socket concurrently. It also matches the most common | ||
61 | - * value of max multiplex returned by servers. We may | ||
62 | - * eventually want to use the negotiated value (in case | ||
63 | - * future servers can handle more) when we are more confident that | ||
64 | - * we will not have problems oveloading the socket with pending | ||
65 | - * write data. | ||
66 | + * on one socket concurrently. | ||
67 | */ | ||
68 | -#define CIFS_MAX_REQ 50 | ||
69 | +#define CIFS_MAX_REQ 32767 | ||
70 | |||
71 | #define RFC1001_NAME_LEN 15 | ||
72 | #define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1) | ||
73 | @@ -263,6 +258,7 @@ struct TCP_Server_Info { | ||
74 | bool session_estab; /* mark when very first sess is established */ | ||
75 | u16 dialect; /* dialect index that server chose */ | ||
76 | enum securityEnum secType; | ||
77 | + bool oplocks:1; /* enable oplocks */ | ||
78 | unsigned int maxReq; /* Clients should submit no more */ | ||
79 | /* than maxReq distinct unanswered SMBs to the server when using */ | ||
80 | /* multiplexed reads or writes */ | ||
81 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c | ||
82 | index 6600aa2..0e6adac 100644 | ||
83 | --- a/fs/cifs/cifssmb.c | ||
84 | +++ b/fs/cifs/cifssmb.c | ||
85 | @@ -458,7 +458,10 @@ CIFSSMBNegotiate(unsigned int xid, struct cifs_ses *ses) | ||
86 | goto neg_err_exit; | ||
87 | } | ||
88 | server->sec_mode = (__u8)le16_to_cpu(rsp->SecurityMode); | ||
89 | - server->maxReq = le16_to_cpu(rsp->MaxMpxCount); | ||
90 | + server->maxReq = min_t(unsigned int, | ||
91 | + le16_to_cpu(rsp->MaxMpxCount), | ||
92 | + cifs_max_pending); | ||
93 | + server->oplocks = server->maxReq > 1 ? enable_oplocks : false; | ||
94 | server->maxBuf = le16_to_cpu(rsp->MaxBufSize); | ||
95 | server->max_vcs = le16_to_cpu(rsp->MaxNumberVcs); | ||
96 | /* even though we do not use raw we might as well set this | ||
97 | @@ -564,7 +567,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifs_ses *ses) | ||
98 | |||
99 | /* one byte, so no need to convert this or EncryptionKeyLen from | ||
100 | little endian */ | ||
101 | - server->maxReq = le16_to_cpu(pSMBr->MaxMpxCount); | ||
102 | + server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), | ||
103 | + cifs_max_pending); | ||
104 | + server->oplocks = server->maxReq > 1 ? enable_oplocks : false; | ||
105 | /* probably no need to store and check maxvcs */ | ||
106 | server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); | ||
107 | server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); | ||
108 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
109 | index 720edf5..a26b98f 100644 | ||
110 | --- a/fs/cifs/connect.c | ||
111 | +++ b/fs/cifs/connect.c | ||
112 | @@ -625,14 +625,10 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server) | ||
113 | spin_unlock(&GlobalMid_Lock); | ||
114 | wake_up_all(&server->response_q); | ||
115 | |||
116 | - /* | ||
117 | - * Check if we have blocked requests that need to free. Note that | ||
118 | - * cifs_max_pending is normally 50, but can be set at module install | ||
119 | - * time to as little as two. | ||
120 | - */ | ||
121 | + /* Check if we have blocked requests that need to free. */ | ||
122 | spin_lock(&GlobalMid_Lock); | ||
123 | - if (atomic_read(&server->inFlight) >= cifs_max_pending) | ||
124 | - atomic_set(&server->inFlight, cifs_max_pending - 1); | ||
125 | + if (atomic_read(&server->inFlight) >= server->maxReq) | ||
126 | + atomic_set(&server->inFlight, server->maxReq - 1); | ||
127 | /* | ||
128 | * We do not want to set the max_pending too low or we could end up | ||
129 | * with the counter going negative. | ||
130 | @@ -1890,6 +1886,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | ||
131 | tcp_ses->noautotune = volume_info->noautotune; | ||
132 | tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay; | ||
133 | atomic_set(&tcp_ses->inFlight, 0); | ||
134 | + tcp_ses->maxReq = 1; /* enough to send negotiate request */ | ||
135 | init_waitqueue_head(&tcp_ses->response_q); | ||
136 | init_waitqueue_head(&tcp_ses->request_q); | ||
137 | INIT_LIST_HEAD(&tcp_ses->pending_mid_q); | ||
138 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c | ||
139 | index bf68b4f..6937e7c 100644 | ||
140 | --- a/fs/cifs/dir.c | ||
141 | +++ b/fs/cifs/dir.c | ||
142 | @@ -171,7 +171,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | ||
143 | } | ||
144 | tcon = tlink_tcon(tlink); | ||
145 | |||
146 | - if (enable_oplocks) | ||
147 | + if (tcon->ses->server->oplocks) | ||
148 | oplock = REQ_OPLOCK; | ||
149 | |||
150 | if (nd) | ||
151 | @@ -492,7 +492,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | ||
152 | { | ||
153 | int xid; | ||
154 | int rc = 0; /* to get around spurious gcc warning, set to zero here */ | ||
155 | - __u32 oplock = enable_oplocks ? REQ_OPLOCK : 0; | ||
156 | + __u32 oplock; | ||
157 | __u16 fileHandle = 0; | ||
158 | bool posix_open = false; | ||
159 | struct cifs_sb_info *cifs_sb; | ||
160 | @@ -518,6 +518,8 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | ||
161 | } | ||
162 | pTcon = tlink_tcon(tlink); | ||
163 | |||
164 | + oplock = pTcon->ses->server->oplocks ? REQ_OPLOCK : 0; | ||
165 | + | ||
166 | /* | ||
167 | * Don't allow the separator character in a path component. | ||
168 | * The VFS will not allow "/", but "\" is allowed by posix. | ||
169 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
170 | index 5e64748..4aa6080 100644 | ||
171 | --- a/fs/cifs/file.c | ||
172 | +++ b/fs/cifs/file.c | ||
173 | @@ -380,7 +380,7 @@ int cifs_open(struct inode *inode, struct file *file) | ||
174 | cFYI(1, "inode = 0x%p file flags are 0x%x for %s", | ||
175 | inode, file->f_flags, full_path); | ||
176 | |||
177 | - if (enable_oplocks) | ||
178 | + if (tcon->ses->server->oplocks) | ||
179 | oplock = REQ_OPLOCK; | ||
180 | else | ||
181 | oplock = 0; | ||
182 | @@ -505,7 +505,7 @@ static int cifs_reopen_file(struct cifsFileInfo *pCifsFile, bool can_flush) | ||
183 | cFYI(1, "inode = 0x%p file flags 0x%x for %s", | ||
184 | inode, pCifsFile->f_flags, full_path); | ||
185 | |||
186 | - if (enable_oplocks) | ||
187 | + if (tcon->ses->server->oplocks) | ||
188 | oplock = REQ_OPLOCK; | ||
189 | else | ||
190 | oplock = 0; | ||
191 | diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c | ||
192 | index 0cc9584..99a27cf 100644 | ||
193 | --- a/fs/cifs/transport.c | ||
194 | +++ b/fs/cifs/transport.c | ||
195 | @@ -265,12 +265,12 @@ static int wait_for_free_request(struct TCP_Server_Info *server, | ||
196 | |||
197 | spin_lock(&GlobalMid_Lock); | ||
198 | while (1) { | ||
199 | - if (atomic_read(&server->inFlight) >= cifs_max_pending) { | ||
200 | + if (atomic_read(&server->inFlight) >= server->maxReq) { | ||
201 | spin_unlock(&GlobalMid_Lock); | ||
202 | cifs_num_waiters_inc(server); | ||
203 | wait_event(server->request_q, | ||
204 | atomic_read(&server->inFlight) | ||
205 | - < cifs_max_pending); | ||
206 | + < server->maxReq); | ||
207 | cifs_num_waiters_dec(server); | ||
208 | spin_lock(&GlobalMid_Lock); | ||
209 | } else { | ||
210 | -- | ||
211 | 1.7.9.4 | ||
212 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0089-cifs-fix-issue-mounting-of-DFS-ROOT-when-redirecting.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0089-cifs-fix-issue-mounting-of-DFS-ROOT-when-redirecting.patch new file mode 100644 index 00000000..a07d8d84 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0089-cifs-fix-issue-mounting-of-DFS-ROOT-when-redirecting.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | From bf2a3ba7a460d3f1904077d790028269f468d7c1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jeff Layton <jlayton@redhat.com> | ||
3 | Date: Wed, 21 Mar 2012 06:30:40 -0400 | ||
4 | Subject: [PATCH 089/147] cifs: fix issue mounting of DFS ROOT when | ||
5 | redirecting from one domain controller to the next | ||
6 | |||
7 | commit 1daaae8fa4afe3df78ca34e724ed7e8187e4eb32 upstream. | ||
8 | |||
9 | This patch fixes an issue when cifs_mount receives a | ||
10 | STATUS_BAD_NETWORK_NAME error during cifs_get_tcon but is able to | ||
11 | continue after an DFS ROOT referral. In this case, the return code | ||
12 | variable is not reset prior to trying to mount from the system referred | ||
13 | to. Thus, is_path_accessible is not executed and the final DFS referral | ||
14 | is not performed causing a mount error. | ||
15 | |||
16 | Use case: In DNS, example.com resolves to the secondary AD server | ||
17 | ad2.example.com Our primary domain controller is ad1.example.com and has | ||
18 | a DFS redirection set up from \\ad1\share\Users to \\files\share\Users. | ||
19 | Mounting \\example.com\share\Users fails. | ||
20 | |||
21 | Regression introduced by commit 724d9f1. | ||
22 | |||
23 | Reviewed-by: Pavel Shilovsky <piastry@etersoft.ru | ||
24 | Signed-off-by: Thomas Hadig <thomas@intapp.com> | ||
25 | Signed-off-by: Jeff Layton <jlayton@redhat.com> | ||
26 | Signed-off-by: Steve French <sfrench@us.ibm.com> | ||
27 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
28 | --- | ||
29 | fs/cifs/connect.c | 3 ++- | ||
30 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
31 | |||
32 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
33 | index a26b98f..9e0675a 100644 | ||
34 | --- a/fs/cifs/connect.c | ||
35 | +++ b/fs/cifs/connect.c | ||
36 | @@ -3217,7 +3217,7 @@ cifs_ra_pages(struct cifs_sb_info *cifs_sb) | ||
37 | int | ||
38 | cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) | ||
39 | { | ||
40 | - int rc = 0; | ||
41 | + int rc; | ||
42 | int xid; | ||
43 | struct cifs_ses *pSesInfo; | ||
44 | struct cifs_tcon *tcon; | ||
45 | @@ -3244,6 +3244,7 @@ try_mount_again: | ||
46 | FreeXid(xid); | ||
47 | } | ||
48 | #endif | ||
49 | + rc = 0; | ||
50 | tcon = NULL; | ||
51 | pSesInfo = NULL; | ||
52 | srvTcp = NULL; | ||
53 | -- | ||
54 | 1.7.9.4 | ||
55 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0090-CIFS-Fix-a-spurious-error-in-cifs_push_posix_locks.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0090-CIFS-Fix-a-spurious-error-in-cifs_push_posix_locks.patch new file mode 100644 index 00000000..db43c406 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0090-CIFS-Fix-a-spurious-error-in-cifs_push_posix_locks.patch | |||
@@ -0,0 +1,70 @@ | |||
1 | From 456290dcbf936c8883bf84492b7c3f04e73efa1a Mon Sep 17 00:00:00 2001 | ||
2 | From: Pavel Shilovsky <piastry@etersoft.ru> | ||
3 | Date: Sat, 17 Mar 2012 09:46:55 +0300 | ||
4 | Subject: [PATCH 090/147] CIFS: Fix a spurious error in cifs_push_posix_locks | ||
5 | |||
6 | commit ce85852b90a214cf577fc1b4f49d99fd7e98784a upstream. | ||
7 | |||
8 | Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> | ||
9 | Reviewed-by: Jeff Layton <jlayton@redhat.com> | ||
10 | Reported-by: Ben Hutchings <ben@decadent.org.uk> | ||
11 | Signed-off-by: Steve French <sfrench@us.ibm.com> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | fs/cifs/file.c | 19 ++++++++++--------- | ||
15 | 1 file changed, 10 insertions(+), 9 deletions(-) | ||
16 | |||
17 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
18 | index 4aa6080..159fcc5 100644 | ||
19 | --- a/fs/cifs/file.c | ||
20 | +++ b/fs/cifs/file.c | ||
21 | @@ -960,9 +960,9 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
22 | INIT_LIST_HEAD(&locks_to_send); | ||
23 | |||
24 | /* | ||
25 | - * Allocating count locks is enough because no locks can be added to | ||
26 | - * the list while we are holding cinode->lock_mutex that protects | ||
27 | - * locking operations of this inode. | ||
28 | + * Allocating count locks is enough because no FL_POSIX locks can be | ||
29 | + * added to the list while we are holding cinode->lock_mutex that | ||
30 | + * protects locking operations of this inode. | ||
31 | */ | ||
32 | for (; i < count; i++) { | ||
33 | lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL); | ||
34 | @@ -973,18 +973,20 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
35 | list_add_tail(&lck->llist, &locks_to_send); | ||
36 | } | ||
37 | |||
38 | - i = 0; | ||
39 | el = locks_to_send.next; | ||
40 | lock_flocks(); | ||
41 | cifs_for_each_lock(cfile->dentry->d_inode, before) { | ||
42 | + flock = *before; | ||
43 | + if ((flock->fl_flags & FL_POSIX) == 0) | ||
44 | + continue; | ||
45 | if (el == &locks_to_send) { | ||
46 | - /* something is really wrong */ | ||
47 | + /* | ||
48 | + * The list ended. We don't have enough allocated | ||
49 | + * structures - something is really wrong. | ||
50 | + */ | ||
51 | cERROR(1, "Can't push all brlocks!"); | ||
52 | break; | ||
53 | } | ||
54 | - flock = *before; | ||
55 | - if ((flock->fl_flags & FL_POSIX) == 0) | ||
56 | - continue; | ||
57 | length = 1 + flock->fl_end - flock->fl_start; | ||
58 | if (flock->fl_type == F_RDLCK || flock->fl_type == F_SHLCK) | ||
59 | type = CIFS_RDLCK; | ||
60 | @@ -996,7 +998,6 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
61 | lck->length = length; | ||
62 | lck->type = type; | ||
63 | lck->offset = flock->fl_start; | ||
64 | - i++; | ||
65 | el = el->next; | ||
66 | } | ||
67 | unlock_flocks(); | ||
68 | -- | ||
69 | 1.7.9.4 | ||
70 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0091-UBI-fix-error-handling-in-ubi_scan.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0091-UBI-fix-error-handling-in-ubi_scan.patch new file mode 100644 index 00000000..1b0619f2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0091-UBI-fix-error-handling-in-ubi_scan.patch | |||
@@ -0,0 +1,58 @@ | |||
1 | From a3dcecf0adebe74332981c56c453556e3a4ebd5b Mon Sep 17 00:00:00 2001 | ||
2 | From: Richard Weinberger <richard@nod.at> | ||
3 | Date: Mon, 30 Jan 2012 18:20:13 +0100 | ||
4 | Subject: [PATCH 091/147] UBI: fix error handling in ubi_scan() | ||
5 | |||
6 | commit a29852be492d61001d86c6ebf5fff9b93d7b4be9 upstream. | ||
7 | |||
8 | Two bad things can happen in ubi_scan(): | ||
9 | 1. If kmem_cache_create() fails we jump to out_si and call | ||
10 | ubi_scan_destroy_si() which calls kmem_cache_destroy(). | ||
11 | But si->scan_leb_slab is NULL. | ||
12 | 2. If process_eb() fails we jump to out_vidh, call | ||
13 | kmem_cache_destroy() and ubi_scan_destroy_si() which calls | ||
14 | again kmem_cache_destroy(). | ||
15 | |||
16 | Signed-off-by: Richard Weinberger <richard@nod.at> | ||
17 | Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/mtd/ubi/scan.c | 8 ++++---- | ||
21 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
22 | |||
23 | diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c | ||
24 | index 0cb17d9..b99318e 100644 | ||
25 | --- a/drivers/mtd/ubi/scan.c | ||
26 | +++ b/drivers/mtd/ubi/scan.c | ||
27 | @@ -1174,7 +1174,7 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi) | ||
28 | |||
29 | ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); | ||
30 | if (!ech) | ||
31 | - goto out_slab; | ||
32 | + goto out_si; | ||
33 | |||
34 | vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); | ||
35 | if (!vidh) | ||
36 | @@ -1235,8 +1235,6 @@ out_vidh: | ||
37 | ubi_free_vid_hdr(ubi, vidh); | ||
38 | out_ech: | ||
39 | kfree(ech); | ||
40 | -out_slab: | ||
41 | - kmem_cache_destroy(si->scan_leb_slab); | ||
42 | out_si: | ||
43 | ubi_scan_destroy_si(si); | ||
44 | return ERR_PTR(err); | ||
45 | @@ -1325,7 +1323,9 @@ void ubi_scan_destroy_si(struct ubi_scan_info *si) | ||
46 | } | ||
47 | } | ||
48 | |||
49 | - kmem_cache_destroy(si->scan_leb_slab); | ||
50 | + if (si->scan_leb_slab) | ||
51 | + kmem_cache_destroy(si->scan_leb_slab); | ||
52 | + | ||
53 | kfree(si); | ||
54 | } | ||
55 | |||
56 | -- | ||
57 | 1.7.9.4 | ||
58 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0092-UBI-fix-eraseblock-picking-criteria.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0092-UBI-fix-eraseblock-picking-criteria.patch new file mode 100644 index 00000000..ce317e4f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0092-UBI-fix-eraseblock-picking-criteria.patch | |||
@@ -0,0 +1,57 @@ | |||
1 | From 7abbe27ba63bb9559ea47b8449c4f0a50d98073e Mon Sep 17 00:00:00 2001 | ||
2 | From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | ||
3 | Date: Wed, 7 Mar 2012 19:08:36 +0200 | ||
4 | Subject: [PATCH 092/147] UBI: fix eraseblock picking criteria | ||
5 | |||
6 | commit 7eb3aa65853e1b223bfc786b023b702018cb76c0 upstream. | ||
7 | |||
8 | The 'find_wl_entry()' function expects the maximum difference as the second | ||
9 | argument, not the maximum absolute value. So the "unknown" eraseblock picking | ||
10 | was incorrect, as Shmulik Ladkani spotted. This patch fixes the issue. | ||
11 | |||
12 | Reported-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> | ||
13 | Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | ||
14 | Reviewed-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | drivers/mtd/ubi/wl.c | 10 ++++------ | ||
18 | 1 file changed, 4 insertions(+), 6 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c | ||
21 | index 0696e36..cf42971 100644 | ||
22 | --- a/drivers/mtd/ubi/wl.c | ||
23 | +++ b/drivers/mtd/ubi/wl.c | ||
24 | @@ -389,7 +389,7 @@ static struct ubi_wl_entry *find_wl_entry(struct rb_root *root, int max) | ||
25 | */ | ||
26 | int ubi_wl_get_peb(struct ubi_device *ubi, int dtype) | ||
27 | { | ||
28 | - int err, medium_ec; | ||
29 | + int err; | ||
30 | struct ubi_wl_entry *e, *first, *last; | ||
31 | |||
32 | ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM || | ||
33 | @@ -427,7 +427,7 @@ retry: | ||
34 | * For unknown data we pick a physical eraseblock with medium | ||
35 | * erase counter. But we by no means can pick a physical | ||
36 | * eraseblock with erase counter greater or equivalent than the | ||
37 | - * lowest erase counter plus %WL_FREE_MAX_DIFF. | ||
38 | + * lowest erase counter plus %WL_FREE_MAX_DIFF/2. | ||
39 | */ | ||
40 | first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry, | ||
41 | u.rb); | ||
42 | @@ -436,10 +436,8 @@ retry: | ||
43 | if (last->ec - first->ec < WL_FREE_MAX_DIFF) | ||
44 | e = rb_entry(ubi->free.rb_node, | ||
45 | struct ubi_wl_entry, u.rb); | ||
46 | - else { | ||
47 | - medium_ec = (first->ec + WL_FREE_MAX_DIFF)/2; | ||
48 | - e = find_wl_entry(&ubi->free, medium_ec); | ||
49 | - } | ||
50 | + else | ||
51 | + e = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF/2); | ||
52 | break; | ||
53 | case UBI_SHORTTERM: | ||
54 | /* | ||
55 | -- | ||
56 | 1.7.9.4 | ||
57 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0093-SUNRPC-We-must-not-use-list_for_each_entry_safe-in-r.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0093-SUNRPC-We-must-not-use-list_for_each_entry_safe-in-r.patch new file mode 100644 index 00000000..3b456540 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0093-SUNRPC-We-must-not-use-list_for_each_entry_safe-in-r.patch | |||
@@ -0,0 +1,73 @@ | |||
1 | From cdc2a3f4e2494e413531264d3949ce6801123ad9 Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Mon, 19 Mar 2012 13:39:35 -0400 | ||
4 | Subject: [PATCH 093/147] SUNRPC: We must not use list_for_each_entry_safe() | ||
5 | in rpc_wake_up() | ||
6 | |||
7 | commit 540a0f7584169651f485e8ab67461fcb06934e38 upstream. | ||
8 | |||
9 | The problem is that for the case of priority queues, we | ||
10 | have to assume that __rpc_remove_wait_queue_priority will move new | ||
11 | elements from the tk_wait.links lists into the queue->tasks[] list. | ||
12 | We therefore cannot use list_for_each_entry_safe() on queue->tasks[], | ||
13 | since that will skip these new tasks that __rpc_remove_wait_queue_priority | ||
14 | is adding. | ||
15 | |||
16 | Without this fix, rpc_wake_up and rpc_wake_up_status will both fail | ||
17 | to wake up all functions on priority wait queues, which can result | ||
18 | in some nasty hangs. | ||
19 | |||
20 | Reported-by: Andy Adamson <andros@netapp.com> | ||
21 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | net/sunrpc/sched.c | 15 +++++++++++---- | ||
25 | 1 file changed, 11 insertions(+), 4 deletions(-) | ||
26 | |||
27 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c | ||
28 | index 00a1a2a..4e2b3b4 100644 | ||
29 | --- a/net/sunrpc/sched.c | ||
30 | +++ b/net/sunrpc/sched.c | ||
31 | @@ -500,14 +500,18 @@ EXPORT_SYMBOL_GPL(rpc_wake_up_next); | ||
32 | */ | ||
33 | void rpc_wake_up(struct rpc_wait_queue *queue) | ||
34 | { | ||
35 | - struct rpc_task *task, *next; | ||
36 | struct list_head *head; | ||
37 | |||
38 | spin_lock_bh(&queue->lock); | ||
39 | head = &queue->tasks[queue->maxpriority]; | ||
40 | for (;;) { | ||
41 | - list_for_each_entry_safe(task, next, head, u.tk_wait.list) | ||
42 | + while (!list_empty(head)) { | ||
43 | + struct rpc_task *task; | ||
44 | + task = list_first_entry(head, | ||
45 | + struct rpc_task, | ||
46 | + u.tk_wait.list); | ||
47 | rpc_wake_up_task_queue_locked(queue, task); | ||
48 | + } | ||
49 | if (head == &queue->tasks[0]) | ||
50 | break; | ||
51 | head--; | ||
52 | @@ -525,13 +529,16 @@ EXPORT_SYMBOL_GPL(rpc_wake_up); | ||
53 | */ | ||
54 | void rpc_wake_up_status(struct rpc_wait_queue *queue, int status) | ||
55 | { | ||
56 | - struct rpc_task *task, *next; | ||
57 | struct list_head *head; | ||
58 | |||
59 | spin_lock_bh(&queue->lock); | ||
60 | head = &queue->tasks[queue->maxpriority]; | ||
61 | for (;;) { | ||
62 | - list_for_each_entry_safe(task, next, head, u.tk_wait.list) { | ||
63 | + while (!list_empty(head)) { | ||
64 | + struct rpc_task *task; | ||
65 | + task = list_first_entry(head, | ||
66 | + struct rpc_task, | ||
67 | + u.tk_wait.list); | ||
68 | task->tk_status = status; | ||
69 | rpc_wake_up_task_queue_locked(queue, task); | ||
70 | } | ||
71 | -- | ||
72 | 1.7.9.4 | ||
73 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0094-usbnet-increase-URB-reference-count-before-usb_unlin.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0094-usbnet-increase-URB-reference-count-before-usb_unlin.patch new file mode 100644 index 00000000..05385039 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0094-usbnet-increase-URB-reference-count-before-usb_unlin.patch | |||
@@ -0,0 +1,62 @@ | |||
1 | From 25aa7a79e5be3c393eee41e3939d8eefa9672fc7 Mon Sep 17 00:00:00 2001 | ||
2 | From: "tom.leiming@gmail.com" <tom.leiming@gmail.com> | ||
3 | Date: Thu, 22 Mar 2012 03:22:18 +0000 | ||
4 | Subject: [PATCH 094/147] usbnet: increase URB reference count before | ||
5 | usb_unlink_urb | ||
6 | |||
7 | commit 0956a8c20b23d429e79ff86d4325583fc06f9eb4 upstream. | ||
8 | |||
9 | Commit 4231d47e6fe69f061f96c98c30eaf9fb4c14b96d(net/usbnet: avoid | ||
10 | recursive locking in usbnet_stop()) fixes the recursive locking | ||
11 | problem by releasing the skb queue lock, but it makes usb_unlink_urb | ||
12 | racing with defer_bh, and the URB to being unlinked may be freed before | ||
13 | or during calling usb_unlink_urb, so use-after-free problem may be | ||
14 | triggerd inside usb_unlink_urb. | ||
15 | |||
16 | The patch fixes the use-after-free problem by increasing URB | ||
17 | reference count with skb queue lock held before calling | ||
18 | usb_unlink_urb, so the URB won't be freed until return from | ||
19 | usb_unlink_urb. | ||
20 | |||
21 | Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | ||
22 | Cc: Alan Stern <stern@rowland.harvard.edu> | ||
23 | Cc: Oliver Neukum <oliver@neukum.org> | ||
24 | Reported-by: Dave Jones <davej@redhat.com> | ||
25 | Signed-off-by: Ming Lei <tom.leiming@gmail.com> | ||
26 | Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
27 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
28 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
29 | --- | ||
30 | drivers/net/usb/usbnet.c | 9 +++++++++ | ||
31 | 1 file changed, 9 insertions(+) | ||
32 | |||
33 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
34 | index 81b96e3..cf6a515 100644 | ||
35 | --- a/drivers/net/usb/usbnet.c | ||
36 | +++ b/drivers/net/usb/usbnet.c | ||
37 | @@ -589,6 +589,14 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | ||
38 | entry = (struct skb_data *) skb->cb; | ||
39 | urb = entry->urb; | ||
40 | |||
41 | + /* | ||
42 | + * Get reference count of the URB to avoid it to be | ||
43 | + * freed during usb_unlink_urb, which may trigger | ||
44 | + * use-after-free problem inside usb_unlink_urb since | ||
45 | + * usb_unlink_urb is always racing with .complete | ||
46 | + * handler(include defer_bh). | ||
47 | + */ | ||
48 | + usb_get_urb(urb); | ||
49 | spin_unlock_irqrestore(&q->lock, flags); | ||
50 | // during some PM-driven resume scenarios, | ||
51 | // these (async) unlinks complete immediately | ||
52 | @@ -597,6 +605,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | ||
53 | netdev_dbg(dev->net, "unlink urb err, %d\n", retval); | ||
54 | else | ||
55 | count++; | ||
56 | + usb_put_urb(urb); | ||
57 | spin_lock_irqsave(&q->lock, flags); | ||
58 | } | ||
59 | spin_unlock_irqrestore (&q->lock, flags); | ||
60 | -- | ||
61 | 1.7.9.4 | ||
62 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0095-usbnet-don-t-clear-urb-dev-in-tx_complete.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0095-usbnet-don-t-clear-urb-dev-in-tx_complete.patch new file mode 100644 index 00000000..71c9db0f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0095-usbnet-don-t-clear-urb-dev-in-tx_complete.patch | |||
@@ -0,0 +1,38 @@ | |||
1 | From 31dcb2223cbb8ca92371811a9d59ed6f721e6d5d Mon Sep 17 00:00:00 2001 | ||
2 | From: "tom.leiming@gmail.com" <tom.leiming@gmail.com> | ||
3 | Date: Thu, 22 Mar 2012 03:22:38 +0000 | ||
4 | Subject: [PATCH 095/147] usbnet: don't clear urb->dev in tx_complete | ||
5 | |||
6 | commit 5d5440a835710d09f0ef18da5000541ec98b537a upstream. | ||
7 | |||
8 | URB unlinking is always racing with its completion and tx_complete | ||
9 | may be called before or during running usb_unlink_urb, so tx_complete | ||
10 | must not clear urb->dev since it will be used in unlink path, | ||
11 | otherwise invalid memory accesses or usb device leak may be caused | ||
12 | inside usb_unlink_urb. | ||
13 | |||
14 | Cc: Alan Stern <stern@rowland.harvard.edu> | ||
15 | Cc: Oliver Neukum <oliver@neukum.org> | ||
16 | Signed-off-by: Ming Lei <tom.leiming@gmail.com> | ||
17 | Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | drivers/net/usb/usbnet.c | 1 - | ||
22 | 1 file changed, 1 deletion(-) | ||
23 | |||
24 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
25 | index cf6a515..750e330 100644 | ||
26 | --- a/drivers/net/usb/usbnet.c | ||
27 | +++ b/drivers/net/usb/usbnet.c | ||
28 | @@ -1037,7 +1037,6 @@ static void tx_complete (struct urb *urb) | ||
29 | } | ||
30 | |||
31 | usb_autopm_put_interface_async(dev->intf); | ||
32 | - urb->dev = NULL; | ||
33 | entry->state = tx_done; | ||
34 | defer_bh(dev, skb, &dev->txq); | ||
35 | } | ||
36 | -- | ||
37 | 1.7.9.4 | ||
38 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0096-e1000e-Avoid-wrong-check-on-TX-hang.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0096-e1000e-Avoid-wrong-check-on-TX-hang.patch new file mode 100644 index 00000000..23f6a5b2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0096-e1000e-Avoid-wrong-check-on-TX-hang.patch | |||
@@ -0,0 +1,98 @@ | |||
1 | From 4c14b8afd02d6923243bf2e2f14bd8ad750741d3 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | ||
3 | Date: Fri, 18 Nov 2011 14:25:00 +0000 | ||
4 | Subject: [PATCH 096/147] e1000e: Avoid wrong check on TX hang | ||
5 | |||
6 | commit 09357b00255c233705b1cf6d76a8d147340545b8 upstream. | ||
7 | |||
8 | Based on the original patch submitted my Michael Wang | ||
9 | <wangyun@linux.vnet.ibm.com>. | ||
10 | Descriptors may not be write-back while checking TX hang with flag | ||
11 | FLAG2_DMA_BURST on. | ||
12 | So when we detect hang, we just flush the descriptor and detect | ||
13 | again for once. | ||
14 | |||
15 | -v2 change 1 to true and 0 to false and remove extra () | ||
16 | |||
17 | CC: Michael Wang <wangyun@linux.vnet.ibm.com> | ||
18 | CC: Flavio Leitner <fbl@redhat.com> | ||
19 | Acked-by: Jesse Brandeburg <jesse.brandeburg@intel.com> | ||
20 | Tested-by: Aaron Brown <aaron.f.brown@intel.com> | ||
21 | Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | drivers/net/ethernet/intel/e1000e/e1000.h | 1 + | ||
25 | drivers/net/ethernet/intel/e1000e/netdev.c | 23 ++++++++++++++++++++--- | ||
26 | 2 files changed, 21 insertions(+), 3 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h | ||
29 | index 9fe18d1..f478a22 100644 | ||
30 | --- a/drivers/net/ethernet/intel/e1000e/e1000.h | ||
31 | +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | ||
32 | @@ -309,6 +309,7 @@ struct e1000_adapter { | ||
33 | u32 txd_cmd; | ||
34 | |||
35 | bool detect_tx_hung; | ||
36 | + bool tx_hang_recheck; | ||
37 | u8 tx_timeout_factor; | ||
38 | |||
39 | u32 tx_int_delay; | ||
40 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
41 | index a855db1..4e933d1 100644 | ||
42 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c | ||
43 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
44 | @@ -1030,6 +1030,7 @@ static void e1000_print_hw_hang(struct work_struct *work) | ||
45 | struct e1000_adapter *adapter = container_of(work, | ||
46 | struct e1000_adapter, | ||
47 | print_hang_task); | ||
48 | + struct net_device *netdev = adapter->netdev; | ||
49 | struct e1000_ring *tx_ring = adapter->tx_ring; | ||
50 | unsigned int i = tx_ring->next_to_clean; | ||
51 | unsigned int eop = tx_ring->buffer_info[i].next_to_watch; | ||
52 | @@ -1041,6 +1042,21 @@ static void e1000_print_hw_hang(struct work_struct *work) | ||
53 | if (test_bit(__E1000_DOWN, &adapter->state)) | ||
54 | return; | ||
55 | |||
56 | + if (!adapter->tx_hang_recheck && | ||
57 | + (adapter->flags2 & FLAG2_DMA_BURST)) { | ||
58 | + /* May be block on write-back, flush and detect again | ||
59 | + * flush pending descriptor writebacks to memory | ||
60 | + */ | ||
61 | + ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
62 | + /* execute the writes immediately */ | ||
63 | + e1e_flush(); | ||
64 | + adapter->tx_hang_recheck = true; | ||
65 | + return; | ||
66 | + } | ||
67 | + /* Real hang detected */ | ||
68 | + adapter->tx_hang_recheck = false; | ||
69 | + netif_stop_queue(netdev); | ||
70 | + | ||
71 | e1e_rphy(hw, PHY_STATUS, &phy_status); | ||
72 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status); | ||
73 | e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status); | ||
74 | @@ -1154,10 +1170,10 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | ||
75 | if (tx_ring->buffer_info[i].time_stamp && | ||
76 | time_after(jiffies, tx_ring->buffer_info[i].time_stamp | ||
77 | + (adapter->tx_timeout_factor * HZ)) && | ||
78 | - !(er32(STATUS) & E1000_STATUS_TXOFF)) { | ||
79 | + !(er32(STATUS) & E1000_STATUS_TXOFF)) | ||
80 | schedule_work(&adapter->print_hang_task); | ||
81 | - netif_stop_queue(netdev); | ||
82 | - } | ||
83 | + else | ||
84 | + adapter->tx_hang_recheck = false; | ||
85 | } | ||
86 | adapter->total_tx_bytes += total_tx_bytes; | ||
87 | adapter->total_tx_packets += total_tx_packets; | ||
88 | @@ -3782,6 +3798,7 @@ static int e1000_open(struct net_device *netdev) | ||
89 | |||
90 | e1000_irq_enable(adapter); | ||
91 | |||
92 | + adapter->tx_hang_recheck = false; | ||
93 | netif_start_queue(netdev); | ||
94 | |||
95 | adapter->idle_check = true; | ||
96 | -- | ||
97 | 1.7.9.4 | ||
98 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0097-x86-32-Fix-endless-loop-when-processing-signals-for-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0097-x86-32-Fix-endless-loop-when-processing-signals-for-.patch new file mode 100644 index 00000000..0b817edf --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0097-x86-32-Fix-endless-loop-when-processing-signals-for-.patch | |||
@@ -0,0 +1,85 @@ | |||
1 | From 37d297b39726f3284da2f83d235c94b0d224e047 Mon Sep 17 00:00:00 2001 | ||
2 | From: Dmitry Adamushko <dmitry.adamushko@gmail.com> | ||
3 | Date: Thu, 22 Mar 2012 21:39:25 +0100 | ||
4 | Subject: [PATCH 097/147] x86-32: Fix endless loop when processing signals for | ||
5 | kernel tasks | ||
6 | |||
7 | commit 29a2e2836ff9ea65a603c89df217f4198973a74f upstream. | ||
8 | |||
9 | The problem occurs on !CONFIG_VM86 kernels [1] when a kernel-mode task | ||
10 | returns from a system call with a pending signal. | ||
11 | |||
12 | A real-life scenario is a child of 'khelper' returning from a failed | ||
13 | kernel_execve() in ____call_usermodehelper() [ kernel/kmod.c ]. | ||
14 | kernel_execve() fails due to a pending SIGKILL, which is the result of | ||
15 | "kill -9 -1" (at least, busybox's init does it upon reboot). | ||
16 | |||
17 | The loop is as follows: | ||
18 | |||
19 | * syscall_exit_work: | ||
20 | - work_pending: // start_of_the_loop | ||
21 | - work_notify_sig: | ||
22 | - do_notify_resume() | ||
23 | - do_signal() | ||
24 | - if (!user_mode(regs)) return; | ||
25 | - resume_userspace // TIF_SIGPENDING is still set | ||
26 | - work_pending // so we call work_pending => goto | ||
27 | // start_of_the_loop | ||
28 | |||
29 | More information can be found in another LKML thread: | ||
30 | http://www.serverphorums.com/read.php?12,457826 | ||
31 | |||
32 | [1] the problem was also seen on MIPS. | ||
33 | |||
34 | Signed-off-by: Dmitry Adamushko <dmitry.adamushko@gmail.com> | ||
35 | Link: http://lkml.kernel.org/r/1332448765.2299.68.camel@dimm | ||
36 | Cc: Oleg Nesterov <oleg@redhat.com> | ||
37 | Cc: Roland McGrath <roland@hack.frob.com> | ||
38 | Cc: Andrew Morton <akpm@linux-foundation.org> | ||
39 | Signed-off-by: H. Peter Anvin <hpa@zytor.com> | ||
40 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
41 | --- | ||
42 | arch/x86/kernel/entry_32.S | 17 ++++++++++------- | ||
43 | 1 file changed, 10 insertions(+), 7 deletions(-) | ||
44 | |||
45 | diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S | ||
46 | index f3f6f53..bcda816 100644 | ||
47 | --- a/arch/x86/kernel/entry_32.S | ||
48 | +++ b/arch/x86/kernel/entry_32.S | ||
49 | @@ -99,12 +99,6 @@ | ||
50 | #endif | ||
51 | .endm | ||
52 | |||
53 | -#ifdef CONFIG_VM86 | ||
54 | -#define resume_userspace_sig check_userspace | ||
55 | -#else | ||
56 | -#define resume_userspace_sig resume_userspace | ||
57 | -#endif | ||
58 | - | ||
59 | /* | ||
60 | * User gs save/restore | ||
61 | * | ||
62 | @@ -328,10 +322,19 @@ ret_from_exception: | ||
63 | preempt_stop(CLBR_ANY) | ||
64 | ret_from_intr: | ||
65 | GET_THREAD_INFO(%ebp) | ||
66 | -check_userspace: | ||
67 | +resume_userspace_sig: | ||
68 | +#ifdef CONFIG_VM86 | ||
69 | movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS | ||
70 | movb PT_CS(%esp), %al | ||
71 | andl $(X86_EFLAGS_VM | SEGMENT_RPL_MASK), %eax | ||
72 | +#else | ||
73 | + /* | ||
74 | + * We can be coming here from a syscall done in the kernel space, | ||
75 | + * e.g. a failed kernel_execve(). | ||
76 | + */ | ||
77 | + movl PT_CS(%esp), %eax | ||
78 | + andl $SEGMENT_RPL_MASK, %eax | ||
79 | +#endif | ||
80 | cmpl $USER_RPL, %eax | ||
81 | jb resume_kernel # not returning to v8086 or userspace | ||
82 | |||
83 | -- | ||
84 | 1.7.9.4 | ||
85 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0098-proc-ns-use-d_set_d_op-API-to-set-dentry-ops-in-proc.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0098-proc-ns-use-d_set_d_op-API-to-set-dentry-ops-in-proc.patch new file mode 100644 index 00000000..d32e4a6b --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0098-proc-ns-use-d_set_d_op-API-to-set-dentry-ops-in-proc.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | From 0b21a3eba2629ca8e573e5b0cd7d1627d17c7cf6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Pravin B Shelar <pshelar@nicira.com> | ||
3 | Date: Fri, 23 Mar 2012 15:02:55 -0700 | ||
4 | Subject: [PATCH 098/147] proc-ns: use d_set_d_op() API to set dentry ops in | ||
5 | proc_ns_instantiate(). | ||
6 | |||
7 | commit 1b26c9b334044cff6d1d2698f2be41bc7d9a0864 upstream. | ||
8 | |||
9 | The namespace cleanup path leaks a dentry which holds a reference count | ||
10 | on a network namespace. Keeping that network namespace from being freed | ||
11 | when the last user goes away. Leaving things like vlan devices in the | ||
12 | leaked network namespace. | ||
13 | |||
14 | If you use ip netns add for much real work this problem becomes apparent | ||
15 | pretty quickly. It light testing the problem hides because frequently | ||
16 | you simply don't notice the leak. | ||
17 | |||
18 | Use d_set_d_op() so that DCACHE_OP_* flags are set correctly. | ||
19 | |||
20 | This issue exists back to 3.0. | ||
21 | |||
22 | Acked-by: "Eric W. Biederman" <ebiederm@xmission.com> | ||
23 | Reported-by: Justin Pettit <jpettit@nicira.com> | ||
24 | Signed-off-by: Pravin B Shelar <pshelar@nicira.com> | ||
25 | Signed-off-by: Jesse Gross <jesse@nicira.com> | ||
26 | Cc: David Miller <davem@davemloft.net> | ||
27 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
28 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
29 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
30 | --- | ||
31 | fs/proc/namespaces.c | 2 +- | ||
32 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
33 | |||
34 | diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c | ||
35 | index be177f7..d6c078e 100644 | ||
36 | --- a/fs/proc/namespaces.c | ||
37 | +++ b/fs/proc/namespaces.c | ||
38 | @@ -54,7 +54,7 @@ static struct dentry *proc_ns_instantiate(struct inode *dir, | ||
39 | ei->ns_ops = ns_ops; | ||
40 | ei->ns = ns; | ||
41 | |||
42 | - dentry->d_op = &pid_dentry_operations; | ||
43 | + d_set_d_op(dentry, &pid_dentry_operations); | ||
44 | d_add(dentry, inode); | ||
45 | /* Close the race of the process dying before we return the dentry */ | ||
46 | if (pid_revalidate(dentry, NULL)) | ||
47 | -- | ||
48 | 1.7.9.4 | ||
49 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0099-iommu-amd-Fix-section-warning-for-prealloc_protectio.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0099-iommu-amd-Fix-section-warning-for-prealloc_protectio.patch new file mode 100644 index 00000000..daafc4ed --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0099-iommu-amd-Fix-section-warning-for-prealloc_protectio.patch | |||
@@ -0,0 +1,39 @@ | |||
1 | From fd9b78dce7a6acf7a69902d69c82980634cd7136 Mon Sep 17 00:00:00 2001 | ||
2 | From: Steffen Persvold <sp@numascale.com> | ||
3 | Date: Thu, 15 Mar 2012 15:20:29 +0100 | ||
4 | Subject: [PATCH 099/147] iommu/amd: Fix section warning for | ||
5 | prealloc_protection_domains | ||
6 | |||
7 | commit cebd5fa4d3046d5b43ce1836a0120612822a7fb0 upstream. | ||
8 | |||
9 | Fix the following section warning in drivers/iommu/amd_iommu.c : | ||
10 | |||
11 | WARNING: vmlinux.o(.text+0x526e77): Section mismatch in reference from the function prealloc_protection_domains() to the function .init.text:alloc_passthrough_domain() | ||
12 | The function prealloc_protection_domains() references | ||
13 | the function __init alloc_passthrough_domain(). | ||
14 | This is often because prealloc_protection_domains lacks a __init | ||
15 | annotation or the annotation of alloc_passthrough_domain is wrong. | ||
16 | |||
17 | Signed-off-by: Steffen Persvold <sp@numascale.com> | ||
18 | Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | drivers/iommu/amd_iommu.c | 2 +- | ||
22 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
23 | |||
24 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
25 | index e0b3e33..966a6e7 100644 | ||
26 | --- a/drivers/iommu/amd_iommu.c | ||
27 | +++ b/drivers/iommu/amd_iommu.c | ||
28 | @@ -2432,7 +2432,7 @@ static int amd_iommu_dma_supported(struct device *dev, u64 mask) | ||
29 | * we don't need to preallocate the protection domains anymore. | ||
30 | * For now we have to. | ||
31 | */ | ||
32 | -static void prealloc_protection_domains(void) | ||
33 | +static void __init prealloc_protection_domains(void) | ||
34 | { | ||
35 | struct pci_dev *dev = NULL; | ||
36 | struct dma_ops_domain *dma_dom; | ||
37 | -- | ||
38 | 1.7.9.4 | ||
39 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0100-sysctl-protect-poll-in-entries-that-may-go-away.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0100-sysctl-protect-poll-in-entries-that-may-go-away.patch new file mode 100644 index 00000000..15fc99d3 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0100-sysctl-protect-poll-in-entries-that-may-go-away.patch | |||
@@ -0,0 +1,97 @@ | |||
1 | From 55d8b2b2ea9545b29091216b9875c4e119215b63 Mon Sep 17 00:00:00 2001 | ||
2 | From: Lucas De Marchi <lucas.demarchi@profusion.mobi> | ||
3 | Date: Thu, 22 Mar 2012 14:42:22 -0700 | ||
4 | Subject: [PATCH 100/147] sysctl: protect poll() in entries that may go away | ||
5 | |||
6 | commit 4e474a00d7ff746ed177ddae14fa8b2d4bad7a00 upstream. | ||
7 | |||
8 | Protect code accessing ctl_table by grabbing the header with grab_header() | ||
9 | and after releasing with sysctl_head_finish(). This is needed if poll() | ||
10 | is called in entries created by modules: currently only hostname and | ||
11 | domainname support poll(), but this bug may be triggered when/if modules | ||
12 | use it and if user called poll() in a file that doesn't support it. | ||
13 | |||
14 | Dave Jones reported the following when using a syscall fuzzer while | ||
15 | hibernating/resuming: | ||
16 | |||
17 | RIP: 0010:[<ffffffff81233e3e>] [<ffffffff81233e3e>] proc_sys_poll+0x4e/0x90 | ||
18 | RAX: 0000000000000145 RBX: ffff88020cab6940 RCX: 0000000000000000 | ||
19 | RDX: ffffffff81233df0 RSI: 6b6b6b6b6b6b6b6b RDI: ffff88020cab6940 | ||
20 | [ ... ] | ||
21 | Code: 00 48 89 fb 48 89 f1 48 8b 40 30 4c 8b 60 e8 b8 45 01 00 00 49 83 | ||
22 | 7c 24 28 00 74 2e 49 8b 74 24 30 48 85 f6 74 24 48 85 c9 75 32 <8b> 16 | ||
23 | b8 45 01 00 00 48 63 d2 49 39 d5 74 10 8b 06 48 98 48 89 | ||
24 | |||
25 | If an entry goes away while we are polling() it, ctl_table may not exist | ||
26 | anymore. | ||
27 | |||
28 | Reported-by: Dave Jones <davej@redhat.com> | ||
29 | Signed-off-by: Lucas De Marchi <lucas.demarchi@profusion.mobi> | ||
30 | Cc: Al Viro <viro@zeniv.linux.org.uk> | ||
31 | Cc: Linus Torvalds <torvalds@linux-foundation.org> | ||
32 | Cc: Alexey Dobriyan <adobriyan@gmail.com> | ||
33 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
34 | Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> | ||
35 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
36 | --- | ||
37 | fs/proc/proc_sysctl.c | 17 ++++++++++++++++- | ||
38 | 1 file changed, 16 insertions(+), 1 deletion(-) | ||
39 | |||
40 | diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c | ||
41 | index a6b6217..53c3bce 100644 | ||
42 | --- a/fs/proc/proc_sysctl.c | ||
43 | +++ b/fs/proc/proc_sysctl.c | ||
44 | @@ -188,20 +188,32 @@ static ssize_t proc_sys_write(struct file *filp, const char __user *buf, | ||
45 | |||
46 | static int proc_sys_open(struct inode *inode, struct file *filp) | ||
47 | { | ||
48 | + struct ctl_table_header *head = grab_header(inode); | ||
49 | struct ctl_table *table = PROC_I(inode)->sysctl_entry; | ||
50 | |||
51 | + /* sysctl was unregistered */ | ||
52 | + if (IS_ERR(head)) | ||
53 | + return PTR_ERR(head); | ||
54 | + | ||
55 | if (table->poll) | ||
56 | filp->private_data = proc_sys_poll_event(table->poll); | ||
57 | |||
58 | + sysctl_head_finish(head); | ||
59 | + | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static unsigned int proc_sys_poll(struct file *filp, poll_table *wait) | ||
64 | { | ||
65 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
66 | + struct ctl_table_header *head = grab_header(inode); | ||
67 | struct ctl_table *table = PROC_I(inode)->sysctl_entry; | ||
68 | - unsigned long event = (unsigned long)filp->private_data; | ||
69 | unsigned int ret = DEFAULT_POLLMASK; | ||
70 | + unsigned long event; | ||
71 | + | ||
72 | + /* sysctl was unregistered */ | ||
73 | + if (IS_ERR(head)) | ||
74 | + return POLLERR | POLLHUP; | ||
75 | |||
76 | if (!table->proc_handler) | ||
77 | goto out; | ||
78 | @@ -209,6 +221,7 @@ static unsigned int proc_sys_poll(struct file *filp, poll_table *wait) | ||
79 | if (!table->poll) | ||
80 | goto out; | ||
81 | |||
82 | + event = (unsigned long)filp->private_data; | ||
83 | poll_wait(filp, &table->poll->wait, wait); | ||
84 | |||
85 | if (event != atomic_read(&table->poll->event)) { | ||
86 | @@ -217,6 +230,8 @@ static unsigned int proc_sys_poll(struct file *filp, poll_table *wait) | ||
87 | } | ||
88 | |||
89 | out: | ||
90 | + sysctl_head_finish(head); | ||
91 | + | ||
92 | return ret; | ||
93 | } | ||
94 | |||
95 | -- | ||
96 | 1.7.9.4 | ||
97 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0101-hwmon-fam15h_power-Correct-sign-extension-of-running.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0101-hwmon-fam15h_power-Correct-sign-extension-of-running.patch new file mode 100644 index 00000000..552723d2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0101-hwmon-fam15h_power-Correct-sign-extension-of-running.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | From c1642ad65f83a61ba5c49a36e0f0e24f71c3dd9a Mon Sep 17 00:00:00 2001 | ||
2 | From: Andreas Herrmann <andreas.herrmann3@amd.com> | ||
3 | Date: Fri, 23 Mar 2012 10:02:17 +0100 | ||
4 | Subject: [PATCH 101/147] hwmon: (fam15h_power) Correct sign extension of | ||
5 | running_avg_capture | ||
6 | |||
7 | commit fc0900cbda9243957d812cd6b4cc87965f9fe75f upstream. | ||
8 | |||
9 | Wrong bit was used for sign extension which caused wrong end results. | ||
10 | Thanks to Andre for spotting this bug. | ||
11 | |||
12 | Reported-by: Andre Przywara <andre.przywara@amd.com> | ||
13 | Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com> | ||
14 | Acked-by: Guenter Roeck <guenter.roeck@ericsson.com> | ||
15 | Signed-off-by: Jean Delvare <khali@linux-fr.org> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/hwmon/fam15h_power.c | 2 +- | ||
19 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
20 | |||
21 | diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c | ||
22 | index 523f8fb..930370d 100644 | ||
23 | --- a/drivers/hwmon/fam15h_power.c | ||
24 | +++ b/drivers/hwmon/fam15h_power.c | ||
25 | @@ -60,7 +60,7 @@ static ssize_t show_power(struct device *dev, | ||
26 | pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5), | ||
27 | REG_TDP_RUNNING_AVERAGE, &val); | ||
28 | running_avg_capture = (val >> 4) & 0x3fffff; | ||
29 | - running_avg_capture = sign_extend32(running_avg_capture, 22); | ||
30 | + running_avg_capture = sign_extend32(running_avg_capture, 21); | ||
31 | running_avg_range = val & 0xf; | ||
32 | |||
33 | pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5), | ||
34 | -- | ||
35 | 1.7.9.4 | ||
36 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0102-lgdt330x-fix-signedness-error-in-i2c_read_demod_byte.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0102-lgdt330x-fix-signedness-error-in-i2c_read_demod_byte.patch new file mode 100644 index 00000000..ae14ffb2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0102-lgdt330x-fix-signedness-error-in-i2c_read_demod_byte.patch | |||
@@ -0,0 +1,53 @@ | |||
1 | From 02bdf6aaea4932d896b0a9c8648ae6aa8255eb2b Mon Sep 17 00:00:00 2001 | ||
2 | From: Xi Wang <xi.wang@gmail.com> | ||
3 | Date: Tue, 14 Feb 2012 14:32:41 -0300 | ||
4 | Subject: [PATCH 102/147] lgdt330x: fix signedness error in | ||
5 | i2c_read_demod_bytes() | ||
6 | |||
7 | commit 34817174fca0c5512c2d5b6ea0fc37a0337ce1d8 upstream. | ||
8 | |||
9 | The error handling in lgdt3303_read_status() and lgdt330x_read_ucblocks() | ||
10 | doesn't work, because i2c_read_demod_bytes() returns a u8 and (err < 0) | ||
11 | is always false. | ||
12 | |||
13 | err = i2c_read_demod_bytes(state, 0x58, buf, 1); | ||
14 | if (err < 0) | ||
15 | return err; | ||
16 | |||
17 | Change the return type of i2c_read_demod_bytes() to int. Also change | ||
18 | the return value on error to -EIO to make (err < 0) work. | ||
19 | |||
20 | Signed-off-by: Xi Wang <xi.wang@gmail.com> | ||
21 | Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | drivers/media/dvb/frontends/lgdt330x.c | 6 ++++-- | ||
25 | 1 file changed, 4 insertions(+), 2 deletions(-) | ||
26 | |||
27 | diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c | ||
28 | index 43971e6..aa63d68 100644 | ||
29 | --- a/drivers/media/dvb/frontends/lgdt330x.c | ||
30 | +++ b/drivers/media/dvb/frontends/lgdt330x.c | ||
31 | @@ -104,8 +104,8 @@ static int i2c_write_demod_bytes (struct lgdt330x_state* state, | ||
32 | * then reads the data returned for (len) bytes. | ||
33 | */ | ||
34 | |||
35 | -static u8 i2c_read_demod_bytes (struct lgdt330x_state* state, | ||
36 | - enum I2C_REG reg, u8* buf, int len) | ||
37 | +static int i2c_read_demod_bytes(struct lgdt330x_state *state, | ||
38 | + enum I2C_REG reg, u8 *buf, int len) | ||
39 | { | ||
40 | u8 wr [] = { reg }; | ||
41 | struct i2c_msg msg [] = { | ||
42 | @@ -118,6 +118,8 @@ static u8 i2c_read_demod_bytes (struct lgdt330x_state* state, | ||
43 | ret = i2c_transfer(state->i2c, msg, 2); | ||
44 | if (ret != 2) { | ||
45 | printk(KERN_WARNING "lgdt330x: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __func__, state->config->demod_address, reg, ret); | ||
46 | + if (ret >= 0) | ||
47 | + ret = -EIO; | ||
48 | } else { | ||
49 | ret = 0; | ||
50 | } | ||
51 | -- | ||
52 | 1.7.9.4 | ||
53 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0103-pvrusb2-fix-7MHz-8MHz-DVB-T-tuner-support-for-HVR190.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0103-pvrusb2-fix-7MHz-8MHz-DVB-T-tuner-support-for-HVR190.patch new file mode 100644 index 00000000..974e49d8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0103-pvrusb2-fix-7MHz-8MHz-DVB-T-tuner-support-for-HVR190.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From c0c8df72a8880f19b3d9631dc8c2298a533eeba0 Mon Sep 17 00:00:00 2001 | ||
2 | From: Michael Krufky <mkrufky@linuxtv.org> | ||
3 | Date: Tue, 7 Feb 2012 13:28:33 -0300 | ||
4 | Subject: [PATCH 103/147] pvrusb2: fix 7MHz & 8MHz DVB-T tuner support for | ||
5 | HVR1900 rev D1F5 | ||
6 | |||
7 | commit 9ab2393fc3e460cd2040de1483918eb17abb822f upstream. | ||
8 | |||
9 | The D1F5 revision of the WinTV HVR-1900 uses a tda18271c2 tuner | ||
10 | instead of a tda18271c1 tuner as used in revision D1E9. To | ||
11 | account for this, we must hardcode the frontend configuration | ||
12 | to use the same IF frequency configuration for both revisions | ||
13 | of the device. | ||
14 | |||
15 | 6MHz DVB-T is unaffected by this issue, as the recommended | ||
16 | IF Frequency configuration for 6MHz DVB-T is the same on both | ||
17 | c1 and c2 revisions of the tda18271 tuner. | ||
18 | |||
19 | Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> | ||
20 | Cc: Mike Isely <isely@pobox.com> | ||
21 | Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | drivers/media/video/pvrusb2/pvrusb2-devattr.c | 10 ++++++++++ | ||
25 | 1 file changed, 10 insertions(+) | ||
26 | |||
27 | diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/drivers/media/video/pvrusb2/pvrusb2-devattr.c | ||
28 | index c6da8f7..d8c8982 100644 | ||
29 | --- a/drivers/media/video/pvrusb2/pvrusb2-devattr.c | ||
30 | +++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.c | ||
31 | @@ -320,7 +320,17 @@ static struct tda829x_config tda829x_no_probe = { | ||
32 | .probe_tuner = TDA829X_DONT_PROBE, | ||
33 | }; | ||
34 | |||
35 | +static struct tda18271_std_map hauppauge_tda18271_dvbt_std_map = { | ||
36 | + .dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4, | ||
37 | + .if_lvl = 1, .rfagc_top = 0x37, }, | ||
38 | + .dvbt_7 = { .if_freq = 3800, .agc_mode = 3, .std = 5, | ||
39 | + .if_lvl = 1, .rfagc_top = 0x37, }, | ||
40 | + .dvbt_8 = { .if_freq = 4300, .agc_mode = 3, .std = 6, | ||
41 | + .if_lvl = 1, .rfagc_top = 0x37, }, | ||
42 | +}; | ||
43 | + | ||
44 | static struct tda18271_config hauppauge_tda18271_dvb_config = { | ||
45 | + .std_map = &hauppauge_tda18271_dvbt_std_map, | ||
46 | .gate = TDA18271_GATE_ANALOG, | ||
47 | .output_opt = TDA18271_OUTPUT_LT_OFF, | ||
48 | }; | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0104-mxl111sf-fix-error-on-stream-stop-in-mxl111sf_ep6_st.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0104-mxl111sf-fix-error-on-stream-stop-in-mxl111sf_ep6_st.patch new file mode 100644 index 00000000..2233e9a4 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0104-mxl111sf-fix-error-on-stream-stop-in-mxl111sf_ep6_st.patch | |||
@@ -0,0 +1,45 @@ | |||
1 | From 9b9105c08669b50ea9735b26116b0b094cdb2fbe Mon Sep 17 00:00:00 2001 | ||
2 | From: Michael Krufky <mkrufky@linuxtv.org> | ||
3 | Date: Sun, 18 Mar 2012 14:35:57 -0300 | ||
4 | Subject: [PATCH 104/147] mxl111sf: fix error on stream stop in | ||
5 | mxl111sf_ep6_streaming_ctrl() | ||
6 | |||
7 | commit 3be5bb71fbf18f83cb88b54a62a78e03e5a4f30a upstream. | ||
8 | |||
9 | Remove unnecessary register access in mxl111sf_ep6_streaming_ctrl() | ||
10 | |||
11 | This code breaks driver operation in kernel 3.3 and later, although | ||
12 | it works properly in 3.2 Disable register access to 0x12 for now. | ||
13 | |||
14 | Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> | ||
15 | Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/media/dvb/dvb-usb/mxl111sf.c | 6 ++---- | ||
19 | 1 file changed, 2 insertions(+), 4 deletions(-) | ||
20 | |||
21 | diff --git a/drivers/media/dvb/dvb-usb/mxl111sf.c b/drivers/media/dvb/dvb-usb/mxl111sf.c | ||
22 | index b5c98da..bc6ea9f 100644 | ||
23 | --- a/drivers/media/dvb/dvb-usb/mxl111sf.c | ||
24 | +++ b/drivers/media/dvb/dvb-usb/mxl111sf.c | ||
25 | @@ -351,15 +351,13 @@ static int mxl111sf_ep6_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | ||
26 | adap_state->ep6_clockphase, | ||
27 | 0, 0); | ||
28 | mxl_fail(ret); | ||
29 | +#if 0 | ||
30 | } else { | ||
31 | ret = mxl111sf_disable_656_port(state); | ||
32 | mxl_fail(ret); | ||
33 | +#endif | ||
34 | } | ||
35 | |||
36 | - mxl111sf_read_reg(state, 0x12, &tmp); | ||
37 | - tmp &= ~0x04; | ||
38 | - mxl111sf_write_reg(state, 0x12, tmp); | ||
39 | - | ||
40 | return ret; | ||
41 | } | ||
42 | |||
43 | -- | ||
44 | 1.7.9.4 | ||
45 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0105-NFSv4-Rate-limit-the-state-manager-warning-messages.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0105-NFSv4-Rate-limit-the-state-manager-warning-messages.patch new file mode 100644 index 00000000..f0065202 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0105-NFSv4-Rate-limit-the-state-manager-warning-messages.patch | |||
@@ -0,0 +1,78 @@ | |||
1 | From 44612d69c516879d31f7b6a4a49d00dfc49caf06 Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Mon, 12 Mar 2012 18:01:48 -0400 | ||
4 | Subject: [PATCH 105/147] NFSv4: Rate limit the state manager warning messages | ||
5 | |||
6 | commit 9a3ba432330e504ac61ff0043dbdaba7cea0e35a upstream. | ||
7 | |||
8 | Prevent the state manager from filling up system logs when recovery | ||
9 | fails on the server. | ||
10 | |||
11 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | fs/nfs/callback_xdr.c | 4 +++- | ||
15 | fs/nfs/nfs4proc.c | 2 +- | ||
16 | fs/nfs/nfs4state.c | 4 ++-- | ||
17 | 3 files changed, 6 insertions(+), 4 deletions(-) | ||
18 | |||
19 | diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c | ||
20 | index 726e59a..168cb93 100644 | ||
21 | --- a/fs/nfs/callback_xdr.c | ||
22 | +++ b/fs/nfs/callback_xdr.c | ||
23 | @@ -9,6 +9,8 @@ | ||
24 | #include <linux/sunrpc/svc.h> | ||
25 | #include <linux/nfs4.h> | ||
26 | #include <linux/nfs_fs.h> | ||
27 | +#include <linux/ratelimit.h> | ||
28 | +#include <linux/printk.h> | ||
29 | #include <linux/slab.h> | ||
30 | #include <linux/sunrpc/bc_xprt.h> | ||
31 | #include "nfs4_fs.h" | ||
32 | @@ -167,7 +169,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound | ||
33 | if (hdr->minorversion <= 1) { | ||
34 | hdr->cb_ident = ntohl(*p++); /* ignored by v4.1 */ | ||
35 | } else { | ||
36 | - printk(KERN_WARNING "%s: NFSv4 server callback with " | ||
37 | + pr_warn_ratelimited("NFS: %s: NFSv4 server callback with " | ||
38 | "illegal minor version %u!\n", | ||
39 | __func__, hdr->minorversion); | ||
40 | return htonl(NFS4ERR_MINOR_VERS_MISMATCH); | ||
41 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
42 | index 758e809..c9e2d9e 100644 | ||
43 | --- a/fs/nfs/nfs4proc.c | ||
44 | +++ b/fs/nfs/nfs4proc.c | ||
45 | @@ -1838,7 +1838,7 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, | ||
46 | * the user though... | ||
47 | */ | ||
48 | if (status == -NFS4ERR_BAD_SEQID) { | ||
49 | - printk(KERN_WARNING "NFS: v4 server %s " | ||
50 | + pr_warn_ratelimited("NFS: v4 server %s " | ||
51 | " returned a bad sequence-id error!\n", | ||
52 | NFS_SERVER(dir)->nfs_client->cl_hostname); | ||
53 | exception.retry = 1; | ||
54 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c | ||
55 | index 0596fd6..66020ac 100644 | ||
56 | --- a/fs/nfs/nfs4state.c | ||
57 | +++ b/fs/nfs/nfs4state.c | ||
58 | @@ -935,7 +935,7 @@ static void nfs_increment_seqid(int status, struct nfs_seqid *seqid) | ||
59 | case -NFS4ERR_BAD_SEQID: | ||
60 | if (seqid->sequence->flags & NFS_SEQID_CONFIRMED) | ||
61 | return; | ||
62 | - printk(KERN_WARNING "NFS: v4 server returned a bad" | ||
63 | + pr_warn_ratelimited("NFS: v4 server returned a bad" | ||
64 | " sequence-id error on an" | ||
65 | " unconfirmed sequence %p!\n", | ||
66 | seqid->sequence); | ||
67 | @@ -1764,7 +1764,7 @@ static void nfs4_state_manager(struct nfs_client *clp) | ||
68 | } while (atomic_read(&clp->cl_count) > 1); | ||
69 | return; | ||
70 | out_error: | ||
71 | - printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s" | ||
72 | + pr_warn_ratelimited("NFS: state manager failed on NFSv4 server %s" | ||
73 | " with error %d\n", clp->cl_hostname, -status); | ||
74 | nfs4_end_drain_session(clp); | ||
75 | nfs4_clear_state_manager_bit(clp); | ||
76 | -- | ||
77 | 1.7.9.4 | ||
78 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0106-PM-Hibernate-Enable-usermodehelpers-in-hibernate-err.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0106-PM-Hibernate-Enable-usermodehelpers-in-hibernate-err.patch new file mode 100644 index 00000000..8cd543c7 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0106-PM-Hibernate-Enable-usermodehelpers-in-hibernate-err.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | From 17b1d0787c9eea1fffe5432c14f53066ad2ff0c6 Mon Sep 17 00:00:00 2001 | ||
2 | From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com> | ||
3 | Date: Fri, 17 Feb 2012 23:39:51 +0100 | ||
4 | Subject: [PATCH 106/147] PM / Hibernate: Enable usermodehelpers in | ||
5 | hibernate() error path | ||
6 | |||
7 | commit 05b4877f6a4f1ba4952d1222213d262bf8c132b7 upstream. | ||
8 | |||
9 | If create_basic_memory_bitmaps() fails, usermodehelpers are not re-enabled | ||
10 | before returning. Fix this. And while at it, reword the goto labels so that | ||
11 | they look more meaningful. | ||
12 | |||
13 | Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> | ||
14 | Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | kernel/power/hibernate.c | 7 ++++--- | ||
18 | 1 file changed, 4 insertions(+), 3 deletions(-) | ||
19 | |||
20 | diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c | ||
21 | index 624538a..7c0d578 100644 | ||
22 | --- a/kernel/power/hibernate.c | ||
23 | +++ b/kernel/power/hibernate.c | ||
24 | @@ -648,7 +648,7 @@ int hibernate(void) | ||
25 | /* Allocate memory management structures */ | ||
26 | error = create_basic_memory_bitmaps(); | ||
27 | if (error) | ||
28 | - goto Exit; | ||
29 | + goto Enable_umh; | ||
30 | |||
31 | printk(KERN_INFO "PM: Syncing filesystems ... "); | ||
32 | sys_sync(); | ||
33 | @@ -656,7 +656,7 @@ int hibernate(void) | ||
34 | |||
35 | error = prepare_processes(); | ||
36 | if (error) | ||
37 | - goto Finish; | ||
38 | + goto Free_bitmaps; | ||
39 | |||
40 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); | ||
41 | if (error) | ||
42 | @@ -689,8 +689,9 @@ int hibernate(void) | ||
43 | |||
44 | Thaw: | ||
45 | thaw_processes(); | ||
46 | - Finish: | ||
47 | + Free_bitmaps: | ||
48 | free_basic_memory_bitmaps(); | ||
49 | + Enable_umh: | ||
50 | usermodehelper_enable(); | ||
51 | Exit: | ||
52 | pm_notifier_call_chain(PM_POST_HIBERNATION); | ||
53 | -- | ||
54 | 1.7.9.4 | ||
55 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0107-jbd2-clear-BH_Delay-BH_Unwritten-in-journal_unmap_bu.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0107-jbd2-clear-BH_Delay-BH_Unwritten-in-journal_unmap_bu.patch new file mode 100644 index 00000000..f105047a --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0107-jbd2-clear-BH_Delay-BH_Unwritten-in-journal_unmap_bu.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | From aa127d5abf17393b4f75c53be45124307b230542 Mon Sep 17 00:00:00 2001 | ||
2 | From: Eric Sandeen <sandeen@redhat.com> | ||
3 | Date: Mon, 20 Feb 2012 17:53:01 -0500 | ||
4 | Subject: [PATCH 107/147] jbd2: clear BH_Delay & BH_Unwritten in | ||
5 | journal_unmap_buffer | ||
6 | |||
7 | commit 15291164b22a357cb211b618adfef4fa82fc0de3 upstream. | ||
8 | |||
9 | journal_unmap_buffer()'s zap_buffer: code clears a lot of buffer head | ||
10 | state ala discard_buffer(), but does not touch _Delay or _Unwritten as | ||
11 | discard_buffer() does. | ||
12 | |||
13 | This can be problematic in some areas of the ext4 code which assume | ||
14 | that if they have found a buffer marked unwritten or delay, then it's | ||
15 | a live one. Perhaps those spots should check whether it is mapped | ||
16 | as well, but if jbd2 is going to tear down a buffer, let's really | ||
17 | tear it down completely. | ||
18 | |||
19 | Without this I get some fsx failures on sub-page-block filesystems | ||
20 | up until v3.2, at which point 4e96b2dbbf1d7e81f22047a50f862555a6cb87cb | ||
21 | and 189e868fa8fdca702eb9db9d8afc46b5cb9144c9 make the failures go | ||
22 | away, because buried within that large change is some more flag | ||
23 | clearing. I still think it's worth doing in jbd2, since | ||
24 | ->invalidatepage leads here directly, and it's the right place | ||
25 | to clear away these flags. | ||
26 | |||
27 | Signed-off-by: Eric Sandeen <sandeen@redhat.com> | ||
28 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
29 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
30 | --- | ||
31 | fs/jbd2/transaction.c | 2 ++ | ||
32 | 1 file changed, 2 insertions(+) | ||
33 | |||
34 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c | ||
35 | index a0e41a4..8267de5 100644 | ||
36 | --- a/fs/jbd2/transaction.c | ||
37 | +++ b/fs/jbd2/transaction.c | ||
38 | @@ -1948,6 +1948,8 @@ zap_buffer_unlocked: | ||
39 | clear_buffer_mapped(bh); | ||
40 | clear_buffer_req(bh); | ||
41 | clear_buffer_new(bh); | ||
42 | + clear_buffer_delay(bh); | ||
43 | + clear_buffer_unwritten(bh); | ||
44 | bh->b_bdev = NULL; | ||
45 | return may_free; | ||
46 | } | ||
47 | -- | ||
48 | 1.7.9.4 | ||
49 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0108-ext4-ignore-EXT4_INODE_JOURNAL_DATA-flag-with-delall.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0108-ext4-ignore-EXT4_INODE_JOURNAL_DATA-flag-with-delall.patch new file mode 100644 index 00000000..3837be55 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0108-ext4-ignore-EXT4_INODE_JOURNAL_DATA-flag-with-delall.patch | |||
@@ -0,0 +1,194 @@ | |||
1 | From 9a02204e0d49b5a0717822d1919f90768cef64ff Mon Sep 17 00:00:00 2001 | ||
2 | From: Lukas Czerner <lczerner@redhat.com> | ||
3 | Date: Mon, 20 Feb 2012 17:53:00 -0500 | ||
4 | Subject: [PATCH 108/147] ext4: ignore EXT4_INODE_JOURNAL_DATA flag with | ||
5 | delalloc | ||
6 | |||
7 | commit 3d2b158262826e8b75bbbfb7b97010838dd92ac7 upstream. | ||
8 | |||
9 | Ext4 does not support data journalling with delayed allocation enabled. | ||
10 | We even do not allow to mount the file system with delayed allocation | ||
11 | and data journalling enabled, however it can be set via FS_IOC_SETFLAGS | ||
12 | so we can hit the inode with EXT4_INODE_JOURNAL_DATA set even on file | ||
13 | system mounted with delayed allocation (default) and that's where | ||
14 | problem arises. The easies way to reproduce this problem is with the | ||
15 | following set of commands: | ||
16 | |||
17 | mkfs.ext4 /dev/sdd | ||
18 | mount /dev/sdd /mnt/test1 | ||
19 | dd if=/dev/zero of=/mnt/test1/file bs=1M count=4 | ||
20 | chattr +j /mnt/test1/file | ||
21 | dd if=/dev/zero of=/mnt/test1/file bs=1M count=4 conv=notrunc | ||
22 | chattr -j /mnt/test1/file | ||
23 | |||
24 | Additionally it can be reproduced quite reliably with xfstests 272 and | ||
25 | 269. In fact the above reproducer is a part of test 272. | ||
26 | |||
27 | To fix this we should ignore the EXT4_INODE_JOURNAL_DATA inode flag if | ||
28 | the file system is mounted with delayed allocation. This can be easily | ||
29 | done by fixing ext4_should_*_data() functions do ignore data journal | ||
30 | flag when delalloc is set (suggested by Ted). We also have to set the | ||
31 | appropriate address space operations for the inode (again, ignoring data | ||
32 | journal flag if delalloc enabled). | ||
33 | |||
34 | Additionally this commit introduces ext4_inode_journal_mode() function | ||
35 | because ext4_should_*_data() has already had a lot of common code and | ||
36 | this change is putting it all into one function so it is easier to | ||
37 | read. | ||
38 | |||
39 | Successfully tested with xfstests in following configurations: | ||
40 | |||
41 | delalloc + data=ordered | ||
42 | delalloc + data=writeback | ||
43 | data=journal | ||
44 | nodelalloc + data=ordered | ||
45 | nodelalloc + data=writeback | ||
46 | nodelalloc + data=journal | ||
47 | |||
48 | Signed-off-by: Lukas Czerner <lczerner@redhat.com> | ||
49 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
50 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
51 | --- | ||
52 | fs/ext4/ext4_jbd2.h | 56 ++++++++++++++++++++++++++------------------------- | ||
53 | fs/ext4/inode.c | 36 ++++++++++++++++++++------------- | ||
54 | 2 files changed, 51 insertions(+), 41 deletions(-) | ||
55 | |||
56 | diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h | ||
57 | index 5802fa1..95af6f8 100644 | ||
58 | --- a/fs/ext4/ext4_jbd2.h | ||
59 | +++ b/fs/ext4/ext4_jbd2.h | ||
60 | @@ -261,43 +261,45 @@ static inline void ext4_update_inode_fsync_trans(handle_t *handle, | ||
61 | /* super.c */ | ||
62 | int ext4_force_commit(struct super_block *sb); | ||
63 | |||
64 | -static inline int ext4_should_journal_data(struct inode *inode) | ||
65 | +/* | ||
66 | + * Ext4 inode journal modes | ||
67 | + */ | ||
68 | +#define EXT4_INODE_JOURNAL_DATA_MODE 0x01 /* journal data mode */ | ||
69 | +#define EXT4_INODE_ORDERED_DATA_MODE 0x02 /* ordered data mode */ | ||
70 | +#define EXT4_INODE_WRITEBACK_DATA_MODE 0x04 /* writeback data mode */ | ||
71 | + | ||
72 | +static inline int ext4_inode_journal_mode(struct inode *inode) | ||
73 | { | ||
74 | if (EXT4_JOURNAL(inode) == NULL) | ||
75 | - return 0; | ||
76 | - if (!S_ISREG(inode->i_mode)) | ||
77 | - return 1; | ||
78 | - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) | ||
79 | - return 1; | ||
80 | - if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) | ||
81 | - return 1; | ||
82 | - return 0; | ||
83 | + return EXT4_INODE_WRITEBACK_DATA_MODE; /* writeback */ | ||
84 | + /* We do not support data journalling with delayed allocation */ | ||
85 | + if (!S_ISREG(inode->i_mode) || | ||
86 | + test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) | ||
87 | + return EXT4_INODE_JOURNAL_DATA_MODE; /* journal data */ | ||
88 | + if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) && | ||
89 | + !test_opt(inode->i_sb, DELALLOC)) | ||
90 | + return EXT4_INODE_JOURNAL_DATA_MODE; /* journal data */ | ||
91 | + if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) | ||
92 | + return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */ | ||
93 | + if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) | ||
94 | + return EXT4_INODE_WRITEBACK_DATA_MODE; /* writeback */ | ||
95 | + else | ||
96 | + BUG(); | ||
97 | +} | ||
98 | + | ||
99 | +static inline int ext4_should_journal_data(struct inode *inode) | ||
100 | +{ | ||
101 | + return ext4_inode_journal_mode(inode) & EXT4_INODE_JOURNAL_DATA_MODE; | ||
102 | } | ||
103 | |||
104 | static inline int ext4_should_order_data(struct inode *inode) | ||
105 | { | ||
106 | - if (EXT4_JOURNAL(inode) == NULL) | ||
107 | - return 0; | ||
108 | - if (!S_ISREG(inode->i_mode)) | ||
109 | - return 0; | ||
110 | - if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) | ||
111 | - return 0; | ||
112 | - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) | ||
113 | - return 1; | ||
114 | - return 0; | ||
115 | + return ext4_inode_journal_mode(inode) & EXT4_INODE_ORDERED_DATA_MODE; | ||
116 | } | ||
117 | |||
118 | static inline int ext4_should_writeback_data(struct inode *inode) | ||
119 | { | ||
120 | - if (EXT4_JOURNAL(inode) == NULL) | ||
121 | - return 1; | ||
122 | - if (!S_ISREG(inode->i_mode)) | ||
123 | - return 0; | ||
124 | - if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) | ||
125 | - return 0; | ||
126 | - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) | ||
127 | - return 1; | ||
128 | - return 0; | ||
129 | + return ext4_inode_journal_mode(inode) & EXT4_INODE_WRITEBACK_DATA_MODE; | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
134 | index 9df447f..fbd2ea4 100644 | ||
135 | --- a/fs/ext4/inode.c | ||
136 | +++ b/fs/ext4/inode.c | ||
137 | @@ -2480,13 +2480,14 @@ static int ext4_da_write_end(struct file *file, | ||
138 | int write_mode = (int)(unsigned long)fsdata; | ||
139 | |||
140 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { | ||
141 | - if (ext4_should_order_data(inode)) { | ||
142 | + switch (ext4_inode_journal_mode(inode)) { | ||
143 | + case EXT4_INODE_ORDERED_DATA_MODE: | ||
144 | return ext4_ordered_write_end(file, mapping, pos, | ||
145 | len, copied, page, fsdata); | ||
146 | - } else if (ext4_should_writeback_data(inode)) { | ||
147 | + case EXT4_INODE_WRITEBACK_DATA_MODE: | ||
148 | return ext4_writeback_write_end(file, mapping, pos, | ||
149 | len, copied, page, fsdata); | ||
150 | - } else { | ||
151 | + default: | ||
152 | BUG(); | ||
153 | } | ||
154 | } | ||
155 | @@ -3084,18 +3085,25 @@ static const struct address_space_operations ext4_da_aops = { | ||
156 | |||
157 | void ext4_set_aops(struct inode *inode) | ||
158 | { | ||
159 | - if (ext4_should_order_data(inode) && | ||
160 | - test_opt(inode->i_sb, DELALLOC)) | ||
161 | - inode->i_mapping->a_ops = &ext4_da_aops; | ||
162 | - else if (ext4_should_order_data(inode)) | ||
163 | - inode->i_mapping->a_ops = &ext4_ordered_aops; | ||
164 | - else if (ext4_should_writeback_data(inode) && | ||
165 | - test_opt(inode->i_sb, DELALLOC)) | ||
166 | - inode->i_mapping->a_ops = &ext4_da_aops; | ||
167 | - else if (ext4_should_writeback_data(inode)) | ||
168 | - inode->i_mapping->a_ops = &ext4_writeback_aops; | ||
169 | - else | ||
170 | + switch (ext4_inode_journal_mode(inode)) { | ||
171 | + case EXT4_INODE_ORDERED_DATA_MODE: | ||
172 | + if (test_opt(inode->i_sb, DELALLOC)) | ||
173 | + inode->i_mapping->a_ops = &ext4_da_aops; | ||
174 | + else | ||
175 | + inode->i_mapping->a_ops = &ext4_ordered_aops; | ||
176 | + break; | ||
177 | + case EXT4_INODE_WRITEBACK_DATA_MODE: | ||
178 | + if (test_opt(inode->i_sb, DELALLOC)) | ||
179 | + inode->i_mapping->a_ops = &ext4_da_aops; | ||
180 | + else | ||
181 | + inode->i_mapping->a_ops = &ext4_writeback_aops; | ||
182 | + break; | ||
183 | + case EXT4_INODE_JOURNAL_DATA_MODE: | ||
184 | inode->i_mapping->a_ops = &ext4_journalled_aops; | ||
185 | + break; | ||
186 | + default: | ||
187 | + BUG(); | ||
188 | + } | ||
189 | } | ||
190 | |||
191 | |||
192 | -- | ||
193 | 1.7.9.4 | ||
194 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0109-ext4-fix-race-between-unwritten-extent-conversion-an.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0109-ext4-fix-race-between-unwritten-extent-conversion-an.patch new file mode 100644 index 00000000..7dd5d508 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0109-ext4-fix-race-between-unwritten-extent-conversion-an.patch | |||
@@ -0,0 +1,90 @@ | |||
1 | From 650bb7d911ba40c634964921badb10e175276089 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jeff Moyer <jmoyer@redhat.com> | ||
3 | Date: Mon, 20 Feb 2012 17:59:24 -0500 | ||
4 | Subject: [PATCH 109/147] ext4: fix race between unwritten extent conversion | ||
5 | and truncate | ||
6 | |||
7 | commit 266991b13890049ee1a6bb95b9817f06339ee3d7 upstream. | ||
8 | |||
9 | The following comment in ext4_end_io_dio caught my attention: | ||
10 | |||
11 | /* XXX: probably should move into the real I/O completion handler */ | ||
12 | inode_dio_done(inode); | ||
13 | |||
14 | The truncate code takes i_mutex, then calls inode_dio_wait. Because the | ||
15 | ext4 code path above will end up dropping the mutex before it is | ||
16 | reacquired by the worker thread that does the extent conversion, it | ||
17 | seems to me that the truncate can happen out of order. Jan Kara | ||
18 | mentioned that this might result in error messages in the system logs, | ||
19 | but that should be the extent of the "damage." | ||
20 | |||
21 | The fix is pretty straight-forward: don't call inode_dio_done until the | ||
22 | extent conversion is complete. | ||
23 | |||
24 | Reviewed-by: Jan Kara <jack@suse.cz> | ||
25 | Signed-off-by: Jeff Moyer <jmoyer@redhat.com> | ||
26 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
27 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
28 | --- | ||
29 | fs/ext4/ext4.h | 1 + | ||
30 | fs/ext4/inode.c | 10 +++++----- | ||
31 | fs/ext4/page-io.c | 2 ++ | ||
32 | 3 files changed, 8 insertions(+), 5 deletions(-) | ||
33 | |||
34 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
35 | index 5b0e26a..655d942 100644 | ||
36 | --- a/fs/ext4/ext4.h | ||
37 | +++ b/fs/ext4/ext4.h | ||
38 | @@ -184,6 +184,7 @@ struct mpage_da_data { | ||
39 | #define EXT4_IO_END_UNWRITTEN 0x0001 | ||
40 | #define EXT4_IO_END_ERROR 0x0002 | ||
41 | #define EXT4_IO_END_QUEUED 0x0004 | ||
42 | +#define EXT4_IO_END_DIRECT 0x0008 | ||
43 | |||
44 | struct ext4_io_page { | ||
45 | struct page *p_page; | ||
46 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
47 | index fbd2ea4..d0dc109 100644 | ||
48 | --- a/fs/ext4/inode.c | ||
49 | +++ b/fs/ext4/inode.c | ||
50 | @@ -2794,9 +2794,6 @@ out: | ||
51 | |||
52 | /* queue the work to convert unwritten extents to written */ | ||
53 | queue_work(wq, &io_end->work); | ||
54 | - | ||
55 | - /* XXX: probably should move into the real I/O completion handler */ | ||
56 | - inode_dio_done(inode); | ||
57 | } | ||
58 | |||
59 | static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) | ||
60 | @@ -2920,9 +2917,12 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | ||
61 | iocb->private = NULL; | ||
62 | EXT4_I(inode)->cur_aio_dio = NULL; | ||
63 | if (!is_sync_kiocb(iocb)) { | ||
64 | - iocb->private = ext4_init_io_end(inode, GFP_NOFS); | ||
65 | - if (!iocb->private) | ||
66 | + ext4_io_end_t *io_end = | ||
67 | + ext4_init_io_end(inode, GFP_NOFS); | ||
68 | + if (!io_end) | ||
69 | return -ENOMEM; | ||
70 | + io_end->flag |= EXT4_IO_END_DIRECT; | ||
71 | + iocb->private = io_end; | ||
72 | /* | ||
73 | * we save the io structure for current async | ||
74 | * direct IO, so that later ext4_map_blocks() | ||
75 | diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c | ||
76 | index 7e106c8..924298a 100644 | ||
77 | --- a/fs/ext4/page-io.c | ||
78 | +++ b/fs/ext4/page-io.c | ||
79 | @@ -111,6 +111,8 @@ int ext4_end_io_nolock(ext4_io_end_t *io) | ||
80 | if (io->iocb) | ||
81 | aio_complete(io->iocb, io->result, 0); | ||
82 | |||
83 | + if (io->flag & EXT4_IO_END_DIRECT) | ||
84 | + inode_dio_done(inode); | ||
85 | /* Wake up anyone waiting on unwritten extent conversion */ | ||
86 | if (atomic_dec_and_test(&EXT4_I(inode)->i_aiodio_unwritten)) | ||
87 | wake_up_all(ext4_ioend_wq(io->inode)); | ||
88 | -- | ||
89 | 1.7.9.4 | ||
90 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0110-ext4-fix-race-between-sync-and-completed-io-work.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0110-ext4-fix-race-between-sync-and-completed-io-work.patch new file mode 100644 index 00000000..fa0f39e0 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0110-ext4-fix-race-between-sync-and-completed-io-work.patch | |||
@@ -0,0 +1,119 @@ | |||
1 | From 4eb9698d0d2e5fb6c0cd910ed3e86154b4d1ea92 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jeff Moyer <jmoyer@redhat.com> | ||
3 | Date: Mon, 5 Mar 2012 10:29:52 -0500 | ||
4 | Subject: [PATCH 110/147] ext4: fix race between sync and completed io work | ||
5 | |||
6 | commit 491caa43639abcffaa645fbab372a7ef4ce2975c upstream. | ||
7 | |||
8 | The following command line will leave the aio-stress process unkillable | ||
9 | on an ext4 file system (in my case, mounted on /mnt/test): | ||
10 | |||
11 | aio-stress -t 20 -s 10 -O -S -o 2 -I 1000 /mnt/test/aiostress.3561.4 /mnt/test/aiostress.3561.4.20 /mnt/test/aiostress.3561.4.19 /mnt/test/aiostress.3561.4.18 /mnt/test/aiostress.3561.4.17 /mnt/test/aiostress.3561.4.16 /mnt/test/aiostress.3561.4.15 /mnt/test/aiostress.3561.4.14 /mnt/test/aiostress.3561.4.13 /mnt/test/aiostress.3561.4.12 /mnt/test/aiostress.3561.4.11 /mnt/test/aiostress.3561.4.10 /mnt/test/aiostress.3561.4.9 /mnt/test/aiostress.3561.4.8 /mnt/test/aiostress.3561.4.7 /mnt/test/aiostress.3561.4.6 /mnt/test/aiostress.3561.4.5 /mnt/test/aiostress.3561.4.4 /mnt/test/aiostress.3561.4.3 /mnt/test/aiostress.3561.4.2 | ||
12 | |||
13 | This is using the aio-stress program from the xfstests test suite. | ||
14 | That particular command line tells aio-stress to do random writes to | ||
15 | 20 files from 20 threads (one thread per file). The files are NOT | ||
16 | preallocated, so you will get writes to random offsets within the | ||
17 | file, thus creating holes and extending i_size. It also opens the | ||
18 | file with O_DIRECT and O_SYNC. | ||
19 | |||
20 | On to the problem. When an I/O requires unwritten extent conversion, | ||
21 | it is queued onto the completed_io_list for the ext4 inode. Two code | ||
22 | paths will pull work items from this list. The first is the | ||
23 | ext4_end_io_work routine, and the second is ext4_flush_completed_IO, | ||
24 | which is called via the fsync path (and O_SYNC handling, as well). | ||
25 | There are two issues I've found in these code paths. First, if the | ||
26 | fsync path beats the work routine to a particular I/O, the work | ||
27 | routine will free the io_end structure! It does not take into account | ||
28 | the fact that the io_end may still be in use by the fsync path. I've | ||
29 | fixed this issue by adding yet another IO_END flag, indicating that | ||
30 | the io_end is being processed by the fsync path. | ||
31 | |||
32 | The second problem is that the work routine will make an assignment to | ||
33 | io->flag outside of the lock. I have witnessed this result in a hang | ||
34 | at umount. Moving the flag setting inside the lock resolved that | ||
35 | problem. | ||
36 | |||
37 | The problem was introduced by commit b82e384c7b ("ext4: optimize | ||
38 | locking for end_io extent conversion"), which first appeared in 3.2. | ||
39 | As such, the fix should be backported to that release (probably along | ||
40 | with the unwritten extent conversion race fix). | ||
41 | |||
42 | Signed-off-by: Jeff Moyer <jmoyer@redhat.com> | ||
43 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
44 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
45 | --- | ||
46 | fs/ext4/ext4.h | 1 + | ||
47 | fs/ext4/fsync.c | 2 ++ | ||
48 | fs/ext4/page-io.c | 9 +++++++-- | ||
49 | 3 files changed, 10 insertions(+), 2 deletions(-) | ||
50 | |||
51 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
52 | index 655d942..dbae4d9 100644 | ||
53 | --- a/fs/ext4/ext4.h | ||
54 | +++ b/fs/ext4/ext4.h | ||
55 | @@ -185,6 +185,7 @@ struct mpage_da_data { | ||
56 | #define EXT4_IO_END_ERROR 0x0002 | ||
57 | #define EXT4_IO_END_QUEUED 0x0004 | ||
58 | #define EXT4_IO_END_DIRECT 0x0008 | ||
59 | +#define EXT4_IO_END_IN_FSYNC 0x0010 | ||
60 | |||
61 | struct ext4_io_page { | ||
62 | struct page *p_page; | ||
63 | diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c | ||
64 | index 00a2cb7..bb6c7d8 100644 | ||
65 | --- a/fs/ext4/fsync.c | ||
66 | +++ b/fs/ext4/fsync.c | ||
67 | @@ -89,6 +89,7 @@ int ext4_flush_completed_IO(struct inode *inode) | ||
68 | io = list_entry(ei->i_completed_io_list.next, | ||
69 | ext4_io_end_t, list); | ||
70 | list_del_init(&io->list); | ||
71 | + io->flag |= EXT4_IO_END_IN_FSYNC; | ||
72 | /* | ||
73 | * Calling ext4_end_io_nolock() to convert completed | ||
74 | * IO to written. | ||
75 | @@ -108,6 +109,7 @@ int ext4_flush_completed_IO(struct inode *inode) | ||
76 | if (ret < 0) | ||
77 | ret2 = ret; | ||
78 | spin_lock_irqsave(&ei->i_completed_io_lock, flags); | ||
79 | + io->flag &= ~EXT4_IO_END_IN_FSYNC; | ||
80 | } | ||
81 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | ||
82 | return (ret2 < 0) ? ret2 : 0; | ||
83 | diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c | ||
84 | index 924298a..24feb1c 100644 | ||
85 | --- a/fs/ext4/page-io.c | ||
86 | +++ b/fs/ext4/page-io.c | ||
87 | @@ -130,12 +130,18 @@ static void ext4_end_io_work(struct work_struct *work) | ||
88 | unsigned long flags; | ||
89 | |||
90 | spin_lock_irqsave(&ei->i_completed_io_lock, flags); | ||
91 | + if (io->flag & EXT4_IO_END_IN_FSYNC) | ||
92 | + goto requeue; | ||
93 | if (list_empty(&io->list)) { | ||
94 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | ||
95 | goto free; | ||
96 | } | ||
97 | |||
98 | if (!mutex_trylock(&inode->i_mutex)) { | ||
99 | + bool was_queued; | ||
100 | +requeue: | ||
101 | + was_queued = !!(io->flag & EXT4_IO_END_QUEUED); | ||
102 | + io->flag |= EXT4_IO_END_QUEUED; | ||
103 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | ||
104 | /* | ||
105 | * Requeue the work instead of waiting so that the work | ||
106 | @@ -148,9 +154,8 @@ static void ext4_end_io_work(struct work_struct *work) | ||
107 | * yield the cpu if it sees an end_io request that has already | ||
108 | * been requeued. | ||
109 | */ | ||
110 | - if (io->flag & EXT4_IO_END_QUEUED) | ||
111 | + if (was_queued) | ||
112 | yield(); | ||
113 | - io->flag |= EXT4_IO_END_QUEUED; | ||
114 | return; | ||
115 | } | ||
116 | list_del_init(&io->list); | ||
117 | -- | ||
118 | 1.7.9.4 | ||
119 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0111-ext4-check-for-zero-length-extent.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0111-ext4-check-for-zero-length-extent.patch new file mode 100644 index 00000000..4a83f033 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0111-ext4-check-for-zero-length-extent.patch | |||
@@ -0,0 +1,41 @@ | |||
1 | From 3a71b922c02de36168d14ec55a97582f3fec2e07 Mon Sep 17 00:00:00 2001 | ||
2 | From: Theodore Ts'o <tytso@mit.edu> | ||
3 | Date: Sun, 11 Mar 2012 23:30:16 -0400 | ||
4 | Subject: [PATCH 111/147] ext4: check for zero length extent | ||
5 | |||
6 | commit 31d4f3a2f3c73f279ff96a7135d7202ef6833f12 upstream. | ||
7 | |||
8 | Explicitly test for an extent whose length is zero, and flag that as a | ||
9 | corrupted extent. | ||
10 | |||
11 | This avoids a kernel BUG_ON assertion failure. | ||
12 | |||
13 | Tested: Without this patch, the file system image found in | ||
14 | tests/f_ext_zero_len/image.gz in the latest e2fsprogs sources causes a | ||
15 | kernel panic. With this patch, an ext4 file system error is noted | ||
16 | instead, and the file system is marked as being corrupted. | ||
17 | |||
18 | https://bugzilla.kernel.org/show_bug.cgi?id=42859 | ||
19 | |||
20 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | fs/ext4/extents.c | 2 ++ | ||
24 | 1 file changed, 2 insertions(+) | ||
25 | |||
26 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
27 | index 607b155..7507036 100644 | ||
28 | --- a/fs/ext4/extents.c | ||
29 | +++ b/fs/ext4/extents.c | ||
30 | @@ -301,6 +301,8 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) | ||
31 | ext4_fsblk_t block = ext4_ext_pblock(ext); | ||
32 | int len = ext4_ext_get_actual_len(ext); | ||
33 | |||
34 | + if (len == 0) | ||
35 | + return 0; | ||
36 | return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); | ||
37 | } | ||
38 | |||
39 | -- | ||
40 | 1.7.9.4 | ||
41 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0112-vfs-fix-d_ancestor-case-in-d_materialize_unique.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0112-vfs-fix-d_ancestor-case-in-d_materialize_unique.patch new file mode 100644 index 00000000..333e3bd8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0112-vfs-fix-d_ancestor-case-in-d_materialize_unique.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From 1287e09097b8199407c64d26e9a3ce1a1b25da74 Mon Sep 17 00:00:00 2001 | ||
2 | From: Michel Lespinasse <walken@google.com> | ||
3 | Date: Mon, 26 Mar 2012 17:32:44 -0700 | ||
4 | Subject: [PATCH 112/147] vfs: fix d_ancestor() case in d_materialize_unique | ||
5 | |||
6 | commit b18dafc86bb879d2f38a1743985d7ceb283c2f4d upstream. | ||
7 | |||
8 | In d_materialise_unique() there are 3 subcases to the 'aliased dentry' | ||
9 | case; in two subcases the inode i_lock is properly released but this | ||
10 | does not occur in the -ELOOP subcase. | ||
11 | |||
12 | This seems to have been introduced by commit 1836750115f2 ("fix loop | ||
13 | checks in d_materialise_unique()"). | ||
14 | |||
15 | Signed-off-by: Michel Lespinasse <walken@google.com> | ||
16 | [ Added a comment, and moved the unlock to where we generate the -ELOOP, | ||
17 | which seems to be more natural. | ||
18 | |||
19 | You probably can't actually trigger this without a buggy network file | ||
20 | server - d_materialize_unique() is for finding aliases on non-local | ||
21 | filesystems, and the d_ancestor() case is for a hardlinked directory | ||
22 | loop. | ||
23 | |||
24 | But we should be robust in the case of such buggy servers anyway. ] | ||
25 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
27 | --- | ||
28 | fs/dcache.c | 3 ++- | ||
29 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
30 | |||
31 | diff --git a/fs/dcache.c b/fs/dcache.c | ||
32 | index f7908ae..eb723d3 100644 | ||
33 | --- a/fs/dcache.c | ||
34 | +++ b/fs/dcache.c | ||
35 | @@ -2357,6 +2357,7 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) | ||
36 | if (d_ancestor(alias, dentry)) { | ||
37 | /* Check for loops */ | ||
38 | actual = ERR_PTR(-ELOOP); | ||
39 | + spin_unlock(&inode->i_lock); | ||
40 | } else if (IS_ROOT(alias)) { | ||
41 | /* Is this an anonymous mountpoint that we | ||
42 | * could splice into our tree? */ | ||
43 | @@ -2366,7 +2367,7 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) | ||
44 | goto found; | ||
45 | } else { | ||
46 | /* Nope, but we must(!) avoid directory | ||
47 | - * aliasing */ | ||
48 | + * aliasing. This drops inode->i_lock */ | ||
49 | actual = __d_unalias(inode, dentry, alias); | ||
50 | } | ||
51 | write_sequnlock(&rename_lock); | ||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0113-ARM-tegra-select-required-CPU-and-L2-errata-options.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0113-ARM-tegra-select-required-CPU-and-L2-errata-options.patch new file mode 100644 index 00000000..88fa5551 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0113-ARM-tegra-select-required-CPU-and-L2-errata-options.patch | |||
@@ -0,0 +1,56 @@ | |||
1 | From b125bf4a63e80e83526c1e1f775446078c91374f Mon Sep 17 00:00:00 2001 | ||
2 | From: Stephen Warren <swarren@nvidia.com> | ||
3 | Date: Tue, 14 Feb 2012 13:39:39 -0700 | ||
4 | Subject: [PATCH 113/147] ARM: tegra: select required CPU and L2 errata | ||
5 | options | ||
6 | |||
7 | commit f35b431dde39fb40944d1024f08d88fbf04a3193 upstream. | ||
8 | |||
9 | The ARM IP revisions in Tegra are: | ||
10 | Tegra20: CPU r1p1, PL310 r2p0 | ||
11 | Tegra30: CPU A01=r2p7/>=A02=r2p9, NEON r2p3-50, PL310 r3p1-50 | ||
12 | |||
13 | Based on work by Olof Johansson, although the actual list of errata is | ||
14 | somewhat different here, since I added a bunch more and removed one PL310 | ||
15 | erratum that doesn't seem applicable. | ||
16 | |||
17 | Signed-off-by: Stephen Warren <swarren@nvidia.com> | ||
18 | Signed-off-by: Olof Johansson <olof@lixom.net> | ||
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
20 | --- | ||
21 | arch/arm/mach-tegra/Kconfig | 12 ++++++++++++ | ||
22 | 1 file changed, 12 insertions(+) | ||
23 | |||
24 | diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig | ||
25 | index 91aff7c..dbc59fa 100644 | ||
26 | --- a/arch/arm/mach-tegra/Kconfig | ||
27 | +++ b/arch/arm/mach-tegra/Kconfig | ||
28 | @@ -13,6 +13,13 @@ config ARCH_TEGRA_2x_SOC | ||
29 | select USB_ARCH_HAS_EHCI if USB_SUPPORT | ||
30 | select USB_ULPI if USB_SUPPORT | ||
31 | select USB_ULPI_VIEWPORT if USB_SUPPORT | ||
32 | + select ARM_ERRATA_720789 | ||
33 | + select ARM_ERRATA_742230 | ||
34 | + select ARM_ERRATA_751472 | ||
35 | + select ARM_ERRATA_754327 | ||
36 | + select ARM_ERRATA_764369 | ||
37 | + select PL310_ERRATA_727915 if CACHE_L2X0 | ||
38 | + select PL310_ERRATA_769419 if CACHE_L2X0 | ||
39 | help | ||
40 | Support for NVIDIA Tegra AP20 and T20 processors, based on the | ||
41 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller | ||
42 | @@ -54,6 +61,11 @@ config MACH_SEABOARD | ||
43 | config MACH_TEGRA_DT | ||
44 | bool "Generic Tegra board (FDT support)" | ||
45 | select USE_OF | ||
46 | + select ARM_ERRATA_743622 | ||
47 | + select ARM_ERRATA_751472 | ||
48 | + select ARM_ERRATA_754322 | ||
49 | + select ARM_ERRATA_764369 | ||
50 | + select PL310_ERRATA_769419 if CACHE_L2X0 | ||
51 | help | ||
52 | Support for generic nVidia Tegra boards using Flattened Device Tree | ||
53 | |||
54 | -- | ||
55 | 1.7.9.4 | ||
56 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0114-udf-Fix-deadlock-in-udf_release_file.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0114-udf-Fix-deadlock-in-udf_release_file.patch new file mode 100644 index 00000000..ae80b769 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0114-udf-Fix-deadlock-in-udf_release_file.patch | |||
@@ -0,0 +1,40 @@ | |||
1 | From e812277ff9241a705c2a789f889aab4d1c26c31c Mon Sep 17 00:00:00 2001 | ||
2 | From: Jan Kara <jack@suse.cz> | ||
3 | Date: Mon, 20 Feb 2012 17:49:56 +0100 | ||
4 | Subject: [PATCH 114/147] udf: Fix deadlock in udf_release_file() | ||
5 | |||
6 | commit a0391a3ae91d301c0e59368531a4de5f0b122bcf upstream. | ||
7 | |||
8 | udf_release_file() can be called from munmap() path with mmap_sem held. Thus | ||
9 | we cannot take i_mutex there because that ranks above mmap_sem. Luckily, | ||
10 | i_mutex is not needed in udf_release_file() anymore since protection by | ||
11 | i_data_sem is enough to protect from races with write and truncate. | ||
12 | |||
13 | Reported-by: Al Viro <viro@ZenIV.linux.org.uk> | ||
14 | Reviewed-by: Namjae Jeon <linkinjeon@gmail.com> | ||
15 | Signed-off-by: Jan Kara <jack@suse.cz> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | fs/udf/file.c | 2 -- | ||
19 | 1 file changed, 2 deletions(-) | ||
20 | |||
21 | diff --git a/fs/udf/file.c b/fs/udf/file.c | ||
22 | index dca0c38..d567b84 100644 | ||
23 | --- a/fs/udf/file.c | ||
24 | +++ b/fs/udf/file.c | ||
25 | @@ -201,12 +201,10 @@ out: | ||
26 | static int udf_release_file(struct inode *inode, struct file *filp) | ||
27 | { | ||
28 | if (filp->f_mode & FMODE_WRITE) { | ||
29 | - mutex_lock(&inode->i_mutex); | ||
30 | down_write(&UDF_I(inode)->i_data_sem); | ||
31 | udf_discard_prealloc(inode); | ||
32 | udf_truncate_tail_extent(inode); | ||
33 | up_write(&UDF_I(inode)->i_data_sem); | ||
34 | - mutex_unlock(&inode->i_mutex); | ||
35 | } | ||
36 | return 0; | ||
37 | } | ||
38 | -- | ||
39 | 1.7.9.4 | ||
40 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0115-gpio-omap-fix-_set_gpio_irqenable-implementation.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0115-gpio-omap-fix-_set_gpio_irqenable-implementation.patch new file mode 100644 index 00000000..03e2035e --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0115-gpio-omap-fix-_set_gpio_irqenable-implementation.patch | |||
@@ -0,0 +1,41 @@ | |||
1 | From 5f5e1bcdbe3347e680007e30b5848a8a3826f68b Mon Sep 17 00:00:00 2001 | ||
2 | From: Tarun Kanti DebBarma <tarun.kanti@ti.com> | ||
3 | Date: Fri, 25 Nov 2011 15:27:37 +0530 | ||
4 | Subject: [PATCH 115/147] gpio/omap: fix _set_gpio_irqenable implementation | ||
5 | |||
6 | commit 8276536cec38bc6bde30d0aa67716f22b9b9705a upstream. | ||
7 | |||
8 | This function should be capable of both enabling and disabling interrupts | ||
9 | based upon the *enable* parameter. Right now the function only enables | ||
10 | the interrupt and *enable* is not used at all. So add the interrupt | ||
11 | disable capability also using the parameter. | ||
12 | |||
13 | Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> | ||
14 | Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
15 | Acked-by: Felipe Balbi <balbi@ti.com> | ||
16 | Reviewed-by: Kevin Hilman <khilman@ti.com> | ||
17 | Signed-off-by: Kevin Hilman <khilman@ti.com> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/gpio/gpio-omap.c | 5 ++++- | ||
21 | 1 file changed, 4 insertions(+), 1 deletion(-) | ||
22 | |||
23 | diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c | ||
24 | index 4b172446..7fe6897 100644 | ||
25 | --- a/drivers/gpio/gpio-omap.c | ||
26 | +++ b/drivers/gpio/gpio-omap.c | ||
27 | @@ -511,7 +511,10 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | ||
28 | |||
29 | static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) | ||
30 | { | ||
31 | - _enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | ||
32 | + if (enable) | ||
33 | + _enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | ||
34 | + else | ||
35 | + _disable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | -- | ||
40 | 1.7.9.4 | ||
41 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0116-gpio-davinci-fix-oops-on-unbanked-gpio-irq-request.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0116-gpio-davinci-fix-oops-on-unbanked-gpio-irq-request.patch new file mode 100644 index 00000000..a6cd5ec8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0116-gpio-davinci-fix-oops-on-unbanked-gpio-irq-request.patch | |||
@@ -0,0 +1,152 @@ | |||
1 | From e91fedbcc83a758adab48636c9ba73338326a3b7 Mon Sep 17 00:00:00 2001 | ||
2 | From: Sekhar Nori <nsekhar@ti.com> | ||
3 | Date: Sun, 11 Mar 2012 18:16:11 +0530 | ||
4 | Subject: [PATCH 116/147] gpio/davinci: fix oops on unbanked gpio irq request | ||
5 | |||
6 | commit ab2dde9924dd1ddb791fa8b14aa52e1df681e20c upstream. | ||
7 | |||
8 | Unbanked GPIO irq setup code was overwriting chip_data leading | ||
9 | to the following oops on request_irq() | ||
10 | |||
11 | Unable to handle kernel paging request at virtual address febfffff | ||
12 | pgd = c22dc000 | ||
13 | [febfffff] *pgd=00000000 | ||
14 | Internal error: Oops: 801 [#1] PREEMPT | ||
15 | Modules linked in: mcu(+) edmak irqk cmemk | ||
16 | CPU: 0 Not tainted (3.0.0-rc7+ #93) | ||
17 | PC is at irq_gc_mask_set_bit+0x68/0x7c | ||
18 | LR is at vprintk+0x22c/0x484 | ||
19 | pc : [<c0080c0c>] lr : [<c00457e0>] psr: 60000093 | ||
20 | sp : c33e3ba0 ip : c33e3af0 fp : c33e3bc4 | ||
21 | r10: c04555bc r9 : c33d4340 r8 : 60000013 | ||
22 | r7 : 0000002d r6 : c04555bc r5 : fec67010 r4 : 00000000 | ||
23 | r3 : c04734c8 r2 : fec00000 r1 : ffffffff r0 : 00000026 | ||
24 | Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user | ||
25 | Control: 0005317f Table: 822dc000 DAC: 00000015 | ||
26 | Process modprobe (pid: 526, stack limit = 0xc33e2270) | ||
27 | Stack: (0xc33e3ba0 to 0xc33e4000) | ||
28 | 3ba0: 00000000 c007d3d4 c33e3bcc c04555bc c04555bc c33d4340 c33e3bdc c33e3bc8 | ||
29 | 3bc0: c007f5f8 c0080bb4 00000000 c04555bc c33e3bf4 c33e3be0 c007f654 c007f5c0 | ||
30 | 3be0: 00000000 c04555bc c33e3c24 c33e3bf8 c007e6e8 c007f618 c01f2284 c0350af8 | ||
31 | 3c00: c0405214 bf016c98 00000001 00000000 c33dc008 0000002d c33e3c54 c33e3c28 | ||
32 | 3c20: c007e888 c007e408 00000001 c23ef880 c33dc000 00000000 c33dc080 c25caa00 | ||
33 | 3c40: c0487498 bf017078 c33e3c94 c33e3c58 bf016b44 c007e7d4 bf017078 c33dc008 | ||
34 | 3c60: c25caa08 c33dc008 c33e3c84 bf017484 c25caa00 c25caa00 c01f5f48 c25caa08 | ||
35 | 3c80: c0496d60 bf017484 c33e3ca4 c33e3c98 c022a698 bf01692c c33e3cd4 c33e3ca8 | ||
36 | 3ca0: c01f5d88 c022a688 00000000 bf017484 c25caa00 c25caa00 c01f5f48 c25caa08 | ||
37 | 3cc0: c0496d60 00000000 c33e3cec c33e3cd8 c01f5f8c c01f5d10 00000000 c33e3cf0 | ||
38 | 3ce0: c33e3d14 c33e3cf0 c01f5210 c01f5f58 c303cb48 c25ecf94 c25caa00 c25caa00 | ||
39 | 3d00: c25caa34 c33e3dd8 c33e3d34 c33e3d18 c01f6044 c01f51b8 c0496d3c c25caa00 | ||
40 | 3d20: c044e918 c33e3dd8 c33e3d44 c33e3d38 c01f4ff4 c01f5fcc c33e3d94 c33e3d48 | ||
41 | 3d40: c01f3d10 c01f4fd8 00000000 c044e918 00000000 00000000 c01f52c0 c034d570 | ||
42 | 3d60: c33e3d84 c33e3d70 c022bf84 c25caa00 00000000 c044e918 c33e3dd8 c25c2e00 | ||
43 | 3d80: c0496d60 bf01763c c33e3db4 c33e3d98 c022b1a0 c01f384c c25caa00 c33e3dd8 | ||
44 | 3da0: 00000000 c33e3dd8 c33e3dd4 c33e3db8 c022b27c c022b0e8 00000000 bf01763c | ||
45 | 3dc0: c0451c80 c33e3dd8 c33e3e34 c33e3dd8 bf016f60 c022b210 5f75636d 746e6f63 | ||
46 | 3de0: 006c6f72 00000000 00000000 00000000 00000000 00000000 00000000 bf0174bc | ||
47 | 3e00: 00000000 00989680 00000000 00000020 c0451c80 c0451c80 bf0174dc c01f5eb0 | ||
48 | 3e20: c33f0f00 bf0174dc c33e3e44 c33e3e38 c01f72f4 bf016e2c c33e3e74 c33e3e48 | ||
49 | 3e40: c01f5d88 c01f72e4 00000000 c0451c80 c0451cb4 bf0174dc c01f5eb0 c33f0f00 | ||
50 | 3e60: c0473100 00000000 c33e3e94 c33e3e78 c01f5f44 c01f5d10 00000000 c33e3e98 | ||
51 | 3e80: bf0174dc c01f5eb0 c33e3ebc c33e3e98 c01f5534 c01f5ec0 c303c038 c3061c30 | ||
52 | 3ea0: 00003cd8 00098258 bf0174dc c0462ac8 c33e3ecc c33e3ec0 c01f5bec c01f54dc | ||
53 | 3ec0: c33e3efc c33e3ed0 c01f4d30 c01f5bdc bf0173a0 c33e2000 00003cd8 00098258 | ||
54 | 3ee0: bf0174dc c33e2000 c00301a4 bf019000 c33e3f1c c33e3f00 c01f6588 c01f4c8c | ||
55 | 3f00: 00003cd8 00098258 00000000 c33e2000 c33e3f2c c33e3f20 c01f777c c01f6524 | ||
56 | 3f20: c33e3f3c c33e3f30 bf019014 c01f7740 c33e3f7c c33e3f40 c002f3ec bf019010 | ||
57 | 3f40: 00000000 00003cd8 00098258 bf017518 00000000 00003cd8 00098258 bf017518 | ||
58 | 3f60: 00000000 c00301a4 c33e2000 00000000 c33e3fa4 c33e3f80 c007b934 c002f3c4 | ||
59 | 3f80: c00b307c c00b2f48 00003cd8 00000000 00000003 00000080 00000000 c33e3fa8 | ||
60 | 3fa0: c0030020 c007b8b8 00003cd8 00000000 00098288 00003cd8 00098258 00098240 | ||
61 | 3fc0: 00003cd8 00000000 00000003 00000080 00098008 00098028 00098288 00000001 | ||
62 | 3fe0: be892998 be892988 00013d7c 40178740 60000010 00098288 09089041 00200845 | ||
63 | Backtrace: | ||
64 | [<c0080ba4>] (irq_gc_mask_set_bit+0x0/0x7c) from [<c007f5f8>] (irq_enable+0x48/0x58) | ||
65 | r6:c33d4340 r5:c04555bc r4:c04555bc | ||
66 | [<c007f5b0>] (irq_enable+0x0/0x58) from [<c007f654>] (irq_startup+0x4c/0x54) | ||
67 | r5:c04555bc r4:00000000 | ||
68 | [<c007f608>] (irq_startup+0x0/0x54) from [<c007e6e8>] (__setup_irq+0x2f0/0x3cc) | ||
69 | r5:c04555bc r4:00000000 | ||
70 | [<c007e3f8>] (__setup_irq+0x0/0x3cc) from [<c007e888>] (request_threaded_irq+0xc4/0x110) | ||
71 | r8:0000002d r7:c33dc008 r6:00000000 r5:00000001 r4:bf016c98 | ||
72 | [<c007e7c4>] (request_threaded_irq+0x0/0x110) from [<bf016b44>] (mcu_spi_probe+0x228/0x37c [mcu]) | ||
73 | [<bf01691c>] (mcu_spi_probe+0x0/0x37c [mcu]) from [<c022a698>] (spi_drv_probe+0x20/0x24) | ||
74 | [<c022a678>] (spi_drv_probe+0x0/0x24) from [<c01f5d88>] (driver_probe_device+0x88/0x1b0) | ||
75 | [<c01f5d00>] (driver_probe_device+0x0/0x1b0) from [<c01f5f8c>] (__device_attach+0x44/0x48) | ||
76 | [<c01f5f48>] (__device_attach+0x0/0x48) from [<c01f5210>] (bus_for_each_drv+0x68/0x94) | ||
77 | r5:c33e3cf0 r4:00000000 | ||
78 | [<c01f51a8>] (bus_for_each_drv+0x0/0x94) from [<c01f6044>] (device_attach+0x88/0xa0) | ||
79 | r7:c33e3dd8 r6:c25caa34 r5:c25caa00 r4:c25caa00 | ||
80 | [<c01f5fbc>] (device_attach+0x0/0xa0) from [<c01f4ff4>] (bus_probe_device+0x2c/0x4c) | ||
81 | r7:c33e3dd8 r6:c044e918 r5:c25caa00 r4:c0496d3c | ||
82 | [<c01f4fc8>] (bus_probe_device+0x0/0x4c) from [<c01f3d10>] (device_add+0x4d4/0x648) | ||
83 | [<c01f383c>] (device_add+0x0/0x648) from [<c022b1a0>] (spi_add_device+0xc8/0x128) | ||
84 | [<c022b0d8>] (spi_add_device+0x0/0x128) from [<c022b27c>] (spi_new_device+0x7c/0xb4) | ||
85 | r7:c33e3dd8 r6:00000000 r5:c33e3dd8 r4:c25caa00 | ||
86 | [<c022b200>] (spi_new_device+0x0/0xb4) from [<bf016f60>] (mcu_probe+0x144/0x224 [mcu]) | ||
87 | r7:c33e3dd8 r6:c0451c80 r5:bf01763c r4:00000000 | ||
88 | [<bf016e1c>] (mcu_probe+0x0/0x224 [mcu]) from [<c01f72f4>] (platform_drv_probe+0x20/0x24) | ||
89 | [<c01f72d4>] (platform_drv_probe+0x0/0x24) from [<c01f5d88>] (driver_probe_device+0x88/0x1b0) | ||
90 | [<c01f5d00>] (driver_probe_device+0x0/0x1b0) from [<c01f5f44>] (__driver_attach+0x94/0x98) | ||
91 | [<c01f5eb0>] (__driver_attach+0x0/0x98) from [<c01f5534>] (bus_for_each_dev+0x68/0x94) | ||
92 | r7:c01f5eb0 r6:bf0174dc r5:c33e3e98 r4:00000000 | ||
93 | [<c01f54cc>] (bus_for_each_dev+0x0/0x94) from [<c01f5bec>] (driver_attach+0x20/0x28) | ||
94 | r7:c0462ac8 r6:bf0174dc r5:00098258 r4:00003cd8 | ||
95 | [<c01f5bcc>] (driver_attach+0x0/0x28) from [<c01f4d30>] (bus_add_driver+0xb4/0x258) | ||
96 | [<c01f4c7c>] (bus_add_driver+0x0/0x258) from [<c01f6588>] (driver_register+0x74/0x158) | ||
97 | [<c01f6514>] (driver_register+0x0/0x158) from [<c01f777c>] (platform_driver_register+0x4c/0x60) | ||
98 | r7:c33e2000 r6:00000000 r5:00098258 r4:00003cd8 | ||
99 | [<c01f7730>] (platform_driver_register+0x0/0x60) from [<bf019014>] (mcu_init+0x14/0x20 [mcu]) | ||
100 | [<bf019000>] (mcu_init+0x0/0x20 [mcu]) from [<c002f3ec>] (do_one_initcall+0x38/0x170) | ||
101 | [<c002f3b4>] (do_one_initcall+0x0/0x170) from [<c007b934>] (sys_init_module+0x8c/0x1a4) | ||
102 | [<c007b8a8>] (sys_init_module+0x0/0x1a4) from [<c0030020>] (ret_fast_syscall+0x0/0x2c) | ||
103 | r7:00000080 r6:00000003 r5:00000000 r4:00003cd8 | ||
104 | Code: e1844003 e585400c e596300c e5932064 (e7814002) | ||
105 | |||
106 | Fix the issue. | ||
107 | |||
108 | Reported-by: Jon Povey <Jon.Povey@racelogic.co.uk> | ||
109 | Signed-off-by: Sekhar Nori <nsekhar@ti.com> | ||
110 | Signed-off-by: Grant Likely <grant.likely@secretlab.ca> | ||
111 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
112 | --- | ||
113 | drivers/gpio/gpio-davinci.c | 15 ++++++++++----- | ||
114 | 1 file changed, 10 insertions(+), 5 deletions(-) | ||
115 | |||
116 | diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c | ||
117 | index df0d595..a6777e5 100644 | ||
118 | --- a/drivers/gpio/gpio-davinci.c | ||
119 | +++ b/drivers/gpio/gpio-davinci.c | ||
120 | @@ -313,10 +313,16 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset) | ||
121 | return -ENODEV; | ||
122 | } | ||
123 | |||
124 | -static int gpio_irq_type_unbanked(struct irq_data *d, unsigned trigger) | ||
125 | +static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger) | ||
126 | { | ||
127 | - struct davinci_gpio_regs __iomem *g = irq2regs(d->irq); | ||
128 | - u32 mask = (u32) irq_data_get_irq_handler_data(d); | ||
129 | + struct davinci_gpio_controller *d; | ||
130 | + struct davinci_gpio_regs __iomem *g; | ||
131 | + struct davinci_soc_info *soc_info = &davinci_soc_info; | ||
132 | + u32 mask; | ||
133 | + | ||
134 | + d = (struct davinci_gpio_controller *)data->handler_data; | ||
135 | + g = (struct davinci_gpio_regs __iomem *)d->regs; | ||
136 | + mask = __gpio_mask(data->irq - soc_info->gpio_irq); | ||
137 | |||
138 | if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | ||
139 | return -EINVAL; | ||
140 | @@ -400,8 +406,7 @@ static int __init davinci_gpio_irq_setup(void) | ||
141 | /* set the direct IRQs up to use that irqchip */ | ||
142 | for (gpio = 0; gpio < soc_info->gpio_unbanked; gpio++, irq++) { | ||
143 | irq_set_chip(irq, &gpio_irqchip_unbanked); | ||
144 | - irq_set_handler_data(irq, (void *)__gpio_mask(gpio)); | ||
145 | - irq_set_chip_data(irq, (__force void *)g); | ||
146 | + irq_set_handler_data(irq, &chips[gpio / 32]); | ||
147 | irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); | ||
148 | } | ||
149 | |||
150 | -- | ||
151 | 1.7.9.4 | ||
152 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0117-gpio-davinci-fix-enabling-unbanked-GPIO-IRQs.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0117-gpio-davinci-fix-enabling-unbanked-GPIO-IRQs.patch new file mode 100644 index 00000000..2a1370e8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0117-gpio-davinci-fix-enabling-unbanked-GPIO-IRQs.patch | |||
@@ -0,0 +1,65 @@ | |||
1 | From a61e7db31913671e7951ed217dc0012f8578c977 Mon Sep 17 00:00:00 2001 | ||
2 | From: Sekhar Nori <nsekhar@ti.com> | ||
3 | Date: Sun, 11 Mar 2012 18:16:12 +0530 | ||
4 | Subject: [PATCH 117/147] gpio/davinci: fix enabling unbanked GPIO IRQs | ||
5 | |||
6 | commit 81b279d80a63628e580c71a31d30a8c3b3047ad4 upstream. | ||
7 | |||
8 | Unbanked GPIO IRQ handling code made a copy of just | ||
9 | the irq_chip structure for GPIO IRQ lines which caused | ||
10 | problems after the generic IRQ chip conversion because | ||
11 | there was no valid irq_chip_type structure with the | ||
12 | right "regs" populated. irq_gc_mask_set_bit() was | ||
13 | therefore accessing random addresses. | ||
14 | |||
15 | Fix it by making a copy of irq_chip_type structure | ||
16 | instead. This will ensure sane register offsets. | ||
17 | |||
18 | Reported-by: Jon Povey <Jon.Povey@racelogic.co.uk> | ||
19 | Tested-by: Jon Povey <Jon.Povey@racelogic.co.uk> | ||
20 | Signed-off-by: Sekhar Nori <nsekhar@ti.com> | ||
21 | Signed-off-by: Grant Likely <grant.likely@secretlab.ca> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | drivers/gpio/gpio-davinci.c | 11 ++++++----- | ||
25 | 1 file changed, 6 insertions(+), 5 deletions(-) | ||
26 | |||
27 | diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c | ||
28 | index a6777e5..3d00016 100644 | ||
29 | --- a/drivers/gpio/gpio-davinci.c | ||
30 | +++ b/drivers/gpio/gpio-davinci.c | ||
31 | @@ -386,7 +386,7 @@ static int __init davinci_gpio_irq_setup(void) | ||
32 | * IRQ mux conflicts; gpio_irq_type_unbanked() is only for GPIOs. | ||
33 | */ | ||
34 | if (soc_info->gpio_unbanked) { | ||
35 | - static struct irq_chip gpio_irqchip_unbanked; | ||
36 | + static struct irq_chip_type gpio_unbanked; | ||
37 | |||
38 | /* pass "bank 0" GPIO IRQs to AINTC */ | ||
39 | chips[0].chip.to_irq = gpio_to_irq_unbanked; | ||
40 | @@ -394,9 +394,10 @@ static int __init davinci_gpio_irq_setup(void) | ||
41 | |||
42 | /* AINTC handles mask/unmask; GPIO handles triggering */ | ||
43 | irq = bank_irq; | ||
44 | - gpio_irqchip_unbanked = *irq_get_chip(irq); | ||
45 | - gpio_irqchip_unbanked.name = "GPIO-AINTC"; | ||
46 | - gpio_irqchip_unbanked.irq_set_type = gpio_irq_type_unbanked; | ||
47 | + gpio_unbanked = *container_of(irq_get_chip(irq), | ||
48 | + struct irq_chip_type, chip); | ||
49 | + gpio_unbanked.chip.name = "GPIO-AINTC"; | ||
50 | + gpio_unbanked.chip.irq_set_type = gpio_irq_type_unbanked; | ||
51 | |||
52 | /* default trigger: both edges */ | ||
53 | g = gpio2regs(0); | ||
54 | @@ -405,7 +406,7 @@ static int __init davinci_gpio_irq_setup(void) | ||
55 | |||
56 | /* set the direct IRQs up to use that irqchip */ | ||
57 | for (gpio = 0; gpio < soc_info->gpio_unbanked; gpio++, irq++) { | ||
58 | - irq_set_chip(irq, &gpio_irqchip_unbanked); | ||
59 | + irq_set_chip(irq, &gpio_unbanked.chip); | ||
60 | irq_set_handler_data(irq, &chips[gpio / 32]); | ||
61 | irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH); | ||
62 | } | ||
63 | -- | ||
64 | 1.7.9.4 | ||
65 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0118-dm-crypt-fix-mempool-deadlock.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0118-dm-crypt-fix-mempool-deadlock.patch new file mode 100644 index 00000000..3f335968 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0118-dm-crypt-fix-mempool-deadlock.patch | |||
@@ -0,0 +1,65 @@ | |||
1 | From 27573d35b38cf9f8b2bb9f1f258bcac632ef4e0e Mon Sep 17 00:00:00 2001 | ||
2 | From: Mikulas Patocka <mpatocka@redhat.com> | ||
3 | Date: Wed, 28 Mar 2012 18:41:22 +0100 | ||
4 | Subject: [PATCH 118/147] dm crypt: fix mempool deadlock | ||
5 | |||
6 | commit aeb2deae2660a1773c83d3c6e9e6575daa3855d6 upstream. | ||
7 | |||
8 | This patch fixes a possible deadlock in dm-crypt's mempool use. | ||
9 | |||
10 | Currently, dm-crypt reserves a mempool of MIN_BIO_PAGES reserved pages. | ||
11 | It allocates first MIN_BIO_PAGES with non-failing allocation (the allocation | ||
12 | cannot fail and waits until the mempool is refilled). Further pages are | ||
13 | allocated with different gfp flags that allow failing. | ||
14 | |||
15 | Because allocations may be done in parallel, this code can deadlock. Example: | ||
16 | There are two processes, each tries to allocate MIN_BIO_PAGES and the processes | ||
17 | run simultaneously. | ||
18 | It may end up in a situation where each process allocates (MIN_BIO_PAGES / 2) | ||
19 | pages. The mempool is exhausted. Each process waits for more pages to be freed | ||
20 | to the mempool, which never happens. | ||
21 | |||
22 | To avoid this deadlock scenario, this patch changes the code so that only | ||
23 | the first page is allocated with non-failing gfp mask. Allocation of further | ||
24 | pages may fail. | ||
25 | |||
26 | Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> | ||
27 | Signed-off-by: Milan Broz <mbroz@redhat.com> | ||
28 | Signed-off-by: Alasdair G Kergon <agk@redhat.com> | ||
29 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
30 | --- | ||
31 | drivers/md/dm-crypt.c | 10 ++++------ | ||
32 | 1 file changed, 4 insertions(+), 6 deletions(-) | ||
33 | |||
34 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c | ||
35 | index 8c2a000..c75d947 100644 | ||
36 | --- a/drivers/md/dm-crypt.c | ||
37 | +++ b/drivers/md/dm-crypt.c | ||
38 | @@ -176,7 +176,6 @@ struct crypt_config { | ||
39 | |||
40 | #define MIN_IOS 16 | ||
41 | #define MIN_POOL_PAGES 32 | ||
42 | -#define MIN_BIO_PAGES 8 | ||
43 | |||
44 | static struct kmem_cache *_crypt_io_pool; | ||
45 | |||
46 | @@ -848,12 +847,11 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size, | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | - * if additional pages cannot be allocated without waiting, | ||
51 | - * return a partially allocated bio, the caller will then try | ||
52 | - * to allocate additional bios while submitting this partial bio | ||
53 | + * If additional pages cannot be allocated without waiting, | ||
54 | + * return a partially-allocated bio. The caller will then try | ||
55 | + * to allocate more bios while submitting this partial bio. | ||
56 | */ | ||
57 | - if (i == (MIN_BIO_PAGES - 1)) | ||
58 | - gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT; | ||
59 | + gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT; | ||
60 | |||
61 | len = (size > PAGE_SIZE) ? PAGE_SIZE : size; | ||
62 | |||
63 | -- | ||
64 | 1.7.9.4 | ||
65 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0119-dm-crypt-add-missing-error-handling.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0119-dm-crypt-add-missing-error-handling.patch new file mode 100644 index 00000000..c2dfbf3c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0119-dm-crypt-add-missing-error-handling.patch | |||
@@ -0,0 +1,116 @@ | |||
1 | From 94b46b475866eb637578cd9302cb047fea4be03b Mon Sep 17 00:00:00 2001 | ||
2 | From: Mikulas Patocka <mpatocka@redhat.com> | ||
3 | Date: Wed, 28 Mar 2012 18:41:22 +0100 | ||
4 | Subject: [PATCH 119/147] dm crypt: add missing error handling | ||
5 | |||
6 | commit 72c6e7afc43e19f68a31dea204fc366624d6eee9 upstream. | ||
7 | |||
8 | Always set io->error to -EIO when an error is detected in dm-crypt. | ||
9 | |||
10 | There were cases where an error code would be set only if we finish | ||
11 | processing the last sector. If there were other encryption operations in | ||
12 | flight, the error would be ignored and bio would be returned with | ||
13 | success as if no error happened. | ||
14 | |||
15 | This bug is present in kcryptd_crypt_write_convert, kcryptd_crypt_read_convert | ||
16 | and kcryptd_async_done. | ||
17 | |||
18 | Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> | ||
19 | Reviewed-by: Milan Broz <mbroz@redhat.com> | ||
20 | Signed-off-by: Alasdair G Kergon <agk@redhat.com> | ||
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
22 | --- | ||
23 | drivers/md/dm-crypt.c | 28 ++++++++++++++++------------ | ||
24 | 1 file changed, 16 insertions(+), 12 deletions(-) | ||
25 | |||
26 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c | ||
27 | index c75d947..58d8c6d 100644 | ||
28 | --- a/drivers/md/dm-crypt.c | ||
29 | +++ b/drivers/md/dm-crypt.c | ||
30 | @@ -1044,16 +1044,14 @@ static void kcryptd_queue_io(struct dm_crypt_io *io) | ||
31 | queue_work(cc->io_queue, &io->work); | ||
32 | } | ||
33 | |||
34 | -static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, | ||
35 | - int error, int async) | ||
36 | +static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async) | ||
37 | { | ||
38 | struct bio *clone = io->ctx.bio_out; | ||
39 | struct crypt_config *cc = io->target->private; | ||
40 | |||
41 | - if (unlikely(error < 0)) { | ||
42 | + if (unlikely(io->error < 0)) { | ||
43 | crypt_free_buffer_pages(cc, clone); | ||
44 | bio_put(clone); | ||
45 | - io->error = -EIO; | ||
46 | crypt_dec_pending(io); | ||
47 | return; | ||
48 | } | ||
49 | @@ -1104,12 +1102,16 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) | ||
50 | sector += bio_sectors(clone); | ||
51 | |||
52 | crypt_inc_pending(io); | ||
53 | + | ||
54 | r = crypt_convert(cc, &io->ctx); | ||
55 | + if (r < 0) | ||
56 | + io->error = -EIO; | ||
57 | + | ||
58 | crypt_finished = atomic_dec_and_test(&io->ctx.pending); | ||
59 | |||
60 | /* Encryption was already finished, submit io now */ | ||
61 | if (crypt_finished) { | ||
62 | - kcryptd_crypt_write_io_submit(io, r, 0); | ||
63 | + kcryptd_crypt_write_io_submit(io, 0); | ||
64 | |||
65 | /* | ||
66 | * If there was an error, do not try next fragments. | ||
67 | @@ -1160,11 +1162,8 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) | ||
68 | crypt_dec_pending(io); | ||
69 | } | ||
70 | |||
71 | -static void kcryptd_crypt_read_done(struct dm_crypt_io *io, int error) | ||
72 | +static void kcryptd_crypt_read_done(struct dm_crypt_io *io) | ||
73 | { | ||
74 | - if (unlikely(error < 0)) | ||
75 | - io->error = -EIO; | ||
76 | - | ||
77 | crypt_dec_pending(io); | ||
78 | } | ||
79 | |||
80 | @@ -1179,9 +1178,11 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io) | ||
81 | io->sector); | ||
82 | |||
83 | r = crypt_convert(cc, &io->ctx); | ||
84 | + if (r < 0) | ||
85 | + io->error = -EIO; | ||
86 | |||
87 | if (atomic_dec_and_test(&io->ctx.pending)) | ||
88 | - kcryptd_crypt_read_done(io, r); | ||
89 | + kcryptd_crypt_read_done(io); | ||
90 | |||
91 | crypt_dec_pending(io); | ||
92 | } | ||
93 | @@ -1202,15 +1203,18 @@ static void kcryptd_async_done(struct crypto_async_request *async_req, | ||
94 | if (!error && cc->iv_gen_ops && cc->iv_gen_ops->post) | ||
95 | error = cc->iv_gen_ops->post(cc, iv_of_dmreq(cc, dmreq), dmreq); | ||
96 | |||
97 | + if (error < 0) | ||
98 | + io->error = -EIO; | ||
99 | + | ||
100 | mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool); | ||
101 | |||
102 | if (!atomic_dec_and_test(&ctx->pending)) | ||
103 | return; | ||
104 | |||
105 | if (bio_data_dir(io->base_bio) == READ) | ||
106 | - kcryptd_crypt_read_done(io, error); | ||
107 | + kcryptd_crypt_read_done(io); | ||
108 | else | ||
109 | - kcryptd_crypt_write_io_submit(io, error, 1); | ||
110 | + kcryptd_crypt_write_io_submit(io, 1); | ||
111 | } | ||
112 | |||
113 | static void kcryptd_crypt(struct work_struct *work) | ||
114 | -- | ||
115 | 1.7.9.4 | ||
116 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0120-dm-exception-store-fix-init-error-path.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0120-dm-exception-store-fix-init-error-path.patch new file mode 100644 index 00000000..5bb414b5 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0120-dm-exception-store-fix-init-error-path.patch | |||
@@ -0,0 +1,33 @@ | |||
1 | From 24d0229ad2f723a746bbc36919b87e15a239075f Mon Sep 17 00:00:00 2001 | ||
2 | From: Andrei Warkentin <andrey.warkentin@gmail.com> | ||
3 | Date: Wed, 28 Mar 2012 18:41:22 +0100 | ||
4 | Subject: [PATCH 120/147] dm exception store: fix init error path | ||
5 | |||
6 | commit aadbe266f2f89ccc68b52f4effc7b3a8b29521ef upstream. | ||
7 | |||
8 | Call the correct exit function on failure in dm_exception_store_init. | ||
9 | |||
10 | Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com> | ||
11 | Acked-by: Mike Snitzer <snitzer@redhat.com> | ||
12 | Signed-off-by: Alasdair G Kergon <agk@redhat.com> | ||
13 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
14 | --- | ||
15 | drivers/md/dm-exception-store.c | 2 +- | ||
16 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
17 | |||
18 | diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c | ||
19 | index 042e719..aa70f7d 100644 | ||
20 | --- a/drivers/md/dm-exception-store.c | ||
21 | +++ b/drivers/md/dm-exception-store.c | ||
22 | @@ -283,7 +283,7 @@ int dm_exception_store_init(void) | ||
23 | return 0; | ||
24 | |||
25 | persistent_fail: | ||
26 | - dm_persistent_snapshot_exit(); | ||
27 | + dm_transient_snapshot_exit(); | ||
28 | transient_fail: | ||
29 | return r; | ||
30 | } | ||
31 | -- | ||
32 | 1.7.9.4 | ||
33 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0121-dm-persistent-data-fix-btree-rebalancing-after-remov.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0121-dm-persistent-data-fix-btree-rebalancing-after-remov.patch new file mode 100644 index 00000000..f3931740 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0121-dm-persistent-data-fix-btree-rebalancing-after-remov.patch | |||
@@ -0,0 +1,272 @@ | |||
1 | From 94c63ce73eda68e07380ef495c19c9f87f4655ba Mon Sep 17 00:00:00 2001 | ||
2 | From: Joe Thornber <ejt@redhat.com> | ||
3 | Date: Wed, 28 Mar 2012 18:41:23 +0100 | ||
4 | Subject: [PATCH 121/147] dm persistent data: fix btree rebalancing after | ||
5 | remove | ||
6 | |||
7 | commit b0988900bae9ecf968a8a8d086a9eec671a9517a upstream. | ||
8 | |||
9 | When we remove an entry from a node we sometimes rebalance with it's | ||
10 | two neighbours. This wasn't being done correctly; in some cases | ||
11 | entries have to move all the way from the right neighbour to the left | ||
12 | neighbour, or vice versa. This patch pretty much re-writes the | ||
13 | balancing code to fix it. | ||
14 | |||
15 | This code is barely used currently; only when you delete a thin | ||
16 | device, and then only if you have hundreds of them in the same pool. | ||
17 | Once we have discard support, which removes mappings, this will be used | ||
18 | much more heavily. | ||
19 | |||
20 | Signed-off-by: Joe Thornber <ejt@redhat.com> | ||
21 | Signed-off-by: Mike Snitzer <snitzer@redhat.com> | ||
22 | Signed-off-by: Alasdair G Kergon <agk@redhat.com> | ||
23 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
24 | --- | ||
25 | drivers/md/persistent-data/dm-btree-remove.c | 174 +++++++++++++++----------- | ||
26 | 1 file changed, 99 insertions(+), 75 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c | ||
29 | index 023fbc2..1a35caf 100644 | ||
30 | --- a/drivers/md/persistent-data/dm-btree-remove.c | ||
31 | +++ b/drivers/md/persistent-data/dm-btree-remove.c | ||
32 | @@ -128,18 +128,9 @@ static void delete_at(struct node *n, unsigned index) | ||
33 | n->header.nr_entries = cpu_to_le32(nr_entries - 1); | ||
34 | } | ||
35 | |||
36 | -static unsigned del_threshold(struct node *n) | ||
37 | -{ | ||
38 | - return le32_to_cpu(n->header.max_entries) / 3; | ||
39 | -} | ||
40 | - | ||
41 | static unsigned merge_threshold(struct node *n) | ||
42 | { | ||
43 | - /* | ||
44 | - * The extra one is because we know we're potentially going to | ||
45 | - * delete an entry. | ||
46 | - */ | ||
47 | - return 2 * (le32_to_cpu(n->header.max_entries) / 3) + 1; | ||
48 | + return le32_to_cpu(n->header.max_entries) / 3; | ||
49 | } | ||
50 | |||
51 | struct child { | ||
52 | @@ -188,6 +179,15 @@ static int exit_child(struct dm_btree_info *info, struct child *c) | ||
53 | |||
54 | static void shift(struct node *left, struct node *right, int count) | ||
55 | { | ||
56 | + uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
57 | + uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
58 | + uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
59 | + uint32_t r_max_entries = le32_to_cpu(right->header.max_entries); | ||
60 | + | ||
61 | + BUG_ON(max_entries != r_max_entries); | ||
62 | + BUG_ON(nr_left - count > max_entries); | ||
63 | + BUG_ON(nr_right + count > max_entries); | ||
64 | + | ||
65 | if (!count) | ||
66 | return; | ||
67 | |||
68 | @@ -199,13 +199,8 @@ static void shift(struct node *left, struct node *right, int count) | ||
69 | node_shift(right, count); | ||
70 | } | ||
71 | |||
72 | - left->header.nr_entries = | ||
73 | - cpu_to_le32(le32_to_cpu(left->header.nr_entries) - count); | ||
74 | - BUG_ON(le32_to_cpu(left->header.nr_entries) > le32_to_cpu(left->header.max_entries)); | ||
75 | - | ||
76 | - right->header.nr_entries = | ||
77 | - cpu_to_le32(le32_to_cpu(right->header.nr_entries) + count); | ||
78 | - BUG_ON(le32_to_cpu(right->header.nr_entries) > le32_to_cpu(right->header.max_entries)); | ||
79 | + left->header.nr_entries = cpu_to_le32(nr_left - count); | ||
80 | + right->header.nr_entries = cpu_to_le32(nr_right + count); | ||
81 | } | ||
82 | |||
83 | static void __rebalance2(struct dm_btree_info *info, struct node *parent, | ||
84 | @@ -215,8 +210,9 @@ static void __rebalance2(struct dm_btree_info *info, struct node *parent, | ||
85 | struct node *right = r->n; | ||
86 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
87 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
88 | + unsigned threshold = 2 * merge_threshold(left) + 1; | ||
89 | |||
90 | - if (nr_left + nr_right <= merge_threshold(left)) { | ||
91 | + if (nr_left + nr_right < threshold) { | ||
92 | /* | ||
93 | * Merge | ||
94 | */ | ||
95 | @@ -234,9 +230,6 @@ static void __rebalance2(struct dm_btree_info *info, struct node *parent, | ||
96 | * Rebalance. | ||
97 | */ | ||
98 | unsigned target_left = (nr_left + nr_right) / 2; | ||
99 | - unsigned shift_ = nr_left - target_left; | ||
100 | - BUG_ON(le32_to_cpu(left->header.max_entries) <= nr_left - shift_); | ||
101 | - BUG_ON(le32_to_cpu(right->header.max_entries) <= nr_right + shift_); | ||
102 | shift(left, right, nr_left - target_left); | ||
103 | *key_ptr(parent, r->index) = right->keys[0]; | ||
104 | } | ||
105 | @@ -272,6 +265,84 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | ||
106 | return exit_child(info, &right); | ||
107 | } | ||
108 | |||
109 | +/* | ||
110 | + * We dump as many entries from center as possible into left, then the rest | ||
111 | + * in right, then rebalance2. This wastes some cpu, but I want something | ||
112 | + * simple atm. | ||
113 | + */ | ||
114 | +static void delete_center_node(struct dm_btree_info *info, struct node *parent, | ||
115 | + struct child *l, struct child *c, struct child *r, | ||
116 | + struct node *left, struct node *center, struct node *right, | ||
117 | + uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
118 | +{ | ||
119 | + uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
120 | + unsigned shift = min(max_entries - nr_left, nr_center); | ||
121 | + | ||
122 | + BUG_ON(nr_left + shift > max_entries); | ||
123 | + node_copy(left, center, -shift); | ||
124 | + left->header.nr_entries = cpu_to_le32(nr_left + shift); | ||
125 | + | ||
126 | + if (shift != nr_center) { | ||
127 | + shift = nr_center - shift; | ||
128 | + BUG_ON((nr_right + shift) > max_entries); | ||
129 | + node_shift(right, shift); | ||
130 | + node_copy(center, right, shift); | ||
131 | + right->header.nr_entries = cpu_to_le32(nr_right + shift); | ||
132 | + } | ||
133 | + *key_ptr(parent, r->index) = right->keys[0]; | ||
134 | + | ||
135 | + delete_at(parent, c->index); | ||
136 | + r->index--; | ||
137 | + | ||
138 | + dm_tm_dec(info->tm, dm_block_location(c->block)); | ||
139 | + __rebalance2(info, parent, l, r); | ||
140 | +} | ||
141 | + | ||
142 | +/* | ||
143 | + * Redistributes entries among 3 sibling nodes. | ||
144 | + */ | ||
145 | +static void redistribute3(struct dm_btree_info *info, struct node *parent, | ||
146 | + struct child *l, struct child *c, struct child *r, | ||
147 | + struct node *left, struct node *center, struct node *right, | ||
148 | + uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
149 | +{ | ||
150 | + int s; | ||
151 | + uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
152 | + unsigned target = (nr_left + nr_center + nr_right) / 3; | ||
153 | + BUG_ON(target > max_entries); | ||
154 | + | ||
155 | + if (nr_left < nr_right) { | ||
156 | + s = nr_left - target; | ||
157 | + | ||
158 | + if (s < 0 && nr_center < -s) { | ||
159 | + /* not enough in central node */ | ||
160 | + shift(left, center, nr_center); | ||
161 | + s = nr_center - target; | ||
162 | + shift(left, right, s); | ||
163 | + nr_right += s; | ||
164 | + } else | ||
165 | + shift(left, center, s); | ||
166 | + | ||
167 | + shift(center, right, target - nr_right); | ||
168 | + | ||
169 | + } else { | ||
170 | + s = target - nr_right; | ||
171 | + if (s > 0 && nr_center < s) { | ||
172 | + /* not enough in central node */ | ||
173 | + shift(center, right, nr_center); | ||
174 | + s = target - nr_center; | ||
175 | + shift(left, right, s); | ||
176 | + nr_left -= s; | ||
177 | + } else | ||
178 | + shift(center, right, s); | ||
179 | + | ||
180 | + shift(left, center, nr_left - target); | ||
181 | + } | ||
182 | + | ||
183 | + *key_ptr(parent, c->index) = center->keys[0]; | ||
184 | + *key_ptr(parent, r->index) = right->keys[0]; | ||
185 | +} | ||
186 | + | ||
187 | static void __rebalance3(struct dm_btree_info *info, struct node *parent, | ||
188 | struct child *l, struct child *c, struct child *r) | ||
189 | { | ||
190 | @@ -282,62 +353,18 @@ static void __rebalance3(struct dm_btree_info *info, struct node *parent, | ||
191 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
192 | uint32_t nr_center = le32_to_cpu(center->header.nr_entries); | ||
193 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
194 | - uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
195 | |||
196 | - unsigned target; | ||
197 | + unsigned threshold = merge_threshold(left) * 4 + 1; | ||
198 | |||
199 | BUG_ON(left->header.max_entries != center->header.max_entries); | ||
200 | BUG_ON(center->header.max_entries != right->header.max_entries); | ||
201 | |||
202 | - if (((nr_left + nr_center + nr_right) / 2) < merge_threshold(center)) { | ||
203 | - /* | ||
204 | - * Delete center node: | ||
205 | - * | ||
206 | - * We dump as many entries from center as possible into | ||
207 | - * left, then the rest in right, then rebalance2. This | ||
208 | - * wastes some cpu, but I want something simple atm. | ||
209 | - */ | ||
210 | - unsigned shift = min(max_entries - nr_left, nr_center); | ||
211 | - | ||
212 | - BUG_ON(nr_left + shift > max_entries); | ||
213 | - node_copy(left, center, -shift); | ||
214 | - left->header.nr_entries = cpu_to_le32(nr_left + shift); | ||
215 | - | ||
216 | - if (shift != nr_center) { | ||
217 | - shift = nr_center - shift; | ||
218 | - BUG_ON((nr_right + shift) >= max_entries); | ||
219 | - node_shift(right, shift); | ||
220 | - node_copy(center, right, shift); | ||
221 | - right->header.nr_entries = cpu_to_le32(nr_right + shift); | ||
222 | - } | ||
223 | - *key_ptr(parent, r->index) = right->keys[0]; | ||
224 | - | ||
225 | - delete_at(parent, c->index); | ||
226 | - r->index--; | ||
227 | - | ||
228 | - dm_tm_dec(info->tm, dm_block_location(c->block)); | ||
229 | - __rebalance2(info, parent, l, r); | ||
230 | - | ||
231 | - return; | ||
232 | - } | ||
233 | - | ||
234 | - /* | ||
235 | - * Rebalance | ||
236 | - */ | ||
237 | - target = (nr_left + nr_center + nr_right) / 3; | ||
238 | - BUG_ON(target > max_entries); | ||
239 | - | ||
240 | - /* | ||
241 | - * Adjust the left node | ||
242 | - */ | ||
243 | - shift(left, center, nr_left - target); | ||
244 | - | ||
245 | - /* | ||
246 | - * Adjust the right node | ||
247 | - */ | ||
248 | - shift(center, right, target - nr_right); | ||
249 | - *key_ptr(parent, c->index) = center->keys[0]; | ||
250 | - *key_ptr(parent, r->index) = right->keys[0]; | ||
251 | + if ((nr_left + nr_center + nr_right) < threshold) | ||
252 | + delete_center_node(info, parent, l, c, r, left, center, right, | ||
253 | + nr_left, nr_center, nr_right); | ||
254 | + else | ||
255 | + redistribute3(info, parent, l, c, r, left, center, right, | ||
256 | + nr_left, nr_center, nr_right); | ||
257 | } | ||
258 | |||
259 | static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, | ||
260 | @@ -441,9 +468,6 @@ static int rebalance_children(struct shadow_spine *s, | ||
261 | if (r) | ||
262 | return r; | ||
263 | |||
264 | - if (child_entries > del_threshold(n)) | ||
265 | - return 0; | ||
266 | - | ||
267 | has_left_sibling = i > 0; | ||
268 | has_right_sibling = i < (le32_to_cpu(n->header.nr_entries) - 1); | ||
269 | |||
270 | -- | ||
271 | 1.7.9.4 | ||
272 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0122-dm-thin-fix-stacked-bi_next-usage.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0122-dm-thin-fix-stacked-bi_next-usage.patch new file mode 100644 index 00000000..4d9f54d3 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0122-dm-thin-fix-stacked-bi_next-usage.patch | |||
@@ -0,0 +1,233 @@ | |||
1 | From e2326264ad383c7611301ccad5f1cb1f90d87f8f Mon Sep 17 00:00:00 2001 | ||
2 | From: Joe Thornber <ejt@redhat.com> | ||
3 | Date: Wed, 28 Mar 2012 18:41:23 +0100 | ||
4 | Subject: [PATCH 122/147] dm thin: fix stacked bi_next usage | ||
5 | |||
6 | commit 6f94a4c45a6f744383f9f695dde019998db3df55 upstream. | ||
7 | |||
8 | Avoid using the bi_next field for the holder of a cell when deferring | ||
9 | bios because a stacked device below might change it. Store the | ||
10 | holder in a new field in struct cell instead. | ||
11 | |||
12 | When a cell is created, the bio that triggered creation (the holder) was | ||
13 | added to the same bio list as subsequent bios. In some cases we pass | ||
14 | this holder bio directly to devices underneath. If those devices use | ||
15 | the bi_next field there will be trouble... | ||
16 | |||
17 | This also simplifies some code that had to work out which bio was the | ||
18 | holder. | ||
19 | |||
20 | Signed-off-by: Joe Thornber <ejt@redhat.com> | ||
21 | Signed-off-by: Mike Snitzer <snitzer@redhat.com> | ||
22 | Signed-off-by: Alasdair G Kergon <agk@redhat.com> | ||
23 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
24 | --- | ||
25 | drivers/md/dm-thin.c | 124 +++++++++++++++++++++++++++++--------------------- | ||
26 | 1 file changed, 73 insertions(+), 51 deletions(-) | ||
27 | |||
28 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
29 | index c308757..da2f021 100644 | ||
30 | --- a/drivers/md/dm-thin.c | ||
31 | +++ b/drivers/md/dm-thin.c | ||
32 | @@ -124,7 +124,7 @@ struct cell { | ||
33 | struct hlist_node list; | ||
34 | struct bio_prison *prison; | ||
35 | struct cell_key key; | ||
36 | - unsigned count; | ||
37 | + struct bio *holder; | ||
38 | struct bio_list bios; | ||
39 | }; | ||
40 | |||
41 | @@ -220,55 +220,60 @@ static struct cell *__search_bucket(struct hlist_head *bucket, | ||
42 | * This may block if a new cell needs allocating. You must ensure that | ||
43 | * cells will be unlocked even if the calling thread is blocked. | ||
44 | * | ||
45 | - * Returns the number of entries in the cell prior to the new addition | ||
46 | - * or < 0 on failure. | ||
47 | + * Returns 1 if the cell was already held, 0 if @inmate is the new holder. | ||
48 | */ | ||
49 | static int bio_detain(struct bio_prison *prison, struct cell_key *key, | ||
50 | struct bio *inmate, struct cell **ref) | ||
51 | { | ||
52 | - int r; | ||
53 | + int r = 1; | ||
54 | unsigned long flags; | ||
55 | uint32_t hash = hash_key(prison, key); | ||
56 | - struct cell *uninitialized_var(cell), *cell2 = NULL; | ||
57 | + struct cell *cell, *cell2; | ||
58 | |||
59 | BUG_ON(hash > prison->nr_buckets); | ||
60 | |||
61 | spin_lock_irqsave(&prison->lock, flags); | ||
62 | + | ||
63 | cell = __search_bucket(prison->cells + hash, key); | ||
64 | + if (cell) { | ||
65 | + bio_list_add(&cell->bios, inmate); | ||
66 | + goto out; | ||
67 | + } | ||
68 | |||
69 | - if (!cell) { | ||
70 | - /* | ||
71 | - * Allocate a new cell | ||
72 | - */ | ||
73 | - spin_unlock_irqrestore(&prison->lock, flags); | ||
74 | - cell2 = mempool_alloc(prison->cell_pool, GFP_NOIO); | ||
75 | - spin_lock_irqsave(&prison->lock, flags); | ||
76 | + /* | ||
77 | + * Allocate a new cell | ||
78 | + */ | ||
79 | + spin_unlock_irqrestore(&prison->lock, flags); | ||
80 | + cell2 = mempool_alloc(prison->cell_pool, GFP_NOIO); | ||
81 | + spin_lock_irqsave(&prison->lock, flags); | ||
82 | |||
83 | - /* | ||
84 | - * We've been unlocked, so we have to double check that | ||
85 | - * nobody else has inserted this cell in the meantime. | ||
86 | - */ | ||
87 | - cell = __search_bucket(prison->cells + hash, key); | ||
88 | + /* | ||
89 | + * We've been unlocked, so we have to double check that | ||
90 | + * nobody else has inserted this cell in the meantime. | ||
91 | + */ | ||
92 | + cell = __search_bucket(prison->cells + hash, key); | ||
93 | + if (cell) { | ||
94 | + mempool_free(cell2, prison->cell_pool); | ||
95 | + bio_list_add(&cell->bios, inmate); | ||
96 | + goto out; | ||
97 | + } | ||
98 | + | ||
99 | + /* | ||
100 | + * Use new cell. | ||
101 | + */ | ||
102 | + cell = cell2; | ||
103 | |||
104 | - if (!cell) { | ||
105 | - cell = cell2; | ||
106 | - cell2 = NULL; | ||
107 | + cell->prison = prison; | ||
108 | + memcpy(&cell->key, key, sizeof(cell->key)); | ||
109 | + cell->holder = inmate; | ||
110 | + bio_list_init(&cell->bios); | ||
111 | + hlist_add_head(&cell->list, prison->cells + hash); | ||
112 | |||
113 | - cell->prison = prison; | ||
114 | - memcpy(&cell->key, key, sizeof(cell->key)); | ||
115 | - cell->count = 0; | ||
116 | - bio_list_init(&cell->bios); | ||
117 | - hlist_add_head(&cell->list, prison->cells + hash); | ||
118 | - } | ||
119 | - } | ||
120 | + r = 0; | ||
121 | |||
122 | - r = cell->count++; | ||
123 | - bio_list_add(&cell->bios, inmate); | ||
124 | +out: | ||
125 | spin_unlock_irqrestore(&prison->lock, flags); | ||
126 | |||
127 | - if (cell2) | ||
128 | - mempool_free(cell2, prison->cell_pool); | ||
129 | - | ||
130 | *ref = cell; | ||
131 | |||
132 | return r; | ||
133 | @@ -283,8 +288,8 @@ static void __cell_release(struct cell *cell, struct bio_list *inmates) | ||
134 | |||
135 | hlist_del(&cell->list); | ||
136 | |||
137 | - if (inmates) | ||
138 | - bio_list_merge(inmates, &cell->bios); | ||
139 | + bio_list_add(inmates, cell->holder); | ||
140 | + bio_list_merge(inmates, &cell->bios); | ||
141 | |||
142 | mempool_free(cell, prison->cell_pool); | ||
143 | } | ||
144 | @@ -305,22 +310,44 @@ static void cell_release(struct cell *cell, struct bio_list *bios) | ||
145 | * bio may be in the cell. This function releases the cell, and also does | ||
146 | * a sanity check. | ||
147 | */ | ||
148 | +static void __cell_release_singleton(struct cell *cell, struct bio *bio) | ||
149 | +{ | ||
150 | + hlist_del(&cell->list); | ||
151 | + BUG_ON(cell->holder != bio); | ||
152 | + BUG_ON(!bio_list_empty(&cell->bios)); | ||
153 | +} | ||
154 | + | ||
155 | static void cell_release_singleton(struct cell *cell, struct bio *bio) | ||
156 | { | ||
157 | - struct bio_prison *prison = cell->prison; | ||
158 | - struct bio_list bios; | ||
159 | - struct bio *b; | ||
160 | unsigned long flags; | ||
161 | - | ||
162 | - bio_list_init(&bios); | ||
163 | + struct bio_prison *prison = cell->prison; | ||
164 | |||
165 | spin_lock_irqsave(&prison->lock, flags); | ||
166 | - __cell_release(cell, &bios); | ||
167 | + __cell_release_singleton(cell, bio); | ||
168 | spin_unlock_irqrestore(&prison->lock, flags); | ||
169 | +} | ||
170 | + | ||
171 | +/* | ||
172 | + * Sometimes we don't want the holder, just the additional bios. | ||
173 | + */ | ||
174 | +static void __cell_release_no_holder(struct cell *cell, struct bio_list *inmates) | ||
175 | +{ | ||
176 | + struct bio_prison *prison = cell->prison; | ||
177 | |||
178 | - b = bio_list_pop(&bios); | ||
179 | - BUG_ON(b != bio); | ||
180 | - BUG_ON(!bio_list_empty(&bios)); | ||
181 | + hlist_del(&cell->list); | ||
182 | + bio_list_merge(inmates, &cell->bios); | ||
183 | + | ||
184 | + mempool_free(cell, prison->cell_pool); | ||
185 | +} | ||
186 | + | ||
187 | +static void cell_release_no_holder(struct cell *cell, struct bio_list *inmates) | ||
188 | +{ | ||
189 | + unsigned long flags; | ||
190 | + struct bio_prison *prison = cell->prison; | ||
191 | + | ||
192 | + spin_lock_irqsave(&prison->lock, flags); | ||
193 | + __cell_release_no_holder(cell, inmates); | ||
194 | + spin_unlock_irqrestore(&prison->lock, flags); | ||
195 | } | ||
196 | |||
197 | static void cell_error(struct cell *cell) | ||
198 | @@ -800,21 +827,16 @@ static void cell_defer(struct thin_c *tc, struct cell *cell, | ||
199 | * Same as cell_defer above, except it omits one particular detainee, | ||
200 | * a write bio that covers the block and has already been processed. | ||
201 | */ | ||
202 | -static void cell_defer_except(struct thin_c *tc, struct cell *cell, | ||
203 | - struct bio *exception) | ||
204 | +static void cell_defer_except(struct thin_c *tc, struct cell *cell) | ||
205 | { | ||
206 | struct bio_list bios; | ||
207 | - struct bio *bio; | ||
208 | struct pool *pool = tc->pool; | ||
209 | unsigned long flags; | ||
210 | |||
211 | bio_list_init(&bios); | ||
212 | - cell_release(cell, &bios); | ||
213 | |||
214 | spin_lock_irqsave(&pool->lock, flags); | ||
215 | - while ((bio = bio_list_pop(&bios))) | ||
216 | - if (bio != exception) | ||
217 | - bio_list_add(&pool->deferred_bios, bio); | ||
218 | + cell_release_no_holder(cell, &pool->deferred_bios); | ||
219 | spin_unlock_irqrestore(&pool->lock, flags); | ||
220 | |||
221 | wake_worker(pool); | ||
222 | @@ -854,7 +876,7 @@ static void process_prepared_mapping(struct new_mapping *m) | ||
223 | * the bios in the cell. | ||
224 | */ | ||
225 | if (bio) { | ||
226 | - cell_defer_except(tc, m->cell, bio); | ||
227 | + cell_defer_except(tc, m->cell); | ||
228 | bio_endio(bio, 0); | ||
229 | } else | ||
230 | cell_defer(tc, m->cell, m->data_block); | ||
231 | -- | ||
232 | 1.7.9.4 | ||
233 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0123-backlight-fix-typo-in-tosa_lcd.c.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0123-backlight-fix-typo-in-tosa_lcd.c.patch new file mode 100644 index 00000000..2f369f77 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0123-backlight-fix-typo-in-tosa_lcd.c.patch | |||
@@ -0,0 +1,34 @@ | |||
1 | From 97f236081bafdb80cac73ef005a6df79d4b2c803 Mon Sep 17 00:00:00 2001 | ||
2 | From: Masanari Iida <standby24x7@gmail.com> | ||
3 | Date: Wed, 28 Mar 2012 14:42:56 -0700 | ||
4 | Subject: [PATCH 123/147] backlight: fix typo in tosa_lcd.c | ||
5 | |||
6 | commit 8da00edc1069f01c34510fa405dc15d96c090a3f upstream. | ||
7 | |||
8 | Fix typo in drivers/video/backlight/tosa_lcd.c | ||
9 | "tosa_lcd_reume" should be "tosa_lcd_resume". | ||
10 | |||
11 | Signed-off-by: Masanari Iida <standby24x7@gmail.com> | ||
12 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | ||
13 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | drivers/video/backlight/tosa_lcd.c | 2 +- | ||
17 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
18 | |||
19 | diff --git a/drivers/video/backlight/tosa_lcd.c b/drivers/video/backlight/tosa_lcd.c | ||
20 | index 772f601..6f54f74 100644 | ||
21 | --- a/drivers/video/backlight/tosa_lcd.c | ||
22 | +++ b/drivers/video/backlight/tosa_lcd.c | ||
23 | @@ -271,7 +271,7 @@ static int tosa_lcd_resume(struct spi_device *spi) | ||
24 | } | ||
25 | #else | ||
26 | #define tosa_lcd_suspend NULL | ||
27 | -#define tosa_lcd_reume NULL | ||
28 | +#define tosa_lcd_resume NULL | ||
29 | #endif | ||
30 | |||
31 | static struct spi_driver tosa_lcd_driver = { | ||
32 | -- | ||
33 | 1.7.9.4 | ||
34 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0124-xfs-Fix-oops-on-IO-error-during-xlog_recover_process.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0124-xfs-Fix-oops-on-IO-error-during-xlog_recover_process.patch new file mode 100644 index 00000000..85a6e214 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0124-xfs-Fix-oops-on-IO-error-during-xlog_recover_process.patch | |||
@@ -0,0 +1,84 @@ | |||
1 | From 2b91e04fb1c28cce172844b2519c4bbedd9849c2 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jan Kara <jack@suse.cz> | ||
3 | Date: Thu, 15 Mar 2012 09:34:02 +0000 | ||
4 | Subject: [PATCH 124/147] xfs: Fix oops on IO error during | ||
5 | xlog_recover_process_iunlinks() | ||
6 | |||
7 | commit d97d32edcd732110758799ae60af725e5110b3dc upstream. | ||
8 | |||
9 | When an IO error happens during inode deletion run from | ||
10 | xlog_recover_process_iunlinks() filesystem gets shutdown. Thus any subsequent | ||
11 | attempt to read buffers fails. Code in xlog_recover_process_iunlinks() does not | ||
12 | count with the fact that read of a buffer which was read a while ago can | ||
13 | really fail which results in the oops on | ||
14 | agi = XFS_BUF_TO_AGI(agibp); | ||
15 | |||
16 | Fix the problem by cleaning up the buffer handling in | ||
17 | xlog_recover_process_iunlinks() as suggested by Dave Chinner. We release buffer | ||
18 | lock but keep buffer reference to AG buffer. That is enough for buffer to stay | ||
19 | pinned in memory and we don't have to call xfs_read_agi() all the time. | ||
20 | |||
21 | Signed-off-by: Jan Kara <jack@suse.cz> | ||
22 | Reviewed-by: Dave Chinner <dchinner@redhat.com> | ||
23 | Signed-off-by: Ben Myers <bpm@sgi.com> | ||
24 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
25 | --- | ||
26 | fs/xfs/xfs_log_recover.c | 33 +++++++++++---------------------- | ||
27 | 1 file changed, 11 insertions(+), 22 deletions(-) | ||
28 | |||
29 | diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c | ||
30 | index 541a508..4f5d0ce 100644 | ||
31 | --- a/fs/xfs/xfs_log_recover.c | ||
32 | +++ b/fs/xfs/xfs_log_recover.c | ||
33 | @@ -3161,37 +3161,26 @@ xlog_recover_process_iunlinks( | ||
34 | */ | ||
35 | continue; | ||
36 | } | ||
37 | + /* | ||
38 | + * Unlock the buffer so that it can be acquired in the normal | ||
39 | + * course of the transaction to truncate and free each inode. | ||
40 | + * Because we are not racing with anyone else here for the AGI | ||
41 | + * buffer, we don't even need to hold it locked to read the | ||
42 | + * initial unlinked bucket entries out of the buffer. We keep | ||
43 | + * buffer reference though, so that it stays pinned in memory | ||
44 | + * while we need the buffer. | ||
45 | + */ | ||
46 | agi = XFS_BUF_TO_AGI(agibp); | ||
47 | + xfs_buf_unlock(agibp); | ||
48 | |||
49 | for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) { | ||
50 | agino = be32_to_cpu(agi->agi_unlinked[bucket]); | ||
51 | while (agino != NULLAGINO) { | ||
52 | - /* | ||
53 | - * Release the agi buffer so that it can | ||
54 | - * be acquired in the normal course of the | ||
55 | - * transaction to truncate and free the inode. | ||
56 | - */ | ||
57 | - xfs_buf_relse(agibp); | ||
58 | - | ||
59 | agino = xlog_recover_process_one_iunlink(mp, | ||
60 | agno, agino, bucket); | ||
61 | - | ||
62 | - /* | ||
63 | - * Reacquire the agibuffer and continue around | ||
64 | - * the loop. This should never fail as we know | ||
65 | - * the buffer was good earlier on. | ||
66 | - */ | ||
67 | - error = xfs_read_agi(mp, NULL, agno, &agibp); | ||
68 | - ASSERT(error == 0); | ||
69 | - agi = XFS_BUF_TO_AGI(agibp); | ||
70 | } | ||
71 | } | ||
72 | - | ||
73 | - /* | ||
74 | - * Release the buffer for the current agi so we can | ||
75 | - * go on to the next one. | ||
76 | - */ | ||
77 | - xfs_buf_relse(agibp); | ||
78 | + xfs_buf_rele(agibp); | ||
79 | } | ||
80 | |||
81 | mp->m_dmevmask = mp_dmevmask; | ||
82 | -- | ||
83 | 1.7.9.4 | ||
84 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0125-slub-Do-not-hold-slub_lock-when-calling-sysfs_slab_a.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0125-slub-Do-not-hold-slub_lock-when-calling-sysfs_slab_a.patch new file mode 100644 index 00000000..325ae731 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0125-slub-Do-not-hold-slub_lock-when-calling-sysfs_slab_a.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From 4e25692d8b794add23cb09fdeeaa62ecee2ef697 Mon Sep 17 00:00:00 2001 | ||
2 | From: Christoph Lameter <cl@linux.com> | ||
3 | Date: Tue, 17 Jan 2012 09:27:31 -0600 | ||
4 | Subject: [PATCH 125/147] slub: Do not hold slub_lock when calling | ||
5 | sysfs_slab_add() | ||
6 | |||
7 | commit 66c4c35c6bc5a1a452b024cf0364635b28fd94e4 upstream. | ||
8 | |||
9 | sysfs_slab_add() calls various sysfs functions that actually may | ||
10 | end up in userspace doing all sorts of things. | ||
11 | |||
12 | Release the slub_lock after adding the kmem_cache structure to the list. | ||
13 | At that point the address of the kmem_cache is not known so we are | ||
14 | guaranteed exlusive access to the following modifications to the | ||
15 | kmem_cache structure. | ||
16 | |||
17 | If the sysfs_slab_add fails then reacquire the slub_lock to | ||
18 | remove the kmem_cache structure from the list. | ||
19 | |||
20 | Reported-by: Sasha Levin <levinsasha928@gmail.com> | ||
21 | Acked-by: Eric Dumazet <eric.dumazet@gmail.com> | ||
22 | Signed-off-by: Christoph Lameter <cl@linux.com> | ||
23 | Signed-off-by: Pekka Enberg <penberg@kernel.org> | ||
24 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
25 | --- | ||
26 | mm/slub.c | 3 ++- | ||
27 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
28 | |||
29 | diff --git a/mm/slub.c b/mm/slub.c | ||
30 | index 1a919f0..a99c785 100644 | ||
31 | --- a/mm/slub.c | ||
32 | +++ b/mm/slub.c | ||
33 | @@ -3911,13 +3911,14 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | ||
34 | if (kmem_cache_open(s, n, | ||
35 | size, align, flags, ctor)) { | ||
36 | list_add(&s->list, &slab_caches); | ||
37 | + up_write(&slub_lock); | ||
38 | if (sysfs_slab_add(s)) { | ||
39 | + down_write(&slub_lock); | ||
40 | list_del(&s->list); | ||
41 | kfree(n); | ||
42 | kfree(s); | ||
43 | goto err; | ||
44 | } | ||
45 | - up_write(&slub_lock); | ||
46 | return s; | ||
47 | } | ||
48 | kfree(n); | ||
49 | -- | ||
50 | 1.7.9.4 | ||
51 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0126-NFSv4-Fix-two-infinite-loops-in-the-mount-code.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0126-NFSv4-Fix-two-infinite-loops-in-the-mount-code.patch new file mode 100644 index 00000000..dd7fa83f --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0126-NFSv4-Fix-two-infinite-loops-in-the-mount-code.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From a92e847768f32d7059094c15ce686019b91893ab Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Tue, 27 Mar 2012 18:13:02 -0400 | ||
4 | Subject: [PATCH 126/147] NFSv4: Fix two infinite loops in the mount code | ||
5 | |||
6 | commit 05e9cfb408b24debb3a85fd98edbfd09dd148881 upstream. | ||
7 | |||
8 | We can currently loop forever in nfs4_lookup_root() and in | ||
9 | nfs41_proc_secinfo_no_name(), if the first iteration returns a | ||
10 | NFS4ERR_DELAY or something else that causes exception.retry to get | ||
11 | set. | ||
12 | |||
13 | Reported-by: Weston Andros Adamson <dros@netapp.com> | ||
14 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | fs/nfs/nfs4proc.c | 6 ++++-- | ||
18 | 1 file changed, 4 insertions(+), 2 deletions(-) | ||
19 | |||
20 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
21 | index c9e2d9e..6db0972 100644 | ||
22 | --- a/fs/nfs/nfs4proc.c | ||
23 | +++ b/fs/nfs/nfs4proc.c | ||
24 | @@ -2242,11 +2242,12 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, | ||
25 | switch (err) { | ||
26 | case 0: | ||
27 | case -NFS4ERR_WRONGSEC: | ||
28 | - break; | ||
29 | + goto out; | ||
30 | default: | ||
31 | err = nfs4_handle_exception(server, err, &exception); | ||
32 | } | ||
33 | } while (exception.retry); | ||
34 | +out: | ||
35 | return err; | ||
36 | } | ||
37 | |||
38 | @@ -6099,11 +6100,12 @@ nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle, | ||
39 | case 0: | ||
40 | case -NFS4ERR_WRONGSEC: | ||
41 | case -NFS4ERR_NOTSUPP: | ||
42 | - break; | ||
43 | + goto out; | ||
44 | default: | ||
45 | err = nfs4_handle_exception(server, err, &exception); | ||
46 | } | ||
47 | } while (exception.retry); | ||
48 | +out: | ||
49 | return err; | ||
50 | } | ||
51 | |||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0127-NFSv4.1-Fix-layoutcommit-error-handling.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0127-NFSv4.1-Fix-layoutcommit-error-handling.patch new file mode 100644 index 00000000..2f1e88a4 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0127-NFSv4.1-Fix-layoutcommit-error-handling.patch | |||
@@ -0,0 +1,61 @@ | |||
1 | From ccd03bf68f47d089dc1c789ea11a19792e056fdf Mon Sep 17 00:00:00 2001 | ||
2 | From: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
3 | Date: Tue, 27 Mar 2012 18:22:19 -0400 | ||
4 | Subject: [PATCH 127/147] NFSv4.1: Fix layoutcommit error handling | ||
5 | |||
6 | commit e59d27e05a6435f8c04d5ad843f37fa795f2eaaa upstream. | ||
7 | |||
8 | Firstly, task->tk_status will always return negative error values, | ||
9 | so the current tests for 'NFS4ERR_DELEG_REVOKED' etc. are all being | ||
10 | ignored. | ||
11 | Secondly, clean up the code so that we only need to test | ||
12 | task->tk_status once! | ||
13 | |||
14 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | fs/nfs/nfs4proc.c | 25 +++++++++++++------------ | ||
18 | 1 file changed, 13 insertions(+), 12 deletions(-) | ||
19 | |||
20 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
21 | index 6db0972..d945700 100644 | ||
22 | --- a/fs/nfs/nfs4proc.c | ||
23 | +++ b/fs/nfs/nfs4proc.c | ||
24 | @@ -5983,21 +5983,22 @@ nfs4_layoutcommit_done(struct rpc_task *task, void *calldata) | ||
25 | return; | ||
26 | |||
27 | switch (task->tk_status) { /* Just ignore these failures */ | ||
28 | - case NFS4ERR_DELEG_REVOKED: /* layout was recalled */ | ||
29 | - case NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ | ||
30 | - case NFS4ERR_BADLAYOUT: /* no layout */ | ||
31 | - case NFS4ERR_GRACE: /* loca_recalim always false */ | ||
32 | + case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */ | ||
33 | + case -NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ | ||
34 | + case -NFS4ERR_BADLAYOUT: /* no layout */ | ||
35 | + case -NFS4ERR_GRACE: /* loca_recalim always false */ | ||
36 | task->tk_status = 0; | ||
37 | - } | ||
38 | - | ||
39 | - if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { | ||
40 | - rpc_restart_call_prepare(task); | ||
41 | - return; | ||
42 | - } | ||
43 | - | ||
44 | - if (task->tk_status == 0) | ||
45 | + break; | ||
46 | + case 0: | ||
47 | nfs_post_op_update_inode_force_wcc(data->args.inode, | ||
48 | data->res.fattr); | ||
49 | + break; | ||
50 | + default: | ||
51 | + if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { | ||
52 | + rpc_restart_call_prepare(task); | ||
53 | + return; | ||
54 | + } | ||
55 | + } | ||
56 | } | ||
57 | |||
58 | static void nfs4_layoutcommit_release(void *calldata) | ||
59 | -- | ||
60 | 1.7.9.4 | ||
61 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0128-module-Remove-module-size-limit.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0128-module-Remove-module-size-limit.patch new file mode 100644 index 00000000..09a8b51b --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0128-module-Remove-module-size-limit.patch | |||
@@ -0,0 +1,38 @@ | |||
1 | From fd3597c3facb39143261c34964aabfc9c66c4fdf Mon Sep 17 00:00:00 2001 | ||
2 | From: Sasha Levin <levinsasha928@gmail.com> | ||
3 | Date: Mon, 30 Jan 2012 23:07:22 -0500 | ||
4 | Subject: [PATCH 128/147] module: Remove module size limit | ||
5 | |||
6 | commit f946eeb9313ff1470758e171a60fe7438a2ded3f upstream. | ||
7 | |||
8 | Module size was limited to 64MB, this was legacy limitation due to vmalloc() | ||
9 | which was removed a while ago. | ||
10 | |||
11 | Limiting module size to 64MB is both pointless and affects real world use | ||
12 | cases. | ||
13 | |||
14 | Cc: Tim Abbott <tim.abbott@oracle.com> | ||
15 | Signed-off-by: Sasha Levin <sasha.levin@oracle.com> | ||
16 | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | kernel/module.c | 3 +-- | ||
20 | 1 file changed, 1 insertion(+), 2 deletions(-) | ||
21 | |||
22 | diff --git a/kernel/module.c b/kernel/module.c | ||
23 | index 178333c..6969ef0 100644 | ||
24 | --- a/kernel/module.c | ||
25 | +++ b/kernel/module.c | ||
26 | @@ -2341,8 +2341,7 @@ static int copy_and_check(struct load_info *info, | ||
27 | return -ENOEXEC; | ||
28 | |||
29 | /* Suck in entire file: we'll want most of it. */ | ||
30 | - /* vmalloc barfs on "unusual" numbers. Check here */ | ||
31 | - if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) | ||
32 | + if ((hdr = vmalloc(len)) == NULL) | ||
33 | return -ENOMEM; | ||
34 | |||
35 | if (copy_from_user(hdr, umod, len) != 0) { | ||
36 | -- | ||
37 | 1.7.9.4 | ||
38 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0129-Bluetooth-btusb-fix-bInterval-for-high-super-speed-i.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0129-Bluetooth-btusb-fix-bInterval-for-high-super-speed-i.patch new file mode 100644 index 00000000..2aae62b6 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0129-Bluetooth-btusb-fix-bInterval-for-high-super-speed-i.patch | |||
@@ -0,0 +1,47 @@ | |||
1 | From 7c62cb0eff8ac7154b41d4b010c18e1a92e1bf8e Mon Sep 17 00:00:00 2001 | ||
2 | From: Bing Zhao <bzhao@marvell.com> | ||
3 | Date: Tue, 20 Dec 2011 18:19:00 -0800 | ||
4 | Subject: [PATCH 129/147] Bluetooth: btusb: fix bInterval for high/super speed | ||
5 | isochronous endpoints | ||
6 | |||
7 | commit fa0fb93f2ac308a76fa64eb57c18511dadf97089 upstream. | ||
8 | |||
9 | For high-speed/super-speed isochronous endpoints, the bInterval | ||
10 | value is used as exponent, 2^(bInterval-1). Luckily we have | ||
11 | usb_fill_int_urb() function that handles it correctly. So we just | ||
12 | call this function to fill in the RX URB. | ||
13 | |||
14 | Cc: Marcel Holtmann <marcel@holtmann.org> | ||
15 | Signed-off-by: Bing Zhao <bzhao@marvell.com> | ||
16 | Acked-by: Marcel Holtmann <marcel@holtmann.org> | ||
17 | Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | drivers/bluetooth/btusb.c | 9 ++------- | ||
21 | 1 file changed, 2 insertions(+), 7 deletions(-) | ||
22 | |||
23 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
24 | index 11a925c..c16c750 100644 | ||
25 | --- a/drivers/bluetooth/btusb.c | ||
26 | +++ b/drivers/bluetooth/btusb.c | ||
27 | @@ -507,15 +507,10 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags) | ||
28 | |||
29 | pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); | ||
30 | |||
31 | - urb->dev = data->udev; | ||
32 | - urb->pipe = pipe; | ||
33 | - urb->context = hdev; | ||
34 | - urb->complete = btusb_isoc_complete; | ||
35 | - urb->interval = data->isoc_rx_ep->bInterval; | ||
36 | + usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, | ||
37 | + hdev, data->isoc_rx_ep->bInterval); | ||
38 | |||
39 | urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; | ||
40 | - urb->transfer_buffer = buf; | ||
41 | - urb->transfer_buffer_length = size; | ||
42 | |||
43 | __fill_isoc_descriptor(urb, size, | ||
44 | le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); | ||
45 | -- | ||
46 | 1.7.9.4 | ||
47 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0130-drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0130-drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch new file mode 100644 index 00000000..f224abe2 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0130-drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch | |||
@@ -0,0 +1,95 @@ | |||
1 | From 38c2bda521b456704bd7b7376e79d69b0e867198 Mon Sep 17 00:00:00 2001 | ||
2 | From: Dave Airlie <airlied@redhat.com> | ||
3 | Date: Wed, 28 Mar 2012 10:48:49 +0100 | ||
4 | Subject: [PATCH 130/147] drm/i915: suspend fbdev device around | ||
5 | suspend/hibernate | ||
6 | |||
7 | commit 3fa016a0b5c5237e9c387fc3249592b2cb5391c6 upstream. | ||
8 | |||
9 | Looking at hibernate overwriting I though it looked like a cursor, | ||
10 | so I tracked down this missing piece to stop the cursor blink | ||
11 | timer. I've no idea if this is sufficient to fix the hibernate | ||
12 | problems people are seeing, but please test it. | ||
13 | |||
14 | Both radeon and nouveau have done this for a long time. | ||
15 | |||
16 | I've run this personally all night hib/resume cycles with no fails. | ||
17 | |||
18 | Reviewed-by: Keith Packard <keithp@keithp.com> | ||
19 | Reported-by: Petr Tesarik <kernel@tesarici.cz> | ||
20 | Reported-by: Stanislaw Gruszka <sgruszka@redhat.com> | ||
21 | Reported-by: Lots of misc segfaults after hibernate across the world. | ||
22 | Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=37142 | ||
23 | Tested-by: Dave Airlie <airlied@redhat.com> | ||
24 | Tested-by: Bojan Smojver <bojan@rexursive.com> | ||
25 | Tested-by: Andreas Hartmann <andihartmann@01019freenet.de> | ||
26 | Signed-off-by: Dave Airlie <airlied@redhat.com> | ||
27 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
28 | --- | ||
29 | drivers/gpu/drm/i915/i915_drv.c | 7 +++++++ | ||
30 | drivers/gpu/drm/i915/intel_drv.h | 2 +- | ||
31 | drivers/gpu/drm/i915/intel_fb.c | 10 ++++++++++ | ||
32 | 3 files changed, 18 insertions(+), 1 deletion(-) | ||
33 | |||
34 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
35 | index e2d85a9..d04597d 100644 | ||
36 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
37 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
38 | @@ -442,6 +442,10 @@ static int i915_drm_freeze(struct drm_device *dev) | ||
39 | /* Modeset on resume, not lid events */ | ||
40 | dev_priv->modeset_on_lid = 0; | ||
41 | |||
42 | + console_lock(); | ||
43 | + intel_fbdev_set_suspend(dev, 1); | ||
44 | + console_unlock(); | ||
45 | + | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | @@ -514,6 +518,9 @@ static int i915_drm_thaw(struct drm_device *dev) | ||
50 | |||
51 | dev_priv->modeset_on_lid = 0; | ||
52 | |||
53 | + console_lock(); | ||
54 | + intel_fbdev_set_suspend(dev, 0); | ||
55 | + console_unlock(); | ||
56 | return error; | ||
57 | } | ||
58 | |||
59 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | ||
60 | index a1b4343..83e820e 100644 | ||
61 | --- a/drivers/gpu/drm/i915/intel_drv.h | ||
62 | +++ b/drivers/gpu/drm/i915/intel_drv.h | ||
63 | @@ -364,7 +364,7 @@ extern int intel_framebuffer_init(struct drm_device *dev, | ||
64 | struct drm_i915_gem_object *obj); | ||
65 | extern int intel_fbdev_init(struct drm_device *dev); | ||
66 | extern void intel_fbdev_fini(struct drm_device *dev); | ||
67 | - | ||
68 | +extern void intel_fbdev_set_suspend(struct drm_device *dev, int state); | ||
69 | extern void intel_prepare_page_flip(struct drm_device *dev, int plane); | ||
70 | extern void intel_finish_page_flip(struct drm_device *dev, int pipe); | ||
71 | extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); | ||
72 | diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c | ||
73 | index ec49bae..d0ce34b 100644 | ||
74 | --- a/drivers/gpu/drm/i915/intel_fb.c | ||
75 | +++ b/drivers/gpu/drm/i915/intel_fb.c | ||
76 | @@ -257,6 +257,16 @@ void intel_fbdev_fini(struct drm_device *dev) | ||
77 | kfree(dev_priv->fbdev); | ||
78 | dev_priv->fbdev = NULL; | ||
79 | } | ||
80 | + | ||
81 | +void intel_fbdev_set_suspend(struct drm_device *dev, int state) | ||
82 | +{ | ||
83 | + drm_i915_private_t *dev_priv = dev->dev_private; | ||
84 | + if (!dev_priv->fbdev) | ||
85 | + return; | ||
86 | + | ||
87 | + fb_set_suspend(dev_priv->fbdev->helper.fbdev, state); | ||
88 | +} | ||
89 | + | ||
90 | MODULE_LICENSE("GPL and additional rights"); | ||
91 | |||
92 | void intel_fb_output_poll_changed(struct drm_device *dev) | ||
93 | -- | ||
94 | 1.7.9.4 | ||
95 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0131-Fix-pppol2tp-getsockname.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0131-Fix-pppol2tp-getsockname.patch new file mode 100644 index 00000000..371e2036 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0131-Fix-pppol2tp-getsockname.patch | |||
@@ -0,0 +1,37 @@ | |||
1 | From f5d559cda23c4abbccffff4d6992fba722321a1e Mon Sep 17 00:00:00 2001 | ||
2 | From: Benjamin LaHaise <bcrl@kvack.org> | ||
3 | Date: Tue, 20 Mar 2012 03:57:54 +0000 | ||
4 | Subject: [PATCH 131/147] Fix pppol2tp getsockname() | ||
5 | |||
6 | [ Upstream commit bbdb32cb5b73597386913d052165423b9d736145 ] | ||
7 | |||
8 | While testing L2TP functionality, I came across a bug in getsockname(). The | ||
9 | IP address returned within the pppol2tp_addr's addr memember was not being | ||
10 | set to the IP address in use. This bug is caused by using inet_sk() on the | ||
11 | wrong socket (the L2TP socket rather than the underlying UDP socket), and was | ||
12 | likely introduced during the addition of L2TPv3 support. | ||
13 | |||
14 | Signed-off-by: Benjamin LaHaise <bcrl@kvack.org> | ||
15 | Signed-off-by: James Chapman <jchapman@katalix.com> | ||
16 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
18 | --- | ||
19 | net/l2tp/l2tp_ppp.c | 2 +- | ||
20 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
21 | |||
22 | diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c | ||
23 | index 8a90d75..b1bd16f 100644 | ||
24 | --- a/net/l2tp/l2tp_ppp.c | ||
25 | +++ b/net/l2tp/l2tp_ppp.c | ||
26 | @@ -915,7 +915,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr, | ||
27 | goto end_put_sess; | ||
28 | } | ||
29 | |||
30 | - inet = inet_sk(sk); | ||
31 | + inet = inet_sk(tunnel->sock); | ||
32 | if (tunnel->version == 2) { | ||
33 | struct sockaddr_pppol2tp sp; | ||
34 | len = sizeof(sp); | ||
35 | -- | ||
36 | 1.7.9.4 | ||
37 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0132-ipv6-fix-incorrent-ipv6-ipsec-packet-fragment.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0132-ipv6-fix-incorrent-ipv6-ipsec-packet-fragment.patch new file mode 100644 index 00000000..eaf6d78d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0132-ipv6-fix-incorrent-ipv6-ipsec-packet-fragment.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From c809355ceedbec6be4d31c189c452323b7dd0555 Mon Sep 17 00:00:00 2001 | ||
2 | From: Gao feng <gaofeng@cn.fujitsu.com> | ||
3 | Date: Mon, 19 Mar 2012 22:36:10 +0000 | ||
4 | Subject: [PATCH 132/147] ipv6: fix incorrent ipv6 ipsec packet fragment | ||
5 | |||
6 | [ Upstream commit 1f85851e17b64cabd089a8a8839dddebc627948c ] | ||
7 | |||
8 | Since commit 299b0767(ipv6: Fix IPsec slowpath fragmentation problem) | ||
9 | In func ip6_append_data,after call skb_put(skb, fraglen + dst_exthdrlen) | ||
10 | the skb->len contains dst_exthdrlen,and we don't reduce dst_exthdrlen at last | ||
11 | This will make fraggap>0 in next "while cycle",and cause the size of skb incorrent | ||
12 | |||
13 | Fix this by reserve headroom for dst_exthdrlen. | ||
14 | |||
15 | Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com> | ||
16 | Acked-by: Steffen Klassert <steffen.klassert@secunet.com> | ||
17 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | net/ipv6/ip6_output.c | 11 ++++++----- | ||
21 | 1 file changed, 6 insertions(+), 5 deletions(-) | ||
22 | |||
23 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
24 | index ec56271..f7f07e2 100644 | ||
25 | --- a/net/ipv6/ip6_output.c | ||
26 | +++ b/net/ipv6/ip6_output.c | ||
27 | @@ -1411,8 +1411,9 @@ alloc_new_skb: | ||
28 | */ | ||
29 | skb->ip_summed = csummode; | ||
30 | skb->csum = 0; | ||
31 | - /* reserve for fragmentation */ | ||
32 | - skb_reserve(skb, hh_len+sizeof(struct frag_hdr)); | ||
33 | + /* reserve for fragmentation and ipsec header */ | ||
34 | + skb_reserve(skb, hh_len + sizeof(struct frag_hdr) + | ||
35 | + dst_exthdrlen); | ||
36 | |||
37 | if (sk->sk_type == SOCK_DGRAM) | ||
38 | skb_shinfo(skb)->tx_flags = tx_flags; | ||
39 | @@ -1420,9 +1421,9 @@ alloc_new_skb: | ||
40 | /* | ||
41 | * Find where to start putting bytes | ||
42 | */ | ||
43 | - data = skb_put(skb, fraglen + dst_exthdrlen); | ||
44 | - skb_set_network_header(skb, exthdrlen + dst_exthdrlen); | ||
45 | - data += fragheaderlen + dst_exthdrlen; | ||
46 | + data = skb_put(skb, fraglen); | ||
47 | + skb_set_network_header(skb, exthdrlen); | ||
48 | + data += fragheaderlen; | ||
49 | skb->transport_header = (skb->network_header + | ||
50 | fragheaderlen); | ||
51 | if (fraggap) { | ||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0133-net-bpf_jit-fix-BPF_S_LDX_B_MSH-compilation.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0133-net-bpf_jit-fix-BPF_S_LDX_B_MSH-compilation.patch new file mode 100644 index 00000000..a5780d46 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0133-net-bpf_jit-fix-BPF_S_LDX_B_MSH-compilation.patch | |||
@@ -0,0 +1,62 @@ | |||
1 | From 3f5659b743cac5379f2b1619b713edeb60844b23 Mon Sep 17 00:00:00 2001 | ||
2 | From: Eric Dumazet <eric.dumazet@gmail.com> | ||
3 | Date: Sun, 18 Mar 2012 02:40:48 +0000 | ||
4 | Subject: [PATCH 133/147] net: bpf_jit: fix BPF_S_LDX_B_MSH compilation | ||
5 | |||
6 | [ Upstream commit dc72d99dabb870ca5bd6d9fff674be853bb4a88d ] | ||
7 | |||
8 | Matt Evans spotted that x86 bpf_jit was incorrectly handling negative | ||
9 | constant offsets in BPF_S_LDX_B_MSH instruction. | ||
10 | |||
11 | We need to abort JIT compilation like we do in common_load so that | ||
12 | filter uses the interpreter code and can call __load_pointer() | ||
13 | |||
14 | Reference: http://lists.openwall.net/netdev/2011/07/19/11 | ||
15 | |||
16 | Thanks to Indan Zupancic to bring back this issue. | ||
17 | |||
18 | Reported-by: Matt Evans <matt@ozlabs.org> | ||
19 | Reported-by: Indan Zupancic <indan@nul.nu> | ||
20 | Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> | ||
21 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
23 | --- | ||
24 | arch/x86/net/bpf_jit_comp.c | 14 +++++--------- | ||
25 | 1 file changed, 5 insertions(+), 9 deletions(-) | ||
26 | |||
27 | diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c | ||
28 | index 7c1b765..5671752 100644 | ||
29 | --- a/arch/x86/net/bpf_jit_comp.c | ||
30 | +++ b/arch/x86/net/bpf_jit_comp.c | ||
31 | @@ -475,8 +475,10 @@ void bpf_jit_compile(struct sk_filter *fp) | ||
32 | case BPF_S_LD_W_ABS: | ||
33 | func = sk_load_word; | ||
34 | common_load: seen |= SEEN_DATAREF; | ||
35 | - if ((int)K < 0) | ||
36 | + if ((int)K < 0) { | ||
37 | + /* Abort the JIT because __load_pointer() is needed. */ | ||
38 | goto out; | ||
39 | + } | ||
40 | t_offset = func - (image + addrs[i]); | ||
41 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | ||
42 | EMIT1_off32(0xe8, t_offset); /* call */ | ||
43 | @@ -489,14 +491,8 @@ common_load: seen |= SEEN_DATAREF; | ||
44 | goto common_load; | ||
45 | case BPF_S_LDX_B_MSH: | ||
46 | if ((int)K < 0) { | ||
47 | - if (pc_ret0 > 0) { | ||
48 | - /* addrs[pc_ret0 - 1] is the start address */ | ||
49 | - EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]); | ||
50 | - break; | ||
51 | - } | ||
52 | - CLEAR_A(); | ||
53 | - EMIT_JMP(cleanup_addr - addrs[i]); | ||
54 | - break; | ||
55 | + /* Abort the JIT because __load_pointer() is needed. */ | ||
56 | + goto out; | ||
57 | } | ||
58 | seen |= SEEN_DATAREF | SEEN_XREG; | ||
59 | t_offset = sk_load_byte_msh - (image + addrs[i]); | ||
60 | -- | ||
61 | 1.7.9.4 | ||
62 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0134-net-fix-a-potential-rcu_read_lock-imbalance-in-rt6_f.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0134-net-fix-a-potential-rcu_read_lock-imbalance-in-rt6_f.patch new file mode 100644 index 00000000..c0f96637 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0134-net-fix-a-potential-rcu_read_lock-imbalance-in-rt6_f.patch | |||
@@ -0,0 +1,50 @@ | |||
1 | From fa36f84193bedebf0fdfb861e5e9f1dd72044f64 Mon Sep 17 00:00:00 2001 | ||
2 | From: Eric Dumazet <eric.dumazet@gmail.com> | ||
3 | Date: Tue, 27 Mar 2012 09:53:52 +0000 | ||
4 | Subject: [PATCH 134/147] net: fix a potential rcu_read_lock() imbalance in | ||
5 | rt6_fill_node() | ||
6 | |||
7 | [ Upstream commit 94f826b8076e2cb92242061e92f21b5baa3eccc2 ] | ||
8 | |||
9 | Commit f2c31e32b378 (net: fix NULL dereferences in check_peer_redir() ) | ||
10 | added a regression in rt6_fill_node(), leading to rcu_read_lock() | ||
11 | imbalance. | ||
12 | |||
13 | Thats because NLA_PUT() can make a jump to nla_put_failure label. | ||
14 | |||
15 | Fix this by using nla_put() | ||
16 | |||
17 | Many thanks to Ben Greear for his help | ||
18 | |||
19 | Reported-by: Ben Greear <greearb@candelatech.com> | ||
20 | Reported-by: Dave Jones <davej@redhat.com> | ||
21 | Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> | ||
22 | Tested-by: Ben Greear <greearb@candelatech.com> | ||
23 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
24 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
25 | --- | ||
26 | net/ipv6/route.c | 8 ++++++-- | ||
27 | 1 file changed, 6 insertions(+), 2 deletions(-) | ||
28 | |||
29 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
30 | index b582a0a..059b9d9 100644 | ||
31 | --- a/net/ipv6/route.c | ||
32 | +++ b/net/ipv6/route.c | ||
33 | @@ -2446,8 +2446,12 @@ static int rt6_fill_node(struct net *net, | ||
34 | |||
35 | rcu_read_lock(); | ||
36 | n = dst_get_neighbour(&rt->dst); | ||
37 | - if (n) | ||
38 | - NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key); | ||
39 | + if (n) { | ||
40 | + if (nla_put(skb, RTA_GATEWAY, 16, &n->primary_key) < 0) { | ||
41 | + rcu_read_unlock(); | ||
42 | + goto nla_put_failure; | ||
43 | + } | ||
44 | + } | ||
45 | rcu_read_unlock(); | ||
46 | |||
47 | if (rt->dst.dev) | ||
48 | -- | ||
49 | 1.7.9.4 | ||
50 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0135-net-fix-napi_reuse_skb-skb-reserve.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0135-net-fix-napi_reuse_skb-skb-reserve.patch new file mode 100644 index 00000000..b176c8b4 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0135-net-fix-napi_reuse_skb-skb-reserve.patch | |||
@@ -0,0 +1,39 @@ | |||
1 | From 33dbbab6716bf8d3703ccb81a1e7e7084c4b8233 Mon Sep 17 00:00:00 2001 | ||
2 | From: Eric Dumazet <eric.dumazet@gmail.com> | ||
3 | Date: Wed, 21 Mar 2012 06:58:03 +0000 | ||
4 | Subject: [PATCH 135/147] net: fix napi_reuse_skb() skb reserve | ||
5 | |||
6 | [ Upstream commit 2a2a459eeeff48640dc557548ce576d666ab06ed ] | ||
7 | |||
8 | napi->skb is allocated in napi_get_frags() using | ||
9 | netdev_alloc_skb_ip_align(), with a reserve of NET_SKB_PAD + | ||
10 | NET_IP_ALIGN bytes. | ||
11 | |||
12 | However, when such skb is recycled in napi_reuse_skb(), it ends with a | ||
13 | reserve of NET_IP_ALIGN which is suboptimal. | ||
14 | |||
15 | Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> | ||
16 | Cc: Herbert Xu <herbert@gondor.apana.org.au> | ||
17 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
19 | --- | ||
20 | net/core/dev.c | 3 ++- | ||
21 | 1 file changed, 2 insertions(+), 1 deletion(-) | ||
22 | |||
23 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
24 | index c56cacf..55cd370 100644 | ||
25 | --- a/net/core/dev.c | ||
26 | +++ b/net/core/dev.c | ||
27 | @@ -3634,7 +3634,8 @@ EXPORT_SYMBOL(napi_gro_receive); | ||
28 | static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) | ||
29 | { | ||
30 | __skb_pull(skb, skb_headlen(skb)); | ||
31 | - skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb)); | ||
32 | + /* restore the reserve we had after netdev_alloc_skb_ip_align() */ | ||
33 | + skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN - skb_headroom(skb)); | ||
34 | skb->vlan_tci = 0; | ||
35 | skb->dev = napi->dev; | ||
36 | skb->skb_iif = 0; | ||
37 | -- | ||
38 | 1.7.9.4 | ||
39 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0136-Remove-printk-from-rds_sendmsg.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0136-Remove-printk-from-rds_sendmsg.patch new file mode 100644 index 00000000..1164259d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0136-Remove-printk-from-rds_sendmsg.patch | |||
@@ -0,0 +1,31 @@ | |||
1 | From 7a3d883bc2d70f61ca23b7778c945d7e4cf5e10a Mon Sep 17 00:00:00 2001 | ||
2 | From: Dave Jones <davej@redhat.com> | ||
3 | Date: Mon, 19 Mar 2012 13:01:07 +0000 | ||
4 | Subject: [PATCH 136/147] Remove printk from rds_sendmsg | ||
5 | |||
6 | [ Upstream commit a6506e1486181975d318344143aca722b2b91621 ] | ||
7 | |||
8 | no socket layer outputs a message for this error and neither should rds. | ||
9 | |||
10 | Signed-off-by: Dave Jones <davej@redhat.com> | ||
11 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
12 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | --- | ||
14 | net/rds/send.c | 1 - | ||
15 | 1 file changed, 1 deletion(-) | ||
16 | |||
17 | diff --git a/net/rds/send.c b/net/rds/send.c | ||
18 | index e2d63c5..96531d4 100644 | ||
19 | --- a/net/rds/send.c | ||
20 | +++ b/net/rds/send.c | ||
21 | @@ -935,7 +935,6 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | ||
22 | /* Mirror Linux UDP mirror of BSD error message compatibility */ | ||
23 | /* XXX: Perhaps MSG_MORE someday */ | ||
24 | if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_CMSG_COMPAT)) { | ||
25 | - printk(KERN_INFO "msg_flags 0x%08X\n", msg->msg_flags); | ||
26 | ret = -EOPNOTSUPP; | ||
27 | goto out; | ||
28 | } | ||
29 | -- | ||
30 | 1.7.9.4 | ||
31 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0137-sky2-override-for-PCI-legacy-power-management.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0137-sky2-override-for-PCI-legacy-power-management.patch new file mode 100644 index 00000000..6e4cc9f8 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0137-sky2-override-for-PCI-legacy-power-management.patch | |||
@@ -0,0 +1,52 @@ | |||
1 | From 82df145d92f585fd22bc74921a3dc184d54be9d3 Mon Sep 17 00:00:00 2001 | ||
2 | From: stephen hemminger <shemminger@vyatta.com> | ||
3 | Date: Wed, 21 Mar 2012 05:32:05 +0000 | ||
4 | Subject: [PATCH 137/147] sky2: override for PCI legacy power management | ||
5 | |||
6 | [ Upstream commit 5676cc7bfe1e388e87843f71daa229610385b41e ] | ||
7 | |||
8 | Some BIOS's don't setup power management correctly (what else is | ||
9 | new) and don't allow use of PCI Express power control. Add a special | ||
10 | exception module parameter to allow working around this issue. | ||
11 | Based on slightly different patch by Knut Petersen. | ||
12 | |||
13 | Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl> | ||
14 | Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> | ||
15 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | drivers/net/ethernet/marvell/sky2.c | 11 +++++++++++ | ||
19 | 1 file changed, 11 insertions(+) | ||
20 | |||
21 | diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c | ||
22 | index 7803efa..f612b35 100644 | ||
23 | --- a/drivers/net/ethernet/marvell/sky2.c | ||
24 | +++ b/drivers/net/ethernet/marvell/sky2.c | ||
25 | @@ -95,6 +95,10 @@ static int disable_msi = 0; | ||
26 | module_param(disable_msi, int, 0); | ||
27 | MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | ||
28 | |||
29 | +static int legacy_pme = 0; | ||
30 | +module_param(legacy_pme, int, 0); | ||
31 | +MODULE_PARM_DESC(legacy_pme, "Legacy power management"); | ||
32 | + | ||
33 | static DEFINE_PCI_DEVICE_TABLE(sky2_id_table) = { | ||
34 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */ | ||
35 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */ | ||
36 | @@ -867,6 +871,13 @@ static void sky2_wol_init(struct sky2_port *sky2) | ||
37 | /* Disable PiG firmware */ | ||
38 | sky2_write16(hw, B0_CTST, Y2_HW_WOL_OFF); | ||
39 | |||
40 | + /* Needed by some broken BIOSes, use PCI rather than PCI-e for WOL */ | ||
41 | + if (legacy_pme) { | ||
42 | + u32 reg1 = sky2_pci_read32(hw, PCI_DEV_REG1); | ||
43 | + reg1 |= PCI_Y2_PME_LEGACY; | ||
44 | + sky2_pci_write32(hw, PCI_DEV_REG1, reg1); | ||
45 | + } | ||
46 | + | ||
47 | /* block receiver */ | ||
48 | sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET); | ||
49 | sky2_read32(hw, B0_CTST); | ||
50 | -- | ||
51 | 1.7.9.4 | ||
52 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0138-xfrm-Access-the-replay-notify-functions-via-the-regi.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0138-xfrm-Access-the-replay-notify-functions-via-the-regi.patch new file mode 100644 index 00000000..d030cc74 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0138-xfrm-Access-the-replay-notify-functions-via-the-regi.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | From eaa691b3cd85066e4f84583f7b818372c86a4bc2 Mon Sep 17 00:00:00 2001 | ||
2 | From: Steffen Klassert <steffen.klassert@secunet.com> | ||
3 | Date: Wed, 21 Mar 2012 23:36:13 +0000 | ||
4 | Subject: [PATCH 138/147] xfrm: Access the replay notify functions via the | ||
5 | registered callbacks | ||
6 | |||
7 | [ Upstream commit 1265fd616782ef03b98fd19f65c2b47fcd4ea11f ] | ||
8 | |||
9 | We call the wrong replay notify function when we use ESN replay | ||
10 | handling. This leads to the fact that we don't send notifications | ||
11 | if we use ESN. Fix this by calling the registered callbacks instead | ||
12 | of xfrm_replay_notify(). | ||
13 | |||
14 | Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> | ||
15 | Signed-off-by: David S. Miller <davem@davemloft.net> | ||
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
17 | --- | ||
18 | net/xfrm/xfrm_replay.c | 6 +++--- | ||
19 | 1 file changed, 3 insertions(+), 3 deletions(-) | ||
20 | |||
21 | diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c | ||
22 | index 39e02c5..2f6d11d 100644 | ||
23 | --- a/net/xfrm/xfrm_replay.c | ||
24 | +++ b/net/xfrm/xfrm_replay.c | ||
25 | @@ -167,7 +167,7 @@ static void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq) | ||
26 | } | ||
27 | |||
28 | if (xfrm_aevent_is_on(xs_net(x))) | ||
29 | - xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); | ||
30 | + x->repl->notify(x, XFRM_REPLAY_UPDATE); | ||
31 | } | ||
32 | |||
33 | static int xfrm_replay_overflow_bmp(struct xfrm_state *x, struct sk_buff *skb) | ||
34 | @@ -279,7 +279,7 @@ static void xfrm_replay_advance_bmp(struct xfrm_state *x, __be32 net_seq) | ||
35 | replay_esn->bmp[nr] |= (1U << bitnr); | ||
36 | |||
37 | if (xfrm_aevent_is_on(xs_net(x))) | ||
38 | - xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); | ||
39 | + x->repl->notify(x, XFRM_REPLAY_UPDATE); | ||
40 | } | ||
41 | |||
42 | static void xfrm_replay_notify_bmp(struct xfrm_state *x, int event) | ||
43 | @@ -473,7 +473,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | ||
44 | replay_esn->bmp[nr] |= (1U << bitnr); | ||
45 | |||
46 | if (xfrm_aevent_is_on(xs_net(x))) | ||
47 | - xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); | ||
48 | + x->repl->notify(x, XFRM_REPLAY_UPDATE); | ||
49 | } | ||
50 | |||
51 | static struct xfrm_replay xfrm_replay_legacy = { | ||
52 | -- | ||
53 | 1.7.9.4 | ||
54 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0139-lockd-fix-arg-parsing-for-grace_period-and-timeout.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0139-lockd-fix-arg-parsing-for-grace_period-and-timeout.patch new file mode 100644 index 00000000..3e15c068 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0139-lockd-fix-arg-parsing-for-grace_period-and-timeout.patch | |||
@@ -0,0 +1,40 @@ | |||
1 | From a0ef4bd55a5a7d190eeceb4d1626988af68a2f0e Mon Sep 17 00:00:00 2001 | ||
2 | From: NeilBrown <neilb@suse.de> | ||
3 | Date: Tue, 7 Feb 2012 15:35:42 +1100 | ||
4 | Subject: [PATCH 139/147] lockd: fix arg parsing for grace_period and timeout. | ||
5 | |||
6 | commit de5b8e8e047534aac6bc9803f96e7257436aef9c upstream. | ||
7 | |||
8 | If you try to set grace_period or timeout via a module parameter | ||
9 | to lockd, and do this on a big-endian machine where | ||
10 | |||
11 | sizeof(int) != sizeof(unsigned long) | ||
12 | |||
13 | it won't work. This number given will be effectively shifted right | ||
14 | by the difference in those two sizes. | ||
15 | |||
16 | So cast kp->arg properly to get correct result. | ||
17 | |||
18 | Signed-off-by: NeilBrown <neilb@suse.de> | ||
19 | Signed-off-by: J. Bruce Fields <bfields@redhat.com> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | fs/lockd/svc.c | 2 +- | ||
23 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
24 | |||
25 | diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c | ||
26 | index c061b9a..2444780 100644 | ||
27 | --- a/fs/lockd/svc.c | ||
28 | +++ b/fs/lockd/svc.c | ||
29 | @@ -440,7 +440,7 @@ static int param_set_##name(const char *val, struct kernel_param *kp) \ | ||
30 | __typeof__(type) num = which_strtol(val, &endp, 0); \ | ||
31 | if (endp == val || *endp || num < (min) || num > (max)) \ | ||
32 | return -EINVAL; \ | ||
33 | - *((int *) kp->arg) = num; \ | ||
34 | + *((type *) kp->arg) = num; \ | ||
35 | return 0; \ | ||
36 | } | ||
37 | |||
38 | -- | ||
39 | 1.7.9.4 | ||
40 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0140-x86-tsc-Skip-refined-tsc-calibration-on-systems-with.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0140-x86-tsc-Skip-refined-tsc-calibration-on-systems-with.patch new file mode 100644 index 00000000..637e830b --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0140-x86-tsc-Skip-refined-tsc-calibration-on-systems-with.patch | |||
@@ -0,0 +1,62 @@ | |||
1 | From 6361e158f9827a43f7f20342c5f58a46ac003fb1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Alok Kataria <akataria@vmware.com> | ||
3 | Date: Tue, 21 Feb 2012 18:19:55 -0800 | ||
4 | Subject: [PATCH 140/147] x86, tsc: Skip refined tsc calibration on systems | ||
5 | with reliable TSC | ||
6 | |||
7 | commit 57779dc2b3b75bee05ef5d1ada47f615f7a13932 upstream. | ||
8 | |||
9 | While running the latest Linux as guest under VMware in highly | ||
10 | over-committed situations, we have seen cases when the refined TSC | ||
11 | algorithm fails to get a valid tsc_start value in | ||
12 | tsc_refine_calibration_work from multiple attempts. As a result the | ||
13 | kernel keeps on scheduling the tsc_irqwork task for later. Subsequently | ||
14 | after several attempts when it gets a valid start value it goes through | ||
15 | the refined calibration and either bails out or uses the new results. | ||
16 | Given that the kernel originally read the TSC frequency from the | ||
17 | platform, which is the best it can get, I don't think there is much | ||
18 | value in refining it. | ||
19 | |||
20 | So for systems which get the TSC frequency from the platform we | ||
21 | should skip the refined tsc algorithm. | ||
22 | |||
23 | We can use the TSC_RELIABLE cpu cap flag to detect this, right now it is | ||
24 | set only on VMware and for Moorestown Penwell both of which have there | ||
25 | own TSC calibration methods. | ||
26 | |||
27 | Signed-off-by: Alok N Kataria <akataria@vmware.com> | ||
28 | Cc: John Stultz <johnstul@us.ibm.com> | ||
29 | Cc: Dirk Brandewie <dirk.brandewie@gmail.com> | ||
30 | Cc: Alan Cox <alan@linux.intel.com> | ||
31 | [jstultz: Reworked to simply not schedule the refining work, | ||
32 | rather then scheduling the work and bombing out later] | ||
33 | Signed-off-by: John Stultz <john.stultz@linaro.org> | ||
34 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
35 | --- | ||
36 | arch/x86/kernel/tsc.c | 10 ++++++++++ | ||
37 | 1 file changed, 10 insertions(+) | ||
38 | |||
39 | diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c | ||
40 | index db48336..3fe298a 100644 | ||
41 | --- a/arch/x86/kernel/tsc.c | ||
42 | +++ b/arch/x86/kernel/tsc.c | ||
43 | @@ -934,6 +934,16 @@ static int __init init_tsc_clocksource(void) | ||
44 | clocksource_tsc.rating = 0; | ||
45 | clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS; | ||
46 | } | ||
47 | + | ||
48 | + /* | ||
49 | + * Trust the results of the earlier calibration on systems | ||
50 | + * exporting a reliable TSC. | ||
51 | + */ | ||
52 | + if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) { | ||
53 | + clocksource_register_khz(&clocksource_tsc, tsc_khz); | ||
54 | + return 0; | ||
55 | + } | ||
56 | + | ||
57 | schedule_delayed_work(&tsc_irqwork, 0); | ||
58 | return 0; | ||
59 | } | ||
60 | -- | ||
61 | 1.7.9.4 | ||
62 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0141-x86-tls-Off-by-one-limit-check.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0141-x86-tls-Off-by-one-limit-check.patch new file mode 100644 index 00000000..a4510efc --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0141-x86-tls-Off-by-one-limit-check.patch | |||
@@ -0,0 +1,43 @@ | |||
1 | From 2d52fe6cb2d5afcd27d1c675484bdcbefaad6d2c Mon Sep 17 00:00:00 2001 | ||
2 | From: Dan Carpenter <dan.carpenter@oracle.com> | ||
3 | Date: Sat, 24 Mar 2012 10:52:50 +0300 | ||
4 | Subject: [PATCH 141/147] x86, tls: Off by one limit check | ||
5 | |||
6 | commit 8f0750f19789cf352d7e24a6cc50f2ab1b4f1372 upstream. | ||
7 | |||
8 | These are used as offsets into an array of GDT_ENTRY_TLS_ENTRIES members | ||
9 | so GDT_ENTRY_TLS_ENTRIES is one past the end of the array. | ||
10 | |||
11 | Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> | ||
12 | Link: http://lkml.kernel.org/r/20120324075250.GA28258@elgon.mountain | ||
13 | Signed-off-by: H. Peter Anvin <hpa@zytor.com> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
15 | --- | ||
16 | arch/x86/kernel/tls.c | 4 ++-- | ||
17 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
18 | |||
19 | diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c | ||
20 | index 6bb7b85..bcfec2d 100644 | ||
21 | --- a/arch/x86/kernel/tls.c | ||
22 | +++ b/arch/x86/kernel/tls.c | ||
23 | @@ -163,7 +163,7 @@ int regset_tls_get(struct task_struct *target, const struct user_regset *regset, | ||
24 | { | ||
25 | const struct desc_struct *tls; | ||
26 | |||
27 | - if (pos > GDT_ENTRY_TLS_ENTRIES * sizeof(struct user_desc) || | ||
28 | + if (pos >= GDT_ENTRY_TLS_ENTRIES * sizeof(struct user_desc) || | ||
29 | (pos % sizeof(struct user_desc)) != 0 || | ||
30 | (count % sizeof(struct user_desc)) != 0) | ||
31 | return -EINVAL; | ||
32 | @@ -198,7 +198,7 @@ int regset_tls_set(struct task_struct *target, const struct user_regset *regset, | ||
33 | struct user_desc infobuf[GDT_ENTRY_TLS_ENTRIES]; | ||
34 | const struct user_desc *info; | ||
35 | |||
36 | - if (pos > GDT_ENTRY_TLS_ENTRIES * sizeof(struct user_desc) || | ||
37 | + if (pos >= GDT_ENTRY_TLS_ENTRIES * sizeof(struct user_desc) || | ||
38 | (pos % sizeof(struct user_desc)) != 0 || | ||
39 | (count % sizeof(struct user_desc)) != 0) | ||
40 | return -EINVAL; | ||
41 | -- | ||
42 | 1.7.9.4 | ||
43 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0142-compat-use-sys_sendfile64-implementation-for-sendfil.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0142-compat-use-sys_sendfile64-implementation-for-sendfil.patch new file mode 100644 index 00000000..a93ecf81 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0142-compat-use-sys_sendfile64-implementation-for-sendfil.patch | |||
@@ -0,0 +1,40 @@ | |||
1 | From c6fc3006639bfddf212067de1c13a8345019d934 Mon Sep 17 00:00:00 2001 | ||
2 | From: Chris Metcalf <cmetcalf@tilera.com> | ||
3 | Date: Mon, 26 Mar 2012 16:26:12 -0400 | ||
4 | Subject: [PATCH 142/147] compat: use sys_sendfile64() implementation for | ||
5 | sendfile syscall | ||
6 | |||
7 | commit 1631fcea8399da5e80a80084b3b8c5bfd99d21e7 upstream. | ||
8 | |||
9 | <asm-generic/unistd.h> was set up to use sys_sendfile() for the 32-bit | ||
10 | compat API instead of sys_sendfile64(), but in fact the right thing to | ||
11 | do is to use sys_sendfile64() in all cases. The 32-bit sendfile64() API | ||
12 | in glibc uses the sendfile64 syscall, so it has to be capable of doing | ||
13 | full 64-bit operations. But the sys_sendfile() kernel implementation | ||
14 | has a MAX_NON_LFS test in it which explicitly limits the offset to 2^32. | ||
15 | So, we need to use the sys_sendfile64() implementation in the kernel | ||
16 | for this case. | ||
17 | |||
18 | Acked-by: Arnd Bergmann <arnd@arndb.de> | ||
19 | Signed-off-by: Chris Metcalf <cmetcalf@tilera.com> | ||
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
21 | --- | ||
22 | include/asm-generic/unistd.h | 2 +- | ||
23 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
24 | |||
25 | diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h | ||
26 | index 2292d1a..991ef01 100644 | ||
27 | --- a/include/asm-generic/unistd.h | ||
28 | +++ b/include/asm-generic/unistd.h | ||
29 | @@ -218,7 +218,7 @@ __SC_COMP(__NR_pwritev, sys_pwritev, compat_sys_pwritev) | ||
30 | |||
31 | /* fs/sendfile.c */ | ||
32 | #define __NR3264_sendfile 71 | ||
33 | -__SC_3264(__NR3264_sendfile, sys_sendfile64, sys_sendfile) | ||
34 | +__SYSCALL(__NR3264_sendfile, sys_sendfile64) | ||
35 | |||
36 | /* fs/select.c */ | ||
37 | #define __NR_pselect6 72 | ||
38 | -- | ||
39 | 1.7.9.4 | ||
40 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0143-rtc-Provide-flag-for-rtc-devices-that-don-t-support-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0143-rtc-Provide-flag-for-rtc-devices-that-don-t-support-.patch new file mode 100644 index 00000000..1f202723 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0143-rtc-Provide-flag-for-rtc-devices-that-don-t-support-.patch | |||
@@ -0,0 +1,76 @@ | |||
1 | From 04cb3b02d54277c9db7bf8b185f41839317e40b1 Mon Sep 17 00:00:00 2001 | ||
2 | From: John Stultz <john.stultz@linaro.org> | ||
3 | Date: Tue, 6 Mar 2012 17:16:09 -0800 | ||
4 | Subject: [PATCH 143/147] rtc: Provide flag for rtc devices that don't support | ||
5 | UIE | ||
6 | |||
7 | commit 4a649903f91232d02284d53724b0a45728111767 upstream. | ||
8 | |||
9 | Richard Weinberger noticed that on some RTC hardware that | ||
10 | doesn't support UIE mode, due to coarse granular alarms | ||
11 | (like 1minute resolution), the current virtualized RTC | ||
12 | support doesn't properly error out when UIE is enabled. | ||
13 | |||
14 | Instead the current code queues an alarm for the next second, | ||
15 | but it won't fire until up to a miniute later. | ||
16 | |||
17 | This patch provides a generic way to flag this sort of hardware | ||
18 | and fixes the issue on the mpc5121 where Richard noticed the | ||
19 | problem. | ||
20 | |||
21 | Reported-by: Richard Weinberger <richard@nod.at> | ||
22 | Tested-by: Richard Weinberger <richard@nod.at> | ||
23 | Signed-off-by: John Stultz <john.stultz@linaro.org> | ||
24 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
25 | --- | ||
26 | drivers/rtc/interface.c | 5 +++++ | ||
27 | drivers/rtc/rtc-mpc5121.c | 2 ++ | ||
28 | include/linux/rtc.h | 3 ++- | ||
29 | 3 files changed, 9 insertions(+), 1 deletion(-) | ||
30 | |||
31 | diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c | ||
32 | index c1edbf8..565742b 100644 | ||
33 | --- a/drivers/rtc/interface.c | ||
34 | +++ b/drivers/rtc/interface.c | ||
35 | @@ -445,6 +445,11 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) | ||
36 | if (rtc->uie_rtctimer.enabled == enabled) | ||
37 | goto out; | ||
38 | |||
39 | + if (rtc->uie_unsupported) { | ||
40 | + err = -EINVAL; | ||
41 | + goto out; | ||
42 | + } | ||
43 | + | ||
44 | if (enabled) { | ||
45 | struct rtc_time tm; | ||
46 | ktime_t now, onesec; | ||
47 | diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c | ||
48 | index da60915..0fc2d22 100644 | ||
49 | --- a/drivers/rtc/rtc-mpc5121.c | ||
50 | +++ b/drivers/rtc/rtc-mpc5121.c | ||
51 | @@ -360,6 +360,8 @@ static int __devinit mpc5121_rtc_probe(struct platform_device *op) | ||
52 | &mpc5200_rtc_ops, THIS_MODULE); | ||
53 | } | ||
54 | |||
55 | + rtc->rtc->uie_unsupported = 1; | ||
56 | + | ||
57 | if (IS_ERR(rtc->rtc)) { | ||
58 | err = PTR_ERR(rtc->rtc); | ||
59 | goto out_free_irq; | ||
60 | diff --git a/include/linux/rtc.h b/include/linux/rtc.h | ||
61 | index 93f4d03..fcabfb4 100644 | ||
62 | --- a/include/linux/rtc.h | ||
63 | +++ b/include/linux/rtc.h | ||
64 | @@ -202,7 +202,8 @@ struct rtc_device | ||
65 | struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */ | ||
66 | int pie_enabled; | ||
67 | struct work_struct irqwork; | ||
68 | - | ||
69 | + /* Some hardware can't support UIE mode */ | ||
70 | + int uie_unsupported; | ||
71 | |||
72 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | ||
73 | struct work_struct uie_task; | ||
74 | -- | ||
75 | 1.7.9.4 | ||
76 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0144-nfsd-don-t-allow-zero-length-strings-in-cache_parse.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0144-nfsd-don-t-allow-zero-length-strings-in-cache_parse.patch new file mode 100644 index 00000000..de5ea80c --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0144-nfsd-don-t-allow-zero-length-strings-in-cache_parse.patch | |||
@@ -0,0 +1,35 @@ | |||
1 | From 43917d0f4bc9e7b8d6f0cafd29da95d52f587c58 Mon Sep 17 00:00:00 2001 | ||
2 | From: Dan Carpenter <dan.carpenter@oracle.com> | ||
3 | Date: Wed, 18 Jan 2012 12:56:02 +0300 | ||
4 | Subject: [PATCH 144/147] nfsd: don't allow zero length strings in | ||
5 | cache_parse() | ||
6 | |||
7 | commit 6d8d17499810479eabd10731179c04b2ca22152f upstream. | ||
8 | |||
9 | There is no point in passing a zero length string here and quite a | ||
10 | few of that cache_parse() implementations will Oops if count is | ||
11 | zero. | ||
12 | |||
13 | Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> | ||
14 | Signed-off-by: J. Bruce Fields <bfields@redhat.com> | ||
15 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
16 | --- | ||
17 | net/sunrpc/cache.c | 2 ++ | ||
18 | 1 file changed, 2 insertions(+) | ||
19 | |||
20 | diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c | ||
21 | index 72ad836..4530a91 100644 | ||
22 | --- a/net/sunrpc/cache.c | ||
23 | +++ b/net/sunrpc/cache.c | ||
24 | @@ -828,6 +828,8 @@ static ssize_t cache_do_downcall(char *kaddr, const char __user *buf, | ||
25 | { | ||
26 | ssize_t ret; | ||
27 | |||
28 | + if (count == 0) | ||
29 | + return -EINVAL; | ||
30 | if (copy_from_user(kaddr, buf, count)) | ||
31 | return -EFAULT; | ||
32 | kaddr[count] = '\0'; | ||
33 | -- | ||
34 | 1.7.9.4 | ||
35 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0145-serial-sh-sci-fix-a-race-of-DMA-submit_tx-on-transfe.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0145-serial-sh-sci-fix-a-race-of-DMA-submit_tx-on-transfe.patch new file mode 100644 index 00000000..14546aa5 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0145-serial-sh-sci-fix-a-race-of-DMA-submit_tx-on-transfe.patch | |||
@@ -0,0 +1,91 @@ | |||
1 | From 3e2440eb910fa022dedfd93ecc868155dbd14fe1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Yoshii Takashi <takashi.yoshii.zj@renesas.com> | ||
3 | Date: Wed, 14 Mar 2012 16:14:43 +0900 | ||
4 | Subject: [PATCH 145/147] serial: sh-sci: fix a race of DMA submit_tx on | ||
5 | transfer | ||
6 | |||
7 | commit 49d4bcaddca977fffdea8b0b71f6e5da96dac78e upstream. | ||
8 | |||
9 | When DMA is enabled, sh-sci transfer begins with | ||
10 | uart_start() | ||
11 | sci_start_tx() | ||
12 | if (cookie_tx < 0) schedule_work() | ||
13 | Then, starts DMA when wq scheduled, -- (A) | ||
14 | process_one_work() | ||
15 | work_fn_rx() | ||
16 | cookie_tx = desc->submit_tx() | ||
17 | And finishes when DMA transfer ends, -- (B) | ||
18 | sci_dma_tx_complete() | ||
19 | async_tx_ack() | ||
20 | cookie_tx = -EINVAL | ||
21 | (possible another schedule_work()) | ||
22 | |||
23 | This A to B sequence is not reentrant, since controlling variables | ||
24 | (for example, cookie_tx above) are not queues nor lists. So, they | ||
25 | must be invoked as A B A B..., otherwise results in kernel crash. | ||
26 | |||
27 | To ensure the sequence, sci_start_tx() seems to test if cookie_tx < 0 | ||
28 | (represents "not used") to call schedule_work(). | ||
29 | But cookie_tx will not be set (to a cookie, also means "used") until | ||
30 | in the middle of work queue scheduled function work_fn_tx(). | ||
31 | |||
32 | This gap between the test and set allows the breakage of the sequence | ||
33 | under the very frequently call of uart_start(). | ||
34 | Another gap between async_tx_ack() and another schedule_work() results | ||
35 | in the same issue, too. | ||
36 | |||
37 | This patch introduces a new condition "cookie_tx == 0" just to mark | ||
38 | it is "busy" and assign it within spin-locked region to fill the gaps. | ||
39 | |||
40 | Signed-off-by: Takashi Yoshii <takashi.yoshii.zj@renesas.com> | ||
41 | Reviewed-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | ||
42 | Signed-off-by: Paul Mundt <lethal@linux-sh.org> | ||
43 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
44 | --- | ||
45 | drivers/tty/serial/sh-sci.c | 15 ++++++++++----- | ||
46 | 1 file changed, 10 insertions(+), 5 deletions(-) | ||
47 | |||
48 | diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c | ||
49 | index aff9d61..829e51a 100644 | ||
50 | --- a/drivers/tty/serial/sh-sci.c | ||
51 | +++ b/drivers/tty/serial/sh-sci.c | ||
52 | @@ -1123,17 +1123,20 @@ static void sci_dma_tx_complete(void *arg) | ||
53 | port->icount.tx += sg_dma_len(&s->sg_tx); | ||
54 | |||
55 | async_tx_ack(s->desc_tx); | ||
56 | - s->cookie_tx = -EINVAL; | ||
57 | s->desc_tx = NULL; | ||
58 | |||
59 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | ||
60 | uart_write_wakeup(port); | ||
61 | |||
62 | if (!uart_circ_empty(xmit)) { | ||
63 | + s->cookie_tx = 0; | ||
64 | schedule_work(&s->work_tx); | ||
65 | - } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { | ||
66 | - u16 ctrl = sci_in(port, SCSCR); | ||
67 | - sci_out(port, SCSCR, ctrl & ~SCSCR_TIE); | ||
68 | + } else { | ||
69 | + s->cookie_tx = -EINVAL; | ||
70 | + if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { | ||
71 | + u16 ctrl = sci_in(port, SCSCR); | ||
72 | + sci_out(port, SCSCR, ctrl & ~SCSCR_TIE); | ||
73 | + } | ||
74 | } | ||
75 | |||
76 | spin_unlock_irqrestore(&port->lock, flags); | ||
77 | @@ -1395,8 +1398,10 @@ static void sci_start_tx(struct uart_port *port) | ||
78 | } | ||
79 | |||
80 | if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) && | ||
81 | - s->cookie_tx < 0) | ||
82 | + s->cookie_tx < 0) { | ||
83 | + s->cookie_tx = 0; | ||
84 | schedule_work(&s->work_tx); | ||
85 | + } | ||
86 | #endif | ||
87 | |||
88 | if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) { | ||
89 | -- | ||
90 | 1.7.9.4 | ||
91 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0146-ASPM-Fix-pcie-devices-with-non-pcie-children.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0146-ASPM-Fix-pcie-devices-with-non-pcie-children.patch new file mode 100644 index 00000000..9d2291bf --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0146-ASPM-Fix-pcie-devices-with-non-pcie-children.patch | |||
@@ -0,0 +1,72 @@ | |||
1 | From f1bc4d09cd5cb0d91b7ab742b0bc2c6ea7ed9a10 Mon Sep 17 00:00:00 2001 | ||
2 | From: Matthew Garrett <mjg@redhat.com> | ||
3 | Date: Tue, 27 Mar 2012 10:17:41 -0400 | ||
4 | Subject: [PATCH 146/147] ASPM: Fix pcie devices with non-pcie children | ||
5 | |||
6 | commit c9651e70ad0aa499814817cbf3cc1d0b806ed3a1 upstream. | ||
7 | |||
8 | Since 3.2.12 and 3.3, some systems are failing to boot with a BUG_ON. | ||
9 | Some other systems using the pata_jmicron driver fail to boot because no | ||
10 | disks are detected. Passing pcie_aspm=force on the kernel command line | ||
11 | works around it. | ||
12 | |||
13 | The cause: commit 4949be16822e ("PCI: ignore pre-1.1 ASPM quirking when | ||
14 | ASPM is disabled") changed the behaviour of pcie_aspm_sanity_check() to | ||
15 | always return 0 if aspm is disabled, in order to avoid cases where we | ||
16 | changed ASPM state on pre-PCIe 1.1 devices. | ||
17 | |||
18 | This skipped the secondary function of pcie_aspm_sanity_check which was | ||
19 | to avoid us enabling ASPM on devices that had non-PCIe children, causing | ||
20 | trouble later on. Move the aspm_disabled check so we continue to honour | ||
21 | that scenario. | ||
22 | |||
23 | Addresses https://bugzilla.kernel.org/show_bug.cgi?id=42979 and | ||
24 | http://bugs.debian.org/665420 | ||
25 | |||
26 | Reported-by: Romain Francoise <romain@orebokech.com> # kernel panic | ||
27 | Reported-by: Chris Holland <bandidoirlandes@gmail.com> # disk detection trouble | ||
28 | Signed-off-by: Matthew Garrett <mjg@redhat.com> | ||
29 | Tested-by: Hatem Masmoudi <hatem.masmoudi@gmail.com> # Dell Latitude E5520 | ||
30 | Tested-by: janek <jan0x6c@gmail.com> # pata_jmicron with JMB362/JMB363 | ||
31 | [jn: with more symptoms in log message] | ||
32 | Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> | ||
33 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
34 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
35 | --- | ||
36 | drivers/pci/pcie/aspm.c | 13 ++++++++++--- | ||
37 | 1 file changed, 10 insertions(+), 3 deletions(-) | ||
38 | |||
39 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c | ||
40 | index 24f049e..2275162 100644 | ||
41 | --- a/drivers/pci/pcie/aspm.c | ||
42 | +++ b/drivers/pci/pcie/aspm.c | ||
43 | @@ -500,9 +500,6 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | ||
44 | int pos; | ||
45 | u32 reg32; | ||
46 | |||
47 | - if (aspm_disabled) | ||
48 | - return 0; | ||
49 | - | ||
50 | /* | ||
51 | * Some functions in a slot might not all be PCIe functions, | ||
52 | * very strange. Disable ASPM for the whole slot | ||
53 | @@ -511,6 +508,16 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | ||
54 | pos = pci_pcie_cap(child); | ||
55 | if (!pos) | ||
56 | return -EINVAL; | ||
57 | + | ||
58 | + /* | ||
59 | + * If ASPM is disabled then we're not going to change | ||
60 | + * the BIOS state. It's safe to continue even if it's a | ||
61 | + * pre-1.1 device | ||
62 | + */ | ||
63 | + | ||
64 | + if (aspm_disabled) | ||
65 | + continue; | ||
66 | + | ||
67 | /* | ||
68 | * Disable ASPM for pre-1.1 PCIe device, we follow MS to use | ||
69 | * RBER bit to determine if a function is 1.1 version device | ||
70 | -- | ||
71 | 1.7.9.4 | ||
72 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0147-Linux-3.2.14.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0147-Linux-3.2.14.patch new file mode 100644 index 00000000..6a9f27c6 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.14/0147-Linux-3.2.14.patch | |||
@@ -0,0 +1,24 @@ | |||
1 | From 6c99e5e88e70f85b97e9363c80763e306ac3296c Mon Sep 17 00:00:00 2001 | ||
2 | From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
3 | Date: Mon, 2 Apr 2012 09:53:31 -0700 | ||
4 | Subject: [PATCH 147/147] Linux 3.2.14 | ||
5 | |||
6 | --- | ||
7 | Makefile | 2 +- | ||
8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
9 | |||
10 | diff --git a/Makefile b/Makefile | ||
11 | index 172e041..afe4c7d 100644 | ||
12 | --- a/Makefile | ||
13 | +++ b/Makefile | ||
14 | @@ -1,6 +1,6 @@ | ||
15 | VERSION = 3 | ||
16 | PATCHLEVEL = 2 | ||
17 | -SUBLEVEL = 13 | ||
18 | +SUBLEVEL = 14 | ||
19 | EXTRAVERSION = | ||
20 | NAME = Saber-toothed Squirrel | ||
21 | |||
22 | -- | ||
23 | 1.7.9.4 | ||
24 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp_3.2.bb b/recipes-kernel/linux/linux-ti33x-psp_3.2.bb index 16c0dd42..9a5d31fe 100644 --- a/recipes-kernel/linux/linux-ti33x-psp_3.2.bb +++ b/recipes-kernel/linux/linux-ti33x-psp_3.2.bb | |||
@@ -12,7 +12,7 @@ MULTI_CONFIG_BASE_SUFFIX = "" | |||
12 | 12 | ||
13 | BRANCH = "v3.2-staging" | 13 | BRANCH = "v3.2-staging" |
14 | SRCREV = "09e9651bcf2ee8d86685f2a8075bc6557b1d3b91" | 14 | SRCREV = "09e9651bcf2ee8d86685f2a8075bc6557b1d3b91" |
15 | MACHINE_KERNEL_PR_append = "c+gitr${SRCREV}" | 15 | MACHINE_KERNEL_PR_append = "a+gitr${SRCREV}" |
16 | 16 | ||
17 | COMPATIBLE_MACHINE = "(ti33x)" | 17 | COMPATIBLE_MACHINE = "(ti33x)" |
18 | 18 | ||
@@ -645,6 +645,153 @@ PATCHES_OVER_PSP = " \ | |||
645 | file://3.2.13/0008-iwl3945-fix-possible-il-txq-NULL-pointer-dereference.patch \ | 645 | file://3.2.13/0008-iwl3945-fix-possible-il-txq-NULL-pointer-dereference.patch \ |
646 | file://3.2.13/0009-powerpc-pmac-Fix-SMP-kernels-on-pre-core99-UP-machin.patch \ | 646 | file://3.2.13/0009-powerpc-pmac-Fix-SMP-kernels-on-pre-core99-UP-machin.patch \ |
647 | file://3.2.13/0010-Linux-3.2.13.patch \ | 647 | file://3.2.13/0010-Linux-3.2.13.patch \ |
648 | file://3.2.14/0001-USB-option-Add-MediaTek-MT6276M-modem-app-interfaces.patch \ | ||
649 | file://3.2.14/0002-USB-option-driver-adding-support-for-Telit-CC864-SIN.patch \ | ||
650 | file://3.2.14/0003-USB-option-make-interface-blacklist-work-again.patch \ | ||
651 | file://3.2.14/0004-USB-option-add-ZTE-MF820D.patch \ | ||
652 | file://3.2.14/0005-staging-zcache-avoid-AB-BA-deadlock-condition.patch \ | ||
653 | file://3.2.14/0006-USB-ftdi_sio-fix-problem-when-the-manufacture-is-a-N.patch \ | ||
654 | file://3.2.14/0007-USB-ftdi_sio-add-support-for-BeagleBone-rev-A5.patch \ | ||
655 | file://3.2.14/0008-USB-Microchip-VID-mislabeled-as-Hornby-VID-in-ftdi_s.patch \ | ||
656 | file://3.2.14/0009-USB-ftdi_sio-new-PID-Distortec-JTAG-lock-pick.patch \ | ||
657 | file://3.2.14/0010-USB-ftdi_sio-add-support-for-FT-X-series-devices.patch \ | ||
658 | file://3.2.14/0011-USB-ftdi_sio-new-PID-LUMEL-PD12.patch \ | ||
659 | file://3.2.14/0012-powerpc-usb-fix-bug-of-kernel-hang-when-initializing.patch \ | ||
660 | file://3.2.14/0013-staging-r8712u-Add-missing-initialization-and-remove.patch \ | ||
661 | file://3.2.14/0014-staging-r8712u-Fix-regression-introduced-by-commit-a.patch \ | ||
662 | file://3.2.14/0015-staging-r8712u-Fix-regression-in-signal-level-after-.patch \ | ||
663 | file://3.2.14/0016-usb-dwc3-fix-bogus-test-in-dwc3_gadget_start_isoc.patch \ | ||
664 | file://3.2.14/0017-usb-dwc3-use-proper-function-for-setting-endpoint-na.patch \ | ||
665 | file://3.2.14/0018-usb-gadgetfs-return-number-of-bytes-on-ep0-read-requ.patch \ | ||
666 | file://3.2.14/0019-USB-gadget-Make-g_hid-device-class-conform-to-spec.patch \ | ||
667 | file://3.2.14/0020-futex-Cover-all-PI-opcodes-with-cmpxchg-enabled-chec.patch \ | ||
668 | file://3.2.14/0021-sysfs-Fix-memory-leak-in-sysfs_sd_setsecdata.patch \ | ||
669 | file://3.2.14/0022-tty-moxa-fix-bit-test-in-moxa_start.patch \ | ||
670 | file://3.2.14/0023-TTY-Wrong-unicode-value-copied-in-con_set_unimap.patch \ | ||
671 | file://3.2.14/0024-USB-serial-fix-console-error-reporting.patch \ | ||
672 | file://3.2.14/0025-cdc-wdm-Fix-more-races-on-the-read-path.patch \ | ||
673 | file://3.2.14/0026-cdc-wdm-Don-t-clear-WDM_READ-unless-entire-read-buff.patch \ | ||
674 | file://3.2.14/0027-usb-fsl_udc_core-Fix-scheduling-while-atomic-dump-me.patch \ | ||
675 | file://3.2.14/0028-usb-Fix-build-error-due-to-dma_mask-is-not-at-pdev_a.patch \ | ||
676 | file://3.2.14/0029-USB-ums_realtek-do-not-use-stack-memory-for-DMA-in-_.patch \ | ||
677 | file://3.2.14/0030-USB-qcserial-add-several-new-serial-devices.patch \ | ||
678 | file://3.2.14/0031-USB-qcserial-don-t-grab-QMI-port-on-Gobi-1000-device.patch \ | ||
679 | file://3.2.14/0032-usb-serial-Add-support-for-the-Sealevel-SeaLINK-8-20.patch \ | ||
680 | file://3.2.14/0033-usb-cp210x-Update-to-support-CP2105-and-multiple-int.patch \ | ||
681 | file://3.2.14/0034-USB-serial-mos7840-Fixed-MCS7820-device-attach-probl.patch \ | ||
682 | file://3.2.14/0035-rt2x00-Add-support-for-D-Link-DWA-127-to-rt2800usb.patch \ | ||
683 | file://3.2.14/0036-rtlwifi-rtl8192c_common-rtl8192de-Check-for-allocati.patch \ | ||
684 | file://3.2.14/0037-rtlwifi-Handle-previous-allocation-failures-when-fre.patch \ | ||
685 | file://3.2.14/0038-rtlwifi-rtl8192c-Prevent-sleeping-from-invalid-conte.patch \ | ||
686 | file://3.2.14/0039-rtlwifi-rtl8192ce-Fix-loss-of-receive-performance.patch \ | ||
687 | file://3.2.14/0040-iwlwifi-always-monitor-for-stuck-queues.patch \ | ||
688 | file://3.2.14/0041-math-Introduce-div64_long.patch \ | ||
689 | file://3.2.14/0042-ntp-Fix-integer-overflow-when-setting-time.patch \ | ||
690 | file://3.2.14/0043-uevent-send-events-in-correct-order-according-to-seq.patch \ | ||
691 | file://3.2.14/0044-genirq-Fix-long-term-regression-in-genirq-irq_set_ir.patch \ | ||
692 | file://3.2.14/0045-genirq-Fix-incorrect-check-for-forced-IRQ-thread-han.patch \ | ||
693 | file://3.2.14/0046-rtc-Disable-the-alarm-in-the-hardware-v2.patch \ | ||
694 | file://3.2.14/0047-p54spi-Release-GPIO-lines-and-IRQ-on-error-in-p54spi.patch \ | ||
695 | file://3.2.14/0048-rtnetlink-Fix-VF-IFLA-policy.patch \ | ||
696 | file://3.2.14/0049-IB-iser-Post-initial-receive-buffers-before-sending-.patch \ | ||
697 | file://3.2.14/0050-ima-fix-Kconfig-dependencies.patch \ | ||
698 | file://3.2.14/0051-x86-ioapic-Add-register-level-checks-to-detect-bogus.patch \ | ||
699 | file://3.2.14/0052-mm-thp-fix-pmd_bad-triggering-in-code-paths-holding-.patch \ | ||
700 | file://3.2.14/0053-TPM-Zero-buffer-whole-after-copying-to-userspace.patch \ | ||
701 | file://3.2.14/0054-PM-Domains-Fix-handling-of-wakeup-devices-during-sys.patch \ | ||
702 | file://3.2.14/0055-bootmem-sparsemem-remove-limit-constraint-in-alloc_b.patch \ | ||
703 | file://3.2.14/0056-hugetlbfs-avoid-taking-i_mutex-from-hugetlbfs_read.patch \ | ||
704 | file://3.2.14/0057-ASoC-fsl-p1022ds-tell-the-WM8776-codec-driver-that-i.patch \ | ||
705 | file://3.2.14/0058-ASoC-pxa-ssp-atomically-set-stream-active-masks.patch \ | ||
706 | file://3.2.14/0059-tcm_loop-Set-residual-field-for-SCSI-commands.patch \ | ||
707 | file://3.2.14/0060-iscsi-target-Fix-iscsit_alloc_buffs-failure-cases.patch \ | ||
708 | file://3.2.14/0061-iscsi-target-Fix-dynamic-explict-NodeACL-pointer-ref.patch \ | ||
709 | file://3.2.14/0062-ALSA-hda-fix-printing-of-high-HDMI-sample-rates.patch \ | ||
710 | file://3.2.14/0063-usb-gadget-fix-a-section-mismatch-when-compiling-g_f.patch \ | ||
711 | file://3.2.14/0064-udlfb-remove-sysfs-framebuffer-device-with-USB-.disc.patch \ | ||
712 | file://3.2.14/0065-tcm_fc-Fix-fc_exch-memory-leak-in-ft_send_resp_statu.patch \ | ||
713 | file://3.2.14/0066-md-bitmap-ensure-to-load-bitmap-when-creating-via-sy.patch \ | ||
714 | file://3.2.14/0067-md-don-t-set-md-arrays-to-readonly-on-shutdown.patch \ | ||
715 | file://3.2.14/0068-md-raid1-raid10-avoid-deadlock-during-resync-recover.patch \ | ||
716 | file://3.2.14/0069-md-fix-clearing-of-the-changed-flags-for-the-bad-blo.patch \ | ||
717 | file://3.2.14/0070-drm-i915-Only-clear-the-GPU-domains-upon-a-successfu.patch \ | ||
718 | file://3.2.14/0071-drm-radeon-Restrict-offset-for-legacy-hardware-curso.patch \ | ||
719 | file://3.2.14/0072-drm-radeon-kms-fix-analog-load-detection-on-DVI-I-co.patch \ | ||
720 | file://3.2.14/0073-drm-radeon-kms-add-connector-quirk-for-Fujitsu-D3003.patch \ | ||
721 | file://3.2.14/0074-target-Don-t-set-WBUS16-or-SYNC-bits-in-INQUIRY-resp.patch \ | ||
722 | file://3.2.14/0075-target-fix-use-after-free-in-target_report_luns.patch \ | ||
723 | file://3.2.14/0076-target-prevent-NULL-pointer-dereference-in-target_re.patch \ | ||
724 | file://3.2.14/0077-target-Fix-16-bit-target-ports-for-SET-TARGET-PORT-G.patch \ | ||
725 | file://3.2.14/0078-Bluetooth-Add-AR30XX-device-ID-on-Asus-laptops.patch \ | ||
726 | file://3.2.14/0079-HID-add-extra-hotkeys-in-Asus-AIO-keyboards.patch \ | ||
727 | file://3.2.14/0080-HID-add-more-hotkeys-in-Asus-AIO-keyboards.patch \ | ||
728 | file://3.2.14/0081-pata_legacy-correctly-mask-recovery-field-for-HT6560.patch \ | ||
729 | file://3.2.14/0082-firewire-ohci-fix-too-early-completion-of-IR-multich.patch \ | ||
730 | file://3.2.14/0083-KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch \ | ||
731 | file://3.2.14/0084-KVM-x86-fix-missing-checks-in-syscall-emulation.patch \ | ||
732 | file://3.2.14/0085-NFS-Properly-handle-the-case-where-the-delegation-is.patch \ | ||
733 | file://3.2.14/0086-NFSv4-Return-the-delegation-if-the-server-returns-NF.patch \ | ||
734 | file://3.2.14/0087-xfs-fix-inode-lookup-race.patch \ | ||
735 | file://3.2.14/0088-CIFS-Respect-negotiated-MaxMpxCount.patch \ | ||
736 | file://3.2.14/0089-cifs-fix-issue-mounting-of-DFS-ROOT-when-redirecting.patch \ | ||
737 | file://3.2.14/0090-CIFS-Fix-a-spurious-error-in-cifs_push_posix_locks.patch \ | ||
738 | file://3.2.14/0091-UBI-fix-error-handling-in-ubi_scan.patch \ | ||
739 | file://3.2.14/0092-UBI-fix-eraseblock-picking-criteria.patch \ | ||
740 | file://3.2.14/0093-SUNRPC-We-must-not-use-list_for_each_entry_safe-in-r.patch \ | ||
741 | file://3.2.14/0094-usbnet-increase-URB-reference-count-before-usb_unlin.patch \ | ||
742 | file://3.2.14/0095-usbnet-don-t-clear-urb-dev-in-tx_complete.patch \ | ||
743 | file://3.2.14/0096-e1000e-Avoid-wrong-check-on-TX-hang.patch \ | ||
744 | file://3.2.14/0097-x86-32-Fix-endless-loop-when-processing-signals-for-.patch \ | ||
745 | file://3.2.14/0098-proc-ns-use-d_set_d_op-API-to-set-dentry-ops-in-proc.patch \ | ||
746 | file://3.2.14/0099-iommu-amd-Fix-section-warning-for-prealloc_protectio.patch \ | ||
747 | file://3.2.14/0100-sysctl-protect-poll-in-entries-that-may-go-away.patch \ | ||
748 | file://3.2.14/0101-hwmon-fam15h_power-Correct-sign-extension-of-running.patch \ | ||
749 | file://3.2.14/0102-lgdt330x-fix-signedness-error-in-i2c_read_demod_byte.patch \ | ||
750 | file://3.2.14/0103-pvrusb2-fix-7MHz-8MHz-DVB-T-tuner-support-for-HVR190.patch \ | ||
751 | file://3.2.14/0104-mxl111sf-fix-error-on-stream-stop-in-mxl111sf_ep6_st.patch \ | ||
752 | file://3.2.14/0105-NFSv4-Rate-limit-the-state-manager-warning-messages.patch \ | ||
753 | file://3.2.14/0106-PM-Hibernate-Enable-usermodehelpers-in-hibernate-err.patch \ | ||
754 | file://3.2.14/0107-jbd2-clear-BH_Delay-BH_Unwritten-in-journal_unmap_bu.patch \ | ||
755 | file://3.2.14/0108-ext4-ignore-EXT4_INODE_JOURNAL_DATA-flag-with-delall.patch \ | ||
756 | file://3.2.14/0109-ext4-fix-race-between-unwritten-extent-conversion-an.patch \ | ||
757 | file://3.2.14/0110-ext4-fix-race-between-sync-and-completed-io-work.patch \ | ||
758 | file://3.2.14/0111-ext4-check-for-zero-length-extent.patch \ | ||
759 | file://3.2.14/0112-vfs-fix-d_ancestor-case-in-d_materialize_unique.patch \ | ||
760 | file://3.2.14/0113-ARM-tegra-select-required-CPU-and-L2-errata-options.patch \ | ||
761 | file://3.2.14/0114-udf-Fix-deadlock-in-udf_release_file.patch \ | ||
762 | file://3.2.14/0115-gpio-omap-fix-_set_gpio_irqenable-implementation.patch \ | ||
763 | file://3.2.14/0116-gpio-davinci-fix-oops-on-unbanked-gpio-irq-request.patch \ | ||
764 | file://3.2.14/0117-gpio-davinci-fix-enabling-unbanked-GPIO-IRQs.patch \ | ||
765 | file://3.2.14/0118-dm-crypt-fix-mempool-deadlock.patch \ | ||
766 | file://3.2.14/0119-dm-crypt-add-missing-error-handling.patch \ | ||
767 | file://3.2.14/0120-dm-exception-store-fix-init-error-path.patch \ | ||
768 | file://3.2.14/0121-dm-persistent-data-fix-btree-rebalancing-after-remov.patch \ | ||
769 | file://3.2.14/0122-dm-thin-fix-stacked-bi_next-usage.patch \ | ||
770 | file://3.2.14/0123-backlight-fix-typo-in-tosa_lcd.c.patch \ | ||
771 | file://3.2.14/0124-xfs-Fix-oops-on-IO-error-during-xlog_recover_process.patch \ | ||
772 | file://3.2.14/0125-slub-Do-not-hold-slub_lock-when-calling-sysfs_slab_a.patch \ | ||
773 | file://3.2.14/0126-NFSv4-Fix-two-infinite-loops-in-the-mount-code.patch \ | ||
774 | file://3.2.14/0127-NFSv4.1-Fix-layoutcommit-error-handling.patch \ | ||
775 | file://3.2.14/0128-module-Remove-module-size-limit.patch \ | ||
776 | file://3.2.14/0129-Bluetooth-btusb-fix-bInterval-for-high-super-speed-i.patch \ | ||
777 | file://3.2.14/0130-drm-i915-suspend-fbdev-device-around-suspend-hiberna.patch \ | ||
778 | file://3.2.14/0131-Fix-pppol2tp-getsockname.patch \ | ||
779 | file://3.2.14/0132-ipv6-fix-incorrent-ipv6-ipsec-packet-fragment.patch \ | ||
780 | file://3.2.14/0133-net-bpf_jit-fix-BPF_S_LDX_B_MSH-compilation.patch \ | ||
781 | file://3.2.14/0134-net-fix-a-potential-rcu_read_lock-imbalance-in-rt6_f.patch \ | ||
782 | file://3.2.14/0135-net-fix-napi_reuse_skb-skb-reserve.patch \ | ||
783 | file://3.2.14/0136-Remove-printk-from-rds_sendmsg.patch \ | ||
784 | file://3.2.14/0137-sky2-override-for-PCI-legacy-power-management.patch \ | ||
785 | file://3.2.14/0138-xfrm-Access-the-replay-notify-functions-via-the-regi.patch \ | ||
786 | file://3.2.14/0139-lockd-fix-arg-parsing-for-grace_period-and-timeout.patch \ | ||
787 | file://3.2.14/0140-x86-tsc-Skip-refined-tsc-calibration-on-systems-with.patch \ | ||
788 | file://3.2.14/0141-x86-tls-Off-by-one-limit-check.patch \ | ||
789 | file://3.2.14/0142-compat-use-sys_sendfile64-implementation-for-sendfil.patch \ | ||
790 | file://3.2.14/0143-rtc-Provide-flag-for-rtc-devices-that-don-t-support-.patch \ | ||
791 | file://3.2.14/0144-nfsd-don-t-allow-zero-length-strings-in-cache_parse.patch \ | ||
792 | file://3.2.14/0145-serial-sh-sci-fix-a-race-of-DMA-submit_tx-on-transfe.patch \ | ||
793 | file://3.2.14/0146-ASPM-Fix-pcie-devices-with-non-pcie-children.patch \ | ||
794 | file://3.2.14/0147-Linux-3.2.14.patch \ | ||
648 | file://beaglebone/0001-f_rndis-HACK-around-undefined-variables.patch \ | 795 | file://beaglebone/0001-f_rndis-HACK-around-undefined-variables.patch \ |
649 | file://beaglebone/0002-da8xx-fb-add-DVI-support-for-beaglebone.patch \ | 796 | file://beaglebone/0002-da8xx-fb-add-DVI-support-for-beaglebone.patch \ |
650 | file://beaglebone/0003-beaglebone-rebase-everything-onto-3.2-WARNING-MEGAPA.patch \ | 797 | file://beaglebone/0003-beaglebone-rebase-everything-onto-3.2-WARNING-MEGAPA.patch \ |