This is the 4.4.117 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlqO124ACgkQONu9yGCS
 aT6nuxAA1X5s4WZ9q6rth4motnyeP1NKaMjjUXJ8JfF4wqEO/RteuYB5gkVFM0zN
 WwykxB+WwsBACNujQWJi2fv7cHmv6DquwuEedgLfwUENGZk7sgvjsSH6fi1Ekghn
 XSE/6z5E0Ho/nG2fpn/JoY2MNI6dr147t1co2K3Qd/Fleu1qL0AR7ngUhMBo4Iz+
 ufKuxuokRS0uZKriaasjXOkX39rrX5YqFn6Fj5fHoXUtsl4UT7hZ0HG6pkM3mAuv
 M0IIqImrv8e9KKVXsQIj3cDdU/jjKFn/Cv1Ge1UAEXAAGbrZHFpP7/ayYgWnMUYY
 Dk2+hHRiDDTJqM4jWMHCJY/hshYgiVpapGeu5zbQhAm2tHNRk+2khHmibdhksCSu
 HcjUVsQbX480Jw0qGj3RHF3+em2a8fNI6KI+LNcOWjPVSz1AsJS5qRNFbs3hXFfa
 DsmJ9129brEM0UAzolan2SuBzxlg6py2bITgB9NhFpEOnIi+HNWW53wKF/tLb2cJ
 gu8/P25osK21ZeI2FTV5A4VQgeKZEkPQ1uz/nqAEAetRDy7GYj+vKUybTQeMra/e
 xEwQ0HW41uSxpgccfXv5Vsdr/kZMzlKADwfjacHjQ+oT6YPT/isgxT1vhWF+YgJg
 cl0ulNKB/R+CCx7ac4u7XRjTyjbyR7ZUh9vKUAw0o3NZ4XG/o9Y=
 =917Z
 -----END PGP SIGNATURE-----

Merge 4.4.117 into android-4.4

Changes in 4.4.117
	IB/mlx4: Fix incorrectly releasing steerable UD QPs when have only ETH ports
	PM / devfreq: Propagate error from devfreq_add_device()
	s390: fix handling of -1 in set{,fs}[gu]id16 syscalls
	ARM: dts: STi: Add gpio polarity for "hdmi,hpd-gpio" property
	arm: spear600: Add missing interrupt-parent of rtc
	arm: spear13xx: Fix dmas cells
	arm: spear13xx: Fix spics gpio controller's warning
	ALSA: seq: Fix regression by incorrect ioctl_mutex usages
	KVM/x86: Reduce retpoline performance impact in slot_handle_level_range(), by always inlining iterator helper methods
	x86/cpu: Change type of x86_cache_size variable to unsigned int
	drm/radeon: adjust tested variable
	rtc-opal: Fix handling of firmware error codes, prevent busy loops
	ext4: save error to disk in __ext4_grp_locked_error()
	ext4: correct documentation for grpid mount option
	mm: hide a #warning for COMPILE_TEST
	video: fbdev: atmel_lcdfb: fix display-timings lookup
	console/dummy: leave .con_font_get set to NULL
	rtlwifi: rtl8821ae: Fix connection lost problem correctly
	Btrfs: fix deadlock in run_delalloc_nocow
	Btrfs: fix crash due to not cleaning up tree log block's dirty bits
	Btrfs: fix unexpected -EEXIST when creating new inode
	ALSA: hda - Fix headset mic detection problem for two Dell machines
	ALSA: usb-audio: Fix UAC2 get_ctl request with a RANGE attribute
	ALSA: hda/realtek: PCI quirk for Fujitsu U7x7
	ALSA: usb-audio: add implicit fb quirk for Behringer UFX1204
	ALSA: seq: Fix racy pool initializations
	mvpp2: fix multicast address filter
	dm: correctly handle chained bios in dec_pending()
	x86: fix build warnign with 32-bit PAE
	vfs: don't do RCU lookup of empty pathnames
	ARM: pxa/tosa-bt: add MODULE_LICENSE tag
	ARM: dts: s5pv210: add interrupt-parent for ohci
	media: r820t: fix r820t_write_reg for KASAN
	Linux 4.4.117

Change-Id: Id192d691d19a99889dc5d36711f18576f48f2981
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2018-02-22 18:06:57 +01:00
commit 4ec3656576
39 changed files with 180 additions and 70 deletions

View file

@ -58,6 +58,6 @@ Example:
interrupts = <0 35 0x4>; interrupts = <0 35 0x4>;
status = "disabled"; status = "disabled";
dmas = <&dmahost 12 0 1>, dmas = <&dmahost 12 0 1>,
<&dmahost 13 0 1 0>; <&dmahost 13 1 0>;
dma-names = "rx", "rx"; dma-names = "rx", "rx";
}; };

View file

@ -233,7 +233,7 @@ data_err=ignore(*) Just print an error message if an error occurs
data_err=abort Abort the journal if an error occurs in a file data_err=abort Abort the journal if an error occurs in a file
data buffer in ordered mode. data buffer in ordered mode.
grpid Give objects the same group ID as their creator. grpid New objects have the group ID of their parent.
bsdgroups bsdgroups
nogrpid (*) New objects have the group ID of their creator. nogrpid (*) New objects have the group ID of their creator.

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 116 SUBLEVEL = 117
EXTRAVERSION = EXTRAVERSION =
NAME = Blurry Fish Butt NAME = Blurry Fish Butt

View file

@ -461,6 +461,7 @@
compatible = "samsung,exynos4210-ohci"; compatible = "samsung,exynos4210-ohci";
reg = <0xec300000 0x100>; reg = <0xec300000 0x100>;
interrupts = <23>; interrupts = <23>;
interrupt-parent = <&vic1>;
clocks = <&clocks CLK_USB_HOST>; clocks = <&clocks CLK_USB_HOST>;
clock-names = "usbhost"; clock-names = "usbhost";
#address-cells = <1>; #address-cells = <1>;

View file

@ -349,7 +349,7 @@
spi0: spi@e0100000 { spi0: spi@e0100000 {
status = "okay"; status = "okay";
num-cs = <3>; num-cs = <3>;
cs-gpios = <&gpio1 7 0>, <&spics 0>, <&spics 1>; cs-gpios = <&gpio1 7 0>, <&spics 0 0>, <&spics 1 0>;
stmpe610@0 { stmpe610@0 {
compatible = "st,stmpe610"; compatible = "st,stmpe610";

View file

@ -141,8 +141,8 @@
reg = <0xb4100000 0x1000>; reg = <0xb4100000 0x1000>;
interrupts = <0 105 0x4>; interrupts = <0 105 0x4>;
status = "disabled"; status = "disabled";
dmas = <&dwdma0 0x600 0 0 1>, /* 0xC << 11 */ dmas = <&dwdma0 12 0 1>,
<&dwdma0 0x680 0 1 0>; /* 0xD << 7 */ <&dwdma0 13 1 0>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
}; };

View file

@ -100,7 +100,7 @@
reg = <0xb2800000 0x1000>; reg = <0xb2800000 0x1000>;
interrupts = <0 29 0x4>; interrupts = <0 29 0x4>;
status = "disabled"; status = "disabled";
dmas = <&dwdma0 0 0 0 0>; dmas = <&dwdma0 0 0 0>;
dma-names = "data"; dma-names = "data";
}; };
@ -288,8 +288,8 @@
#size-cells = <0>; #size-cells = <0>;
interrupts = <0 31 0x4>; interrupts = <0 31 0x4>;
status = "disabled"; status = "disabled";
dmas = <&dwdma0 0x2000 0 0 0>, /* 0x4 << 11 */ dmas = <&dwdma0 4 0 0>,
<&dwdma0 0x0280 0 0 0>; /* 0x5 << 7 */ <&dwdma0 5 0 0>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
}; };

View file

@ -194,6 +194,7 @@
rtc@fc900000 { rtc@fc900000 {
compatible = "st,spear600-rtc"; compatible = "st,spear600-rtc";
reg = <0xfc900000 0x1000>; reg = <0xfc900000 0x1000>;
interrupt-parent = <&vic0>;
interrupts = <10>; interrupts = <10>;
status = "disabled"; status = "disabled";
}; };

View file

@ -8,6 +8,7 @@
*/ */
#include "stih407-clock.dtsi" #include "stih407-clock.dtsi"
#include "stih407-family.dtsi" #include "stih407-family.dtsi"
#include <dt-bindings/gpio/gpio.h>
/ { / {
soc { soc {
sti-display-subsystem { sti-display-subsystem {
@ -112,7 +113,7 @@
<&clk_s_d2_quadfs 0>, <&clk_s_d2_quadfs 0>,
<&clk_s_d2_quadfs 1>; <&clk_s_d2_quadfs 1>;
hdmi,hpd-gpio = <&pio5 3>; hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>;
reset-names = "hdmi"; reset-names = "hdmi";
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>; resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
ddc = <&hdmiddc>; ddc = <&hdmiddc>;

View file

@ -9,6 +9,7 @@
#include "stih410-clock.dtsi" #include "stih410-clock.dtsi"
#include "stih407-family.dtsi" #include "stih407-family.dtsi"
#include "stih410-pinctrl.dtsi" #include "stih410-pinctrl.dtsi"
#include <dt-bindings/gpio/gpio.h>
/ { / {
aliases { aliases {
bdisp0 = &bdisp0; bdisp0 = &bdisp0;
@ -203,7 +204,7 @@
<&clk_s_d2_quadfs 0>, <&clk_s_d2_quadfs 0>,
<&clk_s_d2_quadfs 1>; <&clk_s_d2_quadfs 1>;
hdmi,hpd-gpio = <&pio5 3>; hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>;
reset-names = "hdmi"; reset-names = "hdmi";
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>; resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
ddc = <&hdmiddc>; ddc = <&hdmiddc>;

View file

@ -132,3 +132,7 @@ static struct platform_driver tosa_bt_driver = {
}, },
}; };
module_platform_driver(tosa_bt_driver); module_platform_driver(tosa_bt_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dmitry Baryshkov");
MODULE_DESCRIPTION("Bluetooth built-in chip control");

View file

@ -110,7 +110,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setregid16, u16, rgid, u16, egid)
COMPAT_SYSCALL_DEFINE1(s390_setgid16, u16, gid) COMPAT_SYSCALL_DEFINE1(s390_setgid16, u16, gid)
{ {
return sys_setgid((gid_t)gid); return sys_setgid(low2highgid(gid));
} }
COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid) COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid)
@ -120,7 +120,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid)
COMPAT_SYSCALL_DEFINE1(s390_setuid16, u16, uid) COMPAT_SYSCALL_DEFINE1(s390_setuid16, u16, uid)
{ {
return sys_setuid((uid_t)uid); return sys_setuid(low2highuid(uid));
} }
COMPAT_SYSCALL_DEFINE3(s390_setresuid16, u16, ruid, u16, euid, u16, suid) COMPAT_SYSCALL_DEFINE3(s390_setresuid16, u16, ruid, u16, euid, u16, suid)
@ -173,12 +173,12 @@ COMPAT_SYSCALL_DEFINE3(s390_getresgid16, u16 __user *, rgidp,
COMPAT_SYSCALL_DEFINE1(s390_setfsuid16, u16, uid) COMPAT_SYSCALL_DEFINE1(s390_setfsuid16, u16, uid)
{ {
return sys_setfsuid((uid_t)uid); return sys_setfsuid(low2highuid(uid));
} }
COMPAT_SYSCALL_DEFINE1(s390_setfsgid16, u16, gid) COMPAT_SYSCALL_DEFINE1(s390_setfsgid16, u16, gid)
{ {
return sys_setfsgid((gid_t)gid); return sys_setfsgid(low2highgid(gid));
} }
static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info) static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info)

View file

@ -113,7 +113,7 @@ struct cpuinfo_x86 {
char x86_vendor_id[16]; char x86_vendor_id[16];
char x86_model_id[64]; char x86_model_id[64];
/* in KB - valid for CPUS which support this call: */ /* in KB - valid for CPUS which support this call: */
int x86_cache_size; unsigned int x86_cache_size;
int x86_cache_alignment; /* In bytes */ int x86_cache_alignment; /* In bytes */
/* Cache QoS architectural values: */ /* Cache QoS architectural values: */
int x86_cache_max_rmid; /* max index */ int x86_cache_max_rmid; /* max index */

View file

@ -955,7 +955,7 @@ static void identify_cpu(struct cpuinfo_x86 *c)
int i; int i;
c->loops_per_jiffy = loops_per_jiffy; c->loops_per_jiffy = loops_per_jiffy;
c->x86_cache_size = -1; c->x86_cache_size = 0;
c->x86_vendor = X86_VENDOR_UNKNOWN; c->x86_vendor = X86_VENDOR_UNKNOWN;
c->x86_model = c->x86_mask = 0; /* So far unknown... */ c->x86_model = c->x86_mask = 0; /* So far unknown... */
c->x86_vendor_id[0] = '\0'; /* Unset */ c->x86_vendor_id[0] = '\0'; /* Unset */

View file

@ -1075,7 +1075,7 @@ static struct microcode_ops microcode_intel_ops = {
static int __init calc_llc_size_per_core(struct cpuinfo_x86 *c) static int __init calc_llc_size_per_core(struct cpuinfo_x86 *c)
{ {
u64 llc_size = c->x86_cache_size * 1024; u64 llc_size = c->x86_cache_size * 1024ULL;
do_div(llc_size, c->x86_max_cores); do_div(llc_size, c->x86_max_cores);

View file

@ -87,8 +87,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
} }
/* Cache size */ /* Cache size */
if (c->x86_cache_size >= 0) if (c->x86_cache_size)
seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size); seq_printf(m, "cache size\t: %u KB\n", c->x86_cache_size);
show_cpuinfo_core(m, c, cpu); show_cpuinfo_core(m, c, cpu);
show_cpuinfo_misc(m, c); show_cpuinfo_misc(m, c);

View file

@ -4503,7 +4503,7 @@ void kvm_mmu_setup(struct kvm_vcpu *vcpu)
typedef bool (*slot_level_handler) (struct kvm *kvm, unsigned long *rmap); typedef bool (*slot_level_handler) (struct kvm *kvm, unsigned long *rmap);
/* The caller should hold mmu-lock before calling this function. */ /* The caller should hold mmu-lock before calling this function. */
static bool static __always_inline bool
slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot,
slot_level_handler fn, int start_level, int end_level, slot_level_handler fn, int start_level, int end_level,
gfn_t start_gfn, gfn_t end_gfn, bool lock_flush_tlb) gfn_t start_gfn, gfn_t end_gfn, bool lock_flush_tlb)
@ -4533,7 +4533,7 @@ slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot,
return flush; return flush;
} }
static bool static __always_inline bool
slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
slot_level_handler fn, int start_level, int end_level, slot_level_handler fn, int start_level, int end_level,
bool lock_flush_tlb) bool lock_flush_tlb)
@ -4544,7 +4544,7 @@ slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
lock_flush_tlb); lock_flush_tlb);
} }
static bool static __always_inline bool
slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
slot_level_handler fn, bool lock_flush_tlb) slot_level_handler fn, bool lock_flush_tlb)
{ {
@ -4552,7 +4552,7 @@ slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb);
} }
static bool static __always_inline bool
slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
slot_level_handler fn, bool lock_flush_tlb) slot_level_handler fn, bool lock_flush_tlb)
{ {
@ -4560,7 +4560,7 @@ slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb);
} }
static bool static __always_inline bool
slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot,
slot_level_handler fn, bool lock_flush_tlb) slot_level_handler fn, bool lock_flush_tlb)
{ {

View file

@ -583,7 +583,7 @@ struct devfreq *devm_devfreq_add_device(struct device *dev,
devfreq = devfreq_add_device(dev, profile, governor_name, data); devfreq = devfreq_add_device(dev, profile, governor_name, data);
if (IS_ERR(devfreq)) { if (IS_ERR(devfreq)) {
devres_free(ptr); devres_free(ptr);
return ERR_PTR(-ENOMEM); return devfreq;
} }
*ptr = devfreq; *ptr = devfreq;

View file

@ -946,7 +946,7 @@ int radeon_uvd_calc_upll_dividers(struct radeon_device *rdev,
/* calc dclk divider with current vco freq */ /* calc dclk divider with current vco freq */
dclk_div = radeon_uvd_calc_upll_post_div(vco_freq, dclk, dclk_div = radeon_uvd_calc_upll_post_div(vco_freq, dclk,
pd_min, pd_even); pd_min, pd_even);
if (vclk_div > pd_max) if (dclk_div > pd_max)
break; /* vco is too big, it has to stop */ break; /* vco is too big, it has to stop */
/* calc score with current vco freq */ /* calc score with current vco freq */

View file

@ -2483,9 +2483,8 @@ err_steer_free_bitmap:
kfree(ibdev->ib_uc_qpns_bitmap); kfree(ibdev->ib_uc_qpns_bitmap);
err_steer_qp_release: err_steer_qp_release:
if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
mlx4_qp_release_range(dev, ibdev->steer_qpn_base, ibdev->steer_qpn_count);
ibdev->steer_qpn_count);
err_counter: err_counter:
for (i = 0; i < ibdev->num_ports; ++i) for (i = 0; i < ibdev->num_ports; ++i)
mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]); mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]);
@ -2586,11 +2585,9 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
ibdev->iboe.nb.notifier_call = NULL; ibdev->iboe.nb.notifier_call = NULL;
} }
if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) { mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
mlx4_qp_release_range(dev, ibdev->steer_qpn_base, ibdev->steer_qpn_count);
ibdev->steer_qpn_count); kfree(ibdev->ib_uc_qpns_bitmap);
kfree(ibdev->ib_uc_qpns_bitmap);
}
iounmap(ibdev->uar_map); iounmap(ibdev->uar_map);
for (p = 0; p < ibdev->num_ports; ++p) for (p = 0; p < ibdev->num_ports; ++p)

View file

@ -974,7 +974,8 @@ static void dec_pending(struct dm_io *io, int error)
} else { } else {
/* done with normal IO or empty flush */ /* done with normal IO or empty flush */
trace_block_bio_complete(md->queue, bio, io_error); trace_block_bio_complete(md->queue, bio, io_error);
bio->bi_error = io_error; if (io_error)
bio->bi_error = io_error;
bio_endio(bio); bio_endio(bio);
} }
} }

View file

@ -410,9 +410,11 @@ static int r820t_write(struct r820t_priv *priv, u8 reg, const u8 *val,
return 0; return 0;
} }
static int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val) static inline int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val)
{ {
return r820t_write(priv, reg, &val, 1); u8 tmp = val; /* work around GCC PR81715 with asan-stack=1 */
return r820t_write(priv, reg, &tmp, 1);
} }
static int r820t_read_cache_reg(struct r820t_priv *priv, int reg) static int r820t_read_cache_reg(struct r820t_priv *priv, int reg)
@ -425,17 +427,18 @@ static int r820t_read_cache_reg(struct r820t_priv *priv, int reg)
return -EINVAL; return -EINVAL;
} }
static int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val, static inline int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val,
u8 bit_mask) u8 bit_mask)
{ {
u8 tmp = val;
int rc = r820t_read_cache_reg(priv, reg); int rc = r820t_read_cache_reg(priv, reg);
if (rc < 0) if (rc < 0)
return rc; return rc;
val = (rc & ~bit_mask) | (val & bit_mask); tmp = (rc & ~bit_mask) | (tmp & bit_mask);
return r820t_write(priv, reg, &val, 1); return r820t_write(priv, reg, &tmp, 1);
} }
static int r820t_read(struct r820t_priv *priv, u8 reg, u8 *val, int len) static int r820t_read(struct r820t_priv *priv, u8 reg, u8 *val, int len)

View file

@ -5666,6 +5666,7 @@ static void mvpp2_set_rx_mode(struct net_device *dev)
int id = port->id; int id = port->id;
bool allmulti = dev->flags & IFF_ALLMULTI; bool allmulti = dev->flags & IFF_ALLMULTI;
retry:
mvpp2_prs_mac_promisc_set(priv, id, dev->flags & IFF_PROMISC); mvpp2_prs_mac_promisc_set(priv, id, dev->flags & IFF_PROMISC);
mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_ALL, allmulti); mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_ALL, allmulti);
mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_IP6, allmulti); mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_IP6, allmulti);
@ -5673,9 +5674,13 @@ static void mvpp2_set_rx_mode(struct net_device *dev)
/* Remove all port->id's mcast enries */ /* Remove all port->id's mcast enries */
mvpp2_prs_mcast_del_all(priv, id); mvpp2_prs_mcast_del_all(priv, id);
if (allmulti && !netdev_mc_empty(dev)) { if (!allmulti) {
netdev_for_each_mc_addr(ha, dev) netdev_for_each_mc_addr(ha, dev) {
mvpp2_prs_mac_da_accept(priv, id, ha->addr, true); if (mvpp2_prs_mac_da_accept(priv, id, ha->addr, true)) {
allmulti = true;
goto retry;
}
}
} }
} }

View file

@ -280,6 +280,9 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt)
u64 in_param = 0; u64 in_param = 0;
int err; int err;
if (!cnt)
return;
if (mlx4_is_mfunc(dev)) { if (mlx4_is_mfunc(dev)) {
set_param_l(&in_param, base_qpn); set_param_l(&in_param, base_qpn);
set_param_h(&in_param, cnt); set_param_h(&in_param, cnt);

View file

@ -1127,7 +1127,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
} }
if (0 == tmp) { if (0 == tmp) {
read_addr = REG_DBI_RDATA + addr % 4; read_addr = REG_DBI_RDATA + addr % 4;
ret = rtl_read_word(rtlpriv, read_addr); ret = rtl_read_byte(rtlpriv, read_addr);
} }
return ret; return ret;
} }
@ -1169,7 +1169,8 @@ static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
} }
tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f); tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
_rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7)); _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7) |
ASPM_L1_LATENCY << 3);
tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719); tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
_rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4)); _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));

View file

@ -99,6 +99,7 @@
#define RTL_USB_MAX_RX_COUNT 100 #define RTL_USB_MAX_RX_COUNT 100
#define QBSS_LOAD_SIZE 5 #define QBSS_LOAD_SIZE 5
#define MAX_WMMELE_LENGTH 64 #define MAX_WMMELE_LENGTH 64
#define ASPM_L1_LATENCY 7
#define TOTAL_CAM_ENTRY 32 #define TOTAL_CAM_ENTRY 32

View file

@ -58,6 +58,7 @@ static void tm_to_opal(struct rtc_time *tm, u32 *y_m_d, u64 *h_m_s_ms)
static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)
{ {
long rc = OPAL_BUSY; long rc = OPAL_BUSY;
int retries = 10;
u32 y_m_d; u32 y_m_d;
u64 h_m_s_ms; u64 h_m_s_ms;
__be32 __y_m_d; __be32 __y_m_d;
@ -67,8 +68,11 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)
rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms);
if (rc == OPAL_BUSY_EVENT) if (rc == OPAL_BUSY_EVENT)
opal_poll_events(NULL); opal_poll_events(NULL);
else else if (retries-- && (rc == OPAL_HARDWARE
|| rc == OPAL_INTERNAL_ERROR))
msleep(10); msleep(10);
else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT)
break;
} }
if (rc != OPAL_SUCCESS) if (rc != OPAL_SUCCESS)
@ -84,6 +88,7 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)
static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm) static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm)
{ {
long rc = OPAL_BUSY; long rc = OPAL_BUSY;
int retries = 10;
u32 y_m_d = 0; u32 y_m_d = 0;
u64 h_m_s_ms = 0; u64 h_m_s_ms = 0;
@ -92,8 +97,11 @@ static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm)
rc = opal_rtc_write(y_m_d, h_m_s_ms); rc = opal_rtc_write(y_m_d, h_m_s_ms);
if (rc == OPAL_BUSY_EVENT) if (rc == OPAL_BUSY_EVENT)
opal_poll_events(NULL); opal_poll_events(NULL);
else else if (retries-- && (rc == OPAL_HARDWARE
|| rc == OPAL_INTERNAL_ERROR))
msleep(10); msleep(10);
else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT)
break;
} }
return rc == OPAL_SUCCESS ? 0 : -EIO; return rc == OPAL_SUCCESS ? 0 : -EIO;

View file

@ -68,7 +68,6 @@ const struct consw dummy_con = {
.con_switch = DUMMY, .con_switch = DUMMY,
.con_blank = DUMMY, .con_blank = DUMMY,
.con_font_set = DUMMY, .con_font_set = DUMMY,
.con_font_get = DUMMY,
.con_font_default = DUMMY, .con_font_default = DUMMY,
.con_font_copy = DUMMY, .con_font_copy = DUMMY,
.con_set_palette = DUMMY, .con_set_palette = DUMMY,

View file

@ -1120,7 +1120,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
goto put_display_node; goto put_display_node;
} }
timings_np = of_find_node_by_name(display_np, "display-timings"); timings_np = of_get_child_by_name(display_np, "display-timings");
if (!timings_np) { if (!timings_np) {
dev_err(dev, "failed to find display-timings node\n"); dev_err(dev, "failed to find display-timings node\n");
ret = -ENODEV; ret = -ENODEV;
@ -1141,6 +1141,12 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
fb_add_videomode(&fb_vm, &info->modelist); fb_add_videomode(&fb_vm, &info->modelist);
} }
/*
* FIXME: Make sure we are not referencing any fields in display_np
* and timings_np and drop our references to them before returning to
* avoid leaking the nodes on probe deferral and driver unbind.
*/
return 0; return 0;
put_timings_node: put_timings_node:

View file

@ -1292,8 +1292,11 @@ next_slot:
leaf = path->nodes[0]; leaf = path->nodes[0];
if (path->slots[0] >= btrfs_header_nritems(leaf)) { if (path->slots[0] >= btrfs_header_nritems(leaf)) {
ret = btrfs_next_leaf(root, path); ret = btrfs_next_leaf(root, path);
if (ret < 0) if (ret < 0) {
if (cow_start != (u64)-1)
cur_offset = cow_start;
goto error; goto error;
}
if (ret > 0) if (ret > 0)
break; break;
leaf = path->nodes[0]; leaf = path->nodes[0];

View file

@ -26,6 +26,7 @@
#include "print-tree.h" #include "print-tree.h"
#include "backref.h" #include "backref.h"
#include "hash.h" #include "hash.h"
#include "inode-map.h"
/* magic values for the inode_only field in btrfs_log_inode: /* magic values for the inode_only field in btrfs_log_inode:
* *
@ -2445,6 +2446,9 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
next); next);
btrfs_wait_tree_block_writeback(next); btrfs_wait_tree_block_writeback(next);
btrfs_tree_unlock(next); btrfs_tree_unlock(next);
} else {
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
clear_extent_buffer_dirty(next);
} }
WARN_ON(root_owner != WARN_ON(root_owner !=
@ -2524,6 +2528,9 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
next); next);
btrfs_wait_tree_block_writeback(next); btrfs_wait_tree_block_writeback(next);
btrfs_tree_unlock(next); btrfs_tree_unlock(next);
} else {
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
clear_extent_buffer_dirty(next);
} }
WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID); WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
@ -2600,6 +2607,9 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
clean_tree_block(trans, log->fs_info, next); clean_tree_block(trans, log->fs_info, next);
btrfs_wait_tree_block_writeback(next); btrfs_wait_tree_block_writeback(next);
btrfs_tree_unlock(next); btrfs_tree_unlock(next);
} else {
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
clear_extent_buffer_dirty(next);
} }
WARN_ON(log->root_key.objectid != WARN_ON(log->root_key.objectid !=
@ -5514,6 +5524,23 @@ again:
path); path);
} }
if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) {
struct btrfs_root *root = wc.replay_dest;
btrfs_release_path(path);
/*
* We have just replayed everything, and the highest
* objectid of fs roots probably has changed in case
* some inode_item's got replayed.
*
* root->objectid_mutex is not acquired as log replay
* could only happen during mount.
*/
ret = btrfs_find_highest_objectid(root,
&root->highest_objectid);
}
key.offset = found_key.offset - 1; key.offset = found_key.offset - 1;
wc.replay_dest->log_root = NULL; wc.replay_dest->log_root = NULL;
free_extent_buffer(log->node); free_extent_buffer(log->node);

View file

@ -688,6 +688,7 @@ __acquires(bitlock)
} }
ext4_unlock_group(sb, grp); ext4_unlock_group(sb, grp);
ext4_commit_super(sb, 1);
ext4_handle_error(sb); ext4_handle_error(sb);
/* /*
* We only get here in the ERRORS_RO case; relocking the group * We only get here in the ERRORS_RO case; relocking the group

View file

@ -2015,6 +2015,9 @@ static const char *path_init(struct nameidata *nd, unsigned flags)
int retval = 0; int retval = 0;
const char *s = nd->name->name; const char *s = nd->name->name;
if (!*s)
flags &= ~LOOKUP_RCU;
nd->last_type = LAST_ROOT; /* if there are only slashes... */ nd->last_type = LAST_ROOT; /* if there are only slashes... */
nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT; nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT;
nd->depth = 0; nd->depth = 0;

View file

@ -32,7 +32,7 @@ static inline void kaiser_init(void)
{ {
} }
static inline int kaiser_add_mapping(unsigned long addr, static inline int kaiser_add_mapping(unsigned long addr,
unsigned long size, unsigned long flags) unsigned long size, u64 flags)
{ {
return 0; return 0;
} }

View file

@ -72,7 +72,7 @@
#include "internal.h" #include "internal.h"
#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS #if defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) && !defined(CONFIG_COMPILE_TEST)
#warning Unfortunate NUMA and NUMA Balancing config, growing page-frame for last_cpupid. #warning Unfortunate NUMA and NUMA Balancing config, growing page-frame for last_cpupid.
#endif #endif

View file

@ -1012,7 +1012,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf,
{ {
struct snd_seq_client *client = file->private_data; struct snd_seq_client *client = file->private_data;
int written = 0, len; int written = 0, len;
int err = -EINVAL; int err;
struct snd_seq_event event; struct snd_seq_event event;
if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT))
@ -1027,11 +1027,15 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf,
/* allocate the pool now if the pool is not allocated yet */ /* allocate the pool now if the pool is not allocated yet */
if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) {
if (snd_seq_pool_init(client->pool) < 0) mutex_lock(&client->ioctl_mutex);
err = snd_seq_pool_init(client->pool);
mutex_unlock(&client->ioctl_mutex);
if (err < 0)
return -ENOMEM; return -ENOMEM;
} }
/* only process whole events */ /* only process whole events */
err = -EINVAL;
while (count >= sizeof(struct snd_seq_event)) { while (count >= sizeof(struct snd_seq_event)) {
/* Read in the event header from the user */ /* Read in the event header from the user */
len = sizeof(event); len = sizeof(event);
@ -2196,7 +2200,6 @@ static int snd_seq_do_ioctl(struct snd_seq_client *client, unsigned int cmd,
void __user *arg) void __user *arg)
{ {
struct seq_ioctl_table *p; struct seq_ioctl_table *p;
int ret;
switch (cmd) { switch (cmd) {
case SNDRV_SEQ_IOCTL_PVERSION: case SNDRV_SEQ_IOCTL_PVERSION:
@ -2210,12 +2213,8 @@ static int snd_seq_do_ioctl(struct snd_seq_client *client, unsigned int cmd,
if (! arg) if (! arg)
return -EFAULT; return -EFAULT;
for (p = ioctl_tables; p->cmd; p++) { for (p = ioctl_tables; p->cmd; p++) {
if (p->cmd == cmd) { if (p->cmd == cmd)
mutex_lock(&client->ioctl_mutex); return p->func(client, arg);
ret = p->func(client, arg);
mutex_unlock(&client->ioctl_mutex);
return ret;
}
} }
pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n", pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n",
cmd, _IOC_TYPE(cmd), _IOC_NR(cmd)); cmd, _IOC_TYPE(cmd), _IOC_NR(cmd));
@ -2226,11 +2225,15 @@ static int snd_seq_do_ioctl(struct snd_seq_client *client, unsigned int cmd,
static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ {
struct snd_seq_client *client = file->private_data; struct snd_seq_client *client = file->private_data;
long ret;
if (snd_BUG_ON(!client)) if (snd_BUG_ON(!client))
return -ENXIO; return -ENXIO;
return snd_seq_do_ioctl(client, cmd, (void __user *) arg); mutex_lock(&client->ioctl_mutex);
ret = snd_seq_do_ioctl(client, cmd, (void __user *) arg);
mutex_unlock(&client->ioctl_mutex);
return ret;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT

View file

@ -3130,6 +3130,19 @@ static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
} }
static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
const struct hda_fixup *fix,
int action)
{
unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
if (cfg_headphone && cfg_headset_mic == 0x411111f0)
snd_hda_codec_set_pincfg(codec, 0x19,
(cfg_headphone & ~AC_DEFCFG_DEVICE) |
(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
}
static void alc269_fixup_hweq(struct hda_codec *codec, static void alc269_fixup_hweq(struct hda_codec *codec,
const struct hda_fixup *fix, int action) const struct hda_fixup *fix, int action)
{ {
@ -4782,6 +4795,7 @@ enum {
ALC269_FIXUP_LIFEBOOK_EXTMIC, ALC269_FIXUP_LIFEBOOK_EXTMIC,
ALC269_FIXUP_LIFEBOOK_HP_PIN, ALC269_FIXUP_LIFEBOOK_HP_PIN,
ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT, ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
ALC269_FIXUP_AMIC, ALC269_FIXUP_AMIC,
ALC269_FIXUP_DMIC, ALC269_FIXUP_DMIC,
ALC269VB_FIXUP_AMIC, ALC269VB_FIXUP_AMIC,
@ -4972,6 +4986,10 @@ static const struct hda_fixup alc269_fixups[] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc269_fixup_pincfg_no_hp_to_lineout, .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
}, },
[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
},
[ALC269_FIXUP_AMIC] = { [ALC269_FIXUP_AMIC] = {
.type = HDA_FIXUP_PINS, .type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) { .v.pins = (const struct hda_pintbl[]) {
@ -5687,6 +5705,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT), SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN), SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN), SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_BXBT2807_MIC), SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_BXBT2807_MIC),
@ -5975,6 +5994,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
{0x12, 0xb7a60130}, {0x12, 0xb7a60130},
{0x14, 0x90170110}, {0x14, 0x90170110},
{0x21, 0x02211020}), {0x21, 0x02211020}),
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
{0x12, 0x90a60130},
{0x14, 0x90170110},
{0x14, 0x01011020},
{0x21, 0x0221101f}),
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC256_STANDARD_PINS), ALC256_STANDARD_PINS),
SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
@ -6031,6 +6055,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
{0x12, 0x90a60120}, {0x12, 0x90a60120},
{0x14, 0x90170110}, {0x14, 0x90170110},
{0x21, 0x0321101f}), {0x21, 0x0321101f}),
SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
{0x12, 0xb7a60130},
{0x14, 0x90170110},
{0x21, 0x04211020}),
SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
ALC290_STANDARD_PINS, ALC290_STANDARD_PINS,
{0x15, 0x04211040}, {0x15, 0x04211040},

View file

@ -343,17 +343,20 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request,
int validx, int *value_ret) int validx, int *value_ret)
{ {
struct snd_usb_audio *chip = cval->head.mixer->chip; struct snd_usb_audio *chip = cval->head.mixer->chip;
unsigned char buf[4 + 3 * sizeof(__u32)]; /* enough space for one range */ /* enough space for one range */
unsigned char buf[sizeof(__u16) + 3 * sizeof(__u32)];
unsigned char *val; unsigned char *val;
int idx = 0, ret, size; int idx = 0, ret, val_size, size;
__u8 bRequest; __u8 bRequest;
val_size = uac2_ctl_value_size(cval->val_type);
if (request == UAC_GET_CUR) { if (request == UAC_GET_CUR) {
bRequest = UAC2_CS_CUR; bRequest = UAC2_CS_CUR;
size = uac2_ctl_value_size(cval->val_type); size = val_size;
} else { } else {
bRequest = UAC2_CS_RANGE; bRequest = UAC2_CS_RANGE;
size = sizeof(buf); size = sizeof(__u16) + 3 * val_size;
} }
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
@ -386,16 +389,17 @@ error:
val = buf + sizeof(__u16); val = buf + sizeof(__u16);
break; break;
case UAC_GET_MAX: case UAC_GET_MAX:
val = buf + sizeof(__u16) * 2; val = buf + sizeof(__u16) + val_size;
break; break;
case UAC_GET_RES: case UAC_GET_RES:
val = buf + sizeof(__u16) * 3; val = buf + sizeof(__u16) + val_size * 2;
break; break;
default: default:
return -EINVAL; return -EINVAL;
} }
*value_ret = convert_signed_value(cval, snd_usb_combine_bytes(val, sizeof(__u16))); *value_ret = convert_signed_value(cval,
snd_usb_combine_bytes(val, val_size));
return 0; return 0;
} }

View file

@ -343,6 +343,15 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
ep = 0x81; ep = 0x81;
iface = usb_ifnum_to_if(dev, 2); iface = usb_ifnum_to_if(dev, 2);
if (!iface || iface->num_altsetting == 0)
return -EINVAL;
alts = &iface->altsetting[1];
goto add_sync_ep;
case USB_ID(0x1397, 0x0002):
ep = 0x81;
iface = usb_ifnum_to_if(dev, 1);
if (!iface || iface->num_altsetting == 0) if (!iface || iface->num_altsetting == 0)
return -EINVAL; return -EINVAL;