mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
Merge 5.3 into android-mainline
Linux 5.3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I2d3f5eea4589c23da4dec57af3f9e9d74b151eca
This commit is contained in:
@@ -18,7 +18,7 @@ The following 64-byte header is present in decompressed Linux kernel image.
|
||||
u32 res1 = 0; /* Reserved */
|
||||
u64 res2 = 0; /* Reserved */
|
||||
u64 magic = 0x5643534952; /* Magic number, little endian, "RISCV" */
|
||||
u32 res3; /* Reserved for additional RISC-V specific header */
|
||||
u32 magic2 = 0x56534905; /* Magic number 2, little endian, "RSC\x05" */
|
||||
u32 res4; /* Reserved for PE COFF offset */
|
||||
|
||||
This header format is compliant with PE/COFF header and largely inspired from
|
||||
@@ -37,13 +37,14 @@ Notes:
|
||||
Bits 16:31 - Major version
|
||||
|
||||
This preserves compatibility across newer and older version of the header.
|
||||
The current version is defined as 0.1.
|
||||
The current version is defined as 0.2.
|
||||
|
||||
- res3 is reserved for offset to any other additional fields. This makes the
|
||||
header extendible in future. One example would be to accommodate ISA
|
||||
extension for RISC-V in future. For current version, it is set to be zero.
|
||||
- The "magic" field is deprecated as of version 0.2. In a future
|
||||
release, it may be removed. This originally should have matched up
|
||||
with the ARM64 header "magic" field, but unfortunately does not.
|
||||
The "magic2" field replaces it, matching up with the ARM64 header.
|
||||
|
||||
- In current header, the flag field has only one field.
|
||||
- In current header, the flags field has only one field.
|
||||
Bit 0: Kernel endianness. 1 if BE, 0 if LE.
|
||||
|
||||
- Image size is mandatory for boot loader to load kernel image. Booting will
|
||||
|
||||
@@ -17699,8 +17699,7 @@ F: include/uapi/linux/dqblk_xfs.h
|
||||
F: include/uapi/linux/fsmap.h
|
||||
|
||||
XILINX AXI ETHERNET DRIVER
|
||||
M: Anirudha Sarangi <anirudh@xilinx.com>
|
||||
M: John Linn <John.Linn@xilinx.com>
|
||||
M: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/xilinx/xilinx_axienet*
|
||||
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc8
|
||||
EXTRAVERSION =
|
||||
NAME = Bobtail Squid
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
#ifndef __ASM_IMAGE_H
|
||||
#define __ASM_IMAGE_H
|
||||
|
||||
#define RISCV_IMAGE_MAGIC "RISCV"
|
||||
#define RISCV_IMAGE_MAGIC "RISCV\0\0\0"
|
||||
#define RISCV_IMAGE_MAGIC2 "RSC\x05"
|
||||
|
||||
#define RISCV_IMAGE_FLAG_BE_SHIFT 0
|
||||
#define RISCV_IMAGE_FLAG_BE_MASK 0x1
|
||||
@@ -23,7 +24,7 @@
|
||||
#define __HEAD_FLAGS (__HEAD_FLAG(BE))
|
||||
|
||||
#define RISCV_HEADER_VERSION_MAJOR 0
|
||||
#define RISCV_HEADER_VERSION_MINOR 1
|
||||
#define RISCV_HEADER_VERSION_MINOR 2
|
||||
|
||||
#define RISCV_HEADER_VERSION (RISCV_HEADER_VERSION_MAJOR << 16 | \
|
||||
RISCV_HEADER_VERSION_MINOR)
|
||||
@@ -39,9 +40,8 @@
|
||||
* @version: version
|
||||
* @res1: reserved
|
||||
* @res2: reserved
|
||||
* @magic: Magic number
|
||||
* @res3: reserved (will be used for additional RISC-V specific
|
||||
* header)
|
||||
* @magic: Magic number (RISC-V specific; deprecated)
|
||||
* @magic2: Magic number 2 (to match the ARM64 'magic' field pos)
|
||||
* @res4: reserved (will be used for PE COFF offset)
|
||||
*
|
||||
* The intention is for this header format to be shared between multiple
|
||||
@@ -58,7 +58,7 @@ struct riscv_image_header {
|
||||
u32 res1;
|
||||
u64 res2;
|
||||
u64 magic;
|
||||
u32 res3;
|
||||
u32 magic2;
|
||||
u32 res4;
|
||||
};
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
@@ -39,9 +39,9 @@ ENTRY(_start)
|
||||
.word RISCV_HEADER_VERSION
|
||||
.word 0
|
||||
.dword 0
|
||||
.asciz RISCV_IMAGE_MAGIC
|
||||
.word 0
|
||||
.ascii RISCV_IMAGE_MAGIC
|
||||
.balign 4
|
||||
.ascii RISCV_IMAGE_MAGIC2
|
||||
.word 0
|
||||
|
||||
.global _start_kernel
|
||||
|
||||
@@ -1961,6 +1961,16 @@ int s390int_to_s390irq(struct kvm_s390_interrupt *s390int,
|
||||
case KVM_S390_MCHK:
|
||||
irq->u.mchk.mcic = s390int->parm64;
|
||||
break;
|
||||
case KVM_S390_INT_PFAULT_INIT:
|
||||
irq->u.ext.ext_params = s390int->parm;
|
||||
irq->u.ext.ext_params2 = s390int->parm64;
|
||||
break;
|
||||
case KVM_S390_RESTART:
|
||||
case KVM_S390_INT_CLOCK_COMP:
|
||||
case KVM_S390_INT_CPU_TIMER:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1018,6 +1018,8 @@ static int kvm_s390_vm_start_migration(struct kvm *kvm)
|
||||
/* mark all the pages in active slots as dirty */
|
||||
for (slotnr = 0; slotnr < slots->used_slots; slotnr++) {
|
||||
ms = slots->memslots + slotnr;
|
||||
if (!ms->dirty_bitmap)
|
||||
return -EINVAL;
|
||||
/*
|
||||
* The second half of the bitmap is only used on x86,
|
||||
* and would be wasted otherwise, so we put it to good
|
||||
@@ -4323,7 +4325,7 @@ long kvm_arch_vcpu_async_ioctl(struct file *filp,
|
||||
}
|
||||
case KVM_S390_INTERRUPT: {
|
||||
struct kvm_s390_interrupt s390int;
|
||||
struct kvm_s390_irq s390irq;
|
||||
struct kvm_s390_irq s390irq = {};
|
||||
|
||||
if (copy_from_user(&s390int, argp, sizeof(s390int)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -336,25 +336,28 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
|
||||
{
|
||||
long err;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SYSVIPC))
|
||||
return -ENOSYS;
|
||||
|
||||
/* No need for backward compatibility. We can start fresh... */
|
||||
if (call <= SEMTIMEDOP) {
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
err = sys_semtimedop(first, ptr,
|
||||
(unsigned int)second, NULL);
|
||||
err = ksys_semtimedop(first, ptr,
|
||||
(unsigned int)second, NULL);
|
||||
goto out;
|
||||
case SEMTIMEDOP:
|
||||
err = sys_semtimedop(first, ptr, (unsigned int)second,
|
||||
err = ksys_semtimedop(first, ptr, (unsigned int)second,
|
||||
(const struct __kernel_timespec __user *)
|
||||
(unsigned long) fifth);
|
||||
(unsigned long) fifth);
|
||||
goto out;
|
||||
case SEMGET:
|
||||
err = sys_semget(first, (int)second, (int)third);
|
||||
err = ksys_semget(first, (int)second, (int)third);
|
||||
goto out;
|
||||
case SEMCTL: {
|
||||
err = sys_semctl(first, second,
|
||||
(int)third | IPC_64,
|
||||
(unsigned long) ptr);
|
||||
err = ksys_old_semctl(first, second,
|
||||
(int)third | IPC_64,
|
||||
(unsigned long) ptr);
|
||||
goto out;
|
||||
}
|
||||
default:
|
||||
@@ -365,18 +368,18 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
|
||||
if (call <= MSGCTL) {
|
||||
switch (call) {
|
||||
case MSGSND:
|
||||
err = sys_msgsnd(first, ptr, (size_t)second,
|
||||
err = ksys_msgsnd(first, ptr, (size_t)second,
|
||||
(int)third);
|
||||
goto out;
|
||||
case MSGRCV:
|
||||
err = sys_msgrcv(first, ptr, (size_t)second, fifth,
|
||||
err = ksys_msgrcv(first, ptr, (size_t)second, fifth,
|
||||
(int)third);
|
||||
goto out;
|
||||
case MSGGET:
|
||||
err = sys_msgget((key_t)first, (int)second);
|
||||
err = ksys_msgget((key_t)first, (int)second);
|
||||
goto out;
|
||||
case MSGCTL:
|
||||
err = sys_msgctl(first, (int)second | IPC_64, ptr);
|
||||
err = ksys_old_msgctl(first, (int)second | IPC_64, ptr);
|
||||
goto out;
|
||||
default:
|
||||
err = -ENOSYS;
|
||||
@@ -396,13 +399,13 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
|
||||
goto out;
|
||||
}
|
||||
case SHMDT:
|
||||
err = sys_shmdt(ptr);
|
||||
err = ksys_shmdt(ptr);
|
||||
goto out;
|
||||
case SHMGET:
|
||||
err = sys_shmget(first, (size_t)second, (int)third);
|
||||
err = ksys_shmget(first, (size_t)second, (int)third);
|
||||
goto out;
|
||||
case SHMCTL:
|
||||
err = sys_shmctl(first, (int)second | IPC_64, ptr);
|
||||
err = ksys_old_shmctl(first, (int)second | IPC_64, ptr);
|
||||
goto out;
|
||||
default:
|
||||
err = -ENOSYS;
|
||||
|
||||
@@ -335,6 +335,7 @@ struct kvm_mmu_page {
|
||||
int root_count; /* Currently serving as active root */
|
||||
unsigned int unsync_children;
|
||||
struct kvm_rmap_head parent_ptes; /* rmap pointers to parent sptes */
|
||||
unsigned long mmu_valid_gen;
|
||||
DECLARE_BITMAP(unsync_child_bitmap, 512);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
@@ -856,6 +857,7 @@ struct kvm_arch {
|
||||
unsigned long n_requested_mmu_pages;
|
||||
unsigned long n_max_mmu_pages;
|
||||
unsigned int indirect_shadow_pages;
|
||||
unsigned long mmu_valid_gen;
|
||||
struct hlist_head mmu_page_hash[KVM_NUM_MMU_PAGES];
|
||||
/*
|
||||
* Hash table of struct kvm_mmu_page.
|
||||
|
||||
@@ -834,6 +834,10 @@ bool __init apic_needs_pit(void)
|
||||
if (!boot_cpu_has(X86_FEATURE_APIC))
|
||||
return true;
|
||||
|
||||
/* Virt guests may lack ARAT, but still have DEADLINE */
|
||||
if (!boot_cpu_has(X86_FEATURE_ARAT))
|
||||
return true;
|
||||
|
||||
/* Deadline timer is based on TSC so no further PIT action required */
|
||||
if (boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER))
|
||||
return false;
|
||||
|
||||
@@ -2095,6 +2095,12 @@ static struct kvm_mmu_page *kvm_mmu_alloc_page(struct kvm_vcpu *vcpu, int direct
|
||||
if (!direct)
|
||||
sp->gfns = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_cache);
|
||||
set_page_private(virt_to_page(sp->spt), (unsigned long)sp);
|
||||
|
||||
/*
|
||||
* active_mmu_pages must be a FIFO list, as kvm_zap_obsolete_pages()
|
||||
* depends on valid pages being added to the head of the list. See
|
||||
* comments in kvm_zap_obsolete_pages().
|
||||
*/
|
||||
list_add(&sp->link, &vcpu->kvm->arch.active_mmu_pages);
|
||||
kvm_mod_used_mmu_pages(vcpu->kvm, +1);
|
||||
return sp;
|
||||
@@ -2244,7 +2250,7 @@ static void kvm_mmu_commit_zap_page(struct kvm *kvm,
|
||||
#define for_each_valid_sp(_kvm, _sp, _gfn) \
|
||||
hlist_for_each_entry(_sp, \
|
||||
&(_kvm)->arch.mmu_page_hash[kvm_page_table_hashfn(_gfn)], hash_link) \
|
||||
if ((_sp)->role.invalid) { \
|
||||
if (is_obsolete_sp((_kvm), (_sp)) || (_sp)->role.invalid) { \
|
||||
} else
|
||||
|
||||
#define for_each_gfn_indirect_valid_sp(_kvm, _sp, _gfn) \
|
||||
@@ -2301,6 +2307,11 @@ static void kvm_mmu_audit(struct kvm_vcpu *vcpu, int point) { }
|
||||
static void mmu_audit_disable(void) { }
|
||||
#endif
|
||||
|
||||
static bool is_obsolete_sp(struct kvm *kvm, struct kvm_mmu_page *sp)
|
||||
{
|
||||
return unlikely(sp->mmu_valid_gen != kvm->arch.mmu_valid_gen);
|
||||
}
|
||||
|
||||
static bool kvm_sync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||
struct list_head *invalid_list)
|
||||
{
|
||||
@@ -2525,6 +2536,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
|
||||
if (level > PT_PAGE_TABLE_LEVEL && need_sync)
|
||||
flush |= kvm_sync_pages(vcpu, gfn, &invalid_list);
|
||||
}
|
||||
sp->mmu_valid_gen = vcpu->kvm->arch.mmu_valid_gen;
|
||||
clear_page(sp->spt);
|
||||
trace_kvm_mmu_get_page(sp, true);
|
||||
|
||||
@@ -4233,6 +4245,13 @@ static bool fast_cr3_switch(struct kvm_vcpu *vcpu, gpa_t new_cr3,
|
||||
return false;
|
||||
|
||||
if (cached_root_available(vcpu, new_cr3, new_role)) {
|
||||
/*
|
||||
* It is possible that the cached previous root page is
|
||||
* obsolete because of a change in the MMU generation
|
||||
* number. However, changing the generation number is
|
||||
* accompanied by KVM_REQ_MMU_RELOAD, which will free
|
||||
* the root set here and allocate a new one.
|
||||
*/
|
||||
kvm_make_request(KVM_REQ_LOAD_CR3, vcpu);
|
||||
if (!skip_tlb_flush) {
|
||||
kvm_make_request(KVM_REQ_MMU_SYNC, vcpu);
|
||||
@@ -5649,11 +5668,89 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu)
|
||||
return alloc_mmu_pages(vcpu);
|
||||
}
|
||||
|
||||
|
||||
static void kvm_zap_obsolete_pages(struct kvm *kvm)
|
||||
{
|
||||
struct kvm_mmu_page *sp, *node;
|
||||
LIST_HEAD(invalid_list);
|
||||
int ign;
|
||||
|
||||
restart:
|
||||
list_for_each_entry_safe_reverse(sp, node,
|
||||
&kvm->arch.active_mmu_pages, link) {
|
||||
/*
|
||||
* No obsolete valid page exists before a newly created page
|
||||
* since active_mmu_pages is a FIFO list.
|
||||
*/
|
||||
if (!is_obsolete_sp(kvm, sp))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Do not repeatedly zap a root page to avoid unnecessary
|
||||
* KVM_REQ_MMU_RELOAD, otherwise we may not be able to
|
||||
* progress:
|
||||
* vcpu 0 vcpu 1
|
||||
* call vcpu_enter_guest():
|
||||
* 1): handle KVM_REQ_MMU_RELOAD
|
||||
* and require mmu-lock to
|
||||
* load mmu
|
||||
* repeat:
|
||||
* 1): zap root page and
|
||||
* send KVM_REQ_MMU_RELOAD
|
||||
*
|
||||
* 2): if (cond_resched_lock(mmu-lock))
|
||||
*
|
||||
* 2): hold mmu-lock and load mmu
|
||||
*
|
||||
* 3): see KVM_REQ_MMU_RELOAD bit
|
||||
* on vcpu->requests is set
|
||||
* then return 1 to call
|
||||
* vcpu_enter_guest() again.
|
||||
* goto repeat;
|
||||
*
|
||||
* Since we are reversely walking the list and the invalid
|
||||
* list will be moved to the head, skip the invalid page
|
||||
* can help us to avoid the infinity list walking.
|
||||
*/
|
||||
if (sp->role.invalid)
|
||||
continue;
|
||||
|
||||
if (need_resched() || spin_needbreak(&kvm->mmu_lock)) {
|
||||
kvm_mmu_commit_zap_page(kvm, &invalid_list);
|
||||
cond_resched_lock(&kvm->mmu_lock);
|
||||
goto restart;
|
||||
}
|
||||
|
||||
if (__kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list, &ign))
|
||||
goto restart;
|
||||
}
|
||||
|
||||
kvm_mmu_commit_zap_page(kvm, &invalid_list);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fast invalidate all shadow pages and use lock-break technique
|
||||
* to zap obsolete pages.
|
||||
*
|
||||
* It's required when memslot is being deleted or VM is being
|
||||
* destroyed, in these cases, we should ensure that KVM MMU does
|
||||
* not use any resource of the being-deleted slot or all slots
|
||||
* after calling the function.
|
||||
*/
|
||||
static void kvm_mmu_zap_all_fast(struct kvm *kvm)
|
||||
{
|
||||
spin_lock(&kvm->mmu_lock);
|
||||
kvm->arch.mmu_valid_gen++;
|
||||
|
||||
kvm_zap_obsolete_pages(kvm);
|
||||
spin_unlock(&kvm->mmu_lock);
|
||||
}
|
||||
|
||||
static void kvm_mmu_invalidate_zap_pages_in_memslot(struct kvm *kvm,
|
||||
struct kvm_memory_slot *slot,
|
||||
struct kvm_page_track_notifier_node *node)
|
||||
{
|
||||
kvm_mmu_zap_all(kvm);
|
||||
kvm_mmu_zap_all_fast(kvm);
|
||||
}
|
||||
|
||||
void kvm_mmu_init_vm(struct kvm *kvm)
|
||||
|
||||
@@ -4540,6 +4540,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu)
|
||||
int len;
|
||||
gva_t gva = 0;
|
||||
struct vmcs12 *vmcs12;
|
||||
struct x86_exception e;
|
||||
short offset;
|
||||
|
||||
if (!nested_vmx_check_permission(vcpu))
|
||||
@@ -4588,7 +4589,8 @@ static int handle_vmread(struct kvm_vcpu *vcpu)
|
||||
vmx_instruction_info, true, len, &gva))
|
||||
return 1;
|
||||
/* _system ok, nested_vmx_check_permission has verified cpl=0 */
|
||||
kvm_write_guest_virt_system(vcpu, gva, &field_value, len, NULL);
|
||||
if (kvm_write_guest_virt_system(vcpu, gva, &field_value, len, &e))
|
||||
kvm_inject_page_fault(vcpu, &e);
|
||||
}
|
||||
|
||||
return nested_vmx_succeed(vcpu);
|
||||
|
||||
@@ -5312,6 +5312,13 @@ int kvm_write_guest_virt_system(struct kvm_vcpu *vcpu, gva_t addr, void *val,
|
||||
/* kvm_write_guest_virt_system can pull in tons of pages. */
|
||||
vcpu->arch.l1tf_flush_l1d = true;
|
||||
|
||||
/*
|
||||
* FIXME: this should call handle_emulation_failure if X86EMUL_IO_NEEDED
|
||||
* is returned, but our callers are not ready for that and they blindly
|
||||
* call kvm_inject_page_fault. Ensure that they at least do not leak
|
||||
* uninitialized kernel stack memory into cr2 and error code.
|
||||
*/
|
||||
memset(exception, 0, sizeof(*exception));
|
||||
return kvm_write_guest_virt_helper(addr, val, bytes, vcpu,
|
||||
PFERR_WRITE_MASK, exception);
|
||||
}
|
||||
|
||||
@@ -18,37 +18,40 @@ targets += purgatory.ro
|
||||
KASAN_SANITIZE := n
|
||||
KCOV_INSTRUMENT := n
|
||||
|
||||
# These are adjustments to the compiler flags used for objects that
|
||||
# make up the standalone purgatory.ro
|
||||
|
||||
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
||||
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
|
||||
|
||||
# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
|
||||
# in turn leaves some undefined symbols like __fentry__ in purgatory and not
|
||||
# sure how to relocate those.
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
CFLAGS_REMOVE_sha256.o += $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_purgatory.o += $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_string.o += $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_kexec-purgatory.o += $(CC_FLAGS_FTRACE)
|
||||
PURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
|
||||
ifdef CONFIG_STACKPROTECTOR
|
||||
CFLAGS_REMOVE_sha256.o += -fstack-protector
|
||||
CFLAGS_REMOVE_purgatory.o += -fstack-protector
|
||||
CFLAGS_REMOVE_string.o += -fstack-protector
|
||||
CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector
|
||||
PURGATORY_CFLAGS_REMOVE += -fstack-protector
|
||||
endif
|
||||
|
||||
ifdef CONFIG_STACKPROTECTOR_STRONG
|
||||
CFLAGS_REMOVE_sha256.o += -fstack-protector-strong
|
||||
CFLAGS_REMOVE_purgatory.o += -fstack-protector-strong
|
||||
CFLAGS_REMOVE_string.o += -fstack-protector-strong
|
||||
CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector-strong
|
||||
PURGATORY_CFLAGS_REMOVE += -fstack-protector-strong
|
||||
endif
|
||||
|
||||
ifdef CONFIG_RETPOLINE
|
||||
CFLAGS_REMOVE_sha256.o += $(RETPOLINE_CFLAGS)
|
||||
CFLAGS_REMOVE_purgatory.o += $(RETPOLINE_CFLAGS)
|
||||
CFLAGS_REMOVE_string.o += $(RETPOLINE_CFLAGS)
|
||||
CFLAGS_REMOVE_kexec-purgatory.o += $(RETPOLINE_CFLAGS)
|
||||
PURGATORY_CFLAGS_REMOVE += $(RETPOLINE_CFLAGS)
|
||||
endif
|
||||
|
||||
CFLAGS_REMOVE_purgatory.o += $(PURGATORY_CFLAGS_REMOVE)
|
||||
CFLAGS_purgatory.o += $(PURGATORY_CFLAGS)
|
||||
|
||||
CFLAGS_REMOVE_sha256.o += $(PURGATORY_CFLAGS_REMOVE)
|
||||
CFLAGS_sha256.o += $(PURGATORY_CFLAGS)
|
||||
|
||||
CFLAGS_REMOVE_string.o += $(PURGATORY_CFLAGS_REMOVE)
|
||||
CFLAGS_string.o += $(PURGATORY_CFLAGS)
|
||||
|
||||
$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
|
||||
@@ -337,7 +337,7 @@ static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
usb_free_urb(urb);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int bpa10x_set_diag(struct hci_dev *hdev, bool enable)
|
||||
|
||||
@@ -384,6 +384,9 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x13d3, 0x3526), .driver_info = BTUSB_REALTEK },
|
||||
{ USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK },
|
||||
|
||||
/* Additional Realtek 8822CE Bluetooth devices */
|
||||
{ USB_DEVICE(0x04ca, 0x4005), .driver_info = BTUSB_REALTEK },
|
||||
|
||||
/* Silicon Wave based devices */
|
||||
{ USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
|
||||
|
||||
@@ -1170,10 +1173,6 @@ static int btusb_open(struct hci_dev *hdev)
|
||||
}
|
||||
|
||||
data->intf->needs_remote_wakeup = 1;
|
||||
/* device specific wakeup source enabled and required for USB
|
||||
* remote wakeup while host is suspended
|
||||
*/
|
||||
device_wakeup_enable(&data->udev->dev);
|
||||
|
||||
if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
|
||||
goto done;
|
||||
@@ -1238,7 +1237,6 @@ static int btusb_close(struct hci_dev *hdev)
|
||||
goto failed;
|
||||
|
||||
data->intf->needs_remote_wakeup = 0;
|
||||
device_wakeup_disable(&data->udev->dev);
|
||||
usb_autopm_put_interface(data->intf);
|
||||
|
||||
failed:
|
||||
|
||||
@@ -309,13 +309,14 @@ static void qca_wq_awake_device(struct work_struct *work)
|
||||
ws_awake_device);
|
||||
struct hci_uart *hu = qca->hu;
|
||||
unsigned long retrans_delay;
|
||||
unsigned long flags;
|
||||
|
||||
BT_DBG("hu %p wq awake device", hu);
|
||||
|
||||
/* Vote for serial clock */
|
||||
serial_clock_vote(HCI_IBS_TX_VOTE_CLOCK_ON, hu);
|
||||
|
||||
spin_lock(&qca->hci_ibs_lock);
|
||||
spin_lock_irqsave(&qca->hci_ibs_lock, flags);
|
||||
|
||||
/* Send wake indication to device */
|
||||
if (send_hci_ibs_cmd(HCI_IBS_WAKE_IND, hu) < 0)
|
||||
@@ -327,7 +328,7 @@ static void qca_wq_awake_device(struct work_struct *work)
|
||||
retrans_delay = msecs_to_jiffies(qca->wake_retrans);
|
||||
mod_timer(&qca->wake_retrans_timer, jiffies + retrans_delay);
|
||||
|
||||
spin_unlock(&qca->hci_ibs_lock);
|
||||
spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
|
||||
|
||||
/* Actually send the packets */
|
||||
hci_uart_tx_wakeup(hu);
|
||||
@@ -338,12 +339,13 @@ static void qca_wq_awake_rx(struct work_struct *work)
|
||||
struct qca_data *qca = container_of(work, struct qca_data,
|
||||
ws_awake_rx);
|
||||
struct hci_uart *hu = qca->hu;
|
||||
unsigned long flags;
|
||||
|
||||
BT_DBG("hu %p wq awake rx", hu);
|
||||
|
||||
serial_clock_vote(HCI_IBS_RX_VOTE_CLOCK_ON, hu);
|
||||
|
||||
spin_lock(&qca->hci_ibs_lock);
|
||||
spin_lock_irqsave(&qca->hci_ibs_lock, flags);
|
||||
qca->rx_ibs_state = HCI_IBS_RX_AWAKE;
|
||||
|
||||
/* Always acknowledge device wake up,
|
||||
@@ -354,7 +356,7 @@ static void qca_wq_awake_rx(struct work_struct *work)
|
||||
|
||||
qca->ibs_sent_wacks++;
|
||||
|
||||
spin_unlock(&qca->hci_ibs_lock);
|
||||
spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
|
||||
|
||||
/* Actually send the packets */
|
||||
hci_uart_tx_wakeup(hu);
|
||||
|
||||
@@ -309,6 +309,7 @@ static const struct file_operations gpio_mockup_debugfs_ops = {
|
||||
.read = gpio_mockup_debugfs_read,
|
||||
.write = gpio_mockup_debugfs_write,
|
||||
.llseek = no_llseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static void gpio_mockup_debugfs_setup(struct device *dev,
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
@@ -19,6 +20,11 @@
|
||||
|
||||
#include "gpiolib.h"
|
||||
|
||||
static int run_edge_events_on_boot = -1;
|
||||
module_param(run_edge_events_on_boot, int, 0444);
|
||||
MODULE_PARM_DESC(run_edge_events_on_boot,
|
||||
"Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
|
||||
|
||||
/**
|
||||
* struct acpi_gpio_event - ACPI GPIO event handler data
|
||||
*
|
||||
@@ -170,10 +176,13 @@ static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
|
||||
event->irq_requested = true;
|
||||
|
||||
/* Make sure we trigger the initial state of edge-triggered IRQs */
|
||||
value = gpiod_get_raw_value_cansleep(event->desc);
|
||||
if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
|
||||
((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
|
||||
event->handler(event->irq, event);
|
||||
if (run_edge_events_on_boot &&
|
||||
(event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) {
|
||||
value = gpiod_get_raw_value_cansleep(event->desc);
|
||||
if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
|
||||
((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
|
||||
event->handler(event->irq, event);
|
||||
}
|
||||
}
|
||||
|
||||
static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
|
||||
@@ -1283,3 +1292,28 @@ static int acpi_gpio_handle_deferred_request_irqs(void)
|
||||
}
|
||||
/* We must use _sync so that this runs after the first deferred_probe run */
|
||||
late_initcall_sync(acpi_gpio_handle_deferred_request_irqs);
|
||||
|
||||
static const struct dmi_system_id run_edge_events_on_boot_blacklist[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
|
||||
}
|
||||
},
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
||||
static int acpi_gpio_setup_params(void)
|
||||
{
|
||||
if (run_edge_events_on_boot < 0) {
|
||||
if (dmi_check_system(run_edge_events_on_boot_blacklist))
|
||||
run_edge_events_on_boot = 0;
|
||||
else
|
||||
run_edge_events_on_boot = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Directly after dmi_setup() which runs as core_initcall() */
|
||||
postcore_initcall(acpi_gpio_setup_params);
|
||||
|
||||
@@ -343,36 +343,27 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
|
||||
|
||||
desc = of_get_named_gpiod_flags(dev->of_node, prop_name, idx,
|
||||
&of_flags);
|
||||
/*
|
||||
* -EPROBE_DEFER in our case means that we found a
|
||||
* valid GPIO property, but no controller has been
|
||||
* registered so far.
|
||||
*
|
||||
* This means we don't need to look any further for
|
||||
* alternate name conventions, and we should really
|
||||
* preserve the return code for our user to be able to
|
||||
* retry probing later.
|
||||
*/
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) == -EPROBE_DEFER)
|
||||
return desc;
|
||||
|
||||
if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT))
|
||||
if (!IS_ERR(desc) || PTR_ERR(desc) != -ENOENT)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Special handling for SPI GPIOs if used */
|
||||
if (IS_ERR(desc))
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) {
|
||||
/* Special handling for SPI GPIOs if used */
|
||||
desc = of_find_spi_gpio(dev, con_id, &of_flags);
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER) {
|
||||
}
|
||||
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) {
|
||||
/* This quirk looks up flags and all */
|
||||
desc = of_find_spi_cs_gpio(dev, con_id, idx, flags);
|
||||
if (!IS_ERR(desc))
|
||||
return desc;
|
||||
}
|
||||
|
||||
/* Special handling for regulator GPIOs if used */
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER)
|
||||
if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) {
|
||||
/* Special handling for regulator GPIOs if used */
|
||||
desc = of_find_regulator_gpio(dev, con_id, &of_flags);
|
||||
}
|
||||
|
||||
if (IS_ERR(desc))
|
||||
return desc;
|
||||
|
||||
@@ -535,6 +535,14 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
||||
if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Do not allow both INPUT & OUTPUT flags to be set as they are
|
||||
* contradictory.
|
||||
*/
|
||||
if ((lflags & GPIOHANDLE_REQUEST_INPUT) &&
|
||||
(lflags & GPIOHANDLE_REQUEST_OUTPUT))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If
|
||||
* the hardware actually supports enabling both at the same time the
|
||||
@@ -926,7 +934,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
|
||||
}
|
||||
|
||||
/* This is just wrong: we don't look for events on output lines */
|
||||
if (lflags & GPIOHANDLE_REQUEST_OUTPUT) {
|
||||
if ((lflags & GPIOHANDLE_REQUEST_OUTPUT) ||
|
||||
(lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) ||
|
||||
(lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) {
|
||||
ret = -EINVAL;
|
||||
goto out_free_label;
|
||||
}
|
||||
@@ -940,10 +950,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
|
||||
|
||||
if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
|
||||
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
|
||||
if (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN)
|
||||
set_bit(FLAG_OPEN_DRAIN, &desc->flags);
|
||||
if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)
|
||||
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
|
||||
|
||||
ret = gpiod_direction_input(desc);
|
||||
if (ret)
|
||||
|
||||
@@ -1677,7 +1677,7 @@ static int drm_mode_parse_cmdline_options(char *str, size_t len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *drm_named_modes_whitelist[] = {
|
||||
static const char * const drm_named_modes_whitelist[] = {
|
||||
"NTSC",
|
||||
"PAL",
|
||||
};
|
||||
|
||||
@@ -128,7 +128,15 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
|
||||
limits.max_lane_count = intel_dp_max_lane_count(intel_dp);
|
||||
|
||||
limits.min_bpp = intel_dp_min_bpp(pipe_config);
|
||||
limits.max_bpp = pipe_config->pipe_bpp;
|
||||
/*
|
||||
* FIXME: If all the streams can't fit into the link with
|
||||
* their current pipe_bpp we should reduce pipe_bpp across
|
||||
* the board until things start to fit. Until then we
|
||||
* limit to <= 8bpc since that's what was hardcoded for all
|
||||
* MST streams previously. This hack should be removed once
|
||||
* we have the proper retry logic in place.
|
||||
*/
|
||||
limits.max_bpp = min(pipe_config->pipe_bpp, 24);
|
||||
|
||||
intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits);
|
||||
|
||||
|
||||
@@ -664,15 +664,7 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj,
|
||||
|
||||
for_each_sgt_page(page, sgt_iter, pages) {
|
||||
if (obj->mm.dirty)
|
||||
/*
|
||||
* As this may not be anonymous memory (e.g. shmem)
|
||||
* but exist on a real mapping, we have to lock
|
||||
* the page in order to dirty it -- holding
|
||||
* the page reference is not sufficient to
|
||||
* prevent the inode from being truncated.
|
||||
* Play safe and take the lock.
|
||||
*/
|
||||
set_page_dirty_lock(page);
|
||||
set_page_dirty(page);
|
||||
|
||||
mark_page_accessed(page);
|
||||
put_page(page);
|
||||
|
||||
@@ -308,11 +308,6 @@ static void gen9_ctx_workarounds_init(struct intel_engine_cs *engine,
|
||||
FLOW_CONTROL_ENABLE |
|
||||
PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
|
||||
|
||||
/* Syncing dependencies between camera and graphics:skl,bxt,kbl */
|
||||
if (!IS_COFFEELAKE(i915))
|
||||
WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
|
||||
GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC);
|
||||
|
||||
/* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl,glk,cfl */
|
||||
/* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl,cfl */
|
||||
WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7,
|
||||
|
||||
@@ -342,7 +342,7 @@ int lima_gem_wait(struct drm_file *file, u32 handle, u32 op, s64 timeout_ns)
|
||||
timeout = drm_timeout_abs_to_jiffies(timeout_ns);
|
||||
|
||||
ret = drm_gem_reservation_object_wait(file, handle, write, timeout);
|
||||
if (ret == 0)
|
||||
if (ret == -ETIME)
|
||||
ret = timeout ? -ETIMEDOUT : -EBUSY;
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -688,6 +688,9 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos
|
||||
if (!cdev->ap.applid)
|
||||
return -ENODEV;
|
||||
|
||||
if (count < CAPIMSG_BASELEN)
|
||||
return -EINVAL;
|
||||
|
||||
skb = alloc_skb(count, GFP_USER);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
@@ -698,7 +701,8 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos
|
||||
}
|
||||
mlen = CAPIMSG_LEN(skb->data);
|
||||
if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
|
||||
if ((size_t)(mlen + CAPIMSG_DATALEN(skb->data)) != count) {
|
||||
if (count < CAPI_DATA_B3_REQ_LEN ||
|
||||
(size_t)(mlen + CAPIMSG_DATALEN(skb->data)) != count) {
|
||||
kfree_skb(skb);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -711,6 +715,10 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos
|
||||
CAPIMSG_SETAPPID(skb->data, cdev->ap.applid);
|
||||
|
||||
if (CAPIMSG_CMD(skb->data) == CAPI_DISCONNECT_B3_RESP) {
|
||||
if (count < CAPI_DISCONNECT_B3_RESP_LEN) {
|
||||
kfree_skb(skb);
|
||||
return -EINVAL;
|
||||
}
|
||||
mutex_lock(&cdev->lock);
|
||||
capincci_free(cdev, CAPIMSG_NCCI(skb->data));
|
||||
mutex_unlock(&cdev->lock);
|
||||
|
||||
@@ -597,7 +597,7 @@ static void bcm2835_finish_request(struct bcm2835_host *host)
|
||||
struct dma_chan *terminate_chan = NULL;
|
||||
struct mmc_request *mrq;
|
||||
|
||||
cancel_delayed_work_sync(&host->timeout_work);
|
||||
cancel_delayed_work(&host->timeout_work);
|
||||
|
||||
mrq = host->mrq;
|
||||
|
||||
|
||||
@@ -774,8 +774,6 @@ int renesas_sdhi_probe(struct platform_device *pdev,
|
||||
/* All SDHI have SDIO status bits which must be 1 */
|
||||
mmc_data->flags |= TMIO_MMC_SDIO_STATUS_SETBITS;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
ret = renesas_sdhi_clk_enable(host);
|
||||
if (ret)
|
||||
goto efree;
|
||||
@@ -856,8 +854,6 @@ edisclk:
|
||||
efree:
|
||||
tmio_mmc_host_free(host);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(renesas_sdhi_probe);
|
||||
@@ -869,8 +865,6 @@ int renesas_sdhi_remove(struct platform_device *pdev)
|
||||
tmio_mmc_host_remove(host);
|
||||
renesas_sdhi_clk_disable(host);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(renesas_sdhi_remove);
|
||||
|
||||
@@ -432,7 +432,6 @@ int sdhci_pci_o2_probe_slot(struct sdhci_pci_slot *slot)
|
||||
mmc_hostname(host->mmc));
|
||||
host->flags &= ~SDHCI_SIGNALING_330;
|
||||
host->flags |= SDHCI_SIGNALING_180;
|
||||
host->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
|
||||
host->mmc->caps2 |= MMC_CAP2_NO_SD;
|
||||
host->mmc->caps2 |= MMC_CAP2_NO_SDIO;
|
||||
pci_write_config_dword(chip->pdev,
|
||||
@@ -682,6 +681,7 @@ static const struct sdhci_ops sdhci_pci_o2_ops = {
|
||||
const struct sdhci_pci_fixes sdhci_o2 = {
|
||||
.probe = sdhci_pci_o2_probe,
|
||||
.quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
|
||||
.quirks2 = SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD,
|
||||
.probe_slot = sdhci_pci_o2_probe_slot,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.resume = sdhci_pci_o2_resume,
|
||||
|
||||
@@ -172,8 +172,6 @@ static int tmio_mmc_probe(struct platform_device *pdev)
|
||||
host->mmc->f_max = pdata->hclk;
|
||||
host->mmc->f_min = pdata->hclk / 512;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
ret = tmio_mmc_host_probe(host);
|
||||
if (ret)
|
||||
goto host_free;
|
||||
@@ -193,7 +191,6 @@ host_remove:
|
||||
tmio_mmc_host_remove(host);
|
||||
host_free:
|
||||
tmio_mmc_host_free(host);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
cell_disable:
|
||||
if (cell->disable)
|
||||
cell->disable(pdev);
|
||||
@@ -210,8 +207,6 @@ static int tmio_mmc_remove(struct platform_device *pdev)
|
||||
if (cell->disable)
|
||||
cell->disable(pdev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -163,6 +163,7 @@ struct tmio_mmc_host {
|
||||
unsigned long last_req_ts;
|
||||
struct mutex ios_lock; /* protect set_ios() context */
|
||||
bool native_hotplug;
|
||||
bool runtime_synced;
|
||||
bool sdio_irq_enabled;
|
||||
|
||||
/* Mandatory callback */
|
||||
|
||||
@@ -1153,15 +1153,6 @@ void tmio_mmc_host_free(struct tmio_mmc_host *host)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmio_mmc_host_free);
|
||||
|
||||
/**
|
||||
* tmio_mmc_host_probe() - Common probe for all implementations
|
||||
* @_host: Host to probe
|
||||
*
|
||||
* Perform tasks common to all implementations probe functions.
|
||||
*
|
||||
* The caller should have called pm_runtime_enable() prior to calling
|
||||
* the common probe function.
|
||||
*/
|
||||
int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
||||
{
|
||||
struct platform_device *pdev = _host->pdev;
|
||||
@@ -1257,19 +1248,22 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
||||
/* See if we also get DMA */
|
||||
tmio_mmc_request_dma(_host, pdata);
|
||||
|
||||
pm_runtime_set_active(&pdev->dev);
|
||||
pm_runtime_set_autosuspend_delay(&pdev->dev, 50);
|
||||
pm_runtime_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
ret = mmc_add_host(mmc);
|
||||
if (ret)
|
||||
goto remove_host;
|
||||
|
||||
dev_pm_qos_expose_latency_limit(&pdev->dev, 100);
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
remove_host:
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
tmio_mmc_host_remove(_host);
|
||||
return ret;
|
||||
}
|
||||
@@ -1280,12 +1274,11 @@ void tmio_mmc_host_remove(struct tmio_mmc_host *host)
|
||||
struct platform_device *pdev = host->pdev;
|
||||
struct mmc_host *mmc = host->mmc;
|
||||
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ)
|
||||
sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0000);
|
||||
|
||||
if (!host->native_hotplug)
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
dev_pm_qos_hide_latency_limit(&pdev->dev);
|
||||
|
||||
mmc_remove_host(mmc);
|
||||
@@ -1294,7 +1287,10 @@ void tmio_mmc_host_remove(struct tmio_mmc_host *host)
|
||||
tmio_mmc_release_dma(host);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
if (host->native_hotplug)
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmio_mmc_host_remove);
|
||||
|
||||
@@ -1337,6 +1333,11 @@ int tmio_mmc_host_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct tmio_mmc_host *host = dev_get_drvdata(dev);
|
||||
|
||||
if (!host->runtime_synced) {
|
||||
host->runtime_synced = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmio_mmc_clk_enable(host);
|
||||
tmio_mmc_hw_reset(host->mmc);
|
||||
|
||||
|
||||
@@ -631,7 +631,6 @@ static int uniphier_sd_probe(struct platform_device *pdev)
|
||||
host->clk_disable = uniphier_sd_clk_disable;
|
||||
host->set_clock = uniphier_sd_set_clock;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
ret = uniphier_sd_clk_enable(host);
|
||||
if (ret)
|
||||
goto free_host;
|
||||
@@ -653,7 +652,6 @@ static int uniphier_sd_probe(struct platform_device *pdev)
|
||||
|
||||
free_host:
|
||||
tmio_mmc_host_free(host);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -664,7 +662,6 @@ static int uniphier_sd_remove(struct platform_device *pdev)
|
||||
|
||||
tmio_mmc_host_remove(host);
|
||||
uniphier_sd_clk_disable(host);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ static const struct hclge_hw_error hclge_igu_egu_tnl_int[] = {
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
{ .int_msk = BIT(1), .msg = "rx_stp_fifo_overflow",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
{ .int_msk = BIT(2), .msg = "rx_stp_fifo_undeflow",
|
||||
{ .int_msk = BIT(2), .msg = "rx_stp_fifo_underflow",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
{ .int_msk = BIT(3), .msg = "tx_buf_overflow",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
|
||||
@@ -1984,8 +1984,11 @@ static void __ibmvnic_reset(struct work_struct *work)
|
||||
rwi = get_next_rwi(adapter);
|
||||
while (rwi) {
|
||||
if (adapter->state == VNIC_REMOVING ||
|
||||
adapter->state == VNIC_REMOVED)
|
||||
goto out;
|
||||
adapter->state == VNIC_REMOVED) {
|
||||
kfree(rwi);
|
||||
rc = EBUSY;
|
||||
break;
|
||||
}
|
||||
|
||||
if (adapter->force_reset_recovery) {
|
||||
adapter->force_reset_recovery = false;
|
||||
@@ -2011,7 +2014,7 @@ static void __ibmvnic_reset(struct work_struct *work)
|
||||
netdev_dbg(adapter->netdev, "Reset failed\n");
|
||||
free_all_rwi(adapter);
|
||||
}
|
||||
out:
|
||||
|
||||
adapter->resetting = false;
|
||||
if (we_lock_rtnl)
|
||||
rtnl_unlock();
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <net/vxlan.h>
|
||||
#include <net/mpls.h>
|
||||
#include <net/xdp_sock.h>
|
||||
#include <net/xfrm.h>
|
||||
|
||||
#include "ixgbe.h"
|
||||
#include "ixgbe_common.h"
|
||||
@@ -2621,7 +2622,7 @@ adjust_by_size:
|
||||
/* 16K ints/sec to 9.2K ints/sec */
|
||||
avg_wire_size *= 15;
|
||||
avg_wire_size += 11452;
|
||||
} else if (avg_wire_size <= 1980) {
|
||||
} else if (avg_wire_size < 1968) {
|
||||
/* 9.2K ints/sec to 8K ints/sec */
|
||||
avg_wire_size *= 5;
|
||||
avg_wire_size += 22420;
|
||||
@@ -2654,6 +2655,8 @@ adjust_by_size:
|
||||
case IXGBE_LINK_SPEED_2_5GB_FULL:
|
||||
case IXGBE_LINK_SPEED_1GB_FULL:
|
||||
case IXGBE_LINK_SPEED_10_FULL:
|
||||
if (avg_wire_size > 8064)
|
||||
avg_wire_size = 8064;
|
||||
itr += DIV_ROUND_UP(avg_wire_size,
|
||||
IXGBE_ITR_ADAPTIVE_MIN_INC * 64) *
|
||||
IXGBE_ITR_ADAPTIVE_MIN_INC;
|
||||
@@ -8695,7 +8698,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||
#endif /* IXGBE_FCOE */
|
||||
|
||||
#ifdef CONFIG_IXGBE_IPSEC
|
||||
if (secpath_exists(skb) &&
|
||||
if (xfrm_offload(skb) &&
|
||||
!ixgbe_ipsec_tx(tx_ring, first, &ipsec_tx))
|
||||
goto out_drop;
|
||||
#endif
|
||||
|
||||
@@ -633,19 +633,17 @@ static void ixgbe_clean_xdp_tx_buffer(struct ixgbe_ring *tx_ring,
|
||||
bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
|
||||
struct ixgbe_ring *tx_ring, int napi_budget)
|
||||
{
|
||||
u16 ntc = tx_ring->next_to_clean, ntu = tx_ring->next_to_use;
|
||||
unsigned int total_packets = 0, total_bytes = 0;
|
||||
u32 i = tx_ring->next_to_clean, xsk_frames = 0;
|
||||
unsigned int budget = q_vector->tx.work_limit;
|
||||
struct xdp_umem *umem = tx_ring->xsk_umem;
|
||||
union ixgbe_adv_tx_desc *tx_desc;
|
||||
struct ixgbe_tx_buffer *tx_bi;
|
||||
bool xmit_done;
|
||||
u32 xsk_frames = 0;
|
||||
|
||||
tx_bi = &tx_ring->tx_buffer_info[i];
|
||||
tx_desc = IXGBE_TX_DESC(tx_ring, i);
|
||||
i -= tx_ring->count;
|
||||
tx_bi = &tx_ring->tx_buffer_info[ntc];
|
||||
tx_desc = IXGBE_TX_DESC(tx_ring, ntc);
|
||||
|
||||
do {
|
||||
while (ntc != ntu) {
|
||||
if (!(tx_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD)))
|
||||
break;
|
||||
|
||||
@@ -661,22 +659,18 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
|
||||
|
||||
tx_bi++;
|
||||
tx_desc++;
|
||||
i++;
|
||||
if (unlikely(!i)) {
|
||||
i -= tx_ring->count;
|
||||
ntc++;
|
||||
if (unlikely(ntc == tx_ring->count)) {
|
||||
ntc = 0;
|
||||
tx_bi = tx_ring->tx_buffer_info;
|
||||
tx_desc = IXGBE_TX_DESC(tx_ring, 0);
|
||||
}
|
||||
|
||||
/* issue prefetch for next Tx descriptor */
|
||||
prefetch(tx_desc);
|
||||
}
|
||||
|
||||
/* update budget accounting */
|
||||
budget--;
|
||||
} while (likely(budget));
|
||||
|
||||
i += tx_ring->count;
|
||||
tx_ring->next_to_clean = i;
|
||||
tx_ring->next_to_clean = ntc;
|
||||
|
||||
u64_stats_update_begin(&tx_ring->syncp);
|
||||
tx_ring->stats.bytes += total_bytes;
|
||||
@@ -688,8 +682,7 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
|
||||
if (xsk_frames)
|
||||
xsk_umem_complete_tx(umem, xsk_frames);
|
||||
|
||||
xmit_done = ixgbe_xmit_zc(tx_ring, q_vector->tx.work_limit);
|
||||
return budget > 0 && xmit_done;
|
||||
return ixgbe_xmit_zc(tx_ring, q_vector->tx.work_limit);
|
||||
}
|
||||
|
||||
int ixgbe_xsk_async_xmit(struct net_device *dev, u32 qid)
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/bpf_trace.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <net/xfrm.h>
|
||||
|
||||
#include "ixgbevf.h"
|
||||
|
||||
@@ -4161,7 +4162,7 @@ static int ixgbevf_xmit_frame_ring(struct sk_buff *skb,
|
||||
first->protocol = vlan_get_protocol(skb);
|
||||
|
||||
#ifdef CONFIG_IXGBEVF_IPSEC
|
||||
if (secpath_exists(skb) && !ixgbevf_ipsec_tx(tx_ring, first, &ipsec_tx))
|
||||
if (xfrm_offload(skb) && !ixgbevf_ipsec_tx(tx_ring, first, &ipsec_tx))
|
||||
goto out_drop;
|
||||
#endif
|
||||
tso = ixgbevf_tso(tx_ring, first, &hdr_len, &ipsec_tx);
|
||||
|
||||
@@ -2240,7 +2240,7 @@ static int mlx4_validate_optimized_steering(struct mlx4_dev *dev)
|
||||
for (i = 1; i <= dev->caps.num_ports; i++) {
|
||||
if (mlx4_dev_port(dev, i, &port_cap)) {
|
||||
mlx4_err(dev,
|
||||
"QUERY_DEV_CAP command failed, can't veify DMFS high rate steering.\n");
|
||||
"QUERY_DEV_CAP command failed, can't verify DMFS high rate steering.\n");
|
||||
} else if ((dev->caps.dmfs_high_steer_mode !=
|
||||
MLX4_STEERING_DMFS_A0_DEFAULT) &&
|
||||
(port_cap.dmfs_optimized_state ==
|
||||
|
||||
@@ -232,9 +232,9 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE);
|
||||
if (!laddr) {
|
||||
printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name);
|
||||
dev_kfree_skb(skb);
|
||||
return NETDEV_TX_BUSY;
|
||||
pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */
|
||||
|
||||
@@ -260,9 +260,6 @@ nfp_flower_cmsg_process_one_rx(struct nfp_app *app, struct sk_buff *skb)
|
||||
|
||||
type = cmsg_hdr->type;
|
||||
switch (type) {
|
||||
case NFP_FLOWER_CMSG_TYPE_PORT_REIFY:
|
||||
nfp_flower_cmsg_portreify_rx(app, skb);
|
||||
break;
|
||||
case NFP_FLOWER_CMSG_TYPE_PORT_MOD:
|
||||
nfp_flower_cmsg_portmod_rx(app, skb);
|
||||
break;
|
||||
@@ -328,8 +325,7 @@ nfp_flower_queue_ctl_msg(struct nfp_app *app, struct sk_buff *skb, int type)
|
||||
struct nfp_flower_priv *priv = app->priv;
|
||||
struct sk_buff_head *skb_head;
|
||||
|
||||
if (type == NFP_FLOWER_CMSG_TYPE_PORT_REIFY ||
|
||||
type == NFP_FLOWER_CMSG_TYPE_PORT_MOD)
|
||||
if (type == NFP_FLOWER_CMSG_TYPE_PORT_MOD)
|
||||
skb_head = &priv->cmsg_skbs_high;
|
||||
else
|
||||
skb_head = &priv->cmsg_skbs_low;
|
||||
@@ -368,6 +364,10 @@ void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
|
||||
} else if (cmsg_hdr->type == NFP_FLOWER_CMSG_TYPE_TUN_NEIGH) {
|
||||
/* Acks from the NFP that the route is added - ignore. */
|
||||
dev_consume_skb_any(skb);
|
||||
} else if (cmsg_hdr->type == NFP_FLOWER_CMSG_TYPE_PORT_REIFY) {
|
||||
/* Handle REIFY acks outside wq to prevent RTNL conflict. */
|
||||
nfp_flower_cmsg_portreify_rx(app, skb);
|
||||
dev_consume_skb_any(skb);
|
||||
} else {
|
||||
nfp_flower_queue_ctl_msg(app, skb, cmsg_hdr->type);
|
||||
}
|
||||
|
||||
@@ -713,6 +713,21 @@ struct nv_skb_map {
|
||||
struct nv_skb_map *next_tx_ctx;
|
||||
};
|
||||
|
||||
struct nv_txrx_stats {
|
||||
u64 stat_rx_packets;
|
||||
u64 stat_rx_bytes; /* not always available in HW */
|
||||
u64 stat_rx_missed_errors;
|
||||
u64 stat_rx_dropped;
|
||||
u64 stat_tx_packets; /* not always available in HW */
|
||||
u64 stat_tx_bytes;
|
||||
u64 stat_tx_dropped;
|
||||
};
|
||||
|
||||
#define nv_txrx_stats_inc(member) \
|
||||
__this_cpu_inc(np->txrx_stats->member)
|
||||
#define nv_txrx_stats_add(member, count) \
|
||||
__this_cpu_add(np->txrx_stats->member, (count))
|
||||
|
||||
/*
|
||||
* SMP locking:
|
||||
* All hardware access under netdev_priv(dev)->lock, except the performance
|
||||
@@ -797,10 +812,7 @@ struct fe_priv {
|
||||
|
||||
/* RX software stats */
|
||||
struct u64_stats_sync swstats_rx_syncp;
|
||||
u64 stat_rx_packets;
|
||||
u64 stat_rx_bytes; /* not always available in HW */
|
||||
u64 stat_rx_missed_errors;
|
||||
u64 stat_rx_dropped;
|
||||
struct nv_txrx_stats __percpu *txrx_stats;
|
||||
|
||||
/* media detection workaround.
|
||||
* Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
|
||||
@@ -826,9 +838,6 @@ struct fe_priv {
|
||||
|
||||
/* TX software stats */
|
||||
struct u64_stats_sync swstats_tx_syncp;
|
||||
u64 stat_tx_packets; /* not always available in HW */
|
||||
u64 stat_tx_bytes;
|
||||
u64 stat_tx_dropped;
|
||||
|
||||
/* msi/msi-x fields */
|
||||
u32 msi_flags;
|
||||
@@ -1721,6 +1730,39 @@ static void nv_update_stats(struct net_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void nv_get_stats(int cpu, struct fe_priv *np,
|
||||
struct rtnl_link_stats64 *storage)
|
||||
{
|
||||
struct nv_txrx_stats *src = per_cpu_ptr(np->txrx_stats, cpu);
|
||||
unsigned int syncp_start;
|
||||
u64 rx_packets, rx_bytes, rx_dropped, rx_missed_errors;
|
||||
u64 tx_packets, tx_bytes, tx_dropped;
|
||||
|
||||
do {
|
||||
syncp_start = u64_stats_fetch_begin_irq(&np->swstats_rx_syncp);
|
||||
rx_packets = src->stat_rx_packets;
|
||||
rx_bytes = src->stat_rx_bytes;
|
||||
rx_dropped = src->stat_rx_dropped;
|
||||
rx_missed_errors = src->stat_rx_missed_errors;
|
||||
} while (u64_stats_fetch_retry_irq(&np->swstats_rx_syncp, syncp_start));
|
||||
|
||||
storage->rx_packets += rx_packets;
|
||||
storage->rx_bytes += rx_bytes;
|
||||
storage->rx_dropped += rx_dropped;
|
||||
storage->rx_missed_errors += rx_missed_errors;
|
||||
|
||||
do {
|
||||
syncp_start = u64_stats_fetch_begin_irq(&np->swstats_tx_syncp);
|
||||
tx_packets = src->stat_tx_packets;
|
||||
tx_bytes = src->stat_tx_bytes;
|
||||
tx_dropped = src->stat_tx_dropped;
|
||||
} while (u64_stats_fetch_retry_irq(&np->swstats_tx_syncp, syncp_start));
|
||||
|
||||
storage->tx_packets += tx_packets;
|
||||
storage->tx_bytes += tx_bytes;
|
||||
storage->tx_dropped += tx_dropped;
|
||||
}
|
||||
|
||||
/*
|
||||
* nv_get_stats64: dev->ndo_get_stats64 function
|
||||
* Get latest stats value from the nic.
|
||||
@@ -1733,7 +1775,7 @@ nv_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *storage)
|
||||
__releases(&netdev_priv(dev)->hwstats_lock)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
unsigned int syncp_start;
|
||||
int cpu;
|
||||
|
||||
/*
|
||||
* Note: because HW stats are not always available and for
|
||||
@@ -1746,20 +1788,8 @@ nv_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *storage)
|
||||
*/
|
||||
|
||||
/* software stats */
|
||||
do {
|
||||
syncp_start = u64_stats_fetch_begin_irq(&np->swstats_rx_syncp);
|
||||
storage->rx_packets = np->stat_rx_packets;
|
||||
storage->rx_bytes = np->stat_rx_bytes;
|
||||
storage->rx_dropped = np->stat_rx_dropped;
|
||||
storage->rx_missed_errors = np->stat_rx_missed_errors;
|
||||
} while (u64_stats_fetch_retry_irq(&np->swstats_rx_syncp, syncp_start));
|
||||
|
||||
do {
|
||||
syncp_start = u64_stats_fetch_begin_irq(&np->swstats_tx_syncp);
|
||||
storage->tx_packets = np->stat_tx_packets;
|
||||
storage->tx_bytes = np->stat_tx_bytes;
|
||||
storage->tx_dropped = np->stat_tx_dropped;
|
||||
} while (u64_stats_fetch_retry_irq(&np->swstats_tx_syncp, syncp_start));
|
||||
for_each_online_cpu(cpu)
|
||||
nv_get_stats(cpu, np, storage);
|
||||
|
||||
/* If the nic supports hw counters then retrieve latest values */
|
||||
if (np->driver_data & DEV_HAS_STATISTICS_V123) {
|
||||
@@ -1827,7 +1857,7 @@ static int nv_alloc_rx(struct net_device *dev)
|
||||
} else {
|
||||
packet_dropped:
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
np->stat_rx_dropped++;
|
||||
nv_txrx_stats_inc(stat_rx_dropped);
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
return 1;
|
||||
}
|
||||
@@ -1869,7 +1899,7 @@ static int nv_alloc_rx_optimized(struct net_device *dev)
|
||||
} else {
|
||||
packet_dropped:
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
np->stat_rx_dropped++;
|
||||
nv_txrx_stats_inc(stat_rx_dropped);
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
return 1;
|
||||
}
|
||||
@@ -2013,7 +2043,7 @@ static void nv_drain_tx(struct net_device *dev)
|
||||
}
|
||||
if (nv_release_txskb(np, &np->tx_skb[i])) {
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_dropped++;
|
||||
nv_txrx_stats_inc(stat_tx_dropped);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
}
|
||||
np->tx_skb[i].dma = 0;
|
||||
@@ -2227,7 +2257,7 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
/* on DMA mapping error - drop the packet */
|
||||
dev_kfree_skb_any(skb);
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_dropped++;
|
||||
nv_txrx_stats_inc(stat_tx_dropped);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -2273,7 +2303,7 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
dev_kfree_skb_any(skb);
|
||||
np->put_tx_ctx = start_tx_ctx;
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_dropped++;
|
||||
nv_txrx_stats_inc(stat_tx_dropped);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -2384,7 +2414,7 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
|
||||
/* on DMA mapping error - drop the packet */
|
||||
dev_kfree_skb_any(skb);
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_dropped++;
|
||||
nv_txrx_stats_inc(stat_tx_dropped);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -2431,7 +2461,7 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
|
||||
dev_kfree_skb_any(skb);
|
||||
np->put_tx_ctx = start_tx_ctx;
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_dropped++;
|
||||
nv_txrx_stats_inc(stat_tx_dropped);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -2560,9 +2590,12 @@ static int nv_tx_done(struct net_device *dev, int limit)
|
||||
&& !(flags & NV_TX_RETRYCOUNT_MASK))
|
||||
nv_legacybackoff_reseed(dev);
|
||||
} else {
|
||||
unsigned int len;
|
||||
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_packets++;
|
||||
np->stat_tx_bytes += np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_inc(stat_tx_packets);
|
||||
len = np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_add(stat_tx_bytes, len);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
}
|
||||
bytes_compl += np->get_tx_ctx->skb->len;
|
||||
@@ -2577,9 +2610,12 @@ static int nv_tx_done(struct net_device *dev, int limit)
|
||||
&& !(flags & NV_TX2_RETRYCOUNT_MASK))
|
||||
nv_legacybackoff_reseed(dev);
|
||||
} else {
|
||||
unsigned int len;
|
||||
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_packets++;
|
||||
np->stat_tx_bytes += np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_inc(stat_tx_packets);
|
||||
len = np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_add(stat_tx_bytes, len);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
}
|
||||
bytes_compl += np->get_tx_ctx->skb->len;
|
||||
@@ -2627,9 +2663,12 @@ static int nv_tx_done_optimized(struct net_device *dev, int limit)
|
||||
nv_legacybackoff_reseed(dev);
|
||||
}
|
||||
} else {
|
||||
unsigned int len;
|
||||
|
||||
u64_stats_update_begin(&np->swstats_tx_syncp);
|
||||
np->stat_tx_packets++;
|
||||
np->stat_tx_bytes += np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_inc(stat_tx_packets);
|
||||
len = np->get_tx_ctx->skb->len;
|
||||
nv_txrx_stats_add(stat_tx_bytes, len);
|
||||
u64_stats_update_end(&np->swstats_tx_syncp);
|
||||
}
|
||||
|
||||
@@ -2806,6 +2845,15 @@ static int nv_getlen(struct net_device *dev, void *packet, int datalen)
|
||||
}
|
||||
}
|
||||
|
||||
static void rx_missing_handler(u32 flags, struct fe_priv *np)
|
||||
{
|
||||
if (flags & NV_RX_MISSEDFRAME) {
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
nv_txrx_stats_inc(stat_rx_missed_errors);
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
}
|
||||
}
|
||||
|
||||
static int nv_rx_process(struct net_device *dev, int limit)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
@@ -2848,11 +2896,7 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
}
|
||||
/* the rest are hard errors */
|
||||
else {
|
||||
if (flags & NV_RX_MISSEDFRAME) {
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
np->stat_rx_missed_errors++;
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
}
|
||||
rx_missing_handler(flags, np);
|
||||
dev_kfree_skb(skb);
|
||||
goto next_pkt;
|
||||
}
|
||||
@@ -2896,8 +2940,8 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
napi_gro_receive(&np->napi, skb);
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
np->stat_rx_packets++;
|
||||
np->stat_rx_bytes += len;
|
||||
nv_txrx_stats_inc(stat_rx_packets);
|
||||
nv_txrx_stats_add(stat_rx_bytes, len);
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
next_pkt:
|
||||
if (unlikely(np->get_rx.orig++ == np->last_rx.orig))
|
||||
@@ -2982,8 +3026,8 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)
|
||||
}
|
||||
napi_gro_receive(&np->napi, skb);
|
||||
u64_stats_update_begin(&np->swstats_rx_syncp);
|
||||
np->stat_rx_packets++;
|
||||
np->stat_rx_bytes += len;
|
||||
nv_txrx_stats_inc(stat_rx_packets);
|
||||
nv_txrx_stats_add(stat_rx_bytes, len);
|
||||
u64_stats_update_end(&np->swstats_rx_syncp);
|
||||
} else {
|
||||
dev_kfree_skb(skb);
|
||||
@@ -5651,6 +5695,12 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
|
||||
SET_NETDEV_DEV(dev, &pci_dev->dev);
|
||||
u64_stats_init(&np->swstats_rx_syncp);
|
||||
u64_stats_init(&np->swstats_tx_syncp);
|
||||
np->txrx_stats = alloc_percpu(struct nv_txrx_stats);
|
||||
if (!np->txrx_stats) {
|
||||
pr_err("np->txrx_stats, alloc memory error.\n");
|
||||
err = -ENOMEM;
|
||||
goto out_alloc_percpu;
|
||||
}
|
||||
|
||||
timer_setup(&np->oom_kick, nv_do_rx_refill, 0);
|
||||
timer_setup(&np->nic_poll, nv_do_nic_poll, 0);
|
||||
@@ -6060,6 +6110,8 @@ out_relreg:
|
||||
out_disable:
|
||||
pci_disable_device(pci_dev);
|
||||
out_free:
|
||||
free_percpu(np->txrx_stats);
|
||||
out_alloc_percpu:
|
||||
free_netdev(dev);
|
||||
out:
|
||||
return err;
|
||||
@@ -6105,6 +6157,9 @@ static void nv_restore_mac_addr(struct pci_dev *pci_dev)
|
||||
static void nv_remove(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct net_device *dev = pci_get_drvdata(pci_dev);
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
|
||||
free_percpu(np->txrx_stats);
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
||||
|
||||
@@ -873,7 +873,12 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv)
|
||||
int ret;
|
||||
u32 reg, val;
|
||||
|
||||
regmap_field_read(gmac->regmap_field, &val);
|
||||
ret = regmap_field_read(gmac->regmap_field, &val);
|
||||
if (ret) {
|
||||
dev_err(priv->device, "Fail to read from regmap field.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
reg = gmac->variant->default_syscon_value;
|
||||
if (reg != val)
|
||||
dev_warn(priv->device,
|
||||
|
||||
@@ -344,10 +344,10 @@ static void sp_bump(struct sixpack *sp, char cmd)
|
||||
|
||||
sp->dev->stats.rx_bytes += count;
|
||||
|
||||
if ((skb = dev_alloc_skb(count)) == NULL)
|
||||
if ((skb = dev_alloc_skb(count + 1)) == NULL)
|
||||
goto out_mem;
|
||||
|
||||
ptr = skb_put(skb, count);
|
||||
ptr = skb_put(skb, count + 1);
|
||||
*ptr++ = cmd; /* KISS command */
|
||||
|
||||
memcpy(ptr, sp->cooked_buf + 1, count);
|
||||
|
||||
@@ -376,8 +376,8 @@ static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_stat
|
||||
* Local device Link partner
|
||||
* Pause AsymDir Pause AsymDir Result
|
||||
* 1 X 1 X TX+RX
|
||||
* 0 1 1 1 RX
|
||||
* 1 1 0 1 TX
|
||||
* 0 1 1 1 TX
|
||||
* 1 1 0 1 RX
|
||||
*/
|
||||
static void phylink_resolve_flow(struct phylink *pl,
|
||||
struct phylink_link_state *state)
|
||||
@@ -398,7 +398,7 @@ static void phylink_resolve_flow(struct phylink *pl,
|
||||
new_pause = MLO_PAUSE_TX | MLO_PAUSE_RX;
|
||||
else if (pause & MLO_PAUSE_ASYM)
|
||||
new_pause = state->pause & MLO_PAUSE_SYM ?
|
||||
MLO_PAUSE_RX : MLO_PAUSE_TX;
|
||||
MLO_PAUSE_TX : MLO_PAUSE_RX;
|
||||
} else {
|
||||
new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK;
|
||||
}
|
||||
|
||||
@@ -787,7 +787,8 @@ static void tun_detach_all(struct net_device *dev)
|
||||
}
|
||||
|
||||
static int tun_attach(struct tun_struct *tun, struct file *file,
|
||||
bool skip_filter, bool napi, bool napi_frags)
|
||||
bool skip_filter, bool napi, bool napi_frags,
|
||||
bool publish_tun)
|
||||
{
|
||||
struct tun_file *tfile = file->private_data;
|
||||
struct net_device *dev = tun->dev;
|
||||
@@ -870,7 +871,8 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
|
||||
* initialized tfile; otherwise we risk using half-initialized
|
||||
* object.
|
||||
*/
|
||||
rcu_assign_pointer(tfile->tun, tun);
|
||||
if (publish_tun)
|
||||
rcu_assign_pointer(tfile->tun, tun);
|
||||
rcu_assign_pointer(tun->tfiles[tun->numqueues], tfile);
|
||||
tun->numqueues++;
|
||||
tun_set_real_num_queues(tun);
|
||||
@@ -2730,7 +2732,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
|
||||
err = tun_attach(tun, file, ifr->ifr_flags & IFF_NOFILTER,
|
||||
ifr->ifr_flags & IFF_NAPI,
|
||||
ifr->ifr_flags & IFF_NAPI_FRAGS);
|
||||
ifr->ifr_flags & IFF_NAPI_FRAGS, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -2829,13 +2831,17 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
|
||||
INIT_LIST_HEAD(&tun->disabled);
|
||||
err = tun_attach(tun, file, false, ifr->ifr_flags & IFF_NAPI,
|
||||
ifr->ifr_flags & IFF_NAPI_FRAGS);
|
||||
ifr->ifr_flags & IFF_NAPI_FRAGS, false);
|
||||
if (err < 0)
|
||||
goto err_free_flow;
|
||||
|
||||
err = register_netdevice(tun->dev);
|
||||
if (err < 0)
|
||||
goto err_detach;
|
||||
/* free_netdev() won't check refcnt, to aovid race
|
||||
* with dev_put() we need publish tun after registration.
|
||||
*/
|
||||
rcu_assign_pointer(tfile->tun, tun);
|
||||
}
|
||||
|
||||
netif_carrier_on(tun->dev);
|
||||
@@ -2978,7 +2984,7 @@ static int tun_set_queue(struct file *file, struct ifreq *ifr)
|
||||
if (ret < 0)
|
||||
goto unlock;
|
||||
ret = tun_attach(tun, file, false, tun->flags & IFF_NAPI,
|
||||
tun->flags & IFF_NAPI_FRAGS);
|
||||
tun->flags & IFF_NAPI_FRAGS, true);
|
||||
} else if (ifr->ifr_flags & IFF_DETACH_QUEUE) {
|
||||
tun = rtnl_dereference(tfile->tun);
|
||||
if (!tun || !(tun->flags & IFF_MULTI_QUEUE) || tfile->detached)
|
||||
|
||||
@@ -206,7 +206,15 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
goto bad_desc;
|
||||
}
|
||||
skip:
|
||||
if (rndis && header.usb_cdc_acm_descriptor &&
|
||||
/* Communcation class functions with bmCapabilities are not
|
||||
* RNDIS. But some Wireless class RNDIS functions use
|
||||
* bmCapabilities for their own purpose. The failsafe is
|
||||
* therefore applied only to Communication class RNDIS
|
||||
* functions. The rndis test is redundant, but a cheap
|
||||
* optimization.
|
||||
*/
|
||||
if (rndis && is_rndis(&intf->cur_altsetting->desc) &&
|
||||
header.usb_cdc_acm_descriptor &&
|
||||
header.usb_cdc_acm_descriptor->bmCapabilities) {
|
||||
dev_dbg(&intf->dev,
|
||||
"ACM capabilities %02x, not really RNDIS?\n",
|
||||
|
||||
@@ -1115,7 +1115,7 @@ static void lmc_running_reset (struct net_device *dev) /*fold00*/
|
||||
sc->lmc_cmdmode |= (TULIP_CMD_TXRUN | TULIP_CMD_RXRUN);
|
||||
LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
|
||||
|
||||
lmc_trace(dev, "lmc_runnin_reset_out");
|
||||
lmc_trace(dev, "lmc_running_reset_out");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -127,6 +127,7 @@ int i2400m_op_rfkill_sw_toggle(struct wimax_dev *wimax_dev,
|
||||
"%d\n", result);
|
||||
result = 0;
|
||||
error_cmd:
|
||||
kfree(cmd);
|
||||
kfree_skb(ack_skb);
|
||||
error_msg_to_dev:
|
||||
error_alloc:
|
||||
|
||||
@@ -1070,18 +1070,18 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
/* same thing for QuZ... */
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QUZ) {
|
||||
if (cfg == &iwl_ax101_cfg_qu_hr)
|
||||
cfg = &iwl_ax101_cfg_quz_hr;
|
||||
else if (cfg == &iwl_ax201_cfg_qu_hr)
|
||||
cfg = &iwl_ax201_cfg_quz_hr;
|
||||
else if (cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9461_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9462_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc;
|
||||
if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_quz_hr;
|
||||
else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax201_cfg_quz_hr;
|
||||
else if (iwl_trans->cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9461_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (iwl_trans->cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9462_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (iwl_trans->cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9560_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (iwl_trans->cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -241,6 +241,9 @@ static int mwifiex_update_vs_ie(const u8 *ies, int ies_len,
|
||||
}
|
||||
|
||||
vs_ie = (struct ieee_types_header *)vendor_ie;
|
||||
if (le16_to_cpu(ie->ie_length) + vs_ie->len + 2 >
|
||||
IEEE_MAX_IE_SIZE)
|
||||
return -EINVAL;
|
||||
memcpy(ie->ie_buffer + le16_to_cpu(ie->ie_length),
|
||||
vs_ie, vs_ie->len + 2);
|
||||
le16_unaligned_add_cpu(&ie->ie_length, vs_ie->len + 2);
|
||||
|
||||
@@ -265,6 +265,8 @@ mwifiex_set_uap_rates(struct mwifiex_uap_bss_param *bss_cfg,
|
||||
|
||||
rate_ie = (void *)cfg80211_find_ie(WLAN_EID_SUPP_RATES, var_pos, len);
|
||||
if (rate_ie) {
|
||||
if (rate_ie->len > MWIFIEX_SUPPORTED_RATES)
|
||||
return;
|
||||
memcpy(bss_cfg->rates, rate_ie + 1, rate_ie->len);
|
||||
rate_len = rate_ie->len;
|
||||
}
|
||||
@@ -272,8 +274,11 @@ mwifiex_set_uap_rates(struct mwifiex_uap_bss_param *bss_cfg,
|
||||
rate_ie = (void *)cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES,
|
||||
params->beacon.tail,
|
||||
params->beacon.tail_len);
|
||||
if (rate_ie)
|
||||
if (rate_ie) {
|
||||
if (rate_ie->len > MWIFIEX_SUPPORTED_RATES - rate_len)
|
||||
return;
|
||||
memcpy(bss_cfg->rates + rate_len, rate_ie + 1, rate_ie->len);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -391,6 +396,8 @@ mwifiex_set_wmm_params(struct mwifiex_private *priv,
|
||||
params->beacon.tail_len);
|
||||
if (vendor_ie) {
|
||||
wmm_ie = vendor_ie;
|
||||
if (*(wmm_ie + 1) > sizeof(struct mwifiex_types_wmm_info))
|
||||
return;
|
||||
memcpy(&bss_cfg->wmm_info, wmm_ie +
|
||||
sizeof(struct ieee_types_header), *(wmm_ie + 1));
|
||||
priv->wmm_enabled = 1;
|
||||
|
||||
@@ -59,6 +59,11 @@ static void mt76x0_set_chip_cap(struct mt76x02_dev *dev)
|
||||
dev_dbg(dev->mt76.dev, "mask out 2GHz support\n");
|
||||
}
|
||||
|
||||
if (is_mt7630(dev)) {
|
||||
dev->mt76.cap.has_5ghz = false;
|
||||
dev_dbg(dev->mt76.dev, "mask out 5GHz support\n");
|
||||
}
|
||||
|
||||
if (!mt76x02_field_valid(nic_conf1 & 0xff))
|
||||
nic_conf1 &= 0xff00;
|
||||
|
||||
|
||||
@@ -62,6 +62,19 @@ static void mt76x0e_stop(struct ieee80211_hw *hw)
|
||||
mt76x0e_stop_hw(dev);
|
||||
}
|
||||
|
||||
static int
|
||||
mt76x0e_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
struct mt76x02_dev *dev = hw->priv;
|
||||
|
||||
if (is_mt7630(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return mt76x02_set_key(hw, cmd, vif, sta, key);
|
||||
}
|
||||
|
||||
static void
|
||||
mt76x0e_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop)
|
||||
@@ -78,7 +91,7 @@ static const struct ieee80211_ops mt76x0e_ops = {
|
||||
.configure_filter = mt76x02_configure_filter,
|
||||
.bss_info_changed = mt76x02_bss_info_changed,
|
||||
.sta_state = mt76_sta_state,
|
||||
.set_key = mt76x02_set_key,
|
||||
.set_key = mt76x0e_set_key,
|
||||
.conf_tx = mt76x02_conf_tx,
|
||||
.sw_scan_start = mt76x02_sw_scan,
|
||||
.sw_scan_complete = mt76x02_sw_scan_complete,
|
||||
|
||||
@@ -1654,13 +1654,18 @@ static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
|
||||
|
||||
rt2800_register_multiread(rt2x00dev, offset,
|
||||
&iveiv_entry, sizeof(iveiv_entry));
|
||||
if ((crypto->cipher == CIPHER_TKIP) ||
|
||||
(crypto->cipher == CIPHER_TKIP_NO_MIC) ||
|
||||
(crypto->cipher == CIPHER_AES))
|
||||
iveiv_entry.iv[3] |= 0x20;
|
||||
iveiv_entry.iv[3] |= key->keyidx << 6;
|
||||
if (crypto->cmd == SET_KEY) {
|
||||
rt2800_register_multiread(rt2x00dev, offset,
|
||||
&iveiv_entry, sizeof(iveiv_entry));
|
||||
if ((crypto->cipher == CIPHER_TKIP) ||
|
||||
(crypto->cipher == CIPHER_TKIP_NO_MIC) ||
|
||||
(crypto->cipher == CIPHER_AES))
|
||||
iveiv_entry.iv[3] |= 0x20;
|
||||
iveiv_entry.iv[3] |= key->keyidx << 6;
|
||||
} else {
|
||||
memset(&iveiv_entry, 0, sizeof(iveiv_entry));
|
||||
}
|
||||
|
||||
rt2800_register_multiwrite(rt2x00dev, offset,
|
||||
&iveiv_entry, sizeof(iveiv_entry));
|
||||
}
|
||||
@@ -4237,24 +4242,18 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
||||
switch (rt2x00dev->default_ant.rx_chain_num) {
|
||||
case 3:
|
||||
/* Turn on tertiary LNAs */
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN,
|
||||
rf->channel > 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN,
|
||||
rf->channel <= 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1);
|
||||
/* fall-through */
|
||||
case 2:
|
||||
/* Turn on secondary LNAs */
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN,
|
||||
rf->channel > 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN,
|
||||
rf->channel <= 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
|
||||
/* fall-through */
|
||||
case 1:
|
||||
/* Turn on primary LNAs */
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN,
|
||||
rf->channel > 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN,
|
||||
rf->channel <= 14);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -645,7 +645,6 @@ fail_rx:
|
||||
kfree(rsi_dev->tx_buffer);
|
||||
|
||||
fail_eps:
|
||||
kfree(rsi_dev);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ static int st95hf_echo_command(struct st95hf_context *st95context)
|
||||
&echo_response);
|
||||
if (result) {
|
||||
dev_err(&st95context->spicontext.spidev->dev,
|
||||
"err: echo response receieve error = 0x%x\n", result);
|
||||
"err: echo response receive error = 0x%x\n", result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -2552,7 +2552,7 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
|
||||
if (IS_ERR(map))
|
||||
return map;
|
||||
} else
|
||||
map = ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
ctx->maps[ASPEED_IP_LPC] = map;
|
||||
dev_dbg(ctx->dev, "Acquired LPC regmap");
|
||||
@@ -2562,6 +2562,33 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static int aspeed_g5_sig_expr_eval(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
bool enabled)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < expr->ndescs; i++) {
|
||||
const struct aspeed_sig_desc *desc = &expr->descs[i];
|
||||
struct regmap *map;
|
||||
|
||||
map = aspeed_g5_acquire_regmap(ctx, desc->ip);
|
||||
if (IS_ERR(map)) {
|
||||
dev_err(ctx->dev,
|
||||
"Failed to acquire regmap for IP block %d\n",
|
||||
desc->ip);
|
||||
return PTR_ERR(map);
|
||||
}
|
||||
|
||||
ret = aspeed_sig_desc_eval(desc, enabled, ctx->maps[desc->ip]);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure a pin's signal by applying an expression's descriptor state for
|
||||
* all descriptors in the expression.
|
||||
@@ -2647,6 +2674,7 @@ static int aspeed_g5_sig_expr_set(struct aspeed_pinmux_data *ctx,
|
||||
}
|
||||
|
||||
static const struct aspeed_pinmux_ops aspeed_g5_ops = {
|
||||
.eval = aspeed_g5_sig_expr_eval,
|
||||
.set = aspeed_g5_sig_expr_set,
|
||||
};
|
||||
|
||||
|
||||
@@ -78,11 +78,14 @@ int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc,
|
||||
* neither the enabled nor disabled state. Thus we must explicitly test for
|
||||
* either condition as required.
|
||||
*/
|
||||
int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx,
|
||||
int aspeed_sig_expr_eval(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr, bool enabled)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (ctx->ops->eval)
|
||||
return ctx->ops->eval(ctx, expr, enabled);
|
||||
|
||||
for (i = 0; i < expr->ndescs; i++) {
|
||||
const struct aspeed_sig_desc *desc = &expr->descs[i];
|
||||
|
||||
@@ -702,6 +702,8 @@ struct aspeed_pin_function {
|
||||
struct aspeed_pinmux_data;
|
||||
|
||||
struct aspeed_pinmux_ops {
|
||||
int (*eval)(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr, bool enabled);
|
||||
int (*set)(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr, bool enabled);
|
||||
};
|
||||
@@ -722,9 +724,8 @@ struct aspeed_pinmux_data {
|
||||
int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc, bool enabled,
|
||||
struct regmap *map);
|
||||
|
||||
int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
bool enabled);
|
||||
int aspeed_sig_expr_eval(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr, bool enabled);
|
||||
|
||||
static inline int aspeed_sig_expr_set(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
|
||||
@@ -169,16 +169,16 @@ static int act8945a_set_mode(struct regulator_dev *rdev, unsigned int mode)
|
||||
reg = ACT8945A_DCDC3_CTRL;
|
||||
break;
|
||||
case ACT8945A_ID_LDO1:
|
||||
reg = ACT8945A_LDO1_SUS;
|
||||
reg = ACT8945A_LDO1_CTRL;
|
||||
break;
|
||||
case ACT8945A_ID_LDO2:
|
||||
reg = ACT8945A_LDO2_SUS;
|
||||
reg = ACT8945A_LDO2_CTRL;
|
||||
break;
|
||||
case ACT8945A_ID_LDO3:
|
||||
reg = ACT8945A_LDO3_SUS;
|
||||
reg = ACT8945A_LDO3_CTRL;
|
||||
break;
|
||||
case ACT8945A_ID_LDO4:
|
||||
reg = ACT8945A_LDO4_SUS;
|
||||
reg = ACT8945A_LDO4_CTRL;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -205,7 +205,7 @@ static int slg51000_of_parse_cb(struct device_node *np,
|
||||
ena_gpiod = devm_gpiod_get_from_of_node(chip->dev, np,
|
||||
"enable-gpios", 0,
|
||||
gflags, "gpio-en-ldo");
|
||||
if (ena_gpiod) {
|
||||
if (!IS_ERR(ena_gpiod)) {
|
||||
config->ena_gpiod = ena_gpiod;
|
||||
devm_gpiod_unhinge(chip->dev, config->ena_gpiod);
|
||||
}
|
||||
@@ -459,7 +459,7 @@ static int slg51000_i2c_probe(struct i2c_client *client,
|
||||
GPIOD_OUT_HIGH
|
||||
| GPIOD_FLAGS_BIT_NONEXCLUSIVE,
|
||||
"slg51000-cs");
|
||||
if (cs_gpiod) {
|
||||
if (!IS_ERR(cs_gpiod)) {
|
||||
dev_info(dev, "Found chip selector property\n");
|
||||
chip->cs_gpiod = cs_gpiod;
|
||||
}
|
||||
|
||||
@@ -359,6 +359,17 @@ static const u16 VINTANA2_VSEL_table[] = {
|
||||
2500, 2750,
|
||||
};
|
||||
|
||||
/* 600mV to 1450mV in 12.5 mV steps */
|
||||
static const struct regulator_linear_range VDD1_ranges[] = {
|
||||
REGULATOR_LINEAR_RANGE(600000, 0, 68, 12500)
|
||||
};
|
||||
|
||||
/* 600mV to 1450mV in 12.5 mV steps, everything above = 1500mV */
|
||||
static const struct regulator_linear_range VDD2_ranges[] = {
|
||||
REGULATOR_LINEAR_RANGE(600000, 0, 68, 12500),
|
||||
REGULATOR_LINEAR_RANGE(1500000, 69, 69, 12500)
|
||||
};
|
||||
|
||||
static int twl4030ldo_list_voltage(struct regulator_dev *rdev, unsigned index)
|
||||
{
|
||||
struct twlreg_info *info = rdev_get_drvdata(rdev);
|
||||
@@ -427,6 +438,8 @@ static int twl4030smps_get_voltage(struct regulator_dev *rdev)
|
||||
}
|
||||
|
||||
static const struct regulator_ops twl4030smps_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear_range,
|
||||
|
||||
.set_voltage = twl4030smps_set_voltage,
|
||||
.get_voltage = twl4030smps_get_voltage,
|
||||
};
|
||||
@@ -466,7 +479,8 @@ static const struct twlreg_info TWL4030_INFO_##label = { \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define TWL4030_ADJUSTABLE_SMPS(label, offset, num, turnon_delay, remap_conf) \
|
||||
#define TWL4030_ADJUSTABLE_SMPS(label, offset, num, turnon_delay, remap_conf, \
|
||||
n_volt) \
|
||||
static const struct twlreg_info TWL4030_INFO_##label = { \
|
||||
.base = offset, \
|
||||
.id = num, \
|
||||
@@ -479,6 +493,9 @@ static const struct twlreg_info TWL4030_INFO_##label = { \
|
||||
.owner = THIS_MODULE, \
|
||||
.enable_time = turnon_delay, \
|
||||
.of_map_mode = twl4030reg_map_mode, \
|
||||
.n_voltages = n_volt, \
|
||||
.n_linear_ranges = ARRAY_SIZE(label ## _ranges), \
|
||||
.linear_ranges = label ## _ranges, \
|
||||
}, \
|
||||
}
|
||||
|
||||
@@ -518,8 +535,8 @@ TWL4030_ADJUSTABLE_LDO(VSIM, 0x37, 9, 100, 0x00);
|
||||
TWL4030_ADJUSTABLE_LDO(VDAC, 0x3b, 10, 100, 0x08);
|
||||
TWL4030_ADJUSTABLE_LDO(VINTANA2, 0x43, 12, 100, 0x08);
|
||||
TWL4030_ADJUSTABLE_LDO(VIO, 0x4b, 14, 1000, 0x08);
|
||||
TWL4030_ADJUSTABLE_SMPS(VDD1, 0x55, 15, 1000, 0x08);
|
||||
TWL4030_ADJUSTABLE_SMPS(VDD2, 0x63, 16, 1000, 0x08);
|
||||
TWL4030_ADJUSTABLE_SMPS(VDD1, 0x55, 15, 1000, 0x08, 68);
|
||||
TWL4030_ADJUSTABLE_SMPS(VDD2, 0x63, 16, 1000, 0x08, 69);
|
||||
/* VUSBCP is managed *only* by the USB subchip */
|
||||
TWL4030_FIXED_LDO(VINTANA1, 0x3f, 1500, 11, 100, 0x08);
|
||||
TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08);
|
||||
|
||||
@@ -2178,7 +2178,7 @@ static int get_indirect(struct vhost_virtqueue *vq,
|
||||
/* If this is an input descriptor, increment that count. */
|
||||
if (access == VHOST_ACCESS_WO) {
|
||||
*in_num += ret;
|
||||
if (unlikely(log)) {
|
||||
if (unlikely(log && ret)) {
|
||||
log[*log_num].addr = vhost64_to_cpu(vq, desc.addr);
|
||||
log[*log_num].len = vhost32_to_cpu(vq, desc.len);
|
||||
++*log_num;
|
||||
@@ -2319,7 +2319,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
|
||||
/* If this is an input descriptor,
|
||||
* increment that count. */
|
||||
*in_num += ret;
|
||||
if (unlikely(log)) {
|
||||
if (unlikely(log && ret)) {
|
||||
log[*log_num].addr = vhost64_to_cpu(vq, desc.addr);
|
||||
log[*log_num].len = vhost32_to_cpu(vq, desc.len);
|
||||
++*log_num;
|
||||
|
||||
@@ -566,13 +566,17 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
|
||||
|
||||
unmap_release:
|
||||
err_idx = i;
|
||||
i = head;
|
||||
|
||||
if (indirect)
|
||||
i = 0;
|
||||
else
|
||||
i = head;
|
||||
|
||||
for (n = 0; n < total_sg; n++) {
|
||||
if (i == err_idx)
|
||||
break;
|
||||
vring_unmap_one_split(vq, &desc[i]);
|
||||
i = virtio16_to_cpu(_vq->vdev, vq->split.vring.desc[i].next);
|
||||
i = virtio16_to_cpu(_vq->vdev, desc[i].next);
|
||||
}
|
||||
|
||||
if (indirect)
|
||||
|
||||
@@ -3628,6 +3628,13 @@ void wait_on_extent_buffer_writeback(struct extent_buffer *eb)
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
}
|
||||
|
||||
static void end_extent_buffer_writeback(struct extent_buffer *eb)
|
||||
{
|
||||
clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
|
||||
smp_mb__after_atomic();
|
||||
wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock eb pages and flush the bio if we can't the locks
|
||||
*
|
||||
@@ -3699,8 +3706,11 @@ static noinline_for_stack int lock_extent_buffer_for_io(struct extent_buffer *eb
|
||||
|
||||
if (!trylock_page(p)) {
|
||||
if (!flush) {
|
||||
ret = flush_write_bio(epd);
|
||||
if (ret < 0) {
|
||||
int err;
|
||||
|
||||
err = flush_write_bio(epd);
|
||||
if (err < 0) {
|
||||
ret = err;
|
||||
failed_page_nr = i;
|
||||
goto err_unlock;
|
||||
}
|
||||
@@ -3715,16 +3725,23 @@ err_unlock:
|
||||
/* Unlock already locked pages */
|
||||
for (i = 0; i < failed_page_nr; i++)
|
||||
unlock_page(eb->pages[i]);
|
||||
/*
|
||||
* Clear EXTENT_BUFFER_WRITEBACK and wake up anyone waiting on it.
|
||||
* Also set back EXTENT_BUFFER_DIRTY so future attempts to this eb can
|
||||
* be made and undo everything done before.
|
||||
*/
|
||||
btrfs_tree_lock(eb);
|
||||
spin_lock(&eb->refs_lock);
|
||||
set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags);
|
||||
end_extent_buffer_writeback(eb);
|
||||
spin_unlock(&eb->refs_lock);
|
||||
percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, eb->len,
|
||||
fs_info->dirty_metadata_batch);
|
||||
btrfs_clear_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
|
||||
btrfs_tree_unlock(eb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void end_extent_buffer_writeback(struct extent_buffer *eb)
|
||||
{
|
||||
clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
|
||||
smp_mb__after_atomic();
|
||||
wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
|
||||
}
|
||||
|
||||
static void set_btree_ioerr(struct page *page)
|
||||
{
|
||||
struct extent_buffer *eb = (struct extent_buffer *)page->private;
|
||||
|
||||
@@ -4985,7 +4985,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
|
||||
BTRFS_I(inode),
|
||||
LOG_OTHER_INODE_ALL,
|
||||
0, LLONG_MAX, ctx);
|
||||
iput(inode);
|
||||
btrfs_add_delayed_iput(inode);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
@@ -5000,7 +5000,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
|
||||
ret = btrfs_log_inode(trans, root, BTRFS_I(inode),
|
||||
LOG_OTHER_INODE, 0, LLONG_MAX, ctx);
|
||||
if (ret) {
|
||||
iput(inode);
|
||||
btrfs_add_delayed_iput(inode);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -5009,7 +5009,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
|
||||
key.offset = 0;
|
||||
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
|
||||
if (ret < 0) {
|
||||
iput(inode);
|
||||
btrfs_add_delayed_iput(inode);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -5056,7 +5056,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
|
||||
}
|
||||
path->slots[0]++;
|
||||
}
|
||||
iput(inode);
|
||||
btrfs_add_delayed_iput(inode);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -5689,7 +5689,7 @@ process_leaf:
|
||||
}
|
||||
|
||||
if (btrfs_inode_in_log(BTRFS_I(di_inode), trans->transid)) {
|
||||
iput(di_inode);
|
||||
btrfs_add_delayed_iput(di_inode);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5701,7 +5701,7 @@ process_leaf:
|
||||
if (!ret &&
|
||||
btrfs_must_commit_transaction(trans, BTRFS_I(di_inode)))
|
||||
ret = 1;
|
||||
iput(di_inode);
|
||||
btrfs_add_delayed_iput(di_inode);
|
||||
if (ret)
|
||||
goto next_dir_inode;
|
||||
if (ctx->log_new_dentries) {
|
||||
@@ -5848,7 +5848,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
|
||||
if (!ret && ctx && ctx->log_new_dentries)
|
||||
ret = log_new_dir_dentries(trans, root,
|
||||
BTRFS_I(dir_inode), ctx);
|
||||
iput(dir_inode);
|
||||
btrfs_add_delayed_iput(dir_inode);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
@@ -5891,7 +5891,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans,
|
||||
ret = btrfs_log_inode(trans, root, BTRFS_I(inode),
|
||||
LOG_INODE_EXISTS,
|
||||
0, LLONG_MAX, ctx);
|
||||
iput(inode);
|
||||
btrfs_add_delayed_iput(inode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -4641,7 +4641,6 @@ static int __ext4_get_inode_loc(struct inode *inode,
|
||||
struct buffer_head *bh;
|
||||
struct super_block *sb = inode->i_sb;
|
||||
ext4_fsblk_t block;
|
||||
struct blk_plug plug;
|
||||
int inodes_per_block, inode_offset;
|
||||
|
||||
iloc->bh = NULL;
|
||||
@@ -4730,7 +4729,6 @@ make_io:
|
||||
* If we need to do any I/O, try to pre-readahead extra
|
||||
* blocks from the inode table.
|
||||
*/
|
||||
blk_start_plug(&plug);
|
||||
if (EXT4_SB(sb)->s_inode_readahead_blks) {
|
||||
ext4_fsblk_t b, end, table;
|
||||
unsigned num;
|
||||
@@ -4761,7 +4759,6 @@ make_io:
|
||||
get_bh(bh);
|
||||
bh->b_end_io = end_buffer_read_sync;
|
||||
submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh);
|
||||
blk_finish_plug(&plug);
|
||||
wait_on_buffer(bh);
|
||||
if (!buffer_uptodate(bh)) {
|
||||
EXT4_ERROR_INODE_BLOCK(inode, block,
|
||||
|
||||
@@ -11,6 +11,7 @@ struct fixed_phy_status {
|
||||
};
|
||||
|
||||
struct device_node;
|
||||
struct gpio_desc;
|
||||
|
||||
#if IS_ENABLED(CONFIG_FIXED_PHY)
|
||||
extern int fixed_phy_change_carrier(struct net_device *dev, bool new_carrier);
|
||||
|
||||
@@ -1402,4 +1402,23 @@ static inline unsigned int ksys_personality(unsigned int personality)
|
||||
return old;
|
||||
}
|
||||
|
||||
/* for __ARCH_WANT_SYS_IPC */
|
||||
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
||||
unsigned int nsops,
|
||||
const struct __kernel_timespec __user *timeout);
|
||||
long ksys_semget(key_t key, int nsems, int semflg);
|
||||
long ksys_old_semctl(int semid, int semnum, int cmd, unsigned long arg);
|
||||
long ksys_msgget(key_t key, int msgflg);
|
||||
long ksys_old_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
|
||||
long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
||||
long msgtyp, int msgflg);
|
||||
long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
||||
int msgflg);
|
||||
long ksys_shmget(key_t key, size_t size, int shmflg);
|
||||
long ksys_shmdt(char __user *shmaddr);
|
||||
long ksys_old_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct old_timespec32 __user *timeout);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -513,7 +513,7 @@ int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh,
|
||||
struct netlink_callback *cb);
|
||||
|
||||
int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nh,
|
||||
unsigned char *flags, bool skip_oif);
|
||||
u8 rt_family, unsigned char *flags, bool skip_oif);
|
||||
int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nh,
|
||||
int nh_weight);
|
||||
int nh_weight, u8 rt_family);
|
||||
#endif /* _NET_FIB_H */
|
||||
|
||||
@@ -161,7 +161,8 @@ struct nexthop *nexthop_mpath_select(const struct nexthop *nh, int nhsel)
|
||||
}
|
||||
|
||||
static inline
|
||||
int nexthop_mpath_fill_node(struct sk_buff *skb, struct nexthop *nh)
|
||||
int nexthop_mpath_fill_node(struct sk_buff *skb, struct nexthop *nh,
|
||||
u8 rt_family)
|
||||
{
|
||||
struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
|
||||
int i;
|
||||
@@ -172,7 +173,7 @@ int nexthop_mpath_fill_node(struct sk_buff *skb, struct nexthop *nh)
|
||||
struct fib_nh_common *nhc = &nhi->fib_nhc;
|
||||
int weight = nhg->nh_entries[i].weight;
|
||||
|
||||
if (fib_add_nexthop(skb, nhc, weight) < 0)
|
||||
if (fib_add_nexthop(skb, nhc, weight, rt_family) < 0)
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
|
||||
@@ -983,7 +983,6 @@ static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
|
||||
void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
|
||||
|
||||
struct xfrm_if_parms {
|
||||
char name[IFNAMSIZ]; /* name of XFRM device */
|
||||
int link; /* ifindex of underlying L2 interface */
|
||||
u32 if_id; /* interface identifyer */
|
||||
};
|
||||
@@ -991,7 +990,6 @@ struct xfrm_if_parms {
|
||||
struct xfrm_if {
|
||||
struct xfrm_if __rcu *next; /* next interface in list */
|
||||
struct net_device *dev; /* virtual device associated with interface */
|
||||
struct net_device *phydev; /* physical device */
|
||||
struct net *net; /* netns for packet i/o */
|
||||
struct xfrm_if_parms p; /* interface parms */
|
||||
|
||||
|
||||
@@ -569,7 +569,7 @@ __SYSCALL(__NR_semget, sys_semget)
|
||||
__SC_COMP(__NR_semctl, sys_semctl, compat_sys_semctl)
|
||||
#if defined(__ARCH_WANT_TIME32_SYSCALLS) || __BITS_PER_LONG != 32
|
||||
#define __NR_semtimedop 192
|
||||
__SC_COMP(__NR_semtimedop, sys_semtimedop, sys_semtimedop_time32)
|
||||
__SC_3264(__NR_semtimedop, sys_semtimedop_time32, sys_semtimedop)
|
||||
#endif
|
||||
#define __NR_semop 193
|
||||
__SYSCALL(__NR_semop, sys_semop)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#define CAPI_MSG_BASELEN 8
|
||||
#define CAPI_DATA_B3_REQ_LEN (CAPI_MSG_BASELEN+4+4+2+2+2)
|
||||
#define CAPI_DATA_B3_RESP_LEN (CAPI_MSG_BASELEN+4+2)
|
||||
#define CAPI_DISCONNECT_B3_RESP_LEN (CAPI_MSG_BASELEN+4)
|
||||
|
||||
/*----- CAPI commands -----*/
|
||||
#define CAPI_ALERT 0x01
|
||||
|
||||
25
ipc/util.h
25
ipc/util.h
@@ -276,29 +276,7 @@ static inline int compat_ipc_parse_version(int *cmd)
|
||||
*cmd &= ~IPC_64;
|
||||
return version;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* for __ARCH_WANT_SYS_IPC */
|
||||
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
||||
unsigned int nsops,
|
||||
const struct __kernel_timespec __user *timeout);
|
||||
long ksys_semget(key_t key, int nsems, int semflg);
|
||||
long ksys_old_semctl(int semid, int semnum, int cmd, unsigned long arg);
|
||||
long ksys_msgget(key_t key, int msgflg);
|
||||
long ksys_old_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
|
||||
long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
||||
long msgtyp, int msgflg);
|
||||
long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
||||
int msgflg);
|
||||
long ksys_shmget(key_t key, size_t size, int shmflg);
|
||||
long ksys_shmdt(char __user *shmaddr);
|
||||
long ksys_old_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
|
||||
|
||||
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct old_timespec32 __user *timeout);
|
||||
#ifdef CONFIG_COMPAT
|
||||
long compat_ksys_old_semctl(int semid, int semnum, int cmd, int arg);
|
||||
long compat_ksys_old_msgctl(int msqid, int cmd, void __user *uptr);
|
||||
long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
|
||||
@@ -306,6 +284,7 @@ long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
|
||||
long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
|
||||
compat_ssize_t msgsz, int msgflg);
|
||||
long compat_ksys_old_shmctl(int shmid, int cmd, void __user *uptr);
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1772,16 +1772,21 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno,
|
||||
bitmap_from_u64(mask, stack_mask);
|
||||
for_each_set_bit(i, mask, 64) {
|
||||
if (i >= func->allocated_stack / BPF_REG_SIZE) {
|
||||
/* This can happen if backtracking
|
||||
* is propagating stack precision where
|
||||
* caller has larger stack frame
|
||||
* than callee, but backtrack_insn() should
|
||||
* have returned -ENOTSUPP.
|
||||
/* the sequence of instructions:
|
||||
* 2: (bf) r3 = r10
|
||||
* 3: (7b) *(u64 *)(r3 -8) = r0
|
||||
* 4: (79) r4 = *(u64 *)(r10 -8)
|
||||
* doesn't contain jmps. It's backtracked
|
||||
* as a single block.
|
||||
* During backtracking insn 3 is not recognized as
|
||||
* stack access, so at the end of backtracking
|
||||
* stack slot fp-8 is still marked in stack_mask.
|
||||
* However the parent state may not have accessed
|
||||
* fp-8 and it's "unallocated" stack space.
|
||||
* In such case fallback to conservative.
|
||||
*/
|
||||
verbose(env, "BUG spi %d stack_size %d\n",
|
||||
i, func->allocated_stack);
|
||||
WARN_ONCE(1, "verifier backtracking bug");
|
||||
return -EFAULT;
|
||||
mark_all_scalars_precise(env, st);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (func->stack[i].slot_type[0] != STACK_SPILL) {
|
||||
|
||||
@@ -5255,8 +5255,16 @@ static struct cgroup *cgroup_create(struct cgroup *parent)
|
||||
* if the parent has to be frozen, the child has too.
|
||||
*/
|
||||
cgrp->freezer.e_freeze = parent->freezer.e_freeze;
|
||||
if (cgrp->freezer.e_freeze)
|
||||
if (cgrp->freezer.e_freeze) {
|
||||
/*
|
||||
* Set the CGRP_FREEZE flag, so when a process will be
|
||||
* attached to the child cgroup, it will become frozen.
|
||||
* At this point the new cgroup is unpopulated, so we can
|
||||
* consider it frozen immediately.
|
||||
*/
|
||||
set_bit(CGRP_FREEZE, &cgrp->flags);
|
||||
set_bit(CGRP_FROZEN, &cgrp->flags);
|
||||
}
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) {
|
||||
|
||||
@@ -413,7 +413,7 @@ static int hw_breakpoint_parse(struct perf_event *bp,
|
||||
|
||||
int register_perf_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
struct arch_hw_breakpoint hw;
|
||||
struct arch_hw_breakpoint hw = { };
|
||||
int err;
|
||||
|
||||
err = reserve_bp_slot(bp);
|
||||
@@ -461,7 +461,7 @@ int
|
||||
modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *attr,
|
||||
bool check)
|
||||
{
|
||||
struct arch_hw_breakpoint hw;
|
||||
struct arch_hw_breakpoint hw = { };
|
||||
int err;
|
||||
|
||||
err = hw_breakpoint_parse(bp, attr, &hw);
|
||||
|
||||
@@ -2343,6 +2343,8 @@ struct mm_struct *copy_init_mm(void)
|
||||
*
|
||||
* It copies the process, and if successful kick-starts
|
||||
* it and waits for it to finish using the VM if required.
|
||||
*
|
||||
* args->exit_signal is expected to be checked for sanity by the caller.
|
||||
*/
|
||||
long _do_fork(struct kernel_clone_args *args)
|
||||
{
|
||||
@@ -2569,6 +2571,14 @@ noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,
|
||||
if (copy_from_user(&args, uargs, size))
|
||||
return -EFAULT;
|
||||
|
||||
/*
|
||||
* Verify that higher 32bits of exit_signal are unset and that
|
||||
* it is a valid signal
|
||||
*/
|
||||
if (unlikely((args.exit_signal & ~((u64)CSIGNAL)) ||
|
||||
!valid_signal(args.exit_signal)))
|
||||
return -EINVAL;
|
||||
|
||||
*kargs = (struct kernel_clone_args){
|
||||
.flags = args.flags,
|
||||
.pidfd = u64_to_user_ptr(args.pidfd),
|
||||
|
||||
@@ -36,6 +36,8 @@ static void resend_irqs(unsigned long arg)
|
||||
irq = find_first_bit(irqs_resend, nr_irqs);
|
||||
clear_bit(irq, irqs_resend);
|
||||
desc = irq_to_desc(irq);
|
||||
if (!desc)
|
||||
continue;
|
||||
local_irq_disable();
|
||||
desc->handle_irq(desc);
|
||||
local_irq_enable();
|
||||
|
||||
@@ -631,6 +631,9 @@ config SBITMAP
|
||||
config PARMAN
|
||||
tristate "parman" if COMPILE_TEST
|
||||
|
||||
config OBJAGG
|
||||
tristate "objagg" if COMPILE_TEST
|
||||
|
||||
config STRING_SELFTEST
|
||||
tristate "Test string functions"
|
||||
|
||||
@@ -653,6 +656,3 @@ config GENERIC_LIB_CMPDI2
|
||||
|
||||
config GENERIC_LIB_UCMPDI2
|
||||
bool
|
||||
|
||||
config OBJAGG
|
||||
tristate "objagg" if COMPILE_TEST
|
||||
|
||||
@@ -5660,11 +5660,6 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
|
||||
return send_conn_param_neg_reply(hdev, handle,
|
||||
HCI_ERROR_UNKNOWN_CONN_ID);
|
||||
|
||||
if (min < hcon->le_conn_min_interval ||
|
||||
max > hcon->le_conn_max_interval)
|
||||
return send_conn_param_neg_reply(hdev, handle,
|
||||
HCI_ERROR_INVALID_LL_PARAMS);
|
||||
|
||||
if (hci_check_conn_params(min, max, latency, timeout))
|
||||
return send_conn_param_neg_reply(hdev, handle,
|
||||
HCI_ERROR_INVALID_LL_PARAMS);
|
||||
|
||||
@@ -5305,14 +5305,7 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
if (min < hcon->le_conn_min_interval ||
|
||||
max > hcon->le_conn_max_interval) {
|
||||
BT_DBG("requested connection interval exceeds current bounds.");
|
||||
err = -EINVAL;
|
||||
} else {
|
||||
err = hci_check_conn_params(min, max, latency, to_multiplier);
|
||||
}
|
||||
|
||||
err = hci_check_conn_params(min, max, latency, to_multiplier);
|
||||
if (err)
|
||||
rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
|
||||
else
|
||||
|
||||
@@ -437,7 +437,7 @@ static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
|
||||
struct nlmsghdr *nlh;
|
||||
struct nlattr *nest;
|
||||
|
||||
nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), NLM_F_MULTI);
|
||||
nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
|
||||
if (!nlh)
|
||||
return -EMSGSIZE;
|
||||
|
||||
|
||||
@@ -496,6 +496,10 @@ static unsigned int br_nf_pre_routing(void *priv,
|
||||
if (!brnet->call_ip6tables &&
|
||||
!br_opt_get(br, BROPT_NF_CALL_IP6TABLES))
|
||||
return NF_ACCEPT;
|
||||
if (!ipv6_mod_enabled()) {
|
||||
pr_warn_once("Module ipv6 is disabled, so call_ip6tables is not supported.");
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
nf_bridge_pull_encap_header_rcsum(skb);
|
||||
return br_nf_pre_routing_ipv6(priv, skb, state);
|
||||
|
||||
@@ -8758,6 +8758,8 @@ int register_netdevice(struct net_device *dev)
|
||||
ret = notifier_to_errno(ret);
|
||||
if (ret) {
|
||||
rollback_registered(dev);
|
||||
rcu_barrier();
|
||||
|
||||
dev->reg_state = NETREG_UNREGISTERED;
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -3664,6 +3664,25 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
||||
int pos;
|
||||
int dummy;
|
||||
|
||||
if (list_skb && !list_skb->head_frag && skb_headlen(list_skb) &&
|
||||
(skb_shinfo(head_skb)->gso_type & SKB_GSO_DODGY)) {
|
||||
/* gso_size is untrusted, and we have a frag_list with a linear
|
||||
* non head_frag head.
|
||||
*
|
||||
* (we assume checking the first list_skb member suffices;
|
||||
* i.e if either of the list_skb members have non head_frag
|
||||
* head, then the first one has too).
|
||||
*
|
||||
* If head_skb's headlen does not fit requested gso_size, it
|
||||
* means that the frag_list members do NOT terminate on exact
|
||||
* gso_size boundaries. Hence we cannot perform skb_frag_t page
|
||||
* sharing. Therefore we must fallback to copying the frag_list
|
||||
* skbs; we do so by disabling SG.
|
||||
*/
|
||||
if (mss != GSO_BY_FRAGS && mss != skb_headlen(head_skb))
|
||||
features &= ~NETIF_F_SG;
|
||||
}
|
||||
|
||||
__skb_push(head_skb, doffset);
|
||||
proto = skb_network_protocol(head_skb, &dummy);
|
||||
if (unlikely(!proto))
|
||||
|
||||
@@ -656,6 +656,7 @@ static int sock_hash_update_common(struct bpf_map *map, void *key,
|
||||
struct sock *sk, u64 flags)
|
||||
{
|
||||
struct bpf_htab *htab = container_of(map, struct bpf_htab, map);
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
u32 key_size = map->key_size, hash;
|
||||
struct bpf_htab_elem *elem, *elem_new;
|
||||
struct bpf_htab_bucket *bucket;
|
||||
@@ -666,6 +667,8 @@ static int sock_hash_update_common(struct bpf_map *map, void *key,
|
||||
WARN_ON_ONCE(!rcu_read_lock_held());
|
||||
if (unlikely(flags > BPF_EXIST))
|
||||
return -EINVAL;
|
||||
if (unlikely(icsk->icsk_ulp_data))
|
||||
return -EINVAL;
|
||||
|
||||
link = sk_psock_init_link();
|
||||
if (!link)
|
||||
|
||||
@@ -1582,7 +1582,7 @@ failure:
|
||||
}
|
||||
|
||||
int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
unsigned char *flags, bool skip_oif)
|
||||
u8 rt_family, unsigned char *flags, bool skip_oif)
|
||||
{
|
||||
if (nhc->nhc_flags & RTNH_F_DEAD)
|
||||
*flags |= RTNH_F_DEAD;
|
||||
@@ -1613,7 +1613,7 @@ int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
/* if gateway family does not match nexthop family
|
||||
* gateway is encoded as RTA_VIA
|
||||
*/
|
||||
if (nhc->nhc_gw_family != nhc->nhc_family) {
|
||||
if (rt_family != nhc->nhc_gw_family) {
|
||||
int alen = sizeof(struct in6_addr);
|
||||
struct nlattr *nla;
|
||||
struct rtvia *via;
|
||||
@@ -1654,7 +1654,7 @@ EXPORT_SYMBOL_GPL(fib_nexthop_info);
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP_ROUTE_MULTIPATH) || IS_ENABLED(CONFIG_IPV6)
|
||||
int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
int nh_weight)
|
||||
int nh_weight, u8 rt_family)
|
||||
{
|
||||
const struct net_device *dev = nhc->nhc_dev;
|
||||
struct rtnexthop *rtnh;
|
||||
@@ -1667,7 +1667,7 @@ int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
rtnh->rtnh_hops = nh_weight - 1;
|
||||
rtnh->rtnh_ifindex = dev ? dev->ifindex : 0;
|
||||
|
||||
if (fib_nexthop_info(skb, nhc, &flags, true) < 0)
|
||||
if (fib_nexthop_info(skb, nhc, rt_family, &flags, true) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
rtnh->rtnh_flags = flags;
|
||||
@@ -1693,13 +1693,14 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (unlikely(fi->nh)) {
|
||||
if (nexthop_mpath_fill_node(skb, fi->nh) < 0)
|
||||
if (nexthop_mpath_fill_node(skb, fi->nh, AF_INET) < 0)
|
||||
goto nla_put_failure;
|
||||
goto mp_end;
|
||||
}
|
||||
|
||||
for_nexthops(fi) {
|
||||
if (fib_add_nexthop(skb, &nh->nh_common, nh->fib_nh_weight) < 0)
|
||||
if (fib_add_nexthop(skb, &nh->nh_common, nh->fib_nh_weight,
|
||||
AF_INET) < 0)
|
||||
goto nla_put_failure;
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
if (nh->nh_tclassid &&
|
||||
@@ -1775,7 +1776,7 @@ int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,
|
||||
const struct fib_nh_common *nhc = fib_info_nhc(fi, 0);
|
||||
unsigned char flags = 0;
|
||||
|
||||
if (fib_nexthop_info(skb, nhc, &flags, false) < 0)
|
||||
if (fib_nexthop_info(skb, nhc, AF_INET, &flags, false) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
rtm->rtm_flags = flags;
|
||||
|
||||
@@ -266,7 +266,7 @@ static void tcp_ecn_accept_cwr(struct sock *sk, const struct sk_buff *skb)
|
||||
|
||||
static void tcp_ecn_withdraw_cwr(struct tcp_sock *tp)
|
||||
{
|
||||
tp->ecn_flags &= ~TCP_ECN_DEMAND_CWR;
|
||||
tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
|
||||
}
|
||||
|
||||
static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb)
|
||||
|
||||
@@ -223,7 +223,7 @@ static int __net_init ping_v6_proc_init_net(struct net *net)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __net_init ping_v6_proc_exit_net(struct net *net)
|
||||
static void __net_exit ping_v6_proc_exit_net(struct net *net)
|
||||
{
|
||||
remove_proc_entry("icmp6", net->proc_net);
|
||||
}
|
||||
|
||||
@@ -5306,11 +5306,11 @@ static int rt6_fill_node_nexthop(struct sk_buff *skb, struct nexthop *nh,
|
||||
if (nexthop_is_multipath(nh)) {
|
||||
struct nlattr *mp;
|
||||
|
||||
mp = nla_nest_start(skb, RTA_MULTIPATH);
|
||||
mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
|
||||
if (!mp)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nexthop_mpath_fill_node(skb, nh))
|
||||
if (nexthop_mpath_fill_node(skb, nh, AF_INET6))
|
||||
goto nla_put_failure;
|
||||
|
||||
nla_nest_end(skb, mp);
|
||||
@@ -5318,7 +5318,7 @@ static int rt6_fill_node_nexthop(struct sk_buff *skb, struct nexthop *nh,
|
||||
struct fib6_nh *fib6_nh;
|
||||
|
||||
fib6_nh = nexthop_fib6_nh(nh);
|
||||
if (fib_nexthop_info(skb, &fib6_nh->nh_common,
|
||||
if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
|
||||
flags, false) < 0)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
@@ -5447,13 +5447,14 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
|
||||
goto nla_put_failure;
|
||||
|
||||
if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
|
||||
rt->fib6_nh->fib_nh_weight) < 0)
|
||||
rt->fib6_nh->fib_nh_weight, AF_INET6) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
list_for_each_entry_safe(sibling, next_sibling,
|
||||
&rt->fib6_siblings, fib6_siblings) {
|
||||
if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
|
||||
sibling->fib6_nh->fib_nh_weight) < 0)
|
||||
sibling->fib6_nh->fib_nh_weight,
|
||||
AF_INET6) < 0)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
@@ -5470,7 +5471,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
|
||||
|
||||
rtm->rtm_flags |= nh_flags;
|
||||
} else {
|
||||
if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common,
|
||||
if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
|
||||
&nh_flags, false) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
|
||||
@@ -1529,7 +1529,6 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int err;
|
||||
int layer2_update;
|
||||
|
||||
if (params->vlan) {
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
|
||||
@@ -1573,18 +1572,12 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
test_sta_flag(sta, WLAN_STA_ASSOC))
|
||||
rate_control_rate_init(sta);
|
||||
|
||||
layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP;
|
||||
|
||||
err = sta_info_insert_rcu(sta);
|
||||
if (err) {
|
||||
rcu_read_unlock();
|
||||
return err;
|
||||
}
|
||||
|
||||
if (layer2_update)
|
||||
cfg80211_send_layer2_update(sta->sdata->dev, sta->sta.addr);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
@@ -1682,10 +1675,11 @@ static int ieee80211_change_station(struct wiphy *wiphy,
|
||||
sta->sdata = vlansdata;
|
||||
ieee80211_check_fast_xmit(sta);
|
||||
|
||||
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
|
||||
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
||||
ieee80211_vif_inc_num_mcast(sta->sdata);
|
||||
|
||||
cfg80211_send_layer2_update(sta->sdata->dev, sta->sta.addr);
|
||||
cfg80211_send_layer2_update(sta->sdata->dev,
|
||||
sta->sta.addr);
|
||||
}
|
||||
}
|
||||
|
||||
err = sta_apply_parameters(local, sta, params);
|
||||
|
||||
@@ -1979,6 +1979,10 @@ int sta_info_move_state(struct sta_info *sta,
|
||||
ieee80211_check_fast_xmit(sta);
|
||||
ieee80211_check_fast_rx(sta);
|
||||
}
|
||||
if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||
sta->sdata->vif.type == NL80211_IFTYPE_AP)
|
||||
cfg80211_send_layer2_update(sta->sdata->dev,
|
||||
sta->sta.addr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -553,10 +553,8 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
|
||||
goto nla_put_failure;
|
||||
|
||||
if (ctnetlink_dump_status(skb, ct) < 0 ||
|
||||
ctnetlink_dump_timeout(skb, ct) < 0 ||
|
||||
ctnetlink_dump_acct(skb, ct, type) < 0 ||
|
||||
ctnetlink_dump_timestamp(skb, ct) < 0 ||
|
||||
ctnetlink_dump_protoinfo(skb, ct) < 0 ||
|
||||
ctnetlink_dump_helpinfo(skb, ct) < 0 ||
|
||||
ctnetlink_dump_mark(skb, ct) < 0 ||
|
||||
ctnetlink_dump_secctx(skb, ct) < 0 ||
|
||||
@@ -568,6 +566,11 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
|
||||
ctnetlink_dump_ct_synproxy(skb, ct) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (!test_bit(IPS_OFFLOAD_BIT, &ct->status) &&
|
||||
(ctnetlink_dump_timeout(skb, ct) < 0 ||
|
||||
ctnetlink_dump_protoinfo(skb, ct) < 0))
|
||||
goto nla_put_failure;
|
||||
|
||||
nlmsg_end(skb, nlh);
|
||||
return skb->len;
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow)
|
||||
return err;
|
||||
}
|
||||
|
||||
flow->timeout = (u32)jiffies;
|
||||
flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(flow_offload_add);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/netfilter/nf_tables.h>
|
||||
#include <net/netfilter/nf_tables_core.h>
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
#include <net/ipv6.h>
|
||||
|
||||
#include <net/netfilter/nft_fib.h>
|
||||
|
||||
@@ -34,6 +35,8 @@ static void nft_fib_netdev_eval(const struct nft_expr *expr,
|
||||
}
|
||||
break;
|
||||
case ETH_P_IPV6:
|
||||
if (!ipv6_mod_enabled())
|
||||
break;
|
||||
switch (priv->result) {
|
||||
case NFT_FIB_RESULT_OIF:
|
||||
case NFT_FIB_RESULT_OIFNAME:
|
||||
|
||||
@@ -47,9 +47,6 @@ static void nft_socket_eval(const struct nft_expr *expr,
|
||||
return;
|
||||
}
|
||||
|
||||
/* So that subsequent socket matching not to require other lookups. */
|
||||
skb->sk = sk;
|
||||
|
||||
switch(priv->key) {
|
||||
case NFT_SOCKET_TRANSPARENT:
|
||||
nft_reg_store8(dest, inet_sk_transparent(sk));
|
||||
@@ -66,6 +63,9 @@ static void nft_socket_eval(const struct nft_expr *expr,
|
||||
WARN_ON(1);
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
}
|
||||
|
||||
if (sk != skb->sk)
|
||||
sock_gen_put(sk);
|
||||
}
|
||||
|
||||
static const struct nla_policy nft_socket_policy[NFTA_SOCKET_MAX + 1] = {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user