mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The new route handling in ip_mc_finish_output() from 'net' overlapped with the new support for returning congestion notifications from BPF programs. In order to handle this I had to take the dev_loopback_xmit() calls out of the switch statement. The aquantia driver conflicts were simple overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
d96ff269a0
@ -3131,6 +3131,7 @@ F: arch/arm/mach-bcm/
|
||||
BROADCOM BCM2835 ARM ARCHITECTURE
|
||||
M: Eric Anholt <eric@anholt.net>
|
||||
M: Stefan Wahren <wahrenst@gmx.net>
|
||||
L: bcm-kernel-feedback-list@broadcom.com
|
||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
T: git git://github.com/anholt/linux
|
||||
@ -3160,6 +3161,7 @@ F: arch/arm/boot/dts/bcm953012*
|
||||
|
||||
BROADCOM BCM53573 ARM ARCHITECTURE
|
||||
M: Rafał Miłecki <rafal@milecki.pl>
|
||||
L: bcm-kernel-feedback-list@broadcom.com
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
S: Maintained
|
||||
F: arch/arm/boot/dts/bcm53573*
|
||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Golden Lions
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -20,7 +20,7 @@
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,19200n8 root=/dev/sda1 rw rootwait";
|
||||
bootargs = "console=ttyS0,19200n8 root=/dev/sda1 rw rootwait consoleblank=300";
|
||||
stdout-path = "uart0:19200n8";
|
||||
};
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
/ {
|
||||
model = "D-Link DNS-313 1-Bay Network Storage Enclosure";
|
||||
compatible = "dlink,dir-313", "cortina,gemini";
|
||||
compatible = "dlink,dns-313", "cortina,gemini";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
|
@ -358,7 +358,7 @@
|
||||
pwm1: pwm@2080000 {
|
||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||
reg = <0x02080000 0x4000>;
|
||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6UL_CLK_PWM1>,
|
||||
<&clks IMX6UL_CLK_PWM1>;
|
||||
clock-names = "ipg", "per";
|
||||
@ -369,7 +369,7 @@
|
||||
pwm2: pwm@2084000 {
|
||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||
reg = <0x02084000 0x4000>;
|
||||
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6UL_CLK_PWM2>,
|
||||
<&clks IMX6UL_CLK_PWM2>;
|
||||
clock-names = "ipg", "per";
|
||||
@ -380,7 +380,7 @@
|
||||
pwm3: pwm@2088000 {
|
||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||
reg = <0x02088000 0x4000>;
|
||||
interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6UL_CLK_PWM3>,
|
||||
<&clks IMX6UL_CLK_PWM3>;
|
||||
clock-names = "ipg", "per";
|
||||
@ -391,7 +391,7 @@
|
||||
pwm4: pwm@208c000 {
|
||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||
reg = <0x0208c000 0x4000>;
|
||||
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6UL_CLK_PWM4>,
|
||||
<&clks IMX6UL_CLK_PWM4>;
|
||||
clock-names = "ipg", "per";
|
||||
|
@ -248,8 +248,8 @@
|
||||
<GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@ -264,7 +264,6 @@
|
||||
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
||||
clock-names = "bus", "core";
|
||||
operating-points-v2 = <&gpu_opp_table>;
|
||||
switch-delay = <0xffff>;
|
||||
};
|
||||
};
|
||||
}; /* end of / */
|
||||
|
@ -163,23 +163,23 @@
|
||||
|
||||
opp-255000000 {
|
||||
opp-hz = /bits/ 64 <255000000>;
|
||||
opp-microvolt = <1150000>;
|
||||
opp-microvolt = <1100000>;
|
||||
};
|
||||
opp-364300000 {
|
||||
opp-hz = /bits/ 64 <364300000>;
|
||||
opp-microvolt = <1150000>;
|
||||
opp-microvolt = <1100000>;
|
||||
};
|
||||
opp-425000000 {
|
||||
opp-hz = /bits/ 64 <425000000>;
|
||||
opp-microvolt = <1150000>;
|
||||
opp-microvolt = <1100000>;
|
||||
};
|
||||
opp-510000000 {
|
||||
opp-hz = /bits/ 64 <510000000>;
|
||||
opp-microvolt = <1150000>;
|
||||
opp-microvolt = <1100000>;
|
||||
};
|
||||
opp-637500000 {
|
||||
opp-hz = /bits/ 64 <637500000>;
|
||||
opp-microvolt = <1150000>;
|
||||
opp-microvolt = <1100000>;
|
||||
turbo-mode;
|
||||
};
|
||||
};
|
||||
@ -229,7 +229,6 @@
|
||||
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
||||
clock-names = "bus", "core";
|
||||
operating-points-v2 = <&gpu_opp_table>;
|
||||
switch-delay = <0xffff>;
|
||||
};
|
||||
};
|
||||
}; /* end of / */
|
||||
|
@ -430,7 +430,7 @@ static void omap3_prm_reconfigure_io_chain(void)
|
||||
* registers, and omap3xxx_prm_reconfigure_io_chain() must be called.
|
||||
* No return value.
|
||||
*/
|
||||
static void __init omap3xxx_prm_enable_io_wakeup(void)
|
||||
static void omap3xxx_prm_enable_io_wakeup(void)
|
||||
{
|
||||
if (prm_features & PRM_HAS_IO_WAKEUP)
|
||||
omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
|
||||
|
@ -28,7 +28,7 @@
|
||||
enable-method = "psci";
|
||||
clocks = <&clockgen 1 0>;
|
||||
next-level-cache = <&l2>;
|
||||
cpu-idle-states = <&CPU_PH20>;
|
||||
cpu-idle-states = <&CPU_PW20>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
@ -38,7 +38,7 @@
|
||||
enable-method = "psci";
|
||||
clocks = <&clockgen 1 0>;
|
||||
next-level-cache = <&l2>;
|
||||
cpu-idle-states = <&CPU_PH20>;
|
||||
cpu-idle-states = <&CPU_PW20>;
|
||||
};
|
||||
|
||||
l2: l2-cache {
|
||||
@ -53,13 +53,13 @@
|
||||
*/
|
||||
entry-method = "arm,psci";
|
||||
|
||||
CPU_PH20: cpu-ph20 {
|
||||
CPU_PW20: cpu-pw20 {
|
||||
compatible = "arm,idle-state";
|
||||
idle-state-name = "PH20";
|
||||
arm,psci-suspend-param = <0x00010000>;
|
||||
entry-latency-us = <1000>;
|
||||
exit-latency-us = <1000>;
|
||||
min-residency-us = <3000>;
|
||||
idle-state-name = "PW20";
|
||||
arm,psci-suspend-param = <0x0>;
|
||||
entry-latency-us = <2000>;
|
||||
exit-latency-us = <2000>;
|
||||
min-residency-us = <6000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -613,6 +613,7 @@ CONFIG_RTC_DRV_TEGRA=y
|
||||
CONFIG_RTC_DRV_IMX_SC=m
|
||||
CONFIG_RTC_DRV_XGENE=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_FSL_EDMA=y
|
||||
CONFIG_DMA_BCM2835=m
|
||||
CONFIG_K3_DMA=y
|
||||
CONFIG_MV_XOR=y
|
||||
|
@ -39,6 +39,11 @@ static int save_fpu_state(struct sigcontext __user *sc)
|
||||
#endif
|
||||
|
||||
struct rt_sigframe {
|
||||
/*
|
||||
* pad[3] is compatible with the same struct defined in
|
||||
* gcc/libgcc/config/csky/linux-unwind.h
|
||||
*/
|
||||
int pad[3];
|
||||
struct siginfo info;
|
||||
struct ucontext uc;
|
||||
};
|
||||
|
@ -786,6 +786,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
/* 32-bit PC relative address */
|
||||
*loc = val - dot - 8 + addend;
|
||||
break;
|
||||
case R_PARISC_PCREL64:
|
||||
/* 64-bit PC relative address */
|
||||
*loc64 = val - dot - 8 + addend;
|
||||
break;
|
||||
case R_PARISC_DIR64:
|
||||
/* 64-bit effective address */
|
||||
*loc64 = val + addend;
|
||||
|
@ -319,6 +319,13 @@ struct vm_area_struct;
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#include <asm/slice.h>
|
||||
|
||||
/*
|
||||
* Allow 30-bit DMA for very limited Broadcom wifi chips on many powerbooks.
|
||||
*/
|
||||
#ifdef CONFIG_PPC32
|
||||
#define ARCH_ZONE_DMA_BITS 30
|
||||
#else
|
||||
#define ARCH_ZONE_DMA_BITS 31
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_POWERPC_PAGE_H */
|
||||
|
@ -752,6 +752,7 @@ __secondary_start:
|
||||
stw r0,0(r3)
|
||||
|
||||
/* load up the MMU */
|
||||
bl load_segment_registers
|
||||
bl load_up_mmu
|
||||
|
||||
/* ptr to phys current thread */
|
||||
|
@ -83,7 +83,7 @@ END_BTB_FLUSH_SECTION
|
||||
SAVE_4GPRS(3, r11); \
|
||||
SAVE_2GPRS(7, r11)
|
||||
|
||||
.macro SYSCALL_ENTRY trapno intno
|
||||
.macro SYSCALL_ENTRY trapno intno srr1
|
||||
mfspr r10, SPRN_SPRG_THREAD
|
||||
#ifdef CONFIG_KVM_BOOKE_HV
|
||||
BEGIN_FTR_SECTION
|
||||
@ -94,7 +94,7 @@ BEGIN_FTR_SECTION
|
||||
mfspr r11, SPRN_SRR1
|
||||
mtocrf 0x80, r11 /* check MSR[GS] without clobbering reg */
|
||||
bf 3, 1975f
|
||||
b kvmppc_handler_BOOKE_INTERRUPT_\intno\()_SPRN_SRR1
|
||||
b kvmppc_handler_\intno\()_\srr1
|
||||
1975:
|
||||
mr r12, r13
|
||||
lwz r13, THREAD_NORMSAVE(2)(r10)
|
||||
@ -145,9 +145,9 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
||||
tophys(r11,r11)
|
||||
addi r11,r11,global_dbcr0@l
|
||||
#ifdef CONFIG_SMP
|
||||
lwz r9,TASK_CPU(r2)
|
||||
slwi r9,r9,3
|
||||
add r11,r11,r9
|
||||
lwz r10, TASK_CPU(r2)
|
||||
slwi r10, r10, 3
|
||||
add r11, r11, r10
|
||||
#endif
|
||||
lwz r12,0(r11)
|
||||
mtspr SPRN_DBCR0,r12
|
||||
|
@ -409,7 +409,7 @@ interrupt_base:
|
||||
|
||||
/* System Call Interrupt */
|
||||
START_EXCEPTION(SystemCall)
|
||||
SYSCALL_ENTRY 0xc00 SYSCALL
|
||||
SYSCALL_ENTRY 0xc00 BOOKE_INTERRUPT_SYSCALL SPRN_SRR1
|
||||
|
||||
/* Auxiliary Processor Unavailable Interrupt */
|
||||
EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
|
||||
|
@ -830,6 +830,7 @@ static void flush_guest_tlb(struct kvm *kvm)
|
||||
}
|
||||
}
|
||||
asm volatile("ptesync": : :"memory");
|
||||
asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
|
||||
}
|
||||
|
||||
void kvmppc_check_need_tlb_flush(struct kvm *kvm, int pcpu,
|
||||
|
@ -2500,17 +2500,28 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||
LOAD_REG_ADDR(r11, dawr_force_enable)
|
||||
lbz r11, 0(r11)
|
||||
cmpdi r11, 0
|
||||
bne 3f
|
||||
li r3, H_HARDWARE
|
||||
beqlr
|
||||
blr
|
||||
3:
|
||||
/* Emulate H_SET_DABR/X on P8 for the sake of compat mode guests */
|
||||
rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW
|
||||
rlwimi r5, r4, 2, DAWRX_WT
|
||||
clrrdi r4, r4, 3
|
||||
std r4, VCPU_DAWR(r3)
|
||||
std r5, VCPU_DAWRX(r3)
|
||||
/*
|
||||
* If came in through the real mode hcall handler then it is necessary
|
||||
* to write the registers since the return path won't. Otherwise it is
|
||||
* sufficient to store then in the vcpu struct as they will be loaded
|
||||
* next time the vcpu is run.
|
||||
*/
|
||||
mfmsr r6
|
||||
andi. r6, r6, MSR_DR /* in real mode? */
|
||||
bne 4f
|
||||
mtspr SPRN_DAWR, r4
|
||||
mtspr SPRN_DAWRX, r5
|
||||
li r3, 0
|
||||
4: li r3, 0
|
||||
blr
|
||||
|
||||
_GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */
|
||||
|
@ -50,20 +50,52 @@ EXPORT_SYMBOL_GPL(hash__alloc_context_id);
|
||||
|
||||
void slb_setup_new_exec(void);
|
||||
|
||||
static int realloc_context_ids(mm_context_t *ctx)
|
||||
{
|
||||
int i, id;
|
||||
|
||||
/*
|
||||
* id 0 (aka. ctx->id) is special, we always allocate a new one, even if
|
||||
* there wasn't one allocated previously (which happens in the exec
|
||||
* case where ctx is newly allocated).
|
||||
*
|
||||
* We have to be a bit careful here. We must keep the existing ids in
|
||||
* the array, so that we can test if they're non-zero to decide if we
|
||||
* need to allocate a new one. However in case of error we must free the
|
||||
* ids we've allocated but *not* any of the existing ones (or risk a
|
||||
* UAF). That's why we decrement i at the start of the error handling
|
||||
* loop, to skip the id that we just tested but couldn't reallocate.
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(ctx->extended_id); i++) {
|
||||
if (i == 0 || ctx->extended_id[i]) {
|
||||
id = hash__alloc_context_id();
|
||||
if (id < 0)
|
||||
goto error;
|
||||
|
||||
ctx->extended_id[i] = id;
|
||||
}
|
||||
}
|
||||
|
||||
/* The caller expects us to return id */
|
||||
return ctx->id;
|
||||
|
||||
error:
|
||||
for (i--; i >= 0; i--) {
|
||||
if (ctx->extended_id[i])
|
||||
ida_free(&mmu_context_ida, ctx->extended_id[i]);
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
static int hash__init_new_context(struct mm_struct *mm)
|
||||
{
|
||||
int index;
|
||||
|
||||
index = hash__alloc_context_id();
|
||||
if (index < 0)
|
||||
return index;
|
||||
|
||||
mm->context.hash_context = kmalloc(sizeof(struct hash_mm_context),
|
||||
GFP_KERNEL);
|
||||
if (!mm->context.hash_context) {
|
||||
ida_free(&mmu_context_ida, index);
|
||||
if (!mm->context.hash_context)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* The old code would re-promote on fork, we don't do that when using
|
||||
@ -91,13 +123,20 @@ static int hash__init_new_context(struct mm_struct *mm)
|
||||
mm->context.hash_context->spt = kmalloc(sizeof(struct subpage_prot_table),
|
||||
GFP_KERNEL);
|
||||
if (!mm->context.hash_context->spt) {
|
||||
ida_free(&mmu_context_ida, index);
|
||||
kfree(mm->context.hash_context);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
index = realloc_context_ids(&mm->context);
|
||||
if (index < 0) {
|
||||
#ifdef CONFIG_PPC_SUBPAGE_PROT
|
||||
kfree(mm->context.hash_context->spt);
|
||||
#endif
|
||||
kfree(mm->context.hash_context);
|
||||
return index;
|
||||
}
|
||||
|
||||
pkey_mm_init(mm);
|
||||
|
@ -248,7 +248,8 @@ void __init paging_init(void)
|
||||
(long int)((top_of_ram - total_ram) >> 20));
|
||||
|
||||
#ifdef CONFIG_ZONE_DMA
|
||||
max_zone_pfns[ZONE_DMA] = min(max_low_pfn, 0x7fffffffUL >> PAGE_SHIFT);
|
||||
max_zone_pfns[ZONE_DMA] = min(max_low_pfn,
|
||||
((1UL << ARCH_ZONE_DMA_BITS) - 1) >> PAGE_SHIFT);
|
||||
#endif
|
||||
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
@ -7,6 +7,7 @@ config PPC_PMAC
|
||||
select PPC_INDIRECT_PCI if PPC32
|
||||
select PPC_MPC106 if PPC32
|
||||
select PPC_NATIVE
|
||||
select ZONE_DMA if PPC32
|
||||
default y
|
||||
|
||||
config PPC_PMAC64
|
||||
|
@ -52,8 +52,9 @@ static const struct fb_var_screeninfo cfag12864bfb_var = {
|
||||
|
||||
static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||
{
|
||||
return vm_insert_page(vma, vma->vm_start,
|
||||
virt_to_page(cfag12864b_buffer));
|
||||
struct page *pages = virt_to_page(cfag12864b_buffer);
|
||||
|
||||
return vm_map_pages_zero(vma, &pages, 1);
|
||||
}
|
||||
|
||||
static struct fb_ops cfag12864bfb_ops = {
|
||||
|
@ -223,9 +223,9 @@ static const struct backlight_ops ht16k33_bl_ops = {
|
||||
static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||
{
|
||||
struct ht16k33_priv *priv = info->par;
|
||||
struct page *pages = virt_to_page(priv->fbdev.buffer);
|
||||
|
||||
return vm_insert_page(vma, vma->vm_start,
|
||||
virt_to_page(priv->fbdev.buffer));
|
||||
return vm_map_pages_zero(vma, &pages, 1);
|
||||
}
|
||||
|
||||
static struct fb_ops ht16k33_fb_ops = {
|
||||
|
@ -368,7 +368,7 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index)
|
||||
const char *dev_id = dev ? dev_name(dev) : NULL;
|
||||
struct device_node *np = core->of_node;
|
||||
|
||||
if (np && index >= 0)
|
||||
if (np && (name || index >= 0))
|
||||
hw = of_clk_get_hw(np, index, name);
|
||||
|
||||
/*
|
||||
|
@ -2734,8 +2734,8 @@ static struct clk_hw_onecell_data g12a_hw_onecell_data = {
|
||||
[CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
|
||||
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
||||
[CLKID_MALI] = &g12a_mali.hw,
|
||||
[CLKID_MPLL_5OM_DIV] = &g12a_mpll_50m_div.hw,
|
||||
[CLKID_MPLL_5OM] = &g12a_mpll_50m.hw,
|
||||
[CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
|
||||
[CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
|
||||
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
||||
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
||||
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
||||
|
@ -166,7 +166,7 @@
|
||||
#define CLKID_HDMI_DIV 167
|
||||
#define CLKID_MALI_0_DIV 170
|
||||
#define CLKID_MALI_1_DIV 173
|
||||
#define CLKID_MPLL_5OM_DIV 176
|
||||
#define CLKID_MPLL_50M_DIV 176
|
||||
#define CLKID_SYS_PLL_DIV16_EN 178
|
||||
#define CLKID_SYS_PLL_DIV16 179
|
||||
#define CLKID_CPU_CLK_DYN0_SEL 180
|
||||
|
@ -1761,7 +1761,7 @@ static struct clk_regmap meson8m2_gp_pll = {
|
||||
},
|
||||
};
|
||||
|
||||
static const char * const mmeson8b_vpu_0_1_parent_names[] = {
|
||||
static const char * const meson8b_vpu_0_1_parent_names[] = {
|
||||
"fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7"
|
||||
};
|
||||
|
||||
@ -1778,8 +1778,8 @@ static struct clk_regmap meson8b_vpu_0_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_names = mmeson8b_vpu_0_1_parent_names,
|
||||
.num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names),
|
||||
.parent_names = meson8b_vpu_0_1_parent_names,
|
||||
.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
@ -1837,8 +1837,8 @@ static struct clk_regmap meson8b_vpu_1_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_1_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_names = mmeson8b_vpu_0_1_parent_names,
|
||||
.num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names),
|
||||
.parent_names = meson8b_vpu_0_1_parent_names,
|
||||
.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
@ -103,9 +103,9 @@ static const struct stratix10_perip_cnt_clock s10_main_perip_cnt_clks[] = {
|
||||
{ STRATIX10_NOC_CLK, "noc_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux),
|
||||
0, 0, 0, 0x3C, 1},
|
||||
{ STRATIX10_EMAC_A_FREE_CLK, "emaca_free_clk", NULL, emaca_free_mux, ARRAY_SIZE(emaca_free_mux),
|
||||
0, 0, 4, 0xB0, 0},
|
||||
0, 0, 2, 0xB0, 0},
|
||||
{ STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux),
|
||||
0, 0, 4, 0xB0, 1},
|
||||
0, 0, 2, 0xB0, 1},
|
||||
{ STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux,
|
||||
ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 4, 0xB0, 2},
|
||||
{ STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux,
|
||||
|
@ -3366,6 +3366,8 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
||||
{ TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
|
||||
{ TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
|
||||
{ TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
|
||||
{ TEGRA210_CLK_HDA, TEGRA210_CLK_PLL_P, 51000000, 0 },
|
||||
{ TEGRA210_CLK_HDA2CODEC_2X, TEGRA210_CLK_PLL_P, 48000000, 0 },
|
||||
/* This MUST be the last entry. */
|
||||
{ TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
|
||||
};
|
||||
|
@ -229,6 +229,7 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
|
||||
{
|
||||
struct omap_clkctrl_provider *provider = data;
|
||||
struct omap_clkctrl_clk *entry;
|
||||
bool found = false;
|
||||
|
||||
if (clkspec->args_count != 2)
|
||||
return ERR_PTR(-EINVAL);
|
||||
@ -238,11 +239,13 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
|
||||
|
||||
list_for_each_entry(entry, &provider->clocks, node) {
|
||||
if (entry->reg_offset == clkspec->args[0] &&
|
||||
entry->bit_offset == clkspec->args[1])
|
||||
entry->bit_offset == clkspec->args[1]) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!entry)
|
||||
if (!found)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return entry->clk;
|
||||
|
@ -80,6 +80,7 @@
|
||||
#define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP 0x1220
|
||||
#define HID_DEVICE_ID_ALPS_U1 0x1215
|
||||
#define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C
|
||||
#define HID_DEVICE_ID_ALPS_1222 0x1222
|
||||
|
||||
|
||||
#define USB_VENDOR_ID_AMI 0x046b
|
||||
@ -269,6 +270,7 @@
|
||||
#define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d
|
||||
#define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618
|
||||
#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053
|
||||
#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2 0x0939
|
||||
#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123
|
||||
#define USB_DEVICE_ID_ASUS_AK1D 0x1125
|
||||
#define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408
|
||||
@ -569,6 +571,7 @@
|
||||
|
||||
#define USB_VENDOR_ID_HUION 0x256c
|
||||
#define USB_DEVICE_ID_HUION_TABLET 0x006e
|
||||
#define USB_DEVICE_ID_HUION_HS64 0x006d
|
||||
|
||||
#define USB_VENDOR_ID_IBM 0x04b3
|
||||
#define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#define REPORT_ID_HIDPP_SHORT 0x10
|
||||
#define REPORT_ID_HIDPP_LONG 0x11
|
||||
#define REPORT_ID_HIDPP_VERY_LONG 0x12
|
||||
|
||||
#define HIDPP_REPORT_SHORT_LENGTH 7
|
||||
#define HIDPP_REPORT_LONG_LENGTH 20
|
||||
@ -1242,7 +1243,8 @@ static int logi_dj_ll_raw_request(struct hid_device *hid,
|
||||
int ret;
|
||||
|
||||
if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
|
||||
(buf[0] == REPORT_ID_HIDPP_LONG)) {
|
||||
(buf[0] == REPORT_ID_HIDPP_LONG) ||
|
||||
(buf[0] == REPORT_ID_HIDPP_VERY_LONG)) {
|
||||
if (count < 2)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -1776,6 +1776,10 @@ static const struct hid_device_id mt_devices[] = {
|
||||
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
|
||||
USB_VENDOR_ID_ALPS_JP,
|
||||
HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) },
|
||||
{ .driver_data = MT_CLS_WIN_8_DUAL,
|
||||
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
|
||||
USB_VENDOR_ID_ALPS_JP,
|
||||
HID_DEVICE_ID_ALPS_1222) },
|
||||
|
||||
/* Lenovo X1 TAB Gen 2 */
|
||||
{ .driver_data = MT_CLS_WIN_8_DUAL,
|
||||
|
@ -42,6 +42,7 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD), HID_QUIRK_BADPAD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK), HID_QUIRK_NOGET },
|
||||
|
@ -369,6 +369,8 @@ static const struct hid_device_id uclogic_devices[] = {
|
||||
USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HUION,
|
||||
USB_DEVICE_ID_HUION_TABLET) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HUION,
|
||||
USB_DEVICE_ID_HUION_HS64) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
||||
USB_DEVICE_ID_HUION_TABLET) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
||||
|
@ -977,6 +977,8 @@ int uclogic_params_init(struct uclogic_params *params,
|
||||
/* FALL THROUGH */
|
||||
case VID_PID(USB_VENDOR_ID_HUION,
|
||||
USB_DEVICE_ID_HUION_TABLET):
|
||||
case VID_PID(USB_VENDOR_ID_HUION,
|
||||
USB_DEVICE_ID_HUION_HS64):
|
||||
case VID_PID(USB_VENDOR_ID_UCLOGIC,
|
||||
USB_DEVICE_ID_HUION_TABLET):
|
||||
case VID_PID(USB_VENDOR_ID_UCLOGIC,
|
||||
|
@ -816,9 +816,9 @@ static int load_fw_from_host(struct ishtp_cl_data *client_data)
|
||||
goto end_err_fw_release;
|
||||
|
||||
release_firmware(fw);
|
||||
kfree(filename);
|
||||
dev_info(cl_data_to_dev(client_data), "ISH firmware %s loaded\n",
|
||||
filename);
|
||||
kfree(filename);
|
||||
return 0;
|
||||
|
||||
end_err_fw_release:
|
||||
|
@ -891,7 +891,7 @@ static int hid_ishtp_cl_reset(struct ishtp_cl_device *cl_device)
|
||||
*/
|
||||
static int hid_ishtp_cl_suspend(struct device *device)
|
||||
{
|
||||
struct ishtp_cl_device *cl_device = dev_get_drvdata(device);
|
||||
struct ishtp_cl_device *cl_device = ishtp_dev_to_cl_device(device);
|
||||
struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device);
|
||||
struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl);
|
||||
|
||||
@ -912,7 +912,7 @@ static int hid_ishtp_cl_suspend(struct device *device)
|
||||
*/
|
||||
static int hid_ishtp_cl_resume(struct device *device)
|
||||
{
|
||||
struct ishtp_cl_device *cl_device = dev_get_drvdata(device);
|
||||
struct ishtp_cl_device *cl_device = ishtp_dev_to_cl_device(device);
|
||||
struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device);
|
||||
struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl);
|
||||
|
||||
|
@ -471,7 +471,6 @@ static struct ishtp_cl_device *ishtp_bus_add_device(struct ishtp_device *dev,
|
||||
}
|
||||
|
||||
ishtp_device_ready = true;
|
||||
dev_set_drvdata(&device->dev, device);
|
||||
|
||||
return device;
|
||||
}
|
||||
@ -639,6 +638,20 @@ void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device)
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_get_drvdata);
|
||||
|
||||
/**
|
||||
* ishtp_dev_to_cl_device() - get ishtp_cl_device instance from device instance
|
||||
* @device: device instance
|
||||
*
|
||||
* Get ish_cl_device instance which embeds device instance in it.
|
||||
*
|
||||
* Return: pointer to ishtp_cl_device instance
|
||||
*/
|
||||
struct ishtp_cl_device *ishtp_dev_to_cl_device(struct device *device)
|
||||
{
|
||||
return to_ishtp_cl_device(device);
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_dev_to_cl_device);
|
||||
|
||||
/**
|
||||
* ishtp_bus_new_client() - Create a new client
|
||||
* @dev: ISHTP device instance
|
||||
|
@ -2504,7 +2504,6 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock(&iommu->lock);
|
||||
spin_lock_irqsave(&device_domain_lock, flags);
|
||||
if (dev)
|
||||
found = find_domain(dev);
|
||||
@ -2520,16 +2519,17 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
||||
|
||||
if (found) {
|
||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||
spin_unlock(&iommu->lock);
|
||||
free_devinfo_mem(info);
|
||||
/* Caller must free the original domain */
|
||||
return found;
|
||||
}
|
||||
|
||||
spin_lock(&iommu->lock);
|
||||
ret = domain_attach_iommu(domain, iommu);
|
||||
spin_unlock(&iommu->lock);
|
||||
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||
spin_unlock(&iommu->lock);
|
||||
free_devinfo_mem(info);
|
||||
return NULL;
|
||||
}
|
||||
@ -2539,7 +2539,6 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
||||
if (dev)
|
||||
dev->archdata.iommu = info;
|
||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||
spin_unlock(&iommu->lock);
|
||||
|
||||
/* PASID table is mandatory for a PCI device in scalable mode. */
|
||||
if (dev && dev_is_pci(dev) && sm_supported(iommu)) {
|
||||
|
@ -140,8 +140,8 @@ static char __init *dm_parse_table_entry(struct dm_device *dev, char *str)
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
/* target_args */
|
||||
dev->target_args_array[n] = kstrndup(field[3], GFP_KERNEL,
|
||||
DM_MAX_STR_SIZE);
|
||||
dev->target_args_array[n] = kstrndup(field[3], DM_MAX_STR_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!dev->target_args_array[n])
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@ -272,10 +272,10 @@ static int __init dm_init_init(void)
|
||||
return 0;
|
||||
|
||||
if (strlen(create) >= DM_MAX_STR_SIZE) {
|
||||
DMERR("Argument is too big. Limit is %d\n", DM_MAX_STR_SIZE);
|
||||
DMERR("Argument is too big. Limit is %d", DM_MAX_STR_SIZE);
|
||||
return -EINVAL;
|
||||
}
|
||||
str = kstrndup(create, GFP_KERNEL, DM_MAX_STR_SIZE);
|
||||
str = kstrndup(create, DM_MAX_STR_SIZE, GFP_KERNEL);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -283,7 +283,7 @@ static int __init dm_init_init(void)
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
DMINFO("waiting for all devices to be available before creating mapped devices\n");
|
||||
DMINFO("waiting for all devices to be available before creating mapped devices");
|
||||
wait_for_device_probe();
|
||||
|
||||
list_for_each_entry(dev, &devices, list) {
|
||||
|
@ -60,6 +60,7 @@
|
||||
|
||||
#define WRITE_LOG_VERSION 1ULL
|
||||
#define WRITE_LOG_MAGIC 0x6a736677736872ULL
|
||||
#define WRITE_LOG_SUPER_SECTOR 0
|
||||
|
||||
/*
|
||||
* The disk format for this is braindead simple.
|
||||
@ -115,6 +116,7 @@ struct log_writes_c {
|
||||
struct list_head logging_blocks;
|
||||
wait_queue_head_t wait;
|
||||
struct task_struct *log_kthread;
|
||||
struct completion super_done;
|
||||
};
|
||||
|
||||
struct pending_block {
|
||||
@ -180,6 +182,14 @@ static void log_end_io(struct bio *bio)
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
static void log_end_super(struct bio *bio)
|
||||
{
|
||||
struct log_writes_c *lc = bio->bi_private;
|
||||
|
||||
complete(&lc->super_done);
|
||||
log_end_io(bio);
|
||||
}
|
||||
|
||||
/*
|
||||
* Meant to be called if there is an error, it will free all the pages
|
||||
* associated with the block.
|
||||
@ -215,7 +225,8 @@ static int write_metadata(struct log_writes_c *lc, void *entry,
|
||||
bio->bi_iter.bi_size = 0;
|
||||
bio->bi_iter.bi_sector = sector;
|
||||
bio_set_dev(bio, lc->logdev->bdev);
|
||||
bio->bi_end_io = log_end_io;
|
||||
bio->bi_end_io = (sector == WRITE_LOG_SUPER_SECTOR) ?
|
||||
log_end_super : log_end_io;
|
||||
bio->bi_private = lc;
|
||||
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
|
||||
|
||||
@ -418,11 +429,18 @@ static int log_super(struct log_writes_c *lc)
|
||||
super.nr_entries = cpu_to_le64(lc->logged_entries);
|
||||
super.sectorsize = cpu_to_le32(lc->sectorsize);
|
||||
|
||||
if (write_metadata(lc, &super, sizeof(super), NULL, 0, 0)) {
|
||||
if (write_metadata(lc, &super, sizeof(super), NULL, 0,
|
||||
WRITE_LOG_SUPER_SECTOR)) {
|
||||
DMERR("Couldn't write super");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Super sector should be writen in-order, otherwise the
|
||||
* nr_entries could be rewritten incorrectly by an old bio.
|
||||
*/
|
||||
wait_for_completion_io(&lc->super_done);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -531,6 +549,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||
INIT_LIST_HEAD(&lc->unflushed_blocks);
|
||||
INIT_LIST_HEAD(&lc->logging_blocks);
|
||||
init_waitqueue_head(&lc->wait);
|
||||
init_completion(&lc->super_done);
|
||||
atomic_set(&lc->io_blocks, 0);
|
||||
atomic_set(&lc->pending_blocks, 0);
|
||||
|
||||
|
@ -561,7 +561,7 @@ static char **realloc_argv(unsigned *size, char **old_argv)
|
||||
gfp = GFP_NOIO;
|
||||
}
|
||||
argv = kmalloc_array(new_size, sizeof(*argv), gfp);
|
||||
if (argv) {
|
||||
if (argv && old_argv) {
|
||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||
*size = new_size;
|
||||
}
|
||||
|
@ -235,8 +235,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type,
|
||||
BUG();
|
||||
}
|
||||
|
||||
DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str,
|
||||
block);
|
||||
DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name,
|
||||
type_str, block);
|
||||
|
||||
if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS)
|
||||
DMERR("%s: reached maximum errors", v->data_dev->name);
|
||||
|
@ -204,12 +204,11 @@ static struct irq_chip stmfx_irq_chip = {
|
||||
static irqreturn_t stmfx_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct stmfx *stmfx = data;
|
||||
unsigned long n, pending;
|
||||
u32 ack;
|
||||
int ret;
|
||||
unsigned long bits;
|
||||
u32 pending, ack;
|
||||
int n, ret;
|
||||
|
||||
ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING,
|
||||
(u32 *)&pending);
|
||||
ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING, &pending);
|
||||
if (ret)
|
||||
return IRQ_NONE;
|
||||
|
||||
@ -224,7 +223,8 @@ static irqreturn_t stmfx_irq_handler(int irq, void *data)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
for_each_set_bit(n, &pending, STMFX_REG_IRQ_SRC_MAX)
|
||||
bits = pending;
|
||||
for_each_set_bit(n, &bits, STMFX_REG_IRQ_SRC_MAX)
|
||||
handle_nested_irq(irq_find_mapping(stmfx->irq_domain, n));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
@ -4662,7 +4662,6 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
|
||||
memorg = nanddev_get_memorg(&chip->base);
|
||||
memorg->planes_per_lun = 1;
|
||||
memorg->luns_per_target = 1;
|
||||
memorg->ntargets = 1;
|
||||
|
||||
/*
|
||||
* Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
|
||||
@ -5027,6 +5026,8 @@ static int nand_scan_ident(struct nand_chip *chip, unsigned int maxchips,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memorg->ntargets = maxchips;
|
||||
|
||||
/* Read the flash type */
|
||||
ret = nand_detect(chip, table);
|
||||
if (ret) {
|
||||
|
@ -1636,6 +1636,95 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* spi_nor_clear_sr_bp() - clear the Status Register Block Protection bits.
|
||||
* @nor: pointer to a 'struct spi_nor'
|
||||
*
|
||||
* Read-modify-write function that clears the Block Protection bits from the
|
||||
* Status Register without affecting other bits.
|
||||
*
|
||||
* Return: 0 on success, -errno otherwise.
|
||||
*/
|
||||
static int spi_nor_clear_sr_bp(struct spi_nor *nor)
|
||||
{
|
||||
int ret;
|
||||
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||
|
||||
ret = read_sr(nor);
|
||||
if (ret < 0) {
|
||||
dev_err(nor->dev, "error while reading status register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
write_enable(nor);
|
||||
|
||||
ret = write_sr(nor, ret & ~mask);
|
||||
if (ret) {
|
||||
dev_err(nor->dev, "write to status register failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spi_nor_wait_till_ready(nor);
|
||||
if (ret)
|
||||
dev_err(nor->dev, "timeout while writing status register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* spi_nor_spansion_clear_sr_bp() - clear the Status Register Block Protection
|
||||
* bits on spansion flashes.
|
||||
* @nor: pointer to a 'struct spi_nor'
|
||||
*
|
||||
* Read-modify-write function that clears the Block Protection bits from the
|
||||
* Status Register without affecting other bits. The function is tightly
|
||||
* coupled with the spansion_quad_enable() function. Both assume that the Write
|
||||
* Register with 16 bits, together with the Read Configuration Register (35h)
|
||||
* instructions are supported.
|
||||
*
|
||||
* Return: 0 on success, -errno otherwise.
|
||||
*/
|
||||
static int spi_nor_spansion_clear_sr_bp(struct spi_nor *nor)
|
||||
{
|
||||
int ret;
|
||||
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||
u8 sr_cr[2] = {0};
|
||||
|
||||
/* Check current Quad Enable bit value. */
|
||||
ret = read_cr(nor);
|
||||
if (ret < 0) {
|
||||
dev_err(nor->dev,
|
||||
"error while reading configuration register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* When the configuration register Quad Enable bit is one, only the
|
||||
* Write Status (01h) command with two data bytes may be used.
|
||||
*/
|
||||
if (ret & CR_QUAD_EN_SPAN) {
|
||||
sr_cr[1] = ret;
|
||||
|
||||
ret = read_sr(nor);
|
||||
if (ret < 0) {
|
||||
dev_err(nor->dev,
|
||||
"error while reading status register\n");
|
||||
return ret;
|
||||
}
|
||||
sr_cr[0] = ret & ~mask;
|
||||
|
||||
ret = write_sr_cr(nor, sr_cr);
|
||||
if (ret)
|
||||
dev_err(nor->dev, "16-bit write register failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the Quad Enable bit is zero, use the Write Status (01h) command
|
||||
* with one data byte.
|
||||
*/
|
||||
return spi_nor_clear_sr_bp(nor);
|
||||
}
|
||||
|
||||
/* Used when the "_ext_id" is two bytes at most */
|
||||
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
|
||||
.id = { \
|
||||
@ -3660,6 +3749,8 @@ static int spi_nor_init_params(struct spi_nor *nor,
|
||||
default:
|
||||
/* Kept only for backward compatibility purpose. */
|
||||
params->quad_enable = spansion_quad_enable;
|
||||
if (nor->clear_sr_bp)
|
||||
nor->clear_sr_bp = spi_nor_spansion_clear_sr_bp;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3912,17 +4003,13 @@ static int spi_nor_init(struct spi_nor *nor)
|
||||
{
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up
|
||||
* with the software protection bits set
|
||||
*/
|
||||
if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
|
||||
JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
|
||||
JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
|
||||
nor->info->flags & SPI_NOR_HAS_LOCK) {
|
||||
write_enable(nor);
|
||||
write_sr(nor, 0);
|
||||
spi_nor_wait_till_ready(nor);
|
||||
if (nor->clear_sr_bp) {
|
||||
err = nor->clear_sr_bp(nor);
|
||||
if (err) {
|
||||
dev_err(nor->dev,
|
||||
"fail to clear block protection bits\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (nor->quad_enable) {
|
||||
@ -4047,6 +4134,16 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
|
||||
if (info->flags & SPI_S3AN)
|
||||
nor->flags |= SNOR_F_READY_XSR_RDY;
|
||||
|
||||
/*
|
||||
* Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up
|
||||
* with the software protection bits set.
|
||||
*/
|
||||
if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
|
||||
JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
|
||||
JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
|
||||
nor->info->flags & SPI_NOR_HAS_LOCK)
|
||||
nor->clear_sr_bp = spi_nor_clear_sr_bp;
|
||||
|
||||
/* Parse the Serial Flash Discoverable Parameters table. */
|
||||
ret = spi_nor_init_params(nor, ¶ms);
|
||||
if (ret)
|
||||
|
@ -4304,12 +4304,12 @@ void bond_setup(struct net_device *bond_dev)
|
||||
bond_dev->features |= NETIF_F_NETNS_LOCAL;
|
||||
|
||||
bond_dev->hw_features = BOND_VLAN_FEATURES |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
|
||||
bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
||||
bond_dev->features |= bond_dev->hw_features;
|
||||
bond_dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
||||
}
|
||||
|
||||
/* Destroy a bonding device.
|
||||
|
@ -433,9 +433,9 @@ int ksz_switch_register(struct ksz_device *dev,
|
||||
return PTR_ERR(dev->reset_gpio);
|
||||
|
||||
if (dev->reset_gpio) {
|
||||
gpiod_set_value(dev->reset_gpio, 1);
|
||||
gpiod_set_value_cansleep(dev->reset_gpio, 1);
|
||||
mdelay(10);
|
||||
gpiod_set_value(dev->reset_gpio, 0);
|
||||
gpiod_set_value_cansleep(dev->reset_gpio, 0);
|
||||
}
|
||||
|
||||
mutex_init(&dev->dev_mutex);
|
||||
@ -485,7 +485,7 @@ void ksz_switch_remove(struct ksz_device *dev)
|
||||
dsa_unregister_switch(dev->ds);
|
||||
|
||||
if (dev->reset_gpio)
|
||||
gpiod_set_value(dev->reset_gpio, 1);
|
||||
gpiod_set_value_cansleep(dev->reset_gpio, 1);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(ksz_switch_remove);
|
||||
|
@ -843,9 +843,14 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic)
|
||||
return err;
|
||||
|
||||
if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
|
||||
if (hweight < AQ_VLAN_MAX_FILTERS)
|
||||
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, true);
|
||||
if (hweight < AQ_VLAN_MAX_FILTERS && hweight > 0) {
|
||||
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw,
|
||||
!(aq_nic->packet_filter & IFF_PROMISC));
|
||||
aq_nic->aq_nic_cfg.is_vlan_force_promisc = false;
|
||||
} else {
|
||||
/* otherwise left in promiscue mode */
|
||||
aq_nic->aq_nic_cfg.is_vlan_force_promisc = true;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
@ -866,6 +871,7 @@ int aq_filters_vlan_offload_off(struct aq_nic_s *aq_nic)
|
||||
if (unlikely(!aq_hw_ops->hw_filter_vlan_ctrl))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
aq_nic->aq_nic_cfg.is_vlan_force_promisc = true;
|
||||
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -128,6 +128,7 @@ void aq_nic_cfg_start(struct aq_nic_s *self)
|
||||
cfg->features = cfg->aq_hw_caps->hw_features;
|
||||
cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX);
|
||||
cfg->is_vlan_tx_insert = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_TX);
|
||||
cfg->is_vlan_force_promisc = true;
|
||||
}
|
||||
|
||||
static int aq_nic_update_link_status(struct aq_nic_s *self)
|
||||
|
@ -37,6 +37,7 @@ struct aq_nic_cfg_s {
|
||||
u32 wol;
|
||||
u8 is_vlan_rx_strip;
|
||||
u8 is_vlan_tx_insert;
|
||||
bool is_vlan_force_promisc;
|
||||
u16 is_mc_list_enabled;
|
||||
u16 mc_list_count;
|
||||
bool is_autoneg;
|
||||
|
@ -808,8 +808,15 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,
|
||||
unsigned int packet_filter)
|
||||
{
|
||||
unsigned int i = 0U;
|
||||
struct aq_nic_cfg_s *cfg = self->aq_nic_cfg;
|
||||
|
||||
hw_atl_rpfl2promiscuous_mode_en_set(self,
|
||||
IS_FILTER_ENABLED(IFF_PROMISC));
|
||||
|
||||
hw_atl_rpf_vlan_prom_mode_en_set(self,
|
||||
IS_FILTER_ENABLED(IFF_PROMISC) ||
|
||||
cfg->is_vlan_force_promisc);
|
||||
|
||||
hw_atl_rpfl2promiscuous_mode_en_set(self, IS_FILTER_ENABLED(IFF_PROMISC));
|
||||
hw_atl_rpfl2multicast_flr_en_set(self,
|
||||
IS_FILTER_ENABLED(IFF_ALLMULTI), 0);
|
||||
|
||||
@ -818,12 +825,12 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,
|
||||
|
||||
hw_atl_rpfl2broadcast_en_set(self, IS_FILTER_ENABLED(IFF_BROADCAST));
|
||||
|
||||
self->aq_nic_cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST);
|
||||
cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST);
|
||||
|
||||
for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i)
|
||||
hw_atl_rpfl2_uc_flr_en_set(self,
|
||||
(self->aq_nic_cfg->is_mc_list_enabled &&
|
||||
(i <= self->aq_nic_cfg->mc_list_count)) ?
|
||||
(cfg->is_mc_list_enabled &&
|
||||
(i <= cfg->mc_list_count)) ?
|
||||
1U : 0U, i);
|
||||
|
||||
return aq_hw_err_from_flags(self);
|
||||
@ -1116,7 +1123,7 @@ static int hw_atl_b0_hw_vlan_set(struct aq_hw_s *self,
|
||||
static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable)
|
||||
{
|
||||
/* set promisc in case of disabing the vland filter */
|
||||
hw_atl_rpf_vlan_prom_mode_en_set(self, !!!enable);
|
||||
hw_atl_rpf_vlan_prom_mode_en_set(self, !enable);
|
||||
|
||||
return aq_hw_err_from_flags(self);
|
||||
}
|
||||
|
@ -4303,7 +4303,7 @@ static int macb_probe(struct platform_device *pdev)
|
||||
if (PTR_ERR(mac) == -EPROBE_DEFER) {
|
||||
err = -EPROBE_DEFER;
|
||||
goto err_out_free_netdev;
|
||||
} else if (!IS_ERR(mac)) {
|
||||
} else if (!IS_ERR_OR_NULL(mac)) {
|
||||
ether_addr_copy(bp->dev->dev_addr, mac);
|
||||
} else {
|
||||
macb_get_hwaddr(bp);
|
||||
|
@ -891,7 +891,7 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,
|
||||
u64 *data)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
int status;
|
||||
int status, cnt;
|
||||
u8 link_status = 0;
|
||||
|
||||
if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) {
|
||||
@ -902,6 +902,9 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,
|
||||
|
||||
memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM);
|
||||
|
||||
/* check link status before offline tests */
|
||||
link_status = netif_carrier_ok(netdev);
|
||||
|
||||
if (test->flags & ETH_TEST_FL_OFFLINE) {
|
||||
if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0)
|
||||
test->flags |= ETH_TEST_FL_FAILED;
|
||||
@ -922,13 +925,26 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,
|
||||
test->flags |= ETH_TEST_FL_FAILED;
|
||||
}
|
||||
|
||||
status = be_cmd_link_status_query(adapter, NULL, &link_status, 0);
|
||||
/* link status was down prior to test */
|
||||
if (!link_status) {
|
||||
test->flags |= ETH_TEST_FL_FAILED;
|
||||
data[4] = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
for (cnt = 10; cnt; cnt--) {
|
||||
status = be_cmd_link_status_query(adapter, NULL, &link_status,
|
||||
0);
|
||||
if (status) {
|
||||
test->flags |= ETH_TEST_FL_FAILED;
|
||||
data[4] = -1;
|
||||
} else if (!link_status) {
|
||||
test->flags |= ETH_TEST_FL_FAILED;
|
||||
data[4] = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (link_status)
|
||||
break;
|
||||
|
||||
msleep_interruptible(500);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1057,7 +1057,7 @@ sis900_open(struct net_device *net_dev)
|
||||
sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
|
||||
|
||||
/* Enable all known interrupts by setting the interrupt mask. */
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);
|
||||
sw32(cr, RxENA | sr32(cr));
|
||||
sw32(ier, IE);
|
||||
|
||||
@ -1578,7 +1578,7 @@ static void sis900_tx_timeout(struct net_device *net_dev)
|
||||
sw32(txdp, sis_priv->tx_ring_dma);
|
||||
|
||||
/* Enable all known interrupts by setting the interrupt mask. */
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1618,7 +1618,7 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
|
||||
spin_unlock_irqrestore(&sis_priv->lock, flags);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len);
|
||||
sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len);
|
||||
sw32(cr, TxENA | sr32(cr));
|
||||
|
||||
sis_priv->cur_tx ++;
|
||||
@ -1674,7 +1674,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
|
||||
do {
|
||||
status = sr32(isr);
|
||||
|
||||
if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0)
|
||||
if ((status & (HIBERR|TxURN|TxERR|TxIDLE|TxDESC|RxORN|RxERR|RxOK)) == 0)
|
||||
/* nothing intresting happened */
|
||||
break;
|
||||
handled = 1;
|
||||
@ -1684,7 +1684,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
|
||||
/* Rx interrupt */
|
||||
sis900_rx(net_dev);
|
||||
|
||||
if (status & (TxURN | TxERR | TxIDLE))
|
||||
if (status & (TxURN | TxERR | TxIDLE | TxDESC))
|
||||
/* Tx interrupt */
|
||||
sis900_finish_xmit(net_dev);
|
||||
|
||||
@ -1896,8 +1896,8 @@ static void sis900_finish_xmit (struct net_device *net_dev)
|
||||
|
||||
if (tx_status & OWN) {
|
||||
/* The packet is not transmitted yet (owned by hardware) !
|
||||
* Note: the interrupt is generated only when Tx Machine
|
||||
* is idle, so this is an almost impossible case */
|
||||
* Note: this is an almost impossible condition
|
||||
* in case of TxDESC ('descriptor interrupt') */
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2473,7 +2473,7 @@ static int sis900_resume(struct pci_dev *pci_dev)
|
||||
sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
|
||||
|
||||
/* Enable all known interrupts by setting the interrupt mask. */
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
|
||||
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);
|
||||
sw32(cr, RxENA | sr32(cr));
|
||||
sw32(ier, IE);
|
||||
|
||||
|
@ -112,7 +112,7 @@ static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,
|
||||
* programmed with (2^32 – <new_sec_value>)
|
||||
*/
|
||||
if (gmac4)
|
||||
sec = (100000000ULL - sec);
|
||||
sec = -sec;
|
||||
|
||||
value = readl(ioaddr + PTP_TCR);
|
||||
if (value & PTP_TCR_TSCTRLSSR)
|
||||
|
@ -2892,12 +2892,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
/* Manage tx mitigation */
|
||||
tx_q->tx_count_frames += nfrags + 1;
|
||||
if (priv->tx_coal_frames <= tx_q->tx_count_frames) {
|
||||
if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
|
||||
!(priv->synopsys_id >= DWMAC_CORE_4_00 &&
|
||||
(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
|
||||
priv->hwts_tx_en)) {
|
||||
stmmac_tx_timer_arm(priv, queue);
|
||||
} else {
|
||||
tx_q->tx_count_frames = 0;
|
||||
stmmac_set_tx_ic(priv, desc);
|
||||
priv->xstats.tx_set_ic_bit++;
|
||||
tx_q->tx_count_frames = 0;
|
||||
} else {
|
||||
stmmac_tx_timer_arm(priv, queue);
|
||||
}
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
@ -3111,12 +3114,15 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
* element in case of no SG.
|
||||
*/
|
||||
tx_q->tx_count_frames += nfrags + 1;
|
||||
if (priv->tx_coal_frames <= tx_q->tx_count_frames) {
|
||||
if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
|
||||
!(priv->synopsys_id >= DWMAC_CORE_4_00 &&
|
||||
(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
|
||||
priv->hwts_tx_en)) {
|
||||
stmmac_tx_timer_arm(priv, queue);
|
||||
} else {
|
||||
tx_q->tx_count_frames = 0;
|
||||
stmmac_set_tx_ic(priv, desc);
|
||||
priv->xstats.tx_set_ic_bit++;
|
||||
tx_q->tx_count_frames = 0;
|
||||
} else {
|
||||
stmmac_tx_timer_arm(priv, queue);
|
||||
}
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
|
@ -63,6 +63,7 @@ MODULE_AUTHOR("Frank Cusack <fcusack@fcusack.com>");
|
||||
MODULE_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE));
|
||||
MODULE_SOFTDEP("pre: arc4");
|
||||
MODULE_VERSION("1.0.2");
|
||||
|
||||
static unsigned int
|
||||
|
@ -2153,12 +2153,12 @@ static void team_setup(struct net_device *dev)
|
||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||
|
||||
dev->hw_features = TEAM_VLAN_FEATURES |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
|
||||
dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
||||
dev->features |= dev->hw_features;
|
||||
dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
||||
}
|
||||
|
||||
static int team_newlink(struct net *src_net, struct net_device *dev,
|
||||
|
@ -1482,7 +1482,7 @@ static int qmi_wwan_probe(struct usb_interface *intf,
|
||||
* different. Ignore the current interface if the number of endpoints
|
||||
* equals the number for the diag interface (two).
|
||||
*/
|
||||
info = (void *)&id->driver_info;
|
||||
info = (void *)id->driver_info;
|
||||
|
||||
if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) {
|
||||
if (desc->bNumEndpoints == 2)
|
||||
|
@ -350,8 +350,8 @@ static int vrf_finish_output6(struct net *net, struct sock *sk,
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net_device *dev = dst->dev;
|
||||
const struct in6_addr *nexthop;
|
||||
struct neighbour *neigh;
|
||||
struct in6_addr *nexthop;
|
||||
int ret;
|
||||
|
||||
nf_reset(skb);
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <linux/percpu-refcount.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/seq_buf.h>
|
||||
#include <linux/iommu.h>
|
||||
|
||||
struct pci_p2pdma {
|
||||
struct gen_pool *pool;
|
||||
@ -299,6 +300,9 @@ static bool root_complex_whitelist(struct pci_dev *dev)
|
||||
struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0));
|
||||
unsigned short vendor, device;
|
||||
|
||||
if (iommu_present(dev->dev.bus))
|
||||
return false;
|
||||
|
||||
if (!root)
|
||||
return false;
|
||||
|
||||
|
@ -987,6 +987,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi,
|
||||
if (!iscsi_is_session_online(cls_sess))
|
||||
continue;
|
||||
|
||||
if (!sess->targetname)
|
||||
continue;
|
||||
|
||||
if (pri_ctrl_flags) {
|
||||
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
|
||||
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
|
||||
|
@ -4,8 +4,8 @@
|
||||
* Copyright (c) 2016 Cavium Inc.
|
||||
*/
|
||||
|
||||
#define QEDI_MODULE_VERSION "8.33.0.21"
|
||||
#define QEDI_MODULE_VERSION "8.37.0.20"
|
||||
#define QEDI_DRIVER_MAJOR_VER 8
|
||||
#define QEDI_DRIVER_MINOR_VER 33
|
||||
#define QEDI_DRIVER_MINOR_VER 37
|
||||
#define QEDI_DRIVER_REV_VER 0
|
||||
#define QEDI_DRIVER_ENG_VER 21
|
||||
#define QEDI_DRIVER_ENG_VER 20
|
||||
|
@ -1731,8 +1731,8 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
|
||||
!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
|
||||
!qla2x00_isp_reg_stat(ha))) {
|
||||
sp->comp = ∁
|
||||
rval = ha->isp_ops->abort_command(sp);
|
||||
spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
|
||||
rval = ha->isp_ops->abort_command(sp);
|
||||
|
||||
switch (rval) {
|
||||
case QLA_SUCCESS:
|
||||
|
@ -430,24 +430,21 @@ int ufshcd_pltfrm_init(struct platform_device *pdev,
|
||||
goto dealloc_host;
|
||||
}
|
||||
|
||||
pm_runtime_set_active(&pdev->dev);
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
ufshcd_init_lanes_per_dir(hba);
|
||||
|
||||
err = ufshcd_init(hba, mmio_base, irq);
|
||||
if (err) {
|
||||
dev_err(dev, "Initialization failed\n");
|
||||
goto out_disable_rpm;
|
||||
goto dealloc_host;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, hba);
|
||||
|
||||
pm_runtime_set_active(&pdev->dev);
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
out_disable_rpm:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
dealloc_host:
|
||||
ufshcd_dealloc_host(hba);
|
||||
out:
|
||||
|
@ -275,9 +275,9 @@ static void afs_break_one_callback(struct afs_server *server,
|
||||
struct afs_super_info *as = AFS_FS_S(cbi->sb);
|
||||
struct afs_volume *volume = as->volume;
|
||||
|
||||
write_lock(&volume->cb_break_lock);
|
||||
write_lock(&volume->cb_v_break_lock);
|
||||
volume->cb_v_break++;
|
||||
write_unlock(&volume->cb_break_lock);
|
||||
write_unlock(&volume->cb_v_break_lock);
|
||||
} else {
|
||||
data.volume = NULL;
|
||||
data.fid = *fid;
|
||||
|
@ -55,6 +55,16 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the file size and block count. Estimate the number of 512 bytes blocks
|
||||
* used, rounded up to nearest 1K for consistency with other AFS clients.
|
||||
*/
|
||||
static void afs_set_i_size(struct afs_vnode *vnode, u64 size)
|
||||
{
|
||||
i_size_write(&vnode->vfs_inode, size);
|
||||
vnode->vfs_inode.i_blocks = ((size + 1023) >> 10) << 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialise an inode from the vnode status.
|
||||
*/
|
||||
@ -124,12 +134,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key,
|
||||
return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type);
|
||||
}
|
||||
|
||||
/*
|
||||
* Estimate 512 bytes blocks used, rounded up to nearest 1K
|
||||
* for consistency with other AFS clients.
|
||||
*/
|
||||
inode->i_blocks = ((i_size_read(inode) + 1023) >> 10) << 1;
|
||||
i_size_write(&vnode->vfs_inode, status->size);
|
||||
afs_set_i_size(vnode, status->size);
|
||||
|
||||
vnode->invalid_before = status->data_version;
|
||||
inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
|
||||
@ -207,11 +212,13 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
|
||||
|
||||
if (expected_version &&
|
||||
*expected_version != status->data_version) {
|
||||
kdebug("vnode modified %llx on {%llx:%llu} [exp %llx] %s",
|
||||
(unsigned long long) status->data_version,
|
||||
if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags))
|
||||
pr_warn("kAFS: vnode modified {%llx:%llu} %llx->%llx %s\n",
|
||||
vnode->fid.vid, vnode->fid.vnode,
|
||||
(unsigned long long)*expected_version,
|
||||
(unsigned long long)status->data_version,
|
||||
fc->type ? fc->type->name : "???");
|
||||
|
||||
vnode->invalid_before = status->data_version;
|
||||
if (vnode->status.type == AFS_FTYPE_DIR) {
|
||||
if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
|
||||
@ -230,7 +237,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
|
||||
|
||||
if (data_changed) {
|
||||
inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
|
||||
i_size_write(&vnode->vfs_inode, status->size);
|
||||
afs_set_i_size(vnode, status->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,10 +109,8 @@ struct afs_call {
|
||||
struct rxrpc_call *rxcall; /* RxRPC call handle */
|
||||
struct key *key; /* security for this call */
|
||||
struct afs_net *net; /* The network namespace */
|
||||
union {
|
||||
struct afs_server *server;
|
||||
struct afs_vlserver *vlserver;
|
||||
};
|
||||
struct afs_server *server; /* The fileserver record if fs op (pins ref) */
|
||||
struct afs_vlserver *vlserver; /* The vlserver record if vl op */
|
||||
struct afs_cb_interest *cbi; /* Callback interest for server used */
|
||||
struct afs_vnode *lvnode; /* vnode being locked */
|
||||
void *request; /* request data (first part) */
|
||||
@ -616,7 +614,7 @@ struct afs_volume {
|
||||
unsigned int servers_seq; /* Incremented each time ->servers changes */
|
||||
|
||||
unsigned cb_v_break; /* Break-everything counter. */
|
||||
rwlock_t cb_break_lock;
|
||||
rwlock_t cb_v_break_lock;
|
||||
|
||||
afs_voltype_t type; /* type of volume */
|
||||
short error;
|
||||
|
@ -43,6 +43,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,
|
||||
atomic_set(&volume->usage, 1);
|
||||
INIT_LIST_HEAD(&volume->proc_link);
|
||||
rwlock_init(&volume->servers_lock);
|
||||
rwlock_init(&volume->cb_v_break_lock);
|
||||
memcpy(volume->name, vldb->name, vldb->name_len + 1);
|
||||
|
||||
slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask);
|
||||
|
@ -3077,8 +3077,7 @@ static const struct file_operations proc_tgid_base_operations = {
|
||||
|
||||
struct pid *tgid_pidfd_to_pid(const struct file *file)
|
||||
{
|
||||
if (!d_is_dir(file->f_path.dentry) ||
|
||||
(file->f_op != &proc_tgid_base_operations))
|
||||
if (file->f_op != &proc_tgid_base_operations)
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
return proc_pid(file_inode(file));
|
||||
|
@ -130,7 +130,7 @@
|
||||
#define CLKID_MALI_1_SEL 172
|
||||
#define CLKID_MALI_1 174
|
||||
#define CLKID_MALI 175
|
||||
#define CLKID_MPLL_5OM 177
|
||||
#define CLKID_MPLL_50M 177
|
||||
#define CLKID_CPU_CLK 187
|
||||
#define CLKID_PCIE_PLL 201
|
||||
#define CLKID_VDEC_1 204
|
||||
|
@ -103,6 +103,7 @@ void ishtp_put_device(struct ishtp_cl_device *cl_dev);
|
||||
void ishtp_get_device(struct ishtp_cl_device *cl_dev);
|
||||
void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data);
|
||||
void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device);
|
||||
struct ishtp_cl_device *ishtp_dev_to_cl_device(struct device *dev);
|
||||
int ishtp_register_event_cb(struct ishtp_cl_device *device,
|
||||
void (*read_cb)(struct ishtp_cl_device *));
|
||||
struct ishtp_fw_client *ishtp_fw_cl_get_client(struct ishtp_device *dev,
|
||||
|
@ -373,6 +373,8 @@ struct flash_info;
|
||||
* @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
|
||||
* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
|
||||
* @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode
|
||||
* @clear_sr_bp: [FLASH-SPECIFIC] clears the Block Protection Bits from
|
||||
* the SPI NOR Status Register.
|
||||
* completely locked
|
||||
* @priv: the private data
|
||||
*/
|
||||
@ -410,6 +412,7 @@ struct spi_nor {
|
||||
int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||
int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||
int (*quad_enable)(struct spi_nor *nor);
|
||||
int (*clear_sr_bp)(struct spi_nor *nor);
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
@ -281,8 +281,8 @@ static inline bool ip6_sk_ignore_df(const struct sock *sk)
|
||||
inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT;
|
||||
}
|
||||
|
||||
static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
|
||||
struct in6_addr *daddr)
|
||||
static inline const struct in6_addr *rt6_nexthop(const struct rt6_info *rt,
|
||||
const struct in6_addr *daddr)
|
||||
{
|
||||
if (rt->rt6i_flags & RTF_GATEWAY)
|
||||
return &rt->rt6i_gateway;
|
||||
|
@ -221,6 +221,7 @@ void ip_rt_get_source(u8 *src, struct sk_buff *skb, struct rtable *rt);
|
||||
struct rtable *rt_dst_alloc(struct net_device *dev,
|
||||
unsigned int flags, u16 type,
|
||||
bool nopolicy, bool noxfrm, bool will_cache);
|
||||
struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt);
|
||||
|
||||
struct in_ifaddr;
|
||||
void fib_add_ifaddr(struct in_ifaddr *);
|
||||
|
@ -407,21 +407,6 @@ static inline bool tls_is_partially_sent_record(struct tls_context *ctx)
|
||||
return !!ctx->partially_sent_record;
|
||||
}
|
||||
|
||||
static inline int tls_complete_pending_work(struct sock *sk,
|
||||
struct tls_context *ctx,
|
||||
int flags, long *timeo)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (unlikely(sk->sk_write_pending))
|
||||
rc = wait_on_pending_writer(sk, timeo);
|
||||
|
||||
if (!rc && tls_is_partially_sent_record(ctx))
|
||||
rc = tls_push_partial_record(sk, ctx, flags);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline bool tls_is_pending_open_record(struct tls_context *tls_ctx)
|
||||
{
|
||||
return tls_ctx->pending_open_record_frags;
|
||||
|
@ -1712,31 +1712,6 @@ const struct file_operations pidfd_fops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* pidfd_create() - Create a new pid file descriptor.
|
||||
*
|
||||
* @pid: struct pid that the pidfd will reference
|
||||
*
|
||||
* This creates a new pid file descriptor with the O_CLOEXEC flag set.
|
||||
*
|
||||
* Note, that this function can only be called after the fd table has
|
||||
* been unshared to avoid leaking the pidfd to the new process.
|
||||
*
|
||||
* Return: On success, a cloexec pidfd is returned.
|
||||
* On error, a negative errno number will be returned.
|
||||
*/
|
||||
static int pidfd_create(struct pid *pid)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid),
|
||||
O_RDWR | O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
put_pid(pid);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
static void __delayed_free_task(struct rcu_head *rhp)
|
||||
{
|
||||
struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
|
||||
@ -1774,6 +1749,7 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
int pidfd = -1, retval;
|
||||
struct task_struct *p;
|
||||
struct multiprocess_signals delayed;
|
||||
struct file *pidfile = NULL;
|
||||
|
||||
/*
|
||||
* Don't allow sharing the root directory with processes in a different
|
||||
@ -1822,8 +1798,6 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
}
|
||||
|
||||
if (clone_flags & CLONE_PIDFD) {
|
||||
int reserved;
|
||||
|
||||
/*
|
||||
* - CLONE_PARENT_SETTID is useless for pidfds and also
|
||||
* parent_tidptr is used to return pidfds.
|
||||
@ -1834,16 +1808,6 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
if (clone_flags &
|
||||
(CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
/*
|
||||
* Verify that parent_tidptr is sane so we can potentially
|
||||
* reuse it later.
|
||||
*/
|
||||
if (get_user(reserved, parent_tidptr))
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
if (reserved != 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2058,11 +2022,20 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
* if the fd table isn't shared).
|
||||
*/
|
||||
if (clone_flags & CLONE_PIDFD) {
|
||||
retval = pidfd_create(pid);
|
||||
retval = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
|
||||
if (retval < 0)
|
||||
goto bad_fork_free_pid;
|
||||
|
||||
pidfd = retval;
|
||||
|
||||
pidfile = anon_inode_getfile("[pidfd]", &pidfd_fops, pid,
|
||||
O_RDWR | O_CLOEXEC);
|
||||
if (IS_ERR(pidfile)) {
|
||||
put_unused_fd(pidfd);
|
||||
goto bad_fork_free_pid;
|
||||
}
|
||||
get_pid(pid); /* held by pidfile now */
|
||||
|
||||
retval = put_user(pidfd, parent_tidptr);
|
||||
if (retval)
|
||||
goto bad_fork_put_pidfd;
|
||||
@ -2180,6 +2153,9 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
goto bad_fork_cancel_cgroup;
|
||||
}
|
||||
|
||||
/* past the last point of failure */
|
||||
if (pidfile)
|
||||
fd_install(pidfd, pidfile);
|
||||
|
||||
init_task_pid_links(p);
|
||||
if (likely(p->pid)) {
|
||||
@ -2246,8 +2222,10 @@ bad_fork_cancel_cgroup:
|
||||
bad_fork_cgroup_threadgroup_change_end:
|
||||
cgroup_threadgroup_change_end(current);
|
||||
bad_fork_put_pidfd:
|
||||
if (clone_flags & CLONE_PIDFD)
|
||||
ksys_close(pidfd);
|
||||
if (clone_flags & CLONE_PIDFD) {
|
||||
fput(pidfile);
|
||||
put_unused_fd(pidfd);
|
||||
}
|
||||
bad_fork_free_pid:
|
||||
if (pid != &init_struct_pid)
|
||||
free_pid(pid);
|
||||
|
@ -160,10 +160,10 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,
|
||||
struct in6_addr *daddr,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct lowpan_peer *peer;
|
||||
struct in6_addr *nexthop;
|
||||
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
|
||||
int count = atomic_read(&dev->peer_count);
|
||||
const struct in6_addr *nexthop;
|
||||
struct lowpan_peer *peer;
|
||||
|
||||
BT_DBG("peers %d addr %pI6c rt %p", count, daddr, rt);
|
||||
|
||||
|
@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
|
||||
!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
|
||||
return 0;
|
||||
|
||||
/* The minimum encryption key size needs to be enforced by the
|
||||
* host stack before establishing any L2CAP connections. The
|
||||
* specification in theory allows a minimum of 1, but to align
|
||||
* BR/EDR and LE transports, a minimum of 7 is chosen.
|
||||
*/
|
||||
if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1400,8 +1392,16 @@ auth:
|
||||
return 0;
|
||||
|
||||
encrypt:
|
||||
if (test_bit(HCI_CONN_ENCRYPT, &conn->flags))
|
||||
if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) {
|
||||
/* Ensure that the encryption key size has been read,
|
||||
* otherwise stall the upper layer responses.
|
||||
*/
|
||||
if (!conn->enc_key_size)
|
||||
return 0;
|
||||
|
||||
/* Nothing else needed, all requirements are met */
|
||||
return 1;
|
||||
}
|
||||
|
||||
hci_conn_encrypt(conn);
|
||||
return 0;
|
||||
|
@ -1341,6 +1341,21 @@ static void l2cap_request_info(struct l2cap_conn *conn)
|
||||
sizeof(req), &req);
|
||||
}
|
||||
|
||||
static bool l2cap_check_enc_key_size(struct hci_conn *hcon)
|
||||
{
|
||||
/* The minimum encryption key size needs to be enforced by the
|
||||
* host stack before establishing any L2CAP connections. The
|
||||
* specification in theory allows a minimum of 1, but to align
|
||||
* BR/EDR and LE transports, a minimum of 7 is chosen.
|
||||
*
|
||||
* This check might also be called for unencrypted connections
|
||||
* that have no key size requirements. Ensure that the link is
|
||||
* actually encrypted before enforcing a key size.
|
||||
*/
|
||||
return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) ||
|
||||
hcon->enc_key_size > HCI_MIN_ENC_KEY_SIZE);
|
||||
}
|
||||
|
||||
static void l2cap_do_start(struct l2cap_chan *chan)
|
||||
{
|
||||
struct l2cap_conn *conn = chan->conn;
|
||||
@ -1358,9 +1373,14 @@ static void l2cap_do_start(struct l2cap_chan *chan)
|
||||
if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
|
||||
return;
|
||||
|
||||
if (l2cap_chan_check_security(chan, true) &&
|
||||
__l2cap_no_conn_pending(chan))
|
||||
if (!l2cap_chan_check_security(chan, true) ||
|
||||
!__l2cap_no_conn_pending(chan))
|
||||
return;
|
||||
|
||||
if (l2cap_check_enc_key_size(conn->hcon))
|
||||
l2cap_start_connection(chan);
|
||||
else
|
||||
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
||||
}
|
||||
|
||||
static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
|
||||
@ -1439,7 +1459,10 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (l2cap_check_enc_key_size(conn->hcon))
|
||||
l2cap_start_connection(chan);
|
||||
else
|
||||
l2cap_chan_close(chan, ECONNREFUSED);
|
||||
|
||||
} else if (chan->state == BT_CONNECT2) {
|
||||
struct l2cap_conn_rsp rsp;
|
||||
@ -7490,7 +7513,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||
}
|
||||
|
||||
if (chan->state == BT_CONNECT) {
|
||||
if (!status)
|
||||
if (!status && l2cap_check_enc_key_size(hcon))
|
||||
l2cap_start_connection(chan);
|
||||
else
|
||||
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
||||
@ -7499,7 +7522,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||
struct l2cap_conn_rsp rsp;
|
||||
__u16 res, stat;
|
||||
|
||||
if (!status) {
|
||||
if (!status && l2cap_check_enc_key_size(hcon)) {
|
||||
if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
|
||||
res = L2CAP_CR_PEND;
|
||||
stat = L2CAP_CS_AUTHOR_PEND;
|
||||
|
@ -327,18 +327,35 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
|
||||
static int ip_mc_finish_output(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
int ret;
|
||||
struct rtable *new_rt;
|
||||
bool do_cn = false;
|
||||
int ret, err;
|
||||
|
||||
ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb);
|
||||
switch (ret) {
|
||||
case NET_XMIT_SUCCESS:
|
||||
return dev_loopback_xmit(net, sk, skb);
|
||||
case NET_XMIT_CN:
|
||||
return dev_loopback_xmit(net, sk, skb) ? : ret;
|
||||
do_cn = true;
|
||||
/* fall through */
|
||||
case NET_XMIT_SUCCESS:
|
||||
break;
|
||||
default:
|
||||
kfree_skb(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Reset rt_iif so that inet_iif() will return skb->skb_iif. Setting
|
||||
* this to non-zero causes ipi_ifindex in in_pktinfo to be overwritten,
|
||||
* see ipv4_pktinfo_prepare().
|
||||
*/
|
||||
new_rt = rt_dst_clone(net->loopback_dev, skb_rtable(skb));
|
||||
if (new_rt) {
|
||||
new_rt->rt_iif = 0;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &new_rt->dst);
|
||||
}
|
||||
|
||||
err = dev_loopback_xmit(net, sk, skb);
|
||||
return (do_cn && err) ? ret : err;
|
||||
}
|
||||
|
||||
int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
|
@ -197,7 +197,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
||||
}
|
||||
sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol,
|
||||
iph->saddr, iph->daddr,
|
||||
skb->dev->ifindex, sdif);
|
||||
dif, sdif);
|
||||
}
|
||||
out:
|
||||
read_unlock(&raw_v4_hashinfo.lock);
|
||||
|
@ -1648,6 +1648,39 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(rt_dst_alloc);
|
||||
|
||||
struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt)
|
||||
{
|
||||
struct rtable *new_rt;
|
||||
|
||||
new_rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
|
||||
rt->dst.flags);
|
||||
|
||||
if (new_rt) {
|
||||
new_rt->rt_genid = rt_genid_ipv4(dev_net(dev));
|
||||
new_rt->rt_flags = rt->rt_flags;
|
||||
new_rt->rt_type = rt->rt_type;
|
||||
new_rt->rt_is_input = rt->rt_is_input;
|
||||
new_rt->rt_iif = rt->rt_iif;
|
||||
new_rt->rt_pmtu = rt->rt_pmtu;
|
||||
new_rt->rt_mtu_locked = rt->rt_mtu_locked;
|
||||
new_rt->rt_gw_family = rt->rt_gw_family;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
new_rt->rt_gw4 = rt->rt_gw4;
|
||||
else if (rt->rt_gw_family == AF_INET6)
|
||||
new_rt->rt_gw6 = rt->rt_gw6;
|
||||
INIT_LIST_HEAD(&new_rt->rt_uncached);
|
||||
|
||||
new_rt->dst.flags |= DST_HOST;
|
||||
new_rt->dst.input = rt->dst.input;
|
||||
new_rt->dst.output = rt->dst.output;
|
||||
new_rt->dst.error = rt->dst.error;
|
||||
new_rt->dst.lastuse = jiffies;
|
||||
new_rt->dst.lwtstate = lwtstate_get(rt->dst.lwtstate);
|
||||
}
|
||||
return new_rt;
|
||||
}
|
||||
EXPORT_SYMBOL(rt_dst_clone);
|
||||
|
||||
/* called in rcu_read_lock() section */
|
||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev,
|
||||
|
@ -59,8 +59,8 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net_device *dev = dst->dev;
|
||||
const struct in6_addr *nexthop;
|
||||
struct neighbour *neigh;
|
||||
struct in6_addr *nexthop;
|
||||
int ret;
|
||||
|
||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
||||
|
@ -218,7 +218,8 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
|
||||
{
|
||||
const struct rt6_info *rt = container_of(dst, struct rt6_info, dst);
|
||||
|
||||
return ip6_neigh_lookup(&rt->rt6i_gateway, dst->dev, skb, daddr);
|
||||
return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any),
|
||||
dst->dev, skb, daddr);
|
||||
}
|
||||
|
||||
static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
|
||||
@ -6073,7 +6074,7 @@ static struct ctl_table ipv6_route_table_template[] = {
|
||||
.data = &init_net.ipv6.sysctl.skip_notify_on_dev_down,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = &zero,
|
||||
.extra2 = &one,
|
||||
},
|
||||
|
@ -439,9 +439,9 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
|
||||
struct nf_flowtable *flow_table = priv;
|
||||
struct flow_offload_tuple tuple = {};
|
||||
enum flow_offload_tuple_dir dir;
|
||||
const struct in6_addr *nexthop;
|
||||
struct flow_offload *flow;
|
||||
struct net_device *outdev;
|
||||
struct in6_addr *nexthop;
|
||||
struct ipv6hdr *ip6h;
|
||||
struct rt6_info *rt;
|
||||
|
||||
|
@ -2412,6 +2412,9 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
|
||||
|
||||
ts = __packet_set_timestamp(po, ph, skb);
|
||||
__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
|
||||
|
||||
if (!packet_read_pending(&po->tx_ring))
|
||||
complete(&po->skb_completion);
|
||||
}
|
||||
|
||||
sock_wfree(skb);
|
||||
@ -2596,7 +2599,7 @@ static int tpacket_parse_header(struct packet_sock *po, void *frame,
|
||||
|
||||
static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct net_device *dev;
|
||||
struct virtio_net_hdr *vnet_hdr = NULL;
|
||||
struct sockcm_cookie sockc;
|
||||
@ -2611,6 +2614,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
int len_sum = 0;
|
||||
int status = TP_STATUS_AVAILABLE;
|
||||
int hlen, tlen, copylen = 0;
|
||||
long timeo = 0;
|
||||
|
||||
mutex_lock(&po->pg_vec_lock);
|
||||
|
||||
@ -2657,12 +2661,21 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !po->has_vnet_hdr)
|
||||
size_max = dev->mtu + reserve + VLAN_HLEN;
|
||||
|
||||
reinit_completion(&po->skb_completion);
|
||||
|
||||
do {
|
||||
ph = packet_current_frame(po, &po->tx_ring,
|
||||
TP_STATUS_SEND_REQUEST);
|
||||
if (unlikely(ph == NULL)) {
|
||||
if (need_wait && need_resched())
|
||||
schedule();
|
||||
if (need_wait && skb) {
|
||||
timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT);
|
||||
timeo = wait_for_completion_interruptible_timeout(&po->skb_completion, timeo);
|
||||
if (timeo <= 0) {
|
||||
err = !timeo ? -ETIMEDOUT : -ERESTARTSYS;
|
||||
goto out_put;
|
||||
}
|
||||
}
|
||||
/* check for additional frames */
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -3218,6 +3231,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
||||
sock_init_data(sock, sk);
|
||||
|
||||
po = pkt_sk(sk);
|
||||
init_completion(&po->skb_completion);
|
||||
sk->sk_family = PF_PACKET;
|
||||
po->num = proto;
|
||||
po->xmit = dev_queue_xmit;
|
||||
@ -4327,7 +4341,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
|
||||
req3->tp_sizeof_priv ||
|
||||
req3->tp_feature_req_word) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
goto out_free_pg_vec;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -4391,6 +4405,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
|
||||
prb_shutdown_retire_blk_timer(po, rb_queue);
|
||||
}
|
||||
|
||||
out_free_pg_vec:
|
||||
if (pg_vec)
|
||||
free_pg_vec(pg_vec, order, req->tp_block_nr);
|
||||
out:
|
||||
|
@ -128,6 +128,7 @@ struct packet_sock {
|
||||
unsigned int tp_hdrlen;
|
||||
unsigned int tp_reserve;
|
||||
unsigned int tp_tstamp;
|
||||
struct completion skb_completion;
|
||||
struct net_device __rcu *cached_dev;
|
||||
int (*xmit)(struct sk_buff *skb);
|
||||
struct packet_type prot_hook ____cacheline_aligned_in_smp;
|
||||
|
@ -549,12 +549,17 @@ static struct notifier_block cbs_device_notifier = {
|
||||
|
||||
static int __init cbs_module_init(void)
|
||||
{
|
||||
int err = register_netdevice_notifier(&cbs_device_notifier);
|
||||
int err;
|
||||
|
||||
err = register_netdevice_notifier(&cbs_device_notifier);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return register_qdisc(&cbs_qdisc_ops);
|
||||
err = register_qdisc(&cbs_qdisc_ops);
|
||||
if (err)
|
||||
unregister_netdevice_notifier(&cbs_device_notifier);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit cbs_module_exit(void)
|
||||
|
@ -118,10 +118,6 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
|
||||
/* Initialize the bind addr area */
|
||||
sctp_bind_addr_init(&ep->base.bind_addr, 0);
|
||||
|
||||
/* Remember who we are attached to. */
|
||||
ep->base.sk = sk;
|
||||
sock_hold(ep->base.sk);
|
||||
|
||||
/* Create the lists of associations. */
|
||||
INIT_LIST_HEAD(&ep->asocs);
|
||||
|
||||
@ -154,6 +150,10 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
|
||||
ep->prsctp_enable = net->sctp.prsctp_enable;
|
||||
ep->reconf_enable = net->sctp.reconf_enable;
|
||||
|
||||
/* Remember who we are attached to. */
|
||||
ep->base.sk = sk;
|
||||
sock_hold(ep->base.sk);
|
||||
|
||||
return ep;
|
||||
|
||||
nomem_shkey:
|
||||
|
@ -2020,7 +2020,7 @@ static int __init smc_init(void)
|
||||
|
||||
rc = smc_pnet_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
goto out_pernet_subsys;
|
||||
|
||||
rc = smc_llc_init();
|
||||
if (rc) {
|
||||
@ -2071,6 +2071,9 @@ out_proto:
|
||||
proto_unregister(&smc_proto);
|
||||
out_pnet:
|
||||
smc_pnet_exit();
|
||||
out_pernet_subsys:
|
||||
unregister_pernet_subsys(&smc_net_ops);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -652,7 +652,10 @@ create:
|
||||
rc = smc_lgr_create(smc, ini);
|
||||
if (rc)
|
||||
goto out;
|
||||
lgr = conn->lgr;
|
||||
write_lock_bh(&lgr->conns_lock);
|
||||
smc_lgr_register_conn(conn); /* add smc conn to lgr */
|
||||
write_unlock_bh(&lgr->conns_lock);
|
||||
}
|
||||
conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE;
|
||||
conn->local_tx_ctrl.len = SMC_WR_TX_SIZE;
|
||||
|
@ -134,7 +134,7 @@ static int __init tipc_init(void)
|
||||
if (err)
|
||||
goto out_sysctl;
|
||||
|
||||
err = register_pernet_subsys(&tipc_net_ops);
|
||||
err = register_pernet_device(&tipc_net_ops);
|
||||
if (err)
|
||||
goto out_pernet;
|
||||
|
||||
@ -142,7 +142,7 @@ static int __init tipc_init(void)
|
||||
if (err)
|
||||
goto out_socket;
|
||||
|
||||
err = register_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
err = register_pernet_device(&tipc_topsrv_net_ops);
|
||||
if (err)
|
||||
goto out_pernet_topsrv;
|
||||
|
||||
@ -153,11 +153,11 @@ static int __init tipc_init(void)
|
||||
pr_info("Started in single node mode\n");
|
||||
return 0;
|
||||
out_bearer:
|
||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
unregister_pernet_device(&tipc_topsrv_net_ops);
|
||||
out_pernet_topsrv:
|
||||
tipc_socket_stop();
|
||||
out_socket:
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
unregister_pernet_device(&tipc_net_ops);
|
||||
out_pernet:
|
||||
tipc_unregister_sysctl();
|
||||
out_sysctl:
|
||||
@ -172,9 +172,9 @@ out_netlink:
|
||||
static void __exit tipc_exit(void)
|
||||
{
|
||||
tipc_bearer_cleanup();
|
||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
unregister_pernet_device(&tipc_topsrv_net_ops);
|
||||
tipc_socket_stop();
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
unregister_pernet_device(&tipc_net_ops);
|
||||
tipc_netlink_stop();
|
||||
tipc_netlink_compat_stop();
|
||||
tipc_unregister_sysctl();
|
||||
|
@ -445,7 +445,11 @@ static int tipc_nl_compat_bearer_disable(struct tipc_nl_compat_cmd_doit *cmd,
|
||||
if (!bearer)
|
||||
return -EMSGSIZE;
|
||||
|
||||
len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_BEARER_NAME);
|
||||
len = TLV_GET_DATA_LEN(msg->req);
|
||||
if (len <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
len = min_t(int, len, TIPC_MAX_BEARER_NAME);
|
||||
if (!string_is_valid(name, len))
|
||||
return -EINVAL;
|
||||
|
||||
@ -539,7 +543,11 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg,
|
||||
|
||||
name = (char *)TLV_DATA(msg->req);
|
||||
|
||||
len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME);
|
||||
len = TLV_GET_DATA_LEN(msg->req);
|
||||
if (len <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
len = min_t(int, len, TIPC_MAX_BEARER_NAME);
|
||||
if (!string_is_valid(name, len))
|
||||
return -EINVAL;
|
||||
|
||||
@ -807,7 +815,11 @@ static int tipc_nl_compat_link_reset_stats(struct tipc_nl_compat_cmd_doit *cmd,
|
||||
if (!link)
|
||||
return -EMSGSIZE;
|
||||
|
||||
len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME);
|
||||
len = TLV_GET_DATA_LEN(msg->req);
|
||||
if (len <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
len = min_t(int, len, TIPC_MAX_BEARER_NAME);
|
||||
if (!string_is_valid(name, len))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -279,7 +279,8 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
|
||||
goto skip_tx_cleanup;
|
||||
}
|
||||
|
||||
if (!tls_complete_pending_work(sk, ctx, 0, &timeo))
|
||||
if (unlikely(sk->sk_write_pending) &&
|
||||
!wait_on_pending_writer(sk, &timeo))
|
||||
tls_handle_open_record(sk, 0);
|
||||
|
||||
/* We need these for tls_sw_fallback handling of other packets */
|
||||
|
@ -83,7 +83,7 @@ static int pidfd_metadata_fd(pid_t pid, int pidfd)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int pidfd = 0, ret = EXIT_FAILURE;
|
||||
int pidfd = -1, ret = EXIT_FAILURE;
|
||||
char buf[4096] = { 0 };
|
||||
pid_t pid;
|
||||
int procfd, statusfd;
|
||||
@ -91,7 +91,11 @@ int main(int argc, char *argv[])
|
||||
|
||||
pid = pidfd_clone(CLONE_PIDFD, &pidfd);
|
||||
if (pid < 0)
|
||||
exit(ret);
|
||||
err(ret, "CLONE_PIDFD");
|
||||
if (pidfd == -1) {
|
||||
warnx("CLONE_PIDFD is not supported by the kernel");
|
||||
goto out;
|
||||
}
|
||||
|
||||
procfd = pidfd_metadata_fd(pid, pidfd);
|
||||
close(pidfd);
|
||||
|
@ -4,3 +4,4 @@ tempfile
|
||||
prot_sao
|
||||
segv_errors
|
||||
wild_bctr
|
||||
large_vm_fork_separation
|
@ -2,7 +2,8 @@
|
||||
noarg:
|
||||
$(MAKE) -C ../
|
||||
|
||||
TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr
|
||||
TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr \
|
||||
large_vm_fork_separation
|
||||
TEST_GEN_FILES := tempfile
|
||||
|
||||
top_srcdir = ../../../../..
|
||||
@ -13,6 +14,7 @@ $(TEST_GEN_PROGS): ../harness.c
|
||||
$(OUTPUT)/prot_sao: ../utils.c
|
||||
|
||||
$(OUTPUT)/wild_bctr: CFLAGS += -m64
|
||||
$(OUTPUT)/large_vm_fork_separation: CFLAGS += -m64
|
||||
|
||||
$(OUTPUT)/tempfile:
|
||||
dd if=/dev/zero of=$@ bs=64k count=1
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user