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
|
BROADCOM BCM2835 ARM ARCHITECTURE
|
||||||
M: Eric Anholt <eric@anholt.net>
|
M: Eric Anholt <eric@anholt.net>
|
||||||
M: Stefan Wahren <wahrenst@gmx.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-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-arm-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
|
T: git git://github.com/anholt/linux
|
||||||
@ -3160,6 +3161,7 @@ F: arch/arm/boot/dts/bcm953012*
|
|||||||
|
|
||||||
BROADCOM BCM53573 ARM ARCHITECTURE
|
BROADCOM BCM53573 ARM ARCHITECTURE
|
||||||
M: Rafał Miłecki <rafal@milecki.pl>
|
M: Rafał Miłecki <rafal@milecki.pl>
|
||||||
|
L: bcm-kernel-feedback-list@broadcom.com
|
||||||
L: linux-arm-kernel@lists.infradead.org
|
L: linux-arm-kernel@lists.infradead.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/boot/dts/bcm53573*
|
F: arch/arm/boot/dts/bcm53573*
|
||||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 2
|
PATCHLEVEL = 2
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Golden Lions
|
NAME = Golden Lions
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
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";
|
stdout-path = "uart0:19200n8";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "D-Link DNS-313 1-Bay Network Storage Enclosure";
|
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>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@
|
|||||||
pwm1: pwm@2080000 {
|
pwm1: pwm@2080000 {
|
||||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||||
reg = <0x02080000 0x4000>;
|
reg = <0x02080000 0x4000>;
|
||||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_PWM1>,
|
clocks = <&clks IMX6UL_CLK_PWM1>,
|
||||||
<&clks IMX6UL_CLK_PWM1>;
|
<&clks IMX6UL_CLK_PWM1>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
@ -369,7 +369,7 @@
|
|||||||
pwm2: pwm@2084000 {
|
pwm2: pwm@2084000 {
|
||||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||||
reg = <0x02084000 0x4000>;
|
reg = <0x02084000 0x4000>;
|
||||||
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_PWM2>,
|
clocks = <&clks IMX6UL_CLK_PWM2>,
|
||||||
<&clks IMX6UL_CLK_PWM2>;
|
<&clks IMX6UL_CLK_PWM2>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
@ -380,7 +380,7 @@
|
|||||||
pwm3: pwm@2088000 {
|
pwm3: pwm@2088000 {
|
||||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||||
reg = <0x02088000 0x4000>;
|
reg = <0x02088000 0x4000>;
|
||||||
interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_PWM3>,
|
clocks = <&clks IMX6UL_CLK_PWM3>,
|
||||||
<&clks IMX6UL_CLK_PWM3>;
|
<&clks IMX6UL_CLK_PWM3>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
@ -391,7 +391,7 @@
|
|||||||
pwm4: pwm@208c000 {
|
pwm4: pwm@208c000 {
|
||||||
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
|
||||||
reg = <0x0208c000 0x4000>;
|
reg = <0x0208c000 0x4000>;
|
||||||
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_PWM4>,
|
clocks = <&clks IMX6UL_CLK_PWM4>,
|
||||||
<&clks IMX6UL_CLK_PWM4>;
|
<&clks IMX6UL_CLK_PWM4>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
|
@ -248,8 +248,8 @@
|
|||||||
<GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
@ -264,7 +264,6 @@
|
|||||||
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
||||||
clock-names = "bus", "core";
|
clock-names = "bus", "core";
|
||||||
operating-points-v2 = <&gpu_opp_table>;
|
operating-points-v2 = <&gpu_opp_table>;
|
||||||
switch-delay = <0xffff>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}; /* end of / */
|
}; /* end of / */
|
||||||
|
@ -163,23 +163,23 @@
|
|||||||
|
|
||||||
opp-255000000 {
|
opp-255000000 {
|
||||||
opp-hz = /bits/ 64 <255000000>;
|
opp-hz = /bits/ 64 <255000000>;
|
||||||
opp-microvolt = <1150000>;
|
opp-microvolt = <1100000>;
|
||||||
};
|
};
|
||||||
opp-364300000 {
|
opp-364300000 {
|
||||||
opp-hz = /bits/ 64 <364300000>;
|
opp-hz = /bits/ 64 <364300000>;
|
||||||
opp-microvolt = <1150000>;
|
opp-microvolt = <1100000>;
|
||||||
};
|
};
|
||||||
opp-425000000 {
|
opp-425000000 {
|
||||||
opp-hz = /bits/ 64 <425000000>;
|
opp-hz = /bits/ 64 <425000000>;
|
||||||
opp-microvolt = <1150000>;
|
opp-microvolt = <1100000>;
|
||||||
};
|
};
|
||||||
opp-510000000 {
|
opp-510000000 {
|
||||||
opp-hz = /bits/ 64 <510000000>;
|
opp-hz = /bits/ 64 <510000000>;
|
||||||
opp-microvolt = <1150000>;
|
opp-microvolt = <1100000>;
|
||||||
};
|
};
|
||||||
opp-637500000 {
|
opp-637500000 {
|
||||||
opp-hz = /bits/ 64 <637500000>;
|
opp-hz = /bits/ 64 <637500000>;
|
||||||
opp-microvolt = <1150000>;
|
opp-microvolt = <1100000>;
|
||||||
turbo-mode;
|
turbo-mode;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -229,7 +229,6 @@
|
|||||||
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
||||||
clock-names = "bus", "core";
|
clock-names = "bus", "core";
|
||||||
operating-points-v2 = <&gpu_opp_table>;
|
operating-points-v2 = <&gpu_opp_table>;
|
||||||
switch-delay = <0xffff>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}; /* end of / */
|
}; /* end of / */
|
||||||
|
@ -430,7 +430,7 @@ static void omap3_prm_reconfigure_io_chain(void)
|
|||||||
* registers, and omap3xxx_prm_reconfigure_io_chain() must be called.
|
* registers, and omap3xxx_prm_reconfigure_io_chain() must be called.
|
||||||
* No return value.
|
* 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)
|
if (prm_features & PRM_HAS_IO_WAKEUP)
|
||||||
omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
|
omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&clockgen 1 0>;
|
clocks = <&clockgen 1 0>;
|
||||||
next-level-cache = <&l2>;
|
next-level-cache = <&l2>;
|
||||||
cpu-idle-states = <&CPU_PH20>;
|
cpu-idle-states = <&CPU_PW20>;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu1: cpu@1 {
|
cpu1: cpu@1 {
|
||||||
@ -38,7 +38,7 @@
|
|||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&clockgen 1 0>;
|
clocks = <&clockgen 1 0>;
|
||||||
next-level-cache = <&l2>;
|
next-level-cache = <&l2>;
|
||||||
cpu-idle-states = <&CPU_PH20>;
|
cpu-idle-states = <&CPU_PW20>;
|
||||||
};
|
};
|
||||||
|
|
||||||
l2: l2-cache {
|
l2: l2-cache {
|
||||||
@ -53,13 +53,13 @@
|
|||||||
*/
|
*/
|
||||||
entry-method = "arm,psci";
|
entry-method = "arm,psci";
|
||||||
|
|
||||||
CPU_PH20: cpu-ph20 {
|
CPU_PW20: cpu-pw20 {
|
||||||
compatible = "arm,idle-state";
|
compatible = "arm,idle-state";
|
||||||
idle-state-name = "PH20";
|
idle-state-name = "PW20";
|
||||||
arm,psci-suspend-param = <0x00010000>;
|
arm,psci-suspend-param = <0x0>;
|
||||||
entry-latency-us = <1000>;
|
entry-latency-us = <2000>;
|
||||||
exit-latency-us = <1000>;
|
exit-latency-us = <2000>;
|
||||||
min-residency-us = <3000>;
|
min-residency-us = <6000>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -613,6 +613,7 @@ CONFIG_RTC_DRV_TEGRA=y
|
|||||||
CONFIG_RTC_DRV_IMX_SC=m
|
CONFIG_RTC_DRV_IMX_SC=m
|
||||||
CONFIG_RTC_DRV_XGENE=y
|
CONFIG_RTC_DRV_XGENE=y
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_FSL_EDMA=y
|
||||||
CONFIG_DMA_BCM2835=m
|
CONFIG_DMA_BCM2835=m
|
||||||
CONFIG_K3_DMA=y
|
CONFIG_K3_DMA=y
|
||||||
CONFIG_MV_XOR=y
|
CONFIG_MV_XOR=y
|
||||||
|
@ -39,6 +39,11 @@ static int save_fpu_state(struct sigcontext __user *sc)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct rt_sigframe {
|
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 siginfo info;
|
||||||
struct ucontext uc;
|
struct ucontext uc;
|
||||||
};
|
};
|
||||||
|
@ -786,6 +786,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||||||
/* 32-bit PC relative address */
|
/* 32-bit PC relative address */
|
||||||
*loc = val - dot - 8 + addend;
|
*loc = val - dot - 8 + addend;
|
||||||
break;
|
break;
|
||||||
|
case R_PARISC_PCREL64:
|
||||||
|
/* 64-bit PC relative address */
|
||||||
|
*loc64 = val - dot - 8 + addend;
|
||||||
|
break;
|
||||||
case R_PARISC_DIR64:
|
case R_PARISC_DIR64:
|
||||||
/* 64-bit effective address */
|
/* 64-bit effective address */
|
||||||
*loc64 = val + addend;
|
*loc64 = val + addend;
|
||||||
|
@ -319,6 +319,13 @@ struct vm_area_struct;
|
|||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
#include <asm/slice.h>
|
#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
|
#define ARCH_ZONE_DMA_BITS 31
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_POWERPC_PAGE_H */
|
#endif /* _ASM_POWERPC_PAGE_H */
|
||||||
|
@ -752,6 +752,7 @@ __secondary_start:
|
|||||||
stw r0,0(r3)
|
stw r0,0(r3)
|
||||||
|
|
||||||
/* load up the MMU */
|
/* load up the MMU */
|
||||||
|
bl load_segment_registers
|
||||||
bl load_up_mmu
|
bl load_up_mmu
|
||||||
|
|
||||||
/* ptr to phys current thread */
|
/* ptr to phys current thread */
|
||||||
|
@ -83,7 +83,7 @@ END_BTB_FLUSH_SECTION
|
|||||||
SAVE_4GPRS(3, r11); \
|
SAVE_4GPRS(3, r11); \
|
||||||
SAVE_2GPRS(7, r11)
|
SAVE_2GPRS(7, r11)
|
||||||
|
|
||||||
.macro SYSCALL_ENTRY trapno intno
|
.macro SYSCALL_ENTRY trapno intno srr1
|
||||||
mfspr r10, SPRN_SPRG_THREAD
|
mfspr r10, SPRN_SPRG_THREAD
|
||||||
#ifdef CONFIG_KVM_BOOKE_HV
|
#ifdef CONFIG_KVM_BOOKE_HV
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
@ -94,7 +94,7 @@ BEGIN_FTR_SECTION
|
|||||||
mfspr r11, SPRN_SRR1
|
mfspr r11, SPRN_SRR1
|
||||||
mtocrf 0x80, r11 /* check MSR[GS] without clobbering reg */
|
mtocrf 0x80, r11 /* check MSR[GS] without clobbering reg */
|
||||||
bf 3, 1975f
|
bf 3, 1975f
|
||||||
b kvmppc_handler_BOOKE_INTERRUPT_\intno\()_SPRN_SRR1
|
b kvmppc_handler_\intno\()_\srr1
|
||||||
1975:
|
1975:
|
||||||
mr r12, r13
|
mr r12, r13
|
||||||
lwz r13, THREAD_NORMSAVE(2)(r10)
|
lwz r13, THREAD_NORMSAVE(2)(r10)
|
||||||
@ -145,9 +145,9 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
|||||||
tophys(r11,r11)
|
tophys(r11,r11)
|
||||||
addi r11,r11,global_dbcr0@l
|
addi r11,r11,global_dbcr0@l
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
lwz r9,TASK_CPU(r2)
|
lwz r10, TASK_CPU(r2)
|
||||||
slwi r9,r9,3
|
slwi r10, r10, 3
|
||||||
add r11,r11,r9
|
add r11, r11, r10
|
||||||
#endif
|
#endif
|
||||||
lwz r12,0(r11)
|
lwz r12,0(r11)
|
||||||
mtspr SPRN_DBCR0,r12
|
mtspr SPRN_DBCR0,r12
|
||||||
|
@ -409,7 +409,7 @@ interrupt_base:
|
|||||||
|
|
||||||
/* System Call Interrupt */
|
/* System Call Interrupt */
|
||||||
START_EXCEPTION(SystemCall)
|
START_EXCEPTION(SystemCall)
|
||||||
SYSCALL_ENTRY 0xc00 SYSCALL
|
SYSCALL_ENTRY 0xc00 BOOKE_INTERRUPT_SYSCALL SPRN_SRR1
|
||||||
|
|
||||||
/* Auxiliary Processor Unavailable Interrupt */
|
/* Auxiliary Processor Unavailable Interrupt */
|
||||||
EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
|
EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
|
||||||
|
@ -830,6 +830,7 @@ static void flush_guest_tlb(struct kvm *kvm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
asm volatile("ptesync": : :"memory");
|
asm volatile("ptesync": : :"memory");
|
||||||
|
asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvmppc_check_need_tlb_flush(struct kvm *kvm, int pcpu,
|
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)
|
LOAD_REG_ADDR(r11, dawr_force_enable)
|
||||||
lbz r11, 0(r11)
|
lbz r11, 0(r11)
|
||||||
cmpdi r11, 0
|
cmpdi r11, 0
|
||||||
|
bne 3f
|
||||||
li r3, H_HARDWARE
|
li r3, H_HARDWARE
|
||||||
beqlr
|
blr
|
||||||
|
3:
|
||||||
/* Emulate H_SET_DABR/X on P8 for the sake of compat mode guests */
|
/* 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, 5, DAWRX_DR | DAWRX_DW
|
||||||
rlwimi r5, r4, 2, DAWRX_WT
|
rlwimi r5, r4, 2, DAWRX_WT
|
||||||
clrrdi r4, r4, 3
|
clrrdi r4, r4, 3
|
||||||
std r4, VCPU_DAWR(r3)
|
std r4, VCPU_DAWR(r3)
|
||||||
std r5, VCPU_DAWRX(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_DAWR, r4
|
||||||
mtspr SPRN_DAWRX, r5
|
mtspr SPRN_DAWRX, r5
|
||||||
li r3, 0
|
4: li r3, 0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
_GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */
|
_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);
|
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)
|
static int hash__init_new_context(struct mm_struct *mm)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
index = hash__alloc_context_id();
|
|
||||||
if (index < 0)
|
|
||||||
return index;
|
|
||||||
|
|
||||||
mm->context.hash_context = kmalloc(sizeof(struct hash_mm_context),
|
mm->context.hash_context = kmalloc(sizeof(struct hash_mm_context),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!mm->context.hash_context) {
|
if (!mm->context.hash_context)
|
||||||
ida_free(&mmu_context_ida, index);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The old code would re-promote on fork, we don't do that when using
|
* 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),
|
mm->context.hash_context->spt = kmalloc(sizeof(struct subpage_prot_table),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!mm->context.hash_context->spt) {
|
if (!mm->context.hash_context->spt) {
|
||||||
ida_free(&mmu_context_ida, index);
|
|
||||||
kfree(mm->context.hash_context);
|
kfree(mm->context.hash_context);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#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);
|
pkey_mm_init(mm);
|
||||||
|
@ -248,7 +248,8 @@ void __init paging_init(void)
|
|||||||
(long int)((top_of_ram - total_ram) >> 20));
|
(long int)((top_of_ram - total_ram) >> 20));
|
||||||
|
|
||||||
#ifdef CONFIG_ZONE_DMA
|
#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
|
#endif
|
||||||
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
|
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
|
@ -7,6 +7,7 @@ config PPC_PMAC
|
|||||||
select PPC_INDIRECT_PCI if PPC32
|
select PPC_INDIRECT_PCI if PPC32
|
||||||
select PPC_MPC106 if PPC32
|
select PPC_MPC106 if PPC32
|
||||||
select PPC_NATIVE
|
select PPC_NATIVE
|
||||||
|
select ZONE_DMA if PPC32
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config PPC_PMAC64
|
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)
|
static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
return vm_insert_page(vma, vma->vm_start,
|
struct page *pages = virt_to_page(cfag12864b_buffer);
|
||||||
virt_to_page(cfag12864b_buffer));
|
|
||||||
|
return vm_map_pages_zero(vma, &pages, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct fb_ops cfag12864bfb_ops = {
|
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)
|
static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
struct ht16k33_priv *priv = info->par;
|
struct ht16k33_priv *priv = info->par;
|
||||||
|
struct page *pages = virt_to_page(priv->fbdev.buffer);
|
||||||
|
|
||||||
return vm_insert_page(vma, vma->vm_start,
|
return vm_map_pages_zero(vma, &pages, 1);
|
||||||
virt_to_page(priv->fbdev.buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct fb_ops ht16k33_fb_ops = {
|
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;
|
const char *dev_id = dev ? dev_name(dev) : NULL;
|
||||||
struct device_node *np = core->of_node;
|
struct device_node *np = core->of_node;
|
||||||
|
|
||||||
if (np && index >= 0)
|
if (np && (name || index >= 0))
|
||||||
hw = of_clk_get_hw(np, index, name);
|
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_DIV] = &g12a_mali_1_div.hw,
|
||||||
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
||||||
[CLKID_MALI] = &g12a_mali.hw,
|
[CLKID_MALI] = &g12a_mali.hw,
|
||||||
[CLKID_MPLL_5OM_DIV] = &g12a_mpll_50m_div.hw,
|
[CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
|
||||||
[CLKID_MPLL_5OM] = &g12a_mpll_50m.hw,
|
[CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
|
||||||
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
||||||
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
||||||
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
||||||
|
@ -166,7 +166,7 @@
|
|||||||
#define CLKID_HDMI_DIV 167
|
#define CLKID_HDMI_DIV 167
|
||||||
#define CLKID_MALI_0_DIV 170
|
#define CLKID_MALI_0_DIV 170
|
||||||
#define CLKID_MALI_1_DIV 173
|
#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_EN 178
|
||||||
#define CLKID_SYS_PLL_DIV16 179
|
#define CLKID_SYS_PLL_DIV16 179
|
||||||
#define CLKID_CPU_CLK_DYN0_SEL 180
|
#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"
|
"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){
|
.hw.init = &(struct clk_init_data){
|
||||||
.name = "vpu_0_sel",
|
.name = "vpu_0_sel",
|
||||||
.ops = &clk_regmap_mux_ops,
|
.ops = &clk_regmap_mux_ops,
|
||||||
.parent_names = mmeson8b_vpu_0_1_parent_names,
|
.parent_names = meson8b_vpu_0_1_parent_names,
|
||||||
.num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names),
|
.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1837,8 +1837,8 @@ static struct clk_regmap meson8b_vpu_1_sel = {
|
|||||||
.hw.init = &(struct clk_init_data){
|
.hw.init = &(struct clk_init_data){
|
||||||
.name = "vpu_1_sel",
|
.name = "vpu_1_sel",
|
||||||
.ops = &clk_regmap_mux_ops,
|
.ops = &clk_regmap_mux_ops,
|
||||||
.parent_names = mmeson8b_vpu_0_1_parent_names,
|
.parent_names = meson8b_vpu_0_1_parent_names,
|
||||||
.num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names),
|
.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.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),
|
{ STRATIX10_NOC_CLK, "noc_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux),
|
||||||
0, 0, 0, 0x3C, 1},
|
0, 0, 0, 0x3C, 1},
|
||||||
{ STRATIX10_EMAC_A_FREE_CLK, "emaca_free_clk", NULL, emaca_free_mux, ARRAY_SIZE(emaca_free_mux),
|
{ 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),
|
{ 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,
|
{ 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},
|
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,
|
{ 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_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
|
||||||
{ TEGRA210_CLK_I2S4_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_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. */
|
/* This MUST be the last entry. */
|
||||||
{ TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
|
{ 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_provider *provider = data;
|
||||||
struct omap_clkctrl_clk *entry;
|
struct omap_clkctrl_clk *entry;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
if (clkspec->args_count != 2)
|
if (clkspec->args_count != 2)
|
||||||
return ERR_PTR(-EINVAL);
|
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) {
|
list_for_each_entry(entry, &provider->clocks, node) {
|
||||||
if (entry->reg_offset == clkspec->args[0] &&
|
if (entry->reg_offset == clkspec->args[0] &&
|
||||||
entry->bit_offset == clkspec->args[1])
|
entry->bit_offset == clkspec->args[1]) {
|
||||||
|
found = true;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entry)
|
if (!found)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
return entry->clk;
|
return entry->clk;
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
#define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP 0x1220
|
#define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP 0x1220
|
||||||
#define HID_DEVICE_ID_ALPS_U1 0x1215
|
#define HID_DEVICE_ID_ALPS_U1 0x1215
|
||||||
#define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C
|
#define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C
|
||||||
|
#define HID_DEVICE_ID_ALPS_1222 0x1222
|
||||||
|
|
||||||
|
|
||||||
#define USB_VENDOR_ID_AMI 0x046b
|
#define USB_VENDOR_ID_AMI 0x046b
|
||||||
@ -269,6 +270,7 @@
|
|||||||
#define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d
|
#define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d
|
||||||
#define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618
|
#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_MOUSE 0x1053
|
||||||
|
#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2 0x0939
|
||||||
#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123
|
#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123
|
||||||
#define USB_DEVICE_ID_ASUS_AK1D 0x1125
|
#define USB_DEVICE_ID_ASUS_AK1D 0x1125
|
||||||
#define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408
|
#define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408
|
||||||
@ -569,6 +571,7 @@
|
|||||||
|
|
||||||
#define USB_VENDOR_ID_HUION 0x256c
|
#define USB_VENDOR_ID_HUION 0x256c
|
||||||
#define USB_DEVICE_ID_HUION_TABLET 0x006e
|
#define USB_DEVICE_ID_HUION_TABLET 0x006e
|
||||||
|
#define USB_DEVICE_ID_HUION_HS64 0x006d
|
||||||
|
|
||||||
#define USB_VENDOR_ID_IBM 0x04b3
|
#define USB_VENDOR_ID_IBM 0x04b3
|
||||||
#define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100
|
#define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#define REPORT_ID_HIDPP_SHORT 0x10
|
#define REPORT_ID_HIDPP_SHORT 0x10
|
||||||
#define REPORT_ID_HIDPP_LONG 0x11
|
#define REPORT_ID_HIDPP_LONG 0x11
|
||||||
|
#define REPORT_ID_HIDPP_VERY_LONG 0x12
|
||||||
|
|
||||||
#define HIDPP_REPORT_SHORT_LENGTH 7
|
#define HIDPP_REPORT_SHORT_LENGTH 7
|
||||||
#define HIDPP_REPORT_LONG_LENGTH 20
|
#define HIDPP_REPORT_LONG_LENGTH 20
|
||||||
@ -1242,7 +1243,8 @@ static int logi_dj_ll_raw_request(struct hid_device *hid,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
|
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)
|
if (count < 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -1776,6 +1776,10 @@ static const struct hid_device_id mt_devices[] = {
|
|||||||
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
|
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
|
||||||
USB_VENDOR_ID_ALPS_JP,
|
USB_VENDOR_ID_ALPS_JP,
|
||||||
HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) },
|
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 */
|
/* Lenovo X1 TAB Gen 2 */
|
||||||
{ .driver_data = MT_CLS_WIN_8_DUAL,
|
{ .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_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_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_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_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_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 },
|
{ 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) },
|
USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HUION,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_HUION,
|
||||||
USB_DEVICE_ID_HUION_TABLET) },
|
USB_DEVICE_ID_HUION_TABLET) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_HUION,
|
||||||
|
USB_DEVICE_ID_HUION_HS64) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
||||||
USB_DEVICE_ID_HUION_TABLET) },
|
USB_DEVICE_ID_HUION_TABLET) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
|
||||||
|
@ -977,6 +977,8 @@ int uclogic_params_init(struct uclogic_params *params,
|
|||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
case VID_PID(USB_VENDOR_ID_HUION,
|
case VID_PID(USB_VENDOR_ID_HUION,
|
||||||
USB_DEVICE_ID_HUION_TABLET):
|
USB_DEVICE_ID_HUION_TABLET):
|
||||||
|
case VID_PID(USB_VENDOR_ID_HUION,
|
||||||
|
USB_DEVICE_ID_HUION_HS64):
|
||||||
case VID_PID(USB_VENDOR_ID_UCLOGIC,
|
case VID_PID(USB_VENDOR_ID_UCLOGIC,
|
||||||
USB_DEVICE_ID_HUION_TABLET):
|
USB_DEVICE_ID_HUION_TABLET):
|
||||||
case VID_PID(USB_VENDOR_ID_UCLOGIC,
|
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;
|
goto end_err_fw_release;
|
||||||
|
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
kfree(filename);
|
|
||||||
dev_info(cl_data_to_dev(client_data), "ISH firmware %s loaded\n",
|
dev_info(cl_data_to_dev(client_data), "ISH firmware %s loaded\n",
|
||||||
filename);
|
filename);
|
||||||
|
kfree(filename);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
end_err_fw_release:
|
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)
|
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 *hid_ishtp_cl = ishtp_get_drvdata(cl_device);
|
||||||
struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl);
|
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)
|
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 *hid_ishtp_cl = ishtp_get_drvdata(cl_device);
|
||||||
struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl);
|
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;
|
ishtp_device_ready = true;
|
||||||
dev_set_drvdata(&device->dev, device);
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
@ -639,6 +638,20 @@ void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ishtp_get_drvdata);
|
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
|
* ishtp_bus_new_client() - Create a new client
|
||||||
* @dev: ISHTP device instance
|
* @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);
|
spin_lock_irqsave(&device_domain_lock, flags);
|
||||||
if (dev)
|
if (dev)
|
||||||
found = find_domain(dev);
|
found = find_domain(dev);
|
||||||
@ -2520,16 +2519,17 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
|||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||||
spin_unlock(&iommu->lock);
|
|
||||||
free_devinfo_mem(info);
|
free_devinfo_mem(info);
|
||||||
/* Caller must free the original domain */
|
/* Caller must free the original domain */
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_lock(&iommu->lock);
|
||||||
ret = domain_attach_iommu(domain, iommu);
|
ret = domain_attach_iommu(domain, iommu);
|
||||||
|
spin_unlock(&iommu->lock);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||||
spin_unlock(&iommu->lock);
|
|
||||||
free_devinfo_mem(info);
|
free_devinfo_mem(info);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2539,7 +2539,6 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
|||||||
if (dev)
|
if (dev)
|
||||||
dev->archdata.iommu = info;
|
dev->archdata.iommu = info;
|
||||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||||
spin_unlock(&iommu->lock);
|
|
||||||
|
|
||||||
/* PASID table is mandatory for a PCI device in scalable mode. */
|
/* PASID table is mandatory for a PCI device in scalable mode. */
|
||||||
if (dev && dev_is_pci(dev) && sm_supported(iommu)) {
|
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);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
/* target_args */
|
/* target_args */
|
||||||
dev->target_args_array[n] = kstrndup(field[3], GFP_KERNEL,
|
dev->target_args_array[n] = kstrndup(field[3], DM_MAX_STR_SIZE,
|
||||||
DM_MAX_STR_SIZE);
|
GFP_KERNEL);
|
||||||
if (!dev->target_args_array[n])
|
if (!dev->target_args_array[n])
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
@ -272,10 +272,10 @@ static int __init dm_init_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (strlen(create) >= DM_MAX_STR_SIZE) {
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
str = kstrndup(create, GFP_KERNEL, DM_MAX_STR_SIZE);
|
str = kstrndup(create, DM_MAX_STR_SIZE, GFP_KERNEL);
|
||||||
if (!str)
|
if (!str)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ static int __init dm_init_init(void)
|
|||||||
if (r)
|
if (r)
|
||||||
goto out;
|
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();
|
wait_for_device_probe();
|
||||||
|
|
||||||
list_for_each_entry(dev, &devices, list) {
|
list_for_each_entry(dev, &devices, list) {
|
||||||
|
@ -60,6 +60,7 @@
|
|||||||
|
|
||||||
#define WRITE_LOG_VERSION 1ULL
|
#define WRITE_LOG_VERSION 1ULL
|
||||||
#define WRITE_LOG_MAGIC 0x6a736677736872ULL
|
#define WRITE_LOG_MAGIC 0x6a736677736872ULL
|
||||||
|
#define WRITE_LOG_SUPER_SECTOR 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The disk format for this is braindead simple.
|
* The disk format for this is braindead simple.
|
||||||
@ -115,6 +116,7 @@ struct log_writes_c {
|
|||||||
struct list_head logging_blocks;
|
struct list_head logging_blocks;
|
||||||
wait_queue_head_t wait;
|
wait_queue_head_t wait;
|
||||||
struct task_struct *log_kthread;
|
struct task_struct *log_kthread;
|
||||||
|
struct completion super_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pending_block {
|
struct pending_block {
|
||||||
@ -180,6 +182,14 @@ static void log_end_io(struct bio *bio)
|
|||||||
bio_put(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
|
* Meant to be called if there is an error, it will free all the pages
|
||||||
* associated with the block.
|
* 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_size = 0;
|
||||||
bio->bi_iter.bi_sector = sector;
|
bio->bi_iter.bi_sector = sector;
|
||||||
bio_set_dev(bio, lc->logdev->bdev);
|
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->bi_private = lc;
|
||||||
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
|
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.nr_entries = cpu_to_le64(lc->logged_entries);
|
||||||
super.sectorsize = cpu_to_le32(lc->sectorsize);
|
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");
|
DMERR("Couldn't write super");
|
||||||
return -1;
|
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;
|
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->unflushed_blocks);
|
||||||
INIT_LIST_HEAD(&lc->logging_blocks);
|
INIT_LIST_HEAD(&lc->logging_blocks);
|
||||||
init_waitqueue_head(&lc->wait);
|
init_waitqueue_head(&lc->wait);
|
||||||
|
init_completion(&lc->super_done);
|
||||||
atomic_set(&lc->io_blocks, 0);
|
atomic_set(&lc->io_blocks, 0);
|
||||||
atomic_set(&lc->pending_blocks, 0);
|
atomic_set(&lc->pending_blocks, 0);
|
||||||
|
|
||||||
|
@ -561,7 +561,7 @@ static char **realloc_argv(unsigned *size, char **old_argv)
|
|||||||
gfp = GFP_NOIO;
|
gfp = GFP_NOIO;
|
||||||
}
|
}
|
||||||
argv = kmalloc_array(new_size, sizeof(*argv), gfp);
|
argv = kmalloc_array(new_size, sizeof(*argv), gfp);
|
||||||
if (argv) {
|
if (argv && old_argv) {
|
||||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||||
*size = new_size;
|
*size = new_size;
|
||||||
}
|
}
|
||||||
|
@ -235,8 +235,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type,
|
|||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str,
|
DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name,
|
||||||
block);
|
type_str, block);
|
||||||
|
|
||||||
if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS)
|
if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS)
|
||||||
DMERR("%s: reached maximum errors", v->data_dev->name);
|
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)
|
static irqreturn_t stmfx_irq_handler(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct stmfx *stmfx = data;
|
struct stmfx *stmfx = data;
|
||||||
unsigned long n, pending;
|
unsigned long bits;
|
||||||
u32 ack;
|
u32 pending, ack;
|
||||||
int ret;
|
int n, ret;
|
||||||
|
|
||||||
ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING,
|
ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING, &pending);
|
||||||
(u32 *)&pending);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
@ -224,7 +223,8 @@ static irqreturn_t stmfx_irq_handler(int irq, void *data)
|
|||||||
return IRQ_NONE;
|
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));
|
handle_nested_irq(irq_find_mapping(stmfx->irq_domain, n));
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
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 = nanddev_get_memorg(&chip->base);
|
||||||
memorg->planes_per_lun = 1;
|
memorg->planes_per_lun = 1;
|
||||||
memorg->luns_per_target = 1;
|
memorg->luns_per_target = 1;
|
||||||
memorg->ntargets = 1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
|
* 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)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
memorg->ntargets = maxchips;
|
||||||
|
|
||||||
/* Read the flash type */
|
/* Read the flash type */
|
||||||
ret = nand_detect(chip, table);
|
ret = nand_detect(chip, table);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1636,6 +1636,95 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
|
|||||||
return 0;
|
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 */
|
/* Used when the "_ext_id" is two bytes at most */
|
||||||
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
|
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
|
||||||
.id = { \
|
.id = { \
|
||||||
@ -3660,6 +3749,8 @@ static int spi_nor_init_params(struct spi_nor *nor,
|
|||||||
default:
|
default:
|
||||||
/* Kept only for backward compatibility purpose. */
|
/* Kept only for backward compatibility purpose. */
|
||||||
params->quad_enable = spansion_quad_enable;
|
params->quad_enable = spansion_quad_enable;
|
||||||
|
if (nor->clear_sr_bp)
|
||||||
|
nor->clear_sr_bp = spi_nor_spansion_clear_sr_bp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3912,17 +4003,13 @@ static int spi_nor_init(struct spi_nor *nor)
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/*
|
if (nor->clear_sr_bp) {
|
||||||
* Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up
|
err = nor->clear_sr_bp(nor);
|
||||||
* with the software protection bits set
|
if (err) {
|
||||||
*/
|
dev_err(nor->dev,
|
||||||
if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
|
"fail to clear block protection bits\n");
|
||||||
JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
|
return err;
|
||||||
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->quad_enable) {
|
if (nor->quad_enable) {
|
||||||
@ -4047,6 +4134,16 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
|
|||||||
if (info->flags & SPI_S3AN)
|
if (info->flags & SPI_S3AN)
|
||||||
nor->flags |= SNOR_F_READY_XSR_RDY;
|
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. */
|
/* Parse the Serial Flash Discoverable Parameters table. */
|
||||||
ret = spi_nor_init_params(nor, ¶ms);
|
ret = spi_nor_init_params(nor, ¶ms);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -4304,12 +4304,12 @@ void bond_setup(struct net_device *bond_dev)
|
|||||||
bond_dev->features |= NETIF_F_NETNS_LOCAL;
|
bond_dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
|
|
||||||
bond_dev->hw_features = BOND_VLAN_FEATURES |
|
bond_dev->hw_features = BOND_VLAN_FEATURES |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX |
|
|
||||||
NETIF_F_HW_VLAN_CTAG_RX |
|
NETIF_F_HW_VLAN_CTAG_RX |
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER;
|
NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
|
||||||
bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
||||||
bond_dev->features |= bond_dev->hw_features;
|
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.
|
/* Destroy a bonding device.
|
||||||
|
@ -433,9 +433,9 @@ int ksz_switch_register(struct ksz_device *dev,
|
|||||||
return PTR_ERR(dev->reset_gpio);
|
return PTR_ERR(dev->reset_gpio);
|
||||||
|
|
||||||
if (dev->reset_gpio) {
|
if (dev->reset_gpio) {
|
||||||
gpiod_set_value(dev->reset_gpio, 1);
|
gpiod_set_value_cansleep(dev->reset_gpio, 1);
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
gpiod_set_value(dev->reset_gpio, 0);
|
gpiod_set_value_cansleep(dev->reset_gpio, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_init(&dev->dev_mutex);
|
mutex_init(&dev->dev_mutex);
|
||||||
@ -485,7 +485,7 @@ void ksz_switch_remove(struct ksz_device *dev)
|
|||||||
dsa_unregister_switch(dev->ds);
|
dsa_unregister_switch(dev->ds);
|
||||||
|
|
||||||
if (dev->reset_gpio)
|
if (dev->reset_gpio)
|
||||||
gpiod_set_value(dev->reset_gpio, 1);
|
gpiod_set_value_cansleep(dev->reset_gpio, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ksz_switch_remove);
|
EXPORT_SYMBOL(ksz_switch_remove);
|
||||||
|
@ -843,9 +843,14 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
|
if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
|
||||||
if (hweight < AQ_VLAN_MAX_FILTERS)
|
if (hweight < AQ_VLAN_MAX_FILTERS && hweight > 0) {
|
||||||
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, true);
|
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 */
|
/* otherwise left in promiscue mode */
|
||||||
|
aq_nic->aq_nic_cfg.is_vlan_force_promisc = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
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))
|
if (unlikely(!aq_hw_ops->hw_filter_vlan_ctrl))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
aq_nic->aq_nic_cfg.is_vlan_force_promisc = true;
|
||||||
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false);
|
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false);
|
||||||
if (err)
|
if (err)
|
||||||
return 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->features = cfg->aq_hw_caps->hw_features;
|
||||||
cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX);
|
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_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)
|
static int aq_nic_update_link_status(struct aq_nic_s *self)
|
||||||
|
@ -37,6 +37,7 @@ struct aq_nic_cfg_s {
|
|||||||
u32 wol;
|
u32 wol;
|
||||||
u8 is_vlan_rx_strip;
|
u8 is_vlan_rx_strip;
|
||||||
u8 is_vlan_tx_insert;
|
u8 is_vlan_tx_insert;
|
||||||
|
bool is_vlan_force_promisc;
|
||||||
u16 is_mc_list_enabled;
|
u16 is_mc_list_enabled;
|
||||||
u16 mc_list_count;
|
u16 mc_list_count;
|
||||||
bool is_autoneg;
|
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 packet_filter)
|
||||||
{
|
{
|
||||||
unsigned int i = 0U;
|
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,
|
hw_atl_rpfl2multicast_flr_en_set(self,
|
||||||
IS_FILTER_ENABLED(IFF_ALLMULTI), 0);
|
IS_FILTER_ENABLED(IFF_ALLMULTI), 0);
|
||||||
|
|
||||||
@ -818,13 +825,13 @@ 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));
|
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)
|
for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i)
|
||||||
hw_atl_rpfl2_uc_flr_en_set(self,
|
hw_atl_rpfl2_uc_flr_en_set(self,
|
||||||
(self->aq_nic_cfg->is_mc_list_enabled &&
|
(cfg->is_mc_list_enabled &&
|
||||||
(i <= self->aq_nic_cfg->mc_list_count)) ?
|
(i <= cfg->mc_list_count)) ?
|
||||||
1U : 0U, i);
|
1U : 0U, i);
|
||||||
|
|
||||||
return aq_hw_err_from_flags(self);
|
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)
|
static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable)
|
||||||
{
|
{
|
||||||
/* set promisc in case of disabing the vland filter */
|
/* 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);
|
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) {
|
if (PTR_ERR(mac) == -EPROBE_DEFER) {
|
||||||
err = -EPROBE_DEFER;
|
err = -EPROBE_DEFER;
|
||||||
goto err_out_free_netdev;
|
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);
|
ether_addr_copy(bp->dev->dev_addr, mac);
|
||||||
} else {
|
} else {
|
||||||
macb_get_hwaddr(bp);
|
macb_get_hwaddr(bp);
|
||||||
|
@ -891,7 +891,7 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,
|
|||||||
u64 *data)
|
u64 *data)
|
||||||
{
|
{
|
||||||
struct be_adapter *adapter = netdev_priv(netdev);
|
struct be_adapter *adapter = netdev_priv(netdev);
|
||||||
int status;
|
int status, cnt;
|
||||||
u8 link_status = 0;
|
u8 link_status = 0;
|
||||||
|
|
||||||
if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) {
|
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);
|
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 (test->flags & ETH_TEST_FL_OFFLINE) {
|
||||||
if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0)
|
if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0)
|
||||||
test->flags |= ETH_TEST_FL_FAILED;
|
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;
|
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 (status) {
|
if (!link_status) {
|
||||||
test->flags |= ETH_TEST_FL_FAILED;
|
|
||||||
data[4] = -1;
|
|
||||||
} else if (!link_status) {
|
|
||||||
test->flags |= ETH_TEST_FL_FAILED;
|
test->flags |= ETH_TEST_FL_FAILED;
|
||||||
data[4] = 1;
|
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;
|
||||||
|
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);
|
sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
|
||||||
|
|
||||||
/* Enable all known interrupts by setting the interrupt mask. */
|
/* 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(cr, RxENA | sr32(cr));
|
||||||
sw32(ier, IE);
|
sw32(ier, IE);
|
||||||
|
|
||||||
@ -1578,7 +1578,7 @@ static void sis900_tx_timeout(struct net_device *net_dev)
|
|||||||
sw32(txdp, sis_priv->tx_ring_dma);
|
sw32(txdp, sis_priv->tx_ring_dma);
|
||||||
|
|
||||||
/* Enable all known interrupts by setting the interrupt mask. */
|
/* 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);
|
spin_unlock_irqrestore(&sis_priv->lock, flags);
|
||||||
return NETDEV_TX_OK;
|
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));
|
sw32(cr, TxENA | sr32(cr));
|
||||||
|
|
||||||
sis_priv->cur_tx ++;
|
sis_priv->cur_tx ++;
|
||||||
@ -1674,7 +1674,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
|
|||||||
do {
|
do {
|
||||||
status = sr32(isr);
|
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 */
|
/* nothing intresting happened */
|
||||||
break;
|
break;
|
||||||
handled = 1;
|
handled = 1;
|
||||||
@ -1684,7 +1684,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
|
|||||||
/* Rx interrupt */
|
/* Rx interrupt */
|
||||||
sis900_rx(net_dev);
|
sis900_rx(net_dev);
|
||||||
|
|
||||||
if (status & (TxURN | TxERR | TxIDLE))
|
if (status & (TxURN | TxERR | TxIDLE | TxDESC))
|
||||||
/* Tx interrupt */
|
/* Tx interrupt */
|
||||||
sis900_finish_xmit(net_dev);
|
sis900_finish_xmit(net_dev);
|
||||||
|
|
||||||
@ -1896,8 +1896,8 @@ static void sis900_finish_xmit (struct net_device *net_dev)
|
|||||||
|
|
||||||
if (tx_status & OWN) {
|
if (tx_status & OWN) {
|
||||||
/* The packet is not transmitted yet (owned by hardware) !
|
/* The packet is not transmitted yet (owned by hardware) !
|
||||||
* Note: the interrupt is generated only when Tx Machine
|
* Note: this is an almost impossible condition
|
||||||
* is idle, so this is an almost impossible case */
|
* in case of TxDESC ('descriptor interrupt') */
|
||||||
break;
|
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);
|
sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
|
||||||
|
|
||||||
/* Enable all known interrupts by setting the interrupt mask. */
|
/* 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(cr, RxENA | sr32(cr));
|
||||||
sw32(ier, IE);
|
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>)
|
* programmed with (2^32 – <new_sec_value>)
|
||||||
*/
|
*/
|
||||||
if (gmac4)
|
if (gmac4)
|
||||||
sec = (100000000ULL - sec);
|
sec = -sec;
|
||||||
|
|
||||||
value = readl(ioaddr + PTP_TCR);
|
value = readl(ioaddr + PTP_TCR);
|
||||||
if (value & PTP_TCR_TSCTRLSSR)
|
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 */
|
/* Manage tx mitigation */
|
||||||
tx_q->tx_count_frames += nfrags + 1;
|
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);
|
stmmac_set_tx_ic(priv, desc);
|
||||||
priv->xstats.tx_set_ic_bit++;
|
priv->xstats.tx_set_ic_bit++;
|
||||||
tx_q->tx_count_frames = 0;
|
|
||||||
} else {
|
|
||||||
stmmac_tx_timer_arm(priv, queue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_tx_timestamp(skb);
|
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.
|
* element in case of no SG.
|
||||||
*/
|
*/
|
||||||
tx_q->tx_count_frames += nfrags + 1;
|
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);
|
stmmac_set_tx_ic(priv, desc);
|
||||||
priv->xstats.tx_set_ic_bit++;
|
priv->xstats.tx_set_ic_bit++;
|
||||||
tx_q->tx_count_frames = 0;
|
|
||||||
} else {
|
|
||||||
stmmac_tx_timer_arm(priv, queue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_tx_timestamp(skb);
|
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_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support");
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE));
|
MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE));
|
||||||
|
MODULE_SOFTDEP("pre: arc4");
|
||||||
MODULE_VERSION("1.0.2");
|
MODULE_VERSION("1.0.2");
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
|
@ -2153,12 +2153,12 @@ static void team_setup(struct net_device *dev)
|
|||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
|
|
||||||
dev->hw_features = TEAM_VLAN_FEATURES |
|
dev->hw_features = TEAM_VLAN_FEATURES |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX |
|
|
||||||
NETIF_F_HW_VLAN_CTAG_RX |
|
NETIF_F_HW_VLAN_CTAG_RX |
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER;
|
NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
|
||||||
dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
|
||||||
dev->features |= dev->hw_features;
|
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,
|
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
|
* different. Ignore the current interface if the number of endpoints
|
||||||
* equals the number for the diag interface (two).
|
* 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 (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) {
|
||||||
if (desc->bNumEndpoints == 2)
|
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 dst_entry *dst = skb_dst(skb);
|
||||||
struct net_device *dev = dst->dev;
|
struct net_device *dev = dst->dev;
|
||||||
|
const struct in6_addr *nexthop;
|
||||||
struct neighbour *neigh;
|
struct neighbour *neigh;
|
||||||
struct in6_addr *nexthop;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
nf_reset(skb);
|
nf_reset(skb);
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <linux/percpu-refcount.h>
|
#include <linux/percpu-refcount.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/seq_buf.h>
|
#include <linux/seq_buf.h>
|
||||||
|
#include <linux/iommu.h>
|
||||||
|
|
||||||
struct pci_p2pdma {
|
struct pci_p2pdma {
|
||||||
struct gen_pool *pool;
|
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));
|
struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0));
|
||||||
unsigned short vendor, device;
|
unsigned short vendor, device;
|
||||||
|
|
||||||
|
if (iommu_present(dev->dev.bus))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!root)
|
if (!root)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -987,6 +987,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi,
|
|||||||
if (!iscsi_is_session_online(cls_sess))
|
if (!iscsi_is_session_online(cls_sess))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!sess->targetname)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (pri_ctrl_flags) {
|
if (pri_ctrl_flags) {
|
||||||
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
|
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
|
||||||
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
|
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
* Copyright (c) 2016 Cavium Inc.
|
* 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_MAJOR_VER 8
|
||||||
#define QEDI_DRIVER_MINOR_VER 33
|
#define QEDI_DRIVER_MINOR_VER 37
|
||||||
#define QEDI_DRIVER_REV_VER 0
|
#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) &&
|
!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
|
||||||
!qla2x00_isp_reg_stat(ha))) {
|
!qla2x00_isp_reg_stat(ha))) {
|
||||||
sp->comp = ∁
|
sp->comp = ∁
|
||||||
rval = ha->isp_ops->abort_command(sp);
|
|
||||||
spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
|
spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
|
||||||
|
rval = ha->isp_ops->abort_command(sp);
|
||||||
|
|
||||||
switch (rval) {
|
switch (rval) {
|
||||||
case QLA_SUCCESS:
|
case QLA_SUCCESS:
|
||||||
|
@ -430,24 +430,21 @@ int ufshcd_pltfrm_init(struct platform_device *pdev,
|
|||||||
goto dealloc_host;
|
goto dealloc_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_set_active(&pdev->dev);
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
|
||||||
|
|
||||||
ufshcd_init_lanes_per_dir(hba);
|
ufshcd_init_lanes_per_dir(hba);
|
||||||
|
|
||||||
err = ufshcd_init(hba, mmio_base, irq);
|
err = ufshcd_init(hba, mmio_base, irq);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(dev, "Initialization failed\n");
|
dev_err(dev, "Initialization failed\n");
|
||||||
goto out_disable_rpm;
|
goto dealloc_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
platform_set_drvdata(pdev, hba);
|
platform_set_drvdata(pdev, hba);
|
||||||
|
|
||||||
|
pm_runtime_set_active(&pdev->dev);
|
||||||
|
pm_runtime_enable(&pdev->dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_disable_rpm:
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
pm_runtime_set_suspended(&pdev->dev);
|
|
||||||
dealloc_host:
|
dealloc_host:
|
||||||
ufshcd_dealloc_host(hba);
|
ufshcd_dealloc_host(hba);
|
||||||
out:
|
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_super_info *as = AFS_FS_S(cbi->sb);
|
||||||
struct afs_volume *volume = as->volume;
|
struct afs_volume *volume = as->volume;
|
||||||
|
|
||||||
write_lock(&volume->cb_break_lock);
|
write_lock(&volume->cb_v_break_lock);
|
||||||
volume->cb_v_break++;
|
volume->cb_v_break++;
|
||||||
write_unlock(&volume->cb_break_lock);
|
write_unlock(&volume->cb_v_break_lock);
|
||||||
} else {
|
} else {
|
||||||
data.volume = NULL;
|
data.volume = NULL;
|
||||||
data.fid = *fid;
|
data.fid = *fid;
|
||||||
|
@ -55,6 +55,16 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren
|
|||||||
dump_stack();
|
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.
|
* 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);
|
return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
afs_set_i_size(vnode, status->size);
|
||||||
* 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);
|
|
||||||
|
|
||||||
vnode->invalid_before = status->data_version;
|
vnode->invalid_before = status->data_version;
|
||||||
inode_set_iversion_raw(&vnode->vfs_inode, 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 &&
|
if (expected_version &&
|
||||||
*expected_version != status->data_version) {
|
*expected_version != status->data_version) {
|
||||||
kdebug("vnode modified %llx on {%llx:%llu} [exp %llx] %s",
|
if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags))
|
||||||
(unsigned long long) status->data_version,
|
pr_warn("kAFS: vnode modified {%llx:%llu} %llx->%llx %s\n",
|
||||||
vnode->fid.vid, vnode->fid.vnode,
|
vnode->fid.vid, vnode->fid.vnode,
|
||||||
(unsigned long long) *expected_version,
|
(unsigned long long)*expected_version,
|
||||||
fc->type ? fc->type->name : "???");
|
(unsigned long long)status->data_version,
|
||||||
|
fc->type ? fc->type->name : "???");
|
||||||
|
|
||||||
vnode->invalid_before = status->data_version;
|
vnode->invalid_before = status->data_version;
|
||||||
if (vnode->status.type == AFS_FTYPE_DIR) {
|
if (vnode->status.type == AFS_FTYPE_DIR) {
|
||||||
if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
|
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) {
|
if (data_changed) {
|
||||||
inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
|
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 rxrpc_call *rxcall; /* RxRPC call handle */
|
||||||
struct key *key; /* security for this call */
|
struct key *key; /* security for this call */
|
||||||
struct afs_net *net; /* The network namespace */
|
struct afs_net *net; /* The network namespace */
|
||||||
union {
|
struct afs_server *server; /* The fileserver record if fs op (pins ref) */
|
||||||
struct afs_server *server;
|
struct afs_vlserver *vlserver; /* The vlserver record if vl op */
|
||||||
struct afs_vlserver *vlserver;
|
|
||||||
};
|
|
||||||
struct afs_cb_interest *cbi; /* Callback interest for server used */
|
struct afs_cb_interest *cbi; /* Callback interest for server used */
|
||||||
struct afs_vnode *lvnode; /* vnode being locked */
|
struct afs_vnode *lvnode; /* vnode being locked */
|
||||||
void *request; /* request data (first part) */
|
void *request; /* request data (first part) */
|
||||||
@ -616,7 +614,7 @@ struct afs_volume {
|
|||||||
unsigned int servers_seq; /* Incremented each time ->servers changes */
|
unsigned int servers_seq; /* Incremented each time ->servers changes */
|
||||||
|
|
||||||
unsigned cb_v_break; /* Break-everything counter. */
|
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 */
|
afs_voltype_t type; /* type of volume */
|
||||||
short error;
|
short error;
|
||||||
|
@ -43,6 +43,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,
|
|||||||
atomic_set(&volume->usage, 1);
|
atomic_set(&volume->usage, 1);
|
||||||
INIT_LIST_HEAD(&volume->proc_link);
|
INIT_LIST_HEAD(&volume->proc_link);
|
||||||
rwlock_init(&volume->servers_lock);
|
rwlock_init(&volume->servers_lock);
|
||||||
|
rwlock_init(&volume->cb_v_break_lock);
|
||||||
memcpy(volume->name, vldb->name, vldb->name_len + 1);
|
memcpy(volume->name, vldb->name, vldb->name_len + 1);
|
||||||
|
|
||||||
slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask);
|
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)
|
struct pid *tgid_pidfd_to_pid(const struct file *file)
|
||||||
{
|
{
|
||||||
if (!d_is_dir(file->f_path.dentry) ||
|
if (file->f_op != &proc_tgid_base_operations)
|
||||||
(file->f_op != &proc_tgid_base_operations))
|
|
||||||
return ERR_PTR(-EBADF);
|
return ERR_PTR(-EBADF);
|
||||||
|
|
||||||
return proc_pid(file_inode(file));
|
return proc_pid(file_inode(file));
|
||||||
|
@ -130,7 +130,7 @@
|
|||||||
#define CLKID_MALI_1_SEL 172
|
#define CLKID_MALI_1_SEL 172
|
||||||
#define CLKID_MALI_1 174
|
#define CLKID_MALI_1 174
|
||||||
#define CLKID_MALI 175
|
#define CLKID_MALI 175
|
||||||
#define CLKID_MPLL_5OM 177
|
#define CLKID_MPLL_50M 177
|
||||||
#define CLKID_CPU_CLK 187
|
#define CLKID_CPU_CLK 187
|
||||||
#define CLKID_PCIE_PLL 201
|
#define CLKID_PCIE_PLL 201
|
||||||
#define CLKID_VDEC_1 204
|
#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_get_device(struct ishtp_cl_device *cl_dev);
|
||||||
void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data);
|
void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data);
|
||||||
void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device);
|
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,
|
int ishtp_register_event_cb(struct ishtp_cl_device *device,
|
||||||
void (*read_cb)(struct ishtp_cl_device *));
|
void (*read_cb)(struct ishtp_cl_device *));
|
||||||
struct ishtp_fw_client *ishtp_fw_cl_get_client(struct ishtp_device *dev,
|
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_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
|
||||||
* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
|
* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
|
||||||
* @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode
|
* @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
|
* completely locked
|
||||||
* @priv: the private data
|
* @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_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 (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||||
int (*quad_enable)(struct spi_nor *nor);
|
int (*quad_enable)(struct spi_nor *nor);
|
||||||
|
int (*clear_sr_bp)(struct spi_nor *nor);
|
||||||
|
|
||||||
void *priv;
|
void *priv;
|
||||||
};
|
};
|
||||||
|
@ -281,8 +281,8 @@ static inline bool ip6_sk_ignore_df(const struct sock *sk)
|
|||||||
inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT;
|
inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
|
static inline const struct in6_addr *rt6_nexthop(const struct rt6_info *rt,
|
||||||
struct in6_addr *daddr)
|
const struct in6_addr *daddr)
|
||||||
{
|
{
|
||||||
if (rt->rt6i_flags & RTF_GATEWAY)
|
if (rt->rt6i_flags & RTF_GATEWAY)
|
||||||
return &rt->rt6i_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,
|
struct rtable *rt_dst_alloc(struct net_device *dev,
|
||||||
unsigned int flags, u16 type,
|
unsigned int flags, u16 type,
|
||||||
bool nopolicy, bool noxfrm, bool will_cache);
|
bool nopolicy, bool noxfrm, bool will_cache);
|
||||||
|
struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt);
|
||||||
|
|
||||||
struct in_ifaddr;
|
struct in_ifaddr;
|
||||||
void fib_add_ifaddr(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;
|
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)
|
static inline bool tls_is_pending_open_record(struct tls_context *tls_ctx)
|
||||||
{
|
{
|
||||||
return tls_ctx->pending_open_record_frags;
|
return tls_ctx->pending_open_record_frags;
|
||||||
|
@ -1712,31 +1712,6 @@ const struct file_operations pidfd_fops = {
|
|||||||
#endif
|
#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)
|
static void __delayed_free_task(struct rcu_head *rhp)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
|
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;
|
int pidfd = -1, retval;
|
||||||
struct task_struct *p;
|
struct task_struct *p;
|
||||||
struct multiprocess_signals delayed;
|
struct multiprocess_signals delayed;
|
||||||
|
struct file *pidfile = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't allow sharing the root directory with processes in a different
|
* 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) {
|
if (clone_flags & CLONE_PIDFD) {
|
||||||
int reserved;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* - CLONE_PARENT_SETTID is useless for pidfds and also
|
* - CLONE_PARENT_SETTID is useless for pidfds and also
|
||||||
* parent_tidptr is used to return pidfds.
|
* parent_tidptr is used to return pidfds.
|
||||||
@ -1834,16 +1808,6 @@ static __latent_entropy struct task_struct *copy_process(
|
|||||||
if (clone_flags &
|
if (clone_flags &
|
||||||
(CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD))
|
(CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD))
|
||||||
return ERR_PTR(-EINVAL);
|
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 the fd table isn't shared).
|
||||||
*/
|
*/
|
||||||
if (clone_flags & CLONE_PIDFD) {
|
if (clone_flags & CLONE_PIDFD) {
|
||||||
retval = pidfd_create(pid);
|
retval = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto bad_fork_free_pid;
|
goto bad_fork_free_pid;
|
||||||
|
|
||||||
pidfd = retval;
|
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);
|
retval = put_user(pidfd, parent_tidptr);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto bad_fork_put_pidfd;
|
goto bad_fork_put_pidfd;
|
||||||
@ -2180,6 +2153,9 @@ static __latent_entropy struct task_struct *copy_process(
|
|||||||
goto bad_fork_cancel_cgroup;
|
goto bad_fork_cancel_cgroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* past the last point of failure */
|
||||||
|
if (pidfile)
|
||||||
|
fd_install(pidfd, pidfile);
|
||||||
|
|
||||||
init_task_pid_links(p);
|
init_task_pid_links(p);
|
||||||
if (likely(p->pid)) {
|
if (likely(p->pid)) {
|
||||||
@ -2246,8 +2222,10 @@ bad_fork_cancel_cgroup:
|
|||||||
bad_fork_cgroup_threadgroup_change_end:
|
bad_fork_cgroup_threadgroup_change_end:
|
||||||
cgroup_threadgroup_change_end(current);
|
cgroup_threadgroup_change_end(current);
|
||||||
bad_fork_put_pidfd:
|
bad_fork_put_pidfd:
|
||||||
if (clone_flags & CLONE_PIDFD)
|
if (clone_flags & CLONE_PIDFD) {
|
||||||
ksys_close(pidfd);
|
fput(pidfile);
|
||||||
|
put_unused_fd(pidfd);
|
||||||
|
}
|
||||||
bad_fork_free_pid:
|
bad_fork_free_pid:
|
||||||
if (pid != &init_struct_pid)
|
if (pid != &init_struct_pid)
|
||||||
free_pid(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 in6_addr *daddr,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct lowpan_peer *peer;
|
|
||||||
struct in6_addr *nexthop;
|
|
||||||
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
|
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
|
||||||
int count = atomic_read(&dev->peer_count);
|
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);
|
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))
|
!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
|
||||||
return 0;
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1400,8 +1392,16 @@ auth:
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
encrypt:
|
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;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
hci_conn_encrypt(conn);
|
hci_conn_encrypt(conn);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1341,6 +1341,21 @@ static void l2cap_request_info(struct l2cap_conn *conn)
|
|||||||
sizeof(req), &req);
|
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)
|
static void l2cap_do_start(struct l2cap_chan *chan)
|
||||||
{
|
{
|
||||||
struct l2cap_conn *conn = chan->conn;
|
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))
|
if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (l2cap_chan_check_security(chan, true) &&
|
if (!l2cap_chan_check_security(chan, true) ||
|
||||||
__l2cap_no_conn_pending(chan))
|
!__l2cap_no_conn_pending(chan))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (l2cap_check_enc_key_size(conn->hcon))
|
||||||
l2cap_start_connection(chan);
|
l2cap_start_connection(chan);
|
||||||
|
else
|
||||||
|
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
l2cap_start_connection(chan);
|
if (l2cap_check_enc_key_size(conn->hcon))
|
||||||
|
l2cap_start_connection(chan);
|
||||||
|
else
|
||||||
|
l2cap_chan_close(chan, ECONNREFUSED);
|
||||||
|
|
||||||
} else if (chan->state == BT_CONNECT2) {
|
} else if (chan->state == BT_CONNECT2) {
|
||||||
struct l2cap_conn_rsp rsp;
|
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 (chan->state == BT_CONNECT) {
|
||||||
if (!status)
|
if (!status && l2cap_check_enc_key_size(hcon))
|
||||||
l2cap_start_connection(chan);
|
l2cap_start_connection(chan);
|
||||||
else
|
else
|
||||||
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
__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;
|
struct l2cap_conn_rsp rsp;
|
||||||
__u16 res, stat;
|
__u16 res, stat;
|
||||||
|
|
||||||
if (!status) {
|
if (!status && l2cap_check_enc_key_size(hcon)) {
|
||||||
if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
|
if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
|
||||||
res = L2CAP_CR_PEND;
|
res = L2CAP_CR_PEND;
|
||||||
stat = L2CAP_CS_AUTHOR_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,
|
static int ip_mc_finish_output(struct net *net, struct sock *sk,
|
||||||
struct sk_buff *skb)
|
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);
|
ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case NET_XMIT_SUCCESS:
|
|
||||||
return dev_loopback_xmit(net, sk, skb);
|
|
||||||
case NET_XMIT_CN:
|
case NET_XMIT_CN:
|
||||||
return dev_loopback_xmit(net, sk, skb) ? : ret;
|
do_cn = true;
|
||||||
|
/* fall through */
|
||||||
|
case NET_XMIT_SUCCESS:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return ret;
|
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)
|
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,
|
sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol,
|
||||||
iph->saddr, iph->daddr,
|
iph->saddr, iph->daddr,
|
||||||
skb->dev->ifindex, sdif);
|
dif, sdif);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
read_unlock(&raw_v4_hashinfo.lock);
|
read_unlock(&raw_v4_hashinfo.lock);
|
||||||
|
@ -1648,6 +1648,39 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rt_dst_alloc);
|
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 */
|
/* called in rcu_read_lock() section */
|
||||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||||
u8 tos, struct net_device *dev,
|
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 dst_entry *dst = skb_dst(skb);
|
||||||
struct net_device *dev = dst->dev;
|
struct net_device *dev = dst->dev;
|
||||||
|
const struct in6_addr *nexthop;
|
||||||
struct neighbour *neigh;
|
struct neighbour *neigh;
|
||||||
struct in6_addr *nexthop;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
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);
|
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)
|
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,
|
.data = &init_net.ipv6.sysctl.skip_notify_on_dev_down,
|
||||||
.maxlen = sizeof(int),
|
.maxlen = sizeof(int),
|
||||||
.mode = 0644,
|
.mode = 0644,
|
||||||
.proc_handler = proc_dointvec,
|
.proc_handler = proc_dointvec_minmax,
|
||||||
.extra1 = &zero,
|
.extra1 = &zero,
|
||||||
.extra2 = &one,
|
.extra2 = &one,
|
||||||
},
|
},
|
||||||
|
@ -439,9 +439,9 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
|
|||||||
struct nf_flowtable *flow_table = priv;
|
struct nf_flowtable *flow_table = priv;
|
||||||
struct flow_offload_tuple tuple = {};
|
struct flow_offload_tuple tuple = {};
|
||||||
enum flow_offload_tuple_dir dir;
|
enum flow_offload_tuple_dir dir;
|
||||||
|
const struct in6_addr *nexthop;
|
||||||
struct flow_offload *flow;
|
struct flow_offload *flow;
|
||||||
struct net_device *outdev;
|
struct net_device *outdev;
|
||||||
struct in6_addr *nexthop;
|
|
||||||
struct ipv6hdr *ip6h;
|
struct ipv6hdr *ip6h;
|
||||||
struct rt6_info *rt;
|
struct rt6_info *rt;
|
||||||
|
|
||||||
|
@ -2412,6 +2412,9 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
|
|||||||
|
|
||||||
ts = __packet_set_timestamp(po, ph, skb);
|
ts = __packet_set_timestamp(po, ph, skb);
|
||||||
__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
|
__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
|
||||||
|
|
||||||
|
if (!packet_read_pending(&po->tx_ring))
|
||||||
|
complete(&po->skb_completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
sock_wfree(skb);
|
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)
|
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 net_device *dev;
|
||||||
struct virtio_net_hdr *vnet_hdr = NULL;
|
struct virtio_net_hdr *vnet_hdr = NULL;
|
||||||
struct sockcm_cookie sockc;
|
struct sockcm_cookie sockc;
|
||||||
@ -2611,6 +2614,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
|||||||
int len_sum = 0;
|
int len_sum = 0;
|
||||||
int status = TP_STATUS_AVAILABLE;
|
int status = TP_STATUS_AVAILABLE;
|
||||||
int hlen, tlen, copylen = 0;
|
int hlen, tlen, copylen = 0;
|
||||||
|
long timeo = 0;
|
||||||
|
|
||||||
mutex_lock(&po->pg_vec_lock);
|
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)
|
if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !po->has_vnet_hdr)
|
||||||
size_max = dev->mtu + reserve + VLAN_HLEN;
|
size_max = dev->mtu + reserve + VLAN_HLEN;
|
||||||
|
|
||||||
|
reinit_completion(&po->skb_completion);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ph = packet_current_frame(po, &po->tx_ring,
|
ph = packet_current_frame(po, &po->tx_ring,
|
||||||
TP_STATUS_SEND_REQUEST);
|
TP_STATUS_SEND_REQUEST);
|
||||||
if (unlikely(ph == NULL)) {
|
if (unlikely(ph == NULL)) {
|
||||||
if (need_wait && need_resched())
|
if (need_wait && skb) {
|
||||||
schedule();
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3218,6 +3231,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
|||||||
sock_init_data(sock, sk);
|
sock_init_data(sock, sk);
|
||||||
|
|
||||||
po = pkt_sk(sk);
|
po = pkt_sk(sk);
|
||||||
|
init_completion(&po->skb_completion);
|
||||||
sk->sk_family = PF_PACKET;
|
sk->sk_family = PF_PACKET;
|
||||||
po->num = proto;
|
po->num = proto;
|
||||||
po->xmit = dev_queue_xmit;
|
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_sizeof_priv ||
|
||||||
req3->tp_feature_req_word) {
|
req3->tp_feature_req_word) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto out;
|
goto out_free_pg_vec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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);
|
prb_shutdown_retire_blk_timer(po, rb_queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_free_pg_vec:
|
||||||
if (pg_vec)
|
if (pg_vec)
|
||||||
free_pg_vec(pg_vec, order, req->tp_block_nr);
|
free_pg_vec(pg_vec, order, req->tp_block_nr);
|
||||||
out:
|
out:
|
||||||
|
@ -128,6 +128,7 @@ struct packet_sock {
|
|||||||
unsigned int tp_hdrlen;
|
unsigned int tp_hdrlen;
|
||||||
unsigned int tp_reserve;
|
unsigned int tp_reserve;
|
||||||
unsigned int tp_tstamp;
|
unsigned int tp_tstamp;
|
||||||
|
struct completion skb_completion;
|
||||||
struct net_device __rcu *cached_dev;
|
struct net_device __rcu *cached_dev;
|
||||||
int (*xmit)(struct sk_buff *skb);
|
int (*xmit)(struct sk_buff *skb);
|
||||||
struct packet_type prot_hook ____cacheline_aligned_in_smp;
|
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)
|
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)
|
if (err)
|
||||||
return 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)
|
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 */
|
/* Initialize the bind addr area */
|
||||||
sctp_bind_addr_init(&ep->base.bind_addr, 0);
|
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. */
|
/* Create the lists of associations. */
|
||||||
INIT_LIST_HEAD(&ep->asocs);
|
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->prsctp_enable = net->sctp.prsctp_enable;
|
||||||
ep->reconf_enable = net->sctp.reconf_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;
|
return ep;
|
||||||
|
|
||||||
nomem_shkey:
|
nomem_shkey:
|
||||||
|
@ -2020,7 +2020,7 @@ static int __init smc_init(void)
|
|||||||
|
|
||||||
rc = smc_pnet_init();
|
rc = smc_pnet_init();
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto out_pernet_subsys;
|
||||||
|
|
||||||
rc = smc_llc_init();
|
rc = smc_llc_init();
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@ -2071,6 +2071,9 @@ out_proto:
|
|||||||
proto_unregister(&smc_proto);
|
proto_unregister(&smc_proto);
|
||||||
out_pnet:
|
out_pnet:
|
||||||
smc_pnet_exit();
|
smc_pnet_exit();
|
||||||
|
out_pernet_subsys:
|
||||||
|
unregister_pernet_subsys(&smc_net_ops);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -652,7 +652,10 @@ create:
|
|||||||
rc = smc_lgr_create(smc, ini);
|
rc = smc_lgr_create(smc, ini);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
|
lgr = conn->lgr;
|
||||||
|
write_lock_bh(&lgr->conns_lock);
|
||||||
smc_lgr_register_conn(conn); /* add smc conn to lgr */
|
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.common.type = SMC_CDC_MSG_TYPE;
|
||||||
conn->local_tx_ctrl.len = SMC_WR_TX_SIZE;
|
conn->local_tx_ctrl.len = SMC_WR_TX_SIZE;
|
||||||
|
@ -134,7 +134,7 @@ static int __init tipc_init(void)
|
|||||||
if (err)
|
if (err)
|
||||||
goto out_sysctl;
|
goto out_sysctl;
|
||||||
|
|
||||||
err = register_pernet_subsys(&tipc_net_ops);
|
err = register_pernet_device(&tipc_net_ops);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_pernet;
|
goto out_pernet;
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ static int __init tipc_init(void)
|
|||||||
if (err)
|
if (err)
|
||||||
goto out_socket;
|
goto out_socket;
|
||||||
|
|
||||||
err = register_pernet_subsys(&tipc_topsrv_net_ops);
|
err = register_pernet_device(&tipc_topsrv_net_ops);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_pernet_topsrv;
|
goto out_pernet_topsrv;
|
||||||
|
|
||||||
@ -153,11 +153,11 @@ static int __init tipc_init(void)
|
|||||||
pr_info("Started in single node mode\n");
|
pr_info("Started in single node mode\n");
|
||||||
return 0;
|
return 0;
|
||||||
out_bearer:
|
out_bearer:
|
||||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
unregister_pernet_device(&tipc_topsrv_net_ops);
|
||||||
out_pernet_topsrv:
|
out_pernet_topsrv:
|
||||||
tipc_socket_stop();
|
tipc_socket_stop();
|
||||||
out_socket:
|
out_socket:
|
||||||
unregister_pernet_subsys(&tipc_net_ops);
|
unregister_pernet_device(&tipc_net_ops);
|
||||||
out_pernet:
|
out_pernet:
|
||||||
tipc_unregister_sysctl();
|
tipc_unregister_sysctl();
|
||||||
out_sysctl:
|
out_sysctl:
|
||||||
@ -172,9 +172,9 @@ out_netlink:
|
|||||||
static void __exit tipc_exit(void)
|
static void __exit tipc_exit(void)
|
||||||
{
|
{
|
||||||
tipc_bearer_cleanup();
|
tipc_bearer_cleanup();
|
||||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
unregister_pernet_device(&tipc_topsrv_net_ops);
|
||||||
tipc_socket_stop();
|
tipc_socket_stop();
|
||||||
unregister_pernet_subsys(&tipc_net_ops);
|
unregister_pernet_device(&tipc_net_ops);
|
||||||
tipc_netlink_stop();
|
tipc_netlink_stop();
|
||||||
tipc_netlink_compat_stop();
|
tipc_netlink_compat_stop();
|
||||||
tipc_unregister_sysctl();
|
tipc_unregister_sysctl();
|
||||||
|
@ -445,7 +445,11 @@ static int tipc_nl_compat_bearer_disable(struct tipc_nl_compat_cmd_doit *cmd,
|
|||||||
if (!bearer)
|
if (!bearer)
|
||||||
return -EMSGSIZE;
|
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))
|
if (!string_is_valid(name, len))
|
||||||
return -EINVAL;
|
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);
|
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))
|
if (!string_is_valid(name, len))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -807,7 +815,11 @@ static int tipc_nl_compat_link_reset_stats(struct tipc_nl_compat_cmd_doit *cmd,
|
|||||||
if (!link)
|
if (!link)
|
||||||
return -EMSGSIZE;
|
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))
|
if (!string_is_valid(name, len))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -279,7 +279,8 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
|
|||||||
goto skip_tx_cleanup;
|
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);
|
tls_handle_open_record(sk, 0);
|
||||||
|
|
||||||
/* We need these for tls_sw_fallback handling of other packets */
|
/* 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 main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int pidfd = 0, ret = EXIT_FAILURE;
|
int pidfd = -1, ret = EXIT_FAILURE;
|
||||||
char buf[4096] = { 0 };
|
char buf[4096] = { 0 };
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int procfd, statusfd;
|
int procfd, statusfd;
|
||||||
@ -91,7 +91,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
pid = pidfd_clone(CLONE_PIDFD, &pidfd);
|
pid = pidfd_clone(CLONE_PIDFD, &pidfd);
|
||||||
if (pid < 0)
|
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);
|
procfd = pidfd_metadata_fd(pid, pidfd);
|
||||||
close(pidfd);
|
close(pidfd);
|
||||||
|
@ -3,4 +3,5 @@ subpage_prot
|
|||||||
tempfile
|
tempfile
|
||||||
prot_sao
|
prot_sao
|
||||||
segv_errors
|
segv_errors
|
||||||
wild_bctr
|
wild_bctr
|
||||||
|
large_vm_fork_separation
|
@ -2,7 +2,8 @@
|
|||||||
noarg:
|
noarg:
|
||||||
$(MAKE) -C ../
|
$(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
|
TEST_GEN_FILES := tempfile
|
||||||
|
|
||||||
top_srcdir = ../../../../..
|
top_srcdir = ../../../../..
|
||||||
@ -13,6 +14,7 @@ $(TEST_GEN_PROGS): ../harness.c
|
|||||||
$(OUTPUT)/prot_sao: ../utils.c
|
$(OUTPUT)/prot_sao: ../utils.c
|
||||||
|
|
||||||
$(OUTPUT)/wild_bctr: CFLAGS += -m64
|
$(OUTPUT)/wild_bctr: CFLAGS += -m64
|
||||||
|
$(OUTPUT)/large_vm_fork_separation: CFLAGS += -m64
|
||||||
|
|
||||||
$(OUTPUT)/tempfile:
|
$(OUTPUT)/tempfile:
|
||||||
dd if=/dev/zero of=$@ bs=64k count=1
|
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…
x
Reference in New Issue
Block a user