mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-22 06:41:23 +00:00
1274 lines
40 KiB
Diff
1274 lines
40 KiB
Diff
|
diff --git a/Makefile b/Makefile
|
||
|
index 9f2471c6fbbe..c92186c3efd7 100644
|
||
|
--- a/Makefile
|
||
|
+++ b/Makefile
|
||
|
@@ -1,6 +1,6 @@
|
||
|
VERSION = 3
|
||
|
PATCHLEVEL = 14
|
||
|
-SUBLEVEL = 44
|
||
|
+SUBLEVEL = 45
|
||
|
EXTRAVERSION =
|
||
|
NAME = Remembering Coco
|
||
|
|
||
|
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
|
||
|
index d1fea7a054be..7479d8d847a6 100644
|
||
|
--- a/arch/mips/kernel/irq.c
|
||
|
+++ b/arch/mips/kernel/irq.c
|
||
|
@@ -110,7 +110,7 @@ void __init init_IRQ(void)
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
-#ifdef DEBUG_STACKOVERFLOW
|
||
|
+#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||
|
static inline void check_stack_overflow(void)
|
||
|
{
|
||
|
unsigned long sp;
|
||
|
diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h
|
||
|
index 6f1c3a8a33ab..bcc9a2f46c62 100644
|
||
|
--- a/arch/x86/include/asm/segment.h
|
||
|
+++ b/arch/x86/include/asm/segment.h
|
||
|
@@ -212,10 +212,21 @@
|
||
|
#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
|
||
|
|
||
|
#ifdef __KERNEL__
|
||
|
+
|
||
|
+/*
|
||
|
+ * early_idt_handler_array is an array of entry points referenced in the
|
||
|
+ * early IDT. For simplicity, it's a real array with one entry point
|
||
|
+ * every nine bytes. That leaves room for an optional 'push $0' if the
|
||
|
+ * vector has no error code (two bytes), a 'push $vector_number' (two
|
||
|
+ * bytes), and a jump to the common entry code (up to five bytes).
|
||
|
+ */
|
||
|
+#define EARLY_IDT_HANDLER_SIZE 9
|
||
|
+
|
||
|
#ifndef __ASSEMBLY__
|
||
|
-extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS][2+2+5];
|
||
|
+
|
||
|
+extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS][EARLY_IDT_HANDLER_SIZE];
|
||
|
#ifdef CONFIG_TRACING
|
||
|
-#define trace_early_idt_handlers early_idt_handlers
|
||
|
+# define trace_early_idt_handler_array early_idt_handler_array
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
|
||
|
index 85126ccbdf6b..5fc4ac7c6582 100644
|
||
|
--- a/arch/x86/kernel/head64.c
|
||
|
+++ b/arch/x86/kernel/head64.c
|
||
|
@@ -162,7 +162,7 @@ asmlinkage void __init x86_64_start_kernel(char * real_mode_data)
|
||
|
clear_bss();
|
||
|
|
||
|
for (i = 0; i < NUM_EXCEPTION_VECTORS; i++)
|
||
|
- set_intr_gate(i, early_idt_handlers[i]);
|
||
|
+ set_intr_gate(i, early_idt_handler_array[i]);
|
||
|
load_idt((const struct desc_ptr *)&idt_descr);
|
||
|
|
||
|
copy_bootdata(__va(real_mode_data));
|
||
|
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
|
||
|
index f36bd42d6f0c..30a2aa3782fa 100644
|
||
|
--- a/arch/x86/kernel/head_32.S
|
||
|
+++ b/arch/x86/kernel/head_32.S
|
||
|
@@ -477,21 +477,22 @@ is486:
|
||
|
__INIT
|
||
|
setup_once:
|
||
|
/*
|
||
|
- * Set up a idt with 256 entries pointing to ignore_int,
|
||
|
- * interrupt gates. It doesn't actually load idt - that needs
|
||
|
- * to be done on each CPU. Interrupts are enabled elsewhere,
|
||
|
- * when we can be relatively sure everything is ok.
|
||
|
+ * Set up a idt with 256 interrupt gates that push zero if there
|
||
|
+ * is no error code and then jump to early_idt_handler_common.
|
||
|
+ * It doesn't actually load the idt - that needs to be done on
|
||
|
+ * each CPU. Interrupts are enabled elsewhere, when we can be
|
||
|
+ * relatively sure everything is ok.
|
||
|
*/
|
||
|
|
||
|
movl $idt_table,%edi
|
||
|
- movl $early_idt_handlers,%eax
|
||
|
+ movl $early_idt_handler_array,%eax
|
||
|
movl $NUM_EXCEPTION_VECTORS,%ecx
|
||
|
1:
|
||
|
movl %eax,(%edi)
|
||
|
movl %eax,4(%edi)
|
||
|
/* interrupt gate, dpl=0, present */
|
||
|
movl $(0x8E000000 + __KERNEL_CS),2(%edi)
|
||
|
- addl $9,%eax
|
||
|
+ addl $EARLY_IDT_HANDLER_SIZE,%eax
|
||
|
addl $8,%edi
|
||
|
loop 1b
|
||
|
|
||
|
@@ -523,26 +524,28 @@ setup_once:
|
||
|
andl $0,setup_once_ref /* Once is enough, thanks */
|
||
|
ret
|
||
|
|
||
|
-ENTRY(early_idt_handlers)
|
||
|
+ENTRY(early_idt_handler_array)
|
||
|
# 36(%esp) %eflags
|
||
|
# 32(%esp) %cs
|
||
|
# 28(%esp) %eip
|
||
|
# 24(%rsp) error code
|
||
|
i = 0
|
||
|
.rept NUM_EXCEPTION_VECTORS
|
||
|
- .if (EXCEPTION_ERRCODE_MASK >> i) & 1
|
||
|
- ASM_NOP2
|
||
|
- .else
|
||
|
+ .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1
|
||
|
pushl $0 # Dummy error code, to make stack frame uniform
|
||
|
.endif
|
||
|
pushl $i # 20(%esp) Vector number
|
||
|
- jmp early_idt_handler
|
||
|
+ jmp early_idt_handler_common
|
||
|
i = i + 1
|
||
|
+ .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
|
||
|
.endr
|
||
|
-ENDPROC(early_idt_handlers)
|
||
|
+ENDPROC(early_idt_handler_array)
|
||
|
|
||
|
- /* This is global to keep gas from relaxing the jumps */
|
||
|
-ENTRY(early_idt_handler)
|
||
|
+early_idt_handler_common:
|
||
|
+ /*
|
||
|
+ * The stack is the hardware frame, an error code or zero, and the
|
||
|
+ * vector number.
|
||
|
+ */
|
||
|
cld
|
||
|
|
||
|
cmpl $2,(%esp) # X86_TRAP_NMI
|
||
|
@@ -602,7 +605,7 @@ ex_entry:
|
||
|
is_nmi:
|
||
|
addl $8,%esp /* drop vector number and error code */
|
||
|
iret
|
||
|
-ENDPROC(early_idt_handler)
|
||
|
+ENDPROC(early_idt_handler_common)
|
||
|
|
||
|
/* This is the default interrupt "handler" :-) */
|
||
|
ALIGN
|
||
|
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
|
||
|
index a468c0a65c42..a2dc0add72ed 100644
|
||
|
--- a/arch/x86/kernel/head_64.S
|
||
|
+++ b/arch/x86/kernel/head_64.S
|
||
|
@@ -321,26 +321,28 @@ bad_address:
|
||
|
jmp bad_address
|
||
|
|
||
|
__INIT
|
||
|
- .globl early_idt_handlers
|
||
|
-early_idt_handlers:
|
||
|
+ENTRY(early_idt_handler_array)
|
||
|
# 104(%rsp) %rflags
|
||
|
# 96(%rsp) %cs
|
||
|
# 88(%rsp) %rip
|
||
|
# 80(%rsp) error code
|
||
|
i = 0
|
||
|
.rept NUM_EXCEPTION_VECTORS
|
||
|
- .if (EXCEPTION_ERRCODE_MASK >> i) & 1
|
||
|
- ASM_NOP2
|
||
|
- .else
|
||
|
+ .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1
|
||
|
pushq $0 # Dummy error code, to make stack frame uniform
|
||
|
.endif
|
||
|
pushq $i # 72(%rsp) Vector number
|
||
|
- jmp early_idt_handler
|
||
|
+ jmp early_idt_handler_common
|
||
|
i = i + 1
|
||
|
+ .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
|
||
|
.endr
|
||
|
+ENDPROC(early_idt_handler_array)
|
||
|
|
||
|
-/* This is global to keep gas from relaxing the jumps */
|
||
|
-ENTRY(early_idt_handler)
|
||
|
+early_idt_handler_common:
|
||
|
+ /*
|
||
|
+ * The stack is the hardware frame, an error code or zero, and the
|
||
|
+ * vector number.
|
||
|
+ */
|
||
|
cld
|
||
|
|
||
|
cmpl $2,(%rsp) # X86_TRAP_NMI
|
||
|
@@ -412,7 +414,7 @@ ENTRY(early_idt_handler)
|
||
|
is_nmi:
|
||
|
addq $16,%rsp # drop vector number and error code
|
||
|
INTERRUPT_RETURN
|
||
|
-ENDPROC(early_idt_handler)
|
||
|
+ENDPROC(early_idt_handler_common)
|
||
|
|
||
|
__INITDATA
|
||
|
|
||
|
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
|
||
|
index af2d4317b218..1fed139f8eae 100644
|
||
|
--- a/arch/x86/net/bpf_jit_comp.c
|
||
|
+++ b/arch/x86/net/bpf_jit_comp.c
|
||
|
@@ -211,7 +211,12 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||
|
}
|
||
|
cleanup_addr = proglen; /* epilogue address */
|
||
|
|
||
|
- for (pass = 0; pass < 10; pass++) {
|
||
|
+ /* JITed image shrinks with every pass and the loop iterates
|
||
|
+ * until the image stops shrinking. Very large bpf programs
|
||
|
+ * may converge on the last pass. In such case do one more
|
||
|
+ * pass to emit the final image
|
||
|
+ */
|
||
|
+ for (pass = 0; pass < 10 || image; pass++) {
|
||
|
u8 seen_or_pass0 = (pass == 0) ? (SEEN_XREG | SEEN_DATAREF | SEEN_MEM) : seen;
|
||
|
/* no prologue/epilogue for trivial filters (RET something) */
|
||
|
proglen = 0;
|
||
|
diff --git a/block/genhd.c b/block/genhd.c
|
||
|
index a8d586a729bb..9316f5fd416f 100644
|
||
|
--- a/block/genhd.c
|
||
|
+++ b/block/genhd.c
|
||
|
@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
||
|
/* allocate ext devt */
|
||
|
idr_preload(GFP_KERNEL);
|
||
|
|
||
|
- spin_lock(&ext_devt_lock);
|
||
|
+ spin_lock_bh(&ext_devt_lock);
|
||
|
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
||
|
- spin_unlock(&ext_devt_lock);
|
||
|
+ spin_unlock_bh(&ext_devt_lock);
|
||
|
|
||
|
idr_preload_end();
|
||
|
if (idx < 0)
|
||
|
@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)
|
||
|
return;
|
||
|
|
||
|
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
||
|
- spin_lock(&ext_devt_lock);
|
||
|
+ spin_lock_bh(&ext_devt_lock);
|
||
|
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||
|
- spin_unlock(&ext_devt_lock);
|
||
|
+ spin_unlock_bh(&ext_devt_lock);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
||
|
} else {
|
||
|
struct hd_struct *part;
|
||
|
|
||
|
- spin_lock(&ext_devt_lock);
|
||
|
+ spin_lock_bh(&ext_devt_lock);
|
||
|
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||
|
if (part && get_disk(part_to_disk(part))) {
|
||
|
*partno = part->partno;
|
||
|
disk = part_to_disk(part);
|
||
|
}
|
||
|
- spin_unlock(&ext_devt_lock);
|
||
|
+ spin_unlock_bh(&ext_devt_lock);
|
||
|
}
|
||
|
|
||
|
return disk;
|
||
|
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
|
||
|
index 83c4ddb1bc7f..08223cc980b0 100644
|
||
|
--- a/drivers/ata/pata_octeon_cf.c
|
||
|
+++ b/drivers/ata/pata_octeon_cf.c
|
||
|
@@ -1069,7 +1069,7 @@ static struct of_device_id octeon_cf_match[] = {
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
-MODULE_DEVICE_TABLE(of, octeon_i2c_match);
|
||
|
+MODULE_DEVICE_TABLE(of, octeon_cf_match);
|
||
|
|
||
|
static struct platform_driver octeon_cf_driver = {
|
||
|
.probe = octeon_cf_probe,
|
||
|
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
|
||
|
index b2d0887b3d12..462307c36d65 100644
|
||
|
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||
|
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||
|
@@ -481,10 +481,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
|
||
|
DP_AUX_CH_CTL_RECEIVE_ERROR))
|
||
|
continue;
|
||
|
if (status & DP_AUX_CH_CTL_DONE)
|
||
|
- break;
|
||
|
+ goto done;
|
||
|
}
|
||
|
- if (status & DP_AUX_CH_CTL_DONE)
|
||
|
- break;
|
||
|
}
|
||
|
|
||
|
if ((status & DP_AUX_CH_CTL_DONE) == 0) {
|
||
|
@@ -493,6 +491,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
+done:
|
||
|
/* Check for timeout or receive error.
|
||
|
* Timeouts occur when the sink is not connected
|
||
|
*/
|
||
|
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
|
||
|
index 1d02970ed395..81f8ec85a48a 100644
|
||
|
--- a/drivers/gpu/drm/i915/intel_i2c.c
|
||
|
+++ b/drivers/gpu/drm/i915/intel_i2c.c
|
||
|
@@ -489,7 +489,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||
|
struct intel_gmbus,
|
||
|
adapter);
|
||
|
struct drm_i915_private *dev_priv = bus->dev_priv;
|
||
|
- int i, reg_offset;
|
||
|
+ int i = 0, inc, try = 0, reg_offset;
|
||
|
int ret = 0;
|
||
|
|
||
|
intel_aux_display_runtime_get(dev_priv);
|
||
|
@@ -502,12 +502,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||
|
|
||
|
reg_offset = dev_priv->gpio_mmio_base;
|
||
|
|
||
|
+retry:
|
||
|
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
||
|
|
||
|
- for (i = 0; i < num; i++) {
|
||
|
+ for (; i < num; i += inc) {
|
||
|
+ inc = 1;
|
||
|
if (gmbus_is_index_read(msgs, i, num)) {
|
||
|
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
||
|
- i += 1; /* set i to the index of the read xfer */
|
||
|
+ inc = 2; /* an index read is two msgs */
|
||
|
} else if (msgs[i].flags & I2C_M_RD) {
|
||
|
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
||
|
} else {
|
||
|
@@ -579,6 +581,18 @@ clear_err:
|
||
|
adapter->name, msgs[i].addr,
|
||
|
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
||
|
|
||
|
+ /*
|
||
|
+ * Passive adapters sometimes NAK the first probe. Retry the first
|
||
|
+ * message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
||
|
+ * has retries internally. See also the retry loop in
|
||
|
+ * drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
||
|
+ */
|
||
|
+ if (ret == -ENXIO && i == 0 && try++ == 0) {
|
||
|
+ DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
||
|
+ adapter->name);
|
||
|
+ goto retry;
|
||
|
+ }
|
||
|
+
|
||
|
goto out;
|
||
|
|
||
|
timeout:
|
||
|
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
index e39026cc7d07..129915eca07b 100644
|
||
|
--- a/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
+++ b/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
@@ -1337,6 +1337,21 @@ int radeon_device_init(struct radeon_device *rdev,
|
||
|
goto failed;
|
||
|
}
|
||
|
|
||
|
+ /*
|
||
|
+ * Turks/Thames GPU will freeze whole laptop if DPM is not restarted
|
||
|
+ * after the CP ring have chew one packet at least. Hence here we stop
|
||
|
+ * and restart DPM after the radeon_ib_ring_tests().
|
||
|
+ */
|
||
|
+ if (rdev->pm.dpm_enabled &&
|
||
|
+ (rdev->pm.pm_method == PM_METHOD_DPM) &&
|
||
|
+ (rdev->family == CHIP_TURKS) &&
|
||
|
+ (rdev->flags & RADEON_IS_MOBILITY)) {
|
||
|
+ mutex_lock(&rdev->pm.mutex);
|
||
|
+ radeon_dpm_disable(rdev);
|
||
|
+ radeon_dpm_enable(rdev);
|
||
|
+ mutex_unlock(&rdev->pm.mutex);
|
||
|
+ }
|
||
|
+
|
||
|
if ((radeon_testing & 1)) {
|
||
|
if (rdev->accel_working)
|
||
|
radeon_test_moves(rdev);
|
||
|
diff --git a/drivers/iio/adc/twl6030-gpadc.c b/drivers/iio/adc/twl6030-gpadc.c
|
||
|
index 53a24ebb92c3..779dac5676d9 100644
|
||
|
--- a/drivers/iio/adc/twl6030-gpadc.c
|
||
|
+++ b/drivers/iio/adc/twl6030-gpadc.c
|
||
|
@@ -1003,7 +1003,7 @@ static struct platform_driver twl6030_gpadc_driver = {
|
||
|
|
||
|
module_platform_driver(twl6030_gpadc_driver);
|
||
|
|
||
|
-MODULE_ALIAS("platform: " DRIVER_NAME);
|
||
|
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||
|
MODULE_AUTHOR("Balaji T K <balajitk@ti.com>");
|
||
|
MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
|
||
|
MODULE_AUTHOR("Oleksandr Kozaruk <oleksandr.kozaruk@ti.com");
|
||
|
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h
|
||
|
index 0916bf6b6c31..1e8fd2e81d45 100644
|
||
|
--- a/drivers/iio/imu/adis16400.h
|
||
|
+++ b/drivers/iio/imu/adis16400.h
|
||
|
@@ -165,6 +165,7 @@ struct adis16400_state {
|
||
|
int filt_int;
|
||
|
|
||
|
struct adis adis;
|
||
|
+ unsigned long avail_scan_mask[2];
|
||
|
};
|
||
|
|
||
|
/* At the moment triggers are only used for ring buffer
|
||
|
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
|
||
|
index 70753bf23a86..ccfaf3af3974 100644
|
||
|
--- a/drivers/iio/imu/adis16400_core.c
|
||
|
+++ b/drivers/iio/imu/adis16400_core.c
|
||
|
@@ -438,6 +438,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||
|
*val = st->variant->temp_scale_nano / 1000000;
|
||
|
*val2 = (st->variant->temp_scale_nano % 1000000);
|
||
|
return IIO_VAL_INT_PLUS_MICRO;
|
||
|
+ case IIO_PRESSURE:
|
||
|
+ /* 20 uBar = 0.002kPascal */
|
||
|
+ *val = 0;
|
||
|
+ *val2 = 2000;
|
||
|
+ return IIO_VAL_INT_PLUS_MICRO;
|
||
|
default:
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
@@ -480,10 +485,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
|
||
|
+#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
|
||
|
.type = IIO_VOLTAGE, \
|
||
|
.indexed = 1, \
|
||
|
- .channel = 0, \
|
||
|
+ .channel = chn, \
|
||
|
.extend_name = name, \
|
||
|
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||
|
BIT(IIO_CHAN_INFO_SCALE), \
|
||
|
@@ -499,10 +504,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||
|
}
|
||
|
|
||
|
#define ADIS16400_SUPPLY_CHAN(addr, bits) \
|
||
|
- ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)
|
||
|
+ ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
|
||
|
|
||
|
#define ADIS16400_AUX_ADC_CHAN(addr, bits) \
|
||
|
- ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)
|
||
|
+ ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
|
||
|
|
||
|
#define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
|
||
|
.type = IIO_ANGL_VEL, \
|
||
|
@@ -819,11 +824,6 @@ static const struct iio_info adis16400_info = {
|
||
|
.debugfs_reg_access = adis_debugfs_reg_access,
|
||
|
};
|
||
|
|
||
|
-static const unsigned long adis16400_burst_scan_mask[] = {
|
||
|
- ~0UL,
|
||
|
- 0,
|
||
|
-};
|
||
|
-
|
||
|
static const char * const adis16400_status_error_msgs[] = {
|
||
|
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
|
||
|
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
|
||
|
@@ -871,6 +871,20 @@ static const struct adis_data adis16400_data = {
|
||
|
BIT(ADIS16400_DIAG_STAT_POWER_LOW),
|
||
|
};
|
||
|
|
||
|
+static void adis16400_setup_chan_mask(struct adis16400_state *st)
|
||
|
+{
|
||
|
+ const struct adis16400_chip_info *chip_info = st->variant;
|
||
|
+ unsigned i;
|
||
|
+
|
||
|
+ for (i = 0; i < chip_info->num_channels; i++) {
|
||
|
+ const struct iio_chan_spec *ch = &chip_info->channels[i];
|
||
|
+
|
||
|
+ if (ch->scan_index >= 0 &&
|
||
|
+ ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
|
||
|
+ st->avail_scan_mask[0] |= BIT(ch->scan_index);
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
static int adis16400_probe(struct spi_device *spi)
|
||
|
{
|
||
|
struct adis16400_state *st;
|
||
|
@@ -894,8 +908,10 @@ static int adis16400_probe(struct spi_device *spi)
|
||
|
indio_dev->info = &adis16400_info;
|
||
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
||
|
|
||
|
- if (!(st->variant->flags & ADIS16400_NO_BURST))
|
||
|
- indio_dev->available_scan_masks = adis16400_burst_scan_mask;
|
||
|
+ if (!(st->variant->flags & ADIS16400_NO_BURST)) {
|
||
|
+ adis16400_setup_chan_mask(st);
|
||
|
+ indio_dev->available_scan_masks = st->avail_scan_mask;
|
||
|
+ }
|
||
|
|
||
|
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
|
||
|
if (ret)
|
||
|
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
|
||
|
index e824651a5a11..94eaaf0c49b3 100644
|
||
|
--- a/drivers/input/mouse/elantech.c
|
||
|
+++ b/drivers/input/mouse/elantech.c
|
||
|
@@ -1271,10 +1271,11 @@ static bool elantech_is_signature_valid(const unsigned char *param)
|
||
|
return true;
|
||
|
|
||
|
/*
|
||
|
- * Some models have a revision higher then 20. Meaning param[2] may
|
||
|
- * be 10 or 20, skip the rates check for these.
|
||
|
+ * Some hw_version >= 4 models have a revision higher then 20. Meaning
|
||
|
+ * that param[2] may be 10 or 20, skip the rates check for these.
|
||
|
*/
|
||
|
- if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
|
||
|
+ if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f &&
|
||
|
+ param[2] < 40)
|
||
|
return true;
|
||
|
|
||
|
for (i = 0; i < ARRAY_SIZE(rates); i++)
|
||
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||
|
index b00e282ef166..53f09a8b0b72 100644
|
||
|
--- a/drivers/input/mouse/synaptics.c
|
||
|
+++ b/drivers/input/mouse/synaptics.c
|
||
|
@@ -138,6 +138,10 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
|
||
|
1024, 5112, 2024, 4832
|
||
|
},
|
||
|
{
|
||
|
+ (const char * const []){"LEN2000", NULL},
|
||
|
+ 1024, 5113, 2021, 4832
|
||
|
+ },
|
||
|
+ {
|
||
|
(const char * const []){"LEN2001", NULL},
|
||
|
1024, 5022, 2508, 4832
|
||
|
},
|
||
|
@@ -173,7 +177,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
||
|
"LEN0047",
|
||
|
"LEN0048",
|
||
|
"LEN0049",
|
||
|
- "LEN2000",
|
||
|
+ "LEN2000", /* S540 */
|
||
|
"LEN2001", /* Edge E431 */
|
||
|
"LEN2002", /* Edge E531 */
|
||
|
"LEN2003",
|
||
|
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
|
||
|
index 98e7cbf720a5..0be3f9d94322 100644
|
||
|
--- a/drivers/net/phy/dp83640.c
|
||
|
+++ b/drivers/net/phy/dp83640.c
|
||
|
@@ -45,7 +45,7 @@
|
||
|
#define PSF_TX 0x1000
|
||
|
#define EXT_EVENT 1
|
||
|
#define CAL_EVENT 7
|
||
|
-#define CAL_TRIGGER 7
|
||
|
+#define CAL_TRIGGER 1
|
||
|
#define PER_TRIGGER 6
|
||
|
|
||
|
#define MII_DP83640_MICR 0x11
|
||
|
@@ -442,7 +442,9 @@ static int ptp_dp83640_enable(struct ptp_clock_info *ptp,
|
||
|
else
|
||
|
evnt |= EVNT_RISE;
|
||
|
}
|
||
|
+ mutex_lock(&clock->extreg_lock);
|
||
|
ext_write(0, phydev, PAGE5, PTP_EVNT, evnt);
|
||
|
+ mutex_unlock(&clock->extreg_lock);
|
||
|
return 0;
|
||
|
|
||
|
case PTP_CLK_REQ_PEROUT:
|
||
|
@@ -463,6 +465,8 @@ static u8 status_frame_src[6] = { 0x08, 0x00, 0x17, 0x0B, 0x6B, 0x0F };
|
||
|
|
||
|
static void enable_status_frames(struct phy_device *phydev, bool on)
|
||
|
{
|
||
|
+ struct dp83640_private *dp83640 = phydev->priv;
|
||
|
+ struct dp83640_clock *clock = dp83640->clock;
|
||
|
u16 cfg0 = 0, ver;
|
||
|
|
||
|
if (on)
|
||
|
@@ -470,9 +474,13 @@ static void enable_status_frames(struct phy_device *phydev, bool on)
|
||
|
|
||
|
ver = (PSF_PTPVER & VERSIONPTP_MASK) << VERSIONPTP_SHIFT;
|
||
|
|
||
|
+ mutex_lock(&clock->extreg_lock);
|
||
|
+
|
||
|
ext_write(0, phydev, PAGE5, PSF_CFG0, cfg0);
|
||
|
ext_write(0, phydev, PAGE6, PSF_CFG1, ver);
|
||
|
|
||
|
+ mutex_unlock(&clock->extreg_lock);
|
||
|
+
|
||
|
if (!phydev->attached_dev) {
|
||
|
pr_warn("expected to find an attached netdevice\n");
|
||
|
return;
|
||
|
@@ -1063,11 +1071,18 @@ static int dp83640_config_init(struct phy_device *phydev)
|
||
|
|
||
|
if (clock->chosen && !list_empty(&clock->phylist))
|
||
|
recalibrate(clock);
|
||
|
- else
|
||
|
+ else {
|
||
|
+ mutex_lock(&clock->extreg_lock);
|
||
|
enable_broadcast(phydev, clock->page, 1);
|
||
|
+ mutex_unlock(&clock->extreg_lock);
|
||
|
+ }
|
||
|
|
||
|
enable_status_frames(phydev, true);
|
||
|
+
|
||
|
+ mutex_lock(&clock->extreg_lock);
|
||
|
ext_write(0, phydev, PAGE4, PTP_CTL, PTP_ENABLE);
|
||
|
+ mutex_unlock(&clock->extreg_lock);
|
||
|
+
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
|
||
|
index 1d568788c3e3..65cfc5a436c7 100644
|
||
|
--- a/drivers/net/phy/phy.c
|
||
|
+++ b/drivers/net/phy/phy.c
|
||
|
@@ -965,12 +965,14 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
||
|
{
|
||
|
/* According to 802.3az,the EEE is supported only in full duplex-mode.
|
||
|
* Also EEE feature is active when core is operating with MII, GMII
|
||
|
- * or RGMII.
|
||
|
+ * or RGMII (all kinds). Internal PHYs are also allowed to proceed and
|
||
|
+ * should return an error if they do not support EEE.
|
||
|
*/
|
||
|
if ((phydev->duplex == DUPLEX_FULL) &&
|
||
|
((phydev->interface == PHY_INTERFACE_MODE_MII) ||
|
||
|
(phydev->interface == PHY_INTERFACE_MODE_GMII) ||
|
||
|
- (phydev->interface == PHY_INTERFACE_MODE_RGMII))) {
|
||
|
+ (phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
|
||
|
+ phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID))) {
|
||
|
int eee_lp, eee_cap, eee_adv;
|
||
|
u32 lp, cap, adv;
|
||
|
int status;
|
||
|
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
|
||
|
index 7a206cffb062..d18e65398edc 100644
|
||
|
--- a/drivers/net/xen-netback/xenbus.c
|
||
|
+++ b/drivers/net/xen-netback/xenbus.c
|
||
|
@@ -32,6 +32,8 @@ struct backend_info {
|
||
|
enum xenbus_state frontend_state;
|
||
|
struct xenbus_watch hotplug_status_watch;
|
||
|
u8 have_hotplug_status_watch:1;
|
||
|
+
|
||
|
+ const char *hotplug_script;
|
||
|
};
|
||
|
|
||
|
static int connect_rings(struct backend_info *);
|
||
|
@@ -54,6 +56,7 @@ static int netback_remove(struct xenbus_device *dev)
|
||
|
xenvif_free(be->vif);
|
||
|
be->vif = NULL;
|
||
|
}
|
||
|
+ kfree(be->hotplug_script);
|
||
|
kfree(be);
|
||
|
dev_set_drvdata(&dev->dev, NULL);
|
||
|
return 0;
|
||
|
@@ -71,6 +74,7 @@ static int netback_probe(struct xenbus_device *dev,
|
||
|
struct xenbus_transaction xbt;
|
||
|
int err;
|
||
|
int sg;
|
||
|
+ const char *script;
|
||
|
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
||
|
GFP_KERNEL);
|
||
|
if (!be) {
|
||
|
@@ -157,6 +161,15 @@ static int netback_probe(struct xenbus_device *dev,
|
||
|
if (err)
|
||
|
pr_debug("Error writing feature-split-event-channels\n");
|
||
|
|
||
|
+ script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
||
|
+ if (IS_ERR(script)) {
|
||
|
+ err = PTR_ERR(script);
|
||
|
+ xenbus_dev_fatal(dev, err, "reading script");
|
||
|
+ goto fail;
|
||
|
+ }
|
||
|
+
|
||
|
+ be->hotplug_script = script;
|
||
|
+
|
||
|
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
||
|
if (err)
|
||
|
goto fail;
|
||
|
@@ -187,22 +200,14 @@ static int netback_uevent(struct xenbus_device *xdev,
|
||
|
struct kobj_uevent_env *env)
|
||
|
{
|
||
|
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
||
|
- char *val;
|
||
|
|
||
|
- val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
|
||
|
- if (IS_ERR(val)) {
|
||
|
- int err = PTR_ERR(val);
|
||
|
- xenbus_dev_fatal(xdev, err, "reading script");
|
||
|
- return err;
|
||
|
- } else {
|
||
|
- if (add_uevent_var(env, "script=%s", val)) {
|
||
|
- kfree(val);
|
||
|
- return -ENOMEM;
|
||
|
- }
|
||
|
- kfree(val);
|
||
|
- }
|
||
|
+ if (!be)
|
||
|
+ return 0;
|
||
|
+
|
||
|
+ if (add_uevent_var(env, "script=%s", be->hotplug_script))
|
||
|
+ return -ENOMEM;
|
||
|
|
||
|
- if (!be || !be->vif)
|
||
|
+ if (!be->vif)
|
||
|
return 0;
|
||
|
|
||
|
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|
||
|
diff --git a/drivers/staging/ozwpan/ozusbsvc1.c b/drivers/staging/ozwpan/ozusbsvc1.c
|
||
|
index 617f51cdaea7..b58e87e951e7 100644
|
||
|
--- a/drivers/staging/ozwpan/ozusbsvc1.c
|
||
|
+++ b/drivers/staging/ozwpan/ozusbsvc1.c
|
||
|
@@ -323,7 +323,11 @@ static void oz_usb_handle_ep_data(struct oz_usb_ctx *usb_ctx,
|
||
|
struct oz_multiple_fixed *body =
|
||
|
(struct oz_multiple_fixed *)data_hdr;
|
||
|
u8 *data = body->data;
|
||
|
- int n = (len - sizeof(struct oz_multiple_fixed)+1)
|
||
|
+ unsigned int n;
|
||
|
+ if (!body->unit_size ||
|
||
|
+ len < sizeof(struct oz_multiple_fixed) - 1)
|
||
|
+ break;
|
||
|
+ n = (len - (sizeof(struct oz_multiple_fixed) - 1))
|
||
|
/ body->unit_size;
|
||
|
while (n--) {
|
||
|
oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
|
||
|
@@ -386,10 +390,15 @@ void oz_usb_rx(struct oz_pd *pd, struct oz_elt *elt)
|
||
|
case OZ_GET_DESC_RSP: {
|
||
|
struct oz_get_desc_rsp *body =
|
||
|
(struct oz_get_desc_rsp *)usb_hdr;
|
||
|
- int data_len = elt->length -
|
||
|
- sizeof(struct oz_get_desc_rsp) + 1;
|
||
|
- u16 offs = le16_to_cpu(get_unaligned(&body->offset));
|
||
|
- u16 total_size =
|
||
|
+ u16 offs, total_size;
|
||
|
+ u8 data_len;
|
||
|
+
|
||
|
+ if (elt->length < sizeof(struct oz_get_desc_rsp) - 1)
|
||
|
+ break;
|
||
|
+ data_len = elt->length -
|
||
|
+ (sizeof(struct oz_get_desc_rsp) - 1);
|
||
|
+ offs = le16_to_cpu(get_unaligned(&body->offset));
|
||
|
+ total_size =
|
||
|
le16_to_cpu(get_unaligned(&body->total_size));
|
||
|
oz_dbg(ON, "USB_REQ_GET_DESCRIPTOR - cnf\n");
|
||
|
oz_hcd_get_desc_cnf(usb_ctx->hport, body->req_id,
|
||
|
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
|
||
|
index 8ab46ad40f28..81951904186c 100644
|
||
|
--- a/drivers/tty/n_tty.c
|
||
|
+++ b/drivers/tty/n_tty.c
|
||
|
@@ -186,6 +186,17 @@ static int receive_room(struct tty_struct *tty)
|
||
|
return left;
|
||
|
}
|
||
|
|
||
|
+static inline int tty_copy_to_user(struct tty_struct *tty,
|
||
|
+ void __user *to,
|
||
|
+ const void *from,
|
||
|
+ unsigned long n)
|
||
|
+{
|
||
|
+ struct n_tty_data *ldata = tty->disc_data;
|
||
|
+
|
||
|
+ tty_audit_add_data(tty, to, n, ldata->icanon);
|
||
|
+ return copy_to_user(to, from, n);
|
||
|
+}
|
||
|
+
|
||
|
/**
|
||
|
* n_tty_set_room - receive space
|
||
|
* @tty: terminal
|
||
|
@@ -2084,12 +2095,12 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,
|
||
|
__func__, eol, found, n, c, size, more);
|
||
|
|
||
|
if (n > size) {
|
||
|
- ret = copy_to_user(*b, read_buf_addr(ldata, tail), size);
|
||
|
+ ret = tty_copy_to_user(tty, *b, read_buf_addr(ldata, tail), size);
|
||
|
if (ret)
|
||
|
return -EFAULT;
|
||
|
- ret = copy_to_user(*b + size, ldata->read_buf, n - size);
|
||
|
+ ret = tty_copy_to_user(tty, *b + size, ldata->read_buf, n - size);
|
||
|
} else
|
||
|
- ret = copy_to_user(*b, read_buf_addr(ldata, tail), n);
|
||
|
+ ret = tty_copy_to_user(tty, *b, read_buf_addr(ldata, tail), n);
|
||
|
|
||
|
if (ret)
|
||
|
return -EFAULT;
|
||
|
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
|
||
|
index d799140e53b6..1fd9bc695ab7 100644
|
||
|
--- a/drivers/tty/serial/imx.c
|
||
|
+++ b/drivers/tty/serial/imx.c
|
||
|
@@ -907,6 +907,14 @@ static void dma_rx_callback(void *data)
|
||
|
|
||
|
status = dmaengine_tx_status(chan, (dma_cookie_t)0, &state);
|
||
|
count = RX_BUF_SIZE - state.residue;
|
||
|
+
|
||
|
+ if (readl(sport->port.membase + USR2) & USR2_IDLE) {
|
||
|
+ /* In condition [3] the SDMA counted up too early */
|
||
|
+ count--;
|
||
|
+
|
||
|
+ writel(USR2_IDLE, sport->port.membase + USR2);
|
||
|
+ }
|
||
|
+
|
||
|
dev_dbg(sport->port.dev, "We get %d bytes.\n", count);
|
||
|
|
||
|
if (count) {
|
||
|
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
||
|
index 02de4cf48a5b..73c7292f48e5 100644
|
||
|
--- a/drivers/usb/serial/cp210x.c
|
||
|
+++ b/drivers/usb/serial/cp210x.c
|
||
|
@@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = {
|
||
|
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
||
|
{ USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
|
||
|
{ USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
|
||
|
+ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
|
||
|
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||
|
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
||
|
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
||
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
||
|
index 2d858f81ab33..bc77ea7cde48 100644
|
||
|
--- a/drivers/usb/serial/ftdi_sio.c
|
||
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
||
|
@@ -712,6 +712,7 @@ static const struct usb_device_id id_table_combined[] = {
|
||
|
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) },
|
||
|
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
||
|
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
||
|
+ { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
||
|
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
||
|
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||
|
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
||
|
index 4e4f46f3c89c..792e054126de 100644
|
||
|
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
||
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
||
|
@@ -155,6 +155,7 @@
|
||
|
#define XSENS_AWINDA_STATION_PID 0x0101
|
||
|
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
||
|
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
||
|
+#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
||
|
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
||
|
|
||
|
/* Xsens devices using FTDI VID */
|
||
|
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
|
||
|
index fa9f90049099..8adfc65b37dd 100644
|
||
|
--- a/fs/btrfs/extent_io.c
|
||
|
+++ b/fs/btrfs/extent_io.c
|
||
|
@@ -4289,8 +4289,11 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||
|
}
|
||
|
ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
|
||
|
em_len, flags);
|
||
|
- if (ret)
|
||
|
+ if (ret) {
|
||
|
+ if (ret == 1)
|
||
|
+ ret = 0;
|
||
|
goto out_free;
|
||
|
+ }
|
||
|
}
|
||
|
out_free:
|
||
|
free_extent_map(em);
|
||
|
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
|
||
|
index d04db817be5c..92cbfbf2599e 100644
|
||
|
--- a/fs/btrfs/super.c
|
||
|
+++ b/fs/btrfs/super.c
|
||
|
@@ -906,6 +906,15 @@ find_root:
|
||
|
if (IS_ERR(new_root))
|
||
|
return ERR_CAST(new_root);
|
||
|
|
||
|
+ if (!(sb->s_flags & MS_RDONLY)) {
|
||
|
+ int ret;
|
||
|
+ down_read(&fs_info->cleanup_work_sem);
|
||
|
+ ret = btrfs_orphan_cleanup(new_root);
|
||
|
+ up_read(&fs_info->cleanup_work_sem);
|
||
|
+ if (ret)
|
||
|
+ return ERR_PTR(ret);
|
||
|
+ }
|
||
|
+
|
||
|
dir_id = btrfs_root_dirid(&new_root->root_item);
|
||
|
setup_root:
|
||
|
location.objectid = dir_id;
|
||
|
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c
|
||
|
index a5457d577b98..6ad2e2d320fe 100644
|
||
|
--- a/kernel/trace/ring_buffer_benchmark.c
|
||
|
+++ b/kernel/trace/ring_buffer_benchmark.c
|
||
|
@@ -455,7 +455,7 @@ static int __init ring_buffer_benchmark_init(void)
|
||
|
|
||
|
if (producer_fifo >= 0) {
|
||
|
struct sched_param param = {
|
||
|
- .sched_priority = consumer_fifo
|
||
|
+ .sched_priority = producer_fifo
|
||
|
};
|
||
|
sched_setscheduler(producer, SCHED_FIFO, ¶m);
|
||
|
} else
|
||
|
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
|
||
|
index c8e450132813..5bba3b35bec8 100644
|
||
|
--- a/mm/memory_hotplug.c
|
||
|
+++ b/mm/memory_hotplug.c
|
||
|
@@ -1864,8 +1864,10 @@ void try_offline_node(int nid)
|
||
|
* wait_table may be allocated from boot memory,
|
||
|
* here only free if it's allocated by vmalloc.
|
||
|
*/
|
||
|
- if (is_vmalloc_addr(zone->wait_table))
|
||
|
+ if (is_vmalloc_addr(zone->wait_table)) {
|
||
|
vfree(zone->wait_table);
|
||
|
+ zone->wait_table = NULL;
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
EXPORT_SYMBOL(try_offline_node);
|
||
|
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
|
||
|
index 9203d5a1943f..09152d11eb29 100644
|
||
|
--- a/net/bridge/br_fdb.c
|
||
|
+++ b/net/bridge/br_fdb.c
|
||
|
@@ -705,9 +705,11 @@ static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge_port *p,
|
||
|
int err = 0;
|
||
|
|
||
|
if (ndm->ndm_flags & NTF_USE) {
|
||
|
+ local_bh_disable();
|
||
|
rcu_read_lock();
|
||
|
br_fdb_update(p->br, p, addr, vid, true);
|
||
|
rcu_read_unlock();
|
||
|
+ local_bh_enable();
|
||
|
} else {
|
||
|
spin_lock_bh(&p->br->hash_lock);
|
||
|
err = fdb_add_entry(p, addr, ndm->ndm_state,
|
||
|
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||
|
index 93067ecdb9a2..11a2e6c8538f 100644
|
||
|
--- a/net/bridge/br_multicast.c
|
||
|
+++ b/net/bridge/br_multicast.c
|
||
|
@@ -1056,7 +1056,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
|
||
|
|
||
|
err = br_ip6_multicast_add_group(br, port, &grec->grec_mca,
|
||
|
vid);
|
||
|
- if (!err)
|
||
|
+ if (err)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
|
||
|
index 526bf56f4d31..afeb8e07ee41 100644
|
||
|
--- a/net/caif/caif_socket.c
|
||
|
+++ b/net/caif/caif_socket.c
|
||
|
@@ -332,6 +332,10 @@ static long caif_stream_data_wait(struct sock *sk, long timeo)
|
||
|
release_sock(sk);
|
||
|
timeo = schedule_timeout(timeo);
|
||
|
lock_sock(sk);
|
||
|
+
|
||
|
+ if (sock_flag(sk, SOCK_DEAD))
|
||
|
+ break;
|
||
|
+
|
||
|
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
||
|
}
|
||
|
|
||
|
@@ -376,6 +380,10 @@ static int caif_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||
|
struct sk_buff *skb;
|
||
|
|
||
|
lock_sock(sk);
|
||
|
+ if (sock_flag(sk, SOCK_DEAD)) {
|
||
|
+ err = -ECONNRESET;
|
||
|
+ goto unlock;
|
||
|
+ }
|
||
|
skb = skb_dequeue(&sk->sk_receive_queue);
|
||
|
caif_check_flow_release(sk);
|
||
|
|
||
|
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c
|
||
|
index 074bb2a5e675..0a08902c539e 100644
|
||
|
--- a/net/ceph/crush/mapper.c
|
||
|
+++ b/net/ceph/crush/mapper.c
|
||
|
@@ -290,6 +290,7 @@ static int is_out(const struct crush_map *map,
|
||
|
* @type: the type of item to choose
|
||
|
* @out: pointer to output vector
|
||
|
* @outpos: our position in that vector
|
||
|
+ * @out_size: size of the out vector
|
||
|
* @tries: number of attempts to make
|
||
|
* @recurse_tries: number of attempts to have recursive chooseleaf make
|
||
|
* @local_retries: localized retries
|
||
|
@@ -302,6 +303,7 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||
|
const __u32 *weight, int weight_max,
|
||
|
int x, int numrep, int type,
|
||
|
int *out, int outpos,
|
||
|
+ int out_size,
|
||
|
unsigned int tries,
|
||
|
unsigned int recurse_tries,
|
||
|
unsigned int local_retries,
|
||
|
@@ -318,11 +320,12 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||
|
int item = 0;
|
||
|
int itemtype;
|
||
|
int collide, reject;
|
||
|
+ int count = out_size;
|
||
|
|
||
|
dprintk("CHOOSE%s bucket %d x %d outpos %d numrep %d\n", recurse_to_leaf ? "_LEAF" : "",
|
||
|
bucket->id, x, outpos, numrep);
|
||
|
|
||
|
- for (rep = outpos; rep < numrep; rep++) {
|
||
|
+ for (rep = outpos; rep < numrep && count > 0 ; rep++) {
|
||
|
/* keep trying until we get a non-out, non-colliding item */
|
||
|
ftotal = 0;
|
||
|
skip_rep = 0;
|
||
|
@@ -391,7 +394,7 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||
|
map->buckets[-1-item],
|
||
|
weight, weight_max,
|
||
|
x, outpos+1, 0,
|
||
|
- out2, outpos,
|
||
|
+ out2, outpos, count,
|
||
|
recurse_tries, 0,
|
||
|
local_retries,
|
||
|
local_fallback_retries,
|
||
|
@@ -449,6 +452,7 @@ reject:
|
||
|
dprintk("CHOOSE got %d\n", item);
|
||
|
out[outpos] = item;
|
||
|
outpos++;
|
||
|
+ count--;
|
||
|
}
|
||
|
|
||
|
dprintk("CHOOSE returns %d\n", outpos);
|
||
|
@@ -640,6 +644,7 @@ int crush_do_rule(const struct crush_map *map,
|
||
|
__u32 step;
|
||
|
int i, j;
|
||
|
int numrep;
|
||
|
+ int out_size;
|
||
|
/*
|
||
|
* the original choose_total_tries value was off by one (it
|
||
|
* counted "retries" and not "tries"). add one.
|
||
|
@@ -740,6 +745,7 @@ int crush_do_rule(const struct crush_map *map,
|
||
|
x, numrep,
|
||
|
curstep->arg2,
|
||
|
o+osize, j,
|
||
|
+ result_max-osize,
|
||
|
choose_tries,
|
||
|
recurse_tries,
|
||
|
choose_local_retries,
|
||
|
@@ -747,11 +753,13 @@ int crush_do_rule(const struct crush_map *map,
|
||
|
recurse_to_leaf,
|
||
|
c+osize);
|
||
|
} else {
|
||
|
+ out_size = ((numrep < (result_max-osize)) ?
|
||
|
+ numrep : (result_max-osize));
|
||
|
crush_choose_indep(
|
||
|
map,
|
||
|
map->buckets[-1-w[i]],
|
||
|
weight, weight_max,
|
||
|
- x, numrep, numrep,
|
||
|
+ x, out_size, numrep,
|
||
|
curstep->arg2,
|
||
|
o+osize, j,
|
||
|
choose_tries,
|
||
|
@@ -760,7 +768,7 @@ int crush_do_rule(const struct crush_map *map,
|
||
|
recurse_to_leaf,
|
||
|
c+osize,
|
||
|
0);
|
||
|
- osize += numrep;
|
||
|
+ osize += out_size;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
||
|
index 73abbd77d72c..1b9e700c85b6 100644
|
||
|
--- a/net/core/dev.c
|
||
|
+++ b/net/core/dev.c
|
||
|
@@ -4903,7 +4903,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
|
||
|
if (__netdev_find_adj(upper_dev, dev, &upper_dev->all_adj_list.upper))
|
||
|
return -EBUSY;
|
||
|
|
||
|
- if (__netdev_find_adj(dev, upper_dev, &dev->all_adj_list.upper))
|
||
|
+ if (__netdev_find_adj(dev, upper_dev, &dev->adj_list.upper))
|
||
|
return -EEXIST;
|
||
|
|
||
|
if (master && netdev_master_upper_dev_get(dev))
|
||
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
||
|
index b64330f25fbe..625615cdac86 100644
|
||
|
--- a/net/ipv4/route.c
|
||
|
+++ b/net/ipv4/route.c
|
||
|
@@ -910,6 +910,10 @@ static int ip_error(struct sk_buff *skb)
|
||
|
bool send;
|
||
|
int code;
|
||
|
|
||
|
+ /* IP on this device is disabled. */
|
||
|
+ if (!in_dev)
|
||
|
+ goto out;
|
||
|
+
|
||
|
net = dev_net(rt->dst.dev);
|
||
|
if (!IN_DEV_FORWARD(in_dev)) {
|
||
|
switch (rt->dst.error) {
|
||
|
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
|
||
|
index 7a436c517e44..9128d0aa4643 100644
|
||
|
--- a/net/ipv4/tcp_minisocks.c
|
||
|
+++ b/net/ipv4/tcp_minisocks.c
|
||
|
@@ -297,7 +297,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
|
||
|
tw->tw_v6_daddr = sk->sk_v6_daddr;
|
||
|
tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
|
||
|
tw->tw_tclass = np->tclass;
|
||
|
- tw->tw_flowlabel = np->flow_label >> 12;
|
||
|
+ tw->tw_flowlabel = be32_to_cpu(np->flow_label & IPV6_FLOWLABEL_MASK);
|
||
|
tw->tw_ipv6only = np->ipv6only;
|
||
|
}
|
||
|
#endif
|
||
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
||
|
index b25e852625d8..21a3a9e90b10 100644
|
||
|
--- a/net/ipv4/udp.c
|
||
|
+++ b/net/ipv4/udp.c
|
||
|
@@ -90,6 +90,7 @@
|
||
|
#include <linux/socket.h>
|
||
|
#include <linux/sockios.h>
|
||
|
#include <linux/igmp.h>
|
||
|
+#include <linux/inetdevice.h>
|
||
|
#include <linux/in.h>
|
||
|
#include <linux/errno.h>
|
||
|
#include <linux/timer.h>
|
||
|
@@ -1317,10 +1318,8 @@ csum_copy_err:
|
||
|
}
|
||
|
unlock_sock_fast(sk, slow);
|
||
|
|
||
|
- if (noblock)
|
||
|
- return -EAGAIN;
|
||
|
-
|
||
|
- /* starting over for a new packet */
|
||
|
+ /* starting over for a new packet, but check if we need to yield */
|
||
|
+ cond_resched();
|
||
|
msg->msg_flags &= ~MSG_TRUNC;
|
||
|
goto try_again;
|
||
|
}
|
||
|
@@ -1924,6 +1923,7 @@ void udp_v4_early_demux(struct sk_buff *skb)
|
||
|
struct sock *sk;
|
||
|
struct dst_entry *dst;
|
||
|
int dif = skb->dev->ifindex;
|
||
|
+ int ours;
|
||
|
|
||
|
/* validate the packet */
|
||
|
if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr)))
|
||
|
@@ -1933,14 +1933,24 @@ void udp_v4_early_demux(struct sk_buff *skb)
|
||
|
uh = udp_hdr(skb);
|
||
|
|
||
|
if (skb->pkt_type == PACKET_BROADCAST ||
|
||
|
- skb->pkt_type == PACKET_MULTICAST)
|
||
|
+ skb->pkt_type == PACKET_MULTICAST) {
|
||
|
+ struct in_device *in_dev = __in_dev_get_rcu(skb->dev);
|
||
|
+
|
||
|
+ if (!in_dev)
|
||
|
+ return;
|
||
|
+
|
||
|
+ ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr,
|
||
|
+ iph->protocol);
|
||
|
+ if (!ours)
|
||
|
+ return;
|
||
|
sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr,
|
||
|
uh->source, iph->saddr, dif);
|
||
|
- else if (skb->pkt_type == PACKET_HOST)
|
||
|
+ } else if (skb->pkt_type == PACKET_HOST) {
|
||
|
sk = __udp4_lib_demux_lookup(net, uh->dest, iph->daddr,
|
||
|
uh->source, iph->saddr, dif);
|
||
|
- else
|
||
|
+ } else {
|
||
|
return;
|
||
|
+ }
|
||
|
|
||
|
if (!sk)
|
||
|
return;
|
||
|
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
|
||
|
index 9d4332dba8ea..b50ae296537d 100644
|
||
|
--- a/net/ipv6/tcp_ipv6.c
|
||
|
+++ b/net/ipv6/tcp_ipv6.c
|
||
|
@@ -905,7 +905,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
||
|
tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
|
||
|
tcp_time_stamp + tcptw->tw_ts_offset,
|
||
|
tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),
|
||
|
- tw->tw_tclass, (tw->tw_flowlabel << 12));
|
||
|
+ tw->tw_tclass, cpu_to_be32(tw->tw_flowlabel));
|
||
|
|
||
|
inet_twsk_put(tw);
|
||
|
}
|
||
|
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
||
|
index 20b63d2ab70f..38625a91ec94 100644
|
||
|
--- a/net/ipv6/udp.c
|
||
|
+++ b/net/ipv6/udp.c
|
||
|
@@ -515,10 +515,8 @@ csum_copy_err:
|
||
|
}
|
||
|
unlock_sock_fast(sk, slow);
|
||
|
|
||
|
- if (noblock)
|
||
|
- return -EAGAIN;
|
||
|
-
|
||
|
- /* starting over for a new packet */
|
||
|
+ /* starting over for a new packet, but check if we need to yield */
|
||
|
+ cond_resched();
|
||
|
msg->msg_flags &= ~MSG_TRUNC;
|
||
|
goto try_again;
|
||
|
}
|
||
|
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
|
||
|
index 98532cfa7823..bdaed3130029 100644
|
||
|
--- a/net/sched/sch_api.c
|
||
|
+++ b/net/sched/sch_api.c
|
||
|
@@ -812,10 +812,8 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
||
|
if (dev->flags & IFF_UP)
|
||
|
dev_deactivate(dev);
|
||
|
|
||
|
- if (new && new->ops->attach) {
|
||
|
- new->ops->attach(new);
|
||
|
- num_q = 0;
|
||
|
- }
|
||
|
+ if (new && new->ops->attach)
|
||
|
+ goto skip;
|
||
|
|
||
|
for (i = 0; i < num_q; i++) {
|
||
|
struct netdev_queue *dev_queue = dev_ingress_queue(dev);
|
||
|
@@ -831,12 +829,16 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
||
|
qdisc_destroy(old);
|
||
|
}
|
||
|
|
||
|
+skip:
|
||
|
if (!ingress) {
|
||
|
notify_and_destroy(net, skb, n, classid,
|
||
|
dev->qdisc, new);
|
||
|
if (new && !new->ops->attach)
|
||
|
atomic_inc(&new->refcnt);
|
||
|
dev->qdisc = new ? : &noop_qdisc;
|
||
|
+
|
||
|
+ if (new && new->ops->attach)
|
||
|
+ new->ops->attach(new);
|
||
|
} else {
|
||
|
notify_and_destroy(net, skb, n, classid, old, new);
|
||
|
}
|
||
|
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||
|
index 94404f19f9de..4757f1cf6237 100644
|
||
|
--- a/net/unix/af_unix.c
|
||
|
+++ b/net/unix/af_unix.c
|
||
|
@@ -1893,6 +1893,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
|
||
|
unix_state_unlock(sk);
|
||
|
timeo = freezable_schedule_timeout(timeo);
|
||
|
unix_state_lock(sk);
|
||
|
+
|
||
|
+ if (sock_flag(sk, SOCK_DEAD))
|
||
|
+ break;
|
||
|
+
|
||
|
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
||
|
}
|
||
|
|
||
|
@@ -1957,6 +1961,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||
|
struct sk_buff *skb, *last;
|
||
|
|
||
|
unix_state_lock(sk);
|
||
|
+ if (sock_flag(sk, SOCK_DEAD)) {
|
||
|
+ err = -ECONNRESET;
|
||
|
+ goto unlock;
|
||
|
+ }
|
||
|
last = skb = skb_peek(&sk->sk_receive_queue);
|
||
|
again:
|
||
|
if (skb == NULL) {
|
||
|
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
|
||
|
index 5661a54ac7ee..ae1fe6fd4ab6 100644
|
||
|
--- a/net/wireless/wext-compat.c
|
||
|
+++ b/net/wireless/wext-compat.c
|
||
|
@@ -1331,6 +1331,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
||
|
memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
|
||
|
wdev_unlock(wdev);
|
||
|
|
||
|
+ memset(&sinfo, 0, sizeof(sinfo));
|
||
|
+
|
||
|
if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
||
|
return NULL;
|
||
|
|
||
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
||
|
index e2b567706297..ba175226da78 100644
|
||
|
--- a/sound/pci/hda/patch_realtek.c
|
||
|
+++ b/sound/pci/hda/patch_realtek.c
|
||
|
@@ -2226,6 +2226,7 @@ static const struct hda_fixup alc882_fixups[] = {
|
||
|
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||
|
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
|
||
|
SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||
|
+ SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||
|
SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
|
||
|
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||
|
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
|
||
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
||
|
index 2d37b3fc3a21..c60103306b18 100644
|
||
|
--- a/sound/usb/mixer.c
|
||
|
+++ b/sound/usb/mixer.c
|
||
|
@@ -891,6 +891,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
||
|
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
||
|
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
||
|
case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
|
||
|
+ case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */
|
||
|
case USB_ID(0x046d, 0x0991):
|
||
|
/* Most audio usb devices lie about volume resolution.
|
||
|
* Most Logitech webcams have res = 384.
|
||
|
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
||
|
index 621bc9ebb55e..b16be3944213 100644
|
||
|
--- a/sound/usb/mixer_maps.c
|
||
|
+++ b/sound/usb/mixer_maps.c
|
||
|
@@ -428,6 +428,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||
|
.map = ebox44_map,
|
||
|
},
|
||
|
{
|
||
|
+ /* MAYA44 USB+ */
|
||
|
+ .id = USB_ID(0x2573, 0x0008),
|
||
|
+ .map = maya44_map,
|
||
|
+ },
|
||
|
+ {
|
||
|
/* KEF X300A */
|
||
|
.id = USB_ID(0x27ac, 0x1000),
|
||
|
.map = scms_usb3318_map,
|