mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
This is the 5.4.293 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmgUWpcACgkQONu9yGCS aT73HA/+LBb8+NLSn9lfxNg+iJKWhEZLIIhiD9/7AbRK72gIoAI4UdS3n1ohnQZI YYPhP3m+xm1DIdn9vpcX37hf8ibfLChWAkO9zMdRo8aWFBOc99kAhW6B1LKegPHz 4IKlRaqnXHgpQ7/vzNv9tMd55PrK5vfD1nWoxFpBlnHzis4sF+jZ412+x37Br1gH 7OGc08SaoCD/wYAjSZ5Nl3YVw5OhSCKzkDXKfxrYk+mKOv9iTPeHzzIel6SJXo4Z PXQiDkV3XoTBvG5kZu4n+lDJ92JcAB30pGvyG/W6EnzobXgiC4xPB87DKOKbJ6ia 8CoKFW0ytL9+HOJW/FcklvKlbw4GntAbLmIPpyc8dMRbQOVNmSqMGDTD4GU4BubN 0vxnMRa+sw88XMdR0xQsrAwACGcN5+zrqTBWrfN7BnTmCfw0UKJWePBj+5zpPCVH 8lE96AL5OI3KNSqaD4mbISxYx3NuK/ggZ+go2LdbVEYfElMDJ8Jg5bYl94ymxsOh YFcXauCInBeRagR8gVyoVa2TTgV7ySO8cmvNh1QZqYDG7wIYqOKIVlTLiW1zLJvn 3ix+yu5i2naq01NEX/jR2S9HVcTBq94x+1oyCWkZQeQy8SMef5vEIg9BCZAWJX6k cUoj/gUvtszp2epc2agrgFXhIZcJAACyxNUo4Ff4UJXorvzLWwU= =lSza -----END PGP SIGNATURE----- Merge 5.4.293 into android11-5.4-lts Changes in 5.4.293 ata: pata_pxa: Fix potential NULL pointer dereference in pxa_ata_probe() tipc: fix memory leak in tipc_link_xmit ata: sata_sx4: Drop pointless VPRINTK() calls and convert the remaining ones ata: sata_sx4: Add error handling in pdc20621_i2c_read() net: ppp: Add bound checking for skb data on ppp_sync_txmung pm: cpupower: bench: Prevent NULL dereference on malloc failure x86/cpu: Don't clear X86_FEATURE_LAHF_LM flag in init_amd_k8() on AMD when running in a virtual machine perf: arm_pmu: Don't disable counter in armpmu_add() xen/mcelog: Add __nonstring annotations for unterminated strings HID: pidff: Convert infinite length from Linux API to PID standard HID: pidff: Do not send effect envelope if it's empty HID: pidff: Fix null pointer dereference in pidff_find_fields ALSA: hda: intel: Fix Optimus when GPU has no sound ALSA: usb-audio: Fix CME quirk for UF series keyboards page_pool: avoid infinite loop to schedule delayed worker fs/jfs: cast inactags to s64 to prevent potential overflow fs/jfs: Prevent integer overflow in AG size calculation jfs: Prevent copying of nlink with value 0 from disk inode jfs: add sanity check for agwidth in dbMount ata: libata-eh: Do not use ATAPI DMA for a device limited to PIO mode ahci: add PCI ID for Marvell 88SE9215 SATA Controller ext4: protect ext4_release_dquot against freezing ext4: ignore xattrs past end scsi: st: Fix array overflow in st_setup() wifi: mt76: mt76x2u: add TP-Link TL-WDN6200 ID to device table net: vlan: don't propagate flags on open tracing: fix return value in __ftrace_event_enable_disable for TRACE_REG_UNREGISTER Bluetooth: hci_uart: fix race during initialization drm: allow encoder mode_set even when connectors change for crtc drm: panel-orientation-quirks: Add support for AYANEO 2S drm: panel-orientation-quirks: Add new quirk for GPD Win 2 drm/amdkfd: clamp queue size to minimum drm/amdkfd: Fix pqm_destroy_queue race with GPU reset drm/mediatek: mtk_dpi: Explicitly manage TVD clock in power on/off fbdev: omapfb: Add 'plane' value check pwm: mediatek: Always use bus clock pwm: mediatek: Prevent divide-by-zero in pwm_mediatek_config() pwm: fsl-ftm: Handle clk_get_rate() returning 0 bpf: Add endian modifiers to fix endian warnings bpf: support SKF_NET_OFF and SKF_LL_OFF on skb frags ext4: reject casefold inode flag without casefold feature ext4: don't treat fhandle lookup of ea_inode as FS corruption media: i2c: adv748x: Fix test pattern selection mask media: venus: hfi: add a check to handle OOB in sfr region media: venus: hfi: add check to handle incorrect queue size media: siano: Fix error handling in smsdvb_module_init() xenfs/xensyms: respect hypervisor's "next" indication arm64: cputype: Add MIDR_CORTEX_A76AE mtd: rawnand: brcmnand: fix PM resume warning media: streamzap: prevent processing IR data on URB failure media: v4l2-dv-timings: prevent possible overflow in v4l2_detect_gtf() media: i2c: ov7251: Set enable GPIO low in probe media: i2c: ov7251: Introduce 1 ms delay between regulators and en GPIO media: venus: hfi_parser: add check to avoid out of bound access net: dsa: mv88e6xxx: workaround RGMII transmit delay erratum for 6320 family wifi: mac80211: fix integer overflow in hwmp_route_info_get() ext4: fix off-by-one error in do_split i3c: Add NULL pointer check in i3c_master_queue_ibi() jbd2: remove wrong sb->s_sequence check locking/lockdep: Decrease nr_unused_locks if lock unused in zap_class() lib: scatterlist: fix sg_split_phys to preserve original scatterlist offsets mtd: inftlcore: Add error check for inftl_read_oob() mtd: rawnand: Add status chack in r852_ready() arm64: dts: mediatek: mt8173: Fix disp-pwm compatible string sparc/mm: disable preemption in lazy mmu mode mm: add missing release barrier on PGDAT_RECLAIM_LOCKED unlock sctp: detect and prevent references to a freed transport in sendmsg thermal/drivers/rockchip: Add missing rk3328 mapping entry crypto: ccp - Fix check for the primary ASP device dm-integrity: set ti->error on memory allocation failure ftrace: Add cond_resched() to ftrace_graph_set_hash() gpio: zynq: Fix wakeup source leaks on device unbind ntb: use 64-bit arithmetic for the MSI doorbell mask of/irq: Fix device node refcount leakages in of_irq_count() of/irq: Fix device node refcount leakage in API irq_of_parse_and_map() of/irq: Fix device node refcount leakages in of_irq_init() PCI: Fix reference leak in pci_alloc_child_bus() x86/e820: Fix handling of subpage regions when calculating nosave ranges in e820__register_nosave_regions() Bluetooth: hci_uart: Fix another race during initialization pwm: mediatek: always use bus clock for PWM on MT7622 HSI: ssi_protocol: Fix use after free vulnerability in ssi_protocol Driver Due to Race Condition wifi: at76c50x: fix use after free access in at76_disconnect wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue() wifi: mac80211: Purge vif txq in ieee80211_do_stop() wifi: wl1251: fix memory leak in wl1251_tx_work scsi: iscsi: Fix missing scsi_host_put() in error path RDMA/usnic: Fix passing zero to PTR_ERR in usnic_ib_pci_probe() Bluetooth: hci_event: Fix sending MGMT_EV_DEVICE_FOUND for invalid address Bluetooth: btrtl: Prevent potential NULL dereference Revert "wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue()" net: openvswitch: fix nested key length validation in the set() action net: b53: enable BPDU reception for management port writeback: fix false warning in inode_to_wb() asus-laptop: Fix an uninitialized variable NFSD: Constify @fh argument of knfsd_fh_hash() nfs: move nfs_fhandle_hash to common include file nfs: add missing selections of CONFIG_CRC32 btrfs: correctly escape subvol in btrfs_show_options() hfs/hfsplus: fix slab-out-of-bounds in hfs_bnode_read_key i2c: cros-ec-tunnel: defer probe if parent EC is not present isofs: Prevent the use of too small fid riscv: Avoid fortify warning in syscall_get_arguments() virtiofs: add filesystem context source name check perf/x86/intel: Allow to update user space GPRs from PEBS records perf/x86/intel/uncore: Fix the scale of IIO free running counters on SNR module: sign with sha512 instead of sha1 by default drm/repaper: fix integer overflows in repeat functions drm/nouveau: prime: fix ttm_bo_delayed_delete oops drm/sti: remove duplicate object names cpufreq: Reference count policy in cpufreq_update_limits() kbuild: Add '-fno-builtin-wcslen' powerpc/prom_init: Use -ffreestanding to avoid a reference to bcmp tcp/dccp: Don't use timer_pending() in reqsk_queue_unlink(). misc: pci_endpoint_test: Avoid issue of interrupts remaining after request_irq error misc: pci_endpoint_test: Fix 'irq_type' to convey the correct type usb: dwc3: support continuous runtime PM with dual role nvmet-fc: Remove unused functions mmc: cqhci: Fix checking of CQHCI_HALT state net: openvswitch: fix race on port output openvswitch: fix lockup on tx to unregistering netdev with carrier RDMA/srpt: Support specifying the srpt_service_guid parameter virtio-net: Add validation for used length MIPS: dec: Declare which_prom() as static MIPS: cevt-ds1287: Add missing ds1287.h include MIPS: ds1287: Match ds1287_set_base_clock() function types platform/x86: ISST: Correct command storage data length ext4: simplify checking quota limits in ext4_statfs() ext4: code cleanup for ext4_statfs_project() ext4: don't over-report free space or inodes in statvfs ext4: optimize __ext4_check_dir_entry() ext4: fix OOB read when checking dotdot dir media: vim2m: print device name after registering device net: dsa: mv88e6xxx: fix VTU methods for 6320 family iio: adc: ad7768-1: Move setting of val a bit later to avoid unnecessary return value check iio: adc: ad7768-1: Fix conversion result sign PCI: Rename PCI_IRQ_LEGACY to PCI_IRQ_INTX misc: pci_endpoint_test: Use INTX instead of LEGACY misc: pci_endpoint_test: Fix displaying 'irq_type' after 'request_irq' error drm/amd/pm: Prevent division by zero cpufreq: scpi: Fix null-ptr-deref in scpi_cpufreq_get_rate() net: phy: leds: fix memory leak tipc: fix NULL pointer dereference in tipc_mon_reinit_self() net_sched: hfsc: Fix a UAF vulnerability in class handling net_sched: hfsc: Fix a potential UAF in hfsc_dequeue() too virtio_console: fix missing byte order handling for cols and rows mcb: fix a double free bug in chameleon_parse_gdd() USB: storage: quirk for ADATA Portable HDD CH94 serial: sifive: lock port in startup()/shutdown() callbacks USB: serial: ftdi_sio: add support for Abacus Electrics Optical Probe USB: serial: option: add Sierra Wireless EM9291 USB: serial: simple: add OWON HDS200 series oscilloscope support usb: cdns3: Fix deadlock when using NCM gadget USB: OHCI: Add quirk for LS7A OHCI controller (rev 0x02) usb: dwc3: gadget: check that event count does not exceed event buffer length usb: quirks: add DELAY_INIT quirk for Silicon Motion Flash Drive usb: quirks: Add delay init quirk for SanDisk 3.2Gen1 Flash Drive USB: VLI disk crashes if LPM is used MIPS: cm: Detect CM quirks from device tree crypto: null - Use spin lock instead of mutex clk: check for disabled clock-provider in of_clk_get_hw_from_clkspec() parisc: PDT: Fix missing prototype warning usb: host: max3421-hcd: Add missing spi_device_id table dmaengine: dmatest: Fix dmatest waiting less when interrupted usb: gadget: aspeed: Add NULL pointer check in ast_vhub_init_dev() qibfs: fix _another_ leak ntb: reduce stack usage in idt_scan_mws sched/isolation: Make CONFIG_CPU_ISOLATION depend on CONFIG_SMP KVM: s390: Don't use %pK through tracepoints udmabuf: fix a buf size overflow issue during udmabuf creation selftests: ublk: fix test_stripe_04 ACPI PPTT: Fix coding mistakes in a couple of sizeof() calls x86/bugs: Don't fill RSB on VMEXIT with eIBRS+retpoline scsi: pm80xx: Set phy_attached to zero when device is gone md/raid1: Add check for missing source disk in process_checks() comedi: jr3_pci: Fix synchronous deletion of timer crypto: atmel-sha204a - Set hwrng quality to lowest possible MIPS: cm: Fix warning if MIPS_CM is disabled Linux 5.4.293 Change-Id: I7bbba3d6632da8db1c4df982c20fd1ca01af68aa Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
a38a5caa68
160 changed files with 1103 additions and 542 deletions
5
Makefile
5
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 292
|
||||
SUBLEVEL = 293
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
@ -1003,6 +1003,9 @@ KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types)
|
|||
# Require designated initializers for all marked structures
|
||||
KBUILD_CFLAGS += $(call cc-option,-Werror=designated-init)
|
||||
|
||||
# Ensure compilers do not transform certain loops into calls to wcslen()
|
||||
KBUILD_CFLAGS += -fno-builtin-wcslen
|
||||
|
||||
# change __FILE__ to the relative path from the srctree
|
||||
KBUILD_CFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
|
||||
|
||||
|
|
|
|||
|
|
@ -1161,8 +1161,7 @@
|
|||
};
|
||||
|
||||
pwm0: pwm@1401e000 {
|
||||
compatible = "mediatek,mt8173-disp-pwm",
|
||||
"mediatek,mt6595-disp-pwm";
|
||||
compatible = "mediatek,mt8173-disp-pwm";
|
||||
reg = <0 0x1401e000 0 0x1000>;
|
||||
#pwm-cells = <2>;
|
||||
clocks = <&mmsys CLK_MM_DISP_PWM026M>,
|
||||
|
|
@ -1172,8 +1171,7 @@
|
|||
};
|
||||
|
||||
pwm1: pwm@1401f000 {
|
||||
compatible = "mediatek,mt8173-disp-pwm",
|
||||
"mediatek,mt6595-disp-pwm";
|
||||
compatible = "mediatek,mt8173-disp-pwm";
|
||||
reg = <0 0x1401f000 0 0x1000>;
|
||||
#pwm-cells = <2>;
|
||||
clocks = <&mmsys CLK_MM_DISP_PWM126M>,
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@
|
|||
#define ARM_CPU_PART_CORTEX_A76 0xD0B
|
||||
#define ARM_CPU_PART_NEOVERSE_N1 0xD0C
|
||||
#define ARM_CPU_PART_CORTEX_A77 0xD0D
|
||||
#define ARM_CPU_PART_CORTEX_A76AE 0xD0E
|
||||
#define ARM_CPU_PART_NEOVERSE_V1 0xD40
|
||||
#define ARM_CPU_PART_CORTEX_A78 0xD41
|
||||
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
||||
|
|
@ -124,6 +125,7 @@
|
|||
#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)
|
||||
#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)
|
||||
#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77)
|
||||
#define MIDR_CORTEX_A76AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76AE)
|
||||
#define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1)
|
||||
#define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78)
|
||||
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ int (*__pmax_close)(int);
|
|||
* Detect which PROM the DECSTATION has, and set the callback vectors
|
||||
* appropriately.
|
||||
*/
|
||||
void __init which_prom(s32 magic, s32 *prom_vec)
|
||||
static void __init which_prom(s32 magic, s32 *prom_vec)
|
||||
{
|
||||
/*
|
||||
* No sign of the REX PROM's magic number means we assume a non-REX
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
#define __ASM_DS1287_H
|
||||
|
||||
extern int ds1287_timer_state(void);
|
||||
extern void ds1287_set_base_clock(unsigned int clock);
|
||||
extern int ds1287_set_base_clock(unsigned int hz);
|
||||
extern int ds1287_clockevent_init(int irq);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -47,6 +47,16 @@ extern phys_addr_t __mips_cm_phys_base(void);
|
|||
*/
|
||||
extern int mips_cm_is64;
|
||||
|
||||
/*
|
||||
* mips_cm_is_l2_hci_broken - determine if HCI is broken
|
||||
*
|
||||
* Some CM reports show that Hardware Cache Initialization is
|
||||
* complete, but in reality it's not the case. They also incorrectly
|
||||
* indicate that Hardware Cache Initialization is supported. This
|
||||
* flags allows warning about this broken feature.
|
||||
*/
|
||||
extern bool mips_cm_is_l2_hci_broken;
|
||||
|
||||
/**
|
||||
* mips_cm_error_report - Report CM cache errors
|
||||
*/
|
||||
|
|
@ -85,6 +95,18 @@ static inline bool mips_cm_present(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* mips_cm_update_property - update property from the device tree
|
||||
*
|
||||
* Retrieve the properties from the device tree if a CM node exist and
|
||||
* update the internal variable based on this.
|
||||
*/
|
||||
#ifdef CONFIG_MIPS_CM
|
||||
extern void mips_cm_update_property(void);
|
||||
#else
|
||||
static inline void mips_cm_update_property(void) {}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* mips_cm_has_l2sync - determine whether an L2-only sync region is present
|
||||
*
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/ds1287.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
int ds1287_timer_state(void)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
|
|
@ -14,6 +15,7 @@
|
|||
void __iomem *mips_gcr_base;
|
||||
void __iomem *mips_cm_l2sync_base;
|
||||
int mips_cm_is64;
|
||||
bool mips_cm_is_l2_hci_broken;
|
||||
|
||||
static char *cm2_tr[8] = {
|
||||
"mem", "gcr", "gic", "mmio",
|
||||
|
|
@ -196,6 +198,18 @@ static void mips_cm_probe_l2sync(void)
|
|||
mips_cm_l2sync_base = ioremap_nocache(addr, MIPS_CM_L2SYNC_SIZE);
|
||||
}
|
||||
|
||||
void mips_cm_update_property(void)
|
||||
{
|
||||
struct device_node *cm_node;
|
||||
|
||||
cm_node = of_find_compatible_node(of_root, NULL, "mobileye,eyeq6-cm");
|
||||
if (!cm_node)
|
||||
return;
|
||||
pr_info("HCI (Hardware Cache Init for the L2 cache) in GCR_L2_RAM_CONFIG from the CM3 is broken");
|
||||
mips_cm_is_l2_hci_broken = true;
|
||||
of_node_put(cm_node);
|
||||
}
|
||||
|
||||
int mips_cm_probe(void)
|
||||
{
|
||||
phys_addr_t addr;
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ static unsigned long pdt_entry[MAX_PDT_ENTRIES] __page_aligned_bss;
|
|||
#define PDT_ADDR_PERM_ERR (pdt_type != PDT_PDC ? 2UL : 0UL)
|
||||
#define PDT_ADDR_SINGLE_ERR 1UL
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* report PDT entries via /proc/meminfo */
|
||||
void arch_report_meminfo(struct seq_file *m)
|
||||
{
|
||||
|
|
@ -71,6 +72,7 @@ void arch_report_meminfo(struct seq_file *m)
|
|||
seq_printf(m, "PDT_cur_entries: %7lu\n",
|
||||
pdt_status.pdt_entries);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int get_info_pat_new(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
|
|||
|
||||
CFLAGS_prom_init.o += $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_prom_init.o += -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_prom_init.o += -ffreestanding
|
||||
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
# Do not trace early boot code
|
||||
|
|
|
|||
|
|
@ -67,8 +67,11 @@ static inline void syscall_get_arguments(struct task_struct *task,
|
|||
unsigned long *args)
|
||||
{
|
||||
args[0] = regs->orig_a0;
|
||||
args++;
|
||||
memcpy(args, ®s->a1, 5 * sizeof(args[0]));
|
||||
args[1] = regs->a1;
|
||||
args[2] = regs->a2;
|
||||
args[3] = regs->a3;
|
||||
args[4] = regs->a4;
|
||||
args[5] = regs->a5;
|
||||
}
|
||||
|
||||
static inline void syscall_set_arguments(struct task_struct *task,
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ TRACE_EVENT(kvm_s390_create_vcpu,
|
|||
__entry->sie_block = sie_block;
|
||||
),
|
||||
|
||||
TP_printk("create cpu %d at 0x%pK, sie block at 0x%pK",
|
||||
TP_printk("create cpu %d at 0x%p, sie block at 0x%p",
|
||||
__entry->id, __entry->vcpu, __entry->sie_block)
|
||||
);
|
||||
|
||||
|
|
@ -255,7 +255,7 @@ TRACE_EVENT(kvm_s390_enable_css,
|
|||
__entry->kvm = kvm;
|
||||
),
|
||||
|
||||
TP_printk("enabling channel I/O support (kvm @ %pK)\n",
|
||||
TP_printk("enabling channel I/O support (kvm @ %p)\n",
|
||||
__entry->kvm)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -53,8 +53,10 @@ out:
|
|||
|
||||
void arch_enter_lazy_mmu_mode(void)
|
||||
{
|
||||
struct tlb_batch *tb = this_cpu_ptr(&tlb_batch);
|
||||
struct tlb_batch *tb;
|
||||
|
||||
preempt_disable();
|
||||
tb = this_cpu_ptr(&tlb_batch);
|
||||
tb->active = 1;
|
||||
}
|
||||
|
||||
|
|
@ -65,6 +67,7 @@ void arch_leave_lazy_mmu_mode(void)
|
|||
if (tb->tlb_nr)
|
||||
flush_tlb_pending();
|
||||
tb->active = 0;
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
|
||||
|
|
|
|||
|
|
@ -985,8 +985,10 @@ static u64 pebs_update_adaptive_cfg(struct perf_event *event)
|
|||
* + precise_ip < 2 for the non event IP
|
||||
* + For RTM TSX weight we need GPRs for the abort code.
|
||||
*/
|
||||
gprs = (sample_type & PERF_SAMPLE_REGS_INTR) &&
|
||||
(attr->sample_regs_intr & PEBS_GP_REGS);
|
||||
gprs = ((sample_type & PERF_SAMPLE_REGS_INTR) &&
|
||||
(attr->sample_regs_intr & PEBS_GP_REGS)) ||
|
||||
((sample_type & PERF_SAMPLE_REGS_USER) &&
|
||||
(attr->sample_regs_user & PEBS_GP_REGS));
|
||||
|
||||
tsx_weight = (sample_type & PERF_SAMPLE_WEIGHT) &&
|
||||
((attr->config & INTEL_ARCH_EVENT_MASK) ==
|
||||
|
|
@ -1569,7 +1571,7 @@ static void setup_pebs_adaptive_sample_data(struct perf_event *event,
|
|||
regs->flags &= ~PERF_EFLAGS_EXACT;
|
||||
}
|
||||
|
||||
if (sample_type & PERF_SAMPLE_REGS_INTR)
|
||||
if (sample_type & (PERF_SAMPLE_REGS_INTR | PERF_SAMPLE_REGS_USER))
|
||||
adaptive_pebs_save_regs(regs, gprs);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4220,28 +4220,28 @@ static struct uncore_event_desc snr_uncore_iio_freerunning_events[] = {
|
|||
INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
|
||||
/* Free-Running IIO BANDWIDTH IN Counters */
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.814697266e-6"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.0517578125e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"),
|
||||
{ /* end: all zeroes */ },
|
||||
};
|
||||
|
|
|
|||
|
|
@ -808,7 +808,7 @@ static void init_amd_k8(struct cpuinfo_x86 *c)
|
|||
* (model = 0x14) and later actually support it.
|
||||
* (AMD Erratum #110, docId: 25759).
|
||||
*/
|
||||
if (c->x86_model < 0x14 && cpu_has(c, X86_FEATURE_LAHF_LM)) {
|
||||
if (c->x86_model < 0x14 && cpu_has(c, X86_FEATURE_LAHF_LM) && !cpu_has(c, X86_FEATURE_HYPERVISOR)) {
|
||||
clear_cpu_cap(c, X86_FEATURE_LAHF_LM);
|
||||
if (!rdmsrl_amd_safe(0xc001100d, &value)) {
|
||||
value &= ~BIT_64(32);
|
||||
|
|
|
|||
|
|
@ -1348,20 +1348,20 @@ static void __init spectre_v2_determine_rsb_fill_type_at_vmexit(enum spectre_v2_
|
|||
case SPECTRE_V2_NONE:
|
||||
return;
|
||||
|
||||
case SPECTRE_V2_EIBRS_LFENCE:
|
||||
case SPECTRE_V2_EIBRS:
|
||||
case SPECTRE_V2_EIBRS_LFENCE:
|
||||
case SPECTRE_V2_EIBRS_RETPOLINE:
|
||||
if (boot_cpu_has_bug(X86_BUG_EIBRS_PBRSB)) {
|
||||
setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT_LITE);
|
||||
pr_info("Spectre v2 / PBRSB-eIBRS: Retire a single CALL on VMEXIT\n");
|
||||
setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT_LITE);
|
||||
}
|
||||
return;
|
||||
|
||||
case SPECTRE_V2_EIBRS_RETPOLINE:
|
||||
case SPECTRE_V2_RETPOLINE:
|
||||
case SPECTRE_V2_LFENCE:
|
||||
case SPECTRE_V2_IBRS:
|
||||
setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT);
|
||||
pr_info("Spectre v2 / SpectreRSB : Filling RSB on VMEXIT\n");
|
||||
setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -738,22 +738,21 @@ void __init e820__memory_setup_extended(u64 phys_addr, u32 data_len)
|
|||
void __init e820__register_nosave_regions(unsigned long limit_pfn)
|
||||
{
|
||||
int i;
|
||||
unsigned long pfn = 0;
|
||||
u64 last_addr = 0;
|
||||
|
||||
for (i = 0; i < e820_table->nr_entries; i++) {
|
||||
struct e820_entry *entry = &e820_table->entries[i];
|
||||
|
||||
if (pfn < PFN_UP(entry->addr))
|
||||
register_nosave_region(pfn, PFN_UP(entry->addr));
|
||||
|
||||
pfn = PFN_DOWN(entry->addr + entry->size);
|
||||
|
||||
if (entry->type != E820_TYPE_RAM && entry->type != E820_TYPE_RESERVED_KERN)
|
||||
register_nosave_region(PFN_UP(entry->addr), pfn);
|
||||
continue;
|
||||
|
||||
if (pfn >= limit_pfn)
|
||||
break;
|
||||
if (last_addr < entry->addr)
|
||||
register_nosave_region(PFN_DOWN(last_addr), PFN_UP(entry->addr));
|
||||
|
||||
last_addr = entry->addr + entry->size;
|
||||
}
|
||||
|
||||
register_nosave_region(PFN_DOWN(last_addr), limit_pfn);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
|
|
|||
|
|
@ -17,10 +17,10 @@
|
|||
#include <crypto/internal/skcipher.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
static DEFINE_MUTEX(crypto_default_null_skcipher_lock);
|
||||
static DEFINE_SPINLOCK(crypto_default_null_skcipher_lock);
|
||||
static struct crypto_sync_skcipher *crypto_default_null_skcipher;
|
||||
static int crypto_default_null_skcipher_refcnt;
|
||||
|
||||
|
|
@ -152,23 +152,32 @@ MODULE_ALIAS_CRYPTO("cipher_null");
|
|||
|
||||
struct crypto_sync_skcipher *crypto_get_default_null_skcipher(void)
|
||||
{
|
||||
struct crypto_sync_skcipher *ntfm = NULL;
|
||||
struct crypto_sync_skcipher *tfm;
|
||||
|
||||
mutex_lock(&crypto_default_null_skcipher_lock);
|
||||
spin_lock_bh(&crypto_default_null_skcipher_lock);
|
||||
tfm = crypto_default_null_skcipher;
|
||||
|
||||
if (!tfm) {
|
||||
tfm = crypto_alloc_sync_skcipher("ecb(cipher_null)", 0, 0);
|
||||
if (IS_ERR(tfm))
|
||||
goto unlock;
|
||||
spin_unlock_bh(&crypto_default_null_skcipher_lock);
|
||||
|
||||
crypto_default_null_skcipher = tfm;
|
||||
ntfm = crypto_alloc_sync_skcipher("ecb(cipher_null)", 0, 0);
|
||||
if (IS_ERR(ntfm))
|
||||
return ntfm;
|
||||
|
||||
spin_lock_bh(&crypto_default_null_skcipher_lock);
|
||||
tfm = crypto_default_null_skcipher;
|
||||
if (!tfm) {
|
||||
tfm = ntfm;
|
||||
ntfm = NULL;
|
||||
crypto_default_null_skcipher = tfm;
|
||||
}
|
||||
}
|
||||
|
||||
crypto_default_null_skcipher_refcnt++;
|
||||
spin_unlock_bh(&crypto_default_null_skcipher_lock);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&crypto_default_null_skcipher_lock);
|
||||
crypto_free_sync_skcipher(ntfm);
|
||||
|
||||
return tfm;
|
||||
}
|
||||
|
|
@ -176,12 +185,16 @@ EXPORT_SYMBOL_GPL(crypto_get_default_null_skcipher);
|
|||
|
||||
void crypto_put_default_null_skcipher(void)
|
||||
{
|
||||
mutex_lock(&crypto_default_null_skcipher_lock);
|
||||
struct crypto_sync_skcipher *tfm = NULL;
|
||||
|
||||
spin_lock_bh(&crypto_default_null_skcipher_lock);
|
||||
if (!--crypto_default_null_skcipher_refcnt) {
|
||||
crypto_free_sync_skcipher(crypto_default_null_skcipher);
|
||||
tfm = crypto_default_null_skcipher;
|
||||
crypto_default_null_skcipher = NULL;
|
||||
}
|
||||
mutex_unlock(&crypto_default_null_skcipher_lock);
|
||||
spin_unlock_bh(&crypto_default_null_skcipher_lock);
|
||||
|
||||
crypto_free_sync_skcipher(tfm);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_put_default_null_skcipher);
|
||||
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ static int acpi_pptt_leaf_node(struct acpi_table_header *table_hdr,
|
|||
node_entry = ACPI_PTR_DIFF(node, table_hdr);
|
||||
entry = ACPI_ADD_PTR(struct acpi_subtable_header, table_hdr,
|
||||
sizeof(struct acpi_table_pptt));
|
||||
proc_sz = sizeof(struct acpi_pptt_processor *);
|
||||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
cpu_node = (struct acpi_pptt_processor *)entry;
|
||||
|
|
@ -257,7 +257,7 @@ static struct acpi_pptt_processor *acpi_find_processor_node(struct acpi_table_he
|
|||
table_end = (unsigned long)table_hdr + table_hdr->length;
|
||||
entry = ACPI_ADD_PTR(struct acpi_subtable_header, table_hdr,
|
||||
sizeof(struct acpi_table_pptt));
|
||||
proc_sz = sizeof(struct acpi_pptt_processor *);
|
||||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
/* find the processor structure associated with this cpuid */
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
|
|
|
|||
|
|
@ -558,6 +558,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), /* highpoint rocketraid 642L */
|
||||
|
|
|
|||
|
|
@ -1603,8 +1603,15 @@ unsigned int atapi_eh_request_sense(struct ata_device *dev,
|
|||
tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
tf.command = ATA_CMD_PACKET;
|
||||
|
||||
/* is it pointless to prefer PIO for "safety reasons"? */
|
||||
if (ap->flags & ATA_FLAG_PIO_DMA) {
|
||||
/*
|
||||
* Do not use DMA if the connected device only supports PIO, even if the
|
||||
* port prefers PIO commands via DMA.
|
||||
*
|
||||
* Ideally, we should call atapi_check_dma() to check if it is safe for
|
||||
* the LLD to use DMA for REQUEST_SENSE, but we don't have a qc.
|
||||
* Since we can't check the command, perhaps we should only use pio?
|
||||
*/
|
||||
if ((ap->flags & ATA_FLAG_PIO_DMA) && !(dev->flags & ATA_DFLAG_PIO)) {
|
||||
tf.protocol = ATAPI_PROT_DMA;
|
||||
tf.feature |= ATAPI_PKT_DMA;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -223,10 +223,16 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
|||
|
||||
ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, cmd_res->start,
|
||||
resource_size(cmd_res));
|
||||
if (!ap->ioaddr.cmd_addr)
|
||||
return -ENOMEM;
|
||||
ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
|
||||
resource_size(ctl_res));
|
||||
if (!ap->ioaddr.ctl_addr)
|
||||
return -ENOMEM;
|
||||
ap->ioaddr.bmdma_addr = devm_ioremap(&pdev->dev, dma_res->start,
|
||||
resource_size(dma_res));
|
||||
if (!ap->ioaddr.bmdma_addr)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* Adjust register offsets
|
||||
|
|
|
|||
|
|
@ -308,15 +308,9 @@ static inline void pdc20621_ata_sg(u8 *buf, unsigned int portno,
|
|||
/* output ATA packet S/G table */
|
||||
addr = PDC_20621_DIMM_BASE + PDC_20621_DIMM_DATA +
|
||||
(PDC_DIMM_DATA_STEP * portno);
|
||||
VPRINTK("ATA sg addr 0x%x, %d\n", addr, addr);
|
||||
|
||||
buf32[dw] = cpu_to_le32(addr);
|
||||
buf32[dw + 1] = cpu_to_le32(total_len | ATA_PRD_EOT);
|
||||
|
||||
VPRINTK("ATA PSG @ %x == (0x%x, 0x%x)\n",
|
||||
PDC_20621_DIMM_BASE +
|
||||
(PDC_DIMM_WINDOW_STEP * portno) +
|
||||
PDC_DIMM_APKT_PRD,
|
||||
buf32[dw], buf32[dw + 1]);
|
||||
}
|
||||
|
||||
static inline void pdc20621_host_sg(u8 *buf, unsigned int portno,
|
||||
|
|
@ -332,12 +326,6 @@ static inline void pdc20621_host_sg(u8 *buf, unsigned int portno,
|
|||
|
||||
buf32[dw] = cpu_to_le32(addr);
|
||||
buf32[dw + 1] = cpu_to_le32(total_len | ATA_PRD_EOT);
|
||||
|
||||
VPRINTK("HOST PSG @ %x == (0x%x, 0x%x)\n",
|
||||
PDC_20621_DIMM_BASE +
|
||||
(PDC_DIMM_WINDOW_STEP * portno) +
|
||||
PDC_DIMM_HPKT_PRD,
|
||||
buf32[dw], buf32[dw + 1]);
|
||||
}
|
||||
|
||||
static inline unsigned int pdc20621_ata_pkt(struct ata_taskfile *tf,
|
||||
|
|
@ -351,7 +339,6 @@ static inline unsigned int pdc20621_ata_pkt(struct ata_taskfile *tf,
|
|||
unsigned int dimm_sg = PDC_20621_DIMM_BASE +
|
||||
(PDC_DIMM_WINDOW_STEP * portno) +
|
||||
PDC_DIMM_APKT_PRD;
|
||||
VPRINTK("ENTER, dimm_sg == 0x%x, %d\n", dimm_sg, dimm_sg);
|
||||
|
||||
i = PDC_DIMM_ATA_PKT;
|
||||
|
||||
|
|
@ -406,8 +393,6 @@ static inline void pdc20621_host_pkt(struct ata_taskfile *tf, u8 *buf,
|
|||
unsigned int dimm_sg = PDC_20621_DIMM_BASE +
|
||||
(PDC_DIMM_WINDOW_STEP * portno) +
|
||||
PDC_DIMM_HPKT_PRD;
|
||||
VPRINTK("ENTER, dimm_sg == 0x%x, %d\n", dimm_sg, dimm_sg);
|
||||
VPRINTK("host_sg == 0x%x, %d\n", host_sg, host_sg);
|
||||
|
||||
dw = PDC_DIMM_HOST_PKT >> 2;
|
||||
|
||||
|
|
@ -424,14 +409,6 @@ static inline void pdc20621_host_pkt(struct ata_taskfile *tf, u8 *buf,
|
|||
buf32[dw + 1] = cpu_to_le32(host_sg);
|
||||
buf32[dw + 2] = cpu_to_le32(dimm_sg);
|
||||
buf32[dw + 3] = 0;
|
||||
|
||||
VPRINTK("HOST PKT @ %x == (0x%x 0x%x 0x%x 0x%x)\n",
|
||||
PDC_20621_DIMM_BASE + (PDC_DIMM_WINDOW_STEP * portno) +
|
||||
PDC_DIMM_HOST_PKT,
|
||||
buf32[dw + 0],
|
||||
buf32[dw + 1],
|
||||
buf32[dw + 2],
|
||||
buf32[dw + 3]);
|
||||
}
|
||||
|
||||
static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
|
||||
|
|
@ -447,8 +424,6 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
|
|||
|
||||
WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP));
|
||||
|
||||
VPRINTK("ata%u: ENTER\n", ap->print_id);
|
||||
|
||||
/* hard-code chip #0 */
|
||||
mmio += PDC_CHIP0_OFS;
|
||||
|
||||
|
|
@ -492,7 +467,8 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
|
|||
|
||||
readl(dimm_mmio); /* MMIO PCI posting flush */
|
||||
|
||||
VPRINTK("ata pkt buf ofs %u, prd size %u, mmio copied\n", i, sgt_len);
|
||||
ata_port_dbg(ap, "ata pkt buf ofs %u, prd size %u, mmio copied\n",
|
||||
i, sgt_len);
|
||||
}
|
||||
|
||||
static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
||||
|
|
@ -504,8 +480,6 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
|||
unsigned int portno = ap->port_no;
|
||||
unsigned int i;
|
||||
|
||||
VPRINTK("ata%u: ENTER\n", ap->print_id);
|
||||
|
||||
/* hard-code chip #0 */
|
||||
mmio += PDC_CHIP0_OFS;
|
||||
|
||||
|
|
@ -527,7 +501,7 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
|||
|
||||
readl(dimm_mmio); /* MMIO PCI posting flush */
|
||||
|
||||
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
||||
ata_port_dbg(ap, "ata pkt buf ofs %u, mmio copied\n", i);
|
||||
}
|
||||
|
||||
static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
||||
|
|
@ -633,8 +607,6 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc)
|
|||
/* hard-code chip #0 */
|
||||
mmio += PDC_CHIP0_OFS;
|
||||
|
||||
VPRINTK("ata%u: ENTER\n", ap->print_id);
|
||||
|
||||
wmb(); /* flush PRD, pkt writes */
|
||||
|
||||
port_ofs = PDC_20621_DIMM_BASE + (PDC_DIMM_WINDOW_STEP * port_no);
|
||||
|
|
@ -645,7 +617,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc)
|
|||
|
||||
pdc20621_dump_hdma(qc);
|
||||
pdc20621_push_hdma(qc, seq, port_ofs + PDC_DIMM_HOST_PKT);
|
||||
VPRINTK("queued ofs 0x%x (%u), seq %u\n",
|
||||
ata_port_dbg(ap, "queued ofs 0x%x (%u), seq %u\n",
|
||||
port_ofs + PDC_DIMM_HOST_PKT,
|
||||
port_ofs + PDC_DIMM_HOST_PKT,
|
||||
seq);
|
||||
|
|
@ -656,7 +628,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc)
|
|||
writel(port_ofs + PDC_DIMM_ATA_PKT,
|
||||
ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
|
||||
readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
|
||||
VPRINTK("submitted ofs 0x%x (%u), seq %u\n",
|
||||
ata_port_dbg(ap, "submitted ofs 0x%x (%u), seq %u\n",
|
||||
port_ofs + PDC_DIMM_ATA_PKT,
|
||||
port_ofs + PDC_DIMM_ATA_PKT,
|
||||
seq);
|
||||
|
|
@ -696,14 +668,12 @@ static inline unsigned int pdc20621_host_intr(struct ata_port *ap,
|
|||
u8 status;
|
||||
unsigned int handled = 0;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
if ((qc->tf.protocol == ATA_PROT_DMA) && /* read */
|
||||
(!(qc->tf.flags & ATA_TFLAG_WRITE))) {
|
||||
|
||||
/* step two - DMA from DIMM to host */
|
||||
if (doing_hdma) {
|
||||
VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->print_id,
|
||||
ata_port_dbg(ap, "read hdma, 0x%x 0x%x\n",
|
||||
readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
|
||||
/* get drive status; clear intr; complete txn */
|
||||
qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
|
||||
|
|
@ -714,7 +684,7 @@ static inline unsigned int pdc20621_host_intr(struct ata_port *ap,
|
|||
/* step one - exec ATA command */
|
||||
else {
|
||||
u8 seq = (u8) (port_no + 1 + 4);
|
||||
VPRINTK("ata%u: read ata, 0x%x 0x%x\n", ap->print_id,
|
||||
ata_port_dbg(ap, "read ata, 0x%x 0x%x\n",
|
||||
readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
|
||||
|
||||
/* submit hdma pkt */
|
||||
|
|
@ -729,7 +699,7 @@ static inline unsigned int pdc20621_host_intr(struct ata_port *ap,
|
|||
/* step one - DMA from host to DIMM */
|
||||
if (doing_hdma) {
|
||||
u8 seq = (u8) (port_no + 1);
|
||||
VPRINTK("ata%u: write hdma, 0x%x 0x%x\n", ap->print_id,
|
||||
ata_port_dbg(ap, "write hdma, 0x%x 0x%x\n",
|
||||
readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
|
||||
|
||||
/* submit ata pkt */
|
||||
|
|
@ -742,7 +712,7 @@ static inline unsigned int pdc20621_host_intr(struct ata_port *ap,
|
|||
|
||||
/* step two - execute ATA command */
|
||||
else {
|
||||
VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->print_id,
|
||||
ata_port_dbg(ap, "write ata, 0x%x 0x%x\n",
|
||||
readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
|
||||
/* get drive status; clear intr; complete txn */
|
||||
qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
|
||||
|
|
@ -755,7 +725,7 @@ static inline unsigned int pdc20621_host_intr(struct ata_port *ap,
|
|||
} else if (qc->tf.protocol == ATA_PROT_NODATA) {
|
||||
|
||||
status = ata_sff_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
|
||||
DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
|
||||
ata_port_dbg(ap, "BUS_NODATA (drv_stat 0x%X)\n", status);
|
||||
qc->err_mask |= ac_err_mask(status);
|
||||
ata_qc_complete(qc);
|
||||
handled = 1;
|
||||
|
|
@ -781,29 +751,21 @@ static irqreturn_t pdc20621_interrupt(int irq, void *dev_instance)
|
|||
unsigned int handled = 0;
|
||||
void __iomem *mmio_base;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
if (!host || !host->iomap[PDC_MMIO_BAR]) {
|
||||
VPRINTK("QUICK EXIT\n");
|
||||
if (!host || !host->iomap[PDC_MMIO_BAR])
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
mmio_base = host->iomap[PDC_MMIO_BAR];
|
||||
|
||||
/* reading should also clear interrupts */
|
||||
mmio_base += PDC_CHIP0_OFS;
|
||||
mask = readl(mmio_base + PDC_20621_SEQMASK);
|
||||
VPRINTK("mask == 0x%x\n", mask);
|
||||
|
||||
if (mask == 0xffffffff) {
|
||||
VPRINTK("QUICK EXIT 2\n");
|
||||
if (mask == 0xffffffff)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
mask &= 0xffff; /* only 16 tags possible */
|
||||
if (!mask) {
|
||||
VPRINTK("QUICK EXIT 3\n");
|
||||
if (!mask)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
spin_lock(&host->lock);
|
||||
|
||||
|
|
@ -816,7 +778,8 @@ static irqreturn_t pdc20621_interrupt(int irq, void *dev_instance)
|
|||
else
|
||||
ap = host->ports[port_no];
|
||||
tmp = mask & (1 << i);
|
||||
VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp);
|
||||
if (ap)
|
||||
ata_port_dbg(ap, "seq %u, tmp %x\n", i, tmp);
|
||||
if (tmp && ap) {
|
||||
struct ata_queued_cmd *qc;
|
||||
|
||||
|
|
@ -829,10 +792,6 @@ static irqreturn_t pdc20621_interrupt(int irq, void *dev_instance)
|
|||
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("mask == 0x%x\n", mask);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
|
|
@ -1165,9 +1124,14 @@ static int pdc20621_prog_dimm0(struct ata_host *host)
|
|||
mmio += PDC_CHIP0_OFS;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pdc_i2c_read_data); i++)
|
||||
pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
|
||||
pdc_i2c_read_data[i].reg,
|
||||
&spd0[pdc_i2c_read_data[i].ofs]);
|
||||
if (!pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
|
||||
pdc_i2c_read_data[i].reg,
|
||||
&spd0[pdc_i2c_read_data[i].ofs])) {
|
||||
dev_err(host->dev,
|
||||
"Failed in i2c read at index %d: device=%#x, reg=%#x\n",
|
||||
i, PDC_DIMM0_SPD_DEV_ADDRESS, pdc_i2c_read_data[i].reg);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
data |= (spd0[4] - 8) | ((spd0[21] != 0) << 3) | ((spd0[3]-11) << 4);
|
||||
data |= ((spd0[17] / 4) << 6) | ((spd0[5] / 2) << 7) |
|
||||
|
|
@ -1272,7 +1236,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
/* Initialize Time Period Register */
|
||||
writel(0xffffffff, mmio + PDC_TIME_PERIOD);
|
||||
time_period = readl(mmio + PDC_TIME_PERIOD);
|
||||
VPRINTK("Time Period Register (0x40): 0x%x\n", time_period);
|
||||
dev_dbg(host->dev, "Time Period Register (0x40): 0x%x\n", time_period);
|
||||
|
||||
/* Enable timer */
|
||||
writel(PDC_TIMER_DEFAULT, mmio + PDC_TIME_CONTROL);
|
||||
|
|
@ -1287,7 +1251,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
*/
|
||||
|
||||
tcount = readl(mmio + PDC_TIME_COUNTER);
|
||||
VPRINTK("Time Counter Register (0x44): 0x%x\n", tcount);
|
||||
dev_dbg(host->dev, "Time Counter Register (0x44): 0x%x\n", tcount);
|
||||
|
||||
/*
|
||||
If SX4 is on PCI-X bus, after 3 seconds, the timer counter
|
||||
|
|
@ -1295,17 +1259,19 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
*/
|
||||
if (tcount >= PCI_X_TCOUNT) {
|
||||
ticks = (time_period - tcount);
|
||||
VPRINTK("Num counters 0x%x (%d)\n", ticks, ticks);
|
||||
dev_dbg(host->dev, "Num counters 0x%x (%d)\n", ticks, ticks);
|
||||
|
||||
clock = (ticks / 300000);
|
||||
VPRINTK("10 * Internal clk = 0x%x (%d)\n", clock, clock);
|
||||
dev_dbg(host->dev, "10 * Internal clk = 0x%x (%d)\n",
|
||||
clock, clock);
|
||||
|
||||
clock = (clock * 33);
|
||||
VPRINTK("10 * Internal clk * 33 = 0x%x (%d)\n", clock, clock);
|
||||
dev_dbg(host->dev, "10 * Internal clk * 33 = 0x%x (%d)\n",
|
||||
clock, clock);
|
||||
|
||||
/* PLL F Param (bit 22:16) */
|
||||
fparam = (1400000 / clock) - 2;
|
||||
VPRINTK("PLL F Param: 0x%x (%d)\n", fparam, fparam);
|
||||
dev_dbg(host->dev, "PLL F Param: 0x%x (%d)\n", fparam, fparam);
|
||||
|
||||
/* OD param = 0x2 (bit 31:30), R param = 0x5 (bit 29:25) */
|
||||
pci_status = (0x8a001824 | (fparam << 16));
|
||||
|
|
@ -1313,7 +1279,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
pci_status = PCI_PLL_INIT;
|
||||
|
||||
/* Initialize PLL. */
|
||||
VPRINTK("pci_status: 0x%x\n", pci_status);
|
||||
dev_dbg(host->dev, "pci_status: 0x%x\n", pci_status);
|
||||
writel(pci_status, mmio + PDC_CTL_STATUS);
|
||||
readl(mmio + PDC_CTL_STATUS);
|
||||
|
||||
|
|
@ -1325,15 +1291,18 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
printk(KERN_ERR "Detect Local DIMM Fail\n");
|
||||
return 1; /* DIMM error */
|
||||
}
|
||||
VPRINTK("Local DIMM Speed = %d\n", speed);
|
||||
dev_dbg(host->dev, "Local DIMM Speed = %d\n", speed);
|
||||
|
||||
/* Programming DIMM0 Module Control Register (index_CID0:80h) */
|
||||
size = pdc20621_prog_dimm0(host);
|
||||
VPRINTK("Local DIMM Size = %dMB\n", size);
|
||||
if (size < 0)
|
||||
return size;
|
||||
dev_dbg(host->dev, "Local DIMM Size = %dMB\n", size);
|
||||
|
||||
/* Programming DIMM Module Global Control Register (index_CID0:88h) */
|
||||
if (pdc20621_prog_dimm_global(host)) {
|
||||
printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n");
|
||||
dev_err(host->dev,
|
||||
"Programming DIMM Module Global Control Register Fail\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -1370,13 +1339,14 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
|
||||
if (!pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
|
||||
PDC_DIMM_SPD_TYPE, &spd0)) {
|
||||
pr_err("Failed in i2c read: device=%#x, subaddr=%#x\n",
|
||||
dev_err(host->dev,
|
||||
"Failed in i2c read: device=%#x, subaddr=%#x\n",
|
||||
PDC_DIMM0_SPD_DEV_ADDRESS, PDC_DIMM_SPD_TYPE);
|
||||
return 1;
|
||||
}
|
||||
if (spd0 == 0x02) {
|
||||
void *buf;
|
||||
VPRINTK("Start ECC initialization\n");
|
||||
dev_dbg(host->dev, "Start ECC initialization\n");
|
||||
addr = 0;
|
||||
length = size * 1024 * 1024;
|
||||
buf = kzalloc(ECC_ERASE_BUF_SZ, GFP_KERNEL);
|
||||
|
|
@ -1388,7 +1358,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
|
|||
addr += ECC_ERASE_BUF_SZ;
|
||||
}
|
||||
kfree(buf);
|
||||
VPRINTK("Finish ECC initialization\n");
|
||||
dev_dbg(host->dev, "Finish ECC initialization\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -605,6 +605,8 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
|
|||
rtl_dev_err(hdev, "mandatory config file %s not found",
|
||||
btrtl_dev->ic_info->cfg_name);
|
||||
ret = btrtl_dev->cfg_len;
|
||||
if (!ret)
|
||||
ret = -EINVAL;
|
||||
goto err_free;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,8 @@ static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
|
|||
if (!skb) {
|
||||
percpu_down_read(&hu->proto_lock);
|
||||
|
||||
if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
|
||||
if (test_bit(HCI_UART_PROTO_READY, &hu->flags) ||
|
||||
test_bit(HCI_UART_PROTO_INIT, &hu->flags))
|
||||
skb = hu->proto->dequeue(hu);
|
||||
|
||||
percpu_up_read(&hu->proto_lock);
|
||||
|
|
@ -124,7 +125,8 @@ int hci_uart_tx_wakeup(struct hci_uart *hu)
|
|||
if (!percpu_down_read_trylock(&hu->proto_lock))
|
||||
return 0;
|
||||
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags))
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
|
||||
!test_bit(HCI_UART_PROTO_INIT, &hu->flags))
|
||||
goto no_schedule;
|
||||
|
||||
set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
|
||||
|
|
@ -278,7 +280,8 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
|
||||
percpu_down_read(&hu->proto_lock);
|
||||
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
|
||||
!test_bit(HCI_UART_PROTO_INIT, &hu->flags)) {
|
||||
percpu_up_read(&hu->proto_lock);
|
||||
return -EUNATCH;
|
||||
}
|
||||
|
|
@ -576,7 +579,8 @@ static void hci_uart_tty_wakeup(struct tty_struct *tty)
|
|||
if (tty != hu->tty)
|
||||
return;
|
||||
|
||||
if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
|
||||
if (test_bit(HCI_UART_PROTO_READY, &hu->flags) ||
|
||||
test_bit(HCI_UART_PROTO_INIT, &hu->flags))
|
||||
hci_uart_tx_wakeup(hu);
|
||||
}
|
||||
|
||||
|
|
@ -602,7 +606,8 @@ static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data,
|
|||
|
||||
percpu_down_read(&hu->proto_lock);
|
||||
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
|
||||
if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
|
||||
!test_bit(HCI_UART_PROTO_INIT, &hu->flags)) {
|
||||
percpu_up_read(&hu->proto_lock);
|
||||
return;
|
||||
}
|
||||
|
|
@ -703,12 +708,16 @@ static int hci_uart_set_proto(struct hci_uart *hu, int id)
|
|||
|
||||
hu->proto = p;
|
||||
|
||||
set_bit(HCI_UART_PROTO_INIT, &hu->flags);
|
||||
|
||||
err = hci_uart_register_dev(hu);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
set_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||
clear_bit(HCI_UART_PROTO_INIT, &hu->flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ struct hci_uart {
|
|||
#define HCI_UART_PROTO_SET 0
|
||||
#define HCI_UART_REGISTERED 1
|
||||
#define HCI_UART_PROTO_READY 2
|
||||
#define HCI_UART_PROTO_INIT 4
|
||||
|
||||
/* TX states */
|
||||
#define HCI_UART_SENDING 1
|
||||
|
|
|
|||
|
|
@ -1619,8 +1619,8 @@ static void handle_control_message(struct virtio_device *vdev,
|
|||
break;
|
||||
case VIRTIO_CONSOLE_RESIZE: {
|
||||
struct {
|
||||
__u16 rows;
|
||||
__u16 cols;
|
||||
__virtio16 rows;
|
||||
__virtio16 cols;
|
||||
} size;
|
||||
|
||||
if (!is_console_port(port))
|
||||
|
|
@ -1628,7 +1628,8 @@ static void handle_control_message(struct virtio_device *vdev,
|
|||
|
||||
memcpy(&size, buf->buf + buf->offset + sizeof(*cpkt),
|
||||
sizeof(size));
|
||||
set_console_size(port, size.rows, size.cols);
|
||||
set_console_size(port, virtio16_to_cpu(vdev, size.rows),
|
||||
virtio16_to_cpu(vdev, size.cols));
|
||||
|
||||
port->cons.hvc->irq_requested = 1;
|
||||
resize_console(port);
|
||||
|
|
|
|||
|
|
@ -4717,6 +4717,10 @@ of_clk_get_hw_from_clkspec(struct of_phandle_args *clkspec)
|
|||
if (!clkspec)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
/* Check if node in clkspec is in disabled/fail state */
|
||||
if (!of_device_is_available(clkspec->np))
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
mutex_lock(&of_clk_mutex);
|
||||
list_for_each_entry(provider, &of_clk_providers, link) {
|
||||
if (provider->node == clkspec->np) {
|
||||
|
|
|
|||
|
|
@ -2550,10 +2550,18 @@ EXPORT_SYMBOL(cpufreq_update_policy);
|
|||
*/
|
||||
void cpufreq_update_limits(unsigned int cpu)
|
||||
{
|
||||
struct cpufreq_policy *policy;
|
||||
|
||||
policy = cpufreq_cpu_get(cpu);
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
if (cpufreq_driver->update_limits)
|
||||
cpufreq_driver->update_limits(cpu);
|
||||
else
|
||||
cpufreq_update_policy(cpu);
|
||||
|
||||
cpufreq_cpu_put(policy);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpufreq_update_limits);
|
||||
|
||||
|
|
|
|||
|
|
@ -39,9 +39,16 @@ static struct scpi_ops *scpi_ops;
|
|||
|
||||
static unsigned int scpi_cpufreq_get_rate(unsigned int cpu)
|
||||
{
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
|
||||
struct scpi_data *priv = policy->driver_data;
|
||||
unsigned long rate = clk_get_rate(priv->clk);
|
||||
struct cpufreq_policy *policy;
|
||||
struct scpi_data *priv;
|
||||
unsigned long rate;
|
||||
|
||||
policy = cpufreq_cpu_get_raw(cpu);
|
||||
if (unlikely(!policy))
|
||||
return 0;
|
||||
|
||||
priv = policy->driver_data;
|
||||
rate = clk_get_rate(priv->clk);
|
||||
|
||||
return rate / 1000;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -107,7 +107,12 @@ static int atmel_sha204a_probe(struct i2c_client *client,
|
|||
|
||||
i2c_priv->hwrng.name = dev_name(&client->dev);
|
||||
i2c_priv->hwrng.read = atmel_sha204a_rng_read;
|
||||
i2c_priv->hwrng.quality = 1024;
|
||||
|
||||
/*
|
||||
* According to review by Bill Cox [1], this HWRNG has very low entropy.
|
||||
* [1] https://www.metzdowd.com/pipermail/cryptography/2014-December/023858.html
|
||||
*/
|
||||
i2c_priv->hwrng.quality = 1;
|
||||
|
||||
ret = devm_hwrng_register(&client->dev, &i2c_priv->hwrng);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -118,14 +118,17 @@ static bool sp_pci_is_master(struct sp_device *sp)
|
|||
pdev_new = to_pci_dev(dev_new);
|
||||
pdev_cur = to_pci_dev(dev_cur);
|
||||
|
||||
if (pdev_new->bus->number < pdev_cur->bus->number)
|
||||
return true;
|
||||
if (pci_domain_nr(pdev_new->bus) != pci_domain_nr(pdev_cur->bus))
|
||||
return pci_domain_nr(pdev_new->bus) < pci_domain_nr(pdev_cur->bus);
|
||||
|
||||
if (PCI_SLOT(pdev_new->devfn) < PCI_SLOT(pdev_cur->devfn))
|
||||
return true;
|
||||
if (pdev_new->bus->number != pdev_cur->bus->number)
|
||||
return pdev_new->bus->number < pdev_cur->bus->number;
|
||||
|
||||
if (PCI_FUNC(pdev_new->devfn) < PCI_FUNC(pdev_cur->devfn))
|
||||
return true;
|
||||
if (PCI_SLOT(pdev_new->devfn) != PCI_SLOT(pdev_cur->devfn))
|
||||
return PCI_SLOT(pdev_new->devfn) < PCI_SLOT(pdev_cur->devfn);
|
||||
|
||||
if (PCI_FUNC(pdev_new->devfn) != PCI_FUNC(pdev_cur->devfn))
|
||||
return PCI_FUNC(pdev_new->devfn) < PCI_FUNC(pdev_cur->devfn);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ static long udmabuf_create(const struct udmabuf_create_list *head,
|
|||
if (!ubuf)
|
||||
return -ENOMEM;
|
||||
|
||||
pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT;
|
||||
pglimit = ((u64)size_limit_mb * 1024 * 1024) >> PAGE_SHIFT;
|
||||
for (i = 0; i < head->count; i++) {
|
||||
if (!IS_ALIGNED(list[i].offset, PAGE_SIZE))
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -809,9 +809,9 @@ static int dmatest_func(void *data)
|
|||
} else {
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
wait_event_freezable_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
wait_event_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
|
||||
status = dma_async_is_tx_complete(chan, cookie, NULL,
|
||||
NULL);
|
||||
|
|
|
|||
|
|
@ -943,6 +943,7 @@ static int zynq_gpio_remove(struct platform_device *pdev)
|
|||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret < 0)
|
||||
dev_warn(&pdev->dev, "pm_runtime_get_sync() Failed\n");
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
gpiochip_remove(&gpio->chip);
|
||||
clk_disable_unprepare(gpio->clk);
|
||||
device_set_wakeup_capable(&pdev->dev, 0);
|
||||
|
|
|
|||
|
|
@ -169,6 +169,11 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (args->ring_size < KFD_MIN_QUEUE_RING_SIZE) {
|
||||
args->ring_size = KFD_MIN_QUEUE_RING_SIZE;
|
||||
pr_debug("Size lower. clamped to KFD_MIN_QUEUE_RING_SIZE");
|
||||
}
|
||||
|
||||
if (!access_ok((const void __user *) args->read_pointer_address,
|
||||
sizeof(uint32_t))) {
|
||||
pr_err("Can't access read pointer\n");
|
||||
|
|
@ -373,6 +378,11 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (args->ring_size < KFD_MIN_QUEUE_RING_SIZE) {
|
||||
args->ring_size = KFD_MIN_QUEUE_RING_SIZE;
|
||||
pr_debug("Size lower. clamped to KFD_MIN_QUEUE_RING_SIZE");
|
||||
}
|
||||
|
||||
properties.queue_address = args->ring_base_address;
|
||||
properties.queue_size = args->ring_size;
|
||||
properties.queue_percent = args->queue_percentage;
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)
|
|||
pr_err("Pasid %d destroy queue %d failed, ret %d\n",
|
||||
pqm->process->pasid,
|
||||
pqn->q->properties.queue_id, retval);
|
||||
if (retval != -ETIME)
|
||||
if (retval != -ETIME && retval != -EIO)
|
||||
goto err_destroy_queue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ int vega20_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
|
|||
uint32_t tach_period, crystal_clock_freq;
|
||||
int result = 0;
|
||||
|
||||
if (!speed)
|
||||
if (!speed || speed > UINT_MAX/8)
|
||||
return -EINVAL;
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_MicrocodeFanControl)) {
|
||||
|
|
|
|||
|
|
@ -1217,7 +1217,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
|
|||
mode = &new_crtc_state->mode;
|
||||
adjusted_mode = &new_crtc_state->adjusted_mode;
|
||||
|
||||
if (!new_crtc_state->mode_changed)
|
||||
if (!new_crtc_state->mode_changed && !new_crtc_state->connectors_changed)
|
||||
continue;
|
||||
|
||||
DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
|
||||
|
|
|
|||
|
|
@ -166,10 +166,10 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* AYA NEO AYANEO 2 */
|
||||
}, { /* AYA NEO AYANEO 2/2S */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
||||
}, { /* AYA NEO 2021 */
|
||||
|
|
@ -235,6 +235,12 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
||||
},
|
||||
.driver_data = (void *)&gpd_win2,
|
||||
}, { /* GPD Win 2 (correct DMI strings) */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "WIN2")
|
||||
},
|
||||
.driver_data = (void *)&lcd720x1280_rightside_up,
|
||||
}, { /* GPD Win 3 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
||||
|
|
|
|||
|
|
@ -366,6 +366,7 @@ static void mtk_dpi_power_off(struct mtk_dpi *dpi)
|
|||
|
||||
mtk_dpi_disable(dpi);
|
||||
clk_disable_unprepare(dpi->pixel_clk);
|
||||
clk_disable_unprepare(dpi->tvd_clk);
|
||||
clk_disable_unprepare(dpi->engine_clk);
|
||||
}
|
||||
|
||||
|
|
@ -382,6 +383,12 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi)
|
|||
goto err_refcount;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(dpi->tvd_clk);
|
||||
if (ret) {
|
||||
dev_err(dpi->dev, "Failed to enable tvd pll: %d\n", ret);
|
||||
goto err_engine;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(dpi->pixel_clk);
|
||||
if (ret) {
|
||||
dev_err(dpi->dev, "Failed to enable pixel clock: %d\n", ret);
|
||||
|
|
@ -391,6 +398,8 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi)
|
|||
return 0;
|
||||
|
||||
err_pixel:
|
||||
clk_disable_unprepare(dpi->tvd_clk);
|
||||
err_engine:
|
||||
clk_disable_unprepare(dpi->engine_clk);
|
||||
err_refcount:
|
||||
dpi->refcount--;
|
||||
|
|
|
|||
|
|
@ -139,6 +139,9 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
|
|||
WARN_ON(nvbo->pin_refcnt > 0);
|
||||
nv10_bo_put_tile_region(dev, nvbo->tile, NULL);
|
||||
|
||||
if (bo->base.import_attach)
|
||||
drm_prime_gem_destroy(&bo->base, bo->sg);
|
||||
|
||||
/*
|
||||
* If nouveau_bo_new() allocated this buffer, the GEM object was never
|
||||
* initialized, so don't attempt to release it.
|
||||
|
|
|
|||
|
|
@ -50,9 +50,6 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
|
|||
return;
|
||||
}
|
||||
|
||||
if (gem->import_attach)
|
||||
drm_prime_gem_destroy(gem, nvbo->bo.sg);
|
||||
|
||||
ttm_bo_put(&nvbo->bo);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ sti-drm-y := \
|
|||
sti_compositor.o \
|
||||
sti_crtc.o \
|
||||
sti_plane.o \
|
||||
sti_crtc.o \
|
||||
sti_plane.o \
|
||||
sti_hdmi.o \
|
||||
sti_hdmi_tx3g4c28phy.o \
|
||||
sti_dvo.o \
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ static void repaper_frame_fixed_repeat(struct repaper_epd *epd, u8 fixed_value,
|
|||
enum repaper_stage stage)
|
||||
{
|
||||
u64 start = local_clock();
|
||||
u64 end = start + (epd->factored_stage_time * 1000 * 1000);
|
||||
u64 end = start + ((u64)epd->factored_stage_time * 1000 * 1000);
|
||||
|
||||
do {
|
||||
repaper_frame_fixed(epd, fixed_value, stage);
|
||||
|
|
@ -465,7 +465,7 @@ static void repaper_frame_data_repeat(struct repaper_epd *epd, const u8 *image,
|
|||
const u8 *mask, enum repaper_stage stage)
|
||||
{
|
||||
u64 start = local_clock();
|
||||
u64 end = start + (epd->factored_stage_time * 1000 * 1000);
|
||||
u64 end = start + ((u64)epd->factored_stage_time * 1000 * 1000);
|
||||
|
||||
do {
|
||||
repaper_frame_data(epd, image, mask, stage);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include "usbhid.h"
|
||||
|
||||
#define PID_EFFECTS_MAX 64
|
||||
#define PID_INFINITE 0xffff
|
||||
|
||||
/* Report usage table used to put reports into an array */
|
||||
|
||||
|
|
@ -261,10 +262,22 @@ static void pidff_set_envelope_report(struct pidff_device *pidff,
|
|||
static int pidff_needs_set_envelope(struct ff_envelope *envelope,
|
||||
struct ff_envelope *old)
|
||||
{
|
||||
return envelope->attack_level != old->attack_level ||
|
||||
envelope->fade_level != old->fade_level ||
|
||||
bool needs_new_envelope;
|
||||
needs_new_envelope = envelope->attack_level != 0 ||
|
||||
envelope->fade_level != 0 ||
|
||||
envelope->attack_length != 0 ||
|
||||
envelope->fade_length != 0;
|
||||
|
||||
if (!needs_new_envelope)
|
||||
return false;
|
||||
|
||||
if (!old)
|
||||
return needs_new_envelope;
|
||||
|
||||
return envelope->attack_level != old->attack_level ||
|
||||
envelope->fade_level != old->fade_level ||
|
||||
envelope->attack_length != old->attack_length ||
|
||||
envelope->fade_length != old->fade_length;
|
||||
envelope->fade_length != old->fade_length;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -301,7 +314,12 @@ static void pidff_set_effect_report(struct pidff_device *pidff,
|
|||
pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
|
||||
pidff->set_effect_type->value[0] =
|
||||
pidff->create_new_effect_type->value[0];
|
||||
pidff->set_effect[PID_DURATION].value[0] = effect->replay.length;
|
||||
|
||||
/* Convert infinite length from Linux API (0)
|
||||
to PID standard (NULL) if needed */
|
||||
pidff->set_effect[PID_DURATION].value[0] =
|
||||
effect->replay.length == 0 ? PID_INFINITE : effect->replay.length;
|
||||
|
||||
pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button;
|
||||
pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] =
|
||||
effect->trigger.interval;
|
||||
|
|
@ -574,11 +592,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
|
|||
pidff_set_effect_report(pidff, effect);
|
||||
if (!old || pidff_needs_set_constant(effect, old))
|
||||
pidff_set_constant_force_report(pidff, effect);
|
||||
if (!old ||
|
||||
pidff_needs_set_envelope(&effect->u.constant.envelope,
|
||||
&old->u.constant.envelope))
|
||||
pidff_set_envelope_report(pidff,
|
||||
&effect->u.constant.envelope);
|
||||
if (pidff_needs_set_envelope(&effect->u.constant.envelope,
|
||||
old ? &old->u.constant.envelope : NULL))
|
||||
pidff_set_envelope_report(pidff, &effect->u.constant.envelope);
|
||||
break;
|
||||
|
||||
case FF_PERIODIC:
|
||||
|
|
@ -613,11 +629,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
|
|||
pidff_set_effect_report(pidff, effect);
|
||||
if (!old || pidff_needs_set_periodic(effect, old))
|
||||
pidff_set_periodic_report(pidff, effect);
|
||||
if (!old ||
|
||||
pidff_needs_set_envelope(&effect->u.periodic.envelope,
|
||||
&old->u.periodic.envelope))
|
||||
pidff_set_envelope_report(pidff,
|
||||
&effect->u.periodic.envelope);
|
||||
if (pidff_needs_set_envelope(&effect->u.periodic.envelope,
|
||||
old ? &old->u.periodic.envelope : NULL))
|
||||
pidff_set_envelope_report(pidff, &effect->u.periodic.envelope);
|
||||
break;
|
||||
|
||||
case FF_RAMP:
|
||||
|
|
@ -631,11 +645,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
|
|||
pidff_set_effect_report(pidff, effect);
|
||||
if (!old || pidff_needs_set_ramp(effect, old))
|
||||
pidff_set_ramp_force_report(pidff, effect);
|
||||
if (!old ||
|
||||
pidff_needs_set_envelope(&effect->u.ramp.envelope,
|
||||
&old->u.ramp.envelope))
|
||||
pidff_set_envelope_report(pidff,
|
||||
&effect->u.ramp.envelope);
|
||||
if (pidff_needs_set_envelope(&effect->u.ramp.envelope,
|
||||
old ? &old->u.ramp.envelope : NULL))
|
||||
pidff_set_envelope_report(pidff, &effect->u.ramp.envelope);
|
||||
break;
|
||||
|
||||
case FF_SPRING:
|
||||
|
|
@ -760,6 +772,11 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
|
|||
{
|
||||
int i, j, k, found;
|
||||
|
||||
if (!report) {
|
||||
pr_debug("pidff_find_fields, null report\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (k = 0; k < count; k++) {
|
||||
found = 0;
|
||||
for (i = 0; i < report->maxfield; i++) {
|
||||
|
|
@ -873,6 +890,11 @@ static struct hid_field *pidff_find_special_field(struct hid_report *report,
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!report) {
|
||||
pr_debug("pidff_find_special_field, null report\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < report->maxfield; i++) {
|
||||
if (report->field[i]->logical == (HID_UP_PID | usage) &&
|
||||
report->field[i]->report_count > 0) {
|
||||
|
|
|
|||
|
|
@ -403,6 +403,7 @@ static void ssip_reset(struct hsi_client *cl)
|
|||
del_timer(&ssi->rx_wd);
|
||||
del_timer(&ssi->tx_wd);
|
||||
del_timer(&ssi->keep_alive);
|
||||
cancel_work_sync(&ssi->work);
|
||||
ssi->main_state = 0;
|
||||
ssi->send_state = 0;
|
||||
ssi->recv_state = 0;
|
||||
|
|
|
|||
|
|
@ -247,6 +247,9 @@ static int ec_i2c_probe(struct platform_device *pdev)
|
|||
u32 remote_bus;
|
||||
int err;
|
||||
|
||||
if (!ec)
|
||||
return dev_err_probe(dev, -EPROBE_DEFER, "couldn't find parent EC device\n");
|
||||
|
||||
if (!ec->cmd_xfer) {
|
||||
dev_err(dev, "Missing sendrecv\n");
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -2198,6 +2198,9 @@ static void i3c_master_unregister_i3c_devs(struct i3c_master_controller *master)
|
|||
*/
|
||||
void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)
|
||||
{
|
||||
if (!dev->ibi || !slot)
|
||||
return;
|
||||
|
||||
atomic_inc(&dev->ibi->pending_ibis);
|
||||
queue_work(dev->common.master->wq, &slot->work);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ static const struct iio_chan_spec ad7768_channels[] = {
|
|||
.channel = 0,
|
||||
.scan_index = 0,
|
||||
.scan_type = {
|
||||
.sign = 'u',
|
||||
.sign = 's',
|
||||
.realbits = 24,
|
||||
.storagebits = 32,
|
||||
.shift = 8,
|
||||
|
|
@ -369,12 +369,11 @@ static int ad7768_read_raw(struct iio_dev *indio_dev,
|
|||
return ret;
|
||||
|
||||
ret = ad7768_scan_direct(indio_dev);
|
||||
if (ret >= 0)
|
||||
*val = ret;
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = sign_extend32(ret, chan->scan_type.realbits - 1);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ static int qibfs_mknod(struct inode *dir, struct dentry *dentry,
|
|||
struct inode *inode = new_inode(dir->i_sb);
|
||||
|
||||
if (!inode) {
|
||||
dput(dentry);
|
||||
error = -EPERM;
|
||||
goto bail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ static void *usnic_ib_device_add(struct pci_dev *dev)
|
|||
if (!us_ibdev) {
|
||||
usnic_err("Device %s context alloc failed\n",
|
||||
netdev_name(pci_get_drvdata(dev)));
|
||||
return ERR_PTR(-EFAULT);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
us_ibdev->ufdev = usnic_fwd_dev_alloc(dev);
|
||||
|
|
@ -520,8 +520,8 @@ static struct usnic_ib_dev *usnic_ib_discover_pf(struct usnic_vnic *vnic)
|
|||
}
|
||||
|
||||
us_ibdev = usnic_ib_device_add(parent_pci);
|
||||
if (IS_ERR_OR_NULL(us_ibdev)) {
|
||||
us_ibdev = us_ibdev ? us_ibdev : ERR_PTR(-EFAULT);
|
||||
if (!us_ibdev) {
|
||||
us_ibdev = ERR_PTR(-EFAULT);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -584,10 +584,10 @@ static int usnic_ib_pci_probe(struct pci_dev *pdev,
|
|||
}
|
||||
|
||||
pf = usnic_ib_discover_pf(vf->vnic);
|
||||
if (IS_ERR_OR_NULL(pf)) {
|
||||
usnic_err("Failed to discover pf of vnic %s with err%ld\n",
|
||||
pci_name(pdev), PTR_ERR(pf));
|
||||
err = pf ? PTR_ERR(pf) : -EFAULT;
|
||||
if (IS_ERR(pf)) {
|
||||
err = PTR_ERR(pf);
|
||||
usnic_err("Failed to discover pf of vnic %s with err%d\n",
|
||||
pci_name(pdev), err);
|
||||
goto out_clean_vnic;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -79,12 +79,16 @@ module_param(srpt_srq_size, int, 0444);
|
|||
MODULE_PARM_DESC(srpt_srq_size,
|
||||
"Shared receive queue (SRQ) size.");
|
||||
|
||||
static int srpt_set_u64_x(const char *buffer, const struct kernel_param *kp)
|
||||
{
|
||||
return kstrtou64(buffer, 16, (u64 *)kp->arg);
|
||||
}
|
||||
static int srpt_get_u64_x(char *buffer, const struct kernel_param *kp)
|
||||
{
|
||||
return sprintf(buffer, "0x%016llx", *(u64 *)kp->arg);
|
||||
}
|
||||
module_param_call(srpt_service_guid, NULL, srpt_get_u64_x, &srpt_service_guid,
|
||||
0444);
|
||||
module_param_call(srpt_service_guid, srpt_set_u64_x, srpt_get_u64_x,
|
||||
&srpt_service_guid, 0444);
|
||||
MODULE_PARM_DESC(srpt_service_guid,
|
||||
"Using this value for ioc_guid, id_ext, and cm_listen_id instead of using the node_guid of the first HCA.");
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ static int chameleon_parse_gdd(struct mcb_bus *bus,
|
|||
|
||||
ret = mcb_device_register(bus, mdev);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -4112,16 +4112,19 @@ try_smaller_buffer:
|
|||
|
||||
ic->recalc_bitmap = dm_integrity_alloc_page_list(n_bitmap_pages);
|
||||
if (!ic->recalc_bitmap) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
ic->may_write_bitmap = dm_integrity_alloc_page_list(n_bitmap_pages);
|
||||
if (!ic->may_write_bitmap) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
ic->bbs = kvmalloc_array(ic->n_bitmap_blocks, sizeof(struct bitmap_block_status), GFP_KERNEL);
|
||||
if (!ic->bbs) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2051,14 +2051,9 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
|
|||
if (!rdev_set_badblocks(rdev, sect, s, 0))
|
||||
abort = 1;
|
||||
}
|
||||
if (abort) {
|
||||
conf->recovery_disabled =
|
||||
mddev->recovery_disabled;
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_done_sync(mddev, r1_bio->sectors, 0);
|
||||
put_buf(r1_bio);
|
||||
if (abort)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Try next page */
|
||||
sectors -= s;
|
||||
sect += s;
|
||||
|
|
@ -2198,10 +2193,21 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
|
|||
int disks = conf->raid_disks * 2;
|
||||
struct bio *wbio;
|
||||
|
||||
if (!test_bit(R1BIO_Uptodate, &r1_bio->state))
|
||||
/* ouch - failed to read all of that. */
|
||||
if (!fix_sync_read_error(r1_bio))
|
||||
if (!test_bit(R1BIO_Uptodate, &r1_bio->state)) {
|
||||
/*
|
||||
* ouch - failed to read all of that.
|
||||
* No need to fix read error for check/repair
|
||||
* because all member disks are read.
|
||||
*/
|
||||
if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) ||
|
||||
!fix_sync_read_error(r1_bio)) {
|
||||
conf->recovery_disabled = mddev->recovery_disabled;
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_done_sync(mddev, r1_bio->sectors, 0);
|
||||
put_buf(r1_bio);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
|
||||
process_checks(r1_bio);
|
||||
|
|
|
|||
|
|
@ -1210,6 +1210,8 @@ static int __init smsdvb_module_init(void)
|
|||
smsdvb_debugfs_register();
|
||||
|
||||
rc = smscore_register_hotplug(smsdvb_hotplug);
|
||||
if (rc)
|
||||
smsdvb_debugfs_unregister();
|
||||
|
||||
pr_debug("\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ struct adv748x_state {
|
|||
|
||||
/* Free run pattern select */
|
||||
#define ADV748X_SDP_FRP 0x14
|
||||
#define ADV748X_SDP_FRP_MASK GENMASK(3, 1)
|
||||
#define ADV748X_SDP_FRP_MASK GENMASK(2, 0)
|
||||
|
||||
/* Saturation */
|
||||
#define ADV748X_SDP_SD_SAT_U 0xe3 /* user_map_rw_reg_e3 */
|
||||
|
|
|
|||
|
|
@ -748,6 +748,8 @@ static int ov7251_set_power_on(struct ov7251 *ov7251)
|
|||
return ret;
|
||||
}
|
||||
|
||||
usleep_range(1000, 1100);
|
||||
|
||||
gpiod_set_value_cansleep(ov7251->enable_gpio, 1);
|
||||
|
||||
/* wait at least 65536 external clock cycles */
|
||||
|
|
@ -1330,7 +1332,7 @@ static int ov7251_probe(struct i2c_client *client)
|
|||
return PTR_ERR(ov7251->analog_regulator);
|
||||
}
|
||||
|
||||
ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
|
||||
ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(ov7251->enable_gpio)) {
|
||||
dev_err(dev, "cannot get enable gpio\n");
|
||||
return PTR_ERR(ov7251->enable_gpio);
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ static void init_codecs(struct venus_core *core)
|
|||
struct venus_caps *caps = core->caps, *cap;
|
||||
unsigned long bit;
|
||||
|
||||
core->codecs_count = 0;
|
||||
|
||||
if (hweight_long(core->dec_codecs) + hweight_long(core->enc_codecs) > MAX_CODEC_NUM)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -188,6 +188,9 @@ static int venus_write_queue(struct venus_hfi_device *hdev,
|
|||
/* ensure rd/wr indices's are read from memory */
|
||||
rmb();
|
||||
|
||||
if (qsize > IFACEQ_QUEUE_SIZE / 4)
|
||||
return -EINVAL;
|
||||
|
||||
if (wr_idx >= rd_idx)
|
||||
empty_space = qsize - (wr_idx - rd_idx);
|
||||
else
|
||||
|
|
@ -256,6 +259,9 @@ static int venus_read_queue(struct venus_hfi_device *hdev,
|
|||
wr_idx = qhdr->write_idx;
|
||||
qsize = qhdr->q_size;
|
||||
|
||||
if (qsize > IFACEQ_QUEUE_SIZE / 4)
|
||||
return -EINVAL;
|
||||
|
||||
/* make sure data is valid before using it */
|
||||
rmb();
|
||||
|
||||
|
|
@ -970,18 +976,26 @@ static void venus_sfr_print(struct venus_hfi_device *hdev)
|
|||
{
|
||||
struct device *dev = hdev->core->dev;
|
||||
struct hfi_sfr *sfr = hdev->sfr.kva;
|
||||
u32 size;
|
||||
void *p;
|
||||
|
||||
if (!sfr)
|
||||
return;
|
||||
|
||||
p = memchr(sfr->data, '\0', sfr->buf_size);
|
||||
size = sfr->buf_size;
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
if (size > ALIGNED_SFR_SIZE)
|
||||
size = ALIGNED_SFR_SIZE;
|
||||
|
||||
p = memchr(sfr->data, '\0', size);
|
||||
/*
|
||||
* SFR isn't guaranteed to be NULL terminated since SYS_ERROR indicates
|
||||
* that Venus is in the process of crashing.
|
||||
*/
|
||||
if (!p)
|
||||
sfr->data[sfr->buf_size - 1] = '\0';
|
||||
sfr->data[size - 1] = '\0';
|
||||
|
||||
dev_err_ratelimited(dev, "SFR message from FW: %s\n", sfr->data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1334,9 +1334,6 @@ static int vim2m_probe(struct platform_device *pdev)
|
|||
vfd->v4l2_dev = &dev->v4l2_dev;
|
||||
|
||||
video_set_drvdata(vfd, dev);
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"Device registered as /dev/video%d\n", vfd->num);
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
dev->m2m_dev = v4l2_m2m_init(&m2m_ops);
|
||||
|
|
@ -1363,6 +1360,9 @@ static int vim2m_probe(struct platform_device *pdev)
|
|||
goto error_m2m;
|
||||
}
|
||||
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"Device registered as /dev/video%d\n", vfd->num);
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
ret = v4l2_m2m_register_media_controller(dev->m2m_dev, vfd,
|
||||
MEDIA_ENT_F_PROC_VIDEO_SCALER);
|
||||
|
|
|
|||
|
|
@ -182,39 +182,10 @@ static void sz_push_half_space(struct streamzap_ir *sz,
|
|||
sz_push_full_space(sz, value & SZ_SPACE_MASK);
|
||||
}
|
||||
|
||||
/*
|
||||
* streamzap_callback - usb IRQ handler callback
|
||||
*
|
||||
* This procedure is invoked on reception of data from
|
||||
* the usb remote.
|
||||
*/
|
||||
static void streamzap_callback(struct urb *urb)
|
||||
static void sz_process_ir_data(struct streamzap_ir *sz, int len)
|
||||
{
|
||||
struct streamzap_ir *sz;
|
||||
unsigned int i;
|
||||
int len;
|
||||
|
||||
if (!urb)
|
||||
return;
|
||||
|
||||
sz = urb->context;
|
||||
len = urb->actual_length;
|
||||
|
||||
switch (urb->status) {
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/*
|
||||
* this urb is terminated, clean up.
|
||||
* sz might already be invalid at this point
|
||||
*/
|
||||
dev_err(sz->dev, "urb terminated, status: %d\n", urb->status);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dev_dbg(sz->dev, "%s: received urb, len %d\n", __func__, len);
|
||||
for (i = 0; i < len; i++) {
|
||||
dev_dbg(sz->dev, "sz->buf_in[%d]: %x\n",
|
||||
i, (unsigned char)sz->buf_in[i]);
|
||||
|
|
@ -267,6 +238,43 @@ static void streamzap_callback(struct urb *urb)
|
|||
}
|
||||
|
||||
ir_raw_event_handle(sz->rdev);
|
||||
}
|
||||
|
||||
/*
|
||||
* streamzap_callback - usb IRQ handler callback
|
||||
*
|
||||
* This procedure is invoked on reception of data from
|
||||
* the usb remote.
|
||||
*/
|
||||
static void streamzap_callback(struct urb *urb)
|
||||
{
|
||||
struct streamzap_ir *sz;
|
||||
int len;
|
||||
|
||||
if (!urb)
|
||||
return;
|
||||
|
||||
sz = urb->context;
|
||||
len = urb->actual_length;
|
||||
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
dev_dbg(sz->dev, "%s: received urb, len %d\n", __func__, len);
|
||||
sz_process_ir_data(sz, len);
|
||||
break;
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/*
|
||||
* this urb is terminated, clean up.
|
||||
* sz might already be invalid at this point
|
||||
*/
|
||||
dev_err(sz->dev, "urb terminated, status: %d\n", urb->status);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
usb_submit_urb(urb, GFP_ATOMIC);
|
||||
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -755,7 +755,7 @@ bool v4l2_detect_gtf(unsigned frame_height,
|
|||
u64 num;
|
||||
u32 den;
|
||||
|
||||
num = ((image_width * GTF_D_C_PRIME * (u64)hfreq) -
|
||||
num = (((u64)image_width * GTF_D_C_PRIME * hfreq) -
|
||||
((u64)image_width * GTF_D_M_PRIME * 1000));
|
||||
den = (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) *
|
||||
(2 * GTF_CELL_GRAN);
|
||||
|
|
@ -765,7 +765,7 @@ bool v4l2_detect_gtf(unsigned frame_height,
|
|||
u64 num;
|
||||
u32 den;
|
||||
|
||||
num = ((image_width * GTF_S_C_PRIME * (u64)hfreq) -
|
||||
num = (((u64)image_width * GTF_S_C_PRIME * hfreq) -
|
||||
((u64)image_width * GTF_S_M_PRIME * 1000));
|
||||
den = (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) *
|
||||
(2 * GTF_CELL_GRAN);
|
||||
|
|
|
|||
|
|
@ -27,14 +27,14 @@
|
|||
#define DRV_MODULE_NAME "pci-endpoint-test"
|
||||
|
||||
#define IRQ_TYPE_UNDEFINED -1
|
||||
#define IRQ_TYPE_LEGACY 0
|
||||
#define IRQ_TYPE_INTX 0
|
||||
#define IRQ_TYPE_MSI 1
|
||||
#define IRQ_TYPE_MSIX 2
|
||||
|
||||
#define PCI_ENDPOINT_TEST_MAGIC 0x0
|
||||
|
||||
#define PCI_ENDPOINT_TEST_COMMAND 0x4
|
||||
#define COMMAND_RAISE_LEGACY_IRQ BIT(0)
|
||||
#define COMMAND_RAISE_INTX_IRQ BIT(0)
|
||||
#define COMMAND_RAISE_MSI_IRQ BIT(1)
|
||||
#define COMMAND_RAISE_MSIX_IRQ BIT(2)
|
||||
#define COMMAND_READ BIT(3)
|
||||
|
|
@ -170,8 +170,8 @@ static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test,
|
|||
bool res = true;
|
||||
|
||||
switch (type) {
|
||||
case IRQ_TYPE_LEGACY:
|
||||
irq = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
|
||||
case IRQ_TYPE_INTX:
|
||||
irq = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_INTX);
|
||||
if (irq < 0)
|
||||
dev_err(dev, "Failed to get Legacy interrupt\n");
|
||||
break;
|
||||
|
|
@ -230,8 +230,8 @@ static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test)
|
|||
return true;
|
||||
|
||||
fail:
|
||||
switch (irq_type) {
|
||||
case IRQ_TYPE_LEGACY:
|
||||
switch (test->irq_type) {
|
||||
case IRQ_TYPE_INTX:
|
||||
dev_err(dev, "Failed to request IRQ %d for Legacy\n",
|
||||
pci_irq_vector(pdev, i));
|
||||
break;
|
||||
|
|
@ -247,6 +247,9 @@ fail:
|
|||
break;
|
||||
}
|
||||
|
||||
test->num_irqs = i;
|
||||
pci_endpoint_test_release_irq(test);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -278,15 +281,15 @@ static bool pci_endpoint_test_bar(struct pci_endpoint_test *test,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test)
|
||||
static bool pci_endpoint_test_intx_irq(struct pci_endpoint_test *test)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
|
||||
IRQ_TYPE_LEGACY);
|
||||
IRQ_TYPE_INTX);
|
||||
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0);
|
||||
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
|
||||
COMMAND_RAISE_LEGACY_IRQ);
|
||||
COMMAND_RAISE_INTX_IRQ);
|
||||
val = wait_for_completion_timeout(&test->irq_raised,
|
||||
msecs_to_jiffies(1000));
|
||||
if (!val)
|
||||
|
|
@ -341,7 +344,7 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
|
|||
if (size > SIZE_MAX - alignment)
|
||||
goto err;
|
||||
|
||||
if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
|
||||
if (irq_type < IRQ_TYPE_INTX || irq_type > IRQ_TYPE_MSIX) {
|
||||
dev_err(dev, "Invalid IRQ type option\n");
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -437,7 +440,7 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
|
|||
if (size > SIZE_MAX - alignment)
|
||||
goto err;
|
||||
|
||||
if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
|
||||
if (irq_type < IRQ_TYPE_INTX || irq_type > IRQ_TYPE_MSIX) {
|
||||
dev_err(dev, "Invalid IRQ type option\n");
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -506,7 +509,7 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
|
|||
if (size > SIZE_MAX - alignment)
|
||||
goto err;
|
||||
|
||||
if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
|
||||
if (irq_type < IRQ_TYPE_INTX || irq_type > IRQ_TYPE_MSIX) {
|
||||
dev_err(dev, "Invalid IRQ type option\n");
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -557,7 +560,7 @@ static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test,
|
|||
struct pci_dev *pdev = test->pdev;
|
||||
struct device *dev = &pdev->dev;
|
||||
|
||||
if (req_irq_type < IRQ_TYPE_LEGACY || req_irq_type > IRQ_TYPE_MSIX) {
|
||||
if (req_irq_type < IRQ_TYPE_INTX || req_irq_type > IRQ_TYPE_MSIX) {
|
||||
dev_err(dev, "Invalid IRQ type option\n");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -574,6 +577,7 @@ static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test,
|
|||
if (!pci_endpoint_test_request_irq(test))
|
||||
goto err;
|
||||
|
||||
irq_type = test->irq_type;
|
||||
return true;
|
||||
|
||||
err:
|
||||
|
|
@ -603,8 +607,8 @@ static long pci_endpoint_test_ioctl(struct file *file, unsigned int cmd,
|
|||
goto ret;
|
||||
ret = pci_endpoint_test_bar(test, bar);
|
||||
break;
|
||||
case PCITEST_LEGACY_IRQ:
|
||||
ret = pci_endpoint_test_legacy_irq(test);
|
||||
case PCITEST_INTX_IRQ:
|
||||
ret = pci_endpoint_test_intx_irq(test);
|
||||
break;
|
||||
case PCITEST_MSI:
|
||||
case PCITEST_MSIX:
|
||||
|
|
@ -664,7 +668,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
|
|||
test->irq_type = IRQ_TYPE_UNDEFINED;
|
||||
|
||||
if (no_msi)
|
||||
irq_type = IRQ_TYPE_LEGACY;
|
||||
irq_type = IRQ_TYPE_INTX;
|
||||
|
||||
data = (struct pci_endpoint_test_data *)ent->driver_data;
|
||||
if (data) {
|
||||
|
|
|
|||
|
|
@ -586,7 +586,7 @@ static int cqhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
cqhci_writel(cq_host, 0, CQHCI_CTL);
|
||||
mmc->cqe_on = true;
|
||||
pr_debug("%s: cqhci: CQE on\n", mmc_hostname(mmc));
|
||||
if (cqhci_readl(cq_host, CQHCI_CTL) && CQHCI_HALT) {
|
||||
if (cqhci_readl(cq_host, CQHCI_CTL) & CQHCI_HALT) {
|
||||
pr_err("%s: cqhci: CQE failed to exit halt state\n",
|
||||
mmc_hostname(mmc));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -482,10 +482,11 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block)
|
|||
silly = MAX_LOOPS;
|
||||
|
||||
while (thisEUN <= inftl->lastEUN) {
|
||||
inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
|
||||
blockofs, 8, &retlen, (char *)&bci);
|
||||
|
||||
status = bci.Status | bci.Status1;
|
||||
if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
|
||||
blockofs, 8, &retlen, (char *)&bci) < 0)
|
||||
status = SECTOR_IGNORE;
|
||||
else
|
||||
status = bci.Status | bci.Status1;
|
||||
pr_debug("INFTL: status of block %d in EUN %d is %x\n",
|
||||
block , writeEUN, status);
|
||||
|
||||
|
|
|
|||
|
|
@ -2560,7 +2560,7 @@ static int brcmnand_resume(struct device *dev)
|
|||
brcmnand_save_restore_cs_config(host, 1);
|
||||
|
||||
/* Reset the chip, required by some chips after power-up */
|
||||
nand_reset_op(chip);
|
||||
nand_reset(chip, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -387,6 +387,9 @@ static int r852_wait(struct nand_chip *chip)
|
|||
static int r852_ready(struct nand_chip *chip)
|
||||
{
|
||||
struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
|
||||
if (dev->card_unstable)
|
||||
return 0;
|
||||
|
||||
return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -671,6 +671,15 @@ static void b53_enable_mib(struct b53_device *dev)
|
|||
b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc);
|
||||
}
|
||||
|
||||
static void b53_enable_stp(struct b53_device *dev)
|
||||
{
|
||||
u8 gc;
|
||||
|
||||
b53_read8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, &gc);
|
||||
gc |= GC_RX_BPDU_EN;
|
||||
b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc);
|
||||
}
|
||||
|
||||
static u16 b53_default_pvid(struct b53_device *dev)
|
||||
{
|
||||
if (is5325(dev) || is5365(dev))
|
||||
|
|
@ -777,6 +786,7 @@ static int b53_switch_reset(struct b53_device *dev)
|
|||
}
|
||||
|
||||
b53_enable_mib(dev);
|
||||
b53_enable_stp(dev);
|
||||
|
||||
return b53_flush_arl(dev, FAST_AGE_STATIC);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2613,6 +2613,21 @@ static int mv88e6xxx_stats_setup(struct mv88e6xxx_chip *chip)
|
|||
return mv88e6xxx_g1_stats_clear(chip);
|
||||
}
|
||||
|
||||
static int mv88e6320_setup_errata(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
u16 dummy;
|
||||
int err;
|
||||
|
||||
/* Workaround for erratum
|
||||
* 3.3 RGMII timing may be out of spec when transmit delay is enabled
|
||||
*/
|
||||
err = mv88e6xxx_port_hidden_write(chip, 0, 0xf, 0x7, 0xe000);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return mv88e6xxx_port_hidden_read(chip, 0, 0xf, 0x7, &dummy);
|
||||
}
|
||||
|
||||
/* Check if the errata has already been applied. */
|
||||
static bool mv88e6390_setup_errata_applied(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
|
|
@ -3811,6 +3826,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|||
|
||||
static const struct mv88e6xxx_ops mv88e6320_ops = {
|
||||
/* MV88E6XXX_FAMILY_6320 */
|
||||
.setup_errata = mv88e6320_setup_errata,
|
||||
.ieee_pri_map = mv88e6085_g1_ieee_pri_map,
|
||||
.ip_pri_map = mv88e6085_g1_ip_pri_map,
|
||||
.irl_init_all = mv88e6352_g2_irl_init_all,
|
||||
|
|
@ -3845,8 +3861,8 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|||
.mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
|
||||
.pot_clear = mv88e6xxx_g2_pot_clear,
|
||||
.reset = mv88e6352_g1_reset,
|
||||
.vtu_getnext = mv88e6185_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6185_g1_vtu_loadpurge,
|
||||
.vtu_getnext = mv88e6352_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.gpio_ops = &mv88e6352_gpio_ops,
|
||||
.avb_ops = &mv88e6352_avb_ops,
|
||||
.ptp_ops = &mv88e6352_ptp_ops,
|
||||
|
|
@ -3855,6 +3871,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|||
|
||||
static const struct mv88e6xxx_ops mv88e6321_ops = {
|
||||
/* MV88E6XXX_FAMILY_6320 */
|
||||
.setup_errata = mv88e6320_setup_errata,
|
||||
.ieee_pri_map = mv88e6085_g1_ieee_pri_map,
|
||||
.ip_pri_map = mv88e6085_g1_ip_pri_map,
|
||||
.irl_init_all = mv88e6352_g2_irl_init_all,
|
||||
|
|
@ -3888,8 +3905,8 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
.mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
|
||||
.reset = mv88e6352_g1_reset,
|
||||
.vtu_getnext = mv88e6185_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6185_g1_vtu_loadpurge,
|
||||
.vtu_getnext = mv88e6352_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.gpio_ops = &mv88e6352_gpio_ops,
|
||||
.avb_ops = &mv88e6352_avb_ops,
|
||||
.ptp_ops = &mv88e6352_ptp_ops,
|
||||
|
|
|
|||
|
|
@ -91,9 +91,8 @@ int phy_led_triggers_register(struct phy_device *phy)
|
|||
if (!phy->phy_num_led_triggers)
|
||||
return 0;
|
||||
|
||||
phy->led_link_trigger = devm_kzalloc(&phy->mdio.dev,
|
||||
sizeof(*phy->led_link_trigger),
|
||||
GFP_KERNEL);
|
||||
phy->led_link_trigger = kzalloc(sizeof(*phy->led_link_trigger),
|
||||
GFP_KERNEL);
|
||||
if (!phy->led_link_trigger) {
|
||||
err = -ENOMEM;
|
||||
goto out_clear;
|
||||
|
|
@ -108,10 +107,9 @@ int phy_led_triggers_register(struct phy_device *phy)
|
|||
if (err)
|
||||
goto out_free_link;
|
||||
|
||||
phy->phy_led_triggers = devm_kcalloc(&phy->mdio.dev,
|
||||
phy->phy_num_led_triggers,
|
||||
sizeof(struct phy_led_trigger),
|
||||
GFP_KERNEL);
|
||||
phy->phy_led_triggers = kcalloc(phy->phy_num_led_triggers,
|
||||
sizeof(struct phy_led_trigger),
|
||||
GFP_KERNEL);
|
||||
if (!phy->phy_led_triggers) {
|
||||
err = -ENOMEM;
|
||||
goto out_unreg_link;
|
||||
|
|
@ -131,11 +129,11 @@ int phy_led_triggers_register(struct phy_device *phy)
|
|||
out_unreg:
|
||||
while (i--)
|
||||
phy_led_trigger_unregister(&phy->phy_led_triggers[i]);
|
||||
devm_kfree(&phy->mdio.dev, phy->phy_led_triggers);
|
||||
kfree(phy->phy_led_triggers);
|
||||
out_unreg_link:
|
||||
phy_led_trigger_unregister(phy->led_link_trigger);
|
||||
out_free_link:
|
||||
devm_kfree(&phy->mdio.dev, phy->led_link_trigger);
|
||||
kfree(phy->led_link_trigger);
|
||||
phy->led_link_trigger = NULL;
|
||||
out_clear:
|
||||
phy->phy_num_led_triggers = 0;
|
||||
|
|
@ -149,8 +147,13 @@ void phy_led_triggers_unregister(struct phy_device *phy)
|
|||
|
||||
for (i = 0; i < phy->phy_num_led_triggers; i++)
|
||||
phy_led_trigger_unregister(&phy->phy_led_triggers[i]);
|
||||
kfree(phy->phy_led_triggers);
|
||||
phy->phy_led_triggers = NULL;
|
||||
|
||||
if (phy->led_link_trigger)
|
||||
if (phy->led_link_trigger) {
|
||||
phy_led_trigger_unregister(phy->led_link_trigger);
|
||||
kfree(phy->led_link_trigger);
|
||||
phy->led_link_trigger = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phy_led_triggers_unregister);
|
||||
|
|
|
|||
|
|
@ -516,6 +516,11 @@ ppp_sync_txmunge(struct syncppp *ap, struct sk_buff *skb)
|
|||
unsigned char *data;
|
||||
int islcp;
|
||||
|
||||
/* Ensure we can safely access protocol field and LCP code */
|
||||
if (!pskb_may_pull(skb, 3)) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
data = skb->data;
|
||||
proto = get_unaligned_be16(data);
|
||||
|
||||
|
|
|
|||
|
|
@ -717,6 +717,12 @@ static struct sk_buff *receive_small(struct net_device *dev,
|
|||
len -= vi->hdr_len;
|
||||
stats->bytes += len;
|
||||
|
||||
if (unlikely(len > GOOD_PACKET_LEN)) {
|
||||
pr_debug("%s: rx error: len %u exceeds max size %d\n",
|
||||
dev->name, len, GOOD_PACKET_LEN);
|
||||
dev->stats.rx_length_errors++;
|
||||
goto err_len;
|
||||
}
|
||||
rcu_read_lock();
|
||||
xdp_prog = rcu_dereference(rq->xdp_prog);
|
||||
if (xdp_prog) {
|
||||
|
|
@ -819,6 +825,7 @@ err:
|
|||
err_xdp:
|
||||
rcu_read_unlock();
|
||||
stats->xdp_drops++;
|
||||
err_len:
|
||||
stats->drops++;
|
||||
put_page(page);
|
||||
xdp_xmit:
|
||||
|
|
@ -871,6 +878,13 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
|
|||
head_skb = NULL;
|
||||
stats->bytes += len - vi->hdr_len;
|
||||
|
||||
truesize = mergeable_ctx_to_truesize(ctx);
|
||||
if (unlikely(len > truesize)) {
|
||||
pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
|
||||
dev->name, len, (unsigned long)ctx);
|
||||
dev->stats.rx_length_errors++;
|
||||
goto err_skb;
|
||||
}
|
||||
rcu_read_lock();
|
||||
xdp_prog = rcu_dereference(rq->xdp_prog);
|
||||
if (xdp_prog) {
|
||||
|
|
@ -990,14 +1004,6 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
|
|||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
truesize = mergeable_ctx_to_truesize(ctx);
|
||||
if (unlikely(len > truesize)) {
|
||||
pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
|
||||
dev->name, len, (unsigned long)ctx);
|
||||
dev->stats.rx_length_errors++;
|
||||
goto err_skb;
|
||||
}
|
||||
|
||||
head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog,
|
||||
metasize);
|
||||
curr_skb = head_skb;
|
||||
|
|
|
|||
|
|
@ -2554,7 +2554,7 @@ static void at76_disconnect(struct usb_interface *interface)
|
|||
|
||||
wiphy_info(priv->hw->wiphy, "disconnecting\n");
|
||||
at76_delete_device(priv);
|
||||
usb_put_dev(priv->udev);
|
||||
usb_put_dev(interface_to_usbdev(interface));
|
||||
dev_info(&interface->dev, "disconnected\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ static const struct usb_device_id mt76x2u_device_table[] = {
|
|||
{ USB_DEVICE(0x0846, 0x9053) }, /* Netgear A6210 */
|
||||
{ USB_DEVICE(0x045e, 0x02e6) }, /* XBox One Wireless Adapter */
|
||||
{ USB_DEVICE(0x045e, 0x02fe) }, /* XBox One Wireless Adapter */
|
||||
{ USB_DEVICE(0x2357, 0x0137) }, /* TP-Link TL-WDN6200 */
|
||||
{ },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -342,8 +342,10 @@ void wl1251_tx_work(struct work_struct *work)
|
|||
while ((skb = skb_dequeue(&wl->tx_queue))) {
|
||||
if (!woken_up) {
|
||||
ret = wl1251_ps_elp_wakeup(wl);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
skb_queue_head(&wl->tx_queue, skb);
|
||||
goto out;
|
||||
}
|
||||
woken_up = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1041,7 +1041,7 @@ static inline char *idt_get_mw_name(enum idt_mw_type mw_type)
|
|||
static struct idt_mw_cfg *idt_scan_mws(struct idt_ntb_dev *ndev, int port,
|
||||
unsigned char *mw_cnt)
|
||||
{
|
||||
struct idt_mw_cfg mws[IDT_MAX_NR_MWS], *ret_mws;
|
||||
struct idt_mw_cfg *mws;
|
||||
const struct idt_ntb_bar *bars;
|
||||
enum idt_mw_type mw_type;
|
||||
unsigned char widx, bidx, en_cnt;
|
||||
|
|
@ -1049,6 +1049,11 @@ static struct idt_mw_cfg *idt_scan_mws(struct idt_ntb_dev *ndev, int port,
|
|||
int aprt_size;
|
||||
u32 data;
|
||||
|
||||
mws = devm_kcalloc(&ndev->ntb.pdev->dev, IDT_MAX_NR_MWS,
|
||||
sizeof(*mws), GFP_KERNEL);
|
||||
if (!mws)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
/* Retrieve the array of the BARs registers */
|
||||
bars = portdata_tbl[port].bars;
|
||||
|
||||
|
|
@ -1103,16 +1108,7 @@ static struct idt_mw_cfg *idt_scan_mws(struct idt_ntb_dev *ndev, int port,
|
|||
}
|
||||
}
|
||||
|
||||
/* Allocate memory for memory window descriptors */
|
||||
ret_mws = devm_kcalloc(&ndev->ntb.pdev->dev, *mw_cnt, sizeof(*ret_mws),
|
||||
GFP_KERNEL);
|
||||
if (!ret_mws)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
/* Copy the info of detected memory windows */
|
||||
memcpy(ret_mws, mws, (*mw_cnt)*sizeof(*ret_mws));
|
||||
|
||||
return ret_mws;
|
||||
return mws;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1340,7 +1340,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
|
|||
qp_count = ilog2(qp_bitmap);
|
||||
if (nt->use_msi) {
|
||||
qp_count -= 1;
|
||||
nt->msi_db_mask = 1 << qp_count;
|
||||
nt->msi_db_mask = BIT_ULL(qp_count);
|
||||
ntb_db_clear_mask(ndev, nt->msi_db_mask);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -146,20 +146,6 @@ struct nvmet_fc_tgt_assoc {
|
|||
struct work_struct del_work;
|
||||
};
|
||||
|
||||
|
||||
static inline int
|
||||
nvmet_fc_iodnum(struct nvmet_fc_ls_iod *iodptr)
|
||||
{
|
||||
return (iodptr - iodptr->tgtport->iod);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nvmet_fc_fodnum(struct nvmet_fc_fcp_iod *fodptr)
|
||||
{
|
||||
return (fodptr - fodptr->queue->fod);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Association and Connection IDs:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -36,11 +36,15 @@
|
|||
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
|
||||
{
|
||||
struct of_phandle_args oirq;
|
||||
unsigned int ret;
|
||||
|
||||
if (of_irq_parse_one(dev, index, &oirq))
|
||||
return 0;
|
||||
|
||||
return irq_create_of_mapping(&oirq);
|
||||
ret = irq_create_of_mapping(&oirq);
|
||||
of_node_put(oirq.np);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
|
||||
|
||||
|
|
@ -443,8 +447,10 @@ int of_irq_count(struct device_node *dev)
|
|||
struct of_phandle_args irq;
|
||||
int nr = 0;
|
||||
|
||||
while (of_irq_parse_one(dev, nr, &irq) == 0)
|
||||
while (of_irq_parse_one(dev, nr, &irq) == 0) {
|
||||
of_node_put(irq.np);
|
||||
nr++;
|
||||
}
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
|
@ -549,6 +555,8 @@ void __init of_irq_init(const struct of_device_id *matches)
|
|||
desc->interrupt_parent);
|
||||
if (ret) {
|
||||
of_node_clear_flag(desc->dev, OF_POPULATED);
|
||||
of_node_put(desc->interrupt_parent);
|
||||
of_node_put(desc->dev);
|
||||
kfree(desc);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -579,6 +587,7 @@ void __init of_irq_init(const struct of_device_id *matches)
|
|||
err:
|
||||
list_for_each_entry_safe(desc, temp_desc, &intc_desc_list, list) {
|
||||
list_del(&desc->list);
|
||||
of_node_put(desc->interrupt_parent);
|
||||
of_node_put(desc->dev);
|
||||
kfree(desc);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1041,7 +1041,10 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
|
|||
add_dev:
|
||||
pci_set_bus_msi_domain(child);
|
||||
ret = device_register(&child->dev);
|
||||
WARN_ON(ret < 0);
|
||||
if (WARN_ON(ret < 0)) {
|
||||
put_device(&child->dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pcibios_add_bus(child);
|
||||
|
||||
|
|
|
|||
|
|
@ -262,12 +262,10 @@ armpmu_add(struct perf_event *event, int flags)
|
|||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
/*
|
||||
* If there is an event in the counter we are going to use then make
|
||||
* sure it is disabled.
|
||||
*/
|
||||
/* The newly-allocated counter should be empty */
|
||||
WARN_ON_ONCE(hw_events->events[idx]);
|
||||
|
||||
event->hw.idx = idx;
|
||||
armpmu->disable(event);
|
||||
hw_events->events[idx] = event;
|
||||
|
||||
hwc->state = PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
||||
|
|
|
|||
|
|
@ -428,11 +428,14 @@ static int asus_pega_lucid_set(struct asus_laptop *asus, int unit, bool enable)
|
|||
|
||||
static int pega_acc_axis(struct asus_laptop *asus, int curr, char *method)
|
||||
{
|
||||
unsigned long long val = (unsigned long long)curr;
|
||||
acpi_status status;
|
||||
int i, delta;
|
||||
unsigned long long val;
|
||||
for (i = 0; i < PEGA_ACC_RETRIES; i++) {
|
||||
acpi_evaluate_integer(asus->handle, method, NULL, &val);
|
||||
|
||||
for (i = 0; i < PEGA_ACC_RETRIES; i++) {
|
||||
status = acpi_evaluate_integer(asus->handle, method, NULL, &val);
|
||||
if (ACPI_FAILURE(status))
|
||||
continue;
|
||||
/* The output is noisy. From reading the ASL
|
||||
* dissassembly, timeout errors are returned with 1's
|
||||
* in the high word, and the lack of locking around
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ static DECLARE_HASHTABLE(isst_hash, 8);
|
|||
static DEFINE_MUTEX(isst_hash_lock);
|
||||
|
||||
static int isst_store_new_cmd(int cmd, u32 cpu, int mbox_cmd_type, u32 param,
|
||||
u32 data)
|
||||
u64 data)
|
||||
{
|
||||
struct isst_cmd *sst_cmd;
|
||||
|
||||
|
|
|
|||
|
|
@ -123,6 +123,9 @@ static unsigned int fsl_pwm_ticks_to_ns(struct fsl_pwm_chip *fpc,
|
|||
unsigned long long exval;
|
||||
|
||||
rate = clk_get_rate(fpc->clk[fpc->period.clk_select]);
|
||||
if (rate >> fpc->period.clk_ps == 0)
|
||||
return 0;
|
||||
|
||||
exval = ticks;
|
||||
exval *= 1000000000UL;
|
||||
do_div(exval, rate >> fpc->period.clk_ps);
|
||||
|
|
@ -195,6 +198,9 @@ static unsigned int fsl_pwm_calculate_duty(struct fsl_pwm_chip *fpc,
|
|||
unsigned int period = fpc->period.mod_period + 1;
|
||||
unsigned int period_ns = fsl_pwm_ticks_to_ns(fpc, period);
|
||||
|
||||
if (!period_ns)
|
||||
return 0;
|
||||
|
||||
duty = (unsigned long long)duty_ns * period;
|
||||
do_div(duty, period_ns);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,12 +30,14 @@
|
|||
#define PWM45DWIDTH_FIXUP 0x30
|
||||
#define PWMTHRES 0x30
|
||||
#define PWM45THRES_FIXUP 0x34
|
||||
#define PWM_CK_26M_SEL 0x210
|
||||
|
||||
#define PWM_CLK_DIV_MAX 7
|
||||
|
||||
struct pwm_mediatek_of_data {
|
||||
unsigned int num_pwms;
|
||||
bool pwm45_fixup;
|
||||
bool has_ck_26m_sel;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -123,17 +125,25 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm,
|
|||
struct pwm_mediatek_chip *pc = to_pwm_mediatek_chip(chip);
|
||||
u32 clkdiv = 0, cnt_period, cnt_duty, reg_width = PWMDWIDTH,
|
||||
reg_thres = PWMTHRES;
|
||||
unsigned long clk_rate;
|
||||
u64 resolution;
|
||||
int ret;
|
||||
|
||||
ret = pwm_mediatek_clk_enable(chip, pwm);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
clk_rate = clk_get_rate(pc->clk_pwms[pwm->hwpwm]);
|
||||
if (!clk_rate)
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure we use the bus clock and not the 26MHz clock */
|
||||
if (pc->soc->has_ck_26m_sel)
|
||||
writel(0, pc->regs + PWM_CK_26M_SEL);
|
||||
|
||||
/* Using resolution in picosecond gets accuracy higher */
|
||||
resolution = (u64)NSEC_PER_SEC * 1000;
|
||||
do_div(resolution, clk_get_rate(pc->clk_pwms[pwm->hwpwm]));
|
||||
do_div(resolution, clk_rate);
|
||||
|
||||
cnt_period = DIV_ROUND_CLOSEST_ULL((u64)period_ns * 1000, resolution);
|
||||
while (cnt_period > 8191) {
|
||||
|
|
@ -280,31 +290,37 @@ static int pwm_mediatek_remove(struct platform_device *pdev)
|
|||
static const struct pwm_mediatek_of_data mt2712_pwm_data = {
|
||||
.num_pwms = 8,
|
||||
.pwm45_fixup = false,
|
||||
.has_ck_26m_sel = false,
|
||||
};
|
||||
|
||||
static const struct pwm_mediatek_of_data mt7622_pwm_data = {
|
||||
.num_pwms = 6,
|
||||
.pwm45_fixup = false,
|
||||
.has_ck_26m_sel = true,
|
||||
};
|
||||
|
||||
static const struct pwm_mediatek_of_data mt7623_pwm_data = {
|
||||
.num_pwms = 5,
|
||||
.pwm45_fixup = true,
|
||||
.has_ck_26m_sel = false,
|
||||
};
|
||||
|
||||
static const struct pwm_mediatek_of_data mt7628_pwm_data = {
|
||||
.num_pwms = 4,
|
||||
.pwm45_fixup = true,
|
||||
.has_ck_26m_sel = false,
|
||||
};
|
||||
|
||||
static const struct pwm_mediatek_of_data mt7629_pwm_data = {
|
||||
.num_pwms = 1,
|
||||
.pwm45_fixup = false,
|
||||
.has_ck_26m_sel = false,
|
||||
};
|
||||
|
||||
static const struct pwm_mediatek_of_data mt8516_pwm_data = {
|
||||
.num_pwms = 5,
|
||||
.pwm45_fixup = false,
|
||||
.has_ck_26m_sel = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id pwm_mediatek_of_match[] = {
|
||||
|
|
|
|||
|
|
@ -893,6 +893,7 @@ static void pm8001_dev_gone_notify(struct domain_device *dev)
|
|||
spin_lock_irqsave(&pm8001_ha->lock, flags);
|
||||
}
|
||||
PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
|
||||
pm8001_ha->phy[pm8001_dev->attached_phy].phy_attached = 0;
|
||||
pm8001_free_dev(pm8001_dev);
|
||||
} else {
|
||||
PM8001_DISC_DBG(pm8001_ha,
|
||||
|
|
|
|||
|
|
@ -2924,11 +2924,14 @@ iscsi_set_host_param(struct iscsi_transport *transport,
|
|||
}
|
||||
|
||||
/* see similar check in iscsi_if_set_param() */
|
||||
if (strlen(data) > ev->u.set_host_param.len)
|
||||
return -EINVAL;
|
||||
if (strlen(data) > ev->u.set_host_param.len) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = transport->set_host_param(shost, ev->u.set_host_param.param,
|
||||
data, ev->u.set_host_param.len);
|
||||
out:
|
||||
scsi_host_put(shost);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4124,7 +4124,7 @@ static void validate_options(void)
|
|||
*/
|
||||
static int __init st_setup(char *str)
|
||||
{
|
||||
int i, len, ints[5];
|
||||
int i, len, ints[ARRAY_SIZE(parms) + 1];
|
||||
char *stp;
|
||||
|
||||
stp = get_options(str, ARRAY_SIZE(ints), ints);
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ struct jr3_pci_poll_delay {
|
|||
struct jr3_pci_dev_private {
|
||||
struct timer_list timer;
|
||||
struct comedi_device *dev;
|
||||
bool timer_enable;
|
||||
};
|
||||
|
||||
union jr3_pci_single_range {
|
||||
|
|
@ -612,10 +613,11 @@ static void jr3_pci_poll_dev(struct timer_list *t)
|
|||
delay = sub_delay.max;
|
||||
}
|
||||
}
|
||||
if (devpriv->timer_enable) {
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
|
||||
add_timer(&devpriv->timer);
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->spinlock, flags);
|
||||
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
|
||||
add_timer(&devpriv->timer);
|
||||
}
|
||||
|
||||
static struct jr3_pci_subdev_private *
|
||||
|
|
@ -764,6 +766,7 @@ static int jr3_pci_auto_attach(struct comedi_device *dev,
|
|||
devpriv->dev = dev;
|
||||
timer_setup(&devpriv->timer, jr3_pci_poll_dev, 0);
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(1000);
|
||||
devpriv->timer_enable = true;
|
||||
add_timer(&devpriv->timer);
|
||||
|
||||
return 0;
|
||||
|
|
@ -773,8 +776,12 @@ static void jr3_pci_detach(struct comedi_device *dev)
|
|||
{
|
||||
struct jr3_pci_dev_private *devpriv = dev->private;
|
||||
|
||||
if (devpriv)
|
||||
if (devpriv) {
|
||||
spin_lock_bh(&dev->spinlock);
|
||||
devpriv->timer_enable = false;
|
||||
spin_unlock_bh(&dev->spinlock);
|
||||
del_timer_sync(&devpriv->timer);
|
||||
}
|
||||
|
||||
comedi_pci_detach(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ static const struct tsadc_table rk3328_code_table[] = {
|
|||
{296, -40000},
|
||||
{304, -35000},
|
||||
{313, -30000},
|
||||
{322, -25000},
|
||||
{331, -20000},
|
||||
{340, -15000},
|
||||
{349, -10000},
|
||||
|
|
|
|||
|
|
@ -1874,7 +1874,6 @@ pci_moxa_setup(struct serial_private *priv,
|
|||
#define PCI_DEVICE_ID_WCH_CH355_4S 0x7173
|
||||
#define PCI_VENDOR_ID_AGESTAR 0x5372
|
||||
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
|
||||
#define PCI_VENDOR_ID_ASIX 0x9710
|
||||
#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
|
||||
#define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e
|
||||
|
||||
|
|
|
|||
|
|
@ -596,8 +596,11 @@ static void sifive_serial_break_ctl(struct uart_port *port, int break_state)
|
|||
static int sifive_serial_startup(struct uart_port *port)
|
||||
{
|
||||
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
uart_port_lock_irqsave(&ssp->port, &flags);
|
||||
__ssp_enable_rxwm(ssp);
|
||||
uart_port_unlock_irqrestore(&ssp->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -605,9 +608,12 @@ static int sifive_serial_startup(struct uart_port *port)
|
|||
static void sifive_serial_shutdown(struct uart_port *port)
|
||||
{
|
||||
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
uart_port_lock_irqsave(&ssp->port, &flags);
|
||||
__ssp_disable_rxwm(ssp);
|
||||
__ssp_disable_txwm(ssp);
|
||||
uart_port_unlock_irqrestore(&ssp->port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1920,6 +1920,7 @@ static int cdns3_gadget_ep_disable(struct usb_ep *ep)
|
|||
"%s is already disabled\n", priv_ep->name))
|
||||
return 0;
|
||||
|
||||
local_bh_disable();
|
||||
spin_lock_irqsave(&priv_dev->lock, flags);
|
||||
|
||||
trace_cdns3_gadget_ep_disable(priv_ep);
|
||||
|
|
@ -1976,6 +1977,7 @@ static int cdns3_gadget_ep_disable(struct usb_ep *ep)
|
|||
priv_ep->flags &= ~EP_ENABLED;
|
||||
|
||||
spin_unlock_irqrestore(&priv_dev->lock, flags);
|
||||
local_bh_enable();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -366,6 +366,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM },
|
||||
{ USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* SanDisk Corp. SanDisk 3.2Gen1 */
|
||||
{ USB_DEVICE(0x0781, 0x55a3), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Realforce 87U Keyboard */
|
||||
{ USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
|
|
@ -380,6 +383,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x0904, 0x6103), .driver_info =
|
||||
USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Silicon Motion Flash Drive */
|
||||
{ USB_DEVICE(0x090c, 0x1000), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Sound Devices USBPre2 */
|
||||
{ USB_DEVICE(0x0926, 0x0202), .driver_info =
|
||||
USB_QUIRK_ENDPOINT_BLACKLIST },
|
||||
|
|
@ -534,6 +540,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x2040, 0x7200), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
||||
/* VLI disk */
|
||||
{ USB_DEVICE(0x2109, 0x0711), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Raydium Touchscreen */
|
||||
{ USB_DEVICE(0x2386, 0x3114), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
|
|
|
|||
|
|
@ -122,17 +122,19 @@ static void __dwc3_set_mode(struct work_struct *work)
|
|||
if (dwc->dr_mode != USB_DR_MODE_OTG)
|
||||
return;
|
||||
|
||||
pm_runtime_get_sync(dwc->dev);
|
||||
|
||||
if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG)
|
||||
dwc3_otg_update(dwc, 0);
|
||||
|
||||
if (!dwc->desired_dr_role)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (dwc->desired_dr_role == dwc->current_dr_role)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
switch (dwc->current_dr_role) {
|
||||
case DWC3_GCTL_PRTCAP_HOST:
|
||||
|
|
@ -196,6 +198,9 @@ static void __dwc3_set_mode(struct work_struct *work)
|
|||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
pm_runtime_mark_last_busy(dwc->dev);
|
||||
pm_runtime_put_autosuspend(dwc->dev);
|
||||
}
|
||||
|
||||
void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
|
||||
|
|
|
|||
|
|
@ -3652,6 +3652,12 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
|
|||
if (!count)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (count > evt->length) {
|
||||
dev_err_ratelimited(dwc->dev, "invalid count(%u) > evt->length(%u)\n",
|
||||
count, evt->length);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
evt->count = count;
|
||||
evt->flags |= DWC3_EVENT_PENDING;
|
||||
|
||||
|
|
|
|||
|
|
@ -542,6 +542,9 @@ int ast_vhub_init_dev(struct ast_vhub *vhub, unsigned int idx)
|
|||
d->vhub = vhub;
|
||||
d->index = idx;
|
||||
d->name = devm_kasprintf(parent, GFP_KERNEL, "port%d", idx+1);
|
||||
if (!d->name)
|
||||
return -ENOMEM;
|
||||
|
||||
d->regs = vhub->regs + 0x100 + 0x10 * idx;
|
||||
|
||||
ast_vhub_init_ep0(vhub, &d->ep0, d);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue