Merge 4.14.158 into android-4.14
Changes in 4.14.158 Revert "KVM: nVMX: reset cache/shadows when switching loaded VMCS" clk: meson: gxbb: let sar_adc_clk_div set the parent clock rate ASoC: msm8916-wcd-analog: Fix RX1 selection in RDAC2 MUX ASoC: compress: fix unsigned integer overflow check reset: Fix memory leak in reset_control_array_put() ASoC: kirkwood: fix external clock probe defer clk: samsung: exynos5420: Preserve PLL configuration during suspend/resume reset: fix reset_control_ops kerneldoc comment clk: at91: avoid sleeping early clk: sunxi-ng: a80: fix the zero'ing of bits 16 and 18 idr: Fix idr_alloc_u32 on 32-bit systems x86/resctrl: Prevent NULL pointer dereference when reading mondata clk: ti: dra7-atl-clock: Remove ti_clk_add_alias call net: fec: add missed clk_disable_unprepare in remove bridge: ebtables: don't crash when using dnat target in output chains can: peak_usb: report bus recovery as well can: c_can: D_CAN: c_can_chip_config(): perform a sofware reset on open can: rx-offload: can_rx_offload_queue_tail(): fix error handling, avoid skb mem leak can: rx-offload: can_rx_offload_offload_one(): do not increase the skb_queue beyond skb_queue_len_max can: rx-offload: can_rx_offload_offload_one(): increment rx_fifo_errors on queue overflow or OOM can: rx-offload: can_rx_offload_offload_one(): use ERR_PTR() to propagate error value in case of errors can: rx-offload: can_rx_offload_irq_offload_timestamp(): continue on error can: rx-offload: can_rx_offload_irq_offload_fifo(): continue on error watchdog: meson: Fix the wrong value of left time scripts/gdb: fix debugging modules compiled with hot/cold partitioning net: bcmgenet: reapply manual settings to the PHY ceph: return -EINVAL if given fsc mount option on kernel w/o support mac80211: fix station inactive_time shortly after boot block: drbd: remove a stray unlock in __drbd_send_protocol() pwm: bcm-iproc: Prevent unloading the driver module while in use scsi: lpfc: Fix kernel Oops due to null pring pointers scsi: lpfc: Fix dif and first burst use in write commands ARM: dts: Fix up SQ201 flash access ARM: debug-imx: only define DEBUG_IMX_UART_PORT if needed ARM: dts: imx53-voipac-dmm-668: Fix memory node duplication parisc: Fix serio address output parisc: Fix HP SDC hpa address output arm64: mm: Prevent mismatched 52-bit VA support arm64: smp: Handle errors reported by the firmware ARM: OMAP1: fix USB configuration for device-only setups RDMA/vmw_pvrdma: Use atomic memory allocation in create AH PM / AVS: SmartReflex: NULL check before some freeing functions is not needed ARM: ks8695: fix section mismatch warning ACPI / LPSS: Ignore acpi_device_fix_up_power() return value scsi: lpfc: Enable Management features for IF_TYPE=6 crypto: user - support incremental algorithm dumps mwifiex: fix potential NULL dereference and use after free mwifiex: debugfs: correct histogram spacing, formatting rtl818x: fix potential use after free xfs: require both realtime inodes to mount ubi: Put MTD device after it is not used ubi: Do not drop UBI device reference before using microblaze: adjust the help to the real behavior microblaze: move "... is ready" messages to arch/microblaze/Makefile iwlwifi: move iwl_nvm_check_version() into dvm gpiolib: Fix return value of gpio_to_desc() stub if !GPIOLIB kvm: vmx: Set IA32_TSC_AUX for legacy mode guests VSOCK: bind to random port for VMADDR_PORT_ANY mmc: meson-gx: make sure the descriptor is stopped on errors mtd: rawnand: sunxi: Write pageprog related opcodes to WCMD_SET btrfs: only track ref_heads in delayed_ref_updates HID: intel-ish-hid: fixes incorrect error handling serial: 8250: Rate limit serial port rx interrupts during input overruns kprobes/x86/xen: blacklist non-attachable xen interrupt functions xen/pciback: Check dev_data before using it vfio-mdev/samples: Use u8 instead of char for handle functions pinctrl: xway: fix gpio-hog related boot issues net/mlx5: Continue driver initialization despite debugfs failure exofs_mount(): fix leaks on failure exits bnxt_en: Return linux standard errors in bnxt_ethtool.c bnxt_en: query force speeds before disabling autoneg mode. KVM: s390: unregister debug feature on failing arch init pinctrl: sh-pfc: sh7264: Fix PFCR3 and PFCR0 register configuration pinctrl: sh-pfc: sh7734: Fix shifted values in IPSR10 HID: doc: fix wrong data structure reference for UHID_OUTPUT dm flakey: Properly corrupt multi-page bios. gfs2: take jdata unstuff into account in do_grow xfs: Align compat attrlist_by_handle with native implementation. xfs: Fix bulkstat compat ioctls on x32 userspace. IB/qib: Fix an error code in qib_sdma_verbs_send() clocksource/drivers/fttmr010: Fix invalid interrupt register access vxlan: Fix error path in __vxlan_dev_create() powerpc/book3s/32: fix number of bats in p/v_block_mapped() powerpc/xmon: fix dump_segments() drivers/regulator: fix a missing check of return value Bluetooth: hci_bcm: Handle specific unknown packets after firmware loading serial: max310x: Fix tx_empty() callback openrisc: Fix broken paths to arch/or32 RDMA/srp: Propagate ib_post_send() failures to the SCSI mid-layer scsi: qla2xxx: deadlock by configfs_depend_item scsi: csiostor: fix incorrect dma device in case of vport ath6kl: Only use match sets when firmware supports it ath6kl: Fix off by one error in scan completion powerpc/perf: Fix unit_sel/cache_sel checks powerpc/prom: fix early DEBUG messages powerpc/mm: Make NULL pointer deferences explicit on bad page faults. powerpc/44x/bamboo: Fix PCI range vfio/spapr_tce: Get rid of possible infinite loop powerpc/powernv/eeh/npu: Fix uninitialized variables in opal_pci_eeh_freeze_status drbd: ignore "all zero" peer volume sizes in handshake drbd: reject attach of unsuitable uuids even if connected drbd: do not block when adjusting "disk-options" while IO is frozen drbd: fix print_st_err()'s prototype to match the definition IB/rxe: Make counters thread safe regulator: tps65910: fix a missing check of return value powerpc/83xx: handle machine check caused by watchdog timer powerpc/pseries: Fix node leak in update_lmb_associativity_index() crypto: mxc-scc - fix build warnings on ARM64 pwm: clps711x: Fix period calculation net/netlink_compat: Fix a missing check of nla_parse_nested net/net_namespace: Check the return value of register_pernet_subsys() f2fs: fix to dirty inode synchronously um: Make GCOV depend on !KCOV net: (cpts) fix a missing check of clk_prepare net: stmicro: fix a missing check of clk_prepare net: dsa: bcm_sf2: Propagate error value from mdio_write atl1e: checking the status of atl1e_write_phy_reg tipc: fix a missing check of genlmsg_put net/wan/fsl_ucc_hdlc: Avoid double free in ucc_hdlc_probe() ocfs2: clear journal dirty flag after shutdown journal vmscan: return NODE_RECLAIM_NOSCAN in node_reclaim() when CONFIG_NUMA is n lib/genalloc.c: fix allocation of aligned buffer from non-aligned chunk lib/genalloc.c: use vzalloc_node() to allocate the bitmap fork: fix some -Wmissing-prototypes warnings drivers/base/platform.c: kmemleak ignore a known leak lib/genalloc.c: include vmalloc.h mtd: Check add_mtd_device() ret code tipc: fix memory leak in tipc_nl_compat_publ_dump net/core/neighbour: tell kmemleak about hash tables PCI/MSI: Return -ENOSPC from pci_alloc_irq_vectors_affinity() net/core/neighbour: fix kmemleak minimal reference count for hash tables serial: 8250: Fix serial8250 initialization crash gpu: ipu-v3: pre: don't trigger update if buffer address doesn't change sfc: suppress duplicate nvmem partition types in efx_ef10_mtd_probe ip_tunnel: Make none-tunnel-dst tunnel port work with lwtunnel decnet: fix DN_IFREQ_SIZE net/smc: prevent races between smc_lgr_terminate() and smc_conn_free() blktrace: Show requests without sector tipc: fix skb may be leaky in tipc_link_input sfc: initialise found bitmap in efx_ef10_mtd_probe net: fix possible overflow in __sk_mem_raise_allocated() sctp: don't compare hb_timer expire date before starting it bpf: decrease usercnt if bpf_map_new_fd() fails in bpf_map_get_fd_by_id() net: dev: Use unsigned integer as an argument to left-shift kvm: properly check debugfs dentry before using it bpf: drop refcount if bpf_map_new_fd() fails in map_create() net: hns3: Change fw error code NOT_EXEC to NOT_SUPPORTED iommu/amd: Fix NULL dereference bug in match_hid_uid apparmor: delete the dentry in aafs_remove() to avoid a leak scsi: libsas: Support SATA PHY connection rate unmatch fixing during discovery ACPI / APEI: Don't wait to serialise with oops messages when panic()ing ACPI / APEI: Switch estatus pool to use vmalloc memory scsi: libsas: Check SMP PHY control function result powerpc/pseries/dlpar: Fix a missing check in dlpar_parse_cc_property() mtd: Remove a debug trace in mtdpart.c mm, gup: add missing refcount overflow checks on s390 clk: at91: fix update bit maps on CFG_MOR write clk: at91: generated: set audio_pll_allowed in at91_clk_register_generated() staging: rtl8192e: fix potential use after free staging: rtl8723bs: Drop ACPI device ids staging: rtl8723bs: Add 024c:0525 to the list of SDIO device-ids USB: serial: ftdi_sio: add device IDs for U-Blox C099-F9P mei: bus: prefix device names on bus with the bus name xfrm: Fix memleak on xfrm state destroy media: v4l2-ctrl: fix flags for DO_WHITE_BALANCE net: macb: fix error format in dev_err() pwm: Clear chip_data in pwm_put() media: atmel: atmel-isc: fix asd memory allocation media: atmel: atmel-isc: fix INIT_WORK misplacement macvlan: schedule bc_work even if error net: psample: fix skb_over_panic openvswitch: fix flow command message size slip: Fix use-after-free Read in slip_open openvswitch: drop unneeded BUG_ON() in ovs_flow_cmd_build_info() openvswitch: remove another BUG_ON() tipc: fix link name length check sctp: cache netns in sctp_ep_common net: sched: fix `tc -s class show` no bstats on class with nolock subqueues ext4: add more paranoia checking in ext4_expand_extra_isize handling watchdog: sama5d4: fix WDD value to be always set to max net: macb: Fix SUBNS increment and increase resolution net: macb driver, check for SKBTX_HW_TSTAMP mtd: rawnand: atmel: Fix spelling mistake in error message mtd: rawnand: atmel: fix possible object reference leak mtd: spi-nor: cast to u64 to avoid uint overflows y2038: futex: Move compat implementation into futex.c futex: Prevent robust futex exit race futex: Move futex exit handling into futex code futex: Replace PF_EXITPIDONE with a state exit/exec: Seperate mm_release() futex: Split futex_mm_release() for exit/exec futex: Set task::futex_state to DEAD right after handling futex exit futex: Mark the begin of futex exit explicitly futex: Sanitize exit state handling futex: Provide state handling for exec() as well futex: Add mutex around futex exit futex: Provide distinct return value when owner is exiting futex: Prevent exit livelock HID: core: check whether Usage Page item is after Usage ID items crypto: stm32/hash - Fix hmac issue more than 256 bytes media: stm32-dcmi: fix DMA corruption when stopping streaming hwrng: stm32 - fix unbalanced pm_runtime_enable mailbox: mailbox-test: fix null pointer if no mmio pinctrl: stm32: fix memory leak issue ASoC: stm32: i2s: fix dma configuration ASoC: stm32: i2s: fix 16 bit format support ASoC: stm32: i2s: fix IRQ clearing platform/x86: hp-wmi: Fix ACPI errors caused by too small buffer platform/x86: hp-wmi: Fix ACPI errors caused by passing 0 as input size net: fec: fix clock count mis-match Linux 4.14.158 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -160,7 +160,7 @@ them but you should handle them according to your needs.
|
||||
UHID_OUTPUT:
|
||||
This is sent if the HID device driver wants to send raw data to the I/O
|
||||
device on the interrupt channel. You should read the payload and forward it to
|
||||
the device. The payload is of type "struct uhid_data_req".
|
||||
the device. The payload is of type "struct uhid_output_req".
|
||||
This may be received even though you haven't received UHID_OPEN, yet.
|
||||
|
||||
UHID_GET_REPORT:
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 157
|
||||
SUBLEVEL = 158
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
||||
@@ -1376,21 +1376,21 @@ config DEBUG_OMAP2PLUS_UART
|
||||
depends on ARCH_OMAP2PLUS
|
||||
|
||||
config DEBUG_IMX_UART_PORT
|
||||
int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \
|
||||
DEBUG_IMX25_UART || \
|
||||
DEBUG_IMX21_IMX27_UART || \
|
||||
DEBUG_IMX31_UART || \
|
||||
DEBUG_IMX35_UART || \
|
||||
DEBUG_IMX50_UART || \
|
||||
DEBUG_IMX51_UART || \
|
||||
DEBUG_IMX53_UART || \
|
||||
DEBUG_IMX6Q_UART || \
|
||||
DEBUG_IMX6SL_UART || \
|
||||
DEBUG_IMX6SX_UART || \
|
||||
DEBUG_IMX6UL_UART || \
|
||||
DEBUG_IMX7D_UART
|
||||
int "i.MX Debug UART Port Selection"
|
||||
depends on DEBUG_IMX1_UART || \
|
||||
DEBUG_IMX25_UART || \
|
||||
DEBUG_IMX21_IMX27_UART || \
|
||||
DEBUG_IMX31_UART || \
|
||||
DEBUG_IMX35_UART || \
|
||||
DEBUG_IMX50_UART || \
|
||||
DEBUG_IMX51_UART || \
|
||||
DEBUG_IMX53_UART || \
|
||||
DEBUG_IMX6Q_UART || \
|
||||
DEBUG_IMX6SL_UART || \
|
||||
DEBUG_IMX6SX_UART || \
|
||||
DEBUG_IMX6UL_UART || \
|
||||
DEBUG_IMX7D_UART
|
||||
default 1
|
||||
depends on ARCH_MXC
|
||||
help
|
||||
Choose UART port on which kernel low-level debug messages
|
||||
should be output.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n8";
|
||||
bootargs = "console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=squashfs,jffs2 rootwait";
|
||||
stdout-path = &uart0;
|
||||
};
|
||||
|
||||
@@ -71,37 +71,10 @@
|
||||
/* 16MB of flash */
|
||||
reg = <0x30000000 0x01000000>;
|
||||
|
||||
partition@0 {
|
||||
label = "RedBoot";
|
||||
reg = <0x00000000 0x00120000>;
|
||||
read-only;
|
||||
};
|
||||
partition@120000 {
|
||||
label = "Kernel";
|
||||
reg = <0x00120000 0x00200000>;
|
||||
};
|
||||
partition@320000 {
|
||||
label = "Ramdisk";
|
||||
reg = <0x00320000 0x00600000>;
|
||||
};
|
||||
partition@920000 {
|
||||
label = "Application";
|
||||
reg = <0x00920000 0x00600000>;
|
||||
};
|
||||
partition@f20000 {
|
||||
label = "VCTL";
|
||||
reg = <0x00f20000 0x00020000>;
|
||||
read-only;
|
||||
};
|
||||
partition@f40000 {
|
||||
label = "CurConf";
|
||||
reg = <0x00f40000 0x000a0000>;
|
||||
read-only;
|
||||
};
|
||||
partition@fe0000 {
|
||||
label = "FIS directory";
|
||||
reg = <0x00fe0000 0x00020000>;
|
||||
read-only;
|
||||
partitions {
|
||||
compatible = "redboot-fis";
|
||||
/* Eraseblock at 0xfe0000 */
|
||||
fis-index-block = <0x1fc>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -17,12 +17,8 @@
|
||||
|
||||
memory@70000000 {
|
||||
device_type = "memory";
|
||||
reg = <0x70000000 0x20000000>;
|
||||
};
|
||||
|
||||
memory@b0000000 {
|
||||
device_type = "memory";
|
||||
reg = <0xb0000000 0x20000000>;
|
||||
reg = <0x70000000 0x20000000>,
|
||||
<0xb0000000 0x20000000>;
|
||||
};
|
||||
|
||||
regulators {
|
||||
|
||||
@@ -92,7 +92,7 @@ static struct i2c_board_info acs5k_i2c_devs[] __initdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static void acs5k_i2c_init(void)
|
||||
static void __init acs5k_i2c_init(void)
|
||||
{
|
||||
/* The gpio interface */
|
||||
platform_device_register(&acs5k_i2c_device);
|
||||
|
||||
@@ -25,7 +25,7 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y)
|
||||
|
||||
led-y := leds.o
|
||||
|
||||
usb-fs-$(CONFIG_USB) := usb.o
|
||||
usb-fs-$(CONFIG_USB_SUPPORT) := usb.o
|
||||
obj-y += $(usb-fs-m) $(usb-fs-y)
|
||||
|
||||
# Specific board support
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
#include <linux/platform_data/usb-omap1.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB)
|
||||
#if IS_ENABLED(CONFIG_USB_SUPPORT)
|
||||
void omap1_usb_init(struct omap_usb_config *pdata);
|
||||
#else
|
||||
static inline void omap1_usb_init(struct omap_usb_config *pdata)
|
||||
|
||||
@@ -596,6 +596,7 @@ secondary_startup:
|
||||
/*
|
||||
* Common entry point for secondary CPUs.
|
||||
*/
|
||||
bl __cpu_secondary_check52bitva
|
||||
bl __cpu_setup // initialise processor
|
||||
bl __enable_mmu
|
||||
ldr x8, =__secondary_switched
|
||||
@@ -670,6 +671,31 @@ ENTRY(__enable_mmu)
|
||||
ret
|
||||
ENDPROC(__enable_mmu)
|
||||
|
||||
ENTRY(__cpu_secondary_check52bitva)
|
||||
#ifdef CONFIG_ARM64_52BIT_VA
|
||||
ldr_l x0, vabits_user
|
||||
cmp x0, #52
|
||||
b.ne 2f
|
||||
|
||||
mrs_s x0, SYS_ID_AA64MMFR2_EL1
|
||||
and x0, x0, #(0xf << ID_AA64MMFR2_LVA_SHIFT)
|
||||
cbnz x0, 2f
|
||||
|
||||
adr_l x0, va52mismatch
|
||||
mov w1, #1
|
||||
strb w1, [x0]
|
||||
dmb sy
|
||||
dc ivac, x0 // Invalidate potentially stale cache line
|
||||
|
||||
update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x0, x1
|
||||
1: wfe
|
||||
wfi
|
||||
b 1b
|
||||
|
||||
#endif
|
||||
2: ret
|
||||
ENDPROC(__cpu_secondary_check52bitva)
|
||||
|
||||
__no_granule_support:
|
||||
/* Indicate that this CPU can't boot and is stuck in the kernel */
|
||||
update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x1, x2
|
||||
|
||||
@@ -106,6 +106,7 @@ static int boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
}
|
||||
|
||||
static DECLARE_COMPLETION(cpu_running);
|
||||
bool va52mismatch __ro_after_init;
|
||||
|
||||
int __cpu_up(unsigned int cpu, struct task_struct *idle)
|
||||
{
|
||||
@@ -135,10 +136,15 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
|
||||
|
||||
if (!cpu_online(cpu)) {
|
||||
pr_crit("CPU%u: failed to come online\n", cpu);
|
||||
|
||||
if (IS_ENABLED(CONFIG_ARM64_52BIT_VA) && va52mismatch)
|
||||
pr_crit("CPU%u: does not support 52-bit VAs\n", cpu);
|
||||
|
||||
ret = -EIO;
|
||||
}
|
||||
} else {
|
||||
pr_err("CPU%u: failed to boot: %d\n", cpu, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
secondary_data.task = NULL;
|
||||
|
||||
@@ -83,19 +83,21 @@ archclean:
|
||||
|
||||
linux.bin linux.bin.gz linux.bin.ub: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
@echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
simpleImage.%: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
@echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
define archhelp
|
||||
echo '* linux.bin - Create raw binary'
|
||||
echo ' linux.bin.gz - Create compressed raw binary'
|
||||
echo ' linux.bin.ub - Create U-Boot wrapped raw binary'
|
||||
echo ' simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in'
|
||||
echo ' - stripped elf with fdt blob'
|
||||
echo ' simpleImage.<dt>.unstrip - full ELF image with fdt blob'
|
||||
echo ' *_defconfig - Select default config from arch/microblaze/configs'
|
||||
echo ''
|
||||
echo ' simpleImage.<dt> - Create the following images with <dt>.dtb linked in'
|
||||
echo ' simpleImage.<dt> : raw image'
|
||||
echo ' simpleImage.<dt>.ub : raw image with U-Boot header'
|
||||
echo ' simpleImage.<dt>.unstrip: ELF (identical to vmlinux)'
|
||||
echo ' simpleImage.<dt>.strip : stripped ELF'
|
||||
echo ' Targets with <dt> embed a device tree blob inside the image'
|
||||
echo ' These targets support board with firmware that does not'
|
||||
echo ' support passing a device tree directly. Replace <dt> with the'
|
||||
|
||||
@@ -9,15 +9,12 @@ OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary
|
||||
|
||||
$(obj)/linux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
$(obj)/linux.bin.ub: $(obj)/linux.bin FORCE
|
||||
$(call if_changed,uimage)
|
||||
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
$(obj)/linux.bin.gz: $(obj)/linux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
quiet_cmd_cp = CP $< $@$2
|
||||
cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
|
||||
@@ -35,6 +32,5 @@ $(obj)/simpleImage.%: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
$(call if_changed,uimage)
|
||||
$(call if_changed,strip,.strip)
|
||||
@echo 'Kernel: $(UIMAGE_OUT) is ready' ' (#'`cat .version`')'
|
||||
|
||||
clean-files += simpleImage.*.unstrip linux.bin.ub dts/*.dtb
|
||||
|
||||
@@ -184,7 +184,7 @@ handler: ;\
|
||||
* occured. in fact they never do. if you need them use
|
||||
* values saved on stack (for SPR_EPC, SPR_ESR) or content
|
||||
* of r4 (for SPR_EEAR). for details look at EXCEPTION_HANDLE()
|
||||
* in 'arch/or32/kernel/head.S'
|
||||
* in 'arch/openrisc/kernel/head.S'
|
||||
*/
|
||||
|
||||
/* =====================================================[ exceptions] === */
|
||||
|
||||
@@ -1551,7 +1551,7 @@ _string_nl:
|
||||
|
||||
/*
|
||||
* .data section should be page aligned
|
||||
* (look into arch/or32/kernel/vmlinux.lds)
|
||||
* (look into arch/openrisc/kernel/vmlinux.lds.S)
|
||||
*/
|
||||
.section .data,"aw"
|
||||
.align 8192
|
||||
|
||||
@@ -268,8 +268,10 @@
|
||||
/* Outbound ranges, one memory and one IO,
|
||||
* later cannot be changed. Chip supports a second
|
||||
* IO range but we don't use it for now
|
||||
* The chip also supports a larger memory range but
|
||||
* it's not naturally aligned, so our code will break
|
||||
*/
|
||||
ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x40000000
|
||||
ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x20000000
|
||||
0x02000000 0x00000000 0x00000000 0x00000000 0xe0000000 0x00000000 0x00100000
|
||||
0x01000000 0x00000000 0x00000000 0x00000000 0xe8000000 0x00000000 0x00010000>;
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ extern int machine_check_e500(struct pt_regs *regs);
|
||||
extern int machine_check_e200(struct pt_regs *regs);
|
||||
extern int machine_check_47x(struct pt_regs *regs);
|
||||
int machine_check_8xx(struct pt_regs *regs);
|
||||
int machine_check_83xx(struct pt_regs *regs);
|
||||
|
||||
extern void cpu_down_flush_e500v2(void);
|
||||
extern void cpu_down_flush_e500mc(void);
|
||||
|
||||
@@ -733,6 +733,8 @@
|
||||
#define SRR1_PROGTRAP 0x00020000 /* Trap */
|
||||
#define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */
|
||||
|
||||
#define SRR1_MCE_MCP 0x00080000 /* Machine check signal caused interrupt */
|
||||
|
||||
#define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */
|
||||
#define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */
|
||||
#define HSRR1_DENORM 0x00100000 /* Denorm exception */
|
||||
|
||||
@@ -1185,6 +1185,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.machine_check = machine_check_generic,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
#ifdef CONFIG_PPC_83xx
|
||||
{ /* e300c1 (a 603e core, plus some) on 83xx */
|
||||
.pvr_mask = 0x7fff0000,
|
||||
.pvr_value = 0x00830000,
|
||||
@@ -1195,7 +1196,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.machine_check = machine_check_generic,
|
||||
.machine_check = machine_check_83xx,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
{ /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
|
||||
@@ -1209,7 +1210,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.machine_check = machine_check_generic,
|
||||
.machine_check = machine_check_83xx,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
{ /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
|
||||
@@ -1223,7 +1224,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.machine_check = machine_check_generic,
|
||||
.machine_check = machine_check_83xx,
|
||||
.num_pmcs = 4,
|
||||
.oprofile_cpu_type = "ppc/e300",
|
||||
.oprofile_type = PPC_OPROFILE_FSL_EMB,
|
||||
@@ -1240,12 +1241,13 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.machine_check = machine_check_generic,
|
||||
.machine_check = machine_check_83xx,
|
||||
.num_pmcs = 4,
|
||||
.oprofile_cpu_type = "ppc/e300",
|
||||
.oprofile_type = PPC_OPROFILE_FSL_EMB,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
#endif
|
||||
{ /* default match, we assume split I/D cache & TB (non-601)... */
|
||||
.pvr_mask = 0x00000000,
|
||||
.pvr_value = 0x00000000,
|
||||
|
||||
@@ -128,7 +128,7 @@ static void __init move_device_tree(void)
|
||||
p = __va(memblock_alloc(size, PAGE_SIZE));
|
||||
memcpy(p, initial_boot_params, size);
|
||||
initial_boot_params = p;
|
||||
DBG("Moved device tree to 0x%p\n", p);
|
||||
DBG("Moved device tree to 0x%px\n", p);
|
||||
}
|
||||
|
||||
DBG("<- move_device_tree\n");
|
||||
@@ -662,7 +662,7 @@ void __init early_init_devtree(void *params)
|
||||
{
|
||||
phys_addr_t limit;
|
||||
|
||||
DBG(" -> early_init_devtree(%p)\n", params);
|
||||
DBG(" -> early_init_devtree(%px)\n", params);
|
||||
|
||||
/* Too early to BUG_ON(), do it by hand */
|
||||
if (!early_init_dt_verify(params))
|
||||
@@ -722,7 +722,7 @@ void __init early_init_devtree(void *params)
|
||||
memblock_allow_resize();
|
||||
memblock_dump_all();
|
||||
|
||||
DBG("Phys. mem: %llx\n", memblock_phys_mem_size());
|
||||
DBG("Phys. mem: %llx\n", (unsigned long long)memblock_phys_mem_size());
|
||||
|
||||
/* We may need to relocate the flat tree, do it now.
|
||||
* FIXME .. and the initrd too? */
|
||||
|
||||
@@ -581,21 +581,22 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
||||
switch (regs->trap) {
|
||||
case 0x300:
|
||||
case 0x380:
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request for "
|
||||
"data at address 0x%08lx\n", regs->dar);
|
||||
pr_alert("BUG: %s at 0x%08lx\n",
|
||||
regs->dar < PAGE_SIZE ? "Kernel NULL pointer dereference" :
|
||||
"Unable to handle kernel data access", regs->dar);
|
||||
break;
|
||||
case 0x400:
|
||||
case 0x480:
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request for "
|
||||
"instruction fetch\n");
|
||||
pr_alert("BUG: Unable to handle kernel instruction fetch%s",
|
||||
regs->nip < PAGE_SIZE ? " (NULL pointer?)\n" : "\n");
|
||||
break;
|
||||
case 0x600:
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request for "
|
||||
"unaligned access at address 0x%08lx\n", regs->dar);
|
||||
pr_alert("BUG: Unable to handle kernel unaligned access at 0x%08lx\n",
|
||||
regs->dar);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request for "
|
||||
"unknown fault\n");
|
||||
pr_alert("BUG: Unable to handle unknown paging fault at 0x%08lx\n",
|
||||
regs->dar);
|
||||
break;
|
||||
}
|
||||
printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
|
||||
|
||||
@@ -52,7 +52,7 @@ struct batrange { /* stores address ranges mapped by BATs */
|
||||
phys_addr_t v_block_mapped(unsigned long va)
|
||||
{
|
||||
int b;
|
||||
for (b = 0; b < 4; ++b)
|
||||
for (b = 0; b < ARRAY_SIZE(bat_addrs); ++b)
|
||||
if (va >= bat_addrs[b].start && va < bat_addrs[b].limit)
|
||||
return bat_addrs[b].phys + (va - bat_addrs[b].start);
|
||||
return 0;
|
||||
@@ -64,7 +64,7 @@ phys_addr_t v_block_mapped(unsigned long va)
|
||||
unsigned long p_block_mapped(phys_addr_t pa)
|
||||
{
|
||||
int b;
|
||||
for (b = 0; b < 4; ++b)
|
||||
for (b = 0; b < ARRAY_SIZE(bat_addrs); ++b)
|
||||
if (pa >= bat_addrs[b].phys
|
||||
&& pa < (bat_addrs[b].limit-bat_addrs[b].start)
|
||||
+bat_addrs[b].phys)
|
||||
|
||||
@@ -150,6 +150,14 @@ static bool is_thresh_cmp_valid(u64 event)
|
||||
return true;
|
||||
}
|
||||
|
||||
static unsigned int dc_ic_rld_quad_l1_sel(u64 event)
|
||||
{
|
||||
unsigned int cache;
|
||||
|
||||
cache = (event >> EVENT_CACHE_SEL_SHIFT) & MMCR1_DC_IC_QUAL_MASK;
|
||||
return cache;
|
||||
}
|
||||
|
||||
static inline u64 isa207_find_source(u64 idx, u32 sub_idx)
|
||||
{
|
||||
u64 ret = PERF_MEM_NA;
|
||||
@@ -290,10 +298,10 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
|
||||
* have a cache selector of zero. The bank selector (bit 3) is
|
||||
* irrelevant, as long as the rest of the value is 0.
|
||||
*/
|
||||
if (cache & 0x7)
|
||||
if (!cpu_has_feature(CPU_FTR_ARCH_300) && (cache & 0x7))
|
||||
return -1;
|
||||
|
||||
} else if (event & EVENT_IS_L1) {
|
||||
} else if (cpu_has_feature(CPU_FTR_ARCH_300) || (event & EVENT_IS_L1)) {
|
||||
mask |= CNST_L1_QUAL_MASK;
|
||||
value |= CNST_L1_QUAL_VAL(cache);
|
||||
}
|
||||
@@ -396,11 +404,14 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
|
||||
/* In continuous sampling mode, update SDAR on TLB miss */
|
||||
mmcra_sdar_mode(event[i], &mmcra);
|
||||
|
||||
if (event[i] & EVENT_IS_L1) {
|
||||
cache = event[i] >> EVENT_CACHE_SEL_SHIFT;
|
||||
mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT;
|
||||
cache >>= 1;
|
||||
mmcr1 |= (cache & 1) << MMCR1_DC_QUAL_SHIFT;
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300)) {
|
||||
cache = dc_ic_rld_quad_l1_sel(event[i]);
|
||||
mmcr1 |= (cache) << MMCR1_DC_IC_QUAL_SHIFT;
|
||||
} else {
|
||||
if (event[i] & EVENT_IS_L1) {
|
||||
cache = dc_ic_rld_quad_l1_sel(event[i]);
|
||||
mmcr1 |= (cache) << MMCR1_DC_IC_QUAL_SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_event_marked(event[i])) {
|
||||
|
||||
@@ -232,8 +232,8 @@
|
||||
#define MMCR1_COMBINE_SHIFT(pmc) (35 - ((pmc) - 1))
|
||||
#define MMCR1_PMCSEL_SHIFT(pmc) (24 - (((pmc) - 1)) * 8)
|
||||
#define MMCR1_FAB_SHIFT 36
|
||||
#define MMCR1_DC_QUAL_SHIFT 47
|
||||
#define MMCR1_IC_QUAL_SHIFT 46
|
||||
#define MMCR1_DC_IC_QUAL_MASK 0x3
|
||||
#define MMCR1_DC_IC_QUAL_SHIFT 46
|
||||
|
||||
/* MMCR1 Combine bits macro for power9 */
|
||||
#define p9_MMCR1_COMBINE_SHIFT(pmc) (38 - ((pmc - 1) * 2))
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <asm/debug.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/ipic.h>
|
||||
@@ -150,3 +151,19 @@ void __init mpc83xx_setup_arch(void)
|
||||
|
||||
mpc83xx_setup_pci();
|
||||
}
|
||||
|
||||
int machine_check_83xx(struct pt_regs *regs)
|
||||
{
|
||||
u32 mask = 1 << (31 - IPIC_MCP_WDT);
|
||||
|
||||
if (!(regs->msr & SRR1_MCE_MCP) || !(ipic_get_mcp_status() & mask))
|
||||
return machine_check_generic(regs);
|
||||
ipic_clear_mcp_status(mask);
|
||||
|
||||
if (debugger_fault_handler(regs))
|
||||
return 1;
|
||||
|
||||
die("Watchdog NMI Reset", regs, 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -548,8 +548,8 @@ static void pnv_eeh_get_phb_diag(struct eeh_pe *pe)
|
||||
static int pnv_eeh_get_phb_state(struct eeh_pe *pe)
|
||||
{
|
||||
struct pnv_phb *phb = pe->phb->private_data;
|
||||
u8 fstate;
|
||||
__be16 pcierr;
|
||||
u8 fstate = 0;
|
||||
__be16 pcierr = 0;
|
||||
s64 rc;
|
||||
int result = 0;
|
||||
|
||||
@@ -587,8 +587,8 @@ static int pnv_eeh_get_phb_state(struct eeh_pe *pe)
|
||||
static int pnv_eeh_get_pe_state(struct eeh_pe *pe)
|
||||
{
|
||||
struct pnv_phb *phb = pe->phb->private_data;
|
||||
u8 fstate;
|
||||
__be16 pcierr;
|
||||
u8 fstate = 0;
|
||||
__be16 pcierr = 0;
|
||||
s64 rc;
|
||||
int result;
|
||||
|
||||
|
||||
@@ -598,8 +598,8 @@ static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt)
|
||||
static int pnv_ioda_get_pe_state(struct pnv_phb *phb, int pe_no)
|
||||
{
|
||||
struct pnv_ioda_pe *slave, *pe;
|
||||
u8 fstate, state;
|
||||
__be16 pcierr;
|
||||
u8 fstate = 0, state;
|
||||
__be16 pcierr = 0;
|
||||
s64 rc;
|
||||
|
||||
/* Sanity check on PE number */
|
||||
|
||||
@@ -600,8 +600,8 @@ static void pnv_pci_handle_eeh_config(struct pnv_phb *phb, u32 pe_no)
|
||||
static void pnv_pci_config_check_eeh(struct pci_dn *pdn)
|
||||
{
|
||||
struct pnv_phb *phb = pdn->phb->private_data;
|
||||
u8 fstate;
|
||||
__be16 pcierr;
|
||||
u8 fstate = 0;
|
||||
__be16 pcierr = 0;
|
||||
unsigned int pe_no;
|
||||
s64 rc;
|
||||
|
||||
|
||||
@@ -63,6 +63,10 @@ static struct property *dlpar_parse_cc_property(struct cc_workarea *ccwa)
|
||||
|
||||
name = (char *)ccwa + be32_to_cpu(ccwa->name_offset);
|
||||
prop->name = kstrdup(name, GFP_KERNEL);
|
||||
if (!prop->name) {
|
||||
dlpar_free_cc_property(prop);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
prop->length = be32_to_cpu(ccwa->prop_length);
|
||||
value = (char *)ccwa + be32_to_cpu(ccwa->prop_offset);
|
||||
|
||||
@@ -295,6 +295,7 @@ static u32 lookup_lmb_associativity_index(struct of_drconf_cell *lmb)
|
||||
|
||||
aa_index = find_aa_index(dr_node, ala_prop, lmb_assoc);
|
||||
|
||||
of_node_put(dr_node);
|
||||
dlpar_free_cc_nodes(lmb_node);
|
||||
return aa_index;
|
||||
}
|
||||
|
||||
@@ -3293,7 +3293,7 @@ void dump_segments(void)
|
||||
|
||||
printf("sr0-15 =");
|
||||
for (i = 0; i < 16; ++i)
|
||||
printf(" %x", mfsrin(i));
|
||||
printf(" %x", mfsrin(i << 28));
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -361,19 +361,30 @@ static void kvm_s390_cpu_feat_init(void)
|
||||
|
||||
int kvm_arch_init(void *opaque)
|
||||
{
|
||||
int rc;
|
||||
|
||||
kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long));
|
||||
if (!kvm_s390_dbf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) {
|
||||
debug_unregister(kvm_s390_dbf);
|
||||
return -ENOMEM;
|
||||
rc = -ENOMEM;
|
||||
goto out_debug_unreg;
|
||||
}
|
||||
|
||||
kvm_s390_cpu_feat_init();
|
||||
|
||||
/* Register floating interrupt controller interface. */
|
||||
return kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC);
|
||||
rc = kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC);
|
||||
if (rc) {
|
||||
pr_err("Failed to register FLIC rc=%d\n", rc);
|
||||
goto out_debug_unreg;
|
||||
}
|
||||
return 0;
|
||||
|
||||
out_debug_unreg:
|
||||
debug_unregister(kvm_s390_dbf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
void kvm_arch_exit(void)
|
||||
|
||||
@@ -39,7 +39,8 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
||||
page = pte_page(pte);
|
||||
head = compound_head(page);
|
||||
if (!page_cache_get_speculative(head))
|
||||
if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0)
|
||||
|| !page_cache_get_speculative(head)))
|
||||
return 0;
|
||||
if (unlikely(pte_val(pte) != pte_val(*ptep))) {
|
||||
put_page(head);
|
||||
@@ -77,7 +78,8 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||
refs++;
|
||||
} while (addr += PAGE_SIZE, addr != end);
|
||||
|
||||
if (!page_cache_add_speculative(head, refs)) {
|
||||
if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0)
|
||||
|| !page_cache_add_speculative(head, refs))) {
|
||||
*nr -= refs;
|
||||
return 0;
|
||||
}
|
||||
@@ -151,7 +153,8 @@ static int gup_huge_pud(pud_t *pudp, pud_t pud, unsigned long addr,
|
||||
refs++;
|
||||
} while (addr += PAGE_SIZE, addr != end);
|
||||
|
||||
if (!page_cache_add_speculative(head, refs)) {
|
||||
if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0)
|
||||
|| !page_cache_add_speculative(head, refs))) {
|
||||
*nr -= refs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ config GPROF
|
||||
config GCOV
|
||||
bool "Enable gcov support"
|
||||
depends on DEBUG_INFO
|
||||
depends on !KCOV
|
||||
help
|
||||
This option allows developers to retrieve coverage data from a UML
|
||||
session.
|
||||
|
||||
@@ -313,6 +313,10 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
|
||||
int ret = 0;
|
||||
|
||||
rdtgrp = rdtgroup_kn_lock_live(of->kn);
|
||||
if (!rdtgrp) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
md.priv = of->kn->priv;
|
||||
resid = md.u.rid;
|
||||
|
||||
@@ -2818,9 +2818,6 @@ static void setup_msrs(struct vcpu_vmx *vmx)
|
||||
index = __find_msr_index(vmx, MSR_CSTAR);
|
||||
if (index >= 0)
|
||||
move_msr_up(vmx, index, save_nmsrs++);
|
||||
index = __find_msr_index(vmx, MSR_TSC_AUX);
|
||||
if (index >= 0 && guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP))
|
||||
move_msr_up(vmx, index, save_nmsrs++);
|
||||
/*
|
||||
* MSR_STAR is only needed on long mode guests, and only
|
||||
* if efer.sce is enabled.
|
||||
@@ -2833,6 +2830,9 @@ static void setup_msrs(struct vcpu_vmx *vmx)
|
||||
index = __find_msr_index(vmx, MSR_EFER);
|
||||
if (index >= 0 && update_transition_efer(vmx, index))
|
||||
move_msr_up(vmx, index, save_nmsrs++);
|
||||
index = __find_msr_index(vmx, MSR_TSC_AUX);
|
||||
if (index >= 0 && guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP))
|
||||
move_msr_up(vmx, index, save_nmsrs++);
|
||||
|
||||
vmx->save_nmsrs = save_nmsrs;
|
||||
|
||||
@@ -10000,10 +10000,6 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs)
|
||||
vmx_vcpu_load(vcpu, cpu);
|
||||
vcpu->cpu = cpu;
|
||||
put_cpu();
|
||||
|
||||
vm_entry_controls_reset_shadow(vmx);
|
||||
vm_exit_controls_reset_shadow(vmx);
|
||||
vmx_segment_cache_clear(vmx);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -11432,6 +11428,7 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, bool from_vmentry)
|
||||
vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
|
||||
|
||||
vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02);
|
||||
vmx_segment_cache_clear(vmx);
|
||||
|
||||
if (prepare_vmcs02(vcpu, vmcs12, from_vmentry, &exit_qual)) {
|
||||
leave_guest_mode(vcpu);
|
||||
@@ -12175,6 +12172,9 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
|
||||
}
|
||||
|
||||
vmx_switch_vmcs(vcpu, &vmx->vmcs01);
|
||||
vm_entry_controls_reset_shadow(vmx);
|
||||
vm_exit_controls_reset_shadow(vmx);
|
||||
vmx_segment_cache_clear(vmx);
|
||||
|
||||
/* Update any VMCS fields that might have changed while L2 ran */
|
||||
vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, vmx->msr_autoload.host.nr);
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <asm/segment.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
@@ -24,6 +25,7 @@ ENTRY(xen_\name)
|
||||
pop %r11
|
||||
jmp \name
|
||||
END(xen_\name)
|
||||
_ASM_NOKPROBE(xen_\name)
|
||||
.endm
|
||||
|
||||
xen_pv_trap divide_error
|
||||
|
||||
@@ -296,30 +296,33 @@ drop_alg:
|
||||
|
||||
static int crypto_dump_report(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
{
|
||||
struct crypto_alg *alg;
|
||||
const size_t start_pos = cb->args[0];
|
||||
size_t pos = 0;
|
||||
struct crypto_dump_info info;
|
||||
int err;
|
||||
|
||||
if (cb->args[0])
|
||||
goto out;
|
||||
|
||||
cb->args[0] = 1;
|
||||
struct crypto_alg *alg;
|
||||
int res;
|
||||
|
||||
info.in_skb = cb->skb;
|
||||
info.out_skb = skb;
|
||||
info.nlmsg_seq = cb->nlh->nlmsg_seq;
|
||||
info.nlmsg_flags = NLM_F_MULTI;
|
||||
|
||||
down_read(&crypto_alg_sem);
|
||||
list_for_each_entry(alg, &crypto_alg_list, cra_list) {
|
||||
err = crypto_report_alg(alg, &info);
|
||||
if (err)
|
||||
goto out_err;
|
||||
if (pos >= start_pos) {
|
||||
res = crypto_report_alg(alg, &info);
|
||||
if (res == -EMSGSIZE)
|
||||
break;
|
||||
if (res)
|
||||
goto out;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
cb->args[0] = pos;
|
||||
res = skb->len;
|
||||
out:
|
||||
return skb->len;
|
||||
out_err:
|
||||
return err;
|
||||
up_read(&crypto_alg_sem);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int crypto_dump_report_done(struct netlink_callback *cb)
|
||||
@@ -503,7 +506,7 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
if ((type == (CRYPTO_MSG_GETALG - CRYPTO_MSG_BASE) &&
|
||||
(nlh->nlmsg_flags & NLM_F_DUMP))) {
|
||||
struct crypto_alg *alg;
|
||||
u16 dump_alloc = 0;
|
||||
unsigned long dump_alloc = 0;
|
||||
|
||||
if (link->dump == NULL)
|
||||
return -EINVAL;
|
||||
@@ -511,16 +514,16 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
down_read(&crypto_alg_sem);
|
||||
list_for_each_entry(alg, &crypto_alg_list, cra_list)
|
||||
dump_alloc += CRYPTO_REPORT_MAXSIZE;
|
||||
up_read(&crypto_alg_sem);
|
||||
|
||||
{
|
||||
struct netlink_dump_control c = {
|
||||
.dump = link->dump,
|
||||
.done = link->done,
|
||||
.min_dump_alloc = dump_alloc,
|
||||
.min_dump_alloc = min(dump_alloc, 65535UL),
|
||||
};
|
||||
err = netlink_dump_start(crypto_nlsk, skb, nlh, &c);
|
||||
}
|
||||
up_read(&crypto_alg_sem);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -518,12 +518,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
||||
* have _PS0 and _PS3 without _PSC (and no power resources), so
|
||||
* acpi_bus_init_power() will assume that the BIOS has put them into D0.
|
||||
*/
|
||||
ret = acpi_device_fix_up_power(adev);
|
||||
if (ret) {
|
||||
/* Skip the device, but continue the namespace scan. */
|
||||
ret = 0;
|
||||
goto err_out;
|
||||
}
|
||||
acpi_device_fix_up_power(adev);
|
||||
|
||||
adev->driver_data = pdata;
|
||||
pdev = acpi_create_platform_device(adev, dev_desc->properties);
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/cper.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/ratelimit.h>
|
||||
@@ -171,40 +170,40 @@ static int ghes_estatus_pool_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ghes_estatus_pool_free_chunk_page(struct gen_pool *pool,
|
||||
static void ghes_estatus_pool_free_chunk(struct gen_pool *pool,
|
||||
struct gen_pool_chunk *chunk,
|
||||
void *data)
|
||||
{
|
||||
free_page(chunk->start_addr);
|
||||
vfree((void *)chunk->start_addr);
|
||||
}
|
||||
|
||||
static void ghes_estatus_pool_exit(void)
|
||||
{
|
||||
gen_pool_for_each_chunk(ghes_estatus_pool,
|
||||
ghes_estatus_pool_free_chunk_page, NULL);
|
||||
ghes_estatus_pool_free_chunk, NULL);
|
||||
gen_pool_destroy(ghes_estatus_pool);
|
||||
}
|
||||
|
||||
static int ghes_estatus_pool_expand(unsigned long len)
|
||||
{
|
||||
unsigned long i, pages, size, addr;
|
||||
int ret;
|
||||
unsigned long size, addr;
|
||||
|
||||
ghes_estatus_pool_size_request += PAGE_ALIGN(len);
|
||||
size = gen_pool_size(ghes_estatus_pool);
|
||||
if (size >= ghes_estatus_pool_size_request)
|
||||
return 0;
|
||||
pages = (ghes_estatus_pool_size_request - size) / PAGE_SIZE;
|
||||
for (i = 0; i < pages; i++) {
|
||||
addr = __get_free_page(GFP_KERNEL);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
ret = gen_pool_add(ghes_estatus_pool, addr, PAGE_SIZE, -1);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
addr = (unsigned long)vmalloc(PAGE_ALIGN(len));
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* New allocation must be visible in all pgd before it can be found by
|
||||
* an NMI allocating from the pool.
|
||||
*/
|
||||
vmalloc_sync_all();
|
||||
|
||||
return gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1);
|
||||
}
|
||||
|
||||
static int map_gen_v2(struct ghes *ghes)
|
||||
@@ -936,7 +935,6 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
|
||||
|
||||
sev = ghes_severity(ghes->estatus->error_severity);
|
||||
if (sev >= GHES_SEV_PANIC) {
|
||||
oops_begin();
|
||||
ghes_print_queued_estatus();
|
||||
__ghes_panic(ghes);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/clk/clk-conf.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/kmemleak.h>
|
||||
|
||||
#include "base.h"
|
||||
#include "power/power.h"
|
||||
@@ -526,6 +527,8 @@ struct platform_device *platform_device_register_full(
|
||||
if (!pdev->dev.dma_mask)
|
||||
goto err;
|
||||
|
||||
kmemleak_ignore(pdev->dev.dma_mask);
|
||||
|
||||
*pdev->dev.dma_mask = pdevinfo->dma_mask;
|
||||
pdev->dev.coherent_dma_mask = pdevinfo->dma_mask;
|
||||
}
|
||||
|
||||
@@ -795,7 +795,6 @@ int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_packet cm
|
||||
|
||||
if (nc->tentative && connection->agreed_pro_version < 92) {
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&sock->mutex);
|
||||
drbd_err(connection, "--dry-run is not supported by peer");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
@@ -1515,6 +1515,30 @@ static void sanitize_disk_conf(struct drbd_device *device, struct disk_conf *dis
|
||||
}
|
||||
}
|
||||
|
||||
static int disk_opts_check_al_size(struct drbd_device *device, struct disk_conf *dc)
|
||||
{
|
||||
int err = -EBUSY;
|
||||
|
||||
if (device->act_log &&
|
||||
device->act_log->nr_elements == dc->al_extents)
|
||||
return 0;
|
||||
|
||||
drbd_suspend_io(device);
|
||||
/* If IO completion is currently blocked, we would likely wait
|
||||
* "forever" for the activity log to become unused. So we don't. */
|
||||
if (atomic_read(&device->ap_bio_cnt))
|
||||
goto out;
|
||||
|
||||
wait_event(device->al_wait, lc_try_lock(device->act_log));
|
||||
drbd_al_shrink(device);
|
||||
err = drbd_check_al_size(device, dc);
|
||||
lc_unlock(device->act_log);
|
||||
wake_up(&device->al_wait);
|
||||
out:
|
||||
drbd_resume_io(device);
|
||||
return err;
|
||||
}
|
||||
|
||||
int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct drbd_config_context adm_ctx;
|
||||
@@ -1577,15 +1601,12 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
drbd_suspend_io(device);
|
||||
wait_event(device->al_wait, lc_try_lock(device->act_log));
|
||||
drbd_al_shrink(device);
|
||||
err = drbd_check_al_size(device, new_disk_conf);
|
||||
lc_unlock(device->act_log);
|
||||
wake_up(&device->al_wait);
|
||||
drbd_resume_io(device);
|
||||
|
||||
err = disk_opts_check_al_size(device, new_disk_conf);
|
||||
if (err) {
|
||||
/* Could be just "busy". Ignore?
|
||||
* Introduce dedicated error code? */
|
||||
drbd_msg_put_info(adm_ctx.reply_skb,
|
||||
"Try again without changing current al-extents setting");
|
||||
retcode = ERR_NOMEM;
|
||||
goto fail_unlock;
|
||||
}
|
||||
@@ -1935,9 +1956,9 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
if (device->state.conn < C_CONNECTED &&
|
||||
device->state.role == R_PRIMARY && device->ed_uuid &&
|
||||
(device->ed_uuid & ~((u64)1)) != (nbc->md.uuid[UI_CURRENT] & ~((u64)1))) {
|
||||
if (device->state.pdsk != D_UP_TO_DATE && device->ed_uuid &&
|
||||
(device->state.role == R_PRIMARY || device->state.peer == R_PRIMARY) &&
|
||||
(device->ed_uuid & ~((u64)1)) != (nbc->md.uuid[UI_CURRENT] & ~((u64)1))) {
|
||||
drbd_err(device, "Can only attach to data with current UUID=%016llX\n",
|
||||
(unsigned long long)device->ed_uuid);
|
||||
retcode = ERR_DATA_NOT_CURRENT;
|
||||
|
||||
@@ -3977,6 +3977,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
||||
struct o_qlim *o = (connection->agreed_features & DRBD_FF_WSAME) ? p->qlim : NULL;
|
||||
enum determine_dev_size dd = DS_UNCHANGED;
|
||||
sector_t p_size, p_usize, p_csize, my_usize;
|
||||
sector_t new_size, cur_size;
|
||||
int ldsc = 0; /* local disk size changed */
|
||||
enum dds_flags ddsf;
|
||||
|
||||
@@ -3984,6 +3985,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
||||
if (!peer_device)
|
||||
return config_unknown_volume(connection, pi);
|
||||
device = peer_device->device;
|
||||
cur_size = drbd_get_capacity(device->this_bdev);
|
||||
|
||||
p_size = be64_to_cpu(p->d_size);
|
||||
p_usize = be64_to_cpu(p->u_size);
|
||||
@@ -3994,7 +3996,6 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
||||
device->p_size = p_size;
|
||||
|
||||
if (get_ldev(device)) {
|
||||
sector_t new_size, cur_size;
|
||||
rcu_read_lock();
|
||||
my_usize = rcu_dereference(device->ldev->disk_conf)->disk_size;
|
||||
rcu_read_unlock();
|
||||
@@ -4012,7 +4013,6 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
||||
/* Never shrink a device with usable data during connect.
|
||||
But allow online shrinking if we are connected. */
|
||||
new_size = drbd_new_dev_size(device, device->ldev, p_usize, 0);
|
||||
cur_size = drbd_get_capacity(device->this_bdev);
|
||||
if (new_size < cur_size &&
|
||||
device->state.disk >= D_OUTDATED &&
|
||||
device->state.conn < C_CONNECTED) {
|
||||
@@ -4077,9 +4077,36 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
|
||||
*
|
||||
* However, if he sends a zero current size,
|
||||
* take his (user-capped or) backing disk size anyways.
|
||||
*
|
||||
* Unless of course he does not have a disk himself.
|
||||
* In which case we ignore this completely.
|
||||
*/
|
||||
sector_t new_size = p_csize ?: p_usize ?: p_size;
|
||||
drbd_reconsider_queue_parameters(device, NULL, o);
|
||||
drbd_set_my_capacity(device, p_csize ?: p_usize ?: p_size);
|
||||
if (new_size == 0) {
|
||||
/* Ignore, peer does not know nothing. */
|
||||
} else if (new_size == cur_size) {
|
||||
/* nothing to do */
|
||||
} else if (cur_size != 0 && p_size == 0) {
|
||||
drbd_warn(device, "Ignored diskless peer device size (peer:%llu != me:%llu sectors)!\n",
|
||||
(unsigned long long)new_size, (unsigned long long)cur_size);
|
||||
} else if (new_size < cur_size && device->state.role == R_PRIMARY) {
|
||||
drbd_err(device, "The peer's device size is too small! (%llu < %llu sectors); demote me first!\n",
|
||||
(unsigned long long)new_size, (unsigned long long)cur_size);
|
||||
conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD);
|
||||
return -EIO;
|
||||
} else {
|
||||
/* I believe the peer, if
|
||||
* - I don't have a current size myself
|
||||
* - we agree on the size anyways
|
||||
* - I do have a current size, am Secondary,
|
||||
* and he has the only disk
|
||||
* - I do have a current size, am Primary,
|
||||
* and he has the only disk,
|
||||
* which is larger than my current size
|
||||
*/
|
||||
drbd_set_my_capacity(device, new_size);
|
||||
}
|
||||
}
|
||||
|
||||
if (get_ldev(device)) {
|
||||
@@ -4365,6 +4392,25 @@ static int receive_state(struct drbd_connection *connection, struct packet_info
|
||||
if (peer_state.conn == C_AHEAD)
|
||||
ns.conn = C_BEHIND;
|
||||
|
||||
/* TODO:
|
||||
* if (primary and diskless and peer uuid != effective uuid)
|
||||
* abort attach on peer;
|
||||
*
|
||||
* If this node does not have good data, was already connected, but
|
||||
* the peer did a late attach only now, trying to "negotiate" with me,
|
||||
* AND I am currently Primary, possibly frozen, with some specific
|
||||
* "effective" uuid, this should never be reached, really, because
|
||||
* we first send the uuids, then the current state.
|
||||
*
|
||||
* In this scenario, we already dropped the connection hard
|
||||
* when we received the unsuitable uuids (receive_uuids().
|
||||
*
|
||||
* Should we want to change this, that is: not drop the connection in
|
||||
* receive_uuids() already, then we would need to add a branch here
|
||||
* that aborts the attach of "unsuitable uuids" on the peer in case
|
||||
* this node is currently Diskless Primary.
|
||||
*/
|
||||
|
||||
if (device->p_uuid && peer_state.disk >= D_NEGOTIATING &&
|
||||
get_ldev_if_state(device, D_NEGOTIATING)) {
|
||||
int cr; /* consider resync */
|
||||
|
||||
@@ -131,7 +131,7 @@ extern enum drbd_state_rv _drbd_set_state(struct drbd_device *, union drbd_state
|
||||
enum chg_state_flags,
|
||||
struct completion *done);
|
||||
extern void print_st_err(struct drbd_device *, union drbd_state,
|
||||
union drbd_state, int);
|
||||
union drbd_state, enum drbd_state_rv);
|
||||
|
||||
enum drbd_state_rv
|
||||
_conn_request_state(struct drbd_connection *connection, union drbd_state mask, union drbd_state val,
|
||||
|
||||
@@ -50,6 +50,12 @@
|
||||
#define BCM_LM_DIAG_PKT 0x07
|
||||
#define BCM_LM_DIAG_SIZE 63
|
||||
|
||||
#define BCM_TYPE49_PKT 0x31
|
||||
#define BCM_TYPE49_SIZE 0
|
||||
|
||||
#define BCM_TYPE52_PKT 0x34
|
||||
#define BCM_TYPE52_SIZE 0
|
||||
|
||||
#define BCM_AUTOSUSPEND_DELAY 5000 /* default autosleep delay */
|
||||
|
||||
/* platform device driver resources */
|
||||
@@ -483,12 +489,28 @@ finalize:
|
||||
.lsize = 0, \
|
||||
.maxlen = BCM_NULL_SIZE
|
||||
|
||||
#define BCM_RECV_TYPE49 \
|
||||
.type = BCM_TYPE49_PKT, \
|
||||
.hlen = BCM_TYPE49_SIZE, \
|
||||
.loff = 0, \
|
||||
.lsize = 0, \
|
||||
.maxlen = BCM_TYPE49_SIZE
|
||||
|
||||
#define BCM_RECV_TYPE52 \
|
||||
.type = BCM_TYPE52_PKT, \
|
||||
.hlen = BCM_TYPE52_SIZE, \
|
||||
.loff = 0, \
|
||||
.lsize = 0, \
|
||||
.maxlen = BCM_TYPE52_SIZE
|
||||
|
||||
static const struct h4_recv_pkt bcm_recv_pkts[] = {
|
||||
{ H4_RECV_ACL, .recv = hci_recv_frame },
|
||||
{ H4_RECV_SCO, .recv = hci_recv_frame },
|
||||
{ H4_RECV_EVENT, .recv = hci_recv_frame },
|
||||
{ BCM_RECV_LM_DIAG, .recv = hci_recv_diag },
|
||||
{ BCM_RECV_NULL, .recv = hci_recv_diag },
|
||||
{ BCM_RECV_TYPE49, .recv = hci_recv_diag },
|
||||
{ BCM_RECV_TYPE52, .recv = hci_recv_diag },
|
||||
};
|
||||
|
||||
static int bcm_recv(struct hci_uart *hu, const void *data, int count)
|
||||
|
||||
@@ -166,6 +166,13 @@ static int stm32_rng_probe(struct platform_device *ofdev)
|
||||
return devm_hwrng_register(dev, &priv->rng);
|
||||
}
|
||||
|
||||
static int stm32_rng_remove(struct platform_device *ofdev)
|
||||
{
|
||||
pm_runtime_disable(&ofdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int stm32_rng_runtime_suspend(struct device *dev)
|
||||
{
|
||||
@@ -202,6 +209,7 @@ static struct platform_driver stm32_rng_driver = {
|
||||
.of_match_table = stm32_rng_match,
|
||||
},
|
||||
.probe = stm32_rng_probe,
|
||||
.remove = stm32_rng_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(stm32_rng_driver);
|
||||
|
||||
@@ -284,7 +284,7 @@ static void clk_generated_startup(struct clk_generated *gck)
|
||||
static struct clk_hw * __init
|
||||
at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
|
||||
const char *name, const char **parent_names,
|
||||
u8 num_parents, u8 id,
|
||||
u8 num_parents, u8 id, bool pll_audio,
|
||||
const struct clk_range *range)
|
||||
{
|
||||
struct clk_generated *gck;
|
||||
@@ -308,6 +308,7 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
|
||||
gck->regmap = regmap;
|
||||
gck->lock = lock;
|
||||
gck->range = *range;
|
||||
gck->audio_pll_allowed = pll_audio;
|
||||
|
||||
clk_generated_startup(gck);
|
||||
hw = &gck->hw;
|
||||
@@ -333,7 +334,6 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
|
||||
struct device_node *gcknp;
|
||||
struct clk_range range = CLK_RANGE(0, 0);
|
||||
struct regmap *regmap;
|
||||
struct clk_generated *gck;
|
||||
|
||||
num_parents = of_clk_get_parent_count(np);
|
||||
if (num_parents == 0 || num_parents > GENERATED_SOURCE_MAX)
|
||||
@@ -350,6 +350,8 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
|
||||
return;
|
||||
|
||||
for_each_child_of_node(np, gcknp) {
|
||||
bool pll_audio = false;
|
||||
|
||||
if (of_property_read_u32(gcknp, "reg", &id))
|
||||
continue;
|
||||
|
||||
@@ -362,24 +364,14 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
|
||||
of_at91_get_clk_range(gcknp, "atmel,clk-output-range",
|
||||
&range);
|
||||
|
||||
if (of_device_is_compatible(np, "atmel,sama5d2-clk-generated") &&
|
||||
(id == GCK_ID_I2S0 || id == GCK_ID_I2S1 ||
|
||||
id == GCK_ID_CLASSD))
|
||||
pll_audio = true;
|
||||
|
||||
hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, name,
|
||||
parent_names, num_parents,
|
||||
id, &range);
|
||||
|
||||
gck = to_clk_generated(hw);
|
||||
|
||||
if (of_device_is_compatible(np,
|
||||
"atmel,sama5d2-clk-generated")) {
|
||||
if (gck->id == GCK_ID_SSC0 || gck->id == GCK_ID_SSC1 ||
|
||||
gck->id == GCK_ID_I2S0 || gck->id == GCK_ID_I2S1 ||
|
||||
gck->id == GCK_ID_CLASSD)
|
||||
gck->audio_pll_allowed = true;
|
||||
else
|
||||
gck->audio_pll_allowed = false;
|
||||
} else {
|
||||
gck->audio_pll_allowed = false;
|
||||
}
|
||||
|
||||
id, pll_audio, &range);
|
||||
if (IS_ERR(hw))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ at91_clk_register_main_osc(struct regmap *regmap,
|
||||
if (bypass)
|
||||
regmap_update_bits(regmap,
|
||||
AT91_CKGR_MOR, MOR_KEY_MASK |
|
||||
AT91_PMC_MOSCEN,
|
||||
AT91_PMC_OSCBYPASS,
|
||||
AT91_PMC_OSCBYPASS | AT91_PMC_KEY);
|
||||
|
||||
hw = &osc->hw;
|
||||
@@ -354,7 +354,10 @@ static int clk_main_probe_frequency(struct regmap *regmap)
|
||||
regmap_read(regmap, AT91_CKGR_MCFR, &mcfr);
|
||||
if (mcfr & AT91_PMC_MAINRDY)
|
||||
return 0;
|
||||
usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT);
|
||||
if (system_state < SYSTEM_RUNNING)
|
||||
udelay(MAINF_LOOP_MIN_WAIT);
|
||||
else
|
||||
usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT);
|
||||
} while (time_before(prep_time, timeout));
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
||||
@@ -74,7 +74,10 @@ static int clk_slow_osc_prepare(struct clk_hw *hw)
|
||||
|
||||
writel(tmp | AT91_SCKC_OSC32EN, sckcr);
|
||||
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
if (system_state < SYSTEM_RUNNING)
|
||||
udelay(osc->startup_usec);
|
||||
else
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -197,7 +200,10 @@ static int clk_slow_rc_osc_prepare(struct clk_hw *hw)
|
||||
|
||||
writel(readl(sckcr) | AT91_SCKC_RCEN, sckcr);
|
||||
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
if (system_state < SYSTEM_RUNNING)
|
||||
udelay(osc->startup_usec);
|
||||
else
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -310,7 +316,10 @@ static int clk_sam9x5_slow_set_parent(struct clk_hw *hw, u8 index)
|
||||
|
||||
writel(tmp, sckcr);
|
||||
|
||||
usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1);
|
||||
if (system_state < SYSTEM_RUNNING)
|
||||
udelay(SLOWCK_SW_TIME_USEC);
|
||||
else
|
||||
usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -443,7 +452,10 @@ static int clk_sama5d4_slow_osc_prepare(struct clk_hw *hw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
if (system_state < SYSTEM_RUNNING)
|
||||
udelay(osc->startup_usec);
|
||||
else
|
||||
usleep_range(osc->startup_usec, osc->startup_usec + 1);
|
||||
osc->prepared = true;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -687,6 +687,7 @@ static struct clk_divider gxbb_sar_adc_clk_div = {
|
||||
.ops = &clk_divider_ops,
|
||||
.parent_names = (const char *[]){ "sar_adc_clk_sel" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -170,12 +170,18 @@ static const unsigned long exynos5x_clk_regs[] __initconst = {
|
||||
GATE_BUS_CPU,
|
||||
GATE_SCLK_CPU,
|
||||
CLKOUT_CMU_CPU,
|
||||
CPLL_CON0,
|
||||
DPLL_CON0,
|
||||
EPLL_CON0,
|
||||
EPLL_CON1,
|
||||
EPLL_CON2,
|
||||
RPLL_CON0,
|
||||
RPLL_CON1,
|
||||
RPLL_CON2,
|
||||
IPLL_CON0,
|
||||
SPLL_CON0,
|
||||
VPLL_CON0,
|
||||
MPLL_CON0,
|
||||
SRC_TOP0,
|
||||
SRC_TOP1,
|
||||
SRC_TOP2,
|
||||
|
||||
@@ -1231,7 +1231,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev)
|
||||
|
||||
/* Enforce d1 = 0, d2 = 0 for Audio PLL */
|
||||
val = readl(reg + SUN9I_A80_PLL_AUDIO_REG);
|
||||
val &= (BIT(16) & BIT(18));
|
||||
val &= ~(BIT(16) | BIT(18));
|
||||
writel(val, reg + SUN9I_A80_PLL_AUDIO_REG);
|
||||
|
||||
/* Enforce P = 1 for both CPU cluster PLLs */
|
||||
|
||||
@@ -174,7 +174,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
|
||||
struct clk_init_data init = { NULL };
|
||||
const char **parent_names = NULL;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL);
|
||||
if (!clk_hw) {
|
||||
@@ -207,11 +206,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
|
||||
clk = ti_clk_register(NULL, &clk_hw->hw, node->name);
|
||||
|
||||
if (!IS_ERR(clk)) {
|
||||
ret = ti_clk_add_alias(NULL, clk, node->name);
|
||||
if (ret) {
|
||||
clk_unregister(clk);
|
||||
goto cleanup;
|
||||
}
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
kfree(parent_names);
|
||||
return;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include <linux/delay.h>
|
||||
|
||||
/*
|
||||
* Register definitions for the timers
|
||||
* Register definitions common for all the timer variants.
|
||||
*/
|
||||
#define TIMER1_COUNT (0x00)
|
||||
#define TIMER1_LOAD (0x04)
|
||||
@@ -36,9 +36,10 @@
|
||||
#define TIMER3_MATCH1 (0x28)
|
||||
#define TIMER3_MATCH2 (0x2c)
|
||||
#define TIMER_CR (0x30)
|
||||
#define TIMER_INTR_STATE (0x34)
|
||||
#define TIMER_INTR_MASK (0x38)
|
||||
|
||||
/*
|
||||
* Control register (TMC30) bit fields for fttmr010/gemini/moxart timers.
|
||||
*/
|
||||
#define TIMER_1_CR_ENABLE BIT(0)
|
||||
#define TIMER_1_CR_CLOCK BIT(1)
|
||||
#define TIMER_1_CR_INT BIT(2)
|
||||
@@ -53,8 +54,9 @@
|
||||
#define TIMER_3_CR_UPDOWN BIT(11)
|
||||
|
||||
/*
|
||||
* The Aspeed AST2400 moves bits around in the control register
|
||||
* and lacks bits for setting the timer to count upwards.
|
||||
* Control register (TMC30) bit fields for aspeed ast2400/ast2500 timers.
|
||||
* The aspeed timers move bits around in the control register and lacks
|
||||
* bits for setting the timer to count upwards.
|
||||
*/
|
||||
#define TIMER_1_CR_ASPEED_ENABLE BIT(0)
|
||||
#define TIMER_1_CR_ASPEED_CLOCK BIT(1)
|
||||
@@ -66,6 +68,18 @@
|
||||
#define TIMER_3_CR_ASPEED_CLOCK BIT(9)
|
||||
#define TIMER_3_CR_ASPEED_INT BIT(10)
|
||||
|
||||
/*
|
||||
* Interrupt status/mask register definitions for fttmr010/gemini/moxart
|
||||
* timers.
|
||||
* The registers don't exist and they are not needed on aspeed timers
|
||||
* because:
|
||||
* - aspeed timer overflow interrupt is controlled by bits in Control
|
||||
* Register (TMC30).
|
||||
* - aspeed timers always generate interrupt when either one of the
|
||||
* Match registers equals to Status register.
|
||||
*/
|
||||
#define TIMER_INTR_STATE (0x34)
|
||||
#define TIMER_INTR_MASK (0x38)
|
||||
#define TIMER_1_INT_MATCH1 BIT(0)
|
||||
#define TIMER_1_INT_MATCH2 BIT(1)
|
||||
#define TIMER_1_INT_OVERFLOW BIT(2)
|
||||
@@ -80,7 +94,7 @@
|
||||
struct fttmr010 {
|
||||
void __iomem *base;
|
||||
unsigned int tick_rate;
|
||||
bool count_down;
|
||||
bool is_aspeed;
|
||||
u32 t1_enable_val;
|
||||
struct clock_event_device clkevt;
|
||||
#ifdef CONFIG_ARM
|
||||
@@ -130,7 +144,7 @@ static int fttmr010_timer_set_next_event(unsigned long cycles,
|
||||
cr &= ~fttmr010->t1_enable_val;
|
||||
writel(cr, fttmr010->base + TIMER_CR);
|
||||
|
||||
if (fttmr010->count_down) {
|
||||
if (fttmr010->is_aspeed) {
|
||||
/*
|
||||
* ASPEED Timer Controller will load TIMER1_LOAD register
|
||||
* into TIMER1_COUNT register when the timer is re-enabled.
|
||||
@@ -175,16 +189,17 @@ static int fttmr010_timer_set_oneshot(struct clock_event_device *evt)
|
||||
|
||||
/* Setup counter start from 0 or ~0 */
|
||||
writel(0, fttmr010->base + TIMER1_COUNT);
|
||||
if (fttmr010->count_down)
|
||||
if (fttmr010->is_aspeed) {
|
||||
writel(~0, fttmr010->base + TIMER1_LOAD);
|
||||
else
|
||||
} else {
|
||||
writel(0, fttmr010->base + TIMER1_LOAD);
|
||||
|
||||
/* Enable interrupt */
|
||||
cr = readl(fttmr010->base + TIMER_INTR_MASK);
|
||||
cr &= ~(TIMER_1_INT_OVERFLOW | TIMER_1_INT_MATCH2);
|
||||
cr |= TIMER_1_INT_MATCH1;
|
||||
writel(cr, fttmr010->base + TIMER_INTR_MASK);
|
||||
/* Enable interrupt */
|
||||
cr = readl(fttmr010->base + TIMER_INTR_MASK);
|
||||
cr &= ~(TIMER_1_INT_OVERFLOW | TIMER_1_INT_MATCH2);
|
||||
cr |= TIMER_1_INT_MATCH1;
|
||||
writel(cr, fttmr010->base + TIMER_INTR_MASK);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -201,9 +216,8 @@ static int fttmr010_timer_set_periodic(struct clock_event_device *evt)
|
||||
writel(cr, fttmr010->base + TIMER_CR);
|
||||
|
||||
/* Setup timer to fire at 1/HZ intervals. */
|
||||
if (fttmr010->count_down) {
|
||||
if (fttmr010->is_aspeed) {
|
||||
writel(period, fttmr010->base + TIMER1_LOAD);
|
||||
writel(0, fttmr010->base + TIMER1_MATCH1);
|
||||
} else {
|
||||
cr = 0xffffffff - (period - 1);
|
||||
writel(cr, fttmr010->base + TIMER1_COUNT);
|
||||
@@ -281,23 +295,21 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
||||
}
|
||||
|
||||
/*
|
||||
* The Aspeed AST2400 moves bits around in the control register,
|
||||
* otherwise it works the same.
|
||||
* The Aspeed timers move bits around in the control register.
|
||||
*/
|
||||
if (is_aspeed) {
|
||||
fttmr010->t1_enable_val = TIMER_1_CR_ASPEED_ENABLE |
|
||||
TIMER_1_CR_ASPEED_INT;
|
||||
/* Downward not available */
|
||||
fttmr010->count_down = true;
|
||||
fttmr010->is_aspeed = true;
|
||||
} else {
|
||||
fttmr010->t1_enable_val = TIMER_1_CR_ENABLE | TIMER_1_CR_INT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the interrupt mask and status
|
||||
*/
|
||||
writel(TIMER_INT_ALL_MASK, fttmr010->base + TIMER_INTR_MASK);
|
||||
writel(0, fttmr010->base + TIMER_INTR_STATE);
|
||||
/*
|
||||
* Reset the interrupt mask and status
|
||||
*/
|
||||
writel(TIMER_INT_ALL_MASK, fttmr010->base + TIMER_INTR_MASK);
|
||||
writel(0, fttmr010->base + TIMER_INTR_STATE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable timer 1 count up, timer 2 count up, except on Aspeed,
|
||||
@@ -306,9 +318,8 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
||||
if (is_aspeed)
|
||||
val = TIMER_2_CR_ASPEED_ENABLE;
|
||||
else {
|
||||
val = TIMER_2_CR_ENABLE;
|
||||
if (!fttmr010->count_down)
|
||||
val |= TIMER_1_CR_UPDOWN | TIMER_2_CR_UPDOWN;
|
||||
val = TIMER_2_CR_ENABLE | TIMER_1_CR_UPDOWN |
|
||||
TIMER_2_CR_UPDOWN;
|
||||
}
|
||||
writel(val, fttmr010->base + TIMER_CR);
|
||||
|
||||
@@ -321,7 +332,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
||||
writel(0, fttmr010->base + TIMER2_MATCH1);
|
||||
writel(0, fttmr010->base + TIMER2_MATCH2);
|
||||
|
||||
if (fttmr010->count_down) {
|
||||
if (fttmr010->is_aspeed) {
|
||||
writel(~0, fttmr010->base + TIMER2_LOAD);
|
||||
clocksource_mmio_init(fttmr010->base + TIMER2_COUNT,
|
||||
"FTTMR010-TIMER2",
|
||||
@@ -371,7 +382,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
||||
|
||||
#ifdef CONFIG_ARM
|
||||
/* Also use this timer for delays */
|
||||
if (fttmr010->count_down)
|
||||
if (fttmr010->is_aspeed)
|
||||
fttmr010->delay_timer.read_current_timer =
|
||||
fttmr010_read_current_timer_down;
|
||||
else
|
||||
|
||||
@@ -178,12 +178,12 @@ static int mxc_scc_get_data(struct mxc_scc_ctx *ctx,
|
||||
else
|
||||
from = scc->black_memory;
|
||||
|
||||
dev_dbg(scc->dev, "pcopy: from 0x%p %d bytes\n", from,
|
||||
dev_dbg(scc->dev, "pcopy: from 0x%p %zu bytes\n", from,
|
||||
ctx->dst_nents * 8);
|
||||
len = sg_pcopy_from_buffer(ablkreq->dst, ctx->dst_nents,
|
||||
from, ctx->size, ctx->offset);
|
||||
if (!len) {
|
||||
dev_err(scc->dev, "pcopy err from 0x%p (len=%d)\n", from, len);
|
||||
dev_err(scc->dev, "pcopy err from 0x%p (len=%zu)\n", from, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ static int mxc_scc_put_data(struct mxc_scc_ctx *ctx,
|
||||
len = sg_pcopy_to_buffer(req->src, ctx->src_nents,
|
||||
to, len, ctx->offset);
|
||||
if (!len) {
|
||||
dev_err(scc->dev, "pcopy err to 0x%p (len=%d)\n", to, len);
|
||||
dev_err(scc->dev, "pcopy err to 0x%p (len=%zu)\n", to, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -335,9 +335,9 @@ static void mxc_scc_ablkcipher_next(struct mxc_scc_ctx *ctx,
|
||||
return;
|
||||
}
|
||||
|
||||
dev_dbg(scc->dev, "Start encryption (0x%p/0x%p)\n",
|
||||
(void *)readl(scc->base + SCC_SCM_RED_START),
|
||||
(void *)readl(scc->base + SCC_SCM_BLACK_START));
|
||||
dev_dbg(scc->dev, "Start encryption (0x%x/0x%x)\n",
|
||||
readl(scc->base + SCC_SCM_RED_START),
|
||||
readl(scc->base + SCC_SCM_BLACK_START));
|
||||
|
||||
/* clear interrupt control registers */
|
||||
writel(SCC_SCM_INTR_CTRL_CLR_INTR,
|
||||
|
||||
@@ -361,7 +361,7 @@ static int stm32_hash_xmit_cpu(struct stm32_hash_dev *hdev,
|
||||
return -ETIMEDOUT;
|
||||
|
||||
if ((hdev->flags & HASH_FLAGS_HMAC) &&
|
||||
(hdev->flags & ~HASH_FLAGS_HMAC_KEY)) {
|
||||
(!(hdev->flags & HASH_FLAGS_HMAC_KEY))) {
|
||||
hdev->flags |= HASH_FLAGS_HMAC_KEY;
|
||||
stm32_hash_write_key(hdev);
|
||||
if (stm32_hash_wait_busy(hdev))
|
||||
|
||||
@@ -102,6 +102,7 @@ struct ipu_pre {
|
||||
void *buffer_virt;
|
||||
bool in_use;
|
||||
unsigned int safe_window_end;
|
||||
unsigned int last_bufaddr;
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(ipu_pre_list_mutex);
|
||||
@@ -177,6 +178,7 @@ void ipu_pre_configure(struct ipu_pre *pre, unsigned int width,
|
||||
|
||||
writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF);
|
||||
writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF);
|
||||
pre->last_bufaddr = bufaddr;
|
||||
|
||||
val = IPU_PRE_PREF_ENG_CTRL_INPUT_PIXEL_FORMAT(0) |
|
||||
IPU_PRE_PREF_ENG_CTRL_INPUT_ACTIVE_BPP(active_bpp) |
|
||||
@@ -218,7 +220,11 @@ void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr)
|
||||
unsigned short current_yblock;
|
||||
u32 val;
|
||||
|
||||
if (bufaddr == pre->last_bufaddr)
|
||||
return;
|
||||
|
||||
writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF);
|
||||
pre->last_bufaddr = bufaddr;
|
||||
|
||||
do {
|
||||
if (time_after(jiffies, timeout)) {
|
||||
|
||||
@@ -195,6 +195,18 @@ static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
|
||||
return 0; /* we know nothing about this usage type */
|
||||
}
|
||||
|
||||
/*
|
||||
* Concatenate usage which defines 16 bits or less with the
|
||||
* currently defined usage page to form a 32 bit usage
|
||||
*/
|
||||
|
||||
static void complete_usage(struct hid_parser *parser, unsigned int index)
|
||||
{
|
||||
parser->local.usage[index] &= 0xFFFF;
|
||||
parser->local.usage[index] |=
|
||||
(parser->global.usage_page & 0xFFFF) << 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a usage to the temporary parser table.
|
||||
*/
|
||||
@@ -206,6 +218,14 @@ static int hid_add_usage(struct hid_parser *parser, unsigned usage, u8 size)
|
||||
return -1;
|
||||
}
|
||||
parser->local.usage[parser->local.usage_index] = usage;
|
||||
|
||||
/*
|
||||
* If Usage item only includes usage id, concatenate it with
|
||||
* currently defined usage page
|
||||
*/
|
||||
if (size <= 2)
|
||||
complete_usage(parser, parser->local.usage_index);
|
||||
|
||||
parser->local.usage_size[parser->local.usage_index] = size;
|
||||
parser->local.collection_index[parser->local.usage_index] =
|
||||
parser->collection_stack_ptr ?
|
||||
@@ -522,13 +542,32 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
* usage value."
|
||||
*/
|
||||
|
||||
static void hid_concatenate_usage_page(struct hid_parser *parser)
|
||||
static void hid_concatenate_last_usage_page(struct hid_parser *parser)
|
||||
{
|
||||
int i;
|
||||
unsigned int usage_page;
|
||||
unsigned int current_page;
|
||||
|
||||
for (i = 0; i < parser->local.usage_index; i++)
|
||||
if (parser->local.usage_size[i] <= 2)
|
||||
parser->local.usage[i] += parser->global.usage_page << 16;
|
||||
if (!parser->local.usage_index)
|
||||
return;
|
||||
|
||||
usage_page = parser->global.usage_page;
|
||||
|
||||
/*
|
||||
* Concatenate usage page again only if last declared Usage Page
|
||||
* has not been already used in previous usages concatenation
|
||||
*/
|
||||
for (i = parser->local.usage_index - 1; i >= 0; i--) {
|
||||
if (parser->local.usage_size[i] > 2)
|
||||
/* Ignore extended usages */
|
||||
continue;
|
||||
|
||||
current_page = parser->local.usage[i] >> 16;
|
||||
if (current_page == usage_page)
|
||||
break;
|
||||
|
||||
complete_usage(parser, i);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -540,7 +579,7 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
|
||||
__u32 data;
|
||||
int ret;
|
||||
|
||||
hid_concatenate_usage_page(parser);
|
||||
hid_concatenate_last_usage_page(parser);
|
||||
|
||||
data = item_udata(item);
|
||||
|
||||
@@ -751,7 +790,7 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
|
||||
__u32 data;
|
||||
int i;
|
||||
|
||||
hid_concatenate_usage_page(parser);
|
||||
hid_concatenate_last_usage_page(parser);
|
||||
|
||||
data = item_udata(item);
|
||||
|
||||
|
||||
@@ -222,7 +222,7 @@ int ishtp_hid_probe(unsigned int cur_hid_dev,
|
||||
err_hid_device:
|
||||
kfree(hid_data);
|
||||
err_hid_data:
|
||||
kfree(hid);
|
||||
hid_destroy_device(hid);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
@@ -600,8 +600,10 @@ retry:
|
||||
dw = (len + 3) >> 2;
|
||||
addr = dma_map_single(&ppd->dd->pcidev->dev, sge->vaddr,
|
||||
dw << 2, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(&ppd->dd->pcidev->dev, addr))
|
||||
if (dma_mapping_error(&ppd->dd->pcidev->dev, addr)) {
|
||||
ret = -ENOMEM;
|
||||
goto unmap;
|
||||
}
|
||||
sdmadesc[0] = 0;
|
||||
make_sdma_desc(ppd, sdmadesc, (u64) addr, dw, dwoffset);
|
||||
/* SDmaUseLargeBuf has to be set in every descriptor */
|
||||
|
||||
@@ -550,7 +550,7 @@ struct ib_ah *pvrdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
if (!atomic_add_unless(&dev->num_ahs, 1, dev->dsr->caps.max_ah))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ah = kzalloc(sizeof(*ah), GFP_KERNEL);
|
||||
ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
|
||||
if (!ah) {
|
||||
atomic_dec(&dev->num_ahs);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -59,7 +59,7 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev,
|
||||
return -EINVAL;
|
||||
|
||||
for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_name); cnt++)
|
||||
stats->value[cnt] = dev->stats_counters[cnt];
|
||||
stats->value[cnt] = atomic64_read(&dev->stats_counters[cnt]);
|
||||
|
||||
return ARRAY_SIZE(rxe_counter_name);
|
||||
}
|
||||
|
||||
@@ -410,16 +410,16 @@ struct rxe_dev {
|
||||
spinlock_t mmap_offset_lock; /* guard mmap_offset */
|
||||
int mmap_offset;
|
||||
|
||||
u64 stats_counters[RXE_NUM_OF_COUNTERS];
|
||||
atomic64_t stats_counters[RXE_NUM_OF_COUNTERS];
|
||||
|
||||
struct rxe_port port;
|
||||
struct list_head list;
|
||||
struct crypto_shash *tfm;
|
||||
};
|
||||
|
||||
static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters cnt)
|
||||
static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)
|
||||
{
|
||||
rxe->stats_counters[cnt]++;
|
||||
atomic64_inc(&rxe->stats_counters[index]);
|
||||
}
|
||||
|
||||
static inline struct rxe_dev *to_rdev(struct ib_device *dev)
|
||||
|
||||
@@ -2210,6 +2210,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
|
||||
|
||||
if (srp_post_send(ch, iu, len)) {
|
||||
shost_printk(KERN_ERR, target->scsi_host, PFX "Send failed\n");
|
||||
scmnd->result = DID_ERROR << 16;
|
||||
goto err_unmap;
|
||||
}
|
||||
|
||||
|
||||
@@ -382,9 +382,9 @@ static int __init gscps2_probe(struct parisc_device *dev)
|
||||
goto fail;
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO "serio: %s port at 0x%p irq %d @ %s\n",
|
||||
pr_info("serio: %s port at 0x%08lx irq %d @ %s\n",
|
||||
ps2port->port->name,
|
||||
ps2port->addr,
|
||||
hpa,
|
||||
ps2port->padev->irq,
|
||||
ps2port->port->phys);
|
||||
|
||||
|
||||
@@ -887,8 +887,8 @@ static int __init hp_sdc_init(void)
|
||||
"HP SDC NMI", &hp_sdc))
|
||||
goto err2;
|
||||
|
||||
printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n",
|
||||
(void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
|
||||
pr_info(PREFIX "HP SDC at 0x%08lx, IRQ %d (NMI IRQ %d)\n",
|
||||
hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
|
||||
|
||||
hp_sdc_status_in8();
|
||||
hp_sdc_data_in8();
|
||||
|
||||
@@ -139,10 +139,14 @@ static struct lock_class_key reserved_rbtree_key;
|
||||
static inline int match_hid_uid(struct device *dev,
|
||||
struct acpihid_map_entry *entry)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
const char *hid, *uid;
|
||||
|
||||
hid = acpi_device_hid(ACPI_COMPANION(dev));
|
||||
uid = acpi_device_uid(ACPI_COMPANION(dev));
|
||||
if (!adev)
|
||||
return -ENODEV;
|
||||
|
||||
hid = acpi_device_hid(adev);
|
||||
uid = acpi_device_uid(adev);
|
||||
|
||||
if (!hid || !(*hid))
|
||||
return -ENODEV;
|
||||
|
||||
@@ -363,22 +363,24 @@ static int mbox_test_probe(struct platform_device *pdev)
|
||||
|
||||
/* It's okay for MMIO to be NULL */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
size = resource_size(res);
|
||||
tdev->tx_mmio = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (PTR_ERR(tdev->tx_mmio) == -EBUSY)
|
||||
if (PTR_ERR(tdev->tx_mmio) == -EBUSY) {
|
||||
/* if reserved area in SRAM, try just ioremap */
|
||||
size = resource_size(res);
|
||||
tdev->tx_mmio = devm_ioremap(&pdev->dev, res->start, size);
|
||||
else if (IS_ERR(tdev->tx_mmio))
|
||||
} else if (IS_ERR(tdev->tx_mmio)) {
|
||||
tdev->tx_mmio = NULL;
|
||||
}
|
||||
|
||||
/* If specified, second reg entry is Rx MMIO */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
size = resource_size(res);
|
||||
tdev->rx_mmio = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (PTR_ERR(tdev->rx_mmio) == -EBUSY)
|
||||
if (PTR_ERR(tdev->rx_mmio) == -EBUSY) {
|
||||
size = resource_size(res);
|
||||
tdev->rx_mmio = devm_ioremap(&pdev->dev, res->start, size);
|
||||
else if (IS_ERR(tdev->rx_mmio))
|
||||
} else if (IS_ERR(tdev->rx_mmio)) {
|
||||
tdev->rx_mmio = tdev->tx_mmio;
|
||||
}
|
||||
|
||||
tdev->tx_channel = mbox_test_request_channel(pdev, "tx");
|
||||
tdev->rx_channel = mbox_test_request_channel(pdev, "rx");
|
||||
|
||||
@@ -282,20 +282,31 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio)
|
||||
|
||||
static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc)
|
||||
{
|
||||
unsigned bio_bytes = bio_cur_bytes(bio);
|
||||
char *data = bio_data(bio);
|
||||
unsigned int corrupt_bio_byte = fc->corrupt_bio_byte - 1;
|
||||
|
||||
struct bvec_iter iter;
|
||||
struct bio_vec bvec;
|
||||
|
||||
if (!bio_has_data(bio))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Overwrite the Nth byte of the data returned.
|
||||
* Overwrite the Nth byte of the bio's data, on whichever page
|
||||
* it falls.
|
||||
*/
|
||||
if (data && bio_bytes >= fc->corrupt_bio_byte) {
|
||||
data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value;
|
||||
|
||||
DMDEBUG("Corrupting data bio=%p by writing %u to byte %u "
|
||||
"(rw=%c bi_opf=%u bi_sector=%llu cur_bytes=%u)\n",
|
||||
bio, fc->corrupt_bio_value, fc->corrupt_bio_byte,
|
||||
(bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf,
|
||||
(unsigned long long)bio->bi_iter.bi_sector, bio_bytes);
|
||||
bio_for_each_segment(bvec, bio, iter) {
|
||||
if (bio_iter_len(bio, iter) > corrupt_bio_byte) {
|
||||
char *segment = (page_address(bio_iter_page(bio, iter))
|
||||
+ bio_iter_offset(bio, iter));
|
||||
segment[corrupt_bio_byte] = fc->corrupt_bio_value;
|
||||
DMDEBUG("Corrupting data bio=%p by writing %u to byte %u "
|
||||
"(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n",
|
||||
bio, fc->corrupt_bio_value, fc->corrupt_bio_byte,
|
||||
(bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf,
|
||||
(unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size);
|
||||
break;
|
||||
}
|
||||
corrupt_bio_byte -= bio_iter_len(bio, iter);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1555,6 +1555,8 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier)
|
||||
struct vb2_queue *q = &isc->vb2_vidq;
|
||||
int ret;
|
||||
|
||||
INIT_WORK(&isc->awb_work, isc_awb_work);
|
||||
|
||||
ret = v4l2_device_register_subdev_nodes(&isc->v4l2_dev);
|
||||
if (ret < 0) {
|
||||
v4l2_err(&isc->v4l2_dev, "Failed to register subdev nodes\n");
|
||||
@@ -1614,8 +1616,6 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier)
|
||||
return ret;
|
||||
}
|
||||
|
||||
INIT_WORK(&isc->awb_work, isc_awb_work);
|
||||
|
||||
/* Register video device */
|
||||
strlcpy(vdev->name, ATMEL_ISC_NAME, sizeof(vdev->name));
|
||||
vdev->release = video_device_release_empty;
|
||||
@@ -1722,8 +1722,11 @@ static int isc_parse_dt(struct device *dev, struct isc_device *isc)
|
||||
break;
|
||||
}
|
||||
|
||||
subdev_entity->asd = devm_kzalloc(dev,
|
||||
sizeof(*subdev_entity->asd), GFP_KERNEL);
|
||||
/* asd will be freed by the subsystem once it's added to the
|
||||
* notifier list
|
||||
*/
|
||||
subdev_entity->asd = kzalloc(sizeof(*subdev_entity->asd),
|
||||
GFP_KERNEL);
|
||||
if (subdev_entity->asd == NULL) {
|
||||
of_node_put(rem);
|
||||
ret = -ENOMEM;
|
||||
@@ -1859,6 +1862,7 @@ static int atmel_isc_probe(struct platform_device *pdev)
|
||||
&subdev_entity->notifier);
|
||||
if (ret) {
|
||||
dev_err(dev, "fail to register async notifier\n");
|
||||
kfree(subdev_entity->asd);
|
||||
goto cleanup_subdev;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,6 +161,9 @@ struct stm32_dcmi {
|
||||
u32 misr;
|
||||
int errors_count;
|
||||
int buffers_count;
|
||||
|
||||
/* Ensure DMA operations atomicity */
|
||||
struct mutex dma_lock;
|
||||
};
|
||||
|
||||
static inline struct stm32_dcmi *notifier_to_dcmi(struct v4l2_async_notifier *n)
|
||||
@@ -291,6 +294,13 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Avoid call of dmaengine_terminate_all() between
|
||||
* dmaengine_prep_slave_single() and dmaengine_submit()
|
||||
* by locking the whole DMA submission sequence
|
||||
*/
|
||||
mutex_lock(&dcmi->dma_lock);
|
||||
|
||||
/* Prepare a DMA transaction */
|
||||
desc = dmaengine_prep_slave_single(dcmi->dma_chan, buf->paddr,
|
||||
buf->size,
|
||||
@@ -298,6 +308,7 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi,
|
||||
if (!desc) {
|
||||
dev_err(dcmi->dev, "%s: DMA dmaengine_prep_slave_single failed for buffer size %zu\n",
|
||||
__func__, buf->size);
|
||||
mutex_unlock(&dcmi->dma_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -309,9 +320,12 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi,
|
||||
dcmi->dma_cookie = dmaengine_submit(desc);
|
||||
if (dma_submit_error(dcmi->dma_cookie)) {
|
||||
dev_err(dcmi->dev, "%s: DMA submission failed\n", __func__);
|
||||
mutex_unlock(&dcmi->dma_lock);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
mutex_unlock(&dcmi->dma_lock);
|
||||
|
||||
dma_async_issue_pending(dcmi->dma_chan);
|
||||
|
||||
return 0;
|
||||
@@ -690,7 +704,9 @@ static void dcmi_stop_streaming(struct vb2_queue *vq)
|
||||
spin_unlock_irq(&dcmi->irqlock);
|
||||
|
||||
/* Stop all pending DMA operations */
|
||||
mutex_lock(&dcmi->dma_lock);
|
||||
dmaengine_terminate_all(dcmi->dma_chan);
|
||||
mutex_unlock(&dcmi->dma_lock);
|
||||
|
||||
clk_disable(dcmi->mclk);
|
||||
|
||||
@@ -1662,6 +1678,7 @@ static int dcmi_probe(struct platform_device *pdev)
|
||||
|
||||
spin_lock_init(&dcmi->irqlock);
|
||||
mutex_init(&dcmi->lock);
|
||||
mutex_init(&dcmi->dma_lock);
|
||||
init_completion(&dcmi->complete);
|
||||
INIT_LIST_HEAD(&dcmi->buffers);
|
||||
|
||||
|
||||
@@ -1014,6 +1014,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
|
||||
case V4L2_CID_FLASH_STROBE_STOP:
|
||||
case V4L2_CID_AUTO_FOCUS_START:
|
||||
case V4L2_CID_AUTO_FOCUS_STOP:
|
||||
case V4L2_CID_DO_WHITE_BALANCE:
|
||||
*type = V4L2_CTRL_TYPE_BUTTON;
|
||||
*flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
|
||||
V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
|
||||
|
||||
@@ -850,15 +850,16 @@ static const struct device_type mei_cl_device_type = {
|
||||
|
||||
/**
|
||||
* mei_cl_bus_set_name - set device name for me client device
|
||||
* <controller>-<client device>
|
||||
* Example: 0000:00:16.0-55213584-9a29-4916-badf-0fb7ed682aeb
|
||||
*
|
||||
* @cldev: me client device
|
||||
*/
|
||||
static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
|
||||
{
|
||||
dev_set_name(&cldev->dev, "mei:%s:%pUl:%02X",
|
||||
cldev->name,
|
||||
mei_me_cl_uuid(cldev->me_cl),
|
||||
mei_me_cl_ver(cldev->me_cl));
|
||||
dev_set_name(&cldev->dev, "%s-%pUl",
|
||||
dev_name(cldev->bus->dev),
|
||||
mei_me_cl_uuid(cldev->me_cl));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -74,9 +75,11 @@
|
||||
#define CFG_CLK_ALWAYS_ON BIT(18)
|
||||
#define CFG_CHK_DS BIT(20)
|
||||
#define CFG_AUTO_CLK BIT(23)
|
||||
#define CFG_ERR_ABORT BIT(27)
|
||||
|
||||
#define SD_EMMC_STATUS 0x48
|
||||
#define STATUS_BUSY BIT(31)
|
||||
#define STATUS_DESC_BUSY BIT(30)
|
||||
#define STATUS_DATI GENMASK(23, 16)
|
||||
|
||||
#define SD_EMMC_IRQ_EN 0x4c
|
||||
@@ -905,6 +908,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
|
||||
|
||||
cmd_cfg |= FIELD_PREP(CMD_CFG_CMD_INDEX_MASK, cmd->opcode);
|
||||
cmd_cfg |= CMD_CFG_OWNER; /* owned by CPU */
|
||||
cmd_cfg |= CMD_CFG_ERROR; /* stop in case of error */
|
||||
|
||||
meson_mmc_set_response_bits(cmd, &cmd_cfg);
|
||||
|
||||
@@ -999,6 +1003,17 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
||||
u32 irq_en, status, raw_status;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
irq_en = readl(host->regs + SD_EMMC_IRQ_EN);
|
||||
raw_status = readl(host->regs + SD_EMMC_STATUS);
|
||||
status = raw_status & irq_en;
|
||||
|
||||
if (!status) {
|
||||
dev_dbg(host->dev,
|
||||
"Unexpected IRQ! irq_en 0x%08x - status 0x%08x\n",
|
||||
irq_en, raw_status);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
if (WARN_ON(!host) || WARN_ON(!host->cmd))
|
||||
return IRQ_NONE;
|
||||
|
||||
@@ -1006,22 +1021,18 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
||||
|
||||
cmd = host->cmd;
|
||||
data = cmd->data;
|
||||
irq_en = readl(host->regs + SD_EMMC_IRQ_EN);
|
||||
raw_status = readl(host->regs + SD_EMMC_STATUS);
|
||||
status = raw_status & irq_en;
|
||||
|
||||
cmd->error = 0;
|
||||
if (status & IRQ_CRC_ERR) {
|
||||
dev_dbg(host->dev, "CRC Error - status 0x%08x\n", status);
|
||||
cmd->error = -EILSEQ;
|
||||
ret = IRQ_HANDLED;
|
||||
ret = IRQ_WAKE_THREAD;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (status & IRQ_TIMEOUTS) {
|
||||
dev_dbg(host->dev, "Timeout - status 0x%08x\n", status);
|
||||
cmd->error = -ETIMEDOUT;
|
||||
ret = IRQ_HANDLED;
|
||||
ret = IRQ_WAKE_THREAD;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1046,17 +1057,49 @@ out:
|
||||
/* ack all enabled interrupts */
|
||||
writel(irq_en, host->regs + SD_EMMC_STATUS);
|
||||
|
||||
if (cmd->error) {
|
||||
/* Stop desc in case of errors */
|
||||
u32 start = readl(host->regs + SD_EMMC_START);
|
||||
|
||||
start &= ~START_DESC_BUSY;
|
||||
writel(start, host->regs + SD_EMMC_START);
|
||||
}
|
||||
|
||||
if (ret == IRQ_HANDLED)
|
||||
meson_mmc_request_done(host->mmc, cmd->mrq);
|
||||
else if (ret == IRQ_NONE)
|
||||
dev_warn(host->dev,
|
||||
"Unexpected IRQ! status=0x%08x, irq_en=0x%08x\n",
|
||||
raw_status, irq_en);
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int meson_mmc_wait_desc_stop(struct meson_host *host)
|
||||
{
|
||||
int loop;
|
||||
u32 status;
|
||||
|
||||
/*
|
||||
* It may sometimes take a while for it to actually halt. Here, we
|
||||
* are giving it 5ms to comply
|
||||
*
|
||||
* If we don't confirm the descriptor is stopped, it might raise new
|
||||
* IRQs after we have called mmc_request_done() which is bad.
|
||||
*/
|
||||
for (loop = 50; loop; loop--) {
|
||||
status = readl(host->regs + SD_EMMC_STATUS);
|
||||
if (status & (STATUS_BUSY | STATUS_DESC_BUSY))
|
||||
udelay(100);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (status & (STATUS_BUSY | STATUS_DESC_BUSY)) {
|
||||
dev_err(host->dev, "Timed out waiting for host to stop\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
|
||||
{
|
||||
struct meson_host *host = dev_id;
|
||||
@@ -1067,6 +1110,13 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
|
||||
if (WARN_ON(!cmd))
|
||||
return IRQ_NONE;
|
||||
|
||||
if (cmd->error) {
|
||||
meson_mmc_wait_desc_stop(host);
|
||||
meson_mmc_request_done(host->mmc, cmd->mrq);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
data = cmd->data;
|
||||
if (meson_mmc_bounce_buf_read(data)) {
|
||||
xfer_bytes = data->blksz * data->blocks;
|
||||
@@ -1107,6 +1157,9 @@ static void meson_mmc_cfg_init(struct meson_host *host)
|
||||
cfg |= FIELD_PREP(CFG_RC_CC_MASK, ilog2(SD_EMMC_CFG_CMD_GAP));
|
||||
cfg |= FIELD_PREP(CFG_BLK_LEN_MASK, ilog2(SD_EMMC_CFG_BLK_SIZE));
|
||||
|
||||
/* abort chain on R/W errors */
|
||||
cfg |= CFG_ERR_ABORT;
|
||||
|
||||
writel(cfg, host->regs + SD_EMMC_CFG);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
extern struct mutex mtd_table_mutex;
|
||||
|
||||
struct mtd_info *__mtd_next_device(int i);
|
||||
int add_mtd_device(struct mtd_info *mtd);
|
||||
int __must_check add_mtd_device(struct mtd_info *mtd);
|
||||
int del_mtd_device(struct mtd_info *mtd);
|
||||
int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
|
||||
int del_mtd_partitions(struct mtd_info *);
|
||||
|
||||
@@ -684,10 +684,21 @@ int mtd_add_partition(struct mtd_info *parent, const char *name,
|
||||
list_add(&new->list, &mtd_partitions);
|
||||
mutex_unlock(&mtd_partitions_mutex);
|
||||
|
||||
add_mtd_device(&new->mtd);
|
||||
ret = add_mtd_device(&new->mtd);
|
||||
if (ret)
|
||||
goto err_remove_part;
|
||||
|
||||
mtd_add_partition_attrs(new);
|
||||
|
||||
return 0;
|
||||
|
||||
err_remove_part:
|
||||
mutex_lock(&mtd_partitions_mutex);
|
||||
list_del(&new->list);
|
||||
mutex_unlock(&mtd_partitions_mutex);
|
||||
|
||||
free_partition(new);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtd_add_partition);
|
||||
@@ -778,22 +789,31 @@ int add_mtd_partitions(struct mtd_info *master,
|
||||
{
|
||||
struct mtd_part *slave;
|
||||
uint64_t cur_offset = 0;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
|
||||
|
||||
for (i = 0; i < nbparts; i++) {
|
||||
slave = allocate_partition(master, parts + i, i, cur_offset);
|
||||
if (IS_ERR(slave)) {
|
||||
del_mtd_partitions(master);
|
||||
return PTR_ERR(slave);
|
||||
ret = PTR_ERR(slave);
|
||||
goto err_del_partitions;
|
||||
}
|
||||
|
||||
mutex_lock(&mtd_partitions_mutex);
|
||||
list_add(&slave->list, &mtd_partitions);
|
||||
mutex_unlock(&mtd_partitions_mutex);
|
||||
|
||||
add_mtd_device(&slave->mtd);
|
||||
ret = add_mtd_device(&slave->mtd);
|
||||
if (ret) {
|
||||
mutex_lock(&mtd_partitions_mutex);
|
||||
list_del(&slave->list);
|
||||
mutex_unlock(&mtd_partitions_mutex);
|
||||
|
||||
free_partition(slave);
|
||||
goto err_del_partitions;
|
||||
}
|
||||
|
||||
mtd_add_partition_attrs(slave);
|
||||
if (parts[i].types)
|
||||
mtd_parse_part(slave, parts[i].types);
|
||||
@@ -802,6 +822,11 @@ int add_mtd_partitions(struct mtd_info *master,
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_del_partitions:
|
||||
del_mtd_partitions(master);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(part_parser_lock);
|
||||
|
||||
@@ -1888,7 +1888,7 @@ static int atmel_nand_controller_add_nands(struct atmel_nand_controller *nc)
|
||||
|
||||
ret = of_property_read_u32(np, "#size-cells", &val);
|
||||
if (ret) {
|
||||
dev_err(dev, "missing #address-cells property\n");
|
||||
dev_err(dev, "missing #size-cells property\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -875,23 +875,32 @@ static struct atmel_pmecc *atmel_pmecc_get_by_node(struct device *userdev,
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct atmel_pmecc *pmecc, **ptr;
|
||||
int ret;
|
||||
|
||||
pdev = of_find_device_by_node(np);
|
||||
if (!pdev || !platform_get_drvdata(pdev))
|
||||
if (!pdev)
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
pmecc = platform_get_drvdata(pdev);
|
||||
if (!pmecc) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err_put_device;
|
||||
}
|
||||
|
||||
ptr = devres_alloc(devm_atmel_pmecc_put, sizeof(*ptr), GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
get_device(&pdev->dev);
|
||||
pmecc = platform_get_drvdata(pdev);
|
||||
if (!ptr) {
|
||||
ret = -ENOMEM;
|
||||
goto err_put_device;
|
||||
}
|
||||
|
||||
*ptr = pmecc;
|
||||
|
||||
devres_add(userdev, ptr);
|
||||
|
||||
return pmecc;
|
||||
|
||||
err_put_device:
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static const int atmel_pmecc_strengths[] = { 2, 4, 8, 12, 24, 32 };
|
||||
|
||||
@@ -1435,7 +1435,7 @@ static int sunxi_nfc_hw_ecc_write_page_dma(struct mtd_info *mtd,
|
||||
sunxi_nfc_randomizer_enable(mtd);
|
||||
|
||||
writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG,
|
||||
nfc->regs + NFC_REG_RCMD_SET);
|
||||
nfc->regs + NFC_REG_WCMD_SET);
|
||||
|
||||
dma_async_issue_pending(nfc->dmac);
|
||||
|
||||
|
||||
@@ -2382,7 +2382,7 @@ static int spi_nor_init_params(struct spi_nor *nor,
|
||||
memset(params, 0, sizeof(*params));
|
||||
|
||||
/* Set SPI NOR sizes. */
|
||||
params->size = info->sector_size * info->n_sectors;
|
||||
params->size = (u64)info->sector_size * info->n_sectors;
|
||||
params->page_size = info->page_size;
|
||||
|
||||
/* (Fast) Read settings. */
|
||||
|
||||
@@ -1092,10 +1092,10 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)
|
||||
ubi_wl_close(ubi);
|
||||
ubi_free_internal_volumes(ubi);
|
||||
vfree(ubi->vtbl);
|
||||
put_mtd_device(ubi->mtd);
|
||||
vfree(ubi->peb_buf);
|
||||
vfree(ubi->fm_buf);
|
||||
ubi_msg(ubi, "mtd%d is detached", ubi->mtd->index);
|
||||
put_mtd_device(ubi->mtd);
|
||||
put_device(&ubi->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -227,9 +227,9 @@ out_unlock:
|
||||
out_free:
|
||||
kfree(desc);
|
||||
out_put_ubi:
|
||||
ubi_put_device(ubi);
|
||||
ubi_err(ubi, "cannot open device %d, volume %d, error %d",
|
||||
ubi_num, vol_id, err);
|
||||
ubi_put_device(ubi);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ubi_open_volume);
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
#define CONTROL_EX_PDR BIT(8)
|
||||
|
||||
/* control register */
|
||||
#define CONTROL_SWR BIT(15)
|
||||
#define CONTROL_TEST BIT(7)
|
||||
#define CONTROL_CCE BIT(6)
|
||||
#define CONTROL_DISABLE_AR BIT(5)
|
||||
@@ -572,6 +573,26 @@ static void c_can_configure_msg_objects(struct net_device *dev)
|
||||
IF_MCONT_RCV_EOB);
|
||||
}
|
||||
|
||||
static int c_can_software_reset(struct net_device *dev)
|
||||
{
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
int retry = 0;
|
||||
|
||||
if (priv->type != BOSCH_D_CAN)
|
||||
return 0;
|
||||
|
||||
priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_SWR | CONTROL_INIT);
|
||||
while (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_SWR) {
|
||||
msleep(20);
|
||||
if (retry++ > 100) {
|
||||
netdev_err(dev, "CCTRL: software reset failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure C_CAN chip:
|
||||
* - enable/disable auto-retransmission
|
||||
@@ -581,6 +602,11 @@ static void c_can_configure_msg_objects(struct net_device *dev)
|
||||
static int c_can_chip_config(struct net_device *dev)
|
||||
{
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
err = c_can_software_reset(dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* enable automatic retransmission */
|
||||
priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
|
||||
|
||||
@@ -116,37 +116,95 @@ static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b)
|
||||
return cb_b->timestamp - cb_a->timestamp;
|
||||
}
|
||||
|
||||
static struct sk_buff *can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n)
|
||||
/**
|
||||
* can_rx_offload_offload_one() - Read one CAN frame from HW
|
||||
* @offload: pointer to rx_offload context
|
||||
* @n: number of mailbox to read
|
||||
*
|
||||
* The task of this function is to read a CAN frame from mailbox @n
|
||||
* from the device and return the mailbox's content as a struct
|
||||
* sk_buff.
|
||||
*
|
||||
* If the struct can_rx_offload::skb_queue exceeds the maximal queue
|
||||
* length (struct can_rx_offload::skb_queue_len_max) or no skb can be
|
||||
* allocated, the mailbox contents is discarded by reading it into an
|
||||
* overflow buffer. This way the mailbox is marked as free by the
|
||||
* driver.
|
||||
*
|
||||
* Return: A pointer to skb containing the CAN frame on success.
|
||||
*
|
||||
* NULL if the mailbox @n is empty.
|
||||
*
|
||||
* ERR_PTR() in case of an error
|
||||
*/
|
||||
static struct sk_buff *
|
||||
can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct sk_buff *skb = NULL, *skb_error = NULL;
|
||||
struct can_rx_offload_cb *cb;
|
||||
struct can_frame *cf;
|
||||
int ret;
|
||||
|
||||
/* If queue is full or skb not available, read to discard mailbox */
|
||||
if (likely(skb_queue_len(&offload->skb_queue) <=
|
||||
offload->skb_queue_len_max))
|
||||
if (likely(skb_queue_len(&offload->skb_queue) <
|
||||
offload->skb_queue_len_max)) {
|
||||
skb = alloc_can_skb(offload->dev, &cf);
|
||||
if (unlikely(!skb))
|
||||
skb_error = ERR_PTR(-ENOMEM); /* skb alloc failed */
|
||||
} else {
|
||||
skb_error = ERR_PTR(-ENOBUFS); /* skb_queue is full */
|
||||
}
|
||||
|
||||
if (!skb) {
|
||||
/* If queue is full or skb not available, drop by reading into
|
||||
* overflow buffer.
|
||||
*/
|
||||
if (unlikely(skb_error)) {
|
||||
struct can_frame cf_overflow;
|
||||
u32 timestamp;
|
||||
|
||||
ret = offload->mailbox_read(offload, &cf_overflow,
|
||||
×tamp, n);
|
||||
if (ret)
|
||||
offload->dev->stats.rx_dropped++;
|
||||
|
||||
return NULL;
|
||||
/* Mailbox was empty. */
|
||||
if (unlikely(!ret))
|
||||
return NULL;
|
||||
|
||||
/* Mailbox has been read and we're dropping it or
|
||||
* there was a problem reading the mailbox.
|
||||
*
|
||||
* Increment error counters in any case.
|
||||
*/
|
||||
offload->dev->stats.rx_dropped++;
|
||||
offload->dev->stats.rx_fifo_errors++;
|
||||
|
||||
/* There was a problem reading the mailbox, propagate
|
||||
* error value.
|
||||
*/
|
||||
if (unlikely(ret < 0))
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return skb_error;
|
||||
}
|
||||
|
||||
cb = can_rx_offload_get_cb(skb);
|
||||
ret = offload->mailbox_read(offload, cf, &cb->timestamp, n);
|
||||
if (!ret) {
|
||||
|
||||
/* Mailbox was empty. */
|
||||
if (unlikely(!ret)) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* There was a problem reading the mailbox, propagate error value. */
|
||||
if (unlikely(ret < 0)) {
|
||||
kfree_skb(skb);
|
||||
|
||||
offload->dev->stats.rx_dropped++;
|
||||
offload->dev->stats.rx_fifo_errors++;
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/* Mailbox was read. */
|
||||
return skb;
|
||||
}
|
||||
|
||||
@@ -166,8 +224,8 @@ int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pen
|
||||
continue;
|
||||
|
||||
skb = can_rx_offload_offload_one(offload, i);
|
||||
if (!skb)
|
||||
break;
|
||||
if (IS_ERR_OR_NULL(skb))
|
||||
continue;
|
||||
|
||||
__skb_queue_add_sort(&skb_queue, skb, can_rx_offload_compare);
|
||||
}
|
||||
@@ -197,7 +255,13 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload)
|
||||
struct sk_buff *skb;
|
||||
int received = 0;
|
||||
|
||||
while ((skb = can_rx_offload_offload_one(offload, 0))) {
|
||||
while (1) {
|
||||
skb = can_rx_offload_offload_one(offload, 0);
|
||||
if (IS_ERR(skb))
|
||||
continue;
|
||||
if (!skb)
|
||||
break;
|
||||
|
||||
skb_queue_tail(&offload->skb_queue, skb);
|
||||
received++;
|
||||
}
|
||||
@@ -261,8 +325,10 @@ int can_rx_offload_queue_tail(struct can_rx_offload *offload,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (skb_queue_len(&offload->skb_queue) >
|
||||
offload->skb_queue_len_max)
|
||||
return -ENOMEM;
|
||||
offload->skb_queue_len_max) {
|
||||
kfree_skb(skb);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
skb_queue_tail(&offload->skb_queue, skb);
|
||||
can_rx_offload_schedule(offload);
|
||||
|
||||
@@ -441,8 +441,8 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
|
||||
}
|
||||
if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) {
|
||||
/* no error (back to active state) */
|
||||
mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
return 0;
|
||||
new_state = CAN_STATE_ERROR_ACTIVE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -465,9 +465,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
|
||||
}
|
||||
|
||||
if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) {
|
||||
/* no error (back to active state) */
|
||||
mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
return 0;
|
||||
/* no error (back to warning state) */
|
||||
new_state = CAN_STATE_ERROR_WARNING;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -506,6 +506,11 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
|
||||
mc->pdev->dev.can.can_stats.error_warning++;
|
||||
break;
|
||||
|
||||
case CAN_STATE_ERROR_ACTIVE:
|
||||
cf->can_id |= CAN_ERR_CRTL;
|
||||
cf->data[1] = CAN_ERR_CRTL_ACTIVE;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* CAN_STATE_MAX (trick to handle other errors) */
|
||||
cf->can_id |= CAN_ERR_CRTL;
|
||||
|
||||
@@ -432,11 +432,10 @@ static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,
|
||||
* send them to our master MDIO bus controller
|
||||
*/
|
||||
if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr))
|
||||
bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val);
|
||||
return bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val);
|
||||
else
|
||||
mdiobus_write_nested(priv->master_mii_bus, addr, regnum, val);
|
||||
|
||||
return 0;
|
||||
return mdiobus_write_nested(priv->master_mii_bus, addr,
|
||||
regnum, val);
|
||||
}
|
||||
|
||||
static irqreturn_t bcm_sf2_switch_0_isr(int irq, void *dev_id)
|
||||
|
||||
@@ -472,7 +472,9 @@ static void atl1e_mdio_write(struct net_device *netdev, int phy_id,
|
||||
{
|
||||
struct atl1e_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
atl1e_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val);
|
||||
if (atl1e_write_phy_reg(&adapter->hw,
|
||||
reg_num & MDIO_REG_ADDR_MASK, val))
|
||||
netdev_err(netdev, "write phy register failed\n");
|
||||
}
|
||||
|
||||
static int atl1e_mii_ioctl(struct net_device *netdev,
|
||||
|
||||
@@ -1339,14 +1339,22 @@ static int bnxt_flash_nvram(struct net_device *dev,
|
||||
rc = hwrm_send_message(bp, &req, sizeof(req), FLASH_NVRAM_TIMEOUT);
|
||||
dma_free_coherent(&bp->pdev->dev, data_len, kmem, dma_handle);
|
||||
|
||||
if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) {
|
||||
netdev_info(dev,
|
||||
"PF does not have admin privileges to flash the device\n");
|
||||
rc = -EACCES;
|
||||
} else if (rc) {
|
||||
rc = -EIO;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnxt_firmware_reset(struct net_device *dev,
|
||||
u16 dir_type)
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
struct hwrm_fw_reset_input req = {0};
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
int rc;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_RESET, -1, -1);
|
||||
|
||||
@@ -1380,7 +1388,15 @@ static int bnxt_firmware_reset(struct net_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) {
|
||||
netdev_info(dev,
|
||||
"PF does not have admin privileges to reset the device\n");
|
||||
rc = -EACCES;
|
||||
} else if (rc) {
|
||||
rc = -EIO;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnxt_flash_firmware(struct net_device *dev,
|
||||
@@ -1587,9 +1603,9 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
||||
struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
struct hwrm_nvm_install_update_input install = {0};
|
||||
const struct firmware *fw;
|
||||
int rc, hwrm_err = 0;
|
||||
u32 item_len;
|
||||
u16 index;
|
||||
int rc;
|
||||
|
||||
bnxt_hwrm_fw_set_time(bp);
|
||||
|
||||
@@ -1632,15 +1648,16 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
||||
memcpy(kmem, fw->data, fw->size);
|
||||
modify.host_src_addr = cpu_to_le64(dma_handle);
|
||||
|
||||
rc = hwrm_send_message(bp, &modify, sizeof(modify),
|
||||
FLASH_PACKAGE_TIMEOUT);
|
||||
hwrm_err = hwrm_send_message(bp, &modify,
|
||||
sizeof(modify),
|
||||
FLASH_PACKAGE_TIMEOUT);
|
||||
dma_free_coherent(&bp->pdev->dev, fw->size, kmem,
|
||||
dma_handle);
|
||||
}
|
||||
}
|
||||
release_firmware(fw);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (rc || hwrm_err)
|
||||
goto err_exit;
|
||||
|
||||
if ((install_type & 0xffff) == 0)
|
||||
install_type >>= 16;
|
||||
@@ -1648,12 +1665,10 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
||||
install.install_type = cpu_to_le32(install_type);
|
||||
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
rc = _hwrm_send_message(bp, &install, sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (rc) {
|
||||
rc = -EOPNOTSUPP;
|
||||
hwrm_err = _hwrm_send_message(bp, &install, sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (hwrm_err)
|
||||
goto flash_pkg_exit;
|
||||
}
|
||||
|
||||
if (resp->error_code) {
|
||||
u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err;
|
||||
@@ -1661,12 +1676,11 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
||||
if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) {
|
||||
install.flags |= cpu_to_le16(
|
||||
NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG);
|
||||
rc = _hwrm_send_message(bp, &install, sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (rc) {
|
||||
rc = -EOPNOTSUPP;
|
||||
hwrm_err = _hwrm_send_message(bp, &install,
|
||||
sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (hwrm_err)
|
||||
goto flash_pkg_exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1677,6 +1691,14 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
||||
}
|
||||
flash_pkg_exit:
|
||||
mutex_unlock(&bp->hwrm_cmd_lock);
|
||||
err_exit:
|
||||
if (hwrm_err == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) {
|
||||
netdev_info(dev,
|
||||
"PF does not have admin privileges to flash the device\n");
|
||||
rc = -EACCES;
|
||||
} else if (hwrm_err) {
|
||||
rc = -EOPNOTSUPP;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -2236,17 +2258,37 @@ static int bnxt_hwrm_mac_loopback(struct bnxt *bp, bool enable)
|
||||
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
}
|
||||
|
||||
static int bnxt_query_force_speeds(struct bnxt *bp, u16 *force_speeds)
|
||||
{
|
||||
struct hwrm_port_phy_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
struct hwrm_port_phy_qcaps_input req = {0};
|
||||
int rc;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_QCAPS, -1, -1);
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (!rc)
|
||||
*force_speeds = le16_to_cpu(resp->supported_speeds_force_mode);
|
||||
|
||||
mutex_unlock(&bp->hwrm_cmd_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnxt_disable_an_for_lpbk(struct bnxt *bp,
|
||||
struct hwrm_port_phy_cfg_input *req)
|
||||
{
|
||||
struct bnxt_link_info *link_info = &bp->link_info;
|
||||
u16 fw_advertising = link_info->advertising;
|
||||
u16 fw_advertising;
|
||||
u16 fw_speed;
|
||||
int rc;
|
||||
|
||||
if (!link_info->autoneg)
|
||||
return 0;
|
||||
|
||||
rc = bnxt_query_force_speeds(bp, &fw_advertising);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB;
|
||||
if (netif_carrier_ok(bp->dev))
|
||||
fw_speed = bp->link_info.link_speed;
|
||||
|
||||
@@ -2611,8 +2611,10 @@ static void bcmgenet_irq_task(struct work_struct *work)
|
||||
}
|
||||
|
||||
if (status & UMAC_IRQ_PHY_DET_R &&
|
||||
priv->dev->phydev->autoneg != AUTONEG_ENABLE)
|
||||
priv->dev->phydev->autoneg != AUTONEG_ENABLE) {
|
||||
phy_init_hw(priv->dev->phydev);
|
||||
genphy_config_aneg(priv->dev->phydev);
|
||||
}
|
||||
|
||||
/* Link UP/DOWN event */
|
||||
if (status & UMAC_IRQ_LINK_EVENT)
|
||||
@@ -3688,6 +3690,7 @@ static int bcmgenet_resume(struct device *d)
|
||||
|
||||
phy_init_hw(priv->phydev);
|
||||
/* Speed settings must be restored */
|
||||
genphy_config_aneg(dev->phydev);
|
||||
bcmgenet_mii_config(priv->dev, false);
|
||||
|
||||
/* disable ethernet MAC while updating its registers */
|
||||
|
||||
@@ -457,7 +457,11 @@
|
||||
|
||||
/* Bitfields in TISUBN */
|
||||
#define GEM_SUBNSINCR_OFFSET 0
|
||||
#define GEM_SUBNSINCR_SIZE 16
|
||||
#define GEM_SUBNSINCRL_OFFSET 24
|
||||
#define GEM_SUBNSINCRL_SIZE 8
|
||||
#define GEM_SUBNSINCRH_OFFSET 0
|
||||
#define GEM_SUBNSINCRH_SIZE 16
|
||||
#define GEM_SUBNSINCR_SIZE 24
|
||||
|
||||
/* Bitfields in TI */
|
||||
#define GEM_NSINCR_OFFSET 0
|
||||
|
||||
@@ -852,7 +852,9 @@ static void macb_tx_interrupt(struct macb_queue *queue)
|
||||
|
||||
/* First, update TX stats if needed */
|
||||
if (skb) {
|
||||
if (gem_ptp_do_txstamp(queue, skb, desc) == 0) {
|
||||
if (unlikely(skb_shinfo(skb)->tx_flags &
|
||||
SKBTX_HW_TSTAMP) &&
|
||||
gem_ptp_do_txstamp(queue, skb, desc) == 0) {
|
||||
/* skb now belongs to timestamp buffer
|
||||
* and will be removed later
|
||||
*/
|
||||
@@ -2822,7 +2824,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
if (!err)
|
||||
err = -ENODEV;
|
||||
|
||||
dev_err(&pdev->dev, "failed to get macb_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to get macb_clk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2831,7 +2833,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
if (!err)
|
||||
err = -ENODEV;
|
||||
|
||||
dev_err(&pdev->dev, "failed to get hclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to get hclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2845,25 +2847,25 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
|
||||
err = clk_prepare_enable(*pclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*hclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable hclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable hclk (%d)\n", err);
|
||||
goto err_disable_pclk;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*tx_clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable tx_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable tx_clk (%d)\n", err);
|
||||
goto err_disable_hclk;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*rx_clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable rx_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable rx_clk (%d)\n", err);
|
||||
goto err_disable_txclk;
|
||||
}
|
||||
|
||||
@@ -3298,7 +3300,7 @@ static int at91ether_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
|
||||
err = clk_prepare_enable(*pclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -115,7 +115,10 @@ static int gem_tsu_incr_set(struct macb *bp, struct tsu_incr *incr_spec)
|
||||
* to take effect.
|
||||
*/
|
||||
spin_lock_irqsave(&bp->tsu_clk_lock, flags);
|
||||
gem_writel(bp, TISUBN, GEM_BF(SUBNSINCR, incr_spec->sub_ns));
|
||||
/* RegBit[15:0] = Subns[23:8]; RegBit[31:24] = Subns[7:0] */
|
||||
gem_writel(bp, TISUBN, GEM_BF(SUBNSINCRL, incr_spec->sub_ns) |
|
||||
GEM_BF(SUBNSINCRH, (incr_spec->sub_ns >>
|
||||
GEM_SUBNSINCRL_SIZE)));
|
||||
gem_writel(bp, TI, GEM_BF(NSINCR, incr_spec->ns));
|
||||
spin_unlock_irqrestore(&bp->tsu_clk_lock, flags);
|
||||
|
||||
|
||||
@@ -3565,6 +3565,11 @@ fec_drv_remove(struct platform_device *pdev)
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
cancel_work_sync(&fep->tx_timeout_work);
|
||||
fec_ptp_stop(pdev);
|
||||
@@ -3572,13 +3577,17 @@ fec_drv_remove(struct platform_device *pdev)
|
||||
fec_enet_mii_remove(fep);
|
||||
if (fep->reg_phy)
|
||||
regulator_disable(fep->reg_phy);
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
of_node_put(fep->phy_node);
|
||||
free_netdev(ndev);
|
||||
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -251,6 +251,8 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
if ((enum hclge_cmd_return_status)desc_ret ==
|
||||
HCLGE_CMD_EXEC_SUCCESS)
|
||||
retval = 0;
|
||||
else if (desc_ret == HCLGE_CMD_NOT_SUPPORTED)
|
||||
retval = -EOPNOTSUPP;
|
||||
else
|
||||
retval = -EIO;
|
||||
hw->cmq.last_status = (enum hclge_cmd_status)desc_ret;
|
||||
|
||||
@@ -52,7 +52,7 @@ struct hclge_cmq_ring {
|
||||
enum hclge_cmd_return_status {
|
||||
HCLGE_CMD_EXEC_SUCCESS = 0,
|
||||
HCLGE_CMD_NO_AUTH = 1,
|
||||
HCLGE_CMD_NOT_EXEC = 2,
|
||||
HCLGE_CMD_NOT_SUPPORTED = 2,
|
||||
HCLGE_CMD_QUEUE_FULL = 3,
|
||||
};
|
||||
|
||||
|
||||
@@ -838,11 +838,9 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
|
||||
|
||||
priv->numa_node = dev_to_node(&dev->pdev->dev);
|
||||
|
||||
priv->dbg_root = debugfs_create_dir(dev_name(&pdev->dev), mlx5_debugfs_root);
|
||||
if (!priv->dbg_root) {
|
||||
dev_err(&pdev->dev, "Cannot create debugfs dir, aborting\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (mlx5_debugfs_root)
|
||||
priv->dbg_root =
|
||||
debugfs_create_dir(pci_name(pdev), mlx5_debugfs_root);
|
||||
|
||||
err = mlx5_pci_enable_device(dev);
|
||||
if (err) {
|
||||
|
||||
@@ -5852,22 +5852,25 @@ static const struct efx_ef10_nvram_type_info efx_ef10_nvram_types[] = {
|
||||
{ NVRAM_PARTITION_TYPE_LICENSE, 0, 0, "sfc_license" },
|
||||
{ NVRAM_PARTITION_TYPE_PHY_MIN, 0xff, 0, "sfc_phy_fw" },
|
||||
};
|
||||
#define EF10_NVRAM_PARTITION_COUNT ARRAY_SIZE(efx_ef10_nvram_types)
|
||||
|
||||
static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,
|
||||
struct efx_mcdi_mtd_partition *part,
|
||||
unsigned int type)
|
||||
unsigned int type,
|
||||
unsigned long *found)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_METADATA_IN_LEN);
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_METADATA_OUT_LENMAX);
|
||||
const struct efx_ef10_nvram_type_info *info;
|
||||
size_t size, erase_size, outlen;
|
||||
int type_idx = 0;
|
||||
bool protected;
|
||||
int rc;
|
||||
|
||||
for (info = efx_ef10_nvram_types; ; info++) {
|
||||
if (info ==
|
||||
efx_ef10_nvram_types + ARRAY_SIZE(efx_ef10_nvram_types))
|
||||
for (type_idx = 0; ; type_idx++) {
|
||||
if (type_idx == EF10_NVRAM_PARTITION_COUNT)
|
||||
return -ENODEV;
|
||||
info = efx_ef10_nvram_types + type_idx;
|
||||
if ((type & ~info->type_mask) == info->type)
|
||||
break;
|
||||
}
|
||||
@@ -5880,6 +5883,13 @@ static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,
|
||||
if (protected)
|
||||
return -ENODEV; /* hide it */
|
||||
|
||||
/* If we've already exposed a partition of this type, hide this
|
||||
* duplicate. All operations on MTDs are keyed by the type anyway,
|
||||
* so we can't act on the duplicate.
|
||||
*/
|
||||
if (__test_and_set_bit(type_idx, found))
|
||||
return -EEXIST;
|
||||
|
||||
part->nvram_type = type;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, NVRAM_METADATA_IN_TYPE, type);
|
||||
@@ -5908,6 +5918,7 @@ static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,
|
||||
static int efx_ef10_mtd_probe(struct efx_nic *efx)
|
||||
{
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX);
|
||||
DECLARE_BITMAP(found, EF10_NVRAM_PARTITION_COUNT) = { 0 };
|
||||
struct efx_mcdi_mtd_partition *parts;
|
||||
size_t outlen, n_parts_total, i, n_parts;
|
||||
unsigned int type;
|
||||
@@ -5936,11 +5947,13 @@ static int efx_ef10_mtd_probe(struct efx_nic *efx)
|
||||
for (i = 0; i < n_parts_total; i++) {
|
||||
type = MCDI_ARRAY_DWORD(outbuf, NVRAM_PARTITIONS_OUT_TYPE_ID,
|
||||
i);
|
||||
rc = efx_ef10_mtd_probe_partition(efx, &parts[n_parts], type);
|
||||
if (rc == 0)
|
||||
n_parts++;
|
||||
else if (rc != -ENODEV)
|
||||
rc = efx_ef10_mtd_probe_partition(efx, &parts[n_parts], type,
|
||||
found);
|
||||
if (rc == -EEXIST || rc == -ENODEV)
|
||||
continue;
|
||||
if (rc)
|
||||
goto fail;
|
||||
n_parts++;
|
||||
}
|
||||
|
||||
rc = efx_mtd_add(efx, &parts[0].common, n_parts, sizeof(*parts));
|
||||
|
||||
@@ -59,7 +59,9 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
|
||||
gmac->clk_enabled = 1;
|
||||
} else {
|
||||
clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE);
|
||||
clk_prepare(gmac->tx_clk);
|
||||
ret = clk_prepare(gmac->tx_clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -567,7 +567,9 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
|
||||
return ERR_PTR(PTR_ERR(cpts->refclk));
|
||||
}
|
||||
|
||||
clk_prepare(cpts->refclk);
|
||||
ret = clk_prepare(cpts->refclk);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
cpts->cc.read = cpts_systim_read;
|
||||
cpts->cc.mask = CLOCKSOURCE_MASK(32);
|
||||
|
||||
@@ -363,10 +363,11 @@ static void macvlan_broadcast_enqueue(struct macvlan_port *port,
|
||||
}
|
||||
spin_unlock(&port->bc_queue.lock);
|
||||
|
||||
schedule_work(&port->bc_work);
|
||||
|
||||
if (err)
|
||||
goto free_nskb;
|
||||
|
||||
schedule_work(&port->bc_work);
|
||||
return;
|
||||
|
||||
free_nskb:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user