6106 lines
201 KiB
Diff
6106 lines
201 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index dfd253648758c..0668843d7b3e6 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 9
|
|
-SUBLEVEL = 275
|
|
+SUBLEVEL = 276
|
|
EXTRAVERSION =
|
|
NAME = Roaring Lionus
|
|
|
|
diff --git a/arch/arm/boot/dts/am335x-cm-t335.dts b/arch/arm/boot/dts/am335x-cm-t335.dts
|
|
index 947c81b7aaafb..56a04d3086c32 100644
|
|
--- a/arch/arm/boot/dts/am335x-cm-t335.dts
|
|
+++ b/arch/arm/boot/dts/am335x-cm-t335.dts
|
|
@@ -552,7 +552,7 @@ status = "okay";
|
|
status = "okay";
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&spi0_pins>;
|
|
- ti,pindir-d0-out-d1-in = <1>;
|
|
+ ti,pindir-d0-out-d1-in;
|
|
/* WLS1271 WiFi */
|
|
wlcore: wlcore@1 {
|
|
compatible = "ti,wl1271";
|
|
diff --git a/arch/arm/boot/dts/exynos5422-odroidxu4.dts b/arch/arm/boot/dts/exynos5422-odroidxu4.dts
|
|
index 2faf88627a489..b45e2a0c3908e 100644
|
|
--- a/arch/arm/boot/dts/exynos5422-odroidxu4.dts
|
|
+++ b/arch/arm/boot/dts/exynos5422-odroidxu4.dts
|
|
@@ -26,7 +26,7 @@
|
|
label = "blue:heartbeat";
|
|
pwms = <&pwm 2 2000000 0>;
|
|
pwm-names = "pwm2";
|
|
- max_brightness = <255>;
|
|
+ max-brightness = <255>;
|
|
linux,default-trigger = "heartbeat";
|
|
};
|
|
};
|
|
diff --git a/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi b/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
|
|
index 0ed30206625c4..f547f67f27833 100644
|
|
--- a/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
|
|
+++ b/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
|
|
@@ -25,7 +25,7 @@
|
|
* Green LED is much brighter than the others
|
|
* so limit its max brightness
|
|
*/
|
|
- max_brightness = <127>;
|
|
+ max-brightness = <127>;
|
|
linux,default-trigger = "mmc0";
|
|
};
|
|
|
|
@@ -33,7 +33,7 @@
|
|
label = "blue:heartbeat";
|
|
pwms = <&pwm 2 2000000 0>;
|
|
pwm-names = "pwm2";
|
|
- max_brightness = <255>;
|
|
+ max-brightness = <255>;
|
|
linux,default-trigger = "heartbeat";
|
|
};
|
|
};
|
|
diff --git a/arch/arm/boot/dts/r8a7779-marzen.dts b/arch/arm/boot/dts/r8a7779-marzen.dts
|
|
index 541678df90a98..50ec24bb1d79f 100644
|
|
--- a/arch/arm/boot/dts/r8a7779-marzen.dts
|
|
+++ b/arch/arm/boot/dts/r8a7779-marzen.dts
|
|
@@ -136,7 +136,7 @@
|
|
status = "okay";
|
|
|
|
clocks = <&mstp1_clks R8A7779_CLK_DU>, <&x3_clk>;
|
|
- clock-names = "du", "dclkin.0";
|
|
+ clock-names = "du.0", "dclkin.0";
|
|
|
|
ports {
|
|
port@0 {
|
|
diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi
|
|
index 6c6d4893e92d4..3fb0a8d2530bd 100644
|
|
--- a/arch/arm/boot/dts/r8a7779.dtsi
|
|
+++ b/arch/arm/boot/dts/r8a7779.dtsi
|
|
@@ -431,6 +431,7 @@
|
|
reg = <0 0xfff80000 0 0x40000>;
|
|
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&mstp1_clks R8A7779_CLK_DU>;
|
|
+ clock-names = "du.0";
|
|
power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
|
|
status = "disabled";
|
|
|
|
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi
|
|
index de0e189711f6e..8c94bf57a38cf 100644
|
|
--- a/arch/arm/boot/dts/sama5d4.dtsi
|
|
+++ b/arch/arm/boot/dts/sama5d4.dtsi
|
|
@@ -1371,7 +1371,7 @@
|
|
0xffffffff 0x3ffcfe7c 0x1c010101 /* pioA */
|
|
0x7fffffff 0xfffccc3a 0x3f00cc3a /* pioB */
|
|
0xffffffff 0x3ff83fff 0xff00ffff /* pioC */
|
|
- 0x0003ff00 0x8002a800 0x00000000 /* pioD */
|
|
+ 0xb003ff00 0x8002a800 0x00000000 /* pioD */
|
|
0xffffffff 0x7fffffff 0x76fff1bf /* pioE */
|
|
>;
|
|
|
|
diff --git a/arch/arm/probes/kprobes/test-thumb.c b/arch/arm/probes/kprobes/test-thumb.c
|
|
index b683b4517458c..4254391f39064 100644
|
|
--- a/arch/arm/probes/kprobes/test-thumb.c
|
|
+++ b/arch/arm/probes/kprobes/test-thumb.c
|
|
@@ -444,21 +444,21 @@ void kprobe_thumb32_test_cases(void)
|
|
"3: mvn r0, r0 \n\t"
|
|
"2: nop \n\t")
|
|
|
|
- TEST_RX("tbh [pc, r",7, (9f-(1f+4))>>1,"]",
|
|
+ TEST_RX("tbh [pc, r",7, (9f-(1f+4))>>1,", lsl #1]",
|
|
"9: \n\t"
|
|
".short (2f-1b-4)>>1 \n\t"
|
|
".short (3f-1b-4)>>1 \n\t"
|
|
"3: mvn r0, r0 \n\t"
|
|
"2: nop \n\t")
|
|
|
|
- TEST_RX("tbh [pc, r",12, ((9f-(1f+4))>>1)+1,"]",
|
|
+ TEST_RX("tbh [pc, r",12, ((9f-(1f+4))>>1)+1,", lsl #1]",
|
|
"9: \n\t"
|
|
".short (2f-1b-4)>>1 \n\t"
|
|
".short (3f-1b-4)>>1 \n\t"
|
|
"3: mvn r0, r0 \n\t"
|
|
"2: nop \n\t")
|
|
|
|
- TEST_RRX("tbh [r",1,9f, ", r",14,1,"]",
|
|
+ TEST_RRX("tbh [r",1,9f, ", r",14,1,", lsl #1]",
|
|
"9: \n\t"
|
|
".short (2f-1b-4)>>1 \n\t"
|
|
".short (3f-1b-4)>>1 \n\t"
|
|
@@ -471,10 +471,10 @@ void kprobe_thumb32_test_cases(void)
|
|
|
|
TEST_UNSUPPORTED("strexb r0, r1, [r2]")
|
|
TEST_UNSUPPORTED("strexh r0, r1, [r2]")
|
|
- TEST_UNSUPPORTED("strexd r0, r1, [r2]")
|
|
+ TEST_UNSUPPORTED("strexd r0, r1, r2, [r2]")
|
|
TEST_UNSUPPORTED("ldrexb r0, [r1]")
|
|
TEST_UNSUPPORTED("ldrexh r0, [r1]")
|
|
- TEST_UNSUPPORTED("ldrexd r0, [r1]")
|
|
+ TEST_UNSUPPORTED("ldrexd r0, r1, [r1]")
|
|
|
|
TEST_GROUP("Data-processing (shifted register) and (modified immediate)")
|
|
|
|
diff --git a/arch/hexagon/kernel/vmlinux.lds.S b/arch/hexagon/kernel/vmlinux.lds.S
|
|
index ec87e67feb19e..22c10102712a5 100644
|
|
--- a/arch/hexagon/kernel/vmlinux.lds.S
|
|
+++ b/arch/hexagon/kernel/vmlinux.lds.S
|
|
@@ -71,13 +71,8 @@ SECTIONS
|
|
|
|
_end = .;
|
|
|
|
- /DISCARD/ : {
|
|
- EXIT_TEXT
|
|
- EXIT_DATA
|
|
- EXIT_CALL
|
|
- }
|
|
-
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
|
|
+ DISCARDS
|
|
}
|
|
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
|
|
index 94f8bf777afa6..3503d488e9b3f 100644
|
|
--- a/arch/ia64/kernel/mca_drv.c
|
|
+++ b/arch/ia64/kernel/mca_drv.c
|
|
@@ -343,7 +343,7 @@ init_record_index_pools(void)
|
|
|
|
/* - 2 - */
|
|
sect_min_size = sal_log_sect_min_sizes[0];
|
|
- for (i = 1; i < sizeof sal_log_sect_min_sizes/sizeof(size_t); i++)
|
|
+ for (i = 1; i < ARRAY_SIZE(sal_log_sect_min_sizes); i++)
|
|
if (sect_min_size > sal_log_sect_min_sizes[i])
|
|
sect_min_size = sal_log_sect_min_sizes[i];
|
|
|
|
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
|
|
index 0fa91c981658e..3e93eea5a5f50 100644
|
|
--- a/arch/mips/boot/compressed/Makefile
|
|
+++ b/arch/mips/boot/compressed/Makefile
|
|
@@ -33,7 +33,7 @@ KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
|
|
KCOV_INSTRUMENT := n
|
|
|
|
# decompressor objects (linked with vmlinuz)
|
|
-vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
|
|
+vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o $(obj)/bswapsi.o
|
|
|
|
ifdef CONFIG_DEBUG_ZBOOT
|
|
vmlinuzobjs-$(CONFIG_DEBUG_ZBOOT) += $(obj)/dbg.o
|
|
@@ -47,7 +47,7 @@ extra-y += uart-ath79.c
|
|
$(obj)/uart-ath79.c: $(srctree)/arch/mips/ath79/early_printk.c
|
|
$(call cmd,shipped)
|
|
|
|
-vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o $(obj)/bswapsi.o
|
|
+vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o
|
|
|
|
extra-y += ashldi3.c bswapsi.c
|
|
$(obj)/ashldi3.o $(obj)/bswapsi.o: KBUILD_CFLAGS += -I$(srctree)/arch/mips/lib
|
|
diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c
|
|
index 3a015e41b762b..66096c766a60d 100644
|
|
--- a/arch/mips/boot/compressed/decompress.c
|
|
+++ b/arch/mips/boot/compressed/decompress.c
|
|
@@ -11,6 +11,8 @@
|
|
* option) any later version.
|
|
*/
|
|
|
|
+#define DISABLE_BRANCH_PROFILING
|
|
+
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
diff --git a/arch/mips/include/asm/hugetlb.h b/arch/mips/include/asm/hugetlb.h
|
|
index 982bc06853302..4747a46946699 100644
|
|
--- a/arch/mips/include/asm/hugetlb.h
|
|
+++ b/arch/mips/include/asm/hugetlb.h
|
|
@@ -67,7 +67,13 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
|
|
static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
|
|
unsigned long addr, pte_t *ptep)
|
|
{
|
|
- flush_tlb_page(vma, addr & huge_page_mask(hstate_vma(vma)));
|
|
+ /*
|
|
+ * clear the huge pte entry firstly, so that the other smp threads will
|
|
+ * not get old pte entry after finishing flush_tlb_page and before
|
|
+ * setting new huge pte entry
|
|
+ */
|
|
+ huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
|
|
+ flush_tlb_page(vma, addr);
|
|
}
|
|
|
|
static inline int huge_pte_none(pte_t pte)
|
|
diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h
|
|
index a03e86969f78a..ff982d8b62f6e 100644
|
|
--- a/arch/mips/include/asm/pgalloc.h
|
|
+++ b/arch/mips/include/asm/pgalloc.h
|
|
@@ -107,11 +107,15 @@ do { \
|
|
|
|
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
|
{
|
|
- pmd_t *pmd;
|
|
+ pmd_t *pmd = NULL;
|
|
+ struct page *pg;
|
|
|
|
- pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, PMD_ORDER);
|
|
- if (pmd)
|
|
+ pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
|
|
+ if (pg) {
|
|
+ pgtable_pmd_page_ctor(pg);
|
|
+ pmd = (pmd_t *)page_address(pg);
|
|
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
|
|
+ }
|
|
return pmd;
|
|
}
|
|
|
|
diff --git a/arch/mips/vdso/vdso.h b/arch/mips/vdso/vdso.h
|
|
index cfb1be441decc..921589b45bc20 100644
|
|
--- a/arch/mips/vdso/vdso.h
|
|
+++ b/arch/mips/vdso/vdso.h
|
|
@@ -81,7 +81,7 @@ static inline const union mips_vdso_data *get_vdso_data(void)
|
|
|
|
static inline void __iomem *get_gic(const union mips_vdso_data *data)
|
|
{
|
|
- return (void __iomem *)data - PAGE_SIZE;
|
|
+ return (void __iomem *)((unsigned long)data & PAGE_MASK) - PAGE_SIZE;
|
|
}
|
|
|
|
#endif /* CONFIG_CLKSRC_MIPS_GIC */
|
|
diff --git a/arch/powerpc/boot/devtree.c b/arch/powerpc/boot/devtree.c
|
|
index a7e21a35c03af..27c84b82b588e 100644
|
|
--- a/arch/powerpc/boot/devtree.c
|
|
+++ b/arch/powerpc/boot/devtree.c
|
|
@@ -17,6 +17,7 @@
|
|
#include "string.h"
|
|
#include "stdio.h"
|
|
#include "ops.h"
|
|
+#include "of.h"
|
|
|
|
void dt_fixup_memory(u64 start, u64 size)
|
|
{
|
|
@@ -27,21 +28,25 @@ void dt_fixup_memory(u64 start, u64 size)
|
|
root = finddevice("/");
|
|
if (getprop(root, "#address-cells", &naddr, sizeof(naddr)) < 0)
|
|
naddr = 2;
|
|
+ else
|
|
+ naddr = be32_to_cpu(naddr);
|
|
if (naddr < 1 || naddr > 2)
|
|
fatal("Can't cope with #address-cells == %d in /\n\r", naddr);
|
|
|
|
if (getprop(root, "#size-cells", &nsize, sizeof(nsize)) < 0)
|
|
nsize = 1;
|
|
+ else
|
|
+ nsize = be32_to_cpu(nsize);
|
|
if (nsize < 1 || nsize > 2)
|
|
fatal("Can't cope with #size-cells == %d in /\n\r", nsize);
|
|
|
|
i = 0;
|
|
if (naddr == 2)
|
|
- memreg[i++] = start >> 32;
|
|
- memreg[i++] = start & 0xffffffff;
|
|
+ memreg[i++] = cpu_to_be32(start >> 32);
|
|
+ memreg[i++] = cpu_to_be32(start & 0xffffffff);
|
|
if (nsize == 2)
|
|
- memreg[i++] = size >> 32;
|
|
- memreg[i++] = size & 0xffffffff;
|
|
+ memreg[i++] = cpu_to_be32(size >> 32);
|
|
+ memreg[i++] = cpu_to_be32(size & 0xffffffff);
|
|
|
|
memory = finddevice("/memory");
|
|
if (! memory) {
|
|
@@ -49,9 +54,9 @@ void dt_fixup_memory(u64 start, u64 size)
|
|
setprop_str(memory, "device_type", "memory");
|
|
}
|
|
|
|
- printf("Memory <- <0x%x", memreg[0]);
|
|
+ printf("Memory <- <0x%x", be32_to_cpu(memreg[0]));
|
|
for (i = 1; i < (naddr + nsize); i++)
|
|
- printf(" 0x%x", memreg[i]);
|
|
+ printf(" 0x%x", be32_to_cpu(memreg[i]));
|
|
printf("> (%ldMB)\n\r", (unsigned long)(size >> 20));
|
|
|
|
setprop(memory, "reg", memreg, (naddr + nsize)*sizeof(u32));
|
|
@@ -69,10 +74,10 @@ void dt_fixup_cpu_clocks(u32 cpu, u32 tb, u32 bus)
|
|
printf("CPU bus-frequency <- 0x%x (%dMHz)\n\r", bus, MHZ(bus));
|
|
|
|
while ((devp = find_node_by_devtype(devp, "cpu"))) {
|
|
- setprop_val(devp, "clock-frequency", cpu);
|
|
- setprop_val(devp, "timebase-frequency", tb);
|
|
+ setprop_val(devp, "clock-frequency", cpu_to_be32(cpu));
|
|
+ setprop_val(devp, "timebase-frequency", cpu_to_be32(tb));
|
|
if (bus > 0)
|
|
- setprop_val(devp, "bus-frequency", bus);
|
|
+ setprop_val(devp, "bus-frequency", cpu_to_be32(bus));
|
|
}
|
|
|
|
timebase_period_ns = 1000000000 / tb;
|
|
@@ -84,7 +89,7 @@ void dt_fixup_clock(const char *path, u32 freq)
|
|
|
|
if (devp) {
|
|
printf("%s: clock-frequency <- %x (%dMHz)\n\r", path, freq, MHZ(freq));
|
|
- setprop_val(devp, "clock-frequency", freq);
|
|
+ setprop_val(devp, "clock-frequency", cpu_to_be32(freq));
|
|
}
|
|
}
|
|
|
|
@@ -137,8 +142,12 @@ void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize)
|
|
{
|
|
if (getprop(node, "#address-cells", naddr, 4) != 4)
|
|
*naddr = 2;
|
|
+ else
|
|
+ *naddr = be32_to_cpu(*naddr);
|
|
if (getprop(node, "#size-cells", nsize, 4) != 4)
|
|
*nsize = 1;
|
|
+ else
|
|
+ *nsize = be32_to_cpu(*nsize);
|
|
}
|
|
|
|
static void copy_val(u32 *dest, u32 *src, int naddr)
|
|
@@ -167,9 +176,9 @@ static int add_reg(u32 *reg, u32 *add, int naddr)
|
|
int i, carry = 0;
|
|
|
|
for (i = MAX_ADDR_CELLS - 1; i >= MAX_ADDR_CELLS - naddr; i--) {
|
|
- u64 tmp = (u64)reg[i] + add[i] + carry;
|
|
+ u64 tmp = (u64)be32_to_cpu(reg[i]) + be32_to_cpu(add[i]) + carry;
|
|
carry = tmp >> 32;
|
|
- reg[i] = (u32)tmp;
|
|
+ reg[i] = cpu_to_be32((u32)tmp);
|
|
}
|
|
|
|
return !carry;
|
|
@@ -184,18 +193,18 @@ static int compare_reg(u32 *reg, u32 *range, u32 *rangesize)
|
|
u32 end;
|
|
|
|
for (i = 0; i < MAX_ADDR_CELLS; i++) {
|
|
- if (reg[i] < range[i])
|
|
+ if (be32_to_cpu(reg[i]) < be32_to_cpu(range[i]))
|
|
return 0;
|
|
- if (reg[i] > range[i])
|
|
+ if (be32_to_cpu(reg[i]) > be32_to_cpu(range[i]))
|
|
break;
|
|
}
|
|
|
|
for (i = 0; i < MAX_ADDR_CELLS; i++) {
|
|
- end = range[i] + rangesize[i];
|
|
+ end = be32_to_cpu(range[i]) + be32_to_cpu(rangesize[i]);
|
|
|
|
- if (reg[i] < end)
|
|
+ if (be32_to_cpu(reg[i]) < end)
|
|
break;
|
|
- if (reg[i] > end)
|
|
+ if (be32_to_cpu(reg[i]) > end)
|
|
return 0;
|
|
}
|
|
|
|
@@ -244,7 +253,6 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
|
return 0;
|
|
|
|
dt_get_reg_format(parent, &naddr, &nsize);
|
|
-
|
|
if (nsize > 2)
|
|
return 0;
|
|
|
|
@@ -256,10 +264,10 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
|
|
|
copy_val(last_addr, prop_buf + offset, naddr);
|
|
|
|
- ret_size = prop_buf[offset + naddr];
|
|
+ ret_size = be32_to_cpu(prop_buf[offset + naddr]);
|
|
if (nsize == 2) {
|
|
ret_size <<= 32;
|
|
- ret_size |= prop_buf[offset + naddr + 1];
|
|
+ ret_size |= be32_to_cpu(prop_buf[offset + naddr + 1]);
|
|
}
|
|
|
|
for (;;) {
|
|
@@ -282,7 +290,6 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
|
|
|
offset = find_range(last_addr, prop_buf, prev_naddr,
|
|
naddr, prev_nsize, buflen / 4);
|
|
-
|
|
if (offset < 0)
|
|
return 0;
|
|
|
|
@@ -300,8 +307,7 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
|
if (naddr > 2)
|
|
return 0;
|
|
|
|
- ret_addr = ((u64)last_addr[2] << 32) | last_addr[3];
|
|
-
|
|
+ ret_addr = ((u64)be32_to_cpu(last_addr[2]) << 32) | be32_to_cpu(last_addr[3]);
|
|
if (sizeof(void *) == 4 &&
|
|
(ret_addr >= 0x100000000ULL || ret_size > 0x100000000ULL ||
|
|
ret_addr + ret_size > 0x100000000ULL))
|
|
@@ -354,11 +360,14 @@ int dt_is_compatible(void *node, const char *compat)
|
|
int dt_get_virtual_reg(void *node, void **addr, int nres)
|
|
{
|
|
unsigned long xaddr;
|
|
- int n;
|
|
+ int n, i;
|
|
|
|
n = getprop(node, "virtual-reg", addr, nres * 4);
|
|
- if (n > 0)
|
|
+ if (n > 0) {
|
|
+ for (i = 0; i < n/4; i ++)
|
|
+ ((u32 *)addr)[i] = be32_to_cpu(((u32 *)addr)[i]);
|
|
return n / 4;
|
|
+ }
|
|
|
|
for (n = 0; n < nres; n++) {
|
|
if (!dt_xlate_reg(node, n, &xaddr, NULL))
|
|
diff --git a/arch/powerpc/boot/ns16550.c b/arch/powerpc/boot/ns16550.c
|
|
index 8c9ead94be06f..cea34a20085c0 100644
|
|
--- a/arch/powerpc/boot/ns16550.c
|
|
+++ b/arch/powerpc/boot/ns16550.c
|
|
@@ -14,6 +14,7 @@
|
|
#include "stdio.h"
|
|
#include "io.h"
|
|
#include "ops.h"
|
|
+#include "of.h"
|
|
|
|
#define UART_DLL 0 /* Out: Divisor Latch Low */
|
|
#define UART_DLM 1 /* Out: Divisor Latch High */
|
|
@@ -57,16 +58,20 @@ int ns16550_console_init(void *devp, struct serial_console_data *scdp)
|
|
int n;
|
|
u32 reg_offset;
|
|
|
|
- if (dt_get_virtual_reg(devp, (void **)®_base, 1) < 1)
|
|
+ if (dt_get_virtual_reg(devp, (void **)®_base, 1) < 1) {
|
|
+ printf("virt reg parse fail...\r\n");
|
|
return -1;
|
|
+ }
|
|
|
|
n = getprop(devp, "reg-offset", ®_offset, sizeof(reg_offset));
|
|
if (n == sizeof(reg_offset))
|
|
- reg_base += reg_offset;
|
|
+ reg_base += be32_to_cpu(reg_offset);
|
|
|
|
n = getprop(devp, "reg-shift", ®_shift, sizeof(reg_shift));
|
|
if (n != sizeof(reg_shift))
|
|
reg_shift = 0;
|
|
+ else
|
|
+ reg_shift = be32_to_cpu(reg_shift);
|
|
|
|
scdp->open = ns16550_open;
|
|
scdp->putc = ns16550_putc;
|
|
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h
|
|
index 80024c4f2093c..0dbdf88162b7b 100644
|
|
--- a/arch/powerpc/include/asm/barrier.h
|
|
+++ b/arch/powerpc/include/asm/barrier.h
|
|
@@ -41,6 +41,8 @@
|
|
# define SMPWMB eieio
|
|
#endif
|
|
|
|
+/* clang defines this macro for a builtin, which will not work with runtime patching */
|
|
+#undef __lwsync
|
|
#define __lwsync() __asm__ __volatile__ (stringify_in_c(LWSYNC) : : :"memory")
|
|
#define dma_rmb() __lwsync()
|
|
#define dma_wmb() __asm__ __volatile__ (stringify_in_c(SMPWMB) : : :"memory")
|
|
diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h
|
|
index a19f831a4cc9a..83a6d99e9994e 100644
|
|
--- a/arch/powerpc/include/asm/ps3.h
|
|
+++ b/arch/powerpc/include/asm/ps3.h
|
|
@@ -83,6 +83,7 @@ struct ps3_dma_region_ops;
|
|
* @bus_addr: The 'translated' bus address of the region.
|
|
* @len: The length in bytes of the region.
|
|
* @offset: The offset from the start of memory of the region.
|
|
+ * @dma_mask: Device dma_mask.
|
|
* @ioid: The IOID of the device who owns this region
|
|
* @chunk_list: Opaque variable used by the ioc page manager.
|
|
* @region_ops: struct ps3_dma_region_ops - dma region operations
|
|
@@ -97,6 +98,7 @@ struct ps3_dma_region {
|
|
enum ps3_dma_region_type region_type;
|
|
unsigned long len;
|
|
unsigned long offset;
|
|
+ u64 dma_mask;
|
|
|
|
/* driver variables (set by ps3_dma_region_create) */
|
|
unsigned long bus_addr;
|
|
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
|
|
index 19bae78b1f25b..76cbf1be9962b 100644
|
|
--- a/arch/powerpc/platforms/ps3/mm.c
|
|
+++ b/arch/powerpc/platforms/ps3/mm.c
|
|
@@ -18,6 +18,7 @@
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
+#include <linux/dma-mapping.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/export.h>
|
|
#include <linux/memblock.h>
|
|
@@ -1132,6 +1133,7 @@ int ps3_dma_region_init(struct ps3_system_bus_device *dev,
|
|
enum ps3_dma_region_type region_type, void *addr, unsigned long len)
|
|
{
|
|
unsigned long lpar_addr;
|
|
+ int result;
|
|
|
|
lpar_addr = addr ? ps3_mm_phys_to_lpar(__pa(addr)) : 0;
|
|
|
|
@@ -1143,6 +1145,16 @@ int ps3_dma_region_init(struct ps3_system_bus_device *dev,
|
|
r->offset -= map.r1.offset;
|
|
r->len = len ? len : _ALIGN_UP(map.total, 1 << r->page_size);
|
|
|
|
+ dev->core.dma_mask = &r->dma_mask;
|
|
+
|
|
+ result = dma_set_mask_and_coherent(&dev->core, DMA_BIT_MASK(32));
|
|
+
|
|
+ if (result < 0) {
|
|
+ dev_err(&dev->core, "%s:%d: dma_set_mask_and_coherent failed: %d\n",
|
|
+ __func__, __LINE__, result);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
switch (dev->dev_type) {
|
|
case PS3_DEVICE_TYPE_SB:
|
|
r->region_ops = (USE_DYNAMIC_DMA)
|
|
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
|
|
index 1c4a595e8224d..1dff52abc7863 100644
|
|
--- a/arch/s390/Kconfig
|
|
+++ b/arch/s390/Kconfig
|
|
@@ -833,7 +833,7 @@ config CMM_IUCV
|
|
config APPLDATA_BASE
|
|
def_bool n
|
|
prompt "Linux - VM Monitor Stream, base infrastructure"
|
|
- depends on PROC_FS
|
|
+ depends on PROC_SYSCTL
|
|
help
|
|
This provides a kernel interface for creating and updating z/VM APPLDATA
|
|
monitor records. The monitor records are updated at certain time
|
|
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
|
|
index ce49c2b9db7ee..9939879f5f253 100644
|
|
--- a/arch/s390/kernel/setup.c
|
|
+++ b/arch/s390/kernel/setup.c
|
|
@@ -137,7 +137,7 @@ static void __init set_preferred_console(void)
|
|
else if (CONSOLE_IS_3270)
|
|
add_preferred_console("tty3270", 0, NULL);
|
|
else if (CONSOLE_IS_VT220)
|
|
- add_preferred_console("ttyS", 1, NULL);
|
|
+ add_preferred_console("ttysclp", 0, NULL);
|
|
else if (CONSOLE_IS_HVC)
|
|
add_preferred_console("hvc", 0, NULL);
|
|
}
|
|
diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c
|
|
index 3fd7c3efdb18d..feb7f5ab40841 100644
|
|
--- a/arch/um/drivers/chan_user.c
|
|
+++ b/arch/um/drivers/chan_user.c
|
|
@@ -256,7 +256,8 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|
goto out_close;
|
|
}
|
|
|
|
- if (os_set_fd_block(*fd_out, 0)) {
|
|
+ err = os_set_fd_block(*fd_out, 0);
|
|
+ if (err) {
|
|
printk(UM_KERN_ERR "winch_tramp: failed to set thread_fd "
|
|
"non-blocking.\n");
|
|
goto out_close;
|
|
diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c
|
|
index 0d6b66c64a813..76d155631c5d7 100644
|
|
--- a/arch/um/drivers/slip_user.c
|
|
+++ b/arch/um/drivers/slip_user.c
|
|
@@ -145,7 +145,8 @@ static int slip_open(void *data)
|
|
}
|
|
sfd = err;
|
|
|
|
- if (set_up_tty(sfd))
|
|
+ err = set_up_tty(sfd);
|
|
+ if (err)
|
|
goto out_close2;
|
|
|
|
pri->slave = sfd;
|
|
diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
|
|
index 21d6fa27b4a9c..ebda4718eb8f7 100644
|
|
--- a/arch/x86/include/asm/fpu/internal.h
|
|
+++ b/arch/x86/include/asm/fpu/internal.h
|
|
@@ -94,6 +94,7 @@ static inline void fpstate_init_fxstate(struct fxregs_state *fx)
|
|
}
|
|
extern void fpstate_sanitize_xstate(struct fpu *fpu);
|
|
|
|
+/* Returns 0 or the negated trap number, which results in -EFAULT for #PF */
|
|
#define user_insn(insn, output, input...) \
|
|
({ \
|
|
int err; \
|
|
@@ -101,14 +102,14 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
|
|
might_fault(); \
|
|
\
|
|
asm volatile(ASM_STAC "\n" \
|
|
- "1:" #insn "\n\t" \
|
|
+ "1: " #insn "\n" \
|
|
"2: " ASM_CLAC "\n" \
|
|
".section .fixup,\"ax\"\n" \
|
|
- "3: movl $-1,%[err]\n" \
|
|
+ "3: negl %%eax\n" \
|
|
" jmp 2b\n" \
|
|
".previous\n" \
|
|
- _ASM_EXTABLE(1b, 3b) \
|
|
- : [err] "=r" (err), output \
|
|
+ _ASM_EXTABLE_FAULT(1b, 3b) \
|
|
+ : [err] "=a" (err), output \
|
|
: "0"(0), input); \
|
|
err; \
|
|
})
|
|
@@ -227,16 +228,20 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
|
|
#define XRSTOR ".byte " REX_PREFIX "0x0f,0xae,0x2f"
|
|
#define XRSTORS ".byte " REX_PREFIX "0x0f,0xc7,0x1f"
|
|
|
|
+/*
|
|
+ * After this @err contains 0 on success or the negated trap number when
|
|
+ * the operation raises an exception. For faults this results in -EFAULT.
|
|
+ */
|
|
#define XSTATE_OP(op, st, lmask, hmask, err) \
|
|
asm volatile("1:" op "\n\t" \
|
|
"xor %[err], %[err]\n" \
|
|
"2:\n\t" \
|
|
".pushsection .fixup,\"ax\"\n\t" \
|
|
- "3: movl $-2,%[err]\n\t" \
|
|
+ "3: negl %%eax\n\t" \
|
|
"jmp 2b\n\t" \
|
|
".popsection\n\t" \
|
|
- _ASM_EXTABLE(1b, 3b) \
|
|
- : [err] "=r" (err) \
|
|
+ _ASM_EXTABLE_FAULT(1b, 3b) \
|
|
+ : [err] "=a" (err) \
|
|
: "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
|
|
: "memory")
|
|
|
|
diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c
|
|
index 7052d9a65fe9b..e1c9e94fcce6d 100644
|
|
--- a/arch/x86/kernel/fpu/regset.c
|
|
+++ b/arch/x86/kernel/fpu/regset.c
|
|
@@ -123,7 +123,7 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,
|
|
/*
|
|
* A whole standard-format XSAVE buffer is needed:
|
|
*/
|
|
- if ((pos != 0) || (count < fpu_user_xstate_size))
|
|
+ if (pos != 0 || count != fpu_user_xstate_size)
|
|
return -EFAULT;
|
|
|
|
xsave = &fpu->state.xsave;
|
|
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
|
|
index 63c3ff9e74d42..a6f8600672d75 100644
|
|
--- a/arch/x86/kvm/cpuid.c
|
|
+++ b/arch/x86/kvm/cpuid.c
|
|
@@ -633,8 +633,14 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
|
|
unsigned phys_as = entry->eax & 0xff;
|
|
|
|
- if (!g_phys_as)
|
|
+ /*
|
|
+ * Use bare metal's MAXPHADDR if the CPU doesn't report guest
|
|
+ * MAXPHYADDR separately, or if TDP (NPT) is disabled, as the
|
|
+ * guest version "applies only to guests using nested paging".
|
|
+ */
|
|
+ if (!g_phys_as || !tdp_enabled)
|
|
g_phys_as = phys_as;
|
|
+
|
|
entry->eax = g_phys_as | (virt_as << 8);
|
|
entry->edx = 0;
|
|
/*
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index b945f362771fa..c959720c75938 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -7044,6 +7044,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
|
set_debugreg(vcpu->arch.eff_db[3], 3);
|
|
set_debugreg(vcpu->arch.dr6, 6);
|
|
vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD;
|
|
+ } else if (unlikely(hw_breakpoint_active())) {
|
|
+ set_debugreg(0, 7);
|
|
}
|
|
|
|
kvm_x86_ops->run(vcpu);
|
|
diff --git a/crypto/shash.c b/crypto/shash.c
|
|
index a1c7609578eab..7eebf3cde7b7b 100644
|
|
--- a/crypto/shash.c
|
|
+++ b/crypto/shash.c
|
|
@@ -24,12 +24,24 @@
|
|
|
|
static const struct crypto_type crypto_shash_type;
|
|
|
|
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
- unsigned int keylen)
|
|
+static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
+ unsigned int keylen)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(shash_no_setkey);
|
|
+
|
|
+/*
|
|
+ * Check whether an shash algorithm has a setkey function.
|
|
+ *
|
|
+ * For CFI compatibility, this must not be an inline function. This is because
|
|
+ * when CFI is enabled, modules won't get the same address for shash_no_setkey
|
|
+ * (if it were exported, which inlining would require) as the core kernel will.
|
|
+ */
|
|
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
|
|
+{
|
|
+ return alg->setkey != shash_no_setkey;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(crypto_shash_alg_has_setkey);
|
|
|
|
static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key,
|
|
unsigned int keylen)
|
|
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
|
|
index 4c5678cfa9c49..c466d7bc861ae 100644
|
|
--- a/drivers/acpi/Makefile
|
|
+++ b/drivers/acpi/Makefile
|
|
@@ -7,6 +7,11 @@ ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
|
#
|
|
# ACPI Boot-Time Table Parsing
|
|
#
|
|
+ifeq ($(CONFIG_ACPI_CUSTOM_DSDT),y)
|
|
+tables.o: $(src)/../../include/$(subst $\",,$(CONFIG_ACPI_CUSTOM_DSDT_FILE)) ;
|
|
+
|
|
+endif
|
|
+
|
|
obj-$(CONFIG_ACPI) += tables.o
|
|
obj-$(CONFIG_X86) += blacklist.o
|
|
|
|
diff --git a/drivers/acpi/acpi_amba.c b/drivers/acpi/acpi_amba.c
|
|
index 7f77c071709a7..eb09ee71ceb2e 100644
|
|
--- a/drivers/acpi/acpi_amba.c
|
|
+++ b/drivers/acpi/acpi_amba.c
|
|
@@ -70,6 +70,7 @@ static int amba_handler_attach(struct acpi_device *adev,
|
|
case IORESOURCE_MEM:
|
|
if (!address_found) {
|
|
dev->res = *rentry->res;
|
|
+ dev->res.name = dev_name(&dev->dev);
|
|
address_found = true;
|
|
}
|
|
break;
|
|
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
|
|
index 6b2c9d68d8107..1c13e5fe10d98 100644
|
|
--- a/drivers/acpi/bus.c
|
|
+++ b/drivers/acpi/bus.c
|
|
@@ -1184,6 +1184,7 @@ static int __init acpi_init(void)
|
|
init_acpi_device_notify();
|
|
result = acpi_bus_init();
|
|
if (result) {
|
|
+ kobject_put(acpi_kobj);
|
|
disable_acpi();
|
|
return result;
|
|
}
|
|
diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
|
|
index fb610ad495f10..152ba55fd908b 100644
|
|
--- a/drivers/acpi/device_sysfs.c
|
|
+++ b/drivers/acpi/device_sysfs.c
|
|
@@ -452,7 +452,7 @@ static ssize_t description_show(struct device *dev,
|
|
(wchar_t *)acpi_dev->pnp.str_obj->buffer.pointer,
|
|
acpi_dev->pnp.str_obj->buffer.length,
|
|
UTF16_LITTLE_ENDIAN, buf,
|
|
- PAGE_SIZE);
|
|
+ PAGE_SIZE - 1);
|
|
|
|
buf[result++] = '\n';
|
|
|
|
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
|
|
index 2237d3f24f0e7..8242e16f57c6a 100644
|
|
--- a/drivers/acpi/processor_idle.c
|
|
+++ b/drivers/acpi/processor_idle.c
|
|
@@ -29,6 +29,7 @@
|
|
#include <linux/acpi.h>
|
|
#include <linux/dmi.h>
|
|
#include <linux/sched.h> /* need_resched() */
|
|
+#include <linux/sort.h>
|
|
#include <linux/tick.h>
|
|
#include <linux/cpuidle.h>
|
|
#include <linux/cpu.h>
|
|
@@ -538,10 +539,37 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
|
|
return;
|
|
}
|
|
|
|
+static int acpi_cst_latency_cmp(const void *a, const void *b)
|
|
+{
|
|
+ const struct acpi_processor_cx *x = a, *y = b;
|
|
+
|
|
+ if (!(x->valid && y->valid))
|
|
+ return 0;
|
|
+ if (x->latency > y->latency)
|
|
+ return 1;
|
|
+ if (x->latency < y->latency)
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+static void acpi_cst_latency_swap(void *a, void *b, int n)
|
|
+{
|
|
+ struct acpi_processor_cx *x = a, *y = b;
|
|
+ u32 tmp;
|
|
+
|
|
+ if (!(x->valid && y->valid))
|
|
+ return;
|
|
+ tmp = x->latency;
|
|
+ x->latency = y->latency;
|
|
+ y->latency = tmp;
|
|
+}
|
|
+
|
|
static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|
{
|
|
unsigned int i;
|
|
unsigned int working = 0;
|
|
+ unsigned int last_latency = 0;
|
|
+ unsigned int last_type = 0;
|
|
+ bool buggy_latency = false;
|
|
|
|
pr->power.timer_broadcast_on_state = INT_MAX;
|
|
|
|
@@ -565,12 +593,24 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|
}
|
|
if (!cx->valid)
|
|
continue;
|
|
+ if (cx->type >= last_type && cx->latency < last_latency)
|
|
+ buggy_latency = true;
|
|
+ last_latency = cx->latency;
|
|
+ last_type = cx->type;
|
|
|
|
lapic_timer_check_state(i, pr, cx);
|
|
tsc_check_state(cx->type);
|
|
working++;
|
|
}
|
|
|
|
+ if (buggy_latency) {
|
|
+ pr_notice("FW issue: working around C-state latencies out of order\n");
|
|
+ sort(&pr->power.states[1], max_cstate,
|
|
+ sizeof(struct acpi_processor_cx),
|
|
+ acpi_cst_latency_cmp,
|
|
+ acpi_cst_latency_swap);
|
|
+ }
|
|
+
|
|
lapic_timer_propagate_broadcast(pr);
|
|
|
|
return (working);
|
|
diff --git a/drivers/ata/ahci_sunxi.c b/drivers/ata/ahci_sunxi.c
|
|
index b26437430163e..98b4f0d898d64 100644
|
|
--- a/drivers/ata/ahci_sunxi.c
|
|
+++ b/drivers/ata/ahci_sunxi.c
|
|
@@ -165,7 +165,7 @@ static void ahci_sunxi_start_engine(struct ata_port *ap)
|
|
}
|
|
|
|
static const struct ata_port_info ahci_sunxi_port_info = {
|
|
- .flags = AHCI_FLAG_COMMON | ATA_FLAG_NCQ,
|
|
+ .flags = AHCI_FLAG_COMMON | ATA_FLAG_NCQ | ATA_FLAG_NO_DIPM,
|
|
.pio_mask = ATA_PIO4,
|
|
.udma_mask = ATA_UDMA6,
|
|
.port_ops = &ahci_platform_ops,
|
|
diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
|
|
index 634c814cbeda4..ebdd2dfabbebc 100644
|
|
--- a/drivers/ata/pata_ep93xx.c
|
|
+++ b/drivers/ata/pata_ep93xx.c
|
|
@@ -927,7 +927,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
|
/* INT[3] (IRQ_EP93XX_EXT3) line connected as pull down */
|
|
irq = platform_get_irq(pdev, 0);
|
|
if (irq < 0) {
|
|
- err = -ENXIO;
|
|
+ err = irq;
|
|
goto err_rel_gpio;
|
|
}
|
|
|
|
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
|
|
index 475a006694273..7e6359e32ab63 100644
|
|
--- a/drivers/ata/pata_octeon_cf.c
|
|
+++ b/drivers/ata/pata_octeon_cf.c
|
|
@@ -908,10 +908,11 @@ static int octeon_cf_probe(struct platform_device *pdev)
|
|
return -EINVAL;
|
|
}
|
|
|
|
- irq_handler = octeon_cf_interrupt;
|
|
i = platform_get_irq(dma_dev, 0);
|
|
- if (i > 0)
|
|
+ if (i > 0) {
|
|
irq = i;
|
|
+ irq_handler = octeon_cf_interrupt;
|
|
+ }
|
|
}
|
|
of_node_put(dma_node);
|
|
}
|
|
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c
|
|
index c8b6a780a2905..76c550e160f6e 100644
|
|
--- a/drivers/ata/pata_rb532_cf.c
|
|
+++ b/drivers/ata/pata_rb532_cf.c
|
|
@@ -120,10 +120,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0) {
|
|
+ if (irq < 0) {
|
|
dev_err(&pdev->dev, "no IRQ resource found\n");
|
|
- return -ENOENT;
|
|
+ return irq;
|
|
}
|
|
+ if (!irq)
|
|
+ return -EINVAL;
|
|
|
|
pdata = dev_get_platdata(&pdev->dev);
|
|
if (!pdata) {
|
|
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
|
|
index aafb8cc035232..13f339f07f2a5 100644
|
|
--- a/drivers/ata/sata_highbank.c
|
|
+++ b/drivers/ata/sata_highbank.c
|
|
@@ -483,10 +483,12 @@ static int ahci_highbank_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0) {
|
|
+ if (irq < 0) {
|
|
dev_err(dev, "no irq\n");
|
|
- return -EINVAL;
|
|
+ return irq;
|
|
}
|
|
+ if (!irq)
|
|
+ return -EINVAL;
|
|
|
|
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
|
|
if (!hpriv) {
|
|
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c
|
|
index fe47c924dc642..a1427cb9b9ed1 100644
|
|
--- a/drivers/atm/iphase.c
|
|
+++ b/drivers/atm/iphase.c
|
|
@@ -3301,7 +3301,7 @@ static void __exit ia_module_exit(void)
|
|
{
|
|
pci_unregister_driver(&ia_driver);
|
|
|
|
- del_timer(&ia_timer);
|
|
+ del_timer_sync(&ia_timer);
|
|
}
|
|
|
|
module_init(ia_module_init);
|
|
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
|
|
index 8bcd09fb0feb9..8c675c4f6d549 100644
|
|
--- a/drivers/atm/nicstar.c
|
|
+++ b/drivers/atm/nicstar.c
|
|
@@ -298,7 +298,7 @@ static void __exit nicstar_cleanup(void)
|
|
{
|
|
XPRINTK("nicstar: nicstar_cleanup() called.\n");
|
|
|
|
- del_timer(&ns_timer);
|
|
+ del_timer_sync(&ns_timer);
|
|
|
|
pci_unregister_driver(&nicstar_driver);
|
|
|
|
@@ -526,6 +526,15 @@ static int ns_init_card(int i, struct pci_dev *pcidev)
|
|
/* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */
|
|
writel(0x00000000, card->membase + VPM);
|
|
|
|
+ card->intcnt = 0;
|
|
+ if (request_irq
|
|
+ (pcidev->irq, &ns_irq_handler, IRQF_SHARED, "nicstar", card) != 0) {
|
|
+ pr_err("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
|
|
+ error = 9;
|
|
+ ns_init_card_error(card, error);
|
|
+ return error;
|
|
+ }
|
|
+
|
|
/* Initialize TSQ */
|
|
card->tsq.org = dma_alloc_coherent(&card->pcidev->dev,
|
|
NS_TSQSIZE + NS_TSQ_ALIGNMENT,
|
|
@@ -752,15 +761,6 @@ static int ns_init_card(int i, struct pci_dev *pcidev)
|
|
|
|
card->efbie = 1;
|
|
|
|
- card->intcnt = 0;
|
|
- if (request_irq
|
|
- (pcidev->irq, &ns_irq_handler, IRQF_SHARED, "nicstar", card) != 0) {
|
|
- printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
|
|
- error = 9;
|
|
- ns_init_card_error(card, error);
|
|
- return error;
|
|
- }
|
|
-
|
|
/* Register device */
|
|
card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops,
|
|
-1, NULL);
|
|
@@ -838,10 +838,12 @@ static void ns_init_card_error(ns_dev *card, int error)
|
|
dev_kfree_skb_any(hb);
|
|
}
|
|
if (error >= 12) {
|
|
- kfree(card->rsq.org);
|
|
+ dma_free_coherent(&card->pcidev->dev, NS_RSQSIZE + NS_RSQ_ALIGNMENT,
|
|
+ card->rsq.org, card->rsq.dma);
|
|
}
|
|
if (error >= 11) {
|
|
- kfree(card->tsq.org);
|
|
+ dma_free_coherent(&card->pcidev->dev, NS_TSQSIZE + NS_TSQ_ALIGNMENT,
|
|
+ card->tsq.org, card->tsq.dma);
|
|
}
|
|
if (error >= 10) {
|
|
free_irq(card->pcidev->irq, card);
|
|
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
|
|
index e57a1f6e39d5c..302260e9002c7 100644
|
|
--- a/drivers/block/virtio_blk.c
|
|
+++ b/drivers/block/virtio_blk.c
|
|
@@ -800,6 +800,8 @@ static int virtblk_freeze(struct virtio_device *vdev)
|
|
blk_mq_stop_hw_queues(vblk->disk->queue);
|
|
|
|
vdev->config->del_vqs(vdev);
|
|
+ kfree(vblk->vqs);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
|
index 4e3b24a0511ff..30c09b9ddbf0d 100644
|
|
--- a/drivers/bluetooth/btusb.c
|
|
+++ b/drivers/bluetooth/btusb.c
|
|
@@ -2508,6 +2508,11 @@ static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
|
|
sent += size;
|
|
count -= size;
|
|
|
|
+ /* ep2 need time to switch from function acl to function dfu,
|
|
+ * so we add 20ms delay here.
|
|
+ */
|
|
+ msleep(20);
|
|
+
|
|
while (count) {
|
|
size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
|
|
|
|
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
|
|
index 055d2ce378a78..a5393e678fe9b 100644
|
|
--- a/drivers/char/ipmi/ipmi_watchdog.c
|
|
+++ b/drivers/char/ipmi/ipmi_watchdog.c
|
|
@@ -393,16 +393,18 @@ static int i_ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
|
|
data[0] = 0;
|
|
WDOG_SET_TIMER_USE(data[0], WDOG_TIMER_USE_SMS_OS);
|
|
|
|
- if ((ipmi_version_major > 1)
|
|
- || ((ipmi_version_major == 1) && (ipmi_version_minor >= 5))) {
|
|
- /* This is an IPMI 1.5-only feature. */
|
|
- data[0] |= WDOG_DONT_STOP_ON_SET;
|
|
- } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
|
|
- /*
|
|
- * In ipmi 1.0, setting the timer stops the watchdog, we
|
|
- * need to start it back up again.
|
|
- */
|
|
- hbnow = 1;
|
|
+ if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
|
|
+ if ((ipmi_version_major > 1) ||
|
|
+ ((ipmi_version_major == 1) && (ipmi_version_minor >= 5))) {
|
|
+ /* This is an IPMI 1.5-only feature. */
|
|
+ data[0] |= WDOG_DONT_STOP_ON_SET;
|
|
+ } else {
|
|
+ /*
|
|
+ * In ipmi 1.0, setting the timer stops the watchdog, we
|
|
+ * need to start it back up again.
|
|
+ */
|
|
+ hbnow = 1;
|
|
+ }
|
|
}
|
|
|
|
data[1] = 0;
|
|
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
|
|
index c115217c79aec..f8d98f7e6fb72 100644
|
|
--- a/drivers/char/pcmcia/cm4000_cs.c
|
|
+++ b/drivers/char/pcmcia/cm4000_cs.c
|
|
@@ -544,6 +544,10 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
|
|
io_read_num_rec_bytes(iobase, &num_bytes_read);
|
|
if (num_bytes_read >= 4) {
|
|
DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
|
|
+ if (num_bytes_read > 4) {
|
|
+ rc = -EIO;
|
|
+ goto exit_setprotocol;
|
|
+ }
|
|
break;
|
|
}
|
|
mdelay(10);
|
|
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
|
|
index 4ec08c7a7b659..2632b0fdb1b53 100644
|
|
--- a/drivers/char/virtio_console.c
|
|
+++ b/drivers/char/virtio_console.c
|
|
@@ -492,7 +492,7 @@ static struct port_buffer *get_inbuf(struct port *port)
|
|
|
|
buf = virtqueue_get_buf(port->in_vq, &len);
|
|
if (buf) {
|
|
- buf->len = len;
|
|
+ buf->len = min_t(size_t, len, buf->size);
|
|
buf->offset = 0;
|
|
port->stats.bytes_received += len;
|
|
}
|
|
@@ -1758,7 +1758,7 @@ static void control_work_handler(struct work_struct *work)
|
|
while ((buf = virtqueue_get_buf(vq, &len))) {
|
|
spin_unlock(&portdev->c_ivq_lock);
|
|
|
|
- buf->len = len;
|
|
+ buf->len = min_t(size_t, len, buf->size);
|
|
buf->offset = 0;
|
|
|
|
handle_control_message(vq->vdev, portdev, buf);
|
|
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
|
|
index 1ab36a355daf0..789efad791a3b 100644
|
|
--- a/drivers/clk/tegra/clk-pll.c
|
|
+++ b/drivers/clk/tegra/clk-pll.c
|
|
@@ -1085,7 +1085,8 @@ static int clk_pllu_enable(struct clk_hw *hw)
|
|
if (pll->lock)
|
|
spin_lock_irqsave(pll->lock, flags);
|
|
|
|
- _clk_pll_enable(hw);
|
|
+ if (!clk_pll_is_enabled(hw))
|
|
+ _clk_pll_enable(hw);
|
|
|
|
ret = clk_pll_wait_for_lock(pll);
|
|
if (ret < 0)
|
|
@@ -1702,7 +1703,8 @@ static int clk_pllu_tegra114_enable(struct clk_hw *hw)
|
|
if (pll->lock)
|
|
spin_lock_irqsave(pll->lock, flags);
|
|
|
|
- _clk_pll_enable(hw);
|
|
+ if (!clk_pll_is_enabled(hw))
|
|
+ _clk_pll_enable(hw);
|
|
|
|
ret = clk_pll_wait_for_lock(pll);
|
|
if (ret < 0)
|
|
diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
|
|
index a54de1299e9ef..81b61e256f7c4 100644
|
|
--- a/drivers/crypto/ixp4xx_crypto.c
|
|
+++ b/drivers/crypto/ixp4xx_crypto.c
|
|
@@ -334,7 +334,7 @@ static void free_buf_chain(struct device *dev, struct buffer_desc *buf,u32 phys)
|
|
|
|
buf1 = buf->next;
|
|
phys1 = buf->phys_next;
|
|
- dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir);
|
|
+ dma_unmap_single(dev, buf->phys_addr, buf->buf_len, buf->dir);
|
|
dma_pool_free(buffer_pool, buf, phys);
|
|
buf = buf1;
|
|
phys = phys1;
|
|
diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c
|
|
index cddc6d8b55d9c..1b8c877706453 100644
|
|
--- a/drivers/crypto/nx/nx-842-pseries.c
|
|
+++ b/drivers/crypto/nx/nx-842-pseries.c
|
|
@@ -553,13 +553,15 @@ static int nx842_OF_set_defaults(struct nx842_devdata *devdata)
|
|
* The status field indicates if the device is enabled when the status
|
|
* is 'okay'. Otherwise the device driver will be disabled.
|
|
*
|
|
- * @prop - struct property point containing the maxsyncop for the update
|
|
+ * @devdata: struct nx842_devdata to use for dev_info
|
|
+ * @prop: struct property point containing the maxsyncop for the update
|
|
*
|
|
* Returns:
|
|
* 0 - Device is available
|
|
* -ENODEV - Device is not available
|
|
*/
|
|
-static int nx842_OF_upd_status(struct property *prop)
|
|
+static int nx842_OF_upd_status(struct nx842_devdata *devdata,
|
|
+ struct property *prop)
|
|
{
|
|
const char *status = (const char *)prop->value;
|
|
|
|
@@ -773,7 +775,7 @@ static int nx842_OF_upd(struct property *new_prop)
|
|
goto out;
|
|
|
|
/* Perform property updates */
|
|
- ret = nx842_OF_upd_status(status);
|
|
+ ret = nx842_OF_upd_status(new_devdata, status);
|
|
if (ret)
|
|
goto error_out;
|
|
|
|
@@ -1086,6 +1088,7 @@ static struct vio_device_id nx842_vio_driver_ids[] = {
|
|
{"ibm,compression-v1", "ibm,compression"},
|
|
{"", ""},
|
|
};
|
|
+MODULE_DEVICE_TABLE(vio, nx842_vio_driver_ids);
|
|
|
|
static struct vio_driver nx842_vio_driver = {
|
|
.name = KBUILD_MODNAME,
|
|
diff --git a/drivers/crypto/qat/qat_common/qat_hal.c b/drivers/crypto/qat/qat_common/qat_hal.c
|
|
index 8c4fd255a601b..cdf80c16a0333 100644
|
|
--- a/drivers/crypto/qat/qat_common/qat_hal.c
|
|
+++ b/drivers/crypto/qat/qat_common/qat_hal.c
|
|
@@ -1255,7 +1255,11 @@ static int qat_hal_put_rel_wr_xfer(struct icp_qat_fw_loader_handle *handle,
|
|
pr_err("QAT: bad xfrAddr=0x%x\n", xfr_addr);
|
|
return -EINVAL;
|
|
}
|
|
- qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
|
|
+ status = qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
|
|
+ if (status) {
|
|
+ pr_err("QAT: failed to read register");
|
|
+ return status;
|
|
+ }
|
|
gpr_addr = qat_hal_get_reg_addr(ICP_GPB_REL, gprnum);
|
|
data16low = 0xffff & data;
|
|
data16hi = 0xffff & (data >> 0x10);
|
|
diff --git a/drivers/crypto/qat/qat_common/qat_uclo.c b/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
index 4f1cd83bf56f9..a8e3191e51856 100644
|
|
--- a/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
+++ b/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
@@ -385,7 +385,6 @@ static int qat_uclo_init_umem_seg(struct icp_qat_fw_loader_handle *handle,
|
|
return 0;
|
|
}
|
|
|
|
-#define ICP_DH895XCC_PESRAM_BAR_SIZE 0x80000
|
|
static int qat_uclo_init_ae_memory(struct icp_qat_fw_loader_handle *handle,
|
|
struct icp_qat_uof_initmem *init_mem)
|
|
{
|
|
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c
|
|
index 17c8e2b28c422..7500ec9efa6ac 100644
|
|
--- a/drivers/crypto/ux500/hash/hash_core.c
|
|
+++ b/drivers/crypto/ux500/hash/hash_core.c
|
|
@@ -1006,6 +1006,7 @@ static int hash_hw_final(struct ahash_request *req)
|
|
goto out;
|
|
}
|
|
} else if (req->nbytes == 0 && ctx->keylen > 0) {
|
|
+ ret = -EPERM;
|
|
dev_err(device_data->dev, "%s: Empty message with keylength > 0, NOT supported\n",
|
|
__func__);
|
|
goto out;
|
|
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
|
|
index b9b48d45a6dc4..17d426829f5db 100644
|
|
--- a/drivers/extcon/extcon-max8997.c
|
|
+++ b/drivers/extcon/extcon-max8997.c
|
|
@@ -783,3 +783,4 @@ module_platform_driver(max8997_muic_driver);
|
|
MODULE_DESCRIPTION("Maxim MAX8997 Extcon driver");
|
|
MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>");
|
|
MODULE_LICENSE("GPL");
|
|
+MODULE_ALIAS("platform:max8997-muic");
|
|
diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
|
|
index 9d2d8a6673c88..dbe5fc278f091 100644
|
|
--- a/drivers/extcon/extcon-sm5502.c
|
|
+++ b/drivers/extcon/extcon-sm5502.c
|
|
@@ -92,7 +92,6 @@ static struct reg_data sm5502_reg_data[] = {
|
|
| SM5502_REG_INTM2_MHL_MASK,
|
|
.invert = true,
|
|
},
|
|
- { }
|
|
};
|
|
|
|
/* List of detectable cables */
|
|
diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
|
|
index 0e2011636fbbb..595bf12e76538 100644
|
|
--- a/drivers/firmware/qemu_fw_cfg.c
|
|
+++ b/drivers/firmware/qemu_fw_cfg.c
|
|
@@ -192,15 +192,13 @@ static int fw_cfg_do_platform_probe(struct platform_device *pdev)
|
|
/* fw_cfg revision attribute, in /sys/firmware/qemu_fw_cfg top-level dir. */
|
|
static u32 fw_cfg_rev;
|
|
|
|
-static ssize_t fw_cfg_showrev(struct kobject *k, struct attribute *a, char *buf)
|
|
+static ssize_t fw_cfg_showrev(struct kobject *k, struct kobj_attribute *a,
|
|
+ char *buf)
|
|
{
|
|
return sprintf(buf, "%u\n", fw_cfg_rev);
|
|
}
|
|
|
|
-static const struct {
|
|
- struct attribute attr;
|
|
- ssize_t (*show)(struct kobject *k, struct attribute *a, char *buf);
|
|
-} fw_cfg_rev_attr = {
|
|
+static const struct kobj_attribute fw_cfg_rev_attr = {
|
|
.attr = { .name = "rev", .mode = S_IRUSR },
|
|
.show = fw_cfg_showrev,
|
|
};
|
|
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
|
|
index 6b4d10d6e10f6..5038d771ac6e8 100644
|
|
--- a/drivers/gpio/gpio-zynq.c
|
|
+++ b/drivers/gpio/gpio-zynq.c
|
|
@@ -778,8 +778,11 @@ err_pm_dis:
|
|
static int zynq_gpio_remove(struct platform_device *pdev)
|
|
{
|
|
struct zynq_gpio *gpio = platform_get_drvdata(pdev);
|
|
+ int ret;
|
|
|
|
- pm_runtime_get_sync(&pdev->dev);
|
|
+ ret = pm_runtime_get_sync(&pdev->dev);
|
|
+ if (ret < 0)
|
|
+ dev_warn(&pdev->dev, "pm_runtime_get_sync() Failed\n");
|
|
gpiochip_remove(&gpio->chip);
|
|
clk_disable_unprepare(gpio->clk);
|
|
device_set_wakeup_capable(&pdev->dev, 0);
|
|
diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
index 5e65d5d2d937d..e7b7b8a31e52d 100644
|
|
--- a/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
+++ b/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
@@ -57,6 +57,8 @@ int qxl_mode_dumb_create(struct drm_file *file_priv,
|
|
surf.height = args->height;
|
|
surf.stride = pitch;
|
|
surf.format = format;
|
|
+ surf.data = 0;
|
|
+
|
|
r = qxl_gem_object_create_with_handle(qdev, file_priv,
|
|
QXL_GEM_DOMAIN_VRAM,
|
|
args->size, &surf, &qobj,
|
|
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
|
|
index ba7855da7c7f6..6058bdab5fb8f 100644
|
|
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
|
|
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
|
|
@@ -234,6 +234,7 @@ err_ttm:
|
|
err_vbufs:
|
|
vgdev->vdev->config->del_vqs(vgdev->vdev);
|
|
err_vqs:
|
|
+ dev->dev_private = NULL;
|
|
kfree(vgdev);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/hwmon/max31722.c b/drivers/hwmon/max31722.c
|
|
index 30a100e70a0d0..877c3d7dca012 100644
|
|
--- a/drivers/hwmon/max31722.c
|
|
+++ b/drivers/hwmon/max31722.c
|
|
@@ -9,7 +9,6 @@
|
|
* directory of this archive for more details.
|
|
*/
|
|
|
|
-#include <linux/acpi.h>
|
|
#include <linux/hwmon.h>
|
|
#include <linux/hwmon-sysfs.h>
|
|
#include <linux/kernel.h>
|
|
@@ -138,20 +137,12 @@ static const struct spi_device_id max31722_spi_id[] = {
|
|
{"max31723", 0},
|
|
{}
|
|
};
|
|
-
|
|
-static const struct acpi_device_id __maybe_unused max31722_acpi_id[] = {
|
|
- {"MAX31722", 0},
|
|
- {"MAX31723", 0},
|
|
- {}
|
|
-};
|
|
-
|
|
MODULE_DEVICE_TABLE(spi, max31722_spi_id);
|
|
|
|
static struct spi_driver max31722_driver = {
|
|
.driver = {
|
|
.name = "max31722",
|
|
.pm = &max31722_pm_ops,
|
|
- .acpi_match_table = ACPI_PTR(max31722_acpi_id),
|
|
},
|
|
.probe = max31722_probe,
|
|
.remove = max31722_remove,
|
|
diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
|
|
index 281491cca5103..66cf772de7d29 100644
|
|
--- a/drivers/hwmon/max31790.c
|
|
+++ b/drivers/hwmon/max31790.c
|
|
@@ -179,7 +179,7 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
|
|
|
|
switch (attr) {
|
|
case hwmon_fan_input:
|
|
- sr = get_tach_period(data->fan_dynamics[channel]);
|
|
+ sr = get_tach_period(data->fan_dynamics[channel % NR_CHANNEL]);
|
|
rpm = RPM_FROM_REG(data->tach[channel], sr);
|
|
*val = rpm;
|
|
return 0;
|
|
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
|
|
index 4fd7bfda2f9de..67e44e9907776 100644
|
|
--- a/drivers/i2c/i2c-core.c
|
|
+++ b/drivers/i2c/i2c-core.c
|
|
@@ -42,6 +42,7 @@
|
|
#include <linux/i2c.h>
|
|
#include <linux/idr.h>
|
|
#include <linux/init.h>
|
|
+#include <linux/interrupt.h>
|
|
#include <linux/irqflags.h>
|
|
#include <linux/jump_label.h>
|
|
#include <linux/kernel.h>
|
|
@@ -1003,6 +1004,8 @@ static void i2c_device_shutdown(struct device *dev)
|
|
driver = to_i2c_driver(dev->driver);
|
|
if (driver->shutdown)
|
|
driver->shutdown(client);
|
|
+ else if (client->irq > 0)
|
|
+ disable_irq(client->irq);
|
|
}
|
|
|
|
static void i2c_client_dev_release(struct device *dev)
|
|
diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
|
|
index 0890934ef66f6..73ea64a2bff08 100644
|
|
--- a/drivers/iio/accel/bma180.c
|
|
+++ b/drivers/iio/accel/bma180.c
|
|
@@ -120,7 +120,11 @@ struct bma180_data {
|
|
int scale;
|
|
int bw;
|
|
bool pmode;
|
|
- u8 buff[16]; /* 3x 16-bit + 8-bit + padding + timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chan[4];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
enum bma180_chan {
|
|
@@ -667,12 +671,12 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p)
|
|
mutex_unlock(&data->mutex);
|
|
goto err;
|
|
}
|
|
- ((s16 *)data->buff)[i++] = ret;
|
|
+ data->scan.chan[i++] = ret;
|
|
}
|
|
|
|
mutex_unlock(&data->mutex);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns);
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, time_ns);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
|
|
diff --git a/drivers/iio/accel/bma220_spi.c b/drivers/iio/accel/bma220_spi.c
|
|
index 5099f295dd378..a96f2d530ae34 100644
|
|
--- a/drivers/iio/accel/bma220_spi.c
|
|
+++ b/drivers/iio/accel/bma220_spi.c
|
|
@@ -76,7 +76,11 @@ static const int bma220_scale_table[][4] = {
|
|
struct bma220_data {
|
|
struct spi_device *spi_device;
|
|
struct mutex lock;
|
|
- s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 8x8 timestamp */
|
|
+ struct {
|
|
+ s8 chans[3];
|
|
+ /* Ensure timestamp is naturally aligned. */
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u8 tx_buf[2] ____cacheline_aligned;
|
|
};
|
|
|
|
@@ -107,12 +111,12 @@ static irqreturn_t bma220_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->lock);
|
|
data->tx_buf[0] = BMA220_REG_ACCEL_X | BMA220_READ_MASK;
|
|
- ret = spi_write_then_read(spi, data->tx_buf, 1, data->buffer,
|
|
+ ret = spi_write_then_read(spi, data->tx_buf, 1, &data->scan.chans,
|
|
ARRAY_SIZE(bma220_channels) - 1);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
mutex_unlock(&data->lock);
|
|
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
|
|
index 261fbdb88fe15..626a605a0c0e6 100644
|
|
--- a/drivers/iio/accel/kxcjk-1013.c
|
|
+++ b/drivers/iio/accel/kxcjk-1013.c
|
|
@@ -96,12 +96,23 @@ enum kx_acpi_type {
|
|
ACPI_SMO8500,
|
|
};
|
|
|
|
+enum kxcjk1013_axis {
|
|
+ AXIS_X,
|
|
+ AXIS_Y,
|
|
+ AXIS_Z,
|
|
+ AXIS_MAX
|
|
+};
|
|
+
|
|
struct kxcjk1013_data {
|
|
struct i2c_client *client;
|
|
struct iio_trigger *dready_trig;
|
|
struct iio_trigger *motion_trig;
|
|
struct mutex mutex;
|
|
- s16 buffer[8];
|
|
+ /* Ensure timestamp naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[AXIS_MAX];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u8 odr_bits;
|
|
u8 range;
|
|
int wake_thres;
|
|
@@ -115,13 +126,6 @@ struct kxcjk1013_data {
|
|
enum kx_acpi_type acpi_type;
|
|
};
|
|
|
|
-enum kxcjk1013_axis {
|
|
- AXIS_X,
|
|
- AXIS_Y,
|
|
- AXIS_Z,
|
|
- AXIS_MAX,
|
|
-};
|
|
-
|
|
enum kxcjk1013_mode {
|
|
STANDBY,
|
|
OPERATION,
|
|
@@ -971,12 +975,12 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
|
|
KXCJK1013_REG_XOUT_L,
|
|
AXIS_MAX * 2,
|
|
- (u8 *)data->buffer);
|
|
+ (u8 *)data->scan.chans);
|
|
mutex_unlock(&data->mutex);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
data->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
|
|
index e31023dc5f1b7..24a7499049f13 100644
|
|
--- a/drivers/iio/accel/stk8312.c
|
|
+++ b/drivers/iio/accel/stk8312.c
|
|
@@ -106,7 +106,11 @@ struct stk8312_data {
|
|
u8 mode;
|
|
struct iio_trigger *dready_trig;
|
|
bool dready_trigger_on;
|
|
- s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 64-bit timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s8 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static IIO_CONST_ATTR(in_accel_scale_available, STK8312_SCALE_AVAIL);
|
|
@@ -443,7 +447,7 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data(data->client,
|
|
STK8312_REG_XOUT,
|
|
STK8312_ALL_CHANNEL_SIZE,
|
|
- data->buffer);
|
|
+ data->scan.chans);
|
|
if (ret < STK8312_ALL_CHANNEL_SIZE) {
|
|
dev_err(&data->client->dev, "register read failed\n");
|
|
mutex_unlock(&data->lock);
|
|
@@ -457,12 +461,12 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
|
|
mutex_unlock(&data->lock);
|
|
goto err;
|
|
}
|
|
- data->buffer[i++] = ret;
|
|
+ data->scan.chans[i++] = ret;
|
|
}
|
|
}
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/accel/stk8ba50.c b/drivers/iio/accel/stk8ba50.c
|
|
index 300d955bad004..5ca179cea2fb4 100644
|
|
--- a/drivers/iio/accel/stk8ba50.c
|
|
+++ b/drivers/iio/accel/stk8ba50.c
|
|
@@ -94,12 +94,11 @@ struct stk8ba50_data {
|
|
u8 sample_rate_idx;
|
|
struct iio_trigger *dready_trig;
|
|
bool dready_trigger_on;
|
|
- /*
|
|
- * 3 x 16-bit channels (10-bit data, 6-bit padding) +
|
|
- * 1 x 16 padding +
|
|
- * 4 x 16 64-bit timestamp
|
|
- */
|
|
- s16 buffer[8];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[3];
|
|
+ s64 timetamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define STK8BA50_ACCEL_CHANNEL(index, reg, axis) { \
|
|
@@ -329,7 +328,7 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data(data->client,
|
|
STK8BA50_REG_XOUT,
|
|
STK8BA50_ALL_CHANNEL_SIZE,
|
|
- (u8 *)data->buffer);
|
|
+ (u8 *)data->scan.chans);
|
|
if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
|
|
dev_err(&data->client->dev, "register read failed\n");
|
|
goto err;
|
|
@@ -342,10 +341,10 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- data->buffer[i++] = ret;
|
|
+ data->scan.chans[i++] = ret;
|
|
}
|
|
}
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
mutex_unlock(&data->lock);
|
|
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
|
|
index 5afe32f6587bb..d892c0fe5c316 100644
|
|
--- a/drivers/iio/adc/ti-ads1015.c
|
|
+++ b/drivers/iio/adc/ti-ads1015.c
|
|
@@ -292,10 +292,14 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
|
|
struct iio_poll_func *pf = p;
|
|
struct iio_dev *indio_dev = pf->indio_dev;
|
|
struct ads1015_data *data = iio_priv(indio_dev);
|
|
- s16 buf[8]; /* 1x s16 ADC val + 3x s16 padding + 4x s16 timestamp */
|
|
+ /* Ensure natural alignment of timestamp */
|
|
+ struct {
|
|
+ s16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
int chan, ret, res;
|
|
|
|
- memset(buf, 0, sizeof(buf));
|
|
+ memset(&scan, 0, sizeof(scan));
|
|
|
|
mutex_lock(&data->lock);
|
|
chan = find_first_bit(indio_dev->active_scan_mask,
|
|
@@ -306,10 +310,10 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
|
|
goto err;
|
|
}
|
|
|
|
- buf[0] = res;
|
|
+ scan.chan = res;
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
err:
|
|
diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
|
|
index d1bde6d2721ee..2a14800e6514b 100644
|
|
--- a/drivers/iio/adc/vf610_adc.c
|
|
+++ b/drivers/iio/adc/vf610_adc.c
|
|
@@ -180,7 +180,11 @@ struct vf610_adc {
|
|
u32 sample_freq_avail[5];
|
|
|
|
struct completion completion;
|
|
- u16 buffer[8];
|
|
+ /* Ensure the timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static const u32 vf610_hw_avgs[] = { 1, 4, 8, 16, 32 };
|
|
@@ -592,9 +596,9 @@ static irqreturn_t vf610_adc_isr(int irq, void *dev_id)
|
|
if (coco & VF610_ADC_HS_COCO0) {
|
|
info->value = vf610_adc_read_data(info);
|
|
if (iio_buffer_enabled(indio_dev)) {
|
|
- info->buffer[0] = info->value;
|
|
+ info->scan.chan = info->value;
|
|
iio_push_to_buffers_with_timestamp(indio_dev,
|
|
- info->buffer,
|
|
+ &info->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
} else
|
|
diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
|
|
index b5a5517e3ce1a..ec2830c164334 100644
|
|
--- a/drivers/iio/gyro/bmg160_core.c
|
|
+++ b/drivers/iio/gyro/bmg160_core.c
|
|
@@ -104,7 +104,11 @@ struct bmg160_data {
|
|
struct iio_trigger *dready_trig;
|
|
struct iio_trigger *motion_trig;
|
|
struct mutex mutex;
|
|
- s16 buffer[8];
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ struct {
|
|
+ s16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u32 dps_range;
|
|
int ev_enable_state;
|
|
int slope_thres;
|
|
@@ -874,12 +878,12 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->mutex);
|
|
ret = regmap_bulk_read(data->regmap, BMG160_REG_XOUT_L,
|
|
- data->buffer, AXIS_MAX * 2);
|
|
+ data->scan.chans, AXIS_MAX * 2);
|
|
mutex_unlock(&data->mutex);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/humidity/am2315.c b/drivers/iio/humidity/am2315.c
|
|
index ff96b6d0fdae4..77513fd84b99d 100644
|
|
--- a/drivers/iio/humidity/am2315.c
|
|
+++ b/drivers/iio/humidity/am2315.c
|
|
@@ -36,7 +36,11 @@
|
|
struct am2315_data {
|
|
struct i2c_client *client;
|
|
struct mutex lock;
|
|
- s16 buffer[8]; /* 2x16-bit channels + 2x16 padding + 4x16 timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[2];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
struct am2315_sensor_data {
|
|
@@ -170,20 +174,20 @@ static irqreturn_t am2315_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->lock);
|
|
if (*(indio_dev->active_scan_mask) == AM2315_ALL_CHANNEL_MASK) {
|
|
- data->buffer[0] = sensor_data.hum_data;
|
|
- data->buffer[1] = sensor_data.temp_data;
|
|
+ data->scan.chans[0] = sensor_data.hum_data;
|
|
+ data->scan.chans[1] = sensor_data.temp_data;
|
|
} else {
|
|
i = 0;
|
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
|
indio_dev->masklength) {
|
|
- data->buffer[i] = (bit ? sensor_data.temp_data :
|
|
- sensor_data.hum_data);
|
|
+ data->scan.chans[i] = (bit ? sensor_data.temp_data :
|
|
+ sensor_data.hum_data);
|
|
i++;
|
|
}
|
|
}
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/imu/adis_buffer.c b/drivers/iio/imu/adis_buffer.c
|
|
index 9de553e8c214f..625f54d9e382f 100644
|
|
--- a/drivers/iio/imu/adis_buffer.c
|
|
+++ b/drivers/iio/imu/adis_buffer.c
|
|
@@ -83,9 +83,6 @@ static irqreturn_t adis_trigger_handler(int irq, void *p)
|
|
struct adis *adis = iio_device_get_drvdata(indio_dev);
|
|
int ret;
|
|
|
|
- if (!adis->buffer)
|
|
- return -ENOMEM;
|
|
-
|
|
if (adis->data->has_paging) {
|
|
mutex_lock(&adis->txrx_lock);
|
|
if (adis->current_page != 0) {
|
|
diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c
|
|
index 1d2c0c8a1d4f0..207b856cef8c0 100644
|
|
--- a/drivers/iio/light/isl29125.c
|
|
+++ b/drivers/iio/light/isl29125.c
|
|
@@ -54,7 +54,11 @@
|
|
struct isl29125_data {
|
|
struct i2c_client *client;
|
|
u8 conf1;
|
|
- u16 buffer[8]; /* 3x 16-bit, padding, 8 bytes timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define ISL29125_CHANNEL(_color, _si) { \
|
|
@@ -187,10 +191,10 @@ static irqreturn_t isl29125_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- data->buffer[j++] = ret;
|
|
+ data->scan.chans[j++] = ret;
|
|
}
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
|
|
index a8f9bc12ee23a..414fe857fa9d7 100644
|
|
--- a/drivers/iio/light/ltr501.c
|
|
+++ b/drivers/iio/light/ltr501.c
|
|
@@ -35,9 +35,12 @@
|
|
#define LTR501_PART_ID 0x86
|
|
#define LTR501_MANUFAC_ID 0x87
|
|
#define LTR501_ALS_DATA1 0x88 /* 16-bit, little endian */
|
|
+#define LTR501_ALS_DATA1_UPPER 0x89 /* upper 8 bits of LTR501_ALS_DATA1 */
|
|
#define LTR501_ALS_DATA0 0x8a /* 16-bit, little endian */
|
|
+#define LTR501_ALS_DATA0_UPPER 0x8b /* upper 8 bits of LTR501_ALS_DATA0 */
|
|
#define LTR501_ALS_PS_STATUS 0x8c
|
|
#define LTR501_PS_DATA 0x8d /* 16-bit, little endian */
|
|
+#define LTR501_PS_DATA_UPPER 0x8e /* upper 8 bits of LTR501_PS_DATA */
|
|
#define LTR501_INTR 0x8f /* output mode, polarity, mode */
|
|
#define LTR501_PS_THRESH_UP 0x90 /* 11 bit, ps upper threshold */
|
|
#define LTR501_PS_THRESH_LOW 0x92 /* 11 bit, ps lower threshold */
|
|
@@ -408,18 +411,19 @@ static int ltr501_read_als(struct ltr501_data *data, __le16 buf[2])
|
|
|
|
static int ltr501_read_ps(struct ltr501_data *data)
|
|
{
|
|
- int ret, status;
|
|
+ __le16 status;
|
|
+ int ret;
|
|
|
|
ret = ltr501_drdy(data, LTR501_STATUS_PS_RDY);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
|
|
- &status, 2);
|
|
+ &status, sizeof(status));
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- return status;
|
|
+ return le16_to_cpu(status);
|
|
}
|
|
|
|
static int ltr501_read_intr_prst(struct ltr501_data *data,
|
|
@@ -1180,7 +1184,7 @@ static struct ltr501_chip_info ltr501_chip_info_tbl[] = {
|
|
.als_gain_tbl_size = ARRAY_SIZE(ltr559_als_gain_tbl),
|
|
.ps_gain = ltr559_ps_gain_tbl,
|
|
.ps_gain_tbl_size = ARRAY_SIZE(ltr559_ps_gain_tbl),
|
|
- .als_mode_active = BIT(1),
|
|
+ .als_mode_active = BIT(0),
|
|
.als_gain_mask = BIT(2) | BIT(3) | BIT(4),
|
|
.als_gain_shift = 2,
|
|
.info = <r501_info,
|
|
@@ -1329,9 +1333,12 @@ static bool ltr501_is_volatile_reg(struct device *dev, unsigned int reg)
|
|
{
|
|
switch (reg) {
|
|
case LTR501_ALS_DATA1:
|
|
+ case LTR501_ALS_DATA1_UPPER:
|
|
case LTR501_ALS_DATA0:
|
|
+ case LTR501_ALS_DATA0_UPPER:
|
|
case LTR501_ALS_PS_STATUS:
|
|
case LTR501_PS_DATA:
|
|
+ case LTR501_PS_DATA_UPPER:
|
|
return true;
|
|
default:
|
|
return false;
|
|
diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c
|
|
index a795afb7667bd..b51cd43ef8249 100644
|
|
--- a/drivers/iio/light/tcs3414.c
|
|
+++ b/drivers/iio/light/tcs3414.c
|
|
@@ -56,7 +56,11 @@ struct tcs3414_data {
|
|
u8 control;
|
|
u8 gain;
|
|
u8 timing;
|
|
- u16 buffer[8]; /* 4x 16-bit + 8 bytes timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chans[4];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define TCS3414_CHANNEL(_color, _si, _addr) { \
|
|
@@ -212,10 +216,10 @@ static irqreturn_t tcs3414_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- data->buffer[j++] = ret;
|
|
+ data->scan.chans[j++] = ret;
|
|
}
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
index 46e969a3a9b7e..ed7397f0b4c81 100644
|
|
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
@@ -51,7 +51,11 @@ struct lidar_data {
|
|
int (*xfer)(struct lidar_data *data, u8 reg, u8 *val, int len);
|
|
int i2c_enabled;
|
|
|
|
- u16 buffer[8]; /* 2 byte distance + 8 byte timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static const struct iio_chan_spec lidar_channels[] = {
|
|
@@ -236,9 +240,9 @@ static irqreturn_t lidar_trigger_handler(int irq, void *private)
|
|
struct lidar_data *data = iio_priv(indio_dev);
|
|
int ret;
|
|
|
|
- ret = lidar_get_measurement(data, data->buffer);
|
|
+ ret = lidar_get_measurement(data, &data->scan.chan);
|
|
if (!ret) {
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
} else if (ret != -EINVAL) {
|
|
dev_err(&data->client->dev, "cannot read LIDAR measurement");
|
|
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
|
|
index 0a6cc78ebcf74..149d210c68aba 100644
|
|
--- a/drivers/infiniband/core/cma.c
|
|
+++ b/drivers/infiniband/core/cma.c
|
|
@@ -2370,7 +2370,8 @@ static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms)
|
|
work->new_state = RDMA_CM_ROUTE_RESOLVED;
|
|
work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
|
|
|
|
- route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
|
|
+ if (!route->path_rec)
|
|
+ route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
|
|
if (!route->path_rec) {
|
|
ret = -ENOMEM;
|
|
goto err1;
|
|
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
|
|
index 36bdb04f8f018..87bc7b0db892b 100644
|
|
--- a/drivers/infiniband/hw/cxgb4/qp.c
|
|
+++ b/drivers/infiniband/hw/cxgb4/qp.c
|
|
@@ -277,6 +277,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
|
|
if (user && (!wq->sq.bar2_pa || !wq->rq.bar2_pa)) {
|
|
pr_warn(MOD "%s: sqid %u or rqid %u not in BAR2 range.\n",
|
|
pci_name(rdev->lldi.pdev), wq->sq.qid, wq->rq.qid);
|
|
+ ret = -EINVAL;
|
|
goto free_dma;
|
|
}
|
|
|
|
diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
|
|
index 6d1ba75398a1a..e23b322224ab1 100644
|
|
--- a/drivers/infiniband/sw/rxe/rxe_mr.c
|
|
+++ b/drivers/infiniband/sw/rxe/rxe_mr.c
|
|
@@ -175,7 +175,7 @@ int rxe_mem_init_user(struct rxe_dev *rxe, struct rxe_pd *pd, u64 start,
|
|
if (IS_ERR(umem)) {
|
|
pr_warn("err %d from rxe_umem_get\n",
|
|
(int)PTR_ERR(umem));
|
|
- err = -EINVAL;
|
|
+ err = PTR_ERR(umem);
|
|
goto err1;
|
|
}
|
|
|
|
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
|
|
index e392612345282..f431cecd8b562 100644
|
|
--- a/drivers/infiniband/sw/rxe/rxe_net.c
|
|
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
|
|
@@ -259,10 +259,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
|
|
|
|
/* Create UDP socket */
|
|
err = udp_sock_create(net, &udp_cfg, &sock);
|
|
- if (err < 0) {
|
|
- pr_err("failed to create udp socket. err = %d\n", err);
|
|
+ if (err < 0)
|
|
return ERR_PTR(err);
|
|
- }
|
|
|
|
tnl_cfg.encap_type = 1;
|
|
tnl_cfg.encap_rcv = rxe_udp_encap_recv;
|
|
@@ -665,6 +663,12 @@ int rxe_net_ipv6_init(void)
|
|
|
|
recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
|
|
htons(ROCE_V2_UDP_DPORT), true);
|
|
+ if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
|
|
+ recv_sockets.sk6 = NULL;
|
|
+ pr_warn("IPv6 is not supported, can not create a UDPv6 socket\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
if (IS_ERR(recv_sockets.sk6)) {
|
|
recv_sockets.sk6 = NULL;
|
|
pr_err("Failed to create IPv6 UDP tunnel\n");
|
|
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
|
|
index 1ebce211d875a..39a7abe4b48c1 100644
|
|
--- a/drivers/input/joydev.c
|
|
+++ b/drivers/input/joydev.c
|
|
@@ -492,7 +492,7 @@ static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev,
|
|
memcpy(joydev->keypam, keypam, len);
|
|
|
|
for (i = 0; i < joydev->nkey; i++)
|
|
- joydev->keymap[keypam[i] - BTN_MISC] = i;
|
|
+ joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;
|
|
|
|
out:
|
|
kfree(keypam);
|
|
diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c
|
|
index 5b152f25a8e1f..da07742fd9a43 100644
|
|
--- a/drivers/input/keyboard/hil_kbd.c
|
|
+++ b/drivers/input/keyboard/hil_kbd.c
|
|
@@ -512,6 +512,7 @@ static int hil_dev_connect(struct serio *serio, struct serio_driver *drv)
|
|
HIL_IDD_NUM_AXES_PER_SET(*idd)) {
|
|
printk(KERN_INFO PREFIX
|
|
"combo devices are not supported.\n");
|
|
+ error = -EINVAL;
|
|
goto bail1;
|
|
}
|
|
|
|
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
|
index 499402a975b3c..c5d34a7823724 100644
|
|
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
|
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
|
@@ -266,7 +266,7 @@ static int e2i_init(struct usbtouch_usb *usbtouch)
|
|
int ret;
|
|
struct usb_device *udev = interface_to_usbdev(usbtouch->interface);
|
|
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
0x01, 0x02, 0x0000, 0x0081,
|
|
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
|
|
@@ -462,7 +462,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
|
int ret, i;
|
|
struct usb_device *udev = interface_to_usbdev(usbtouch->interface);
|
|
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
MTOUCHUSB_RESET,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
@@ -474,7 +474,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
|
msleep(150);
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
MTOUCHUSB_ASYNC_REPORT,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
@@ -645,7 +645,7 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
|
}
|
|
|
|
/* start sending data */
|
|
- ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
|
|
+ ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
|
TSC10_CMD_DATA1,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
|
|
index 9b23843dcad4d..7ba1a94497f5d 100644
|
|
--- a/drivers/ipack/carriers/tpci200.c
|
|
+++ b/drivers/ipack/carriers/tpci200.c
|
|
@@ -591,8 +591,11 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
|
|
|
|
out_err_bus_register:
|
|
tpci200_uninstall(tpci200);
|
|
+ /* tpci200->info->cfg_regs is unmapped in tpci200_uninstall */
|
|
+ tpci200->info->cfg_regs = NULL;
|
|
out_err_install:
|
|
- iounmap(tpci200->info->cfg_regs);
|
|
+ if (tpci200->info->cfg_regs)
|
|
+ iounmap(tpci200->info->cfg_regs);
|
|
out_err_ioremap:
|
|
pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
|
|
out_err_pci_request:
|
|
diff --git a/drivers/isdn/hardware/mISDN/hfcpci.c b/drivers/isdn/hardware/mISDN/hfcpci.c
|
|
index ff48da61c94c8..89cf1d695a01c 100644
|
|
--- a/drivers/isdn/hardware/mISDN/hfcpci.c
|
|
+++ b/drivers/isdn/hardware/mISDN/hfcpci.c
|
|
@@ -2352,7 +2352,7 @@ static void __exit
|
|
HFC_cleanup(void)
|
|
{
|
|
if (timer_pending(&hfc_tl))
|
|
- del_timer(&hfc_tl);
|
|
+ del_timer_sync(&hfc_tl);
|
|
|
|
pci_unregister_driver(&hfc_driver);
|
|
}
|
|
diff --git a/drivers/leds/leds-ktd2692.c b/drivers/leds/leds-ktd2692.c
|
|
index 45296aaca9daa..02738b5b1dbf2 100644
|
|
--- a/drivers/leds/leds-ktd2692.c
|
|
+++ b/drivers/leds/leds-ktd2692.c
|
|
@@ -259,6 +259,17 @@ static void ktd2692_setup(struct ktd2692_context *led)
|
|
| KTD2692_REG_FLASH_CURRENT_BASE);
|
|
}
|
|
|
|
+static void regulator_disable_action(void *_data)
|
|
+{
|
|
+ struct device *dev = _data;
|
|
+ struct ktd2692_context *led = dev_get_drvdata(dev);
|
|
+ int ret;
|
|
+
|
|
+ ret = regulator_disable(led->regulator);
|
|
+ if (ret)
|
|
+ dev_err(dev, "Failed to disable supply: %d\n", ret);
|
|
+}
|
|
+
|
|
static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
|
|
struct ktd2692_led_config_data *cfg)
|
|
{
|
|
@@ -289,8 +300,14 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
|
|
|
|
if (led->regulator) {
|
|
ret = regulator_enable(led->regulator);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
dev_err(dev, "Failed to enable supply: %d\n", ret);
|
|
+ } else {
|
|
+ ret = devm_add_action_or_reset(dev,
|
|
+ regulator_disable_action, dev);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
child_node = of_get_next_available_child(np, NULL);
|
|
@@ -380,17 +397,9 @@ static int ktd2692_probe(struct platform_device *pdev)
|
|
static int ktd2692_remove(struct platform_device *pdev)
|
|
{
|
|
struct ktd2692_context *led = platform_get_drvdata(pdev);
|
|
- int ret;
|
|
|
|
led_classdev_flash_unregister(&led->fled_cdev);
|
|
|
|
- if (led->regulator) {
|
|
- ret = regulator_disable(led->regulator);
|
|
- if (ret)
|
|
- dev_err(&pdev->dev,
|
|
- "Failed to disable supply: %d\n", ret);
|
|
- }
|
|
-
|
|
mutex_destroy(&led->lock);
|
|
|
|
return 0;
|
|
diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c
|
|
index eff04fa23dfad..9e4d1212f4c16 100644
|
|
--- a/drivers/md/persistent-data/dm-btree-remove.c
|
|
+++ b/drivers/md/persistent-data/dm-btree-remove.c
|
|
@@ -549,7 +549,8 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,
|
|
delete_at(n, index);
|
|
}
|
|
|
|
- *new_root = shadow_root(&spine);
|
|
+ if (!r)
|
|
+ *new_root = shadow_root(&spine);
|
|
exit_shadow_spine(&spine);
|
|
|
|
return r;
|
|
diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c
|
|
index bf4c5e2ccb6ff..e0acae7a3815d 100644
|
|
--- a/drivers/md/persistent-data/dm-space-map-disk.c
|
|
+++ b/drivers/md/persistent-data/dm-space-map-disk.c
|
|
@@ -171,6 +171,14 @@ static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
|
|
* Any block we allocate has to be free in both the old and current ll.
|
|
*/
|
|
r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b);
|
|
+ if (r == -ENOSPC) {
|
|
+ /*
|
|
+ * There's no free block between smd->begin and the end of the metadata device.
|
|
+ * We search before smd->begin in case something has been freed.
|
|
+ */
|
|
+ r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, 0, smd->begin, b);
|
|
+ }
|
|
+
|
|
if (r)
|
|
return r;
|
|
|
|
@@ -199,7 +207,6 @@ static int sm_disk_commit(struct dm_space_map *sm)
|
|
return r;
|
|
|
|
memcpy(&smd->old_ll, &smd->ll, sizeof(smd->old_ll));
|
|
- smd->begin = 0;
|
|
smd->nr_allocated_this_transaction = 0;
|
|
|
|
r = sm_disk_get_nr_free(sm, &nr_free);
|
|
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c
|
|
index 967d8f2a731fb..62a4d7da9bd96 100644
|
|
--- a/drivers/md/persistent-data/dm-space-map-metadata.c
|
|
+++ b/drivers/md/persistent-data/dm-space-map-metadata.c
|
|
@@ -451,6 +451,14 @@ static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b)
|
|
* Any block we allocate has to be free in both the old and current ll.
|
|
*/
|
|
r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b);
|
|
+ if (r == -ENOSPC) {
|
|
+ /*
|
|
+ * There's no free block between smm->begin and the end of the metadata device.
|
|
+ * We search before smm->begin in case something has been freed.
|
|
+ */
|
|
+ r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, 0, smm->begin, b);
|
|
+ }
|
|
+
|
|
if (r)
|
|
return r;
|
|
|
|
@@ -502,7 +510,6 @@ static int sm_metadata_commit(struct dm_space_map *sm)
|
|
return r;
|
|
|
|
memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll));
|
|
- smm->begin = 0;
|
|
smm->allocated_this_transaction = 0;
|
|
|
|
return 0;
|
|
diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c
|
|
index f3a42834d7d61..b10bd45da9c5b 100644
|
|
--- a/drivers/media/common/siano/smscoreapi.c
|
|
+++ b/drivers/media/common/siano/smscoreapi.c
|
|
@@ -914,7 +914,7 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
|
|
void *buffer, size_t size)
|
|
{
|
|
struct sms_firmware *firmware = (struct sms_firmware *) buffer;
|
|
- struct sms_msg_data4 *msg;
|
|
+ struct sms_msg_data5 *msg;
|
|
u32 mem_address, calc_checksum = 0;
|
|
u32 i, *ptr;
|
|
u8 *payload = firmware->payload;
|
|
@@ -995,24 +995,20 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
|
|
goto exit_fw_download;
|
|
|
|
if (coredev->mode == DEVICE_MODE_NONE) {
|
|
- struct sms_msg_data *trigger_msg =
|
|
- (struct sms_msg_data *) msg;
|
|
-
|
|
pr_debug("sending MSG_SMS_SWDOWNLOAD_TRIGGER_REQ\n");
|
|
SMS_INIT_MSG(&msg->x_msg_header,
|
|
MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
|
|
- sizeof(struct sms_msg_hdr) +
|
|
- sizeof(u32) * 5);
|
|
+ sizeof(*msg));
|
|
|
|
- trigger_msg->msg_data[0] = firmware->start_address;
|
|
+ msg->msg_data[0] = firmware->start_address;
|
|
/* Entry point */
|
|
- trigger_msg->msg_data[1] = 6; /* Priority */
|
|
- trigger_msg->msg_data[2] = 0x200; /* Stack size */
|
|
- trigger_msg->msg_data[3] = 0; /* Parameter */
|
|
- trigger_msg->msg_data[4] = 4; /* Task ID */
|
|
+ msg->msg_data[1] = 6; /* Priority */
|
|
+ msg->msg_data[2] = 0x200; /* Stack size */
|
|
+ msg->msg_data[3] = 0; /* Parameter */
|
|
+ msg->msg_data[4] = 4; /* Task ID */
|
|
|
|
- rc = smscore_sendrequest_and_wait(coredev, trigger_msg,
|
|
- trigger_msg->x_msg_header.msg_length,
|
|
+ rc = smscore_sendrequest_and_wait(coredev, msg,
|
|
+ msg->x_msg_header.msg_length,
|
|
&coredev->trigger_done);
|
|
} else {
|
|
SMS_INIT_MSG(&msg->x_msg_header, MSG_SW_RELOAD_EXEC_REQ,
|
|
diff --git a/drivers/media/common/siano/smscoreapi.h b/drivers/media/common/siano/smscoreapi.h
|
|
index 4cc39e4a83182..55d02c27f1244 100644
|
|
--- a/drivers/media/common/siano/smscoreapi.h
|
|
+++ b/drivers/media/common/siano/smscoreapi.h
|
|
@@ -636,9 +636,9 @@ struct sms_msg_data2 {
|
|
u32 msg_data[2];
|
|
};
|
|
|
|
-struct sms_msg_data4 {
|
|
+struct sms_msg_data5 {
|
|
struct sms_msg_hdr x_msg_header;
|
|
- u32 msg_data[4];
|
|
+ u32 msg_data[5];
|
|
};
|
|
|
|
struct sms_data_download {
|
|
diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c
|
|
index 9d5eb8b6aede9..3a5b5f94398a1 100644
|
|
--- a/drivers/media/common/siano/smsdvb-main.c
|
|
+++ b/drivers/media/common/siano/smsdvb-main.c
|
|
@@ -1187,6 +1187,10 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
|
|
return 0;
|
|
|
|
media_graph_error:
|
|
+ mutex_lock(&g_smsdvb_clientslock);
|
|
+ list_del(&client->entry);
|
|
+ mutex_unlock(&g_smsdvb_clientslock);
|
|
+
|
|
smsdvb_debugfs_release(client);
|
|
|
|
client_error:
|
|
diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c
|
|
index 9914f69a4a02b..f133489af9b9f 100644
|
|
--- a/drivers/media/dvb-core/dvb_net.c
|
|
+++ b/drivers/media/dvb-core/dvb_net.c
|
|
@@ -57,6 +57,7 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/netdevice.h>
|
|
+#include <linux/nospec.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/dvb/net.h>
|
|
#include <linux/uio.h>
|
|
@@ -1350,14 +1351,20 @@ static int dvb_net_do_ioctl(struct file *file,
|
|
struct net_device *netdev;
|
|
struct dvb_net_priv *priv_data;
|
|
struct dvb_net_if *dvbnetif = parg;
|
|
+ int if_num = dvbnetif->if_num;
|
|
|
|
- if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
|
- !dvbnet->state[dvbnetif->if_num]) {
|
|
+ if (if_num >= DVB_NET_DEVICES_MAX) {
|
|
ret = -EINVAL;
|
|
goto ioctl_error;
|
|
}
|
|
+ if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
|
|
|
|
- netdev = dvbnet->device[dvbnetif->if_num];
|
|
+ if (!dvbnet->state[if_num]) {
|
|
+ ret = -EINVAL;
|
|
+ goto ioctl_error;
|
|
+ }
|
|
+
|
|
+ netdev = dvbnet->device[if_num];
|
|
|
|
priv_data = netdev_priv(netdev);
|
|
dvbnetif->pid=priv_data->pid;
|
|
@@ -1410,14 +1417,20 @@ static int dvb_net_do_ioctl(struct file *file,
|
|
struct net_device *netdev;
|
|
struct dvb_net_priv *priv_data;
|
|
struct __dvb_net_if_old *dvbnetif = parg;
|
|
+ int if_num = dvbnetif->if_num;
|
|
+
|
|
+ if (if_num >= DVB_NET_DEVICES_MAX) {
|
|
+ ret = -EINVAL;
|
|
+ goto ioctl_error;
|
|
+ }
|
|
+ if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
|
|
|
|
- if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
|
- !dvbnet->state[dvbnetif->if_num]) {
|
|
+ if (!dvbnet->state[if_num]) {
|
|
ret = -EINVAL;
|
|
goto ioctl_error;
|
|
}
|
|
|
|
- netdev = dvbnet->device[dvbnetif->if_num];
|
|
+ netdev = dvbnet->device[if_num];
|
|
|
|
priv_data = netdev_priv(netdev);
|
|
dvbnetif->pid=priv_data->pid;
|
|
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
index 3844853ab0a04..9d55abfe070f0 100644
|
|
--- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
+++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
@@ -1393,7 +1393,7 @@ static int __s5c73m3_power_on(struct s5c73m3 *state)
|
|
s5c73m3_gpio_deassert(state, STBY);
|
|
usleep_range(100, 200);
|
|
|
|
- s5c73m3_gpio_deassert(state, RST);
|
|
+ s5c73m3_gpio_deassert(state, RSET);
|
|
usleep_range(50, 100);
|
|
|
|
return 0;
|
|
@@ -1408,7 +1408,7 @@ static int __s5c73m3_power_off(struct s5c73m3 *state)
|
|
{
|
|
int i, ret;
|
|
|
|
- if (s5c73m3_gpio_assert(state, RST))
|
|
+ if (s5c73m3_gpio_assert(state, RSET))
|
|
usleep_range(10, 50);
|
|
|
|
if (s5c73m3_gpio_assert(state, STBY))
|
|
@@ -1613,7 +1613,7 @@ static int s5c73m3_get_platform_data(struct s5c73m3 *state)
|
|
|
|
state->mclk_frequency = pdata->mclk_frequency;
|
|
state->gpio[STBY] = pdata->gpio_stby;
|
|
- state->gpio[RST] = pdata->gpio_reset;
|
|
+ state->gpio[RSET] = pdata->gpio_reset;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3.h b/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
index 653f68e7ea07b..e267b2522149a 100644
|
|
--- a/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
+++ b/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
@@ -361,7 +361,7 @@ struct s5c73m3_ctrls {
|
|
|
|
enum s5c73m3_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
diff --git a/drivers/media/i2c/s5k4ecgx.c b/drivers/media/i2c/s5k4ecgx.c
|
|
index 6ebcf254989a5..75fb13a33eab3 100644
|
|
--- a/drivers/media/i2c/s5k4ecgx.c
|
|
+++ b/drivers/media/i2c/s5k4ecgx.c
|
|
@@ -177,7 +177,7 @@ static const char * const s5k4ecgx_supply_names[] = {
|
|
|
|
enum s5k4ecgx_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
@@ -482,7 +482,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
|
|
if (s5k4ecgx_gpio_set_value(priv, STBY, priv->gpio[STBY].level))
|
|
usleep_range(30, 50);
|
|
|
|
- if (s5k4ecgx_gpio_set_value(priv, RST, priv->gpio[RST].level))
|
|
+ if (s5k4ecgx_gpio_set_value(priv, RSET, priv->gpio[RSET].level))
|
|
usleep_range(30, 50);
|
|
|
|
return 0;
|
|
@@ -490,7 +490,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
|
|
|
|
static int __s5k4ecgx_power_off(struct s5k4ecgx *priv)
|
|
{
|
|
- if (s5k4ecgx_gpio_set_value(priv, RST, !priv->gpio[RST].level))
|
|
+ if (s5k4ecgx_gpio_set_value(priv, RSET, !priv->gpio[RSET].level))
|
|
usleep_range(30, 50);
|
|
|
|
if (s5k4ecgx_gpio_set_value(priv, STBY, !priv->gpio[STBY].level))
|
|
@@ -878,7 +878,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
|
|
int ret;
|
|
|
|
priv->gpio[STBY].gpio = -EINVAL;
|
|
- priv->gpio[RST].gpio = -EINVAL;
|
|
+ priv->gpio[RSET].gpio = -EINVAL;
|
|
|
|
ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_STBY");
|
|
|
|
@@ -897,7 +897,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
|
|
s5k4ecgx_free_gpios(priv);
|
|
return ret;
|
|
}
|
|
- priv->gpio[RST] = *gpio;
|
|
+ priv->gpio[RSET] = *gpio;
|
|
if (gpio_is_valid(gpio->gpio))
|
|
gpio_set_value(gpio->gpio, 0);
|
|
|
|
diff --git a/drivers/media/i2c/s5k5baf.c b/drivers/media/i2c/s5k5baf.c
|
|
index db82ed05792ef..e8c820cb418b7 100644
|
|
--- a/drivers/media/i2c/s5k5baf.c
|
|
+++ b/drivers/media/i2c/s5k5baf.c
|
|
@@ -238,7 +238,7 @@ struct s5k5baf_gpio {
|
|
|
|
enum s5k5baf_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
NUM_GPIOS,
|
|
};
|
|
|
|
@@ -973,7 +973,7 @@ static int s5k5baf_power_on(struct s5k5baf *state)
|
|
|
|
s5k5baf_gpio_deassert(state, STBY);
|
|
usleep_range(50, 100);
|
|
- s5k5baf_gpio_deassert(state, RST);
|
|
+ s5k5baf_gpio_deassert(state, RSET);
|
|
return 0;
|
|
|
|
err_reg_dis:
|
|
@@ -991,7 +991,7 @@ static int s5k5baf_power_off(struct s5k5baf *state)
|
|
state->apply_cfg = 0;
|
|
state->apply_crop = 0;
|
|
|
|
- s5k5baf_gpio_assert(state, RST);
|
|
+ s5k5baf_gpio_assert(state, RSET);
|
|
s5k5baf_gpio_assert(state, STBY);
|
|
|
|
if (!IS_ERR(state->clock))
|
|
diff --git a/drivers/media/i2c/s5k6aa.c b/drivers/media/i2c/s5k6aa.c
|
|
index 4b615b4b0463d..4d92aac279dc3 100644
|
|
--- a/drivers/media/i2c/s5k6aa.c
|
|
+++ b/drivers/media/i2c/s5k6aa.c
|
|
@@ -181,7 +181,7 @@ static const char * const s5k6aa_supply_names[] = {
|
|
|
|
enum s5k6aa_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
@@ -845,7 +845,7 @@ static int __s5k6aa_power_on(struct s5k6aa *s5k6aa)
|
|
ret = s5k6aa->s_power(1);
|
|
usleep_range(4000, 4000);
|
|
|
|
- if (s5k6aa_gpio_deassert(s5k6aa, RST))
|
|
+ if (s5k6aa_gpio_deassert(s5k6aa, RSET))
|
|
msleep(20);
|
|
|
|
return ret;
|
|
@@ -855,7 +855,7 @@ static int __s5k6aa_power_off(struct s5k6aa *s5k6aa)
|
|
{
|
|
int ret;
|
|
|
|
- if (s5k6aa_gpio_assert(s5k6aa, RST))
|
|
+ if (s5k6aa_gpio_assert(s5k6aa, RSET))
|
|
usleep_range(100, 150);
|
|
|
|
if (s5k6aa->s_power) {
|
|
@@ -1514,7 +1514,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
|
|
int ret;
|
|
|
|
s5k6aa->gpio[STBY].gpio = -EINVAL;
|
|
- s5k6aa->gpio[RST].gpio = -EINVAL;
|
|
+ s5k6aa->gpio[RSET].gpio = -EINVAL;
|
|
|
|
gpio = &pdata->gpio_stby;
|
|
if (gpio_is_valid(gpio->gpio)) {
|
|
@@ -1537,7 +1537,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- s5k6aa->gpio[RST] = *gpio;
|
|
+ s5k6aa->gpio[RSET] = *gpio;
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
|
|
index 3e47b432d0f4e..c799071be66fc 100644
|
|
--- a/drivers/media/i2c/tc358743.c
|
|
+++ b/drivers/media/i2c/tc358743.c
|
|
@@ -1763,6 +1763,7 @@ static int tc358743_probe_of(struct tc358743_state *state)
|
|
bps_pr_lane = 2 * endpoint->link_frequencies[0];
|
|
if (bps_pr_lane < 62500000U || bps_pr_lane > 1000000000U) {
|
|
dev_err(dev, "unsupported bps per lane: %u bps\n", bps_pr_lane);
|
|
+ ret = -EINVAL;
|
|
goto disable_clk;
|
|
}
|
|
|
|
diff --git a/drivers/media/pci/bt8xx/bt878.c b/drivers/media/pci/bt8xx/bt878.c
|
|
index 90fcccc05b562..c678d7120727e 100644
|
|
--- a/drivers/media/pci/bt8xx/bt878.c
|
|
+++ b/drivers/media/pci/bt8xx/bt878.c
|
|
@@ -494,6 +494,9 @@ static int bt878_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
|
|
btwrite(0, BT878_AINT_MASK);
|
|
bt878_num++;
|
|
|
|
+ if (!bt->tasklet.func)
|
|
+ tasklet_disable(&bt->tasklet);
|
|
+
|
|
return 0;
|
|
|
|
fail2:
|
|
diff --git a/drivers/media/pci/cobalt/cobalt-driver.c b/drivers/media/pci/cobalt/cobalt-driver.c
|
|
index 979634000597f..17b717a1c7fa3 100644
|
|
--- a/drivers/media/pci/cobalt/cobalt-driver.c
|
|
+++ b/drivers/media/pci/cobalt/cobalt-driver.c
|
|
@@ -689,6 +689,7 @@ static int cobalt_probe(struct pci_dev *pci_dev,
|
|
return -ENOMEM;
|
|
cobalt->pci_dev = pci_dev;
|
|
cobalt->instance = i;
|
|
+ mutex_init(&cobalt->pci_lock);
|
|
|
|
retval = v4l2_device_register(&pci_dev->dev, &cobalt->v4l2_dev);
|
|
if (retval) {
|
|
diff --git a/drivers/media/pci/cobalt/cobalt-driver.h b/drivers/media/pci/cobalt/cobalt-driver.h
|
|
index ed00dc9d93995..8f9454d30b95e 100644
|
|
--- a/drivers/media/pci/cobalt/cobalt-driver.h
|
|
+++ b/drivers/media/pci/cobalt/cobalt-driver.h
|
|
@@ -262,6 +262,8 @@ struct cobalt {
|
|
int instance;
|
|
struct pci_dev *pci_dev;
|
|
struct v4l2_device v4l2_dev;
|
|
+ /* serialize PCI access in cobalt_s_bit_sysctrl() */
|
|
+ struct mutex pci_lock;
|
|
|
|
void __iomem *bar0, *bar1;
|
|
|
|
@@ -333,10 +335,13 @@ static inline u32 cobalt_g_sysctrl(struct cobalt *cobalt)
|
|
static inline void cobalt_s_bit_sysctrl(struct cobalt *cobalt,
|
|
int bit, int val)
|
|
{
|
|
- u32 ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
|
|
+ u32 ctrl;
|
|
|
|
+ mutex_lock(&cobalt->pci_lock);
|
|
+ ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
|
|
cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE,
|
|
(ctrl & ~(1UL << bit)) | (val << bit));
|
|
+ mutex_unlock(&cobalt->pci_lock);
|
|
}
|
|
|
|
static inline u32 cobalt_g_sysstat(struct cobalt *cobalt)
|
|
diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
|
|
index 5f6ccf4921110..8f083f28dcf38 100644
|
|
--- a/drivers/media/platform/s5p-g2d/g2d.c
|
|
+++ b/drivers/media/platform/s5p-g2d/g2d.c
|
|
@@ -283,6 +283,9 @@ static int g2d_release(struct file *file)
|
|
struct g2d_dev *dev = video_drvdata(file);
|
|
struct g2d_ctx *ctx = fh2ctx(file->private_data);
|
|
|
|
+ mutex_lock(&dev->mutex);
|
|
+ v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
|
|
+ mutex_unlock(&dev->mutex);
|
|
v4l2_ctrl_handler_free(&ctx->ctrl_handler);
|
|
v4l2_fh_del(&ctx->fh);
|
|
v4l2_fh_exit(&ctx->fh);
|
|
diff --git a/drivers/media/platform/sti/hva/hva-hw.c b/drivers/media/platform/sti/hva/hva-hw.c
|
|
index c4d97fb80aaec..1653892da9a5c 100644
|
|
--- a/drivers/media/platform/sti/hva/hva-hw.c
|
|
+++ b/drivers/media/platform/sti/hva/hva-hw.c
|
|
@@ -127,8 +127,7 @@ static irqreturn_t hva_hw_its_irq_thread(int irq, void *arg)
|
|
ctx_id = (hva->sts_reg & 0xFF00) >> 8;
|
|
if (ctx_id >= HVA_MAX_INSTANCES) {
|
|
dev_err(dev, "%s %s: bad context identifier: %d\n",
|
|
- ctx->name, __func__, ctx_id);
|
|
- ctx->hw_err = true;
|
|
+ HVA_PREFIX, __func__, ctx_id);
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/cpia2/cpia2.h b/drivers/media/usb/cpia2/cpia2.h
|
|
index cdef677d57ecf..80a7af6482ae7 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2.h
|
|
+++ b/drivers/media/usb/cpia2/cpia2.h
|
|
@@ -442,6 +442,7 @@ int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd);
|
|
int cpia2_do_command(struct camera_data *cam,
|
|
unsigned int command,
|
|
unsigned char direction, unsigned char param);
|
|
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf);
|
|
struct camera_data *cpia2_init_camera_struct(struct usb_interface *intf);
|
|
int cpia2_init_camera(struct camera_data *cam);
|
|
int cpia2_allocate_buffers(struct camera_data *cam);
|
|
diff --git a/drivers/media/usb/cpia2/cpia2_core.c b/drivers/media/usb/cpia2/cpia2_core.c
|
|
index 0310fd6ed1033..828f9689f4a11 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2_core.c
|
|
+++ b/drivers/media/usb/cpia2/cpia2_core.c
|
|
@@ -2158,6 +2158,18 @@ static void reset_camera_struct(struct camera_data *cam)
|
|
cam->height = cam->params.roi.height;
|
|
}
|
|
|
|
+/******************************************************************************
|
|
+ *
|
|
+ * cpia2_init_camera_struct
|
|
+ *
|
|
+ * Deinitialize camera struct
|
|
+ *****************************************************************************/
|
|
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf)
|
|
+{
|
|
+ v4l2_device_unregister(&cam->v4l2_dev);
|
|
+ kfree(cam);
|
|
+}
|
|
+
|
|
/******************************************************************************
|
|
*
|
|
* cpia2_init_camera_struct
|
|
diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c
|
|
index 30e27844e0e99..4f4a130f17af3 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2_usb.c
|
|
+++ b/drivers/media/usb/cpia2/cpia2_usb.c
|
|
@@ -860,15 +860,13 @@ static int cpia2_usb_probe(struct usb_interface *intf,
|
|
ret = set_alternate(cam, USBIF_CMDONLY);
|
|
if (ret < 0) {
|
|
ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
|
|
|
|
if((ret = cpia2_init_camera(cam)) < 0) {
|
|
ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
LOG(" CPiA Version: %d.%02d (%d.%d)\n",
|
|
cam->params.version.firmware_revision_hi,
|
|
@@ -888,11 +886,14 @@ static int cpia2_usb_probe(struct usb_interface *intf,
|
|
ret = cpia2_register_camera(cam);
|
|
if (ret < 0) {
|
|
ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+alt_err:
|
|
+ cpia2_deinit_camera_struct(cam, intf);
|
|
+ return ret;
|
|
}
|
|
|
|
/******************************************************************************
|
|
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c
|
|
index 2b7a1b569db0b..184a9b827d565 100644
|
|
--- a/drivers/media/usb/dvb-usb/cxusb.c
|
|
+++ b/drivers/media/usb/dvb-usb/cxusb.c
|
|
@@ -1791,7 +1791,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
|
|
|
|
.size_of_priv = sizeof(struct cxusb_state),
|
|
|
|
- .num_adapters = 2,
|
|
+ .num_adapters = 1,
|
|
.adapter = {
|
|
{
|
|
.num_frontends = 1,
|
|
diff --git a/drivers/media/usb/dvb-usb/dtv5100.c b/drivers/media/usb/dvb-usb/dtv5100.c
|
|
index c60fb54f445f5..66f34988fdf04 100644
|
|
--- a/drivers/media/usb/dvb-usb/dtv5100.c
|
|
+++ b/drivers/media/usb/dvb-usb/dtv5100.c
|
|
@@ -39,6 +39,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
|
u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
|
|
{
|
|
struct dtv5100_state *st = d->priv;
|
|
+ unsigned int pipe;
|
|
u8 request;
|
|
u8 type;
|
|
u16 value;
|
|
@@ -47,6 +48,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
|
switch (wlen) {
|
|
case 1:
|
|
/* write { reg }, read { value } */
|
|
+ pipe = usb_rcvctrlpipe(d->udev, 0);
|
|
request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_READ :
|
|
DTV5100_TUNER_READ);
|
|
type = USB_TYPE_VENDOR | USB_DIR_IN;
|
|
@@ -54,6 +56,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
|
break;
|
|
case 2:
|
|
/* write { reg, value } */
|
|
+ pipe = usb_sndctrlpipe(d->udev, 0);
|
|
request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_WRITE :
|
|
DTV5100_TUNER_WRITE);
|
|
type = USB_TYPE_VENDOR | USB_DIR_OUT;
|
|
@@ -67,7 +70,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
|
|
|
memcpy(st->data, rbuf, rlen);
|
|
msleep(1); /* avoid I2C errors */
|
|
- return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), request,
|
|
+ return usb_control_msg(d->udev, pipe, request,
|
|
type, value, index, st->data, rlen,
|
|
DTV5100_USB_TIMEOUT);
|
|
}
|
|
@@ -154,7 +157,7 @@ static int dtv5100_probe(struct usb_interface *intf,
|
|
|
|
/* initialize non qt1010/zl10353 part? */
|
|
for (i = 0; dtv5100_init[i].request; i++) {
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
dtv5100_init[i].request,
|
|
USB_TYPE_VENDOR | USB_DIR_OUT,
|
|
dtv5100_init[i].value,
|
|
diff --git a/drivers/media/usb/gspca/sq905.c b/drivers/media/usb/gspca/sq905.c
|
|
index 03322d2b2e829..efb5e553b7725 100644
|
|
--- a/drivers/media/usb/gspca/sq905.c
|
|
+++ b/drivers/media/usb/gspca/sq905.c
|
|
@@ -130,7 +130,7 @@ static int sq905_command(struct gspca_dev *gspca_dev, u16 index)
|
|
}
|
|
|
|
ret = usb_control_msg(gspca_dev->dev,
|
|
- usb_sndctrlpipe(gspca_dev->dev, 0),
|
|
+ usb_rcvctrlpipe(gspca_dev->dev, 0),
|
|
USB_REQ_SYNCH_FRAME, /* request */
|
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
SQ905_PING, 0, gspca_dev->usb_buf, 1,
|
|
diff --git a/drivers/media/usb/gspca/sunplus.c b/drivers/media/usb/gspca/sunplus.c
|
|
index cc3e1478c5a09..949915734d572 100644
|
|
--- a/drivers/media/usb/gspca/sunplus.c
|
|
+++ b/drivers/media/usb/gspca/sunplus.c
|
|
@@ -255,6 +255,10 @@ static void reg_r(struct gspca_dev *gspca_dev,
|
|
PERR("reg_r: buffer overflow\n");
|
|
return;
|
|
}
|
|
+ if (len == 0) {
|
|
+ PERR("reg_r: zero-length read\n");
|
|
+ return;
|
|
+ }
|
|
if (gspca_dev->usb_err < 0)
|
|
return;
|
|
ret = usb_control_msg(gspca_dev->dev,
|
|
@@ -263,7 +267,7 @@ static void reg_r(struct gspca_dev *gspca_dev,
|
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
0, /* value */
|
|
index,
|
|
- len ? gspca_dev->usb_buf : NULL, len,
|
|
+ gspca_dev->usb_buf, len,
|
|
500);
|
|
if (ret < 0) {
|
|
pr_err("reg_r err %d\n", ret);
|
|
@@ -739,7 +743,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
|
case MegaImageVI:
|
|
reg_w_riv(gspca_dev, 0xf0, 0, 0);
|
|
spca504B_WaitCmdStatus(gspca_dev);
|
|
- reg_r(gspca_dev, 0xf0, 4, 0);
|
|
+ reg_w_riv(gspca_dev, 0xf0, 4, 0);
|
|
spca504B_WaitCmdStatus(gspca_dev);
|
|
break;
|
|
default:
|
|
diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
index ff489645e0701..0cb8dd5852357 100644
|
|
--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
+++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
@@ -2722,9 +2722,8 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
|
|
pvr2_stream_destroy(hdw->vid_stream);
|
|
hdw->vid_stream = NULL;
|
|
}
|
|
- pvr2_i2c_core_done(hdw);
|
|
v4l2_device_unregister(&hdw->v4l2_dev);
|
|
- pvr2_hdw_remove_usb_stuff(hdw);
|
|
+ pvr2_hdw_disconnect(hdw);
|
|
mutex_lock(&pvr2_unit_mtx);
|
|
do {
|
|
if ((hdw->unit_number >= 0) &&
|
|
@@ -2751,6 +2750,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
|
|
{
|
|
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
|
|
LOCK_TAKE(hdw->big_lock);
|
|
+ pvr2_i2c_core_done(hdw);
|
|
LOCK_TAKE(hdw->ctl_lock);
|
|
pvr2_hdw_remove_usb_stuff(hdw);
|
|
LOCK_GIVE(hdw->ctl_lock);
|
|
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
|
|
index dcca723f71554..1d724e86f3780 100644
|
|
--- a/drivers/media/usb/uvc/uvc_video.c
|
|
+++ b/drivers/media/usb/uvc/uvc_video.c
|
|
@@ -89,10 +89,37 @@ int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
|
|
static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
|
|
struct uvc_streaming_control *ctrl)
|
|
{
|
|
+ static const struct usb_device_id elgato_cam_link_4k = {
|
|
+ USB_DEVICE(0x0fd9, 0x0066)
|
|
+ };
|
|
struct uvc_format *format = NULL;
|
|
struct uvc_frame *frame = NULL;
|
|
unsigned int i;
|
|
|
|
+ /*
|
|
+ * The response of the Elgato Cam Link 4K is incorrect: The second byte
|
|
+ * contains bFormatIndex (instead of being the second byte of bmHint).
|
|
+ * The first byte is always zero. The third byte is always 1.
|
|
+ *
|
|
+ * The UVC 1.5 class specification defines the first five bits in the
|
|
+ * bmHint bitfield. The remaining bits are reserved and should be zero.
|
|
+ * Therefore a valid bmHint will be less than 32.
|
|
+ *
|
|
+ * Latest Elgato Cam Link 4K firmware as of 2021-03-23 needs this fix.
|
|
+ * MCU: 20.02.19, FPGA: 67
|
|
+ */
|
|
+ if (usb_match_one_id(stream->dev->intf, &elgato_cam_link_4k) &&
|
|
+ ctrl->bmHint > 255) {
|
|
+ u8 corrected_format_index = ctrl->bmHint >> 8;
|
|
+
|
|
+ /* uvc_dbg(stream->dev, VIDEO,
|
|
+ "Correct USB video probe response from {bmHint: 0x%04x, bFormatIndex: %u} to {bmHint: 0x%04x, bFormatIndex: %u}\n",
|
|
+ ctrl->bmHint, ctrl->bFormatIndex,
|
|
+ 1, corrected_format_index); */
|
|
+ ctrl->bmHint = 1;
|
|
+ ctrl->bFormatIndex = corrected_format_index;
|
|
+ }
|
|
+
|
|
for (i = 0; i < stream->nformats; ++i) {
|
|
if (stream->format[i].index == ctrl->bFormatIndex) {
|
|
format = &stream->format[i];
|
|
diff --git a/drivers/media/usb/zr364xx/zr364xx.c b/drivers/media/usb/zr364xx/zr364xx.c
|
|
index c5513f55e64e0..05b9012f9902d 100644
|
|
--- a/drivers/media/usb/zr364xx/zr364xx.c
|
|
+++ b/drivers/media/usb/zr364xx/zr364xx.c
|
|
@@ -1066,6 +1066,7 @@ static int zr364xx_start_readpipe(struct zr364xx_camera *cam)
|
|
DBG("submitting URB %p\n", pipe_info->stream_urb);
|
|
retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
|
|
if (retval) {
|
|
+ usb_free_urb(pipe_info->stream_urb);
|
|
printk(KERN_ERR KBUILD_MODNAME ": start read pipe failed\n");
|
|
return retval;
|
|
}
|
|
diff --git a/drivers/media/v4l2-core/v4l2-fh.c b/drivers/media/v4l2-core/v4l2-fh.c
|
|
index 0c5e690705861..d44b289205b4f 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-fh.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-fh.c
|
|
@@ -109,6 +109,7 @@ int v4l2_fh_release(struct file *filp)
|
|
v4l2_fh_del(fh);
|
|
v4l2_fh_exit(fh);
|
|
kfree(fh);
|
|
+ filp->private_data = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
|
|
index 1b182b117f9cf..38b945eb410f3 100644
|
|
--- a/drivers/memory/fsl_ifc.c
|
|
+++ b/drivers/memory/fsl_ifc.c
|
|
@@ -109,7 +109,6 @@ static int fsl_ifc_ctrl_remove(struct platform_device *dev)
|
|
iounmap(ctrl->gregs);
|
|
|
|
dev_set_drvdata(&dev->dev, NULL);
|
|
- kfree(ctrl);
|
|
|
|
return 0;
|
|
}
|
|
@@ -221,7 +220,8 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
|
|
|
|
dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
|
|
|
|
- fsl_ifc_ctrl_dev = kzalloc(sizeof(*fsl_ifc_ctrl_dev), GFP_KERNEL);
|
|
+ fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
|
|
+ GFP_KERNEL);
|
|
if (!fsl_ifc_ctrl_dev)
|
|
return -ENOMEM;
|
|
|
|
@@ -231,8 +231,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
|
|
fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0);
|
|
if (!fsl_ifc_ctrl_dev->gregs) {
|
|
dev_err(&dev->dev, "failed to get memory region\n");
|
|
- ret = -ENODEV;
|
|
- goto err;
|
|
+ return -ENODEV;
|
|
}
|
|
|
|
if (of_property_read_bool(dev->dev.of_node, "little-endian")) {
|
|
@@ -308,6 +307,7 @@ err_irq:
|
|
free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
|
|
irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
|
|
err:
|
|
+ iounmap(fsl_ifc_ctrl_dev->gregs);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/mfd/da9052-i2c.c b/drivers/mfd/da9052-i2c.c
|
|
index 578e881067a58..4094f97ec7dc7 100644
|
|
--- a/drivers/mfd/da9052-i2c.c
|
|
+++ b/drivers/mfd/da9052-i2c.c
|
|
@@ -118,6 +118,7 @@ static const struct i2c_device_id da9052_i2c_id[] = {
|
|
{"da9053-bc", DA9053_BC},
|
|
{}
|
|
};
|
|
+MODULE_DEVICE_TABLE(i2c, da9052_i2c_id);
|
|
|
|
#ifdef CONFIG_OF
|
|
static const struct of_device_id dialog_dt_ids[] = {
|
|
diff --git a/drivers/mfd/stmpe-i2c.c b/drivers/mfd/stmpe-i2c.c
|
|
index 863c39a3353c9..d284df25c76ba 100644
|
|
--- a/drivers/mfd/stmpe-i2c.c
|
|
+++ b/drivers/mfd/stmpe-i2c.c
|
|
@@ -109,7 +109,7 @@ static const struct i2c_device_id stmpe_i2c_id[] = {
|
|
{ "stmpe2403", STMPE2403 },
|
|
{ }
|
|
};
|
|
-MODULE_DEVICE_TABLE(i2c, stmpe_id);
|
|
+MODULE_DEVICE_TABLE(i2c, stmpe_i2c_id);
|
|
|
|
static struct i2c_driver stmpe_i2c_driver = {
|
|
.driver = {
|
|
diff --git a/drivers/misc/ibmasm/module.c b/drivers/misc/ibmasm/module.c
|
|
index 6b3bf9ab051db..706decef68a08 100644
|
|
--- a/drivers/misc/ibmasm/module.c
|
|
+++ b/drivers/misc/ibmasm/module.c
|
|
@@ -123,7 +123,7 @@ static int ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
result = ibmasm_init_remote_input_dev(sp);
|
|
if (result) {
|
|
dev_err(sp->dev, "Failed to initialize remote queue\n");
|
|
- goto error_send_message;
|
|
+ goto error_init_remote;
|
|
}
|
|
|
|
result = ibmasm_send_driver_vpd(sp);
|
|
@@ -143,8 +143,9 @@ static int ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return 0;
|
|
|
|
error_send_message:
|
|
- disable_sp_interrupts(sp->base_address);
|
|
ibmasm_free_remote_input_dev(sp);
|
|
+error_init_remote:
|
|
+ disable_sp_interrupts(sp->base_address);
|
|
free_irq(sp->irq, (void *)sp);
|
|
error_request_irq:
|
|
iounmap(sp->base_address);
|
|
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
|
|
index b2c977d617c58..f0fa6a799f7ce 100644
|
|
--- a/drivers/mmc/core/core.c
|
|
+++ b/drivers/mmc/core/core.c
|
|
@@ -1171,11 +1171,14 @@ int mmc_execute_tuning(struct mmc_card *card)
|
|
|
|
err = host->ops->execute_tuning(host, opcode);
|
|
|
|
- if (err)
|
|
+ if (err) {
|
|
pr_err("%s: tuning execution failed: %d\n",
|
|
mmc_hostname(host), err);
|
|
- else
|
|
+ } else {
|
|
+ host->retune_now = 0;
|
|
+ host->need_retune = 0;
|
|
mmc_retune_enable(host);
|
|
+ }
|
|
|
|
return err;
|
|
}
|
|
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
|
|
index 68b736547d817..0325083b10493 100644
|
|
--- a/drivers/mmc/host/sdhci.c
|
|
+++ b/drivers/mmc/host/sdhci.c
|
|
@@ -1219,6 +1219,10 @@ static u16 sdhci_get_preset_value(struct sdhci_host *host)
|
|
u16 preset = 0;
|
|
|
|
switch (host->timing) {
|
|
+ case MMC_TIMING_MMC_HS:
|
|
+ case MMC_TIMING_SD_HS:
|
|
+ preset = sdhci_readw(host, SDHCI_PRESET_FOR_HIGH_SPEED);
|
|
+ break;
|
|
case MMC_TIMING_UHS_SDR12:
|
|
preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12);
|
|
break;
|
|
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
|
|
index 2570455b219a4..062db5f6ccac3 100644
|
|
--- a/drivers/mmc/host/sdhci.h
|
|
+++ b/drivers/mmc/host/sdhci.h
|
|
@@ -237,6 +237,7 @@
|
|
|
|
/* 60-FB reserved */
|
|
|
|
+#define SDHCI_PRESET_FOR_HIGH_SPEED 0x64
|
|
#define SDHCI_PRESET_FOR_SDR12 0x66
|
|
#define SDHCI_PRESET_FOR_SDR25 0x68
|
|
#define SDHCI_PRESET_FOR_SDR50 0x6A
|
|
diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
|
|
index 003aecc441223..ad0a467bb464a 100644
|
|
--- a/drivers/mmc/host/usdhi6rol0.c
|
|
+++ b/drivers/mmc/host/usdhi6rol0.c
|
|
@@ -1809,6 +1809,7 @@ static int usdhi6_probe(struct platform_device *pdev)
|
|
|
|
version = usdhi6_read(host, USDHI6_VERSION);
|
|
if ((version & 0xfff) != 0xa0d) {
|
|
+ ret = -EPERM;
|
|
dev_err(dev, "Version not recognized %x\n", version);
|
|
goto e_clk_off;
|
|
}
|
|
diff --git a/drivers/mmc/host/via-sdmmc.c b/drivers/mmc/host/via-sdmmc.c
|
|
index b455e9cf95afc..a3472127bea31 100644
|
|
--- a/drivers/mmc/host/via-sdmmc.c
|
|
+++ b/drivers/mmc/host/via-sdmmc.c
|
|
@@ -859,6 +859,9 @@ static void via_sdc_data_isr(struct via_crdr_mmc_host *host, u16 intmask)
|
|
{
|
|
BUG_ON(intmask == 0);
|
|
|
|
+ if (!host->data)
|
|
+ return;
|
|
+
|
|
if (intmask & VIA_CRDR_SDSTS_DT)
|
|
host->data->error = -ETIMEDOUT;
|
|
else if (intmask & (VIA_CRDR_SDSTS_RC | VIA_CRDR_SDSTS_WC))
|
|
diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c
|
|
index bb3e0d1dd3550..a3e4288e5391b 100644
|
|
--- a/drivers/mmc/host/vub300.c
|
|
+++ b/drivers/mmc/host/vub300.c
|
|
@@ -2292,7 +2292,7 @@ static int vub300_probe(struct usb_interface *interface,
|
|
if (retval < 0)
|
|
goto error5;
|
|
retval =
|
|
- usb_control_msg(vub300->udev, usb_rcvctrlpipe(vub300->udev, 0),
|
|
+ usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
|
SET_ROM_WAIT_STATES,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
firmware_rom_wait_states, 0x0000, NULL, 0, HZ);
|
|
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c
|
|
index d0846ae9e0e40..022a9b3c7d4e8 100644
|
|
--- a/drivers/net/can/usb/ems_usb.c
|
|
+++ b/drivers/net/can/usb/ems_usb.c
|
|
@@ -1064,7 +1064,6 @@ static void ems_usb_disconnect(struct usb_interface *intf)
|
|
|
|
if (dev) {
|
|
unregister_netdev(dev->netdev);
|
|
- free_candev(dev->netdev);
|
|
|
|
unlink_all_urbs(dev);
|
|
|
|
@@ -1072,6 +1071,8 @@ static void ems_usb_disconnect(struct usb_interface *intf)
|
|
|
|
kfree(dev->intr_in_buffer);
|
|
kfree(dev->tx_msg_buffer);
|
|
+
|
|
+ free_candev(dev->netdev);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/aeroflex/greth.c b/drivers/net/ethernet/aeroflex/greth.c
|
|
index f8df8248035ec..31e02ca56572a 100644
|
|
--- a/drivers/net/ethernet/aeroflex/greth.c
|
|
+++ b/drivers/net/ethernet/aeroflex/greth.c
|
|
@@ -1554,10 +1554,11 @@ static int greth_of_remove(struct platform_device *of_dev)
|
|
mdiobus_unregister(greth->mdio);
|
|
|
|
unregister_netdev(ndev);
|
|
- free_netdev(ndev);
|
|
|
|
of_iounmap(&of_dev->resource[0], greth->regs, resource_size(&of_dev->resource[0]));
|
|
|
|
+ free_netdev(ndev);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c
|
|
index 223f35cc034cf..6de29f2a0a090 100644
|
|
--- a/drivers/net/ethernet/ezchip/nps_enet.c
|
|
+++ b/drivers/net/ethernet/ezchip/nps_enet.c
|
|
@@ -624,7 +624,7 @@ static s32 nps_enet_probe(struct platform_device *pdev)
|
|
|
|
/* Get IRQ number */
|
|
priv->irq = platform_get_irq(pdev, 0);
|
|
- if (!priv->irq) {
|
|
+ if (priv->irq < 0) {
|
|
dev_err(dev, "failed to retrieve <irq Rx-Tx> value from device tree\n");
|
|
err = -ENODEV;
|
|
goto out_netdev;
|
|
@@ -659,8 +659,8 @@ static s32 nps_enet_remove(struct platform_device *pdev)
|
|
struct nps_enet_priv *priv = netdev_priv(ndev);
|
|
|
|
unregister_netdev(ndev);
|
|
- free_netdev(ndev);
|
|
netif_napi_del(&priv->napi);
|
|
+ free_netdev(ndev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
index 3692adb8902d1..6c70cba92df06 100644
|
|
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
@@ -2656,10 +2656,8 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
u16 dummy16 = 0;
|
|
|
|
cb0 = (void *)get_zeroed_page(GFP_KERNEL);
|
|
- if (!cb0) {
|
|
- ret = -ENOMEM;
|
|
- goto out;
|
|
- }
|
|
+ if (!cb0)
|
|
+ return -ENOMEM;
|
|
|
|
for (i = 0; i < (port->num_def_qps); i++) {
|
|
struct ehea_port_res *pr = &port->port_res[i];
|
|
@@ -2679,6 +2677,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
cb0);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "query_ehea_qp failed (1)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
@@ -2691,6 +2690,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
&dummy64, &dummy16, &dummy16);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "modify_ehea_qp failed (1)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
@@ -2699,6 +2699,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
cb0);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "query_ehea_qp failed (2)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
|
|
index 93c29094ceff9..9035cb5fc70d3 100644
|
|
--- a/drivers/net/ethernet/intel/e100.c
|
|
+++ b/drivers/net/ethernet/intel/e100.c
|
|
@@ -1423,7 +1423,7 @@ static int e100_phy_check_without_mii(struct nic *nic)
|
|
u8 phy_type;
|
|
int without_mii;
|
|
|
|
- phy_type = (nic->eeprom[eeprom_phy_iface] >> 8) & 0x0f;
|
|
+ phy_type = (le16_to_cpu(nic->eeprom[eeprom_phy_iface]) >> 8) & 0x0f;
|
|
|
|
switch (phy_type) {
|
|
case NoSuchPhy: /* Non-MII PHY; UNTESTED! */
|
|
@@ -1543,7 +1543,7 @@ static int e100_phy_init(struct nic *nic)
|
|
mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
|
|
} else if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
|
|
(mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
|
|
- (nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
|
|
+ (le16_to_cpu(nic->eeprom[eeprom_cnfg_mdix]) & eeprom_mdix_enabled))) {
|
|
/* enable/disable MDI/MDI-X auto-switching. */
|
|
mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
|
|
nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
|
|
@@ -2298,9 +2298,9 @@ static int e100_asf(struct nic *nic)
|
|
{
|
|
/* ASF can be enabled from eeprom */
|
|
return (nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
|
|
- (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
|
|
- !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
|
|
- ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE);
|
|
+ (le16_to_cpu(nic->eeprom[eeprom_config_asf]) & eeprom_asf) &&
|
|
+ !(le16_to_cpu(nic->eeprom[eeprom_config_asf]) & eeprom_gcl) &&
|
|
+ ((le16_to_cpu(nic->eeprom[eeprom_smbus_addr]) & 0xFF) != 0xFE);
|
|
}
|
|
|
|
static int e100_up(struct nic *nic)
|
|
@@ -2952,7 +2952,7 @@ static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
/* Wol magic packet can be enabled from eeprom */
|
|
if ((nic->mac >= mac_82558_D101_A4) &&
|
|
- (nic->eeprom[eeprom_id] & eeprom_id_wol)) {
|
|
+ (le16_to_cpu(nic->eeprom[eeprom_id]) & eeprom_id_wol)) {
|
|
nic->flags |= wol_magic;
|
|
device_set_wakeup_enable(&pdev->dev, true);
|
|
}
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
index 0b1ee353f4150..832fffed4a1fa 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
@@ -5478,6 +5478,8 @@ int i40e_vsi_open(struct i40e_vsi *vsi)
|
|
dev_driver_string(&pf->pdev->dev),
|
|
dev_name(&pf->pdev->dev));
|
|
err = i40e_vsi_request_irq(vsi, int_name);
|
|
+ if (err)
|
|
+ goto err_setup_rx;
|
|
|
|
} else {
|
|
err = -EINVAL;
|
|
diff --git a/drivers/net/ethernet/micrel/ks8842.c b/drivers/net/ethernet/micrel/ks8842.c
|
|
index cb0102dd7f70f..d691c33dffc6b 100644
|
|
--- a/drivers/net/ethernet/micrel/ks8842.c
|
|
+++ b/drivers/net/ethernet/micrel/ks8842.c
|
|
@@ -1150,6 +1150,10 @@ static int ks8842_probe(struct platform_device *pdev)
|
|
unsigned i;
|
|
|
|
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
+ if (!iomem) {
|
|
+ dev_err(&pdev->dev, "Invalid resource\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))
|
|
goto err_mem_region;
|
|
|
|
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
index 3cd87a41ac92c..cd59577a0c921 100644
|
|
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
@@ -124,7 +124,7 @@ static int pch_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, u16 seqid)
|
|
{
|
|
u8 *data = skb->data;
|
|
unsigned int offset;
|
|
- u16 *hi, *id;
|
|
+ u16 hi, id;
|
|
u32 lo;
|
|
|
|
if (ptp_classify_raw(skb) == PTP_CLASS_NONE)
|
|
@@ -135,14 +135,11 @@ static int pch_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, u16 seqid)
|
|
if (skb->len < offset + OFF_PTP_SEQUENCE_ID + sizeof(seqid))
|
|
return 0;
|
|
|
|
- hi = (u16 *)(data + offset + OFF_PTP_SOURCE_UUID);
|
|
- id = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
|
|
+ hi = get_unaligned_be16(data + offset + OFF_PTP_SOURCE_UUID + 0);
|
|
+ lo = get_unaligned_be32(data + offset + OFF_PTP_SOURCE_UUID + 2);
|
|
+ id = get_unaligned_be16(data + offset + OFF_PTP_SEQUENCE_ID);
|
|
|
|
- memcpy(&lo, &hi[1], sizeof(lo));
|
|
-
|
|
- return (uid_hi == *hi &&
|
|
- uid_lo == lo &&
|
|
- seqid == *id);
|
|
+ return (uid_hi == hi && uid_lo == lo && seqid == id);
|
|
}
|
|
|
|
static void
|
|
@@ -152,7 +149,6 @@ pch_rx_timestamp(struct pch_gbe_adapter *adapter, struct sk_buff *skb)
|
|
struct pci_dev *pdev;
|
|
u64 ns;
|
|
u32 hi, lo, val;
|
|
- u16 uid, seq;
|
|
|
|
if (!adapter->hwts_rx_en)
|
|
return;
|
|
@@ -168,10 +164,7 @@ pch_rx_timestamp(struct pch_gbe_adapter *adapter, struct sk_buff *skb)
|
|
lo = pch_src_uuid_lo_read(pdev);
|
|
hi = pch_src_uuid_hi_read(pdev);
|
|
|
|
- uid = hi & 0xffff;
|
|
- seq = (hi >> 16) & 0xffff;
|
|
-
|
|
- if (!pch_ptp_match(skb, htons(uid), htonl(lo), htons(seq)))
|
|
+ if (!pch_ptp_match(skb, hi, lo, hi >> 16))
|
|
goto out;
|
|
|
|
ns = pch_rx_snap_read(pdev);
|
|
@@ -2617,9 +2610,13 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
|
adapter->pdev = pdev;
|
|
adapter->hw.back = adapter;
|
|
adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR];
|
|
+
|
|
adapter->pdata = (struct pch_gbe_privdata *)pci_id->driver_data;
|
|
- if (adapter->pdata && adapter->pdata->platform_init)
|
|
- adapter->pdata->platform_init(pdev);
|
|
+ if (adapter->pdata && adapter->pdata->platform_init) {
|
|
+ ret = adapter->pdata->platform_init(pdev);
|
|
+ if (ret)
|
|
+ goto err_free_netdev;
|
|
+ }
|
|
|
|
adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number,
|
|
PCI_DEVFN(12, 4));
|
|
@@ -2709,7 +2706,7 @@ err_free_netdev:
|
|
*/
|
|
static int pch_gbe_minnow_platform_init(struct pci_dev *pdev)
|
|
{
|
|
- unsigned long flags = GPIOF_DIR_OUT | GPIOF_INIT_HIGH | GPIOF_EXPORT;
|
|
+ unsigned long flags = GPIOF_OUT_INIT_HIGH;
|
|
unsigned gpio = MINNOW_PHY_RESET_GPIO;
|
|
int ret;
|
|
|
|
diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c
|
|
index a949b9d27329e..bef23e19cbbd9 100644
|
|
--- a/drivers/net/ethernet/sfc/ef10_sriov.c
|
|
+++ b/drivers/net/ethernet/sfc/ef10_sriov.c
|
|
@@ -405,12 +405,17 @@ fail1:
|
|
return rc;
|
|
}
|
|
|
|
+/* Disable SRIOV and remove VFs
|
|
+ * If some VFs are attached to a guest (using Xen, only) nothing is
|
|
+ * done if force=false, and vports are freed if force=true (for the non
|
|
+ * attachedc ones, only) but SRIOV is not disabled and VFs are not
|
|
+ * removed in either case.
|
|
+ */
|
|
static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force)
|
|
{
|
|
struct pci_dev *dev = efx->pci_dev;
|
|
- unsigned int vfs_assigned = 0;
|
|
-
|
|
- vfs_assigned = pci_vfs_assigned(dev);
|
|
+ unsigned int vfs_assigned = pci_vfs_assigned(dev);
|
|
+ int rc = 0;
|
|
|
|
if (vfs_assigned && !force) {
|
|
netif_info(efx, drv, efx->net_dev, "VFs are assigned to guests; "
|
|
@@ -420,10 +425,12 @@ static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force)
|
|
|
|
if (!vfs_assigned)
|
|
pci_disable_sriov(dev);
|
|
+ else
|
|
+ rc = -EBUSY;
|
|
|
|
efx_ef10_sriov_free_vf_vswitching(efx);
|
|
efx->vf_count = 0;
|
|
- return 0;
|
|
+ return rc;
|
|
}
|
|
|
|
int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs)
|
|
@@ -442,7 +449,6 @@ int efx_ef10_sriov_init(struct efx_nic *efx)
|
|
void efx_ef10_sriov_fini(struct efx_nic *efx)
|
|
{
|
|
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
|
- unsigned int i;
|
|
int rc;
|
|
|
|
if (!nic_data->vf) {
|
|
@@ -452,14 +458,7 @@ void efx_ef10_sriov_fini(struct efx_nic *efx)
|
|
return;
|
|
}
|
|
|
|
- /* Remove any VFs in the host */
|
|
- for (i = 0; i < efx->vf_count; ++i) {
|
|
- struct efx_nic *vf_efx = nic_data->vf[i].efx;
|
|
-
|
|
- if (vf_efx)
|
|
- vf_efx->pci_dev->driver->remove(vf_efx->pci_dev);
|
|
- }
|
|
-
|
|
+ /* Disable SRIOV and remove any VFs in the host */
|
|
rc = efx_ef10_pci_sriov_disable(efx, true);
|
|
if (rc)
|
|
netif_dbg(efx, drv, efx->net_dev,
|
|
diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c
|
|
index 3511d40ba3f11..440047a239f57 100644
|
|
--- a/drivers/net/fjes/fjes_main.c
|
|
+++ b/drivers/net/fjes/fjes_main.c
|
|
@@ -1212,6 +1212,10 @@ static int fjes_probe(struct platform_device *plat_dev)
|
|
adapter->interrupt_watch_enable = false;
|
|
|
|
res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
|
|
+ if (!res) {
|
|
+ err = -EINVAL;
|
|
+ goto err_free_control_wq;
|
|
+ }
|
|
hw->hw_res.start = res->start;
|
|
hw->hw_res.size = resource_size(res);
|
|
hw->hw_res.irq = platform_get_irq(plat_dev, 0);
|
|
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
|
|
index 088bb5870ac5b..0bfadec8b79c9 100644
|
|
--- a/drivers/net/vxlan.c
|
|
+++ b/drivers/net/vxlan.c
|
|
@@ -1594,6 +1594,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb)
|
|
struct neighbour *n;
|
|
struct inet6_dev *in6_dev;
|
|
|
|
+ rcu_read_lock();
|
|
in6_dev = __in6_dev_get(dev);
|
|
if (!in6_dev)
|
|
goto out;
|
|
@@ -1650,6 +1651,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb)
|
|
}
|
|
|
|
out:
|
|
+ rcu_read_unlock();
|
|
consume_skb(skb);
|
|
return NETDEV_TX_OK;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
|
|
index 564181bb0906a..314cac2ce0879 100644
|
|
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
|
@@ -4947,6 +4947,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
|
|
|
|
if (arvif->nohwcrypt &&
|
|
!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
|
|
+ ret = -EINVAL;
|
|
ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
|
|
goto err;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
|
|
index 58af2fe5be3c1..454bf16d6b304 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
|
@@ -302,6 +302,11 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
|
|
hchan = ah->curchan;
|
|
}
|
|
|
|
+ if (!hchan) {
|
|
+ fastcc = false;
|
|
+ hchan = ath9k_cmn_get_channel(sc->hw, ah, &sc->cur_chan->chandef);
|
|
+ }
|
|
+
|
|
if (!ath_prepare_reset(sc))
|
|
fastcc = false;
|
|
|
|
diff --git a/drivers/net/wireless/ath/carl9170/Kconfig b/drivers/net/wireless/ath/carl9170/Kconfig
|
|
index 2e34baeaf7649..2b782db20fde4 100644
|
|
--- a/drivers/net/wireless/ath/carl9170/Kconfig
|
|
+++ b/drivers/net/wireless/ath/carl9170/Kconfig
|
|
@@ -15,13 +15,11 @@ config CARL9170
|
|
|
|
config CARL9170_LEDS
|
|
bool "SoftLED Support"
|
|
- depends on CARL9170
|
|
- select MAC80211_LEDS
|
|
- select LEDS_CLASS
|
|
- select NEW_LEDS
|
|
default y
|
|
+ depends on CARL9170
|
|
+ depends on MAC80211_LEDS
|
|
help
|
|
- This option is necessary, if you want your device' LEDs to blink
|
|
+ This option is necessary, if you want your device's LEDs to blink.
|
|
|
|
Say Y, unless you need the LEDs for firmware debugging.
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
index b820e80d4b4c2..8b56aa6274876 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
@@ -1221,6 +1221,7 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
|
|
{
|
|
struct brcms_info *wl;
|
|
struct ieee80211_hw *hw;
|
|
+ int ret;
|
|
|
|
dev_info(&pdev->dev, "mfg %x core %x rev %d class %d irq %d\n",
|
|
pdev->id.manuf, pdev->id.id, pdev->id.rev, pdev->id.class,
|
|
@@ -1245,11 +1246,16 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
|
|
wl = brcms_attach(pdev);
|
|
if (!wl) {
|
|
pr_err("%s: brcms_attach failed!\n", __func__);
|
|
- return -ENODEV;
|
|
+ ret = -ENODEV;
|
|
+ goto err_free_ieee80211;
|
|
}
|
|
brcms_led_register(wl);
|
|
|
|
return 0;
|
|
+
|
|
+err_free_ieee80211:
|
|
+ ieee80211_free_hw(hw);
|
|
+ return ret;
|
|
}
|
|
|
|
static int brcms_suspend(struct bcma_device *pdev)
|
|
diff --git a/drivers/net/wireless/st/cw1200/cw1200_sdio.c b/drivers/net/wireless/st/cw1200/cw1200_sdio.c
|
|
index d3acc85932a56..de92107549eef 100644
|
|
--- a/drivers/net/wireless/st/cw1200/cw1200_sdio.c
|
|
+++ b/drivers/net/wireless/st/cw1200/cw1200_sdio.c
|
|
@@ -62,6 +62,7 @@ static const struct sdio_device_id cw1200_sdio_ids[] = {
|
|
{ SDIO_DEVICE(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200) },
|
|
{ /* end: all zeroes */ },
|
|
};
|
|
+MODULE_DEVICE_TABLE(sdio, cw1200_sdio_ids);
|
|
|
|
/* hwbus_ops implemetation */
|
|
|
|
diff --git a/drivers/net/wireless/ti/wl1251/cmd.c b/drivers/net/wireless/ti/wl1251/cmd.c
|
|
index ede31f048ef98..247f4310a38fe 100644
|
|
--- a/drivers/net/wireless/ti/wl1251/cmd.c
|
|
+++ b/drivers/net/wireless/ti/wl1251/cmd.c
|
|
@@ -465,9 +465,12 @@ int wl1251_cmd_scan(struct wl1251 *wl, u8 *ssid, size_t ssid_len,
|
|
cmd->channels[i].channel = channels[i]->hw_value;
|
|
}
|
|
|
|
- cmd->params.ssid_len = ssid_len;
|
|
- if (ssid)
|
|
- memcpy(cmd->params.ssid, ssid, ssid_len);
|
|
+ if (ssid) {
|
|
+ int len = clamp_val(ssid_len, 0, IEEE80211_MAX_SSID_LEN);
|
|
+
|
|
+ cmd->params.ssid_len = len;
|
|
+ memcpy(cmd->params.ssid, ssid, len);
|
|
+ }
|
|
|
|
ret = wl1251_cmd_send(wl, CMD_SCAN, cmd, sizeof(*cmd));
|
|
if (ret < 0) {
|
|
diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
|
|
index 9bd635ec7827b..72991d3a55f10 100644
|
|
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
|
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
|
@@ -1516,6 +1516,13 @@ static int wl12xx_get_fuse_mac(struct wl1271 *wl)
|
|
u32 mac1, mac2;
|
|
int ret;
|
|
|
|
+ /* Device may be in ELP from the bootloader or kexec */
|
|
+ ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
|
|
+ if (ret < 0)
|
|
+ goto out;
|
|
+
|
|
+ usleep_range(500000, 700000);
|
|
+
|
|
ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
|
|
if (ret < 0)
|
|
goto out;
|
|
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
|
|
index e9360d5cbcbac..6a239c9bbf59b 100644
|
|
--- a/drivers/of/fdt.c
|
|
+++ b/drivers/of/fdt.c
|
|
@@ -605,11 +605,11 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
|
|
|
|
if (size &&
|
|
early_init_dt_reserve_memory_arch(base, size, nomap) == 0)
|
|
- pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
else
|
|
- pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
|
|
len -= t_len;
|
|
if (first) {
|
|
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
|
|
index f15bb936dfd84..fca446a13bbb2 100644
|
|
--- a/drivers/of/of_reserved_mem.c
|
|
+++ b/drivers/of/of_reserved_mem.c
|
|
@@ -158,9 +158,9 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
|
|
ret = early_init_dt_alloc_reserved_memory_arch(size,
|
|
align, start, end, nomap, &base);
|
|
if (ret == 0) {
|
|
- pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
|
|
+ pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
|
|
uname, &base,
|
|
- (unsigned long)size / SZ_1M);
|
|
+ (unsigned long)(size / SZ_1M));
|
|
break;
|
|
}
|
|
len -= t_len;
|
|
@@ -170,8 +170,8 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
|
|
ret = early_init_dt_alloc_reserved_memory_arch(size, align,
|
|
0, 0, nomap, &base);
|
|
if (ret == 0)
|
|
- pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
}
|
|
|
|
if (base == 0) {
|
|
diff --git a/drivers/pci/pci-label.c b/drivers/pci/pci-label.c
|
|
index 51357377efbce..ac169cf0fa02b 100644
|
|
--- a/drivers/pci/pci-label.c
|
|
+++ b/drivers/pci/pci-label.c
|
|
@@ -157,7 +157,7 @@ static void dsm_label_utf16s_to_utf8s(union acpi_object *obj, char *buf)
|
|
len = utf16s_to_utf8s((const wchar_t *)obj->buffer.pointer,
|
|
obj->buffer.length,
|
|
UTF16_LITTLE_ENDIAN,
|
|
- buf, PAGE_SIZE);
|
|
+ buf, PAGE_SIZE - 1);
|
|
buf[len] = '\n';
|
|
}
|
|
|
|
diff --git a/drivers/phy/phy-dm816x-usb.c b/drivers/phy/phy-dm816x-usb.c
|
|
index cbcce7cf0028e..2ed5fe20d7792 100644
|
|
--- a/drivers/phy/phy-dm816x-usb.c
|
|
+++ b/drivers/phy/phy-dm816x-usb.c
|
|
@@ -246,19 +246,28 @@ static int dm816x_usb_phy_probe(struct platform_device *pdev)
|
|
|
|
pm_runtime_enable(phy->dev);
|
|
generic_phy = devm_phy_create(phy->dev, NULL, &ops);
|
|
- if (IS_ERR(generic_phy))
|
|
- return PTR_ERR(generic_phy);
|
|
+ if (IS_ERR(generic_phy)) {
|
|
+ error = PTR_ERR(generic_phy);
|
|
+ goto clk_unprepare;
|
|
+ }
|
|
|
|
phy_set_drvdata(generic_phy, phy);
|
|
|
|
phy_provider = devm_of_phy_provider_register(phy->dev,
|
|
of_phy_simple_xlate);
|
|
- if (IS_ERR(phy_provider))
|
|
- return PTR_ERR(phy_provider);
|
|
+ if (IS_ERR(phy_provider)) {
|
|
+ error = PTR_ERR(phy_provider);
|
|
+ goto clk_unprepare;
|
|
+ }
|
|
|
|
usb_add_phy_dev(&phy->phy);
|
|
|
|
return 0;
|
|
+
|
|
+clk_unprepare:
|
|
+ pm_runtime_disable(phy->dev);
|
|
+ clk_unprepare(phy->refclk);
|
|
+ return error;
|
|
}
|
|
|
|
static int dm816x_usb_phy_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
|
|
index 1bb2493ad1d03..c762caba551f9 100644
|
|
--- a/drivers/pinctrl/pinctrl-amd.c
|
|
+++ b/drivers/pinctrl/pinctrl-amd.c
|
|
@@ -896,6 +896,7 @@ static int amd_gpio_remove(struct platform_device *pdev)
|
|
static const struct acpi_device_id amd_gpio_acpi_match[] = {
|
|
{ "AMD0030", 0 },
|
|
{ "AMDI0030", 0},
|
|
+ { "AMDI0031", 0},
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, amd_gpio_acpi_match);
|
|
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
|
|
index f25278bb3e1a8..90b17cf74e9fd 100644
|
|
--- a/drivers/platform/x86/toshiba_acpi.c
|
|
+++ b/drivers/platform/x86/toshiba_acpi.c
|
|
@@ -2866,6 +2866,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
|
|
|
if (!dev->info_supported && !dev->system_event_supported) {
|
|
pr_warn("No hotkey query interface found\n");
|
|
+ error = -EINVAL;
|
|
goto err_remove_filter;
|
|
}
|
|
|
|
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
|
|
index be3d81ff51cc3..a44e3427fdeb0 100644
|
|
--- a/drivers/power/reset/gpio-poweroff.c
|
|
+++ b/drivers/power/reset/gpio-poweroff.c
|
|
@@ -84,6 +84,7 @@ static const struct of_device_id of_gpio_poweroff_match[] = {
|
|
{ .compatible = "gpio-poweroff", },
|
|
{},
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, of_gpio_poweroff_match);
|
|
|
|
static struct platform_driver gpio_poweroff_driver = {
|
|
.probe = gpio_poweroff_probe,
|
|
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
|
|
index 0de9a958b29a5..b825e70a5196c 100644
|
|
--- a/drivers/power/supply/Kconfig
|
|
+++ b/drivers/power/supply/Kconfig
|
|
@@ -490,7 +490,8 @@ config BATTERY_GOLDFISH
|
|
|
|
config BATTERY_RT5033
|
|
tristate "RT5033 fuel gauge support"
|
|
- depends on MFD_RT5033
|
|
+ depends on I2C
|
|
+ select REGMAP_I2C
|
|
help
|
|
This adds support for battery fuel gauge in Richtek RT5033 PMIC.
|
|
The fuelgauge calculates and determines the battery state of charge
|
|
diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c
|
|
index 6ffdc18f2599b..9f17d81767ea0 100644
|
|
--- a/drivers/power/supply/ab8500_btemp.c
|
|
+++ b/drivers/power/supply/ab8500_btemp.c
|
|
@@ -1181,6 +1181,7 @@ static const struct of_device_id ab8500_btemp_match[] = {
|
|
{ .compatible = "stericsson,ab8500-btemp", },
|
|
{ },
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, ab8500_btemp_match);
|
|
|
|
static struct platform_driver ab8500_btemp_driver = {
|
|
.probe = ab8500_btemp_probe,
|
|
diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
|
|
index 48a11fd86a7f2..56b5023314334 100644
|
|
--- a/drivers/power/supply/ab8500_charger.c
|
|
+++ b/drivers/power/supply/ab8500_charger.c
|
|
@@ -409,6 +409,14 @@ disable_otp:
|
|
static void ab8500_power_supply_changed(struct ab8500_charger *di,
|
|
struct power_supply *psy)
|
|
{
|
|
+ /*
|
|
+ * This happens if we get notifications or interrupts and
|
|
+ * the platform has been configured not to support one or
|
|
+ * other type of charging.
|
|
+ */
|
|
+ if (!psy)
|
|
+ return;
|
|
+
|
|
if (di->autopower_cfg) {
|
|
if (!di->usb.charger_connected &&
|
|
!di->ac.charger_connected &&
|
|
@@ -435,7 +443,15 @@ static void ab8500_charger_set_usb_connected(struct ab8500_charger *di,
|
|
if (!connected)
|
|
di->flags.vbus_drop_end = false;
|
|
|
|
- sysfs_notify(&di->usb_chg.psy->dev.kobj, NULL, "present");
|
|
+ /*
|
|
+ * Sometimes the platform is configured not to support
|
|
+ * USB charging and no psy has been created, but we still
|
|
+ * will get these notifications.
|
|
+ */
|
|
+ if (di->usb_chg.psy) {
|
|
+ sysfs_notify(&di->usb_chg.psy->dev.kobj, NULL,
|
|
+ "present");
|
|
+ }
|
|
|
|
if (connected) {
|
|
mutex_lock(&di->charger_attached_mutex);
|
|
@@ -3736,6 +3752,7 @@ static const struct of_device_id ab8500_charger_match[] = {
|
|
{ .compatible = "stericsson,ab8500-charger", },
|
|
{ },
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, ab8500_charger_match);
|
|
|
|
static struct platform_driver ab8500_charger_driver = {
|
|
.probe = ab8500_charger_probe,
|
|
diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c
|
|
index ea8c26a108f00..d6079e892e11f 100644
|
|
--- a/drivers/power/supply/ab8500_fg.c
|
|
+++ b/drivers/power/supply/ab8500_fg.c
|
|
@@ -3229,6 +3229,7 @@ static const struct of_device_id ab8500_fg_match[] = {
|
|
{ .compatible = "stericsson,ab8500-fg", },
|
|
{ },
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, ab8500_fg_match);
|
|
|
|
static struct platform_driver ab8500_fg_driver = {
|
|
.probe = ab8500_fg_probe,
|
|
diff --git a/drivers/power/supply/charger-manager.c b/drivers/power/supply/charger-manager.c
|
|
index 13f23c00538b4..043836e6d347b 100644
|
|
--- a/drivers/power/supply/charger-manager.c
|
|
+++ b/drivers/power/supply/charger-manager.c
|
|
@@ -1489,6 +1489,7 @@ static const struct of_device_id charger_manager_match[] = {
|
|
},
|
|
{},
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, charger_manager_match);
|
|
|
|
static struct charger_desc *of_cm_parse_desc(struct device *dev)
|
|
{
|
|
diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c
|
|
index bcdd830484929..9310b85f3405e 100644
|
|
--- a/drivers/power/supply/rt5033_battery.c
|
|
+++ b/drivers/power/supply/rt5033_battery.c
|
|
@@ -167,9 +167,16 @@ static const struct i2c_device_id rt5033_battery_id[] = {
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, rt5033_battery_id);
|
|
|
|
+static const struct of_device_id rt5033_battery_of_match[] = {
|
|
+ { .compatible = "richtek,rt5033-battery", },
|
|
+ { }
|
|
+};
|
|
+MODULE_DEVICE_TABLE(of, rt5033_battery_of_match);
|
|
+
|
|
static struct i2c_driver rt5033_battery_driver = {
|
|
.driver = {
|
|
.name = "rt5033-battery",
|
|
+ .of_match_table = rt5033_battery_of_match,
|
|
},
|
|
.probe = rt5033_battery_probe,
|
|
.remove = rt5033_battery_remove,
|
|
diff --git a/drivers/pwm/pwm-spear.c b/drivers/pwm/pwm-spear.c
|
|
index 6c6b44fd3f438..2d11ac277de8d 100644
|
|
--- a/drivers/pwm/pwm-spear.c
|
|
+++ b/drivers/pwm/pwm-spear.c
|
|
@@ -231,10 +231,6 @@ static int spear_pwm_probe(struct platform_device *pdev)
|
|
static int spear_pwm_remove(struct platform_device *pdev)
|
|
{
|
|
struct spear_pwm_chip *pc = platform_get_drvdata(pdev);
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < NUM_PWM; i++)
|
|
- pwm_disable(&pc->chip.pwms[i]);
|
|
|
|
/* clk was prepared in probe, hence unprepare it here */
|
|
clk_unprepare(pc->clk);
|
|
diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c
|
|
index 7e8906d6ab7a9..d76698ce6472e 100644
|
|
--- a/drivers/pwm/pwm-tegra.c
|
|
+++ b/drivers/pwm/pwm-tegra.c
|
|
@@ -228,7 +228,6 @@ static int tegra_pwm_probe(struct platform_device *pdev)
|
|
static int tegra_pwm_remove(struct platform_device *pdev)
|
|
{
|
|
struct tegra_pwm_chip *pc = platform_get_drvdata(pdev);
|
|
- unsigned int i;
|
|
int err;
|
|
|
|
if (WARN_ON(!pc))
|
|
@@ -238,18 +237,6 @@ static int tegra_pwm_remove(struct platform_device *pdev)
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- for (i = 0; i < pc->chip.npwm; i++) {
|
|
- struct pwm_device *pwm = &pc->chip.pwms[i];
|
|
-
|
|
- if (!pwm_is_enabled(pwm))
|
|
- if (clk_prepare_enable(pc->clk) < 0)
|
|
- continue;
|
|
-
|
|
- pwm_writel(pc, i, 0);
|
|
-
|
|
- clk_disable_unprepare(pc->clk);
|
|
- }
|
|
-
|
|
reset_control_assert(pc->rst);
|
|
clk_disable_unprepare(pc->clk);
|
|
|
|
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
|
|
index 9ececfef42d67..bd91c95f73e0e 100644
|
|
--- a/drivers/regulator/da9052-regulator.c
|
|
+++ b/drivers/regulator/da9052-regulator.c
|
|
@@ -258,7 +258,8 @@ static int da9052_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
|
|
case DA9052_ID_BUCK3:
|
|
case DA9052_ID_LDO2:
|
|
case DA9052_ID_LDO3:
|
|
- ret = (new_sel - old_sel) * info->step_uV / 6250;
|
|
+ ret = DIV_ROUND_UP(abs(new_sel - old_sel) * info->step_uV,
|
|
+ 6250);
|
|
break;
|
|
}
|
|
|
|
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
|
|
index d0ebca301afc9..c15c898fe0dc0 100644
|
|
--- a/drivers/reset/core.c
|
|
+++ b/drivers/reset/core.c
|
|
@@ -263,7 +263,10 @@ static struct reset_control *__reset_control_get_internal(
|
|
if (!rstc)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
- try_module_get(rcdev->owner);
|
|
+ if (!try_module_get(rcdev->owner)) {
|
|
+ kfree(rstc);
|
|
+ return ERR_PTR(-ENODEV);
|
|
+ }
|
|
|
|
rstc->rcdev = rcdev;
|
|
list_add(&rstc->list, &rcdev->reset_control_head);
|
|
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c
|
|
index 31e7e23cc5be7..9396b69f75e8f 100644
|
|
--- a/drivers/rtc/rtc-proc.c
|
|
+++ b/drivers/rtc/rtc-proc.c
|
|
@@ -26,8 +26,8 @@ static bool is_rtc_hctosys(struct rtc_device *rtc)
|
|
int size;
|
|
char name[NAME_SIZE];
|
|
|
|
- size = scnprintf(name, NAME_SIZE, "rtc%d", rtc->id);
|
|
- if (size > NAME_SIZE)
|
|
+ size = snprintf(name, NAME_SIZE, "rtc%d", rtc->id);
|
|
+ if (size >= NAME_SIZE)
|
|
return false;
|
|
|
|
return !strncmp(name, CONFIG_RTC_HCTOSYS_DEVICE, NAME_SIZE);
|
|
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c
|
|
index 68d6ee7ae504d..3e8b5906548f8 100644
|
|
--- a/drivers/s390/char/sclp_vt220.c
|
|
+++ b/drivers/s390/char/sclp_vt220.c
|
|
@@ -34,8 +34,8 @@
|
|
#define SCLP_VT220_MINOR 65
|
|
#define SCLP_VT220_DRIVER_NAME "sclp_vt220"
|
|
#define SCLP_VT220_DEVICE_NAME "ttysclp"
|
|
-#define SCLP_VT220_CONSOLE_NAME "ttyS"
|
|
-#define SCLP_VT220_CONSOLE_INDEX 1 /* console=ttyS1 */
|
|
+#define SCLP_VT220_CONSOLE_NAME "ttysclp"
|
|
+#define SCLP_VT220_CONSOLE_INDEX 0 /* console=ttysclp0 */
|
|
|
|
/* Representation of a single write request */
|
|
struct sclp_vt220_request {
|
|
diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c
|
|
index 876c7e6e3a992..6b8e7086c8078 100644
|
|
--- a/drivers/s390/cio/chp.c
|
|
+++ b/drivers/s390/cio/chp.c
|
|
@@ -254,6 +254,9 @@ static ssize_t chp_status_write(struct device *dev,
|
|
if (!num_args)
|
|
return count;
|
|
|
|
+ /* Wait until previous actions have settled. */
|
|
+ css_wait_for_slow_path();
|
|
+
|
|
if (!strncasecmp(cmd, "on", 2) || !strcmp(cmd, "1")) {
|
|
mutex_lock(&cp->lock);
|
|
error = s390_vary_chpid(cp->chpid, 1);
|
|
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
|
|
index 67903c93328b0..6e695bc96b88e 100644
|
|
--- a/drivers/s390/cio/chsc.c
|
|
+++ b/drivers/s390/cio/chsc.c
|
|
@@ -769,8 +769,6 @@ int chsc_chp_vary(struct chp_id chpid, int on)
|
|
{
|
|
struct channel_path *chp = chpid_to_chp(chpid);
|
|
|
|
- /* Wait until previous actions have settled. */
|
|
- css_wait_for_slow_path();
|
|
/*
|
|
* Redo PathVerification on the devices the chpid connects to
|
|
*/
|
|
diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c
|
|
index 867b864f50479..4bca37d52bad8 100644
|
|
--- a/drivers/scsi/FlashPoint.c
|
|
+++ b/drivers/scsi/FlashPoint.c
|
|
@@ -40,7 +40,7 @@ struct sccb_mgr_info {
|
|
u16 si_per_targ_ultra_nego;
|
|
u16 si_per_targ_no_disc;
|
|
u16 si_per_targ_wide_nego;
|
|
- u16 si_flags;
|
|
+ u16 si_mflags;
|
|
unsigned char si_card_family;
|
|
unsigned char si_bustype;
|
|
unsigned char si_card_model[3];
|
|
@@ -1070,22 +1070,22 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
ScamFlg =
|
|
(unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
|
|
|
|
- pCardInfo->si_flags = 0x0000;
|
|
+ pCardInfo->si_mflags = 0x0000;
|
|
|
|
if (i & 0x01)
|
|
- pCardInfo->si_flags |= SCSI_PARITY_ENA;
|
|
+ pCardInfo->si_mflags |= SCSI_PARITY_ENA;
|
|
|
|
if (!(i & 0x02))
|
|
- pCardInfo->si_flags |= SOFT_RESET;
|
|
+ pCardInfo->si_mflags |= SOFT_RESET;
|
|
|
|
if (i & 0x10)
|
|
- pCardInfo->si_flags |= EXTENDED_TRANSLATION;
|
|
+ pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
|
|
|
|
if (ScamFlg & SCAM_ENABLED)
|
|
- pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
|
|
+ pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
|
|
|
|
if (ScamFlg & SCAM_LEVEL2)
|
|
- pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
|
|
+ pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
|
|
|
|
j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
|
|
if (i & 0x04) {
|
|
@@ -1101,7 +1101,7 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
|
|
if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
|
|
|
|
- pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
|
|
+ pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
|
|
|
|
pCardInfo->si_card_family = HARPOON_FAMILY;
|
|
pCardInfo->si_bustype = BUSTYPE_PCI;
|
|
@@ -1137,15 +1137,15 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
|
|
if (pCardInfo->si_card_model[1] == '3') {
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
} else if (pCardInfo->si_card_model[2] == '0') {
|
|
temp = RD_HARPOON(ioport + hp_xfer_pad);
|
|
WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= HIGH_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= HIGH_BYTE_TERM;
|
|
WR_HARPOON(ioport + hp_xfer_pad, temp);
|
|
} else {
|
|
temp = RD_HARPOON(ioport + hp_ee_ctrl);
|
|
@@ -1163,9 +1163,9 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
WR_HARPOON(ioport + hp_ee_ctrl, temp);
|
|
WR_HARPOON(ioport + hp_xfer_pad, temp2);
|
|
if (!(temp3 & BIT(7)))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
if (!(temp3 & BIT(6)))
|
|
- pCardInfo->si_flags |= HIGH_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= HIGH_BYTE_TERM;
|
|
}
|
|
|
|
ARAM_ACCESS(ioport);
|
|
@@ -1272,7 +1272,7 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
|
|
WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
|
|
CurrCard->ourId = pCardInfo->si_id;
|
|
|
|
- i = (unsigned char)pCardInfo->si_flags;
|
|
+ i = (unsigned char)pCardInfo->si_mflags;
|
|
if (i & SCSI_PARITY_ENA)
|
|
WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
|
|
|
|
@@ -1286,14 +1286,14 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
|
|
j |= SCSI_TERM_ENA_H;
|
|
WR_HARPOON(ioport + hp_ee_ctrl, j);
|
|
|
|
- if (!(pCardInfo->si_flags & SOFT_RESET)) {
|
|
+ if (!(pCardInfo->si_mflags & SOFT_RESET)) {
|
|
|
|
FPT_sresb(ioport, thisCard);
|
|
|
|
FPT_scini(thisCard, pCardInfo->si_id, 0);
|
|
}
|
|
|
|
- if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
|
|
+ if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
|
|
CurrCard->globalFlags |= F_NO_FILTER;
|
|
|
|
if (pCurrNvRam) {
|
|
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
|
|
index 741cc96379cb7..628bf2e6a526b 100644
|
|
--- a/drivers/scsi/be2iscsi/be_main.c
|
|
+++ b/drivers/scsi/be2iscsi/be_main.c
|
|
@@ -5847,6 +5847,7 @@ hba_free:
|
|
pci_disable_msix(phba->pcidev);
|
|
pci_dev_put(phba->pcidev);
|
|
iscsi_host_free(phba->shost);
|
|
+ pci_disable_pcie_error_reporting(pcidev);
|
|
pci_set_drvdata(pcidev, NULL);
|
|
disable_pci:
|
|
pci_release_regions(pcidev);
|
|
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
|
|
index 604cf3385aae2..b6a9773326e30 100644
|
|
--- a/drivers/scsi/hosts.c
|
|
+++ b/drivers/scsi/hosts.c
|
|
@@ -515,6 +515,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|
shost_printk(KERN_WARNING, shost,
|
|
"error handler thread failed to spawn, error = %ld\n",
|
|
PTR_ERR(shost->ehandler));
|
|
+ shost->ehandler = NULL;
|
|
goto fail;
|
|
}
|
|
|
|
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
|
|
index 50e2943c33377..30e954bb6c81e 100644
|
|
--- a/drivers/scsi/libiscsi.c
|
|
+++ b/drivers/scsi/libiscsi.c
|
|
@@ -1384,7 +1384,6 @@ void iscsi_session_failure(struct iscsi_session *session,
|
|
enum iscsi_err err)
|
|
{
|
|
struct iscsi_conn *conn;
|
|
- struct device *dev;
|
|
|
|
spin_lock_bh(&session->frwd_lock);
|
|
conn = session->leadconn;
|
|
@@ -1393,10 +1392,8 @@ void iscsi_session_failure(struct iscsi_session *session,
|
|
return;
|
|
}
|
|
|
|
- dev = get_device(&conn->cls_conn->dev);
|
|
+ iscsi_get_conn(conn->cls_conn);
|
|
spin_unlock_bh(&session->frwd_lock);
|
|
- if (!dev)
|
|
- return;
|
|
/*
|
|
* if the host is being removed bypass the connection
|
|
* recovery initialization because we are going to kill
|
|
@@ -1406,7 +1403,7 @@ void iscsi_session_failure(struct iscsi_session *session,
|
|
iscsi_conn_error_event(conn->cls_conn, err);
|
|
else
|
|
iscsi_conn_failure(conn, err);
|
|
- put_device(dev);
|
|
+ iscsi_put_conn(conn->cls_conn);
|
|
}
|
|
EXPORT_SYMBOL_GPL(iscsi_session_failure);
|
|
|
|
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
|
|
index 7d4a5bb916062..f17adfe1326b8 100644
|
|
--- a/drivers/scsi/lpfc/lpfc_els.c
|
|
+++ b/drivers/scsi/lpfc/lpfc_els.c
|
|
@@ -1159,6 +1159,15 @@ stop_rr_fcf_flogi:
|
|
phba->fcf.fcf_redisc_attempted = 0; /* reset */
|
|
goto out;
|
|
}
|
|
+ } else if (vport->port_state > LPFC_FLOGI &&
|
|
+ vport->fc_flag & FC_PT2PT) {
|
|
+ /*
|
|
+ * In a p2p topology, it is possible that discovery has
|
|
+ * already progressed, and this completion can be ignored.
|
|
+ * Recheck the indicated topology.
|
|
+ */
|
|
+ if (!sp->cmn.fPort)
|
|
+ goto out;
|
|
}
|
|
|
|
flogifail:
|
|
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
index aa2078d7e23e2..58876b8a2e9f8 100644
|
|
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
@@ -5199,8 +5199,10 @@ _scsih_expander_add(struct MPT3SAS_ADAPTER *ioc, u16 handle)
|
|
handle, parent_handle, (unsigned long long)
|
|
sas_expander->sas_address, sas_expander->num_phys);
|
|
|
|
- if (!sas_expander->num_phys)
|
|
+ if (!sas_expander->num_phys) {
|
|
+ rc = -1;
|
|
goto out_fail;
|
|
+ }
|
|
sas_expander->phy = kcalloc(sas_expander->num_phys,
|
|
sizeof(struct _sas_phy), GFP_KERNEL);
|
|
if (!sas_expander->phy) {
|
|
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
|
|
index 80341863caa5e..32522652d055b 100644
|
|
--- a/drivers/scsi/scsi_lib.c
|
|
+++ b/drivers/scsi/scsi_lib.c
|
|
@@ -915,6 +915,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
case 0x07: /* operation in progress */
|
|
case 0x08: /* Long write in progress */
|
|
case 0x09: /* self test in progress */
|
|
+ case 0x11: /* notify (enable spinup) required */
|
|
case 0x14: /* space allocation in progress */
|
|
action = ACTION_DELAYED_RETRY;
|
|
break;
|
|
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
|
|
index 4f4d2d65a4a70..337aad0660fae 100644
|
|
--- a/drivers/scsi/scsi_transport_iscsi.c
|
|
+++ b/drivers/scsi/scsi_transport_iscsi.c
|
|
@@ -2327,6 +2327,18 @@ int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
|
|
}
|
|
EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
|
|
|
|
+void iscsi_put_conn(struct iscsi_cls_conn *conn)
|
|
+{
|
|
+ put_device(&conn->dev);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(iscsi_put_conn);
|
|
+
|
|
+void iscsi_get_conn(struct iscsi_cls_conn *conn)
|
|
+{
|
|
+ get_device(&conn->dev);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(iscsi_get_conn);
|
|
+
|
|
/*
|
|
* iscsi interface functions
|
|
*/
|
|
diff --git a/drivers/spi/spi-loopback-test.c b/drivers/spi/spi-loopback-test.c
|
|
index 7120083fe7610..cac38753d0cd3 100644
|
|
--- a/drivers/spi/spi-loopback-test.c
|
|
+++ b/drivers/spi/spi-loopback-test.c
|
|
@@ -803,7 +803,7 @@ static int spi_test_run_iter(struct spi_device *spi,
|
|
test.transfers[i].len = len;
|
|
if (test.transfers[i].tx_buf)
|
|
test.transfers[i].tx_buf += tx_off;
|
|
- if (test.transfers[i].tx_buf)
|
|
+ if (test.transfers[i].rx_buf)
|
|
test.transfers[i].rx_buf += rx_off;
|
|
}
|
|
|
|
diff --git a/drivers/spi/spi-omap-100k.c b/drivers/spi/spi-omap-100k.c
|
|
index 1eccdc4a45817..2eeb0fe2eed28 100644
|
|
--- a/drivers/spi/spi-omap-100k.c
|
|
+++ b/drivers/spi/spi-omap-100k.c
|
|
@@ -251,7 +251,7 @@ static int omap1_spi100k_setup_transfer(struct spi_device *spi,
|
|
else
|
|
word_len = spi->bits_per_word;
|
|
|
|
- if (spi->bits_per_word > 32)
|
|
+ if (word_len > 32)
|
|
return -EINVAL;
|
|
cs->word_len = word_len;
|
|
|
|
diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c
|
|
index 17068e62e792d..8c3f5a00fd9e1 100644
|
|
--- a/drivers/spi/spi-sun6i.c
|
|
+++ b/drivers/spi/spi-sun6i.c
|
|
@@ -251,6 +251,10 @@ static int sun6i_spi_transfer_one(struct spi_master *master,
|
|
}
|
|
|
|
sun6i_spi_write(sspi, SUN6I_CLK_CTL_REG, reg);
|
|
+ /* Finally enable the bus - doing so before might raise SCK to HIGH */
|
|
+ reg = sun6i_spi_read(sspi, SUN6I_GBL_CTL_REG);
|
|
+ reg |= SUN6I_GBL_CTL_BUS_ENABLE;
|
|
+ sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG, reg);
|
|
|
|
/* Setup the transfer now... */
|
|
if (sspi->tx_buf)
|
|
@@ -334,7 +338,7 @@ static int sun6i_spi_runtime_resume(struct device *dev)
|
|
}
|
|
|
|
sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG,
|
|
- SUN6I_GBL_CTL_BUS_ENABLE | SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
|
|
+ SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
|
|
|
|
return 0;
|
|
|
|
diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c
|
|
index fe707440f8c3b..9b24ebbba346d 100644
|
|
--- a/drivers/spi/spi-topcliff-pch.c
|
|
+++ b/drivers/spi/spi-topcliff-pch.c
|
|
@@ -585,8 +585,10 @@ static void pch_spi_set_tx(struct pch_spi_data *data, int *bpw)
|
|
data->pkt_tx_buff = kzalloc(size, GFP_KERNEL);
|
|
if (data->pkt_tx_buff != NULL) {
|
|
data->pkt_rx_buff = kzalloc(size, GFP_KERNEL);
|
|
- if (!data->pkt_rx_buff)
|
|
+ if (!data->pkt_rx_buff) {
|
|
kfree(data->pkt_tx_buff);
|
|
+ data->pkt_tx_buff = NULL;
|
|
+ }
|
|
}
|
|
|
|
if (!data->pkt_rx_buff) {
|
|
diff --git a/drivers/ssb/sdio.c b/drivers/ssb/sdio.c
|
|
index 2278e43614bd1..5e10514ef80c1 100644
|
|
--- a/drivers/ssb/sdio.c
|
|
+++ b/drivers/ssb/sdio.c
|
|
@@ -411,7 +411,6 @@ static void ssb_sdio_block_write(struct ssb_device *dev, const void *buffer,
|
|
sdio_claim_host(bus->host_sdio);
|
|
if (unlikely(ssb_sdio_switch_core(bus, dev))) {
|
|
error = -EIO;
|
|
- memset((void *)buffer, 0xff, count);
|
|
goto err_out;
|
|
}
|
|
offset |= bus->sdio_sbaddr & 0xffff;
|
|
diff --git a/drivers/staging/gdm724x/gdm_lte.c b/drivers/staging/gdm724x/gdm_lte.c
|
|
index e72dfa9699f3e..454e47424adea 100644
|
|
--- a/drivers/staging/gdm724x/gdm_lte.c
|
|
+++ b/drivers/staging/gdm724x/gdm_lte.c
|
|
@@ -624,10 +624,12 @@ static void gdm_lte_netif_rx(struct net_device *dev, char *buf,
|
|
* bytes (99,130,83,99 dec)
|
|
*/
|
|
} __packed;
|
|
- void *addr = buf + sizeof(struct iphdr) +
|
|
- sizeof(struct udphdr) +
|
|
- offsetof(struct dhcp_packet, chaddr);
|
|
- ether_addr_copy(nic->dest_mac_addr, addr);
|
|
+ int offset = sizeof(struct iphdr) +
|
|
+ sizeof(struct udphdr) +
|
|
+ offsetof(struct dhcp_packet, chaddr);
|
|
+ if (offset + ETH_ALEN > len)
|
|
+ return;
|
|
+ ether_addr_copy(nic->dest_mac_addr, buf + offset);
|
|
}
|
|
}
|
|
|
|
@@ -689,6 +691,7 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
struct multi_sdu *multi_sdu = (struct multi_sdu *)buf;
|
|
struct sdu *sdu = NULL;
|
|
u8 *data = (u8 *)multi_sdu->data;
|
|
+ int copied;
|
|
u16 i = 0;
|
|
u16 num_packet;
|
|
u16 hci_len;
|
|
@@ -702,6 +705,12 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
multi_sdu->num_packet);
|
|
|
|
for (i = 0; i < num_packet; i++) {
|
|
+ copied = data - multi_sdu->data;
|
|
+ if (len < copied + sizeof(*sdu)) {
|
|
+ pr_err("rx prevent buffer overflow");
|
|
+ return;
|
|
+ }
|
|
+
|
|
sdu = (struct sdu *)data;
|
|
|
|
cmd_evt = gdm_dev16_to_cpu(phy_dev->
|
|
@@ -715,7 +724,8 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
pr_err("rx sdu wrong hci %04x\n", cmd_evt);
|
|
return;
|
|
}
|
|
- if (hci_len < 12) {
|
|
+ if (hci_len < 12 ||
|
|
+ len < copied + sizeof(*sdu) + (hci_len - 12)) {
|
|
pr_err("rx sdu invalid len %d\n", hci_len);
|
|
return;
|
|
}
|
|
diff --git a/drivers/staging/media/s5p-cec/s5p_cec.c b/drivers/staging/media/s5p-cec/s5p_cec.c
|
|
index 58d7562311360..bebd44d9bd51a 100644
|
|
--- a/drivers/staging/media/s5p-cec/s5p_cec.c
|
|
+++ b/drivers/staging/media/s5p-cec/s5p_cec.c
|
|
@@ -54,7 +54,7 @@ static int s5p_cec_adap_enable(struct cec_adapter *adap, bool enable)
|
|
} else {
|
|
s5p_cec_mask_tx_interrupts(cec);
|
|
s5p_cec_mask_rx_interrupts(cec);
|
|
- pm_runtime_disable(cec->dev);
|
|
+ pm_runtime_put(cec->dev);
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c
|
|
index d6fd0e802ef51..37c7cea8c34f9 100644
|
|
--- a/drivers/tty/nozomi.c
|
|
+++ b/drivers/tty/nozomi.c
|
|
@@ -1437,7 +1437,7 @@ static int nozomi_card_init(struct pci_dev *pdev,
|
|
NOZOMI_NAME, dc);
|
|
if (unlikely(ret)) {
|
|
dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
|
|
- goto err_free_kfifo;
|
|
+ goto err_free_all_kfifo;
|
|
}
|
|
|
|
DBG1("base_addr: %p", dc->base_addr);
|
|
@@ -1475,12 +1475,15 @@ static int nozomi_card_init(struct pci_dev *pdev,
|
|
return 0;
|
|
|
|
err_free_tty:
|
|
- for (i = 0; i < MAX_PORT; ++i) {
|
|
+ for (i--; i >= 0; i--) {
|
|
tty_unregister_device(ntty_driver, dc->index_start + i);
|
|
tty_port_destroy(&dc->port[i].port);
|
|
}
|
|
+ free_irq(pdev->irq, dc);
|
|
+err_free_all_kfifo:
|
|
+ i = MAX_PORT;
|
|
err_free_kfifo:
|
|
- for (i = 0; i < MAX_PORT; i++)
|
|
+ for (i--; i >= PORT_MDM; i--)
|
|
kfifo_free(&dc->port[i].fifo_ul);
|
|
err_free_sbuf:
|
|
kfree(dc->send_buf);
|
|
diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
|
|
index 8106353ce7aa0..3747991024d51 100644
|
|
--- a/drivers/tty/serial/8250/serial_cs.c
|
|
+++ b/drivers/tty/serial/8250/serial_cs.c
|
|
@@ -305,6 +305,7 @@ static int serial_resume(struct pcmcia_device *link)
|
|
static int serial_probe(struct pcmcia_device *link)
|
|
{
|
|
struct serial_info *info;
|
|
+ int ret;
|
|
|
|
dev_dbg(&link->dev, "serial_attach()\n");
|
|
|
|
@@ -319,7 +320,15 @@ static int serial_probe(struct pcmcia_device *link)
|
|
if (do_sound)
|
|
link->config_flags |= CONF_ENABLE_SPKR;
|
|
|
|
- return serial_config(link);
|
|
+ ret = serial_config(link);
|
|
+ if (ret)
|
|
+ goto free_info;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+free_info:
|
|
+ kfree(info);
|
|
+ return ret;
|
|
}
|
|
|
|
static void serial_detach(struct pcmcia_device *link)
|
|
@@ -779,6 +788,7 @@ static const struct pcmcia_device_id serial_ids[] = {
|
|
PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
|
|
PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
|
|
PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
|
|
+ PCMCIA_DEVICE_PROD_ID12("Option International", "GSM-Ready 56K/ISDN", 0x9d7cd6f5, 0xb23844aa),
|
|
PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
|
|
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
|
|
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
|
|
@@ -806,7 +816,6 @@ static const struct pcmcia_device_id serial_ids[] = {
|
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
|
|
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
|
|
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
|
|
- PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100 1.00.", 0x19ca78af, 0xf964f42b),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100", 0x19ca78af, 0x71d98e83),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL232 1.00.", 0x19ca78af, 0x69fb7490),
|
|
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
|
|
index 5b6093dc3ff26..a4c1797e30d71 100644
|
|
--- a/drivers/tty/serial/fsl_lpuart.c
|
|
+++ b/drivers/tty/serial/fsl_lpuart.c
|
|
@@ -1766,6 +1766,9 @@ lpuart32_console_get_options(struct lpuart_port *sport, int *baud,
|
|
|
|
bd = lpuart32_read(sport->port.membase + UARTBAUD);
|
|
bd &= UARTBAUD_SBR_MASK;
|
|
+ if (!bd)
|
|
+ return;
|
|
+
|
|
sbr = bd;
|
|
uartclk = clk_get_rate(sport->clk);
|
|
/*
|
|
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
|
|
index ea35f51442378..b4f528d26bf1a 100644
|
|
--- a/drivers/tty/serial/sh-sci.c
|
|
+++ b/drivers/tty/serial/sh-sci.c
|
|
@@ -612,6 +612,14 @@ static void sci_stop_tx(struct uart_port *port)
|
|
ctrl &= ~SCSCR_TIE;
|
|
|
|
serial_port_out(port, SCSCR, ctrl);
|
|
+
|
|
+#ifdef CONFIG_SERIAL_SH_SCI_DMA
|
|
+ if (to_sci_port(port)->chan_tx &&
|
|
+ !dma_submit_error(to_sci_port(port)->cookie_tx)) {
|
|
+ dmaengine_terminate_async(to_sci_port(port)->chan_tx);
|
|
+ to_sci_port(port)->cookie_tx = -EINVAL;
|
|
+ }
|
|
+#endif
|
|
}
|
|
|
|
static void sci_start_rx(struct uart_port *port)
|
|
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
|
|
index a70d2341ada63..23df1549eb0d8 100644
|
|
--- a/drivers/usb/class/cdc-acm.c
|
|
+++ b/drivers/usb/class/cdc-acm.c
|
|
@@ -1894,6 +1894,11 @@ static const struct usb_device_id acm_ids[] = {
|
|
.driver_info = IGNORE_DEVICE,
|
|
},
|
|
|
|
+ /* Exclude Heimann Sensor GmbH USB appset demo */
|
|
+ { USB_DEVICE(0x32a7, 0x0000),
|
|
+ .driver_info = IGNORE_DEVICE,
|
|
+ },
|
|
+
|
|
/* control interfaces without any protocol set */
|
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
|
USB_CDC_PROTO_NONE) },
|
|
diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
|
|
index 5abc27f12a418..b8fcc202e0a35 100644
|
|
--- a/drivers/usb/gadget/function/f_eem.c
|
|
+++ b/drivers/usb/gadget/function/f_eem.c
|
|
@@ -34,6 +34,11 @@ struct f_eem {
|
|
u8 ctrl_id;
|
|
};
|
|
|
|
+struct in_context {
|
|
+ struct sk_buff *skb;
|
|
+ struct usb_ep *ep;
|
|
+};
|
|
+
|
|
static inline struct f_eem *func_to_eem(struct usb_function *f)
|
|
{
|
|
return container_of(f, struct f_eem, port.func);
|
|
@@ -327,9 +332,12 @@ fail:
|
|
|
|
static void eem_cmd_complete(struct usb_ep *ep, struct usb_request *req)
|
|
{
|
|
- struct sk_buff *skb = (struct sk_buff *)req->context;
|
|
+ struct in_context *ctx = req->context;
|
|
|
|
- dev_kfree_skb_any(skb);
|
|
+ dev_kfree_skb_any(ctx->skb);
|
|
+ kfree(req->buf);
|
|
+ usb_ep_free_request(ctx->ep, req);
|
|
+ kfree(ctx);
|
|
}
|
|
|
|
/*
|
|
@@ -417,7 +425,9 @@ static int eem_unwrap(struct gether *port,
|
|
* b15: bmType (0 == data, 1 == command)
|
|
*/
|
|
if (header & BIT(15)) {
|
|
- struct usb_request *req = cdev->req;
|
|
+ struct usb_request *req;
|
|
+ struct in_context *ctx;
|
|
+ struct usb_ep *ep;
|
|
u16 bmEEMCmd;
|
|
|
|
/* EEM command packet format:
|
|
@@ -446,11 +456,36 @@ static int eem_unwrap(struct gether *port,
|
|
skb_trim(skb2, len);
|
|
put_unaligned_le16(BIT(15) | BIT(11) | len,
|
|
skb_push(skb2, 2));
|
|
+
|
|
+ ep = port->in_ep;
|
|
+ req = usb_ep_alloc_request(ep, GFP_ATOMIC);
|
|
+ if (!req) {
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+
|
|
+ req->buf = kmalloc(skb2->len, GFP_KERNEL);
|
|
+ if (!req->buf) {
|
|
+ usb_ep_free_request(ep, req);
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+
|
|
+ ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
|
|
+ if (!ctx) {
|
|
+ kfree(req->buf);
|
|
+ usb_ep_free_request(ep, req);
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+ ctx->skb = skb2;
|
|
+ ctx->ep = ep;
|
|
+
|
|
skb_copy_bits(skb2, 0, req->buf, skb2->len);
|
|
req->length = skb2->len;
|
|
req->complete = eem_cmd_complete;
|
|
req->zero = 1;
|
|
- req->context = skb2;
|
|
+ req->context = ctx;
|
|
if (usb_ep_queue(port->in_ep, req, GFP_ATOMIC))
|
|
DBG(cdev, "echo response queue fail\n");
|
|
break;
|
|
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
|
|
index 42e5677d932d8..dd415b1589b5c 100644
|
|
--- a/drivers/usb/gadget/function/f_hid.c
|
|
+++ b/drivers/usb/gadget/function/f_hid.c
|
|
@@ -91,7 +91,7 @@ static struct usb_interface_descriptor hidg_interface_desc = {
|
|
static struct hid_descriptor hidg_desc = {
|
|
.bLength = sizeof hidg_desc,
|
|
.bDescriptorType = HID_DT_HID,
|
|
- .bcdHID = 0x0101,
|
|
+ .bcdHID = cpu_to_le16(0x0101),
|
|
.bCountryCode = 0x00,
|
|
.bNumDescriptors = 0x1,
|
|
/*.desc[0].bDescriptorType = DYNAMIC */
|
|
diff --git a/drivers/usb/gadget/legacy/hid.c b/drivers/usb/gadget/legacy/hid.c
|
|
index a71a884f79fc7..cccbb948821b2 100644
|
|
--- a/drivers/usb/gadget/legacy/hid.c
|
|
+++ b/drivers/usb/gadget/legacy/hid.c
|
|
@@ -175,8 +175,10 @@ static int hid_bind(struct usb_composite_dev *cdev)
|
|
struct usb_descriptor_header *usb_desc;
|
|
|
|
usb_desc = usb_otg_descriptor_alloc(gadget);
|
|
- if (!usb_desc)
|
|
+ if (!usb_desc) {
|
|
+ status = -ENOMEM;
|
|
goto put;
|
|
+ }
|
|
usb_otg_descriptor_init(gadget, usb_desc);
|
|
otg_desc[0] = usb_desc;
|
|
otg_desc[1] = NULL;
|
|
diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c
|
|
index 1771220b2437f..90a24b9752405 100644
|
|
--- a/drivers/video/backlight/lm3630a_bl.c
|
|
+++ b/drivers/video/backlight/lm3630a_bl.c
|
|
@@ -183,7 +183,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl)
|
|
if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) {
|
|
lm3630a_pwm_ctrl(pchip, bl->props.brightness,
|
|
bl->props.max_brightness);
|
|
- return bl->props.brightness;
|
|
+ return 0;
|
|
}
|
|
|
|
/* disable sleep */
|
|
@@ -203,8 +203,8 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl)
|
|
return 0;
|
|
|
|
out_i2c_err:
|
|
- dev_err(pchip->dev, "i2c failed to access\n");
|
|
- return bl->props.brightness;
|
|
+ dev_err(pchip->dev, "i2c failed to access (%pe)\n", ERR_PTR(ret));
|
|
+ return ret;
|
|
}
|
|
|
|
static int lm3630a_bank_a_get_brightness(struct backlight_device *bl)
|
|
@@ -260,7 +260,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl)
|
|
if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) {
|
|
lm3630a_pwm_ctrl(pchip, bl->props.brightness,
|
|
bl->props.max_brightness);
|
|
- return bl->props.brightness;
|
|
+ return 0;
|
|
}
|
|
|
|
/* disable sleep */
|
|
@@ -280,8 +280,8 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl)
|
|
return 0;
|
|
|
|
out_i2c_err:
|
|
- dev_err(pchip->dev, "i2c failed to access REG_CTRL\n");
|
|
- return bl->props.brightness;
|
|
+ dev_err(pchip->dev, "i2c failed to access (%pe)\n", ERR_PTR(ret));
|
|
+ return ret;
|
|
}
|
|
|
|
static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)
|
|
diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
|
|
index f5ad8023c2e6a..1c47e6345b57e 100644
|
|
--- a/drivers/watchdog/aspeed_wdt.c
|
|
+++ b/drivers/watchdog/aspeed_wdt.c
|
|
@@ -100,7 +100,7 @@ static int aspeed_wdt_set_timeout(struct watchdog_device *wdd,
|
|
|
|
wdd->timeout = timeout;
|
|
|
|
- actual = min(timeout, wdd->max_hw_heartbeat_ms * 1000);
|
|
+ actual = min(timeout, wdd->max_hw_heartbeat_ms / 1000);
|
|
|
|
writel(actual * WDT_RATE_1MHZ, wdt->base + WDT_RELOAD_VALUE);
|
|
writel(WDT_RESTART_MAGIC, wdt->base + WDT_RESTART);
|
|
diff --git a/drivers/watchdog/lpc18xx_wdt.c b/drivers/watchdog/lpc18xx_wdt.c
|
|
index fd171e6caa167..1b63d1d85aa0e 100644
|
|
--- a/drivers/watchdog/lpc18xx_wdt.c
|
|
+++ b/drivers/watchdog/lpc18xx_wdt.c
|
|
@@ -300,7 +300,7 @@ static int lpc18xx_wdt_remove(struct platform_device *pdev)
|
|
struct lpc18xx_wdt_dev *lpc18xx_wdt = platform_get_drvdata(pdev);
|
|
|
|
dev_warn(&pdev->dev, "I quit now, hardware will probably reboot!\n");
|
|
- del_timer(&lpc18xx_wdt->timer);
|
|
+ del_timer_sync(&lpc18xx_wdt->timer);
|
|
|
|
watchdog_unregister_device(&lpc18xx_wdt->wdt_dev);
|
|
clk_disable_unprepare(lpc18xx_wdt->wdt_clk);
|
|
diff --git a/drivers/watchdog/sbc60xxwdt.c b/drivers/watchdog/sbc60xxwdt.c
|
|
index 2eef58a0cf059..152db059d5aa1 100644
|
|
--- a/drivers/watchdog/sbc60xxwdt.c
|
|
+++ b/drivers/watchdog/sbc60xxwdt.c
|
|
@@ -152,7 +152,7 @@ static void wdt_startup(void)
|
|
static void wdt_turnoff(void)
|
|
{
|
|
/* Stop the timer */
|
|
- del_timer(&timer);
|
|
+ del_timer_sync(&timer);
|
|
inb_p(wdt_stop);
|
|
pr_info("Watchdog timer is now disabled...\n");
|
|
}
|
|
diff --git a/drivers/watchdog/sc520_wdt.c b/drivers/watchdog/sc520_wdt.c
|
|
index 1cfd3f6a13d5f..08500db8324f3 100644
|
|
--- a/drivers/watchdog/sc520_wdt.c
|
|
+++ b/drivers/watchdog/sc520_wdt.c
|
|
@@ -190,7 +190,7 @@ static int wdt_startup(void)
|
|
static int wdt_turnoff(void)
|
|
{
|
|
/* Stop the timer */
|
|
- del_timer(&timer);
|
|
+ del_timer_sync(&timer);
|
|
|
|
/* Stop the watchdog */
|
|
wdt_config(0);
|
|
diff --git a/drivers/watchdog/w83877f_wdt.c b/drivers/watchdog/w83877f_wdt.c
|
|
index f0483c75ed324..4b52cf321747e 100644
|
|
--- a/drivers/watchdog/w83877f_wdt.c
|
|
+++ b/drivers/watchdog/w83877f_wdt.c
|
|
@@ -170,7 +170,7 @@ static void wdt_startup(void)
|
|
static void wdt_turnoff(void)
|
|
{
|
|
/* Stop the timer */
|
|
- del_timer(&timer);
|
|
+ del_timer_sync(&timer);
|
|
|
|
wdt_change(WDT_DISABLE);
|
|
|
|
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
|
|
index 80e9c18ea64f6..fd6b67c40d9dd 100644
|
|
--- a/fs/btrfs/Kconfig
|
|
+++ b/fs/btrfs/Kconfig
|
|
@@ -9,6 +9,8 @@ config BTRFS_FS
|
|
select RAID6_PQ
|
|
select XOR_BLOCKS
|
|
select SRCU
|
|
+ depends on !PPC_256K_PAGES # powerpc
|
|
+ depends on !PAGE_SIZE_256KB # hexagon
|
|
|
|
help
|
|
Btrfs is a general purpose copy-on-write filesystem with extents,
|
|
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
|
|
index 4d8f8a8c9c908..29e75fba53765 100644
|
|
--- a/fs/btrfs/delayed-inode.c
|
|
+++ b/fs/btrfs/delayed-inode.c
|
|
@@ -1076,6 +1076,14 @@ err_out:
|
|
btrfs_delayed_inode_release_metadata(root, node);
|
|
btrfs_release_delayed_inode(node);
|
|
|
|
+ /*
|
|
+ * If we fail to update the delayed inode we need to abort the
|
|
+ * transaction, because we could leave the inode with the improper
|
|
+ * counts behind.
|
|
+ */
|
|
+ if (ret && ret != -ENOENT)
|
|
+ btrfs_abort_transaction(trans, ret);
|
|
+
|
|
return ret;
|
|
|
|
search:
|
|
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
|
|
index 31df020634cdd..d0fbe49420fc1 100644
|
|
--- a/fs/btrfs/transaction.c
|
|
+++ b/fs/btrfs/transaction.c
|
|
@@ -1287,8 +1287,10 @@ int btrfs_defrag_root(struct btrfs_root *root)
|
|
|
|
while (1) {
|
|
trans = btrfs_start_transaction(root, 0);
|
|
- if (IS_ERR(trans))
|
|
- return PTR_ERR(trans);
|
|
+ if (IS_ERR(trans)) {
|
|
+ ret = PTR_ERR(trans);
|
|
+ break;
|
|
+ }
|
|
|
|
ret = btrfs_defrag_leaves(trans, root);
|
|
|
|
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
|
|
index 36aa6d8cdff71..9791de2dc7734 100644
|
|
--- a/fs/ceph/addr.c
|
|
+++ b/fs/ceph/addr.c
|
|
@@ -72,10 +72,6 @@ static int ceph_set_page_dirty(struct page *page)
|
|
struct inode *inode;
|
|
struct ceph_inode_info *ci;
|
|
struct ceph_snap_context *snapc;
|
|
- int ret;
|
|
-
|
|
- if (unlikely(!mapping))
|
|
- return !TestSetPageDirty(page);
|
|
|
|
if (PageDirty(page)) {
|
|
dout("%p set_page_dirty %p idx %lu -- already dirty\n",
|
|
@@ -121,11 +117,7 @@ static int ceph_set_page_dirty(struct page *page)
|
|
page->private = (unsigned long)snapc;
|
|
SetPagePrivate(page);
|
|
|
|
- ret = __set_page_dirty_nobuffers(page);
|
|
- WARN_ON(!PageLocked(page));
|
|
- WARN_ON(!page->mapping);
|
|
-
|
|
- return ret;
|
|
+ return __set_page_dirty_nobuffers(page);
|
|
}
|
|
|
|
/*
|
|
diff --git a/fs/configfs/file.c b/fs/configfs/file.c
|
|
index 896e90dc91936..71f665eb03160 100644
|
|
--- a/fs/configfs/file.c
|
|
+++ b/fs/configfs/file.c
|
|
@@ -496,13 +496,13 @@ static int configfs_release_bin_file(struct inode *inode, struct file *filp)
|
|
len = bin_attr->write(item, buffer->bin_buffer,
|
|
buffer->bin_buffer_size);
|
|
|
|
- /* vfree on NULL is safe */
|
|
- vfree(buffer->bin_buffer);
|
|
- buffer->bin_buffer = NULL;
|
|
- buffer->bin_buffer_size = 0;
|
|
- buffer->needs_read_fill = 1;
|
|
}
|
|
|
|
+ vfree(buffer->bin_buffer);
|
|
+ buffer->bin_buffer = NULL;
|
|
+ buffer->bin_buffer_size = 0;
|
|
+ buffer->needs_read_fill = 1;
|
|
+
|
|
ret = configfs_release(inode, filp);
|
|
if (len < 0)
|
|
return len;
|
|
diff --git a/fs/dlm/config.c b/fs/dlm/config.c
|
|
index 6def89d2209d3..10d25b7830bfa 100644
|
|
--- a/fs/dlm/config.c
|
|
+++ b/fs/dlm/config.c
|
|
@@ -80,6 +80,9 @@ struct dlm_cluster {
|
|
unsigned int cl_new_rsb_count;
|
|
unsigned int cl_recover_callbacks;
|
|
char cl_cluster_name[DLM_LOCKSPACE_LEN];
|
|
+
|
|
+ struct dlm_spaces *sps;
|
|
+ struct dlm_comms *cms;
|
|
};
|
|
|
|
static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
|
|
@@ -356,6 +359,9 @@ static struct config_group *make_cluster(struct config_group *g,
|
|
if (!cl || !sps || !cms)
|
|
goto fail;
|
|
|
|
+ cl->sps = sps;
|
|
+ cl->cms = cms;
|
|
+
|
|
config_group_init_type_name(&cl->group, name, &cluster_type);
|
|
config_group_init_type_name(&sps->ss_group, "spaces", &spaces_type);
|
|
config_group_init_type_name(&cms->cs_group, "comms", &comms_type);
|
|
@@ -405,6 +411,9 @@ static void drop_cluster(struct config_group *g, struct config_item *i)
|
|
static void release_cluster(struct config_item *i)
|
|
{
|
|
struct dlm_cluster *cl = config_item_to_cluster(i);
|
|
+
|
|
+ kfree(cl->sps);
|
|
+ kfree(cl->cms);
|
|
kfree(cl);
|
|
}
|
|
|
|
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
|
|
index 609998de533e8..0d8aaf9c61be6 100644
|
|
--- a/fs/dlm/lowcomms.c
|
|
+++ b/fs/dlm/lowcomms.c
|
|
@@ -599,7 +599,7 @@ static void close_connection(struct connection *con, bool and_other,
|
|
}
|
|
if (con->othercon && and_other) {
|
|
/* Will only re-enter once. */
|
|
- close_connection(con->othercon, false, true, true);
|
|
+ close_connection(con->othercon, false, tx, rx);
|
|
}
|
|
if (con->rx_page) {
|
|
__free_page(con->rx_page);
|
|
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
|
index e2f31aee67c28..d195f41071d8c 100644
|
|
--- a/fs/ext4/extents.c
|
|
+++ b/fs/ext4/extents.c
|
|
@@ -870,6 +870,7 @@ int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
|
|
eh->eh_entries = 0;
|
|
eh->eh_magic = EXT4_EXT_MAGIC;
|
|
eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
|
|
+ eh->eh_generation = 0;
|
|
ext4_mark_inode_dirty(handle, inode);
|
|
return 0;
|
|
}
|
|
@@ -1126,6 +1127,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
|
neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0));
|
|
neh->eh_magic = EXT4_EXT_MAGIC;
|
|
neh->eh_depth = 0;
|
|
+ neh->eh_generation = 0;
|
|
|
|
/* move remainder of path[depth] to the new leaf */
|
|
if (unlikely(path[depth].p_hdr->eh_entries !=
|
|
@@ -1203,6 +1205,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
|
neh->eh_magic = EXT4_EXT_MAGIC;
|
|
neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0));
|
|
neh->eh_depth = cpu_to_le16(depth - i);
|
|
+ neh->eh_generation = 0;
|
|
fidx = EXT_FIRST_INDEX(neh);
|
|
fidx->ei_block = border;
|
|
ext4_idx_store_pblock(fidx, oldblock);
|
|
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
|
|
index 37e059202cd2f..ce0f58c84b0ad 100644
|
|
--- a/fs/ext4/extents_status.c
|
|
+++ b/fs/ext4/extents_status.c
|
|
@@ -1080,11 +1080,9 @@ static unsigned long ext4_es_scan(struct shrinker *shrink,
|
|
ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
|
|
trace_ext4_es_shrink_scan_enter(sbi->s_sb, nr_to_scan, ret);
|
|
|
|
- if (!nr_to_scan)
|
|
- return ret;
|
|
-
|
|
nr_shrunk = __es_shrink(sbi, nr_to_scan, NULL);
|
|
|
|
+ ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
|
|
trace_ext4_es_shrink_scan_exit(sbi->s_sb, nr_shrunk, ret);
|
|
return nr_shrunk;
|
|
}
|
|
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
|
|
index 11ebd274b7c00..4966c6d24ad2c 100644
|
|
--- a/fs/ext4/ialloc.c
|
|
+++ b/fs/ext4/ialloc.c
|
|
@@ -405,7 +405,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
|
*
|
|
* We always try to spread first-level directories.
|
|
*
|
|
- * If there are blockgroups with both free inodes and free blocks counts
|
|
+ * If there are blockgroups with both free inodes and free clusters counts
|
|
* not worse than average we return one with smallest directory count.
|
|
* Otherwise we simply return a random group.
|
|
*
|
|
@@ -414,7 +414,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
|
* It's OK to put directory into a group unless
|
|
* it has too many directories already (max_dirs) or
|
|
* it has too few free inodes left (min_inodes) or
|
|
- * it has too few free blocks left (min_blocks) or
|
|
+ * it has too few free clusters left (min_clusters) or
|
|
* Parent's group is preferred, if it doesn't satisfy these
|
|
* conditions we search cyclically through the rest. If none
|
|
* of the groups look good we just look for a group with more
|
|
@@ -430,7 +430,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
|
ext4_group_t real_ngroups = ext4_get_groups_count(sb);
|
|
int inodes_per_group = EXT4_INODES_PER_GROUP(sb);
|
|
unsigned int freei, avefreei, grp_free;
|
|
- ext4_fsblk_t freeb, avefreec;
|
|
+ ext4_fsblk_t freec, avefreec;
|
|
unsigned int ndirs;
|
|
int max_dirs, min_inodes;
|
|
ext4_grpblk_t min_clusters;
|
|
@@ -449,9 +449,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
|
|
|
freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
|
|
avefreei = freei / ngroups;
|
|
- freeb = EXT4_C2B(sbi,
|
|
- percpu_counter_read_positive(&sbi->s_freeclusters_counter));
|
|
- avefreec = freeb;
|
|
+ freec = percpu_counter_read_positive(&sbi->s_freeclusters_counter);
|
|
+ avefreec = freec;
|
|
do_div(avefreec, ngroups);
|
|
ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
|
|
|
|
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
|
|
index 2de656ecc48bb..e7815bebaeb85 100644
|
|
--- a/fs/fs-writeback.c
|
|
+++ b/fs/fs-writeback.c
|
|
@@ -512,9 +512,14 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)
|
|
/* find and pin the new wb */
|
|
rcu_read_lock();
|
|
memcg_css = css_from_id(new_wb_id, &memory_cgrp_subsys);
|
|
- if (memcg_css)
|
|
- isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
|
|
+ if (memcg_css && !css_tryget(memcg_css))
|
|
+ memcg_css = NULL;
|
|
rcu_read_unlock();
|
|
+ if (!memcg_css)
|
|
+ goto out_free;
|
|
+
|
|
+ isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
|
|
+ css_put(memcg_css);
|
|
if (!isw->new_wb)
|
|
goto out_free;
|
|
|
|
@@ -2088,28 +2093,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
|
|
return ret;
|
|
}
|
|
|
|
-static noinline void block_dump___mark_inode_dirty(struct inode *inode)
|
|
-{
|
|
- if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) {
|
|
- struct dentry *dentry;
|
|
- const char *name = "?";
|
|
-
|
|
- dentry = d_find_alias(inode);
|
|
- if (dentry) {
|
|
- spin_lock(&dentry->d_lock);
|
|
- name = (const char *) dentry->d_name.name;
|
|
- }
|
|
- printk(KERN_DEBUG
|
|
- "%s(%d): dirtied inode %lu (%s) on %s\n",
|
|
- current->comm, task_pid_nr(current), inode->i_ino,
|
|
- name, inode->i_sb->s_id);
|
|
- if (dentry) {
|
|
- spin_unlock(&dentry->d_lock);
|
|
- dput(dentry);
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
/**
|
|
* __mark_inode_dirty - internal function
|
|
* @inode: inode to mark
|
|
@@ -2151,9 +2151,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
|
|
(dirtytime && (inode->i_state & I_DIRTY_INODE)))
|
|
return;
|
|
|
|
- if (unlikely(block_dump > 1))
|
|
- block_dump___mark_inode_dirty(inode);
|
|
-
|
|
spin_lock(&inode->i_lock);
|
|
if (dirtytime && (inode->i_state & I_DIRTY_INODE))
|
|
goto out_unlock_inode;
|
|
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
|
|
index 33c90e24f91aa..d21e41735805d 100644
|
|
--- a/fs/fuse/dev.c
|
|
+++ b/fs/fuse/dev.c
|
|
@@ -1298,6 +1298,15 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
|
|
goto restart;
|
|
}
|
|
spin_lock(&fpq->lock);
|
|
+ /*
|
|
+ * Must not put request on fpq->io queue after having been shut down by
|
|
+ * fuse_abort_conn()
|
|
+ */
|
|
+ if (!fpq->connected) {
|
|
+ req->out.h.error = err = -ECONNABORTED;
|
|
+ goto out_end;
|
|
+
|
|
+ }
|
|
list_add(&req->list, &fpq->io);
|
|
spin_unlock(&fpq->lock);
|
|
cs->req = req;
|
|
@@ -1874,7 +1883,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
|
|
}
|
|
|
|
err = -EINVAL;
|
|
- if (oh.error <= -1000 || oh.error > 0)
|
|
+ if (oh.error <= -512 || oh.error > 0)
|
|
goto err_finish;
|
|
|
|
spin_lock(&fpq->lock);
|
|
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c
|
|
index 054cc761b426f..87b41edc800d0 100644
|
|
--- a/fs/jfs/inode.c
|
|
+++ b/fs/jfs/inode.c
|
|
@@ -161,7 +161,8 @@ void jfs_evict_inode(struct inode *inode)
|
|
if (test_cflag(COMMIT_Freewmap, inode))
|
|
jfs_free_zero_link(inode);
|
|
|
|
- diFree(inode);
|
|
+ if (JFS_SBI(inode->i_sb)->ipimap)
|
|
+ diFree(inode);
|
|
|
|
/*
|
|
* Free the inode from the quota allocation.
|
|
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
|
|
index a21ea8b3e5fa6..12555c4eeb2b6 100644
|
|
--- a/fs/jfs/jfs_logmgr.c
|
|
+++ b/fs/jfs/jfs_logmgr.c
|
|
@@ -1338,6 +1338,7 @@ int lmLogInit(struct jfs_log * log)
|
|
} else {
|
|
if (memcmp(logsuper->uuid, log->uuid, 16)) {
|
|
jfs_warn("wrong uuid on JFS log device");
|
|
+ rc = -EINVAL;
|
|
goto errout20;
|
|
}
|
|
log->size = le32_to_cpu(logsuper->size);
|
|
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
|
|
index dc925b531f326..41bda33b630f2 100644
|
|
--- a/fs/nfs/nfs3proc.c
|
|
+++ b/fs/nfs/nfs3proc.c
|
|
@@ -363,7 +363,7 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
|
break;
|
|
|
|
case NFS3_CREATE_UNCHECKED:
|
|
- goto out;
|
|
+ goto out_release_acls;
|
|
}
|
|
nfs_fattr_init(data->res.dir_attr);
|
|
nfs_fattr_init(data->res.fattr);
|
|
@@ -708,7 +708,7 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
|
break;
|
|
default:
|
|
status = -EINVAL;
|
|
- goto out;
|
|
+ goto out_release_acls;
|
|
}
|
|
|
|
status = nfs3_do_create(dir, dentry, data);
|
|
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
|
|
index a4fa548785d60..8cd134750ebb0 100644
|
|
--- a/fs/ntfs/inode.c
|
|
+++ b/fs/ntfs/inode.c
|
|
@@ -502,7 +502,7 @@ err_corrupt_attr:
|
|
}
|
|
file_name_attr = (FILE_NAME_ATTR*)((u8*)attr +
|
|
le16_to_cpu(attr->data.resident.value_offset));
|
|
- p2 = (u8*)attr + le32_to_cpu(attr->data.resident.value_length);
|
|
+ p2 = (u8 *)file_name_attr + le32_to_cpu(attr->data.resident.value_length);
|
|
if (p2 < (u8*)attr || p2 > p)
|
|
goto err_corrupt_attr;
|
|
/* This attribute is ok, but is it in the $Extend directory? */
|
|
diff --git a/fs/ocfs2/filecheck.c b/fs/ocfs2/filecheck.c
|
|
index 2cabbcf2f28ee..5571268b681c8 100644
|
|
--- a/fs/ocfs2/filecheck.c
|
|
+++ b/fs/ocfs2/filecheck.c
|
|
@@ -431,11 +431,7 @@ static ssize_t ocfs2_filecheck_show(struct kobject *kobj,
|
|
ret = snprintf(buf + total, remain, "%lu\t\t%u\t%s\n",
|
|
p->fe_ino, p->fe_done,
|
|
ocfs2_filecheck_error(p->fe_status));
|
|
- if (ret < 0) {
|
|
- total = ret;
|
|
- break;
|
|
- }
|
|
- if (ret == remain) {
|
|
+ if (ret >= remain) {
|
|
/* snprintf() didn't fit */
|
|
total = -E2BIG;
|
|
break;
|
|
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c
|
|
index 52c07346bea3f..03e1c6cd6f3c8 100644
|
|
--- a/fs/ocfs2/stackglue.c
|
|
+++ b/fs/ocfs2/stackglue.c
|
|
@@ -510,11 +510,7 @@ static ssize_t ocfs2_loaded_cluster_plugins_show(struct kobject *kobj,
|
|
list_for_each_entry(p, &ocfs2_stack_list, sp_list) {
|
|
ret = snprintf(buf, remain, "%s\n",
|
|
p->sp_name);
|
|
- if (ret < 0) {
|
|
- total = ret;
|
|
- break;
|
|
- }
|
|
- if (ret == remain) {
|
|
+ if (ret >= remain) {
|
|
/* snprintf() didn't fit */
|
|
total = -E2BIG;
|
|
break;
|
|
@@ -541,7 +537,7 @@ static ssize_t ocfs2_active_cluster_plugin_show(struct kobject *kobj,
|
|
if (active_stack) {
|
|
ret = snprintf(buf, PAGE_SIZE, "%s\n",
|
|
active_stack->sp_name);
|
|
- if (ret == PAGE_SIZE)
|
|
+ if (ret >= PAGE_SIZE)
|
|
ret = -E2BIG;
|
|
}
|
|
spin_unlock(&ocfs2_stack_lock);
|
|
diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c
|
|
index 6e35ef6521b4e..8972ebc87016b 100644
|
|
--- a/fs/orangefs/super.c
|
|
+++ b/fs/orangefs/super.c
|
|
@@ -185,7 +185,7 @@ static int orangefs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|
buf->f_bavail = (sector_t) new_op->downcall.resp.statfs.blocks_avail;
|
|
buf->f_files = (sector_t) new_op->downcall.resp.statfs.files_total;
|
|
buf->f_ffree = (sector_t) new_op->downcall.resp.statfs.files_avail;
|
|
- buf->f_frsize = sb->s_blocksize;
|
|
+ buf->f_frsize = 0;
|
|
|
|
out_op_release:
|
|
op_release(new_op);
|
|
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
|
|
index 2a5c4813c47d3..94871f611fa8e 100644
|
|
--- a/fs/reiserfs/journal.c
|
|
+++ b/fs/reiserfs/journal.c
|
|
@@ -2766,6 +2766,20 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
|
|
goto free_and_return;
|
|
}
|
|
|
|
+ /*
|
|
+ * Sanity check to see if journal first block is correct.
|
|
+ * If journal first block is invalid it can cause
|
|
+ * zeroing important superblock members.
|
|
+ */
|
|
+ if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
|
|
+ SB_ONDISK_JOURNAL_1st_BLOCK(sb) < SB_JOURNAL_1st_RESERVED_BLOCK(sb)) {
|
|
+ reiserfs_warning(sb, "journal-1393",
|
|
+ "journal 1st super block is invalid: 1st reserved block %d, but actual 1st block is %d",
|
|
+ SB_JOURNAL_1st_RESERVED_BLOCK(sb),
|
|
+ SB_ONDISK_JOURNAL_1st_BLOCK(sb));
|
|
+ goto free_and_return;
|
|
+ }
|
|
+
|
|
if (journal_init_dev(sb, journal, j_dev_name) != 0) {
|
|
reiserfs_warning(sb, "sh-462",
|
|
"unable to initialize journal device");
|
|
diff --git a/fs/seq_file.c b/fs/seq_file.c
|
|
index 368bfb92b115c..3ade39e02bb73 100644
|
|
--- a/fs/seq_file.c
|
|
+++ b/fs/seq_file.c
|
|
@@ -28,6 +28,9 @@ static void *seq_buf_alloc(unsigned long size)
|
|
void *buf;
|
|
gfp_t gfp = GFP_KERNEL;
|
|
|
|
+ if (unlikely(size > MAX_RW_COUNT))
|
|
+ return NULL;
|
|
+
|
|
/*
|
|
* For high order allocations, use __GFP_NORETRY to avoid oom-killing -
|
|
* it's better to fall back to vmalloc() than to kill things. For small
|
|
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
|
|
index 87ab02e2d6661..56eed54633cf2 100644
|
|
--- a/fs/ubifs/dir.c
|
|
+++ b/fs/ubifs/dir.c
|
|
@@ -1144,7 +1144,10 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
return err;
|
|
}
|
|
|
|
+ spin_lock(&whiteout->i_lock);
|
|
whiteout->i_state |= I_LINKABLE;
|
|
+ spin_unlock(&whiteout->i_lock);
|
|
+
|
|
whiteout_ui = ubifs_inode(whiteout);
|
|
whiteout_ui->data = dev;
|
|
whiteout_ui->data_len = ubifs_encode_dev(dev, MKDEV(0, 0));
|
|
@@ -1239,7 +1242,11 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
|
|
inc_nlink(whiteout);
|
|
mark_inode_dirty(whiteout);
|
|
+
|
|
+ spin_lock(&whiteout->i_lock);
|
|
whiteout->i_state &= ~I_LINKABLE;
|
|
+ spin_unlock(&whiteout->i_lock);
|
|
+
|
|
iput(whiteout);
|
|
}
|
|
|
|
diff --git a/fs/udf/namei.c b/fs/udf/namei.c
|
|
index 348b922d1b6a5..bfa53dead8c8a 100644
|
|
--- a/fs/udf/namei.c
|
|
+++ b/fs/udf/namei.c
|
|
@@ -956,6 +956,10 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
|
|
iinfo->i_location.partitionReferenceNum,
|
|
0);
|
|
epos.bh = udf_tgetblk(sb, block);
|
|
+ if (unlikely(!epos.bh)) {
|
|
+ err = -ENOMEM;
|
|
+ goto out_no_entry;
|
|
+ }
|
|
lock_buffer(epos.bh);
|
|
memset(epos.bh->b_data, 0x00, bsize);
|
|
set_buffer_uptodate(epos.bh);
|
|
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h
|
|
index 5203560f992e4..000c049a75f7c 100644
|
|
--- a/include/crypto/internal/hash.h
|
|
+++ b/include/crypto/internal/hash.h
|
|
@@ -80,13 +80,7 @@ int ahash_register_instance(struct crypto_template *tmpl,
|
|
struct ahash_instance *inst);
|
|
void ahash_free_instance(struct crypto_instance *inst);
|
|
|
|
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
- unsigned int keylen);
|
|
-
|
|
-static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
|
|
-{
|
|
- return alg->setkey != shash_no_setkey;
|
|
-}
|
|
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg);
|
|
|
|
bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg);
|
|
|
|
diff --git a/include/linux/mfd/abx500/ux500_chargalg.h b/include/linux/mfd/abx500/ux500_chargalg.h
|
|
index 67703f23e7ba2..821a3b9bc16e1 100644
|
|
--- a/include/linux/mfd/abx500/ux500_chargalg.h
|
|
+++ b/include/linux/mfd/abx500/ux500_chargalg.h
|
|
@@ -15,7 +15,7 @@
|
|
* - POWER_SUPPLY_TYPE_USB,
|
|
* because only them store as drv_data pointer to struct ux500_charger.
|
|
*/
|
|
-#define psy_to_ux500_charger(x) power_supply_get_drvdata(psy)
|
|
+#define psy_to_ux500_charger(x) power_supply_get_drvdata(x)
|
|
|
|
/* Forward declaration */
|
|
struct ux500_charger;
|
|
diff --git a/include/linux/prandom.h b/include/linux/prandom.h
|
|
index cc1e71334e53c..e20339c78a84c 100644
|
|
--- a/include/linux/prandom.h
|
|
+++ b/include/linux/prandom.h
|
|
@@ -93,7 +93,7 @@ static inline u32 __seed(u32 x, u32 m)
|
|
*/
|
|
static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
|
|
{
|
|
- u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
|
|
+ u32 i = ((seed >> 32) ^ (seed << 10) ^ seed) & 0xffffffffUL;
|
|
|
|
state->s1 = __seed(i, 2U);
|
|
state->s2 = __seed(i, 8U);
|
|
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
|
|
index 6183d20a01fbe..e673c7c9c5fbc 100644
|
|
--- a/include/scsi/scsi_transport_iscsi.h
|
|
+++ b/include/scsi/scsi_transport_iscsi.h
|
|
@@ -437,6 +437,8 @@ extern void iscsi_free_session(struct iscsi_cls_session *session);
|
|
extern int iscsi_destroy_session(struct iscsi_cls_session *session);
|
|
extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
|
|
int dd_size, uint32_t cid);
|
|
+extern void iscsi_put_conn(struct iscsi_cls_conn *conn);
|
|
+extern void iscsi_get_conn(struct iscsi_cls_conn *conn);
|
|
extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
|
|
extern void iscsi_unblock_session(struct iscsi_cls_session *session);
|
|
extern void iscsi_block_session(struct iscsi_cls_session *session);
|
|
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
|
|
index 766e5ccad60ae..57a9341c67e45 100644
|
|
--- a/kernel/trace/trace_events_hist.c
|
|
+++ b/kernel/trace/trace_events_hist.c
|
|
@@ -374,7 +374,9 @@ static struct hist_field *create_hist_field(struct ftrace_event_field *field,
|
|
if (WARN_ON_ONCE(!field))
|
|
goto out;
|
|
|
|
- if (is_string_field(field)) {
|
|
+ /* Pointers to strings are just pointers and dangerous to dereference */
|
|
+ if (is_string_field(field) &&
|
|
+ (field->filter_type != FILTER_PTR_STRING)) {
|
|
flags |= HIST_FIELD_FL_STRING;
|
|
|
|
if (field->filter_type == FILTER_STATIC_STRING)
|
|
@@ -863,8 +865,6 @@ static inline void add_to_key(char *compound_key, void *key,
|
|
field = key_field->field;
|
|
if (field->filter_type == FILTER_DYN_STRING)
|
|
size = *(u32 *)(rec + field->offset) >> 16;
|
|
- else if (field->filter_type == FILTER_PTR_STRING)
|
|
- size = strlen(key);
|
|
else if (field->filter_type == FILTER_STATIC_STRING)
|
|
size = field->size;
|
|
|
|
diff --git a/lib/decompress_unlz4.c b/lib/decompress_unlz4.c
|
|
index 036fc882cd725..f1449244fdd40 100644
|
|
--- a/lib/decompress_unlz4.c
|
|
+++ b/lib/decompress_unlz4.c
|
|
@@ -115,6 +115,9 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
|
|
error("data corrupted");
|
|
goto exit_2;
|
|
}
|
|
+ } else if (size < 4) {
|
|
+ /* empty or end-of-file */
|
|
+ goto exit_3;
|
|
}
|
|
|
|
chunksize = get_unaligned_le32(inp);
|
|
@@ -128,6 +131,10 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
|
|
continue;
|
|
}
|
|
|
|
+ if (!fill && chunksize == 0) {
|
|
+ /* empty or end-of-file */
|
|
+ goto exit_3;
|
|
+ }
|
|
|
|
if (posp)
|
|
*posp += 4;
|
|
@@ -184,6 +191,7 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
|
|
}
|
|
}
|
|
|
|
+exit_3:
|
|
ret = 0;
|
|
exit_2:
|
|
if (!input)
|
|
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
|
|
index a75ea633b5c46..07d735b2eccf7 100644
|
|
--- a/lib/iov_iter.c
|
|
+++ b/lib/iov_iter.c
|
|
@@ -394,7 +394,7 @@ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
|
|
int err;
|
|
struct iovec v;
|
|
|
|
- if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
|
|
+ if (iter_is_iovec(i)) {
|
|
iterate_iovec(i, bytes, v, iov, skip, ({
|
|
err = fault_in_pages_readable(v.iov_base, v.iov_len);
|
|
if (unlikely(err))
|
|
diff --git a/lib/seq_buf.c b/lib/seq_buf.c
|
|
index 5954f9fb6675a..b3ec487c97282 100644
|
|
--- a/lib/seq_buf.c
|
|
+++ b/lib/seq_buf.c
|
|
@@ -227,8 +227,10 @@ int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
|
|
|
|
WARN_ON(s->size == 0);
|
|
|
|
+ BUILD_BUG_ON(MAX_MEMHEX_BYTES * 2 >= HEX_CHARS);
|
|
+
|
|
while (len) {
|
|
- start_len = min(len, HEX_CHARS - 1);
|
|
+ start_len = min(len, MAX_MEMHEX_BYTES);
|
|
#ifdef __BIG_ENDIAN
|
|
for (i = 0, j = 0; i < start_len; i++) {
|
|
#else
|
|
@@ -241,12 +243,14 @@ int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
|
|
break;
|
|
|
|
/* j increments twice per loop */
|
|
- len -= j / 2;
|
|
hex[j++] = ' ';
|
|
|
|
seq_buf_putmem(s, hex, j);
|
|
if (seq_buf_has_overflowed(s))
|
|
return -1;
|
|
+
|
|
+ len -= start_len;
|
|
+ data += start_len;
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
|
|
index 177ca028b9868..91f33bb43f178 100644
|
|
--- a/mm/huge_memory.c
|
|
+++ b/mm/huge_memory.c
|
|
@@ -1369,7 +1369,7 @@ bool madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
|
|
* If other processes are mapping this page, we couldn't discard
|
|
* the page unless they all do MADV_FREE so let's skip the page.
|
|
*/
|
|
- if (page_mapcount(page) != 1)
|
|
+ if (total_mapcount(page) != 1)
|
|
goto out;
|
|
|
|
if (!trylock_page(page))
|
|
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
|
|
index 839c534bdcdb9..50b9a0bbe5dff 100644
|
|
--- a/net/bluetooth/hci_core.c
|
|
+++ b/net/bluetooth/hci_core.c
|
|
@@ -1533,14 +1533,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
|
|
|
|
BT_DBG("%s %p", hdev->name, hdev);
|
|
|
|
- if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
|
|
- !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
|
|
- test_bit(HCI_UP, &hdev->flags)) {
|
|
- /* Execute vendor specific shutdown routine */
|
|
- if (hdev->shutdown)
|
|
- hdev->shutdown(hdev);
|
|
- }
|
|
-
|
|
cancel_delayed_work(&hdev->power_off);
|
|
|
|
hci_request_cancel_all(hdev);
|
|
@@ -1608,6 +1600,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
|
|
clear_bit(HCI_INIT, &hdev->flags);
|
|
}
|
|
|
|
+ if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
|
|
+ !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
|
|
+ test_bit(HCI_UP, &hdev->flags)) {
|
|
+ /* Execute vendor specific shutdown routine */
|
|
+ if (hdev->shutdown)
|
|
+ hdev->shutdown(hdev);
|
|
+ }
|
|
+
|
|
/* flush cmd work */
|
|
flush_work(&hdev->cmd_work);
|
|
|
|
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
|
|
index bca1408f815ff..7aef6d23bc771 100644
|
|
--- a/net/bluetooth/mgmt.c
|
|
+++ b/net/bluetooth/mgmt.c
|
|
@@ -219,12 +219,15 @@ static u8 mgmt_status_table[] = {
|
|
MGMT_STATUS_TIMEOUT, /* Instant Passed */
|
|
MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */
|
|
MGMT_STATUS_FAILED, /* Transaction Collision */
|
|
+ MGMT_STATUS_FAILED, /* Reserved for future use */
|
|
MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */
|
|
MGMT_STATUS_REJECTED, /* QoS Rejected */
|
|
MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */
|
|
MGMT_STATUS_REJECTED, /* Insufficient Security */
|
|
MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */
|
|
+ MGMT_STATUS_FAILED, /* Reserved for future use */
|
|
MGMT_STATUS_BUSY, /* Role Switch Pending */
|
|
+ MGMT_STATUS_FAILED, /* Reserved for future use */
|
|
MGMT_STATUS_FAILED, /* Slot Violation */
|
|
MGMT_STATUS_FAILED, /* Role Switch Failed */
|
|
MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */
|
|
@@ -6087,6 +6090,9 @@ static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
|
|
for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
|
|
cur_len = data[i];
|
|
|
|
+ if (!cur_len)
|
|
+ continue;
|
|
+
|
|
if (data[i + 1] == EIR_FLAGS &&
|
|
(!is_adv_data || flags_managed(adv_flags)))
|
|
return false;
|
|
diff --git a/net/can/bcm.c b/net/can/bcm.c
|
|
index 65fa0ac2fb47d..369326715b9c6 100644
|
|
--- a/net/can/bcm.c
|
|
+++ b/net/can/bcm.c
|
|
@@ -839,6 +839,7 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
|
|
bcm_rx_handler, op);
|
|
|
|
list_del(&op->list);
|
|
+ synchronize_rcu();
|
|
bcm_remove_op(op);
|
|
return 1; /* done */
|
|
}
|
|
@@ -1589,9 +1590,13 @@ static int bcm_release(struct socket *sock)
|
|
REGMASK(op->can_id),
|
|
bcm_rx_handler, op);
|
|
|
|
- bcm_remove_op(op);
|
|
}
|
|
|
|
+ synchronize_rcu();
|
|
+
|
|
+ list_for_each_entry_safe(op, next, &bo->rx_ops, list)
|
|
+ bcm_remove_op(op);
|
|
+
|
|
/* remove procfs entry */
|
|
if (proc_dir && bo->bcm_proc_read)
|
|
remove_proc_entry(bo->procname, proc_dir);
|
|
diff --git a/net/can/gw.c b/net/can/gw.c
|
|
index 81650affa3faa..1867000f8a650 100644
|
|
--- a/net/can/gw.c
|
|
+++ b/net/can/gw.c
|
|
@@ -497,6 +497,7 @@ static int cgw_notifier(struct notifier_block *nb,
|
|
if (gwj->src.dev == dev || gwj->dst.dev == dev) {
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
}
|
|
}
|
|
@@ -941,6 +942,7 @@ static void cgw_remove_all_jobs(void)
|
|
hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) {
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
}
|
|
}
|
|
@@ -1008,6 +1010,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
err = 0;
|
|
break;
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 5b69a9a41dd50..47468fc5d0c9d 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -4998,11 +4998,18 @@ EXPORT_SYMBOL(__napi_schedule);
|
|
* __napi_schedule_irqoff - schedule for receive
|
|
* @n: entry to schedule
|
|
*
|
|
- * Variant of __napi_schedule() assuming hard irqs are masked
|
|
+ * Variant of __napi_schedule() assuming hard irqs are masked.
|
|
+ *
|
|
+ * On PREEMPT_RT enabled kernels this maps to __napi_schedule()
|
|
+ * because the interrupt disabled assumption might not be true
|
|
+ * due to force-threaded interrupts and spinlock substitution.
|
|
*/
|
|
void __napi_schedule_irqoff(struct napi_struct *n)
|
|
{
|
|
- ____napi_schedule(this_cpu_ptr(&softnet_data), n);
|
|
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
|
+ ____napi_schedule(this_cpu_ptr(&softnet_data), n);
|
|
+ else
|
|
+ __napi_schedule(n);
|
|
}
|
|
EXPORT_SYMBOL(__napi_schedule_irqoff);
|
|
|
|
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
|
|
index 6a6d01cb1acec..9c25e8b093065 100644
|
|
--- a/net/ipv6/output_core.c
|
|
+++ b/net/ipv6/output_core.c
|
|
@@ -14,29 +14,11 @@ static u32 __ipv6_select_ident(struct net *net,
|
|
const struct in6_addr *dst,
|
|
const struct in6_addr *src)
|
|
{
|
|
- const struct {
|
|
- struct in6_addr dst;
|
|
- struct in6_addr src;
|
|
- } __aligned(SIPHASH_ALIGNMENT) combined = {
|
|
- .dst = *dst,
|
|
- .src = *src,
|
|
- };
|
|
- u32 hash, id;
|
|
-
|
|
- /* Note the following code is not safe, but this is okay. */
|
|
- if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
|
|
- get_random_bytes(&net->ipv4.ip_id_key,
|
|
- sizeof(net->ipv4.ip_id_key));
|
|
-
|
|
- hash = siphash(&combined, sizeof(combined), &net->ipv4.ip_id_key);
|
|
-
|
|
- /* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve,
|
|
- * set the hight order instead thus minimizing possible future
|
|
- * collisions.
|
|
- */
|
|
- id = ip_idents_reserve(hash, 1);
|
|
- if (unlikely(!id))
|
|
- id = 1 << 31;
|
|
+ u32 id;
|
|
+
|
|
+ do {
|
|
+ id = prandom_u32();
|
|
+ } while (!id);
|
|
|
|
return id;
|
|
}
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 3a069cb188b72..b40e71a5d7957 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -2380,7 +2380,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
|
#endif
|
|
|
|
if (skb) {
|
|
- struct ethhdr *ehdr = (void *)skb_mac_header(skb);
|
|
+ struct ethhdr *ehdr = (struct ethhdr *)skb->data;
|
|
|
|
/* deliver to local stack */
|
|
skb->protocol = eth_type_trans(skb, dev);
|
|
diff --git a/net/netfilter/nft_exthdr.c b/net/netfilter/nft_exthdr.c
|
|
index 47beb3abcc9da..e2c815ee06d0e 100644
|
|
--- a/net/netfilter/nft_exthdr.c
|
|
+++ b/net/netfilter/nft_exthdr.c
|
|
@@ -34,6 +34,9 @@ static void nft_exthdr_eval(const struct nft_expr *expr,
|
|
unsigned int offset = 0;
|
|
int err;
|
|
|
|
+ if (pkt->skb->protocol != htons(ETH_P_IPV6))
|
|
+ goto err;
|
|
+
|
|
err = ipv6_find_hdr(pkt->skb, &offset, priv->type, NULL, NULL);
|
|
if (err < 0)
|
|
goto err;
|
|
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c
|
|
index f85d0e07af2dd..9be851ce97c2b 100644
|
|
--- a/net/netlabel/netlabel_mgmt.c
|
|
+++ b/net/netlabel/netlabel_mgmt.c
|
|
@@ -96,6 +96,7 @@ static const struct nla_policy netlbl_mgmt_genl_policy[NLBL_MGMT_A_MAX + 1] = {
|
|
static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
struct netlbl_audit *audit_info)
|
|
{
|
|
+ void *pmap = NULL;
|
|
int ret_val = -EINVAL;
|
|
struct netlbl_domaddr_map *addrmap = NULL;
|
|
struct cipso_v4_doi *cipsov4 = NULL;
|
|
@@ -195,6 +196,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
ret_val = -ENOMEM;
|
|
goto add_free_addrmap;
|
|
}
|
|
+ pmap = map;
|
|
map->list.addr = addr->s_addr & mask->s_addr;
|
|
map->list.mask = mask->s_addr;
|
|
map->list.valid = 1;
|
|
@@ -203,10 +205,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
map->def.cipso = cipsov4;
|
|
|
|
ret_val = netlbl_af4list_add(&map->list, &addrmap->list4);
|
|
- if (ret_val != 0) {
|
|
- kfree(map);
|
|
- goto add_free_addrmap;
|
|
- }
|
|
+ if (ret_val != 0)
|
|
+ goto add_free_map;
|
|
|
|
entry->family = AF_INET;
|
|
entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
|
|
@@ -243,6 +243,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
ret_val = -ENOMEM;
|
|
goto add_free_addrmap;
|
|
}
|
|
+ pmap = map;
|
|
map->list.addr = *addr;
|
|
map->list.addr.s6_addr32[0] &= mask->s6_addr32[0];
|
|
map->list.addr.s6_addr32[1] &= mask->s6_addr32[1];
|
|
@@ -255,10 +256,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
map->def.calipso = calipso;
|
|
|
|
ret_val = netlbl_af6list_add(&map->list, &addrmap->list6);
|
|
- if (ret_val != 0) {
|
|
- kfree(map);
|
|
- goto add_free_addrmap;
|
|
- }
|
|
+ if (ret_val != 0)
|
|
+ goto add_free_map;
|
|
|
|
entry->family = AF_INET6;
|
|
entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
|
|
@@ -268,10 +267,12 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
|
|
ret_val = netlbl_domhsh_add(entry, audit_info);
|
|
if (ret_val != 0)
|
|
- goto add_free_addrmap;
|
|
+ goto add_free_map;
|
|
|
|
return 0;
|
|
|
|
+add_free_map:
|
|
+ kfree(pmap);
|
|
add_free_addrmap:
|
|
kfree(addrmap);
|
|
add_doi_put_def:
|
|
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
|
|
index 70ee78d8f8fb8..7aafb402e5c77 100644
|
|
--- a/net/sched/cls_tcindex.c
|
|
+++ b/net/sched/cls_tcindex.c
|
|
@@ -247,7 +247,7 @@ static int tcindex_alloc_perfect_hash(struct tcindex_data *cp)
|
|
int i, err = 0;
|
|
|
|
cp->perfect = kcalloc(cp->hash, sizeof(struct tcindex_filter_result),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (!cp->perfect)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/net/sctp/input.c b/net/sctp/input.c
|
|
index 12d821ea8a1f6..8f4574c4aa6ca 100644
|
|
--- a/net/sctp/input.c
|
|
+++ b/net/sctp/input.c
|
|
@@ -1165,7 +1165,7 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
|
|
|
|
ch = (sctp_chunkhdr_t *) ch_end;
|
|
chunk_num++;
|
|
- } while (ch_end < skb_tail_pointer(skb));
|
|
+ } while (ch_end + sizeof(*ch) < skb_tail_pointer(skb));
|
|
|
|
return asoc;
|
|
}
|
|
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
|
|
index 0ef65822fdd34..00d95fefdc6fd 100644
|
|
--- a/net/sunrpc/sched.c
|
|
+++ b/net/sunrpc/sched.c
|
|
@@ -486,11 +486,21 @@ static struct rpc_task *__rpc_find_next_queued_priority(struct rpc_wait_queue *q
|
|
struct list_head *q;
|
|
struct rpc_task *task;
|
|
|
|
+ /*
|
|
+ * Service the privileged queue.
|
|
+ */
|
|
+ q = &queue->tasks[RPC_NR_PRIORITY - 1];
|
|
+ if (queue->maxpriority > RPC_PRIORITY_PRIVILEGED && !list_empty(q)) {
|
|
+ task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
/*
|
|
* Service a batch of tasks from a single owner.
|
|
*/
|
|
q = &queue->tasks[queue->priority];
|
|
- if (!list_empty(q) && --queue->nr) {
|
|
+ if (!list_empty(q) && queue->nr) {
|
|
+ queue->nr--;
|
|
task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
|
|
goto out;
|
|
}
|
|
diff --git a/net/wireless/wext-spy.c b/net/wireless/wext-spy.c
|
|
index 33bef22e44e95..b379a03716539 100644
|
|
--- a/net/wireless/wext-spy.c
|
|
+++ b/net/wireless/wext-spy.c
|
|
@@ -120,8 +120,8 @@ int iw_handler_set_thrspy(struct net_device * dev,
|
|
return -EOPNOTSUPP;
|
|
|
|
/* Just do it */
|
|
- memcpy(&(spydata->spy_thr_low), &(threshold->low),
|
|
- 2 * sizeof(struct iw_quality));
|
|
+ spydata->spy_thr_low = threshold->low;
|
|
+ spydata->spy_thr_high = threshold->high;
|
|
|
|
/* Clear flag */
|
|
memset(spydata->spy_thr_under, '\0', sizeof(spydata->spy_thr_under));
|
|
@@ -147,8 +147,8 @@ int iw_handler_get_thrspy(struct net_device * dev,
|
|
return -EOPNOTSUPP;
|
|
|
|
/* Just do it */
|
|
- memcpy(&(threshold->low), &(spydata->spy_thr_low),
|
|
- 2 * sizeof(struct iw_quality));
|
|
+ threshold->low = spydata->spy_thr_low;
|
|
+ threshold->high = spydata->spy_thr_high;
|
|
|
|
return 0;
|
|
}
|
|
@@ -173,10 +173,10 @@ static void iw_send_thrspy_event(struct net_device * dev,
|
|
memcpy(threshold.addr.sa_data, address, ETH_ALEN);
|
|
threshold.addr.sa_family = ARPHRD_ETHER;
|
|
/* Copy stats */
|
|
- memcpy(&(threshold.qual), wstats, sizeof(struct iw_quality));
|
|
+ threshold.qual = *wstats;
|
|
/* Copy also thresholds */
|
|
- memcpy(&(threshold.low), &(spydata->spy_thr_low),
|
|
- 2 * sizeof(struct iw_quality));
|
|
+ threshold.low = spydata->spy_thr_low;
|
|
+ threshold.high = spydata->spy_thr_high;
|
|
|
|
/* Send event to user space */
|
|
wireless_send_event(dev, SIOCGIWTHRSPY, &wrqu, (char *) &threshold);
|
|
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
|
|
index feb24ca530f27..48139e1a0ac91 100644
|
|
--- a/net/xfrm/xfrm_user.c
|
|
+++ b/net/xfrm/xfrm_user.c
|
|
@@ -566,6 +566,20 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
|
|
|
|
copy_from_user_state(x, p);
|
|
|
|
+ if (attrs[XFRMA_ENCAP]) {
|
|
+ x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
|
|
+ sizeof(*x->encap), GFP_KERNEL);
|
|
+ if (x->encap == NULL)
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ if (attrs[XFRMA_COADDR]) {
|
|
+ x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
|
|
+ sizeof(*x->coaddr), GFP_KERNEL);
|
|
+ if (x->coaddr == NULL)
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
if (attrs[XFRMA_SA_EXTRA_FLAGS])
|
|
x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]);
|
|
|
|
@@ -586,23 +600,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
|
|
attrs[XFRMA_ALG_COMP])))
|
|
goto error;
|
|
|
|
- if (attrs[XFRMA_ENCAP]) {
|
|
- x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
|
|
- sizeof(*x->encap), GFP_KERNEL);
|
|
- if (x->encap == NULL)
|
|
- goto error;
|
|
- }
|
|
-
|
|
if (attrs[XFRMA_TFCPAD])
|
|
x->tfcpad = nla_get_u32(attrs[XFRMA_TFCPAD]);
|
|
|
|
- if (attrs[XFRMA_COADDR]) {
|
|
- x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
|
|
- sizeof(*x->coaddr), GFP_KERNEL);
|
|
- if (x->coaddr == NULL)
|
|
- goto error;
|
|
- }
|
|
-
|
|
xfrm_mark_get(attrs, &x->mark);
|
|
|
|
err = __xfrm_init_state(x, false);
|
|
diff --git a/security/selinux/avc.c b/security/selinux/avc.c
|
|
index f3c473791b698..a16c72c2a9675 100644
|
|
--- a/security/selinux/avc.c
|
|
+++ b/security/selinux/avc.c
|
|
@@ -348,26 +348,27 @@ static struct avc_xperms_decision_node
|
|
struct avc_xperms_decision_node *xpd_node;
|
|
struct extended_perms_decision *xpd;
|
|
|
|
- xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep, GFP_NOWAIT);
|
|
+ xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep,
|
|
+ GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!xpd_node)
|
|
return NULL;
|
|
|
|
xpd = &xpd_node->xpd;
|
|
if (which & XPERMS_ALLOWED) {
|
|
xpd->allowed = kmem_cache_zalloc(avc_xperms_data_cachep,
|
|
- GFP_NOWAIT);
|
|
+ GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!xpd->allowed)
|
|
goto error;
|
|
}
|
|
if (which & XPERMS_AUDITALLOW) {
|
|
xpd->auditallow = kmem_cache_zalloc(avc_xperms_data_cachep,
|
|
- GFP_NOWAIT);
|
|
+ GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!xpd->auditallow)
|
|
goto error;
|
|
}
|
|
if (which & XPERMS_DONTAUDIT) {
|
|
xpd->dontaudit = kmem_cache_zalloc(avc_xperms_data_cachep,
|
|
- GFP_NOWAIT);
|
|
+ GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!xpd->dontaudit)
|
|
goto error;
|
|
}
|
|
@@ -395,7 +396,7 @@ static struct avc_xperms_node *avc_xperms_alloc(void)
|
|
{
|
|
struct avc_xperms_node *xp_node;
|
|
|
|
- xp_node = kmem_cache_zalloc(avc_xperms_cachep, GFP_NOWAIT);
|
|
+ xp_node = kmem_cache_zalloc(avc_xperms_cachep, GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!xp_node)
|
|
return xp_node;
|
|
INIT_LIST_HEAD(&xp_node->xpd_head);
|
|
@@ -548,7 +549,7 @@ static struct avc_node *avc_alloc_node(void)
|
|
{
|
|
struct avc_node *node;
|
|
|
|
- node = kmem_cache_zalloc(avc_node_cachep, GFP_NOWAIT);
|
|
+ node = kmem_cache_zalloc(avc_node_cachep, GFP_NOWAIT | __GFP_NOWARN);
|
|
if (!node)
|
|
goto out;
|
|
|
|
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
|
|
index 04a53cdb409fa..966d30bf2e388 100644
|
|
--- a/security/smack/smackfs.c
|
|
+++ b/security/smack/smackfs.c
|
|
@@ -878,6 +878,8 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
|
|
if (format == SMK_FIXED24_FMT &&
|
|
(count < SMK_CIPSOMIN || count > SMK_CIPSOMAX))
|
|
return -EINVAL;
|
|
+ if (count > PAGE_SIZE)
|
|
+ return -EINVAL;
|
|
|
|
data = memdup_user_nul(buf, count);
|
|
if (IS_ERR(data))
|
|
diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
|
|
index f7b8dcb578157..82894330cae1e 100644
|
|
--- a/sound/firewire/Kconfig
|
|
+++ b/sound/firewire/Kconfig
|
|
@@ -36,7 +36,7 @@ config SND_OXFW
|
|
* Mackie(Loud) Onyx-i series (former models)
|
|
* Mackie(Loud) Onyx Satellite
|
|
* Mackie(Loud) Tapco Link.Firewire
|
|
- * Mackie(Loud) d.4 pro
|
|
+ * Mackie(Loud) d.2 pro/d.4 pro (built-in FireWire card with OXFW971 ASIC)
|
|
* Mackie(Loud) U.420/U.420d
|
|
* TASCAM FireOne
|
|
* Stanton Controllers & Systems 1 Deck/Mixer
|
|
@@ -82,7 +82,7 @@ config SND_BEBOB
|
|
* PreSonus FIREBOX/FIREPOD/FP10/Inspire1394
|
|
* BridgeCo RDAudio1/Audio5
|
|
* Mackie Onyx 1220/1620/1640 (FireWire I/O Card)
|
|
- * Mackie d.2 (FireWire Option) and d.2 Pro
|
|
+ * Mackie d.2 (optional FireWire card with DM1000 ASIC)
|
|
* Stanton FinalScratch 2 (ScratchAmp)
|
|
* Tascam IF-FW/DM
|
|
* Behringer XENIX UFX 1204/1604
|
|
@@ -108,6 +108,7 @@ config SND_BEBOB
|
|
* M-Audio Ozonic/NRV10/ProfireLightBridge
|
|
* M-Audio FireWire 1814/ProjectMix IO
|
|
* Digidesign Mbox 2 Pro
|
|
+ * ToneWeal FW66
|
|
|
|
To compile this driver as a module, choose M here: the module
|
|
will be called snd-bebob.
|
|
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c
|
|
index 9d620a7c283f4..4bb2cbe73f201 100644
|
|
--- a/sound/firewire/bebob/bebob.c
|
|
+++ b/sound/firewire/bebob/bebob.c
|
|
@@ -60,6 +60,7 @@ static DECLARE_BITMAP(devices_used, SNDRV_CARDS);
|
|
#define VEN_MAUDIO1 0x00000d6c
|
|
#define VEN_MAUDIO2 0x000007f5
|
|
#define VEN_DIGIDESIGN 0x00a07e
|
|
+#define OUI_SHOUYO 0x002327
|
|
|
|
#define MODEL_FOCUSRITE_SAFFIRE_BOTH 0x00000000
|
|
#define MODEL_MAUDIO_AUDIOPHILE_BOTH 0x00010060
|
|
@@ -414,7 +415,7 @@ static const struct ieee1394_device_id bebob_id_table[] = {
|
|
SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
|
|
/* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
|
|
SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
|
|
- // Mackie, d.2 (Firewire option card) and d.2 Pro (the card is built-in).
|
|
+ // Mackie, d.2 (optional Firewire card with DM1000).
|
|
SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
|
|
/* Stanton, ScratchAmp */
|
|
SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
|
|
@@ -513,6 +514,8 @@ static const struct ieee1394_device_id bebob_id_table[] = {
|
|
&maudio_special_spec),
|
|
/* Digidesign Mbox 2 Pro */
|
|
SND_BEBOB_DEV_ENTRY(VEN_DIGIDESIGN, 0x0000a9, &spec_normal),
|
|
+ // Toneweal FW66.
|
|
+ SND_BEBOB_DEV_ENTRY(OUI_SHOUYO, 0x020002, &spec_normal),
|
|
/* IDs are unknown but able to be supported */
|
|
/* Apogee, Mini-ME Firewire */
|
|
/* Apogee, Mini-DAC Firewire */
|
|
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
|
|
index 44ecf2f5f65fd..e2932ac9d4879 100644
|
|
--- a/sound/firewire/oxfw/oxfw.c
|
|
+++ b/sound/firewire/oxfw/oxfw.c
|
|
@@ -405,7 +405,7 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
|
|
* Onyx-i series (former models): 0x081216
|
|
* Mackie Onyx Satellite: 0x00200f
|
|
* Tapco LINK.firewire 4x6: 0x000460
|
|
- * d.4 pro: Unknown
|
|
+ * d.2 pro/d.4 pro (built-in card): Unknown
|
|
* U.420: Unknown
|
|
* U.420d: Unknown
|
|
*/
|
|
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
|
|
index dfedfd85f2054..463906882b95c 100644
|
|
--- a/sound/isa/cmi8330.c
|
|
+++ b/sound/isa/cmi8330.c
|
|
@@ -564,7 +564,7 @@ static int snd_cmi8330_probe(struct snd_card *card, int dev)
|
|
}
|
|
if (acard->sb->hardware != SB_HW_16) {
|
|
snd_printk(KERN_ERR PFX "SB16 not found during probe\n");
|
|
- return err;
|
|
+ return -ENODEV;
|
|
}
|
|
|
|
snd_wss_out(acard->wss, CS4231_MISC_INFO, 0x40); /* switch on MODE2 */
|
|
diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
|
|
index 2cc068be7d3be..90fa57ad14c04 100644
|
|
--- a/sound/isa/sb/sb16_csp.c
|
|
+++ b/sound/isa/sb/sb16_csp.c
|
|
@@ -1086,10 +1086,14 @@ static void snd_sb_qsound_destroy(struct snd_sb_csp * p)
|
|
card = p->chip->card;
|
|
|
|
down_write(&card->controls_rwsem);
|
|
- if (p->qsound_switch)
|
|
+ if (p->qsound_switch) {
|
|
snd_ctl_remove(card, p->qsound_switch);
|
|
- if (p->qsound_space)
|
|
+ p->qsound_switch = NULL;
|
|
+ }
|
|
+ if (p->qsound_space) {
|
|
snd_ctl_remove(card, p->qsound_space);
|
|
+ p->qsound_space = NULL;
|
|
+ }
|
|
up_write(&card->controls_rwsem);
|
|
|
|
/* cancel pending transfer of QSound parameters */
|
|
diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c
|
|
index e85fb04ec7be6..b567c4bdae000 100644
|
|
--- a/sound/pci/hda/hda_tegra.c
|
|
+++ b/sound/pci/hda/hda_tegra.c
|
|
@@ -363,6 +363,9 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
|
|
unsigned short gcap;
|
|
int irq_id = platform_get_irq(pdev, 0);
|
|
|
|
+ if (irq_id < 0)
|
|
+ return irq_id;
|
|
+
|
|
err = hda_tegra_init_chip(chip, pdev);
|
|
if (err)
|
|
return err;
|
|
diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c
|
|
index 33c6be9fb388e..7c70ba5e2540d 100644
|
|
--- a/sound/ppc/powermac.c
|
|
+++ b/sound/ppc/powermac.c
|
|
@@ -90,7 +90,11 @@ static int snd_pmac_probe(struct platform_device *devptr)
|
|
sprintf(card->shortname, "PowerMac %s", name_ext);
|
|
sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
|
|
card->shortname, chip->device_id, chip->subframe);
|
|
- if ( snd_pmac_tumbler_init(chip) < 0 || snd_pmac_tumbler_post_init() < 0)
|
|
+ err = snd_pmac_tumbler_init(chip);
|
|
+ if (err < 0)
|
|
+ goto __error;
|
|
+ err = snd_pmac_tumbler_post_init();
|
|
+ if (err < 0)
|
|
goto __error;
|
|
break;
|
|
case PMAC_AWACS:
|
|
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
|
index 168559b5e9f32..0344d44231675 100644
|
|
--- a/sound/soc/soc-core.c
|
|
+++ b/sound/soc/soc-core.c
|
|
@@ -3644,7 +3644,7 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
|
|
if (!routes) {
|
|
dev_err(card->dev,
|
|
"ASoC: Could not allocate DAPM route table\n");
|
|
- return -EINVAL;
|
|
+ return -ENOMEM;
|
|
}
|
|
|
|
for (i = 0; i < num_routes; i++) {
|
|
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
|
|
index deb597f7c302b..f40657da4db2b 100644
|
|
--- a/sound/soc/tegra/tegra_alc5632.c
|
|
+++ b/sound/soc/tegra/tegra_alc5632.c
|
|
@@ -149,6 +149,7 @@ static struct snd_soc_dai_link tegra_alc5632_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_alc5632 = {
|
|
.name = "tegra-alc5632",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.remove = tegra_alc5632_card_remove,
|
|
.dai_link = &tegra_alc5632_dai,
|
|
diff --git a/sound/soc/tegra/tegra_max98090.c b/sound/soc/tegra/tegra_max98090.c
|
|
index 902da36581d1b..f4f238924c764 100644
|
|
--- a/sound/soc/tegra/tegra_max98090.c
|
|
+++ b/sound/soc/tegra/tegra_max98090.c
|
|
@@ -205,6 +205,7 @@ static struct snd_soc_dai_link tegra_max98090_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_max98090 = {
|
|
.name = "tegra-max98090",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.remove = tegra_max98090_card_remove,
|
|
.dai_link = &tegra_max98090_dai,
|
|
diff --git a/sound/soc/tegra/tegra_rt5640.c b/sound/soc/tegra/tegra_rt5640.c
|
|
index e5ef4e9c4ac59..3088c6f401e38 100644
|
|
--- a/sound/soc/tegra/tegra_rt5640.c
|
|
+++ b/sound/soc/tegra/tegra_rt5640.c
|
|
@@ -150,6 +150,7 @@ static struct snd_soc_dai_link tegra_rt5640_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_rt5640 = {
|
|
.name = "tegra-rt5640",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.remove = tegra_rt5640_card_remove,
|
|
.dai_link = &tegra_rt5640_dai,
|
|
diff --git a/sound/soc/tegra/tegra_rt5677.c b/sound/soc/tegra/tegra_rt5677.c
|
|
index 1470873ecde68..451e7254e87b6 100644
|
|
--- a/sound/soc/tegra/tegra_rt5677.c
|
|
+++ b/sound/soc/tegra/tegra_rt5677.c
|
|
@@ -198,6 +198,7 @@ static struct snd_soc_dai_link tegra_rt5677_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_rt5677 = {
|
|
.name = "tegra-rt5677",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.remove = tegra_rt5677_card_remove,
|
|
.dai_link = &tegra_rt5677_dai,
|
|
diff --git a/sound/soc/tegra/tegra_sgtl5000.c b/sound/soc/tegra/tegra_sgtl5000.c
|
|
index 863e04809a6b8..8755a9528d925 100644
|
|
--- a/sound/soc/tegra/tegra_sgtl5000.c
|
|
+++ b/sound/soc/tegra/tegra_sgtl5000.c
|
|
@@ -103,6 +103,7 @@ static struct snd_soc_dai_link tegra_sgtl5000_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_sgtl5000 = {
|
|
.name = "tegra-sgtl5000",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = &tegra_sgtl5000_dai,
|
|
.num_links = 1,
|
|
diff --git a/sound/soc/tegra/tegra_wm8753.c b/sound/soc/tegra/tegra_wm8753.c
|
|
index f0cd01dbfc380..633d26c4811b8 100644
|
|
--- a/sound/soc/tegra/tegra_wm8753.c
|
|
+++ b/sound/soc/tegra/tegra_wm8753.c
|
|
@@ -110,6 +110,7 @@ static struct snd_soc_dai_link tegra_wm8753_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_wm8753 = {
|
|
.name = "tegra-wm8753",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = &tegra_wm8753_dai,
|
|
.num_links = 1,
|
|
diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
|
|
index e485278e027a2..20a3ca03ac30d 100644
|
|
--- a/sound/soc/tegra/tegra_wm8903.c
|
|
+++ b/sound/soc/tegra/tegra_wm8903.c
|
|
@@ -228,6 +228,7 @@ static struct snd_soc_dai_link tegra_wm8903_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_wm8903 = {
|
|
.name = "tegra-wm8903",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = &tegra_wm8903_dai,
|
|
.num_links = 1,
|
|
diff --git a/sound/soc/tegra/tegra_wm9712.c b/sound/soc/tegra/tegra_wm9712.c
|
|
index 6492f8143ff1f..e5bebb473d95e 100644
|
|
--- a/sound/soc/tegra/tegra_wm9712.c
|
|
+++ b/sound/soc/tegra/tegra_wm9712.c
|
|
@@ -59,6 +59,7 @@ static struct snd_soc_dai_link tegra_wm9712_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_tegra_wm9712 = {
|
|
.name = "tegra-wm9712",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = &tegra_wm9712_dai,
|
|
.num_links = 1,
|
|
diff --git a/sound/soc/tegra/trimslice.c b/sound/soc/tegra/trimslice.c
|
|
index 2cea203c4f5f1..90a770968f348 100644
|
|
--- a/sound/soc/tegra/trimslice.c
|
|
+++ b/sound/soc/tegra/trimslice.c
|
|
@@ -103,6 +103,7 @@ static struct snd_soc_dai_link trimslice_tlv320aic23_dai = {
|
|
|
|
static struct snd_soc_card snd_soc_trimslice = {
|
|
.name = "tegra-trimslice",
|
|
+ .driver_name = "tegra",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = &trimslice_tlv320aic23_dai,
|
|
.num_links = 1,
|
|
diff --git a/sound/usb/format.c b/sound/usb/format.c
|
|
index 06190e3fd9194..56b5baee65528 100644
|
|
--- a/sound/usb/format.c
|
|
+++ b/sound/usb/format.c
|
|
@@ -189,9 +189,11 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
|
|
continue;
|
|
/* C-Media CM6501 mislabels its 96 kHz altsetting */
|
|
/* Terratec Aureon 7.1 USB C-Media 6206, too */
|
|
+ /* Ozone Z90 USB C-Media, too */
|
|
if (rate == 48000 && nr_rates == 1 &&
|
|
(chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
|
|
chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
|
|
+ chip->usb_id == USB_ID(0x0d8c, 0x0078) ||
|
|
chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
|
|
fp->altsetting == 5 && fp->maxpacksize == 392)
|
|
rate = 96000;
|
|
diff --git a/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c b/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
|
|
index 8341d7778d5ed..87630d44fb4c7 100644
|
|
--- a/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
|
|
+++ b/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
|
|
@@ -50,8 +50,6 @@ static int no_handler_test(void)
|
|
|
|
event_close(&event);
|
|
|
|
- dump_ebb_state();
|
|
-
|
|
/* The real test is that we never took an EBB at 0x0 */
|
|
|
|
return 0;
|
|
diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c
|
|
index 5338e668b5e65..d78736845b8ec 100644
|
|
--- a/tools/testing/selftests/x86/protection_keys.c
|
|
+++ b/tools/testing/selftests/x86/protection_keys.c
|
|
@@ -609,7 +609,6 @@ int alloc_random_pkey(void)
|
|
int nr_alloced = 0;
|
|
int random_index;
|
|
memset(alloced_pkeys, 0, sizeof(alloced_pkeys));
|
|
- srand((unsigned int)time(NULL));
|
|
|
|
/* allocate every possible key and make a note of which ones we got */
|
|
max_nr_pkey_allocs = NR_PKEYS;
|
|
@@ -1387,6 +1386,8 @@ int main(void)
|
|
{
|
|
int nr_iterations = 22;
|
|
|
|
+ srand((unsigned int)time(NULL));
|
|
+
|
|
setup_handlers();
|
|
|
|
printf("has pku: %d\n", cpu_has_pku());
|