1986 lines
65 KiB
Diff
1986 lines
65 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index a9f16c9c9614f..0c13bf09d17dc 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 9
|
|
-SUBLEVEL = 312
|
|
+SUBLEVEL = 313
|
|
EXTRAVERSION =
|
|
NAME = Roaring Lionus
|
|
|
|
diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
|
|
index 99e323b57261c..cbe7b0dcb6eb2 100644
|
|
--- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi
|
|
+++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
|
|
@@ -324,6 +324,8 @@
|
|
codec: sgtl5000@0a {
|
|
compatible = "fsl,sgtl5000";
|
|
reg = <0x0a>;
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_sgtl5000>;
|
|
clocks = <&clks IMX6QDL_CLK_CKO>;
|
|
VDDA-supply = <®_2p5v>;
|
|
VDDIO-supply = <®_3p3v>;
|
|
@@ -550,8 +552,6 @@
|
|
MX6QDL_PAD_DISP0_DAT21__AUD4_TXD 0x130b0
|
|
MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS 0x130b0
|
|
MX6QDL_PAD_DISP0_DAT23__AUD4_RXD 0x130b0
|
|
- /* SGTL5000 sys_mclk */
|
|
- MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x130b0
|
|
>;
|
|
};
|
|
|
|
@@ -812,6 +812,12 @@
|
|
>;
|
|
};
|
|
|
|
+ pinctrl_sgtl5000: sgtl5000grp {
|
|
+ fsl,pins = <
|
|
+ MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x130b0
|
|
+ >;
|
|
+ };
|
|
+
|
|
pinctrl_spdif: spdifgrp {
|
|
fsl,pins = <
|
|
MX6QDL_PAD_GPIO_16__SPDIF_IN 0x1b0b0
|
|
diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi b/arch/arm/boot/dts/omap3-gta04.dtsi
|
|
index 338ee6bd0e0c0..ced298d073382 100644
|
|
--- a/arch/arm/boot/dts/omap3-gta04.dtsi
|
|
+++ b/arch/arm/boot/dts/omap3-gta04.dtsi
|
|
@@ -29,6 +29,8 @@
|
|
aliases {
|
|
display0 = &lcd;
|
|
display1 = &tv0;
|
|
+ /delete-property/ mmc2;
|
|
+ /delete-property/ mmc3;
|
|
};
|
|
|
|
gpio-keys {
|
|
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c
|
|
index e5dcbda20129d..7fff67ea7bcd3 100644
|
|
--- a/arch/arm/mach-omap2/omap4-common.c
|
|
+++ b/arch/arm/mach-omap2/omap4-common.c
|
|
@@ -342,10 +342,12 @@ void __init omap_gic_of_init(void)
|
|
|
|
np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic");
|
|
gic_dist_base_addr = of_iomap(np, 0);
|
|
+ of_node_put(np);
|
|
WARN_ON(!gic_dist_base_addr);
|
|
|
|
np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-twd-timer");
|
|
twd_base = of_iomap(np, 0);
|
|
+ of_node_put(np);
|
|
WARN_ON(!twd_base);
|
|
|
|
skip_errata_init:
|
|
diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h
|
|
index b05bb70a2e46f..8026baf46e729 100644
|
|
--- a/arch/mips/include/asm/timex.h
|
|
+++ b/arch/mips/include/asm/timex.h
|
|
@@ -40,9 +40,9 @@
|
|
typedef unsigned int cycles_t;
|
|
|
|
/*
|
|
- * On R4000/R4400 before version 5.0 an erratum exists such that if the
|
|
- * cycle counter is read in the exact moment that it is matching the
|
|
- * compare register, no interrupt will be generated.
|
|
+ * On R4000/R4400 an erratum exists such that if the cycle counter is
|
|
+ * read in the exact moment that it is matching the compare register,
|
|
+ * no interrupt will be generated.
|
|
*
|
|
* There is a suggested workaround and also the erratum can't strike if
|
|
* the compare interrupt isn't being used as the clock source device.
|
|
@@ -63,7 +63,7 @@ static inline int can_use_mips_counter(unsigned int prid)
|
|
if (!__builtin_constant_p(cpu_has_counter))
|
|
asm volatile("" : "=m" (cpu_data[0].options));
|
|
if (likely(cpu_has_counter &&
|
|
- prid >= (PRID_IMP_R4000 | PRID_REV_ENCODE_44(5, 0))))
|
|
+ prid > (PRID_IMP_R4000 | PRID_REV_ENCODE_44(15, 15))))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
|
|
index b15ee12586688..1d69989337889 100644
|
|
--- a/arch/mips/kernel/time.c
|
|
+++ b/arch/mips/kernel/time.c
|
|
@@ -168,15 +168,10 @@ static __init int cpu_has_mfc0_count_bug(void)
|
|
case CPU_R4400MC:
|
|
/*
|
|
* The published errata for the R4400 up to 3.0 say the CPU
|
|
- * has the mfc0 from count bug.
|
|
+ * has the mfc0 from count bug. This seems the last version
|
|
+ * produced.
|
|
*/
|
|
- if ((current_cpu_data.processor_id & 0xff) <= 0x30)
|
|
- return 1;
|
|
-
|
|
- /*
|
|
- * we assume newer revisions are ok
|
|
- */
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c
|
|
index 0c2a94a0f7518..e31633dcb0f35 100644
|
|
--- a/arch/parisc/kernel/processor.c
|
|
+++ b/arch/parisc/kernel/processor.c
|
|
@@ -390,8 +390,7 @@ show_cpuinfo (struct seq_file *m, void *v)
|
|
}
|
|
seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
|
|
|
|
- seq_printf(m, "model\t\t: %s\n"
|
|
- "model name\t: %s\n",
|
|
+ seq_printf(m, "model\t\t: %s - %s\n",
|
|
boot_cpu_data.pdc.sys_model_name,
|
|
cpuinfo->dev ?
|
|
cpuinfo->dev->name : "Unknown");
|
|
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
|
|
index da0d81fa0b546..0e50b668184ad 100644
|
|
--- a/arch/x86/include/asm/microcode.h
|
|
+++ b/arch/x86/include/asm/microcode.h
|
|
@@ -135,10 +135,12 @@ extern void __init load_ucode_bsp(void);
|
|
extern void load_ucode_ap(void);
|
|
void reload_early_microcode(void);
|
|
extern bool get_builtin_firmware(struct cpio_data *cd, const char *name);
|
|
+void microcode_bsp_resume(void);
|
|
#else
|
|
static inline void __init load_ucode_bsp(void) { }
|
|
static inline void load_ucode_ap(void) { }
|
|
static inline void reload_early_microcode(void) { }
|
|
+static inline void microcode_bsp_resume(void) { }
|
|
static inline bool
|
|
get_builtin_firmware(struct cpio_data *cd, const char *name) { return false; }
|
|
#endif
|
|
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
|
|
index b53a6579767d1..499bc79fc82a7 100644
|
|
--- a/arch/x86/kernel/cpu/microcode/core.c
|
|
+++ b/arch/x86/kernel/cpu/microcode/core.c
|
|
@@ -586,9 +586,9 @@ static struct subsys_interface mc_cpu_interface = {
|
|
};
|
|
|
|
/**
|
|
- * mc_bp_resume - Update boot CPU microcode during resume.
|
|
+ * microcode_bsp_resume - Update boot CPU microcode during resume.
|
|
*/
|
|
-static void mc_bp_resume(void)
|
|
+void microcode_bsp_resume(void)
|
|
{
|
|
int cpu = smp_processor_id();
|
|
struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
|
|
@@ -600,7 +600,7 @@ static void mc_bp_resume(void)
|
|
}
|
|
|
|
static struct syscore_ops mc_syscore_ops = {
|
|
- .resume = mc_bp_resume,
|
|
+ .resume = microcode_bsp_resume,
|
|
};
|
|
|
|
static int mc_cpu_online(unsigned int cpu)
|
|
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
|
|
index a6f8600672d75..c068027ac55f2 100644
|
|
--- a/arch/x86/kvm/cpuid.c
|
|
+++ b/arch/x86/kvm/cpuid.c
|
|
@@ -502,6 +502,11 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
union cpuid10_eax eax;
|
|
union cpuid10_edx edx;
|
|
|
|
+ if (!static_cpu_has(X86_FEATURE_ARCH_PERFMON)) {
|
|
+ entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
|
|
+ break;
|
|
+ }
|
|
+
|
|
perf_get_x86_pmu_capability(&cap);
|
|
|
|
/*
|
|
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
|
|
index 357b3e6a2f7b1..a1fbf18eed5a8 100644
|
|
--- a/arch/x86/power/cpu.c
|
|
+++ b/arch/x86/power/cpu.c
|
|
@@ -26,6 +26,7 @@
|
|
#include <asm/cpu.h>
|
|
#include <asm/mmu_context.h>
|
|
#include <asm/cpu_device_id.h>
|
|
+#include <asm/microcode.h>
|
|
|
|
#ifdef CONFIG_X86_32
|
|
__visible unsigned long saved_context_ebx;
|
|
@@ -261,6 +262,13 @@ static void notrace __restore_processor_state(struct saved_context *ctxt)
|
|
x86_platform.restore_sched_clock_state();
|
|
mtrr_bp_restore();
|
|
perf_restore_debug_store();
|
|
+
|
|
+ microcode_bsp_resume();
|
|
+
|
|
+ /*
|
|
+ * This needs to happen after the microcode has been updated upon resume
|
|
+ * because some of the MSRs are "emulated" in microcode.
|
|
+ */
|
|
msr_restore_context(ctxt);
|
|
}
|
|
|
|
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
|
|
index b701c79f07e53..3d5cf588c0786 100644
|
|
--- a/drivers/block/Kconfig
|
|
+++ b/drivers/block/Kconfig
|
|
@@ -33,6 +33,22 @@ config BLK_DEV_FD
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called floppy.
|
|
|
|
+config BLK_DEV_FD_RAWCMD
|
|
+ bool "Support for raw floppy disk commands (DEPRECATED)"
|
|
+ depends on BLK_DEV_FD
|
|
+ help
|
|
+ If you want to use actual physical floppies and expect to do
|
|
+ special low-level hardware accesses to them (access and use
|
|
+ non-standard formats, for example), then enable this.
|
|
+
|
|
+ Note that the code enabled by this option is rarely used and
|
|
+ might be unstable or insecure, and distros should not enable it.
|
|
+
|
|
+ Note: FDRAWCMD is deprecated and will be removed from the kernel
|
|
+ in the near future.
|
|
+
|
|
+ If unsure, say N.
|
|
+
|
|
config AMIGA_FLOPPY
|
|
tristate "Amiga floppy support"
|
|
depends on AMIGA
|
|
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
|
index 7164be9710e51..cfe1bfb3c20e9 100644
|
|
--- a/drivers/block/floppy.c
|
|
+++ b/drivers/block/floppy.c
|
|
@@ -3016,6 +3016,8 @@ static const char *drive_name(int type, int drive)
|
|
return "(null)";
|
|
}
|
|
|
|
+#ifdef CONFIG_BLK_DEV_FD_RAWCMD
|
|
+
|
|
/* raw commands */
|
|
static void raw_cmd_done(int flag)
|
|
{
|
|
@@ -3227,6 +3229,35 @@ static int raw_cmd_ioctl(int cmd, void __user *param)
|
|
return ret;
|
|
}
|
|
|
|
+static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
|
|
+ void __user *param)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ pr_warn_once("Note: FDRAWCMD is deprecated and will be removed from the kernel in the near future.\n");
|
|
+
|
|
+ if (type)
|
|
+ return -EINVAL;
|
|
+ if (lock_fdc(drive))
|
|
+ return -EINTR;
|
|
+ set_floppy(drive);
|
|
+ ret = raw_cmd_ioctl(cmd, param);
|
|
+ if (ret == -EINTR)
|
|
+ return -EINTR;
|
|
+ process_fd_request();
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+#else /* CONFIG_BLK_DEV_FD_RAWCMD */
|
|
+
|
|
+static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
|
|
+ void __user *param)
|
|
+{
|
|
+ return -EOPNOTSUPP;
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
static int invalidate_drive(struct block_device *bdev)
|
|
{
|
|
/* invalidate the buffer track to force a reread */
|
|
@@ -3414,7 +3445,6 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
|
{
|
|
int drive = (long)bdev->bd_disk->private_data;
|
|
int type = ITYPE(UDRS->fd_device);
|
|
- int i;
|
|
int ret;
|
|
int size;
|
|
union inparam {
|
|
@@ -3565,16 +3595,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
|
outparam = UDRWE;
|
|
break;
|
|
case FDRAWCMD:
|
|
- if (type)
|
|
- return -EINVAL;
|
|
- if (lock_fdc(drive))
|
|
- return -EINTR;
|
|
- set_floppy(drive);
|
|
- i = raw_cmd_ioctl(cmd, (void __user *)param);
|
|
- if (i == -EINTR)
|
|
- return -EINTR;
|
|
- process_fd_request();
|
|
- return i;
|
|
+ return floppy_raw_cmd_ioctl(type, drive, cmd, (void __user *)param);
|
|
case FDTWADDLE:
|
|
if (lock_fdc(drive))
|
|
return -EINTR;
|
|
diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c
|
|
index 4f3d988210b0a..ce5b976a88568 100644
|
|
--- a/drivers/bus/sunxi-rsb.c
|
|
+++ b/drivers/bus/sunxi-rsb.c
|
|
@@ -224,6 +224,8 @@ static struct sunxi_rsb_device *sunxi_rsb_device_create(struct sunxi_rsb *rsb,
|
|
|
|
dev_dbg(&rdev->dev, "device %s registered\n", dev_name(&rdev->dev));
|
|
|
|
+ return rdev;
|
|
+
|
|
err_device_add:
|
|
put_device(&rdev->dev);
|
|
|
|
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
|
|
index 57ea7f4641787..11c634125c7df 100644
|
|
--- a/drivers/firewire/core-card.c
|
|
+++ b/drivers/firewire/core-card.c
|
|
@@ -681,6 +681,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);
|
|
void fw_core_remove_card(struct fw_card *card)
|
|
{
|
|
struct fw_card_driver dummy_driver = dummy_driver_template;
|
|
+ unsigned long flags;
|
|
|
|
card->driver->update_phy_reg(card, 4,
|
|
PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
|
|
@@ -695,7 +696,9 @@ void fw_core_remove_card(struct fw_card *card)
|
|
dummy_driver.stop_iso = card->driver->stop_iso;
|
|
card->driver = &dummy_driver;
|
|
|
|
+ spin_lock_irqsave(&card->lock, flags);
|
|
fw_destroy_nodes(card);
|
|
+ spin_unlock_irqrestore(&card->lock, flags);
|
|
|
|
/* Wait for all users, especially device workqueue jobs, to finish. */
|
|
fw_card_put(card);
|
|
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
|
|
index aee149bdf4c03..59b49ff1f4be7 100644
|
|
--- a/drivers/firewire/core-cdev.c
|
|
+++ b/drivers/firewire/core-cdev.c
|
|
@@ -1496,6 +1496,7 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
|
|
{
|
|
struct outbound_phy_packet_event *e =
|
|
container_of(packet, struct outbound_phy_packet_event, p);
|
|
+ struct client *e_client;
|
|
|
|
switch (status) {
|
|
/* expected: */
|
|
@@ -1512,9 +1513,10 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
|
|
}
|
|
e->phy_packet.data[0] = packet->timestamp;
|
|
|
|
+ e_client = e->client;
|
|
queue_event(e->client, &e->event, &e->phy_packet,
|
|
sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0);
|
|
- client_put(e->client);
|
|
+ client_put(e_client);
|
|
}
|
|
|
|
static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
|
|
diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c
|
|
index 0de83508f321c..2337b0f3dae2c 100644
|
|
--- a/drivers/firewire/core-topology.c
|
|
+++ b/drivers/firewire/core-topology.c
|
|
@@ -387,16 +387,13 @@ static void report_found_node(struct fw_card *card,
|
|
card->bm_retries = 0;
|
|
}
|
|
|
|
+/* Must be called with card->lock held */
|
|
void fw_destroy_nodes(struct fw_card *card)
|
|
{
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&card->lock, flags);
|
|
card->color++;
|
|
if (card->local_node != NULL)
|
|
for_each_fw_node(card, card->local_node, report_lost_node);
|
|
card->local_node = NULL;
|
|
- spin_unlock_irqrestore(&card->lock, flags);
|
|
}
|
|
|
|
static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
|
|
@@ -522,6 +519,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
|
|
struct fw_node *local_node;
|
|
unsigned long flags;
|
|
|
|
+ spin_lock_irqsave(&card->lock, flags);
|
|
+
|
|
/*
|
|
* If the selfID buffer is not the immediate successor of the
|
|
* previously processed one, we cannot reliably compare the
|
|
@@ -533,8 +532,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
|
|
card->bm_retries = 0;
|
|
}
|
|
|
|
- spin_lock_irqsave(&card->lock, flags);
|
|
-
|
|
card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated;
|
|
card->node_id = node_id;
|
|
/*
|
|
diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c
|
|
index d6a09b9cd8cca..0446221d7d2e3 100644
|
|
--- a/drivers/firewire/core-transaction.c
|
|
+++ b/drivers/firewire/core-transaction.c
|
|
@@ -86,24 +86,25 @@ static int try_cancel_split_timeout(struct fw_transaction *t)
|
|
static int close_transaction(struct fw_transaction *transaction,
|
|
struct fw_card *card, int rcode)
|
|
{
|
|
- struct fw_transaction *t;
|
|
+ struct fw_transaction *t = NULL, *iter;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&card->lock, flags);
|
|
- list_for_each_entry(t, &card->transaction_list, link) {
|
|
- if (t == transaction) {
|
|
- if (!try_cancel_split_timeout(t)) {
|
|
+ list_for_each_entry(iter, &card->transaction_list, link) {
|
|
+ if (iter == transaction) {
|
|
+ if (!try_cancel_split_timeout(iter)) {
|
|
spin_unlock_irqrestore(&card->lock, flags);
|
|
goto timed_out;
|
|
}
|
|
- list_del_init(&t->link);
|
|
- card->tlabel_mask &= ~(1ULL << t->tlabel);
|
|
+ list_del_init(&iter->link);
|
|
+ card->tlabel_mask &= ~(1ULL << iter->tlabel);
|
|
+ t = iter;
|
|
break;
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&card->lock, flags);
|
|
|
|
- if (&t->link != &card->transaction_list) {
|
|
+ if (t) {
|
|
t->callback(card, rcode, NULL, 0, t->callback_data);
|
|
return 0;
|
|
}
|
|
@@ -938,7 +939,7 @@ EXPORT_SYMBOL(fw_core_handle_request);
|
|
|
|
void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
|
|
{
|
|
- struct fw_transaction *t;
|
|
+ struct fw_transaction *t = NULL, *iter;
|
|
unsigned long flags;
|
|
u32 *data;
|
|
size_t data_length;
|
|
@@ -950,20 +951,21 @@ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
|
|
rcode = HEADER_GET_RCODE(p->header[1]);
|
|
|
|
spin_lock_irqsave(&card->lock, flags);
|
|
- list_for_each_entry(t, &card->transaction_list, link) {
|
|
- if (t->node_id == source && t->tlabel == tlabel) {
|
|
- if (!try_cancel_split_timeout(t)) {
|
|
+ list_for_each_entry(iter, &card->transaction_list, link) {
|
|
+ if (iter->node_id == source && iter->tlabel == tlabel) {
|
|
+ if (!try_cancel_split_timeout(iter)) {
|
|
spin_unlock_irqrestore(&card->lock, flags);
|
|
goto timed_out;
|
|
}
|
|
- list_del_init(&t->link);
|
|
- card->tlabel_mask &= ~(1ULL << t->tlabel);
|
|
+ list_del_init(&iter->link);
|
|
+ card->tlabel_mask &= ~(1ULL << iter->tlabel);
|
|
+ t = iter;
|
|
break;
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&card->lock, flags);
|
|
|
|
- if (&t->link == &card->transaction_list) {
|
|
+ if (!t) {
|
|
timed_out:
|
|
fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
|
|
source, tlabel);
|
|
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
|
|
index 6bac03999fd49..d418a71faf0b1 100644
|
|
--- a/drivers/firewire/sbp2.c
|
|
+++ b/drivers/firewire/sbp2.c
|
|
@@ -421,7 +421,7 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
|
|
void *payload, size_t length, void *callback_data)
|
|
{
|
|
struct sbp2_logical_unit *lu = callback_data;
|
|
- struct sbp2_orb *orb;
|
|
+ struct sbp2_orb *orb = NULL, *iter;
|
|
struct sbp2_status status;
|
|
unsigned long flags;
|
|
|
|
@@ -446,17 +446,18 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
|
|
|
|
/* Lookup the orb corresponding to this status write. */
|
|
spin_lock_irqsave(&lu->tgt->lock, flags);
|
|
- list_for_each_entry(orb, &lu->orb_list, link) {
|
|
+ list_for_each_entry(iter, &lu->orb_list, link) {
|
|
if (STATUS_GET_ORB_HIGH(status) == 0 &&
|
|
- STATUS_GET_ORB_LOW(status) == orb->request_bus) {
|
|
- orb->rcode = RCODE_COMPLETE;
|
|
- list_del(&orb->link);
|
|
+ STATUS_GET_ORB_LOW(status) == iter->request_bus) {
|
|
+ iter->rcode = RCODE_COMPLETE;
|
|
+ list_del(&iter->link);
|
|
+ orb = iter;
|
|
break;
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&lu->tgt->lock, flags);
|
|
|
|
- if (&orb->link != &lu->orb_list) {
|
|
+ if (orb) {
|
|
orb->callback(orb, &status);
|
|
kref_put(&orb->kref, free_orb); /* orb callback reference */
|
|
} else {
|
|
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c
|
|
index 6e60ca53406e7..474f226e0891b 100644
|
|
--- a/drivers/hwmon/adt7470.c
|
|
+++ b/drivers/hwmon/adt7470.c
|
|
@@ -33,6 +33,7 @@
|
|
#include <linux/kthread.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/util_macros.h>
|
|
+#include <linux/sched.h>
|
|
|
|
/* Addresses to scan */
|
|
static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END };
|
|
@@ -273,11 +274,10 @@ static int adt7470_update_thread(void *p)
|
|
adt7470_read_temperatures(client, data);
|
|
mutex_unlock(&data->lock);
|
|
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
if (kthread_should_stop())
|
|
break;
|
|
|
|
- schedule_timeout(msecs_to_jiffies(data->auto_update_interval));
|
|
+ schedule_timeout_interruptible(msecs_to_jiffies(data->auto_update_interval));
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
|
|
index d3a3d62869d83..86de972f41b11 100644
|
|
--- a/drivers/iio/dac/ad5446.c
|
|
+++ b/drivers/iio/dac/ad5446.c
|
|
@@ -171,7 +171,7 @@ static int ad5446_read_raw(struct iio_dev *indio_dev,
|
|
|
|
switch (m) {
|
|
case IIO_CHAN_INFO_RAW:
|
|
- *val = st->cached_val;
|
|
+ *val = st->cached_val >> chan->scan_type.shift;
|
|
return IIO_VAL_INT;
|
|
case IIO_CHAN_INFO_SCALE:
|
|
*val = st->vref_mv;
|
|
diff --git a/drivers/iio/dac/ad5592r-base.c b/drivers/iio/dac/ad5592r-base.c
|
|
index 5c998ac8c840b..126bb8349363c 100644
|
|
--- a/drivers/iio/dac/ad5592r-base.c
|
|
+++ b/drivers/iio/dac/ad5592r-base.c
|
|
@@ -532,7 +532,7 @@ static int ad5592r_alloc_channels(struct ad5592r_state *st)
|
|
if (!ret)
|
|
st->channel_modes[reg] = tmp;
|
|
|
|
- fwnode_property_read_u32(child, "adi,off-state", &tmp);
|
|
+ ret = fwnode_property_read_u32(child, "adi,off-state", &tmp);
|
|
if (!ret)
|
|
st->channel_offstate[reg] = tmp;
|
|
}
|
|
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
|
|
index 2a4e23e20ebc6..a0787b1835e55 100644
|
|
--- a/drivers/iio/magnetometer/ak8975.c
|
|
+++ b/drivers/iio/magnetometer/ak8975.c
|
|
@@ -404,6 +404,7 @@ static int ak8975_power_on(const struct ak8975_data *data)
|
|
if (ret) {
|
|
dev_warn(&data->client->dev,
|
|
"Failed to enable specified Vid supply\n");
|
|
+ regulator_disable(data->vdd);
|
|
return ret;
|
|
}
|
|
/*
|
|
diff --git a/drivers/lightnvm/Kconfig b/drivers/lightnvm/Kconfig
|
|
index 2f5d5f4a4c75b..c2823d84cfa6a 100644
|
|
--- a/drivers/lightnvm/Kconfig
|
|
+++ b/drivers/lightnvm/Kconfig
|
|
@@ -4,7 +4,7 @@
|
|
|
|
menuconfig NVM
|
|
bool "Open-Channel SSD target support"
|
|
- depends on BLOCK && HAS_DMA
|
|
+ depends on BLOCK && HAS_DMA && BROKEN
|
|
help
|
|
Say Y here to get to enable Open-channel SSDs.
|
|
|
|
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
|
|
index dd154027adc9d..ec6c2b566621c 100644
|
|
--- a/drivers/md/dm.c
|
|
+++ b/drivers/md/dm.c
|
|
@@ -524,20 +524,19 @@ static void start_io_acct(struct dm_io *io)
|
|
false, 0, &io->stats_aux);
|
|
}
|
|
|
|
-static void end_io_acct(struct dm_io *io)
|
|
+static void end_io_acct(struct mapped_device *md, struct bio *bio,
|
|
+ unsigned long start_time, struct dm_stats_aux *stats_aux)
|
|
{
|
|
- struct mapped_device *md = io->md;
|
|
- struct bio *bio = io->bio;
|
|
- unsigned long duration = jiffies - io->start_time;
|
|
+ unsigned long duration = jiffies - start_time;
|
|
int pending;
|
|
int rw = bio_data_dir(bio);
|
|
|
|
- generic_end_io_acct(rw, &dm_disk(md)->part0, io->start_time);
|
|
+ generic_end_io_acct(rw, &dm_disk(md)->part0, start_time);
|
|
|
|
if (unlikely(dm_stats_used(&md->stats)))
|
|
dm_stats_account_io(&md->stats, bio_data_dir(bio),
|
|
bio->bi_iter.bi_sector, bio_sectors(bio),
|
|
- true, duration, &io->stats_aux);
|
|
+ true, duration, stats_aux);
|
|
|
|
/*
|
|
* After this is decremented the bio must not be touched if it is
|
|
@@ -768,6 +767,8 @@ static void dec_pending(struct dm_io *io, int error)
|
|
int io_error;
|
|
struct bio *bio;
|
|
struct mapped_device *md = io->md;
|
|
+ unsigned long start_time = 0;
|
|
+ struct dm_stats_aux stats_aux;
|
|
|
|
/* Push-back supersedes any I/O errors */
|
|
if (unlikely(error)) {
|
|
@@ -793,8 +794,10 @@ static void dec_pending(struct dm_io *io, int error)
|
|
|
|
io_error = io->error;
|
|
bio = io->bio;
|
|
- end_io_acct(io);
|
|
+ start_time = io->start_time;
|
|
+ stats_aux = io->stats_aux;
|
|
free_io(md, io);
|
|
+ end_io_acct(md, bio, start_time, &stats_aux);
|
|
|
|
if (io_error == DM_ENDIO_REQUEUE)
|
|
return;
|
|
@@ -2024,6 +2027,8 @@ static int dm_wait_for_completion(struct mapped_device *md, long task_state)
|
|
}
|
|
finish_wait(&md->wait, &wait);
|
|
|
|
+ smp_rmb(); /* paired with atomic_dec_return in end_io_acct */
|
|
+
|
|
return r;
|
|
}
|
|
|
|
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
|
|
index 31f98acdba073..17e15bd054421 100644
|
|
--- a/drivers/mtd/nand/sh_flctl.c
|
|
+++ b/drivers/mtd/nand/sh_flctl.c
|
|
@@ -399,7 +399,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
|
|
dma_addr_t dma_addr;
|
|
dma_cookie_t cookie;
|
|
uint32_t reg;
|
|
- int ret;
|
|
+ int ret = 0;
|
|
+ unsigned long time_left;
|
|
|
|
if (dir == DMA_FROM_DEVICE) {
|
|
chan = flctl->chan_fifo0_rx;
|
|
@@ -440,13 +441,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
|
|
goto out;
|
|
}
|
|
|
|
- ret =
|
|
+ time_left =
|
|
wait_for_completion_timeout(&flctl->dma_complete,
|
|
msecs_to_jiffies(3000));
|
|
|
|
- if (ret <= 0) {
|
|
+ if (time_left == 0) {
|
|
dmaengine_terminate_all(chan);
|
|
dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
|
|
+ ret = -ETIMEDOUT;
|
|
}
|
|
|
|
out:
|
|
@@ -456,7 +458,7 @@ out:
|
|
|
|
dma_unmap_single(chan->device->dev, dma_addr, len, dir);
|
|
|
|
- /* ret > 0 is success */
|
|
+ /* ret == 0 is success */
|
|
return ret;
|
|
}
|
|
|
|
@@ -480,7 +482,7 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
|
|
|
|
/* initiate DMA transfer */
|
|
if (flctl->chan_fifo0_rx && rlen >= 32 &&
|
|
- flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE) > 0)
|
|
+ !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE))
|
|
goto convert; /* DMA success */
|
|
|
|
/* do polling transfer */
|
|
@@ -539,7 +541,7 @@ static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen,
|
|
|
|
/* initiate DMA transfer */
|
|
if (flctl->chan_fifo0_tx && rlen >= 32 &&
|
|
- flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE) > 0)
|
|
+ !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE))
|
|
return; /* DMA success */
|
|
|
|
/* do polling transfer */
|
|
diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
|
|
index db9538d4b3586..a2dbd7ae9db24 100644
|
|
--- a/drivers/net/can/grcan.c
|
|
+++ b/drivers/net/can/grcan.c
|
|
@@ -252,6 +252,7 @@ struct grcan_device_config {
|
|
struct grcan_priv {
|
|
struct can_priv can; /* must be the first member */
|
|
struct net_device *dev;
|
|
+ struct device *ofdev_dev;
|
|
struct napi_struct napi;
|
|
|
|
struct grcan_registers __iomem *regs; /* ioremap'ed registers */
|
|
@@ -928,7 +929,7 @@ static void grcan_free_dma_buffers(struct net_device *dev)
|
|
struct grcan_priv *priv = netdev_priv(dev);
|
|
struct grcan_dma *dma = &priv->dma;
|
|
|
|
- dma_free_coherent(&dev->dev, dma->base_size, dma->base_buf,
|
|
+ dma_free_coherent(priv->ofdev_dev, dma->base_size, dma->base_buf,
|
|
dma->base_handle);
|
|
memset(dma, 0, sizeof(*dma));
|
|
}
|
|
@@ -953,7 +954,7 @@ static int grcan_allocate_dma_buffers(struct net_device *dev,
|
|
|
|
/* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */
|
|
dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT;
|
|
- dma->base_buf = dma_alloc_coherent(&dev->dev,
|
|
+ dma->base_buf = dma_alloc_coherent(priv->ofdev_dev,
|
|
dma->base_size,
|
|
&dma->base_handle,
|
|
GFP_KERNEL);
|
|
@@ -1117,8 +1118,10 @@ static int grcan_close(struct net_device *dev)
|
|
|
|
priv->closing = true;
|
|
if (priv->need_txbug_workaround) {
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
del_timer_sync(&priv->hang_timer);
|
|
del_timer_sync(&priv->rr_timer);
|
|
+ spin_lock_irqsave(&priv->lock, flags);
|
|
}
|
|
netif_stop_queue(dev);
|
|
grcan_stop_hardware(dev);
|
|
@@ -1604,6 +1607,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
|
|
memcpy(&priv->config, &grcan_module_config,
|
|
sizeof(struct grcan_device_config));
|
|
priv->dev = dev;
|
|
+ priv->ofdev_dev = &ofdev->dev;
|
|
priv->regs = base;
|
|
priv->can.bittiming_const = &grcan_bittiming_const;
|
|
priv->can.do_set_bittiming = grcan_set_bittiming;
|
|
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
|
index 8d17d464c0677..398928642a97a 100644
|
|
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
|
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
|
@@ -14314,10 +14314,6 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp)
|
|
|
|
/* Stop Tx */
|
|
bnx2x_tx_disable(bp);
|
|
- /* Delete all NAPI objects */
|
|
- bnx2x_del_all_napi(bp);
|
|
- if (CNIC_LOADED(bp))
|
|
- bnx2x_del_all_napi_cnic(bp);
|
|
netdev_reset_tc(bp->dev);
|
|
|
|
del_timer_sync(&bp->timer);
|
|
@@ -14422,6 +14418,11 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct pci_dev *pdev)
|
|
bnx2x_drain_tx_queues(bp);
|
|
bnx2x_send_unload_req(bp, UNLOAD_RECOVERY);
|
|
bnx2x_netif_stop(bp, 1);
|
|
+ bnx2x_del_all_napi(bp);
|
|
+
|
|
+ if (CNIC_LOADED(bp))
|
|
+ bnx2x_del_all_napi_cnic(bp);
|
|
+
|
|
bnx2x_free_irq(bp);
|
|
|
|
/* Report UNLOAD_DONE to MCP */
|
|
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
|
|
index 264136dba6741..5eaee7a3ac177 100644
|
|
--- a/drivers/net/ethernet/smsc/smsc911x.c
|
|
+++ b/drivers/net/ethernet/smsc/smsc911x.c
|
|
@@ -2441,7 +2441,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev)
|
|
if (irq == -EPROBE_DEFER) {
|
|
retval = -EPROBE_DEFER;
|
|
goto out_0;
|
|
- } else if (irq <= 0) {
|
|
+ } else if (irq < 0) {
|
|
pr_warn("Could not allocate irq resource\n");
|
|
retval = -ENODEV;
|
|
goto out_0;
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
|
|
index 6ca428a702f16..6a9c954492f22 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
|
|
@@ -68,6 +68,10 @@
|
|
#define TSE_PCS_USE_SGMII_ENA BIT(0)
|
|
#define TSE_PCS_IF_USE_SGMII 0x03
|
|
|
|
+#define SGMII_ADAPTER_CTRL_REG 0x00
|
|
+#define SGMII_ADAPTER_DISABLE 0x0001
|
|
+#define SGMII_ADAPTER_ENABLE 0x0000
|
|
+
|
|
#define AUTONEGO_LINK_TIMER 20
|
|
|
|
static int tse_pcs_reset(void __iomem *base, struct tse_pcs *pcs)
|
|
@@ -211,8 +215,12 @@ void tse_pcs_fix_mac_speed(struct tse_pcs *pcs, struct phy_device *phy_dev,
|
|
unsigned int speed)
|
|
{
|
|
void __iomem *tse_pcs_base = pcs->tse_pcs_base;
|
|
+ void __iomem *sgmii_adapter_base = pcs->sgmii_adapter_base;
|
|
u32 val;
|
|
|
|
+ writew(SGMII_ADAPTER_ENABLE,
|
|
+ sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
|
|
+
|
|
pcs->autoneg = phy_dev->autoneg;
|
|
|
|
if (phy_dev->autoneg == AUTONEG_ENABLE) {
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
|
|
index 254199f2efdbf..2f5882450b06a 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
|
|
@@ -21,10 +21,6 @@
|
|
#include <linux/phy.h>
|
|
#include <linux/timer.h>
|
|
|
|
-#define SGMII_ADAPTER_CTRL_REG 0x00
|
|
-#define SGMII_ADAPTER_ENABLE 0x0000
|
|
-#define SGMII_ADAPTER_DISABLE 0x0001
|
|
-
|
|
struct tse_pcs {
|
|
struct device *dev;
|
|
void __iomem *tse_pcs_base;
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
|
|
index b138968b8672a..c3a78c1134240 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
|
|
@@ -29,6 +29,9 @@
|
|
|
|
#include "altr_tse_pcs.h"
|
|
|
|
+#define SGMII_ADAPTER_CTRL_REG 0x00
|
|
+#define SGMII_ADAPTER_DISABLE 0x0001
|
|
+
|
|
#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0
|
|
#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1
|
|
#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII 0x2
|
|
@@ -62,14 +65,16 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed)
|
|
{
|
|
struct socfpga_dwmac *dwmac = (struct socfpga_dwmac *)priv;
|
|
void __iomem *splitter_base = dwmac->splitter_base;
|
|
+ void __iomem *tse_pcs_base = dwmac->pcs.tse_pcs_base;
|
|
void __iomem *sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base;
|
|
struct device *dev = dwmac->dev;
|
|
struct net_device *ndev = dev_get_drvdata(dev);
|
|
struct phy_device *phy_dev = ndev->phydev;
|
|
u32 val;
|
|
|
|
- writew(SGMII_ADAPTER_DISABLE,
|
|
- sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
|
|
+ if ((tse_pcs_base) && (sgmii_adapter_base))
|
|
+ writew(SGMII_ADAPTER_DISABLE,
|
|
+ sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
|
|
|
|
if (splitter_base) {
|
|
val = readl(splitter_base + EMAC_SPLITTER_CTRL_REG);
|
|
@@ -91,9 +96,7 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed)
|
|
writel(val, splitter_base + EMAC_SPLITTER_CTRL_REG);
|
|
}
|
|
|
|
- writew(SGMII_ADAPTER_ENABLE,
|
|
- sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
|
|
- if (phy_dev)
|
|
+ if (tse_pcs_base && sgmii_adapter_base)
|
|
tse_pcs_fix_mac_speed(&dwmac->pcs, phy_dev, speed);
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
|
|
index 1f9a6ea356b02..cdcc860607492 100644
|
|
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
|
|
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
|
|
@@ -817,10 +817,10 @@ static int xemaclite_mdio_write(struct mii_bus *bus, int phy_id, int reg,
|
|
static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
|
|
{
|
|
struct mii_bus *bus;
|
|
- int rc;
|
|
struct resource res;
|
|
struct device_node *np = of_get_parent(lp->phy_node);
|
|
struct device_node *npp;
|
|
+ int rc, ret;
|
|
|
|
/* Don't register the MDIO bus if the phy_node or its parent node
|
|
* can't be found.
|
|
@@ -830,8 +830,14 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
|
|
return -ENODEV;
|
|
}
|
|
npp = of_get_parent(np);
|
|
-
|
|
- of_address_to_resource(npp, 0, &res);
|
|
+ ret = of_address_to_resource(npp, 0, &res);
|
|
+ of_node_put(npp);
|
|
+ if (ret) {
|
|
+ dev_err(dev, "%s resource error!\n",
|
|
+ dev->of_node->full_name);
|
|
+ of_node_put(np);
|
|
+ return ret;
|
|
+ }
|
|
if (lp->ndev->mem_start != res.start) {
|
|
struct phy_device *phydev;
|
|
phydev = of_phy_find_device(lp->phy_node);
|
|
@@ -840,6 +846,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
|
|
"MDIO of the phy is not registered yet\n");
|
|
else
|
|
put_device(&phydev->mdio.dev);
|
|
+ of_node_put(np);
|
|
return 0;
|
|
}
|
|
|
|
@@ -852,6 +859,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
|
|
bus = mdiobus_alloc();
|
|
if (!bus) {
|
|
dev_err(dev, "Failed to allocate mdiobus\n");
|
|
+ of_node_put(np);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -866,6 +874,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
|
|
lp->mii_bus = bus;
|
|
|
|
rc = of_mdiobus_register(bus, np);
|
|
+ of_node_put(np);
|
|
if (rc) {
|
|
dev_err(dev, "Failed to register mdio bus.\n");
|
|
goto err_register;
|
|
diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c
|
|
index 6f3519123eb66..0e1a422d9567e 100644
|
|
--- a/drivers/net/hippi/rrunner.c
|
|
+++ b/drivers/net/hippi/rrunner.c
|
|
@@ -1354,7 +1354,9 @@ static int rr_close(struct net_device *dev)
|
|
|
|
rrpriv->fw_running = 0;
|
|
|
|
+ spin_unlock_irqrestore(&rrpriv->lock, flags);
|
|
del_timer_sync(&rrpriv->timer);
|
|
+ spin_lock_irqsave(&rrpriv->lock, flags);
|
|
|
|
writel(0, ®s->TxPi);
|
|
writel(0, ®s->IpRxPi);
|
|
diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c
|
|
index a446590a71caf..cd44c1d27b12f 100644
|
|
--- a/drivers/nfc/nfcmrvl/main.c
|
|
+++ b/drivers/nfc/nfcmrvl/main.c
|
|
@@ -194,6 +194,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
|
|
{
|
|
struct nci_dev *ndev = priv->ndev;
|
|
|
|
+ nci_unregister_device(ndev);
|
|
if (priv->ndev->nfc_dev->fw_download_in_progress)
|
|
nfcmrvl_fw_dnld_abort(priv);
|
|
|
|
@@ -202,7 +203,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
|
|
if (priv->config.reset_n_io)
|
|
gpio_free(priv->config.reset_n_io);
|
|
|
|
- nci_unregister_device(ndev);
|
|
nci_free_device(ndev);
|
|
kfree(priv);
|
|
}
|
|
diff --git a/drivers/phy/phy-exynos5250-sata.c b/drivers/phy/phy-exynos5250-sata.c
|
|
index 60e13afcd9b84..2c39d2fd3cd80 100644
|
|
--- a/drivers/phy/phy-exynos5250-sata.c
|
|
+++ b/drivers/phy/phy-exynos5250-sata.c
|
|
@@ -193,6 +193,7 @@ static int exynos_sata_phy_probe(struct platform_device *pdev)
|
|
return -EINVAL;
|
|
|
|
sata_phy->client = of_find_i2c_device_by_node(node);
|
|
+ of_node_put(node);
|
|
if (!sata_phy->client)
|
|
return -EPROBE_DEFER;
|
|
|
|
@@ -201,20 +202,21 @@ static int exynos_sata_phy_probe(struct platform_device *pdev)
|
|
sata_phy->phyclk = devm_clk_get(dev, "sata_phyctrl");
|
|
if (IS_ERR(sata_phy->phyclk)) {
|
|
dev_err(dev, "failed to get clk for PHY\n");
|
|
- return PTR_ERR(sata_phy->phyclk);
|
|
+ ret = PTR_ERR(sata_phy->phyclk);
|
|
+ goto put_dev;
|
|
}
|
|
|
|
ret = clk_prepare_enable(sata_phy->phyclk);
|
|
if (ret < 0) {
|
|
dev_err(dev, "failed to enable source clk\n");
|
|
- return ret;
|
|
+ goto put_dev;
|
|
}
|
|
|
|
sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops);
|
|
if (IS_ERR(sata_phy->phy)) {
|
|
- clk_disable_unprepare(sata_phy->phyclk);
|
|
dev_err(dev, "failed to create PHY\n");
|
|
- return PTR_ERR(sata_phy->phy);
|
|
+ ret = PTR_ERR(sata_phy->phy);
|
|
+ goto clk_disable;
|
|
}
|
|
|
|
phy_set_drvdata(sata_phy->phy, sata_phy);
|
|
@@ -222,11 +224,18 @@ static int exynos_sata_phy_probe(struct platform_device *pdev)
|
|
phy_provider = devm_of_phy_provider_register(dev,
|
|
of_phy_simple_xlate);
|
|
if (IS_ERR(phy_provider)) {
|
|
- clk_disable_unprepare(sata_phy->phyclk);
|
|
- return PTR_ERR(phy_provider);
|
|
+ ret = PTR_ERR(phy_provider);
|
|
+ goto clk_disable;
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+clk_disable:
|
|
+ clk_disable_unprepare(sata_phy->phyclk);
|
|
+put_dev:
|
|
+ put_device(&sata_phy->client->dev);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static const struct of_device_id exynos_sata_phy_of_match[] = {
|
|
diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c
|
|
index b2b7e238bda97..fc8c57527fb78 100644
|
|
--- a/drivers/pinctrl/pinctrl-pistachio.c
|
|
+++ b/drivers/pinctrl/pinctrl-pistachio.c
|
|
@@ -1374,10 +1374,10 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl)
|
|
}
|
|
|
|
irq = irq_of_parse_and_map(child, 0);
|
|
- if (irq < 0) {
|
|
- dev_err(pctl->dev, "No IRQ for bank %u: %d\n", i, irq);
|
|
+ if (!irq) {
|
|
+ dev_err(pctl->dev, "No IRQ for bank %u\n", i);
|
|
of_node_put(child);
|
|
- ret = irq;
|
|
+ ret = -EINVAL;
|
|
goto err;
|
|
}
|
|
|
|
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
|
|
index 2311f8a635a6f..3badb10229ef5 100644
|
|
--- a/drivers/tty/n_gsm.c
|
|
+++ b/drivers/tty/n_gsm.c
|
|
@@ -84,6 +84,8 @@ module_param(debug, int, 0600);
|
|
*/
|
|
#define MAX_MRU 1500
|
|
#define MAX_MTU 1500
|
|
+/* SOF, ADDR, CTRL, LEN1, LEN2, ..., FCS, EOF */
|
|
+#define PROT_OVERHEAD 7
|
|
#define GSM_NET_TX_TIMEOUT (HZ*10)
|
|
|
|
/**
|
|
@@ -839,7 +841,7 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
|
|
break;
|
|
case 2: /* Unstructed with modem bits.
|
|
Always one byte as we never send inline break data */
|
|
- *dp++ = gsm_encode_modem(dlci);
|
|
+ *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
|
|
break;
|
|
}
|
|
WARN_ON(kfifo_out_locked(dlci->fifo, dp , len, &dlci->lock) != len);
|
|
@@ -1316,11 +1318,12 @@ static void gsm_control_response(struct gsm_mux *gsm, unsigned int command,
|
|
|
|
static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control *ctrl)
|
|
{
|
|
- struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 1, gsm->ftype);
|
|
+ struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 2, gsm->ftype);
|
|
if (msg == NULL)
|
|
return;
|
|
- msg->data[0] = (ctrl->cmd << 1) | 2 | EA; /* command */
|
|
- memcpy(msg->data + 1, ctrl->data, ctrl->len);
|
|
+ msg->data[0] = (ctrl->cmd << 1) | CR | EA; /* command */
|
|
+ msg->data[1] = (ctrl->len << 1) | EA;
|
|
+ memcpy(msg->data + 2, ctrl->data, ctrl->len);
|
|
gsm_data_queue(gsm->dlci[0], msg);
|
|
}
|
|
|
|
@@ -1343,7 +1346,6 @@ static void gsm_control_retransmit(unsigned long data)
|
|
spin_lock_irqsave(&gsm->control_lock, flags);
|
|
ctrl = gsm->pending_cmd;
|
|
if (ctrl) {
|
|
- gsm->cretries--;
|
|
if (gsm->cretries == 0) {
|
|
gsm->pending_cmd = NULL;
|
|
ctrl->error = -ETIMEDOUT;
|
|
@@ -1352,6 +1354,7 @@ static void gsm_control_retransmit(unsigned long data)
|
|
wake_up(&gsm->event);
|
|
return;
|
|
}
|
|
+ gsm->cretries--;
|
|
gsm_control_transmit(gsm, ctrl);
|
|
mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
|
|
}
|
|
@@ -1392,7 +1395,7 @@ retry:
|
|
|
|
/* If DLCI0 is in ADM mode skip retries, it won't respond */
|
|
if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
|
|
- gsm->cretries = 1;
|
|
+ gsm->cretries = 0;
|
|
else
|
|
gsm->cretries = gsm->n2;
|
|
|
|
@@ -1826,7 +1829,6 @@ static void gsm_queue(struct gsm_mux *gsm)
|
|
gsm_response(gsm, address, UA);
|
|
gsm_dlci_close(dlci);
|
|
break;
|
|
- case UA:
|
|
case UA|PF:
|
|
if (cr == 0 || dlci == NULL)
|
|
break;
|
|
@@ -1977,7 +1979,8 @@ static void gsm1_receive(struct gsm_mux *gsm, unsigned char c)
|
|
}
|
|
/* Any partial frame was a runt so go back to start */
|
|
if (gsm->state != GSM_START) {
|
|
- gsm->malformed++;
|
|
+ if (gsm->state != GSM_SEARCH)
|
|
+ gsm->malformed++;
|
|
gsm->state = GSM_START;
|
|
}
|
|
/* A SOF in GSM_START means we are still reading idling or
|
|
@@ -2098,6 +2101,7 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm)
|
|
gsm_dlci_release(gsm->dlci[i]);
|
|
mutex_unlock(&gsm->mutex);
|
|
/* Now wipe the queues */
|
|
+ tty_ldisc_flush(gsm->tty);
|
|
list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
|
|
kfree(txq);
|
|
INIT_LIST_HEAD(&gsm->tx_list);
|
|
@@ -2198,7 +2202,7 @@ static struct gsm_mux *gsm_alloc_mux(void)
|
|
kfree(gsm);
|
|
return NULL;
|
|
}
|
|
- gsm->txframe = kmalloc(2 * MAX_MRU + 2, GFP_KERNEL);
|
|
+ gsm->txframe = kmalloc(2 * (MAX_MTU + PROT_OVERHEAD - 1), GFP_KERNEL);
|
|
if (gsm->txframe == NULL) {
|
|
kfree(gsm->buf);
|
|
kfree(gsm);
|
|
@@ -2515,7 +2519,7 @@ static int gsmld_config(struct tty_struct *tty, struct gsm_mux *gsm,
|
|
/* Check the MRU/MTU range looks sane */
|
|
if (c->mru > MAX_MRU || c->mtu > MAX_MTU || c->mru < 8 || c->mtu < 8)
|
|
return -EINVAL;
|
|
- if (c->n2 < 3)
|
|
+ if (c->n2 > 255)
|
|
return -EINVAL;
|
|
if (c->encapsulation > 1) /* Basic, advanced, no I */
|
|
return -EINVAL;
|
|
@@ -2860,19 +2864,17 @@ static struct tty_ldisc_ops tty_ldisc_packet = {
|
|
|
|
static int gsmtty_modem_update(struct gsm_dlci *dlci, u8 brk)
|
|
{
|
|
- u8 modembits[5];
|
|
+ u8 modembits[3];
|
|
struct gsm_control *ctrl;
|
|
int len = 2;
|
|
|
|
- if (brk)
|
|
+ modembits[0] = (dlci->addr << 2) | 2 | EA; /* DLCI, Valid, EA */
|
|
+ modembits[1] = (gsm_encode_modem(dlci) << 1) | EA;
|
|
+ if (brk) {
|
|
+ modembits[2] = (brk << 4) | 2 | EA; /* Length, Break, EA */
|
|
len++;
|
|
-
|
|
- modembits[0] = len << 1 | EA; /* Data bytes */
|
|
- modembits[1] = dlci->addr << 2 | 3; /* DLCI, EA, 1 */
|
|
- modembits[2] = gsm_encode_modem(dlci) << 1 | EA;
|
|
- if (brk)
|
|
- modembits[3] = brk << 4 | 2 | EA; /* Valid, EA */
|
|
- ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len + 1);
|
|
+ }
|
|
+ ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len);
|
|
if (ctrl == NULL)
|
|
return -ENOMEM;
|
|
return gsm_control_wait(dlci->gsm, ctrl);
|
|
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
|
|
index 3973bbd5ee553..a54dc0375ac68 100644
|
|
--- a/drivers/tty/serial/8250/8250_pci.c
|
|
+++ b/drivers/tty/serial/8250/8250_pci.c
|
|
@@ -2915,7 +2915,7 @@ enum pci_board_num_t {
|
|
pbn_panacom2,
|
|
pbn_panacom4,
|
|
pbn_plx_romulus,
|
|
- pbn_endrun_2_4000000,
|
|
+ pbn_endrun_2_3906250,
|
|
pbn_oxsemi,
|
|
pbn_oxsemi_1_4000000,
|
|
pbn_oxsemi_2_4000000,
|
|
@@ -3479,10 +3479,10 @@ static struct pciserial_board pci_boards[] = {
|
|
* signal now many ports are available
|
|
* 2 port 952 Uart support
|
|
*/
|
|
- [pbn_endrun_2_4000000] = {
|
|
+ [pbn_endrun_2_3906250] = {
|
|
.flags = FL_BASE0,
|
|
.num_ports = 2,
|
|
- .base_baud = 4000000,
|
|
+ .base_baud = 3906250,
|
|
.uart_offset = 0x200,
|
|
.first_offset = 0x1000,
|
|
},
|
|
@@ -4430,7 +4430,7 @@ static struct pci_device_id serial_pci_tbl[] = {
|
|
*/
|
|
{ PCI_VENDOR_ID_ENDRUN, PCI_DEVICE_ID_ENDRUN_1588,
|
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
|
- pbn_endrun_2_4000000 },
|
|
+ pbn_endrun_2_3906250 },
|
|
/*
|
|
* Quatech cards. These actually have configurable clocks but for
|
|
* now we just use the default.
|
|
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
|
|
index 460c35b2b54d9..2d83f1dfb4d69 100644
|
|
--- a/drivers/tty/serial/8250/8250_port.c
|
|
+++ b/drivers/tty/serial/8250/8250_port.c
|
|
@@ -3150,7 +3150,7 @@ static void serial8250_console_restore(struct uart_8250_port *up)
|
|
|
|
serial8250_set_divisor(port, baud, quot, frac);
|
|
serial_port_out(port, UART_LCR, up->lcr);
|
|
- serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS);
|
|
+ serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
|
|
}
|
|
|
|
/*
|
|
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
|
index 2ca6ed207e26e..bba74e9b7da0f 100644
|
|
--- a/drivers/usb/core/quirks.c
|
|
+++ b/drivers/usb/core/quirks.c
|
|
@@ -243,6 +243,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
|
|
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
|
|
|
+ /* Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)*/
|
|
+ { USB_DEVICE(0x0bda, 0x0151), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
|
|
+
|
|
/* Realtek hub in Dell WD19 (Type-C) */
|
|
{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
|
|
{ USB_DEVICE(0x0bda, 0x5487), .driver_info = USB_QUIRK_RESET_RESUME },
|
|
@@ -325,6 +328,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|
/* DJI CineSSD */
|
|
{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
|
|
|
|
+ /* VCOM device */
|
|
+ { USB_DEVICE(0x4296, 0x7570), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
|
|
+
|
|
/* INTEL VALUE SSD */
|
|
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
|
|
|
|
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
|
|
index fe1b54a8fb0c8..4653eeb10e0e4 100644
|
|
--- a/drivers/usb/gadget/configfs.c
|
|
+++ b/drivers/usb/gadget/configfs.c
|
|
@@ -1409,6 +1409,8 @@ static void configfs_composite_unbind(struct usb_gadget *gadget)
|
|
usb_ep_autoconfig_reset(cdev->gadget);
|
|
spin_lock_irqsave(&gi->spinlock, flags);
|
|
cdev->gadget = NULL;
|
|
+ cdev->deactivations = 0;
|
|
+ gadget->deactivated = false;
|
|
set_gadget_data(gadget, NULL);
|
|
spin_unlock_irqrestore(&gi->spinlock, flags);
|
|
}
|
|
diff --git a/drivers/usb/gadget/function/uvc_queue.c b/drivers/usb/gadget/function/uvc_queue.c
|
|
index 6377e9fee6e59..dadf6e5073801 100644
|
|
--- a/drivers/usb/gadget/function/uvc_queue.c
|
|
+++ b/drivers/usb/gadget/function/uvc_queue.c
|
|
@@ -246,6 +246,8 @@ void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
|
|
buf->state = UVC_BUF_STATE_ERROR;
|
|
vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR);
|
|
}
|
|
+ queue->buf_used = 0;
|
|
+
|
|
/* This must be protected by the irqlock spinlock to avoid race
|
|
* conditions between uvc_queue_buffer and the disconnection event that
|
|
* could result in an interruptible wait in uvc_dequeue_buffer. Do not
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index a08369cb3462f..ebf09503be394 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -746,6 +746,17 @@ void xhci_shutdown(struct usb_hcd *hcd)
|
|
if (xhci->quirks & XHCI_SPURIOUS_REBOOT)
|
|
usb_disable_xhci_ports(to_pci_dev(hcd->self.controller));
|
|
|
|
+ /* Don't poll the roothubs after shutdown. */
|
|
+ xhci_dbg(xhci, "%s: stopping usb%d port polling.\n",
|
|
+ __func__, hcd->self.busnum);
|
|
+ clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
|
+ del_timer_sync(&hcd->rh_timer);
|
|
+
|
|
+ if (xhci->shared_hcd) {
|
|
+ clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
|
|
+ del_timer_sync(&xhci->shared_hcd->rh_timer);
|
|
+ }
|
|
+
|
|
spin_lock_irq(&xhci->lock);
|
|
xhci_halt(xhci);
|
|
/* Workaround for spurious wakeups at shutdown with HSW */
|
|
diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
|
|
index 0ec6d76d1563b..08517d475d463 100644
|
|
--- a/drivers/usb/misc/uss720.c
|
|
+++ b/drivers/usb/misc/uss720.c
|
|
@@ -87,6 +87,7 @@ static void destroy_priv(struct kref *kref)
|
|
|
|
dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n");
|
|
usb_put_dev(priv->usbdev);
|
|
+ priv->usbdev = NULL;
|
|
kfree(priv);
|
|
}
|
|
|
|
@@ -750,7 +751,6 @@ static int uss720_probe(struct usb_interface *intf,
|
|
parport_announce_port(pp);
|
|
|
|
usb_set_intfdata(intf, pp);
|
|
- usb_put_dev(usbdev);
|
|
return 0;
|
|
|
|
probe_abort:
|
|
@@ -770,7 +770,6 @@ static void uss720_disconnect(struct usb_interface *intf)
|
|
if (pp) {
|
|
priv = pp->private_data;
|
|
usbdev = priv->usbdev;
|
|
- priv->usbdev = NULL;
|
|
priv->pp = NULL;
|
|
dev_dbg(&intf->dev, "parport_remove_port\n");
|
|
parport_remove_port(pp);
|
|
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
|
index ddee42e44a33b..b0c98c61c53af 100644
|
|
--- a/drivers/usb/serial/cp210x.c
|
|
+++ b/drivers/usb/serial/cp210x.c
|
|
@@ -192,6 +192,8 @@ static const struct usb_device_id id_table[] = {
|
|
{ USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */
|
|
{ USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
|
|
{ USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */
|
|
+ { USB_DEVICE(0x17A8, 0x0101) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter Reader (Int Ant) */
|
|
+ { USB_DEVICE(0x17A8, 0x0102) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter Reader (Ext Ant) */
|
|
{ USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
|
|
{ USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
|
|
{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index c5d0d9e2bff2d..3fcf53e85adbb 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -430,6 +430,8 @@ static void option_instat_callback(struct urb *urb);
|
|
#define CINTERION_PRODUCT_CLS8 0x00b0
|
|
#define CINTERION_PRODUCT_MV31_MBIM 0x00b3
|
|
#define CINTERION_PRODUCT_MV31_RMNET 0x00b7
|
|
+#define CINTERION_PRODUCT_MV32_WA 0x00f1
|
|
+#define CINTERION_PRODUCT_MV32_WB 0x00f2
|
|
|
|
/* Olivetti products */
|
|
#define OLIVETTI_VENDOR_ID 0x0b3c
|
|
@@ -1193,6 +1195,10 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = NCTRL(0) | RSVD(1) },
|
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */
|
|
.driver_info = NCTRL(2) | RSVD(3) },
|
|
+ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1057, 0xff), /* Telit FN980 */
|
|
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
|
|
+ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1058, 0xff), /* Telit FN980 (PCIe) */
|
|
+ .driver_info = NCTRL(0) | RSVD(1) },
|
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */
|
|
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
|
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */
|
|
@@ -1209,6 +1215,8 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = NCTRL(2) | RSVD(3) },
|
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */
|
|
.driver_info = NCTRL(0) | RSVD(1) },
|
|
+ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1075, 0xff), /* Telit FN990 (PCIe) */
|
|
+ .driver_info = RSVD(0) },
|
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
|
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
|
@@ -1945,6 +1953,10 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = RSVD(3)},
|
|
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_RMNET, 0xff),
|
|
.driver_info = RSVD(0)},
|
|
+ { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV32_WA, 0xff),
|
|
+ .driver_info = RSVD(3)},
|
|
+ { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV32_WB, 0xff),
|
|
+ .driver_info = RSVD(3)},
|
|
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100),
|
|
.driver_info = RSVD(4) },
|
|
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120),
|
|
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
|
|
index 345211f1a4915..1dd65019eea14 100644
|
|
--- a/drivers/usb/serial/whiteheat.c
|
|
+++ b/drivers/usb/serial/whiteheat.c
|
|
@@ -644,9 +644,8 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command,
|
|
switch (command) {
|
|
case WHITEHEAT_GET_DTR_RTS:
|
|
info = usb_get_serial_port_data(port);
|
|
- memcpy(&info->mcr, command_info->result_buffer,
|
|
- sizeof(struct whiteheat_dr_info));
|
|
- break;
|
|
+ info->mcr = command_info->result_buffer[0];
|
|
+ break;
|
|
}
|
|
}
|
|
exit:
|
|
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
|
|
index cc91b0c564a38..312c050d0dbde 100644
|
|
--- a/fs/btrfs/tree-log.c
|
|
+++ b/fs/btrfs/tree-log.c
|
|
@@ -4696,6 +4696,18 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
|
|
mutex_lock(&BTRFS_I(inode)->log_mutex);
|
|
}
|
|
|
|
+ /*
|
|
+ * For symlinks, we must always log their content, which is stored in an
|
|
+ * inline extent, otherwise we could end up with an empty symlink after
|
|
+ * log replay, which is invalid on linux (symlink(2) returns -ENOENT if
|
|
+ * one attempts to create an empty symlink).
|
|
+ * We don't need to worry about flushing delalloc, because when we create
|
|
+ * the inline extent when the symlink is created (we never have delalloc
|
|
+ * for symlinks).
|
|
+ */
|
|
+ if (S_ISLNK(inode->i_mode))
|
|
+ inode_only = LOG_INODE_ALL;
|
|
+
|
|
/*
|
|
* a brute force approach to making sure we get the most uptodate
|
|
* copies of everything.
|
|
@@ -5271,7 +5283,7 @@ process_leaf:
|
|
}
|
|
|
|
ctx->log_new_dentries = false;
|
|
- if (type == BTRFS_FT_DIR || type == BTRFS_FT_SYMLINK)
|
|
+ if (type == BTRFS_FT_DIR)
|
|
log_mode = LOG_INODE_ALL;
|
|
ret = btrfs_log_inode(trans, root, di_inode,
|
|
log_mode, 0, LLONG_MAX, ctx);
|
|
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
|
|
index d83fc669eeac7..e779833096347 100644
|
|
--- a/include/linux/kernel.h
|
|
+++ b/include/linux/kernel.h
|
|
@@ -530,7 +530,7 @@ static inline char *hex_byte_pack_upper(char *buf, u8 byte)
|
|
return buf;
|
|
}
|
|
|
|
-extern int hex_to_bin(char ch);
|
|
+extern int hex_to_bin(unsigned char ch);
|
|
extern int __must_check hex2bin(u8 *dst, const char *src, size_t count);
|
|
extern char *bin2hex(char *dst, const void *src, size_t count);
|
|
|
|
diff --git a/include/net/tcp.h b/include/net/tcp.h
|
|
index f26f075250b48..97df2f6fcbd79 100644
|
|
--- a/include/net/tcp.h
|
|
+++ b/include/net/tcp.h
|
|
@@ -579,6 +579,7 @@ void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req);
|
|
void tcp_reset(struct sock *sk);
|
|
void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb);
|
|
void tcp_fin(struct sock *sk);
|
|
+void tcp_check_space(struct sock *sk);
|
|
|
|
/* tcp_timer.c */
|
|
void tcp_init_xmit_timers(struct sock *);
|
|
diff --git a/lib/hexdump.c b/lib/hexdump.c
|
|
index 992457b1284c1..570b232757047 100644
|
|
--- a/lib/hexdump.c
|
|
+++ b/lib/hexdump.c
|
|
@@ -24,15 +24,33 @@ EXPORT_SYMBOL(hex_asc_upper);
|
|
*
|
|
* hex_to_bin() converts one hex digit to its actual value or -1 in case of bad
|
|
* input.
|
|
+ *
|
|
+ * This function is used to load cryptographic keys, so it is coded in such a
|
|
+ * way that there are no conditions or memory accesses that depend on data.
|
|
+ *
|
|
+ * Explanation of the logic:
|
|
+ * (ch - '9' - 1) is negative if ch <= '9'
|
|
+ * ('0' - 1 - ch) is negative if ch >= '0'
|
|
+ * we "and" these two values, so the result is negative if ch is in the range
|
|
+ * '0' ... '9'
|
|
+ * we are only interested in the sign, so we do a shift ">> 8"; note that right
|
|
+ * shift of a negative value is implementation-defined, so we cast the
|
|
+ * value to (unsigned) before the shift --- we have 0xffffff if ch is in
|
|
+ * the range '0' ... '9', 0 otherwise
|
|
+ * we "and" this value with (ch - '0' + 1) --- we have a value 1 ... 10 if ch is
|
|
+ * in the range '0' ... '9', 0 otherwise
|
|
+ * we add this value to -1 --- we have a value 0 ... 9 if ch is in the range '0'
|
|
+ * ... '9', -1 otherwise
|
|
+ * the next line is similar to the previous one, but we need to decode both
|
|
+ * uppercase and lowercase letters, so we use (ch & 0xdf), which converts
|
|
+ * lowercase to uppercase
|
|
*/
|
|
-int hex_to_bin(char ch)
|
|
+int hex_to_bin(unsigned char ch)
|
|
{
|
|
- if ((ch >= '0') && (ch <= '9'))
|
|
- return ch - '0';
|
|
- ch = tolower(ch);
|
|
- if ((ch >= 'a') && (ch <= 'f'))
|
|
- return ch - 'a' + 10;
|
|
- return -1;
|
|
+ unsigned char cu = ch & 0xdf;
|
|
+ return -1 +
|
|
+ ((ch - '0' + 1) & (unsigned)((ch - '9' - 1) & ('0' - 1 - ch)) >> 8) +
|
|
+ ((cu - 'A' + 11) & (unsigned)((cu - 'F' - 1) & ('A' - 1 - cu)) >> 8);
|
|
}
|
|
EXPORT_SYMBOL(hex_to_bin);
|
|
|
|
@@ -47,10 +65,13 @@ EXPORT_SYMBOL(hex_to_bin);
|
|
int hex2bin(u8 *dst, const char *src, size_t count)
|
|
{
|
|
while (count--) {
|
|
- int hi = hex_to_bin(*src++);
|
|
- int lo = hex_to_bin(*src++);
|
|
+ int hi, lo;
|
|
|
|
- if ((hi < 0) || (lo < 0))
|
|
+ hi = hex_to_bin(*src++);
|
|
+ if (unlikely(hi < 0))
|
|
+ return -1;
|
|
+ lo = hex_to_bin(*src++);
|
|
+ if (unlikely(lo < 0))
|
|
return -1;
|
|
|
|
*dst++ = (hi << 4) | lo;
|
|
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
|
|
index 381fc854ad199..75f961425639e 100644
|
|
--- a/net/ipv4/igmp.c
|
|
+++ b/net/ipv4/igmp.c
|
|
@@ -2360,9 +2360,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
|
|
newpsl->sl_addr[i] = psl->sl_addr[i];
|
|
/* decrease mem now to avoid the memleak warning */
|
|
atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
|
|
- kfree_rcu(psl, rcu);
|
|
}
|
|
rcu_assign_pointer(pmc->sflist, newpsl);
|
|
+ if (psl)
|
|
+ kfree_rcu(psl, rcu);
|
|
psl = newpsl;
|
|
}
|
|
rv = 1; /* > 0 for insert logic below if sl_count is 0 */
|
|
@@ -2460,11 +2461,13 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
|
|
psl->sl_count, psl->sl_addr, 0);
|
|
/* decrease mem now to avoid the memleak warning */
|
|
atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
|
|
- kfree_rcu(psl, rcu);
|
|
- } else
|
|
+ } else {
|
|
(void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
|
|
0, NULL, 0);
|
|
+ }
|
|
rcu_assign_pointer(pmc->sflist, newpsl);
|
|
+ if (psl)
|
|
+ kfree_rcu(psl, rcu);
|
|
pmc->sfmode = msf->imsf_fmode;
|
|
err = 0;
|
|
done:
|
|
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
|
|
index fe1801d9f0598..eec225c637f05 100644
|
|
--- a/net/ipv4/ip_gre.c
|
|
+++ b/net/ipv4/ip_gre.c
|
|
@@ -339,14 +339,12 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
__be16 proto)
|
|
{
|
|
struct ip_tunnel *tunnel = netdev_priv(dev);
|
|
-
|
|
- if (tunnel->parms.o_flags & TUNNEL_SEQ)
|
|
- tunnel->o_seqno++;
|
|
+ __be16 flags = tunnel->parms.o_flags;
|
|
|
|
/* Push GRE header. */
|
|
gre_build_header(skb, tunnel->tun_hlen,
|
|
- tunnel->parms.o_flags, proto, tunnel->parms.o_key,
|
|
- htonl(tunnel->o_seqno));
|
|
+ flags, proto, tunnel->parms.o_key,
|
|
+ (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0);
|
|
|
|
ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
|
|
}
|
|
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
|
|
index 01c73775ed007..7f48f85042843 100644
|
|
--- a/net/ipv4/tcp_input.c
|
|
+++ b/net/ipv4/tcp_input.c
|
|
@@ -5159,7 +5159,17 @@ static void tcp_new_space(struct sock *sk)
|
|
sk->sk_write_space(sk);
|
|
}
|
|
|
|
-static void tcp_check_space(struct sock *sk)
|
|
+/* Caller made space either from:
|
|
+ * 1) Freeing skbs in rtx queues (after tp->snd_una has advanced)
|
|
+ * 2) Sent skbs from output queue (and thus advancing tp->snd_nxt)
|
|
+ *
|
|
+ * We might be able to generate EPOLLOUT to the application if:
|
|
+ * 1) Space consumed in output/rtx queues is below sk->sk_sndbuf/2
|
|
+ * 2) notsent amount (tp->write_seq - tp->snd_nxt) became
|
|
+ * small enough that tcp_stream_memory_free() decides it
|
|
+ * is time to generate EPOLLOUT.
|
|
+ */
|
|
+void tcp_check_space(struct sock *sk)
|
|
{
|
|
if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) {
|
|
sock_reset_flag(sk, SOCK_QUEUE_SHRUNK);
|
|
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
|
|
index aafea53c7c068..95b0f486cb105 100644
|
|
--- a/net/ipv4/tcp_output.c
|
|
+++ b/net/ipv4/tcp_output.c
|
|
@@ -83,6 +83,7 @@ static void tcp_event_new_data_sent(struct sock *sk, const struct sk_buff *skb)
|
|
|
|
NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT,
|
|
tcp_skb_pcount(skb));
|
|
+ tcp_check_space(sk);
|
|
}
|
|
|
|
/* SND.NXT, if window was not shrunk.
|
|
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
|
|
index 6119ab33a56ea..30ca73c781253 100644
|
|
--- a/net/ipv6/addrconf.c
|
|
+++ b/net/ipv6/addrconf.c
|
|
@@ -3539,6 +3539,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
|
|
struct list_head del_list;
|
|
int _keep_addr;
|
|
bool keep_addr;
|
|
+ bool was_ready;
|
|
int state, i;
|
|
|
|
ASSERT_RTNL();
|
|
@@ -3602,7 +3603,10 @@ restart:
|
|
|
|
addrconf_del_rs_timer(idev);
|
|
|
|
- /* Step 2: clear flags for stateless addrconf */
|
|
+ /* Step 2: clear flags for stateless addrconf, repeated down
|
|
+ * detection
|
|
+ */
|
|
+ was_ready = idev->if_flags & IF_READY;
|
|
if (!how)
|
|
idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
|
|
|
|
@@ -3689,7 +3693,7 @@ restart:
|
|
if (how) {
|
|
ipv6_ac_destroy_dev(idev);
|
|
ipv6_mc_destroy_dev(idev);
|
|
- } else {
|
|
+ } else if (was_ready) {
|
|
ipv6_mc_down(idev);
|
|
}
|
|
|
|
diff --git a/net/nfc/core.c b/net/nfc/core.c
|
|
index 32a2dfc08f480..8c38a21fb0c69 100644
|
|
--- a/net/nfc/core.c
|
|
+++ b/net/nfc/core.c
|
|
@@ -50,7 +50,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -106,7 +106,7 @@ int nfc_dev_up(struct nfc_dev *dev)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -154,7 +154,7 @@ int nfc_dev_down(struct nfc_dev *dev)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -218,7 +218,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, u32 tm_protocols)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -257,7 +257,7 @@ int nfc_stop_poll(struct nfc_dev *dev)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -302,7 +302,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -346,7 +346,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -412,7 +412,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -458,7 +458,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx, u8 mode)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -505,7 +505,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb,
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
kfree_skb(skb);
|
|
goto error;
|
|
@@ -562,7 +562,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -611,7 +611,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx)
|
|
|
|
device_lock(&dev->dev);
|
|
|
|
- if (!device_is_registered(&dev->dev)) {
|
|
+ if (dev->shutting_down) {
|
|
rc = -ENODEV;
|
|
goto error;
|
|
}
|
|
@@ -1142,6 +1142,7 @@ int nfc_register_device(struct nfc_dev *dev)
|
|
dev->rfkill = NULL;
|
|
}
|
|
}
|
|
+ dev->shutting_down = false;
|
|
device_unlock(&dev->dev);
|
|
|
|
rc = nfc_genl_device_added(dev);
|
|
@@ -1174,12 +1175,10 @@ void nfc_unregister_device(struct nfc_dev *dev)
|
|
rfkill_unregister(dev->rfkill);
|
|
rfkill_destroy(dev->rfkill);
|
|
}
|
|
+ dev->shutting_down = true;
|
|
device_unlock(&dev->dev);
|
|
|
|
if (dev->ops->check_presence) {
|
|
- device_lock(&dev->dev);
|
|
- dev->shutting_down = true;
|
|
- device_unlock(&dev->dev);
|
|
del_timer_sync(&dev->check_pres_timer);
|
|
cancel_work_sync(&dev->check_pres_work);
|
|
}
|
|
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
|
|
index 6e771022d43e1..9750997643bba 100644
|
|
--- a/net/nfc/netlink.c
|
|
+++ b/net/nfc/netlink.c
|
|
@@ -1254,7 +1254,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
|
|
struct sk_buff *msg;
|
|
void *hdr;
|
|
|
|
- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
|
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
|
|
if (!msg)
|
|
return -ENOMEM;
|
|
|
|
@@ -1270,7 +1270,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
|
|
|
|
genlmsg_end(msg, hdr);
|
|
|
|
- genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
|
|
+ genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
|
|
|
|
return 0;
|
|
|
|
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
|
|
index c1a4b5d30814a..330a2c9d19074 100644
|
|
--- a/net/sched/cls_api.c
|
|
+++ b/net/sched/cls_api.c
|
|
@@ -268,10 +268,13 @@ replay:
|
|
err = -ENOENT;
|
|
tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]);
|
|
if (tp_ops == NULL) {
|
|
-#ifdef CONFIG_MODULES
|
|
struct nlattr *kind = tca[TCA_KIND];
|
|
char name[IFNAMSIZ];
|
|
|
|
+ if (cl)
|
|
+ cops->put(q, cl);
|
|
+ cl = 0;
|
|
+#ifdef CONFIG_MODULES
|
|
if (kind != NULL &&
|
|
nla_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) {
|
|
rtnl_unlock();
|
|
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
|
|
index bf20ea2606389..4e2c49cb692c8 100644
|
|
--- a/net/sunrpc/xprtsock.c
|
|
+++ b/net/sunrpc/xprtsock.c
|
|
@@ -2882,9 +2882,6 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
|
|
}
|
|
xprt_set_bound(xprt);
|
|
xs_format_peer_addresses(xprt, "local", RPCBIND_NETID_LOCAL);
|
|
- ret = ERR_PTR(xs_local_setup_socket(transport));
|
|
- if (ret)
|
|
- goto out_err;
|
|
break;
|
|
default:
|
|
ret = ERR_PTR(-EAFNOSUPPORT);
|
|
diff --git a/sound/firewire/fireworks/fireworks_hwdep.c b/sound/firewire/fireworks/fireworks_hwdep.c
|
|
index 2e1d9a23920c0..09ba61f60699b 100644
|
|
--- a/sound/firewire/fireworks/fireworks_hwdep.c
|
|
+++ b/sound/firewire/fireworks/fireworks_hwdep.c
|
|
@@ -35,6 +35,7 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained,
|
|
type = SNDRV_FIREWIRE_EVENT_EFW_RESPONSE;
|
|
if (copy_to_user(buf, &type, sizeof(type)))
|
|
return -EFAULT;
|
|
+ count += sizeof(type);
|
|
remained -= sizeof(type);
|
|
buf += sizeof(type);
|
|
|
|
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
|
|
index 4f9a1eb281204..abe5e77ba171b 100644
|
|
--- a/sound/soc/codecs/wm8731.c
|
|
+++ b/sound/soc/codecs/wm8731.c
|
|
@@ -604,7 +604,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
|
|
ret = wm8731_reset(wm8731->regmap);
|
|
if (ret < 0) {
|
|
dev_err(dev, "Failed to issue reset: %d\n", ret);
|
|
- goto err_regulator_enable;
|
|
+ goto err;
|
|
}
|
|
|
|
/* Clear POWEROFF, keep everything else disabled */
|
|
@@ -621,10 +621,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
|
|
|
|
regcache_mark_dirty(wm8731->regmap);
|
|
|
|
-err_regulator_enable:
|
|
- /* Regulators will be enabled by bias management */
|
|
- regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
|
|
-
|
|
+err:
|
|
return ret;
|
|
}
|
|
|
|
@@ -768,21 +765,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
|
|
ret = PTR_ERR(wm8731->regmap);
|
|
dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
|
|
ret);
|
|
- return ret;
|
|
+ goto err_regulator_enable;
|
|
}
|
|
|
|
ret = wm8731_hw_init(&i2c->dev, wm8731);
|
|
if (ret != 0)
|
|
- return ret;
|
|
+ goto err_regulator_enable;
|
|
|
|
ret = snd_soc_register_codec(&i2c->dev,
|
|
&soc_codec_dev_wm8731, &wm8731_dai, 1);
|
|
if (ret != 0) {
|
|
dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
|
|
- return ret;
|
|
+ goto err_regulator_enable;
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+err_regulator_enable:
|
|
+ /* Regulators will be enabled by bias management */
|
|
+ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int wm8731_i2c_remove(struct i2c_client *client)
|
|
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c
|
|
index 6b864c0fc2b67..fa803cef23245 100644
|
|
--- a/sound/soc/codecs/wm8958-dsp2.c
|
|
+++ b/sound/soc/codecs/wm8958-dsp2.c
|
|
@@ -533,7 +533,7 @@ static int wm8958_mbc_put(struct snd_kcontrol *kcontrol,
|
|
|
|
wm8958_dsp_apply(codec, mbc, wm8994->mbc_ena[mbc]);
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
#define WM8958_MBC_SWITCH(xname, xval) {\
|
|
@@ -659,7 +659,7 @@ static int wm8958_vss_put(struct snd_kcontrol *kcontrol,
|
|
|
|
wm8958_dsp_apply(codec, vss, wm8994->vss_ena[vss]);
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
|
|
@@ -733,7 +733,7 @@ static int wm8958_hpf_put(struct snd_kcontrol *kcontrol,
|
|
|
|
wm8958_dsp_apply(codec, hpf % 3, ucontrol->value.integer.value[0]);
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
#define WM8958_HPF_SWITCH(xname, xval) {\
|
|
@@ -827,7 +827,7 @@ static int wm8958_enh_eq_put(struct snd_kcontrol *kcontrol,
|
|
|
|
wm8958_dsp_apply(codec, eq, ucontrol->value.integer.value[0]);
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
#define WM8958_ENH_EQ_SWITCH(xname, xval) {\
|
|
diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c
|
|
index 61f0c9d6f6dce..67d22b4baeb05 100644
|
|
--- a/sound/soc/soc-generic-dmaengine-pcm.c
|
|
+++ b/sound/soc/soc-generic-dmaengine-pcm.c
|
|
@@ -98,10 +98,10 @@ static int dmaengine_pcm_hw_params(struct snd_pcm_substream *substream,
|
|
|
|
memset(&slave_config, 0, sizeof(slave_config));
|
|
|
|
- if (pcm->config && pcm->config->prepare_slave_config)
|
|
- prepare_slave_config = pcm->config->prepare_slave_config;
|
|
- else
|
|
+ if (!pcm->config)
|
|
prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
|
|
+ else
|
|
+ prepare_slave_config = pcm->config->prepare_slave_config;
|
|
|
|
if (prepare_slave_config) {
|
|
ret = prepare_slave_config(substream, params, &slave_config);
|