From: Greg Kroah-Hartman Date: Wed, 30 Jan 2013 09:20:02 +0000 (+0100) Subject: 3.4-stable patches X-Git-Tag: v3.0.62~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b3fdbb44f3a0b662f19da76e53c3ce8a9dd0cd24;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: arm-7627-1-predicate-preempt-logic-on-preemp_count-not-preempt-alone.patch arm-at91-rm9200-remake-the-bga-as-default-version.patch arm-dma-fix-struct-page-iterator-in-dma_cache_maint-to-work-with-sparsemem.patch bluetooth-fix-sending-hci-commands-after-reset.patch --- diff --git a/queue-3.4/arm-7627-1-predicate-preempt-logic-on-preemp_count-not-preempt-alone.patch b/queue-3.4/arm-7627-1-predicate-preempt-logic-on-preemp_count-not-preempt-alone.patch new file mode 100644 index 00000000000..de477ab95b6 --- /dev/null +++ b/queue-3.4/arm-7627-1-predicate-preempt-logic-on-preemp_count-not-preempt-alone.patch @@ -0,0 +1,82 @@ +From 568dca15aa2a0f4ddee255894ec393a159f13147 Mon Sep 17 00:00:00 2001 +From: Stephen Boyd +Date: Mon, 14 Jan 2013 19:50:42 +0100 +Subject: ARM: 7627/1: Predicate preempt logic on PREEMP_COUNT not PREEMPT alone + +From: Stephen Boyd + +commit 568dca15aa2a0f4ddee255894ec393a159f13147 upstream. + +Patrik Kluba reports that the preempt count becomes invalid due +to the preempt_enable() call being unbalanced with a +preempt_disable() call in the vfp assembly routines. This happens +because preempt_enable() and preempt_disable() update preempt +counts under PREEMPT_COUNT=y but the vfp assembly routines do so +under PREEMPT=y. In a configuration where PREEMPT=n and +DEBUG_ATOMIC_SLEEP=y, PREEMPT_COUNT=y and so the preempt_enable() +call in VFP_bounce() keeps subtracting from the preempt count +until it goes negative. + +Fix this by always using PREEMPT_COUNT to decided when to update +preempt counts in the ARM assembly code. + +Signed-off-by: Stephen Boyd +Reported-by: Patrik Kluba +Tested-by: Patrik Kluba +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/vfp/entry.S | 6 +++--- + arch/arm/vfp/vfphw.S | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +--- a/arch/arm/vfp/entry.S ++++ b/arch/arm/vfp/entry.S +@@ -22,7 +22,7 @@ + @ IRQs disabled. + @ + ENTRY(do_vfp) +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPT_COUNT + ldr r4, [r10, #TI_PREEMPT] @ get preempt count + add r11, r4, #1 @ increment it + str r11, [r10, #TI_PREEMPT] +@@ -35,7 +35,7 @@ ENTRY(do_vfp) + ENDPROC(do_vfp) + + ENTRY(vfp_null_entry) +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPT_COUNT + get_thread_info r10 + ldr r4, [r10, #TI_PREEMPT] @ get preempt count + sub r11, r4, #1 @ decrement it +@@ -53,7 +53,7 @@ ENDPROC(vfp_null_entry) + + __INIT + ENTRY(vfp_testing_entry) +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPT_COUNT + get_thread_info r10 + ldr r4, [r10, #TI_PREEMPT] @ get preempt count + sub r11, r4, #1 @ decrement it +--- a/arch/arm/vfp/vfphw.S ++++ b/arch/arm/vfp/vfphw.S +@@ -167,7 +167,7 @@ vfp_hw_state_valid: + @ else it's one 32-bit instruction, so + @ always subtract 4 from the following + @ instruction address. +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPT_COUNT + get_thread_info r10 + ldr r4, [r10, #TI_PREEMPT] @ get preempt count + sub r11, r4, #1 @ decrement it +@@ -191,7 +191,7 @@ look_for_VFP_exceptions: + @ not recognised by VFP + + DBGSTR "not VFP" +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPT_COUNT + get_thread_info r10 + ldr r4, [r10, #TI_PREEMPT] @ get preempt count + sub r11, r4, #1 @ decrement it diff --git a/queue-3.4/arm-at91-rm9200-remake-the-bga-as-default-version.patch b/queue-3.4/arm-at91-rm9200-remake-the-bga-as-default-version.patch new file mode 100644 index 00000000000..db8392e0f56 --- /dev/null +++ b/queue-3.4/arm-at91-rm9200-remake-the-bga-as-default-version.patch @@ -0,0 +1,34 @@ +From 36224d0fe0f34cdde66a381708853ebadeac799c Mon Sep 17 00:00:00 2001 +From: Jean-Christophe PLAGNIOL-VILLARD +Date: Sun, 23 Dec 2012 18:07:49 +0000 +Subject: ARM: at91: rm9200: remake the BGA as default version + +From: Jean-Christophe PLAGNIOL-VILLARD + +commit 36224d0fe0f34cdde66a381708853ebadeac799c upstream. + +Make BGA as the default version as we are supposed to just have +to specify when we use the PQFP version. + +Issue was existing since commit: +3e90772 (ARM: at91: fix at91rm9200 soc subtype handling). + +Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD +Signed-off-by: Nicolas Ferre +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/mach-at91/setup.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/arch/arm/mach-at91/setup.c ++++ b/arch/arm/mach-at91/setup.c +@@ -104,6 +104,8 @@ static void __init soc_detect(u32 dbgu_b + switch (socid) { + case ARCH_ID_AT91RM9200: + at91_soc_initdata.type = AT91_SOC_RM9200; ++ if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_NONE) ++ at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; + at91_boot_soc = at91rm9200_soc; + break; + diff --git a/queue-3.4/arm-dma-fix-struct-page-iterator-in-dma_cache_maint-to-work-with-sparsemem.patch b/queue-3.4/arm-dma-fix-struct-page-iterator-in-dma_cache_maint-to-work-with-sparsemem.patch new file mode 100644 index 00000000000..4f80e493df9 --- /dev/null +++ b/queue-3.4/arm-dma-fix-struct-page-iterator-in-dma_cache_maint-to-work-with-sparsemem.patch @@ -0,0 +1,76 @@ +From 15653371c67c3fbe359ae37b720639dd4c7b42c5 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Sat, 19 Jan 2013 11:05:57 +0000 +Subject: ARM: DMA: Fix struct page iterator in dma_cache_maint() to work with sparsemem + +From: Russell King + +commit 15653371c67c3fbe359ae37b720639dd4c7b42c5 upstream. + +Subhash Jadavani reported this partial backtrace: + Now consider this call stack from MMC block driver (this is on the ARMv7 + based board): + + [] (v7_dma_inv_range+0x30/0x48) from [] (dma_cache_maint_page+0x1c4/0x24c) + [] (dma_cache_maint_page+0x1c4/0x24c) from [] (___dma_page_cpu_to_dev+0x14/0x1c) + [] (___dma_page_cpu_to_dev+0x14/0x1c) from [] (dma_map_sg+0x3c/0x114) + +This is caused by incrementing the struct page pointer, and running off +the end of the sparsemem page array. Fix this by incrementing by pfn +instead, and convert the pfn to a struct page. + +Suggested-by: James Bottomley +Tested-by: Subhash Jadavani +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/mm/dma-mapping.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/arch/arm/mm/dma-mapping.c ++++ b/arch/arm/mm/dma-mapping.c +@@ -503,25 +503,27 @@ static void dma_cache_maint_page(struct + size_t size, enum dma_data_direction dir, + void (*op)(const void *, size_t, int)) + { ++ unsigned long pfn; ++ size_t left = size; ++ ++ pfn = page_to_pfn(page) + offset / PAGE_SIZE; ++ offset %= PAGE_SIZE; ++ + /* + * A single sg entry may refer to multiple physically contiguous + * pages. But we still need to process highmem pages individually. + * If highmem is not configured then the bulk of this loop gets + * optimized out. + */ +- size_t left = size; + do { + size_t len = left; + void *vaddr; + ++ page = pfn_to_page(pfn); ++ + if (PageHighMem(page)) { +- if (len + offset > PAGE_SIZE) { +- if (offset >= PAGE_SIZE) { +- page += offset / PAGE_SIZE; +- offset %= PAGE_SIZE; +- } ++ if (len + offset > PAGE_SIZE) + len = PAGE_SIZE - offset; +- } + vaddr = kmap_high_get(page); + if (vaddr) { + vaddr += offset; +@@ -538,7 +540,7 @@ static void dma_cache_maint_page(struct + op(vaddr, len, dir); + } + offset = 0; +- page++; ++ pfn++; + left -= len; + } while (left); + } diff --git a/queue-3.4/bluetooth-fix-sending-hci-commands-after-reset.patch b/queue-3.4/bluetooth-fix-sending-hci-commands-after-reset.patch new file mode 100644 index 00000000000..8e0d264255f --- /dev/null +++ b/queue-3.4/bluetooth-fix-sending-hci-commands-after-reset.patch @@ -0,0 +1,47 @@ +From dbccd791a3fbbdac12c33834b73beff3984988e9 Mon Sep 17 00:00:00 2001 +From: Szymon Janc +Date: Tue, 11 Dec 2012 08:51:19 +0100 +Subject: Bluetooth: Fix sending HCI commands after reset + +From: Szymon Janc + +commit dbccd791a3fbbdac12c33834b73beff3984988e9 upstream. + +After sending reset command wait for its command complete event before +sending next command. Some chips sends CC event for command received +before reset if reset was send before chip replied with CC. + +This is also required by specification that host shall not send +additional HCI commands before receiving CC for reset. + +< HCI Command: Reset (0x03|0x0003) plen 0 [hci0] 18.404612 +> HCI Event: Command Complete (0x0e) plen 4 [hci0] 18.405850 + Write Extended Inquiry Response (0x03|0x0052) ncmd 1 + Status: Success (0x00) +< HCI Command: Read Local Supported Features (0x04|0x0003) plen 0 [hci0] 18.406079 +> HCI Event: Command Complete (0x0e) plen 4 [hci0] 18.407864 + Reset (0x03|0x0003) ncmd 1 + Status: Success (0x00) +< HCI Command: Read Local Supported Features (0x04|0x0003) plen 0 [hci0] 18.408062 +> HCI Event: Command Complete (0x0e) plen 12 [hci0] 18.408835 + +Signed-off-by: Szymon Janc +Acked-by: Johan Hedberg +Signed-off-by: Gustavo Padovan +Signed-off-by: Greg Kroah-Hartman + +--- + net/bluetooth/hci_event.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -2366,7 +2366,7 @@ static inline void hci_cmd_complete_evt( + if (ev->opcode != HCI_OP_NOP) + del_timer(&hdev->cmd_timer); + +- if (ev->ncmd) { ++ if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) { + atomic_set(&hdev->cmd_cnt, 1); + if (!skb_queue_empty(&hdev->cmd_q)) + queue_work(hdev->workqueue, &hdev->cmd_work); diff --git a/queue-3.4/series b/queue-3.4/series index 9fbc4f0c222..f4cca5bfa78 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -2,3 +2,7 @@ can-c_can-fix-invalid-error-codes.patch can-ti_hecc-fix-invalid-error-codes.patch can-pch_can-fix-invalid-error-codes.patch fs-cifs-cifs_dfs_ref.c-fix-potential-memory-leakage.patch +arm-dma-fix-struct-page-iterator-in-dma_cache_maint-to-work-with-sparsemem.patch +arm-at91-rm9200-remake-the-bga-as-default-version.patch +arm-7627-1-predicate-preempt-logic-on-preemp_count-not-preempt-alone.patch +bluetooth-fix-sending-hci-commands-after-reset.patch