mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-23 07:11:26 +00:00
1098 lines
35 KiB
Diff
1098 lines
35 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 5abf670c6651..00fffa3f2310 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 14
|
|
-SUBLEVEL = 31
|
|
+SUBLEVEL = 32
|
|
EXTRAVERSION =
|
|
NAME = Remembering Coco
|
|
|
|
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
|
|
index 11b3914660d2..42f2fb8c5a00 100644
|
|
--- a/arch/arm/mm/dma-mapping.c
|
|
+++ b/arch/arm/mm/dma-mapping.c
|
|
@@ -464,12 +464,21 @@ void __init dma_contiguous_remap(void)
|
|
map.type = MT_MEMORY_DMA_READY;
|
|
|
|
/*
|
|
- * Clear previous low-memory mapping
|
|
+ * Clear previous low-memory mapping to ensure that the
|
|
+ * TLB does not see any conflicting entries, then flush
|
|
+ * the TLB of the old entries before creating new mappings.
|
|
+ *
|
|
+ * This ensures that any speculatively loaded TLB entries
|
|
+ * (even though they may be rare) can not cause any problems,
|
|
+ * and ensures that this code is architecturally compliant.
|
|
*/
|
|
for (addr = __phys_to_virt(start); addr < __phys_to_virt(end);
|
|
addr += PMD_SIZE)
|
|
pmd_clear(pmd_off_k(addr));
|
|
|
|
+ flush_tlb_kernel_range(__phys_to_virt(start),
|
|
+ __phys_to_virt(end));
|
|
+
|
|
iotable_init(&map, 1);
|
|
}
|
|
}
|
|
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
|
|
index bc5fbc201bcb..f89389f634d7 100644
|
|
--- a/arch/powerpc/xmon/xmon.c
|
|
+++ b/arch/powerpc/xmon/xmon.c
|
|
@@ -288,6 +288,7 @@ static inline void disable_surveillance(void)
|
|
args.token = rtas_token("set-indicator");
|
|
if (args.token == RTAS_UNKNOWN_SERVICE)
|
|
return;
|
|
+ args.token = cpu_to_be32(args.token);
|
|
args.nargs = cpu_to_be32(3);
|
|
args.nret = cpu_to_be32(1);
|
|
args.rets = &args.args[3];
|
|
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
|
index b5bb49866bcc..67e9f5cc91ed 100644
|
|
--- a/arch/x86/boot/compressed/Makefile
|
|
+++ b/arch/x86/boot/compressed/Makefile
|
|
@@ -76,7 +76,7 @@ suffix-$(CONFIG_KERNEL_LZO) := lzo
|
|
suffix-$(CONFIG_KERNEL_LZ4) := lz4
|
|
|
|
RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \
|
|
- perl $(srctree)/arch/x86/tools/calc_run_size.pl)
|
|
+ $(CONFIG_SHELL) $(srctree)/arch/x86/tools/calc_run_size.sh)
|
|
quiet_cmd_mkpiggy = MKPIGGY $@
|
|
cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false )
|
|
|
|
diff --git a/arch/x86/tools/calc_run_size.pl b/arch/x86/tools/calc_run_size.pl
|
|
deleted file mode 100644
|
|
index 23210baade2d..000000000000
|
|
--- a/arch/x86/tools/calc_run_size.pl
|
|
+++ /dev/null
|
|
@@ -1,39 +0,0 @@
|
|
-#!/usr/bin/perl
|
|
-#
|
|
-# Calculate the amount of space needed to run the kernel, including room for
|
|
-# the .bss and .brk sections.
|
|
-#
|
|
-# Usage:
|
|
-# objdump -h a.out | perl calc_run_size.pl
|
|
-use strict;
|
|
-
|
|
-my $mem_size = 0;
|
|
-my $file_offset = 0;
|
|
-
|
|
-my $sections=" *[0-9]+ \.(?:bss|brk) +";
|
|
-while (<>) {
|
|
- if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) {
|
|
- my $size = hex($1);
|
|
- my $offset = hex($2);
|
|
- $mem_size += $size;
|
|
- if ($file_offset == 0) {
|
|
- $file_offset = $offset;
|
|
- } elsif ($file_offset != $offset) {
|
|
- # BFD linker shows the same file offset in ELF.
|
|
- # Gold linker shows them as consecutive.
|
|
- next if ($file_offset + $mem_size == $offset + $size);
|
|
-
|
|
- printf STDERR "file_offset: 0x%lx\n", $file_offset;
|
|
- printf STDERR "mem_size: 0x%lx\n", $mem_size;
|
|
- printf STDERR "offset: 0x%lx\n", $offset;
|
|
- printf STDERR "size: 0x%lx\n", $size;
|
|
-
|
|
- die ".bss and .brk are non-contiguous\n";
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-if ($file_offset == 0) {
|
|
- die "Never found .bss or .brk file offset\n";
|
|
-}
|
|
-printf("%d\n", $mem_size + $file_offset);
|
|
diff --git a/arch/x86/tools/calc_run_size.sh b/arch/x86/tools/calc_run_size.sh
|
|
new file mode 100644
|
|
index 000000000000..1a4c17bb3910
|
|
--- /dev/null
|
|
+++ b/arch/x86/tools/calc_run_size.sh
|
|
@@ -0,0 +1,42 @@
|
|
+#!/bin/sh
|
|
+#
|
|
+# Calculate the amount of space needed to run the kernel, including room for
|
|
+# the .bss and .brk sections.
|
|
+#
|
|
+# Usage:
|
|
+# objdump -h a.out | sh calc_run_size.sh
|
|
+
|
|
+NUM='\([0-9a-fA-F]*[ \t]*\)'
|
|
+OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p')
|
|
+if [ -z "$OUT" ] ; then
|
|
+ echo "Never found .bss or .brk file offset" >&2
|
|
+ exit 1
|
|
+fi
|
|
+
|
|
+OUT=$(echo ${OUT# })
|
|
+sizeA=$(printf "%d" 0x${OUT%% *})
|
|
+OUT=${OUT#* }
|
|
+offsetA=$(printf "%d" 0x${OUT%% *})
|
|
+OUT=${OUT#* }
|
|
+sizeB=$(printf "%d" 0x${OUT%% *})
|
|
+OUT=${OUT#* }
|
|
+offsetB=$(printf "%d" 0x${OUT%% *})
|
|
+
|
|
+run_size=$(( $offsetA + $sizeA + $sizeB ))
|
|
+
|
|
+# BFD linker shows the same file offset in ELF.
|
|
+if [ "$offsetA" -ne "$offsetB" ] ; then
|
|
+ # Gold linker shows them as consecutive.
|
|
+ endB=$(( $offsetB + $sizeB ))
|
|
+ if [ "$endB" != "$run_size" ] ; then
|
|
+ printf "sizeA: 0x%x\n" $sizeA >&2
|
|
+ printf "offsetA: 0x%x\n" $offsetA >&2
|
|
+ printf "sizeB: 0x%x\n" $sizeB >&2
|
|
+ printf "offsetB: 0x%x\n" $offsetB >&2
|
|
+ echo ".bss and .brk are non-contiguous" >&2
|
|
+ exit 1
|
|
+ fi
|
|
+fi
|
|
+
|
|
+printf "%d\n" $run_size
|
|
+exit 0
|
|
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
|
|
index 255ca232ecc7..275a7dc2b06c 100644
|
|
--- a/drivers/block/rbd.c
|
|
+++ b/drivers/block/rbd.c
|
|
@@ -1926,32 +1926,26 @@ static void rbd_dev_parent_put(struct rbd_device *rbd_dev)
|
|
* If an image has a non-zero parent overlap, get a reference to its
|
|
* parent.
|
|
*
|
|
- * We must get the reference before checking for the overlap to
|
|
- * coordinate properly with zeroing the parent overlap in
|
|
- * rbd_dev_v2_parent_info() when an image gets flattened. We
|
|
- * drop it again if there is no overlap.
|
|
- *
|
|
* Returns true if the rbd device has a parent with a non-zero
|
|
* overlap and a reference for it was successfully taken, or
|
|
* false otherwise.
|
|
*/
|
|
static bool rbd_dev_parent_get(struct rbd_device *rbd_dev)
|
|
{
|
|
- int counter;
|
|
+ int counter = 0;
|
|
|
|
if (!rbd_dev->parent_spec)
|
|
return false;
|
|
|
|
- counter = atomic_inc_return_safe(&rbd_dev->parent_ref);
|
|
- if (counter > 0 && rbd_dev->parent_overlap)
|
|
- return true;
|
|
-
|
|
- /* Image was flattened, but parent is not yet torn down */
|
|
+ down_read(&rbd_dev->header_rwsem);
|
|
+ if (rbd_dev->parent_overlap)
|
|
+ counter = atomic_inc_return_safe(&rbd_dev->parent_ref);
|
|
+ up_read(&rbd_dev->header_rwsem);
|
|
|
|
if (counter < 0)
|
|
rbd_warn(rbd_dev, "parent reference overflow\n");
|
|
|
|
- return false;
|
|
+ return counter > 0;
|
|
}
|
|
|
|
/*
|
|
@@ -3904,7 +3898,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev)
|
|
*/
|
|
if (rbd_dev->parent_overlap) {
|
|
rbd_dev->parent_overlap = 0;
|
|
- smp_mb();
|
|
rbd_dev_parent_put(rbd_dev);
|
|
pr_info("%s: clone image has been flattened\n",
|
|
rbd_dev->disk->disk_name);
|
|
@@ -3948,7 +3941,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev)
|
|
* treat it specially.
|
|
*/
|
|
rbd_dev->parent_overlap = overlap;
|
|
- smp_mb();
|
|
if (!overlap) {
|
|
|
|
/* A null parent_spec indicates it's the initial probe */
|
|
@@ -4764,10 +4756,7 @@ static void rbd_dev_unprobe(struct rbd_device *rbd_dev)
|
|
{
|
|
struct rbd_image_header *header;
|
|
|
|
- /* Drop parent reference unless it's already been done (or none) */
|
|
-
|
|
- if (rbd_dev->parent_overlap)
|
|
- rbd_dev_parent_put(rbd_dev);
|
|
+ rbd_dev_parent_put(rbd_dev);
|
|
|
|
/* Free dynamic fields from the header, then zero it out */
|
|
|
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
|
index 3153eabde39b..de5ab4876a89 100644
|
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
|
@@ -2893,6 +2893,13 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg,
|
|
u32 size = i915_gem_obj_ggtt_size(obj);
|
|
uint64_t val;
|
|
|
|
+ /* Adjust fence size to match tiled area */
|
|
+ if (obj->tiling_mode != I915_TILING_NONE) {
|
|
+ uint32_t row_size = obj->stride *
|
|
+ (obj->tiling_mode == I915_TILING_Y ? 32 : 8);
|
|
+ size = (size / row_size) * row_size;
|
|
+ }
|
|
+
|
|
val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) &
|
|
0xfffff000) << 32;
|
|
val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000;
|
|
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
|
|
index 93ec37649346..79a211782766 100644
|
|
--- a/drivers/i2c/busses/i2c-s3c2410.c
|
|
+++ b/drivers/i2c/busses/i2c-s3c2410.c
|
|
@@ -753,14 +753,16 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,
|
|
int ret;
|
|
|
|
pm_runtime_get_sync(&adap->dev);
|
|
- clk_prepare_enable(i2c->clk);
|
|
+ ret = clk_enable(i2c->clk);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
for (retry = 0; retry < adap->retries; retry++) {
|
|
|
|
ret = s3c24xx_i2c_doxfer(i2c, msgs, num);
|
|
|
|
if (ret != -EAGAIN) {
|
|
- clk_disable_unprepare(i2c->clk);
|
|
+ clk_disable(i2c->clk);
|
|
pm_runtime_put(&adap->dev);
|
|
return ret;
|
|
}
|
|
@@ -770,7 +772,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,
|
|
udelay(100);
|
|
}
|
|
|
|
- clk_disable_unprepare(i2c->clk);
|
|
+ clk_disable(i2c->clk);
|
|
pm_runtime_put(&adap->dev);
|
|
return -EREMOTEIO;
|
|
}
|
|
@@ -1153,7 +1155,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
|
|
clk_prepare_enable(i2c->clk);
|
|
ret = s3c24xx_i2c_init(i2c);
|
|
- clk_disable_unprepare(i2c->clk);
|
|
+ clk_disable(i2c->clk);
|
|
if (ret != 0) {
|
|
dev_err(&pdev->dev, "I2C controller init failed\n");
|
|
return ret;
|
|
@@ -1166,6 +1168,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
i2c->irq = ret = platform_get_irq(pdev, 0);
|
|
if (ret <= 0) {
|
|
dev_err(&pdev->dev, "cannot find IRQ\n");
|
|
+ clk_unprepare(i2c->clk);
|
|
return ret;
|
|
}
|
|
|
|
@@ -1174,6 +1177,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
|
|
if (ret != 0) {
|
|
dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq);
|
|
+ clk_unprepare(i2c->clk);
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -1181,6 +1185,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
ret = s3c24xx_i2c_register_cpufreq(i2c);
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "failed to register cpufreq notifier\n");
|
|
+ clk_unprepare(i2c->clk);
|
|
return ret;
|
|
}
|
|
|
|
@@ -1197,6 +1202,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "failed to add bus to i2c core\n");
|
|
s3c24xx_i2c_deregister_cpufreq(i2c);
|
|
+ clk_unprepare(i2c->clk);
|
|
return ret;
|
|
}
|
|
|
|
@@ -1218,6 +1224,8 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)
|
|
{
|
|
struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
|
|
|
|
+ clk_unprepare(i2c->clk);
|
|
+
|
|
pm_runtime_disable(&i2c->adap.dev);
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
|
@@ -1246,10 +1254,13 @@ static int s3c24xx_i2c_resume(struct device *dev)
|
|
{
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
|
|
+ int ret;
|
|
|
|
- clk_prepare_enable(i2c->clk);
|
|
+ ret = clk_enable(i2c->clk);
|
|
+ if (ret)
|
|
+ return ret;
|
|
s3c24xx_i2c_init(i2c);
|
|
- clk_disable_unprepare(i2c->clk);
|
|
+ clk_disable(i2c->clk);
|
|
i2c->suspended = 0;
|
|
|
|
return 0;
|
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
|
index a3769cf84381..b00e282ef166 100644
|
|
--- a/drivers/input/mouse/synaptics.c
|
|
+++ b/drivers/input/mouse/synaptics.c
|
|
@@ -132,8 +132,9 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
|
|
1232, 5710, 1156, 4696
|
|
},
|
|
{
|
|
- (const char * const []){"LEN0034", "LEN0036", "LEN0039",
|
|
- "LEN2002", "LEN2004", NULL},
|
|
+ (const char * const []){"LEN0034", "LEN0036", "LEN0037",
|
|
+ "LEN0039", "LEN2002", "LEN2004",
|
|
+ NULL},
|
|
1024, 5112, 2024, 4832
|
|
},
|
|
{
|
|
@@ -162,7 +163,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
|
"LEN0034", /* T431s, L440, L540, T540, W540, X1 Carbon 2nd */
|
|
"LEN0035", /* X240 */
|
|
"LEN0036", /* T440 */
|
|
- "LEN0037",
|
|
+ "LEN0037", /* X1 Carbon 2nd */
|
|
"LEN0038",
|
|
"LEN0039", /* T440s */
|
|
"LEN0041",
|
|
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
|
|
index c43c46f7dcd0..dd6d14d2337f 100644
|
|
--- a/drivers/input/serio/i8042-x86ia64io.h
|
|
+++ b/drivers/input/serio/i8042-x86ia64io.h
|
|
@@ -152,6 +152,14 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
|
|
},
|
|
},
|
|
{
|
|
+ /* Medion Akoya E7225 */
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
/* Blue FB5601 */
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "blue"),
|
|
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c
|
|
index d290e8396116..b950a803bae8 100644
|
|
--- a/drivers/md/dm-cache-metadata.c
|
|
+++ b/drivers/md/dm-cache-metadata.c
|
|
@@ -683,7 +683,7 @@ static struct dm_cache_metadata *metadata_open(struct block_device *bdev,
|
|
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
|
if (!cmd) {
|
|
DMERR("could not allocate metadata struct");
|
|
- return NULL;
|
|
+ return ERR_PTR(-ENOMEM);
|
|
}
|
|
|
|
atomic_set(&cmd->ref_count, 1);
|
|
@@ -745,7 +745,7 @@ static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev,
|
|
return cmd;
|
|
|
|
cmd = metadata_open(bdev, data_block_size, may_format_device, policy_hint_size);
|
|
- if (cmd) {
|
|
+ if (!IS_ERR(cmd)) {
|
|
mutex_lock(&table_lock);
|
|
cmd2 = lookup(bdev);
|
|
if (cmd2) {
|
|
@@ -780,9 +780,10 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev,
|
|
{
|
|
struct dm_cache_metadata *cmd = lookup_or_open(bdev, data_block_size,
|
|
may_format_device, policy_hint_size);
|
|
- if (cmd && !same_params(cmd, data_block_size)) {
|
|
+
|
|
+ if (!IS_ERR(cmd) && !same_params(cmd, data_block_size)) {
|
|
dm_cache_metadata_close(cmd);
|
|
- return NULL;
|
|
+ return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
return cmd;
|
|
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
|
|
index f7e052c7ab5f..c1120eb96d86 100644
|
|
--- a/drivers/md/dm-thin.c
|
|
+++ b/drivers/md/dm-thin.c
|
|
@@ -2744,6 +2744,12 @@ static int pool_message(struct dm_target *ti, unsigned argc, char **argv)
|
|
struct pool_c *pt = ti->private;
|
|
struct pool *pool = pt->pool;
|
|
|
|
+ if (get_pool_mode(pool) >= PM_READ_ONLY) {
|
|
+ DMERR("%s: unable to service pool target messages in READ_ONLY or FAIL mode",
|
|
+ dm_device_name(pool->pool_md));
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
if (!strcasecmp(argv[0], "create_thin"))
|
|
r = process_create_thin_mesg(argc, argv, pool);
|
|
|
|
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c
|
|
index 4e65b35bebc0..3d198679510b 100644
|
|
--- a/drivers/net/can/usb/kvaser_usb.c
|
|
+++ b/drivers/net/can/usb/kvaser_usb.c
|
|
@@ -578,7 +578,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv,
|
|
usb_sndbulkpipe(dev->udev,
|
|
dev->bulk_out->bEndpointAddress),
|
|
buf, msg->len,
|
|
- kvaser_usb_simple_msg_callback, priv);
|
|
+ kvaser_usb_simple_msg_callback, netdev);
|
|
usb_anchor_urb(urb, &priv->tx_submitted);
|
|
|
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
|
@@ -653,11 +653,6 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
|
|
priv = dev->nets[channel];
|
|
stats = &priv->netdev->stats;
|
|
|
|
- if (status & M16C_STATE_BUS_RESET) {
|
|
- kvaser_usb_unlink_tx_urbs(priv);
|
|
- return;
|
|
- }
|
|
-
|
|
skb = alloc_can_err_skb(priv->netdev, &cf);
|
|
if (!skb) {
|
|
stats->rx_dropped++;
|
|
@@ -668,7 +663,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
|
|
|
|
netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status);
|
|
|
|
- if (status & M16C_STATE_BUS_OFF) {
|
|
+ if (status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) {
|
|
cf->can_id |= CAN_ERR_BUSOFF;
|
|
|
|
priv->can.can_stats.bus_off++;
|
|
@@ -694,9 +689,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
|
|
}
|
|
|
|
new_state = CAN_STATE_ERROR_PASSIVE;
|
|
- }
|
|
-
|
|
- if (status == M16C_STATE_BUS_ERROR) {
|
|
+ } else if (status & M16C_STATE_BUS_ERROR) {
|
|
if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
|
|
((txerr >= 96) || (rxerr >= 96))) {
|
|
cf->can_id |= CAN_ERR_CRTL;
|
|
@@ -706,7 +699,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
|
|
|
|
priv->can.can_stats.error_warning++;
|
|
new_state = CAN_STATE_ERROR_WARNING;
|
|
- } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) {
|
|
+ } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) &&
|
|
+ ((txerr < 96) && (rxerr < 96))) {
|
|
cf->can_id |= CAN_ERR_PROT;
|
|
cf->data[2] = CAN_ERR_PROT_ACTIVE;
|
|
|
|
@@ -1582,7 +1576,7 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|
{
|
|
struct kvaser_usb *dev;
|
|
int err = -ENOMEM;
|
|
- int i;
|
|
+ int i, retry = 3;
|
|
|
|
dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
|
|
if (!dev)
|
|
@@ -1600,7 +1594,15 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|
|
|
usb_set_intfdata(intf, dev);
|
|
|
|
- err = kvaser_usb_get_software_info(dev);
|
|
+ /* On some x86 laptops, plugging a Kvaser device again after
|
|
+ * an unplug makes the firmware always ignore the very first
|
|
+ * command. For such a case, provide some room for retries
|
|
+ * instead of completely exiting the driver.
|
|
+ */
|
|
+ do {
|
|
+ err = kvaser_usb_get_software_info(dev);
|
|
+ } while (--retry && err == -ETIMEDOUT);
|
|
+
|
|
if (err) {
|
|
dev_err(&intf->dev,
|
|
"Cannot get software infos, error %d\n", err);
|
|
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
|
|
index 316650c3b5d7..4eb091da7fb6 100644
|
|
--- a/drivers/net/ethernet/ti/cpsw.c
|
|
+++ b/drivers/net/ethernet/ti/cpsw.c
|
|
@@ -1610,6 +1610,19 @@ static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev,
|
|
if (vid == priv->data.default_vlan)
|
|
return 0;
|
|
|
|
+ if (priv->data.dual_emac) {
|
|
+ /* In dual EMAC, reserved VLAN id should not be used for
|
|
+ * creating VLAN interfaces as this can break the dual
|
|
+ * EMAC port separation
|
|
+ */
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < priv->data.slaves; i++) {
|
|
+ if (vid == priv->slaves[i].port_vlan)
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ }
|
|
+
|
|
dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid);
|
|
return cpsw_add_vlan_ale_entry(priv, vid);
|
|
}
|
|
@@ -1623,6 +1636,15 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev,
|
|
if (vid == priv->data.default_vlan)
|
|
return 0;
|
|
|
|
+ if (priv->data.dual_emac) {
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < priv->data.slaves; i++) {
|
|
+ if (vid == priv->slaves[i].port_vlan)
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ }
|
|
+
|
|
dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid);
|
|
ret = cpsw_ale_del_vlan(priv->ale, vid, 0);
|
|
if (ret != 0)
|
|
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
|
|
index afca1bc24f26..b7984044232d 100644
|
|
--- a/drivers/regulator/core.c
|
|
+++ b/drivers/regulator/core.c
|
|
@@ -1479,7 +1479,7 @@ struct regulator *regulator_get_optional(struct device *dev, const char *id)
|
|
}
|
|
EXPORT_SYMBOL_GPL(regulator_get_optional);
|
|
|
|
-/* Locks held by regulator_put() */
|
|
+/* regulator_list_mutex lock held by regulator_put() */
|
|
static void _regulator_put(struct regulator *regulator)
|
|
{
|
|
struct regulator_dev *rdev;
|
|
@@ -1494,12 +1494,14 @@ static void _regulator_put(struct regulator *regulator)
|
|
/* remove any sysfs entries */
|
|
if (regulator->dev)
|
|
sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name);
|
|
+ mutex_lock(&rdev->mutex);
|
|
kfree(regulator->supply_name);
|
|
list_del(®ulator->list);
|
|
kfree(regulator);
|
|
|
|
rdev->open_count--;
|
|
rdev->exclusive = 0;
|
|
+ mutex_unlock(&rdev->mutex);
|
|
|
|
module_put(rdev->owner);
|
|
}
|
|
diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c
|
|
index a4c45ea8f688..996e16d12cd4 100644
|
|
--- a/drivers/spi/spi-dw-mid.c
|
|
+++ b/drivers/spi/spi-dw-mid.c
|
|
@@ -222,7 +222,6 @@ int dw_spi_mid_init(struct dw_spi *dws)
|
|
iounmap(clk_reg);
|
|
|
|
dws->num_cs = 16;
|
|
- dws->fifo_len = 40; /* FIFO has 40 words buffer */
|
|
|
|
#ifdef CONFIG_SPI_DW_MID_DMA
|
|
dws->dma_priv = kzalloc(sizeof(struct mid_dma), GFP_KERNEL);
|
|
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
|
|
index 7ab3ccb592eb..458a1480dc07 100644
|
|
--- a/drivers/spi/spi-pxa2xx.c
|
|
+++ b/drivers/spi/spi-pxa2xx.c
|
|
@@ -400,8 +400,8 @@ static void giveback(struct driver_data *drv_data)
|
|
cs_deassert(drv_data);
|
|
}
|
|
|
|
- spi_finalize_current_message(drv_data->master);
|
|
drv_data->cur_chip = NULL;
|
|
+ spi_finalize_current_message(drv_data->master);
|
|
}
|
|
|
|
static void reset_sccr1(struct driver_data *drv_data)
|
|
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
|
|
index 38b4be24d13f..26ae6886ac59 100644
|
|
--- a/drivers/target/target_core_device.c
|
|
+++ b/drivers/target/target_core_device.c
|
|
@@ -1153,10 +1153,10 @@ int se_dev_set_optimal_sectors(struct se_device *dev, u32 optimal_sectors)
|
|
" changed for TCM/pSCSI\n", dev);
|
|
return -EINVAL;
|
|
}
|
|
- if (optimal_sectors > dev->dev_attrib.fabric_max_sectors) {
|
|
+ if (optimal_sectors > dev->dev_attrib.hw_max_sectors) {
|
|
pr_err("dev[%p]: Passed optimal_sectors %u cannot be"
|
|
- " greater than fabric_max_sectors: %u\n", dev,
|
|
- optimal_sectors, dev->dev_attrib.fabric_max_sectors);
|
|
+ " greater than hw_max_sectors: %u\n", dev,
|
|
+ optimal_sectors, dev->dev_attrib.hw_max_sectors);
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -1565,7 +1565,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
|
|
DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT;
|
|
dev->dev_attrib.max_write_same_len = DA_MAX_WRITE_SAME_LEN;
|
|
dev->dev_attrib.fabric_max_sectors = DA_FABRIC_MAX_SECTORS;
|
|
- dev->dev_attrib.optimal_sectors = DA_FABRIC_MAX_SECTORS;
|
|
|
|
xcopy_lun = &dev->xcopy_lun;
|
|
xcopy_lun->lun_se_dev = dev;
|
|
@@ -1606,6 +1605,7 @@ int target_configure_device(struct se_device *dev)
|
|
dev->dev_attrib.hw_max_sectors =
|
|
se_dev_align_max_sectors(dev->dev_attrib.hw_max_sectors,
|
|
dev->dev_attrib.hw_block_size);
|
|
+ dev->dev_attrib.optimal_sectors = dev->dev_attrib.hw_max_sectors;
|
|
|
|
dev->dev_index = scsi_get_new_index(SCSI_DEVICE_INDEX);
|
|
dev->creation_time = get_jiffies_64();
|
|
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
|
|
index cf991a91a8a9..41eff7d64cb8 100644
|
|
--- a/drivers/target/target_core_file.c
|
|
+++ b/drivers/target/target_core_file.c
|
|
@@ -620,7 +620,16 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
|
|
struct fd_prot fd_prot;
|
|
sense_reason_t rc;
|
|
int ret = 0;
|
|
-
|
|
+ /*
|
|
+ * We are currently limited by the number of iovecs (2048) per
|
|
+ * single vfs_[writev,readv] call.
|
|
+ */
|
|
+ if (cmd->data_length > FD_MAX_BYTES) {
|
|
+ pr_err("FILEIO: Not able to process I/O of %u bytes due to"
|
|
+ "FD_MAX_BYTES: %u iovec count limitiation\n",
|
|
+ cmd->data_length, FD_MAX_BYTES);
|
|
+ return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
+ }
|
|
/*
|
|
* Call vectorized fileio functions to map struct scatterlist
|
|
* physical memory addresses to struct iovec virtual memory.
|
|
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
|
|
index 9e0232cca92e..feefe24a88f7 100644
|
|
--- a/drivers/target/target_core_iblock.c
|
|
+++ b/drivers/target/target_core_iblock.c
|
|
@@ -123,7 +123,7 @@ static int iblock_configure_device(struct se_device *dev)
|
|
q = bdev_get_queue(bd);
|
|
|
|
dev->dev_attrib.hw_block_size = bdev_logical_block_size(bd);
|
|
- dev->dev_attrib.hw_max_sectors = UINT_MAX;
|
|
+ dev->dev_attrib.hw_max_sectors = queue_max_hw_sectors(q);
|
|
dev->dev_attrib.hw_queue_depth = q->nr_requests;
|
|
|
|
/*
|
|
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
|
|
index 379033f5903b..5216acd68b4b 100644
|
|
--- a/drivers/target/target_core_sbc.c
|
|
+++ b/drivers/target/target_core_sbc.c
|
|
@@ -910,21 +910,6 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
|
if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) {
|
|
unsigned long long end_lba;
|
|
|
|
- if (sectors > dev->dev_attrib.fabric_max_sectors) {
|
|
- printk_ratelimited(KERN_ERR "SCSI OP %02xh with too"
|
|
- " big sectors %u exceeds fabric_max_sectors:"
|
|
- " %u\n", cdb[0], sectors,
|
|
- dev->dev_attrib.fabric_max_sectors);
|
|
- return TCM_INVALID_CDB_FIELD;
|
|
- }
|
|
- if (sectors > dev->dev_attrib.hw_max_sectors) {
|
|
- printk_ratelimited(KERN_ERR "SCSI OP %02xh with too"
|
|
- " big sectors %u exceeds backend hw_max_sectors:"
|
|
- " %u\n", cdb[0], sectors,
|
|
- dev->dev_attrib.hw_max_sectors);
|
|
- return TCM_INVALID_CDB_FIELD;
|
|
- }
|
|
-
|
|
end_lba = dev->transport->get_blocks(dev) + 1;
|
|
if (cmd->t_task_lba + sectors > end_lba) {
|
|
pr_err("cmd exceeds last lba %llu "
|
|
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
|
|
index fcdf98fc947c..12a74f646d38 100644
|
|
--- a/drivers/target/target_core_spc.c
|
|
+++ b/drivers/target/target_core_spc.c
|
|
@@ -503,7 +503,6 @@ static sense_reason_t
|
|
spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
|
|
{
|
|
struct se_device *dev = cmd->se_dev;
|
|
- u32 max_sectors;
|
|
int have_tp = 0;
|
|
int opt, min;
|
|
|
|
@@ -537,9 +536,7 @@ spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
|
|
/*
|
|
* Set MAXIMUM TRANSFER LENGTH
|
|
*/
|
|
- max_sectors = min(dev->dev_attrib.fabric_max_sectors,
|
|
- dev->dev_attrib.hw_max_sectors);
|
|
- put_unaligned_be32(max_sectors, &buf[8]);
|
|
+ put_unaligned_be32(dev->dev_attrib.hw_max_sectors, &buf[8]);
|
|
|
|
/*
|
|
* Set OPTIMAL TRANSFER LENGTH
|
|
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
|
|
index de2543d3c283..7ececa1c6c4f 100644
|
|
--- a/fs/nfs/direct.c
|
|
+++ b/fs/nfs/direct.c
|
|
@@ -123,6 +123,12 @@ static inline int put_dreq(struct nfs_direct_req *dreq)
|
|
*/
|
|
ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t pos, unsigned long nr_segs)
|
|
{
|
|
+ struct inode *inode = iocb->ki_filp->f_mapping->host;
|
|
+
|
|
+ /* we only support swap file calling nfs_direct_IO */
|
|
+ if (!IS_SWAPFILE(inode))
|
|
+ return 0;
|
|
+
|
|
#ifndef CONFIG_NFS_SWAP
|
|
dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n",
|
|
iocb->ki_filp, (long long) pos, nr_segs);
|
|
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
|
|
index 037f9572b94c..d3f606255b99 100644
|
|
--- a/fs/nfs/nfs4client.c
|
|
+++ b/fs/nfs/nfs4client.c
|
|
@@ -633,7 +633,7 @@ int nfs41_walk_client_list(struct nfs_client *new,
|
|
prev = pos;
|
|
|
|
status = nfs_wait_client_init_complete(pos);
|
|
- if (status == 0) {
|
|
+ if (pos->cl_cons_state == NFS_CS_SESSION_INITING) {
|
|
nfs4_schedule_lease_recovery(pos);
|
|
status = nfs4_wait_clnt_recover(pos);
|
|
}
|
|
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
|
|
index e7d95f959333..fe68d8ac4d3d 100644
|
|
--- a/fs/pstore/ram.c
|
|
+++ b/fs/pstore/ram.c
|
|
@@ -92,6 +92,7 @@ struct ramoops_context {
|
|
struct persistent_ram_ecc_info ecc_info;
|
|
unsigned int max_dump_cnt;
|
|
unsigned int dump_write_cnt;
|
|
+ /* _read_cnt need clear on ramoops_pstore_open */
|
|
unsigned int dump_read_cnt;
|
|
unsigned int console_read_cnt;
|
|
unsigned int ftrace_read_cnt;
|
|
@@ -107,6 +108,7 @@ static int ramoops_pstore_open(struct pstore_info *psi)
|
|
|
|
cxt->dump_read_cnt = 0;
|
|
cxt->console_read_cnt = 0;
|
|
+ cxt->ftrace_read_cnt = 0;
|
|
return 0;
|
|
}
|
|
|
|
@@ -123,13 +125,15 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
|
|
return NULL;
|
|
|
|
prz = przs[i];
|
|
+ if (!prz)
|
|
+ return NULL;
|
|
|
|
- if (update) {
|
|
- /* Update old/shadowed buffer. */
|
|
+ /* Update old/shadowed buffer. */
|
|
+ if (update)
|
|
persistent_ram_save_old(prz);
|
|
- if (!persistent_ram_old_size(prz))
|
|
- return NULL;
|
|
- }
|
|
+
|
|
+ if (!persistent_ram_old_size(prz))
|
|
+ return NULL;
|
|
|
|
*typep = type;
|
|
*id = i;
|
|
@@ -435,7 +439,6 @@ static int ramoops_probe(struct platform_device *pdev)
|
|
if (pdata->ftrace_size && !is_power_of_2(pdata->ftrace_size))
|
|
pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size);
|
|
|
|
- cxt->dump_read_cnt = 0;
|
|
cxt->size = pdata->mem_size;
|
|
cxt->phys_addr = pdata->mem_address;
|
|
cxt->memtype = pdata->mem_type;
|
|
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
|
index b4defdecec8a..f6f31d823e8e 100644
|
|
--- a/kernel/workqueue.c
|
|
+++ b/kernel/workqueue.c
|
|
@@ -1962,17 +1962,13 @@ static void pool_mayday_timeout(unsigned long __pool)
|
|
* spin_lock_irq(pool->lock) which may be released and regrabbed
|
|
* multiple times. Does GFP_KERNEL allocations. Called only from
|
|
* manager.
|
|
- *
|
|
- * Return:
|
|
- * %false if no action was taken and pool->lock stayed locked, %true
|
|
- * otherwise.
|
|
*/
|
|
-static bool maybe_create_worker(struct worker_pool *pool)
|
|
+static void maybe_create_worker(struct worker_pool *pool)
|
|
__releases(&pool->lock)
|
|
__acquires(&pool->lock)
|
|
{
|
|
if (!need_to_create_worker(pool))
|
|
- return false;
|
|
+ return;
|
|
restart:
|
|
spin_unlock_irq(&pool->lock);
|
|
|
|
@@ -1989,7 +1985,7 @@ restart:
|
|
start_worker(worker);
|
|
if (WARN_ON_ONCE(need_to_create_worker(pool)))
|
|
goto restart;
|
|
- return true;
|
|
+ return;
|
|
}
|
|
|
|
if (!need_to_create_worker(pool))
|
|
@@ -2006,7 +2002,7 @@ restart:
|
|
spin_lock_irq(&pool->lock);
|
|
if (need_to_create_worker(pool))
|
|
goto restart;
|
|
- return true;
|
|
+ return;
|
|
}
|
|
|
|
/**
|
|
@@ -2019,15 +2015,9 @@ restart:
|
|
* LOCKING:
|
|
* spin_lock_irq(pool->lock) which may be released and regrabbed
|
|
* multiple times. Called only from manager.
|
|
- *
|
|
- * Return:
|
|
- * %false if no action was taken and pool->lock stayed locked, %true
|
|
- * otherwise.
|
|
*/
|
|
-static bool maybe_destroy_workers(struct worker_pool *pool)
|
|
+static void maybe_destroy_workers(struct worker_pool *pool)
|
|
{
|
|
- bool ret = false;
|
|
-
|
|
while (too_many_workers(pool)) {
|
|
struct worker *worker;
|
|
unsigned long expires;
|
|
@@ -2041,10 +2031,7 @@ static bool maybe_destroy_workers(struct worker_pool *pool)
|
|
}
|
|
|
|
destroy_worker(worker);
|
|
- ret = true;
|
|
}
|
|
-
|
|
- return ret;
|
|
}
|
|
|
|
/**
|
|
@@ -2064,16 +2051,14 @@ static bool maybe_destroy_workers(struct worker_pool *pool)
|
|
* multiple times. Does GFP_KERNEL allocations.
|
|
*
|
|
* Return:
|
|
- * %false if the pool don't need management and the caller can safely start
|
|
- * processing works, %true indicates that the function released pool->lock
|
|
- * and reacquired it to perform some management function and that the
|
|
- * conditions that the caller verified while holding the lock before
|
|
- * calling the function might no longer be true.
|
|
+ * %false if the pool doesn't need management and the caller can safely
|
|
+ * start processing works, %true if management function was performed and
|
|
+ * the conditions that the caller verified before calling the function may
|
|
+ * no longer be true.
|
|
*/
|
|
static bool manage_workers(struct worker *worker)
|
|
{
|
|
struct worker_pool *pool = worker->pool;
|
|
- bool ret = false;
|
|
|
|
/*
|
|
* Managership is governed by two mutexes - manager_arb and
|
|
@@ -2097,7 +2082,7 @@ static bool manage_workers(struct worker *worker)
|
|
* manager_mutex.
|
|
*/
|
|
if (!mutex_trylock(&pool->manager_arb))
|
|
- return ret;
|
|
+ return false;
|
|
|
|
/*
|
|
* With manager arbitration won, manager_mutex would be free in
|
|
@@ -2107,7 +2092,6 @@ static bool manage_workers(struct worker *worker)
|
|
spin_unlock_irq(&pool->lock);
|
|
mutex_lock(&pool->manager_mutex);
|
|
spin_lock_irq(&pool->lock);
|
|
- ret = true;
|
|
}
|
|
|
|
pool->flags &= ~POOL_MANAGE_WORKERS;
|
|
@@ -2116,12 +2100,12 @@ static bool manage_workers(struct worker *worker)
|
|
* Destroy and then create so that may_start_working() is true
|
|
* on return.
|
|
*/
|
|
- ret |= maybe_destroy_workers(pool);
|
|
- ret |= maybe_create_worker(pool);
|
|
+ maybe_destroy_workers(pool);
|
|
+ maybe_create_worker(pool);
|
|
|
|
mutex_unlock(&pool->manager_mutex);
|
|
mutex_unlock(&pool->manager_arb);
|
|
- return ret;
|
|
+ return true;
|
|
}
|
|
|
|
/**
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 1e4dc4ed5e0d..815ca56b39e7 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -261,7 +261,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
|
else if (rate && rate->flags & IEEE80211_RATE_ERP_G)
|
|
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
|
|
else if (rate)
|
|
- channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
|
|
+ channel_flags |= IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ;
|
|
else
|
|
channel_flags |= IEEE80211_CHAN_2GHZ;
|
|
put_unaligned_le16(channel_flags, pos);
|
|
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
|
|
index df33156ecd2d..18d73df72531 100644
|
|
--- a/net/wireless/nl80211.c
|
|
+++ b/net/wireless/nl80211.c
|
|
@@ -2697,6 +2697,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|
if (!rdev->ops->get_key)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
|
+ return -ENOENT;
|
|
+
|
|
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
|
if (!msg)
|
|
return -ENOMEM;
|
|
@@ -2716,10 +2719,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
|
|
goto nla_put_failure;
|
|
|
|
- if (pairwise && mac_addr &&
|
|
- !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
|
- return -ENOENT;
|
|
-
|
|
err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
|
|
get_key_callback);
|
|
|
|
@@ -2890,7 +2889,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
|
wdev_lock(dev->ieee80211_ptr);
|
|
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
|
|
|
- if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr &&
|
|
+ if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
|
|
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
|
err = -ENOENT;
|
|
|
|
diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
|
|
index dbc550716790..f60d81497f28 100644
|
|
--- a/sound/core/seq/seq_dummy.c
|
|
+++ b/sound/core/seq/seq_dummy.c
|
|
@@ -82,36 +82,6 @@ struct snd_seq_dummy_port {
|
|
static int my_client = -1;
|
|
|
|
/*
|
|
- * unuse callback - send ALL_SOUNDS_OFF and RESET_CONTROLLERS events
|
|
- * to subscribers.
|
|
- * Note: this callback is called only after all subscribers are removed.
|
|
- */
|
|
-static int
|
|
-dummy_unuse(void *private_data, struct snd_seq_port_subscribe *info)
|
|
-{
|
|
- struct snd_seq_dummy_port *p;
|
|
- int i;
|
|
- struct snd_seq_event ev;
|
|
-
|
|
- p = private_data;
|
|
- memset(&ev, 0, sizeof(ev));
|
|
- if (p->duplex)
|
|
- ev.source.port = p->connect;
|
|
- else
|
|
- ev.source.port = p->port;
|
|
- ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
|
|
- ev.type = SNDRV_SEQ_EVENT_CONTROLLER;
|
|
- for (i = 0; i < 16; i++) {
|
|
- ev.data.control.channel = i;
|
|
- ev.data.control.param = MIDI_CTL_ALL_SOUNDS_OFF;
|
|
- snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0);
|
|
- ev.data.control.param = MIDI_CTL_RESET_CONTROLLERS;
|
|
- snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0);
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
* event input callback - just redirect events to subscribers
|
|
*/
|
|
static int
|
|
@@ -175,7 +145,6 @@ create_port(int idx, int type)
|
|
| SNDRV_SEQ_PORT_TYPE_PORT;
|
|
memset(&pcb, 0, sizeof(pcb));
|
|
pcb.owner = THIS_MODULE;
|
|
- pcb.unuse = dummy_unuse;
|
|
pcb.event_input = dummy_input;
|
|
pcb.private_free = dummy_free;
|
|
pcb.private_data = rec;
|
|
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
|
|
index f156010e52bc..942ef8427347 100644
|
|
--- a/sound/soc/codecs/wm8960.c
|
|
+++ b/sound/soc/codecs/wm8960.c
|
|
@@ -555,7 +555,7 @@ static struct {
|
|
{ 22050, 2 },
|
|
{ 24000, 2 },
|
|
{ 16000, 3 },
|
|
- { 11250, 4 },
|
|
+ { 11025, 4 },
|
|
{ 12000, 4 },
|
|
{ 8000, 5 },
|
|
};
|
|
diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h
|
|
index 75e14033e8d8..dfdbaa014561 100644
|
|
--- a/sound/soc/fsl/fsl_esai.h
|
|
+++ b/sound/soc/fsl/fsl_esai.h
|
|
@@ -302,7 +302,7 @@
|
|
#define ESAI_xCCR_xFP_MASK (((1 << ESAI_xCCR_xFP_WIDTH) - 1) << ESAI_xCCR_xFP_SHIFT)
|
|
#define ESAI_xCCR_xFP(v) ((((v) - 1) << ESAI_xCCR_xFP_SHIFT) & ESAI_xCCR_xFP_MASK)
|
|
#define ESAI_xCCR_xDC_SHIFT 9
|
|
-#define ESAI_xCCR_xDC_WIDTH 4
|
|
+#define ESAI_xCCR_xDC_WIDTH 5
|
|
#define ESAI_xCCR_xDC_MASK (((1 << ESAI_xCCR_xDC_WIDTH) - 1) << ESAI_xCCR_xDC_SHIFT)
|
|
#define ESAI_xCCR_xDC(v) ((((v) - 1) << ESAI_xCCR_xDC_SHIFT) & ESAI_xCCR_xDC_MASK)
|
|
#define ESAI_xCCR_xPSR_SHIFT 8
|
|
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c
|
|
index 6c19bba23570..6a339fb55479 100644
|
|
--- a/sound/soc/omap/omap-mcbsp.c
|
|
+++ b/sound/soc/omap/omap-mcbsp.c
|
|
@@ -436,7 +436,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|
case SND_SOC_DAIFMT_CBM_CFS:
|
|
/* McBSP slave. FS clock as output */
|
|
regs->srgr2 |= FSGM;
|
|
- regs->pcr0 |= FSXM;
|
|
+ regs->pcr0 |= FSXM | FSRM;
|
|
break;
|
|
case SND_SOC_DAIFMT_CBM_CFM:
|
|
/* McBSP slave */
|
|
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
|
|
index 5e9690c85d8f..4f98ff14cf12 100644
|
|
--- a/sound/soc/soc-compress.c
|
|
+++ b/sound/soc/soc-compress.c
|
|
@@ -696,7 +696,8 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
|
|
rtd->dai_link->stream_name);
|
|
|
|
ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
|
|
- 1, 0, &be_pcm);
|
|
+ rtd->dai_link->dpcm_playback,
|
|
+ rtd->dai_link->dpcm_capture, &be_pcm);
|
|
if (ret < 0) {
|
|
dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n",
|
|
rtd->dai_link->name);
|
|
@@ -705,8 +706,10 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
|
rtd->pcm = be_pcm;
|
|
rtd->fe_compr = 1;
|
|
- be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
|
|
- be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
|
|
+ if (rtd->dai_link->dpcm_playback)
|
|
+ be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
|
|
+ else if (rtd->dai_link->dpcm_capture)
|
|
+ be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
|
|
memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops));
|
|
} else
|
|
memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops));
|