mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
Merge tag 'v5.14' into android-mainline
Linux 5.14 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ie2edcf6ad1f7d17ffbe5322bf2378ff01be31e64
This commit is contained in:
@@ -6955,7 +6955,7 @@ F: include/uapi/linux/mdio.h
|
||||
F: include/uapi/linux/mii.h
|
||||
|
||||
EXFAT FILE SYSTEM
|
||||
M: Namjae Jeon <namjae.jeon@samsung.com>
|
||||
M: Namjae Jeon <linkinjeon@kernel.org>
|
||||
M: Sungjong Seo <sj1557.seo@samsung.com>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION =
|
||||
NAME = Opossums on Parade
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -160,10 +160,11 @@ extern unsigned long vectors_base;
|
||||
|
||||
/*
|
||||
* Physical start and end address of the kernel sections. These addresses are
|
||||
* 2MB-aligned to match the section mappings placed over the kernel.
|
||||
* 2MB-aligned to match the section mappings placed over the kernel. We use
|
||||
* u64 so that LPAE mappings beyond the 32bit limit will work out as well.
|
||||
*/
|
||||
extern u32 kernel_sec_start;
|
||||
extern u32 kernel_sec_end;
|
||||
extern u64 kernel_sec_start;
|
||||
extern u64 kernel_sec_end;
|
||||
|
||||
/*
|
||||
* Physical vs virtual RAM address space conversion. These are
|
||||
|
||||
@@ -49,7 +49,8 @@
|
||||
|
||||
/*
|
||||
* This needs to be assigned at runtime when the linker symbols are
|
||||
* resolved.
|
||||
* resolved. These are unsigned 64bit really, but in this assembly code
|
||||
* We store them as 32bit.
|
||||
*/
|
||||
.pushsection .data
|
||||
.align 2
|
||||
@@ -57,7 +58,9 @@
|
||||
.globl kernel_sec_end
|
||||
kernel_sec_start:
|
||||
.long 0
|
||||
.long 0
|
||||
kernel_sec_end:
|
||||
.long 0
|
||||
.long 0
|
||||
.popsection
|
||||
|
||||
@@ -250,7 +253,11 @@ __create_page_tables:
|
||||
add r0, r4, #KERNEL_OFFSET >> (SECTION_SHIFT - PMD_ORDER)
|
||||
ldr r6, =(_end - 1)
|
||||
adr_l r5, kernel_sec_start @ _pa(kernel_sec_start)
|
||||
str r8, [r5] @ Save physical start of kernel
|
||||
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||
str r8, [r5, #4] @ Save physical start of kernel (BE)
|
||||
#else
|
||||
str r8, [r5] @ Save physical start of kernel (LE)
|
||||
#endif
|
||||
orr r3, r8, r7 @ Add the MMU flags
|
||||
add r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER)
|
||||
1: str r3, [r0], #1 << PMD_ORDER
|
||||
@@ -259,7 +266,11 @@ __create_page_tables:
|
||||
bls 1b
|
||||
eor r3, r3, r7 @ Remove the MMU flags
|
||||
adr_l r5, kernel_sec_end @ _pa(kernel_sec_end)
|
||||
str r3, [r5] @ Save physical end of kernel
|
||||
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||
str r3, [r5, #4] @ Save physical end of kernel (BE)
|
||||
#else
|
||||
str r3, [r5] @ Save physical end of kernel (LE)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
/*
|
||||
|
||||
@@ -1608,6 +1608,13 @@ static void __init early_paging_init(const struct machine_desc *mdesc)
|
||||
if (offset == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Offset the kernel section physical offsets so that the kernel
|
||||
* mapping will work out later on.
|
||||
*/
|
||||
kernel_sec_start += offset;
|
||||
kernel_sec_end += offset;
|
||||
|
||||
/*
|
||||
* Get the address of the remap function in the 1:1 identity
|
||||
* mapping setup by the early page table assembly code. We
|
||||
@@ -1716,7 +1723,7 @@ void __init paging_init(const struct machine_desc *mdesc)
|
||||
{
|
||||
void *zero_page;
|
||||
|
||||
pr_debug("physical kernel sections: 0x%08x-0x%08x\n",
|
||||
pr_debug("physical kernel sections: 0x%08llx-0x%08llx\n",
|
||||
kernel_sec_start, kernel_sec_end);
|
||||
|
||||
prepare_page_table();
|
||||
|
||||
@@ -29,7 +29,7 @@ ENTRY(lpae_pgtables_remap_asm)
|
||||
ldr r6, =(_end - 1)
|
||||
add r7, r2, #0x1000
|
||||
add r6, r7, r6, lsr #SECTION_SHIFT - L2_ORDER
|
||||
add r7, r7, #PAGE_OFFSET >> (SECTION_SHIFT - L2_ORDER)
|
||||
add r7, r7, #KERNEL_OFFSET >> (SECTION_SHIFT - L2_ORDER)
|
||||
1: ldrd r4, r5, [r7]
|
||||
adds r4, r4, r0
|
||||
adc r5, r5, r1
|
||||
|
||||
@@ -156,6 +156,7 @@ config ARM64
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_MMAP_RND_BITS
|
||||
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
||||
select HAVE_ARCH_PFN_VALID
|
||||
select HAVE_ARCH_PREL32_RELOCATIONS
|
||||
select HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
|
||||
@@ -41,6 +41,7 @@ void tag_clear_highpage(struct page *to);
|
||||
|
||||
typedef struct page *pgtable_t;
|
||||
|
||||
int pfn_valid(unsigned long pfn);
|
||||
int pfn_is_map_memory(unsigned long pfn);
|
||||
|
||||
#include <asm/memory.h>
|
||||
|
||||
@@ -219,6 +219,43 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
|
||||
free_area_init(max_zone_pfns);
|
||||
}
|
||||
|
||||
int pfn_valid(unsigned long pfn)
|
||||
{
|
||||
phys_addr_t addr = PFN_PHYS(pfn);
|
||||
struct mem_section *ms;
|
||||
|
||||
/*
|
||||
* Ensure the upper PAGE_SHIFT bits are clear in the
|
||||
* pfn. Else it might lead to false positives when
|
||||
* some of the upper bits are set, but the lower bits
|
||||
* match a valid pfn.
|
||||
*/
|
||||
if (PHYS_PFN(addr) != pfn)
|
||||
return 0;
|
||||
|
||||
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
|
||||
return 0;
|
||||
|
||||
ms = __pfn_to_section(pfn);
|
||||
if (!valid_section(ms))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* ZONE_DEVICE memory does not have the memblock entries.
|
||||
* memblock_is_map_memory() check for ZONE_DEVICE based
|
||||
* addresses will always fail. Even the normal hotplugged
|
||||
* memory will never have MEMBLOCK_NOMAP flag set in their
|
||||
* memblock entries. Skip memblock search for all non early
|
||||
* memory sections covering all of hotplug memory including
|
||||
* both normal and ZONE_DEVICE based.
|
||||
*/
|
||||
if (!early_section(ms))
|
||||
return pfn_section_valid(ms, pfn);
|
||||
|
||||
return memblock_is_memory(addr);
|
||||
}
|
||||
EXPORT_SYMBOL(pfn_valid);
|
||||
|
||||
int pfn_is_map_memory(unsigned long pfn)
|
||||
{
|
||||
phys_addr_t addr = PFN_PHYS(pfn);
|
||||
|
||||
@@ -8,19 +8,4 @@ extern void * memset(void *, int, size_t);
|
||||
#define __HAVE_ARCH_MEMCPY
|
||||
void * memcpy(void * dest,const void *src,size_t count);
|
||||
|
||||
#define __HAVE_ARCH_STRLEN
|
||||
extern size_t strlen(const char *s);
|
||||
|
||||
#define __HAVE_ARCH_STRCPY
|
||||
extern char *strcpy(char *dest, const char *src);
|
||||
|
||||
#define __HAVE_ARCH_STRNCPY
|
||||
extern char *strncpy(char *dest, const char *src, size_t count);
|
||||
|
||||
#define __HAVE_ARCH_STRCAT
|
||||
extern char *strcat(char *dest, const char *src);
|
||||
|
||||
#define __HAVE_ARCH_MEMSET
|
||||
extern void *memset(void *, int, size_t);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -17,10 +17,6 @@
|
||||
|
||||
#include <linux/string.h>
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strcpy);
|
||||
EXPORT_SYMBOL(strncpy);
|
||||
EXPORT_SYMBOL(strcat);
|
||||
|
||||
#include <linux/atomic.h>
|
||||
EXPORT_SYMBOL(__xchg8);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Makefile for parisc-specific library files
|
||||
#
|
||||
|
||||
lib-y := lusercopy.o bitops.o checksum.o io.o memcpy.o \
|
||||
ucmpdi2.o delay.o string.o
|
||||
lib-y := lusercopy.o bitops.o checksum.o io.o memset.o memcpy.o \
|
||||
ucmpdi2.o delay.o
|
||||
|
||||
obj-y := iomap.o
|
||||
|
||||
72
arch/parisc/lib/memset.c
Normal file
72
arch/parisc/lib/memset.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#include <linux/types.h>
|
||||
#include <asm/string.h>
|
||||
|
||||
#define OPSIZ (BITS_PER_LONG/8)
|
||||
typedef unsigned long op_t;
|
||||
|
||||
void *
|
||||
memset (void *dstpp, int sc, size_t len)
|
||||
{
|
||||
unsigned int c = sc;
|
||||
long int dstp = (long int) dstpp;
|
||||
|
||||
if (len >= 8)
|
||||
{
|
||||
size_t xlen;
|
||||
op_t cccc;
|
||||
|
||||
cccc = (unsigned char) c;
|
||||
cccc |= cccc << 8;
|
||||
cccc |= cccc << 16;
|
||||
if (OPSIZ > 4)
|
||||
/* Do the shift in two steps to avoid warning if long has 32 bits. */
|
||||
cccc |= (cccc << 16) << 16;
|
||||
|
||||
/* There are at least some bytes to set.
|
||||
No need to test for LEN == 0 in this alignment loop. */
|
||||
while (dstp % OPSIZ != 0)
|
||||
{
|
||||
((unsigned char *) dstp)[0] = c;
|
||||
dstp += 1;
|
||||
len -= 1;
|
||||
}
|
||||
|
||||
/* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
|
||||
xlen = len / (OPSIZ * 8);
|
||||
while (xlen > 0)
|
||||
{
|
||||
((op_t *) dstp)[0] = cccc;
|
||||
((op_t *) dstp)[1] = cccc;
|
||||
((op_t *) dstp)[2] = cccc;
|
||||
((op_t *) dstp)[3] = cccc;
|
||||
((op_t *) dstp)[4] = cccc;
|
||||
((op_t *) dstp)[5] = cccc;
|
||||
((op_t *) dstp)[6] = cccc;
|
||||
((op_t *) dstp)[7] = cccc;
|
||||
dstp += 8 * OPSIZ;
|
||||
xlen -= 1;
|
||||
}
|
||||
len %= OPSIZ * 8;
|
||||
|
||||
/* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
|
||||
xlen = len / OPSIZ;
|
||||
while (xlen > 0)
|
||||
{
|
||||
((op_t *) dstp)[0] = cccc;
|
||||
dstp += OPSIZ;
|
||||
xlen -= 1;
|
||||
}
|
||||
len %= OPSIZ;
|
||||
}
|
||||
|
||||
/* Write the last few bytes. */
|
||||
while (len > 0)
|
||||
{
|
||||
((unsigned char *) dstp)[0] = c;
|
||||
dstp += 1;
|
||||
len -= 1;
|
||||
}
|
||||
|
||||
return dstpp;
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* PA-RISC assembly string functions
|
||||
*
|
||||
* Copyright (C) 2019 Helge Deller <deller@gmx.de>
|
||||
*/
|
||||
|
||||
#include <asm/assembly.h>
|
||||
#include <linux/linkage.h>
|
||||
|
||||
.section .text.hot
|
||||
.level PA_ASM_LEVEL
|
||||
|
||||
t0 = r20
|
||||
t1 = r21
|
||||
t2 = r22
|
||||
|
||||
ENTRY_CFI(strlen, frame=0,no_calls)
|
||||
or,COND(<>) arg0,r0,ret0
|
||||
b,l,n .Lstrlen_null_ptr,r0
|
||||
depwi 0,31,2,ret0
|
||||
cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned
|
||||
ldw,ma 4(ret0),t0
|
||||
cmpib,tr 0,r0,.Lstrlen_loop
|
||||
uxor,nbz r0,t0,r0
|
||||
.Lstrlen_not_aligned:
|
||||
uaddcm arg0,ret0,t1
|
||||
shladd t1,3,r0,t1
|
||||
mtsar t1
|
||||
depwi -1,%sar,32,t0
|
||||
uxor,nbz r0,t0,r0
|
||||
.Lstrlen_loop:
|
||||
b,l,n .Lstrlen_end_loop,r0
|
||||
ldw,ma 4(ret0),t0
|
||||
cmpib,tr 0,r0,.Lstrlen_loop
|
||||
uxor,nbz r0,t0,r0
|
||||
.Lstrlen_end_loop:
|
||||
extrw,u,<> t0,7,8,r0
|
||||
addib,tr,n -3,ret0,.Lstrlen_out
|
||||
extrw,u,<> t0,15,8,r0
|
||||
addib,tr,n -2,ret0,.Lstrlen_out
|
||||
extrw,u,<> t0,23,8,r0
|
||||
addi -1,ret0,ret0
|
||||
.Lstrlen_out:
|
||||
bv r0(rp)
|
||||
uaddcm ret0,arg0,ret0
|
||||
.Lstrlen_null_ptr:
|
||||
bv,n r0(rp)
|
||||
ENDPROC_CFI(strlen)
|
||||
|
||||
|
||||
ENTRY_CFI(strcpy, frame=0,no_calls)
|
||||
ldb 0(arg1),t0
|
||||
stb t0,0(arg0)
|
||||
ldo 0(arg0),ret0
|
||||
ldo 1(arg1),t1
|
||||
cmpb,= r0,t0,2f
|
||||
ldo 1(arg0),t2
|
||||
1: ldb 0(t1),arg1
|
||||
stb arg1,0(t2)
|
||||
ldo 1(t1),t1
|
||||
cmpb,<> r0,arg1,1b
|
||||
ldo 1(t2),t2
|
||||
2: bv,n r0(rp)
|
||||
ENDPROC_CFI(strcpy)
|
||||
|
||||
|
||||
ENTRY_CFI(strncpy, frame=0,no_calls)
|
||||
ldb 0(arg1),t0
|
||||
stb t0,0(arg0)
|
||||
ldo 1(arg1),t1
|
||||
ldo 0(arg0),ret0
|
||||
cmpb,= r0,t0,2f
|
||||
ldo 1(arg0),arg1
|
||||
1: ldo -1(arg2),arg2
|
||||
cmpb,COND(=),n r0,arg2,2f
|
||||
ldb 0(t1),arg0
|
||||
stb arg0,0(arg1)
|
||||
ldo 1(t1),t1
|
||||
cmpb,<> r0,arg0,1b
|
||||
ldo 1(arg1),arg1
|
||||
2: bv,n r0(rp)
|
||||
ENDPROC_CFI(strncpy)
|
||||
|
||||
|
||||
ENTRY_CFI(strcat, frame=0,no_calls)
|
||||
ldb 0(arg0),t0
|
||||
cmpb,= t0,r0,2f
|
||||
ldo 0(arg0),ret0
|
||||
ldo 1(arg0),arg0
|
||||
1: ldb 0(arg0),t1
|
||||
cmpb,<>,n r0,t1,1b
|
||||
ldo 1(arg0),arg0
|
||||
2: ldb 0(arg1),t2
|
||||
stb t2,0(arg0)
|
||||
ldo 1(arg0),arg0
|
||||
ldb 0(arg1),t0
|
||||
cmpb,<> r0,t0,2b
|
||||
ldo 1(arg1),arg1
|
||||
bv,n r0(rp)
|
||||
ENDPROC_CFI(strcat)
|
||||
|
||||
|
||||
ENTRY_CFI(memset, frame=0,no_calls)
|
||||
copy arg0,ret0
|
||||
cmpb,COND(=) r0,arg0,4f
|
||||
copy arg0,t2
|
||||
cmpb,COND(=) r0,arg2,4f
|
||||
ldo -1(arg2),arg3
|
||||
subi -1,arg3,t0
|
||||
subi 0,t0,t1
|
||||
cmpiclr,COND(>=) 0,t1,arg2
|
||||
ldo -1(t1),arg2
|
||||
extru arg2,31,2,arg0
|
||||
2: stb arg1,0(t2)
|
||||
ldo 1(t2),t2
|
||||
addib,>= -1,arg0,2b
|
||||
ldo -1(arg3),arg3
|
||||
cmpiclr,COND(<=) 4,arg2,r0
|
||||
b,l,n 4f,r0
|
||||
#ifdef CONFIG_64BIT
|
||||
depd,* r0,63,2,arg2
|
||||
#else
|
||||
depw r0,31,2,arg2
|
||||
#endif
|
||||
ldo 1(t2),t2
|
||||
3: stb arg1,-1(t2)
|
||||
stb arg1,0(t2)
|
||||
stb arg1,1(t2)
|
||||
stb arg1,2(t2)
|
||||
addib,COND(>) -4,arg2,3b
|
||||
ldo 4(t2),t2
|
||||
4: bv,n r0(rp)
|
||||
ENDPROC_CFI(memset)
|
||||
|
||||
.end
|
||||
@@ -812,7 +812,6 @@ __start_interrupts:
|
||||
* syscall register convention is in Documentation/powerpc/syscall64-abi.rst
|
||||
*/
|
||||
EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
|
||||
1:
|
||||
/* SCV 0 */
|
||||
mr r9,r13
|
||||
GET_PACA(r13)
|
||||
@@ -842,10 +841,12 @@ EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
|
||||
b system_call_vectored_sigill
|
||||
#endif
|
||||
.endr
|
||||
2:
|
||||
EXC_VIRT_END(system_call_vectored, 0x3000, 0x1000)
|
||||
|
||||
SOFT_MASK_TABLE(1b, 2b) // Treat scv vectors as soft-masked, see comment above.
|
||||
// Treat scv vectors as soft-masked, see comment above.
|
||||
// Use absolute values rather than labels here, so they don't get relocated,
|
||||
// because this code runs unrelocated.
|
||||
SOFT_MASK_TABLE(0xc000000000003000, 0xc000000000004000)
|
||||
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
TRAMP_VIRT_BEGIN(system_call_vectored_tramp)
|
||||
|
||||
@@ -98,7 +98,7 @@ config PPC_BOOK3S_64
|
||||
select PPC_HAVE_PMU_SUPPORT
|
||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
||||
select ARCH_ENABLE_HUGEPAGE_MIGRATION if HUGETLB_PAGE && MIGRATION
|
||||
select ARCH_ENABLE_PMD_SPLIT_PTLOCK
|
||||
select ARCH_ENABLE_SPLIT_PMD_PTLOCK
|
||||
select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
|
||||
select ARCH_SUPPORTS_HUGETLBFS
|
||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
model = "Microchip PolarFire-SoC Icicle Kit";
|
||||
compatible = "microchip,mpfs-icicle-kit";
|
||||
|
||||
aliases {
|
||||
ethernet0 = &emac1;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = &serial0;
|
||||
};
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
reg = <0x0 0x20112000 0x0 0x2000>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <70 71 72 73>;
|
||||
mac-address = [00 00 00 00 00 00];
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
clocks = <&clkcfg 5>, <&clkcfg 2>;
|
||||
status = "disabled";
|
||||
clock-names = "pclk", "hclk";
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/syscall.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/elf.h>
|
||||
@@ -56,6 +57,9 @@ static int riscv_fpr_get(struct task_struct *target,
|
||||
{
|
||||
struct __riscv_d_ext_state *fstate = &target->thread.fstate;
|
||||
|
||||
if (target == current)
|
||||
fstate_save(current, task_pt_regs(current));
|
||||
|
||||
membuf_write(&to, fstate, offsetof(struct __riscv_d_ext_state, fcsr));
|
||||
membuf_store(&to, fstate->fcsr);
|
||||
return membuf_zero(&to, 4); // explicitly pad
|
||||
|
||||
@@ -5,9 +5,8 @@
|
||||
* Early support for invoking 32-bit EFI services from a 64-bit kernel.
|
||||
*
|
||||
* Because this thunking occurs before ExitBootServices() we have to
|
||||
* restore the firmware's 32-bit GDT before we make EFI service calls,
|
||||
* since the firmware's 32-bit IDT is still currently installed and it
|
||||
* needs to be able to service interrupts.
|
||||
* restore the firmware's 32-bit GDT and IDT before we make EFI service
|
||||
* calls.
|
||||
*
|
||||
* On the plus side, we don't have to worry about mangling 64-bit
|
||||
* addresses into 32-bits because we're executing with an identity
|
||||
@@ -39,7 +38,7 @@ SYM_FUNC_START(__efi64_thunk)
|
||||
/*
|
||||
* Convert x86-64 ABI params to i386 ABI
|
||||
*/
|
||||
subq $32, %rsp
|
||||
subq $64, %rsp
|
||||
movl %esi, 0x0(%rsp)
|
||||
movl %edx, 0x4(%rsp)
|
||||
movl %ecx, 0x8(%rsp)
|
||||
@@ -49,14 +48,19 @@ SYM_FUNC_START(__efi64_thunk)
|
||||
leaq 0x14(%rsp), %rbx
|
||||
sgdt (%rbx)
|
||||
|
||||
addq $16, %rbx
|
||||
sidt (%rbx)
|
||||
|
||||
/*
|
||||
* Switch to gdt with 32-bit segments. This is the firmware GDT
|
||||
* that was installed when the kernel started executing. This
|
||||
* pointer was saved at the EFI stub entry point in head_64.S.
|
||||
* Switch to IDT and GDT with 32-bit segments. This is the firmware GDT
|
||||
* and IDT that was installed when the kernel started executing. The
|
||||
* pointers were saved at the EFI stub entry point in head_64.S.
|
||||
*
|
||||
* Pass the saved DS selector to the 32-bit code, and use far return to
|
||||
* restore the saved CS selector.
|
||||
*/
|
||||
leaq efi32_boot_idt(%rip), %rax
|
||||
lidt (%rax)
|
||||
leaq efi32_boot_gdt(%rip), %rax
|
||||
lgdt (%rax)
|
||||
|
||||
@@ -67,7 +71,7 @@ SYM_FUNC_START(__efi64_thunk)
|
||||
pushq %rax
|
||||
lretq
|
||||
|
||||
1: addq $32, %rsp
|
||||
1: addq $64, %rsp
|
||||
movq %rdi, %rax
|
||||
|
||||
pop %rbx
|
||||
@@ -128,10 +132,13 @@ SYM_FUNC_START_LOCAL(efi_enter32)
|
||||
|
||||
/*
|
||||
* Some firmware will return with interrupts enabled. Be sure to
|
||||
* disable them before we switch GDTs.
|
||||
* disable them before we switch GDTs and IDTs.
|
||||
*/
|
||||
cli
|
||||
|
||||
lidtl (%ebx)
|
||||
subl $16, %ebx
|
||||
|
||||
lgdtl (%ebx)
|
||||
|
||||
movl %cr4, %eax
|
||||
@@ -166,6 +173,11 @@ SYM_DATA_START(efi32_boot_gdt)
|
||||
.quad 0
|
||||
SYM_DATA_END(efi32_boot_gdt)
|
||||
|
||||
SYM_DATA_START(efi32_boot_idt)
|
||||
.word 0
|
||||
.quad 0
|
||||
SYM_DATA_END(efi32_boot_idt)
|
||||
|
||||
SYM_DATA_START(efi32_boot_cs)
|
||||
.word 0
|
||||
SYM_DATA_END(efi32_boot_cs)
|
||||
|
||||
@@ -319,6 +319,9 @@ SYM_INNER_LABEL(efi32_pe_stub_entry, SYM_L_LOCAL)
|
||||
movw %cs, rva(efi32_boot_cs)(%ebp)
|
||||
movw %ds, rva(efi32_boot_ds)(%ebp)
|
||||
|
||||
/* Store firmware IDT descriptor */
|
||||
sidtl rva(efi32_boot_idt)(%ebp)
|
||||
|
||||
/* Disable paging */
|
||||
movl %cr0, %eax
|
||||
btrl $X86_CR0_PG_BIT, %eax
|
||||
|
||||
@@ -90,6 +90,7 @@ struct perf_ibs {
|
||||
unsigned long offset_mask[1];
|
||||
int offset_max;
|
||||
unsigned int fetch_count_reset_broken : 1;
|
||||
unsigned int fetch_ignore_if_zero_rip : 1;
|
||||
struct cpu_perf_ibs __percpu *pcpu;
|
||||
|
||||
struct attribute **format_attrs;
|
||||
@@ -570,6 +571,7 @@ static struct perf_ibs perf_ibs_op = {
|
||||
.start = perf_ibs_start,
|
||||
.stop = perf_ibs_stop,
|
||||
.read = perf_ibs_read,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
||||
},
|
||||
.msr = MSR_AMD64_IBSOPCTL,
|
||||
.config_mask = IBS_OP_CONFIG_MASK,
|
||||
@@ -672,6 +674,10 @@ fail:
|
||||
if (check_rip && (ibs_data.regs[2] & IBS_RIP_INVALID)) {
|
||||
regs.flags &= ~PERF_EFLAGS_EXACT;
|
||||
} else {
|
||||
/* Workaround for erratum #1197 */
|
||||
if (perf_ibs->fetch_ignore_if_zero_rip && !(ibs_data.regs[1]))
|
||||
goto out;
|
||||
|
||||
set_linear_ip(®s, ibs_data.regs[1]);
|
||||
regs.flags |= PERF_EFLAGS_EXACT;
|
||||
}
|
||||
@@ -769,6 +775,9 @@ static __init void perf_event_ibs_init(void)
|
||||
if (boot_cpu_data.x86 >= 0x16 && boot_cpu_data.x86 <= 0x18)
|
||||
perf_ibs_fetch.fetch_count_reset_broken = 1;
|
||||
|
||||
if (boot_cpu_data.x86 == 0x19 && boot_cpu_data.x86_model < 0x10)
|
||||
perf_ibs_fetch.fetch_ignore_if_zero_rip = 1;
|
||||
|
||||
perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch");
|
||||
|
||||
if (ibs_caps & IBS_CAPS_OPCNT) {
|
||||
|
||||
@@ -213,6 +213,7 @@ static struct pmu pmu_class = {
|
||||
.stop = pmu_event_stop,
|
||||
.read = pmu_event_read,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
||||
.module = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int power_cpu_exit(unsigned int cpu)
|
||||
|
||||
@@ -62,7 +62,7 @@ static struct pt_cap_desc {
|
||||
PT_CAP(single_range_output, 0, CPUID_ECX, BIT(2)),
|
||||
PT_CAP(output_subsys, 0, CPUID_ECX, BIT(3)),
|
||||
PT_CAP(payloads_lip, 0, CPUID_ECX, BIT(31)),
|
||||
PT_CAP(num_address_ranges, 1, CPUID_EAX, 0x3),
|
||||
PT_CAP(num_address_ranges, 1, CPUID_EAX, 0x7),
|
||||
PT_CAP(mtc_periods, 1, CPUID_EAX, 0xffff0000),
|
||||
PT_CAP(cycle_thresholds, 1, CPUID_EBX, 0xffff),
|
||||
PT_CAP(psb_periods, 1, CPUID_EBX, 0xffff0000),
|
||||
|
||||
@@ -4811,7 +4811,7 @@ static void __snr_uncore_mmio_init_box(struct intel_uncore_box *box,
|
||||
return;
|
||||
|
||||
pci_read_config_dword(pdev, SNR_IMC_MMIO_BASE_OFFSET, &pci_dword);
|
||||
addr = (pci_dword & SNR_IMC_MMIO_BASE_MASK) << 23;
|
||||
addr = ((resource_size_t)pci_dword & SNR_IMC_MMIO_BASE_MASK) << 23;
|
||||
|
||||
pci_read_config_dword(pdev, mem_offset, &pci_dword);
|
||||
addr |= (pci_dword & SNR_IMC_MMIO_MEM0_MASK) << 12;
|
||||
|
||||
@@ -304,6 +304,12 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)
|
||||
case QOS_L3_MBM_LOCAL_EVENT_ID:
|
||||
m = &rr->d->mbm_local[rmid];
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* Code would never reach here because an invalid
|
||||
* event id would fail the __rmid_read.
|
||||
*/
|
||||
return RMID_VAL_ERROR;
|
||||
}
|
||||
|
||||
if (rr->first) {
|
||||
|
||||
@@ -31,11 +31,6 @@
|
||||
*/
|
||||
static const int read_expire = HZ / 2; /* max time before a read is submitted. */
|
||||
static const int write_expire = 5 * HZ; /* ditto for writes, these limits are SOFT! */
|
||||
/*
|
||||
* Time after which to dispatch lower priority requests even if higher
|
||||
* priority requests are pending.
|
||||
*/
|
||||
static const int aging_expire = 10 * HZ;
|
||||
static const int writes_starved = 2; /* max times reads can starve a write */
|
||||
static const int fifo_batch = 16; /* # of sequential requests treated as one
|
||||
by the above parameters. For throughput. */
|
||||
@@ -103,7 +98,6 @@ struct deadline_data {
|
||||
int writes_starved;
|
||||
int front_merges;
|
||||
u32 async_depth;
|
||||
int aging_expire;
|
||||
|
||||
spinlock_t lock;
|
||||
spinlock_t zone_lock;
|
||||
@@ -369,11 +363,10 @@ deadline_next_request(struct deadline_data *dd, struct dd_per_prio *per_prio,
|
||||
|
||||
/*
|
||||
* deadline_dispatch_requests selects the best request according to
|
||||
* read/write expire, fifo_batch, etc and with a start time <= @latest.
|
||||
* read/write expire, fifo_batch, etc
|
||||
*/
|
||||
static struct request *__dd_dispatch_request(struct deadline_data *dd,
|
||||
struct dd_per_prio *per_prio,
|
||||
u64 latest_start_ns)
|
||||
struct dd_per_prio *per_prio)
|
||||
{
|
||||
struct request *rq, *next_rq;
|
||||
enum dd_data_dir data_dir;
|
||||
@@ -385,8 +378,6 @@ static struct request *__dd_dispatch_request(struct deadline_data *dd,
|
||||
if (!list_empty(&per_prio->dispatch)) {
|
||||
rq = list_first_entry(&per_prio->dispatch, struct request,
|
||||
queuelist);
|
||||
if (rq->start_time_ns > latest_start_ns)
|
||||
return NULL;
|
||||
list_del_init(&rq->queuelist);
|
||||
goto done;
|
||||
}
|
||||
@@ -464,8 +455,6 @@ dispatch_find_request:
|
||||
dd->batching = 0;
|
||||
|
||||
dispatch_request:
|
||||
if (rq->start_time_ns > latest_start_ns)
|
||||
return NULL;
|
||||
/*
|
||||
* rq is the selected appropriate request.
|
||||
*/
|
||||
@@ -494,32 +483,15 @@ done:
|
||||
static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct deadline_data *dd = hctx->queue->elevator->elevator_data;
|
||||
const u64 now_ns = ktime_get_ns();
|
||||
struct request *rq = NULL;
|
||||
struct request *rq;
|
||||
enum dd_prio prio;
|
||||
|
||||
spin_lock(&dd->lock);
|
||||
/*
|
||||
* Start with dispatching requests whose deadline expired more than
|
||||
* aging_expire jiffies ago.
|
||||
*/
|
||||
for (prio = DD_BE_PRIO; prio <= DD_PRIO_MAX; prio++) {
|
||||
rq = __dd_dispatch_request(dd, &dd->per_prio[prio], now_ns -
|
||||
jiffies_to_nsecs(dd->aging_expire));
|
||||
if (rq)
|
||||
goto unlock;
|
||||
}
|
||||
/*
|
||||
* Next, dispatch requests in priority order. Ignore lower priority
|
||||
* requests if any higher priority requests are pending.
|
||||
*/
|
||||
for (prio = 0; prio <= DD_PRIO_MAX; prio++) {
|
||||
rq = __dd_dispatch_request(dd, &dd->per_prio[prio], now_ns);
|
||||
if (rq || dd_queued(dd, prio))
|
||||
rq = __dd_dispatch_request(dd, &dd->per_prio[prio]);
|
||||
if (rq)
|
||||
break;
|
||||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock(&dd->lock);
|
||||
|
||||
return rq;
|
||||
@@ -620,7 +592,6 @@ static int dd_init_sched(struct request_queue *q, struct elevator_type *e)
|
||||
dd->front_merges = 1;
|
||||
dd->last_dir = DD_WRITE;
|
||||
dd->fifo_batch = fifo_batch;
|
||||
dd->aging_expire = aging_expire;
|
||||
spin_lock_init(&dd->lock);
|
||||
spin_lock_init(&dd->zone_lock);
|
||||
|
||||
@@ -711,6 +682,7 @@ static void dd_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
|
||||
prio = ioprio_class_to_prio[ioprio_class];
|
||||
dd_count(dd, inserted, prio);
|
||||
rq->elv.priv[0] = (void *)(uintptr_t)1;
|
||||
|
||||
if (blk_mq_sched_try_insert_merge(q, rq, &free)) {
|
||||
blk_mq_free_requests(&free);
|
||||
@@ -759,12 +731,10 @@ static void dd_insert_requests(struct blk_mq_hw_ctx *hctx,
|
||||
spin_unlock(&dd->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Nothing to do here. This is defined only to ensure that .finish_request
|
||||
* method is called upon request completion.
|
||||
*/
|
||||
/* Callback from inside blk_mq_rq_ctx_init(). */
|
||||
static void dd_prepare_request(struct request *rq)
|
||||
{
|
||||
rq->elv.priv[0] = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -791,7 +761,14 @@ static void dd_finish_request(struct request *rq)
|
||||
const enum dd_prio prio = ioprio_class_to_prio[ioprio_class];
|
||||
struct dd_per_prio *per_prio = &dd->per_prio[prio];
|
||||
|
||||
dd_count(dd, completed, prio);
|
||||
/*
|
||||
* The block layer core may call dd_finish_request() without having
|
||||
* called dd_insert_requests(). Hence only update statistics for
|
||||
* requests for which dd_insert_requests() has been called. See also
|
||||
* blk_mq_request_bypass_insert().
|
||||
*/
|
||||
if (rq->elv.priv[0])
|
||||
dd_count(dd, completed, prio);
|
||||
|
||||
if (blk_queue_is_zoned(q)) {
|
||||
unsigned long flags;
|
||||
@@ -836,7 +813,6 @@ static ssize_t __FUNC(struct elevator_queue *e, char *page) \
|
||||
#define SHOW_JIFFIES(__FUNC, __VAR) SHOW_INT(__FUNC, jiffies_to_msecs(__VAR))
|
||||
SHOW_JIFFIES(deadline_read_expire_show, dd->fifo_expire[DD_READ]);
|
||||
SHOW_JIFFIES(deadline_write_expire_show, dd->fifo_expire[DD_WRITE]);
|
||||
SHOW_JIFFIES(deadline_aging_expire_show, dd->aging_expire);
|
||||
SHOW_INT(deadline_writes_starved_show, dd->writes_starved);
|
||||
SHOW_INT(deadline_front_merges_show, dd->front_merges);
|
||||
SHOW_INT(deadline_async_depth_show, dd->front_merges);
|
||||
@@ -866,7 +842,6 @@ static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count)
|
||||
STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, msecs_to_jiffies)
|
||||
STORE_JIFFIES(deadline_read_expire_store, &dd->fifo_expire[DD_READ], 0, INT_MAX);
|
||||
STORE_JIFFIES(deadline_write_expire_store, &dd->fifo_expire[DD_WRITE], 0, INT_MAX);
|
||||
STORE_JIFFIES(deadline_aging_expire_store, &dd->aging_expire, 0, INT_MAX);
|
||||
STORE_INT(deadline_writes_starved_store, &dd->writes_starved, INT_MIN, INT_MAX);
|
||||
STORE_INT(deadline_front_merges_store, &dd->front_merges, 0, 1);
|
||||
STORE_INT(deadline_async_depth_store, &dd->front_merges, 1, INT_MAX);
|
||||
@@ -885,7 +860,6 @@ static struct elv_fs_entry deadline_attrs[] = {
|
||||
DD_ATTR(front_merges),
|
||||
DD_ATTR(async_depth),
|
||||
DD_ATTR(fifo_batch),
|
||||
DD_ATTR(aging_expire),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -435,7 +435,7 @@ static void genpd_restore_performance_state(struct device *dev,
|
||||
int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
|
||||
{
|
||||
struct generic_pm_domain *genpd;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
genpd = dev_to_genpd_safe(dev);
|
||||
if (!genpd)
|
||||
@@ -446,7 +446,13 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
|
||||
return -EINVAL;
|
||||
|
||||
genpd_lock(genpd);
|
||||
ret = genpd_set_performance_state(dev, state);
|
||||
if (pm_runtime_suspended(dev)) {
|
||||
dev_gpd_data(dev)->rpm_pstate = state;
|
||||
} else {
|
||||
ret = genpd_set_performance_state(dev, state);
|
||||
if (!ret)
|
||||
dev_gpd_data(dev)->rpm_pstate = 0;
|
||||
}
|
||||
genpd_unlock(genpd);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -213,7 +213,7 @@ config BLK_DEV_LOOP_MIN_COUNT
|
||||
dynamically allocated with the /dev/loop-control interface.
|
||||
|
||||
config BLK_DEV_CRYPTOLOOP
|
||||
tristate "Cryptoloop Support"
|
||||
tristate "Cryptoloop Support (DEPRECATED)"
|
||||
select CRYPTO
|
||||
select CRYPTO_CBC
|
||||
depends on BLK_DEV_LOOP
|
||||
@@ -225,7 +225,7 @@ config BLK_DEV_CRYPTOLOOP
|
||||
WARNING: This device is not safe for journaled file systems like
|
||||
ext3 or Reiserfs. Please use the Device Mapper crypto module
|
||||
instead, which can be configured to be on-disk compatible with the
|
||||
cryptoloop device.
|
||||
cryptoloop device. cryptoloop support will be removed in Linux 5.16.
|
||||
|
||||
source "drivers/block/drbd/Kconfig"
|
||||
|
||||
|
||||
@@ -189,6 +189,8 @@ init_cryptoloop(void)
|
||||
|
||||
if (rc)
|
||||
printk(KERN_ERR "cryptoloop: loop_register_transfer failed\n");
|
||||
else
|
||||
pr_warn("the cryptoloop driver has been deprecated and will be removed in in Linux 5.16\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -892,7 +892,7 @@ static void pd_probe_drive(struct pd_unit *disk)
|
||||
return;
|
||||
|
||||
p = blk_mq_alloc_disk(&disk->tag_set, disk);
|
||||
if (!p) {
|
||||
if (IS_ERR(p)) {
|
||||
blk_mq_free_tag_set(&disk->tag_set);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -682,7 +682,7 @@ void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
|
||||
struct image_info *img_info);
|
||||
void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl);
|
||||
int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_chan *mhi_chan, unsigned int flags);
|
||||
struct mhi_chan *mhi_chan);
|
||||
int mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_chan *mhi_chan);
|
||||
void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
@@ -1430,7 +1430,7 @@ exit_unprepare_channel:
|
||||
}
|
||||
|
||||
int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_chan *mhi_chan, unsigned int flags)
|
||||
struct mhi_chan *mhi_chan)
|
||||
{
|
||||
int ret = 0;
|
||||
struct device *dev = &mhi_chan->mhi_dev->dev;
|
||||
@@ -1455,9 +1455,6 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
if (ret)
|
||||
goto error_pm_state;
|
||||
|
||||
if (mhi_chan->dir == DMA_FROM_DEVICE)
|
||||
mhi_chan->pre_alloc = !!(flags & MHI_CH_INBOUND_ALLOC_BUFS);
|
||||
|
||||
/* Pre-allocate buffer for xfer ring */
|
||||
if (mhi_chan->pre_alloc) {
|
||||
int nr_el = get_nr_avail_ring_elements(mhi_cntrl,
|
||||
@@ -1613,7 +1610,7 @@ void mhi_reset_chan(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan)
|
||||
}
|
||||
|
||||
/* Move channel to start state */
|
||||
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev, unsigned int flags)
|
||||
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev)
|
||||
{
|
||||
int ret, dir;
|
||||
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
|
||||
@@ -1624,7 +1621,7 @@ int mhi_prepare_for_transfer(struct mhi_device *mhi_dev, unsigned int flags)
|
||||
if (!mhi_chan)
|
||||
continue;
|
||||
|
||||
ret = mhi_prepare_channel(mhi_cntrl, mhi_chan, flags);
|
||||
ret = mhi_prepare_channel(mhi_cntrl, mhi_chan);
|
||||
if (ret)
|
||||
goto error_open_chan;
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ static int rcar_usb2_clock_sel_probe(struct platform_device *pdev)
|
||||
init.ops = &usb2_clock_sel_clock_ops;
|
||||
priv->hw.init = &init;
|
||||
|
||||
ret = devm_clk_hw_register(NULL, &priv->hw);
|
||||
ret = devm_clk_hw_register(dev, &priv->hw);
|
||||
if (ret)
|
||||
goto pm_put;
|
||||
|
||||
|
||||
@@ -1040,7 +1040,7 @@ void amdgpu_acpi_detect(void)
|
||||
*/
|
||||
bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_AMD_PMC) && IS_ENABLED(CONFIG_PM_SLEEP)
|
||||
#if IS_ENABLED(CONFIG_AMD_PMC) && IS_ENABLED(CONFIG_SUSPEND)
|
||||
if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) {
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return pm_suspend_target_state == PM_SUSPEND_TO_IDLE;
|
||||
|
||||
@@ -2777,12 +2777,11 @@ static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work)
|
||||
struct amdgpu_device *adev =
|
||||
container_of(work, struct amdgpu_device, gfx.gfx_off_delay_work.work);
|
||||
|
||||
mutex_lock(&adev->gfx.gfx_off_mutex);
|
||||
if (!adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) {
|
||||
if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true))
|
||||
adev->gfx.gfx_off_state = true;
|
||||
}
|
||||
mutex_unlock(&adev->gfx.gfx_off_mutex);
|
||||
WARN_ON_ONCE(adev->gfx.gfx_off_state);
|
||||
WARN_ON_ONCE(adev->gfx.gfx_off_req_count);
|
||||
|
||||
if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true))
|
||||
adev->gfx.gfx_off_state = true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -563,24 +563,38 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
|
||||
|
||||
mutex_lock(&adev->gfx.gfx_off_mutex);
|
||||
|
||||
if (!enable)
|
||||
adev->gfx.gfx_off_req_count++;
|
||||
else if (adev->gfx.gfx_off_req_count > 0)
|
||||
if (enable) {
|
||||
/* If the count is already 0, it means there's an imbalance bug somewhere.
|
||||
* Note that the bug may be in a different caller than the one which triggers the
|
||||
* WARN_ON_ONCE.
|
||||
*/
|
||||
if (WARN_ON_ONCE(adev->gfx.gfx_off_req_count == 0))
|
||||
goto unlock;
|
||||
|
||||
adev->gfx.gfx_off_req_count--;
|
||||
|
||||
if (enable && !adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) {
|
||||
schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE);
|
||||
} else if (!enable && adev->gfx.gfx_off_state) {
|
||||
if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false)) {
|
||||
adev->gfx.gfx_off_state = false;
|
||||
if (adev->gfx.gfx_off_req_count == 0 && !adev->gfx.gfx_off_state)
|
||||
schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE);
|
||||
} else {
|
||||
if (adev->gfx.gfx_off_req_count == 0) {
|
||||
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
||||
|
||||
if (adev->gfx.funcs->init_spm_golden) {
|
||||
dev_dbg(adev->dev, "GFXOFF is disabled, re-init SPM golden settings\n");
|
||||
amdgpu_gfx_init_spm_golden(adev);
|
||||
if (adev->gfx.gfx_off_state &&
|
||||
!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false)) {
|
||||
adev->gfx.gfx_off_state = false;
|
||||
|
||||
if (adev->gfx.funcs->init_spm_golden) {
|
||||
dev_dbg(adev->dev,
|
||||
"GFXOFF is disabled, re-init SPM golden settings\n");
|
||||
amdgpu_gfx_init_spm_golden(adev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
adev->gfx.gfx_off_req_count++;
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&adev->gfx.gfx_off_mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -920,11 +920,6 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* This assumes only APU display buffers are pinned with (VRAM|GTT).
|
||||
* See function amdgpu_display_supported_domains()
|
||||
*/
|
||||
domain = amdgpu_bo_get_preferred_pin_domain(adev, domain);
|
||||
|
||||
if (bo->tbo.pin_count) {
|
||||
uint32_t mem_type = bo->tbo.resource->mem_type;
|
||||
uint32_t mem_flags = bo->tbo.resource->placement;
|
||||
@@ -949,6 +944,11 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This assumes only APU display buffers are pinned with (VRAM|GTT).
|
||||
* See function amdgpu_display_supported_domains()
|
||||
*/
|
||||
domain = amdgpu_bo_get_preferred_pin_domain(adev, domain);
|
||||
|
||||
if (bo->tbo.base.import_attach)
|
||||
dma_buf_pin(bo->tbo.base.import_attach);
|
||||
|
||||
|
||||
@@ -3850,23 +3850,18 @@ static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp)
|
||||
|
||||
static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
u8 val;
|
||||
|
||||
if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
|
||||
return;
|
||||
|
||||
if (drm_dp_dpcd_readb(&intel_dp->aux,
|
||||
DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || !val) {
|
||||
drm_dbg_kms(&i915->drm, "Error in reading link service irq vector\n");
|
||||
DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || !val)
|
||||
return;
|
||||
}
|
||||
|
||||
if (drm_dp_dpcd_writeb(&intel_dp->aux,
|
||||
DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) {
|
||||
drm_dbg_kms(&i915->drm, "Error in writing link service irq vector\n");
|
||||
DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (val & HDMI_LINK_STATUS_CHANGED)
|
||||
intel_dp_handle_hdmi_link_status_change(intel_dp);
|
||||
|
||||
@@ -127,6 +127,15 @@ static void intel_timeline_fini(struct rcu_head *rcu)
|
||||
|
||||
i915_vma_put(timeline->hwsp_ggtt);
|
||||
i915_active_fini(&timeline->active);
|
||||
|
||||
/*
|
||||
* A small race exists between intel_gt_retire_requests_timeout and
|
||||
* intel_timeline_exit which could result in the syncmap not getting
|
||||
* free'd. Rather than work to hard to seal this race, simply cleanup
|
||||
* the syncmap on fini.
|
||||
*/
|
||||
i915_syncmap_free(&timeline->sync);
|
||||
|
||||
kfree(timeline);
|
||||
}
|
||||
|
||||
|
||||
@@ -683,7 +683,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
||||
break;
|
||||
}
|
||||
|
||||
ipu_dmfc_config_wait4eot(ipu_plane->dmfc, drm_rect_width(dst));
|
||||
ipu_dmfc_config_wait4eot(ipu_plane->dmfc, ALIGN(drm_rect_width(dst), 8));
|
||||
|
||||
width = ipu_src_rect_width(new_state);
|
||||
height = drm_rect_height(&new_state->src) >> 16;
|
||||
|
||||
@@ -585,21 +585,21 @@ static const struct ipu_rgb def_bgra_16 = {
|
||||
.bits_per_pixel = 16,
|
||||
};
|
||||
|
||||
#define Y_OFFSET(pix, x, y) ((x) + pix->width * (y))
|
||||
#define U_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * ((y) / 2) / 2) + (x) / 2)
|
||||
#define V_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * pix->height / 4) + \
|
||||
(pix->width * ((y) / 2) / 2) + (x) / 2)
|
||||
#define U2_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * (y) / 2) + (x) / 2)
|
||||
#define V2_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * pix->height / 2) + \
|
||||
(pix->width * (y) / 2) + (x) / 2)
|
||||
#define UV_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * ((y) / 2)) + (x))
|
||||
#define UV2_OFFSET(pix, x, y) ((pix->width * pix->height) + \
|
||||
(pix->width * y) + (x))
|
||||
#define Y_OFFSET(pix, x, y) ((x) + pix->bytesperline * (y))
|
||||
#define U_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
|
||||
#define V_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * pix->height / 4) + \
|
||||
(pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
|
||||
#define U2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * (y) / 2) + (x) / 2)
|
||||
#define V2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * pix->height / 2) + \
|
||||
(pix->bytesperline * (y) / 2) + (x) / 2)
|
||||
#define UV_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * ((y) / 2)) + (x))
|
||||
#define UV2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
|
||||
(pix->bytesperline * y) + (x))
|
||||
|
||||
#define NUM_ALPHA_CHANNELS 7
|
||||
|
||||
|
||||
@@ -249,6 +249,9 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)(
|
||||
mr->uobject = uobj;
|
||||
atomic_inc(&pd->usecnt);
|
||||
|
||||
rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
|
||||
rdma_restrack_set_name(&mr->res, NULL);
|
||||
rdma_restrack_add(&mr->res);
|
||||
uobj->object = mr;
|
||||
|
||||
uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE);
|
||||
|
||||
@@ -1681,6 +1681,7 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
|
||||
if (nq)
|
||||
nq->budget++;
|
||||
atomic_inc(&rdev->srq_count);
|
||||
spin_lock_init(&srq->lock);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -1397,7 +1397,6 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)
|
||||
memset(&rattr, 0, sizeof(rattr));
|
||||
rc = bnxt_re_register_netdev(rdev);
|
||||
if (rc) {
|
||||
rtnl_unlock();
|
||||
ibdev_err(&rdev->ibdev,
|
||||
"Failed to register with netedev: %#x\n", rc);
|
||||
return -EINVAL;
|
||||
|
||||
@@ -357,6 +357,7 @@ static int efa_enable_msix(struct efa_dev *dev)
|
||||
}
|
||||
|
||||
if (irq_num != msix_vecs) {
|
||||
efa_disable_msix(dev);
|
||||
dev_err(&dev->pdev->dev,
|
||||
"Allocated %d MSI-X (out of %d requested)\n",
|
||||
irq_num, msix_vecs);
|
||||
|
||||
@@ -3055,6 +3055,7 @@ static void __sdma_process_event(struct sdma_engine *sde,
|
||||
static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
|
||||
{
|
||||
int i;
|
||||
struct sdma_desc *descp;
|
||||
|
||||
/* Handle last descriptor */
|
||||
if (unlikely((tx->num_desc == (MAX_DESC - 1)))) {
|
||||
@@ -3075,12 +3076,10 @@ static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
|
||||
if (unlikely(tx->num_desc == MAX_DESC))
|
||||
goto enomem;
|
||||
|
||||
tx->descp = kmalloc_array(
|
||||
MAX_DESC,
|
||||
sizeof(struct sdma_desc),
|
||||
GFP_ATOMIC);
|
||||
if (!tx->descp)
|
||||
descp = kmalloc_array(MAX_DESC, sizeof(struct sdma_desc), GFP_ATOMIC);
|
||||
if (!descp)
|
||||
goto enomem;
|
||||
tx->descp = descp;
|
||||
|
||||
/* reserve last descriptor for coalescing */
|
||||
tx->desc_limit = MAX_DESC - 1;
|
||||
|
||||
@@ -6,7 +6,7 @@ config INFINIBAND_IRDMA
|
||||
depends on PCI
|
||||
depends on ICE && I40E
|
||||
select GENERIC_ALLOCATOR
|
||||
select CONFIG_AUXILIARY_BUS
|
||||
select AUXILIARY_BUS
|
||||
help
|
||||
This is an Intel(R) Ethernet Protocol Driver for RDMA driver
|
||||
that support E810 (iWARP/RoCE) and X722 (iWARP) network devices.
|
||||
|
||||
@@ -4454,7 +4454,8 @@ static void mlx5r_mp_remove(struct auxiliary_device *adev)
|
||||
mutex_lock(&mlx5_ib_multiport_mutex);
|
||||
if (mpi->ibdev)
|
||||
mlx5_ib_unbind_slave_port(mpi->ibdev, mpi);
|
||||
list_del(&mpi->list);
|
||||
else
|
||||
list_del(&mpi->list);
|
||||
mutex_unlock(&mlx5_ib_multiport_mutex);
|
||||
kfree(mpi);
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ int rxe_mcast_add_grp_elem(struct rxe_dev *rxe, struct rxe_qp *qp,
|
||||
goto out;
|
||||
}
|
||||
|
||||
elem = rxe_alloc(&rxe->mc_elem_pool);
|
||||
elem = rxe_alloc_locked(&rxe->mc_elem_pool);
|
||||
if (!elem) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
|
||||
@@ -63,7 +63,7 @@ struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe, int *num_elem,
|
||||
if (*num_elem < 0)
|
||||
goto err1;
|
||||
|
||||
q = kmalloc(sizeof(*q), GFP_KERNEL);
|
||||
q = kzalloc(sizeof(*q), GFP_KERNEL);
|
||||
if (!q)
|
||||
goto err1;
|
||||
|
||||
|
||||
@@ -226,7 +226,7 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg,
|
||||
err_free_swnodes:
|
||||
software_node_unregister_nodes(sensor->swnodes);
|
||||
err_put_adev:
|
||||
acpi_dev_put(sensor->adev);
|
||||
acpi_dev_put(adev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -295,8 +295,7 @@ static const struct sdhci_ops sdhci_iproc_bcm2711_ops = {
|
||||
};
|
||||
|
||||
static const struct sdhci_pltfm_data sdhci_bcm2711_pltfm_data = {
|
||||
.quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 |
|
||||
SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
|
||||
.quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
|
||||
.ops = &sdhci_iproc_bcm2711_ops,
|
||||
};
|
||||
|
||||
|
||||
@@ -224,8 +224,8 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,
|
||||
if (id == ESD_EV_CAN_ERROR_EXT) {
|
||||
u8 state = msg->msg.rx.data[0];
|
||||
u8 ecc = msg->msg.rx.data[1];
|
||||
u8 txerr = msg->msg.rx.data[2];
|
||||
u8 rxerr = msg->msg.rx.data[3];
|
||||
u8 rxerr = msg->msg.rx.data[2];
|
||||
u8 txerr = msg->msg.rx.data[3];
|
||||
|
||||
skb = alloc_can_err_skb(priv->netdev, &cf);
|
||||
if (skb == NULL) {
|
||||
|
||||
@@ -1472,9 +1472,6 @@ static void hellcreek_setup_gcl(struct hellcreek *hellcreek, int port,
|
||||
u16 data;
|
||||
u8 gates;
|
||||
|
||||
cur++;
|
||||
next++;
|
||||
|
||||
if (i == schedule->num_entries)
|
||||
gates = initial->gate_mask ^
|
||||
cur->gate_mask;
|
||||
@@ -1503,6 +1500,9 @@ static void hellcreek_setup_gcl(struct hellcreek *hellcreek, int port,
|
||||
(initial->gate_mask <<
|
||||
TR_GCLCMD_INIT_GATE_STATES_SHIFT);
|
||||
hellcreek_write(hellcreek, data, TR_GCLCMD);
|
||||
|
||||
cur++;
|
||||
next++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1550,7 +1550,7 @@ static bool hellcreek_schedule_startable(struct hellcreek *hellcreek, int port)
|
||||
/* Calculate difference to admin base time */
|
||||
base_time_ns = ktime_to_ns(hellcreek_port->current_schedule->base_time);
|
||||
|
||||
return base_time_ns - current_ns < (s64)8 * NSEC_PER_SEC;
|
||||
return base_time_ns - current_ns < (s64)4 * NSEC_PER_SEC;
|
||||
}
|
||||
|
||||
static void hellcreek_start_schedule(struct hellcreek *hellcreek, int port)
|
||||
|
||||
@@ -1277,15 +1277,16 @@ static int mv88e6393x_serdes_port_errata(struct mv88e6xxx_chip *chip, int lane)
|
||||
int err;
|
||||
|
||||
/* mv88e6393x family errata 4.6:
|
||||
* Cannot clear PwrDn bit on SERDES on port 0 if device is configured
|
||||
* CPU_MGD mode or P0_mode is configured for [x]MII.
|
||||
* Workaround: Set Port0 SERDES register 4.F002 bit 5=0 and bit 15=1.
|
||||
* Cannot clear PwrDn bit on SERDES if device is configured CPU_MGD
|
||||
* mode or P0_mode is configured for [x]MII.
|
||||
* Workaround: Set SERDES register 4.F002 bit 5=0 and bit 15=1.
|
||||
*
|
||||
* It seems that after this workaround the SERDES is automatically
|
||||
* powered up (the bit is cleared), so power it down.
|
||||
*/
|
||||
if (lane == MV88E6393X_PORT0_LANE) {
|
||||
err = mv88e6390_serdes_read(chip, MV88E6393X_PORT0_LANE,
|
||||
if (lane == MV88E6393X_PORT0_LANE || lane == MV88E6393X_PORT9_LANE ||
|
||||
lane == MV88E6393X_PORT10_LANE) {
|
||||
err = mv88e6390_serdes_read(chip, lane,
|
||||
MDIO_MMD_PHYXS,
|
||||
MV88E6393X_SERDES_POC, ®);
|
||||
if (err)
|
||||
|
||||
@@ -677,11 +677,13 @@ static int xge_probe(struct platform_device *pdev)
|
||||
ret = register_netdev(ndev);
|
||||
if (ret) {
|
||||
netdev_err(ndev, "Failed to register netdev\n");
|
||||
goto err;
|
||||
goto err_mdio_remove;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_mdio_remove:
|
||||
xge_mdio_remove(ndev);
|
||||
err:
|
||||
free_netdev(ndev);
|
||||
|
||||
|
||||
@@ -275,6 +275,12 @@ void gem_ptp_rxstamp(struct macb *bp, struct sk_buff *skb,
|
||||
|
||||
if (GEM_BFEXT(DMA_RXVALID, desc->addr)) {
|
||||
desc_ptp = macb_ptp_desc(bp, desc);
|
||||
/* Unlikely but check */
|
||||
if (!desc_ptp) {
|
||||
dev_warn_ratelimited(&bp->pdev->dev,
|
||||
"Timestamp not supported in BD\n");
|
||||
return;
|
||||
}
|
||||
gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts);
|
||||
memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
|
||||
shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
|
||||
@@ -307,8 +313,11 @@ int gem_ptp_txstamp(struct macb_queue *queue, struct sk_buff *skb,
|
||||
if (CIRC_SPACE(head, tail, PTP_TS_BUFFER_SIZE) == 0)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
desc_ptp = macb_ptp_desc(queue->bp, desc);
|
||||
/* Unlikely but check */
|
||||
if (!desc_ptp)
|
||||
return -EINVAL;
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
tx_timestamp = &queue->tx_timestamps[head];
|
||||
tx_timestamp->skb = skb;
|
||||
/* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */
|
||||
|
||||
@@ -5068,6 +5068,7 @@ static int adap_init0(struct adapter *adap, int vpd_skip)
|
||||
ret = -ENOMEM;
|
||||
goto bye;
|
||||
}
|
||||
bitmap_zero(adap->sge.blocked_fl, adap->sge.egr_sz);
|
||||
#endif
|
||||
|
||||
params[0] = FW_PARAM_PFVF(CLIP_START);
|
||||
@@ -6788,13 +6789,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
setup_memwin(adapter);
|
||||
err = adap_init0(adapter, 0);
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
bitmap_zero(adapter->sge.blocked_fl, adapter->sge.egr_sz);
|
||||
#endif
|
||||
setup_memwin_rdma(adapter);
|
||||
if (err)
|
||||
goto out_unmap_bar;
|
||||
|
||||
setup_memwin_rdma(adapter);
|
||||
|
||||
/* configure SGE_STAT_CFG_A to read WC stats */
|
||||
if (!is_t4(adapter->params.chip))
|
||||
t4_write_reg(adapter, SGE_STAT_CFG_A, STATSOURCE_T5_V(7) |
|
||||
|
||||
@@ -938,20 +938,19 @@ static int hns3_dbg_dev_info(struct hnae3_handle *h, char *buf, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hns3_dbg_get_cmd_index(struct hnae3_handle *handle,
|
||||
const unsigned char *name, u32 *index)
|
||||
static int hns3_dbg_get_cmd_index(struct hns3_dbg_data *dbg_data, u32 *index)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) {
|
||||
if (!strncmp(name, hns3_dbg_cmd[i].name,
|
||||
strlen(hns3_dbg_cmd[i].name))) {
|
||||
if (hns3_dbg_cmd[i].cmd == dbg_data->cmd) {
|
||||
*index = i;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
dev_err(&handle->pdev->dev, "unknown command(%s)\n", name);
|
||||
dev_err(&dbg_data->handle->pdev->dev, "unknown command(%d)\n",
|
||||
dbg_data->cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1019,8 +1018,7 @@ static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,
|
||||
u32 index;
|
||||
int ret;
|
||||
|
||||
ret = hns3_dbg_get_cmd_index(handle, filp->f_path.dentry->d_iname,
|
||||
&index);
|
||||
ret = hns3_dbg_get_cmd_index(dbg_data, &index);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1090,6 +1088,7 @@ static int hns3_dbg_bd_file_init(struct hnae3_handle *handle, u32 cmd)
|
||||
char name[HNS3_DBG_FILE_NAME_LEN];
|
||||
|
||||
data[i].handle = handle;
|
||||
data[i].cmd = hns3_dbg_cmd[cmd].cmd;
|
||||
data[i].qid = i;
|
||||
sprintf(name, "%s%u", hns3_dbg_cmd[cmd].name, i);
|
||||
debugfs_create_file(name, 0400, entry_dir, &data[i],
|
||||
@@ -1110,6 +1109,7 @@ hns3_dbg_common_file_init(struct hnae3_handle *handle, u32 cmd)
|
||||
return -ENOMEM;
|
||||
|
||||
data->handle = handle;
|
||||
data->cmd = hns3_dbg_cmd[cmd].cmd;
|
||||
entry_dir = hns3_dbg_dentry[hns3_dbg_cmd[cmd].dentry].dentry;
|
||||
debugfs_create_file(hns3_dbg_cmd[cmd].name, 0400, entry_dir,
|
||||
data, &hns3_dbg_fops);
|
||||
|
||||
@@ -22,6 +22,7 @@ struct hns3_dbg_item {
|
||||
|
||||
struct hns3_dbg_data {
|
||||
struct hnae3_handle *handle;
|
||||
enum hnae3_dbg_cmd cmd;
|
||||
u16 qid;
|
||||
};
|
||||
|
||||
|
||||
@@ -573,9 +573,13 @@ static void hclge_cmd_uninit_regs(struct hclge_hw *hw)
|
||||
|
||||
void hclge_cmd_uninit(struct hclge_dev *hdev)
|
||||
{
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
/* wait to ensure that the firmware completes the possible left
|
||||
* over commands.
|
||||
*/
|
||||
msleep(HCLGE_CMDQ_CLEAR_WAIT_TIME);
|
||||
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
||||
spin_lock(&hdev->hw.cmq.crq.lock);
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
hclge_cmd_uninit_regs(&hdev->hw);
|
||||
spin_unlock(&hdev->hw.cmq.crq.lock);
|
||||
spin_unlock_bh(&hdev->hw.cmq.csq.lock);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "hnae3.h"
|
||||
|
||||
#define HCLGE_CMDQ_TX_TIMEOUT 30000
|
||||
#define HCLGE_CMDQ_CLEAR_WAIT_TIME 200
|
||||
#define HCLGE_DESC_DATA_LEN 6
|
||||
|
||||
struct hclge_dev;
|
||||
@@ -270,6 +271,9 @@ enum hclge_opcode_type {
|
||||
/* Led command */
|
||||
HCLGE_OPC_LED_STATUS_CFG = 0xB000,
|
||||
|
||||
/* clear hardware resource command */
|
||||
HCLGE_OPC_CLEAR_HW_RESOURCE = 0x700B,
|
||||
|
||||
/* NCL config command */
|
||||
HCLGE_OPC_QUERY_NCL_CONFIG = 0x7011,
|
||||
|
||||
|
||||
@@ -255,21 +255,12 @@ static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
|
||||
u64 requests[HNAE3_MAX_TC], indications[HNAE3_MAX_TC];
|
||||
struct hclge_vport *vport = hclge_get_vport(h);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u8 i, j, pfc_map, *prio_tc;
|
||||
int ret;
|
||||
u8 i;
|
||||
|
||||
memset(pfc, 0, sizeof(*pfc));
|
||||
pfc->pfc_cap = hdev->pfc_max;
|
||||
prio_tc = hdev->tm_info.prio_tc;
|
||||
pfc_map = hdev->tm_info.hw_pfc_map;
|
||||
|
||||
/* Pfc setting is based on TC */
|
||||
for (i = 0; i < hdev->tm_info.num_tc; i++) {
|
||||
for (j = 0; j < HNAE3_MAX_USER_PRIO; j++) {
|
||||
if ((prio_tc[j] == i) && (pfc_map & BIT(i)))
|
||||
pfc->pfc_en |= BIT(j);
|
||||
}
|
||||
}
|
||||
pfc->pfc_en = hdev->tm_info.pfc_en;
|
||||
|
||||
ret = hclge_pfc_tx_stats_get(hdev, requests);
|
||||
if (ret)
|
||||
|
||||
@@ -1550,6 +1550,7 @@ static int hclge_configure(struct hclge_dev *hdev)
|
||||
hdev->tm_info.hw_pfc_map = 0;
|
||||
hdev->wanted_umv_size = cfg.umv_space;
|
||||
hdev->tx_spare_buf_size = cfg.tx_spare_buf_size;
|
||||
hdev->gro_en = true;
|
||||
if (cfg.vlan_fliter_cap == HCLGE_VLAN_FLTR_CAN_MDF)
|
||||
set_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps);
|
||||
|
||||
@@ -1618,7 +1619,7 @@ static int hclge_config_tso(struct hclge_dev *hdev, u16 tso_mss_min,
|
||||
return hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
}
|
||||
|
||||
static int hclge_config_gro(struct hclge_dev *hdev, bool en)
|
||||
static int hclge_config_gro(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_cfg_gro_status_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
@@ -1630,7 +1631,7 @@ static int hclge_config_gro(struct hclge_dev *hdev, bool en)
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_GRO_GENERIC_CONFIG, false);
|
||||
req = (struct hclge_cfg_gro_status_cmd *)desc.data;
|
||||
|
||||
req->gro_en = en ? 1 : 0;
|
||||
req->gro_en = hdev->gro_en ? 1 : 0;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
@@ -2952,12 +2953,12 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
|
||||
}
|
||||
|
||||
if (state != hdev->hw.mac.link) {
|
||||
hdev->hw.mac.link = state;
|
||||
client->ops->link_status_change(handle, state);
|
||||
hclge_config_mac_tnl_int(hdev, state);
|
||||
if (rclient && rclient->ops->link_status_change)
|
||||
rclient->ops->link_status_change(rhandle, state);
|
||||
|
||||
hdev->hw.mac.link = state;
|
||||
hclge_push_link_status(hdev);
|
||||
}
|
||||
|
||||
@@ -10073,7 +10074,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
|
||||
static void hclge_add_vport_vlan_table(struct hclge_vport *vport, u16 vlan_id,
|
||||
bool writen_to_tbl)
|
||||
{
|
||||
struct hclge_vport_vlan_cfg *vlan;
|
||||
struct hclge_vport_vlan_cfg *vlan, *tmp;
|
||||
|
||||
list_for_each_entry_safe(vlan, tmp, &vport->vlan_list, node)
|
||||
if (vlan->vlan_id == vlan_id)
|
||||
return;
|
||||
|
||||
vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
|
||||
if (!vlan)
|
||||
@@ -11443,6 +11448,28 @@ static void hclge_clear_resetting_state(struct hclge_dev *hdev)
|
||||
}
|
||||
}
|
||||
|
||||
static int hclge_clear_hw_resource(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_desc desc;
|
||||
int ret;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CLEAR_HW_RESOURCE, false);
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
/* This new command is only supported by new firmware, it will
|
||||
* fail with older firmware. Error value -EOPNOSUPP can only be
|
||||
* returned by older firmware running this command, to keep code
|
||||
* backward compatible we will override this value and return
|
||||
* success.
|
||||
*/
|
||||
if (ret && ret != -EOPNOTSUPP) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"failed to clear hw resource, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hclge_init_rxd_adv_layout(struct hclge_dev *hdev)
|
||||
{
|
||||
if (hnae3_ae_dev_rxd_adv_layout_supported(hdev->ae_dev))
|
||||
@@ -11492,6 +11519,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
if (ret)
|
||||
goto err_cmd_uninit;
|
||||
|
||||
ret = hclge_clear_hw_resource(hdev);
|
||||
if (ret)
|
||||
goto err_cmd_uninit;
|
||||
|
||||
ret = hclge_get_cap(hdev);
|
||||
if (ret)
|
||||
goto err_cmd_uninit;
|
||||
@@ -11556,7 +11587,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
goto err_mdiobus_unreg;
|
||||
}
|
||||
|
||||
ret = hclge_config_gro(hdev, true);
|
||||
ret = hclge_config_gro(hdev);
|
||||
if (ret)
|
||||
goto err_mdiobus_unreg;
|
||||
|
||||
@@ -11937,7 +11968,7 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = hclge_config_gro(hdev, true);
|
||||
ret = hclge_config_gro(hdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -12671,8 +12702,15 @@ static int hclge_gro_en(struct hnae3_handle *handle, bool enable)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
bool gro_en_old = hdev->gro_en;
|
||||
int ret;
|
||||
|
||||
return hclge_config_gro(hdev, enable);
|
||||
hdev->gro_en = enable;
|
||||
ret = hclge_config_gro(hdev);
|
||||
if (ret)
|
||||
hdev->gro_en = gro_en_old;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void hclge_sync_promisc_mode(struct hclge_dev *hdev)
|
||||
|
||||
@@ -927,6 +927,7 @@ struct hclge_dev {
|
||||
unsigned long fd_bmap[BITS_TO_LONGS(MAX_FD_FILTER_NUM)];
|
||||
enum HCLGE_FD_ACTIVE_RULE_TYPE fd_active_type;
|
||||
u8 fd_en;
|
||||
bool gro_en;
|
||||
|
||||
u16 wanted_umv_size;
|
||||
/* max available unicast mac vlan space */
|
||||
|
||||
@@ -507,12 +507,17 @@ static void hclgevf_cmd_uninit_regs(struct hclgevf_hw *hw)
|
||||
|
||||
void hclgevf_cmd_uninit(struct hclgevf_dev *hdev)
|
||||
{
|
||||
set_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state);
|
||||
/* wait to ensure that the firmware completes the possible left
|
||||
* over commands.
|
||||
*/
|
||||
msleep(HCLGEVF_CMDQ_CLEAR_WAIT_TIME);
|
||||
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
||||
spin_lock(&hdev->hw.cmq.crq.lock);
|
||||
set_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state);
|
||||
hclgevf_cmd_uninit_regs(&hdev->hw);
|
||||
spin_unlock(&hdev->hw.cmq.crq.lock);
|
||||
spin_unlock_bh(&hdev->hw.cmq.csq.lock);
|
||||
|
||||
hclgevf_free_cmd_desc(&hdev->hw.cmq.csq);
|
||||
hclgevf_free_cmd_desc(&hdev->hw.cmq.crq);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "hnae3.h"
|
||||
|
||||
#define HCLGEVF_CMDQ_TX_TIMEOUT 30000
|
||||
#define HCLGEVF_CMDQ_CLEAR_WAIT_TIME 200
|
||||
#define HCLGEVF_CMDQ_RX_INVLD_B 0
|
||||
#define HCLGEVF_CMDQ_RX_OUTVLD_B 1
|
||||
|
||||
|
||||
@@ -506,10 +506,10 @@ void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state)
|
||||
link_state =
|
||||
test_bit(HCLGEVF_STATE_DOWN, &hdev->state) ? 0 : link_state;
|
||||
if (link_state != hdev->hw.mac.link) {
|
||||
hdev->hw.mac.link = link_state;
|
||||
client->ops->link_status_change(handle, !!link_state);
|
||||
if (rclient && rclient->ops->link_status_change)
|
||||
rclient->ops->link_status_change(rhandle, !!link_state);
|
||||
hdev->hw.mac.link = link_state;
|
||||
}
|
||||
|
||||
clear_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state);
|
||||
@@ -2487,6 +2487,8 @@ static int hclgevf_configure(struct hclgevf_dev *hdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
hdev->gro_en = true;
|
||||
|
||||
ret = hclgevf_get_basic_info(hdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -2549,7 +2551,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
|
||||
static int hclgevf_config_gro(struct hclgevf_dev *hdev)
|
||||
{
|
||||
struct hclgevf_cfg_gro_status_cmd *req;
|
||||
struct hclgevf_desc desc;
|
||||
@@ -2562,7 +2564,7 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
|
||||
false);
|
||||
req = (struct hclgevf_cfg_gro_status_cmd *)desc.data;
|
||||
|
||||
req->gro_en = en ? 1 : 0;
|
||||
req->gro_en = hdev->gro_en ? 1 : 0;
|
||||
|
||||
ret = hclgevf_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
@@ -3308,7 +3310,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = hclgevf_config_gro(hdev, true);
|
||||
ret = hclgevf_config_gro(hdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -3389,7 +3391,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
|
||||
if (ret)
|
||||
goto err_config;
|
||||
|
||||
ret = hclgevf_config_gro(hdev, true);
|
||||
ret = hclgevf_config_gro(hdev);
|
||||
if (ret)
|
||||
goto err_config;
|
||||
|
||||
@@ -3638,8 +3640,15 @@ void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,
|
||||
static int hclgevf_gro_en(struct hnae3_handle *handle, bool enable)
|
||||
{
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
bool gro_en_old = hdev->gro_en;
|
||||
int ret;
|
||||
|
||||
return hclgevf_config_gro(hdev, enable);
|
||||
hdev->gro_en = enable;
|
||||
ret = hclgevf_config_gro(hdev);
|
||||
if (ret)
|
||||
hdev->gro_en = gro_en_old;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void hclgevf_get_media_type(struct hnae3_handle *handle, u8 *media_type,
|
||||
|
||||
@@ -310,6 +310,8 @@ struct hclgevf_dev {
|
||||
u16 *vector_status;
|
||||
int *vector_irq;
|
||||
|
||||
bool gro_en;
|
||||
|
||||
unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
|
||||
struct hclgevf_mac_table_cfg mac_table;
|
||||
|
||||
@@ -323,8 +323,8 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev)
|
||||
flag = (u8)msg_q[5];
|
||||
|
||||
/* update upper layer with new link link status */
|
||||
hclgevf_update_link_status(hdev, link_status);
|
||||
hclgevf_update_speed_duplex(hdev, speed, duplex);
|
||||
hclgevf_update_link_status(hdev, link_status);
|
||||
|
||||
if (flag & HCLGE_MBX_PUSH_LINK_STATUS_EN)
|
||||
set_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS,
|
||||
|
||||
@@ -1006,6 +1006,8 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
|
||||
{
|
||||
u32 reg = link << (E1000_LTRV_REQ_SHIFT + E1000_LTRV_NOSNOOP_SHIFT) |
|
||||
link << E1000_LTRV_REQ_SHIFT | E1000_LTRV_SEND;
|
||||
u16 max_ltr_enc_d = 0; /* maximum LTR decoded by platform */
|
||||
u16 lat_enc_d = 0; /* latency decoded */
|
||||
u16 lat_enc = 0; /* latency encoded */
|
||||
|
||||
if (link) {
|
||||
@@ -1059,7 +1061,17 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
|
||||
E1000_PCI_LTR_CAP_LPT + 2, &max_nosnoop);
|
||||
max_ltr_enc = max_t(u16, max_snoop, max_nosnoop);
|
||||
|
||||
if (lat_enc > max_ltr_enc)
|
||||
lat_enc_d = (lat_enc & E1000_LTRV_VALUE_MASK) *
|
||||
(1U << (E1000_LTRV_SCALE_FACTOR *
|
||||
((lat_enc & E1000_LTRV_SCALE_MASK)
|
||||
>> E1000_LTRV_SCALE_SHIFT)));
|
||||
|
||||
max_ltr_enc_d = (max_ltr_enc & E1000_LTRV_VALUE_MASK) *
|
||||
(1U << (E1000_LTRV_SCALE_FACTOR *
|
||||
((max_ltr_enc & E1000_LTRV_SCALE_MASK)
|
||||
>> E1000_LTRV_SCALE_SHIFT)));
|
||||
|
||||
if (lat_enc_d > max_ltr_enc_d)
|
||||
lat_enc = max_ltr_enc;
|
||||
}
|
||||
|
||||
@@ -4115,13 +4127,17 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)
|
||||
return ret_val;
|
||||
|
||||
if (!(data & valid_csum_mask)) {
|
||||
data |= valid_csum_mask;
|
||||
ret_val = e1000_write_nvm(hw, word, 1, &data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
ret_val = e1000e_update_nvm_checksum(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
e_dbg("NVM Checksum Invalid\n");
|
||||
|
||||
if (hw->mac.type < e1000_pch_cnp) {
|
||||
data |= valid_csum_mask;
|
||||
ret_val = e1000_write_nvm(hw, word, 1, &data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
ret_val = e1000e_update_nvm_checksum(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
}
|
||||
|
||||
return e1000e_validate_nvm_checksum_generic(hw);
|
||||
|
||||
@@ -274,8 +274,11 @@
|
||||
|
||||
/* Latency Tolerance Reporting */
|
||||
#define E1000_LTRV 0x000F8
|
||||
#define E1000_LTRV_VALUE_MASK 0x000003FF
|
||||
#define E1000_LTRV_SCALE_MAX 5
|
||||
#define E1000_LTRV_SCALE_FACTOR 5
|
||||
#define E1000_LTRV_SCALE_SHIFT 10
|
||||
#define E1000_LTRV_SCALE_MASK 0x00001C00
|
||||
#define E1000_LTRV_REQ_SHIFT 15
|
||||
#define E1000_LTRV_NOSNOOP_SHIFT 16
|
||||
#define E1000_LTRV_SEND (1 << 30)
|
||||
|
||||
@@ -42,7 +42,9 @@ static int ice_info_pba(struct ice_pf *pf, struct ice_info_ctx *ctx)
|
||||
|
||||
status = ice_read_pba_string(hw, (u8 *)ctx->buf, sizeof(ctx->buf));
|
||||
if (status)
|
||||
return -EIO;
|
||||
/* We failed to locate the PBA, so just skip this entry */
|
||||
dev_dbg(ice_pf_to_dev(pf), "Failed to read Product Board Assembly string, status %s\n",
|
||||
ice_stat_str(status));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -149,6 +149,9 @@ static void igc_release_hw_control(struct igc_adapter *adapter)
|
||||
struct igc_hw *hw = &adapter->hw;
|
||||
u32 ctrl_ext;
|
||||
|
||||
if (!pci_device_is_present(adapter->pdev))
|
||||
return;
|
||||
|
||||
/* Let firmware take over control of h/w */
|
||||
ctrl_ext = rd32(IGC_CTRL_EXT);
|
||||
wr32(IGC_CTRL_EXT,
|
||||
@@ -4449,26 +4452,29 @@ void igc_down(struct igc_adapter *adapter)
|
||||
|
||||
igc_ptp_suspend(adapter);
|
||||
|
||||
/* disable receives in the hardware */
|
||||
rctl = rd32(IGC_RCTL);
|
||||
wr32(IGC_RCTL, rctl & ~IGC_RCTL_EN);
|
||||
/* flush and sleep below */
|
||||
|
||||
if (pci_device_is_present(adapter->pdev)) {
|
||||
/* disable receives in the hardware */
|
||||
rctl = rd32(IGC_RCTL);
|
||||
wr32(IGC_RCTL, rctl & ~IGC_RCTL_EN);
|
||||
/* flush and sleep below */
|
||||
}
|
||||
/* set trans_start so we don't get spurious watchdogs during reset */
|
||||
netif_trans_update(netdev);
|
||||
|
||||
netif_carrier_off(netdev);
|
||||
netif_tx_stop_all_queues(netdev);
|
||||
|
||||
/* disable transmits in the hardware */
|
||||
tctl = rd32(IGC_TCTL);
|
||||
tctl &= ~IGC_TCTL_EN;
|
||||
wr32(IGC_TCTL, tctl);
|
||||
/* flush both disables and wait for them to finish */
|
||||
wrfl();
|
||||
usleep_range(10000, 20000);
|
||||
if (pci_device_is_present(adapter->pdev)) {
|
||||
/* disable transmits in the hardware */
|
||||
tctl = rd32(IGC_TCTL);
|
||||
tctl &= ~IGC_TCTL_EN;
|
||||
wr32(IGC_TCTL, tctl);
|
||||
/* flush both disables and wait for them to finish */
|
||||
wrfl();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
igc_irq_disable(adapter);
|
||||
igc_irq_disable(adapter);
|
||||
}
|
||||
|
||||
adapter->flags &= ~IGC_FLAG_NEED_LINK_UPDATE;
|
||||
|
||||
@@ -5489,7 +5495,7 @@ static bool validate_schedule(struct igc_adapter *adapter,
|
||||
if (e->command != TC_TAPRIO_CMD_SET_GATES)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < IGC_MAX_TX_QUEUES; i++) {
|
||||
for (i = 0; i < adapter->num_tx_queues; i++) {
|
||||
if (e->gate_mask & BIT(i))
|
||||
queue_uses[i]++;
|
||||
|
||||
@@ -5546,7 +5552,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
|
||||
|
||||
end_time += e->interval;
|
||||
|
||||
for (i = 0; i < IGC_MAX_TX_QUEUES; i++) {
|
||||
for (i = 0; i < adapter->num_tx_queues; i++) {
|
||||
struct igc_ring *ring = adapter->tx_ring[i];
|
||||
|
||||
if (!(e->gate_mask & BIT(i)))
|
||||
|
||||
@@ -849,7 +849,8 @@ void igc_ptp_suspend(struct igc_adapter *adapter)
|
||||
adapter->ptp_tx_skb = NULL;
|
||||
clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state);
|
||||
|
||||
igc_ptp_time_save(adapter);
|
||||
if (pci_device_is_present(adapter->pdev))
|
||||
igc_ptp_time_save(adapter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
#define MVNETA_VLAN_PRIO_TO_RXQ 0x2440
|
||||
#define MVNETA_VLAN_PRIO_RXQ_MAP(prio, rxq) ((rxq) << ((prio) * 3))
|
||||
#define MVNETA_PORT_STATUS 0x2444
|
||||
#define MVNETA_TX_IN_PRGRS BIT(1)
|
||||
#define MVNETA_TX_IN_PRGRS BIT(0)
|
||||
#define MVNETA_TX_FIFO_EMPTY BIT(8)
|
||||
#define MVNETA_RX_MIN_FRAME_SIZE 0x247c
|
||||
/* Only exists on Armada XP and Armada 370 */
|
||||
|
||||
@@ -616,7 +616,12 @@ static int qed_enable_msix(struct qed_dev *cdev,
|
||||
rc = cnt;
|
||||
}
|
||||
|
||||
if (rc > 0) {
|
||||
/* For VFs, we should return with an error in case we didn't get the
|
||||
* exact number of msix vectors as we requested.
|
||||
* Not doing that will lead to a crash when starting queues for
|
||||
* this VF.
|
||||
*/
|
||||
if ((IS_PF(cdev) && rc > 0) || (IS_VF(cdev) && rc == cnt)) {
|
||||
/* MSI-x configuration was achieved */
|
||||
int_params->out.int_mode = QED_INT_MODE_MSIX;
|
||||
int_params->out.num_vectors = rc;
|
||||
|
||||
@@ -1874,6 +1874,7 @@ static void qede_sync_free_irqs(struct qede_dev *edev)
|
||||
}
|
||||
|
||||
edev->int_info.used_cnt = 0;
|
||||
edev->int_info.msix_cnt = 0;
|
||||
}
|
||||
|
||||
static int qede_req_msix_irqs(struct qede_dev *edev)
|
||||
@@ -2427,7 +2428,6 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
|
||||
goto out;
|
||||
err4:
|
||||
qede_sync_free_irqs(edev);
|
||||
memset(&edev->int_info.msix_cnt, 0, sizeof(struct qed_int_info));
|
||||
err3:
|
||||
qede_napi_disable_remove(edev);
|
||||
err2:
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "stmmac_platform.h"
|
||||
|
||||
@@ -1529,9 +1528,6 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
if (bsp_priv->integrated_phy)
|
||||
rk_gmac_integrated_phy_powerup(bsp_priv);
|
||||
|
||||
@@ -1540,14 +1536,9 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
|
||||
|
||||
static void rk_gmac_powerdown(struct rk_priv_data *gmac)
|
||||
{
|
||||
struct device *dev = &gmac->pdev->dev;
|
||||
|
||||
if (gmac->integrated_phy)
|
||||
rk_gmac_integrated_phy_powerdown(gmac);
|
||||
|
||||
pm_runtime_put_sync(dev);
|
||||
pm_runtime_disable(dev);
|
||||
|
||||
phy_power_on(gmac, false);
|
||||
gmac_clk_enable(gmac, false);
|
||||
}
|
||||
|
||||
@@ -339,9 +339,9 @@ static inline bool stmmac_xdp_is_enabled(struct stmmac_priv *priv)
|
||||
static inline unsigned int stmmac_rx_offset(struct stmmac_priv *priv)
|
||||
{
|
||||
if (stmmac_xdp_is_enabled(priv))
|
||||
return XDP_PACKET_HEADROOM + NET_IP_ALIGN;
|
||||
return XDP_PACKET_HEADROOM;
|
||||
|
||||
return NET_SKB_PAD + NET_IP_ALIGN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void stmmac_disable_rx_queue(struct stmmac_priv *priv, u32 queue);
|
||||
|
||||
@@ -4914,6 +4914,10 @@ read_again:
|
||||
|
||||
prefetch(np);
|
||||
|
||||
/* Ensure a valid XSK buffer before proceed */
|
||||
if (!buf->xdp)
|
||||
break;
|
||||
|
||||
if (priv->extend_desc)
|
||||
stmmac_rx_extended_status(priv, &priv->dev->stats,
|
||||
&priv->xstats,
|
||||
@@ -4934,10 +4938,6 @@ read_again:
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ensure a valid XSK buffer before proceed */
|
||||
if (!buf->xdp)
|
||||
break;
|
||||
|
||||
/* XSK pool expects RX frame 1:1 mapped to XSK buffer */
|
||||
if (likely(status & rx_not_ls)) {
|
||||
xsk_buff_free(buf->xdp);
|
||||
|
||||
@@ -884,11 +884,13 @@ static int tc_setup_taprio(struct stmmac_priv *priv,
|
||||
return 0;
|
||||
|
||||
disable:
|
||||
mutex_lock(&priv->plat->est->lock);
|
||||
priv->plat->est->enable = false;
|
||||
stmmac_est_configure(priv, priv->ioaddr, priv->plat->est,
|
||||
priv->plat->clk_ptp_rate);
|
||||
mutex_unlock(&priv->plat->est->lock);
|
||||
if (priv->plat->est) {
|
||||
mutex_lock(&priv->plat->est->lock);
|
||||
priv->plat->est->enable = false;
|
||||
stmmac_est_configure(priv, priv->ioaddr, priv->plat->est,
|
||||
priv->plat->clk_ptp_rate);
|
||||
mutex_unlock(&priv->plat->est->lock);
|
||||
}
|
||||
|
||||
priv->plat->fpe_cfg->enable = false;
|
||||
stmmac_fpe_configure(priv, priv->ioaddr,
|
||||
|
||||
@@ -34,18 +34,18 @@ static int stmmac_xdp_enable_pool(struct stmmac_priv *priv,
|
||||
need_update = netif_running(priv->dev) && stmmac_xdp_is_enabled(priv);
|
||||
|
||||
if (need_update) {
|
||||
stmmac_disable_rx_queue(priv, queue);
|
||||
stmmac_disable_tx_queue(priv, queue);
|
||||
napi_disable(&ch->rx_napi);
|
||||
napi_disable(&ch->tx_napi);
|
||||
stmmac_disable_rx_queue(priv, queue);
|
||||
stmmac_disable_tx_queue(priv, queue);
|
||||
}
|
||||
|
||||
set_bit(queue, priv->af_xdp_zc_qps);
|
||||
|
||||
if (need_update) {
|
||||
napi_enable(&ch->rxtx_napi);
|
||||
stmmac_enable_rx_queue(priv, queue);
|
||||
stmmac_enable_tx_queue(priv, queue);
|
||||
napi_enable(&ch->rxtx_napi);
|
||||
|
||||
err = stmmac_xsk_wakeup(priv->dev, queue, XDP_WAKEUP_RX);
|
||||
if (err)
|
||||
@@ -72,10 +72,10 @@ static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue)
|
||||
need_update = netif_running(priv->dev) && stmmac_xdp_is_enabled(priv);
|
||||
|
||||
if (need_update) {
|
||||
napi_disable(&ch->rxtx_napi);
|
||||
stmmac_disable_rx_queue(priv, queue);
|
||||
stmmac_disable_tx_queue(priv, queue);
|
||||
synchronize_rcu();
|
||||
napi_disable(&ch->rxtx_napi);
|
||||
}
|
||||
|
||||
xsk_pool_dma_unmap(pool, STMMAC_RX_DMA_ATTR);
|
||||
@@ -83,10 +83,10 @@ static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue)
|
||||
clear_bit(queue, priv->af_xdp_zc_qps);
|
||||
|
||||
if (need_update) {
|
||||
napi_enable(&ch->rx_napi);
|
||||
napi_enable(&ch->tx_napi);
|
||||
stmmac_enable_rx_queue(priv, queue);
|
||||
stmmac_enable_tx_queue(priv, queue);
|
||||
napi_enable(&ch->rx_napi);
|
||||
napi_enable(&ch->tx_napi);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -335,7 +335,7 @@ static int mhi_net_newlink(void *ctxt, struct net_device *ndev, u32 if_id,
|
||||
u64_stats_init(&mhi_netdev->stats.tx_syncp);
|
||||
|
||||
/* Start MHI channels */
|
||||
err = mhi_prepare_for_transfer(mhi_dev, 0);
|
||||
err = mhi_prepare_for_transfer(mhi_dev);
|
||||
if (err)
|
||||
goto out_err;
|
||||
|
||||
|
||||
@@ -81,6 +81,8 @@ static struct phy_driver mtk_gephy_driver[] = {
|
||||
*/
|
||||
.config_intr = genphy_no_config_intr,
|
||||
.handle_interrupt = genphy_handle_interrupt_no_ack,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_page = mtk_gephy_read_page,
|
||||
.write_page = mtk_gephy_write_page,
|
||||
},
|
||||
@@ -93,6 +95,8 @@ static struct phy_driver mtk_gephy_driver[] = {
|
||||
*/
|
||||
.config_intr = genphy_no_config_intr,
|
||||
.handle_interrupt = genphy_handle_interrupt_no_ack,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_page = mtk_gephy_read_page,
|
||||
.write_page = mtk_gephy_write_page,
|
||||
},
|
||||
|
||||
@@ -184,6 +184,7 @@ struct asix_common_private {
|
||||
struct phy_device *phydev;
|
||||
u16 phy_addr;
|
||||
char phy_name[20];
|
||||
bool embd_phy;
|
||||
};
|
||||
|
||||
extern const struct driver_info ax88172a_info;
|
||||
|
||||
@@ -354,24 +354,23 @@ out:
|
||||
static int ax88772_hw_reset(struct usbnet *dev, int in_pm)
|
||||
{
|
||||
struct asix_data *data = (struct asix_data *)&dev->data;
|
||||
int ret, embd_phy;
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
u16 rx_ctl;
|
||||
int ret;
|
||||
|
||||
ret = asix_write_gpio(dev, AX_GPIO_RSE | AX_GPIO_GPO_2 |
|
||||
AX_GPIO_GPO2EN, 5, in_pm);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
embd_phy = ((dev->mii.phy_id & 0x1f) == 0x10 ? 1 : 0);
|
||||
|
||||
ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, embd_phy,
|
||||
ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, priv->embd_phy,
|
||||
0, 0, NULL, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (embd_phy) {
|
||||
if (priv->embd_phy) {
|
||||
ret = asix_sw_reset(dev, AX_SWRESET_IPPD, in_pm);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
@@ -449,17 +448,16 @@ out:
|
||||
static int ax88772a_hw_reset(struct usbnet *dev, int in_pm)
|
||||
{
|
||||
struct asix_data *data = (struct asix_data *)&dev->data;
|
||||
int ret, embd_phy;
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
u16 rx_ctl, phy14h, phy15h, phy16h;
|
||||
u8 chipcode = 0;
|
||||
int ret;
|
||||
|
||||
ret = asix_write_gpio(dev, AX_GPIO_RSE, 5, in_pm);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
embd_phy = ((dev->mii.phy_id & 0x1f) == 0x10 ? 1 : 0);
|
||||
|
||||
ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, embd_phy |
|
||||
ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, priv->embd_phy |
|
||||
AX_PHYSEL_SSEN, 0, 0, NULL, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret);
|
||||
@@ -683,12 +681,6 @@ static int ax88772_init_phy(struct usbnet *dev)
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
int ret;
|
||||
|
||||
ret = asix_read_phy_addr(dev, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
priv->phy_addr = ret;
|
||||
|
||||
snprintf(priv->phy_name, sizeof(priv->phy_name), PHY_ID_FMT,
|
||||
priv->mdio->id, priv->phy_addr);
|
||||
|
||||
@@ -716,6 +708,12 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
int ret, i;
|
||||
u32 phyid;
|
||||
|
||||
priv = devm_kzalloc(&dev->udev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->driver_priv = priv;
|
||||
|
||||
usbnet_get_endpoints(dev, intf);
|
||||
|
||||
/* Maybe the boot loader passed the MAC address via device tree */
|
||||
@@ -751,6 +749,13 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
dev->net->needed_headroom = 4; /* cf asix_tx_fixup() */
|
||||
dev->net->needed_tailroom = 4; /* cf asix_tx_fixup() */
|
||||
|
||||
ret = asix_read_phy_addr(dev, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
priv->phy_addr = ret;
|
||||
priv->embd_phy = ((priv->phy_addr & 0x1f) == 0x10);
|
||||
|
||||
asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, 0, 0, 1, &chipcode, 0);
|
||||
chipcode &= AX_CHIPCODE_MASK;
|
||||
|
||||
@@ -773,12 +778,6 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
dev->rx_urb_size = 2048;
|
||||
}
|
||||
|
||||
priv = devm_kzalloc(&dev->udev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->driver_priv = priv;
|
||||
|
||||
priv->presvd_phy_bmcr = 0;
|
||||
priv->presvd_phy_advertise = 0;
|
||||
if (chipcode == AX_AX88772_CHIPCODE) {
|
||||
@@ -817,6 +816,12 @@ static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
asix_rx_fixup_common_free(dev->driver_priv);
|
||||
}
|
||||
|
||||
static void ax88178_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
asix_rx_fixup_common_free(dev->driver_priv);
|
||||
kfree(dev->driver_priv);
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ax88178_ethtool_ops = {
|
||||
.get_drvinfo = asix_get_drvinfo,
|
||||
.get_link = asix_get_link,
|
||||
@@ -1225,7 +1230,7 @@ static const struct driver_info ax88772b_info = {
|
||||
static const struct driver_info ax88178_info = {
|
||||
.description = "ASIX AX88178 USB 2.0 Ethernet",
|
||||
.bind = ax88178_bind,
|
||||
.unbind = ax88772_unbind,
|
||||
.unbind = ax88178_unbind,
|
||||
.status = asix_status,
|
||||
.link_reset = ax88178_link_reset,
|
||||
.reset = ax88178_reset,
|
||||
|
||||
@@ -446,7 +446,7 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
|
||||
write_mii_word(pegasus, 0, 0x1b, &auxmode);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
fail:
|
||||
netif_dbg(pegasus, drv, pegasus->net, "%s failed\n", __func__);
|
||||
return ret;
|
||||
@@ -835,7 +835,7 @@ static int pegasus_open(struct net_device *net)
|
||||
if (!pegasus->rx_skb)
|
||||
goto exit;
|
||||
|
||||
res = set_registers(pegasus, EthID, 6, net->dev_addr);
|
||||
set_registers(pegasus, EthID, 6, net->dev_addr);
|
||||
|
||||
usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
|
||||
usb_rcvbulkpipe(pegasus->usb, 1),
|
||||
|
||||
@@ -110,7 +110,7 @@ static int mhi_wwan_ctrl_start(struct wwan_port *port)
|
||||
int ret;
|
||||
|
||||
/* Start mhi device's channel(s) */
|
||||
ret = mhi_prepare_for_transfer(mhiwwan->mhi_dev, 0);
|
||||
ret = mhi_prepare_for_transfer(mhiwwan->mhi_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -893,6 +893,10 @@ static int _set_required_opps(struct device *dev,
|
||||
if (!required_opp_tables)
|
||||
return 0;
|
||||
|
||||
/* required-opps not fully initialized yet */
|
||||
if (lazy_linking_pending(opp_table))
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* We only support genpd's OPPs in the "required-opps" for now, as we
|
||||
* don't know much about other use cases. Error out if the required OPP
|
||||
@@ -903,10 +907,6 @@ static int _set_required_opps(struct device *dev,
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/* required-opps not fully initialized yet */
|
||||
if (lazy_linking_pending(opp_table))
|
||||
return -EBUSY;
|
||||
|
||||
/* Single genpd case */
|
||||
if (!genpd_virt_devs)
|
||||
return _set_required_opp(dev, dev, opp, 0);
|
||||
|
||||
@@ -776,6 +776,9 @@ static void msix_mask_all(void __iomem *base, int tsize)
|
||||
u32 ctrl = PCI_MSIX_ENTRY_CTRL_MASKBIT;
|
||||
int i;
|
||||
|
||||
if (pci_msi_ignore_mask)
|
||||
return;
|
||||
|
||||
for (i = 0; i < tsize; i++, base += PCI_MSIX_ENTRY_SIZE)
|
||||
writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ config RESET_LPC18XX
|
||||
|
||||
config RESET_MCHP_SPARX5
|
||||
bool "Microchip Sparx5 reset driver"
|
||||
depends on HAS_IOMEM || COMPILE_TEST
|
||||
depends on ARCH_SPARX5 || COMPILE_TEST
|
||||
default y if SPARX5_SWITCH
|
||||
select MFD_SYSCON
|
||||
help
|
||||
|
||||
@@ -53,7 +53,8 @@ static int zynqmp_reset_status(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
struct zynqmp_reset_data *priv = to_zynqmp_reset_data(rcdev);
|
||||
int val, err;
|
||||
int err;
|
||||
u32 val;
|
||||
|
||||
err = zynqmp_pm_reset_get_status(priv->data->reset_id + id, &val);
|
||||
if (err)
|
||||
|
||||
@@ -808,12 +808,15 @@ store_state_field(struct device *dev, struct device_attribute *attr,
|
||||
ret = scsi_device_set_state(sdev, state);
|
||||
/*
|
||||
* If the device state changes to SDEV_RUNNING, we need to
|
||||
* rescan the device to revalidate it, and run the queue to
|
||||
* avoid I/O hang.
|
||||
* run the queue to avoid I/O hang, and rescan the device
|
||||
* to revalidate it. Running the queue first is necessary
|
||||
* because another thread may be waiting inside
|
||||
* blk_mq_freeze_queue_wait() and because that call may be
|
||||
* waiting for pending I/O to finish.
|
||||
*/
|
||||
if (ret == 0 && state == SDEV_RUNNING) {
|
||||
scsi_rescan_device(dev);
|
||||
blk_mq_run_hw_queues(sdev->request_queue, true);
|
||||
scsi_rescan_device(dev);
|
||||
}
|
||||
mutex_unlock(&sdev->state_mutex);
|
||||
|
||||
|
||||
@@ -9,12 +9,11 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
#include "video.h"
|
||||
#include "audio.h"
|
||||
#include "osd.h"
|
||||
|
||||
#include <linux/dvb/video.h>
|
||||
#include <linux/dvb/audio.h>
|
||||
#include <linux/dvb/dmx.h>
|
||||
#include <linux/dvb/ca.h>
|
||||
#include <linux/dvb/osd.h>
|
||||
#include <linux/dvb/net.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
|
||||
@@ -940,19 +940,19 @@ static struct dwc3_trb *dwc3_ep_prev_trb(struct dwc3_ep *dep, u8 index)
|
||||
|
||||
static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
|
||||
{
|
||||
struct dwc3_trb *tmp;
|
||||
u8 trbs_left;
|
||||
|
||||
/*
|
||||
* If enqueue & dequeue are equal than it is either full or empty.
|
||||
*
|
||||
* One way to know for sure is if the TRB right before us has HWO bit
|
||||
* set or not. If it has, then we're definitely full and can't fit any
|
||||
* more transfers in our ring.
|
||||
* If the enqueue & dequeue are equal then the TRB ring is either full
|
||||
* or empty. It's considered full when there are DWC3_TRB_NUM-1 of TRBs
|
||||
* pending to be processed by the driver.
|
||||
*/
|
||||
if (dep->trb_enqueue == dep->trb_dequeue) {
|
||||
tmp = dwc3_ep_prev_trb(dep, dep->trb_enqueue);
|
||||
if (tmp->ctrl & DWC3_TRB_CTRL_HWO)
|
||||
/*
|
||||
* If there is any request remained in the started_list at
|
||||
* this point, that means there is no TRB available.
|
||||
*/
|
||||
if (!list_empty(&dep->started_list))
|
||||
return 0;
|
||||
|
||||
return DWC3_TRB_NUM - 1;
|
||||
@@ -2243,10 +2243,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
|
||||
|
||||
ret = wait_for_completion_timeout(&dwc->ep0_in_setup,
|
||||
msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT));
|
||||
if (ret == 0) {
|
||||
dev_err(dwc->dev, "timed out waiting for SETUP phase\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
if (ret == 0)
|
||||
dev_warn(dwc->dev, "timed out waiting for SETUP phase\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2458,6 +2456,7 @@ static int __dwc3_gadget_start(struct dwc3 *dwc)
|
||||
/* begin to receive SETUP packets */
|
||||
dwc->ep0state = EP0_SETUP_PHASE;
|
||||
dwc->link_state = DWC3_LINK_STATE_SS_DIS;
|
||||
dwc->delayed_status = false;
|
||||
dwc3_ep0_out_start(dwc);
|
||||
|
||||
dwc3_gadget_enable_irq(dwc);
|
||||
|
||||
@@ -230,7 +230,13 @@ static void u_audio_iso_fback_complete(struct usb_ep *ep,
|
||||
int status = req->status;
|
||||
|
||||
/* i/f shutting down */
|
||||
if (!prm->fb_ep_enabled || req->status == -ESHUTDOWN)
|
||||
if (!prm->fb_ep_enabled) {
|
||||
kfree(req->buf);
|
||||
usb_ep_free_request(ep, req);
|
||||
return;
|
||||
}
|
||||
|
||||
if (req->status == -ESHUTDOWN)
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -388,8 +394,6 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
|
||||
if (!prm->ep_enabled)
|
||||
return;
|
||||
|
||||
prm->ep_enabled = false;
|
||||
|
||||
audio_dev = uac->audio_dev;
|
||||
params = &audio_dev->params;
|
||||
|
||||
@@ -407,6 +411,8 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
|
||||
}
|
||||
}
|
||||
|
||||
prm->ep_enabled = false;
|
||||
|
||||
if (usb_ep_disable(ep))
|
||||
dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
|
||||
}
|
||||
@@ -418,15 +424,16 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
|
||||
if (!prm->fb_ep_enabled)
|
||||
return;
|
||||
|
||||
prm->fb_ep_enabled = false;
|
||||
|
||||
if (prm->req_fback) {
|
||||
usb_ep_dequeue(ep, prm->req_fback);
|
||||
kfree(prm->req_fback->buf);
|
||||
usb_ep_free_request(ep, prm->req_fback);
|
||||
if (usb_ep_dequeue(ep, prm->req_fback)) {
|
||||
kfree(prm->req_fback->buf);
|
||||
usb_ep_free_request(ep, prm->req_fback);
|
||||
}
|
||||
prm->req_fback = NULL;
|
||||
}
|
||||
|
||||
prm->fb_ep_enabled = false;
|
||||
|
||||
if (usb_ep_disable(ep))
|
||||
dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
|
||||
}
|
||||
|
||||
@@ -207,7 +207,8 @@ static int renesas_check_rom_state(struct pci_dev *pdev)
|
||||
return 0;
|
||||
|
||||
case RENESAS_ROM_STATUS_NO_RESULT: /* No result yet */
|
||||
return 0;
|
||||
dev_dbg(&pdev->dev, "Unknown ROM status ...\n");
|
||||
return -ENOENT;
|
||||
|
||||
case RENESAS_ROM_STATUS_ERROR: /* Error State */
|
||||
default: /* All other states are marked as "Reserved states" */
|
||||
@@ -224,14 +225,6 @@ static int renesas_fw_check_running(struct pci_dev *pdev)
|
||||
u8 fw_state;
|
||||
int err;
|
||||
|
||||
/* Check if device has ROM and loaded, if so skip everything */
|
||||
err = renesas_check_rom(pdev);
|
||||
if (err) { /* we have rom */
|
||||
err = renesas_check_rom_state(pdev);
|
||||
if (!err)
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test if the device is actually needing the firmware. As most
|
||||
* BIOSes will initialize the device for us. If the device is
|
||||
@@ -591,21 +584,39 @@ int renesas_xhci_check_request_fw(struct pci_dev *pdev,
|
||||
(struct xhci_driver_data *)id->driver_data;
|
||||
const char *fw_name = driver_data->firmware;
|
||||
const struct firmware *fw;
|
||||
bool has_rom;
|
||||
int err;
|
||||
|
||||
/* Check if device has ROM and loaded, if so skip everything */
|
||||
has_rom = renesas_check_rom(pdev);
|
||||
if (has_rom) {
|
||||
err = renesas_check_rom_state(pdev);
|
||||
if (!err)
|
||||
return 0;
|
||||
else if (err != -ENOENT)
|
||||
has_rom = false;
|
||||
}
|
||||
|
||||
err = renesas_fw_check_running(pdev);
|
||||
/* Continue ahead, if the firmware is already running. */
|
||||
if (err == 0)
|
||||
return 0;
|
||||
|
||||
/* no firmware interface available */
|
||||
if (err != 1)
|
||||
return err;
|
||||
return has_rom ? 0 : err;
|
||||
|
||||
pci_dev_get(pdev);
|
||||
err = request_firmware(&fw, fw_name, &pdev->dev);
|
||||
err = firmware_request_nowarn(&fw, fw_name, &pdev->dev);
|
||||
pci_dev_put(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "request_firmware failed: %d\n", err);
|
||||
if (has_rom) {
|
||||
dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n",
|
||||
fw_name);
|
||||
return 0;
|
||||
}
|
||||
dev_err(&pdev->dev, "failed to load firmware %s: %d\n",
|
||||
fw_name, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -851,7 +851,6 @@ static struct usb_serial_driver ch341_device = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "ch341-uart",
|
||||
},
|
||||
.bulk_in_size = 512,
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
.open = ch341_open,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user