mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 17:21:34 +00:00
2284 lines
73 KiB
Diff
2284 lines
73 KiB
Diff
diff --git a/Documentation/devicetree/bindings/display/bridge/ti,ths8135.txt b/Documentation/devicetree/bindings/display/bridge/ti,ths8135.txt
|
|
new file mode 100644
|
|
index 000000000000..6ec1a880ac18
|
|
--- /dev/null
|
|
+++ b/Documentation/devicetree/bindings/display/bridge/ti,ths8135.txt
|
|
@@ -0,0 +1,46 @@
|
|
+THS8135 Video DAC
|
|
+-----------------
|
|
+
|
|
+This is the binding for Texas Instruments THS8135 Video DAC bridge.
|
|
+
|
|
+Required properties:
|
|
+
|
|
+- compatible: Must be "ti,ths8135"
|
|
+
|
|
+Required nodes:
|
|
+
|
|
+This device has two video ports. Their connections are modelled using the OF
|
|
+graph bindings specified in Documentation/devicetree/bindings/graph.txt.
|
|
+
|
|
+- Video port 0 for RGB input
|
|
+- Video port 1 for VGA output
|
|
+
|
|
+Example
|
|
+-------
|
|
+
|
|
+vga-bridge {
|
|
+ compatible = "ti,ths8135";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ ports {
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ port@0 {
|
|
+ reg = <0>;
|
|
+
|
|
+ vga_bridge_in: endpoint {
|
|
+ remote-endpoint = <&lcdc_out_vga>;
|
|
+ };
|
|
+ };
|
|
+
|
|
+ port@1 {
|
|
+ reg = <1>;
|
|
+
|
|
+ vga_bridge_out: endpoint {
|
|
+ remote-endpoint = <&vga_con_in>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+};
|
|
diff --git a/Documentation/devicetree/bindings/iio/adc/avia-hx711.txt b/Documentation/devicetree/bindings/iio/adc/avia-hx711.txt
|
|
new file mode 100644
|
|
index 000000000000..b3629405f568
|
|
--- /dev/null
|
|
+++ b/Documentation/devicetree/bindings/iio/adc/avia-hx711.txt
|
|
@@ -0,0 +1,18 @@
|
|
+* AVIA HX711 ADC chip for weight cells
|
|
+ Bit-banging driver
|
|
+
|
|
+Required properties:
|
|
+ - compatible: Should be "avia,hx711"
|
|
+ - sck-gpios: Definition of the GPIO for the clock
|
|
+ - dout-gpios: Definition of the GPIO for data-out
|
|
+ See Documentation/devicetree/bindings/gpio/gpio.txt
|
|
+ - avdd-supply: Definition of the regulator used as analog supply
|
|
+
|
|
+Example:
|
|
+weight@0 {
|
|
+ compatible = "avia,hx711";
|
|
+ sck-gpios = <&gpio3 10 GPIO_ACTIVE_HIGH>;
|
|
+ dout-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
|
|
+ avdd-suppy = <&avdd>;
|
|
+};
|
|
+
|
|
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
|
|
index 55df1d444e9f..98dc17507a84 100644
|
|
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
|
|
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
|
|
@@ -31,6 +31,7 @@ asahi-kasei Asahi Kasei Corp.
|
|
atmel Atmel Corporation
|
|
auo AU Optronics Corporation
|
|
avago Avago Technologies
|
|
+avia avia semiconductor
|
|
avic Shanghai AVIC Optoelectronics Co., Ltd.
|
|
axis Axis Communications AB
|
|
bosch Bosch Sensortec GmbH
|
|
diff --git a/Makefile b/Makefile
|
|
index ca5aaaf4aef7..c1db50ef7fb5 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 90
|
|
+SUBLEVEL = 91
|
|
EXTRAVERSION =
|
|
NAME = Blurry Fish Butt
|
|
|
|
diff --git a/arch/arm/Kconfig-nommu b/arch/arm/Kconfig-nommu
|
|
index aed66d5df7f1..b7576349528c 100644
|
|
--- a/arch/arm/Kconfig-nommu
|
|
+++ b/arch/arm/Kconfig-nommu
|
|
@@ -34,8 +34,7 @@ config PROCESSOR_ID
|
|
used instead of the auto-probing which utilizes the register.
|
|
|
|
config REMAP_VECTORS_TO_RAM
|
|
- bool 'Install vectors to the beginning of RAM' if DRAM_BASE
|
|
- depends on DRAM_BASE
|
|
+ bool 'Install vectors to the beginning of RAM'
|
|
help
|
|
The kernel needs to change the hardware exception vectors.
|
|
In nommu mode, the hardware exception vectors are normally
|
|
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
|
|
index e07ae5d45e19..7b39d8fae61e 100644
|
|
--- a/arch/arm/boot/dts/r8a7790.dtsi
|
|
+++ b/arch/arm/boot/dts/r8a7790.dtsi
|
|
@@ -1409,7 +1409,8 @@
|
|
};
|
|
|
|
msiof0: spi@e6e20000 {
|
|
- compatible = "renesas,msiof-r8a7790";
|
|
+ compatible = "renesas,msiof-r8a7790",
|
|
+ "renesas,rcar-gen2-msiof";
|
|
reg = <0 0xe6e20000 0 0x0064>;
|
|
interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&mstp0_clks R8A7790_CLK_MSIOF0>;
|
|
@@ -1422,7 +1423,8 @@
|
|
};
|
|
|
|
msiof1: spi@e6e10000 {
|
|
- compatible = "renesas,msiof-r8a7790";
|
|
+ compatible = "renesas,msiof-r8a7790",
|
|
+ "renesas,rcar-gen2-msiof";
|
|
reg = <0 0xe6e10000 0 0x0064>;
|
|
interrupts = <0 157 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&mstp2_clks R8A7790_CLK_MSIOF1>;
|
|
@@ -1435,7 +1437,8 @@
|
|
};
|
|
|
|
msiof2: spi@e6e00000 {
|
|
- compatible = "renesas,msiof-r8a7790";
|
|
+ compatible = "renesas,msiof-r8a7790",
|
|
+ "renesas,rcar-gen2-msiof";
|
|
reg = <0 0xe6e00000 0 0x0064>;
|
|
interrupts = <0 158 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&mstp2_clks R8A7790_CLK_MSIOF2>;
|
|
@@ -1448,7 +1451,8 @@
|
|
};
|
|
|
|
msiof3: spi@e6c90000 {
|
|
- compatible = "renesas,msiof-r8a7790";
|
|
+ compatible = "renesas,msiof-r8a7790",
|
|
+ "renesas,rcar-gen2-msiof";
|
|
reg = <0 0xe6c90000 0 0x0064>;
|
|
interrupts = <0 159 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&mstp2_clks R8A7790_CLK_MSIOF3>;
|
|
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
|
|
index d687f860a2da..84eefbc2b4f9 100644
|
|
--- a/arch/arm/mach-at91/pm.c
|
|
+++ b/arch/arm/mach-at91/pm.c
|
|
@@ -332,7 +332,7 @@ static void at91sam9_sdram_standby(void)
|
|
at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
|
|
}
|
|
|
|
-static const struct of_device_id const ramc_ids[] __initconst = {
|
|
+static const struct of_device_id ramc_ids[] __initconst = {
|
|
{ .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
|
|
{ .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
|
|
{ .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
|
|
diff --git a/arch/arm/mach-bcm/bcm_kona_smc.c b/arch/arm/mach-bcm/bcm_kona_smc.c
|
|
index cf3f8658f0e5..a55a7ecf146a 100644
|
|
--- a/arch/arm/mach-bcm/bcm_kona_smc.c
|
|
+++ b/arch/arm/mach-bcm/bcm_kona_smc.c
|
|
@@ -33,7 +33,7 @@ struct bcm_kona_smc_data {
|
|
unsigned result;
|
|
};
|
|
|
|
-static const struct of_device_id const bcm_kona_smc_ids[] __initconst = {
|
|
+static const struct of_device_id bcm_kona_smc_ids[] __initconst = {
|
|
{.compatible = "brcm,kona-smc"},
|
|
{.compatible = "bcm,kona-smc"}, /* deprecated name */
|
|
{},
|
|
diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c
|
|
index 9b1dc223d8d3..e17a0e025f62 100644
|
|
--- a/arch/arm/mach-cns3xxx/core.c
|
|
+++ b/arch/arm/mach-cns3xxx/core.c
|
|
@@ -346,7 +346,7 @@ static struct usb_ohci_pdata cns3xxx_usb_ohci_pdata = {
|
|
.power_off = csn3xxx_usb_power_off,
|
|
};
|
|
|
|
-static const struct of_dev_auxdata const cns3xxx_auxdata[] __initconst = {
|
|
+static const struct of_dev_auxdata cns3xxx_auxdata[] __initconst = {
|
|
{ "intel,usb-ehci", CNS3XXX_USB_BASE, "ehci-platform", &cns3xxx_usb_ehci_pdata },
|
|
{ "intel,usb-ohci", CNS3XXX_USB_OHCI_BASE, "ohci-platform", &cns3xxx_usb_ohci_pdata },
|
|
{ "cavium,cns3420-ahci", CNS3XXX_SATA2_BASE, "ahci", NULL },
|
|
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c
|
|
index 3fc2cbe52113..0ce4548ef7f0 100644
|
|
--- a/arch/arm/mach-omap2/prm_common.c
|
|
+++ b/arch/arm/mach-omap2/prm_common.c
|
|
@@ -706,7 +706,7 @@ static struct omap_prcm_init_data scrm_data __initdata = {
|
|
};
|
|
#endif
|
|
|
|
-static const struct of_device_id const omap_prcm_dt_match_table[] __initconst = {
|
|
+static const struct of_device_id omap_prcm_dt_match_table[] __initconst = {
|
|
#ifdef CONFIG_SOC_AM33XX
|
|
{ .compatible = "ti,am3-prcm", .data = &am3_prm_data },
|
|
#endif
|
|
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
|
|
index 2028167fff31..d76b1e5eb8ba 100644
|
|
--- a/arch/arm/mach-omap2/vc.c
|
|
+++ b/arch/arm/mach-omap2/vc.c
|
|
@@ -559,7 +559,7 @@ struct i2c_init_data {
|
|
u8 hsscll_12;
|
|
};
|
|
|
|
-static const struct i2c_init_data const omap4_i2c_timing_data[] __initconst = {
|
|
+static const struct i2c_init_data omap4_i2c_timing_data[] __initconst = {
|
|
{
|
|
.load = 50,
|
|
.loadbits = 0x3,
|
|
diff --git a/arch/arm/mach-spear/time.c b/arch/arm/mach-spear/time.c
|
|
index 9ccffc1d0f28..aaaa6781b9fe 100644
|
|
--- a/arch/arm/mach-spear/time.c
|
|
+++ b/arch/arm/mach-spear/time.c
|
|
@@ -204,7 +204,7 @@ static void __init spear_clockevent_init(int irq)
|
|
setup_irq(irq, &spear_timer_irq);
|
|
}
|
|
|
|
-static const struct of_device_id const timer_of_match[] __initconst = {
|
|
+static const struct of_device_id timer_of_match[] __initconst = {
|
|
{ .compatible = "st,spear-timer", },
|
|
{ },
|
|
};
|
|
diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h
|
|
index ebb9efb02502..77edb22f855d 100644
|
|
--- a/arch/mips/include/asm/irq.h
|
|
+++ b/arch/mips/include/asm/irq.h
|
|
@@ -18,9 +18,24 @@
|
|
#include <irq.h>
|
|
|
|
#define IRQ_STACK_SIZE THREAD_SIZE
|
|
+#define IRQ_STACK_START (IRQ_STACK_SIZE - sizeof(unsigned long))
|
|
|
|
extern void *irq_stack[NR_CPUS];
|
|
|
|
+/*
|
|
+ * The highest address on the IRQ stack contains a dummy frame put down in
|
|
+ * genex.S (handle_int & except_vec_vi_handler) which is structured as follows:
|
|
+ *
|
|
+ * top ------------
|
|
+ * | task sp | <- irq_stack[cpu] + IRQ_STACK_START
|
|
+ * ------------
|
|
+ * | | <- First frame of IRQ context
|
|
+ * ------------
|
|
+ *
|
|
+ * task sp holds a copy of the task stack pointer where the struct pt_regs
|
|
+ * from exception entry can be found.
|
|
+ */
|
|
+
|
|
static inline bool on_irq_stack(int cpu, unsigned long sp)
|
|
{
|
|
unsigned long low = (unsigned long)irq_stack[cpu];
|
|
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c
|
|
index ec053ce7bb38..7ab8004c1659 100644
|
|
--- a/arch/mips/kernel/asm-offsets.c
|
|
+++ b/arch/mips/kernel/asm-offsets.c
|
|
@@ -102,6 +102,7 @@ void output_thread_info_defines(void)
|
|
DEFINE(_THREAD_SIZE, THREAD_SIZE);
|
|
DEFINE(_THREAD_MASK, THREAD_MASK);
|
|
DEFINE(_IRQ_STACK_SIZE, IRQ_STACK_SIZE);
|
|
+ DEFINE(_IRQ_STACK_START, IRQ_STACK_START);
|
|
BLANK();
|
|
}
|
|
|
|
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
|
|
index 619e30e2c4f0..bb72f3ce7e29 100644
|
|
--- a/arch/mips/kernel/genex.S
|
|
+++ b/arch/mips/kernel/genex.S
|
|
@@ -216,9 +216,11 @@ NESTED(handle_int, PT_SIZE, sp)
|
|
beq t0, t1, 2f
|
|
|
|
/* Switch to IRQ stack */
|
|
- li t1, _IRQ_STACK_SIZE
|
|
+ li t1, _IRQ_STACK_START
|
|
PTR_ADD sp, t0, t1
|
|
|
|
+ /* Save task's sp on IRQ stack so that unwinding can follow it */
|
|
+ LONG_S s1, 0(sp)
|
|
2:
|
|
jal plat_irq_dispatch
|
|
|
|
@@ -326,9 +328,11 @@ NESTED(except_vec_vi_handler, 0, sp)
|
|
beq t0, t1, 2f
|
|
|
|
/* Switch to IRQ stack */
|
|
- li t1, _IRQ_STACK_SIZE
|
|
+ li t1, _IRQ_STACK_START
|
|
PTR_ADD sp, t0, t1
|
|
|
|
+ /* Save task's sp on IRQ stack so that unwinding can follow it */
|
|
+ LONG_S s1, 0(sp)
|
|
2:
|
|
jalr v0
|
|
|
|
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
|
|
index 8c26ecac930d..477ba026c3e5 100644
|
|
--- a/arch/mips/kernel/process.c
|
|
+++ b/arch/mips/kernel/process.c
|
|
@@ -483,31 +483,52 @@ unsigned long notrace unwind_stack_by_address(unsigned long stack_page,
|
|
unsigned long pc,
|
|
unsigned long *ra)
|
|
{
|
|
+ unsigned long low, high, irq_stack_high;
|
|
struct mips_frame_info info;
|
|
unsigned long size, ofs;
|
|
+ struct pt_regs *regs;
|
|
int leaf;
|
|
- extern void ret_from_irq(void);
|
|
- extern void ret_from_exception(void);
|
|
|
|
if (!stack_page)
|
|
return 0;
|
|
|
|
/*
|
|
- * If we reached the bottom of interrupt context,
|
|
- * return saved pc in pt_regs.
|
|
+ * IRQ stacks start at IRQ_STACK_START
|
|
+ * task stacks at THREAD_SIZE - 32
|
|
*/
|
|
- if (pc == (unsigned long)ret_from_irq ||
|
|
- pc == (unsigned long)ret_from_exception) {
|
|
- struct pt_regs *regs;
|
|
- if (*sp >= stack_page &&
|
|
- *sp + sizeof(*regs) <= stack_page + THREAD_SIZE - 32) {
|
|
- regs = (struct pt_regs *)*sp;
|
|
- pc = regs->cp0_epc;
|
|
- if (!user_mode(regs) && __kernel_text_address(pc)) {
|
|
- *sp = regs->regs[29];
|
|
- *ra = regs->regs[31];
|
|
- return pc;
|
|
- }
|
|
+ low = stack_page;
|
|
+ if (!preemptible() && on_irq_stack(raw_smp_processor_id(), *sp)) {
|
|
+ high = stack_page + IRQ_STACK_START;
|
|
+ irq_stack_high = high;
|
|
+ } else {
|
|
+ high = stack_page + THREAD_SIZE - 32;
|
|
+ irq_stack_high = 0;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * If we reached the top of the interrupt stack, start unwinding
|
|
+ * the interrupted task stack.
|
|
+ */
|
|
+ if (unlikely(*sp == irq_stack_high)) {
|
|
+ unsigned long task_sp = *(unsigned long *)*sp;
|
|
+
|
|
+ /*
|
|
+ * Check that the pointer saved in the IRQ stack head points to
|
|
+ * something within the stack of the current task
|
|
+ */
|
|
+ if (!object_is_on_stack((void *)task_sp))
|
|
+ return 0;
|
|
+
|
|
+ /*
|
|
+ * Follow pointer to tasks kernel stack frame where interrupted
|
|
+ * state was saved.
|
|
+ */
|
|
+ regs = (struct pt_regs *)task_sp;
|
|
+ pc = regs->cp0_epc;
|
|
+ if (!user_mode(regs) && __kernel_text_address(pc)) {
|
|
+ *sp = regs->regs[29];
|
|
+ *ra = regs->regs[31];
|
|
+ return pc;
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -528,8 +549,7 @@ unsigned long notrace unwind_stack_by_address(unsigned long stack_page,
|
|
if (leaf < 0)
|
|
return 0;
|
|
|
|
- if (*sp < stack_page ||
|
|
- *sp + info.frame_size > stack_page + THREAD_SIZE - 32)
|
|
+ if (*sp < low || *sp + info.frame_size > high)
|
|
return 0;
|
|
|
|
if (leaf)
|
|
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
|
|
index 0a93e83cd014..2026203c41e2 100644
|
|
--- a/arch/mips/kernel/vmlinux.lds.S
|
|
+++ b/arch/mips/kernel/vmlinux.lds.S
|
|
@@ -159,7 +159,7 @@ SECTIONS
|
|
* Force .bss to 64K alignment so that .bss..swapper_pg_dir
|
|
* gets that alignment. .sbss should be empty, so there will be
|
|
* no holes after __init_end. */
|
|
- BSS_SECTION(0, 0x10000, 0)
|
|
+ BSS_SECTION(0, 0x10000, 8)
|
|
|
|
_end = . ;
|
|
|
|
diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
|
|
index daf580ce5ca2..2528181232fd 100644
|
|
--- a/arch/mips/lantiq/xway/sysctrl.c
|
|
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
|
@@ -469,8 +469,8 @@ void __init ltq_soc_init(void)
|
|
panic("Failed to load xbar nodes from devicetree");
|
|
if (of_address_to_resource(np_xbar, 0, &res_xbar))
|
|
panic("Failed to get xbar resources");
|
|
- if (request_mem_region(res_xbar.start, resource_size(&res_xbar),
|
|
- res_xbar.name) < 0)
|
|
+ if (!request_mem_region(res_xbar.start, resource_size(&res_xbar),
|
|
+ res_xbar.name))
|
|
panic("Failed to get xbar resources");
|
|
|
|
ltq_xbar_membase = ioremap_nocache(res_xbar.start,
|
|
diff --git a/arch/mips/ralink/rt3883.c b/arch/mips/ralink/rt3883.c
|
|
index 3c575093f8f1..f2a6e1b8cce0 100644
|
|
--- a/arch/mips/ralink/rt3883.c
|
|
+++ b/arch/mips/ralink/rt3883.c
|
|
@@ -144,5 +144,5 @@ void prom_soc_init(struct ralink_soc_info *soc_info)
|
|
|
|
rt2880_pinmux_data = rt3883_pinmux_data;
|
|
|
|
- ralink_soc == RT3883_SOC;
|
|
+ ralink_soc = RT3883_SOC;
|
|
}
|
|
diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c
|
|
index 518f4f5f1f43..d63d42533133 100644
|
|
--- a/arch/parisc/kernel/perf.c
|
|
+++ b/arch/parisc/kernel/perf.c
|
|
@@ -39,7 +39,7 @@
|
|
* the PDC INTRIGUE calls. This is done to eliminate bugs introduced
|
|
* in various PDC revisions. The code is much more maintainable
|
|
* and reliable this way vs having to debug on every version of PDC
|
|
- * on every box.
|
|
+ * on every box.
|
|
*/
|
|
|
|
#include <linux/capability.h>
|
|
@@ -195,8 +195,8 @@ static int perf_config(uint32_t *image_ptr);
|
|
static int perf_release(struct inode *inode, struct file *file);
|
|
static int perf_open(struct inode *inode, struct file *file);
|
|
static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
|
|
-static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
|
- loff_t *ppos);
|
|
+static ssize_t perf_write(struct file *file, const char __user *buf,
|
|
+ size_t count, loff_t *ppos);
|
|
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
|
static void perf_start_counters(void);
|
|
static int perf_stop_counters(uint32_t *raddr);
|
|
@@ -222,7 +222,7 @@ extern void perf_intrigue_disable_perf_counters (void);
|
|
/*
|
|
* configure:
|
|
*
|
|
- * Configure the cpu with a given data image. First turn off the counters,
|
|
+ * Configure the cpu with a given data image. First turn off the counters,
|
|
* then download the image, then turn the counters back on.
|
|
*/
|
|
static int perf_config(uint32_t *image_ptr)
|
|
@@ -234,7 +234,7 @@ static int perf_config(uint32_t *image_ptr)
|
|
error = perf_stop_counters(raddr);
|
|
if (error != 0) {
|
|
printk("perf_config: perf_stop_counters = %ld\n", error);
|
|
- return -EINVAL;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
printk("Preparing to write image\n");
|
|
@@ -242,7 +242,7 @@ printk("Preparing to write image\n");
|
|
error = perf_write_image((uint64_t *)image_ptr);
|
|
if (error != 0) {
|
|
printk("perf_config: DOWNLOAD = %ld\n", error);
|
|
- return -EINVAL;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
printk("Preparing to start counters\n");
|
|
@@ -254,7 +254,7 @@ printk("Preparing to start counters\n");
|
|
}
|
|
|
|
/*
|
|
- * Open the device and initialize all of its memory. The device is only
|
|
+ * Open the device and initialize all of its memory. The device is only
|
|
* opened once, but can be "queried" by multiple processes that know its
|
|
* file descriptor.
|
|
*/
|
|
@@ -298,8 +298,8 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t
|
|
* called on the processor that the download should happen
|
|
* on.
|
|
*/
|
|
-static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
|
- loff_t *ppos)
|
|
+static ssize_t perf_write(struct file *file, const char __user *buf,
|
|
+ size_t count, loff_t *ppos)
|
|
{
|
|
int err;
|
|
size_t image_size;
|
|
@@ -307,11 +307,11 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
|
uint32_t interface_type;
|
|
uint32_t test;
|
|
|
|
- if (perf_processor_interface == ONYX_INTF)
|
|
+ if (perf_processor_interface == ONYX_INTF)
|
|
image_size = PCXU_IMAGE_SIZE;
|
|
- else if (perf_processor_interface == CUDA_INTF)
|
|
+ else if (perf_processor_interface == CUDA_INTF)
|
|
image_size = PCXW_IMAGE_SIZE;
|
|
- else
|
|
+ else
|
|
return -EFAULT;
|
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
@@ -331,22 +331,22 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
|
|
|
/* First check the machine type is correct for
|
|
the requested image */
|
|
- if (((perf_processor_interface == CUDA_INTF) &&
|
|
- (interface_type != CUDA_INTF)) ||
|
|
- ((perf_processor_interface == ONYX_INTF) &&
|
|
- (interface_type != ONYX_INTF)))
|
|
+ if (((perf_processor_interface == CUDA_INTF) &&
|
|
+ (interface_type != CUDA_INTF)) ||
|
|
+ ((perf_processor_interface == ONYX_INTF) &&
|
|
+ (interface_type != ONYX_INTF)))
|
|
return -EINVAL;
|
|
|
|
/* Next check to make sure the requested image
|
|
is valid */
|
|
- if (((interface_type == CUDA_INTF) &&
|
|
+ if (((interface_type == CUDA_INTF) &&
|
|
(test >= MAX_CUDA_IMAGES)) ||
|
|
- ((interface_type == ONYX_INTF) &&
|
|
- (test >= MAX_ONYX_IMAGES)))
|
|
+ ((interface_type == ONYX_INTF) &&
|
|
+ (test >= MAX_ONYX_IMAGES)))
|
|
return -EINVAL;
|
|
|
|
/* Copy the image into the processor */
|
|
- if (interface_type == CUDA_INTF)
|
|
+ if (interface_type == CUDA_INTF)
|
|
return perf_config(cuda_images[test]);
|
|
else
|
|
return perf_config(onyx_images[test]);
|
|
@@ -360,7 +360,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
|
static void perf_patch_images(void)
|
|
{
|
|
#if 0 /* FIXME!! */
|
|
-/*
|
|
+/*
|
|
* NOTE: this routine is VERY specific to the current TLB image.
|
|
* If the image is changed, this routine might also need to be changed.
|
|
*/
|
|
@@ -368,9 +368,9 @@ static void perf_patch_images(void)
|
|
extern void $i_dtlb_miss_2_0();
|
|
extern void PA2_0_iva();
|
|
|
|
- /*
|
|
+ /*
|
|
* We can only use the lower 32-bits, the upper 32-bits should be 0
|
|
- * anyway given this is in the kernel
|
|
+ * anyway given this is in the kernel
|
|
*/
|
|
uint32_t itlb_addr = (uint32_t)&($i_itlb_miss_2_0);
|
|
uint32_t dtlb_addr = (uint32_t)&($i_dtlb_miss_2_0);
|
|
@@ -378,21 +378,21 @@ static void perf_patch_images(void)
|
|
|
|
if (perf_processor_interface == ONYX_INTF) {
|
|
/* clear last 2 bytes */
|
|
- onyx_images[TLBMISS][15] &= 0xffffff00;
|
|
+ onyx_images[TLBMISS][15] &= 0xffffff00;
|
|
/* set 2 bytes */
|
|
onyx_images[TLBMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
|
onyx_images[TLBMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
|
onyx_images[TLBMISS][17] = itlb_addr;
|
|
|
|
/* clear last 2 bytes */
|
|
- onyx_images[TLBHANDMISS][15] &= 0xffffff00;
|
|
+ onyx_images[TLBHANDMISS][15] &= 0xffffff00;
|
|
/* set 2 bytes */
|
|
onyx_images[TLBHANDMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
|
onyx_images[TLBHANDMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
|
onyx_images[TLBHANDMISS][17] = itlb_addr;
|
|
|
|
/* clear last 2 bytes */
|
|
- onyx_images[BIG_CPI][15] &= 0xffffff00;
|
|
+ onyx_images[BIG_CPI][15] &= 0xffffff00;
|
|
/* set 2 bytes */
|
|
onyx_images[BIG_CPI][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
|
onyx_images[BIG_CPI][16] = (dtlb_addr << 8)&0xffffff00;
|
|
@@ -405,24 +405,24 @@ static void perf_patch_images(void)
|
|
|
|
} else if (perf_processor_interface == CUDA_INTF) {
|
|
/* Cuda interface */
|
|
- cuda_images[TLBMISS][16] =
|
|
+ cuda_images[TLBMISS][16] =
|
|
(cuda_images[TLBMISS][16]&0xffff0000) |
|
|
((dtlb_addr >> 8)&0x0000ffff);
|
|
- cuda_images[TLBMISS][17] =
|
|
+ cuda_images[TLBMISS][17] =
|
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
|
cuda_images[TLBMISS][18] = (itlb_addr << 16)&0xffff0000;
|
|
|
|
- cuda_images[TLBHANDMISS][16] =
|
|
+ cuda_images[TLBHANDMISS][16] =
|
|
(cuda_images[TLBHANDMISS][16]&0xffff0000) |
|
|
((dtlb_addr >> 8)&0x0000ffff);
|
|
- cuda_images[TLBHANDMISS][17] =
|
|
+ cuda_images[TLBHANDMISS][17] =
|
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
|
cuda_images[TLBHANDMISS][18] = (itlb_addr << 16)&0xffff0000;
|
|
|
|
- cuda_images[BIG_CPI][16] =
|
|
+ cuda_images[BIG_CPI][16] =
|
|
(cuda_images[BIG_CPI][16]&0xffff0000) |
|
|
((dtlb_addr >> 8)&0x0000ffff);
|
|
- cuda_images[BIG_CPI][17] =
|
|
+ cuda_images[BIG_CPI][17] =
|
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
|
cuda_images[BIG_CPI][18] = (itlb_addr << 16)&0xffff0000;
|
|
} else {
|
|
@@ -434,7 +434,7 @@ static void perf_patch_images(void)
|
|
|
|
/*
|
|
* ioctl routine
|
|
- * All routines effect the processor that they are executed on. Thus you
|
|
+ * All routines effect the processor that they are executed on. Thus you
|
|
* must be running on the processor that you wish to change.
|
|
*/
|
|
|
|
@@ -460,7 +460,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
}
|
|
|
|
/* copy out the Counters */
|
|
- if (copy_to_user((void __user *)arg, raddr,
|
|
+ if (copy_to_user((void __user *)arg, raddr,
|
|
sizeof (raddr)) != 0) {
|
|
error = -EFAULT;
|
|
break;
|
|
@@ -488,7 +488,7 @@ static const struct file_operations perf_fops = {
|
|
.open = perf_open,
|
|
.release = perf_release
|
|
};
|
|
-
|
|
+
|
|
static struct miscdevice perf_dev = {
|
|
MISC_DYNAMIC_MINOR,
|
|
PA_PERF_DEV,
|
|
@@ -596,7 +596,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|
/* OR sticky2 (bit 1496) to counter2 bit 32 */
|
|
tmp64 |= (userbuf[23] >> 8) & 0x0000000080000000;
|
|
raddr[2] = (uint32_t)tmp64;
|
|
-
|
|
+
|
|
/* Counter3 is bits 1497 to 1528 */
|
|
tmp64 = (userbuf[23] >> 7) & 0x00000000ffffffff;
|
|
/* OR sticky3 (bit 1529) to counter3 bit 32 */
|
|
@@ -618,7 +618,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|
userbuf[22] = 0;
|
|
userbuf[23] = 0;
|
|
|
|
- /*
|
|
+ /*
|
|
* Write back the zeroed bytes + the image given
|
|
* the read was destructive.
|
|
*/
|
|
@@ -626,13 +626,13 @@ static int perf_stop_counters(uint32_t *raddr)
|
|
} else {
|
|
|
|
/*
|
|
- * Read RDR-15 which contains the counters and sticky bits
|
|
+ * Read RDR-15 which contains the counters and sticky bits
|
|
*/
|
|
if (!perf_rdr_read_ubuf(15, userbuf)) {
|
|
return -13;
|
|
}
|
|
|
|
- /*
|
|
+ /*
|
|
* Clear out the counters
|
|
*/
|
|
perf_rdr_clear(15);
|
|
@@ -645,7 +645,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|
raddr[2] = (uint32_t)((userbuf[1] >> 32) & 0x00000000ffffffffUL);
|
|
raddr[3] = (uint32_t)(userbuf[1] & 0x00000000ffffffffUL);
|
|
}
|
|
-
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -683,7 +683,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
|
|
i = tentry->num_words;
|
|
while (i--) {
|
|
buffer[i] = 0;
|
|
- }
|
|
+ }
|
|
|
|
/* Check for bits an even number of 64 */
|
|
if ((xbits = width & 0x03f) != 0) {
|
|
@@ -809,18 +809,22 @@ static int perf_write_image(uint64_t *memaddr)
|
|
}
|
|
|
|
runway = ioremap_nocache(cpu_device->hpa.start, 4096);
|
|
+ if (!runway) {
|
|
+ pr_err("perf_write_image: ioremap failed!\n");
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
/* Merge intrigue bits into Runway STATUS 0 */
|
|
tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
|
- __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
|
|
+ __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
|
|
runway + RUNWAY_STATUS);
|
|
-
|
|
+
|
|
/* Write RUNWAY DEBUG registers */
|
|
for (i = 0; i < 8; i++) {
|
|
__raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
|
|
}
|
|
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
@@ -844,7 +848,7 @@ printk("perf_rdr_write\n");
|
|
perf_rdr_shift_out_U(rdr_num, buffer[i]);
|
|
} else {
|
|
perf_rdr_shift_out_W(rdr_num, buffer[i]);
|
|
- }
|
|
+ }
|
|
}
|
|
printk("perf_rdr_write done\n");
|
|
}
|
|
diff --git a/block/partitions/efi.c b/block/partitions/efi.c
|
|
index 26cb624ace05..d26d0d27f5fd 100644
|
|
--- a/block/partitions/efi.c
|
|
+++ b/block/partitions/efi.c
|
|
@@ -293,7 +293,7 @@ static gpt_entry *alloc_read_gpt_entries(struct parsed_partitions *state,
|
|
if (!gpt)
|
|
return NULL;
|
|
|
|
- count = le32_to_cpu(gpt->num_partition_entries) *
|
|
+ count = (size_t)le32_to_cpu(gpt->num_partition_entries) *
|
|
le32_to_cpu(gpt->sizeof_partition_entry);
|
|
if (!count)
|
|
return NULL;
|
|
@@ -352,7 +352,7 @@ static int is_gpt_valid(struct parsed_partitions *state, u64 lba,
|
|
gpt_header **gpt, gpt_entry **ptes)
|
|
{
|
|
u32 crc, origcrc;
|
|
- u64 lastlba;
|
|
+ u64 lastlba, pt_size;
|
|
|
|
if (!ptes)
|
|
return 0;
|
|
@@ -434,13 +434,20 @@ static int is_gpt_valid(struct parsed_partitions *state, u64 lba,
|
|
goto fail;
|
|
}
|
|
|
|
+ /* Sanity check partition table size */
|
|
+ pt_size = (u64)le32_to_cpu((*gpt)->num_partition_entries) *
|
|
+ le32_to_cpu((*gpt)->sizeof_partition_entry);
|
|
+ if (pt_size > KMALLOC_MAX_SIZE) {
|
|
+ pr_debug("GUID Partition Table is too large: %llu > %lu bytes\n",
|
|
+ (unsigned long long)pt_size, KMALLOC_MAX_SIZE);
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
if (!(*ptes = alloc_read_gpt_entries(state, *gpt)))
|
|
goto fail;
|
|
|
|
/* Check the GUID Partition Entry Array CRC */
|
|
- crc = efi_crc32((const unsigned char *) (*ptes),
|
|
- le32_to_cpu((*gpt)->num_partition_entries) *
|
|
- le32_to_cpu((*gpt)->sizeof_partition_entry));
|
|
+ crc = efi_crc32((const unsigned char *) (*ptes), pt_size);
|
|
|
|
if (crc != le32_to_cpu((*gpt)->partition_entry_array_crc32)) {
|
|
pr_debug("GUID Partitition Entry Array CRC check failed.\n");
|
|
diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c
|
|
index e2d94972962d..7aa10c200ecb 100644
|
|
--- a/drivers/ata/libata-transport.c
|
|
+++ b/drivers/ata/libata-transport.c
|
|
@@ -224,7 +224,6 @@ static DECLARE_TRANSPORT_CLASS(ata_port_class,
|
|
|
|
static void ata_tport_release(struct device *dev)
|
|
{
|
|
- put_device(dev->parent);
|
|
}
|
|
|
|
/**
|
|
@@ -284,7 +283,7 @@ int ata_tport_add(struct device *parent,
|
|
device_initialize(dev);
|
|
dev->type = &ata_port_type;
|
|
|
|
- dev->parent = get_device(parent);
|
|
+ dev->parent = parent;
|
|
dev->release = ata_tport_release;
|
|
dev_set_name(dev, "ata%d", ap->print_id);
|
|
transport_setup_device(dev);
|
|
@@ -348,7 +347,6 @@ static DECLARE_TRANSPORT_CLASS(ata_link_class,
|
|
|
|
static void ata_tlink_release(struct device *dev)
|
|
{
|
|
- put_device(dev->parent);
|
|
}
|
|
|
|
/**
|
|
@@ -410,7 +408,7 @@ int ata_tlink_add(struct ata_link *link)
|
|
int error;
|
|
|
|
device_initialize(dev);
|
|
- dev->parent = get_device(&ap->tdev);
|
|
+ dev->parent = &ap->tdev;
|
|
dev->release = ata_tlink_release;
|
|
if (ata_is_host_link(link))
|
|
dev_set_name(dev, "link%d", ap->print_id);
|
|
@@ -588,7 +586,6 @@ static DECLARE_TRANSPORT_CLASS(ata_dev_class,
|
|
|
|
static void ata_tdev_release(struct device *dev)
|
|
{
|
|
- put_device(dev->parent);
|
|
}
|
|
|
|
/**
|
|
@@ -661,7 +658,7 @@ static int ata_tdev_add(struct ata_device *ata_dev)
|
|
int error;
|
|
|
|
device_initialize(dev);
|
|
- dev->parent = get_device(&link->tdev);
|
|
+ dev->parent = &link->tdev;
|
|
dev->release = ata_tdev_release;
|
|
if (ata_is_host_link(link))
|
|
dev_set_name(dev, "dev%d.%d", ap->print_id,ata_dev->devno);
|
|
diff --git a/drivers/extcon/extcon-axp288.c b/drivers/extcon/extcon-axp288.c
|
|
index fd55c2f2080a..6c9d7ccebb8c 100644
|
|
--- a/drivers/extcon/extcon-axp288.c
|
|
+++ b/drivers/extcon/extcon-axp288.c
|
|
@@ -168,7 +168,7 @@ static int axp288_handle_chrg_det_event(struct axp288_extcon_info *info)
|
|
return ret;
|
|
}
|
|
|
|
- vbus_attach = (pwr_stat & PS_STAT_VBUS_PRESENT);
|
|
+ vbus_attach = (pwr_stat & PS_STAT_VBUS_VALID);
|
|
if (!vbus_attach)
|
|
goto notify_otg;
|
|
|
|
diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c
|
|
index d24f35d74b27..ae70d2485ca1 100644
|
|
--- a/drivers/firmware/psci.c
|
|
+++ b/drivers/firmware/psci.c
|
|
@@ -424,7 +424,7 @@ out_put_node:
|
|
return err;
|
|
}
|
|
|
|
-static const struct of_device_id const psci_of_match[] __initconst = {
|
|
+static const struct of_device_id psci_of_match[] __initconst = {
|
|
{ .compatible = "arm,psci", .data = psci_0_1_init},
|
|
{ .compatible = "arm,psci-0.2", .data = psci_0_2_init},
|
|
{ .compatible = "arm,psci-1.0", .data = psci_0_2_init},
|
|
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
|
|
index b6e28dcaea1d..1fb1daa0b366 100644
|
|
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
|
|
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
|
|
@@ -739,8 +739,10 @@ int kfd_wait_on_events(struct kfd_process *p,
|
|
struct kfd_event_data event_data;
|
|
|
|
if (copy_from_user(&event_data, &events[i],
|
|
- sizeof(struct kfd_event_data)))
|
|
+ sizeof(struct kfd_event_data))) {
|
|
+ ret = -EFAULT;
|
|
goto fail;
|
|
+ }
|
|
|
|
ret = init_event_waiter(p, &event_waiters[i],
|
|
event_data.event_id, i);
|
|
diff --git a/drivers/hwmon/gl520sm.c b/drivers/hwmon/gl520sm.c
|
|
index dee93ec87d02..84e0994aafdd 100644
|
|
--- a/drivers/hwmon/gl520sm.c
|
|
+++ b/drivers/hwmon/gl520sm.c
|
|
@@ -208,11 +208,13 @@ static ssize_t get_cpu_vid(struct device *dev, struct device_attribute *attr,
|
|
}
|
|
static DEVICE_ATTR(cpu0_vid, S_IRUGO, get_cpu_vid, NULL);
|
|
|
|
-#define VDD_FROM_REG(val) (((val) * 95 + 2) / 4)
|
|
-#define VDD_TO_REG(val) clamp_val((((val) * 4 + 47) / 95), 0, 255)
|
|
+#define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4)
|
|
+#define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4)
|
|
+#define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95)
|
|
|
|
-#define IN_FROM_REG(val) ((val) * 19)
|
|
-#define IN_TO_REG(val) clamp_val((((val) + 9) / 19), 0, 255)
|
|
+#define IN_FROM_REG(val) ((val) * 19)
|
|
+#define IN_CLAMP(val) clamp_val(val, 0, 255 * 19)
|
|
+#define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19)
|
|
|
|
static ssize_t get_in_input(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
@@ -349,8 +351,13 @@ static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
|
|
|
|
#define DIV_FROM_REG(val) (1 << (val))
|
|
#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) << (div))))
|
|
-#define FAN_TO_REG(val, div) ((val) <= 0 ? 0 : \
|
|
- clamp_val((480000 + ((val) << ((div)-1))) / ((val) << (div)), 1, 255))
|
|
+
|
|
+#define FAN_BASE(div) (480000 >> (div))
|
|
+#define FAN_CLAMP(val, div) clamp_val(val, FAN_BASE(div) / 255, \
|
|
+ FAN_BASE(div))
|
|
+#define FAN_TO_REG(val, div) ((val) == 0 ? 0 : \
|
|
+ DIV_ROUND_CLOSEST(480000, \
|
|
+ FAN_CLAMP(val, div) << (div)))
|
|
|
|
static ssize_t get_fan_input(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
@@ -513,9 +520,9 @@ static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
|
|
static DEVICE_ATTR(fan1_off, S_IRUGO | S_IWUSR,
|
|
get_fan_off, set_fan_off);
|
|
|
|
-#define TEMP_FROM_REG(val) (((val) - 130) * 1000)
|
|
-#define TEMP_TO_REG(val) clamp_val(((((val) < 0 ? \
|
|
- (val) - 500 : (val) + 500) / 1000) + 130), 0, 255)
|
|
+#define TEMP_FROM_REG(val) (((val) - 130) * 1000)
|
|
+#define TEMP_CLAMP(val) clamp_val(val, -130000, 125000)
|
|
+#define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 130)
|
|
|
|
static ssize_t get_temp_input(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c
|
|
index 71d3929adf54..8d65f33af5da 100644
|
|
--- a/drivers/i2c/busses/i2c-meson.c
|
|
+++ b/drivers/i2c/busses/i2c-meson.c
|
|
@@ -175,7 +175,7 @@ static void meson_i2c_put_data(struct meson_i2c *i2c, char *buf, int len)
|
|
wdata1 |= *buf++ << ((i - 4) * 8);
|
|
|
|
writel(wdata0, i2c->regs + REG_TOK_WDATA0);
|
|
- writel(wdata0, i2c->regs + REG_TOK_WDATA1);
|
|
+ writel(wdata1, i2c->regs + REG_TOK_WDATA1);
|
|
|
|
dev_dbg(i2c->dev, "%s: data %08x %08x len %d\n", __func__,
|
|
wdata0, wdata1, len);
|
|
diff --git a/drivers/iio/adc/axp288_adc.c b/drivers/iio/adc/axp288_adc.c
|
|
index 0c904edd6c00..f684fe31f832 100644
|
|
--- a/drivers/iio/adc/axp288_adc.c
|
|
+++ b/drivers/iio/adc/axp288_adc.c
|
|
@@ -28,8 +28,6 @@
|
|
#include <linux/iio/driver.h>
|
|
|
|
#define AXP288_ADC_EN_MASK 0xF1
|
|
-#define AXP288_ADC_TS_PIN_GPADC 0xF2
|
|
-#define AXP288_ADC_TS_PIN_ON 0xF3
|
|
|
|
enum axp288_adc_id {
|
|
AXP288_ADC_TS,
|
|
@@ -123,16 +121,6 @@ static int axp288_adc_read_channel(int *val, unsigned long address,
|
|
return IIO_VAL_INT;
|
|
}
|
|
|
|
-static int axp288_adc_set_ts(struct regmap *regmap, unsigned int mode,
|
|
- unsigned long address)
|
|
-{
|
|
- /* channels other than GPADC do not need to switch TS pin */
|
|
- if (address != AXP288_GP_ADC_H)
|
|
- return 0;
|
|
-
|
|
- return regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, mode);
|
|
-}
|
|
-
|
|
static int axp288_adc_read_raw(struct iio_dev *indio_dev,
|
|
struct iio_chan_spec const *chan,
|
|
int *val, int *val2, long mask)
|
|
@@ -143,16 +131,7 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev,
|
|
mutex_lock(&indio_dev->mlock);
|
|
switch (mask) {
|
|
case IIO_CHAN_INFO_RAW:
|
|
- if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_GPADC,
|
|
- chan->address)) {
|
|
- dev_err(&indio_dev->dev, "GPADC mode\n");
|
|
- ret = -EINVAL;
|
|
- break;
|
|
- }
|
|
ret = axp288_adc_read_channel(val, chan->address, info->regmap);
|
|
- if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_ON,
|
|
- chan->address))
|
|
- dev_err(&indio_dev->dev, "TS pin restore\n");
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
@@ -162,15 +141,6 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev,
|
|
return ret;
|
|
}
|
|
|
|
-static int axp288_adc_set_state(struct regmap *regmap)
|
|
-{
|
|
- /* ADC should be always enabled for internal FG to function */
|
|
- if (regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, AXP288_ADC_TS_PIN_ON))
|
|
- return -EIO;
|
|
-
|
|
- return regmap_write(regmap, AXP20X_ADC_EN1, AXP288_ADC_EN_MASK);
|
|
-}
|
|
-
|
|
static const struct iio_info axp288_adc_iio_info = {
|
|
.read_raw = &axp288_adc_read_raw,
|
|
.driver_module = THIS_MODULE,
|
|
@@ -199,7 +169,7 @@ static int axp288_adc_probe(struct platform_device *pdev)
|
|
* Set ADC to enabled state at all time, including system suspend.
|
|
* otherwise internal fuel gauge functionality may be affected.
|
|
*/
|
|
- ret = axp288_adc_set_state(axp20x->regmap);
|
|
+ ret = regmap_write(info->regmap, AXP20X_ADC_EN1, AXP288_ADC_EN_MASK);
|
|
if (ret) {
|
|
dev_err(&pdev->dev, "unable to enable ADC device\n");
|
|
return ret;
|
|
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c
|
|
index 6c8ff10101c0..77cc77ba998f 100644
|
|
--- a/drivers/infiniband/hw/qib/qib_iba7322.c
|
|
+++ b/drivers/infiniband/hw/qib/qib_iba7322.c
|
|
@@ -7097,7 +7097,7 @@ static void qib_7322_txchk_change(struct qib_devdata *dd, u32 start,
|
|
unsigned long flags;
|
|
|
|
while (wait) {
|
|
- unsigned long shadow;
|
|
+ unsigned long shadow = 0;
|
|
int cstart, previ = -1;
|
|
|
|
/*
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
index 6699ecd855f0..bad76eed06b3 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
@@ -1239,7 +1239,7 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv)
|
|
rcu_dereference_protected(neigh->hnext,
|
|
lockdep_is_held(&priv->lock)));
|
|
/* remove from path/mc list */
|
|
- list_del(&neigh->list);
|
|
+ list_del_init(&neigh->list);
|
|
call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
|
|
} else {
|
|
np = &neigh->hnext;
|
|
@@ -1406,7 +1406,7 @@ void ipoib_neigh_free(struct ipoib_neigh *neigh)
|
|
rcu_dereference_protected(neigh->hnext,
|
|
lockdep_is_held(&priv->lock)));
|
|
/* remove from parent list */
|
|
- list_del(&neigh->list);
|
|
+ list_del_init(&neigh->list);
|
|
call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
|
|
return;
|
|
} else {
|
|
@@ -1491,7 +1491,7 @@ void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid)
|
|
rcu_dereference_protected(neigh->hnext,
|
|
lockdep_is_held(&priv->lock)));
|
|
/* remove from parent list */
|
|
- list_del(&neigh->list);
|
|
+ list_del_init(&neigh->list);
|
|
call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
|
|
} else {
|
|
np = &neigh->hnext;
|
|
@@ -1533,7 +1533,7 @@ static void ipoib_flush_neighs(struct ipoib_dev_priv *priv)
|
|
rcu_dereference_protected(neigh->hnext,
|
|
lockdep_is_held(&priv->lock)));
|
|
/* remove from path/mc list */
|
|
- list_del(&neigh->list);
|
|
+ list_del_init(&neigh->list);
|
|
call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
|
|
}
|
|
}
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
|
|
index 57a34f87dedf..9b47a437d6c9 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
|
|
@@ -160,11 +160,11 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
|
|
out:
|
|
up_write(&ppriv->vlan_rwsem);
|
|
|
|
+ rtnl_unlock();
|
|
+
|
|
if (result)
|
|
free_netdev(priv->dev);
|
|
|
|
- rtnl_unlock();
|
|
-
|
|
return result;
|
|
}
|
|
|
|
@@ -185,7 +185,6 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
|
|
list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) {
|
|
if (priv->pkey == pkey &&
|
|
priv->child_type == IPOIB_LEGACY_CHILD) {
|
|
- unregister_netdevice(priv->dev);
|
|
list_del(&priv->list);
|
|
dev = priv->dev;
|
|
break;
|
|
@@ -193,6 +192,11 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
|
|
}
|
|
up_write(&ppriv->vlan_rwsem);
|
|
|
|
+ if (dev) {
|
|
+ ipoib_dbg(ppriv, "delete child vlan %s\n", dev->name);
|
|
+ unregister_netdevice(dev);
|
|
+ }
|
|
+
|
|
rtnl_unlock();
|
|
|
|
if (dev) {
|
|
diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
|
|
index dad768caa9c5..18751b1dfd3d 100644
|
|
--- a/drivers/iommu/io-pgtable-arm.c
|
|
+++ b/drivers/iommu/io-pgtable-arm.c
|
|
@@ -335,8 +335,12 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
|
|
if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
|
|
pte |= ARM_LPAE_PTE_NSTABLE;
|
|
__arm_lpae_set_pte(ptep, pte, cfg);
|
|
- } else {
|
|
+ } else if (!iopte_leaf(pte, lvl)) {
|
|
cptep = iopte_deref(pte, data);
|
|
+ } else {
|
|
+ /* We require an unmap first */
|
|
+ WARN_ON(!selftest_running);
|
|
+ return -EEXIST;
|
|
}
|
|
|
|
/* Rinse, repeat */
|
|
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
|
|
index e5ee4e9e0ea5..a8a86d450d76 100644
|
|
--- a/drivers/md/raid10.c
|
|
+++ b/drivers/md/raid10.c
|
|
@@ -1414,11 +1414,24 @@ retry_write:
|
|
mbio->bi_private = r10_bio;
|
|
|
|
atomic_inc(&r10_bio->remaining);
|
|
+
|
|
+ cb = blk_check_plugged(raid10_unplug, mddev,
|
|
+ sizeof(*plug));
|
|
+ if (cb)
|
|
+ plug = container_of(cb, struct raid10_plug_cb,
|
|
+ cb);
|
|
+ else
|
|
+ plug = NULL;
|
|
spin_lock_irqsave(&conf->device_lock, flags);
|
|
- bio_list_add(&conf->pending_bio_list, mbio);
|
|
- conf->pending_count++;
|
|
+ if (plug) {
|
|
+ bio_list_add(&plug->pending, mbio);
|
|
+ plug->pending_cnt++;
|
|
+ } else {
|
|
+ bio_list_add(&conf->pending_bio_list, mbio);
|
|
+ conf->pending_count++;
|
|
+ }
|
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
|
- if (!mddev_check_plugged(mddev))
|
|
+ if (!plug)
|
|
md_wakeup_thread(mddev->thread);
|
|
}
|
|
}
|
|
diff --git a/drivers/media/pci/ttpci/av7110_hw.c b/drivers/media/pci/ttpci/av7110_hw.c
|
|
index 300bd3c94738..0992bb0e207e 100644
|
|
--- a/drivers/media/pci/ttpci/av7110_hw.c
|
|
+++ b/drivers/media/pci/ttpci/av7110_hw.c
|
|
@@ -56,11 +56,11 @@
|
|
by Nathan Laredo <laredo@gnu.org> */
|
|
|
|
int av7110_debiwrite(struct av7110 *av7110, u32 config,
|
|
- int addr, u32 val, int count)
|
|
+ int addr, u32 val, unsigned int count)
|
|
{
|
|
struct saa7146_dev *dev = av7110->dev;
|
|
|
|
- if (count <= 0 || count > 32764) {
|
|
+ if (count > 32764) {
|
|
printk("%s: invalid count %d\n", __func__, count);
|
|
return -1;
|
|
}
|
|
@@ -78,12 +78,12 @@ int av7110_debiwrite(struct av7110 *av7110, u32 config,
|
|
return 0;
|
|
}
|
|
|
|
-u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, int count)
|
|
+u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, unsigned int count)
|
|
{
|
|
struct saa7146_dev *dev = av7110->dev;
|
|
u32 result = 0;
|
|
|
|
- if (count > 32764 || count <= 0) {
|
|
+ if (count > 32764) {
|
|
printk("%s: invalid count %d\n", __func__, count);
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/media/pci/ttpci/av7110_hw.h b/drivers/media/pci/ttpci/av7110_hw.h
|
|
index 1634aba5cb84..ccb148059406 100644
|
|
--- a/drivers/media/pci/ttpci/av7110_hw.h
|
|
+++ b/drivers/media/pci/ttpci/av7110_hw.h
|
|
@@ -377,14 +377,14 @@ extern int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
|
|
|
|
/* DEBI (saa7146 data extension bus interface) access */
|
|
extern int av7110_debiwrite(struct av7110 *av7110, u32 config,
|
|
- int addr, u32 val, int count);
|
|
+ int addr, u32 val, unsigned int count);
|
|
extern u32 av7110_debiread(struct av7110 *av7110, u32 config,
|
|
- int addr, int count);
|
|
+ int addr, unsigned int count);
|
|
|
|
|
|
/* DEBI during interrupt */
|
|
/* single word writes */
|
|
-static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
|
|
+static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
|
|
{
|
|
av7110_debiwrite(av7110, config, addr, val, count);
|
|
}
|
|
@@ -397,7 +397,7 @@ static inline void mwdebi(struct av7110 *av7110, u32 config, int addr,
|
|
av7110_debiwrite(av7110, config, addr, 0, count);
|
|
}
|
|
|
|
-static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
|
|
+static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
|
|
{
|
|
u32 res;
|
|
|
|
@@ -408,7 +408,7 @@ static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, i
|
|
}
|
|
|
|
/* DEBI outside interrupts, only for count <= 4! */
|
|
-static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
|
|
+static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
|
|
{
|
|
unsigned long flags;
|
|
|
|
@@ -417,7 +417,7 @@ static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, i
|
|
spin_unlock_irqrestore(&av7110->debilock, flags);
|
|
}
|
|
|
|
-static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
|
|
+static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
|
|
{
|
|
unsigned long flags;
|
|
u32 res;
|
|
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
index 9b9e423e4fc4..15c543d4b366 100644
|
|
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
@@ -849,9 +849,7 @@ int gsc_prepare_addr(struct gsc_ctx *ctx, struct vb2_buffer *vb,
|
|
|
|
if ((frame->fmt->pixelformat == V4L2_PIX_FMT_VYUY) ||
|
|
(frame->fmt->pixelformat == V4L2_PIX_FMT_YVYU) ||
|
|
- (frame->fmt->pixelformat == V4L2_PIX_FMT_NV61) ||
|
|
(frame->fmt->pixelformat == V4L2_PIX_FMT_YVU420) ||
|
|
- (frame->fmt->pixelformat == V4L2_PIX_FMT_NV21) ||
|
|
(frame->fmt->pixelformat == V4L2_PIX_FMT_YVU420M))
|
|
swap(addr->cb, addr->cr);
|
|
|
|
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
|
|
index 7e327a6dd53d..c23bc4f331bd 100644
|
|
--- a/drivers/mmc/core/sdio_bus.c
|
|
+++ b/drivers/mmc/core/sdio_bus.c
|
|
@@ -266,7 +266,7 @@ static void sdio_release_func(struct device *dev)
|
|
sdio_free_func_cis(func);
|
|
|
|
kfree(func->info);
|
|
-
|
|
+ kfree(func->tmpbuf);
|
|
kfree(func);
|
|
}
|
|
|
|
@@ -281,6 +281,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
|
|
if (!func)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
+ /*
|
|
+ * allocate buffer separately to make sure it's properly aligned for
|
|
+ * DMA usage (incl. 64 bit DMA)
|
|
+ */
|
|
+ func->tmpbuf = kmalloc(4, GFP_KERNEL);
|
|
+ if (!func->tmpbuf) {
|
|
+ kfree(func);
|
|
+ return ERR_PTR(-ENOMEM);
|
|
+ }
|
|
+
|
|
func->card = card;
|
|
|
|
device_initialize(&func->dev);
|
|
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
|
|
index fa3b4cbea23b..a481ea64e287 100644
|
|
--- a/drivers/net/ethernet/intel/igb/igb_main.c
|
|
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
|
|
@@ -7658,6 +7658,11 @@ static pci_ers_result_t igb_io_slot_reset(struct pci_dev *pdev)
|
|
pci_enable_wake(pdev, PCI_D3hot, 0);
|
|
pci_enable_wake(pdev, PCI_D3cold, 0);
|
|
|
|
+ /* In case of PCI error, adapter lose its HW address
|
|
+ * so we should re-assign it here.
|
|
+ */
|
|
+ hw->hw_addr = adapter->io_addr;
|
|
+
|
|
igb_reset(adapter);
|
|
wr32(E1000_WUS, ~0);
|
|
result = PCI_ERS_RESULT_RECOVERED;
|
|
diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h
|
|
index 72fcfc924589..0d18be0fed8e 100644
|
|
--- a/drivers/net/ethernet/renesas/sh_eth.h
|
|
+++ b/drivers/net/ethernet/renesas/sh_eth.h
|
|
@@ -339,7 +339,7 @@ enum FELIC_MODE_BIT {
|
|
ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
|
|
ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
|
|
ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
|
|
- ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
|
|
+ ECMR_MPDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
|
|
ECMR_RTM = 0x00000010, ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004,
|
|
ECMR_DM = 0x00000002, ECMR_PRM = 0x00000001,
|
|
};
|
|
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
|
|
index a5f392ae30d5..61cd53838360 100644
|
|
--- a/drivers/net/team/team.c
|
|
+++ b/drivers/net/team/team.c
|
|
@@ -2343,8 +2343,10 @@ start_again:
|
|
|
|
hdr = genlmsg_put(skb, portid, seq, &team_nl_family, flags | NLM_F_MULTI,
|
|
TEAM_CMD_OPTIONS_GET);
|
|
- if (!hdr)
|
|
+ if (!hdr) {
|
|
+ nlmsg_free(skb);
|
|
return -EMSGSIZE;
|
|
+ }
|
|
|
|
if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex))
|
|
goto nla_put_failure;
|
|
@@ -2611,8 +2613,10 @@ start_again:
|
|
|
|
hdr = genlmsg_put(skb, portid, seq, &team_nl_family, flags | NLM_F_MULTI,
|
|
TEAM_CMD_PORT_LIST_GET);
|
|
- if (!hdr)
|
|
+ if (!hdr) {
|
|
+ nlmsg_free(skb);
|
|
return -EMSGSIZE;
|
|
+ }
|
|
|
|
if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex))
|
|
goto nla_put_failure;
|
|
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
|
|
index 7f83504dfa69..1f6893ebce16 100644
|
|
--- a/drivers/net/usb/Kconfig
|
|
+++ b/drivers/net/usb/Kconfig
|
|
@@ -364,7 +364,7 @@ config USB_NET_NET1080
|
|
optionally with LEDs that indicate traffic
|
|
|
|
config USB_NET_PLUSB
|
|
- tristate "Prolific PL-2301/2302/25A1 based cables"
|
|
+ tristate "Prolific PL-2301/2302/25A1/27A1 based cables"
|
|
# if the handshake/init/reset problems, from original 'plusb',
|
|
# are ever resolved ... then remove "experimental"
|
|
depends on USB_USBNET
|
|
diff --git a/drivers/net/usb/plusb.c b/drivers/net/usb/plusb.c
|
|
index 1bfe0fcaccf5..7c02231c1a1b 100644
|
|
--- a/drivers/net/usb/plusb.c
|
|
+++ b/drivers/net/usb/plusb.c
|
|
@@ -102,7 +102,7 @@ static int pl_reset(struct usbnet *dev)
|
|
}
|
|
|
|
static const struct driver_info prolific_info = {
|
|
- .description = "Prolific PL-2301/PL-2302/PL-25A1",
|
|
+ .description = "Prolific PL-2301/PL-2302/PL-25A1/PL-27A1",
|
|
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT,
|
|
/* some PL-2302 versions seem to fail usb_set_interface() */
|
|
.reset = pl_reset,
|
|
@@ -139,6 +139,17 @@ static const struct usb_device_id products [] = {
|
|
* Host-to-Host Cable
|
|
*/
|
|
.driver_info = (unsigned long) &prolific_info,
|
|
+
|
|
+},
|
|
+
|
|
+/* super speed cables */
|
|
+{
|
|
+ USB_DEVICE(0x067b, 0x27a1), /* PL-27A1, no eeprom
|
|
+ * also: goobay Active USB 3.0
|
|
+ * Data Link,
|
|
+ * Unitek Y-3501
|
|
+ */
|
|
+ .driver_info = (unsigned long) &prolific_info,
|
|
},
|
|
|
|
{ }, // END
|
|
@@ -158,5 +169,5 @@ static struct usb_driver plusb_driver = {
|
|
module_usb_driver(plusb_driver);
|
|
|
|
MODULE_AUTHOR("David Brownell");
|
|
-MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1 USB Host to Host Link Driver");
|
|
+MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1/27A1 USB Host to Host Link Driver");
|
|
MODULE_LICENSE("GPL");
|
|
diff --git a/drivers/tty/goldfish.c b/drivers/tty/goldfish.c
|
|
index 0f82c0b146f6..e04b57f79df8 100644
|
|
--- a/drivers/tty/goldfish.c
|
|
+++ b/drivers/tty/goldfish.c
|
|
@@ -293,7 +293,7 @@ static int goldfish_tty_probe(struct platform_device *pdev)
|
|
return 0;
|
|
|
|
err_tty_register_device_failed:
|
|
- free_irq(irq, pdev);
|
|
+ free_irq(irq, qtty);
|
|
err_request_irq_failed:
|
|
goldfish_tty_current_line_count--;
|
|
if (goldfish_tty_current_line_count == 0)
|
|
diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c
|
|
index 0cf149edddd8..f36a1ac3bfbd 100644
|
|
--- a/drivers/usb/chipidea/otg.c
|
|
+++ b/drivers/usb/chipidea/otg.c
|
|
@@ -134,9 +134,9 @@ void ci_handle_vbus_change(struct ci_hdrc *ci)
|
|
if (!ci->is_otg)
|
|
return;
|
|
|
|
- if (hw_read_otgsc(ci, OTGSC_BSV))
|
|
+ if (hw_read_otgsc(ci, OTGSC_BSV) && !ci->vbus_active)
|
|
usb_gadget_vbus_connect(&ci->gadget);
|
|
- else
|
|
+ else if (!hw_read_otgsc(ci, OTGSC_BSV) && ci->vbus_active)
|
|
usb_gadget_vbus_disconnect(&ci->gadget);
|
|
}
|
|
|
|
@@ -175,14 +175,21 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)
|
|
|
|
ci_role_stop(ci);
|
|
|
|
- if (role == CI_ROLE_GADGET)
|
|
+ if (role == CI_ROLE_GADGET &&
|
|
+ IS_ERR(ci->platdata->vbus_extcon.edev))
|
|
/*
|
|
- * wait vbus lower than OTGSC_BSV before connecting
|
|
- * to host
|
|
+ * Wait vbus lower than OTGSC_BSV before connecting
|
|
+ * to host. If connecting status is from an external
|
|
+ * connector instead of register, we don't need to
|
|
+ * care vbus on the board, since it will not affect
|
|
+ * external connector status.
|
|
*/
|
|
hw_wait_vbus_lower_bsv(ci);
|
|
|
|
ci_role_start(ci, role);
|
|
+ /* vbus change may have already occurred */
|
|
+ if (role == CI_ROLE_GADGET)
|
|
+ ci_handle_vbus_change(ci);
|
|
}
|
|
}
|
|
/**
|
|
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
|
|
index e56cdb436de3..4581fa1dec98 100644
|
|
--- a/drivers/usb/serial/mos7720.c
|
|
+++ b/drivers/usb/serial/mos7720.c
|
|
@@ -234,11 +234,16 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
|
|
|
|
status = usb_control_msg(usbdev, pipe, request, requesttype, value,
|
|
index, buf, 1, MOS_WDR_TIMEOUT);
|
|
- if (status == 1)
|
|
+ if (status == 1) {
|
|
*data = *buf;
|
|
- else if (status < 0)
|
|
+ } else {
|
|
dev_err(&usbdev->dev,
|
|
"mos7720: usb_control_msg() failed: %d\n", status);
|
|
+ if (status >= 0)
|
|
+ status = -EIO;
|
|
+ *data = 0;
|
|
+ }
|
|
+
|
|
kfree(buf);
|
|
|
|
return status;
|
|
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
|
|
index d17685cc00c9..ed883a7ad533 100644
|
|
--- a/drivers/usb/serial/mos7840.c
|
|
+++ b/drivers/usb/serial/mos7840.c
|
|
@@ -285,9 +285,15 @@ static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
|
|
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
|
|
MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
|
|
MOS_WDR_TIMEOUT);
|
|
+ if (ret < VENDOR_READ_LENGTH) {
|
|
+ if (ret >= 0)
|
|
+ ret = -EIO;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
*val = buf[0];
|
|
dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
|
|
-
|
|
+out:
|
|
kfree(buf);
|
|
return ret;
|
|
}
|
|
@@ -353,8 +359,13 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
|
|
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
|
|
MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
|
|
MOS_WDR_TIMEOUT);
|
|
+ if (ret < VENDOR_READ_LENGTH) {
|
|
+ if (ret >= 0)
|
|
+ ret = -EIO;
|
|
+ goto out;
|
|
+ }
|
|
*val = buf[0];
|
|
-
|
|
+out:
|
|
kfree(buf);
|
|
return ret;
|
|
}
|
|
@@ -1490,10 +1501,10 @@ static int mos7840_tiocmget(struct tty_struct *tty)
|
|
return -ENODEV;
|
|
|
|
status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
|
|
- if (status != 1)
|
|
+ if (status < 0)
|
|
return -EIO;
|
|
status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
|
|
- if (status != 1)
|
|
+ if (status < 0)
|
|
return -EIO;
|
|
result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
|
|
| ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
|
|
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
|
|
index ff36f5475d7e..09a0cf5f3dd8 100644
|
|
--- a/fs/gfs2/glock.c
|
|
+++ b/fs/gfs2/glock.c
|
|
@@ -1798,16 +1798,18 @@ void gfs2_glock_exit(void)
|
|
|
|
static void gfs2_glock_iter_next(struct gfs2_glock_iter *gi)
|
|
{
|
|
- do {
|
|
- gi->gl = rhashtable_walk_next(&gi->hti);
|
|
+ while ((gi->gl = rhashtable_walk_next(&gi->hti))) {
|
|
if (IS_ERR(gi->gl)) {
|
|
if (PTR_ERR(gi->gl) == -EAGAIN)
|
|
continue;
|
|
gi->gl = NULL;
|
|
+ return;
|
|
}
|
|
- /* Skip entries for other sb and dead entries */
|
|
- } while ((gi->gl) && ((gi->sdp != gi->gl->gl_name.ln_sbd) ||
|
|
- __lockref_is_dead(&gi->gl->gl_lockref)));
|
|
+ /* Skip entries for other sb and dead entries */
|
|
+ if (gi->sdp == gi->gl->gl_name.ln_sbd &&
|
|
+ !__lockref_is_dead(&gi->gl->gl_lockref))
|
|
+ return;
|
|
+ }
|
|
}
|
|
|
|
static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
|
|
diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c
|
|
index 686ba6fb20dd..8067364c602f 100644
|
|
--- a/fs/xfs/kmem.c
|
|
+++ b/fs/xfs/kmem.c
|
|
@@ -24,24 +24,6 @@
|
|
#include "kmem.h"
|
|
#include "xfs_message.h"
|
|
|
|
-/*
|
|
- * Greedy allocation. May fail and may return vmalloced memory.
|
|
- */
|
|
-void *
|
|
-kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize)
|
|
-{
|
|
- void *ptr;
|
|
- size_t kmsize = maxsize;
|
|
-
|
|
- while (!(ptr = vzalloc(kmsize))) {
|
|
- if ((kmsize >>= 1) <= minsize)
|
|
- kmsize = minsize;
|
|
- }
|
|
- if (ptr)
|
|
- *size = kmsize;
|
|
- return ptr;
|
|
-}
|
|
-
|
|
void *
|
|
kmem_alloc(size_t size, xfs_km_flags_t flags)
|
|
{
|
|
diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h
|
|
index cc6b768fc068..ae45f77ce33b 100644
|
|
--- a/fs/xfs/kmem.h
|
|
+++ b/fs/xfs/kmem.h
|
|
@@ -69,8 +69,6 @@ static inline void kmem_free(const void *ptr)
|
|
}
|
|
|
|
|
|
-extern void *kmem_zalloc_greedy(size_t *, size_t, size_t);
|
|
-
|
|
static inline void *
|
|
kmem_zalloc(size_t size, xfs_km_flags_t flags)
|
|
{
|
|
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
|
|
index 930ebd86beba..99a4891c00ab 100644
|
|
--- a/fs/xfs/xfs_itable.c
|
|
+++ b/fs/xfs/xfs_itable.c
|
|
@@ -351,7 +351,6 @@ xfs_bulkstat(
|
|
xfs_agino_t agino; /* inode # in allocation group */
|
|
xfs_agnumber_t agno; /* allocation group number */
|
|
xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */
|
|
- size_t irbsize; /* size of irec buffer in bytes */
|
|
xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */
|
|
int nirbuf; /* size of irbuf */
|
|
int ubcount; /* size of user's buffer */
|
|
@@ -378,11 +377,10 @@ xfs_bulkstat(
|
|
*ubcountp = 0;
|
|
*done = 0;
|
|
|
|
- irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4);
|
|
+ irbuf = kmem_zalloc_large(PAGE_SIZE * 4, KM_SLEEP);
|
|
if (!irbuf)
|
|
return -ENOMEM;
|
|
-
|
|
- nirbuf = irbsize / sizeof(*irbuf);
|
|
+ nirbuf = (PAGE_SIZE * 4) / sizeof(*irbuf);
|
|
|
|
/*
|
|
* Loop over the allocation groups, starting from the last
|
|
diff --git a/include/linux/audit.h b/include/linux/audit.h
|
|
index 20eba1eb0a3c..faac391badac 100644
|
|
--- a/include/linux/audit.h
|
|
+++ b/include/linux/audit.h
|
|
@@ -281,6 +281,20 @@ static inline int audit_socketcall(int nargs, unsigned long *args)
|
|
return __audit_socketcall(nargs, args);
|
|
return 0;
|
|
}
|
|
+
|
|
+static inline int audit_socketcall_compat(int nargs, u32 *args)
|
|
+{
|
|
+ unsigned long a[AUDITSC_ARGS];
|
|
+ int i;
|
|
+
|
|
+ if (audit_dummy_context())
|
|
+ return 0;
|
|
+
|
|
+ for (i = 0; i < nargs; i++)
|
|
+ a[i] = (unsigned long)args[i];
|
|
+ return __audit_socketcall(nargs, a);
|
|
+}
|
|
+
|
|
static inline int audit_sockaddr(int len, void *addr)
|
|
{
|
|
if (unlikely(!audit_dummy_context()))
|
|
@@ -407,6 +421,12 @@ static inline int audit_socketcall(int nargs, unsigned long *args)
|
|
{
|
|
return 0;
|
|
}
|
|
+
|
|
+static inline int audit_socketcall_compat(int nargs, u32 *args)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static inline void audit_fd_pair(int fd1, int fd2)
|
|
{ }
|
|
static inline int audit_sockaddr(int len, void *addr)
|
|
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
|
|
index aab032a6ae61..97ca105347a6 100644
|
|
--- a/include/linux/mmc/sdio_func.h
|
|
+++ b/include/linux/mmc/sdio_func.h
|
|
@@ -53,7 +53,7 @@ struct sdio_func {
|
|
unsigned int state; /* function state */
|
|
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
|
|
|
|
- u8 tmpbuf[4]; /* DMA:able scratch buffer */
|
|
+ u8 *tmpbuf; /* DMA:able scratch buffer */
|
|
|
|
unsigned num_info; /* number of info strings */
|
|
const char **info; /* info strings */
|
|
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
|
|
index 0b69a7753558..f28f79966e9e 100644
|
|
--- a/include/uapi/drm/drm_fourcc.h
|
|
+++ b/include/uapi/drm/drm_fourcc.h
|
|
@@ -150,6 +150,7 @@
|
|
|
|
/* Vendor Ids: */
|
|
#define DRM_FORMAT_MOD_NONE 0
|
|
+#define DRM_FORMAT_MOD_VENDOR_NONE 0
|
|
#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
|
|
#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
|
|
#define DRM_FORMAT_MOD_VENDOR_NV 0x03
|
|
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
|
|
index ff8bb41d713f..a1f697ec4fc2 100644
|
|
--- a/net/bridge/br_netlink.c
|
|
+++ b/net/bridge/br_netlink.c
|
|
@@ -1073,11 +1073,14 @@ static int br_dev_newlink(struct net *src_net, struct net_device *dev,
|
|
spin_unlock_bh(&br->lock);
|
|
}
|
|
|
|
- err = br_changelink(dev, tb, data);
|
|
+ err = register_netdevice(dev);
|
|
if (err)
|
|
return err;
|
|
|
|
- return register_netdevice(dev);
|
|
+ err = br_changelink(dev, tb, data);
|
|
+ if (err)
|
|
+ unregister_netdevice(dev);
|
|
+ return err;
|
|
}
|
|
|
|
static size_t br_get_size(const struct net_device *brdev)
|
|
diff --git a/net/compat.c b/net/compat.c
|
|
index 5cfd26a0006f..0ccf3ecf6bbb 100644
|
|
--- a/net/compat.c
|
|
+++ b/net/compat.c
|
|
@@ -22,6 +22,7 @@
|
|
#include <linux/filter.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/security.h>
|
|
+#include <linux/audit.h>
|
|
#include <linux/export.h>
|
|
|
|
#include <net/scm.h>
|
|
@@ -767,14 +768,24 @@ COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
|
|
|
|
COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
|
|
{
|
|
- int ret;
|
|
- u32 a[6];
|
|
+ u32 a[AUDITSC_ARGS];
|
|
+ unsigned int len;
|
|
u32 a0, a1;
|
|
+ int ret;
|
|
|
|
if (call < SYS_SOCKET || call > SYS_SENDMMSG)
|
|
return -EINVAL;
|
|
- if (copy_from_user(a, args, nas[call]))
|
|
+ len = nas[call];
|
|
+ if (len > sizeof(a))
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (copy_from_user(a, args, len))
|
|
return -EFAULT;
|
|
+
|
|
+ ret = audit_socketcall_compat(len / sizeof(a[0]), a);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
a0 = a[0];
|
|
a1 = a[1];
|
|
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 24d243084aab..dac52fa60f25 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -2338,6 +2338,9 @@ void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason)
|
|
{
|
|
unsigned long flags;
|
|
|
|
+ if (unlikely(!skb))
|
|
+ return;
|
|
+
|
|
if (likely(atomic_read(&skb->users) == 1)) {
|
|
smp_rmb();
|
|
atomic_set(&skb->users, 0);
|
|
diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c
|
|
index ddb894ac1458..2689c9c4f1a0 100644
|
|
--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
|
|
+++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
|
|
@@ -1304,6 +1304,7 @@ static int __init nf_nat_snmp_basic_init(void)
|
|
static void __exit nf_nat_snmp_basic_fini(void)
|
|
{
|
|
RCU_INIT_POINTER(nf_nat_snmp_hook, NULL);
|
|
+ synchronize_rcu();
|
|
nf_conntrack_helper_unregister(&snmp_trap_helper);
|
|
}
|
|
|
|
diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c
|
|
index 4e78c57b818f..f3b92ce463b0 100644
|
|
--- a/net/netfilter/nf_conntrack_ecache.c
|
|
+++ b/net/netfilter/nf_conntrack_ecache.c
|
|
@@ -200,6 +200,7 @@ void nf_conntrack_unregister_notifier(struct net *net,
|
|
BUG_ON(notify != new);
|
|
RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
+ /* synchronize_rcu() is called from ctnetlink_exit. */
|
|
}
|
|
EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
|
|
|
|
@@ -236,6 +237,7 @@ void nf_ct_expect_unregister_notifier(struct net *net,
|
|
BUG_ON(notify != new);
|
|
RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL);
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
+ /* synchronize_rcu() is called from ctnetlink_exit. */
|
|
}
|
|
EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);
|
|
|
|
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
|
|
index e565b2becb14..660939df7c94 100644
|
|
--- a/net/netfilter/nf_conntrack_netlink.c
|
|
+++ b/net/netfilter/nf_conntrack_netlink.c
|
|
@@ -3415,6 +3415,7 @@ static void __exit ctnetlink_exit(void)
|
|
#ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
|
|
RCU_INIT_POINTER(nfnl_ct_hook, NULL);
|
|
#endif
|
|
+ synchronize_rcu();
|
|
}
|
|
|
|
module_init(ctnetlink_init);
|
|
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
|
|
index 06a9f45771ab..44516c90118a 100644
|
|
--- a/net/netfilter/nf_nat_core.c
|
|
+++ b/net/netfilter/nf_nat_core.c
|
|
@@ -892,6 +892,8 @@ static void __exit nf_nat_cleanup(void)
|
|
#ifdef CONFIG_XFRM
|
|
RCU_INIT_POINTER(nf_nat_decode_session_hook, NULL);
|
|
#endif
|
|
+ synchronize_rcu();
|
|
+
|
|
for (i = 0; i < NFPROTO_NUMPROTO; i++)
|
|
kfree(nf_nat_l4protos[i]);
|
|
synchronize_net();
|
|
diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c
|
|
index 54330fb5efaf..6d10002d23f8 100644
|
|
--- a/net/netfilter/nfnetlink_cthelper.c
|
|
+++ b/net/netfilter/nfnetlink_cthelper.c
|
|
@@ -161,6 +161,7 @@ nfnl_cthelper_parse_expect_policy(struct nf_conntrack_helper *helper,
|
|
int i, ret;
|
|
struct nf_conntrack_expect_policy *expect_policy;
|
|
struct nlattr *tb[NFCTH_POLICY_SET_MAX+1];
|
|
+ unsigned int class_max;
|
|
|
|
ret = nla_parse_nested(tb, NFCTH_POLICY_SET_MAX, attr,
|
|
nfnl_cthelper_expect_policy_set);
|
|
@@ -170,19 +171,18 @@ nfnl_cthelper_parse_expect_policy(struct nf_conntrack_helper *helper,
|
|
if (!tb[NFCTH_POLICY_SET_NUM])
|
|
return -EINVAL;
|
|
|
|
- helper->expect_class_max =
|
|
- ntohl(nla_get_be32(tb[NFCTH_POLICY_SET_NUM]));
|
|
-
|
|
- if (helper->expect_class_max != 0 &&
|
|
- helper->expect_class_max > NF_CT_MAX_EXPECT_CLASSES)
|
|
+ class_max = ntohl(nla_get_be32(tb[NFCTH_POLICY_SET_NUM]));
|
|
+ if (class_max == 0)
|
|
+ return -EINVAL;
|
|
+ if (class_max > NF_CT_MAX_EXPECT_CLASSES)
|
|
return -EOVERFLOW;
|
|
|
|
expect_policy = kzalloc(sizeof(struct nf_conntrack_expect_policy) *
|
|
- helper->expect_class_max, GFP_KERNEL);
|
|
+ class_max, GFP_KERNEL);
|
|
if (expect_policy == NULL)
|
|
return -ENOMEM;
|
|
|
|
- for (i=0; i<helper->expect_class_max; i++) {
|
|
+ for (i = 0; i < class_max; i++) {
|
|
if (!tb[NFCTH_POLICY_SET+i])
|
|
goto err;
|
|
|
|
@@ -191,6 +191,8 @@ nfnl_cthelper_parse_expect_policy(struct nf_conntrack_helper *helper,
|
|
if (ret < 0)
|
|
goto err;
|
|
}
|
|
+
|
|
+ helper->expect_class_max = class_max - 1;
|
|
helper->expect_policy = expect_policy;
|
|
return 0;
|
|
err:
|
|
@@ -377,10 +379,10 @@ nfnl_cthelper_dump_policy(struct sk_buff *skb,
|
|
goto nla_put_failure;
|
|
|
|
if (nla_put_be32(skb, NFCTH_POLICY_SET_NUM,
|
|
- htonl(helper->expect_class_max)))
|
|
+ htonl(helper->expect_class_max + 1)))
|
|
goto nla_put_failure;
|
|
|
|
- for (i=0; i<helper->expect_class_max; i++) {
|
|
+ for (i = 0; i < helper->expect_class_max + 1; i++) {
|
|
nest_parms2 = nla_nest_start(skb,
|
|
(NFCTH_POLICY_SET+i) | NLA_F_NESTED);
|
|
if (nest_parms2 == NULL)
|
|
diff --git a/net/netfilter/nfnetlink_cttimeout.c b/net/netfilter/nfnetlink_cttimeout.c
|
|
index c7a2d0e1c462..ed9153bd7e73 100644
|
|
--- a/net/netfilter/nfnetlink_cttimeout.c
|
|
+++ b/net/netfilter/nfnetlink_cttimeout.c
|
|
@@ -611,8 +611,8 @@ static void __exit cttimeout_exit(void)
|
|
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
|
RCU_INIT_POINTER(nf_ct_timeout_find_get_hook, NULL);
|
|
RCU_INIT_POINTER(nf_ct_timeout_put_hook, NULL);
|
|
+ synchronize_rcu();
|
|
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
|
- rcu_barrier();
|
|
}
|
|
|
|
module_init(cttimeout_init);
|
|
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
|
|
index 148ec130d99d..b70055fc30cb 100644
|
|
--- a/net/packet/af_packet.c
|
|
+++ b/net/packet/af_packet.c
|
|
@@ -3802,6 +3802,8 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
|
|
case PACKET_HDRLEN:
|
|
if (len > sizeof(int))
|
|
len = sizeof(int);
|
|
+ if (len < sizeof(int))
|
|
+ return -EINVAL;
|
|
if (copy_from_user(&val, optval, len))
|
|
return -EFAULT;
|
|
switch (val) {
|
|
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
|
|
index da5a7fb98c77..a6f5b3d21571 100644
|
|
--- a/net/rds/ib_cm.c
|
|
+++ b/net/rds/ib_cm.c
|
|
@@ -381,7 +381,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
ret = PTR_ERR(ic->i_send_cq);
|
|
ic->i_send_cq = NULL;
|
|
rdsdebug("ib_create_cq send failed: %d\n", ret);
|
|
- goto out;
|
|
+ goto rds_ibdev_out;
|
|
}
|
|
|
|
cq_attr.cqe = ic->i_recv_ring.w_nr;
|
|
@@ -392,19 +392,19 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
ret = PTR_ERR(ic->i_recv_cq);
|
|
ic->i_recv_cq = NULL;
|
|
rdsdebug("ib_create_cq recv failed: %d\n", ret);
|
|
- goto out;
|
|
+ goto send_cq_out;
|
|
}
|
|
|
|
ret = ib_req_notify_cq(ic->i_send_cq, IB_CQ_NEXT_COMP);
|
|
if (ret) {
|
|
rdsdebug("ib_req_notify_cq send failed: %d\n", ret);
|
|
- goto out;
|
|
+ goto recv_cq_out;
|
|
}
|
|
|
|
ret = ib_req_notify_cq(ic->i_recv_cq, IB_CQ_SOLICITED);
|
|
if (ret) {
|
|
rdsdebug("ib_req_notify_cq recv failed: %d\n", ret);
|
|
- goto out;
|
|
+ goto recv_cq_out;
|
|
}
|
|
|
|
/* XXX negotiate max send/recv with remote? */
|
|
@@ -428,7 +428,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
ret = rdma_create_qp(ic->i_cm_id, ic->i_pd, &attr);
|
|
if (ret) {
|
|
rdsdebug("rdma_create_qp failed: %d\n", ret);
|
|
- goto out;
|
|
+ goto recv_cq_out;
|
|
}
|
|
|
|
ic->i_send_hdrs = ib_dma_alloc_coherent(dev,
|
|
@@ -438,7 +438,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
if (!ic->i_send_hdrs) {
|
|
ret = -ENOMEM;
|
|
rdsdebug("ib_dma_alloc_coherent send failed\n");
|
|
- goto out;
|
|
+ goto qp_out;
|
|
}
|
|
|
|
ic->i_recv_hdrs = ib_dma_alloc_coherent(dev,
|
|
@@ -448,7 +448,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
if (!ic->i_recv_hdrs) {
|
|
ret = -ENOMEM;
|
|
rdsdebug("ib_dma_alloc_coherent recv failed\n");
|
|
- goto out;
|
|
+ goto send_hdrs_dma_out;
|
|
}
|
|
|
|
ic->i_ack = ib_dma_alloc_coherent(dev, sizeof(struct rds_header),
|
|
@@ -456,7 +456,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
if (!ic->i_ack) {
|
|
ret = -ENOMEM;
|
|
rdsdebug("ib_dma_alloc_coherent ack failed\n");
|
|
- goto out;
|
|
+ goto recv_hdrs_dma_out;
|
|
}
|
|
|
|
ic->i_sends = vzalloc_node(ic->i_send_ring.w_nr * sizeof(struct rds_ib_send_work),
|
|
@@ -464,7 +464,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
if (!ic->i_sends) {
|
|
ret = -ENOMEM;
|
|
rdsdebug("send allocation failed\n");
|
|
- goto out;
|
|
+ goto ack_dma_out;
|
|
}
|
|
|
|
ic->i_recvs = vzalloc_node(ic->i_recv_ring.w_nr * sizeof(struct rds_ib_recv_work),
|
|
@@ -472,7 +472,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
if (!ic->i_recvs) {
|
|
ret = -ENOMEM;
|
|
rdsdebug("recv allocation failed\n");
|
|
- goto out;
|
|
+ goto sends_out;
|
|
}
|
|
|
|
rds_ib_recv_init_ack(ic);
|
|
@@ -480,8 +480,33 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
|
|
rdsdebug("conn %p pd %p cq %p %p\n", conn, ic->i_pd,
|
|
ic->i_send_cq, ic->i_recv_cq);
|
|
|
|
-out:
|
|
+ return ret;
|
|
+
|
|
+sends_out:
|
|
+ vfree(ic->i_sends);
|
|
+ack_dma_out:
|
|
+ ib_dma_free_coherent(dev, sizeof(struct rds_header),
|
|
+ ic->i_ack, ic->i_ack_dma);
|
|
+recv_hdrs_dma_out:
|
|
+ ib_dma_free_coherent(dev, ic->i_recv_ring.w_nr *
|
|
+ sizeof(struct rds_header),
|
|
+ ic->i_recv_hdrs, ic->i_recv_hdrs_dma);
|
|
+send_hdrs_dma_out:
|
|
+ ib_dma_free_coherent(dev, ic->i_send_ring.w_nr *
|
|
+ sizeof(struct rds_header),
|
|
+ ic->i_send_hdrs, ic->i_send_hdrs_dma);
|
|
+qp_out:
|
|
+ rdma_destroy_qp(ic->i_cm_id);
|
|
+recv_cq_out:
|
|
+ if (!ib_destroy_cq(ic->i_recv_cq))
|
|
+ ic->i_recv_cq = NULL;
|
|
+send_cq_out:
|
|
+ if (!ib_destroy_cq(ic->i_send_cq))
|
|
+ ic->i_send_cq = NULL;
|
|
+rds_ibdev_out:
|
|
+ rds_ib_remove_conn(rds_ibdev, conn);
|
|
rds_ib_dev_put(rds_ibdev);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c
|
|
index eac30bf486d7..094e2a12860a 100644
|
|
--- a/net/rds/ib_send.c
|
|
+++ b/net/rds/ib_send.c
|
|
@@ -68,16 +68,6 @@ static void rds_ib_send_complete(struct rds_message *rm,
|
|
complete(rm, notify_status);
|
|
}
|
|
|
|
-static void rds_ib_send_unmap_data(struct rds_ib_connection *ic,
|
|
- struct rm_data_op *op,
|
|
- int wc_status)
|
|
-{
|
|
- if (op->op_nents)
|
|
- ib_dma_unmap_sg(ic->i_cm_id->device,
|
|
- op->op_sg, op->op_nents,
|
|
- DMA_TO_DEVICE);
|
|
-}
|
|
-
|
|
static void rds_ib_send_unmap_rdma(struct rds_ib_connection *ic,
|
|
struct rm_rdma_op *op,
|
|
int wc_status)
|
|
@@ -138,6 +128,21 @@ static void rds_ib_send_unmap_atomic(struct rds_ib_connection *ic,
|
|
rds_ib_stats_inc(s_ib_atomic_fadd);
|
|
}
|
|
|
|
+static void rds_ib_send_unmap_data(struct rds_ib_connection *ic,
|
|
+ struct rm_data_op *op,
|
|
+ int wc_status)
|
|
+{
|
|
+ struct rds_message *rm = container_of(op, struct rds_message, data);
|
|
+
|
|
+ if (op->op_nents)
|
|
+ ib_dma_unmap_sg(ic->i_cm_id->device,
|
|
+ op->op_sg, op->op_nents,
|
|
+ DMA_TO_DEVICE);
|
|
+
|
|
+ if (rm->rdma.op_active && rm->data.op_notify)
|
|
+ rds_ib_send_unmap_rdma(ic, &rm->rdma, wc_status);
|
|
+}
|
|
+
|
|
/*
|
|
* Unmap the resources associated with a struct send_work.
|
|
*
|
|
diff --git a/net/rds/rdma.c b/net/rds/rdma.c
|
|
index 4c93badeabf2..8d3a851a3476 100644
|
|
--- a/net/rds/rdma.c
|
|
+++ b/net/rds/rdma.c
|
|
@@ -626,6 +626,16 @@ int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
|
|
}
|
|
op->op_notifier->n_user_token = args->user_token;
|
|
op->op_notifier->n_status = RDS_RDMA_SUCCESS;
|
|
+
|
|
+ /* Enable rmda notification on data operation for composite
|
|
+ * rds messages and make sure notification is enabled only
|
|
+ * for the data operation which follows it so that application
|
|
+ * gets notified only after full message gets delivered.
|
|
+ */
|
|
+ if (rm->data.op_sg) {
|
|
+ rm->rdma.op_notify = 0;
|
|
+ rm->data.op_notify = !!(args->flags & RDS_RDMA_NOTIFY_ME);
|
|
+ }
|
|
}
|
|
|
|
/* The cookie contains the R_Key of the remote memory region, and
|
|
diff --git a/net/rds/rds.h b/net/rds/rds.h
|
|
index 0e2797bdc316..4588860f4c3b 100644
|
|
--- a/net/rds/rds.h
|
|
+++ b/net/rds/rds.h
|
|
@@ -378,6 +378,7 @@ struct rds_message {
|
|
} rdma;
|
|
struct rm_data_op {
|
|
unsigned int op_active:1;
|
|
+ unsigned int op_notify:1;
|
|
unsigned int op_nents;
|
|
unsigned int op_count;
|
|
unsigned int op_dmasg;
|
|
diff --git a/net/rds/send.c b/net/rds/send.c
|
|
index c9cdb358ea88..6815f03324d7 100644
|
|
--- a/net/rds/send.c
|
|
+++ b/net/rds/send.c
|
|
@@ -467,12 +467,14 @@ void rds_rdma_send_complete(struct rds_message *rm, int status)
|
|
struct rm_rdma_op *ro;
|
|
struct rds_notifier *notifier;
|
|
unsigned long flags;
|
|
+ unsigned int notify = 0;
|
|
|
|
spin_lock_irqsave(&rm->m_rs_lock, flags);
|
|
|
|
+ notify = rm->rdma.op_notify | rm->data.op_notify;
|
|
ro = &rm->rdma;
|
|
if (test_bit(RDS_MSG_ON_SOCK, &rm->m_flags) &&
|
|
- ro->op_active && ro->op_notify && ro->op_notifier) {
|
|
+ ro->op_active && notify && ro->op_notifier) {
|
|
notifier = ro->op_notifier;
|
|
rs = rm->m_rs;
|
|
sock_hold(rds_rs_to_sk(rs));
|
|
diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c
|
|
index d3125c169684..065a69cf6118 100644
|
|
--- a/sound/pci/au88x0/au88x0_core.c
|
|
+++ b/sound/pci/au88x0/au88x0_core.c
|
|
@@ -2279,6 +2279,9 @@ vortex_adb_allocroute(vortex_t *vortex, int dma, int nr_ch, int dir,
|
|
} else {
|
|
int src[2], mix[2];
|
|
|
|
+ if (nr_ch < 1)
|
|
+ return -EINVAL;
|
|
+
|
|
/* Get SRC and MIXER hardware resources. */
|
|
for (i = 0; i < nr_ch; i++) {
|
|
if ((mix[i] =
|
|
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
|
index b8a256dfed7e..6a438a361592 100644
|
|
--- a/sound/soc/soc-dapm.c
|
|
+++ b/sound/soc/soc-dapm.c
|
|
@@ -358,6 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|
snd_soc_dapm_new_control_unlocked(widget->dapm,
|
|
&template);
|
|
kfree(name);
|
|
+ if (IS_ERR(data->widget)) {
|
|
+ ret = PTR_ERR(data->widget);
|
|
+ goto err_data;
|
|
+ }
|
|
if (!data->widget) {
|
|
ret = -ENOMEM;
|
|
goto err_data;
|
|
@@ -392,6 +396,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|
data->widget = snd_soc_dapm_new_control_unlocked(
|
|
widget->dapm, &template);
|
|
kfree(name);
|
|
+ if (IS_ERR(data->widget)) {
|
|
+ ret = PTR_ERR(data->widget);
|
|
+ goto err_data;
|
|
+ }
|
|
if (!data->widget) {
|
|
ret = -ENOMEM;
|
|
goto err_data;
|
|
@@ -3278,11 +3286,22 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
|
|
|
mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
w = snd_soc_dapm_new_control_unlocked(dapm, widget);
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (IS_ERR(w)) {
|
|
+ int ret = PTR_ERR(w);
|
|
+
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(dapm->dev,
|
|
+ "ASoC: Failed to create DAPM control %s (%d)\n",
|
|
+ widget->name, ret);
|
|
+ goto out_unlock;
|
|
+ }
|
|
if (!w)
|
|
dev_err(dapm->dev,
|
|
"ASoC: Failed to create DAPM control %s\n",
|
|
widget->name);
|
|
|
|
+out_unlock:
|
|
mutex_unlock(&dapm->card->dapm_mutex);
|
|
return w;
|
|
}
|
|
@@ -3304,6 +3323,8 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
|
|
w->regulator = devm_regulator_get(dapm->dev, w->name);
|
|
if (IS_ERR(w->regulator)) {
|
|
ret = PTR_ERR(w->regulator);
|
|
+ if (ret == -EPROBE_DEFER)
|
|
+ return ERR_PTR(ret);
|
|
dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
|
|
w->name, ret);
|
|
return NULL;
|
|
@@ -3322,6 +3343,8 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
|
|
w->clk = devm_clk_get(dapm->dev, w->name);
|
|
if (IS_ERR(w->clk)) {
|
|
ret = PTR_ERR(w->clk);
|
|
+ if (ret == -EPROBE_DEFER)
|
|
+ return ERR_PTR(ret);
|
|
dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
|
|
w->name, ret);
|
|
return NULL;
|
|
@@ -3435,6 +3458,16 @@ int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
|
|
mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
|
|
for (i = 0; i < num; i++) {
|
|
w = snd_soc_dapm_new_control_unlocked(dapm, widget);
|
|
+ if (IS_ERR(w)) {
|
|
+ ret = PTR_ERR(w);
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (ret == -EPROBE_DEFER)
|
|
+ break;
|
|
+ dev_err(dapm->dev,
|
|
+ "ASoC: Failed to create DAPM control %s (%d)\n",
|
|
+ widget->name, ret);
|
|
+ break;
|
|
+ }
|
|
if (!w) {
|
|
dev_err(dapm->dev,
|
|
"ASoC: Failed to create DAPM control %s\n",
|
|
@@ -3701,6 +3734,15 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
|
|
dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name);
|
|
|
|
w = snd_soc_dapm_new_control_unlocked(&card->dapm, &template);
|
|
+ if (IS_ERR(w)) {
|
|
+ ret = PTR_ERR(w);
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(card->dev,
|
|
+ "ASoC: Failed to create %s widget (%d)\n",
|
|
+ link_name, ret);
|
|
+ goto outfree_kcontrol_news;
|
|
+ }
|
|
if (!w) {
|
|
dev_err(card->dev, "ASoC: Failed to create %s widget\n",
|
|
link_name);
|
|
@@ -3752,6 +3794,16 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
|
|
template.name);
|
|
|
|
w = snd_soc_dapm_new_control_unlocked(dapm, &template);
|
|
+ if (IS_ERR(w)) {
|
|
+ int ret = PTR_ERR(w);
|
|
+
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(dapm->dev,
|
|
+ "ASoC: Failed to create %s widget (%d)\n",
|
|
+ dai->driver->playback.stream_name, ret);
|
|
+ return ret;
|
|
+ }
|
|
if (!w) {
|
|
dev_err(dapm->dev, "ASoC: Failed to create %s widget\n",
|
|
dai->driver->playback.stream_name);
|
|
@@ -3771,6 +3823,16 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
|
|
template.name);
|
|
|
|
w = snd_soc_dapm_new_control_unlocked(dapm, &template);
|
|
+ if (IS_ERR(w)) {
|
|
+ int ret = PTR_ERR(w);
|
|
+
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(dapm->dev,
|
|
+ "ASoC: Failed to create %s widget (%d)\n",
|
|
+ dai->driver->playback.stream_name, ret);
|
|
+ return ret;
|
|
+ }
|
|
if (!w) {
|
|
dev_err(dapm->dev, "ASoC: Failed to create %s widget\n",
|
|
dai->driver->capture.stream_name);
|
|
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
|
|
index 70396d3f6472..e3f34a86413c 100644
|
|
--- a/sound/soc/soc-topology.c
|
|
+++ b/sound/soc/soc-topology.c
|
|
@@ -1481,6 +1481,15 @@ widget:
|
|
widget = snd_soc_dapm_new_control(dapm, &template);
|
|
else
|
|
widget = snd_soc_dapm_new_control_unlocked(dapm, &template);
|
|
+ if (IS_ERR(widget)) {
|
|
+ ret = PTR_ERR(widget);
|
|
+ /* Do not nag about probe deferrals */
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(tplg->dev,
|
|
+ "ASoC: failed to create widget %s controls (%d)\n",
|
|
+ w->name, ret);
|
|
+ goto hdr_err;
|
|
+ }
|
|
if (widget == NULL) {
|
|
dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n",
|
|
w->name);
|