This is the 4.14.120 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlzdoQwACgkQONu9yGCS
aT5uuQ/9EzGk9z2eFEE8pdp9KIUqC3uTDTymR6qIHBQ26PBY+1wXa60yhd0qCLVi
lycHCEE2PUn6b/5cMLmBoFr8JhM5fHHOSNY9Vi5WDm2vKGNKJ6TRE1HHjxAkXqFk
IZUk839X5b2JUYBUJfmH3gcvUGrtaIJv0Nnd/dgCAn9r2Nb0yRljKPy1PY7Gd1hS
ASE1WOvEIAZD+FESKpbnrT0W4st/AEe0hpBYCxUmPGF2q/v0ErzOKASVMtvA5zM2
xRPGAWOI9eRIbWEU1KLaI9ALEkqUnzKRsCTEmVwZSoCIaf3TmeCUd117vl3dn0IA
l/OqdNYpn2Ogx/nEYZ+duTq39QKDNkn3/y4ZHK22z2BwSrh6EFiRyOUEzgzvq8Jx
SVthwsLAjVE0Dlc/CEqnTxEvTq0yvVDxlbC9coSgcMDyEKy2FCXGvi61QpIQnla4
F89cqXZ/Rmt99OZh/rmXzqr/WuxUYdGF10gHe7gIKWoYu2TwBGW9z6pqGNfyT/h3
wKAbUYXKjDtTt0WHMAzuT6PZzg982CLIvtnE8OcpHs2DOI4LNGsyGEPmNmv/W4iR
0cf1N0Fx07JHUATNQoMcKVEUKJpMqm95jozsmDDYEpavIHPpe2J5QyMW3OuLXd+U
AeQhG4xwPH4/mNXbMWDqeCyFFidWSK/Ezct7iSUFE7vxFYcFrco=
=n2qf
-----END PGP SIGNATURE-----
Merge 4.14.120 into android-4.14-q
Changes in 4.14.120
netfilter: compat: initialize all fields in xt_init
platform/x86: sony-laptop: Fix unintentional fall-through
platform/x86: thinkpad_acpi: Disable Bluetooth for some machines
hwmon: (pwm-fan) Disable PWM if fetching cooling data fails
kernfs: fix barrier usage in __kernfs_new_node()
USB: serial: fix unthrottle races
iio: adc: xilinx: fix potential use-after-free on remove
libnvdimm/namespace: Fix a potential NULL pointer dereference
HID: input: add mapping for Expose/Overview key
HID: input: add mapping for keyboard Brightness Up/Down/Toggle keys
HID: input: add mapping for "Toggle Display" key
libnvdimm/btt: Fix a kmemdup failure check
s390/dasd: Fix capacity calculation for large volumes
mac80211: fix unaligned access in mesh table hash function
mac80211: Increase MAX_MSG_LEN
mac80211: fix memory accounting with A-MSDU aggregation
nl80211: Add NL80211_FLAG_CLEAR_SKB flag for other NL commands
s390/3270: fix lockdep false positive on view->lock
clocksource/drivers/oxnas: Fix OX820 compatible
mISDN: Check address length before reading address family
s390/pkey: add one more argument space for debug feature entry
x86/reboot, efi: Use EFI reboot for Acer TravelMate X514-51T
KVM: fix spectrev1 gadgets
KVM: x86: avoid misreporting level-triggered irqs as edge-triggered in tracing
tools lib traceevent: Fix missing equality check for strcmp
mm: fix inactive list balancing between NUMA nodes and cgroups
init: initialize jump labels before command line option parsing
selftests: netfilter: check icmp pkttoobig errors are set as related
ipvs: do not schedule icmp errors from tunnels
netfilter: ctnetlink: don't use conntrack/expect object addresses as id
MIPS: perf: ath79: Fix perfcount IRQ assignment
s390: ctcm: fix ctcm_new_device error return code
drm/sun4i: Set device driver data at bind time for use in unbind
selftests/net: correct the return value for run_netsocktests
gpu: ipu-v3: dp: fix CSC handling
drm/imx: don't skip DP channel disable for background plane
spi: Micrel eth switch: declare missing of table
spi: ST ST95HF NFC: declare missing of table
Input: synaptics-rmi4 - fix possible double free
sparc64: Export __node_distance.
sparc64: Make corrupted user stacks more debuggable.
MIPS: VDSO: Reduce VDSO_RANDOMIZE_SIZE to 64MB for 64bit
bcache: correct dirty data statistics
ACPICA: AML interpreter: add region addresses in global list during initialization
IB/rxe: Revise the ib_wr_opcode enum
ima: open a new file instance if no read permissions
KVM: arm/arm64: Ensure only THP is candidate for adjustment
media: cec: make cec_get_edid_spa_location() an inline function
media: cec: integrate cec_validate_phys_addr() in cec-api.c
media: adv7604: when the EDID is cleared, unconfigure CEC as well
media: adv7842: when the EDID is cleared, unconfigure CEC as well
fuse: fix possibly missed wake-up after abort
drm/i915: Disable LP3 watermarks on all SNB machines
media: ov5640: fix wrong binning value in exposure calculation
media: ov5640: fix auto controls values when switching to manual mode
net: don't keep lonely packets forever in the gro hash
tracing/fgraph: Fix set_graph_function from showing interrupts
drm/i915: Downgrade Gen9 Plane WM latency error
scsi: raid_attrs: fix unused variable warning
staging: olpc_dcon: add a missing dependency
net: stmmac: Move debugfs init/exit to ->probe()/->remove()
Btrfs: fix missing delayed iputs on unmount
x86/vdso: Pass --eh-frame-hdr to the linker
mm: introduce mm_[p4d|pud|pmd]_folded
arm64: KVM: Make VHE Stage-2 TLB invalidation operations non-interruptible
powerpc: remove old GCC version checks
leds: pwm: silently error out on EPROBE_DEFER
drm/rockchip: psr: do not dereference encoder before it is null checked.
RDMA/vmw_pvrdma: Return the correct opcode when creating WR
arm64: dts: marvell: armada-ap806: reserve PSCI area
vt: always call notifier with the console lock held
devres: Align data[] to ARCH_KMALLOC_MINALIGN
xtensa: xtfpga.dtsi: fix dtc warnings about SPI
net_sched: fix two more memory leaks in cls_tcindex
gtp: change NET_UDP_TUNNEL dependency to select
ACPICA: Namespace: remove address node from global list after method termination
Input: elan_i2c - add hardware ID for multiple Lenovo laptops
netfilter: nf_tables: warn when expr implements only one of activate/deactivate
drm/rockchip: fix for mailbox read validation.
cifs: fix memory leak in SMB2_read
x86/fpu: Don't export __kernel_fpu_{begin,end}()
net: hns: Fix WARNING when hns modules installed
mm/memory.c: fix modifying of page protection by insert_pfn()
net: fec: manage ahb clock in runtime pm
mlxsw: spectrum_switchdev: Add MDB entries in prepare phase
mlxsw: core: Do not use WQ_MEM_RECLAIM for EMAD workqueue
mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw ordered workqueue
mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw workqueue
NFC: nci: Add some bounds checking in nci_hci_cmd_received()
nfc: nci: Potential off by one in ->pipes[] array
x86/kprobes: Avoid kretprobe recursion bug
cw1200: fix missing unlock on error in cw1200_hw_scan()
mwl8k: Fix rate_idx underflow
rtlwifi: rtl8723ae: Fix missing break in switch statement
Don't jump to compute_result state from check_result state
powerpc/64s: Include cpu header
bonding: fix arp_validate toggling in active-backup mode
bridge: Fix error path for kobject_init_and_add()
dpaa_eth: fix SG frame cleanup
fib_rules: return 0 directly if an exactly same rule exists when NLM_F_EXCL not supplied
ipv4: Fix raw socket lookup for local traffic
net: dsa: Fix error cleanup path in dsa_init_module
net: ethernet: stmmac: dwmac-sun8i: enable support of unicast filtering
net: seeq: fix crash caused by not set dev.parent
net: ucc_geth - fix Oops when changing number of buffers in the ring
packet: Fix error path in packet_init
vlan: disable SIOCSHWTSTAMP in container
vrf: sit mtu should not be updated when vrf netdev is the link
tipc: fix hanging clients using poll with EPOLLOUT flag
drivers/virt/fsl_hypervisor.c: dereferencing error pointers in ioctl
drivers/virt/fsl_hypervisor.c: prevent integer overflow in ioctl
powerpc/powernv/idle: Restore IAMR after idle
powerpc/booke64: set RI in default MSR
s390/speculation: Fix build error caused by bad backport
Linux 4.14.120
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
03a01b78a7
133 changed files with 1372 additions and 464 deletions
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 119
|
||||
SUBLEVEL = 120
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,23 @@
|
|||
method = "smc";
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/*
|
||||
* This area matches the mapping done with a
|
||||
* mainline U-Boot, and should be updated by the
|
||||
* bootloader.
|
||||
*/
|
||||
|
||||
psci-area@4000000 {
|
||||
reg = <0x0 0x4000000 0x0 0x200000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
|
||||
ap806 {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
|
|
|||
|
|
@ -15,13 +15,18 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#include <asm/kvm_hyp.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm)
|
||||
static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm,
|
||||
unsigned long *flags)
|
||||
{
|
||||
u64 val;
|
||||
|
||||
local_irq_save(*flags);
|
||||
|
||||
/*
|
||||
* With VHE enabled, we have HCR_EL2.{E2H,TGE} = {1,1}, and
|
||||
* most TLB operations target EL2/EL0. In order to affect the
|
||||
|
|
@ -36,7 +41,8 @@ static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm)
|
|||
isb();
|
||||
}
|
||||
|
||||
static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm)
|
||||
static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm,
|
||||
unsigned long *flags)
|
||||
{
|
||||
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
||||
isb();
|
||||
|
|
@ -47,7 +53,8 @@ static hyp_alternate_select(__tlb_switch_to_guest,
|
|||
__tlb_switch_to_guest_vhe,
|
||||
ARM64_HAS_VIRT_HOST_EXTN);
|
||||
|
||||
static void __hyp_text __tlb_switch_to_host_vhe(struct kvm *kvm)
|
||||
static void __hyp_text __tlb_switch_to_host_vhe(struct kvm *kvm,
|
||||
unsigned long flags)
|
||||
{
|
||||
/*
|
||||
* We're done with the TLB operation, let's restore the host's
|
||||
|
|
@ -55,9 +62,12 @@ static void __hyp_text __tlb_switch_to_host_vhe(struct kvm *kvm)
|
|||
*/
|
||||
write_sysreg(0, vttbr_el2);
|
||||
write_sysreg(HCR_HOST_VHE_FLAGS, hcr_el2);
|
||||
isb();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static void __hyp_text __tlb_switch_to_host_nvhe(struct kvm *kvm)
|
||||
static void __hyp_text __tlb_switch_to_host_nvhe(struct kvm *kvm,
|
||||
unsigned long flags)
|
||||
{
|
||||
write_sysreg(0, vttbr_el2);
|
||||
}
|
||||
|
|
@ -69,11 +79,13 @@ static hyp_alternate_select(__tlb_switch_to_host,
|
|||
|
||||
void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
dsb(ishst);
|
||||
|
||||
/* Switch to requested VMID */
|
||||
kvm = kern_hyp_va(kvm);
|
||||
__tlb_switch_to_guest()(kvm);
|
||||
__tlb_switch_to_guest()(kvm, &flags);
|
||||
|
||||
/*
|
||||
* We could do so much better if we had the VA as well.
|
||||
|
|
@ -116,36 +128,39 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
|||
if (!has_vhe() && icache_is_vpipt())
|
||||
__flush_icache_all();
|
||||
|
||||
__tlb_switch_to_host()(kvm);
|
||||
__tlb_switch_to_host()(kvm, flags);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
dsb(ishst);
|
||||
|
||||
/* Switch to requested VMID */
|
||||
kvm = kern_hyp_va(kvm);
|
||||
__tlb_switch_to_guest()(kvm);
|
||||
__tlb_switch_to_guest()(kvm, &flags);
|
||||
|
||||
__tlbi(vmalls12e1is);
|
||||
dsb(ish);
|
||||
isb();
|
||||
|
||||
__tlb_switch_to_host()(kvm);
|
||||
__tlb_switch_to_host()(kvm, flags);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||
unsigned long flags;
|
||||
|
||||
/* Switch to requested VMID */
|
||||
__tlb_switch_to_guest()(kvm);
|
||||
__tlb_switch_to_guest()(kvm, &flags);
|
||||
|
||||
__tlbi(vmalle1);
|
||||
dsb(nsh);
|
||||
isb();
|
||||
|
||||
__tlb_switch_to_host()(kvm);
|
||||
__tlb_switch_to_host()(kvm, flags);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_flush_vm_context(void)
|
||||
|
|
|
|||
|
|
@ -183,12 +183,6 @@ const char *get_system_type(void)
|
|||
return ath79_sys_type;
|
||||
}
|
||||
|
||||
int get_c0_perfcount_int(void)
|
||||
{
|
||||
return ATH79_MISC_IRQ(5);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
|
||||
|
||||
unsigned int get_c0_compare_int(void)
|
||||
{
|
||||
return CP0_LEGACY_COMPARE_IRQ;
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ extern unsigned int vced_count, vcei_count;
|
|||
|
||||
#endif
|
||||
|
||||
#define VDSO_RANDOMIZE_SIZE (TASK_IS_32BIT_ADDR ? SZ_1M : SZ_256M)
|
||||
#define VDSO_RANDOMIZE_SIZE (TASK_IS_32BIT_ADDR ? SZ_1M : SZ_64M)
|
||||
|
||||
extern unsigned long mips_stack_top(void);
|
||||
#define STACK_TOP mips_stack_top()
|
||||
|
|
|
|||
|
|
@ -396,36 +396,9 @@ archprepare: checkbin
|
|||
# to stdout and these checks are run even on install targets.
|
||||
TOUT := .tmp_gas_check
|
||||
|
||||
# Check gcc and binutils versions:
|
||||
# - gcc-3.4 and binutils-2.14 are a fatal combination
|
||||
# - Require gcc 4.0 or above on 64-bit
|
||||
# - gcc-4.2.0 has issues compiling modules on 64-bit
|
||||
# Check toolchain versions:
|
||||
# - gcc-4.6 is the minimum kernel-wide version so nothing required.
|
||||
checkbin:
|
||||
@if test "$(cc-name)" != "clang" \
|
||||
&& test "$(cc-version)" = "0304" ; then \
|
||||
if ! /bin/echo mftb 5 | $(AS) -v -mppc -many -o $(TOUT) >/dev/null 2>&1 ; then \
|
||||
echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build '; \
|
||||
echo 'correctly with gcc-3.4 and your version of binutils.'; \
|
||||
echo '*** Please upgrade your binutils or downgrade your gcc'; \
|
||||
false; \
|
||||
fi ; \
|
||||
fi
|
||||
@if test "$(cc-name)" != "clang" \
|
||||
&& test "$(cc-version)" -lt "0400" \
|
||||
&& test "x${CONFIG_PPC64}" = "xy" ; then \
|
||||
echo -n "Sorry, GCC v4.0 or above is required to build " ; \
|
||||
echo "the 64-bit powerpc kernel." ; \
|
||||
false ; \
|
||||
fi
|
||||
@if test "$(cc-name)" != "clang" \
|
||||
&& test "$(cc-fullversion)" = "040200" \
|
||||
&& test "x${CONFIG_MODULES}${CONFIG_PPC64}" = "xyy" ; then \
|
||||
echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \
|
||||
echo 'kernel with modules enabled.' ; \
|
||||
echo -n '*** Please use a different GCC version or ' ; \
|
||||
echo 'disable kernel modules' ; \
|
||||
false ; \
|
||||
fi
|
||||
@if test "x${CONFIG_CPU_LITTLE_ENDIAN}" = "xy" \
|
||||
&& $(LD) --version | head -1 | grep ' 2\.24$$' >/dev/null ; then \
|
||||
echo -n '*** binutils 2.24 miscompiles weak symbols ' ; \
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
#if defined(CONFIG_PPC_BOOK3E_64)
|
||||
#define MSR_64BIT MSR_CM
|
||||
|
||||
#define MSR_ (MSR_ME | MSR_CE)
|
||||
#define MSR_ (MSR_ME | MSR_RI | MSR_CE)
|
||||
#define MSR_KERNEL (MSR_ | MSR_64BIT)
|
||||
#define MSR_USER32 (MSR_ | MSR_PR | MSR_EE)
|
||||
#define MSR_USER64 (MSR_USER32 | MSR_64BIT)
|
||||
|
|
|
|||
|
|
@ -163,6 +163,9 @@ core_idle_lock_held:
|
|||
bne- core_idle_lock_held
|
||||
blr
|
||||
|
||||
/* Reuse an unused pt_regs slot for IAMR */
|
||||
#define PNV_POWERSAVE_IAMR _DAR
|
||||
|
||||
/*
|
||||
* Pass requested state in r3:
|
||||
* r3 - PNV_THREAD_NAP/SLEEP/WINKLE in POWER8
|
||||
|
|
@ -193,6 +196,12 @@ pnv_powersave_common:
|
|||
/* Continue saving state */
|
||||
SAVE_GPR(2, r1)
|
||||
SAVE_NVGPRS(r1)
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
mfspr r5, SPRN_IAMR
|
||||
std r5, PNV_POWERSAVE_IAMR(r1)
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||
|
||||
mfcr r5
|
||||
std r5,_CCR(r1)
|
||||
std r1,PACAR1(r13)
|
||||
|
|
@ -940,6 +949,17 @@ BEGIN_FTR_SECTION
|
|||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
REST_NVGPRS(r1)
|
||||
REST_GPR(2, r1)
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
/* IAMR was saved in pnv_powersave_common() */
|
||||
ld r5, PNV_POWERSAVE_IAMR(r1)
|
||||
mtspr SPRN_IAMR, r5
|
||||
/*
|
||||
* We don't need an isync here because the upcoming mtmsrd is
|
||||
* execution synchronizing.
|
||||
*/
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||
|
||||
ld r4,PACAKMSR(r13)
|
||||
ld r5,_LINK(r1)
|
||||
ld r6,_CCR(r1)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
//
|
||||
// Copyright 2018, Michael Ellerman, IBM Corporation.
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/seq_buf.h>
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ void __init nospec_auto_detect(void)
|
|||
if (IS_ENABLED(CC_USING_EXPOLINE))
|
||||
nospec_disable = 1;
|
||||
__clear_facility(82, S390_lowcore.alt_stfle_fac_list);
|
||||
}
|
||||
if (IS_ENABLED(CC_USING_EXPOLINE)) {
|
||||
/*
|
||||
* The kernel has been compiled with expolines.
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ do { save_and_clear_fpu(); \
|
|||
} while(0)
|
||||
|
||||
void synchronize_user_stack(void);
|
||||
void fault_in_user_windows(void);
|
||||
struct pt_regs;
|
||||
void fault_in_user_windows(struct pt_regs *);
|
||||
|
||||
#endif /* __SPARC64_SWITCH_TO_64_H */
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/sysrq.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/context_tracking.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
|
|
@ -528,7 +529,12 @@ static void stack_unaligned(unsigned long sp)
|
|||
force_sig_info(SIGBUS, &info, current);
|
||||
}
|
||||
|
||||
void fault_in_user_windows(void)
|
||||
static const char uwfault32[] = KERN_INFO \
|
||||
"%s[%d]: bad register window fault: SP %08lx (orig_sp %08lx) TPC %08lx O7 %08lx\n";
|
||||
static const char uwfault64[] = KERN_INFO \
|
||||
"%s[%d]: bad register window fault: SP %016lx (orig_sp %016lx) TPC %08lx O7 %016lx\n";
|
||||
|
||||
void fault_in_user_windows(struct pt_regs *regs)
|
||||
{
|
||||
struct thread_info *t = current_thread_info();
|
||||
unsigned long window;
|
||||
|
|
@ -541,9 +547,9 @@ void fault_in_user_windows(void)
|
|||
do {
|
||||
struct reg_window *rwin = &t->reg_window[window];
|
||||
int winsize = sizeof(struct reg_window);
|
||||
unsigned long sp;
|
||||
unsigned long sp, orig_sp;
|
||||
|
||||
sp = t->rwbuf_stkptrs[window];
|
||||
orig_sp = sp = t->rwbuf_stkptrs[window];
|
||||
|
||||
if (test_thread_64bit_stack(sp))
|
||||
sp += STACK_BIAS;
|
||||
|
|
@ -554,8 +560,16 @@ void fault_in_user_windows(void)
|
|||
stack_unaligned(sp);
|
||||
|
||||
if (unlikely(copy_to_user((char __user *)sp,
|
||||
rwin, winsize)))
|
||||
rwin, winsize))) {
|
||||
if (show_unhandled_signals)
|
||||
printk_ratelimited(is_compat_task() ?
|
||||
uwfault32 : uwfault64,
|
||||
current->comm, current->pid,
|
||||
sp, orig_sp,
|
||||
regs->tpc,
|
||||
regs->u_regs[UREG_I7]);
|
||||
goto barf;
|
||||
}
|
||||
} while (window--);
|
||||
}
|
||||
set_thread_wsaved(0);
|
||||
|
|
@ -563,8 +577,7 @@ void fault_in_user_windows(void)
|
|||
|
||||
barf:
|
||||
set_thread_wsaved(window + 1);
|
||||
user_exit();
|
||||
do_exit(SIGILL);
|
||||
force_sig(SIGSEGV, current);
|
||||
}
|
||||
|
||||
asmlinkage long sparc_do_fork(unsigned long clone_flags,
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ __handle_preemption:
|
|||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||
|
||||
__handle_user_windows:
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
call fault_in_user_windows
|
||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||
ba,pt %xcc, __handle_preemption_continue
|
||||
|
|
|
|||
|
|
@ -442,7 +442,11 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
|
|||
get_sigframe(ksig, regs, sigframe_size);
|
||||
|
||||
if (invalid_frame_pointer(sf, sigframe_size)) {
|
||||
do_exit(SIGILL);
|
||||
if (show_unhandled_signals)
|
||||
pr_info("%s[%d] bad frame in setup_frame32: %08lx TPC %08lx O7 %08lx\n",
|
||||
current->comm, current->pid, (unsigned long)sf,
|
||||
regs->tpc, regs->u_regs[UREG_I7]);
|
||||
force_sigsegv(ksig->sig, current);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -573,7 +577,11 @@ static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
|
|||
get_sigframe(ksig, regs, sigframe_size);
|
||||
|
||||
if (invalid_frame_pointer(sf, sigframe_size)) {
|
||||
do_exit(SIGILL);
|
||||
if (show_unhandled_signals)
|
||||
pr_info("%s[%d] bad frame in setup_rt_frame32: %08lx TPC %08lx O7 %08lx\n",
|
||||
current->comm, current->pid, (unsigned long)sf,
|
||||
regs->tpc, regs->u_regs[UREG_I7]);
|
||||
force_sigsegv(ksig->sig, current);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -373,7 +373,11 @@ setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
|
|||
get_sigframe(ksig, regs, sf_size);
|
||||
|
||||
if (invalid_frame_pointer (sf)) {
|
||||
do_exit(SIGILL); /* won't return, actually */
|
||||
if (show_unhandled_signals)
|
||||
pr_info("%s[%d] bad frame in setup_rt_frame: %016lx TPC %016lx O7 %016lx\n",
|
||||
current->comm, current->pid, (unsigned long)sf,
|
||||
regs->tpc, regs->u_regs[UREG_I7]);
|
||||
force_sigsegv(ksig->sig, current);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1383,6 +1383,7 @@ int __node_distance(int from, int to)
|
|||
}
|
||||
return numa_latency[from][to];
|
||||
}
|
||||
EXPORT_SYMBOL(__node_distance);
|
||||
|
||||
static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -182,7 +182,8 @@ quiet_cmd_vdso = VDSO $@
|
|||
sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
|
||||
|
||||
VDSO_LDFLAGS = -shared $(call ld-option, --hash-style=both) \
|
||||
$(call ld-option, --build-id) -Bsymbolic
|
||||
$(call ld-option, --build-id) $(call ld-option, --eh-frame-hdr) \
|
||||
-Bsymbolic
|
||||
GCOV_PROFILE := n
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -82,8 +82,7 @@ struct efi_scratch {
|
|||
#define arch_efi_call_virt_setup() \
|
||||
({ \
|
||||
efi_sync_low_kernel_mappings(); \
|
||||
preempt_disable(); \
|
||||
__kernel_fpu_begin(); \
|
||||
kernel_fpu_begin(); \
|
||||
firmware_restrict_branch_speculation_start(); \
|
||||
\
|
||||
if (efi_scratch.use_pgd) { \
|
||||
|
|
@ -104,8 +103,7 @@ struct efi_scratch {
|
|||
} \
|
||||
\
|
||||
firmware_restrict_branch_speculation_end(); \
|
||||
__kernel_fpu_end(); \
|
||||
preempt_enable(); \
|
||||
kernel_fpu_end(); \
|
||||
})
|
||||
|
||||
extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
|
||||
|
|
|
|||
|
|
@ -12,17 +12,12 @@
|
|||
#define _ASM_X86_FPU_API_H
|
||||
|
||||
/*
|
||||
* Careful: __kernel_fpu_begin/end() must be called with preempt disabled
|
||||
* and they don't touch the preempt state on their own.
|
||||
* If you enable preemption after __kernel_fpu_begin(), preempt notifier
|
||||
* should call the __kernel_fpu_end() to prevent the kernel/user FPU
|
||||
* state from getting corrupted. KVM for example uses this model.
|
||||
*
|
||||
* All other cases use kernel_fpu_begin/end() which disable preemption
|
||||
* during kernel FPU usage.
|
||||
* Use kernel_fpu_begin/end() if you intend to use FPU in kernel context. It
|
||||
* disables preemption so be careful if you intend to use it for long periods
|
||||
* of time.
|
||||
* If you intend to use the FPU in softirq you need to check first with
|
||||
* irq_fpu_usable() if it is possible.
|
||||
*/
|
||||
extern void __kernel_fpu_begin(void);
|
||||
extern void __kernel_fpu_end(void);
|
||||
extern void kernel_fpu_begin(void);
|
||||
extern void kernel_fpu_end(void);
|
||||
extern bool irq_fpu_usable(void);
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ bool irq_fpu_usable(void)
|
|||
}
|
||||
EXPORT_SYMBOL(irq_fpu_usable);
|
||||
|
||||
void __kernel_fpu_begin(void)
|
||||
static void __kernel_fpu_begin(void)
|
||||
{
|
||||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
|
||||
|
|
@ -111,9 +111,8 @@ void __kernel_fpu_begin(void)
|
|||
__cpu_invalidate_fpregs_state();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(__kernel_fpu_begin);
|
||||
|
||||
void __kernel_fpu_end(void)
|
||||
static void __kernel_fpu_end(void)
|
||||
{
|
||||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
|
||||
|
|
@ -122,7 +121,6 @@ void __kernel_fpu_end(void)
|
|||
|
||||
kernel_fpu_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__kernel_fpu_end);
|
||||
|
||||
void kernel_fpu_begin(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -744,11 +744,16 @@ asm(
|
|||
NOKPROBE_SYMBOL(kretprobe_trampoline);
|
||||
STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
|
||||
|
||||
static struct kprobe kretprobe_kprobe = {
|
||||
.addr = (void *)kretprobe_trampoline,
|
||||
};
|
||||
|
||||
/*
|
||||
* Called from kretprobe_trampoline
|
||||
*/
|
||||
__visible __used void *trampoline_handler(struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb;
|
||||
struct kretprobe_instance *ri = NULL;
|
||||
struct hlist_head *head, empty_rp;
|
||||
struct hlist_node *tmp;
|
||||
|
|
@ -758,6 +763,17 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
void *frame_pointer;
|
||||
bool skipped = false;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
/*
|
||||
* Set a dummy kprobe for avoiding kretprobe recursion.
|
||||
* Since kretprobe never run in kprobe handler, kprobe must not
|
||||
* be running at this point.
|
||||
*/
|
||||
kcb = get_kprobe_ctlblk();
|
||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
|
||||
INIT_HLIST_HEAD(&empty_rp);
|
||||
kretprobe_hash_lock(current, &head, &flags);
|
||||
/* fixup registers */
|
||||
|
|
@ -833,10 +849,9 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
orig_ret_address = (unsigned long)ri->ret_addr;
|
||||
if (ri->rp && ri->rp->handler) {
|
||||
__this_cpu_write(current_kprobe, &ri->rp->kp);
|
||||
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
ri->ret_addr = correct_ret_addr;
|
||||
ri->rp->handler(ri, regs);
|
||||
__this_cpu_write(current_kprobe, NULL);
|
||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
||||
}
|
||||
|
||||
recycle_rp_inst(ri, &empty_rp);
|
||||
|
|
@ -852,6 +867,9 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
|
||||
kretprobe_hash_unlock(current, &flags);
|
||||
|
||||
__this_cpu_write(current_kprobe, NULL);
|
||||
preempt_enable();
|
||||
|
||||
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
|
||||
hlist_del(&ri->hlist);
|
||||
kfree(ri);
|
||||
|
|
|
|||
|
|
@ -81,6 +81,19 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines don't handle the default ACPI reboot method and
|
||||
* require the EFI reboot method:
|
||||
*/
|
||||
static int __init set_efi_reboot(const struct dmi_system_id *d)
|
||||
{
|
||||
if (reboot_type != BOOT_EFI && !efi_runtime_disabled()) {
|
||||
reboot_type = BOOT_EFI;
|
||||
pr_info("%s series board detected. Selecting EFI-method for reboot.\n", d->ident);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __noreturn machine_real_restart(unsigned int type)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
|
@ -166,6 +179,14 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
|
||||
},
|
||||
},
|
||||
{ /* Handle reboot issue on Acer TravelMate X514-51T */
|
||||
.callback = set_efi_reboot,
|
||||
.ident = "Acer TravelMate X514-51T",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate X514-51T"),
|
||||
},
|
||||
},
|
||||
|
||||
/* Apple */
|
||||
{ /* Handle problems with rebooting on Apple MacBook5 */
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
|
|||
if (offset <= max_apic_id) {
|
||||
u8 cluster_size = min(max_apic_id - offset + 1, 16U);
|
||||
|
||||
offset = array_index_nospec(offset, map->max_apic_id + 1);
|
||||
*cluster = &map->phys_map[offset];
|
||||
*mask = dest_id & (0xffff >> (16 - cluster_size));
|
||||
} else {
|
||||
|
|
@ -829,7 +830,8 @@ static inline bool kvm_apic_map_get_dest_lapic(struct kvm *kvm,
|
|||
if (irq->dest_id > map->max_apic_id) {
|
||||
*bitmap = 0;
|
||||
} else {
|
||||
*dst = &map->phys_map[irq->dest_id];
|
||||
u32 dest_id = array_index_nospec(irq->dest_id, map->max_apic_id + 1);
|
||||
*dst = &map->phys_map[dest_id];
|
||||
*bitmap = 1;
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -438,13 +438,13 @@ TRACE_EVENT(kvm_apic_ipi,
|
|||
);
|
||||
|
||||
TRACE_EVENT(kvm_apic_accept_irq,
|
||||
TP_PROTO(__u32 apicid, __u16 dm, __u8 tm, __u8 vec),
|
||||
TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
|
||||
TP_ARGS(apicid, dm, tm, vec),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( __u32, apicid )
|
||||
__field( __u16, dm )
|
||||
__field( __u8, tm )
|
||||
__field( __u16, tm )
|
||||
__field( __u8, vec )
|
||||
),
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
spi0: spi-master@0d0a0000 {
|
||||
spi0: spi@0d0a0000 {
|
||||
compatible = "cdns,xtfpga-spi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
|
|||
|
|
@ -451,6 +451,10 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
|
|||
ACPI_FORMAT_UINT64(obj_desc->region.address),
|
||||
obj_desc->region.length));
|
||||
|
||||
status = acpi_ut_add_address_range(obj_desc->region.space_id,
|
||||
obj_desc->region.address,
|
||||
obj_desc->region.length, node);
|
||||
|
||||
/* Now the address and length are valid for this opregion */
|
||||
|
||||
obj_desc->region.flags |= AOPOBJ_DATA_VALID;
|
||||
|
|
|
|||
|
|
@ -222,6 +222,10 @@ void acpi_ns_detach_object(struct acpi_namespace_node *node)
|
|||
}
|
||||
}
|
||||
|
||||
if (obj_desc->common.type == ACPI_TYPE_REGION) {
|
||||
acpi_ut_remove_address_range(obj_desc->region.space_id, node);
|
||||
}
|
||||
|
||||
/* Clear the Node entry in all cases */
|
||||
|
||||
node->object = NULL;
|
||||
|
|
|
|||
|
|
@ -25,8 +25,14 @@ struct devres_node {
|
|||
|
||||
struct devres {
|
||||
struct devres_node node;
|
||||
/* -- 3 pointers */
|
||||
unsigned long long data[]; /* guarantee ull alignment */
|
||||
/*
|
||||
* Some archs want to perform DMA into kmalloc caches
|
||||
* and need a guaranteed alignment larger than
|
||||
* the alignment of a 64-bit integer.
|
||||
* Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
|
||||
* buffer alignment as if it was allocated by plain kmalloc().
|
||||
*/
|
||||
u8 __aligned(ARCH_KMALLOC_MINALIGN) data[];
|
||||
};
|
||||
|
||||
struct devres_group {
|
||||
|
|
|
|||
|
|
@ -296,4 +296,4 @@ err_alloc:
|
|||
TIMER_OF_DECLARE(ox810se_rps,
|
||||
"oxsemi,ox810se-rps-timer", oxnas_rps_timer_init);
|
||||
TIMER_OF_DECLARE(ox820_rps,
|
||||
"oxsemi,ox820se-rps-timer", oxnas_rps_timer_init);
|
||||
"oxsemi,ox820-rps-timer", oxnas_rps_timer_init);
|
||||
|
|
|
|||
|
|
@ -2471,6 +2471,9 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
|
|||
uint32_t method1, method2;
|
||||
int cpp;
|
||||
|
||||
if (mem_value == 0)
|
||||
return U32_MAX;
|
||||
|
||||
if (!intel_wm_plane_visible(cstate, pstate))
|
||||
return 0;
|
||||
|
||||
|
|
@ -2500,6 +2503,9 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
|
|||
uint32_t method1, method2;
|
||||
int cpp;
|
||||
|
||||
if (mem_value == 0)
|
||||
return U32_MAX;
|
||||
|
||||
if (!intel_wm_plane_visible(cstate, pstate))
|
||||
return 0;
|
||||
|
||||
|
|
@ -2523,6 +2529,9 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
|
|||
{
|
||||
int cpp;
|
||||
|
||||
if (mem_value == 0)
|
||||
return U32_MAX;
|
||||
|
||||
if (!intel_wm_plane_visible(cstate, pstate))
|
||||
return 0;
|
||||
|
||||
|
|
@ -2925,8 +2934,8 @@ static void intel_print_wm_latency(struct drm_i915_private *dev_priv,
|
|||
unsigned int latency = wm[level];
|
||||
|
||||
if (latency == 0) {
|
||||
DRM_ERROR("%s WM%d latency not provided\n",
|
||||
name, level);
|
||||
DRM_DEBUG_KMS("%s WM%d latency not provided\n",
|
||||
name, level);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -2981,6 +2990,34 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv)
|
|||
intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
||||
}
|
||||
|
||||
static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
/*
|
||||
* On some SNB machines (Thinkpad X220 Tablet at least)
|
||||
* LP3 usage can cause vblank interrupts to be lost.
|
||||
* The DEIIR bit will go high but it looks like the CPU
|
||||
* never gets interrupted.
|
||||
*
|
||||
* It's not clear whether other interrupt source could
|
||||
* be affected or if this is somehow limited to vblank
|
||||
* interrupts only. To play it safe we disable LP3
|
||||
* watermarks entirely.
|
||||
*/
|
||||
if (dev_priv->wm.pri_latency[3] == 0 &&
|
||||
dev_priv->wm.spr_latency[3] == 0 &&
|
||||
dev_priv->wm.cur_latency[3] == 0)
|
||||
return;
|
||||
|
||||
dev_priv->wm.pri_latency[3] = 0;
|
||||
dev_priv->wm.spr_latency[3] = 0;
|
||||
dev_priv->wm.cur_latency[3] = 0;
|
||||
|
||||
DRM_DEBUG_KMS("LP3 watermarks disabled due to potential for lost interrupts\n");
|
||||
intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency);
|
||||
intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
|
||||
intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
||||
}
|
||||
|
||||
static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency);
|
||||
|
|
@ -2997,8 +3034,10 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
|
|||
intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
|
||||
intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
||||
|
||||
if (IS_GEN6(dev_priv))
|
||||
if (IS_GEN6(dev_priv)) {
|
||||
snb_wm_latency_quirk(dev_priv);
|
||||
snb_wm_lp3_irq_quirk(dev_priv);
|
||||
}
|
||||
}
|
||||
|
||||
static void skl_setup_wm_latency(struct drm_i915_private *dev_priv)
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ static void ipu_crtc_disable_planes(struct ipu_crtc *ipu_crtc,
|
|||
if (disable_partial)
|
||||
ipu_plane_disable(ipu_crtc->plane[1], true);
|
||||
if (disable_full)
|
||||
ipu_plane_disable(ipu_crtc->plane[0], false);
|
||||
ipu_plane_disable(ipu_crtc->plane[0], true);
|
||||
}
|
||||
|
||||
static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ static int cdp_dp_mailbox_write(struct cdn_dp_device *dp, u8 val)
|
|||
|
||||
static int cdn_dp_mailbox_validate_receive(struct cdn_dp_device *dp,
|
||||
u8 module_id, u8 opcode,
|
||||
u8 req_size)
|
||||
u16 req_size)
|
||||
{
|
||||
u32 mbox_size, i;
|
||||
u8 header[4];
|
||||
|
|
|
|||
|
|
@ -221,13 +221,15 @@ EXPORT_SYMBOL(rockchip_drm_psr_flush_all);
|
|||
int rockchip_drm_psr_register(struct drm_encoder *encoder,
|
||||
void (*psr_set)(struct drm_encoder *, bool enable))
|
||||
{
|
||||
struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
|
||||
struct rockchip_drm_private *drm_drv;
|
||||
struct psr_drv *psr;
|
||||
unsigned long flags;
|
||||
|
||||
if (!encoder || !psr_set)
|
||||
return -EINVAL;
|
||||
|
||||
drm_drv = encoder->dev->dev_private;
|
||||
|
||||
psr = kzalloc(sizeof(struct psr_drv), GFP_KERNEL);
|
||||
if (!psr)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -96,6 +96,8 @@ static int sun4i_drv_bind(struct device *dev)
|
|||
ret = -ENOMEM;
|
||||
goto free_drm;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, drm);
|
||||
drm->dev_private = drv;
|
||||
INIT_LIST_HEAD(&drv->engine_list);
|
||||
INIT_LIST_HEAD(&drv->tcon_list);
|
||||
|
|
|
|||
|
|
@ -195,7 +195,8 @@ int ipu_dp_setup_channel(struct ipu_dp *dp,
|
|||
ipu_dp_csc_init(flow, flow->foreground.in_cs, flow->out_cs,
|
||||
DP_COM_CONF_CSC_DEF_BOTH);
|
||||
} else {
|
||||
if (flow->foreground.in_cs == flow->out_cs)
|
||||
if (flow->foreground.in_cs == IPUV3_COLORSPACE_UNKNOWN ||
|
||||
flow->foreground.in_cs == flow->out_cs)
|
||||
/*
|
||||
* foreground identical to output, apply color
|
||||
* conversion on background
|
||||
|
|
@ -261,6 +262,8 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
|||
struct ipu_dp_priv *priv = flow->priv;
|
||||
u32 reg, csc;
|
||||
|
||||
dp->in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
|
||||
if (!dp->foreground)
|
||||
return;
|
||||
|
||||
|
|
@ -268,8 +271,9 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
|||
|
||||
reg = readl(flow->base + DP_COM_CONF);
|
||||
csc = reg & DP_COM_CONF_CSC_DEF_MASK;
|
||||
if (csc == DP_COM_CONF_CSC_DEF_FG)
|
||||
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
||||
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
||||
if (csc == DP_COM_CONF_CSC_DEF_BOTH || csc == DP_COM_CONF_CSC_DEF_BG)
|
||||
reg |= DP_COM_CONF_CSC_DEF_BG;
|
||||
|
||||
reg &= ~DP_COM_CONF_FG_EN;
|
||||
writel(reg, flow->base + DP_COM_CONF);
|
||||
|
|
@ -347,6 +351,8 @@ int ipu_dp_init(struct ipu_soc *ipu, struct device *dev, unsigned long base)
|
|||
mutex_init(&priv->mutex);
|
||||
|
||||
for (i = 0; i < IPUV3_NUM_FLOWS; i++) {
|
||||
priv->flow[i].background.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
priv->flow[i].foreground.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||
priv->flow[i].foreground.foreground = true;
|
||||
priv->flow[i].base = priv->base + ipu_dp_flow_base[i];
|
||||
priv->flow[i].priv = priv;
|
||||
|
|
|
|||
|
|
@ -677,6 +677,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
break;
|
||||
}
|
||||
|
||||
if ((usage->hid & 0xf0) == 0xb0) { /* SC - Display */
|
||||
switch (usage->hid & 0xf) {
|
||||
case 0x05: map_key_clear(KEY_SWITCHVIDEOMODE); break;
|
||||
default: goto ignore;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some lazy vendors declare 255 usages for System Control,
|
||||
* leading to the creation of ABS_X|Y axis and too many others.
|
||||
|
|
@ -886,6 +894,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX); break;
|
||||
case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO); break;
|
||||
|
||||
case 0x079: map_key_clear(KEY_KBDILLUMUP); break;
|
||||
case 0x07a: map_key_clear(KEY_KBDILLUMDOWN); break;
|
||||
case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE); break;
|
||||
|
||||
case 0x082: map_key_clear(KEY_VIDEO_NEXT); break;
|
||||
case 0x083: map_key_clear(KEY_LAST); break;
|
||||
case 0x084: map_key_clear(KEY_ENTER); break;
|
||||
|
|
@ -1017,6 +1029,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT); break;
|
||||
case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL); break;
|
||||
|
||||
case 0x29f: map_key_clear(KEY_SCALE); break;
|
||||
|
||||
default: map_key_clear(KEY_UNKNOWN);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
|||
|
||||
ret = pwm_fan_of_get_cooling_data(&pdev->dev, ctx);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_pwm_disable;
|
||||
|
||||
ctx->pwm_fan_state = ctx->pwm_fan_max_state;
|
||||
if (IS_ENABLED(CONFIG_THERMAL)) {
|
||||
|
|
|
|||
|
|
@ -1302,7 +1302,7 @@ static int xadc_remove(struct platform_device *pdev)
|
|||
}
|
||||
free_irq(irq, indio_dev);
|
||||
clk_disable_unprepare(xadc->clk);
|
||||
cancel_delayed_work(&xadc->zynq_unmask_work);
|
||||
cancel_delayed_work_sync(&xadc->zynq_unmask_work);
|
||||
kfree(xadc->data);
|
||||
kfree(indio_dev->channels);
|
||||
|
||||
|
|
|
|||
|
|
@ -407,7 +407,40 @@ static inline enum ib_qp_state pvrdma_qp_state_to_ib(enum pvrdma_qp_state state)
|
|||
|
||||
static inline enum pvrdma_wr_opcode ib_wr_opcode_to_pvrdma(enum ib_wr_opcode op)
|
||||
{
|
||||
return (enum pvrdma_wr_opcode)op;
|
||||
switch (op) {
|
||||
case IB_WR_RDMA_WRITE:
|
||||
return PVRDMA_WR_RDMA_WRITE;
|
||||
case IB_WR_RDMA_WRITE_WITH_IMM:
|
||||
return PVRDMA_WR_RDMA_WRITE_WITH_IMM;
|
||||
case IB_WR_SEND:
|
||||
return PVRDMA_WR_SEND;
|
||||
case IB_WR_SEND_WITH_IMM:
|
||||
return PVRDMA_WR_SEND_WITH_IMM;
|
||||
case IB_WR_RDMA_READ:
|
||||
return PVRDMA_WR_RDMA_READ;
|
||||
case IB_WR_ATOMIC_CMP_AND_SWP:
|
||||
return PVRDMA_WR_ATOMIC_CMP_AND_SWP;
|
||||
case IB_WR_ATOMIC_FETCH_AND_ADD:
|
||||
return PVRDMA_WR_ATOMIC_FETCH_AND_ADD;
|
||||
case IB_WR_LSO:
|
||||
return PVRDMA_WR_LSO;
|
||||
case IB_WR_SEND_WITH_INV:
|
||||
return PVRDMA_WR_SEND_WITH_INV;
|
||||
case IB_WR_RDMA_READ_WITH_INV:
|
||||
return PVRDMA_WR_RDMA_READ_WITH_INV;
|
||||
case IB_WR_LOCAL_INV:
|
||||
return PVRDMA_WR_LOCAL_INV;
|
||||
case IB_WR_REG_MR:
|
||||
return PVRDMA_WR_FAST_REG_MR;
|
||||
case IB_WR_MASKED_ATOMIC_CMP_AND_SWP:
|
||||
return PVRDMA_WR_MASKED_ATOMIC_CMP_AND_SWP;
|
||||
case IB_WR_MASKED_ATOMIC_FETCH_AND_ADD:
|
||||
return PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD;
|
||||
case IB_WR_REG_SIG_MR:
|
||||
return PVRDMA_WR_REG_SIG_MR;
|
||||
default:
|
||||
return PVRDMA_WR_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static inline enum ib_wc_status pvrdma_wc_status_to_ib(
|
||||
|
|
|
|||
|
|
@ -695,6 +695,12 @@ int pvrdma_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|||
wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM)
|
||||
wqe_hdr->ex.imm_data = wr->ex.imm_data;
|
||||
|
||||
if (unlikely(wqe_hdr->opcode == PVRDMA_WR_ERROR)) {
|
||||
*bad_wr = wr;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (qp->ibqp.qp_type) {
|
||||
case IB_QPT_GSI:
|
||||
case IB_QPT_UD:
|
||||
|
|
|
|||
|
|
@ -1254,22 +1254,47 @@ static const struct acpi_device_id elan_acpi_id[] = {
|
|||
{ "ELAN0600", 0 },
|
||||
{ "ELAN0601", 0 },
|
||||
{ "ELAN0602", 0 },
|
||||
{ "ELAN0603", 0 },
|
||||
{ "ELAN0604", 0 },
|
||||
{ "ELAN0605", 0 },
|
||||
{ "ELAN0606", 0 },
|
||||
{ "ELAN0607", 0 },
|
||||
{ "ELAN0608", 0 },
|
||||
{ "ELAN0605", 0 },
|
||||
{ "ELAN0609", 0 },
|
||||
{ "ELAN060B", 0 },
|
||||
{ "ELAN060C", 0 },
|
||||
{ "ELAN060F", 0 },
|
||||
{ "ELAN0610", 0 },
|
||||
{ "ELAN0611", 0 },
|
||||
{ "ELAN0612", 0 },
|
||||
{ "ELAN0615", 0 },
|
||||
{ "ELAN0616", 0 },
|
||||
{ "ELAN0617", 0 },
|
||||
{ "ELAN0618", 0 },
|
||||
{ "ELAN0619", 0 },
|
||||
{ "ELAN061A", 0 },
|
||||
{ "ELAN061B", 0 },
|
||||
{ "ELAN061C", 0 },
|
||||
{ "ELAN061D", 0 },
|
||||
{ "ELAN061E", 0 },
|
||||
{ "ELAN061F", 0 },
|
||||
{ "ELAN0620", 0 },
|
||||
{ "ELAN0621", 0 },
|
||||
{ "ELAN0622", 0 },
|
||||
{ "ELAN0623", 0 },
|
||||
{ "ELAN0624", 0 },
|
||||
{ "ELAN0625", 0 },
|
||||
{ "ELAN0626", 0 },
|
||||
{ "ELAN0627", 0 },
|
||||
{ "ELAN0628", 0 },
|
||||
{ "ELAN0629", 0 },
|
||||
{ "ELAN062A", 0 },
|
||||
{ "ELAN062B", 0 },
|
||||
{ "ELAN062C", 0 },
|
||||
{ "ELAN062D", 0 },
|
||||
{ "ELAN0631", 0 },
|
||||
{ "ELAN0632", 0 },
|
||||
{ "ELAN1000", 0 },
|
||||
{ }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -883,7 +883,7 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
|
|||
|
||||
error = rmi_register_function(fn);
|
||||
if (error)
|
||||
goto err_put_fn;
|
||||
return error;
|
||||
|
||||
if (pdt->function_number == 0x01)
|
||||
data->f01_container = fn;
|
||||
|
|
@ -893,10 +893,6 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
|
|||
list_add_tail(&fn->node, &data->function_list);
|
||||
|
||||
return RMI_SCAN_CONTINUE;
|
||||
|
||||
err_put_fn:
|
||||
put_device(&fn->dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake)
|
||||
|
|
|
|||
|
|
@ -22,6 +22,15 @@
|
|||
#define AR71XX_RESET_REG_MISC_INT_ENABLE 4
|
||||
|
||||
#define ATH79_MISC_IRQ_COUNT 32
|
||||
#define ATH79_MISC_PERF_IRQ 5
|
||||
|
||||
static int ath79_perfcount_irq;
|
||||
|
||||
int get_c0_perfcount_int(void)
|
||||
{
|
||||
return ath79_perfcount_irq;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
|
||||
|
||||
static void ath79_misc_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
|
|
@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domain_init(
|
|||
{
|
||||
void __iomem *base = domain->host_data;
|
||||
|
||||
ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ);
|
||||
|
||||
/* Disable and clear all interrupts */
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE);
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS);
|
||||
|
|
|
|||
|
|
@ -712,10 +712,10 @@ base_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
|
|||
struct sock *sk = sock->sk;
|
||||
int err = 0;
|
||||
|
||||
if (!maddr || maddr->family != AF_ISDN)
|
||||
if (addr_len < sizeof(struct sockaddr_mISDN))
|
||||
return -EINVAL;
|
||||
|
||||
if (addr_len < sizeof(struct sockaddr_mISDN))
|
||||
if (!maddr || maddr->family != AF_ISDN)
|
||||
return -EINVAL;
|
||||
|
||||
lock_sock(sk);
|
||||
|
|
|
|||
|
|
@ -101,8 +101,9 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
|
|||
led_data->pwm = devm_pwm_get(dev, led->name);
|
||||
if (IS_ERR(led_data->pwm)) {
|
||||
ret = PTR_ERR(led_data->pwm);
|
||||
dev_err(dev, "unable to request PWM for %s: %d\n",
|
||||
led->name, ret);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(dev, "unable to request PWM for %s: %d\n",
|
||||
led->name, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1045,12 +1045,13 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
|
|||
}
|
||||
|
||||
if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
|
||||
bch_sectors_dirty_init(&dc->disk);
|
||||
atomic_set(&dc->has_dirty, 1);
|
||||
atomic_inc(&dc->count);
|
||||
bch_writeback_queue(dc);
|
||||
}
|
||||
|
||||
bch_sectors_dirty_init(&dc->disk);
|
||||
|
||||
bch_cached_dev_run(dc);
|
||||
bcache_device_link(&dc->disk, c, "bdev");
|
||||
|
||||
|
|
|
|||
|
|
@ -4218,26 +4218,15 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
|||
case check_state_check_result:
|
||||
sh->check_state = check_state_idle;
|
||||
|
||||
if (s->failed > 1)
|
||||
break;
|
||||
/* handle a successful check operation, if parity is correct
|
||||
* we are done. Otherwise update the mismatch count and repair
|
||||
* parity if !MD_RECOVERY_CHECK
|
||||
*/
|
||||
if (sh->ops.zero_sum_result == 0) {
|
||||
/* both parities are correct */
|
||||
if (!s->failed)
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
else {
|
||||
/* in contrast to the raid5 case we can validate
|
||||
* parity, but still have a failure to write
|
||||
* back
|
||||
*/
|
||||
sh->check_state = check_state_compute_result;
|
||||
/* Returning at this point means that we may go
|
||||
* off and bring p and/or q uptodate again so
|
||||
* we make sure to check zero_sum_result again
|
||||
* to verify if p or q need writeback
|
||||
*/
|
||||
}
|
||||
/* Any parity checked was correct */
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
} else {
|
||||
atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
|
||||
if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) {
|
||||
|
|
|
|||
|
|
@ -113,6 +113,23 @@ static long cec_adap_g_phys_addr(struct cec_adapter *adap,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cec_validate_phys_addr(u16 phys_addr)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (phys_addr == CEC_PHYS_ADDR_INVALID)
|
||||
return 0;
|
||||
for (i = 0; i < 16; i += 4)
|
||||
if (phys_addr & (0xf << i))
|
||||
break;
|
||||
if (i == 16)
|
||||
return 0;
|
||||
for (i += 4; i < 16; i += 4)
|
||||
if ((phys_addr & (0xf << i)) == 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long cec_adap_s_phys_addr(struct cec_adapter *adap, struct cec_fh *fh,
|
||||
bool block, __u16 __user *parg)
|
||||
{
|
||||
|
|
@ -124,7 +141,7 @@ static long cec_adap_s_phys_addr(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
if (copy_from_user(&phys_addr, parg, sizeof(phys_addr)))
|
||||
return -EFAULT;
|
||||
|
||||
err = cec_phys_addr_validate(phys_addr, NULL, NULL);
|
||||
err = cec_validate_phys_addr(phys_addr);
|
||||
if (err)
|
||||
return err;
|
||||
mutex_lock(&adap->lock);
|
||||
|
|
|
|||
|
|
@ -22,66 +22,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <media/cec.h>
|
||||
|
||||
/*
|
||||
* This EDID is expected to be a CEA-861 compliant, which means that there are
|
||||
* at least two blocks and one or more of the extensions blocks are CEA-861
|
||||
* blocks.
|
||||
*
|
||||
* The returned location is guaranteed to be < size - 1.
|
||||
*/
|
||||
static unsigned int cec_get_edid_spa_location(const u8 *edid, unsigned int size)
|
||||
{
|
||||
unsigned int blocks = size / 128;
|
||||
unsigned int block;
|
||||
u8 d;
|
||||
|
||||
/* Sanity check: at least 2 blocks and a multiple of the block size */
|
||||
if (blocks < 2 || size % 128)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If there are fewer extension blocks than the size, then update
|
||||
* 'blocks'. It is allowed to have more extension blocks than the size,
|
||||
* since some hardware can only read e.g. 256 bytes of the EDID, even
|
||||
* though more blocks are present. The first CEA-861 extension block
|
||||
* should normally be in block 1 anyway.
|
||||
*/
|
||||
if (edid[0x7e] + 1 < blocks)
|
||||
blocks = edid[0x7e] + 1;
|
||||
|
||||
for (block = 1; block < blocks; block++) {
|
||||
unsigned int offset = block * 128;
|
||||
|
||||
/* Skip any non-CEA-861 extension blocks */
|
||||
if (edid[offset] != 0x02 || edid[offset + 1] != 0x03)
|
||||
continue;
|
||||
|
||||
/* search Vendor Specific Data Block (tag 3) */
|
||||
d = edid[offset + 2] & 0x7f;
|
||||
/* Check if there are Data Blocks */
|
||||
if (d <= 4)
|
||||
continue;
|
||||
if (d > 4) {
|
||||
unsigned int i = offset + 4;
|
||||
unsigned int end = offset + d;
|
||||
|
||||
/* Note: 'end' is always < 'size' */
|
||||
do {
|
||||
u8 tag = edid[i] >> 5;
|
||||
u8 len = edid[i] & 0x1f;
|
||||
|
||||
if (tag == 3 && len >= 5 && i + len <= end &&
|
||||
edid[i + 1] == 0x03 &&
|
||||
edid[i + 2] == 0x0c &&
|
||||
edid[i + 3] == 0x00)
|
||||
return i + 4;
|
||||
i += len + 1;
|
||||
} while (i < end);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
|
||||
unsigned int *offset)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2295,8 +2295,10 @@ static int adv76xx_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
state->aspect_ratio.numerator = 16;
|
||||
state->aspect_ratio.denominator = 9;
|
||||
|
||||
if (!state->edid.present)
|
||||
if (!state->edid.present) {
|
||||
state->edid.blocks = 0;
|
||||
cec_phys_addr_invalidate(state->cec_adap);
|
||||
}
|
||||
|
||||
v4l2_dbg(2, debug, sd, "%s: clear EDID pad %d, edid.present = 0x%x\n",
|
||||
__func__, edid->pad, state->edid.present);
|
||||
|
|
|
|||
|
|
@ -799,8 +799,10 @@ static int edid_write_hdmi_segment(struct v4l2_subdev *sd, u8 port)
|
|||
/* Disable I2C access to internal EDID ram from HDMI DDC ports */
|
||||
rep_write_and_or(sd, 0x77, 0xf3, 0x00);
|
||||
|
||||
if (!state->hdmi_edid.present)
|
||||
if (!state->hdmi_edid.present) {
|
||||
cec_phys_addr_invalidate(state->cec_adap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pa = cec_get_edid_phys_addr(edid, 256, &spa_loc);
|
||||
err = cec_phys_addr_validate(pa, &pa, NULL);
|
||||
|
|
|
|||
|
|
@ -1216,7 +1216,7 @@ static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target)
|
|||
return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low);
|
||||
}
|
||||
|
||||
static int ov5640_binning_on(struct ov5640_dev *sensor)
|
||||
static int ov5640_get_binning(struct ov5640_dev *sensor)
|
||||
{
|
||||
u8 temp;
|
||||
int ret;
|
||||
|
|
@ -1224,8 +1224,8 @@ static int ov5640_binning_on(struct ov5640_dev *sensor)
|
|||
ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp);
|
||||
if (ret)
|
||||
return ret;
|
||||
temp &= 0xfe;
|
||||
return temp ? 1 : 0;
|
||||
|
||||
return temp & BIT(0);
|
||||
}
|
||||
|
||||
static int ov5640_set_virtual_channel(struct ov5640_dev *sensor)
|
||||
|
|
@ -1293,7 +1293,7 @@ static int ov5640_set_mode_exposure_calc(
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
prev_shutter = ret;
|
||||
ret = ov5640_binning_on(sensor);
|
||||
ret = ov5640_get_binning(sensor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret && mode->id != OV5640_MODE_720P_1280_720 &&
|
||||
|
|
@ -1900,16 +1900,12 @@ static int ov5640_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
|
|||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_AUTOGAIN:
|
||||
if (!ctrl->val)
|
||||
return 0;
|
||||
val = ov5640_get_gain(sensor);
|
||||
if (val < 0)
|
||||
return val;
|
||||
sensor->ctrls.gain->val = val;
|
||||
break;
|
||||
case V4L2_CID_EXPOSURE_AUTO:
|
||||
if (ctrl->val == V4L2_EXPOSURE_MANUAL)
|
||||
return 0;
|
||||
val = ov5640_get_exposure(sensor);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
|
|
|||
|
|
@ -212,8 +212,8 @@ config GENEVE
|
|||
|
||||
config GTP
|
||||
tristate "GPRS Tunneling Protocol datapath (GTP-U)"
|
||||
depends on INET && NET_UDP_TUNNEL
|
||||
select NET_IP_TUNNEL
|
||||
depends on INET
|
||||
select NET_UDP_TUNNEL
|
||||
---help---
|
||||
This allows one to create gtp virtual interfaces that provide
|
||||
the GPRS Tunneling Protocol datapath (GTP-U). This tunneling protocol
|
||||
|
|
|
|||
|
|
@ -1098,13 +1098,6 @@ static int bond_option_arp_validate_set(struct bonding *bond,
|
|||
{
|
||||
netdev_dbg(bond->dev, "Setting arp_validate to %s (%llu)\n",
|
||||
newval->string, newval->value);
|
||||
|
||||
if (bond->dev->flags & IFF_UP) {
|
||||
if (!newval->value)
|
||||
bond->recv_probe = NULL;
|
||||
else if (bond->params.arp_interval)
|
||||
bond->recv_probe = bond_arp_rcv;
|
||||
}
|
||||
bond->params.arp_validate = newval->value;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1639,7 +1639,7 @@ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv,
|
|||
qm_sg_entry_get_len(&sgt[0]), dma_dir);
|
||||
|
||||
/* remaining pages were mapped with skb_frag_dma_map() */
|
||||
for (i = 1; i < nr_frags; i++) {
|
||||
for (i = 1; i <= nr_frags; i++) {
|
||||
WARN_ON(qm_sg_entry_is_ext(&sgt[i]));
|
||||
|
||||
dma_unmap_page(dev, qm_sg_addr(&sgt[i]),
|
||||
|
|
|
|||
|
|
@ -1851,13 +1851,9 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(fep->clk_enet_out);
|
||||
if (ret)
|
||||
goto failed_clk_enet_out;
|
||||
return ret;
|
||||
|
||||
if (fep->clk_ptp) {
|
||||
mutex_lock(&fep->ptp_clk_mutex);
|
||||
|
|
@ -1875,7 +1871,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|||
if (ret)
|
||||
goto failed_clk_ref;
|
||||
} else {
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_enet_out);
|
||||
if (fep->clk_ptp) {
|
||||
mutex_lock(&fep->ptp_clk_mutex);
|
||||
|
|
@ -1894,8 +1889,6 @@ failed_clk_ref:
|
|||
failed_clk_ptp:
|
||||
if (fep->clk_enet_out)
|
||||
clk_disable_unprepare(fep->clk_enet_out);
|
||||
failed_clk_enet_out:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -3455,6 +3448,9 @@ fec_probe(struct platform_device *pdev)
|
|||
ret = clk_prepare_enable(fep->clk_ipg);
|
||||
if (ret)
|
||||
goto failed_clk_ipg;
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
goto failed_clk_ahb;
|
||||
|
||||
fep->reg_phy = devm_regulator_get(&pdev->dev, "phy");
|
||||
if (!IS_ERR(fep->reg_phy)) {
|
||||
|
|
@ -3546,6 +3542,9 @@ failed_reset:
|
|||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
failed_regulator:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
failed_clk_ahb:
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
failed_clk_ipg:
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
failed_clk:
|
||||
|
|
@ -3669,6 +3668,7 @@ static int __maybe_unused fec_runtime_suspend(struct device *dev)
|
|||
struct net_device *ndev = dev_get_drvdata(dev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
|
||||
return 0;
|
||||
|
|
@ -3678,8 +3678,20 @@ static int __maybe_unused fec_runtime_resume(struct device *dev)
|
|||
{
|
||||
struct net_device *ndev = dev_get_drvdata(dev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
int ret;
|
||||
|
||||
return clk_prepare_enable(fep->clk_ipg);
|
||||
ret = clk_prepare_enable(fep->clk_ahb);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_prepare_enable(fep->clk_ipg);
|
||||
if (ret)
|
||||
goto failed_clk_ipg;
|
||||
|
||||
return 0;
|
||||
|
||||
failed_clk_ipg:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops fec_pm_ops = {
|
||||
|
|
|
|||
|
|
@ -252,14 +252,12 @@ uec_set_ringparam(struct net_device *netdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
return -EBUSY;
|
||||
|
||||
ug_info->bdRingLenRx[queue] = ring->rx_pending;
|
||||
ug_info->bdRingLenTx[queue] = ring->tx_pending;
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
/* FIXME: restart automatically */
|
||||
netdev_info(netdev, "Please re-open the interface\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1267,6 +1267,12 @@ int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h)
|
|||
if (!h->phy_dev)
|
||||
return 0;
|
||||
|
||||
phy_dev->supported &= h->if_support;
|
||||
phy_dev->advertising = phy_dev->supported;
|
||||
|
||||
if (h->phy_if == PHY_INTERFACE_MODE_XGMII)
|
||||
phy_dev->autoneg = false;
|
||||
|
||||
if (h->phy_if != PHY_INTERFACE_MODE_XGMII) {
|
||||
phy_dev->dev_flags = 0;
|
||||
|
||||
|
|
@ -1278,15 +1284,6 @@ int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h)
|
|||
if (unlikely(ret))
|
||||
return -ENODEV;
|
||||
|
||||
phy_dev->supported &= h->if_support;
|
||||
phy_dev->advertising = phy_dev->supported;
|
||||
|
||||
if (h->phy_if == PHY_INTERFACE_MODE_XGMII)
|
||||
phy_dev->autoneg = false;
|
||||
|
||||
if (h->phy_if == PHY_INTERFACE_MODE_SGMII)
|
||||
phy_stop(phy_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -600,7 +600,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
|||
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))
|
||||
return 0;
|
||||
|
||||
emad_wq = alloc_workqueue("mlxsw_core_emad", WQ_MEM_RECLAIM, 0);
|
||||
emad_wq = alloc_workqueue("mlxsw_core_emad", 0, 0);
|
||||
if (!emad_wq)
|
||||
return -ENOMEM;
|
||||
mlxsw_core->emad_wq = emad_wq;
|
||||
|
|
@ -1812,10 +1812,10 @@ static int __init mlxsw_core_module_init(void)
|
|||
{
|
||||
int err;
|
||||
|
||||
mlxsw_wq = alloc_workqueue(mlxsw_core_driver_name, WQ_MEM_RECLAIM, 0);
|
||||
mlxsw_wq = alloc_workqueue(mlxsw_core_driver_name, 0, 0);
|
||||
if (!mlxsw_wq)
|
||||
return -ENOMEM;
|
||||
mlxsw_owq = alloc_ordered_workqueue("%s_ordered", WQ_MEM_RECLAIM,
|
||||
mlxsw_owq = alloc_ordered_workqueue("%s_ordered", 0,
|
||||
mlxsw_core_driver_name);
|
||||
if (!mlxsw_owq) {
|
||||
err = -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -1320,7 +1320,7 @@ static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
u16 fid_index;
|
||||
int err = 0;
|
||||
|
||||
if (switchdev_trans_ph_prepare(trans))
|
||||
if (switchdev_trans_ph_commit(trans))
|
||||
return 0;
|
||||
|
||||
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
|
||||
|
|
|
|||
|
|
@ -734,6 +734,7 @@ static int sgiseeq_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
sp = netdev_priv(dev);
|
||||
|
||||
/* Make private data page aligned */
|
||||
|
|
|
|||
|
|
@ -858,6 +858,8 @@ static struct mac_device_info *sun8i_dwmac_setup(void *ppriv)
|
|||
mac->mac = &sun8i_dwmac_ops;
|
||||
mac->dma = &sun8i_dwmac_dma_ops;
|
||||
|
||||
priv->dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
/* The loopback bit seems to be re-set when link change
|
||||
* Simply mask it each time
|
||||
* Speed 10/100/1000 are set in BIT(2)/BIT(3)
|
||||
|
|
|
|||
|
|
@ -2530,12 +2530,6 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
|
|||
netdev_warn(priv->dev, "PTP init failed\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
ret = stmmac_init_fs(dev);
|
||||
if (ret < 0)
|
||||
netdev_warn(priv->dev, "%s: failed debugFS registration\n",
|
||||
__func__);
|
||||
#endif
|
||||
priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS;
|
||||
|
||||
if ((priv->use_riwt) && (priv->hw->dma->rx_watchdog)) {
|
||||
|
|
@ -2729,10 +2723,6 @@ static int stmmac_release(struct net_device *dev)
|
|||
|
||||
netif_carrier_off(dev);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
stmmac_exit_fs(dev);
|
||||
#endif
|
||||
|
||||
stmmac_release_ptp(priv);
|
||||
|
||||
return 0;
|
||||
|
|
@ -3839,6 +3829,9 @@ static int stmmac_sysfs_ring_read(struct seq_file *seq, void *v)
|
|||
u32 tx_count = priv->plat->tx_queues_to_use;
|
||||
u32 queue;
|
||||
|
||||
if ((dev->flags & IFF_UP) == 0)
|
||||
return 0;
|
||||
|
||||
for (queue = 0; queue < rx_count; queue++) {
|
||||
struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
|
||||
|
||||
|
|
@ -4310,6 +4303,13 @@ int stmmac_dvr_probe(struct device *device,
|
|||
goto error_netdev_register;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
ret = stmmac_init_fs(ndev);
|
||||
if (ret < 0)
|
||||
netdev_warn(priv->dev, "%s: failed debugFS registration\n",
|
||||
__func__);
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
||||
error_netdev_register:
|
||||
|
|
@ -4343,6 +4343,9 @@ int stmmac_dvr_remove(struct device *dev)
|
|||
|
||||
netdev_info(priv->dev, "%s: removing driver", __func__);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
stmmac_exit_fs(ndev);
|
||||
#endif
|
||||
stmmac_stop_all_dma(priv);
|
||||
|
||||
priv->hw->mac->set_mac(priv->ioaddr, false);
|
||||
|
|
|
|||
|
|
@ -162,6 +162,14 @@ static const struct spi_device_id ks8995_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(spi, ks8995_id);
|
||||
|
||||
static const struct of_device_id ks8895_spi_of_match[] = {
|
||||
{ .compatible = "micrel,ks8995" },
|
||||
{ .compatible = "micrel,ksz8864" },
|
||||
{ .compatible = "micrel,ksz8795" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ks8895_spi_of_match);
|
||||
|
||||
static inline u8 get_chip_id(u8 val)
|
||||
{
|
||||
return (val >> ID1_CHIPID_S) & ID1_CHIPID_M;
|
||||
|
|
@ -529,6 +537,7 @@ static int ks8995_remove(struct spi_device *spi)
|
|||
static struct spi_driver ks8995_driver = {
|
||||
.driver = {
|
||||
.name = "spi-ks8995",
|
||||
.of_match_table = of_match_ptr(ks8895_spi_of_match),
|
||||
},
|
||||
.probe = ks8995_probe,
|
||||
.remove = ks8995_remove,
|
||||
|
|
|
|||
|
|
@ -436,6 +436,9 @@ static const struct ieee80211_rate mwl8k_rates_50[] = {
|
|||
#define MWL8K_CMD_UPDATE_STADB 0x1123
|
||||
#define MWL8K_CMD_BASTREAM 0x1125
|
||||
|
||||
#define MWL8K_LEGACY_5G_RATE_OFFSET \
|
||||
(ARRAY_SIZE(mwl8k_rates_24) - ARRAY_SIZE(mwl8k_rates_50))
|
||||
|
||||
static const char *mwl8k_cmd_name(__le16 cmd, char *buf, int bufsize)
|
||||
{
|
||||
u16 command = le16_to_cpu(cmd);
|
||||
|
|
@ -1011,8 +1014,9 @@ mwl8k_rxd_ap_process(void *_rxd, struct ieee80211_rx_status *status,
|
|||
|
||||
if (rxd->channel > 14) {
|
||||
status->band = NL80211_BAND_5GHZ;
|
||||
if (!(status->encoding == RX_ENC_HT))
|
||||
status->rate_idx -= 5;
|
||||
if (!(status->encoding == RX_ENC_HT) &&
|
||||
status->rate_idx >= MWL8K_LEGACY_5G_RATE_OFFSET)
|
||||
status->rate_idx -= MWL8K_LEGACY_5G_RATE_OFFSET;
|
||||
} else {
|
||||
status->band = NL80211_BAND_2GHZ;
|
||||
}
|
||||
|
|
@ -1119,8 +1123,9 @@ mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
|
|||
|
||||
if (rxd->channel > 14) {
|
||||
status->band = NL80211_BAND_5GHZ;
|
||||
if (!(status->encoding == RX_ENC_HT))
|
||||
status->rate_idx -= 5;
|
||||
if (!(status->encoding == RX_ENC_HT) &&
|
||||
status->rate_idx >= MWL8K_LEGACY_5G_RATE_OFFSET)
|
||||
status->rate_idx -= MWL8K_LEGACY_5G_RATE_OFFSET;
|
||||
} else {
|
||||
status->band = NL80211_BAND_2GHZ;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1699,6 +1699,7 @@ static void _rtl8723e_read_adapter_info(struct ieee80211_hw *hw,
|
|||
rtlhal->oem_id = RT_CID_819X_LENOVO;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x1025:
|
||||
rtlhal->oem_id = RT_CID_819X_ACER;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -84,8 +84,11 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
|||
|
||||
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
|
||||
req->ie_len);
|
||||
if (!frame.skb)
|
||||
if (!frame.skb) {
|
||||
mutex_unlock(&priv->conf_mutex);
|
||||
up(&priv->scan.lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (req->ie_len)
|
||||
skb_put_data(frame.skb, req->ie, req->ie_len);
|
||||
|
|
|
|||
|
|
@ -1074,6 +1074,12 @@ static const struct spi_device_id st95hf_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(spi, st95hf_id);
|
||||
|
||||
static const struct of_device_id st95hf_spi_of_match[] = {
|
||||
{ .compatible = "st,st95hf" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, st95hf_spi_of_match);
|
||||
|
||||
static int st95hf_probe(struct spi_device *nfc_spi_dev)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -1260,6 +1266,7 @@ static struct spi_driver st95hf_driver = {
|
|||
.driver = {
|
||||
.name = "st95hf",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(st95hf_spi_of_match),
|
||||
},
|
||||
.id_table = st95hf_id,
|
||||
.probe = st95hf_probe,
|
||||
|
|
|
|||
|
|
@ -190,14 +190,15 @@ static struct device *__nd_btt_create(struct nd_region *nd_region,
|
|||
return NULL;
|
||||
|
||||
nd_btt->id = ida_simple_get(&nd_region->btt_ida, 0, 0, GFP_KERNEL);
|
||||
if (nd_btt->id < 0) {
|
||||
kfree(nd_btt);
|
||||
return NULL;
|
||||
}
|
||||
if (nd_btt->id < 0)
|
||||
goto out_nd_btt;
|
||||
|
||||
nd_btt->lbasize = lbasize;
|
||||
if (uuid)
|
||||
if (uuid) {
|
||||
uuid = kmemdup(uuid, 16, GFP_KERNEL);
|
||||
if (!uuid)
|
||||
goto out_put_id;
|
||||
}
|
||||
nd_btt->uuid = uuid;
|
||||
dev = &nd_btt->dev;
|
||||
dev_set_name(dev, "btt%d.%d", nd_region->id, nd_btt->id);
|
||||
|
|
@ -212,6 +213,13 @@ static struct device *__nd_btt_create(struct nd_region *nd_region,
|
|||
return NULL;
|
||||
}
|
||||
return dev;
|
||||
|
||||
out_put_id:
|
||||
ida_simple_remove(&nd_region->btt_ida, nd_btt->id);
|
||||
|
||||
out_nd_btt:
|
||||
kfree(nd_btt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct device *nd_btt_create(struct nd_region *nd_region)
|
||||
|
|
|
|||
|
|
@ -2234,9 +2234,12 @@ struct device *create_namespace_blk(struct nd_region *nd_region,
|
|||
if (!nsblk->uuid)
|
||||
goto blk_err;
|
||||
memcpy(name, nd_label->name, NSLABEL_NAME_LEN);
|
||||
if (name[0])
|
||||
if (name[0]) {
|
||||
nsblk->alt_name = kmemdup(name, NSLABEL_NAME_LEN,
|
||||
GFP_KERNEL);
|
||||
if (!nsblk->alt_name)
|
||||
goto blk_err;
|
||||
}
|
||||
res = nsblk_add_resource(nd_region, ndd, nsblk,
|
||||
__le64_to_cpu(nd_label->dpa));
|
||||
if (!res)
|
||||
|
|
|
|||
|
|
@ -4422,14 +4422,16 @@ sony_pic_read_possible_resource(struct acpi_resource *resource, void *context)
|
|||
}
|
||||
return AE_OK;
|
||||
}
|
||||
default:
|
||||
dprintk("Resource %d isn't an IRQ nor an IO port\n",
|
||||
resource->type);
|
||||
|
||||
case ACPI_RESOURCE_TYPE_END_TAG:
|
||||
return AE_OK;
|
||||
|
||||
default:
|
||||
dprintk("Resource %d isn't an IRQ nor an IO port\n",
|
||||
resource->type);
|
||||
return AE_CTRL_TERMINATE;
|
||||
|
||||
}
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
static int sony_pic_possible_resources(struct acpi_device *device)
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@
|
|||
#include <linux/jiffies.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pci_ids.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/thinkpad_acpi.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/control.h>
|
||||
|
|
@ -4366,6 +4366,74 @@ static void bluetooth_exit(void)
|
|||
bluetooth_shutdown();
|
||||
}
|
||||
|
||||
static const struct dmi_system_id bt_fwbug_list[] __initconst = {
|
||||
{
|
||||
.ident = "ThinkPad E485",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20KU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad E585",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20KV"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A285 - 20MW",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MW"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A285 - 20MX",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MX"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A485 - 20MU",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "ThinkPad A485 - 20MV",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "20MV"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct pci_device_id fwbug_cards_ids[] __initconst = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24F3) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24FD) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2526) },
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
static int __init have_bt_fwbug(void)
|
||||
{
|
||||
/*
|
||||
* Some AMD based ThinkPads have a firmware bug that calling
|
||||
* "GBDC" will cause bluetooth on Intel wireless cards blocked
|
||||
*/
|
||||
if (dmi_check_system(bt_fwbug_list) && pci_dev_present(fwbug_cards_ids)) {
|
||||
vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
|
||||
FW_BUG "disable bluetooth subdriver for Intel cards\n");
|
||||
return 1;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init bluetooth_init(struct ibm_init_struct *iibm)
|
||||
{
|
||||
int res;
|
||||
|
|
@ -4378,7 +4446,7 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm)
|
|||
|
||||
/* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p,
|
||||
G4x, R30, R31, R40e, R50e, T20-22, X20-21 */
|
||||
tp_features.bluetooth = hkey_handle &&
|
||||
tp_features.bluetooth = !have_bt_fwbug() && hkey_handle &&
|
||||
acpi_evalf(hkey_handle, &status, "GBDC", "qd");
|
||||
|
||||
vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
|
||||
|
|
|
|||
|
|
@ -2001,14 +2001,14 @@ static int dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block);
|
||||
|
||||
raw:
|
||||
block->blocks = (private->real_cyl *
|
||||
block->blocks = ((unsigned long) private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk);
|
||||
|
||||
dev_info(&device->cdev->dev,
|
||||
"DASD with %d KB/block, %d KB total size, %d KB/track, "
|
||||
"DASD with %u KB/block, %lu KB total size, %u KB/track, "
|
||||
"%s\n", (block->bp_block >> 10),
|
||||
((private->real_cyl *
|
||||
(((unsigned long) private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk * (block->bp_block >> 9)) >> 1),
|
||||
((blk_per_trk * block->bp_block) >> 10),
|
||||
|
|
|
|||
|
|
@ -629,7 +629,7 @@ con3270_init(void)
|
|||
(void (*)(unsigned long)) con3270_read_tasklet,
|
||||
(unsigned long) condev->read);
|
||||
|
||||
raw3270_add_view(&condev->view, &con3270_fn, 1);
|
||||
raw3270_add_view(&condev->view, &con3270_fn, 1, RAW3270_VIEW_LOCK_IRQ);
|
||||
|
||||
INIT_LIST_HEAD(&condev->freemem);
|
||||
for (i = 0; i < CON3270_STRING_PAGES; i++) {
|
||||
|
|
|
|||
|
|
@ -463,7 +463,8 @@ fs3270_open(struct inode *inode, struct file *filp)
|
|||
|
||||
init_waitqueue_head(&fp->wait);
|
||||
fp->fs_pid = get_pid(task_pid(current));
|
||||
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor);
|
||||
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor,
|
||||
RAW3270_VIEW_LOCK_BH);
|
||||
if (rc) {
|
||||
fs3270_free_view(&fp->view);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -919,7 +919,7 @@ raw3270_deactivate_view(struct raw3270_view *view)
|
|||
* Add view to device with minor "minor".
|
||||
*/
|
||||
int
|
||||
raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor)
|
||||
raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor, int subclass)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct raw3270 *rp;
|
||||
|
|
@ -941,6 +941,7 @@ raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor)
|
|||
view->cols = rp->cols;
|
||||
view->ascebc = rp->ascebc;
|
||||
spin_lock_init(&view->lock);
|
||||
lockdep_set_subclass(&view->lock, subclass);
|
||||
list_add(&view->list, &rp->view_list);
|
||||
rc = 0;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
|
||||
|
|
|
|||
|
|
@ -150,6 +150,8 @@ struct raw3270_fn {
|
|||
struct raw3270_view {
|
||||
struct list_head list;
|
||||
spinlock_t lock;
|
||||
#define RAW3270_VIEW_LOCK_IRQ 0
|
||||
#define RAW3270_VIEW_LOCK_BH 1
|
||||
atomic_t ref_count;
|
||||
struct raw3270 *dev;
|
||||
struct raw3270_fn *fn;
|
||||
|
|
@ -158,7 +160,7 @@ struct raw3270_view {
|
|||
unsigned char *ascebc; /* ascii -> ebcdic table */
|
||||
};
|
||||
|
||||
int raw3270_add_view(struct raw3270_view *, struct raw3270_fn *, int);
|
||||
int raw3270_add_view(struct raw3270_view *, struct raw3270_fn *, int, int);
|
||||
int raw3270_activate_view(struct raw3270_view *);
|
||||
void raw3270_del_view(struct raw3270_view *);
|
||||
void raw3270_deactivate_view(struct raw3270_view *);
|
||||
|
|
|
|||
|
|
@ -978,7 +978,8 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
|
|||
return PTR_ERR(tp);
|
||||
|
||||
rc = raw3270_add_view(&tp->view, &tty3270_fn,
|
||||
tty->index + RAW3270_FIRSTMINOR);
|
||||
tty->index + RAW3270_FIRSTMINOR,
|
||||
RAW3270_VIEW_LOCK_BH);
|
||||
if (rc) {
|
||||
tty3270_free_view(tp);
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@ static debug_info_t *debug_info;
|
|||
|
||||
static void __init pkey_debug_init(void)
|
||||
{
|
||||
debug_info = debug_register("pkey", 1, 1, 4 * sizeof(long));
|
||||
/* 5 arguments per dbf entry (including the format string ptr) */
|
||||
debug_info = debug_register("pkey", 1, 1, 5 * sizeof(long));
|
||||
debug_register_view(debug_info, &debug_sprintf_view);
|
||||
debug_set_level(debug_info, 3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1594,6 +1594,7 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
|
|||
if (priv->channel[direction] == NULL) {
|
||||
if (direction == CTCM_WRITE)
|
||||
channel_free(priv->channel[CTCM_READ]);
|
||||
result = -ENODEV;
|
||||
goto out_dev;
|
||||
}
|
||||
priv->channel[direction]->netdev = dev;
|
||||
|
|
|
|||
|
|
@ -63,8 +63,7 @@ static int raid_match(struct attribute_container *cont, struct device *dev)
|
|||
* emulated RAID devices, so start with SCSI */
|
||||
struct raid_internal *i = ac_to_raid_internal(cont);
|
||||
|
||||
#if defined(CONFIG_SCSI) || defined(CONFIG_SCSI_MODULE)
|
||||
if (scsi_is_sdev_device(dev)) {
|
||||
if (IS_ENABLED(CONFIG_SCSI) && scsi_is_sdev_device(dev)) {
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
|
||||
if (i->f->cookie != sdev->host->hostt)
|
||||
|
|
@ -72,7 +71,6 @@ static int raid_match(struct attribute_container *cont, struct device *dev)
|
|||
|
||||
return i->f->is_raid(dev);
|
||||
}
|
||||
#endif
|
||||
/* FIXME: look at other subsystems too */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ config FB_OLPC_DCON
|
|||
tristate "One Laptop Per Child Display CONtroller support"
|
||||
depends on OLPC && FB
|
||||
depends on I2C
|
||||
depends on BACKLIGHT_LCD_SUPPORT
|
||||
depends on (GPIO_CS5535 || GPIO_CS5535=n)
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
---help---
|
||||
|
|
|
|||
|
|
@ -2435,8 +2435,8 @@ rescan_last_byte:
|
|||
}
|
||||
con_flush(vc, draw_from, draw_to, &draw_x);
|
||||
console_conditional_schedule();
|
||||
console_unlock();
|
||||
notify_update(vc);
|
||||
console_unlock();
|
||||
return n;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -379,6 +379,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
|
|||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned long flags;
|
||||
bool stopped = false;
|
||||
int status = urb->status;
|
||||
int i;
|
||||
|
||||
|
|
@ -386,33 +387,51 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
|
|||
if (urb == port->read_urbs[i])
|
||||
break;
|
||||
}
|
||||
set_bit(i, &port->read_urbs_free);
|
||||
|
||||
dev_dbg(&port->dev, "%s - urb %d, len %d\n", __func__, i,
|
||||
urb->actual_length);
|
||||
switch (status) {
|
||||
case 0:
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length,
|
||||
data);
|
||||
port->serial->type->process_read_urb(urb);
|
||||
break;
|
||||
case -ENOENT:
|
||||
case -ECONNRESET:
|
||||
case -ESHUTDOWN:
|
||||
dev_dbg(&port->dev, "%s - urb stopped: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
stopped = true;
|
||||
break;
|
||||
case -EPIPE:
|
||||
dev_err(&port->dev, "%s - urb stopped: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
stopped = true;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&port->dev, "%s - nonzero urb status: %d\n",
|
||||
__func__, status);
|
||||
goto resubmit;
|
||||
break;
|
||||
}
|
||||
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
|
||||
port->serial->type->process_read_urb(urb);
|
||||
/*
|
||||
* Make sure URB processing is done before marking as free to avoid
|
||||
* racing with unthrottle() on another CPU. Matches the barriers
|
||||
* implied by the test_and_clear_bit() in
|
||||
* usb_serial_generic_submit_read_urb().
|
||||
*/
|
||||
smp_mb__before_atomic();
|
||||
set_bit(i, &port->read_urbs_free);
|
||||
/*
|
||||
* Make sure URB is marked as free before checking the throttled flag
|
||||
* to avoid racing with unthrottle() on another CPU. Matches the
|
||||
* smp_mb() in unthrottle().
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
|
||||
if (stopped)
|
||||
return;
|
||||
|
||||
resubmit:
|
||||
/* Throttle the device if requested by tty */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
port->throttled = port->throttle_req;
|
||||
|
|
@ -487,6 +506,12 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
|
|||
port->throttled = port->throttle_req = 0;
|
||||
spin_unlock_irq(&port->lock);
|
||||
|
||||
/*
|
||||
* Matches the smp_mb__after_atomic() in
|
||||
* usb_serial_generic_read_bulk_callback().
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
if (was_throttled)
|
||||
usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -215,6 +215,9 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)
|
|||
* hypervisor.
|
||||
*/
|
||||
lb_offset = param.local_vaddr & (PAGE_SIZE - 1);
|
||||
if (param.count == 0 ||
|
||||
param.count > U64_MAX - lb_offset - PAGE_SIZE + 1)
|
||||
return -EINVAL;
|
||||
num_pages = (param.count + lb_offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
|
||||
/* Allocate the buffers we need */
|
||||
|
|
@ -331,8 +334,8 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
struct fsl_hv_ioctl_prop param;
|
||||
char __user *upath, *upropname;
|
||||
void __user *upropval;
|
||||
char *path = NULL, *propname = NULL;
|
||||
void *propval = NULL;
|
||||
char *path, *propname;
|
||||
void *propval;
|
||||
int ret = 0;
|
||||
|
||||
/* Get the parameters from the user. */
|
||||
|
|
@ -344,32 +347,30 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
upropval = (void __user *)(uintptr_t)param.propval;
|
||||
|
||||
path = strndup_user(upath, FH_DTPROP_MAX_PATHLEN);
|
||||
if (IS_ERR(path)) {
|
||||
ret = PTR_ERR(path);
|
||||
goto out;
|
||||
}
|
||||
if (IS_ERR(path))
|
||||
return PTR_ERR(path);
|
||||
|
||||
propname = strndup_user(upropname, FH_DTPROP_MAX_PATHLEN);
|
||||
if (IS_ERR(propname)) {
|
||||
ret = PTR_ERR(propname);
|
||||
goto out;
|
||||
goto err_free_path;
|
||||
}
|
||||
|
||||
if (param.proplen > FH_DTPROP_MAX_PROPLEN) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
goto err_free_propname;
|
||||
}
|
||||
|
||||
propval = kmalloc(param.proplen, GFP_KERNEL);
|
||||
if (!propval) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
goto err_free_propname;
|
||||
}
|
||||
|
||||
if (set) {
|
||||
if (copy_from_user(propval, upropval, param.proplen)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
goto err_free_propval;
|
||||
}
|
||||
|
||||
param.ret = fh_partition_set_dtprop(param.handle,
|
||||
|
|
@ -388,7 +389,7 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
if (copy_to_user(upropval, propval, param.proplen) ||
|
||||
put_user(param.proplen, &p->proplen)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
goto err_free_propval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -396,10 +397,12 @@ static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
|
|||
if (put_user(param.ret, &p->ret))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(path);
|
||||
err_free_propval:
|
||||
kfree(propval);
|
||||
err_free_propname:
|
||||
kfree(propname);
|
||||
err_free_path:
|
||||
kfree(path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1688,9 +1688,8 @@ static int cleaner_kthread(void *arg)
|
|||
struct btrfs_root *root = arg;
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
int again;
|
||||
struct btrfs_trans_handle *trans;
|
||||
|
||||
do {
|
||||
while (1) {
|
||||
again = 0;
|
||||
|
||||
/* Make the cleaner go to sleep early. */
|
||||
|
|
@ -1739,42 +1738,16 @@ static int cleaner_kthread(void *arg)
|
|||
*/
|
||||
btrfs_delete_unused_bgs(fs_info);
|
||||
sleep:
|
||||
if (kthread_should_park())
|
||||
kthread_parkme();
|
||||
if (kthread_should_stop())
|
||||
return 0;
|
||||
if (!again) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (!kthread_should_stop())
|
||||
schedule();
|
||||
schedule();
|
||||
__set_current_state(TASK_RUNNING);
|
||||
}
|
||||
} while (!kthread_should_stop());
|
||||
|
||||
/*
|
||||
* Transaction kthread is stopped before us and wakes us up.
|
||||
* However we might have started a new transaction and COWed some
|
||||
* tree blocks when deleting unused block groups for example. So
|
||||
* make sure we commit the transaction we started to have a clean
|
||||
* shutdown when evicting the btree inode - if it has dirty pages
|
||||
* when we do the final iput() on it, eviction will trigger a
|
||||
* writeback for it which will fail with null pointer dereferences
|
||||
* since work queues and other resources were already released and
|
||||
* destroyed by the time the iput/eviction/writeback is made.
|
||||
*/
|
||||
trans = btrfs_attach_transaction(root);
|
||||
if (IS_ERR(trans)) {
|
||||
if (PTR_ERR(trans) != -ENOENT)
|
||||
btrfs_err(fs_info,
|
||||
"cleaner transaction attach returned %ld",
|
||||
PTR_ERR(trans));
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
ret = btrfs_commit_transaction(trans);
|
||||
if (ret)
|
||||
btrfs_err(fs_info,
|
||||
"cleaner open transaction commit returned %d",
|
||||
ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int transaction_kthread(void *arg)
|
||||
|
|
@ -3713,6 +3686,13 @@ void close_ctree(struct btrfs_fs_info *fs_info)
|
|||
int ret;
|
||||
|
||||
set_bit(BTRFS_FS_CLOSING_START, &fs_info->flags);
|
||||
/*
|
||||
* We don't want the cleaner to start new transactions, add more delayed
|
||||
* iputs, etc. while we're closing. We can't use kthread_stop() yet
|
||||
* because that frees the task_struct, and the transaction kthread might
|
||||
* still try to wake up the cleaner.
|
||||
*/
|
||||
kthread_park(fs_info->cleaner_kthread);
|
||||
|
||||
/* wait for the qgroup rescan worker to stop */
|
||||
btrfs_qgroup_wait_for_completion(fs_info, false);
|
||||
|
|
@ -3740,9 +3720,8 @@ void close_ctree(struct btrfs_fs_info *fs_info)
|
|||
|
||||
if (!sb_rdonly(fs_info->sb)) {
|
||||
/*
|
||||
* If the cleaner thread is stopped and there are
|
||||
* block groups queued for removal, the deletion will be
|
||||
* skipped when we quit the cleaner thread.
|
||||
* The cleaner kthread is stopped, so do one final pass over
|
||||
* unused block groups.
|
||||
*/
|
||||
btrfs_delete_unused_bgs(fs_info);
|
||||
|
||||
|
|
|
|||
|
|
@ -2699,6 +2699,7 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,
|
|||
cifs_dbg(VFS, "Send error in read = %d\n", rc);
|
||||
}
|
||||
free_rsp_buf(resp_buftype, rsp_iov.iov_base);
|
||||
cifs_small_buf_release(req);
|
||||
return rc == -ENODATA ? 0 : rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -135,9 +135,13 @@ static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background)
|
|||
|
||||
static void fuse_drop_waiting(struct fuse_conn *fc)
|
||||
{
|
||||
if (fc->connected) {
|
||||
atomic_dec(&fc->num_waiting);
|
||||
} else if (atomic_dec_and_test(&fc->num_waiting)) {
|
||||
/*
|
||||
* lockess check of fc->connected is okay, because atomic_dec_and_test()
|
||||
* provides a memory barrier mached with the one in fuse_wait_aborted()
|
||||
* to ensure no wake-up is missed.
|
||||
*/
|
||||
if (atomic_dec_and_test(&fc->num_waiting) &&
|
||||
!READ_ONCE(fc->connected)) {
|
||||
/* wake up aborters */
|
||||
wake_up_all(&fc->blocked_waitq);
|
||||
}
|
||||
|
|
@ -2180,6 +2184,8 @@ EXPORT_SYMBOL_GPL(fuse_abort_conn);
|
|||
|
||||
void fuse_wait_aborted(struct fuse_conn *fc)
|
||||
{
|
||||
/* matches implicit memory barrier in fuse_drop_waiting() */
|
||||
smp_mb();
|
||||
wait_event(fc->blocked_waitq, atomic_read(&fc->num_waiting) == 0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -649,11 +649,10 @@ static struct kernfs_node *__kernfs_new_node(struct kernfs_root *root,
|
|||
kn->id.generation = gen;
|
||||
|
||||
/*
|
||||
* set ino first. This barrier is paired with atomic_inc_not_zero in
|
||||
* set ino first. This RELEASE is paired with atomic_inc_not_zero in
|
||||
* kernfs_find_and_get_node_by_ino
|
||||
*/
|
||||
smp_mb__before_atomic();
|
||||
atomic_set(&kn->count, 1);
|
||||
atomic_set_release(&kn->count, 1);
|
||||
atomic_set(&kn->active, KN_DEACTIVATED_BIAS);
|
||||
RB_CLEAR_NODE(&kn->rb);
|
||||
|
||||
|
|
|
|||
|
|
@ -1081,4 +1081,20 @@ static inline bool arch_has_pfn_modify_check(void)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On some architectures it depends on the mm if the p4d/pud or pmd
|
||||
* layer of the page table hierarchy is folded or not.
|
||||
*/
|
||||
#ifndef mm_p4d_folded
|
||||
#define mm_p4d_folded(mm) __is_defined(__PAGETABLE_P4D_FOLDED)
|
||||
#endif
|
||||
|
||||
#ifndef mm_pud_folded
|
||||
#define mm_pud_folded(mm) __is_defined(__PAGETABLE_PUD_FOLDED)
|
||||
#endif
|
||||
|
||||
#ifndef mm_pmd_folded
|
||||
#define mm_pmd_folded(mm) __is_defined(__PAGETABLE_PMD_FOLDED)
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_PGTABLE_H */
|
||||
|
|
|
|||
|
|
@ -1518,7 +1518,12 @@ efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
|
|||
struct screen_info *si, efi_guid_t *proto,
|
||||
unsigned long size);
|
||||
|
||||
bool efi_runtime_disabled(void);
|
||||
#ifdef CONFIG_EFI
|
||||
extern bool efi_runtime_disabled(void);
|
||||
#else
|
||||
static inline bool efi_runtime_disabled(void) { return true; }
|
||||
#endif
|
||||
|
||||
extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
|
||||
|
||||
enum efi_secureboot_mode {
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/irqbypass.h>
|
||||
#include <linux/swait.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <asm/signal.h>
|
||||
|
||||
#include <linux/kvm.h>
|
||||
|
|
@ -483,10 +484,10 @@ static inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
|
|||
|
||||
static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
|
||||
{
|
||||
/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu, in case
|
||||
* the caller has read kvm->online_vcpus before (as is the case
|
||||
* for kvm_for_each_vcpu, for example).
|
||||
*/
|
||||
int num_vcpus = atomic_read(&kvm->online_vcpus);
|
||||
i = array_index_nospec(i, num_vcpus);
|
||||
|
||||
/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu. */
|
||||
smp_rmb();
|
||||
return kvm->vcpus[i];
|
||||
}
|
||||
|
|
@ -570,6 +571,7 @@ void kvm_put_kvm(struct kvm *kvm);
|
|||
|
||||
static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
|
||||
{
|
||||
as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM);
|
||||
return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu,
|
||||
lockdep_is_held(&kvm->slots_lock) ||
|
||||
!refcount_read(&kvm->users_count));
|
||||
|
|
|
|||
|
|
@ -435,4 +435,74 @@ static inline void cec_phys_addr_invalidate(struct cec_adapter *adap)
|
|||
cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* cec_get_edid_spa_location() - find location of the Source Physical Address
|
||||
*
|
||||
* @edid: the EDID
|
||||
* @size: the size of the EDID
|
||||
*
|
||||
* This EDID is expected to be a CEA-861 compliant, which means that there are
|
||||
* at least two blocks and one or more of the extensions blocks are CEA-861
|
||||
* blocks.
|
||||
*
|
||||
* The returned location is guaranteed to be <= size-2.
|
||||
*
|
||||
* This is an inline function since it is used by both CEC and V4L2.
|
||||
* Ideally this would go in a module shared by both, but it is overkill to do
|
||||
* that for just a single function.
|
||||
*/
|
||||
static inline unsigned int cec_get_edid_spa_location(const u8 *edid,
|
||||
unsigned int size)
|
||||
{
|
||||
unsigned int blocks = size / 128;
|
||||
unsigned int block;
|
||||
u8 d;
|
||||
|
||||
/* Sanity check: at least 2 blocks and a multiple of the block size */
|
||||
if (blocks < 2 || size % 128)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If there are fewer extension blocks than the size, then update
|
||||
* 'blocks'. It is allowed to have more extension blocks than the size,
|
||||
* since some hardware can only read e.g. 256 bytes of the EDID, even
|
||||
* though more blocks are present. The first CEA-861 extension block
|
||||
* should normally be in block 1 anyway.
|
||||
*/
|
||||
if (edid[0x7e] + 1 < blocks)
|
||||
blocks = edid[0x7e] + 1;
|
||||
|
||||
for (block = 1; block < blocks; block++) {
|
||||
unsigned int offset = block * 128;
|
||||
|
||||
/* Skip any non-CEA-861 extension blocks */
|
||||
if (edid[offset] != 0x02 || edid[offset + 1] != 0x03)
|
||||
continue;
|
||||
|
||||
/* search Vendor Specific Data Block (tag 3) */
|
||||
d = edid[offset + 2] & 0x7f;
|
||||
/* Check if there are Data Blocks */
|
||||
if (d <= 4)
|
||||
continue;
|
||||
if (d > 4) {
|
||||
unsigned int i = offset + 4;
|
||||
unsigned int end = offset + d;
|
||||
|
||||
/* Note: 'end' is always < 'size' */
|
||||
do {
|
||||
u8 tag = edid[i] >> 5;
|
||||
u8 len = edid[i] & 0x1f;
|
||||
|
||||
if (tag == 3 && len >= 5 && i + len <= end &&
|
||||
edid[i + 1] == 0x03 &&
|
||||
edid[i + 2] == 0x0c &&
|
||||
edid[i + 3] == 0x00)
|
||||
return i + 4;
|
||||
i += len + 1;
|
||||
} while (i < end);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _MEDIA_CEC_H */
|
||||
|
|
|
|||
|
|
@ -315,6 +315,8 @@ struct nf_conn *nf_ct_tmpl_alloc(struct net *net,
|
|||
gfp_t flags);
|
||||
void nf_ct_tmpl_free(struct nf_conn *tmpl);
|
||||
|
||||
u32 nf_ct_get_id(const struct nf_conn *ct);
|
||||
|
||||
static inline void
|
||||
nf_ct_set(struct sk_buff *skb, struct nf_conn *ct, enum ip_conntrack_info info)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ struct nci_conn_info {
|
|||
* According to specification 102 622 chapter 4.4 Pipes,
|
||||
* the pipe identifier is 7 bits long.
|
||||
*/
|
||||
#define NCI_HCI_MAX_PIPES 127
|
||||
#define NCI_HCI_MAX_PIPES 128
|
||||
|
||||
struct nci_hci_gate {
|
||||
u8 gate;
|
||||
|
|
|
|||
|
|
@ -1251,21 +1251,27 @@ struct ib_qp_attr {
|
|||
};
|
||||
|
||||
enum ib_wr_opcode {
|
||||
IB_WR_RDMA_WRITE,
|
||||
IB_WR_RDMA_WRITE_WITH_IMM,
|
||||
IB_WR_SEND,
|
||||
IB_WR_SEND_WITH_IMM,
|
||||
IB_WR_RDMA_READ,
|
||||
IB_WR_ATOMIC_CMP_AND_SWP,
|
||||
IB_WR_ATOMIC_FETCH_AND_ADD,
|
||||
IB_WR_LSO,
|
||||
IB_WR_SEND_WITH_INV,
|
||||
IB_WR_RDMA_READ_WITH_INV,
|
||||
IB_WR_LOCAL_INV,
|
||||
IB_WR_REG_MR,
|
||||
IB_WR_MASKED_ATOMIC_CMP_AND_SWP,
|
||||
IB_WR_MASKED_ATOMIC_FETCH_AND_ADD,
|
||||
/* These are shared with userspace */
|
||||
IB_WR_RDMA_WRITE = IB_UVERBS_WR_RDMA_WRITE,
|
||||
IB_WR_RDMA_WRITE_WITH_IMM = IB_UVERBS_WR_RDMA_WRITE_WITH_IMM,
|
||||
IB_WR_SEND = IB_UVERBS_WR_SEND,
|
||||
IB_WR_SEND_WITH_IMM = IB_UVERBS_WR_SEND_WITH_IMM,
|
||||
IB_WR_RDMA_READ = IB_UVERBS_WR_RDMA_READ,
|
||||
IB_WR_ATOMIC_CMP_AND_SWP = IB_UVERBS_WR_ATOMIC_CMP_AND_SWP,
|
||||
IB_WR_ATOMIC_FETCH_AND_ADD = IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD,
|
||||
IB_WR_LSO = IB_UVERBS_WR_TSO,
|
||||
IB_WR_SEND_WITH_INV = IB_UVERBS_WR_SEND_WITH_INV,
|
||||
IB_WR_RDMA_READ_WITH_INV = IB_UVERBS_WR_RDMA_READ_WITH_INV,
|
||||
IB_WR_LOCAL_INV = IB_UVERBS_WR_LOCAL_INV,
|
||||
IB_WR_MASKED_ATOMIC_CMP_AND_SWP =
|
||||
IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP,
|
||||
IB_WR_MASKED_ATOMIC_FETCH_AND_ADD =
|
||||
IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD,
|
||||
|
||||
/* These are kernel only and can not be issued by userspace */
|
||||
IB_WR_REG_MR = 0x20,
|
||||
IB_WR_REG_SIG_MR,
|
||||
|
||||
/* reserve values for low level drivers' internal use.
|
||||
* These values will not be used at all in the ib core layer.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -751,10 +751,28 @@ struct ib_uverbs_sge {
|
|||
__u32 lkey;
|
||||
};
|
||||
|
||||
enum ib_uverbs_wr_opcode {
|
||||
IB_UVERBS_WR_RDMA_WRITE = 0,
|
||||
IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1,
|
||||
IB_UVERBS_WR_SEND = 2,
|
||||
IB_UVERBS_WR_SEND_WITH_IMM = 3,
|
||||
IB_UVERBS_WR_RDMA_READ = 4,
|
||||
IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5,
|
||||
IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6,
|
||||
IB_UVERBS_WR_LOCAL_INV = 7,
|
||||
IB_UVERBS_WR_BIND_MW = 8,
|
||||
IB_UVERBS_WR_SEND_WITH_INV = 9,
|
||||
IB_UVERBS_WR_TSO = 10,
|
||||
IB_UVERBS_WR_RDMA_READ_WITH_INV = 11,
|
||||
IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,
|
||||
IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,
|
||||
/* Review enum ib_wr_opcode before modifying this */
|
||||
};
|
||||
|
||||
struct ib_uverbs_send_wr {
|
||||
__u64 wr_id;
|
||||
__u32 num_sge;
|
||||
__u32 opcode;
|
||||
__u32 opcode; /* see enum ib_uverbs_wr_opcode */
|
||||
__u32 send_flags;
|
||||
union {
|
||||
__u32 imm_data;
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ enum pvrdma_wr_opcode {
|
|||
PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD,
|
||||
PVRDMA_WR_BIND_MW,
|
||||
PVRDMA_WR_REG_SIG_MR,
|
||||
PVRDMA_WR_ERROR,
|
||||
};
|
||||
|
||||
enum pvrdma_wc_status {
|
||||
|
|
|
|||
|
|
@ -550,6 +550,8 @@ asmlinkage __visible void __init start_kernel(void)
|
|||
page_alloc_init();
|
||||
|
||||
pr_notice("Kernel command line: %s\n", boot_command_line);
|
||||
/* parameters may set static keys */
|
||||
jump_label_init();
|
||||
parse_early_param();
|
||||
after_dashes = parse_args("Booting kernel",
|
||||
static_command_line, __start___param,
|
||||
|
|
@ -559,8 +561,6 @@ asmlinkage __visible void __init start_kernel(void)
|
|||
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
|
||||
NULL, set_init_arg);
|
||||
|
||||
jump_label_init();
|
||||
|
||||
/*
|
||||
* These use large bootmem allocations and must precede
|
||||
* kmem_cache_init()
|
||||
|
|
|
|||
|
|
@ -504,12 +504,44 @@ enum {
|
|||
* can only be modified by current, we can reuse trace_recursion.
|
||||
*/
|
||||
TRACE_IRQ_BIT,
|
||||
|
||||
/* Set if the function is in the set_graph_function file */
|
||||
TRACE_GRAPH_BIT,
|
||||
|
||||
/*
|
||||
* In the very unlikely case that an interrupt came in
|
||||
* at a start of graph tracing, and we want to trace
|
||||
* the function in that interrupt, the depth can be greater
|
||||
* than zero, because of the preempted start of a previous
|
||||
* trace. In an even more unlikely case, depth could be 2
|
||||
* if a softirq interrupted the start of graph tracing,
|
||||
* followed by an interrupt preempting a start of graph
|
||||
* tracing in the softirq, and depth can even be 3
|
||||
* if an NMI came in at the start of an interrupt function
|
||||
* that preempted a softirq start of a function that
|
||||
* preempted normal context!!!! Luckily, it can't be
|
||||
* greater than 3, so the next two bits are a mask
|
||||
* of what the depth is when we set TRACE_GRAPH_BIT
|
||||
*/
|
||||
|
||||
TRACE_GRAPH_DEPTH_START_BIT,
|
||||
TRACE_GRAPH_DEPTH_END_BIT,
|
||||
};
|
||||
|
||||
#define trace_recursion_set(bit) do { (current)->trace_recursion |= (1<<(bit)); } while (0)
|
||||
#define trace_recursion_clear(bit) do { (current)->trace_recursion &= ~(1<<(bit)); } while (0)
|
||||
#define trace_recursion_test(bit) ((current)->trace_recursion & (1<<(bit)))
|
||||
|
||||
#define trace_recursion_depth() \
|
||||
(((current)->trace_recursion >> TRACE_GRAPH_DEPTH_START_BIT) & 3)
|
||||
#define trace_recursion_set_depth(depth) \
|
||||
do { \
|
||||
current->trace_recursion &= \
|
||||
~(3 << TRACE_GRAPH_DEPTH_START_BIT); \
|
||||
current->trace_recursion |= \
|
||||
((depth) & 3) << TRACE_GRAPH_DEPTH_START_BIT; \
|
||||
} while (0)
|
||||
|
||||
#define TRACE_CONTEXT_BITS 4
|
||||
|
||||
#define TRACE_FTRACE_START TRACE_FTRACE_BIT
|
||||
|
|
@ -839,8 +871,9 @@ extern void __trace_graph_return(struct trace_array *tr,
|
|||
extern struct ftrace_hash *ftrace_graph_hash;
|
||||
extern struct ftrace_hash *ftrace_graph_notrace_hash;
|
||||
|
||||
static inline int ftrace_graph_addr(unsigned long addr)
|
||||
static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
|
||||
{
|
||||
unsigned long addr = trace->func;
|
||||
int ret = 0;
|
||||
|
||||
preempt_disable_notrace();
|
||||
|
|
@ -851,6 +884,14 @@ static inline int ftrace_graph_addr(unsigned long addr)
|
|||
}
|
||||
|
||||
if (ftrace_lookup_ip(ftrace_graph_hash, addr)) {
|
||||
|
||||
/*
|
||||
* This needs to be cleared on the return functions
|
||||
* when the depth is zero.
|
||||
*/
|
||||
trace_recursion_set(TRACE_GRAPH_BIT);
|
||||
trace_recursion_set_depth(trace->depth);
|
||||
|
||||
/*
|
||||
* If no irqs are to be traced, but a set_graph_function
|
||||
* is set, and called by an interrupt handler, we still
|
||||
|
|
@ -868,6 +909,13 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace)
|
||||
{
|
||||
if (trace_recursion_test(TRACE_GRAPH_BIT) &&
|
||||
trace->depth == trace_recursion_depth())
|
||||
trace_recursion_clear(TRACE_GRAPH_BIT);
|
||||
}
|
||||
|
||||
static inline int ftrace_graph_notrace_addr(unsigned long addr)
|
||||
{
|
||||
int ret = 0;
|
||||
|
|
@ -881,7 +929,7 @@ static inline int ftrace_graph_notrace_addr(unsigned long addr)
|
|||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline int ftrace_graph_addr(unsigned long addr)
|
||||
static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -890,6 +938,8 @@ static inline int ftrace_graph_notrace_addr(unsigned long addr)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace)
|
||||
{ }
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
|
||||
extern unsigned int fgraph_max_depth;
|
||||
|
|
@ -897,7 +947,8 @@ extern unsigned int fgraph_max_depth;
|
|||
static inline bool ftrace_graph_ignore_func(struct ftrace_graph_ent *trace)
|
||||
{
|
||||
/* trace it when it is-nested-in or is a function enabled. */
|
||||
return !(trace->depth || ftrace_graph_addr(trace->func)) ||
|
||||
return !(trace_recursion_test(TRACE_GRAPH_BIT) ||
|
||||
ftrace_graph_addr(trace)) ||
|
||||
(trace->depth < 0) ||
|
||||
(fgraph_max_depth && trace->depth >= fgraph_max_depth);
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue