mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 13:29:33 +00:00
Update Pine64 kernel to 3.10.100
This commit is contained in:
parent
b4bd423c96
commit
fd6b849cd9
21 changed files with 25615 additions and 12 deletions
1493
patch/kernel/pine64-default/01-patch-3.10.100-101.patch.disabled
Normal file
1493
patch/kernel/pine64-default/01-patch-3.10.100-101.patch.disabled
Normal file
File diff suppressed because it is too large
Load diff
1727
patch/kernel/pine64-default/01-patch-3.10.82-83-e.patch
Normal file
1727
patch/kernel/pine64-default/01-patch-3.10.82-83-e.patch
Normal file
File diff suppressed because it is too large
Load diff
198
patch/kernel/pine64-default/01-patch-3.10.83-00-aufs-fix.patch
Normal file
198
patch/kernel/pine64-default/01-patch-3.10.83-00-aufs-fix.patch
Normal file
|
@ -0,0 +1,198 @@
|
|||
--- a/fs/aufs/branch.c
|
||||
+++ b/fs/aufs/branch.c
|
||||
@@ -571,22 +571,25 @@
|
||||
{
|
||||
unsigned long long n;
|
||||
struct file **p, *f;
|
||||
+ struct au_sphlhead *files;
|
||||
+ struct au_finfo *finfo;
|
||||
struct super_block *sb = arg;
|
||||
|
||||
n = 0;
|
||||
p = a;
|
||||
- lg_global_lock(&files_lglock);
|
||||
- do_file_list_for_each_entry(sb, f) {
|
||||
- if (au_fi(f)
|
||||
- && file_count(f)
|
||||
+ files = &au_sbi(sb)->si_files;
|
||||
+ spin_lock(&files->spin);
|
||||
+ hlist_for_each_entry(finfo, &files->head, fi_hlist) {
|
||||
+ f = finfo->fi_file;
|
||||
+ if (file_count(f)
|
||||
&& !special_file(file_inode(f)->i_mode)) {
|
||||
get_file(f);
|
||||
*p++ = f;
|
||||
n++;
|
||||
AuDebugOn(n > max);
|
||||
}
|
||||
- } while_file_list_for_each_entry;
|
||||
- lg_global_unlock(&files_lglock);
|
||||
+ }
|
||||
+ spin_unlock(&files->spin);
|
||||
|
||||
return n;
|
||||
}
|
||||
@@ -1240,7 +1243,13 @@
|
||||
continue;
|
||||
|
||||
/* todo: already flushed? */
|
||||
- /* cf. fs/super.c:mark_files_ro() */
|
||||
+ /*
|
||||
+ * fs/super.c:mark_files_ro() is gone, but aufs keeps its
|
||||
+ * approach which resets f_mode and calls mnt_drop_write() and
|
||||
+ * file_release_write() for each file, because the branch
|
||||
+ * attribute in aufs world is totally different from the native
|
||||
+ * fs rw/ro mode.
|
||||
+ */
|
||||
/* fi_read_lock(file); */
|
||||
hfile = &au_fi(file)->fi_htop;
|
||||
hf = hfile->hf_file;
|
||||
--- a/fs/aufs/file.h
|
||||
+++ b/fs/aufs/file.h
|
||||
@@ -61,6 +61,9 @@
|
||||
atomic_t fi_mmapped;
|
||||
};
|
||||
struct au_fidir *fi_hdir; /* for dir only */
|
||||
+
|
||||
+ struct hlist_node fi_hlist;
|
||||
+ struct file *fi_file; /* very ugly */
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
--- a/fs/aufs/sbinfo.c
|
||||
+++ b/fs/aufs/sbinfo.c
|
||||
@@ -118,6 +118,8 @@
|
||||
init_waitqueue_head(&sbinfo->si_plink_wq);
|
||||
spin_lock_init(&sbinfo->si_plink_maint_lock);
|
||||
|
||||
+ au_sphl_init(&sbinfo->si_files);
|
||||
+
|
||||
/* leave other members for sysaufs and si_mnt. */
|
||||
sbinfo->si_sb = sb;
|
||||
sb->s_fs_info = sbinfo;
|
||||
--- a/fs/aufs/super.h
|
||||
+++ b/fs/aufs/super.h
|
||||
@@ -108,7 +108,8 @@
|
||||
} au_si_pid;
|
||||
|
||||
/*
|
||||
- * dirty approach to protect sb->sb_inodes and ->s_files from remount.
|
||||
+ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from
|
||||
+ * remount.
|
||||
*/
|
||||
atomic_long_t si_ninodes, si_nfiles;
|
||||
|
||||
@@ -188,6 +189,9 @@
|
||||
wait_queue_head_t si_plink_wq;
|
||||
spinlock_t si_plink_maint_lock;
|
||||
pid_t si_plink_maint_pid;
|
||||
+
|
||||
+ /* file list */
|
||||
+ struct au_sphlhead si_files;
|
||||
|
||||
/*
|
||||
* sysfs and lifetime management.
|
||||
--- a/fs/aufs/sysrq.c
|
||||
+++ b/fs/aufs/sysrq.c
|
||||
@@ -30,6 +30,8 @@
|
||||
char *plevel;
|
||||
struct au_sbinfo *sbinfo;
|
||||
struct file *file;
|
||||
+ struct au_sphlhead *files;
|
||||
+ struct au_finfo *finfo;
|
||||
|
||||
plevel = au_plevel;
|
||||
au_plevel = KERN_WARNING;
|
||||
@@ -86,15 +88,17 @@
|
||||
}
|
||||
#endif
|
||||
pr("files\n");
|
||||
- lg_global_lock(&files_lglock);
|
||||
- do_file_list_for_each_entry(sb, file) {
|
||||
+ files = &au_sbi(sb)->si_files;
|
||||
+ spin_lock(&files->spin);
|
||||
+ hlist_for_each_entry(finfo, &files->head, fi_hlist) {
|
||||
umode_t mode;
|
||||
|
||||
+ file = finfo->fi_file;
|
||||
mode = file_inode(file)->i_mode;
|
||||
if (!special_file(mode))
|
||||
au_dpri_file(file);
|
||||
- } while_file_list_for_each_entry;
|
||||
- lg_global_unlock(&files_lglock);
|
||||
+ }
|
||||
+ spin_unlock(&files->spin);
|
||||
pr("done\n");
|
||||
|
||||
#undef pr
|
||||
--- a/fs/aufs/vfsub.h
|
||||
+++ b/fs/aufs/vfsub.h
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
/* copied from linux/fs/internal.h */
|
||||
/* todo: BAD approach!! */
|
||||
-extern struct lglock vfsmount_lock;
|
||||
extern void __mnt_drop_write(struct vfsmount *);
|
||||
extern spinlock_t inode_sb_list_lock;
|
||||
|
||||
-/* copied from linux/fs/file_table.c */
|
||||
-extern struct lglock files_lglock;
|
||||
-#ifdef CONFIG_SMP
|
||||
-/*
|
||||
- * These macros iterate all files on all CPUs for a given superblock.
|
||||
- * files_lglock must be held globally.
|
||||
- */
|
||||
-#define do_file_list_for_each_entry(__sb, __file) \
|
||||
-{ \
|
||||
- int i; \
|
||||
- for_each_possible_cpu(i) { \
|
||||
- struct list_head *list; \
|
||||
- list = per_cpu_ptr((__sb)->s_files, i); \
|
||||
- list_for_each_entry((__file), list, f_u.fu_list)
|
||||
-
|
||||
-#define while_file_list_for_each_entry \
|
||||
- } \
|
||||
-}
|
||||
-
|
||||
-#else
|
||||
-
|
||||
-#define do_file_list_for_each_entry(__sb, __file) \
|
||||
-{ \
|
||||
- struct list_head *list; \
|
||||
- list = &(sb)->s_files; \
|
||||
- list_for_each_entry((__file), list, f_u.fu_list)
|
||||
-
|
||||
-#define while_file_list_for_each_entry \
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
-/* ---------------------------------------------------------------------- */
|
||||
-
|
||||
/* lock subclass for lower inode */
|
||||
/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */
|
||||
/* reduce? gave up. */
|
||||
--- a/fs/aufs/export.c
|
||||
+++ b/fs/aufs/export.c
|
||||
@@ -301,9 +301,9 @@
|
||||
};
|
||||
|
||||
get_fs_root(current->fs, &root);
|
||||
- br_read_lock(&vfsmount_lock);
|
||||
+ rcu_read_lock();
|
||||
err = iterate_mounts(au_compare_mnt, &args, root.mnt);
|
||||
- br_read_unlock(&vfsmount_lock);
|
||||
+ rcu_read_unlock();
|
||||
path_put(&root);
|
||||
AuDebugOn(!err);
|
||||
AuDebugOn(!args.mnt);
|
||||
--- a/fs/aufs/dcsub.c
|
||||
+++ b/fs/aufs/dcsub.c
|
||||
@@ -197,7 +197,7 @@
|
||||
goto out;
|
||||
|
||||
/*
|
||||
- * vfsmount_lock is unnecessary since this is a traverse in a single
|
||||
+ * RCU for vfsmount is unnecessary since this is a traverse in a single
|
||||
* mount
|
||||
*/
|
||||
while (!IS_ROOT(dentry)) {
|
369
patch/kernel/pine64-default/01-patch-3.10.83-84.patch
Normal file
369
patch/kernel/pine64-default/01-patch-3.10.83-84.patch
Normal file
|
@ -0,0 +1,369 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 21529dbcc11d..f7b10bb56737 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 83
|
||||
+SUBLEVEL = 84
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
|
||||
index 16cd4ba5d7fd..bb117abb1b3b 100644
|
||||
--- a/arch/arm/kvm/interrupts.S
|
||||
+++ b/arch/arm/kvm/interrupts.S
|
||||
@@ -159,13 +159,9 @@ __kvm_vcpu_return:
|
||||
@ Don't trap coprocessor accesses for host kernel
|
||||
set_hstr vmexit
|
||||
set_hdcr vmexit
|
||||
- set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
+ set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore
|
||||
|
||||
#ifdef CONFIG_VFPv3
|
||||
- @ Save floating point registers we if let guest use them.
|
||||
- tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
- bne after_vfp_restore
|
||||
-
|
||||
@ Switch VFP/NEON hardware state to the host's
|
||||
add r7, vcpu, #VCPU_VFP_GUEST
|
||||
store_vfp_state r7
|
||||
@@ -177,6 +173,8 @@ after_vfp_restore:
|
||||
@ Restore FPEXC_EN which we clobbered on entry
|
||||
pop {r2}
|
||||
VFPFMXR FPEXC, r2
|
||||
+#else
|
||||
+after_vfp_restore:
|
||||
#endif
|
||||
|
||||
@ Reset Hyp-role
|
||||
@@ -458,7 +456,7 @@ switch_to_guest_vfp:
|
||||
push {r3-r7}
|
||||
|
||||
@ NEON/VFP used. Turn on VFP access.
|
||||
- set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
+ set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
|
||||
@ Switch VFP/NEON hardware state to the guest's
|
||||
add r7, r0, #VCPU_VFP_HOST
|
||||
diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S
|
||||
index 6f18695a09cb..b6f6137f5984 100644
|
||||
--- a/arch/arm/kvm/interrupts_head.S
|
||||
+++ b/arch/arm/kvm/interrupts_head.S
|
||||
@@ -570,8 +570,13 @@ vcpu .req r0 @ vcpu pointer always in r0
|
||||
.endm
|
||||
|
||||
/* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return
|
||||
- * (hardware reset value is 0). Keep previous value in r2. */
|
||||
-.macro set_hcptr operation, mask
|
||||
+ * (hardware reset value is 0). Keep previous value in r2.
|
||||
+ * An ISB is emited on vmexit/vmtrap, but executed on vmexit only if
|
||||
+ * VFP wasn't already enabled (always executed on vmtrap).
|
||||
+ * If a label is specified with vmexit, it is branched to if VFP wasn't
|
||||
+ * enabled.
|
||||
+ */
|
||||
+.macro set_hcptr operation, mask, label = none
|
||||
mrc p15, 4, r2, c1, c1, 2
|
||||
ldr r3, =\mask
|
||||
.if \operation == vmentry
|
||||
@@ -580,6 +585,17 @@ vcpu .req r0 @ vcpu pointer always in r0
|
||||
bic r3, r2, r3 @ Don't trap defined coproc-accesses
|
||||
.endif
|
||||
mcr p15, 4, r3, c1, c1, 2
|
||||
+ .if \operation != vmentry
|
||||
+ .if \operation == vmexit
|
||||
+ tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
+ beq 1f
|
||||
+ .endif
|
||||
+ isb
|
||||
+ .if \label != none
|
||||
+ b \label
|
||||
+ .endif
|
||||
+1:
|
||||
+ .endif
|
||||
.endm
|
||||
|
||||
/* Configures the HDCR (Hyp Debug Configuration Register) on entry/return
|
||||
diff --git a/arch/mips/include/asm/mach-generic/spaces.h b/arch/mips/include/asm/mach-generic/spaces.h
|
||||
index 5b2f2e68e57f..503eb6ca5802 100644
|
||||
--- a/arch/mips/include/asm/mach-generic/spaces.h
|
||||
+++ b/arch/mips/include/asm/mach-generic/spaces.h
|
||||
@@ -90,7 +90,11 @@
|
||||
#endif
|
||||
|
||||
#ifndef FIXADDR_TOP
|
||||
+#ifdef CONFIG_KVM_GUEST
|
||||
+#define FIXADDR_TOP ((unsigned long)(long)(int)0x7ffe0000)
|
||||
+#else
|
||||
#define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000)
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#endif /* __ASM_MACH_GENERIC_SPACES_H */
|
||||
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
|
||||
index 846861a20b07..b63dc809596d 100644
|
||||
--- a/arch/powerpc/perf/core-book3s.c
|
||||
+++ b/arch/powerpc/perf/core-book3s.c
|
||||
@@ -112,7 +112,16 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}
|
||||
|
||||
static bool regs_use_siar(struct pt_regs *regs)
|
||||
{
|
||||
- return !!regs->result;
|
||||
+ /*
|
||||
+ * When we take a performance monitor exception the regs are setup
|
||||
+ * using perf_read_regs() which overloads some fields, in particular
|
||||
+ * regs->result to tell us whether to use SIAR.
|
||||
+ *
|
||||
+ * However if the regs are from another exception, eg. a syscall, then
|
||||
+ * they have not been setup using perf_read_regs() and so regs->result
|
||||
+ * is something random.
|
||||
+ */
|
||||
+ return ((TRAP(regs) == 0xf00) && regs->result);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
|
||||
index fa4c900a0d1f..62983d77455e 100644
|
||||
--- a/arch/sparc/kernel/ldc.c
|
||||
+++ b/arch/sparc/kernel/ldc.c
|
||||
@@ -2306,7 +2306,7 @@ void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len,
|
||||
if (len & (8UL - 1))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
- buf = kzalloc(len, GFP_KERNEL);
|
||||
+ buf = kzalloc(len, GFP_ATOMIC);
|
||||
if (!buf)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
|
||||
index 4c481e751e8e..98b68c2f1a1c 100644
|
||||
--- a/arch/x86/include/asm/kvm_host.h
|
||||
+++ b/arch/x86/include/asm/kvm_host.h
|
||||
@@ -541,7 +541,7 @@ struct kvm_arch {
|
||||
struct kvm_pic *vpic;
|
||||
struct kvm_ioapic *vioapic;
|
||||
struct kvm_pit *vpit;
|
||||
- int vapics_in_nmi_mode;
|
||||
+ atomic_t vapics_in_nmi_mode;
|
||||
struct mutex apic_map_lock;
|
||||
struct kvm_apic_map *apic_map;
|
||||
|
||||
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
|
||||
index 298781d4cfb4..1406ffde3e35 100644
|
||||
--- a/arch/x86/kvm/i8254.c
|
||||
+++ b/arch/x86/kvm/i8254.c
|
||||
@@ -305,7 +305,7 @@ static void pit_do_work(struct kthread_work *work)
|
||||
* LVT0 to NMI delivery. Other PIC interrupts are just sent to
|
||||
* VCPU0, and only if its LVT0 is in EXTINT mode.
|
||||
*/
|
||||
- if (kvm->arch.vapics_in_nmi_mode > 0)
|
||||
+ if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0)
|
||||
kvm_for_each_vcpu(i, vcpu, kvm)
|
||||
kvm_apic_nmi_wd_deliver(vcpu);
|
||||
}
|
||||
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
|
||||
index 681e4e251f00..ff280209d7de 100644
|
||||
--- a/arch/x86/kvm/lapic.c
|
||||
+++ b/arch/x86/kvm/lapic.c
|
||||
@@ -1123,10 +1123,10 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val)
|
||||
if (!nmi_wd_enabled) {
|
||||
apic_debug("Receive NMI setting on APIC_LVT0 "
|
||||
"for cpu %d\n", apic->vcpu->vcpu_id);
|
||||
- apic->vcpu->kvm->arch.vapics_in_nmi_mode++;
|
||||
+ atomic_inc(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
|
||||
}
|
||||
} else if (nmi_wd_enabled)
|
||||
- apic->vcpu->kvm->arch.vapics_in_nmi_mode--;
|
||||
+ atomic_dec(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
|
||||
}
|
||||
|
||||
static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
|
||||
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
|
||||
index 3e724256dbee..a3b0265c2ca7 100644
|
||||
--- a/arch/x86/pci/acpi.c
|
||||
+++ b/arch/x86/pci/acpi.c
|
||||
@@ -84,6 +84,17 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||
},
|
||||
},
|
||||
+ /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/931368 */
|
||||
+ /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1033299 */
|
||||
+ {
|
||||
+ .callback = set_use_crs,
|
||||
+ .ident = "Foxconn K8M890-8237A",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_BOARD_VENDOR, "Foxconn"),
|
||||
+ DMI_MATCH(DMI_BOARD_NAME, "K8M890-8237A"),
|
||||
+ DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||
+ },
|
||||
+ },
|
||||
|
||||
/* Now for the blacklist.. */
|
||||
|
||||
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
|
||||
index 5b2b5e61e4f9..057d894eee66 100644
|
||||
--- a/drivers/crypto/talitos.c
|
||||
+++ b/drivers/crypto/talitos.c
|
||||
@@ -935,7 +935,8 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count,
|
||||
sg_count--;
|
||||
link_tbl_ptr--;
|
||||
}
|
||||
- be16_add_cpu(&link_tbl_ptr->len, cryptlen);
|
||||
+ link_tbl_ptr->len = cpu_to_be16(be16_to_cpu(link_tbl_ptr->len)
|
||||
+ + cryptlen);
|
||||
|
||||
/* tag end of link table */
|
||||
link_tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
|
||||
@@ -2621,6 +2622,7 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
|
||||
+ kfree(t_alg);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
diff --git a/fs/inode.c b/fs/inode.c
|
||||
index 1b300a06b8be..17f95b417955 100644
|
||||
--- a/fs/inode.c
|
||||
+++ b/fs/inode.c
|
||||
@@ -1628,8 +1628,8 @@ int file_remove_suid(struct file *file)
|
||||
error = security_inode_killpriv(dentry);
|
||||
if (!error && killsuid)
|
||||
error = __remove_suid(dentry, killsuid);
|
||||
- if (!error && (inode->i_sb->s_flags & MS_NOSEC))
|
||||
- inode->i_flags |= S_NOSEC;
|
||||
+ if (!error)
|
||||
+ inode_has_no_xattr(inode);
|
||||
|
||||
return error;
|
||||
}
|
||||
diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c
|
||||
index cd8c3a44ab7d..b73eaba85667 100644
|
||||
--- a/net/bridge/br_ioctl.c
|
||||
+++ b/net/bridge/br_ioctl.c
|
||||
@@ -247,9 +247,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
if (!ns_capable(dev_net(dev)->user_ns, CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
- spin_lock_bh(&br->lock);
|
||||
br_stp_set_bridge_priority(br, args[1]);
|
||||
- spin_unlock_bh(&br->lock);
|
||||
return 0;
|
||||
|
||||
case BRCTL_SET_PORT_PRIORITY:
|
||||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||
index 49b4a82d3f86..a09ea178348c 100644
|
||||
--- a/net/bridge/br_multicast.c
|
||||
+++ b/net/bridge/br_multicast.c
|
||||
@@ -1026,6 +1026,9 @@ static void br_multicast_add_router(struct net_bridge *br,
|
||||
struct net_bridge_port *p;
|
||||
struct hlist_node *slot = NULL;
|
||||
|
||||
+ if (!hlist_unhashed(&port->rlist))
|
||||
+ return;
|
||||
+
|
||||
hlist_for_each_entry(p, &br->router_list, rlist) {
|
||||
if ((unsigned long) port >= (unsigned long) p)
|
||||
break;
|
||||
@@ -1053,12 +1056,8 @@ static void br_multicast_mark_router(struct net_bridge *br,
|
||||
if (port->multicast_router != 1)
|
||||
return;
|
||||
|
||||
- if (!hlist_unhashed(&port->rlist))
|
||||
- goto timer;
|
||||
-
|
||||
br_multicast_add_router(br, port);
|
||||
|
||||
-timer:
|
||||
mod_timer(&port->multicast_router_timer,
|
||||
now + br->multicast_querier_interval);
|
||||
}
|
||||
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
|
||||
index 656a6f3e40de..886f6d6dc48a 100644
|
||||
--- a/net/bridge/br_stp_if.c
|
||||
+++ b/net/bridge/br_stp_if.c
|
||||
@@ -241,12 +241,13 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br)
|
||||
return true;
|
||||
}
|
||||
|
||||
-/* called under bridge lock */
|
||||
+/* Acquires and releases bridge lock */
|
||||
void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)
|
||||
{
|
||||
struct net_bridge_port *p;
|
||||
int wasroot;
|
||||
|
||||
+ spin_lock_bh(&br->lock);
|
||||
wasroot = br_is_root_bridge(br);
|
||||
|
||||
list_for_each_entry(p, &br->port_list, list) {
|
||||
@@ -264,6 +265,7 @@ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)
|
||||
br_port_state_selection(br);
|
||||
if (br_is_root_bridge(br) && !wasroot)
|
||||
br_become_root_bridge(br);
|
||||
+ spin_unlock_bh(&br->lock);
|
||||
}
|
||||
|
||||
/* called under bridge lock */
|
||||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
|
||||
index 81b4b816f131..39fa33969b09 100644
|
||||
--- a/net/packet/af_packet.c
|
||||
+++ b/net/packet/af_packet.c
|
||||
@@ -1150,16 +1150,6 @@ static void packet_sock_destruct(struct sock *sk)
|
||||
sk_refcnt_debug_dec(sk);
|
||||
}
|
||||
|
||||
-static int fanout_rr_next(struct packet_fanout *f, unsigned int num)
|
||||
-{
|
||||
- int x = atomic_read(&f->rr_cur) + 1;
|
||||
-
|
||||
- if (x >= num)
|
||||
- x = 0;
|
||||
-
|
||||
- return x;
|
||||
-}
|
||||
-
|
||||
static unsigned int fanout_demux_hash(struct packet_fanout *f,
|
||||
struct sk_buff *skb,
|
||||
unsigned int num)
|
||||
@@ -1171,13 +1161,9 @@ static unsigned int fanout_demux_lb(struct packet_fanout *f,
|
||||
struct sk_buff *skb,
|
||||
unsigned int num)
|
||||
{
|
||||
- int cur, old;
|
||||
+ unsigned int val = atomic_inc_return(&f->rr_cur);
|
||||
|
||||
- cur = atomic_read(&f->rr_cur);
|
||||
- while ((old = atomic_cmpxchg(&f->rr_cur, cur,
|
||||
- fanout_rr_next(f, num))) != cur)
|
||||
- cur = old;
|
||||
- return cur;
|
||||
+ return val % num;
|
||||
}
|
||||
|
||||
static unsigned int fanout_demux_cpu(struct packet_fanout *f,
|
||||
@@ -1217,7 +1203,7 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev)
|
||||
{
|
||||
struct packet_fanout *f = pt->af_packet_priv;
|
||||
- unsigned int num = f->num_members;
|
||||
+ unsigned int num = ACCESS_ONCE(f->num_members);
|
||||
struct packet_sock *po;
|
||||
unsigned int idx;
|
||||
|
||||
diff --git a/net/sctp/output.c b/net/sctp/output.c
|
||||
index 73b8ca51ba14..2d9689333fe4 100644
|
||||
--- a/net/sctp/output.c
|
||||
+++ b/net/sctp/output.c
|
||||
@@ -618,7 +618,9 @@ out:
|
||||
return err;
|
||||
no_route:
|
||||
kfree_skb(nskb);
|
||||
- IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
+
|
||||
+ if (asoc)
|
||||
+ IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
|
||||
/* FIXME: Returning the 'err' will effect all the associations
|
||||
* associated with a socket, although only one of the paths of the
|
2941
patch/kernel/pine64-default/01-patch-3.10.84-85.patch
Normal file
2941
patch/kernel/pine64-default/01-patch-3.10.84-85.patch
Normal file
File diff suppressed because it is too large
Load diff
597
patch/kernel/pine64-default/01-patch-3.10.85-86.patch
Normal file
597
patch/kernel/pine64-default/01-patch-3.10.85-86.patch
Normal file
|
@ -0,0 +1,597 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 11a7e7bc31f2..25ee724c9089 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 85
|
||||
+SUBLEVEL = 86
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h
|
||||
index 2046a89a57cf..78485493639a 100644
|
||||
--- a/arch/arc/include/asm/ptrace.h
|
||||
+++ b/arch/arc/include/asm/ptrace.h
|
||||
@@ -83,7 +83,7 @@ struct callee_regs {
|
||||
long r13;
|
||||
};
|
||||
|
||||
-#define instruction_pointer(regs) ((regs)->ret)
|
||||
+#define instruction_pointer(regs) (unsigned long)((regs)->ret)
|
||||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
|
||||
/* return 1 if user mode or 0 if kernel mode */
|
||||
diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S
|
||||
index 29bd7bec4176..1ecd47b5e250 100644
|
||||
--- a/arch/s390/kernel/sclp.S
|
||||
+++ b/arch/s390/kernel/sclp.S
|
||||
@@ -276,6 +276,8 @@ ENTRY(_sclp_print_early)
|
||||
jno .Lesa2
|
||||
ahi %r15,-80
|
||||
stmh %r6,%r15,96(%r15) # store upper register halves
|
||||
+ basr %r13,0
|
||||
+ lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves
|
||||
.Lesa2:
|
||||
#endif
|
||||
lr %r10,%r2 # save string pointer
|
||||
@@ -299,6 +301,8 @@ ENTRY(_sclp_print_early)
|
||||
#endif
|
||||
lm %r6,%r15,120(%r15) # restore registers
|
||||
br %r14
|
||||
+.Lzeroes:
|
||||
+ .fill 64,4,0
|
||||
|
||||
.LwritedataS4:
|
||||
.long 0x00760005 # SCLP command for write data
|
||||
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
|
||||
index 7a5aa1a7864e..5ebe93676201 100644
|
||||
--- a/arch/tile/kernel/setup.c
|
||||
+++ b/arch/tile/kernel/setup.c
|
||||
@@ -1064,7 +1064,7 @@ static void __init load_hv_initrd(void)
|
||||
|
||||
void __init free_initrd_mem(unsigned long begin, unsigned long end)
|
||||
{
|
||||
- free_bootmem(__pa(begin), end - begin);
|
||||
+ free_bootmem_late(__pa(begin), end - begin);
|
||||
}
|
||||
|
||||
#else
|
||||
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
|
||||
index abb988a54c69..3b28eff9b90b 100644
|
||||
--- a/arch/x86/boot/compressed/head_32.S
|
||||
+++ b/arch/x86/boot/compressed/head_32.S
|
||||
@@ -54,7 +54,7 @@ ENTRY(efi_pe_entry)
|
||||
call reloc
|
||||
reloc:
|
||||
popl %ecx
|
||||
- subl reloc, %ecx
|
||||
+ subl $reloc, %ecx
|
||||
movl %ecx, BP_code32_start(%eax)
|
||||
|
||||
sub $0x4, %esp
|
||||
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
|
||||
index 1ff8e97f853a..8c4e81ac5e75 100644
|
||||
--- a/block/blk-cgroup.c
|
||||
+++ b/block/blk-cgroup.c
|
||||
@@ -720,8 +720,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
||||
return -EINVAL;
|
||||
|
||||
disk = get_gendisk(MKDEV(major, minor), &part);
|
||||
- if (!disk || part)
|
||||
+ if (!disk)
|
||||
return -EINVAL;
|
||||
+ if (part) {
|
||||
+ put_disk(disk);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
rcu_read_lock();
|
||||
spin_lock_irq(disk->queue->queue_lock);
|
||||
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
|
||||
index 7ccc084bf1df..85aa76116a30 100644
|
||||
--- a/drivers/ata/libata-pmp.c
|
||||
+++ b/drivers/ata/libata-pmp.c
|
||||
@@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
|
||||
ATA_LFLAG_NO_SRST |
|
||||
ATA_LFLAG_ASSUME_ATA;
|
||||
}
|
||||
+ } else if (vendor == 0x11ab && devid == 0x4140) {
|
||||
+ /* Marvell 4140 quirks */
|
||||
+ ata_for_each_link(link, ap, EDGE) {
|
||||
+ /* port 4 is for SEMB device and it doesn't like SRST */
|
||||
+ if (link->pmp == 4)
|
||||
+ link->flags |= ATA_LFLAG_DISABLED;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
||||
index 5f87bed05467..20aef5d5a242 100644
|
||||
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
||||
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
||||
@@ -626,6 +626,9 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
+ /* TSC-25 data sheet specifies a delay after the RESET command */
|
||||
+ msleep(150);
|
||||
+
|
||||
/* set coordinate output rate */
|
||||
buf[0] = buf[1] = 0xFF;
|
||||
ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
|
||||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
|
||||
index 86ac4a4ccc01..fa58438b298a 100644
|
||||
--- a/drivers/md/raid1.c
|
||||
+++ b/drivers/md/raid1.c
|
||||
@@ -327,7 +327,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
if (r1_bio->mddev->degraded == conf->raid_disks ||
|
||||
(r1_bio->mddev->degraded == conf->raid_disks-1 &&
|
||||
- !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)))
|
||||
+ test_bit(In_sync, &conf->mirrors[mirror].rdev->flags)))
|
||||
uptodate = 1;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
}
|
||||
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
|
||||
index d25f9ab9a54d..d33bb9522416 100644
|
||||
--- a/drivers/mmc/host/sdhci-esdhc.h
|
||||
+++ b/drivers/mmc/host/sdhci-esdhc.h
|
||||
@@ -40,7 +40,7 @@
|
||||
#define ESDHC_DMA_SYSCTL 0x40c
|
||||
#define ESDHC_DMA_SNOOP 0x00000040
|
||||
|
||||
-#define ESDHC_HOST_CONTROL_RES 0x05
|
||||
+#define ESDHC_HOST_CONTROL_RES 0x01
|
||||
|
||||
static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
{
|
||||
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
|
||||
index 4edb24bf56f8..c24fbc574cf1 100644
|
||||
--- a/drivers/mmc/host/sdhci-pxav3.c
|
||||
+++ b/drivers/mmc/host/sdhci-pxav3.c
|
||||
@@ -255,6 +255,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
|
||||
mmc_of_parse(host->mmc);
|
||||
sdhci_get_of_property(pdev);
|
||||
pdata = pxav3_get_mmc_pdata(dev);
|
||||
+ pdev->dev.platform_data = pdata;
|
||||
} else if (pdata) {
|
||||
/* on-chip device */
|
||||
if (pdata->flags & PXA_FLAG_CARD_PERMANENT)
|
||||
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
|
||||
index 2a32036a9404..fa9811200c9d 100644
|
||||
--- a/drivers/scsi/st.c
|
||||
+++ b/drivers/scsi/st.c
|
||||
@@ -1262,9 +1262,9 @@ static int st_open(struct inode *inode, struct file *filp)
|
||||
spin_lock(&st_use_lock);
|
||||
STp->in_use = 0;
|
||||
spin_unlock(&st_use_lock);
|
||||
- scsi_tape_put(STp);
|
||||
if (resumed)
|
||||
scsi_autopm_put_device(STp->device);
|
||||
+ scsi_tape_put(STp);
|
||||
return retval;
|
||||
|
||||
}
|
||||
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
|
||||
index 3c293ad6ae70..efca110342cb 100644
|
||||
--- a/drivers/target/iscsi/iscsi_target.c
|
||||
+++ b/drivers/target/iscsi/iscsi_target.c
|
||||
@@ -4416,7 +4416,18 @@ static void iscsit_logout_post_handler_closesession(
|
||||
struct iscsi_conn *conn)
|
||||
{
|
||||
struct iscsi_session *sess = conn->sess;
|
||||
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
||||
+ int sleep = 1;
|
||||
+ /*
|
||||
+ * Traditional iscsi/tcp will invoke this logic from TX thread
|
||||
+ * context during session logout, so clear tx_thread_active and
|
||||
+ * sleep if iscsit_close_connection() has not already occured.
|
||||
+ *
|
||||
+ * Since iser-target invokes this logic from it's own workqueue,
|
||||
+ * always sleep waiting for RX/TX thread shutdown to complete
|
||||
+ * within iscsit_close_connection().
|
||||
+ */
|
||||
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
||||
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
||||
|
||||
atomic_set(&conn->conn_logout_remove, 0);
|
||||
complete(&conn->conn_logout_comp);
|
||||
@@ -4430,7 +4441,10 @@ static void iscsit_logout_post_handler_closesession(
|
||||
static void iscsit_logout_post_handler_samecid(
|
||||
struct iscsi_conn *conn)
|
||||
{
|
||||
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
||||
+ int sleep = 1;
|
||||
+
|
||||
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
||||
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
||||
|
||||
atomic_set(&conn->conn_logout_remove, 0);
|
||||
complete(&conn->conn_logout_comp);
|
||||
@@ -4649,6 +4663,7 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
||||
struct iscsi_session *sess;
|
||||
struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
|
||||
struct se_session *se_sess, *se_sess_tmp;
|
||||
+ LIST_HEAD(free_list);
|
||||
int session_count = 0;
|
||||
|
||||
spin_lock_bh(&se_tpg->session_lock);
|
||||
@@ -4670,14 +4685,17 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
||||
}
|
||||
atomic_set(&sess->session_reinstatement, 1);
|
||||
spin_unlock(&sess->conn_lock);
|
||||
- spin_unlock_bh(&se_tpg->session_lock);
|
||||
|
||||
- iscsit_free_session(sess);
|
||||
- spin_lock_bh(&se_tpg->session_lock);
|
||||
+ list_move_tail(&se_sess->sess_list, &free_list);
|
||||
+ }
|
||||
+ spin_unlock_bh(&se_tpg->session_lock);
|
||||
|
||||
+ list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
|
||||
+ sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
|
||||
+
|
||||
+ iscsit_free_session(sess);
|
||||
session_count++;
|
||||
}
|
||||
- spin_unlock_bh(&se_tpg->session_lock);
|
||||
|
||||
pr_debug("Released %d iSCSI Session(s) from Target Portal"
|
||||
" Group: %hu\n", session_count, tpg->tpgt);
|
||||
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
|
||||
index d939376c5dee..0f71c3a22507 100644
|
||||
--- a/drivers/usb/host/xhci-hub.c
|
||||
+++ b/drivers/usb/host/xhci-hub.c
|
||||
@@ -468,10 +468,13 @@ static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
|
||||
u32 pls = status_reg & PORT_PLS_MASK;
|
||||
|
||||
/* resume state is a xHCI internal state.
|
||||
- * Do not report it to usb core.
|
||||
+ * Do not report it to usb core, instead, pretend to be U3,
|
||||
+ * thus usb core knows it's not ready for transfer
|
||||
*/
|
||||
- if (pls == XDEV_RESUME)
|
||||
+ if (pls == XDEV_RESUME) {
|
||||
+ *status |= USB_SS_PORT_LS_U3;
|
||||
return;
|
||||
+ }
|
||||
|
||||
/* When the CAS bit is set then warm reset
|
||||
* should be performed on port
|
||||
@@ -1045,10 +1048,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
|
||||
if (hcd->self.root_hub->do_remote_wakeup) {
|
||||
- if (bus_state->resuming_ports) {
|
||||
+ if (bus_state->resuming_ports || /* USB2 */
|
||||
+ bus_state->port_remote_wakeup) { /* USB3 */
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
- xhci_dbg(xhci, "suspend failed because "
|
||||
- "a port is resuming\n");
|
||||
+ xhci_dbg(xhci, "suspend failed because a port is resuming\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
|
||||
index 30533952b4a3..95fe1a432d29 100644
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -1669,6 +1669,9 @@ static void handle_port_status(struct xhci_hcd *xhci,
|
||||
usb_hcd_resume_root_hub(hcd);
|
||||
}
|
||||
|
||||
+ if (hcd->speed == HCD_USB3 && (temp & PORT_PLS_MASK) == XDEV_INACTIVE)
|
||||
+ bus_state->port_remote_wakeup &= ~(1 << faked_port_index);
|
||||
+
|
||||
if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) {
|
||||
xhci_dbg(xhci, "port resume event for port %d\n", port_id);
|
||||
|
||||
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
||||
index 10223f2b18d2..1f901fc25590 100644
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -3356,6 +3356,9 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (virt_dev->tt_info)
|
||||
+ old_active_eps = virt_dev->tt_info->active_eps;
|
||||
+
|
||||
if (virt_dev->udev != udev) {
|
||||
/* If the virt_dev and the udev does not match, this virt_dev
|
||||
* may belong to another udev.
|
||||
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
|
||||
index ed8de724b285..deb2537ae75c 100644
|
||||
--- a/drivers/usb/host/xhci.h
|
||||
+++ b/drivers/usb/host/xhci.h
|
||||
@@ -280,6 +280,7 @@ struct xhci_op_regs {
|
||||
#define XDEV_U0 (0x0 << 5)
|
||||
#define XDEV_U2 (0x2 << 5)
|
||||
#define XDEV_U3 (0x3 << 5)
|
||||
+#define XDEV_INACTIVE (0x6 << 5)
|
||||
#define XDEV_RESUME (0xf << 5)
|
||||
/* true: port has power (see HCC_PPC) */
|
||||
#define PORT_POWER (1 << 9)
|
||||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
|
||||
index 821e1e2f70f6..da380a99c6b8 100644
|
||||
--- a/drivers/usb/storage/unusual_devs.h
|
||||
+++ b/drivers/usb/storage/unusual_devs.h
|
||||
@@ -2032,6 +2032,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_READ_DISC_INFO ),
|
||||
|
||||
+/* Reported by Oliver Neukum <oneukum@suse.com>
|
||||
+ * This device morphes spontaneously into another device if the access
|
||||
+ * pattern of Windows isn't followed. Thus writable media would be dirty
|
||||
+ * if the initial instance is used. So the device is limited to its
|
||||
+ * virtual CD.
|
||||
+ * And yes, the concept that BCD goes up to 9 is not heeded */
|
||||
+UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff,
|
||||
+ "ZTE,Incorporated",
|
||||
+ "ZTE WCDMA Technologies MSM",
|
||||
+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
+ US_FL_SINGLE_LUN ),
|
||||
+
|
||||
/* Reported by Sven Geggus <sven-usbst@geggus.net>
|
||||
* This encrypted pen drive returns bogus data for the initial READ(10).
|
||||
*/
|
||||
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
|
||||
index 60aa5ad09a2f..3aabc652f1b9 100644
|
||||
--- a/drivers/vhost/vhost.c
|
||||
+++ b/drivers/vhost/vhost.c
|
||||
@@ -855,6 +855,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
|
||||
}
|
||||
if (eventfp != d->log_file) {
|
||||
filep = d->log_file;
|
||||
+ d->log_file = eventfp;
|
||||
ctx = d->log_ctx;
|
||||
d->log_ctx = eventfp ?
|
||||
eventfd_ctx_fileget(eventfp) : NULL;
|
||||
diff --git a/fs/dcache.c b/fs/dcache.c
|
||||
index 38c4a302fab4..90be2809e15a 100644
|
||||
--- a/fs/dcache.c
|
||||
+++ b/fs/dcache.c
|
||||
@@ -520,6 +520,9 @@ repeat:
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
|
||||
+ goto kill_it;
|
||||
+
|
||||
if (dentry->d_flags & DCACHE_OP_DELETE) {
|
||||
if (dentry->d_op->d_delete(dentry))
|
||||
goto kill_it;
|
||||
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c
|
||||
index 9065107f083e..7a5237a1bce5 100644
|
||||
--- a/kernel/irq/resend.c
|
||||
+++ b/kernel/irq/resend.c
|
||||
@@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
|
||||
!desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
|
||||
#ifdef CONFIG_HARDIRQS_SW_RESEND
|
||||
/*
|
||||
- * If the interrupt has a parent irq and runs
|
||||
- * in the thread context of the parent irq,
|
||||
- * retrigger the parent.
|
||||
+ * If the interrupt is running in the thread
|
||||
+ * context of the parent irq we need to be
|
||||
+ * careful, because we cannot trigger it
|
||||
+ * directly.
|
||||
*/
|
||||
- if (desc->parent_irq &&
|
||||
- irq_settings_is_nested_thread(desc))
|
||||
+ if (irq_settings_is_nested_thread(desc)) {
|
||||
+ /*
|
||||
+ * If the parent_irq is valid, we
|
||||
+ * retrigger the parent, otherwise we
|
||||
+ * do nothing.
|
||||
+ */
|
||||
+ if (!desc->parent_irq)
|
||||
+ return;
|
||||
irq = desc->parent_irq;
|
||||
+ }
|
||||
/* Set it pending and activate the softirq: */
|
||||
set_bit(irq, irqs_resend);
|
||||
tasklet_schedule(&resend_tasklet);
|
||||
diff --git a/mm/memory.c b/mm/memory.c
|
||||
index e6b1da3a8924..30bf9cce8c2b 100644
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -3230,6 +3230,10 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
|
||||
pte_unmap(page_table);
|
||||
|
||||
+ /* File mapping without ->vm_ops ? */
|
||||
+ if (vma->vm_flags & VM_SHARED)
|
||||
+ return VM_FAULT_SIGBUS;
|
||||
+
|
||||
/* Check if we need to add a guard page to the stack */
|
||||
if (check_stack_guard_page(vma, address) < 0)
|
||||
return VM_FAULT_SIGSEGV;
|
||||
@@ -3495,6 +3499,9 @@ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
- vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
|
||||
|
||||
pte_unmap(page_table);
|
||||
+ /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */
|
||||
+ if (!vma->vm_ops->fault)
|
||||
+ return VM_FAULT_SIGBUS;
|
||||
return __do_fault(mm, vma, address, pmd, pgoff, flags, orig_pte);
|
||||
}
|
||||
|
||||
@@ -3706,11 +3713,9 @@ int handle_pte_fault(struct mm_struct *mm,
|
||||
entry = *pte;
|
||||
if (!pte_present(entry)) {
|
||||
if (pte_none(entry)) {
|
||||
- if (vma->vm_ops) {
|
||||
- if (likely(vma->vm_ops->fault))
|
||||
- return do_linear_fault(mm, vma, address,
|
||||
+ if (vma->vm_ops)
|
||||
+ return do_linear_fault(mm, vma, address,
|
||||
pte, pmd, flags, entry);
|
||||
- }
|
||||
return do_anonymous_page(mm, vma, address,
|
||||
pte, pmd, flags);
|
||||
}
|
||||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
|
||||
index 2d5b4f65c519..32bafdbdfd66 100644
|
||||
--- a/net/mac80211/debugfs_netdev.c
|
||||
+++ b/net/mac80211/debugfs_netdev.c
|
||||
@@ -697,6 +697,7 @@ void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
debugfs_remove_recursive(sdata->vif.debugfs_dir);
|
||||
sdata->vif.debugfs_dir = NULL;
|
||||
+ sdata->debugfs.subdir_stations = NULL;
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata)
|
||||
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
|
||||
index e8fdb172adbb..a985158d95d5 100644
|
||||
--- a/net/rds/ib_rdma.c
|
||||
+++ b/net/rds/ib_rdma.c
|
||||
@@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
|
||||
}
|
||||
|
||||
ibmr = rds_ib_alloc_fmr(rds_ibdev);
|
||||
- if (IS_ERR(ibmr))
|
||||
+ if (IS_ERR(ibmr)) {
|
||||
+ rds_ib_dev_put(rds_ibdev);
|
||||
return ibmr;
|
||||
+ }
|
||||
|
||||
ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents);
|
||||
if (ret == 0)
|
||||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
||||
index a82d6576fe0f..d30252e7f3e8 100644
|
||||
--- a/sound/pci/hda/patch_realtek.c
|
||||
+++ b/sound/pci/hda/patch_realtek.c
|
||||
@@ -2204,7 +2204,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
|
||||
- SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
|
||||
+ SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
|
||||
|
||||
SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
|
||||
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
||||
index d06fbd9f7cbe..2d17f40fb16d 100644
|
||||
--- a/sound/usb/mixer_maps.c
|
||||
+++ b/sound/usb/mixer_maps.c
|
||||
@@ -330,6 +330,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
+/* Bose companion 5, the dB conversion factor is 16 instead of 256 */
|
||||
+static struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
|
||||
+static struct usbmix_name_map bose_companion5_map[] = {
|
||||
+ { 3, NULL, .dB = &bose_companion5_dB },
|
||||
+ { 0 } /* terminator */
|
||||
+};
|
||||
+
|
||||
+/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */
|
||||
+static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000};
|
||||
+static struct usbmix_name_map dragonfly_1_2_map[] = {
|
||||
+ { 7, NULL, .dB = &dragonfly_1_2_dB },
|
||||
+ { 0 } /* terminator */
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Control map entries
|
||||
*/
|
||||
@@ -432,6 +446,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||
.id = USB_ID(0x25c4, 0x0003),
|
||||
.map = scms_usb3318_map,
|
||||
},
|
||||
+ {
|
||||
+ /* Bose Companion 5 */
|
||||
+ .id = USB_ID(0x05a7, 0x1020),
|
||||
+ .map = bose_companion5_map,
|
||||
+ },
|
||||
+ {
|
||||
+ /* Dragonfly DAC 1.2 */
|
||||
+ .id = USB_ID(0x21b4, 0x0081),
|
||||
+ .map = dragonfly_1_2_map,
|
||||
+ },
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
|
||||
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
|
||||
index d5bed1d25713..45d586b6e8b5 100644
|
||||
--- a/sound/usb/quirks-table.h
|
||||
+++ b/sound/usb/quirks-table.h
|
||||
@@ -2773,6 +2773,74 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
}
|
||||
},
|
||||
|
||||
+/* Steinberg devices */
|
||||
+{
|
||||
+ /* Steinberg MI2 */
|
||||
+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040),
|
||||
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
+ .ifnum = QUIRK_ANY_INTERFACE,
|
||||
+ .type = QUIRK_COMPOSITE,
|
||||
+ .data = & (const struct snd_usb_audio_quirk[]) {
|
||||
+ {
|
||||
+ .ifnum = 0,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 1,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 2,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 3,
|
||||
+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
|
||||
+ .data = &(const struct snd_usb_midi_endpoint_info) {
|
||||
+ .out_cables = 0x0001,
|
||||
+ .in_cables = 0x0001
|
||||
+ }
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = -1
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+},
|
||||
+{
|
||||
+ /* Steinberg MI4 */
|
||||
+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040),
|
||||
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
+ .ifnum = QUIRK_ANY_INTERFACE,
|
||||
+ .type = QUIRK_COMPOSITE,
|
||||
+ .data = & (const struct snd_usb_audio_quirk[]) {
|
||||
+ {
|
||||
+ .ifnum = 0,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 1,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 2,
|
||||
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = 3,
|
||||
+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
|
||||
+ .data = &(const struct snd_usb_midi_endpoint_info) {
|
||||
+ .out_cables = 0x0001,
|
||||
+ .in_cables = 0x0001
|
||||
+ }
|
||||
+ },
|
||||
+ {
|
||||
+ .ifnum = -1
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+},
|
||||
+
|
||||
/* TerraTec devices */
|
||||
{
|
||||
USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
|
1317
patch/kernel/pine64-default/01-patch-3.10.86-87.patch
Normal file
1317
patch/kernel/pine64-default/01-patch-3.10.86-87.patch
Normal file
File diff suppressed because it is too large
Load diff
285
patch/kernel/pine64-default/01-patch-3.10.87-88.patch
Normal file
285
patch/kernel/pine64-default/01-patch-3.10.87-88.patch
Normal file
|
@ -0,0 +1,285 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 0d4fd6427349..e94ce68ecf87 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 87
|
||||
+SUBLEVEL = 88
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm64/mm/mmap.c b/arch/arm64/mm/mmap.c
|
||||
index 7c7be7855638..8aaf073ee078 100644
|
||||
--- a/arch/arm64/mm/mmap.c
|
||||
+++ b/arch/arm64/mm/mmap.c
|
||||
@@ -47,22 +47,14 @@ static int mmap_is_legacy(void)
|
||||
return sysctl_legacy_va_layout;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Since get_random_int() returns the same value within a 1 jiffy window, we
|
||||
- * will almost always get the same randomisation for the stack and mmap
|
||||
- * region. This will mean the relative distance between stack and mmap will be
|
||||
- * the same.
|
||||
- *
|
||||
- * To avoid this we can shift the randomness by 1 bit.
|
||||
- */
|
||||
static unsigned long mmap_rnd(void)
|
||||
{
|
||||
unsigned long rnd = 0;
|
||||
|
||||
if (current->flags & PF_RANDOMIZE)
|
||||
- rnd = (long)get_random_int() & (STACK_RND_MASK >> 1);
|
||||
+ rnd = (long)get_random_int() & STACK_RND_MASK;
|
||||
|
||||
- return rnd << (PAGE_SHIFT + 1);
|
||||
+ return rnd << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static unsigned long mmap_base(void)
|
||||
diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c
|
||||
index 84573b4d6f92..dda43cc4b6cd 100644
|
||||
--- a/drivers/crypto/caam/caamhash.c
|
||||
+++ b/drivers/crypto/caam/caamhash.c
|
||||
@@ -895,13 +895,14 @@ static int ahash_final_ctx(struct ahash_request *req)
|
||||
state->buflen_1;
|
||||
u32 *sh_desc = ctx->sh_desc_fin, *desc;
|
||||
dma_addr_t ptr = ctx->sh_desc_fin_dma;
|
||||
- int sec4_sg_bytes;
|
||||
+ int sec4_sg_bytes, sec4_sg_src_index;
|
||||
int digestsize = crypto_ahash_digestsize(ahash);
|
||||
struct ahash_edesc *edesc;
|
||||
int ret = 0;
|
||||
int sh_len;
|
||||
|
||||
- sec4_sg_bytes = (1 + (buflen ? 1 : 0)) * sizeof(struct sec4_sg_entry);
|
||||
+ sec4_sg_src_index = 1 + (buflen ? 1 : 0);
|
||||
+ sec4_sg_bytes = sec4_sg_src_index * sizeof(struct sec4_sg_entry);
|
||||
|
||||
/* allocate space for base edesc and hw desc commands, link tables */
|
||||
edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
|
||||
@@ -928,7 +929,7 @@ static int ahash_final_ctx(struct ahash_request *req)
|
||||
state->buf_dma = try_buf_map_to_sec4_sg(jrdev, edesc->sec4_sg + 1,
|
||||
buf, state->buf_dma, buflen,
|
||||
last_buflen);
|
||||
- (edesc->sec4_sg + sec4_sg_bytes - 1)->len |= SEC4_SG_LEN_FIN;
|
||||
+ (edesc->sec4_sg + sec4_sg_src_index - 1)->len |= SEC4_SG_LEN_FIN;
|
||||
|
||||
append_seq_in_ptr(desc, edesc->sec4_sg_dma, ctx->ctx_len + buflen,
|
||||
LDST_SGF);
|
||||
diff --git a/drivers/edac/ppc4xx_edac.c b/drivers/edac/ppc4xx_edac.c
|
||||
index ef6b7e08f485..5c361f3c66aa 100644
|
||||
--- a/drivers/edac/ppc4xx_edac.c
|
||||
+++ b/drivers/edac/ppc4xx_edac.c
|
||||
@@ -921,7 +921,7 @@ static int ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1)
|
||||
*/
|
||||
|
||||
for (row = 0; row < mci->nr_csrows; row++) {
|
||||
- struct csrow_info *csi = &mci->csrows[row];
|
||||
+ struct csrow_info *csi = mci->csrows[row];
|
||||
|
||||
/*
|
||||
* Get the configuration settings for this
|
||||
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c
|
||||
index 3b1503dc1f13..43f6250baadd 100644
|
||||
--- a/drivers/md/dm-thin-metadata.c
|
||||
+++ b/drivers/md/dm-thin-metadata.c
|
||||
@@ -1281,8 +1281,8 @@ static int __release_metadata_snap(struct dm_pool_metadata *pmd)
|
||||
return r;
|
||||
|
||||
disk_super = dm_block_data(copy);
|
||||
- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->data_mapping_root));
|
||||
- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->device_details_root));
|
||||
+ dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root));
|
||||
+ dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root));
|
||||
dm_sm_dec_block(pmd->metadata_sm, held_root);
|
||||
|
||||
return dm_tm_unlock(pmd->tm, copy);
|
||||
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
|
||||
index 09c81b2f2169..42c46dc19537 100644
|
||||
--- a/drivers/scsi/libfc/fc_fcp.c
|
||||
+++ b/drivers/scsi/libfc/fc_fcp.c
|
||||
@@ -1039,11 +1039,26 @@ restart:
|
||||
fc_fcp_pkt_hold(fsp);
|
||||
spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
|
||||
|
||||
- if (!fc_fcp_lock_pkt(fsp)) {
|
||||
+ spin_lock_bh(&fsp->scsi_pkt_lock);
|
||||
+ if (!(fsp->state & FC_SRB_COMPL)) {
|
||||
+ fsp->state |= FC_SRB_COMPL;
|
||||
+ /*
|
||||
+ * TODO: dropping scsi_pkt_lock and then reacquiring
|
||||
+ * again around fc_fcp_cleanup_cmd() is required,
|
||||
+ * since fc_fcp_cleanup_cmd() calls into
|
||||
+ * fc_seq_set_resp() and that func preempts cpu using
|
||||
+ * schedule. May be schedule and related code should be
|
||||
+ * removed instead of unlocking here to avoid scheduling
|
||||
+ * while atomic bug.
|
||||
+ */
|
||||
+ spin_unlock_bh(&fsp->scsi_pkt_lock);
|
||||
+
|
||||
fc_fcp_cleanup_cmd(fsp, error);
|
||||
+
|
||||
+ spin_lock_bh(&fsp->scsi_pkt_lock);
|
||||
fc_io_compl(fsp);
|
||||
- fc_fcp_unlock_pkt(fsp);
|
||||
}
|
||||
+ spin_unlock_bh(&fsp->scsi_pkt_lock);
|
||||
|
||||
fc_fcp_pkt_release(fsp);
|
||||
spin_lock_irqsave(&si->scsi_queue_lock, flags);
|
||||
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
|
||||
index d7b717090f2f..2b5c3bc3b081 100644
|
||||
--- a/include/drm/drm_pciids.h
|
||||
+++ b/include/drm/drm_pciids.h
|
||||
@@ -150,6 +150,7 @@
|
||||
{0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
+ {0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
diff --git a/ipc/sem.c b/ipc/sem.c
|
||||
index db9d241af133..47a15192b8b8 100644
|
||||
--- a/ipc/sem.c
|
||||
+++ b/ipc/sem.c
|
||||
@@ -253,6 +253,16 @@ static void sem_rcu_free(struct rcu_head *head)
|
||||
}
|
||||
|
||||
/*
|
||||
+ * spin_unlock_wait() and !spin_is_locked() are not memory barriers, they
|
||||
+ * are only control barriers.
|
||||
+ * The code must pair with spin_unlock(&sem->lock) or
|
||||
+ * spin_unlock(&sem_perm.lock), thus just the control barrier is insufficient.
|
||||
+ *
|
||||
+ * smp_rmb() is sufficient, as writes cannot pass the control barrier.
|
||||
+ */
|
||||
+#define ipc_smp_acquire__after_spin_is_unlocked() smp_rmb()
|
||||
+
|
||||
+/*
|
||||
* Wait until all currently ongoing simple ops have completed.
|
||||
* Caller must own sem_perm.lock.
|
||||
* New simple ops cannot start, because simple ops first check
|
||||
@@ -275,6 +285,7 @@ static void sem_wait_array(struct sem_array *sma)
|
||||
sem = sma->sem_base + i;
|
||||
spin_unlock_wait(&sem->lock);
|
||||
}
|
||||
+ ipc_smp_acquire__after_spin_is_unlocked();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -326,8 +337,13 @@ static inline int sem_lock(struct sem_array *sma, struct sembuf *sops,
|
||||
|
||||
/* Then check that the global lock is free */
|
||||
if (!spin_is_locked(&sma->sem_perm.lock)) {
|
||||
- /* spin_is_locked() is not a memory barrier */
|
||||
- smp_mb();
|
||||
+ /*
|
||||
+ * We need a memory barrier with acquire semantics,
|
||||
+ * otherwise we can race with another thread that does:
|
||||
+ * complex_count++;
|
||||
+ * spin_unlock(sem_perm.lock);
|
||||
+ */
|
||||
+ ipc_smp_acquire__after_spin_is_unlocked();
|
||||
|
||||
/* Now repeat the test of complex_count:
|
||||
* It can't change anymore until we drop sem->lock.
|
||||
@@ -2049,17 +2065,28 @@ void exit_sem(struct task_struct *tsk)
|
||||
rcu_read_lock();
|
||||
un = list_entry_rcu(ulp->list_proc.next,
|
||||
struct sem_undo, list_proc);
|
||||
- if (&un->list_proc == &ulp->list_proc)
|
||||
- semid = -1;
|
||||
- else
|
||||
- semid = un->semid;
|
||||
+ if (&un->list_proc == &ulp->list_proc) {
|
||||
+ /*
|
||||
+ * We must wait for freeary() before freeing this ulp,
|
||||
+ * in case we raced with last sem_undo. There is a small
|
||||
+ * possibility where we exit while freeary() didn't
|
||||
+ * finish unlocking sem_undo_list.
|
||||
+ */
|
||||
+ spin_unlock_wait(&ulp->lock);
|
||||
+ rcu_read_unlock();
|
||||
+ break;
|
||||
+ }
|
||||
+ spin_lock(&ulp->lock);
|
||||
+ semid = un->semid;
|
||||
+ spin_unlock(&ulp->lock);
|
||||
|
||||
+ /* exit_sem raced with IPC_RMID, nothing to do */
|
||||
if (semid == -1) {
|
||||
rcu_read_unlock();
|
||||
- break;
|
||||
+ continue;
|
||||
}
|
||||
|
||||
- sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, un->semid);
|
||||
+ sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, semid);
|
||||
/* exit_sem raced with IPC_RMID, nothing to do */
|
||||
if (IS_ERR(sma)) {
|
||||
rcu_read_unlock();
|
||||
diff --git a/kernel/events/core.c b/kernel/events/core.c
|
||||
index 7daf52c340cd..d9b0aad17dbf 100644
|
||||
--- a/kernel/events/core.c
|
||||
+++ b/kernel/events/core.c
|
||||
@@ -3993,12 +3993,20 @@ static const struct file_operations perf_fops = {
|
||||
* to user-space before waking everybody up.
|
||||
*/
|
||||
|
||||
+static inline struct fasync_struct **perf_event_fasync(struct perf_event *event)
|
||||
+{
|
||||
+ /* only the parent has fasync state */
|
||||
+ if (event->parent)
|
||||
+ event = event->parent;
|
||||
+ return &event->fasync;
|
||||
+}
|
||||
+
|
||||
void perf_event_wakeup(struct perf_event *event)
|
||||
{
|
||||
ring_buffer_wakeup(event);
|
||||
|
||||
if (event->pending_kill) {
|
||||
- kill_fasync(&event->fasync, SIGIO, event->pending_kill);
|
||||
+ kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill);
|
||||
event->pending_kill = 0;
|
||||
}
|
||||
}
|
||||
@@ -5153,7 +5161,7 @@ static int __perf_event_overflow(struct perf_event *event,
|
||||
else
|
||||
perf_event_output(event, data, regs);
|
||||
|
||||
- if (event->fasync && event->pending_kill) {
|
||||
+ if (*perf_event_fasync(event) && event->pending_kill) {
|
||||
event->pending_wakeup = 1;
|
||||
irq_work_queue(&event->pending);
|
||||
}
|
||||
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
||||
index ca96f411b034..f97d709594e6 100644
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1473,6 +1473,8 @@ static int get_any_page(struct page *page, unsigned long pfn, int flags)
|
||||
*/
|
||||
ret = __get_any_page(page, pfn, 0);
|
||||
if (!PageLRU(page)) {
|
||||
+ /* Drop page reference which is from __get_any_page() */
|
||||
+ put_page(page);
|
||||
pr_info("soft_offline: %#lx: unknown non LRU page type %lx\n",
|
||||
pfn, page->flags);
|
||||
return -EIO;
|
||||
diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl
|
||||
index 4606cdfb859d..7dd7c391b4d8 100644
|
||||
--- a/scripts/kconfig/streamline_config.pl
|
||||
+++ b/scripts/kconfig/streamline_config.pl
|
||||
@@ -137,7 +137,7 @@ my $ksource = ($ARGV[0] ? $ARGV[0] : '.');
|
||||
my $kconfig = $ARGV[1];
|
||||
my $lsmod_file = $ENV{'LSMOD'};
|
||||
|
||||
-my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
|
||||
+my @makefiles = `find $ksource -name Makefile -or -name Kbuild 2>/dev/null`;
|
||||
chomp @makefiles;
|
||||
|
||||
my %depends;
|
661
patch/kernel/pine64-default/01-patch-3.10.88-89.patch
Normal file
661
patch/kernel/pine64-default/01-patch-3.10.88-89.patch
Normal file
|
@ -0,0 +1,661 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index e94ce68ecf87..ca82393e1eea 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 88
|
||||
+SUBLEVEL = 89
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c
|
||||
index a8d6f69f92a3..4bcf841e4701 100644
|
||||
--- a/arch/x86/crypto/ghash-clmulni-intel_glue.c
|
||||
+++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c
|
||||
@@ -291,6 +291,7 @@ static struct ahash_alg ghash_async_alg = {
|
||||
.cra_name = "ghash",
|
||||
.cra_driver_name = "ghash-clmulni",
|
||||
.cra_priority = 400,
|
||||
+ .cra_ctxsize = sizeof(struct ghash_async_ctx),
|
||||
.cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_ASYNC,
|
||||
.cra_blocksize = GHASH_BLOCK_SIZE,
|
||||
.cra_type = &crypto_ahash_type,
|
||||
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
|
||||
index 136224b74d4f..81250ece3062 100644
|
||||
--- a/arch/xtensa/Makefile
|
||||
+++ b/arch/xtensa/Makefile
|
||||
@@ -55,10 +55,10 @@ ifneq ($(CONFIG_LD_NO_RELAX),)
|
||||
LDFLAGS := --no-relax
|
||||
endif
|
||||
|
||||
-ifeq ($(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#"),1)
|
||||
+ifeq ($(shell echo __XTENSA_EB__ | $(CC) -E - | grep -v "\#"),1)
|
||||
CHECKFLAGS += -D__XTENSA_EB__
|
||||
endif
|
||||
-ifeq ($(shell echo -e __XTENSA_EL__ | $(CC) -E - | grep -v "\#"),1)
|
||||
+ifeq ($(shell echo __XTENSA_EL__ | $(CC) -E - | grep -v "\#"),1)
|
||||
CHECKFLAGS += -D__XTENSA_EL__
|
||||
endif
|
||||
|
||||
diff --git a/arch/xtensa/boot/Makefile b/arch/xtensa/boot/Makefile
|
||||
index 64ffc4b53df6..ca20a892021b 100644
|
||||
--- a/arch/xtensa/boot/Makefile
|
||||
+++ b/arch/xtensa/boot/Makefile
|
||||
@@ -12,7 +12,7 @@
|
||||
KBUILD_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include
|
||||
HOSTFLAGS += -Iarch/$(ARCH)/boot/include
|
||||
|
||||
-BIG_ENDIAN := $(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#")
|
||||
+BIG_ENDIAN := $(shell echo __XTENSA_EB__ | $(CC) -E - | grep -v "\#")
|
||||
|
||||
export ccflags-y
|
||||
export BIG_ENDIAN
|
||||
diff --git a/arch/xtensa/include/asm/traps.h b/arch/xtensa/include/asm/traps.h
|
||||
index f2faa58f9a43..03d02df47b9a 100644
|
||||
--- a/arch/xtensa/include/asm/traps.h
|
||||
+++ b/arch/xtensa/include/asm/traps.h
|
||||
@@ -24,30 +24,39 @@ static inline void spill_registers(void)
|
||||
{
|
||||
#if XCHAL_NUM_AREGS > 16
|
||||
__asm__ __volatile__ (
|
||||
- " call12 1f\n"
|
||||
+ " call8 1f\n"
|
||||
" _j 2f\n"
|
||||
" retw\n"
|
||||
" .align 4\n"
|
||||
"1:\n"
|
||||
+#if XCHAL_NUM_AREGS == 32
|
||||
+ " _entry a1, 32\n"
|
||||
+ " addi a8, a0, 3\n"
|
||||
+ " _entry a1, 16\n"
|
||||
+ " mov a12, a12\n"
|
||||
+ " retw\n"
|
||||
+#else
|
||||
" _entry a1, 48\n"
|
||||
- " addi a12, a0, 3\n"
|
||||
-#if XCHAL_NUM_AREGS > 32
|
||||
- " .rept (" __stringify(XCHAL_NUM_AREGS) " - 32) / 12\n"
|
||||
+ " call12 1f\n"
|
||||
+ " retw\n"
|
||||
+ " .align 4\n"
|
||||
+ "1:\n"
|
||||
+ " .rept (" __stringify(XCHAL_NUM_AREGS) " - 16) / 12\n"
|
||||
" _entry a1, 48\n"
|
||||
" mov a12, a0\n"
|
||||
" .endr\n"
|
||||
-#endif
|
||||
- " _entry a1, 48\n"
|
||||
+ " _entry a1, 16\n"
|
||||
#if XCHAL_NUM_AREGS % 12 == 0
|
||||
- " mov a8, a8\n"
|
||||
-#elif XCHAL_NUM_AREGS % 12 == 4
|
||||
" mov a12, a12\n"
|
||||
-#elif XCHAL_NUM_AREGS % 12 == 8
|
||||
+#elif XCHAL_NUM_AREGS % 12 == 4
|
||||
" mov a4, a4\n"
|
||||
+#elif XCHAL_NUM_AREGS % 12 == 8
|
||||
+ " mov a8, a8\n"
|
||||
#endif
|
||||
" retw\n"
|
||||
+#endif
|
||||
"2:\n"
|
||||
- : : : "a12", "a13", "memory");
|
||||
+ : : : "a8", "a9", "memory");
|
||||
#else
|
||||
__asm__ __volatile__ (
|
||||
" mov a12, a12\n"
|
||||
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
|
||||
index 6e53174f8556..b268d3cc01d1 100644
|
||||
--- a/arch/xtensa/kernel/entry.S
|
||||
+++ b/arch/xtensa/kernel/entry.S
|
||||
@@ -549,12 +549,13 @@ user_exception_exit:
|
||||
* (if we have restored WSBITS-1 frames).
|
||||
*/
|
||||
|
||||
+2:
|
||||
#if XCHAL_HAVE_THREADPTR
|
||||
l32i a3, a1, PT_THREADPTR
|
||||
wur a3, threadptr
|
||||
#endif
|
||||
|
||||
-2: j common_exception_exit
|
||||
+ j common_exception_exit
|
||||
|
||||
/* This is the kernel exception exit.
|
||||
* We avoided to do a MOVSP when we entered the exception, but we
|
||||
@@ -1933,7 +1934,7 @@ ENDPROC(system_call)
|
||||
mov a12, a0
|
||||
.endr
|
||||
#endif
|
||||
- _entry a1, 48
|
||||
+ _entry a1, 16
|
||||
#if XCHAL_NUM_AREGS % 12 == 0
|
||||
mov a8, a8
|
||||
#elif XCHAL_NUM_AREGS % 12 == 4
|
||||
@@ -1957,7 +1958,7 @@ ENDPROC(system_call)
|
||||
|
||||
ENTRY(_switch_to)
|
||||
|
||||
- entry a1, 16
|
||||
+ entry a1, 48
|
||||
|
||||
mov a11, a3 # and 'next' (a3)
|
||||
|
||||
diff --git a/drivers/auxdisplay/ks0108.c b/drivers/auxdisplay/ks0108.c
|
||||
index 5b93852392b8..0d752851a1ee 100644
|
||||
--- a/drivers/auxdisplay/ks0108.c
|
||||
+++ b/drivers/auxdisplay/ks0108.c
|
||||
@@ -139,6 +139,7 @@ static int __init ks0108_init(void)
|
||||
|
||||
ks0108_pardevice = parport_register_device(ks0108_parport, KS0108_NAME,
|
||||
NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
|
||||
+ parport_put_port(ks0108_parport);
|
||||
if (ks0108_pardevice == NULL) {
|
||||
printk(KERN_ERR KS0108_NAME ": ERROR: "
|
||||
"parport didn't register new device\n");
|
||||
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
|
||||
index 507379e7b763..4e2fb405da87 100644
|
||||
--- a/drivers/base/devres.c
|
||||
+++ b/drivers/base/devres.c
|
||||
@@ -296,10 +296,10 @@ void * devres_get(struct device *dev, void *new_res,
|
||||
if (!dr) {
|
||||
add_dr(dev, &new_dr->node);
|
||||
dr = new_dr;
|
||||
- new_dr = NULL;
|
||||
+ new_res = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->devres_lock, flags);
|
||||
- devres_free(new_dr);
|
||||
+ devres_free(new_res);
|
||||
|
||||
return dr->data;
|
||||
}
|
||||
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
|
||||
index 9eda84246ffd..8717be5093a2 100644
|
||||
--- a/drivers/base/platform.c
|
||||
+++ b/drivers/base/platform.c
|
||||
@@ -347,9 +347,7 @@ int platform_device_add(struct platform_device *pdev)
|
||||
|
||||
while (--i >= 0) {
|
||||
struct resource *r = &pdev->resource[i];
|
||||
- unsigned long type = resource_type(r);
|
||||
-
|
||||
- if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
|
||||
+ if (r->parent)
|
||||
release_resource(r);
|
||||
}
|
||||
|
||||
@@ -380,9 +378,7 @@ void platform_device_del(struct platform_device *pdev)
|
||||
|
||||
for (i = 0; i < pdev->num_resources; i++) {
|
||||
struct resource *r = &pdev->resource[i];
|
||||
- unsigned long type = resource_type(r);
|
||||
-
|
||||
- if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
|
||||
+ if (r->parent)
|
||||
release_resource(r);
|
||||
}
|
||||
}
|
||||
diff --git a/drivers/clk/versatile/clk-sp810.c b/drivers/clk/versatile/clk-sp810.c
|
||||
index bf9b15a585e1..b9e05bde0c06 100644
|
||||
--- a/drivers/clk/versatile/clk-sp810.c
|
||||
+++ b/drivers/clk/versatile/clk-sp810.c
|
||||
@@ -128,8 +128,8 @@ struct clk *clk_sp810_timerclken_of_get(struct of_phandle_args *clkspec,
|
||||
{
|
||||
struct clk_sp810 *sp810 = data;
|
||||
|
||||
- if (WARN_ON(clkspec->args_count != 1 || clkspec->args[0] >
|
||||
- ARRAY_SIZE(sp810->timerclken)))
|
||||
+ if (WARN_ON(clkspec->args_count != 1 ||
|
||||
+ clkspec->args[0] >= ARRAY_SIZE(sp810->timerclken)))
|
||||
return NULL;
|
||||
|
||||
return sp810->timerclken[clkspec->args[0]].clk;
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
index fc604fc75797..1fbd38b371d4 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
@@ -78,6 +78,11 @@ void radeon_connector_hotplug(struct drm_connector *connector)
|
||||
if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
} else if (radeon_dp_needs_link_train(radeon_connector)) {
|
||||
+ /* Don't try to start link training before we
|
||||
+ * have the dpcd */
|
||||
+ if (!radeon_dp_getdpcd(radeon_connector))
|
||||
+ return;
|
||||
+
|
||||
/* set it to OFF so that drm_helper_connector_dpms()
|
||||
* won't return immediately since the current state
|
||||
* is ON at this point.
|
||||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
|
||||
index ada164e1b3a1..de904e6a4ab7 100644
|
||||
--- a/drivers/hid/usbhid/hid-core.c
|
||||
+++ b/drivers/hid/usbhid/hid-core.c
|
||||
@@ -180,7 +180,7 @@ static void hid_io_error(struct hid_device *hid)
|
||||
if (time_after(jiffies, usbhid->stop_retry)) {
|
||||
|
||||
/* Retries failed, so do a port reset unless we lack bandwidth*/
|
||||
- if (test_bit(HID_NO_BANDWIDTH, &usbhid->iofl)
|
||||
+ if (!test_bit(HID_NO_BANDWIDTH, &usbhid->iofl)
|
||||
&& !test_and_set_bit(HID_RESET_PENDING, &usbhid->iofl)) {
|
||||
|
||||
schedule_work(&usbhid->reset_work);
|
||||
diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig
|
||||
index 107cafcb89da..953a0621c6fe 100644
|
||||
--- a/drivers/iio/gyro/Kconfig
|
||||
+++ b/drivers/iio/gyro/Kconfig
|
||||
@@ -73,7 +73,8 @@ config IIO_ST_GYRO_SPI_3AXIS
|
||||
config ITG3200
|
||||
tristate "InvenSense ITG3200 Digital 3-Axis Gyroscope I2C driver"
|
||||
depends on I2C
|
||||
- select IIO_TRIGGERED_BUFFER if IIO_BUFFER
|
||||
+ select IIO_BUFFER
|
||||
+ select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say yes here to add support for the InvenSense ITG3200 digital
|
||||
3-axis gyroscope sensor.
|
||||
diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c
|
||||
index b7db38376295..b0d05e88087c 100644
|
||||
--- a/drivers/iio/imu/adis16480.c
|
||||
+++ b/drivers/iio/imu/adis16480.c
|
||||
@@ -110,6 +110,10 @@
|
||||
struct adis16480_chip_info {
|
||||
unsigned int num_channels;
|
||||
const struct iio_chan_spec *channels;
|
||||
+ unsigned int gyro_max_val;
|
||||
+ unsigned int gyro_max_scale;
|
||||
+ unsigned int accel_max_val;
|
||||
+ unsigned int accel_max_scale;
|
||||
};
|
||||
|
||||
struct adis16480 {
|
||||
@@ -533,19 +537,21 @@ static int adis16480_set_filter_freq(struct iio_dev *indio_dev,
|
||||
static int adis16480_read_raw(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan, int *val, int *val2, long info)
|
||||
{
|
||||
+ struct adis16480 *st = iio_priv(indio_dev);
|
||||
+
|
||||
switch (info) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
return adis_single_conversion(indio_dev, chan, 0, val);
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
switch (chan->type) {
|
||||
case IIO_ANGL_VEL:
|
||||
- *val = 0;
|
||||
- *val2 = IIO_DEGREE_TO_RAD(20000); /* 0.02 degree/sec */
|
||||
- return IIO_VAL_INT_PLUS_MICRO;
|
||||
+ *val = st->chip_info->gyro_max_scale;
|
||||
+ *val2 = st->chip_info->gyro_max_val;
|
||||
+ return IIO_VAL_FRACTIONAL;
|
||||
case IIO_ACCEL:
|
||||
- *val = 0;
|
||||
- *val2 = IIO_G_TO_M_S_2(800); /* 0.8 mg */
|
||||
- return IIO_VAL_INT_PLUS_MICRO;
|
||||
+ *val = st->chip_info->accel_max_scale;
|
||||
+ *val2 = st->chip_info->accel_max_val;
|
||||
+ return IIO_VAL_FRACTIONAL;
|
||||
case IIO_MAGN:
|
||||
*val = 0;
|
||||
*val2 = 100; /* 0.0001 gauss */
|
||||
@@ -702,18 +708,39 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
|
||||
[ADIS16375] = {
|
||||
.channels = adis16485_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16485_channels),
|
||||
+ /*
|
||||
+ * storing the value in rad/degree and the scale in degree
|
||||
+ * gives us the result in rad and better precession than
|
||||
+ * storing the scale directly in rad.
|
||||
+ */
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22887),
|
||||
+ .gyro_max_scale = 300,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(21973),
|
||||
+ .accel_max_scale = 18,
|
||||
},
|
||||
[ADIS16480] = {
|
||||
.channels = adis16480_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16480_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(12500),
|
||||
+ .accel_max_scale = 5,
|
||||
},
|
||||
[ADIS16485] = {
|
||||
.channels = adis16485_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16485_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(20000),
|
||||
+ .accel_max_scale = 5,
|
||||
},
|
||||
[ADIS16488] = {
|
||||
.channels = adis16480_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16480_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(22500),
|
||||
+ .accel_max_scale = 18,
|
||||
},
|
||||
};
|
||||
|
||||
diff --git a/drivers/of/address.c b/drivers/of/address.c
|
||||
index 8fb2b5769733..9ceff3c86d74 100644
|
||||
--- a/drivers/of/address.c
|
||||
+++ b/drivers/of/address.c
|
||||
@@ -629,10 +629,10 @@ struct device_node *of_find_matching_node_by_address(struct device_node *from,
|
||||
struct resource res;
|
||||
|
||||
while (dn) {
|
||||
- if (of_address_to_resource(dn, 0, &res))
|
||||
- continue;
|
||||
- if (res.start == base_address)
|
||||
+ if (!of_address_to_resource(dn, 0, &res) &&
|
||||
+ res.start == base_address)
|
||||
return dn;
|
||||
+
|
||||
dn = of_find_matching_node(dn, matches);
|
||||
}
|
||||
|
||||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||
index 910339c0791f..390e4094e4d5 100644
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -2796,12 +2796,15 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x3c28, vtd_mask_spec_errors);
|
||||
|
||||
static void fixup_ti816x_class(struct pci_dev *dev)
|
||||
{
|
||||
+ u32 class = dev->class;
|
||||
+
|
||||
/* TI 816x devices do not have class code set when in PCIe boot mode */
|
||||
- dev_info(&dev->dev, "Setting PCI class for 816x PCIe device\n");
|
||||
- dev->class = PCI_CLASS_MULTIMEDIA_VIDEO;
|
||||
+ dev->class = PCI_CLASS_MULTIMEDIA_VIDEO << 8;
|
||||
+ dev_info(&dev->dev, "PCI class overridden (%#08x -> %#08x)\n",
|
||||
+ class, dev->class);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_TI, 0xb800,
|
||||
- PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class);
|
||||
+ PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class);
|
||||
|
||||
/* Some PCIe devices do not work reliably with the claimed maximum
|
||||
* payload size supported.
|
||||
diff --git a/drivers/tty/serial/8250/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c
|
||||
index 35d9ab95c5cb..91b14202b90b 100644
|
||||
--- a/drivers/tty/serial/8250/8250_pnp.c
|
||||
+++ b/drivers/tty/serial/8250/8250_pnp.c
|
||||
@@ -365,6 +365,11 @@ static const struct pnp_device_id pnp_dev_table[] = {
|
||||
/* Winbond CIR port, should not be probed. We should keep track
|
||||
of it to prevent the legacy serial driver from probing it */
|
||||
{ "WEC1022", CIR_PORT },
|
||||
+ /*
|
||||
+ * SMSC IrCC SIR/FIR port, should not be probed by serial driver
|
||||
+ * as well so its own driver can bind to it.
|
||||
+ */
|
||||
+ { "SMCF010", CIR_PORT },
|
||||
{ "", 0 }
|
||||
};
|
||||
|
||||
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
|
||||
index 57d7ec6c8090..27040a6314d4 100644
|
||||
--- a/drivers/usb/dwc3/ep0.c
|
||||
+++ b/drivers/usb/dwc3/ep0.c
|
||||
@@ -804,6 +804,11 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
|
||||
unsigned maxp = ep0->endpoint.maxpacket;
|
||||
|
||||
transfer_size += (maxp - (transfer_size % maxp));
|
||||
+
|
||||
+ /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */
|
||||
+ if (transfer_size > DWC3_EP0_BOUNCE_SIZE)
|
||||
+ transfer_size = DWC3_EP0_BOUNCE_SIZE;
|
||||
+
|
||||
transferred = min_t(u32, ur->length,
|
||||
transfer_size - length);
|
||||
memcpy(ur->buf, dwc->ep0_bounce, transferred);
|
||||
@@ -916,11 +921,14 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
|
||||
return;
|
||||
}
|
||||
|
||||
- WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE);
|
||||
-
|
||||
maxpacket = dep->endpoint.maxpacket;
|
||||
transfer_size = roundup(req->request.length, maxpacket);
|
||||
|
||||
+ if (transfer_size > DWC3_EP0_BOUNCE_SIZE) {
|
||||
+ dev_WARN(dwc->dev, "bounce buf can't handle req len\n");
|
||||
+ transfer_size = DWC3_EP0_BOUNCE_SIZE;
|
||||
+ }
|
||||
+
|
||||
dwc->ep0_bounced = true;
|
||||
|
||||
/*
|
||||
diff --git a/drivers/usb/host/ehci-sysfs.c b/drivers/usb/host/ehci-sysfs.c
|
||||
index 14ced00ba220..0659024290af 100644
|
||||
--- a/drivers/usb/host/ehci-sysfs.c
|
||||
+++ b/drivers/usb/host/ehci-sysfs.c
|
||||
@@ -29,7 +29,7 @@ static ssize_t show_companion(struct device *dev,
|
||||
int count = PAGE_SIZE;
|
||||
char *ptr = buf;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
nports = HCS_N_PORTS(ehci->hcs_params);
|
||||
|
||||
for (index = 0; index < nports; ++index) {
|
||||
@@ -54,7 +54,7 @@ static ssize_t store_companion(struct device *dev,
|
||||
struct ehci_hcd *ehci;
|
||||
int portnum, new_owner;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
new_owner = PORT_OWNER; /* Owned by companion */
|
||||
if (sscanf(buf, "%d", &portnum) != 1)
|
||||
return -EINVAL;
|
||||
@@ -85,7 +85,7 @@ static ssize_t show_uframe_periodic_max(struct device *dev,
|
||||
struct ehci_hcd *ehci;
|
||||
int n;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
n = scnprintf(buf, PAGE_SIZE, "%d\n", ehci->uframe_periodic_max);
|
||||
return n;
|
||||
}
|
||||
@@ -102,7 +102,7 @@ static ssize_t store_uframe_periodic_max(struct device *dev,
|
||||
unsigned long flags;
|
||||
ssize_t ret;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
if (kstrtouint(buf, 0, &uframe_periodic_max) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
||||
index b55e5f3a311d..514f3117ee2b 100644
|
||||
--- a/drivers/usb/serial/ftdi_sio.c
|
||||
+++ b/drivers/usb/serial/ftdi_sio.c
|
||||
@@ -621,6 +621,10 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2WI_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX3_PID) },
|
||||
/*
|
||||
* ELV devices:
|
||||
*/
|
||||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
||||
index 99316d7cfc03..bfb0ecd98808 100644
|
||||
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
||||
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
||||
@@ -568,6 +568,14 @@
|
||||
*/
|
||||
#define FTDI_SYNAPSE_SS200_PID 0x9090 /* SS200 - SNAP Stick 200 */
|
||||
|
||||
+/*
|
||||
+ * CustomWare / ShipModul NMEA multiplexers product ids (FTDI_VID)
|
||||
+ */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX_PID 0xfd48 /* MiniPlex first generation NMEA Multiplexer */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX2_PID 0xfd49 /* MiniPlex-USB and MiniPlex-2 series */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX2WI_PID 0xfd4a /* MiniPlex-2Wi */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX3_PID 0xfd4b /* MiniPlex-3 series */
|
||||
+
|
||||
|
||||
/********************************/
|
||||
/** third-party VID/PID combos **/
|
||||
diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c
|
||||
index 9b1648945e7a..1e2d86d4f539 100644
|
||||
--- a/drivers/usb/serial/symbolserial.c
|
||||
+++ b/drivers/usb/serial/symbolserial.c
|
||||
@@ -97,7 +97,7 @@ exit:
|
||||
|
||||
static int symbol_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
{
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
int result = 0;
|
||||
|
||||
@@ -123,7 +123,7 @@ static void symbol_close(struct usb_serial_port *port)
|
||||
static void symbol_throttle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
|
||||
spin_lock_irq(&priv->lock);
|
||||
priv->throttled = true;
|
||||
@@ -133,7 +133,7 @@ static void symbol_throttle(struct tty_struct *tty)
|
||||
static void symbol_unthrottle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
int result;
|
||||
bool was_throttled;
|
||||
|
||||
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c
|
||||
index 345713d2f8f3..6b42789ae799 100644
|
||||
--- a/fs/hpfs/namei.c
|
||||
+++ b/fs/hpfs/namei.c
|
||||
@@ -8,6 +8,17 @@
|
||||
#include <linux/sched.h>
|
||||
#include "hpfs_fn.h"
|
||||
|
||||
+static void hpfs_update_directory_times(struct inode *dir)
|
||||
+{
|
||||
+ time_t t = get_seconds();
|
||||
+ if (t == dir->i_mtime.tv_sec &&
|
||||
+ t == dir->i_ctime.tv_sec)
|
||||
+ return;
|
||||
+ dir->i_mtime.tv_sec = dir->i_ctime.tv_sec = t;
|
||||
+ dir->i_mtime.tv_nsec = dir->i_ctime.tv_nsec = 0;
|
||||
+ hpfs_write_inode_nolock(dir);
|
||||
+}
|
||||
+
|
||||
static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
{
|
||||
const unsigned char *name = dentry->d_name.name;
|
||||
@@ -99,6 +110,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
result->i_mode = mode | S_IFDIR;
|
||||
hpfs_write_inode_nolock(result);
|
||||
}
|
||||
+ hpfs_update_directory_times(dir);
|
||||
d_instantiate(dentry, result);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
return 0;
|
||||
@@ -187,6 +199,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, b
|
||||
result->i_mode = mode | S_IFREG;
|
||||
hpfs_write_inode_nolock(result);
|
||||
}
|
||||
+ hpfs_update_directory_times(dir);
|
||||
d_instantiate(dentry, result);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
return 0;
|
||||
@@ -262,6 +275,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, de
|
||||
insert_inode_hash(result);
|
||||
|
||||
hpfs_write_inode_nolock(result);
|
||||
+ hpfs_update_directory_times(dir);
|
||||
d_instantiate(dentry, result);
|
||||
brelse(bh);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
@@ -340,6 +354,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy
|
||||
insert_inode_hash(result);
|
||||
|
||||
hpfs_write_inode_nolock(result);
|
||||
+ hpfs_update_directory_times(dir);
|
||||
d_instantiate(dentry, result);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
return 0;
|
||||
@@ -423,6 +438,8 @@ again:
|
||||
out1:
|
||||
hpfs_brelse4(&qbh);
|
||||
out:
|
||||
+ if (!err)
|
||||
+ hpfs_update_directory_times(dir);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
return err;
|
||||
}
|
||||
@@ -477,6 +494,8 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
out1:
|
||||
hpfs_brelse4(&qbh);
|
||||
out:
|
||||
+ if (!err)
|
||||
+ hpfs_update_directory_times(dir);
|
||||
hpfs_unlock(dir->i_sb);
|
||||
return err;
|
||||
}
|
||||
@@ -595,7 +614,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
goto end1;
|
||||
}
|
||||
|
||||
- end:
|
||||
+end:
|
||||
hpfs_i(i)->i_parent_dir = new_dir->i_ino;
|
||||
if (S_ISDIR(i->i_mode)) {
|
||||
inc_nlink(new_dir);
|
||||
@@ -610,6 +629,10 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
brelse(bh);
|
||||
}
|
||||
end1:
|
||||
+ if (!err) {
|
||||
+ hpfs_update_directory_times(old_dir);
|
||||
+ hpfs_update_directory_times(new_dir);
|
||||
+ }
|
||||
hpfs_unlock(i->i_sb);
|
||||
return err;
|
||||
}
|
||||
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
|
||||
index 3d35b7023591..683911167953 100644
|
||||
--- a/include/linux/iio/iio.h
|
||||
+++ b/include/linux/iio/iio.h
|
||||
@@ -569,6 +569,15 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
|
||||
#define IIO_DEGREE_TO_RAD(deg) (((deg) * 314159ULL + 9000000ULL) / 18000000ULL)
|
||||
|
||||
/**
|
||||
+ * IIO_RAD_TO_DEGREE() - Convert rad to degree
|
||||
+ * @rad: A value in rad
|
||||
+ *
|
||||
+ * Returns the given value converted from rad to degree
|
||||
+ */
|
||||
+#define IIO_RAD_TO_DEGREE(rad) \
|
||||
+ (((rad) * 18000000ULL + 314159ULL / 2) / 314159ULL)
|
||||
+
|
||||
+/**
|
||||
* IIO_G_TO_M_S_2() - Convert g to meter / second**2
|
||||
* @g: A value in g
|
||||
*
|
||||
@@ -576,4 +585,12 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
|
||||
*/
|
||||
#define IIO_G_TO_M_S_2(g) ((g) * 980665ULL / 100000ULL)
|
||||
|
||||
+/**
|
||||
+ * IIO_M_S_2_TO_G() - Convert meter / second**2 to g
|
||||
+ * @ms2: A value in meter / second**2
|
||||
+ *
|
||||
+ * Returns the given value converted from meter / second**2 to g
|
||||
+ */
|
||||
+#define IIO_M_S_2_TO_G(ms2) (((ms2) * 100000ULL + 980665ULL / 2) / 980665ULL)
|
||||
+
|
||||
#endif /* _INDUSTRIAL_IO_H_ */
|
2146
patch/kernel/pine64-default/01-patch-3.10.89-90.patch
Normal file
2146
patch/kernel/pine64-default/01-patch-3.10.89-90.patch
Normal file
File diff suppressed because it is too large
Load diff
1875
patch/kernel/pine64-default/01-patch-3.10.90-91.patch
Normal file
1875
patch/kernel/pine64-default/01-patch-3.10.90-91.patch
Normal file
File diff suppressed because it is too large
Load diff
413
patch/kernel/pine64-default/01-patch-3.10.91-92.patch
Normal file
413
patch/kernel/pine64-default/01-patch-3.10.91-92.patch
Normal file
|
@ -0,0 +1,413 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index ba6a94cf354b..25701b67bb6d 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 91
|
||||
+SUBLEVEL = 92
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/m68k/include/asm/uaccess_mm.h b/arch/m68k/include/asm/uaccess_mm.h
|
||||
index 472c891a4aee..15901db435b9 100644
|
||||
--- a/arch/m68k/include/asm/uaccess_mm.h
|
||||
+++ b/arch/m68k/include/asm/uaccess_mm.h
|
||||
@@ -90,7 +90,7 @@ asm volatile ("\n" \
|
||||
__put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
|
||||
break; \
|
||||
case 2: \
|
||||
- __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \
|
||||
+ __put_user_asm(__pu_err, __pu_val, ptr, w, r, -EFAULT); \
|
||||
break; \
|
||||
case 4: \
|
||||
__put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
|
||||
@@ -158,7 +158,7 @@ asm volatile ("\n" \
|
||||
__get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \
|
||||
break; \
|
||||
case 2: \
|
||||
- __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \
|
||||
+ __get_user_asm(__gu_err, x, ptr, u16, w, r, -EFAULT); \
|
||||
break; \
|
||||
case 4: \
|
||||
__get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \
|
||||
@@ -245,7 +245,7 @@ __constant_copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
__get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
|
||||
break;
|
||||
case 2:
|
||||
- __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, d, 2);
|
||||
+ __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, r, 2);
|
||||
break;
|
||||
case 3:
|
||||
__constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
|
||||
@@ -326,7 +326,7 @@ __constant_copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
__put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
|
||||
break;
|
||||
case 2:
|
||||
- __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2);
|
||||
+ __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, r, 2);
|
||||
break;
|
||||
case 3:
|
||||
__constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
|
||||
diff --git a/arch/m68k/lib/uaccess.c b/arch/m68k/lib/uaccess.c
|
||||
index 5e97f2ee7c11..35d1442dee89 100644
|
||||
--- a/arch/m68k/lib/uaccess.c
|
||||
+++ b/arch/m68k/lib/uaccess.c
|
||||
@@ -52,7 +52,7 @@ unsigned long __generic_copy_from_user(void *to, const void __user *from,
|
||||
" .long 3b,30b\n"
|
||||
" .long 5b,50b\n"
|
||||
" .previous"
|
||||
- : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
|
||||
+ : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
|
||||
: "0" (n / 4), "d" (n & 3));
|
||||
|
||||
return res;
|
||||
@@ -96,7 +96,7 @@ unsigned long __generic_copy_to_user(void __user *to, const void *from,
|
||||
" .long 7b,50b\n"
|
||||
" .long 8b,50b\n"
|
||||
" .previous"
|
||||
- : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
|
||||
+ : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
|
||||
: "0" (n / 4), "d" (n & 3));
|
||||
|
||||
return res;
|
||||
@@ -141,7 +141,7 @@ unsigned long __clear_user(void __user *to, unsigned long n)
|
||||
" .long 7b,40b\n"
|
||||
" .previous"
|
||||
: "=d" (res), "+a" (to)
|
||||
- : "r" (0), "0" (n / 4), "d" (n & 3));
|
||||
+ : "d" (0), "0" (n / 4), "d" (n & 3));
|
||||
|
||||
return res;
|
||||
}
|
||||
diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c
|
||||
index ded4cee35318..dc78cdd43e0a 100644
|
||||
--- a/arch/sparc/crypto/aes_glue.c
|
||||
+++ b/arch/sparc/crypto/aes_glue.c
|
||||
@@ -433,6 +433,7 @@ static struct crypto_alg algs[] = { {
|
||||
.blkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
+ .ivsize = AES_BLOCK_SIZE,
|
||||
.setkey = aes_set_key,
|
||||
.encrypt = cbc_encrypt,
|
||||
.decrypt = cbc_decrypt,
|
||||
@@ -452,6 +453,7 @@ static struct crypto_alg algs[] = { {
|
||||
.blkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
+ .ivsize = AES_BLOCK_SIZE,
|
||||
.setkey = aes_set_key,
|
||||
.encrypt = ctr_crypt,
|
||||
.decrypt = ctr_crypt,
|
||||
diff --git a/arch/sparc/crypto/camellia_glue.c b/arch/sparc/crypto/camellia_glue.c
|
||||
index 641f55cb61c3..eb87d6dd86b1 100644
|
||||
--- a/arch/sparc/crypto/camellia_glue.c
|
||||
+++ b/arch/sparc/crypto/camellia_glue.c
|
||||
@@ -274,6 +274,7 @@ static struct crypto_alg algs[] = { {
|
||||
.blkcipher = {
|
||||
.min_keysize = CAMELLIA_MIN_KEY_SIZE,
|
||||
.max_keysize = CAMELLIA_MAX_KEY_SIZE,
|
||||
+ .ivsize = CAMELLIA_BLOCK_SIZE,
|
||||
.setkey = camellia_set_key,
|
||||
.encrypt = cbc_encrypt,
|
||||
.decrypt = cbc_decrypt,
|
||||
diff --git a/arch/sparc/crypto/des_glue.c b/arch/sparc/crypto/des_glue.c
|
||||
index d11500972994..1359bfc544e4 100644
|
||||
--- a/arch/sparc/crypto/des_glue.c
|
||||
+++ b/arch/sparc/crypto/des_glue.c
|
||||
@@ -429,6 +429,7 @@ static struct crypto_alg algs[] = { {
|
||||
.blkcipher = {
|
||||
.min_keysize = DES_KEY_SIZE,
|
||||
.max_keysize = DES_KEY_SIZE,
|
||||
+ .ivsize = DES_BLOCK_SIZE,
|
||||
.setkey = des_set_key,
|
||||
.encrypt = cbc_encrypt,
|
||||
.decrypt = cbc_decrypt,
|
||||
@@ -485,6 +486,7 @@ static struct crypto_alg algs[] = { {
|
||||
.blkcipher = {
|
||||
.min_keysize = DES3_EDE_KEY_SIZE,
|
||||
.max_keysize = DES3_EDE_KEY_SIZE,
|
||||
+ .ivsize = DES3_EDE_BLOCK_SIZE,
|
||||
.setkey = des3_ede_set_key,
|
||||
.encrypt = cbc3_encrypt,
|
||||
.decrypt = cbc3_decrypt,
|
||||
diff --git a/crypto/ahash.c b/crypto/ahash.c
|
||||
index 793a27f2493e..857ae2b2a2a2 100644
|
||||
--- a/crypto/ahash.c
|
||||
+++ b/crypto/ahash.c
|
||||
@@ -462,7 +462,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
|
||||
struct crypto_alg *base = &alg->halg.base;
|
||||
|
||||
if (alg->halg.digestsize > PAGE_SIZE / 8 ||
|
||||
- alg->halg.statesize > PAGE_SIZE / 8)
|
||||
+ alg->halg.statesize > PAGE_SIZE / 8 ||
|
||||
+ alg->halg.statesize == 0)
|
||||
return -EINVAL;
|
||||
|
||||
base->cra_type = &crypto_ahash_type;
|
||||
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
|
||||
index 01677543248d..2fa22c24fa5d 100644
|
||||
--- a/drivers/block/rbd.c
|
||||
+++ b/drivers/block/rbd.c
|
||||
@@ -4860,7 +4860,6 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
|
||||
out_err:
|
||||
if (parent) {
|
||||
rbd_dev_unparent(rbd_dev);
|
||||
- kfree(rbd_dev->header_name);
|
||||
rbd_dev_destroy(parent);
|
||||
} else {
|
||||
rbd_put_client(rbdc);
|
||||
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
|
||||
index 8a806f5c40cf..3f2dbd1ce6a3 100644
|
||||
--- a/drivers/i2c/busses/i2c-rcar.c
|
||||
+++ b/drivers/i2c/busses/i2c-rcar.c
|
||||
@@ -673,15 +673,16 @@ static int rcar_i2c_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ pm_runtime_enable(dev);
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+
|
||||
ret = i2c_add_numbered_adapter(adap);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "reg adap failed: %d\n", ret);
|
||||
+ pm_runtime_disable(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
- pm_runtime_enable(dev);
|
||||
- platform_set_drvdata(pdev, priv);
|
||||
-
|
||||
dev_info(dev, "probed\n");
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
|
||||
index 39996ca58ce6..ec56072c6326 100644
|
||||
--- a/drivers/md/dm-thin.c
|
||||
+++ b/drivers/md/dm-thin.c
|
||||
@@ -2109,7 +2109,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
||||
metadata_low_callback,
|
||||
pool);
|
||||
if (r)
|
||||
- goto out_free_pt;
|
||||
+ goto out_flags_changed;
|
||||
|
||||
pt->callbacks.congested_fn = pool_is_congested;
|
||||
dm_table_add_target_callbacks(ti->table, &pt->callbacks);
|
||||
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
|
||||
index becfa3ef7fdc..eda9f3d87746 100644
|
||||
--- a/drivers/net/ppp/pppoe.c
|
||||
+++ b/drivers/net/ppp/pppoe.c
|
||||
@@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_device *dev)
|
||||
if (po->pppoe_dev == dev &&
|
||||
sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) {
|
||||
pppox_unbind_sock(sk);
|
||||
- sk->sk_state = PPPOX_ZOMBIE;
|
||||
sk->sk_state_change(sk);
|
||||
po->pppoe_dev = NULL;
|
||||
dev_put(dev);
|
||||
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
|
||||
index 97b5de7aebdb..05e8bd7b3e0f 100644
|
||||
--- a/drivers/net/usb/asix_devices.c
|
||||
+++ b/drivers/net/usb/asix_devices.c
|
||||
@@ -466,19 +466,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
- msleep(150);
|
||||
-
|
||||
- ret = asix_sw_reset(dev, AX_SWRESET_CLEAR);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
- msleep(150);
|
||||
-
|
||||
- ret = asix_sw_reset(dev, embd_phy ? AX_SWRESET_IPRL : AX_SWRESET_PRTE);
|
||||
+ ax88772_reset(dev);
|
||||
|
||||
/* Read PHYID register *AFTER* the PHY was reset properly */
|
||||
phyid = asix_get_phyid(dev);
|
||||
@@ -888,7 +876,7 @@ static const struct driver_info ax88772_info = {
|
||||
.unbind = ax88772_unbind,
|
||||
.status = asix_status,
|
||||
.link_reset = ax88772_link_reset,
|
||||
- .reset = ax88772_reset,
|
||||
+ .reset = ax88772_link_reset,
|
||||
.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET,
|
||||
.rx_fixup = asix_rx_fixup_common,
|
||||
.tx_fixup = asix_tx_fixup,
|
||||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
|
||||
index 478120ae34e5..993e34774bb1 100644
|
||||
--- a/include/linux/skbuff.h
|
||||
+++ b/include/linux/skbuff.h
|
||||
@@ -2363,6 +2363,9 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb,
|
||||
{
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
|
||||
+ else if (skb->ip_summed == CHECKSUM_PARTIAL &&
|
||||
+ skb_checksum_start_offset(skb) < 0)
|
||||
+ skb->ip_summed = CHECKSUM_NONE;
|
||||
}
|
||||
|
||||
unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
|
||||
diff --git a/include/net/af_unix.h b/include/net/af_unix.h
|
||||
index dbdfd2b0f3b3..e927d3e80b61 100644
|
||||
--- a/include/net/af_unix.h
|
||||
+++ b/include/net/af_unix.h
|
||||
@@ -63,7 +63,11 @@ struct unix_sock {
|
||||
#define UNIX_GC_MAYBE_CYCLE 1
|
||||
struct socket_wq peer_wq;
|
||||
};
|
||||
-#define unix_sk(__sk) ((struct unix_sock *)__sk)
|
||||
+
|
||||
+static inline struct unix_sock *unix_sk(struct sock *sk)
|
||||
+{
|
||||
+ return (struct unix_sock *)sk;
|
||||
+}
|
||||
|
||||
#define peer_wait peer_wq.wait
|
||||
|
||||
diff --git a/include/net/sock.h b/include/net/sock.h
|
||||
index c0aad07160ef..95dc0c8a9dac 100644
|
||||
--- a/include/net/sock.h
|
||||
+++ b/include/net/sock.h
|
||||
@@ -782,6 +782,14 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s
|
||||
if (sk_rcvqueues_full(sk, skb, limit))
|
||||
return -ENOBUFS;
|
||||
|
||||
+ /*
|
||||
+ * If the skb was allocated from pfmemalloc reserves, only
|
||||
+ * allow SOCK_MEMALLOC sockets to use it as this socket is
|
||||
+ * helping free memory
|
||||
+ */
|
||||
+ if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
__sk_add_backlog(sk, skb);
|
||||
sk->sk_backlog.len += skb->truesize;
|
||||
return 0;
|
||||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
||||
index fe7c4b91d2e7..fa927fd5778d 100644
|
||||
--- a/kernel/workqueue.c
|
||||
+++ b/kernel/workqueue.c
|
||||
@@ -1450,13 +1450,13 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
|
||||
timer_stats_timer_set_start_info(&dwork->timer);
|
||||
|
||||
dwork->wq = wq;
|
||||
+ /* timer isn't guaranteed to run in this cpu, record earlier */
|
||||
+ if (cpu == WORK_CPU_UNBOUND)
|
||||
+ cpu = raw_smp_processor_id();
|
||||
dwork->cpu = cpu;
|
||||
timer->expires = jiffies + delay;
|
||||
|
||||
- if (unlikely(cpu != WORK_CPU_UNBOUND))
|
||||
- add_timer_on(timer, cpu);
|
||||
- else
|
||||
- add_timer(timer);
|
||||
+ add_timer_on(timer, cpu);
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
|
||||
index ce91766eeca9..213b61255140 100644
|
||||
--- a/net/core/ethtool.c
|
||||
+++ b/net/core/ethtool.c
|
||||
@@ -1066,7 +1066,7 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
|
||||
|
||||
gstrings.len = ret;
|
||||
|
||||
- data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
|
||||
+ data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
|
||||
index 6148716884ae..05195b8c8718 100644
|
||||
--- a/net/core/skbuff.c
|
||||
+++ b/net/core/skbuff.c
|
||||
@@ -2711,11 +2711,12 @@ EXPORT_SYMBOL(skb_append_datato_frags);
|
||||
*/
|
||||
unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
+ unsigned char *data = skb->data;
|
||||
+
|
||||
BUG_ON(len > skb->len);
|
||||
- skb->len -= len;
|
||||
- BUG_ON(skb->len < skb->data_len);
|
||||
- skb_postpull_rcsum(skb, skb->data, len);
|
||||
- return skb->data += len;
|
||||
+ __skb_pull(skb, len);
|
||||
+ skb_postpull_rcsum(skb, data, len);
|
||||
+ return skb->data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(skb_pull_rcsum);
|
||||
|
||||
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
|
||||
index 8c27de2b4d5a..797ff373e486 100644
|
||||
--- a/net/l2tp/l2tp_core.c
|
||||
+++ b/net/l2tp/l2tp_core.c
|
||||
@@ -1381,7 +1381,7 @@ static void l2tp_tunnel_del_work(struct work_struct *work)
|
||||
tunnel = container_of(work, struct l2tp_tunnel, del_work);
|
||||
sk = l2tp_tunnel_sock_lookup(tunnel);
|
||||
if (!sk)
|
||||
- return;
|
||||
+ goto out;
|
||||
|
||||
sock = sk->sk_socket;
|
||||
|
||||
@@ -1402,6 +1402,8 @@ static void l2tp_tunnel_del_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
l2tp_tunnel_sock_put(sk);
|
||||
+out:
|
||||
+ l2tp_tunnel_dec_refcount(tunnel);
|
||||
}
|
||||
|
||||
/* Create a socket for the tunnel, if one isn't set up by
|
||||
@@ -1731,8 +1733,13 @@ EXPORT_SYMBOL_GPL(l2tp_tunnel_create);
|
||||
*/
|
||||
int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel)
|
||||
{
|
||||
+ l2tp_tunnel_inc_refcount(tunnel);
|
||||
l2tp_tunnel_closeall(tunnel);
|
||||
- return (false == queue_work(l2tp_wq, &tunnel->del_work));
|
||||
+ if (false == queue_work(l2tp_wq, &tunnel->del_work)) {
|
||||
+ l2tp_tunnel_dec_refcount(tunnel);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2tp_tunnel_delete);
|
||||
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 123c16419cbe..825c029bf092 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -2063,8 +2063,20 @@ again:
|
||||
if (UNIXCB(skb).fp)
|
||||
siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
|
||||
- sk_peek_offset_fwd(sk, chunk);
|
||||
+ if (skip) {
|
||||
+ sk_peek_offset_fwd(sk, chunk);
|
||||
+ skip -= chunk;
|
||||
+ }
|
||||
+
|
||||
+ if (UNIXCB(skb).fp)
|
||||
+ break;
|
||||
|
||||
+ last = skb;
|
||||
+ unix_state_lock(sk);
|
||||
+ skb = skb_peek_next(skb, &sk->sk_receive_queue);
|
||||
+ if (skb)
|
||||
+ goto again;
|
||||
+ unix_state_unlock(sk);
|
||||
break;
|
||||
}
|
||||
} while (size);
|
645
patch/kernel/pine64-default/01-patch-3.10.92-93.patch
Normal file
645
patch/kernel/pine64-default/01-patch-3.10.92-93.patch
Normal file
|
@ -0,0 +1,645 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 25701b67bb6d..6944160a5631 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 92
|
||||
+SUBLEVEL = 93
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
|
||||
index 048334bb2651..d25459ff57fc 100644
|
||||
--- a/arch/arm64/kernel/stacktrace.c
|
||||
+++ b/arch/arm64/kernel/stacktrace.c
|
||||
@@ -48,11 +48,7 @@ int unwind_frame(struct stackframe *frame)
|
||||
|
||||
frame->sp = fp + 0x10;
|
||||
frame->fp = *(unsigned long *)(fp);
|
||||
- /*
|
||||
- * -4 here because we care about the PC at time of bl,
|
||||
- * not where the return will go.
|
||||
- */
|
||||
- frame->pc = *(unsigned long *)(fp + 8) - 4;
|
||||
+ frame->pc = *(unsigned long *)(fp + 8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
|
||||
index f956a2f84a15..8d3722af6187 100644
|
||||
--- a/arch/powerpc/kernel/rtas.c
|
||||
+++ b/arch/powerpc/kernel/rtas.c
|
||||
@@ -1041,6 +1041,9 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
+ if (!rtas.entry)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (copy_from_user(&args, uargs, 3 * sizeof(u32)) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
|
||||
index 511630db00a8..91cbe75a91d5 100644
|
||||
--- a/arch/x86/xen/enlighten.c
|
||||
+++ b/arch/x86/xen/enlighten.c
|
||||
@@ -33,7 +33,7 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/edd.h>
|
||||
|
||||
-#ifdef CONFIG_KEXEC_CORE
|
||||
+#ifdef CONFIG_KEXEC
|
||||
#include <linux/kexec.h>
|
||||
#endif
|
||||
|
||||
@@ -1748,7 +1748,7 @@ static struct notifier_block xen_hvm_cpu_notifier __cpuinitdata = {
|
||||
.notifier_call = xen_hvm_cpu_notify,
|
||||
};
|
||||
|
||||
-#ifdef CONFIG_KEXEC_CORE
|
||||
+#ifdef CONFIG_KEXEC
|
||||
static void xen_hvm_shutdown(void)
|
||||
{
|
||||
native_machine_shutdown();
|
||||
@@ -1777,7 +1777,7 @@ static void __init xen_hvm_guest_init(void)
|
||||
x86_init.irqs.intr_init = xen_init_IRQ;
|
||||
xen_hvm_init_time_ops();
|
||||
xen_hvm_init_mmu_ops();
|
||||
-#ifdef CONFIG_KEXEC_CORE
|
||||
+#ifdef CONFIG_KEXEC
|
||||
machine_ops.shutdown = xen_hvm_shutdown;
|
||||
machine_ops.crash_shutdown = xen_hvm_crash_shutdown;
|
||||
#endif
|
||||
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c
|
||||
index 7d4a8d28277e..ebcec7439a1a 100644
|
||||
--- a/crypto/ablkcipher.c
|
||||
+++ b/crypto/ablkcipher.c
|
||||
@@ -700,7 +700,7 @@ struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name,
|
||||
err:
|
||||
if (err != -EAGAIN)
|
||||
break;
|
||||
- if (signal_pending(current)) {
|
||||
+ if (fatal_signal_pending(current)) {
|
||||
err = -EINTR;
|
||||
break;
|
||||
}
|
||||
diff --git a/crypto/algapi.c b/crypto/algapi.c
|
||||
index 00d8d939733b..daf2f653b131 100644
|
||||
--- a/crypto/algapi.c
|
||||
+++ b/crypto/algapi.c
|
||||
@@ -325,7 +325,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval)
|
||||
crypto_alg_tested(larval->alg.cra_driver_name, 0);
|
||||
}
|
||||
|
||||
- err = wait_for_completion_interruptible(&larval->completion);
|
||||
+ err = wait_for_completion_killable(&larval->completion);
|
||||
WARN_ON(err);
|
||||
|
||||
out:
|
||||
diff --git a/crypto/api.c b/crypto/api.c
|
||||
index 335abea14f19..36a0d4602eba 100644
|
||||
--- a/crypto/api.c
|
||||
+++ b/crypto/api.c
|
||||
@@ -172,7 +172,7 @@ static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
|
||||
struct crypto_larval *larval = (void *)alg;
|
||||
long timeout;
|
||||
|
||||
- timeout = wait_for_completion_interruptible_timeout(
|
||||
+ timeout = wait_for_completion_killable_timeout(
|
||||
&larval->completion, 60 * HZ);
|
||||
|
||||
alg = larval->adult;
|
||||
@@ -435,7 +435,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask)
|
||||
err:
|
||||
if (err != -EAGAIN)
|
||||
break;
|
||||
- if (signal_pending(current)) {
|
||||
+ if (fatal_signal_pending(current)) {
|
||||
err = -EINTR;
|
||||
break;
|
||||
}
|
||||
@@ -552,7 +552,7 @@ void *crypto_alloc_tfm(const char *alg_name,
|
||||
err:
|
||||
if (err != -EAGAIN)
|
||||
break;
|
||||
- if (signal_pending(current)) {
|
||||
+ if (fatal_signal_pending(current)) {
|
||||
err = -EINTR;
|
||||
break;
|
||||
}
|
||||
diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c
|
||||
index 43665d0d0905..c7666f401381 100644
|
||||
--- a/crypto/crypto_user.c
|
||||
+++ b/crypto/crypto_user.c
|
||||
@@ -361,7 +361,7 @@ static struct crypto_alg *crypto_user_aead_alg(const char *name, u32 type,
|
||||
err = PTR_ERR(alg);
|
||||
if (err != -EAGAIN)
|
||||
break;
|
||||
- if (signal_pending(current)) {
|
||||
+ if (fatal_signal_pending(current)) {
|
||||
err = -EINTR;
|
||||
break;
|
||||
}
|
||||
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
|
||||
index 2fa22c24fa5d..85b31ba9d503 100644
|
||||
--- a/drivers/block/rbd.c
|
||||
+++ b/drivers/block/rbd.c
|
||||
@@ -93,6 +93,8 @@ static int atomic_dec_return_safe(atomic_t *v)
|
||||
|
||||
#define RBD_MINORS_PER_MAJOR 256 /* max minors per blkdev */
|
||||
|
||||
+#define RBD_MAX_PARENT_CHAIN_LEN 16
|
||||
+
|
||||
#define RBD_SNAP_DEV_NAME_PREFIX "snap_"
|
||||
#define RBD_MAX_SNAP_NAME_LEN \
|
||||
(NAME_MAX - (sizeof (RBD_SNAP_DEV_NAME_PREFIX) - 1))
|
||||
@@ -394,7 +396,7 @@ static ssize_t rbd_add(struct bus_type *bus, const char *buf,
|
||||
size_t count);
|
||||
static ssize_t rbd_remove(struct bus_type *bus, const char *buf,
|
||||
size_t count);
|
||||
-static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping);
|
||||
+static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth);
|
||||
static void rbd_spec_put(struct rbd_spec *spec);
|
||||
|
||||
static struct bus_attribute rbd_bus_attrs[] = {
|
||||
@@ -3453,6 +3455,9 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
|
||||
blk_queue_io_opt(q, segment_size);
|
||||
|
||||
blk_queue_merge_bvec(q, rbd_merge_bvec);
|
||||
+ if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC))
|
||||
+ q->backing_dev_info.capabilities |= BDI_CAP_STABLE_WRITES;
|
||||
+
|
||||
disk->queue = q;
|
||||
|
||||
q->queuedata = rbd_dev;
|
||||
@@ -4828,44 +4833,50 @@ out_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
|
||||
+/*
|
||||
+ * @depth is rbd_dev_image_probe() -> rbd_dev_probe_parent() ->
|
||||
+ * rbd_dev_image_probe() recursion depth, which means it's also the
|
||||
+ * length of the already discovered part of the parent chain.
|
||||
+ */
|
||||
+static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth)
|
||||
{
|
||||
struct rbd_device *parent = NULL;
|
||||
- struct rbd_spec *parent_spec;
|
||||
- struct rbd_client *rbdc;
|
||||
int ret;
|
||||
|
||||
if (!rbd_dev->parent_spec)
|
||||
return 0;
|
||||
- /*
|
||||
- * We need to pass a reference to the client and the parent
|
||||
- * spec when creating the parent rbd_dev. Images related by
|
||||
- * parent/child relationships always share both.
|
||||
- */
|
||||
- parent_spec = rbd_spec_get(rbd_dev->parent_spec);
|
||||
- rbdc = __rbd_get_client(rbd_dev->rbd_client);
|
||||
|
||||
- ret = -ENOMEM;
|
||||
- parent = rbd_dev_create(rbdc, parent_spec);
|
||||
- if (!parent)
|
||||
+ if (++depth > RBD_MAX_PARENT_CHAIN_LEN) {
|
||||
+ pr_info("parent chain is too long (%d)\n", depth);
|
||||
+ ret = -EINVAL;
|
||||
goto out_err;
|
||||
+ }
|
||||
|
||||
- ret = rbd_dev_image_probe(parent, false);
|
||||
+ parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec);
|
||||
+ if (!parent) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Images related by parent/child relationships always share
|
||||
+ * rbd_client and spec/parent_spec, so bump their refcounts.
|
||||
+ */
|
||||
+ __rbd_get_client(rbd_dev->rbd_client);
|
||||
+ rbd_spec_get(rbd_dev->parent_spec);
|
||||
+
|
||||
+ ret = rbd_dev_image_probe(parent, depth);
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
+
|
||||
rbd_dev->parent = parent;
|
||||
atomic_set(&rbd_dev->parent_ref, 1);
|
||||
-
|
||||
return 0;
|
||||
+
|
||||
out_err:
|
||||
- if (parent) {
|
||||
- rbd_dev_unparent(rbd_dev);
|
||||
+ rbd_dev_unparent(rbd_dev);
|
||||
+ if (parent)
|
||||
rbd_dev_destroy(parent);
|
||||
- } else {
|
||||
- rbd_put_client(rbdc);
|
||||
- rbd_spec_put(parent_spec);
|
||||
- }
|
||||
-
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4971,7 +4982,7 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev)
|
||||
* parent), initiate a watch on its header object before using that
|
||||
* object to get detailed information about the rbd image.
|
||||
*/
|
||||
-static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
+static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
|
||||
{
|
||||
int ret;
|
||||
int tmp;
|
||||
@@ -4992,7 +5003,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
if (ret)
|
||||
goto err_out_format;
|
||||
|
||||
- if (mapping) {
|
||||
+ if (!depth) {
|
||||
ret = rbd_dev_header_watch_sync(rbd_dev, true);
|
||||
if (ret)
|
||||
goto out_header_name;
|
||||
@@ -5009,7 +5020,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
if (ret)
|
||||
goto err_out_probe;
|
||||
|
||||
- ret = rbd_dev_probe_parent(rbd_dev);
|
||||
+ ret = rbd_dev_probe_parent(rbd_dev, depth);
|
||||
if (ret)
|
||||
goto err_out_probe;
|
||||
|
||||
@@ -5020,7 +5031,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
err_out_probe:
|
||||
rbd_dev_unprobe(rbd_dev);
|
||||
err_out_watch:
|
||||
- if (mapping) {
|
||||
+ if (!depth) {
|
||||
tmp = rbd_dev_header_watch_sync(rbd_dev, false);
|
||||
if (tmp)
|
||||
rbd_warn(rbd_dev, "unable to tear down "
|
||||
@@ -5091,7 +5102,7 @@ static ssize_t rbd_add(struct bus_type *bus,
|
||||
rbdc = NULL; /* rbd_dev now owns this */
|
||||
spec = NULL; /* rbd_dev now owns this */
|
||||
|
||||
- rc = rbd_dev_image_probe(rbd_dev, true);
|
||||
+ rc = rbd_dev_image_probe(rbd_dev, 0);
|
||||
if (rc < 0)
|
||||
goto err_out_rbd_dev;
|
||||
|
||||
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
|
||||
index ddd9a098bc67..ea7ed8600a7c 100644
|
||||
--- a/drivers/block/xen-blkfront.c
|
||||
+++ b/drivers/block/xen-blkfront.c
|
||||
@@ -1590,7 +1590,8 @@ static void blkback_changed(struct xenbus_device *dev,
|
||||
break;
|
||||
/* Missed the backend's Closing state -- fallthrough */
|
||||
case XenbusStateClosing:
|
||||
- blkfront_closing(info);
|
||||
+ if (info)
|
||||
+ blkfront_closing(info);
|
||||
break;
|
||||
}
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||
index 5bccf31cc974..4d41739fb50a 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||
@@ -177,11 +177,12 @@ nouveau_gem_info(struct drm_file *file_priv, struct drm_gem_object *gem,
|
||||
struct nouveau_bo *nvbo = nouveau_gem_object(gem);
|
||||
struct nouveau_vma *vma;
|
||||
|
||||
- if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
||||
+ if (is_power_of_2(nvbo->valid_domains))
|
||||
+ rep->domain = nvbo->valid_domains;
|
||||
+ else if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
||||
rep->domain = NOUVEAU_GEM_DOMAIN_GART;
|
||||
else
|
||||
rep->domain = NOUVEAU_GEM_DOMAIN_VRAM;
|
||||
-
|
||||
rep->offset = nvbo->bo.offset;
|
||||
if (cli->base.vm) {
|
||||
vma = nouveau_bo_vma_find(nvbo, cli->base.vm);
|
||||
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
|
||||
index 784b97cb05b0..c410217fbe89 100644
|
||||
--- a/drivers/infiniband/core/cm.c
|
||||
+++ b/drivers/infiniband/core/cm.c
|
||||
@@ -857,6 +857,11 @@ retest:
|
||||
case IB_CM_SIDR_REQ_RCVD:
|
||||
spin_unlock_irq(&cm_id_priv->lock);
|
||||
cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
|
||||
+ spin_lock_irq(&cm.lock);
|
||||
+ if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node))
|
||||
+ rb_erase(&cm_id_priv->sidr_id_node,
|
||||
+ &cm.remote_sidr_table);
|
||||
+ spin_unlock_irq(&cm.lock);
|
||||
break;
|
||||
case IB_CM_REQ_SENT:
|
||||
ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
|
||||
@@ -3093,7 +3098,10 @@ int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
- rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
||||
+ if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
|
||||
+ rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
||||
+ RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
|
||||
+ }
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
return 0;
|
||||
|
||||
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
|
||||
index dfb401cba733..6bde2a124c72 100644
|
||||
--- a/drivers/iommu/amd_iommu.c
|
||||
+++ b/drivers/iommu/amd_iommu.c
|
||||
@@ -2106,8 +2106,8 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats)
|
||||
static void clear_dte_entry(u16 devid)
|
||||
{
|
||||
/* remove entry from the device table seen by the hardware */
|
||||
- amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV;
|
||||
- amd_iommu_dev_table[devid].data[1] = 0;
|
||||
+ amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV;
|
||||
+ amd_iommu_dev_table[devid].data[1] &= DTE_FLAG_MASK;
|
||||
|
||||
amd_iommu_apply_erratum_63(devid);
|
||||
}
|
||||
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
|
||||
index 0285a215df16..7570f45fce8d 100644
|
||||
--- a/drivers/iommu/amd_iommu_types.h
|
||||
+++ b/drivers/iommu/amd_iommu_types.h
|
||||
@@ -282,6 +282,7 @@
|
||||
#define IOMMU_PTE_IR (1ULL << 61)
|
||||
#define IOMMU_PTE_IW (1ULL << 62)
|
||||
|
||||
+#define DTE_FLAG_MASK (0x3ffULL << 32)
|
||||
#define DTE_FLAG_IOTLB (0x01UL << 32)
|
||||
#define DTE_FLAG_GV (0x01ULL << 55)
|
||||
#define DTE_GLX_SHIFT (56)
|
||||
diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c
|
||||
index 7c0d75547ccf..92cd09f3c69b 100644
|
||||
--- a/drivers/md/persistent-data/dm-btree-remove.c
|
||||
+++ b/drivers/md/persistent-data/dm-btree-remove.c
|
||||
@@ -301,11 +301,16 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
{
|
||||
int s;
|
||||
uint32_t max_entries = le32_to_cpu(left->header.max_entries);
|
||||
- unsigned target = (nr_left + nr_center + nr_right) / 3;
|
||||
- BUG_ON(target > max_entries);
|
||||
+ unsigned total = nr_left + nr_center + nr_right;
|
||||
+ unsigned target_right = total / 3;
|
||||
+ unsigned remainder = (target_right * 3) != total;
|
||||
+ unsigned target_left = target_right + remainder;
|
||||
+
|
||||
+ BUG_ON(target_left > max_entries);
|
||||
+ BUG_ON(target_right > max_entries);
|
||||
|
||||
if (nr_left < nr_right) {
|
||||
- s = nr_left - target;
|
||||
+ s = nr_left - target_left;
|
||||
|
||||
if (s < 0 && nr_center < -s) {
|
||||
/* not enough in central node */
|
||||
@@ -316,10 +321,10 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
} else
|
||||
shift(left, center, s);
|
||||
|
||||
- shift(center, right, target - nr_right);
|
||||
+ shift(center, right, target_right - nr_right);
|
||||
|
||||
} else {
|
||||
- s = target - nr_right;
|
||||
+ s = target_right - nr_right;
|
||||
if (s > 0 && nr_center < s) {
|
||||
/* not enough in central node */
|
||||
shift(center, right, nr_center);
|
||||
@@ -329,7 +334,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
} else
|
||||
shift(center, right, s);
|
||||
|
||||
- shift(left, center, nr_left - target);
|
||||
+ shift(left, center, nr_left - target_left);
|
||||
}
|
||||
|
||||
*key_ptr(parent, c->index) = center->keys[0];
|
||||
diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c
|
||||
index 79233b051da0..b53669404cb5 100644
|
||||
--- a/drivers/md/persistent-data/dm-btree.c
|
||||
+++ b/drivers/md/persistent-data/dm-btree.c
|
||||
@@ -507,7 +507,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key)
|
||||
|
||||
r = new_block(s->info, &right);
|
||||
if (r < 0) {
|
||||
- /* FIXME: put left */
|
||||
+ unlock_block(s->info, left);
|
||||
return r;
|
||||
}
|
||||
|
||||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
|
||||
index 72141ee60705..63d42ae56a1c 100644
|
||||
--- a/drivers/md/raid1.c
|
||||
+++ b/drivers/md/raid1.c
|
||||
@@ -2147,7 +2147,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
|
||||
md_trim_bio(wbio, sector - r1_bio->sector, sectors);
|
||||
wbio->bi_sector += rdev->data_offset;
|
||||
wbio->bi_bdev = rdev->bdev;
|
||||
- if (submit_bio_wait(WRITE, wbio) == 0)
|
||||
+ if (submit_bio_wait(WRITE, wbio) < 0)
|
||||
/* failure! */
|
||||
ok = rdev_set_badblocks(rdev, sector,
|
||||
sectors, 0)
|
||||
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
|
||||
index 5b2a1eaea34d..f53f4f895502 100644
|
||||
--- a/drivers/md/raid10.c
|
||||
+++ b/drivers/md/raid10.c
|
||||
@@ -2597,7 +2597,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i)
|
||||
choose_data_offset(r10_bio, rdev) +
|
||||
(sector - r10_bio->sector));
|
||||
wbio->bi_bdev = rdev->bdev;
|
||||
- if (submit_bio_wait(WRITE, wbio) == 0)
|
||||
+ if (submit_bio_wait(WRITE, wbio) < 0)
|
||||
/* Failure! */
|
||||
ok = rdev_set_badblocks(rdev, sector,
|
||||
sectors, 0)
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
|
||||
index bd126c25a727..3f37e464a599 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -819,6 +819,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
hw->max_rate_tries = 10;
|
||||
hw->sta_data_size = sizeof(struct ath_node);
|
||||
hw->vif_data_size = sizeof(struct ath_vif);
|
||||
+ hw->extra_tx_headroom = 4;
|
||||
|
||||
hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1;
|
||||
hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1;
|
||||
diff --git a/drivers/net/wireless/iwlwifi/dvm/lib.c b/drivers/net/wireless/iwlwifi/dvm/lib.c
|
||||
index 54f553380aa8..54308dfde13d 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/dvm/lib.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/dvm/lib.c
|
||||
@@ -1023,7 +1023,7 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw,
|
||||
u8 *pn = seq.ccmp.pn;
|
||||
|
||||
ieee80211_get_key_rx_seq(key, i, &seq);
|
||||
- aes_sc->pn = cpu_to_le64(
|
||||
+ aes_sc[i].pn = cpu_to_le64(
|
||||
(u64)pn[5] |
|
||||
((u64)pn[4] << 8) |
|
||||
((u64)pn[3] << 16) |
|
||||
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
|
||||
index 16bbdcc8627a..2e95b419a109 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
|
||||
@@ -295,12 +295,12 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
|
||||
u8 *pn = seq.ccmp.pn;
|
||||
|
||||
ieee80211_get_key_rx_seq(key, i, &seq);
|
||||
- aes_sc->pn = cpu_to_le64((u64)pn[5] |
|
||||
- ((u64)pn[4] << 8) |
|
||||
- ((u64)pn[3] << 16) |
|
||||
- ((u64)pn[2] << 24) |
|
||||
- ((u64)pn[1] << 32) |
|
||||
- ((u64)pn[0] << 40));
|
||||
+ aes_sc[i].pn = cpu_to_le64((u64)pn[5] |
|
||||
+ ((u64)pn[4] << 8) |
|
||||
+ ((u64)pn[3] << 16) |
|
||||
+ ((u64)pn[2] << 24) |
|
||||
+ ((u64)pn[1] << 32) |
|
||||
+ ((u64)pn[0] << 40));
|
||||
}
|
||||
data->use_rsc_tsc = true;
|
||||
break;
|
||||
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
|
||||
index fa50c7dc3d3e..2da1959ff2f6 100644
|
||||
--- a/drivers/scsi/mvsas/mv_sas.c
|
||||
+++ b/drivers/scsi/mvsas/mv_sas.c
|
||||
@@ -987,6 +987,8 @@ static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc)
|
||||
static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task,
|
||||
struct mvs_slot_info *slot, u32 slot_idx)
|
||||
{
|
||||
+ if (!slot)
|
||||
+ return;
|
||||
if (!slot->task)
|
||||
return;
|
||||
if (!sas_protocol_ata(task->task_proto))
|
||||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
|
||||
index 4ba6974dd4b6..98e3b20c6058 100644
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -2348,6 +2348,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
||||
u32 trb_comp_code;
|
||||
int ret = 0;
|
||||
int td_num = 0;
|
||||
+ bool handling_skipped_tds = false;
|
||||
|
||||
slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
|
||||
xdev = xhci->devs[slot_id];
|
||||
@@ -2481,6 +2482,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
||||
ep->skip = true;
|
||||
xhci_dbg(xhci, "Miss service interval error, set skip flag\n");
|
||||
goto cleanup;
|
||||
+ case COMP_PING_ERR:
|
||||
+ ep->skip = true;
|
||||
+ xhci_dbg(xhci, "No Ping response error, Skip one Isoc TD\n");
|
||||
+ goto cleanup;
|
||||
default:
|
||||
if (xhci_is_vendor_info_code(xhci, trb_comp_code)) {
|
||||
status = 0;
|
||||
@@ -2612,13 +2617,18 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
||||
ep, &status);
|
||||
|
||||
cleanup:
|
||||
+
|
||||
+
|
||||
+ handling_skipped_tds = ep->skip &&
|
||||
+ trb_comp_code != COMP_MISSED_INT &&
|
||||
+ trb_comp_code != COMP_PING_ERR;
|
||||
+
|
||||
/*
|
||||
- * Do not update event ring dequeue pointer if ep->skip is set.
|
||||
- * Will roll back to continue process missed tds.
|
||||
+ * Do not update event ring dequeue pointer if we're in a loop
|
||||
+ * processing missed tds.
|
||||
*/
|
||||
- if (trb_comp_code == COMP_MISSED_INT || !ep->skip) {
|
||||
+ if (!handling_skipped_tds)
|
||||
inc_deq(xhci, xhci->event_ring);
|
||||
- }
|
||||
|
||||
if (ret) {
|
||||
urb = td->urb;
|
||||
@@ -2662,7 +2672,7 @@ cleanup:
|
||||
* Process them as short transfer until reach the td pointed by
|
||||
* the event.
|
||||
*/
|
||||
- } while (ep->skip && trb_comp_code != COMP_MISSED_INT);
|
||||
+ } while (handling_skipped_tds);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/include/sound/wm8904.h b/include/sound/wm8904.h
|
||||
index 898be3a8db9a..6d8f8fba3341 100644
|
||||
--- a/include/sound/wm8904.h
|
||||
+++ b/include/sound/wm8904.h
|
||||
@@ -119,7 +119,7 @@
|
||||
#define WM8904_MIC_REGS 2
|
||||
#define WM8904_GPIO_REGS 4
|
||||
#define WM8904_DRC_REGS 4
|
||||
-#define WM8904_EQ_REGS 25
|
||||
+#define WM8904_EQ_REGS 24
|
||||
|
||||
/**
|
||||
* DRC configurations are specified with a label and a set of register
|
||||
diff --git a/kernel/module.c b/kernel/module.c
|
||||
index 61fb677211cb..fd2afdf48a89 100644
|
||||
--- a/kernel/module.c
|
||||
+++ b/kernel/module.c
|
||||
@@ -942,11 +942,15 @@ void symbol_put_addr(void *addr)
|
||||
if (core_kernel_text(a))
|
||||
return;
|
||||
|
||||
- /* module_text_address is safe here: we're supposed to have reference
|
||||
- * to module from symbol_get, so it can't go away. */
|
||||
+ /*
|
||||
+ * Even though we hold a reference on the module; we still need to
|
||||
+ * disable preemption in order to safely traverse the data structure.
|
||||
+ */
|
||||
+ preempt_disable();
|
||||
modaddr = __module_text_address(a);
|
||||
BUG_ON(!modaddr);
|
||||
module_put(modaddr);
|
||||
+ preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(symbol_put_addr);
|
||||
|
||||
diff --git a/mm/filemap.c b/mm/filemap.c
|
||||
index 7905fe721aa8..725a10043244 100644
|
||||
--- a/mm/filemap.c
|
||||
+++ b/mm/filemap.c
|
||||
@@ -2340,6 +2340,11 @@ again:
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (fatal_signal_pending(current)) {
|
||||
+ status = -EINTR;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
status = a_ops->write_begin(file, mapping, pos, bytes, flags,
|
||||
&page, &fsdata);
|
||||
if (unlikely(status))
|
||||
@@ -2380,10 +2385,6 @@ again:
|
||||
written += copied;
|
||||
|
||||
balance_dirty_pages_ratelimited(mapping);
|
||||
- if (fatal_signal_pending(current)) {
|
||||
- status = -EINTR;
|
||||
- break;
|
||||
- }
|
||||
} while (iov_iter_count(i));
|
||||
|
||||
return written ? written : status;
|
674
patch/kernel/pine64-default/01-patch-3.10.93-94-e.patch
Normal file
674
patch/kernel/pine64-default/01-patch-3.10.93-94-e.patch
Normal file
|
@ -0,0 +1,674 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 6944160a5631..f73ae0748cbc 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 93
|
||||
+SUBLEVEL = 94
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
|
||||
index 8ca636cf8618..1a00c33a5b7e 100644
|
||||
--- a/arch/arm/mm/dma-mapping.c
|
||||
+++ b/arch/arm/mm/dma-mapping.c
|
||||
@@ -1355,12 +1355,19 @@ static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,
|
||||
unsigned long uaddr = vma->vm_start;
|
||||
unsigned long usize = vma->vm_end - vma->vm_start;
|
||||
struct page **pages = __iommu_get_pages(cpu_addr, attrs);
|
||||
+ unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
||||
+ unsigned long off = vma->vm_pgoff;
|
||||
|
||||
vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot);
|
||||
|
||||
if (!pages)
|
||||
return -ENXIO;
|
||||
|
||||
+ if (off >= nr_pages || (usize >> PAGE_SHIFT) > nr_pages - off)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ pages += off;
|
||||
+
|
||||
do {
|
||||
int ret = vm_insert_page(vma, uaddr, *pages++);
|
||||
if (ret) {
|
||||
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c
|
||||
index c019b7aaf776..553e00a432ec 100644
|
||||
--- a/arch/arm/plat-orion/common.c
|
||||
+++ b/arch/arm/plat-orion/common.c
|
||||
@@ -498,7 +498,7 @@ void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
|
||||
|
||||
d->netdev = &orion_ge00.dev;
|
||||
for (i = 0; i < d->nr_chips; i++)
|
||||
- d->chip[i].mii_bus = &orion_ge00_shared.dev;
|
||||
+ d->chip[i].mii_bus = &orion_ge_mvmdio.dev;
|
||||
orion_switch_device.dev.platform_data = d;
|
||||
|
||||
platform_device_register(&orion_switch_device);
|
||||
diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h
|
||||
index 41a71ee4c3df..7257c364eb99 100644
|
||||
--- a/arch/arm64/include/asm/ptrace.h
|
||||
+++ b/arch/arm64/include/asm/ptrace.h
|
||||
@@ -70,14 +70,14 @@
|
||||
#define compat_sp regs[13]
|
||||
#define compat_lr regs[14]
|
||||
#define compat_sp_hyp regs[15]
|
||||
-#define compat_sp_irq regs[16]
|
||||
-#define compat_lr_irq regs[17]
|
||||
-#define compat_sp_svc regs[18]
|
||||
-#define compat_lr_svc regs[19]
|
||||
-#define compat_sp_abt regs[20]
|
||||
-#define compat_lr_abt regs[21]
|
||||
-#define compat_sp_und regs[22]
|
||||
-#define compat_lr_und regs[23]
|
||||
+#define compat_lr_irq regs[16]
|
||||
+#define compat_sp_irq regs[17]
|
||||
+#define compat_lr_svc regs[18]
|
||||
+#define compat_sp_svc regs[19]
|
||||
+#define compat_lr_abt regs[20]
|
||||
+#define compat_sp_abt regs[21]
|
||||
+#define compat_lr_und regs[22]
|
||||
+#define compat_sp_und regs[23]
|
||||
#define compat_r8_fiq regs[24]
|
||||
#define compat_r9_fiq regs[25]
|
||||
#define compat_r10_fiq regs[26]
|
||||
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
|
||||
index 564140155c36..81e0fe48b9b0 100644
|
||||
--- a/arch/x86/kernel/cpu/common.c
|
||||
+++ b/arch/x86/kernel/cpu/common.c
|
||||
@@ -280,10 +280,9 @@ __setup("nosmap", setup_disable_smap);
|
||||
|
||||
static __always_inline void setup_smap(struct cpuinfo_x86 *c)
|
||||
{
|
||||
- unsigned long eflags;
|
||||
+ unsigned long eflags = native_save_fl();
|
||||
|
||||
/* This should have been cleared long ago */
|
||||
- raw_local_save_flags(eflags);
|
||||
BUG_ON(eflags & X86_EFLAGS_AC);
|
||||
|
||||
if (cpu_has(c, X86_FEATURE_SMAP)) {
|
||||
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
|
||||
index f2a9a2aa98f3..3280489905a8 100644
|
||||
--- a/arch/x86/kernel/head_64.S
|
||||
+++ b/arch/x86/kernel/head_64.S
|
||||
@@ -65,6 +65,9 @@ startup_64:
|
||||
* tables and then reload them.
|
||||
*/
|
||||
|
||||
+ /* Sanitize CPU configuration */
|
||||
+ call verify_cpu
|
||||
+
|
||||
/*
|
||||
* Compute the delta between the address I am compiled to run at and the
|
||||
* address I am actually running at.
|
||||
@@ -174,6 +177,9 @@ ENTRY(secondary_startup_64)
|
||||
* after the boot processor executes this code.
|
||||
*/
|
||||
|
||||
+ /* Sanitize CPU configuration */
|
||||
+ call verify_cpu
|
||||
+
|
||||
movq $(init_level4_pgt - __START_KERNEL_map), %rax
|
||||
1:
|
||||
|
||||
@@ -288,6 +294,8 @@ ENTRY(secondary_startup_64)
|
||||
pushq %rax # target address in negative space
|
||||
lretq
|
||||
|
||||
+#include "verify_cpu.S"
|
||||
+
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* Boot CPU0 entry point. It's called from play_dead(). Everything has been set
|
||||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||
index 91964c663f0d..935aff397fcc 100644
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -1156,6 +1156,14 @@ void __init setup_arch(char **cmdline_p)
|
||||
clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
|
||||
swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
||||
KERNEL_PGD_PTRS);
|
||||
+
|
||||
+ /*
|
||||
+ * sync back low identity map too. It is used for example
|
||||
+ * in the 32-bit EFI stub.
|
||||
+ */
|
||||
+ clone_pgd_range(initial_page_table,
|
||||
+ swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
||||
+ min(KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
|
||||
#endif
|
||||
|
||||
tboot_probe();
|
||||
diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S
|
||||
index b9242bacbe59..4cf401f581e7 100644
|
||||
--- a/arch/x86/kernel/verify_cpu.S
|
||||
+++ b/arch/x86/kernel/verify_cpu.S
|
||||
@@ -34,10 +34,11 @@
|
||||
#include <asm/msr-index.h>
|
||||
|
||||
verify_cpu:
|
||||
- pushfl # Save caller passed flags
|
||||
- pushl $0 # Kill any dangerous flags
|
||||
- popfl
|
||||
+ pushf # Save caller passed flags
|
||||
+ push $0 # Kill any dangerous flags
|
||||
+ popf
|
||||
|
||||
+#ifndef __x86_64__
|
||||
pushfl # standard way to check for cpuid
|
||||
popl %eax
|
||||
movl %eax,%ebx
|
||||
@@ -48,6 +49,7 @@ verify_cpu:
|
||||
popl %eax
|
||||
cmpl %eax,%ebx
|
||||
jz verify_cpu_no_longmode # cpu has no cpuid
|
||||
+#endif
|
||||
|
||||
movl $0x0,%eax # See if cpuid 1 is implemented
|
||||
cpuid
|
||||
@@ -130,10 +132,10 @@ verify_cpu_sse_test:
|
||||
jmp verify_cpu_sse_test # try again
|
||||
|
||||
verify_cpu_no_longmode:
|
||||
- popfl # Restore caller passed flags
|
||||
+ popf # Restore caller passed flags
|
||||
movl $1,%eax
|
||||
ret
|
||||
verify_cpu_sse_ok:
|
||||
- popfl # Restore caller passed flags
|
||||
+ popf # Restore caller passed flags
|
||||
xorl %eax, %eax
|
||||
ret
|
||||
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
|
||||
index f17c3018b7c7..c2d0559115d3 100644
|
||||
--- a/drivers/net/can/sja1000/sja1000.c
|
||||
+++ b/drivers/net/can/sja1000/sja1000.c
|
||||
@@ -184,6 +184,9 @@ static void sja1000_start(struct net_device *dev)
|
||||
priv->write_reg(priv, SJA1000_RXERR, 0x0);
|
||||
priv->read_reg(priv, SJA1000_ECC);
|
||||
|
||||
+ /* clear interrupt flags */
|
||||
+ priv->read_reg(priv, SJA1000_IR);
|
||||
+
|
||||
/* leave reset mode */
|
||||
set_normal_mode(dev);
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
|
||||
index 8b6c9237eda4..d5643c143bb8 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -910,7 +910,7 @@ static void mvneta_defaults_set(struct mvneta_port *pp)
|
||||
/* Set CPU queue access map - all CPUs have access to all RX
|
||||
* queues and to all TX queues
|
||||
*/
|
||||
- for (cpu = 0; cpu < CONFIG_NR_CPUS; cpu++)
|
||||
+ for_each_present_cpu(cpu)
|
||||
mvreg_write(pp, MVNETA_CPU_MAP(cpu),
|
||||
(MVNETA_CPU_RXQ_ACCESS_ALL_MASK |
|
||||
MVNETA_CPU_TXQ_ACCESS_ALL_MASK));
|
||||
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
|
||||
index 28d706bd12eb..d64050fcafc3 100644
|
||||
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
|
||||
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
|
||||
@@ -1836,7 +1836,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
|
||||
spin_lock_init(&s_state->lock);
|
||||
}
|
||||
|
||||
- memset(&priv->mfunc.master.cmd_eqe, 0, dev->caps.eqe_size);
|
||||
+ memset(&priv->mfunc.master.cmd_eqe, 0, sizeof(struct mlx4_eqe));
|
||||
priv->mfunc.master.cmd_eqe.type = MLX4_EVENT_TYPE_CMD;
|
||||
INIT_WORK(&priv->mfunc.master.comm_work,
|
||||
mlx4_master_comm_channel);
|
||||
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
|
||||
index 6000342f9725..16a1ccc269f1 100644
|
||||
--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
|
||||
+++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
|
||||
@@ -183,7 +183,7 @@ static void slave_event(struct mlx4_dev *dev, u8 slave, struct mlx4_eqe *eqe)
|
||||
return;
|
||||
}
|
||||
|
||||
- memcpy(s_eqe, eqe, dev->caps.eqe_size - 1);
|
||||
+ memcpy(s_eqe, eqe, sizeof(struct mlx4_eqe) - 1);
|
||||
s_eqe->slave_id = slave;
|
||||
/* ensure all information is written before setting the ownersip bit */
|
||||
wmb();
|
||||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
|
||||
index c5f9cb85c8ef..ff08be535a4d 100644
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
|
||||
@@ -731,10 +731,13 @@ static int stmmac_get_ts_info(struct net_device *dev,
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
- if ((priv->hwts_tx_en) && (priv->hwts_rx_en)) {
|
||||
+ if ((priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) {
|
||||
|
||||
- info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
|
||||
+ info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
|
||||
+ SOF_TIMESTAMPING_TX_HARDWARE |
|
||||
+ SOF_TIMESTAMPING_RX_SOFTWARE |
|
||||
SOF_TIMESTAMPING_RX_HARDWARE |
|
||||
+ SOF_TIMESTAMPING_SOFTWARE |
|
||||
SOF_TIMESTAMPING_RAW_HARDWARE;
|
||||
|
||||
if (priv->ptp_clock)
|
||||
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
|
||||
index eda9f3d87746..2840cf608312 100644
|
||||
--- a/drivers/net/ppp/pppoe.c
|
||||
+++ b/drivers/net/ppp/pppoe.c
|
||||
@@ -569,7 +569,7 @@ static int pppoe_release(struct socket *sock)
|
||||
|
||||
po = pppox_sk(sk);
|
||||
|
||||
- if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) {
|
||||
+ if (po->pppoe_dev) {
|
||||
dev_put(po->pppoe_dev);
|
||||
po->pppoe_dev = NULL;
|
||||
}
|
||||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
|
||||
index 2835bfe151b1..b5d11529a39b 100644
|
||||
--- a/drivers/net/virtio_net.c
|
||||
+++ b/drivers/net/virtio_net.c
|
||||
@@ -1545,9 +1545,9 @@ static int virtnet_probe(struct virtio_device *vdev)
|
||||
/* Do we support "hardware" checksums? */
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) {
|
||||
/* This opens up the world of extra features. */
|
||||
- dev->hw_features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
||||
+ dev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_SG;
|
||||
if (csum)
|
||||
- dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
||||
+ dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG;
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) {
|
||||
dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO
|
||||
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c
|
||||
index a5f9875cfd6e..f84e5d7e8bbe 100644
|
||||
--- a/drivers/net/wireless/mwifiex/debugfs.c
|
||||
+++ b/drivers/net/wireless/mwifiex/debugfs.c
|
||||
@@ -637,7 +637,7 @@ mwifiex_rdeeprom_read(struct file *file, char __user *ubuf,
|
||||
(struct mwifiex_private *) file->private_data;
|
||||
unsigned long addr = get_zeroed_page(GFP_KERNEL);
|
||||
char *buf = (char *) addr;
|
||||
- int pos = 0, ret = 0, i;
|
||||
+ int pos, ret, i;
|
||||
u8 value[MAX_EEPROM_DATA];
|
||||
|
||||
if (!buf)
|
||||
@@ -645,7 +645,7 @@ mwifiex_rdeeprom_read(struct file *file, char __user *ubuf,
|
||||
|
||||
if (saved_offset == -1) {
|
||||
/* No command has been given */
|
||||
- pos += snprintf(buf, PAGE_SIZE, "0");
|
||||
+ pos = snprintf(buf, PAGE_SIZE, "0");
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -654,17 +654,17 @@ mwifiex_rdeeprom_read(struct file *file, char __user *ubuf,
|
||||
(u16) saved_bytes, value);
|
||||
if (ret) {
|
||||
ret = -EINVAL;
|
||||
- goto done;
|
||||
+ goto out_free;
|
||||
}
|
||||
|
||||
- pos += snprintf(buf, PAGE_SIZE, "%d %d ", saved_offset, saved_bytes);
|
||||
+ pos = snprintf(buf, PAGE_SIZE, "%d %d ", saved_offset, saved_bytes);
|
||||
|
||||
for (i = 0; i < saved_bytes; i++)
|
||||
- pos += snprintf(buf + strlen(buf), PAGE_SIZE, "%d ", value[i]);
|
||||
-
|
||||
- ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos);
|
||||
+ pos += scnprintf(buf + pos, PAGE_SIZE - pos, "%d ", value[i]);
|
||||
|
||||
done:
|
||||
+ ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos);
|
||||
+out_free:
|
||||
free_page(addr);
|
||||
return ret;
|
||||
}
|
||||
diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c
|
||||
index e3a005da776b..1d9ab22d9a25 100644
|
||||
--- a/drivers/staging/rtl8712/usb_intf.c
|
||||
+++ b/drivers/staging/rtl8712/usb_intf.c
|
||||
@@ -144,6 +144,7 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = {
|
||||
{USB_DEVICE(0x0DF6, 0x0058)},
|
||||
{USB_DEVICE(0x0DF6, 0x0049)},
|
||||
{USB_DEVICE(0x0DF6, 0x004C)},
|
||||
+ {USB_DEVICE(0x0DF6, 0x006C)},
|
||||
{USB_DEVICE(0x0DF6, 0x0064)},
|
||||
/* Skyworth */
|
||||
{USB_DEVICE(0x14b2, 0x3300)},
|
||||
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
|
||||
index d4c47d5d7625..7ac5fac8600b 100644
|
||||
--- a/drivers/usb/class/usblp.c
|
||||
+++ b/drivers/usb/class/usblp.c
|
||||
@@ -870,11 +870,11 @@ static int usblp_wwait(struct usblp *usblp, int nonblock)
|
||||
|
||||
add_wait_queue(&usblp->wwait, &waita);
|
||||
for (;;) {
|
||||
- set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (mutex_lock_interruptible(&usblp->mut)) {
|
||||
rc = -EINTR;
|
||||
break;
|
||||
}
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
rc = usblp_wtest(usblp, nonblock);
|
||||
mutex_unlock(&usblp->mut);
|
||||
if (rc <= 0)
|
||||
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
|
||||
index da0caf3f4b27..462a7d57c095 100644
|
||||
--- a/drivers/usb/musb/musb_core.c
|
||||
+++ b/drivers/usb/musb/musb_core.c
|
||||
@@ -133,7 +133,7 @@ static inline struct musb *dev_to_musb(struct device *dev)
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef CONFIG_BLACKFIN
|
||||
-static int musb_ulpi_read(struct usb_phy *phy, u32 offset)
|
||||
+static int musb_ulpi_read(struct usb_phy *phy, u32 reg)
|
||||
{
|
||||
void __iomem *addr = phy->io_priv;
|
||||
int i = 0;
|
||||
@@ -152,7 +152,7 @@ static int musb_ulpi_read(struct usb_phy *phy, u32 offset)
|
||||
* ULPICarKitControlDisableUTMI after clearing POWER_SUSPENDM.
|
||||
*/
|
||||
|
||||
- musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)offset);
|
||||
+ musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)reg);
|
||||
musb_writeb(addr, MUSB_ULPI_REG_CONTROL,
|
||||
MUSB_ULPI_REG_REQ | MUSB_ULPI_RDN_WR);
|
||||
|
||||
@@ -177,7 +177,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int musb_ulpi_write(struct usb_phy *phy, u32 offset, u32 data)
|
||||
+static int musb_ulpi_write(struct usb_phy *phy, u32 val, u32 reg)
|
||||
{
|
||||
void __iomem *addr = phy->io_priv;
|
||||
int i = 0;
|
||||
@@ -192,8 +192,8 @@ static int musb_ulpi_write(struct usb_phy *phy, u32 offset, u32 data)
|
||||
power &= ~MUSB_POWER_SUSPENDM;
|
||||
musb_writeb(addr, MUSB_POWER, power);
|
||||
|
||||
- musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)offset);
|
||||
- musb_writeb(addr, MUSB_ULPI_REG_DATA, (u8)data);
|
||||
+ musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)reg);
|
||||
+ musb_writeb(addr, MUSB_ULPI_REG_DATA, (u8)val);
|
||||
musb_writeb(addr, MUSB_ULPI_REG_CONTROL, MUSB_ULPI_REG_REQ);
|
||||
|
||||
while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL)
|
||||
diff --git a/include/net/inet_common.h b/include/net/inet_common.h
|
||||
index 234008782c8c..102fc42c7fb1 100644
|
||||
--- a/include/net/inet_common.h
|
||||
+++ b/include/net/inet_common.h
|
||||
@@ -40,7 +40,8 @@ extern int inet_ctl_sock_create(struct sock **sk, unsigned short family,
|
||||
|
||||
static inline void inet_ctl_sock_destroy(struct sock *sk)
|
||||
{
|
||||
- sk_release_kernel(sk);
|
||||
+ if (sk)
|
||||
+ sk_release_kernel(sk);
|
||||
}
|
||||
|
||||
#endif
|
||||
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
|
||||
index de030f50f72b..c60563394cd1 100644
|
||||
--- a/net/bluetooth/hidp/core.c
|
||||
+++ b/net/bluetooth/hidp/core.c
|
||||
@@ -396,6 +396,20 @@ static void hidp_idle_timeout(unsigned long arg)
|
||||
{
|
||||
struct hidp_session *session = (struct hidp_session *) arg;
|
||||
|
||||
+ /* The HIDP user-space API only contains calls to add and remove
|
||||
+ * devices. There is no way to forward events of any kind. Therefore,
|
||||
+ * we have to forcefully disconnect a device on idle-timeouts. This is
|
||||
+ * unfortunate and weird API design, but it is spec-compliant and
|
||||
+ * required for backwards-compatibility. Hence, on idle-timeout, we
|
||||
+ * signal driver-detach events, so poll() will be woken up with an
|
||||
+ * error-condition on both sockets.
|
||||
+ */
|
||||
+
|
||||
+ session->intr_sock->sk->sk_err = EUNATCH;
|
||||
+ session->ctrl_sock->sk->sk_err = EUNATCH;
|
||||
+ wake_up_interruptible(sk_sleep(session->intr_sock->sk));
|
||||
+ wake_up_interruptible(sk_sleep(session->ctrl_sock->sk));
|
||||
+
|
||||
hidp_session_terminate(session);
|
||||
}
|
||||
|
||||
diff --git a/net/core/dst.c b/net/core/dst.c
|
||||
index c0e021871df8..01f9980af86e 100644
|
||||
--- a/net/core/dst.c
|
||||
+++ b/net/core/dst.c
|
||||
@@ -283,7 +283,7 @@ void dst_release(struct dst_entry *dst)
|
||||
|
||||
newrefcnt = atomic_dec_return(&dst->__refcnt);
|
||||
WARN_ON(newrefcnt < 0);
|
||||
- if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt)
|
||||
+ if (!newrefcnt && unlikely(dst->flags & DST_NOCACHE))
|
||||
call_rcu(&dst->rcu_head, dst_destroy_rcu);
|
||||
}
|
||||
}
|
||||
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
|
||||
index 56d079b63ad3..6f5f943ff395 100644
|
||||
--- a/net/ipv4/ipmr.c
|
||||
+++ b/net/ipv4/ipmr.c
|
||||
@@ -1672,8 +1672,8 @@ static inline int ipmr_forward_finish(struct sk_buff *skb)
|
||||
{
|
||||
struct ip_options *opt = &(IPCB(skb)->opt);
|
||||
|
||||
- IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
- IP_ADD_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTOCTETS, skb->len);
|
||||
+ IP_INC_STATS(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
+ IP_ADD_STATS(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTOCTETS, skb->len);
|
||||
|
||||
if (unlikely(opt->optlen))
|
||||
ip_forward_options(skb);
|
||||
@@ -1735,7 +1735,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt,
|
||||
* to blackhole.
|
||||
*/
|
||||
|
||||
- IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_FRAGFAILS);
|
||||
+ IP_INC_STATS(dev_net(dev), IPSTATS_MIB_FRAGFAILS);
|
||||
ip_rt_put(rt);
|
||||
goto out_free;
|
||||
}
|
||||
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c
|
||||
index 98ad6ec4bd3c..8ad149478e19 100644
|
||||
--- a/net/irda/irlmp.c
|
||||
+++ b/net/irda/irlmp.c
|
||||
@@ -1876,7 +1876,7 @@ static void *irlmp_seq_hb_idx(struct irlmp_iter_state *iter, loff_t *off)
|
||||
for (element = hashbin_get_first(iter->hashbin);
|
||||
element != NULL;
|
||||
element = hashbin_get_next(iter->hashbin)) {
|
||||
- if (!off || *off-- == 0) {
|
||||
+ if (!off || (*off)-- == 0) {
|
||||
/* NB: hashbin left locked */
|
||||
return element;
|
||||
}
|
||||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
|
||||
index e606e4a113e1..952cb336d704 100644
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -3074,7 +3074,7 @@ ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (ifmgd->rssi_min_thold != ifmgd->rssi_max_thold &&
|
||||
ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT) {
|
||||
- int sig = ifmgd->ave_beacon_signal;
|
||||
+ int sig = ifmgd->ave_beacon_signal / 16;
|
||||
int last_sig = ifmgd->last_ave_beacon_signal;
|
||||
|
||||
/*
|
||||
diff --git a/net/rds/connection.c b/net/rds/connection.c
|
||||
index 642ad42c416b..e88bf3976e54 100644
|
||||
--- a/net/rds/connection.c
|
||||
+++ b/net/rds/connection.c
|
||||
@@ -177,6 +177,12 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
|
||||
}
|
||||
}
|
||||
|
||||
+ if (trans == NULL) {
|
||||
+ kmem_cache_free(rds_conn_slab, conn);
|
||||
+ conn = ERR_PTR(-ENODEV);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
conn->c_trans = trans;
|
||||
|
||||
ret = trans->conn_alloc(conn, gfp);
|
||||
diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c
|
||||
index 4fac4f2bb9dc..8b33d9967b56 100644
|
||||
--- a/net/rds/tcp_recv.c
|
||||
+++ b/net/rds/tcp_recv.c
|
||||
@@ -234,8 +234,15 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
to_copy = min(tc->t_tinc_data_rem, left);
|
||||
- pskb_pull(clone, offset);
|
||||
- pskb_trim(clone, to_copy);
|
||||
+ if (!pskb_pull(clone, offset) ||
|
||||
+ pskb_trim(clone, to_copy)) {
|
||||
+ pr_warn("rds_tcp_data_recv: pull/trim failed "
|
||||
+ "left %zu data_rem %zu skb_len %d\n",
|
||||
+ left, tc->t_tinc_data_rem, skb->len);
|
||||
+ kfree_skb(clone);
|
||||
+ desc->error = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
skb_queue_tail(&tinc->ti_skb_list, clone);
|
||||
|
||||
rdsdebug("skb %p data %p len %d off %u to_copy %zu -> "
|
||||
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
||||
index 93249133aeec..dabbe05d17f5 100644
|
||||
--- a/sound/usb/midi.c
|
||||
+++ b/sound/usb/midi.c
|
||||
@@ -174,6 +174,8 @@ struct snd_usb_midi_in_endpoint {
|
||||
u8 running_status_length;
|
||||
} ports[0x10];
|
||||
u8 seen_f5;
|
||||
+ bool in_sysex;
|
||||
+ u8 last_cin;
|
||||
u8 error_resubmit;
|
||||
int current_port;
|
||||
};
|
||||
@@ -465,6 +467,39 @@ static void snd_usbmidi_maudio_broken_running_status_input(
|
||||
}
|
||||
|
||||
/*
|
||||
+ * QinHeng CH345 is buggy: every second packet inside a SysEx has not CIN 4
|
||||
+ * but the previously seen CIN, but still with three data bytes.
|
||||
+ */
|
||||
+static void ch345_broken_sysex_input(struct snd_usb_midi_in_endpoint *ep,
|
||||
+ uint8_t *buffer, int buffer_length)
|
||||
+{
|
||||
+ unsigned int i, cin, length;
|
||||
+
|
||||
+ for (i = 0; i + 3 < buffer_length; i += 4) {
|
||||
+ if (buffer[i] == 0 && i > 0)
|
||||
+ break;
|
||||
+ cin = buffer[i] & 0x0f;
|
||||
+ if (ep->in_sysex &&
|
||||
+ cin == ep->last_cin &&
|
||||
+ (buffer[i + 1 + (cin == 0x6)] & 0x80) == 0)
|
||||
+ cin = 0x4;
|
||||
+#if 0
|
||||
+ if (buffer[i + 1] == 0x90) {
|
||||
+ /*
|
||||
+ * Either a corrupted running status or a real note-on
|
||||
+ * message; impossible to detect reliably.
|
||||
+ */
|
||||
+ }
|
||||
+#endif
|
||||
+ length = snd_usbmidi_cin_length[cin];
|
||||
+ snd_usbmidi_input_data(ep, 0, &buffer[i + 1], length);
|
||||
+ ep->in_sysex = cin == 0x4;
|
||||
+ if (!ep->in_sysex)
|
||||
+ ep->last_cin = cin;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* CME protocol: like the standard protocol, but SysEx commands are sent as a
|
||||
* single USB packet preceded by a 0x0F byte.
|
||||
*/
|
||||
@@ -650,6 +685,12 @@ static struct usb_protocol_ops snd_usbmidi_cme_ops = {
|
||||
.output_packet = snd_usbmidi_output_standard_packet,
|
||||
};
|
||||
|
||||
+static struct usb_protocol_ops snd_usbmidi_ch345_broken_sysex_ops = {
|
||||
+ .input = ch345_broken_sysex_input,
|
||||
+ .output = snd_usbmidi_standard_output,
|
||||
+ .output_packet = snd_usbmidi_output_standard_packet,
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* AKAI MPD16 protocol:
|
||||
*
|
||||
@@ -1326,6 +1367,7 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi* umidi,
|
||||
* Various chips declare a packet size larger than 4 bytes, but
|
||||
* do not actually work with larger packets:
|
||||
*/
|
||||
+ case USB_ID(0x0a67, 0x5011): /* Medeli DD305 */
|
||||
case USB_ID(0x0a92, 0x1020): /* ESI M4U */
|
||||
case USB_ID(0x1430, 0x474b): /* RedOctane GH MIDI INTERFACE */
|
||||
case USB_ID(0x15ca, 0x0101): /* Textech USB Midi Cable */
|
||||
@@ -2216,6 +2258,10 @@ int snd_usbmidi_create(struct snd_card *card,
|
||||
|
||||
err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
|
||||
break;
|
||||
+ case QUIRK_MIDI_CH345:
|
||||
+ umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops;
|
||||
+ err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
|
||||
+ break;
|
||||
default:
|
||||
snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
|
||||
err = -ENXIO;
|
||||
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
|
||||
index 45d586b6e8b5..9ec5ce4e35fb 100644
|
||||
--- a/sound/usb/quirks-table.h
|
||||
+++ b/sound/usb/quirks-table.h
|
||||
@@ -3041,6 +3041,17 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
.idProduct = 0x1020,
|
||||
},
|
||||
|
||||
+/* QinHeng devices */
|
||||
+{
|
||||
+ USB_DEVICE(0x1a86, 0x752d),
|
||||
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
|
||||
+ .vendor_name = "QinHeng",
|
||||
+ .product_name = "CH345",
|
||||
+ .ifnum = 1,
|
||||
+ .type = QUIRK_MIDI_CH345
|
||||
+ }
|
||||
+},
|
||||
+
|
||||
/* KeithMcMillen Stringport */
|
||||
{
|
||||
USB_DEVICE(0x1f38, 0x0001),
|
||||
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
|
||||
index 734c6579b194..94cd28c2bd8d 100644
|
||||
--- a/sound/usb/quirks.c
|
||||
+++ b/sound/usb/quirks.c
|
||||
@@ -313,6 +313,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
||||
[QUIRK_MIDI_CME] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_AKAI] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_FTDI] = create_any_midi_quirk,
|
||||
+ [QUIRK_MIDI_CH345] = create_any_midi_quirk,
|
||||
[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
|
||||
[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
|
||||
[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
|
||||
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
|
||||
index bc43bcaddf4d..d6f3fefc882f 100644
|
||||
--- a/sound/usb/usbaudio.h
|
||||
+++ b/sound/usb/usbaudio.h
|
||||
@@ -83,6 +83,7 @@ enum quirk_type {
|
||||
QUIRK_MIDI_AKAI,
|
||||
QUIRK_MIDI_US122L,
|
||||
QUIRK_MIDI_FTDI,
|
||||
+ QUIRK_MIDI_CH345,
|
||||
QUIRK_AUDIO_STANDARD_INTERFACE,
|
||||
QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||
QUIRK_AUDIO_EDIROL_UAXX,
|
893
patch/kernel/pine64-default/01-patch-3.10.94-95-e.patch
Normal file
893
patch/kernel/pine64-default/01-patch-3.10.94-95-e.patch
Normal file
|
@ -0,0 +1,893 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index f73ae0748cbc..eb120001bc12 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 94
|
||||
+SUBLEVEL = 95
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
|
||||
index 0f3e3047e29c..14ca13a0698b 100644
|
||||
--- a/drivers/firewire/ohci.c
|
||||
+++ b/drivers/firewire/ohci.c
|
||||
@@ -3670,6 +3670,11 @@ static int pci_probe(struct pci_dev *dev,
|
||||
|
||||
reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, ~0);
|
||||
ohci->it_context_support = reg_read(ohci, OHCI1394_IsoXmitIntMaskSet);
|
||||
+ /* JMicron JMB38x often shows 0 at first read, just ignore it */
|
||||
+ if (!ohci->it_context_support) {
|
||||
+ ohci_notice(ohci, "overriding IsoXmitIntMask\n");
|
||||
+ ohci->it_context_support = 0xf;
|
||||
+ }
|
||||
reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, ~0);
|
||||
ohci->it_context_mask = ohci->it_context_support;
|
||||
ohci->n_it = hweight32(ohci->it_context_mask);
|
||||
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
index 11cdf1d43041..297c3e5ec3f3 100644
|
||||
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
@@ -1016,13 +1016,12 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
|
||||
sizeof(struct atl1c_recv_ret_status) * rx_desc_count +
|
||||
8 * 4;
|
||||
|
||||
- ring_header->desc = pci_alloc_consistent(pdev, ring_header->size,
|
||||
- &ring_header->dma);
|
||||
+ ring_header->desc = dma_zalloc_coherent(&pdev->dev, ring_header->size,
|
||||
+ &ring_header->dma, GFP_KERNEL);
|
||||
if (unlikely(!ring_header->desc)) {
|
||||
- dev_err(&pdev->dev, "pci_alloc_consistend failed\n");
|
||||
+ dev_err(&pdev->dev, "could not get memory for DMA buffer\n");
|
||||
goto err_nomem;
|
||||
}
|
||||
- memset(ring_header->desc, 0, ring_header->size);
|
||||
/* init TPD ring */
|
||||
|
||||
tpd_ring[0].dma = roundup(ring_header->dma, 8);
|
||||
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
|
||||
index e29fe8dbd226..b93a0fb17236 100644
|
||||
--- a/drivers/net/ethernet/renesas/sh_eth.c
|
||||
+++ b/drivers/net/ethernet/renesas/sh_eth.c
|
||||
@@ -1421,6 +1421,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status)
|
||||
desc_status >>= 16;
|
||||
#endif
|
||||
|
||||
+ skb = mdp->rx_skbuff[entry];
|
||||
if (desc_status & (RD_RFS1 | RD_RFS2 | RD_RFS3 | RD_RFS4 |
|
||||
RD_RFS5 | RD_RFS6 | RD_RFS10)) {
|
||||
ndev->stats.rx_errors++;
|
||||
@@ -1436,12 +1437,11 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status)
|
||||
ndev->stats.rx_missed_errors++;
|
||||
if (desc_status & RD_RFS10)
|
||||
ndev->stats.rx_over_errors++;
|
||||
- } else {
|
||||
+ } else if (skb) {
|
||||
if (!mdp->cd->hw_swap)
|
||||
sh_eth_soft_swap(
|
||||
phys_to_virt(ALIGN(rxdesc->addr, 4)),
|
||||
pkt_len + 2);
|
||||
- skb = mdp->rx_skbuff[entry];
|
||||
mdp->rx_skbuff[entry] = NULL;
|
||||
if (mdp->cd->rpadir)
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
|
||||
index f8c90ea75108..7a1ff5797f12 100644
|
||||
--- a/drivers/net/phy/broadcom.c
|
||||
+++ b/drivers/net/phy/broadcom.c
|
||||
@@ -848,7 +848,7 @@ static struct mdio_device_id __maybe_unused broadcom_tbl[] = {
|
||||
{ PHY_ID_BCM5421, 0xfffffff0 },
|
||||
{ PHY_ID_BCM5461, 0xfffffff0 },
|
||||
{ PHY_ID_BCM5464, 0xfffffff0 },
|
||||
- { PHY_ID_BCM5482, 0xfffffff0 },
|
||||
+ { PHY_ID_BCM5481, 0xfffffff0 },
|
||||
{ PHY_ID_BCM5482, 0xfffffff0 },
|
||||
{ PHY_ID_BCM50610, 0xfffffff0 },
|
||||
{ PHY_ID_BCM50610M, 0xfffffff0 },
|
||||
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c
|
||||
index 0d5a5faaf83b..9a423435039a 100644
|
||||
--- a/drivers/net/ppp/pptp.c
|
||||
+++ b/drivers/net/ppp/pptp.c
|
||||
@@ -420,6 +420,9 @@ static int pptp_bind(struct socket *sock, struct sockaddr *uservaddr,
|
||||
struct pptp_opt *opt = &po->proto.pptp;
|
||||
int error = 0;
|
||||
|
||||
+ if (sockaddr_len < sizeof(struct sockaddr_pppox))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
lock_sock(sk);
|
||||
|
||||
opt->src_addr = sp->sa_addr.pptp;
|
||||
@@ -441,6 +444,9 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||
struct flowi4 fl4;
|
||||
int error = 0;
|
||||
|
||||
+ if (sockaddr_len < sizeof(struct sockaddr_pppox))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (sp->sa_protocol != PX_PROTO_PPTP)
|
||||
return -EINVAL;
|
||||
|
||||
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
|
||||
index 43204f4be2da..0244a1fb38f9 100644
|
||||
--- a/drivers/net/usb/qmi_wwan.c
|
||||
+++ b/drivers/net/usb/qmi_wwan.c
|
||||
@@ -742,6 +742,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
||||
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
||||
{QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */
|
||||
+ {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
|
||||
{QMI_FIXED_INTF(0x0b3c, 0xc000, 4)}, /* Olivetti Olicard 100 */
|
||||
{QMI_FIXED_INTF(0x0b3c, 0xc001, 4)}, /* Olivetti Olicard 120 */
|
||||
{QMI_FIXED_INTF(0x0b3c, 0xc002, 4)}, /* Olivetti Olicard 140 */
|
||||
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
|
||||
index 2800776b2e91..d2ea64de92df 100644
|
||||
--- a/drivers/usb/class/cdc-acm.c
|
||||
+++ b/drivers/usb/class/cdc-acm.c
|
||||
@@ -1726,6 +1726,11 @@ static const struct usb_device_id acm_ids[] = {
|
||||
},
|
||||
#endif
|
||||
|
||||
+ /* Exclude Infineon Flash Loader utility */
|
||||
+ { USB_DEVICE(0x058b, 0x0041),
|
||||
+ .driver_info = IGNORE_DEVICE,
|
||||
+ },
|
||||
+
|
||||
/* control interfaces without any protocol set */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
||||
USB_CDC_PROTO_NONE) },
|
||||
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
|
||||
index 85756bd36746..9b05e88d6220 100644
|
||||
--- a/drivers/usb/core/config.c
|
||||
+++ b/drivers/usb/core/config.c
|
||||
@@ -117,7 +117,8 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
|
||||
USB_SS_MULT(desc->bmAttributes) > 3) {
|
||||
dev_warn(ddev, "Isoc endpoint has Mult of %d in "
|
||||
"config %d interface %d altsetting %d ep %d: "
|
||||
- "setting to 3\n", desc->bmAttributes + 1,
|
||||
+ "setting to 3\n",
|
||||
+ USB_SS_MULT(desc->bmAttributes),
|
||||
cfgno, inum, asnum, ep->desc.bEndpointAddress);
|
||||
ep->ss_ep_comp.bmAttributes = 2;
|
||||
}
|
||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||
index 11a073cda1d6..92873f2773fc 100644
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -137,6 +137,10 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)
|
||||
|
||||
static int usb_device_supports_lpm(struct usb_device *udev)
|
||||
{
|
||||
+ /* Some devices have trouble with LPM */
|
||||
+ if (udev->quirks & USB_QUIRK_NO_LPM)
|
||||
+ return 0;
|
||||
+
|
||||
/* USB 2.1 (and greater) devices indicate LPM support through
|
||||
* their USB 2.0 Extended Capabilities BOS descriptor.
|
||||
*/
|
||||
@@ -4289,6 +4293,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ usb_detect_quirks(udev);
|
||||
+
|
||||
if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) {
|
||||
retval = usb_get_bos_descriptor(udev);
|
||||
if (!retval) {
|
||||
@@ -4530,7 +4536,6 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
|
||||
if (status < 0)
|
||||
goto loop;
|
||||
|
||||
- usb_detect_quirks(udev);
|
||||
if (udev->quirks & USB_QUIRK_DELAY_INIT)
|
||||
msleep(1000);
|
||||
|
||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||
index d4db4ea4a92d..94e9cddc05c1 100644
|
||||
--- a/drivers/usb/core/quirks.c
|
||||
+++ b/drivers/usb/core/quirks.c
|
||||
@@ -182,6 +182,12 @@ static const struct usb_device_id usb_interface_quirk_list[] = {
|
||||
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
+ /* Blackmagic Design Intensity Shuttle */
|
||||
+ { USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM },
|
||||
+
|
||||
+ /* Blackmagic Design UltraStudio SDI */
|
||||
+ { USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM },
|
||||
+
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
||||
diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c
|
||||
index dc31c425ce01..9f1c0538b211 100644
|
||||
--- a/drivers/usb/host/whci/qset.c
|
||||
+++ b/drivers/usb/host/whci/qset.c
|
||||
@@ -377,6 +377,10 @@ static int qset_fill_page_list(struct whc *whc, struct whc_std *std, gfp_t mem_f
|
||||
if (std->pl_virt == NULL)
|
||||
return -ENOMEM;
|
||||
std->dma_addr = dma_map_single(whc->wusbhc.dev, std->pl_virt, pl_len, DMA_TO_DEVICE);
|
||||
+ if (dma_mapping_error(whc->wusbhc.dev, std->dma_addr)) {
|
||||
+ kfree(std->pl_virt);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
|
||||
for (p = 0; p < std->num_pointers; p++) {
|
||||
std->pl_virt[p].buf_ptr = cpu_to_le64(dma_addr);
|
||||
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
||||
index dd84416a23cd..25522e98602e 100644
|
||||
--- a/drivers/usb/serial/cp210x.c
|
||||
+++ b/drivers/usb/serial/cp210x.c
|
||||
@@ -132,7 +132,6 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
||||
- { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
|
||||
{ USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
|
||||
{ USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
|
||||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
|
||||
index f22beda91ffc..ae29b403a7e2 100644
|
||||
--- a/fs/btrfs/inode.c
|
||||
+++ b/fs/btrfs/inode.c
|
||||
@@ -1286,8 +1286,14 @@ next_slot:
|
||||
num_bytes = 0;
|
||||
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
|
||||
|
||||
- if (found_key.objectid > ino ||
|
||||
- found_key.type > BTRFS_EXTENT_DATA_KEY ||
|
||||
+ if (found_key.objectid > ino)
|
||||
+ break;
|
||||
+ if (WARN_ON_ONCE(found_key.objectid < ino) ||
|
||||
+ found_key.type < BTRFS_EXTENT_DATA_KEY) {
|
||||
+ path->slots[0]++;
|
||||
+ goto next_slot;
|
||||
+ }
|
||||
+ if (found_key.type > BTRFS_EXTENT_DATA_KEY ||
|
||||
found_key.offset > end)
|
||||
break;
|
||||
|
||||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
|
||||
index af1eaed96a91..a7e079749425 100644
|
||||
--- a/fs/ext4/super.c
|
||||
+++ b/fs/ext4/super.c
|
||||
@@ -400,9 +400,13 @@ static void ext4_handle_error(struct super_block *sb)
|
||||
ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
}
|
||||
- if (test_opt(sb, ERRORS_PANIC))
|
||||
+ if (test_opt(sb, ERRORS_PANIC)) {
|
||||
+ if (EXT4_SB(sb)->s_journal &&
|
||||
+ !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR))
|
||||
+ return;
|
||||
panic("EXT4-fs (device %s): panic forced after error\n",
|
||||
sb->s_id);
|
||||
+ }
|
||||
}
|
||||
|
||||
void __ext4_error(struct super_block *sb, const char *function,
|
||||
@@ -576,8 +580,12 @@ void __ext4_abort(struct super_block *sb, const char *function,
|
||||
jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
|
||||
save_error_info(sb, function, line);
|
||||
}
|
||||
- if (test_opt(sb, ERRORS_PANIC))
|
||||
+ if (test_opt(sb, ERRORS_PANIC)) {
|
||||
+ if (EXT4_SB(sb)->s_journal &&
|
||||
+ !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR))
|
||||
+ return;
|
||||
panic("EXT4-fs panic from previous error\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
void ext4_msg(struct super_block *sb, const char *prefix, const char *fmt, ...)
|
||||
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
|
||||
index 3e7ef8874ffb..644f95e7208f 100644
|
||||
--- a/fs/jbd2/journal.c
|
||||
+++ b/fs/jbd2/journal.c
|
||||
@@ -2049,8 +2049,12 @@ static void __journal_abort_soft (journal_t *journal, int errno)
|
||||
|
||||
__jbd2_journal_abort_hard(journal);
|
||||
|
||||
- if (errno)
|
||||
+ if (errno) {
|
||||
jbd2_journal_update_sb_errno(journal);
|
||||
+ write_lock(&journal->j_state_lock);
|
||||
+ journal->j_flags |= JBD2_REC_ERR;
|
||||
+ write_unlock(&journal->j_state_lock);
|
||||
+ }
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
|
||||
index e9be01b2cc5a..02c6eade0bdc 100644
|
||||
--- a/fs/nfs/inode.c
|
||||
+++ b/fs/nfs/inode.c
|
||||
@@ -1503,7 +1503,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
nfsi->attrtimeo_timestamp = now;
|
||||
}
|
||||
}
|
||||
- invalid &= ~NFS_INO_INVALID_ATTR;
|
||||
+
|
||||
+ /* Don't declare attrcache up to date if there were no attrs! */
|
||||
+ if (fattr->valid != 0)
|
||||
+ invalid &= ~NFS_INO_INVALID_ATTR;
|
||||
+
|
||||
/* Don't invalidate the data if we were to blame */
|
||||
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
|
||||
|| S_ISLNK(inode->i_mode)))
|
||||
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
|
||||
index 5f8d5ffdad8f..498811c09da7 100644
|
||||
--- a/fs/nfs/nfs4client.c
|
||||
+++ b/fs/nfs/nfs4client.c
|
||||
@@ -32,7 +32,7 @@ static int nfs_get_cb_ident_idr(struct nfs_client *clp, int minorversion)
|
||||
return ret;
|
||||
idr_preload(GFP_KERNEL);
|
||||
spin_lock(&nn->nfs_client_lock);
|
||||
- ret = idr_alloc(&nn->cb_ident_idr, clp, 0, 0, GFP_NOWAIT);
|
||||
+ ret = idr_alloc(&nn->cb_ident_idr, clp, 1, 0, GFP_NOWAIT);
|
||||
if (ret >= 0)
|
||||
clp->cl_cb_ident = ret;
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
|
||||
index 0c67c1f2a890..7d4a932305be 100644
|
||||
--- a/include/linux/jbd2.h
|
||||
+++ b/include/linux/jbd2.h
|
||||
@@ -977,6 +977,7 @@ struct journal_s
|
||||
#define JBD2_ABORT_ON_SYNCDATA_ERR 0x040 /* Abort the journal on file
|
||||
* data write error in ordered
|
||||
* mode */
|
||||
+#define JBD2_REC_ERR 0x080 /* The errno in the sb has been recorded */
|
||||
|
||||
/*
|
||||
* Function declarations for the journaling transaction and buffer
|
||||
diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
|
||||
index 49587dc22f5d..41ea53c39389 100644
|
||||
--- a/include/linux/usb/quirks.h
|
||||
+++ b/include/linux/usb/quirks.h
|
||||
@@ -33,4 +33,7 @@
|
||||
/* device generates spurious wakeup, ignore remote wakeup capability */
|
||||
#define USB_QUIRK_IGNORE_REMOTE_WAKEUP 0x00000200
|
||||
|
||||
+/* device can't handle Link Power Management */
|
||||
+#define USB_QUIRK_NO_LPM BIT(10)
|
||||
+
|
||||
#endif /* __LINUX_USB_QUIRKS_H */
|
||||
diff --git a/include/net/af_unix.h b/include/net/af_unix.h
|
||||
index e927d3e80b61..686760024572 100644
|
||||
--- a/include/net/af_unix.h
|
||||
+++ b/include/net/af_unix.h
|
||||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
|
||||
index 087370ff05f1..413e23be60d1 100644
|
||||
--- a/include/net/ipv6.h
|
||||
+++ b/include/net/ipv6.h
|
||||
@@ -478,6 +478,7 @@ struct ip6_create_arg {
|
||||
u32 user;
|
||||
const struct in6_addr *src;
|
||||
const struct in6_addr *dst;
|
||||
+ int iif;
|
||||
u8 ecn;
|
||||
};
|
||||
|
||||
diff --git a/include/net/sock.h b/include/net/sock.h
|
||||
index 95dc0c8a9dac..2317d122874e 100644
|
||||
--- a/include/net/sock.h
|
||||
+++ b/include/net/sock.h
|
||||
@@ -352,6 +352,7 @@ struct sock {
|
||||
sk_no_check : 2,
|
||||
sk_userlocks : 4,
|
||||
sk_protocol : 8,
|
||||
+#define SK_PROTOCOL_MAX U8_MAX
|
||||
sk_type : 16;
|
||||
kmemcheck_bitfield_end(flags);
|
||||
int sk_wmem_queued;
|
||||
@@ -672,6 +673,8 @@ enum sock_flags {
|
||||
SOCK_SELECT_ERR_QUEUE, /* Wake select on error queue */
|
||||
};
|
||||
|
||||
+#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
|
||||
+
|
||||
static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
|
||||
{
|
||||
nsk->sk_flags = osk->sk_flags;
|
||||
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
|
||||
index c9ae6b703c13..b586a3230247 100644
|
||||
--- a/net/bluetooth/sco.c
|
||||
+++ b/net/bluetooth/sco.c
|
||||
@@ -456,6 +456,9 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le
|
||||
if (!addr || addr->sa_family != AF_BLUETOOTH)
|
||||
return -EINVAL;
|
||||
|
||||
+ if (alen < sizeof(struct sockaddr_sco))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
lock_sock(sk);
|
||||
|
||||
if (sk->sk_state != BT_OPEN) {
|
||||
diff --git a/net/core/scm.c b/net/core/scm.c
|
||||
index b4da80b1cc07..dbc6bfcdf446 100644
|
||||
--- a/net/core/scm.c
|
||||
+++ b/net/core/scm.c
|
||||
@@ -306,6 +306,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
|
||||
err = put_user(cmlen, &cm->cmsg_len);
|
||||
if (!err) {
|
||||
cmlen = CMSG_SPACE(i*sizeof(int));
|
||||
+ if (msg->msg_controllen < cmlen)
|
||||
+ cmlen = msg->msg_controllen;
|
||||
msg->msg_control += cmlen;
|
||||
msg->msg_controllen -= cmlen;
|
||||
}
|
||||
diff --git a/net/core/sock.c b/net/core/sock.c
|
||||
index af65d17517b8..5a954fccc7d3 100644
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -419,8 +419,6 @@ static void sock_warn_obsolete_bsdism(const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
-#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
|
||||
-
|
||||
static void sock_disable_timestamp(struct sock *sk, unsigned long flags)
|
||||
{
|
||||
if (sk->sk_flags & flags) {
|
||||
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
|
||||
index c4adc319cc2e..975c369d4e6d 100644
|
||||
--- a/net/ipv4/af_inet.c
|
||||
+++ b/net/ipv4/af_inet.c
|
||||
@@ -288,6 +288,9 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
|
||||
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
|
||||
build_ehash_secret();
|
||||
|
||||
+ if (protocol < 0 || protocol >= IPPROTO_MAX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
sock->state = SS_UNCONNECTED;
|
||||
|
||||
/* Look for the requested type/protocol pair. */
|
||||
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
|
||||
index 6f5f943ff395..b31553d385bb 100644
|
||||
--- a/net/ipv4/ipmr.c
|
||||
+++ b/net/ipv4/ipmr.c
|
||||
@@ -136,7 +136,7 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
|
||||
struct mfc_cache *c, struct rtmsg *rtm);
|
||||
static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
|
||||
int cmd);
|
||||
-static void mroute_clean_tables(struct mr_table *mrt);
|
||||
+static void mroute_clean_tables(struct mr_table *mrt, bool all);
|
||||
static void ipmr_expire_process(unsigned long arg);
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
|
||||
@@ -348,7 +348,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
|
||||
static void ipmr_free_table(struct mr_table *mrt)
|
||||
{
|
||||
del_timer_sync(&mrt->ipmr_expire_timer);
|
||||
- mroute_clean_tables(mrt);
|
||||
+ mroute_clean_tables(mrt, true);
|
||||
kfree(mrt);
|
||||
}
|
||||
|
||||
@@ -1199,7 +1199,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
|
||||
* Close the multicast socket, and clear the vif tables etc
|
||||
*/
|
||||
|
||||
-static void mroute_clean_tables(struct mr_table *mrt)
|
||||
+static void mroute_clean_tables(struct mr_table *mrt, bool all)
|
||||
{
|
||||
int i;
|
||||
LIST_HEAD(list);
|
||||
@@ -1208,8 +1208,9 @@ static void mroute_clean_tables(struct mr_table *mrt)
|
||||
/* Shut down all active vif entries */
|
||||
|
||||
for (i = 0; i < mrt->maxvif; i++) {
|
||||
- if (!(mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
- vif_delete(mrt, i, 0, &list);
|
||||
+ if (!all && (mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
+ continue;
|
||||
+ vif_delete(mrt, i, 0, &list);
|
||||
}
|
||||
unregister_netdevice_many(&list);
|
||||
|
||||
@@ -1217,7 +1218,7 @@ static void mroute_clean_tables(struct mr_table *mrt)
|
||||
|
||||
for (i = 0; i < MFC_LINES; i++) {
|
||||
list_for_each_entry_safe(c, next, &mrt->mfc_cache_array[i], list) {
|
||||
- if (c->mfc_flags & MFC_STATIC)
|
||||
+ if (!all && (c->mfc_flags & MFC_STATIC))
|
||||
continue;
|
||||
list_del_rcu(&c->list);
|
||||
mroute_netlink_event(mrt, c, RTM_DELROUTE);
|
||||
@@ -1252,7 +1253,7 @@ static void mrtsock_destruct(struct sock *sk)
|
||||
NETCONFA_IFINDEX_ALL,
|
||||
net->ipv4.devconf_all);
|
||||
RCU_INIT_POINTER(mrt->mroute_sk, NULL);
|
||||
- mroute_clean_tables(mrt);
|
||||
+ mroute_clean_tables(mrt, false);
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
|
||||
index a8be45e4d34f..f89087c3cfc8 100644
|
||||
--- a/net/ipv4/tcp_input.c
|
||||
+++ b/net/ipv4/tcp_input.c
|
||||
@@ -5575,6 +5575,7 @@ discard:
|
||||
}
|
||||
|
||||
tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1;
|
||||
+ tp->copied_seq = tp->rcv_nxt;
|
||||
tp->rcv_wup = TCP_SKB_CB(skb)->seq + 1;
|
||||
|
||||
/* RFC1323: The window in SYN & SYN/ACK segments is
|
||||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
|
||||
index 7c3eec386a4b..11f27a45b8ef 100644
|
||||
--- a/net/ipv4/tcp_ipv4.c
|
||||
+++ b/net/ipv4/tcp_ipv4.c
|
||||
@@ -1015,7 +1015,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
||||
}
|
||||
|
||||
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
||||
- sock_owned_by_user(sk));
|
||||
+ sock_owned_by_user(sk) ||
|
||||
+ lockdep_is_held(&sk->sk_lock.slock));
|
||||
if (!md5sig) {
|
||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||
if (!md5sig)
|
||||
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
|
||||
index ab5c7ad482cd..a944f1313c5f 100644
|
||||
--- a/net/ipv6/af_inet6.c
|
||||
+++ b/net/ipv6/af_inet6.c
|
||||
@@ -113,6 +113,9 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
|
||||
!inet_ehash_secret)
|
||||
build_ehash_secret();
|
||||
|
||||
+ if (protocol < 0 || protocol >= IPPROTO_MAX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
/* Look for the requested type/protocol pair. */
|
||||
lookup_protocol:
|
||||
err = -ESOCKTNOSUPPORT;
|
||||
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
|
||||
index bf6233cdb753..7eb7267861ac 100644
|
||||
--- a/net/ipv6/ip6_gre.c
|
||||
+++ b/net/ipv6/ip6_gre.c
|
||||
@@ -1541,13 +1541,11 @@ static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
return -EEXIST;
|
||||
} else {
|
||||
t = nt;
|
||||
-
|
||||
- ip6gre_tunnel_unlink(ign, t);
|
||||
- ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
|
||||
- ip6gre_tunnel_link(ign, t);
|
||||
- netdev_state_change(dev);
|
||||
}
|
||||
|
||||
+ ip6gre_tunnel_unlink(ign, t);
|
||||
+ ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
|
||||
+ ip6gre_tunnel_link(ign, t);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
|
||||
index 57dd3e7d86cc..9ec416552cc5 100644
|
||||
--- a/net/ipv6/ip6mr.c
|
||||
+++ b/net/ipv6/ip6mr.c
|
||||
@@ -120,7 +120,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,
|
||||
int cmd);
|
||||
static int ip6mr_rtm_dumproute(struct sk_buff *skb,
|
||||
struct netlink_callback *cb);
|
||||
-static void mroute_clean_tables(struct mr6_table *mrt);
|
||||
+static void mroute_clean_tables(struct mr6_table *mrt, bool all);
|
||||
static void ipmr_expire_process(unsigned long arg);
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
|
||||
@@ -337,7 +337,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id)
|
||||
static void ip6mr_free_table(struct mr6_table *mrt)
|
||||
{
|
||||
del_timer(&mrt->ipmr_expire_timer);
|
||||
- mroute_clean_tables(mrt);
|
||||
+ mroute_clean_tables(mrt, true);
|
||||
kfree(mrt);
|
||||
}
|
||||
|
||||
@@ -1537,7 +1537,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
|
||||
* Close the multicast socket, and clear the vif tables etc
|
||||
*/
|
||||
|
||||
-static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
+static void mroute_clean_tables(struct mr6_table *mrt, bool all)
|
||||
{
|
||||
int i;
|
||||
LIST_HEAD(list);
|
||||
@@ -1547,8 +1547,9 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
* Shut down all active vif entries
|
||||
*/
|
||||
for (i = 0; i < mrt->maxvif; i++) {
|
||||
- if (!(mrt->vif6_table[i].flags & VIFF_STATIC))
|
||||
- mif6_delete(mrt, i, &list);
|
||||
+ if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC))
|
||||
+ continue;
|
||||
+ mif6_delete(mrt, i, &list);
|
||||
}
|
||||
unregister_netdevice_many(&list);
|
||||
|
||||
@@ -1557,7 +1558,7 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
*/
|
||||
for (i = 0; i < MFC6_LINES; i++) {
|
||||
list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) {
|
||||
- if (c->mfc_flags & MFC_STATIC)
|
||||
+ if (!all && (c->mfc_flags & MFC_STATIC))
|
||||
continue;
|
||||
write_lock_bh(&mrt_lock);
|
||||
list_del(&c->list);
|
||||
@@ -1620,7 +1621,7 @@ int ip6mr_sk_done(struct sock *sk)
|
||||
net->ipv6.devconf_all);
|
||||
write_unlock_bh(&mrt_lock);
|
||||
|
||||
- mroute_clean_tables(mrt);
|
||||
+ mroute_clean_tables(mrt, false);
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
|
||||
index 734aec059ffd..7ba6180ff8bd 100644
|
||||
--- a/net/ipv6/mcast.c
|
||||
+++ b/net/ipv6/mcast.c
|
||||
@@ -1441,7 +1441,6 @@ out:
|
||||
if (!err) {
|
||||
ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT);
|
||||
ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
|
||||
- IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, payload_len);
|
||||
} else {
|
||||
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
|
||||
}
|
||||
@@ -1805,7 +1804,6 @@ out:
|
||||
if (!err) {
|
||||
ICMP6MSGOUT_INC_STATS(net, idev, type);
|
||||
ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
|
||||
- IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, full_len);
|
||||
} else
|
||||
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
|
||||
|
||||
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
|
||||
index 253566a8d55b..7cd623588532 100644
|
||||
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
|
||||
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
|
||||
@@ -172,7 +172,7 @@ static void nf_ct_frag6_expire(unsigned long data)
|
||||
/* Creation primitives. */
|
||||
static inline struct frag_queue *fq_find(struct net *net, __be32 id,
|
||||
u32 user, struct in6_addr *src,
|
||||
- struct in6_addr *dst, u8 ecn)
|
||||
+ struct in6_addr *dst, int iif, u8 ecn)
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
struct ip6_create_arg arg;
|
||||
@@ -182,6 +182,7 @@ static inline struct frag_queue *fq_find(struct net *net, __be32 id,
|
||||
arg.user = user;
|
||||
arg.src = src;
|
||||
arg.dst = dst;
|
||||
+ arg.iif = iif;
|
||||
arg.ecn = ecn;
|
||||
|
||||
read_lock_bh(&nf_frags.lock);
|
||||
@@ -590,7 +591,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user)
|
||||
local_bh_enable();
|
||||
|
||||
fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr,
|
||||
- ip6_frag_ecn(hdr));
|
||||
+ skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
|
||||
if (fq == NULL) {
|
||||
pr_debug("Can't find and can't create new queue\n");
|
||||
goto ret_orig;
|
||||
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
|
||||
index 1aeb473b2cc6..a1fb511da3b5 100644
|
||||
--- a/net/ipv6/reassembly.c
|
||||
+++ b/net/ipv6/reassembly.c
|
||||
@@ -111,7 +111,10 @@ bool ip6_frag_match(struct inet_frag_queue *q, void *a)
|
||||
return fq->id == arg->id &&
|
||||
fq->user == arg->user &&
|
||||
ipv6_addr_equal(&fq->saddr, arg->src) &&
|
||||
- ipv6_addr_equal(&fq->daddr, arg->dst);
|
||||
+ ipv6_addr_equal(&fq->daddr, arg->dst) &&
|
||||
+ (arg->iif == fq->iif ||
|
||||
+ !(ipv6_addr_type(arg->dst) & (IPV6_ADDR_MULTICAST |
|
||||
+ IPV6_ADDR_LINKLOCAL)));
|
||||
}
|
||||
EXPORT_SYMBOL(ip6_frag_match);
|
||||
|
||||
@@ -180,7 +183,7 @@ static void ip6_frag_expire(unsigned long data)
|
||||
|
||||
static __inline__ struct frag_queue *
|
||||
fq_find(struct net *net, __be32 id, const struct in6_addr *src,
|
||||
- const struct in6_addr *dst, u8 ecn)
|
||||
+ const struct in6_addr *dst, int iif, u8 ecn)
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
struct ip6_create_arg arg;
|
||||
@@ -190,6 +193,7 @@ fq_find(struct net *net, __be32 id, const struct in6_addr *src,
|
||||
arg.user = IP6_DEFRAG_LOCAL_DELIVER;
|
||||
arg.src = src;
|
||||
arg.dst = dst;
|
||||
+ arg.iif = iif;
|
||||
arg.ecn = ecn;
|
||||
|
||||
read_lock(&ip6_frags.lock);
|
||||
@@ -558,7 +562,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
||||
IPSTATS_MIB_REASMFAILS, evicted);
|
||||
|
||||
fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr,
|
||||
- ip6_frag_ecn(hdr));
|
||||
+ skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
|
||||
if (fq != NULL) {
|
||||
int ret;
|
||||
|
||||
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
|
||||
index bc2fae7e67be..62433f797f3f 100644
|
||||
--- a/net/sctp/auth.c
|
||||
+++ b/net/sctp/auth.c
|
||||
@@ -812,8 +812,8 @@ int sctp_auth_ep_set_hmacs(struct sctp_endpoint *ep,
|
||||
if (!has_sha1)
|
||||
return -EINVAL;
|
||||
|
||||
- memcpy(ep->auth_hmacs_list->hmac_ids, &hmacs->shmac_idents[0],
|
||||
- hmacs->shmac_num_idents * sizeof(__u16));
|
||||
+ for (i = 0; i < hmacs->shmac_num_idents; i++)
|
||||
+ ep->auth_hmacs_list->hmac_ids[i] = htons(hmacs->shmac_idents[i]);
|
||||
ep->auth_hmacs_list->param_hdr.length = htons(sizeof(sctp_paramhdr_t) +
|
||||
hmacs->shmac_num_idents * sizeof(__u16));
|
||||
return 0;
|
||||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
|
||||
index 422d8bdacc0d..bee032a7003f 100644
|
||||
--- a/net/sctp/ipv6.c
|
||||
+++ b/net/sctp/ipv6.c
|
||||
@@ -639,6 +639,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
||||
struct sock *newsk;
|
||||
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
||||
struct sctp6_sock *newsctp6sk;
|
||||
+ struct ipv6_txoptions *opt;
|
||||
|
||||
newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot);
|
||||
if (!newsk)
|
||||
@@ -658,6 +659,13 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
||||
|
||||
memcpy(newnp, np, sizeof(struct ipv6_pinfo));
|
||||
|
||||
+ rcu_read_lock();
|
||||
+ opt = rcu_dereference(np->opt);
|
||||
+ if (opt)
|
||||
+ opt = ipv6_dup_options(newsk, opt);
|
||||
+ RCU_INIT_POINTER(newnp->opt, opt);
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
/* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname()
|
||||
* and getpeername().
|
||||
*/
|
||||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
|
||||
index ec5766dc3946..80bd61ae5945 100644
|
||||
--- a/net/sctp/socket.c
|
||||
+++ b/net/sctp/socket.c
|
||||
@@ -6969,6 +6969,9 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
|
||||
newinet->mc_ttl = 1;
|
||||
newinet->mc_index = 0;
|
||||
newinet->mc_list = NULL;
|
||||
+
|
||||
+ if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
|
||||
+ net_enable_timestamp();
|
||||
}
|
||||
|
||||
static inline void sctp_copy_descendant(struct sock *sk_to,
|
||||
@@ -7149,6 +7152,13 @@ struct proto sctp_prot = {
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
||||
+#include <net/transp_v6.h>
|
||||
+static void sctp_v6_destroy_sock(struct sock *sk)
|
||||
+{
|
||||
+ sctp_destroy_sock(sk);
|
||||
+ inet6_destroy_sock(sk);
|
||||
+}
|
||||
+
|
||||
struct proto sctpv6_prot = {
|
||||
.name = "SCTPv6",
|
||||
.owner = THIS_MODULE,
|
||||
@@ -7158,7 +7168,7 @@ struct proto sctpv6_prot = {
|
||||
.accept = sctp_accept,
|
||||
.ioctl = sctp_ioctl,
|
||||
.init = sctp_init_sock,
|
||||
- .destroy = sctp_destroy_sock,
|
||||
+ .destroy = sctp_v6_destroy_sock,
|
||||
.shutdown = sctp_shutdown,
|
||||
.setsockopt = sctp_setsockopt,
|
||||
.getsockopt = sctp_getsockopt,
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 825c029bf092..f934e7ba5eb8 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -1791,14 +1934,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
if (flags&MSG_OOB)
|
||||
goto out;
|
||||
|
||||
- err = mutex_lock_interruptible(&u->readlock);
|
||||
- if (unlikely(err)) {
|
||||
- /* recvmsg() in non blocking mode is supposed to return -EAGAIN
|
||||
- * sk_rcvtimeo is not honored by mutex_lock_interruptible()
|
||||
- */
|
||||
- err = noblock ? -EAGAIN : -ERESTARTSYS;
|
||||
- goto out;
|
||||
- }
|
||||
+ mutex_lock(&u->readlock);
|
||||
|
||||
skip = sk_peek_offset(sk, flags);
|
||||
|
||||
@@ -1990,12 +2126,12 @@ again:
|
||||
|
||||
timeo = unix_stream_data_wait(sk, timeo, last);
|
||||
|
||||
- if (signal_pending(current)
|
||||
- || mutex_lock_interruptible(&u->readlock)) {
|
||||
+ if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeo);
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ mutex_lock(&u->readlock);
|
||||
continue;
|
||||
unlock:
|
||||
unix_state_unlock(sk);
|
||||
diff --git a/security/keys/gc.c b/security/keys/gc.c
|
||||
index 797818695c87..de34c290bd6f 100644
|
||||
--- a/security/keys/gc.c
|
||||
+++ b/security/keys/gc.c
|
||||
@@ -187,6 +187,12 @@ static noinline void key_gc_unused_keys(struct list_head *keys)
|
||||
kdebug("- %u", key->serial);
|
||||
key_check(key);
|
||||
|
||||
+ /* Throw away the key data if the key is instantiated */
|
||||
+ if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags) &&
|
||||
+ !test_bit(KEY_FLAG_NEGATIVE, &key->flags) &&
|
||||
+ key->type->destroy)
|
||||
+ key->type->destroy(key);
|
||||
+
|
||||
security_key_free(key);
|
||||
|
||||
/* deal with the user's key tracking and quota */
|
||||
@@ -201,10 +207,6 @@ static noinline void key_gc_unused_keys(struct list_head *keys)
|
||||
if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags))
|
||||
atomic_dec(&key->user->nikeys);
|
||||
|
||||
- /* now throw away the key memory */
|
||||
- if (key->type->destroy)
|
||||
- key->type->destroy(key);
|
||||
-
|
||||
key_user_put(key->user);
|
||||
|
||||
kfree(key->description);
|
||||
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
|
||||
index 33cfd27b4de2..3242195bfa95 100644
|
||||
--- a/security/keys/keyctl.c
|
||||
+++ b/security/keys/keyctl.c
|
||||
@@ -744,16 +744,16 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
|
||||
|
||||
/* the key is probably readable - now try to read it */
|
||||
can_read_key:
|
||||
- ret = key_validate(key);
|
||||
- if (ret == 0) {
|
||||
- ret = -EOPNOTSUPP;
|
||||
- if (key->type->read) {
|
||||
- /* read the data with the semaphore held (since we
|
||||
- * might sleep) */
|
||||
- down_read(&key->sem);
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ if (key->type->read) {
|
||||
+ /* Read the data with the semaphore held (since we might sleep)
|
||||
+ * to protect against the key being updated or revoked.
|
||||
+ */
|
||||
+ down_read(&key->sem);
|
||||
+ ret = key_validate(key);
|
||||
+ if (ret == 0)
|
||||
ret = key->type->read(key, buffer, buflen);
|
||||
- up_read(&key->sem);
|
||||
- }
|
||||
+ up_read(&key->sem);
|
||||
}
|
||||
|
||||
error2:
|
1497
patch/kernel/pine64-default/01-patch-3.10.95-96-e.patch
Normal file
1497
patch/kernel/pine64-default/01-patch-3.10.95-96-e.patch
Normal file
File diff suppressed because it is too large
Load diff
2341
patch/kernel/pine64-default/01-patch-3.10.96-97.patch
Normal file
2341
patch/kernel/pine64-default/01-patch-3.10.96-97.patch
Normal file
File diff suppressed because it is too large
Load diff
1792
patch/kernel/pine64-default/01-patch-3.10.97-98.patch
Normal file
1792
patch/kernel/pine64-default/01-patch-3.10.97-98.patch
Normal file
File diff suppressed because it is too large
Load diff
2573
patch/kernel/pine64-default/01-patch-3.10.98-99-e.patch
Normal file
2573
patch/kernel/pine64-default/01-patch-3.10.98-99-e.patch
Normal file
File diff suppressed because it is too large
Load diff
1156
patch/kernel/pine64-default/01-patch-3.10.99-100-e.patch
Normal file
1156
patch/kernel/pine64-default/01-patch-3.10.99-100-e.patch
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue