This is the 4.9.117 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAltj7k8ACgkQONu9yGCS
 aT54oRAAxn5rT7Mp5coJqSYFgkzVPOSzuVy8BKq+cwJYe50Ut5nkmWr11jJEkEi6
 GZw8xahCuHECM6yl4NjvKqlM8PyvswZEnsIw5V4A1tjLWBPbatz5pZ3qEOIYt1iE
 2EB8Bq/kxW8kLHWxFJqV2mH0w8/6o8IcejdPhN3IEiPouB0aRtzbcF9X3GjVh8Ec
 6lX9iDn4lodC/EmGJqBbuWj8DjHyTuMZOd/WUkLlFGCLK2KlF+/AIy3rYlkPf2R2
 HQOLXy2ZSeyG3EI+hNHilEr1OVBkddX04QtNzUWDCHaK+OSRl0jamX/J3qymA0WT
 OgfwQ67SLqG9QRtM2SpozPq1MjE8SW40pyNePtj6zbndJMEEGRhPYFyyJeL9MtLw
 0j63qaQ7A3BygTvj/N194aNyoLZeZ0qMzL9hqP9yGcsh+sW6WkYRdwy6bNGHSzcy
 B81XrmObYPVT4tlEFv4wftUFBWQKM6Gv4+VNCEpDVkZCCqnxFN3el1zqMmDjcrPn
 rJOsDMwnFS5kj7kDjvQUQc+rRVUi3Xmc4z3D/OYGEQcRHhI0ztcdmqzdGRR54LfO
 TL4WnpbIVchKP40RsbcoqgwD/MSThjPbPyXe0Y8cYWae2yigoPe74wvALOHuJ1sv
 VXWVBIFQOQmH7Iw8hc20Uwm9wd4DxoVbax8urGON6FJlYviBwlI=
 =tLp7
 -----END PGP SIGNATURE-----

Merge 4.9.117 into android-4.9

Changes in 4.9.117
	Input: elan_i2c - add ACPI ID for lenovo ideapad 330
	Input: i8042 - add Lenovo LaVie Z to the i8042 reset list
	Input: elan_i2c - add another ACPI ID for Lenovo Ideapad 330-15AST
	kvm, mm: account shadow page tables to kmemcg
	tracing: Fix double free of event_trigger_data
	tracing: Fix possible double free in event_enable_trigger_func()
	kthread, tracing: Don't expose half-written comm when creating kthreads
	tracing/kprobes: Fix trace_probe flags on enable_trace_kprobe() failure
	tracing: Quiet gcc warning about maybe unused link variable
	arm64: fix vmemmap BUILD_BUG_ON() triggering on !vmemmap setups
	usb: dwc2: Fix DMA alignment to start at allocated boundary
	kcov: ensure irq code sees a valid area
	xen/netfront: raise max number of slots in xennet_get_responses()
	ALSA: emu10k1: add error handling for snd_ctl_add
	ALSA: fm801: add error handling for snd_ctl_add
	nfsd: fix potential use-after-free in nfsd4_decode_getdeviceinfo
	vfio: platform: Fix reset module leak in error path
	mm: vmalloc: avoid racy handling of debugobjects in vunmap
	mm/slub.c: add __printf verification to slab_err()
	rtc: ensure rtc_set_alarm fails when alarms are not supported
	perf tools: Fix pmu events parsing rule
	netfilter: ipset: List timing out entries with "timeout 1" instead of zero
	infiniband: fix a possible use-after-free bug
	powerpc/eeh: Fix use-after-release of EEH driver
	hvc_opal: don't set tb_ticks_per_usec in udbg_init_opal_common()
	powerpc/64s: Fix compiler store ordering to SLB shadow area
	RDMA/mad: Convert BUG_ONs to error flows
	netfilter: nf_tables: check msg_type before nft_trans_set(trans)
	pnfs: Don't release the sequence slot until we've processed layoutget on open
	disable loading f2fs module on PAGE_SIZE > 4KB
	f2fs: fix error path of move_data_page
	f2fs: fix to don't trigger writeback during recovery
	f2fs: fix to wait page writeback during revoking atomic write
	f2fs: Fix deadlock in shutdown ioctl
	f2fs: fix race in between GC and atomic open
	usbip: usbip_detach: Fix memory, udev context and udev leak
	perf/x86/intel/uncore: Correct fixed counter index check in generic code
	perf/x86/intel/uncore: Correct fixed counter index check for NHM
	selftests/intel_pstate: Improve test, minor fixes
	iwlwifi: pcie: fix race in Rx buffer allocator
	Bluetooth: hci_qca: Fix "Sleep inside atomic section" warning
	Bluetooth: btusb: Add a new Realtek 8723DE ID 2ff8:b011
	ASoC: dpcm: fix BE dai not hw_free and shutdown
	mfd: cros_ec: Fail early if we cannot identify the EC
	mwifiex: handle race during mwifiex_usb_disconnect
	wlcore: sdio: check for valid platform device data before suspend
	media: tw686x: Fix incorrect vb2_mem_ops GFP flags
	media: videobuf2-core: don't call memop 'finish' when queueing
	btrfs: add barriers to btrfs_sync_log before log_commit_wait wakeups
	btrfs: qgroup: Finish rescan when hit the last leaf of extent tree
	PCI: Prevent sysfs disable of device while driver is attached
	ath: Add regulatory mapping for FCC3_ETSIC
	ath: Add regulatory mapping for ETSI8_WORLD
	ath: Add regulatory mapping for APL13_WORLD
	ath: Add regulatory mapping for APL2_FCCA
	ath: Add regulatory mapping for Uganda
	ath: Add regulatory mapping for Tanzania
	ath: Add regulatory mapping for Serbia
	ath: Add regulatory mapping for Bermuda
	ath: Add regulatory mapping for Bahamas
	powerpc/32: Add a missing include header
	powerpc/chrp/time: Make some functions static, add missing header include
	powerpc/powermac: Add missing prototype for note_bootable_part()
	powerpc/powermac: Mark variable x as unused
	powerpc/8xx: fix invalid register expression in head_8xx.S
	pinctrl: at91-pio4: add missing of_node_put
	bpf: powerpc64: pad function address loads with NOPs
	PCI: pciehp: Request control of native hotplug only if supported
	net: dsa: qca8k: Add support for QCA8334 switch
	mwifiex: correct histogram data with appropriate index
	ima: based on policy verify firmware signatures (pre-allocated buffer)
	drivers/perf: arm-ccn: don't log to dmesg in event_init
	fscrypt: use unbound workqueue for decryption
	scsi: ufs: fix exception event handling
	ALSA: emu10k1: Rate-limit error messages about page errors
	regulator: pfuze100: add .is_enable() for pfuze100_swb_regulator_ops
	md: fix NULL dereference of mddev->pers in remove_and_add_spares()
	ixgbevf: fix MAC address changes through ixgbevf_set_mac()
	media: smiapp: fix timeout checking in smiapp_read_nvm
	net: ethernet: ti: cpsw-phy-sel: check bus_find_device() ret value
	ALSA: usb-audio: Apply rate limit to warning messages in URB complete callback
	arm64: cmpwait: Clear event register before arming exclusive monitor
	HID: hid-plantronics: Re-resend Update to map button for PTT products
	drm/radeon: fix mode_valid's return type
	powerpc/embedded6xx/hlwd-pic: Prevent interrupts from being handled by Starlet
	HID: i2c-hid: check if device is there before really probing
	EDAC, altera: Fix ARM64 build warning
	ARM: dts: emev2: Add missing interrupt-affinity to PMU node
	ARM: dts: sh73a0: Add missing interrupt-affinity to PMU node
	nvmem: properly handle returned value nvmem_reg_read
	tty: Fix data race in tty_insert_flip_string_fixed_flag
	dma-iommu: Fix compilation when !CONFIG_IOMMU_DMA
	media: rcar_jpu: Add missing clk_disable_unprepare() on error in jpu_open()
	libata: Fix command retry decision
	media: media-device: fix ioctl function types
	media: saa7164: Fix driver name in debug output
	mtd: rawnand: fsl_ifc: fix FSL NAND driver to read all ONFI parameter pages
	brcmfmac: Add support for bcm43364 wireless chipset
	s390/cpum_sf: Add data entry sizes to sampling trailer entry
	perf: fix invalid bit in diagnostic entry
	bnxt_en: Check unsupported speeds in bnxt_update_link() on PF only.
	scsi: 3w-9xxx: fix a missing-check bug
	scsi: 3w-xxxx: fix a missing-check bug
	scsi: megaraid: silence a static checker bug
	staging: lustre: o2iblnd: fix race at kiblnd_connect_peer
	thermal: exynos: fix setting rising_threshold for Exynos5433
	bpf: fix references to free_bpf_prog_info() in comments
	media: siano: get rid of __le32/__le16 cast warnings
	drm/atomic: Handling the case when setting old crtc for plane
	ALSA: hda/ca0132: fix build failure when a local macro is defined
	mmc: dw_mmc: update actual clock for mmc debugfs
	mmc: pwrseq: Use kmalloc_array instead of stack VLA
	dt-bindings: pinctrl: meson: add support for the Meson8m2 SoC
	dt-bindings: net: meson-dwmac: new compatible name for AXG SoC
	stop_machine: Use raw spinlocks
	memory: tegra: Do not handle spurious interrupts
	memory: tegra: Apply interrupts mask per SoC
	arm64: defconfig: Enable Rockchip io-domain driver
	drm/gma500: fix psb_intel_lvds_mode_valid()'s return type
	ipconfig: Correctly initialise ic_nameservers
	rsi: Fix 'invalid vdd' warning in mmc
	audit: allow not equal op for audit by executable
	staging: lustre: llite: correct removexattr detection
	staging: lustre: ldlm: free resource when ldlm_lock_create() fails.
	serial: core: Make sure compiler barfs for 16-byte earlycon names
	microblaze: Fix simpleImage format generation
	usb: hub: Don't wait for connect state at resume for powered-off ports
	crypto: authencesn - don't leak pointers to authenc keys
	crypto: authenc - don't leak pointers to authenc keys
	media: omap3isp: fix unbalanced dma_iommu_mapping
	scsi: scsi_dh: replace too broad "TP9" string with the exact models
	scsi: megaraid_sas: Increase timeout by 1 sec for non-RAID fastpath IOs
	media: si470x: fix __be16 annotations
	drm: Add DP PSR2 sink enable bit
	random: mix rdrand with entropy sent in from userspace
	squashfs: be more careful about metadata corruption
	ext4: fix inline data updates with checksums enabled
	ext4: check for allocation block validity with block group locked
	RDMA/uverbs: Protect from attempts to create flows on unsupported QP
	net: dsa: qca8k: Force CPU port to its highest bandwidth
	net: dsa: qca8k: Enable RXMAC when bringing up a port
	net: dsa: qca8k: Add QCA8334 binding documentation
	net: dsa: qca8k: Allow overwriting CPU port setting
	Linux 4.9.117

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2018-08-03 08:50:05 +02:00
commit 8b21e85d91
137 changed files with 721 additions and 285 deletions

View file

@ -2,7 +2,10 @@
Required properties: Required properties:
- compatible: should be "qca,qca8337" - compatible: should be one of:
"qca,qca8334"
"qca,qca8337"
- #size-cells: must be 0 - #size-cells: must be 0
- #address-cells: must be 1 - #address-cells: must be 1
@ -14,6 +17,20 @@ port and PHY id, each subnode describing a port needs to have a valid phandle
referencing the internal PHY connected to it. The CPU port of this switch is referencing the internal PHY connected to it. The CPU port of this switch is
always port 0. always port 0.
A CPU port node has the following optional node:
- fixed-link : Fixed-link subnode describing a link to a non-MDIO
managed entity. See
Documentation/devicetree/bindings/net/fixed-link.txt
for details.
For QCA8K the 'fixed-link' sub-node supports only the following properties:
- 'speed' (integer, mandatory), to indicate the link speed. Accepted
values are 10, 100 and 1000
- 'full-duplex' (boolean, optional), to indicate that full duplex is
used. When absent, half duplex is assumed.
Example: Example:
@ -53,6 +70,10 @@ Example:
label = "cpu"; label = "cpu";
ethernet = <&gmac1>; ethernet = <&gmac1>;
phy-mode = "rgmii"; phy-mode = "rgmii";
fixed-link {
speed = 1000;
full-duplex;
};
}; };
port@1 { port@1 {

View file

@ -10,6 +10,7 @@ Required properties on all platforms:
- "amlogic,meson6-dwmac" - "amlogic,meson6-dwmac"
- "amlogic,meson8b-dwmac" - "amlogic,meson8b-dwmac"
- "amlogic,meson-gxbb-dwmac" - "amlogic,meson-gxbb-dwmac"
- "amlogic,meson-axg-dwmac"
Additionally "snps,dwmac" and any applicable more Additionally "snps,dwmac" and any applicable more
detailed version number described in net/stmmac.txt detailed version number described in net/stmmac.txt
should be used. should be used.

View file

@ -3,8 +3,10 @@
Required properties for the root node: Required properties for the root node:
- compatible: one of "amlogic,meson8-cbus-pinctrl" - compatible: one of "amlogic,meson8-cbus-pinctrl"
"amlogic,meson8b-cbus-pinctrl" "amlogic,meson8b-cbus-pinctrl"
"amlogic,meson8m2-cbus-pinctrl"
"amlogic,meson8-aobus-pinctrl" "amlogic,meson8-aobus-pinctrl"
"amlogic,meson8b-aobus-pinctrl" "amlogic,meson8b-aobus-pinctrl"
"amlogic,meson8m2-aobus-pinctrl"
"amlogic,meson-gxbb-periphs-pinctrl" "amlogic,meson-gxbb-periphs-pinctrl"
"amlogic,meson-gxbb-aobus-pinctrl" "amlogic,meson-gxbb-aobus-pinctrl"
- reg: address and size of registers controlling irq functionality - reg: address and size of registers controlling irq functionality

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 9 PATCHLEVEL = 9
SUBLEVEL = 116 SUBLEVEL = 117
EXTRAVERSION = EXTRAVERSION =
NAME = Roaring Lionus NAME = Roaring Lionus

View file

@ -30,13 +30,13 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
cpu@0 { cpu0: cpu@0 {
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a9"; compatible = "arm,cortex-a9";
reg = <0>; reg = <0>;
clock-frequency = <533000000>; clock-frequency = <533000000>;
}; };
cpu@1 { cpu1: cpu@1 {
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a9"; compatible = "arm,cortex-a9";
reg = <1>; reg = <1>;
@ -56,6 +56,7 @@
compatible = "arm,cortex-a9-pmu"; compatible = "arm,cortex-a9-pmu";
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
interrupt-affinity = <&cpu0>, <&cpu1>;
}; };
clocks@e0110000 { clocks@e0110000 {

View file

@ -22,7 +22,7 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
cpu@0 { cpu0: cpu@0 {
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a9"; compatible = "arm,cortex-a9";
reg = <0>; reg = <0>;
@ -30,7 +30,7 @@
power-domains = <&pd_a2sl>; power-domains = <&pd_a2sl>;
next-level-cache = <&L2>; next-level-cache = <&L2>;
}; };
cpu@1 { cpu1: cpu@1 {
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a9"; compatible = "arm,cortex-a9";
reg = <1>; reg = <1>;
@ -89,6 +89,7 @@
compatible = "arm,cortex-a9-pmu"; compatible = "arm,cortex-a9-pmu";
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
interrupt-affinity = <&cpu0>, <&cpu1>;
}; };
cmt1: timer@e6138000 { cmt1: timer@e6138000 {

View file

@ -260,6 +260,8 @@ CONFIG_GPIO_XGENE=y
CONFIG_GPIO_PCA953X=y CONFIG_GPIO_PCA953X=y
CONFIG_GPIO_PCA953X_IRQ=y CONFIG_GPIO_PCA953X_IRQ=y
CONFIG_GPIO_MAX77620=y CONFIG_GPIO_MAX77620=y
CONFIG_POWER_AVS=y
CONFIG_ROCKCHIP_IODOMAIN=y
CONFIG_POWER_RESET_MSM=y CONFIG_POWER_RESET_MSM=y
CONFIG_BATTERY_BQ27XXX=y CONFIG_BATTERY_BQ27XXX=y
CONFIG_POWER_RESET_XGENE=y CONFIG_POWER_RESET_XGENE=y

View file

@ -229,7 +229,9 @@ static inline void __cmpwait_case_##name(volatile void *ptr, \
unsigned long tmp; \ unsigned long tmp; \
\ \
asm volatile( \ asm volatile( \
" ldxr" #sz "\t%" #w "[tmp], %[v]\n" \ " sevl\n" \
" wfe\n" \
" ldxr" #sz "\t%" #w "[tmp], %[v]\n" \
" eor %" #w "[tmp], %" #w "[tmp], %" #w "[val]\n" \ " eor %" #w "[tmp], %" #w "[tmp], %" #w "[val]\n" \
" cbnz %" #w "[tmp], 1f\n" \ " cbnz %" #w "[tmp], 1f\n" \
" wfe\n" \ " wfe\n" \

View file

@ -471,11 +471,13 @@ void __init mem_init(void)
BUILD_BUG_ON(TASK_SIZE_32 > TASK_SIZE_64); BUILD_BUG_ON(TASK_SIZE_32 > TASK_SIZE_64);
#endif #endif
#ifdef CONFIG_SPARSEMEM_VMEMMAP
/* /*
* Make sure we chose the upper bound of sizeof(struct page) * Make sure we chose the upper bound of sizeof(struct page)
* correctly. * correctly when sizing the VMEMMAP array.
*/ */
BUILD_BUG_ON(sizeof(struct page) > (1 << STRUCT_PAGE_MAX_SHIFT)); BUILD_BUG_ON(sizeof(struct page) > (1 << STRUCT_PAGE_MAX_SHIFT));
#endif
if (PAGE_SIZE >= 16384 && get_num_physpages() <= 128) { if (PAGE_SIZE >= 16384 && get_num_physpages() <= 128) {
extern int sysctl_overcommit_memory; extern int sysctl_overcommit_memory;

View file

@ -21,17 +21,19 @@ $(obj)/linux.bin.gz: $(obj)/linux.bin FORCE
quiet_cmd_cp = CP $< $@$2 quiet_cmd_cp = CP $< $@$2
cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
quiet_cmd_strip = STRIP $@ quiet_cmd_strip = STRIP $< $@$2
cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \ cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \
-K _fdt_start vmlinux -o $@ -K _fdt_start $< -o $@$2
UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR) UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR)
UIMAGE_IN = $@
UIMAGE_OUT = $@.ub
$(obj)/simpleImage.%: vmlinux FORCE $(obj)/simpleImage.%: vmlinux FORCE
$(call if_changed,cp,.unstrip) $(call if_changed,cp,.unstrip)
$(call if_changed,objcopy) $(call if_changed,objcopy)
$(call if_changed,uimage) $(call if_changed,uimage)
$(call if_changed,strip) $(call if_changed,strip,.strip)
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' @echo 'Kernel: $(UIMAGE_OUT) is ready' ' (#'`cat .version`')'
clean-files += simpleImage.*.unstrip linux.bin.ub dts/*.dtb clean-files += simpleImage.*.unstrip linux.bin.ub dts/*.dtb

View file

@ -450,9 +450,11 @@ static void *eeh_add_virt_device(void *data, void *userdata)
driver = eeh_pcid_get(dev); driver = eeh_pcid_get(dev);
if (driver) { if (driver) {
eeh_pcid_put(dev); if (driver->err_handler) {
if (driver->err_handler) eeh_pcid_put(dev);
return NULL; return NULL;
}
eeh_pcid_put(dev);
} }
#ifdef CONFIG_PPC_POWERNV #ifdef CONFIG_PPC_POWERNV
@ -489,17 +491,19 @@ static void *eeh_rmv_device(void *data, void *userdata)
if (eeh_dev_removed(edev)) if (eeh_dev_removed(edev))
return NULL; return NULL;
driver = eeh_pcid_get(dev); if (removed) {
if (driver) { if (eeh_pe_passed(edev->pe))
eeh_pcid_put(dev);
if (removed &&
eeh_pe_passed(edev->pe))
return NULL;
if (removed &&
driver->err_handler &&
driver->err_handler->error_detected &&
driver->err_handler->slot_reset)
return NULL; return NULL;
driver = eeh_pcid_get(dev);
if (driver) {
if (driver->err_handler &&
driver->err_handler->error_detected &&
driver->err_handler->slot_reset) {
eeh_pcid_put(dev);
return NULL;
}
eeh_pcid_put(dev);
}
} }
/* Remove it from PCI subsystem */ /* Remove it from PCI subsystem */

View file

@ -769,7 +769,7 @@ start_here:
tovirt(r6,r6) tovirt(r6,r6)
lis r5, abatron_pteptrs@h lis r5, abatron_pteptrs@h
ori r5, r5, abatron_pteptrs@l ori r5, r5, abatron_pteptrs@l
stw r5, 0xf0(r0) /* Must match your Abatron config file */ stw r5, 0xf0(0) /* Must match your Abatron config file */
tophys(r5,r5) tophys(r5,r5)
stw r6, 0(r5) stw r6, 0(r5)

View file

@ -11,6 +11,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <linux/syscalls.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/of.h> #include <linux/of.h>

View file

@ -68,14 +68,14 @@ static inline void slb_shadow_update(unsigned long ea, int ssize,
* updating it. No write barriers are needed here, provided * updating it. No write barriers are needed here, provided
* we only update the current CPU's SLB shadow buffer. * we only update the current CPU's SLB shadow buffer.
*/ */
p->save_area[index].esid = 0; WRITE_ONCE(p->save_area[index].esid, 0);
p->save_area[index].vsid = cpu_to_be64(mk_vsid_data(ea, ssize, flags)); WRITE_ONCE(p->save_area[index].vsid, cpu_to_be64(mk_vsid_data(ea, ssize, flags)));
p->save_area[index].esid = cpu_to_be64(mk_esid_data(ea, ssize, index)); WRITE_ONCE(p->save_area[index].esid, cpu_to_be64(mk_esid_data(ea, ssize, index)));
} }
static inline void slb_shadow_clear(enum slb_index index) static inline void slb_shadow_clear(enum slb_index index)
{ {
get_slb_shadow()->save_area[index].esid = 0; WRITE_ONCE(get_slb_shadow()->save_area[index].esid, 0);
} }
static inline void create_shadowed_slbe(unsigned long ea, int ssize, static inline void create_shadowed_slbe(unsigned long ea, int ssize,

View file

@ -207,25 +207,37 @@ static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
static void bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64 func) static void bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64 func)
{ {
unsigned int i, ctx_idx = ctx->idx;
/* Load function address into r12 */
PPC_LI64(12, func);
/* For bpf-to-bpf function calls, the callee's address is unknown
* until the last extra pass. As seen above, we use PPC_LI64() to
* load the callee's address, but this may optimize the number of
* instructions required based on the nature of the address.
*
* Since we don't want the number of instructions emitted to change,
* we pad the optimized PPC_LI64() call with NOPs to guarantee that
* we always have a five-instruction sequence, which is the maximum
* that PPC_LI64() can emit.
*/
for (i = ctx->idx - ctx_idx; i < 5; i++)
PPC_NOP();
#ifdef PPC64_ELF_ABI_v1 #ifdef PPC64_ELF_ABI_v1
/* func points to the function descriptor */
PPC_LI64(b2p[TMP_REG_2], func);
/* Load actual entry point from function descriptor */
PPC_BPF_LL(b2p[TMP_REG_1], b2p[TMP_REG_2], 0);
/* ... and move it to LR */
PPC_MTLR(b2p[TMP_REG_1]);
/* /*
* Load TOC from function descriptor at offset 8. * Load TOC from function descriptor at offset 8.
* We can clobber r2 since we get called through a * We can clobber r2 since we get called through a
* function pointer (so caller will save/restore r2) * function pointer (so caller will save/restore r2)
* and since we don't use a TOC ourself. * and since we don't use a TOC ourself.
*/ */
PPC_BPF_LL(2, b2p[TMP_REG_2], 8); PPC_BPF_LL(2, 12, 8);
#else /* Load actual entry point from function descriptor */
/* We can clobber r12 */ PPC_BPF_LL(12, 12, 0);
PPC_FUNC_ADDR(12, func);
PPC_MTLR(12);
#endif #endif
PPC_MTLR(12);
PPC_BLRL(); PPC_BLRL();
} }

View file

@ -27,6 +27,8 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/time.h> #include <asm/time.h>
#include <platforms/chrp/chrp.h>
extern spinlock_t rtc_lock; extern spinlock_t rtc_lock;
#define NVRAM_AS0 0x74 #define NVRAM_AS0 0x74
@ -62,7 +64,7 @@ long __init chrp_time_init(void)
return 0; return 0;
} }
int chrp_cmos_clock_read(int addr) static int chrp_cmos_clock_read(int addr)
{ {
if (nvram_as1 != 0) if (nvram_as1 != 0)
outb(addr>>8, nvram_as1); outb(addr>>8, nvram_as1);
@ -70,7 +72,7 @@ int chrp_cmos_clock_read(int addr)
return (inb(nvram_data)); return (inb(nvram_data));
} }
void chrp_cmos_clock_write(unsigned long val, int addr) static void chrp_cmos_clock_write(unsigned long val, int addr)
{ {
if (nvram_as1 != 0) if (nvram_as1 != 0)
outb(addr>>8, nvram_as1); outb(addr>>8, nvram_as1);

View file

@ -35,6 +35,8 @@
*/ */
#define HW_BROADWAY_ICR 0x00 #define HW_BROADWAY_ICR 0x00
#define HW_BROADWAY_IMR 0x04 #define HW_BROADWAY_IMR 0x04
#define HW_STARLET_ICR 0x08
#define HW_STARLET_IMR 0x0c
/* /*
@ -74,6 +76,9 @@ static void hlwd_pic_unmask(struct irq_data *d)
void __iomem *io_base = irq_data_get_irq_chip_data(d); void __iomem *io_base = irq_data_get_irq_chip_data(d);
setbits32(io_base + HW_BROADWAY_IMR, 1 << irq); setbits32(io_base + HW_BROADWAY_IMR, 1 << irq);
/* Make sure the ARM (aka. Starlet) doesn't handle this interrupt. */
clrbits32(io_base + HW_STARLET_IMR, 1 << irq);
} }

View file

@ -468,7 +468,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
boot_infos_t *bi = (boot_infos_t *) r4; boot_infos_t *bi = (boot_infos_t *) r4;
unsigned long hdr; unsigned long hdr;
unsigned long space; unsigned long space;
unsigned long ptr, x; unsigned long ptr;
char *model; char *model;
unsigned long offset = reloc_offset(); unsigned long offset = reloc_offset();
@ -562,6 +562,8 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
* MMU switched OFF, so this should not be useful anymore. * MMU switched OFF, so this should not be useful anymore.
*/ */
if (bi->version < 4) { if (bi->version < 4) {
unsigned long x __maybe_unused;
bootx_printf("Touching pages...\n"); bootx_printf("Touching pages...\n");
/* /*

View file

@ -352,6 +352,7 @@ static int pmac_late_init(void)
} }
machine_late_initcall(powermac, pmac_late_init); machine_late_initcall(powermac, pmac_late_init);
void note_bootable_part(dev_t dev, int part, int goodness);
/* /*
* This is __ref because we check for "initializing" before * This is __ref because we check for "initializing" before
* touching any of the __init sensitive things and "initializing" * touching any of the __init sensitive things and "initializing"

View file

@ -113,7 +113,7 @@ struct hws_basic_entry {
struct hws_diag_entry { struct hws_diag_entry {
unsigned int def:16; /* 0-15 Data Entry Format */ unsigned int def:16; /* 0-15 Data Entry Format */
unsigned int R:14; /* 16-19 and 20-30 reserved */ unsigned int R:15; /* 16-19 and 20-30 reserved */
unsigned int I:1; /* 31 entry valid or invalid */ unsigned int I:1; /* 31 entry valid or invalid */
u8 data[]; /* Machine-dependent sample data */ u8 data[]; /* Machine-dependent sample data */
} __packed; } __packed;
@ -129,7 +129,9 @@ struct hws_trailer_entry {
unsigned int f:1; /* 0 - Block Full Indicator */ unsigned int f:1; /* 0 - Block Full Indicator */
unsigned int a:1; /* 1 - Alert request control */ unsigned int a:1; /* 1 - Alert request control */
unsigned int t:1; /* 2 - Timestamp format */ unsigned int t:1; /* 2 - Timestamp format */
unsigned long long:61; /* 3 - 63: Reserved */ unsigned int :29; /* 3 - 31: Reserved */
unsigned int bsdes:16; /* 32-47: size of basic SDE */
unsigned int dsdes:16; /* 48-63: size of diagnostic SDE */
}; };
unsigned long long flags; /* 0 - 63: All indicators */ unsigned long long flags; /* 0 - 63: All indicators */
}; };

View file

@ -212,7 +212,7 @@ void uncore_perf_event_update(struct intel_uncore_box *box, struct perf_event *e
u64 prev_count, new_count, delta; u64 prev_count, new_count, delta;
int shift; int shift;
if (event->hw.idx >= UNCORE_PMC_IDX_FIXED) if (event->hw.idx == UNCORE_PMC_IDX_FIXED)
shift = 64 - uncore_fixed_ctr_bits(box); shift = 64 - uncore_fixed_ctr_bits(box);
else else
shift = 64 - uncore_perf_ctr_bits(box); shift = 64 - uncore_perf_ctr_bits(box);

View file

@ -245,7 +245,7 @@ static void nhmex_uncore_msr_enable_event(struct intel_uncore_box *box, struct p
{ {
struct hw_perf_event *hwc = &event->hw; struct hw_perf_event *hwc = &event->hw;
if (hwc->idx >= UNCORE_PMC_IDX_FIXED) if (hwc->idx == UNCORE_PMC_IDX_FIXED)
wrmsrl(hwc->config_base, NHMEX_PMON_CTL_EN_BIT0); wrmsrl(hwc->config_base, NHMEX_PMON_CTL_EN_BIT0);
else if (box->pmu->type->event_mask & NHMEX_PMON_CTL_EN_BIT0) else if (box->pmu->type->event_mask & NHMEX_PMON_CTL_EN_BIT0)
wrmsrl(hwc->config_base, hwc->config | NHMEX_PMON_CTL_EN_BIT22); wrmsrl(hwc->config_base, hwc->config | NHMEX_PMON_CTL_EN_BIT22);

View file

@ -698,7 +698,7 @@ static int mmu_topup_memory_cache_page(struct kvm_mmu_memory_cache *cache,
if (cache->nobjs >= min) if (cache->nobjs >= min)
return 0; return 0;
while (cache->nobjs < ARRAY_SIZE(cache->objects)) { while (cache->nobjs < ARRAY_SIZE(cache->objects)) {
page = (void *)__get_free_page(GFP_KERNEL); page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
cache->objects[cache->nobjs++] = page; cache->objects[cache->nobjs++] = page;

View file

@ -108,6 +108,7 @@ static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
CRYPTO_TFM_RES_MASK); CRYPTO_TFM_RES_MASK);
out: out:
memzero_explicit(&keys, sizeof(keys));
return err; return err;
badkey: badkey:

View file

@ -90,6 +90,7 @@ static int crypto_authenc_esn_setkey(struct crypto_aead *authenc_esn, const u8 *
CRYPTO_TFM_RES_MASK); CRYPTO_TFM_RES_MASK);
out: out:
memzero_explicit(&keys, sizeof(keys));
return err; return err;
badkey: badkey:

View file

@ -472,9 +472,11 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
} }
control = OSC_PCI_EXPRESS_CAPABILITY_CONTROL control = OSC_PCI_EXPRESS_CAPABILITY_CONTROL
| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
| OSC_PCI_EXPRESS_PME_CONTROL; | OSC_PCI_EXPRESS_PME_CONTROL;
if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
control |= OSC_PCI_EXPRESS_NATIVE_HP_CONTROL;
if (pci_aer_available()) { if (pci_aer_available()) {
if (aer_acpi_firmware_first()) if (aer_acpi_firmware_first())
dev_info(&device->dev, dev_info(&device->dev,

View file

@ -2282,12 +2282,16 @@ static void ata_eh_link_autopsy(struct ata_link *link)
if (qc->err_mask & ~AC_ERR_OTHER) if (qc->err_mask & ~AC_ERR_OTHER)
qc->err_mask &= ~AC_ERR_OTHER; qc->err_mask &= ~AC_ERR_OTHER;
/* SENSE_VALID trumps dev/unknown error and revalidation */ /*
* SENSE_VALID trumps dev/unknown error and revalidation. Upper
* layers will determine whether the command is worth retrying
* based on the sense data and device class/type. Otherwise,
* determine directly if the command is worth retrying using its
* error mask and flags.
*/
if (qc->flags & ATA_QCFLAG_SENSE_VALID) if (qc->flags & ATA_QCFLAG_SENSE_VALID)
qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
else if (ata_eh_worth_retry(qc))
/* determine whether the command is worth retrying */
if (ata_eh_worth_retry(qc))
qc->flags |= ATA_QCFLAG_RETRY; qc->flags |= ATA_QCFLAG_RETRY;
/* accumulate error info */ /* accumulate error info */

View file

@ -348,6 +348,9 @@ static const struct usb_device_id blacklist_table[] = {
/* Additional Realtek 8723BU Bluetooth devices */ /* Additional Realtek 8723BU Bluetooth devices */
{ USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK },
/* Additional Realtek 8723DE Bluetooth devices */
{ USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK },
/* Additional Realtek 8821AE Bluetooth devices */ /* Additional Realtek 8821AE Bluetooth devices */
{ USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
{ USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },

View file

@ -884,7 +884,7 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
*/ */
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(msecs_to_jiffies(BAUDRATE_SETTLE_TIMEOUT_MS)); schedule_timeout(msecs_to_jiffies(BAUDRATE_SETTLE_TIMEOUT_MS));
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_RUNNING);
return 0; return 0;
} }

View file

@ -736,7 +736,7 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
ccn = pmu_to_arm_ccn(event->pmu); ccn = pmu_to_arm_ccn(event->pmu);
if (hw->sample_period) { if (hw->sample_period) {
dev_warn(ccn->dev, "Sampling not supported!\n"); dev_dbg(ccn->dev, "Sampling not supported!\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
@ -744,12 +744,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
event->attr.exclude_kernel || event->attr.exclude_hv || event->attr.exclude_kernel || event->attr.exclude_hv ||
event->attr.exclude_idle || event->attr.exclude_host || event->attr.exclude_idle || event->attr.exclude_host ||
event->attr.exclude_guest) { event->attr.exclude_guest) {
dev_warn(ccn->dev, "Can't exclude execution levels!\n"); dev_dbg(ccn->dev, "Can't exclude execution levels!\n");
return -EINVAL; return -EINVAL;
} }
if (event->cpu < 0) { if (event->cpu < 0) {
dev_warn(ccn->dev, "Can't provide per-task data!\n"); dev_dbg(ccn->dev, "Can't provide per-task data!\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
/* /*
@ -771,13 +771,13 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
switch (type) { switch (type) {
case CCN_TYPE_MN: case CCN_TYPE_MN:
if (node_xp != ccn->mn_id) { if (node_xp != ccn->mn_id) {
dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp); dev_dbg(ccn->dev, "Invalid MN ID %d!\n", node_xp);
return -EINVAL; return -EINVAL;
} }
break; break;
case CCN_TYPE_XP: case CCN_TYPE_XP:
if (node_xp >= ccn->num_xps) { if (node_xp >= ccn->num_xps) {
dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); dev_dbg(ccn->dev, "Invalid XP ID %d!\n", node_xp);
return -EINVAL; return -EINVAL;
} }
break; break;
@ -785,11 +785,11 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
break; break;
default: default:
if (node_xp >= ccn->num_nodes) { if (node_xp >= ccn->num_nodes) {
dev_warn(ccn->dev, "Invalid node ID %d!\n", node_xp); dev_dbg(ccn->dev, "Invalid node ID %d!\n", node_xp);
return -EINVAL; return -EINVAL;
} }
if (!arm_ccn_pmu_type_eq(type, ccn->node[node_xp].type)) { if (!arm_ccn_pmu_type_eq(type, ccn->node[node_xp].type)) {
dev_warn(ccn->dev, "Invalid type 0x%x for node %d!\n", dev_dbg(ccn->dev, "Invalid type 0x%x for node %d!\n",
type, node_xp); type, node_xp);
return -EINVAL; return -EINVAL;
} }
@ -808,19 +808,19 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
if (event_id != e->event) if (event_id != e->event)
continue; continue;
if (e->num_ports && port >= e->num_ports) { if (e->num_ports && port >= e->num_ports) {
dev_warn(ccn->dev, "Invalid port %d for node/XP %d!\n", dev_dbg(ccn->dev, "Invalid port %d for node/XP %d!\n",
port, node_xp); port, node_xp);
return -EINVAL; return -EINVAL;
} }
if (e->num_vcs && vc >= e->num_vcs) { if (e->num_vcs && vc >= e->num_vcs) {
dev_warn(ccn->dev, "Invalid vc %d for node/XP %d!\n", dev_dbg(ccn->dev, "Invalid vc %d for node/XP %d!\n",
vc, node_xp); vc, node_xp);
return -EINVAL; return -EINVAL;
} }
valid = 1; valid = 1;
} }
if (!valid) { if (!valid) {
dev_warn(ccn->dev, "Invalid event 0x%x for node/XP %d!\n", dev_dbg(ccn->dev, "Invalid event 0x%x for node/XP %d!\n",
event_id, node_xp); event_id, node_xp);
return -EINVAL; return -EINVAL;
} }

View file

@ -1826,14 +1826,22 @@ static int
write_pool(struct entropy_store *r, const char __user *buffer, size_t count) write_pool(struct entropy_store *r, const char __user *buffer, size_t count)
{ {
size_t bytes; size_t bytes;
__u32 buf[16]; __u32 t, buf[16];
const char __user *p = buffer; const char __user *p = buffer;
while (count > 0) { while (count > 0) {
int b, i = 0;
bytes = min(count, sizeof(buf)); bytes = min(count, sizeof(buf));
if (copy_from_user(&buf, p, bytes)) if (copy_from_user(&buf, p, bytes))
return -EFAULT; return -EFAULT;
for (b = bytes ; b > 0 ; b -= sizeof(__u32), i++) {
if (!arch_get_random_int(&t))
break;
buf[i] ^= t;
}
count -= bytes; count -= bytes;
p += bytes; p += bytes;

View file

@ -1111,7 +1111,7 @@ static void *ocram_alloc_mem(size_t size, void **other)
static void ocram_free_mem(void *p, size_t size, void *other) static void ocram_free_mem(void *p, size_t size, void *other)
{ {
gen_pool_free((struct gen_pool *)other, (u32)p, size); gen_pool_free((struct gen_pool *)other, (unsigned long)p, size);
} }
static const struct edac_device_prv_data ocramecc_data = { static const struct edac_device_prv_data ocramecc_data = {

View file

@ -1134,7 +1134,9 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
{ {
struct drm_plane *plane = plane_state->plane; struct drm_plane *plane = plane_state->plane;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
/* Nothing to do for same crtc*/
if (plane_state->crtc == crtc)
return 0;
if (plane_state->crtc) { if (plane_state->crtc) {
crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc_state = drm_atomic_get_crtc_state(plane_state->state,
plane_state->crtc); plane_state->crtc);

View file

@ -255,7 +255,7 @@ extern int intelfb_remove(struct drm_device *dev,
extern bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, extern bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode); struct drm_display_mode *adjusted_mode);
extern int psb_intel_lvds_mode_valid(struct drm_connector *connector, extern enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode); struct drm_display_mode *mode);
extern int psb_intel_lvds_set_property(struct drm_connector *connector, extern int psb_intel_lvds_set_property(struct drm_connector *connector,
struct drm_property *property, struct drm_property *property,

View file

@ -343,7 +343,7 @@ static void psb_intel_lvds_restore(struct drm_connector *connector)
} }
} }
int psb_intel_lvds_mode_valid(struct drm_connector *connector, enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_psb_private *dev_priv = connector->dev->dev_private; struct drm_psb_private *dev_priv = connector->dev->dev_private;

View file

@ -850,7 +850,7 @@ static int radeon_lvds_get_modes(struct drm_connector *connector)
return ret; return ret;
} }
static int radeon_lvds_mode_valid(struct drm_connector *connector, static enum drm_mode_status radeon_lvds_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_encoder *encoder = radeon_best_single_encoder(connector); struct drm_encoder *encoder = radeon_best_single_encoder(connector);
@ -1010,7 +1010,7 @@ static int radeon_vga_get_modes(struct drm_connector *connector)
return ret; return ret;
} }
static int radeon_vga_mode_valid(struct drm_connector *connector, static enum drm_mode_status radeon_vga_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
@ -1154,7 +1154,7 @@ static int radeon_tv_get_modes(struct drm_connector *connector)
return 1; return 1;
} }
static int radeon_tv_mode_valid(struct drm_connector *connector, static enum drm_mode_status radeon_tv_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
if ((mode->hdisplay > 1024) || (mode->vdisplay > 768)) if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
@ -1496,7 +1496,7 @@ static void radeon_dvi_force(struct drm_connector *connector)
radeon_connector->use_digital = true; radeon_connector->use_digital = true;
} }
static int radeon_dvi_mode_valid(struct drm_connector *connector, static enum drm_mode_status radeon_dvi_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
@ -1798,7 +1798,7 @@ out:
return ret; return ret;
} }
static int radeon_dp_mode_valid(struct drm_connector *connector, static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;

View file

@ -2,7 +2,7 @@
* Plantronics USB HID Driver * Plantronics USB HID Driver
* *
* Copyright (c) 2014 JD Cole <jd.cole@plantronics.com> * Copyright (c) 2014 JD Cole <jd.cole@plantronics.com>
* Copyright (c) 2015 Terry Junge <terry.junge@plantronics.com> * Copyright (c) 2015-2018 Terry Junge <terry.junge@plantronics.com>
*/ */
/* /*
@ -48,6 +48,10 @@ static int plantronics_input_mapping(struct hid_device *hdev,
unsigned short mapped_key; unsigned short mapped_key;
unsigned long plt_type = (unsigned long)hid_get_drvdata(hdev); unsigned long plt_type = (unsigned long)hid_get_drvdata(hdev);
/* special case for PTT products */
if (field->application == HID_GD_JOYSTICK)
goto defaulted;
/* handle volume up/down mapping */ /* handle volume up/down mapping */
/* non-standard types or multi-HID interfaces - plt_type is PID */ /* non-standard types or multi-HID interfaces - plt_type is PID */
if (!(plt_type & HID_USAGE_PAGE)) { if (!(plt_type & HID_USAGE_PAGE)) {

View file

@ -1101,6 +1101,14 @@ static int i2c_hid_probe(struct i2c_client *client,
pm_runtime_enable(&client->dev); pm_runtime_enable(&client->dev);
device_enable_async_suspend(&client->dev); device_enable_async_suspend(&client->dev);
/* Make sure there is something at this address */
ret = i2c_smbus_read_byte(client);
if (ret < 0) {
dev_dbg(&client->dev, "nothing at this address: %d\n", ret);
ret = -ENXIO;
goto err_pm;
}
ret = i2c_hid_fetch_hid_descriptor(ihid); ret = i2c_hid_fetch_hid_descriptor(ihid);
if (ret < 0) if (ret < 0)
goto err_pm; goto err_pm;

View file

@ -1549,7 +1549,8 @@ static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req,
mad_reg_req->oui, 3)) { mad_reg_req->oui, 3)) {
method = &(*vendor_table)->vendor_class[ method = &(*vendor_table)->vendor_class[
vclass]->method_table[i]; vclass]->method_table[i];
BUG_ON(!*method); if (!*method)
goto error3;
goto check_in_use; goto check_in_use;
} }
} }
@ -1559,10 +1560,12 @@ static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req,
vclass]->oui[i])) { vclass]->oui[i])) {
method = &(*vendor_table)->vendor_class[ method = &(*vendor_table)->vendor_class[
vclass]->method_table[i]; vclass]->method_table[i];
BUG_ON(*method);
/* Allocate method table for this OUI */ /* Allocate method table for this OUI */
if ((ret = allocate_method_table(method))) if (!*method) {
goto error3; ret = allocate_method_table(method);
if (ret)
goto error3;
}
memcpy((*vendor_table)->vendor_class[vclass]->oui[i], memcpy((*vendor_table)->vendor_class[vclass]->oui[i],
mad_reg_req->oui, 3); mad_reg_req->oui, 3);
goto check_in_use; goto check_in_use;

View file

@ -218,7 +218,7 @@ static struct ucma_multicast* ucma_alloc_multicast(struct ucma_context *ctx)
return NULL; return NULL;
mutex_lock(&mut); mutex_lock(&mut);
mc->id = idr_alloc(&multicast_idr, mc, 0, 0, GFP_KERNEL); mc->id = idr_alloc(&multicast_idr, NULL, 0, 0, GFP_KERNEL);
mutex_unlock(&mut); mutex_unlock(&mut);
if (mc->id < 0) if (mc->id < 0)
goto error; goto error;
@ -1385,6 +1385,10 @@ static ssize_t ucma_process_join(struct ucma_file *file,
goto err3; goto err3;
} }
mutex_lock(&mut);
idr_replace(&multicast_idr, mc, mc->id);
mutex_unlock(&mut);
mutex_unlock(&file->mut); mutex_unlock(&file->mut);
ucma_put_ctx(ctx); ucma_put_ctx(ctx);
return 0; return 0;

View file

@ -3725,6 +3725,11 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file,
goto err_uobj; goto err_uobj;
} }
if (qp->qp_type != IB_QPT_UD && qp->qp_type != IB_QPT_RAW_PACKET) {
err = -EINVAL;
goto err_put;
}
flow_attr = kzalloc(sizeof(*flow_attr) + cmd.flow_attr.num_of_specs * flow_attr = kzalloc(sizeof(*flow_attr) + cmd.flow_attr.num_of_specs *
sizeof(union ib_flow_spec), GFP_KERNEL); sizeof(union ib_flow_spec), GFP_KERNEL);
if (!flow_attr) { if (!flow_attr) {

View file

@ -1251,6 +1251,8 @@ static const struct acpi_device_id elan_acpi_id[] = {
{ "ELAN0611", 0 }, { "ELAN0611", 0 },
{ "ELAN0612", 0 }, { "ELAN0612", 0 },
{ "ELAN0618", 0 }, { "ELAN0618", 0 },
{ "ELAN061D", 0 },
{ "ELAN0622", 0 },
{ "ELAN1000", 0 }, { "ELAN1000", 0 },
{ } { }
}; };

View file

@ -527,6 +527,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
}, },
}, },
{
/* Lenovo LaVie Z */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
},
},
{ } { }
}; };

View file

@ -6192,6 +6192,9 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
struct md_rdev *rdev; struct md_rdev *rdev;
if (!mddev->pers)
return -ENODEV;
rdev = find_rdev(mddev, dev); rdev = find_rdev(mddev, dev);
if (!rdev) if (!rdev)
return -ENXIO; return -ENXIO;

View file

@ -35,7 +35,7 @@ void smsendian_handle_tx_message(void *buffer)
switch (msg->x_msg_header.msg_type) { switch (msg->x_msg_header.msg_type) {
case MSG_SMS_DATA_DOWNLOAD_REQ: case MSG_SMS_DATA_DOWNLOAD_REQ:
{ {
msg->msg_data[0] = le32_to_cpu(msg->msg_data[0]); msg->msg_data[0] = le32_to_cpu((__force __le32)(msg->msg_data[0]));
break; break;
} }
@ -44,7 +44,7 @@ void smsendian_handle_tx_message(void *buffer)
sizeof(struct sms_msg_hdr))/4; sizeof(struct sms_msg_hdr))/4;
for (i = 0; i < msg_words; i++) for (i = 0; i < msg_words; i++)
msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); msg->msg_data[i] = le32_to_cpu((__force __le32)msg->msg_data[i]);
break; break;
} }
@ -64,7 +64,7 @@ void smsendian_handle_rx_message(void *buffer)
{ {
struct sms_version_res *ver = struct sms_version_res *ver =
(struct sms_version_res *) msg; (struct sms_version_res *) msg;
ver->chip_model = le16_to_cpu(ver->chip_model); ver->chip_model = le16_to_cpu((__force __le16)ver->chip_model);
break; break;
} }
@ -81,7 +81,7 @@ void smsendian_handle_rx_message(void *buffer)
sizeof(struct sms_msg_hdr))/4; sizeof(struct sms_msg_hdr))/4;
for (i = 0; i < msg_words; i++) for (i = 0; i < msg_words; i++)
msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); msg->msg_data[i] = le32_to_cpu((__force __le32)msg->msg_data[i]);
break; break;
} }
@ -95,9 +95,9 @@ void smsendian_handle_message_header(void *msg)
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
struct sms_msg_hdr *phdr = (struct sms_msg_hdr *)msg; struct sms_msg_hdr *phdr = (struct sms_msg_hdr *)msg;
phdr->msg_type = le16_to_cpu(phdr->msg_type); phdr->msg_type = le16_to_cpu((__force __le16)phdr->msg_type);
phdr->msg_length = le16_to_cpu(phdr->msg_length); phdr->msg_length = le16_to_cpu((__force __le16)phdr->msg_length);
phdr->msg_flags = le16_to_cpu(phdr->msg_flags); phdr->msg_flags = le16_to_cpu((__force __le16)phdr->msg_flags);
#endif /* __BIG_ENDIAN */ #endif /* __BIG_ENDIAN */
} }
EXPORT_SYMBOL_GPL(smsendian_handle_message_header); EXPORT_SYMBOL_GPL(smsendian_handle_message_header);

View file

@ -991,7 +991,7 @@ static int smiapp_read_nvm(struct smiapp_sensor *sensor,
if (rval) if (rval)
goto out; goto out;
for (i = 0; i < 1000; i++) { for (i = 1000; i > 0; i--) {
rval = smiapp_read( rval = smiapp_read(
sensor, sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s); SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
@ -1002,11 +1002,10 @@ static int smiapp_read_nvm(struct smiapp_sensor *sensor,
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY) if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
break; break;
if (--i == 0) { }
rval = -ETIMEDOUT; if (!i) {
goto out; rval = -ETIMEDOUT;
} goto out;
} }
for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) { for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {

View file

@ -60,7 +60,7 @@ static int media_device_close(struct file *filp)
static long media_device_get_info(struct media_device *dev, void *arg) static long media_device_get_info(struct media_device *dev, void *arg)
{ {
struct media_device_info *info = (struct media_device_info *)arg; struct media_device_info *info = arg;
memset(info, 0, sizeof(*info)); memset(info, 0, sizeof(*info));
@ -100,7 +100,7 @@ static struct media_entity *find_entity(struct media_device *mdev, u32 id)
static long media_device_enum_entities(struct media_device *mdev, void *arg) static long media_device_enum_entities(struct media_device *mdev, void *arg)
{ {
struct media_entity_desc *entd = (struct media_entity_desc *)arg; struct media_entity_desc *entd = arg;
struct media_entity *ent; struct media_entity *ent;
ent = find_entity(mdev, entd->id); ent = find_entity(mdev, entd->id);
@ -153,7 +153,7 @@ static void media_device_kpad_to_upad(const struct media_pad *kpad,
static long media_device_enum_links(struct media_device *mdev, void *arg) static long media_device_enum_links(struct media_device *mdev, void *arg)
{ {
struct media_links_enum *links = (struct media_links_enum *)arg; struct media_links_enum *links = arg;
struct media_entity *entity; struct media_entity *entity;
entity = find_entity(mdev, links->entity); entity = find_entity(mdev, links->entity);
@ -201,7 +201,7 @@ static long media_device_enum_links(struct media_device *mdev, void *arg)
static long media_device_setup_link(struct media_device *mdev, void *arg) static long media_device_setup_link(struct media_device *mdev, void *arg)
{ {
struct media_link_desc *linkd = (struct media_link_desc *)arg; struct media_link_desc *linkd = arg;
struct media_link *link = NULL; struct media_link *link = NULL;
struct media_entity *source; struct media_entity *source;
struct media_entity *sink; struct media_entity *sink;
@ -229,7 +229,7 @@ static long media_device_setup_link(struct media_device *mdev, void *arg)
static long media_device_get_topology(struct media_device *mdev, void *arg) static long media_device_get_topology(struct media_device *mdev, void *arg)
{ {
struct media_v2_topology *topo = (struct media_v2_topology *)arg; struct media_v2_topology *topo = arg;
struct media_entity *entity; struct media_entity *entity;
struct media_interface *intf; struct media_interface *intf;
struct media_pad *pad; struct media_pad *pad;

View file

@ -430,7 +430,8 @@ int saa7164_downloadfirmware(struct saa7164_dev *dev)
__func__, fw->size); __func__, fw->size);
if (fw->size != fwlength) { if (fw->size != fwlength) {
printk(KERN_ERR "xc5000: firmware incorrect size\n"); printk(KERN_ERR "saa7164: firmware incorrect size %zu != %u\n",
fw->size, fwlength);
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }

View file

@ -1228,7 +1228,8 @@ int tw686x_video_init(struct tw686x_dev *dev)
vc->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; vc->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
vc->vidq.min_buffers_needed = 2; vc->vidq.min_buffers_needed = 2;
vc->vidq.lock = &vc->vb_mutex; vc->vidq.lock = &vc->vb_mutex;
vc->vidq.gfp_flags = GFP_DMA32; vc->vidq.gfp_flags = dev->dma_mode != TW686X_DMA_MODE_MEMCPY ?
GFP_DMA32 : 0;
vc->vidq.dev = &dev->pci_dev->dev; vc->vidq.dev = &dev->pci_dev->dev;
err = vb2_queue_init(&vc->vidq); err = vb2_queue_init(&vc->vidq);

View file

@ -1941,6 +1941,7 @@ error_csiphy:
static void isp_detach_iommu(struct isp_device *isp) static void isp_detach_iommu(struct isp_device *isp)
{ {
arm_iommu_detach_device(isp->dev);
arm_iommu_release_mapping(isp->mapping); arm_iommu_release_mapping(isp->mapping);
isp->mapping = NULL; isp->mapping = NULL;
iommu_group_remove_device(isp->dev); iommu_group_remove_device(isp->dev);
@ -1974,8 +1975,7 @@ static int isp_attach_iommu(struct isp_device *isp)
mapping = arm_iommu_create_mapping(&platform_bus_type, SZ_1G, SZ_2G); mapping = arm_iommu_create_mapping(&platform_bus_type, SZ_1G, SZ_2G);
if (IS_ERR(mapping)) { if (IS_ERR(mapping)) {
dev_err(isp->dev, "failed to create ARM IOMMU mapping\n"); dev_err(isp->dev, "failed to create ARM IOMMU mapping\n");
ret = PTR_ERR(mapping); return PTR_ERR(mapping);
goto error;
} }
isp->mapping = mapping; isp->mapping = mapping;
@ -1990,7 +1990,8 @@ static int isp_attach_iommu(struct isp_device *isp)
return 0; return 0;
error: error:
isp_detach_iommu(isp); arm_iommu_release_mapping(isp->mapping);
isp->mapping = NULL;
return ret; return ret;
} }

View file

@ -1280,7 +1280,7 @@ static int jpu_open(struct file *file)
/* ...issue software reset */ /* ...issue software reset */
ret = jpu_reset(jpu); ret = jpu_reset(jpu);
if (ret) if (ret)
goto device_prepare_rollback; goto jpu_reset_rollback;
} }
jpu->ref_count++; jpu->ref_count++;
@ -1288,6 +1288,8 @@ static int jpu_open(struct file *file)
mutex_unlock(&jpu->mutex); mutex_unlock(&jpu->mutex);
return 0; return 0;
jpu_reset_rollback:
clk_disable_unprepare(jpu->clk);
device_prepare_rollback: device_prepare_rollback:
mutex_unlock(&jpu->mutex); mutex_unlock(&jpu->mutex);
v4l_prepare_rollback: v4l_prepare_rollback:

View file

@ -96,7 +96,7 @@ MODULE_PARM_DESC(max_rds_errors, "RDS maximum block errors: *1*");
*/ */
int si470x_get_register(struct si470x_device *radio, int regnr) int si470x_get_register(struct si470x_device *radio, int regnr)
{ {
u16 buf[READ_REG_NUM]; __be16 buf[READ_REG_NUM];
struct i2c_msg msgs[1] = { struct i2c_msg msgs[1] = {
{ {
.addr = radio->client->addr, .addr = radio->client->addr,
@ -121,7 +121,7 @@ int si470x_get_register(struct si470x_device *radio, int regnr)
int si470x_set_register(struct si470x_device *radio, int regnr) int si470x_set_register(struct si470x_device *radio, int regnr)
{ {
int i; int i;
u16 buf[WRITE_REG_NUM]; __be16 buf[WRITE_REG_NUM];
struct i2c_msg msgs[1] = { struct i2c_msg msgs[1] = {
{ {
.addr = radio->client->addr, .addr = radio->client->addr,
@ -151,7 +151,7 @@ int si470x_set_register(struct si470x_device *radio, int regnr)
static int si470x_get_all_registers(struct si470x_device *radio) static int si470x_get_all_registers(struct si470x_device *radio)
{ {
int i; int i;
u16 buf[READ_REG_NUM]; __be16 buf[READ_REG_NUM];
struct i2c_msg msgs[1] = { struct i2c_msg msgs[1] = {
{ {
.addr = radio->client->addr, .addr = radio->client->addr,

View file

@ -914,9 +914,12 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
dprintk(4, "done processing on buffer %d, state: %d\n", dprintk(4, "done processing on buffer %d, state: %d\n",
vb->index, state); vb->index, state);
/* sync buffers */ if (state != VB2_BUF_STATE_QUEUED &&
for (plane = 0; plane < vb->num_planes; ++plane) state != VB2_BUF_STATE_REQUEUEING) {
call_void_memop(vb, finish, vb->planes[plane].mem_priv); /* sync buffers */
for (plane = 0; plane < vb->num_planes; ++plane)
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
}
spin_lock_irqsave(&q->done_lock, flags); spin_lock_irqsave(&q->done_lock, flags);
if (state == VB2_BUF_STATE_QUEUED || if (state == VB2_BUF_STATE_QUEUED ||

View file

@ -20,14 +20,6 @@
#include "mc.h" #include "mc.h"
#define MC_INTSTATUS 0x000 #define MC_INTSTATUS 0x000
#define MC_INT_DECERR_MTS (1 << 16)
#define MC_INT_SECERR_SEC (1 << 13)
#define MC_INT_DECERR_VPR (1 << 12)
#define MC_INT_INVALID_APB_ASID_UPDATE (1 << 11)
#define MC_INT_INVALID_SMMU_PAGE (1 << 10)
#define MC_INT_ARBITRATION_EMEM (1 << 9)
#define MC_INT_SECURITY_VIOLATION (1 << 8)
#define MC_INT_DECERR_EMEM (1 << 6)
#define MC_INTMASK 0x004 #define MC_INTMASK 0x004
@ -248,12 +240,13 @@ static const char *const error_names[8] = {
static irqreturn_t tegra_mc_irq(int irq, void *data) static irqreturn_t tegra_mc_irq(int irq, void *data)
{ {
struct tegra_mc *mc = data; struct tegra_mc *mc = data;
unsigned long status, mask; unsigned long status;
unsigned int bit; unsigned int bit;
/* mask all interrupts to avoid flooding */ /* mask all interrupts to avoid flooding */
status = mc_readl(mc, MC_INTSTATUS); status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask;
mask = mc_readl(mc, MC_INTMASK); if (!status)
return IRQ_NONE;
for_each_set_bit(bit, &status, 32) { for_each_set_bit(bit, &status, 32) {
const char *error = status_names[bit] ?: "unknown"; const char *error = status_names[bit] ?: "unknown";
@ -346,7 +339,6 @@ static int tegra_mc_probe(struct platform_device *pdev)
const struct of_device_id *match; const struct of_device_id *match;
struct resource *res; struct resource *res;
struct tegra_mc *mc; struct tegra_mc *mc;
u32 value;
int err; int err;
match = of_match_node(tegra_mc_of_match, pdev->dev.of_node); match = of_match_node(tegra_mc_of_match, pdev->dev.of_node);
@ -414,11 +406,7 @@ static int tegra_mc_probe(struct platform_device *pdev)
WARN(!mc->soc->client_id_mask, "Missing client ID mask for this SoC\n"); WARN(!mc->soc->client_id_mask, "Missing client ID mask for this SoC\n");
value = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | mc_writel(mc, mc->soc->intmask, MC_INTMASK);
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM;
mc_writel(mc, value, MC_INTMASK);
return 0; return 0;
} }

View file

@ -14,6 +14,15 @@
#include <soc/tegra/mc.h> #include <soc/tegra/mc.h>
#define MC_INT_DECERR_MTS (1 << 16)
#define MC_INT_SECERR_SEC (1 << 13)
#define MC_INT_DECERR_VPR (1 << 12)
#define MC_INT_INVALID_APB_ASID_UPDATE (1 << 11)
#define MC_INT_INVALID_SMMU_PAGE (1 << 10)
#define MC_INT_ARBITRATION_EMEM (1 << 9)
#define MC_INT_SECURITY_VIOLATION (1 << 8)
#define MC_INT_DECERR_EMEM (1 << 6)
static inline u32 mc_readl(struct tegra_mc *mc, unsigned long offset) static inline u32 mc_readl(struct tegra_mc *mc, unsigned long offset)
{ {
return readl(mc->regs + offset); return readl(mc->regs + offset);

View file

@ -930,4 +930,6 @@ const struct tegra_mc_soc tegra114_mc_soc = {
.atom_size = 32, .atom_size = 32,
.client_id_mask = 0x7f, .client_id_mask = 0x7f,
.smmu = &tegra114_smmu_soc, .smmu = &tegra114_smmu_soc,
.intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
MC_INT_DECERR_EMEM,
}; };

View file

@ -1020,6 +1020,9 @@ const struct tegra_mc_soc tegra124_mc_soc = {
.smmu = &tegra124_smmu_soc, .smmu = &tegra124_smmu_soc,
.emem_regs = tegra124_mc_emem_regs, .emem_regs = tegra124_mc_emem_regs,
.num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs), .num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs),
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
}; };
#endif /* CONFIG_ARCH_TEGRA_124_SOC */ #endif /* CONFIG_ARCH_TEGRA_124_SOC */
@ -1042,5 +1045,8 @@ const struct tegra_mc_soc tegra132_mc_soc = {
.atom_size = 32, .atom_size = 32,
.client_id_mask = 0x7f, .client_id_mask = 0x7f,
.smmu = &tegra132_smmu_soc, .smmu = &tegra132_smmu_soc,
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
}; };
#endif /* CONFIG_ARCH_TEGRA_132_SOC */ #endif /* CONFIG_ARCH_TEGRA_132_SOC */

View file

@ -1077,4 +1077,7 @@ const struct tegra_mc_soc tegra210_mc_soc = {
.atom_size = 64, .atom_size = 64,
.client_id_mask = 0xff, .client_id_mask = 0xff,
.smmu = &tegra210_smmu_soc, .smmu = &tegra210_smmu_soc,
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
}; };

View file

@ -952,4 +952,6 @@ const struct tegra_mc_soc tegra30_mc_soc = {
.atom_size = 16, .atom_size = 16,
.client_id_mask = 0x7f, .client_id_mask = 0x7f,
.smmu = &tegra30_smmu_soc, .smmu = &tegra30_smmu_soc,
.intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
MC_INT_DECERR_EMEM,
}; };

View file

@ -86,7 +86,11 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
mutex_init(&ec_dev->lock); mutex_init(&ec_dev->lock);
cros_ec_query_all(ec_dev); err = cros_ec_query_all(ec_dev);
if (err) {
dev_err(dev, "Cannot identify the EC: error %d\n", err);
return err;
}
if (ec_dev->irq) { if (ec_dev->irq) {
err = request_threaded_irq(ec_dev->irq, NULL, ec_irq_thread, err = request_threaded_irq(ec_dev->irq, NULL, ec_irq_thread,

View file

@ -39,14 +39,18 @@ static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
struct gpio_descs *reset_gpios = pwrseq->reset_gpios; struct gpio_descs *reset_gpios = pwrseq->reset_gpios;
if (!IS_ERR(reset_gpios)) { if (!IS_ERR(reset_gpios)) {
int i; int i, *values;
int values[reset_gpios->ndescs]; int nvalues = reset_gpios->ndescs;
for (i = 0; i < reset_gpios->ndescs; i++) values = kmalloc_array(nvalues, sizeof(int), GFP_KERNEL);
if (!values)
return;
for (i = 0; i < nvalues; i++)
values[i] = value; values[i] = value;
gpiod_set_array_value_cansleep( gpiod_set_array_value_cansleep(nvalues, reset_gpios->desc, values);
reset_gpios->ndescs, reset_gpios->desc, values); kfree(values);
} }
} }

View file

@ -1164,6 +1164,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit)
if (host->state == STATE_WAITING_CMD11_DONE) if (host->state == STATE_WAITING_CMD11_DONE)
sdmmc_cmd_bits |= SDMMC_CMD_VOLT_SWITCH; sdmmc_cmd_bits |= SDMMC_CMD_VOLT_SWITCH;
slot->mmc->actual_clock = 0;
if (!clock) { if (!clock) {
mci_writel(host, CLKENA, 0); mci_writel(host, CLKENA, 0);
mci_send_cmd(slot, sdmmc_cmd_bits, 0); mci_send_cmd(slot, sdmmc_cmd_bits, 0);
@ -1209,6 +1211,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit)
/* keep the last clock value that was requested from core */ /* keep the last clock value that was requested from core */
slot->__clk_old = clock; slot->__clk_old = clock;
slot->mmc->actual_clock = div ? ((host->bus_hz / div) >> 1) :
host->bus_hz;
} }
host->current_speed = clock; host->current_speed = clock;

View file

@ -372,9 +372,16 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
case NAND_CMD_READID: case NAND_CMD_READID:
case NAND_CMD_PARAM: { case NAND_CMD_PARAM: {
/*
* For READID, read 8 bytes that are currently used.
* For PARAM, read all 3 copies of 256-bytes pages.
*/
int len = 8;
int timing = IFC_FIR_OP_RB; int timing = IFC_FIR_OP_RB;
if (command == NAND_CMD_PARAM) if (command == NAND_CMD_PARAM) {
timing = IFC_FIR_OP_RBCD; timing = IFC_FIR_OP_RBCD;
len = 256 * 3;
}
ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) | ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
(IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) | (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
@ -384,12 +391,8 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
&ifc->ifc_nand.nand_fcr0); &ifc->ifc_nand.nand_fcr0);
ifc_out32(column, &ifc->ifc_nand.row3); ifc_out32(column, &ifc->ifc_nand.row3);
/* ifc_out32(len, &ifc->ifc_nand.nand_fbcr);
* although currently it's 8 bytes for READID, we always read ifc_nand_ctrl->read_bytes = len;
* the maximum 256 bytes(for PARAM)
*/
ifc_out32(256, &ifc->ifc_nand.nand_fbcr);
ifc_nand_ctrl->read_bytes = 256;
set_addr(mtd, 0, 0, 0); set_addr(mtd, 0, 0, 0);
fsl_ifc_run_command(mtd); fsl_ifc_run_command(mtd);

View file

@ -474,7 +474,7 @@ qca8k_set_pad_ctrl(struct qca8k_priv *priv, int port, int mode)
static void static void
qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable)
{ {
u32 mask = QCA8K_PORT_STATUS_TXMAC; u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC;
/* Port 0 and 6 have no internal PHY */ /* Port 0 and 6 have no internal PHY */
if ((port > 0) && (port < 6)) if ((port > 0) && (port < 6))
@ -491,6 +491,7 @@ qca8k_setup(struct dsa_switch *ds)
{ {
struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
int ret, i, phy_mode = -1; int ret, i, phy_mode = -1;
u32 mask;
/* Make sure that port 0 is the cpu port */ /* Make sure that port 0 is the cpu port */
if (!dsa_is_cpu_port(ds, 0)) { if (!dsa_is_cpu_port(ds, 0)) {
@ -516,7 +517,10 @@ qca8k_setup(struct dsa_switch *ds)
if (ret < 0) if (ret < 0)
return ret; return ret;
/* Enable CPU Port */ /* Enable CPU Port, force it to maximum bandwidth and full-duplex */
mask = QCA8K_PORT_STATUS_SPEED_1000 | QCA8K_PORT_STATUS_TXFLOW |
QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_DUPLEX;
qca8k_write(priv, QCA8K_REG_PORT_STATUS(QCA8K_CPU_PORT), mask);
qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0, qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0,
QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN);
qca8k_port_set_status(priv, QCA8K_CPU_PORT, 1); qca8k_port_set_status(priv, QCA8K_CPU_PORT, 1);
@ -585,6 +589,47 @@ qca8k_setup(struct dsa_switch *ds)
return 0; return 0;
} }
static void
qca8k_adjust_link(struct dsa_switch *ds, int port, struct phy_device *phy)
{
struct qca8k_priv *priv = ds->priv;
u32 reg;
/* Force fixed-link setting for CPU port, skip others. */
if (!phy_is_pseudo_fixed_link(phy))
return;
/* Set port speed */
switch (phy->speed) {
case 10:
reg = QCA8K_PORT_STATUS_SPEED_10;
break;
case 100:
reg = QCA8K_PORT_STATUS_SPEED_100;
break;
case 1000:
reg = QCA8K_PORT_STATUS_SPEED_1000;
break;
default:
dev_dbg(priv->dev, "port%d link speed %dMbps not supported.\n",
port, phy->speed);
return;
}
/* Set duplex mode */
if (phy->duplex == DUPLEX_FULL)
reg |= QCA8K_PORT_STATUS_DUPLEX;
/* Force flow control */
if (dsa_is_cpu_port(ds, port))
reg |= QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_TXFLOW;
/* Force link down before changing MAC options */
qca8k_port_set_status(priv, port, 0);
qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg);
qca8k_port_set_status(priv, port, 1);
}
static int static int
qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum) qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum)
{ {
@ -914,6 +959,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds)
static struct dsa_switch_ops qca8k_switch_ops = { static struct dsa_switch_ops qca8k_switch_ops = {
.get_tag_protocol = qca8k_get_tag_protocol, .get_tag_protocol = qca8k_get_tag_protocol,
.setup = qca8k_setup, .setup = qca8k_setup,
.adjust_link = qca8k_adjust_link,
.get_strings = qca8k_get_strings, .get_strings = qca8k_get_strings,
.phy_read = qca8k_phy_read, .phy_read = qca8k_phy_read,
.phy_write = qca8k_phy_write, .phy_write = qca8k_phy_write,
@ -946,6 +992,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
return -ENOMEM; return -ENOMEM;
priv->bus = mdiodev->bus; priv->bus = mdiodev->bus;
priv->dev = &mdiodev->dev;
/* read the switches ID register */ /* read the switches ID register */
id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); id = qca8k_read(priv, QCA8K_REG_MASK_CTRL);
@ -1018,6 +1065,7 @@ static SIMPLE_DEV_PM_OPS(qca8k_pm_ops,
qca8k_suspend, qca8k_resume); qca8k_suspend, qca8k_resume);
static const struct of_device_id qca8k_of_match[] = { static const struct of_device_id qca8k_of_match[] = {
{ .compatible = "qca,qca8334" },
{ .compatible = "qca,qca8337" }, { .compatible = "qca,qca8337" },
{ /* sentinel */ }, { /* sentinel */ },
}; };

View file

@ -51,8 +51,10 @@
#define QCA8K_GOL_MAC_ADDR0 0x60 #define QCA8K_GOL_MAC_ADDR0 0x60
#define QCA8K_GOL_MAC_ADDR1 0x64 #define QCA8K_GOL_MAC_ADDR1 0x64
#define QCA8K_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) #define QCA8K_REG_PORT_STATUS(_i) (0x07c + (_i) * 4)
#define QCA8K_PORT_STATUS_SPEED GENMASK(2, 0) #define QCA8K_PORT_STATUS_SPEED GENMASK(1, 0)
#define QCA8K_PORT_STATUS_SPEED_S 0 #define QCA8K_PORT_STATUS_SPEED_10 0
#define QCA8K_PORT_STATUS_SPEED_100 0x1
#define QCA8K_PORT_STATUS_SPEED_1000 0x2
#define QCA8K_PORT_STATUS_TXMAC BIT(2) #define QCA8K_PORT_STATUS_TXMAC BIT(2)
#define QCA8K_PORT_STATUS_RXMAC BIT(3) #define QCA8K_PORT_STATUS_RXMAC BIT(3)
#define QCA8K_PORT_STATUS_TXFLOW BIT(4) #define QCA8K_PORT_STATUS_TXFLOW BIT(4)
@ -167,6 +169,7 @@ struct qca8k_priv {
struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS];
struct dsa_switch *ds; struct dsa_switch *ds;
struct mutex reg_mutex; struct mutex reg_mutex;
struct device *dev;
}; };
struct qca8k_mib_desc { struct qca8k_mib_desc {

View file

@ -5257,6 +5257,9 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
} }
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
if (!BNXT_SINGLE_PF(bp))
return 0;
diff = link_info->support_auto_speeds ^ link_info->advertising; diff = link_info->support_auto_speeds ^ link_info->advertising;
if ((link_info->support_auto_speeds | diff) != if ((link_info->support_auto_speeds | diff) !=
link_info->support_auto_speeds) { link_info->support_auto_speeds) {

View file

@ -3729,6 +3729,7 @@ static int ixgbevf_set_mac(struct net_device *netdev, void *p)
return -EPERM; return -EPERM;
ether_addr_copy(hw->mac.addr, addr->sa_data); ether_addr_copy(hw->mac.addr, addr->sa_data);
ether_addr_copy(hw->mac.perm_addr, addr->sa_data);
ether_addr_copy(netdev->dev_addr, addr->sa_data); ether_addr_copy(netdev->dev_addr, addr->sa_data);
return 0; return 0;

View file

@ -177,12 +177,18 @@ void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave)
} }
dev = bus_find_device(&platform_bus_type, NULL, node, match); dev = bus_find_device(&platform_bus_type, NULL, node, match);
of_node_put(node); if (!dev) {
dev_err(dev, "unable to find platform device for %pOF\n", node);
goto out;
}
priv = dev_get_drvdata(dev); priv = dev_get_drvdata(dev);
priv->cpsw_phy_sel(priv, phy_mode, slave); priv->cpsw_phy_sel(priv, phy_mode, slave);
put_device(dev); put_device(dev);
out:
of_node_put(node);
} }
EXPORT_SYMBOL_GPL(cpsw_phy_sel); EXPORT_SYMBOL_GPL(cpsw_phy_sel);

View file

@ -68,12 +68,14 @@ enum CountryCode {
CTRY_AUSTRALIA = 36, CTRY_AUSTRALIA = 36,
CTRY_AUSTRIA = 40, CTRY_AUSTRIA = 40,
CTRY_AZERBAIJAN = 31, CTRY_AZERBAIJAN = 31,
CTRY_BAHAMAS = 44,
CTRY_BAHRAIN = 48, CTRY_BAHRAIN = 48,
CTRY_BANGLADESH = 50, CTRY_BANGLADESH = 50,
CTRY_BARBADOS = 52, CTRY_BARBADOS = 52,
CTRY_BELARUS = 112, CTRY_BELARUS = 112,
CTRY_BELGIUM = 56, CTRY_BELGIUM = 56,
CTRY_BELIZE = 84, CTRY_BELIZE = 84,
CTRY_BERMUDA = 60,
CTRY_BOLIVIA = 68, CTRY_BOLIVIA = 68,
CTRY_BOSNIA_HERZ = 70, CTRY_BOSNIA_HERZ = 70,
CTRY_BRAZIL = 76, CTRY_BRAZIL = 76,
@ -159,6 +161,7 @@ enum CountryCode {
CTRY_ROMANIA = 642, CTRY_ROMANIA = 642,
CTRY_RUSSIA = 643, CTRY_RUSSIA = 643,
CTRY_SAUDI_ARABIA = 682, CTRY_SAUDI_ARABIA = 682,
CTRY_SERBIA = 688,
CTRY_SERBIA_MONTENEGRO = 891, CTRY_SERBIA_MONTENEGRO = 891,
CTRY_SINGAPORE = 702, CTRY_SINGAPORE = 702,
CTRY_SLOVAKIA = 703, CTRY_SLOVAKIA = 703,
@ -170,11 +173,13 @@ enum CountryCode {
CTRY_SWITZERLAND = 756, CTRY_SWITZERLAND = 756,
CTRY_SYRIA = 760, CTRY_SYRIA = 760,
CTRY_TAIWAN = 158, CTRY_TAIWAN = 158,
CTRY_TANZANIA = 834,
CTRY_THAILAND = 764, CTRY_THAILAND = 764,
CTRY_TRINIDAD_Y_TOBAGO = 780, CTRY_TRINIDAD_Y_TOBAGO = 780,
CTRY_TUNISIA = 788, CTRY_TUNISIA = 788,
CTRY_TURKEY = 792, CTRY_TURKEY = 792,
CTRY_UAE = 784, CTRY_UAE = 784,
CTRY_UGANDA = 800,
CTRY_UKRAINE = 804, CTRY_UKRAINE = 804,
CTRY_UNITED_KINGDOM = 826, CTRY_UNITED_KINGDOM = 826,
CTRY_UNITED_STATES = 840, CTRY_UNITED_STATES = 840,

View file

@ -35,6 +35,7 @@ enum EnumRd {
FRANCE_RES = 0x31, FRANCE_RES = 0x31,
FCC3_FCCA = 0x3A, FCC3_FCCA = 0x3A,
FCC3_WORLD = 0x3B, FCC3_WORLD = 0x3B,
FCC3_ETSIC = 0x3F,
ETSI1_WORLD = 0x37, ETSI1_WORLD = 0x37,
ETSI3_ETSIA = 0x32, ETSI3_ETSIA = 0x32,
@ -44,6 +45,7 @@ enum EnumRd {
ETSI4_ETSIC = 0x38, ETSI4_ETSIC = 0x38,
ETSI5_WORLD = 0x39, ETSI5_WORLD = 0x39,
ETSI6_WORLD = 0x34, ETSI6_WORLD = 0x34,
ETSI8_WORLD = 0x3D,
ETSI_RESERVED = 0x33, ETSI_RESERVED = 0x33,
MKK1_MKKA = 0x40, MKK1_MKKA = 0x40,
@ -59,6 +61,7 @@ enum EnumRd {
MKK1_MKKA1 = 0x4A, MKK1_MKKA1 = 0x4A,
MKK1_MKKA2 = 0x4B, MKK1_MKKA2 = 0x4B,
MKK1_MKKC = 0x4C, MKK1_MKKC = 0x4C,
APL2_FCCA = 0x4D,
APL3_FCCA = 0x50, APL3_FCCA = 0x50,
APL1_WORLD = 0x52, APL1_WORLD = 0x52,
@ -67,6 +70,7 @@ enum EnumRd {
APL1_ETSIC = 0x55, APL1_ETSIC = 0x55,
APL2_ETSIC = 0x56, APL2_ETSIC = 0x56,
APL5_WORLD = 0x58, APL5_WORLD = 0x58,
APL13_WORLD = 0x5A,
APL6_WORLD = 0x5B, APL6_WORLD = 0x5B,
APL7_FCCA = 0x5C, APL7_FCCA = 0x5C,
APL8_WORLD = 0x5D, APL8_WORLD = 0x5D,
@ -168,6 +172,7 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = {
{FCC2_ETSIC, CTL_FCC, CTL_ETSI}, {FCC2_ETSIC, CTL_FCC, CTL_ETSI},
{FCC3_FCCA, CTL_FCC, CTL_FCC}, {FCC3_FCCA, CTL_FCC, CTL_FCC},
{FCC3_WORLD, CTL_FCC, CTL_ETSI}, {FCC3_WORLD, CTL_FCC, CTL_ETSI},
{FCC3_ETSIC, CTL_FCC, CTL_ETSI},
{FCC4_FCCA, CTL_FCC, CTL_FCC}, {FCC4_FCCA, CTL_FCC, CTL_FCC},
{FCC5_FCCA, CTL_FCC, CTL_FCC}, {FCC5_FCCA, CTL_FCC, CTL_FCC},
{FCC6_FCCA, CTL_FCC, CTL_FCC}, {FCC6_FCCA, CTL_FCC, CTL_FCC},
@ -179,6 +184,7 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = {
{ETSI4_WORLD, CTL_ETSI, CTL_ETSI}, {ETSI4_WORLD, CTL_ETSI, CTL_ETSI},
{ETSI5_WORLD, CTL_ETSI, CTL_ETSI}, {ETSI5_WORLD, CTL_ETSI, CTL_ETSI},
{ETSI6_WORLD, CTL_ETSI, CTL_ETSI}, {ETSI6_WORLD, CTL_ETSI, CTL_ETSI},
{ETSI8_WORLD, CTL_ETSI, CTL_ETSI},
/* XXX: For ETSI3_ETSIA, Was NO_CTL meant for the 2 GHz band ? */ /* XXX: For ETSI3_ETSIA, Was NO_CTL meant for the 2 GHz band ? */
{ETSI3_ETSIA, CTL_ETSI, CTL_ETSI}, {ETSI3_ETSIA, CTL_ETSI, CTL_ETSI},
@ -188,9 +194,11 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = {
{FCC1_FCCA, CTL_FCC, CTL_FCC}, {FCC1_FCCA, CTL_FCC, CTL_FCC},
{APL1_WORLD, CTL_FCC, CTL_ETSI}, {APL1_WORLD, CTL_FCC, CTL_ETSI},
{APL2_WORLD, CTL_FCC, CTL_ETSI}, {APL2_WORLD, CTL_FCC, CTL_ETSI},
{APL2_FCCA, CTL_FCC, CTL_FCC},
{APL3_WORLD, CTL_FCC, CTL_ETSI}, {APL3_WORLD, CTL_FCC, CTL_ETSI},
{APL4_WORLD, CTL_FCC, CTL_ETSI}, {APL4_WORLD, CTL_FCC, CTL_ETSI},
{APL5_WORLD, CTL_FCC, CTL_ETSI}, {APL5_WORLD, CTL_FCC, CTL_ETSI},
{APL13_WORLD, CTL_ETSI, CTL_ETSI},
{APL6_WORLD, CTL_ETSI, CTL_ETSI}, {APL6_WORLD, CTL_ETSI, CTL_ETSI},
{APL8_WORLD, CTL_ETSI, CTL_ETSI}, {APL8_WORLD, CTL_ETSI, CTL_ETSI},
{APL9_WORLD, CTL_ETSI, CTL_ETSI}, {APL9_WORLD, CTL_ETSI, CTL_ETSI},
@ -298,6 +306,7 @@ static struct country_code_to_enum_rd allCountries[] = {
{CTRY_AUSTRALIA2, FCC6_WORLD, "AU"}, {CTRY_AUSTRALIA2, FCC6_WORLD, "AU"},
{CTRY_AUSTRIA, ETSI1_WORLD, "AT"}, {CTRY_AUSTRIA, ETSI1_WORLD, "AT"},
{CTRY_AZERBAIJAN, ETSI4_WORLD, "AZ"}, {CTRY_AZERBAIJAN, ETSI4_WORLD, "AZ"},
{CTRY_BAHAMAS, FCC3_WORLD, "BS"},
{CTRY_BAHRAIN, APL6_WORLD, "BH"}, {CTRY_BAHRAIN, APL6_WORLD, "BH"},
{CTRY_BANGLADESH, NULL1_WORLD, "BD"}, {CTRY_BANGLADESH, NULL1_WORLD, "BD"},
{CTRY_BARBADOS, FCC2_WORLD, "BB"}, {CTRY_BARBADOS, FCC2_WORLD, "BB"},
@ -305,6 +314,7 @@ static struct country_code_to_enum_rd allCountries[] = {
{CTRY_BELGIUM, ETSI1_WORLD, "BE"}, {CTRY_BELGIUM, ETSI1_WORLD, "BE"},
{CTRY_BELGIUM2, ETSI4_WORLD, "BL"}, {CTRY_BELGIUM2, ETSI4_WORLD, "BL"},
{CTRY_BELIZE, APL1_ETSIC, "BZ"}, {CTRY_BELIZE, APL1_ETSIC, "BZ"},
{CTRY_BERMUDA, FCC3_FCCA, "BM"},
{CTRY_BOLIVIA, APL1_ETSIC, "BO"}, {CTRY_BOLIVIA, APL1_ETSIC, "BO"},
{CTRY_BOSNIA_HERZ, ETSI1_WORLD, "BA"}, {CTRY_BOSNIA_HERZ, ETSI1_WORLD, "BA"},
{CTRY_BRAZIL, FCC3_WORLD, "BR"}, {CTRY_BRAZIL, FCC3_WORLD, "BR"},
@ -444,6 +454,7 @@ static struct country_code_to_enum_rd allCountries[] = {
{CTRY_ROMANIA, NULL1_WORLD, "RO"}, {CTRY_ROMANIA, NULL1_WORLD, "RO"},
{CTRY_RUSSIA, NULL1_WORLD, "RU"}, {CTRY_RUSSIA, NULL1_WORLD, "RU"},
{CTRY_SAUDI_ARABIA, NULL1_WORLD, "SA"}, {CTRY_SAUDI_ARABIA, NULL1_WORLD, "SA"},
{CTRY_SERBIA, ETSI1_WORLD, "RS"},
{CTRY_SERBIA_MONTENEGRO, ETSI1_WORLD, "CS"}, {CTRY_SERBIA_MONTENEGRO, ETSI1_WORLD, "CS"},
{CTRY_SINGAPORE, APL6_WORLD, "SG"}, {CTRY_SINGAPORE, APL6_WORLD, "SG"},
{CTRY_SLOVAKIA, ETSI1_WORLD, "SK"}, {CTRY_SLOVAKIA, ETSI1_WORLD, "SK"},
@ -455,10 +466,12 @@ static struct country_code_to_enum_rd allCountries[] = {
{CTRY_SWITZERLAND, ETSI1_WORLD, "CH"}, {CTRY_SWITZERLAND, ETSI1_WORLD, "CH"},
{CTRY_SYRIA, NULL1_WORLD, "SY"}, {CTRY_SYRIA, NULL1_WORLD, "SY"},
{CTRY_TAIWAN, APL3_FCCA, "TW"}, {CTRY_TAIWAN, APL3_FCCA, "TW"},
{CTRY_TANZANIA, APL1_WORLD, "TZ"},
{CTRY_THAILAND, FCC3_WORLD, "TH"}, {CTRY_THAILAND, FCC3_WORLD, "TH"},
{CTRY_TRINIDAD_Y_TOBAGO, FCC3_WORLD, "TT"}, {CTRY_TRINIDAD_Y_TOBAGO, FCC3_WORLD, "TT"},
{CTRY_TUNISIA, ETSI3_WORLD, "TN"}, {CTRY_TUNISIA, ETSI3_WORLD, "TN"},
{CTRY_TURKEY, ETSI3_WORLD, "TR"}, {CTRY_TURKEY, ETSI3_WORLD, "TR"},
{CTRY_UGANDA, FCC3_WORLD, "UG"},
{CTRY_UKRAINE, NULL1_WORLD, "UA"}, {CTRY_UKRAINE, NULL1_WORLD, "UA"},
{CTRY_UAE, NULL1_WORLD, "AE"}, {CTRY_UAE, NULL1_WORLD, "AE"},
{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"}, {CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},

View file

@ -1099,6 +1099,7 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),

View file

@ -898,6 +898,8 @@ int iwl_pcie_rx_init(struct iwl_trans *trans)
WQ_HIGHPRI | WQ_UNBOUND, 1); WQ_HIGHPRI | WQ_UNBOUND, 1);
INIT_WORK(&rba->rx_alloc, iwl_pcie_rx_allocator_work); INIT_WORK(&rba->rx_alloc, iwl_pcie_rx_allocator_work);
cancel_work_sync(&rba->rx_alloc);
spin_lock(&rba->lock); spin_lock(&rba->lock);
atomic_set(&rba->req_pending, 0); atomic_set(&rba->req_pending, 0);
atomic_set(&rba->req_ready, 0); atomic_set(&rba->req_ready, 0);

View file

@ -624,6 +624,9 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
MWIFIEX_FUNC_SHUTDOWN); MWIFIEX_FUNC_SHUTDOWN);
} }
if (adapter->workqueue)
flush_workqueue(adapter->workqueue);
mwifiex_usb_free(card); mwifiex_usb_free(card);
mwifiex_dbg(adapter, FATAL, mwifiex_dbg(adapter, FATAL,

View file

@ -723,12 +723,14 @@ void mwifiex_hist_data_set(struct mwifiex_private *priv, u8 rx_rate, s8 snr,
s8 nflr) s8 nflr)
{ {
struct mwifiex_histogram_data *phist_data = priv->hist_data; struct mwifiex_histogram_data *phist_data = priv->hist_data;
s8 nf = -nflr;
s8 rssi = snr - nflr;
atomic_inc(&phist_data->num_samples); atomic_inc(&phist_data->num_samples);
atomic_inc(&phist_data->rx_rate[rx_rate]); atomic_inc(&phist_data->rx_rate[rx_rate]);
atomic_inc(&phist_data->snr[snr]); atomic_inc(&phist_data->snr[snr + 128]);
atomic_inc(&phist_data->noise_flr[128 + nflr]); atomic_inc(&phist_data->noise_flr[nf + 128]);
atomic_inc(&phist_data->sig_str[nflr - snr]); atomic_inc(&phist_data->sig_str[rssi + 128]);
} }
/* function to reset histogram data during init/reset */ /* function to reset histogram data during init/reset */

View file

@ -155,7 +155,6 @@ static void rsi_reset_card(struct sdio_func *pfunction)
int err; int err;
struct mmc_card *card = pfunction->card; struct mmc_card *card = pfunction->card;
struct mmc_host *host = card->host; struct mmc_host *host = card->host;
s32 bit = (fls(host->ocr_avail) - 1);
u8 cmd52_resp; u8 cmd52_resp;
u32 clock, resp, i; u32 clock, resp, i;
u16 rca; u16 rca;
@ -175,7 +174,6 @@ static void rsi_reset_card(struct sdio_func *pfunction)
msleep(20); msleep(20);
/* Initialize the SDIO card */ /* Initialize the SDIO card */
host->ios.vdd = bit;
host->ios.chip_select = MMC_CS_DONTCARE; host->ios.chip_select = MMC_CS_DONTCARE;
host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
host->ios.power_mode = MMC_POWER_UP; host->ios.power_mode = MMC_POWER_UP;

View file

@ -404,6 +404,11 @@ static int wl1271_suspend(struct device *dev)
mmc_pm_flag_t sdio_flags; mmc_pm_flag_t sdio_flags;
int ret = 0; int ret = 0;
if (!wl) {
dev_err(dev, "no wilink module was probed\n");
goto out;
}
dev_dbg(dev, "wl1271 suspend. wow_enabled: %d\n", dev_dbg(dev, "wl1271 suspend. wow_enabled: %d\n",
wl->wow_enabled); wl->wow_enabled);

View file

@ -238,7 +238,7 @@ static void rx_refill_timeout(unsigned long data)
static int netfront_tx_slot_available(struct netfront_queue *queue) static int netfront_tx_slot_available(struct netfront_queue *queue)
{ {
return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) < return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) <
(NET_TX_RING_SIZE - MAX_SKB_FRAGS - 2); (NET_TX_RING_SIZE - XEN_NETIF_NR_SLOTS_MIN - 1);
} }
static void xennet_maybe_wake_tx(struct netfront_queue *queue) static void xennet_maybe_wake_tx(struct netfront_queue *queue)
@ -789,7 +789,7 @@ static int xennet_get_responses(struct netfront_queue *queue,
RING_IDX cons = queue->rx.rsp_cons; RING_IDX cons = queue->rx.rsp_cons;
struct sk_buff *skb = xennet_get_rx_skb(queue, cons); struct sk_buff *skb = xennet_get_rx_skb(queue, cons);
grant_ref_t ref = xennet_get_rx_ref(queue, cons); grant_ref_t ref = xennet_get_rx_ref(queue, cons);
int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD); int max = XEN_NETIF_NR_SLOTS_MIN + (rx->status <= RX_COPY_THRESHOLD);
int slots = 1; int slots = 1;
int err = 0; int err = 0;
unsigned long ret; unsigned long ret;

View file

@ -1031,6 +1031,8 @@ static inline void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
/* setup the first byte with lsb bits from nvmem */ /* setup the first byte with lsb bits from nvmem */
rc = nvmem_reg_read(nvmem, cell->offset, &v, 1); rc = nvmem_reg_read(nvmem, cell->offset, &v, 1);
if (rc)
goto err;
*b++ |= GENMASK(bit_offset - 1, 0) & v; *b++ |= GENMASK(bit_offset - 1, 0) & v;
/* setup rest of the byte if any */ /* setup rest of the byte if any */
@ -1049,11 +1051,16 @@ static inline void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
/* setup the last byte with msb bits from nvmem */ /* setup the last byte with msb bits from nvmem */
rc = nvmem_reg_read(nvmem, rc = nvmem_reg_read(nvmem,
cell->offset + cell->bytes - 1, &v, 1); cell->offset + cell->bytes - 1, &v, 1);
if (rc)
goto err;
*p |= GENMASK(7, (nbits + bit_offset) % BITS_PER_BYTE) & v; *p |= GENMASK(7, (nbits + bit_offset) % BITS_PER_BYTE) & v;
} }
return buf; return buf;
err:
kfree(buf);
return ERR_PTR(rc);
} }
/** /**

View file

@ -180,13 +180,16 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr,
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
if (!val) { device_lock(dev);
if (pci_is_enabled(pdev)) if (dev->driver)
pci_disable_device(pdev); result = -EBUSY;
else else if (val)
result = -EIO;
} else
result = pci_enable_device(pdev); result = pci_enable_device(pdev);
else if (pci_is_enabled(pdev))
pci_disable_device(pdev);
else
result = -EIO;
device_unlock(dev);
return result < 0 ? result : count; return result < 0 ? result : count;
} }

View file

@ -573,8 +573,10 @@ static int atmel_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
for_each_child_of_node(np_config, np) { for_each_child_of_node(np_config, np) {
ret = atmel_pctl_dt_subnode_to_map(pctldev, np, map, ret = atmel_pctl_dt_subnode_to_map(pctldev, np, map,
&reserved_maps, num_maps); &reserved_maps, num_maps);
if (ret < 0) if (ret < 0) {
of_node_put(np);
break; break;
}
} }
} }

View file

@ -153,6 +153,7 @@ static struct regulator_ops pfuze100_sw_regulator_ops = {
static struct regulator_ops pfuze100_swb_regulator_ops = { static struct regulator_ops pfuze100_swb_regulator_ops = {
.enable = regulator_enable_regmap, .enable = regulator_enable_regmap,
.disable = regulator_disable_regmap, .disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.list_voltage = regulator_list_voltage_table, .list_voltage = regulator_list_voltage_table,
.map_voltage = regulator_map_voltage_ascend, .map_voltage = regulator_map_voltage_ascend,
.set_voltage_sel = regulator_set_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap,

View file

@ -359,6 +359,11 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
{ {
int err; int err;
if (!rtc->ops)
return -ENODEV;
else if (!rtc->ops->set_alarm)
return -EINVAL;
err = rtc_valid_tm(&alarm->time); err = rtc_valid_tm(&alarm->time);
if (err != 0) if (err != 0)
return err; return err;

View file

@ -889,6 +889,11 @@ static int twa_chrdev_open(struct inode *inode, struct file *file)
unsigned int minor_number; unsigned int minor_number;
int retval = TW_IOCTL_ERROR_OS_ENODEV; int retval = TW_IOCTL_ERROR_OS_ENODEV;
if (!capable(CAP_SYS_ADMIN)) {
retval = -EACCES;
goto out;
}
minor_number = iminor(inode); minor_number = iminor(inode);
if (minor_number >= twa_device_extension_count) if (minor_number >= twa_device_extension_count)
goto out; goto out;

View file

@ -1034,6 +1034,9 @@ static int tw_chrdev_open(struct inode *inode, struct file *file)
dprintk(KERN_WARNING "3w-xxxx: tw_ioctl_open()\n"); dprintk(KERN_WARNING "3w-xxxx: tw_ioctl_open()\n");
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
minor_number = iminor(inode); minor_number = iminor(inode);
if (minor_number >= tw_device_extension_count) if (minor_number >= tw_device_extension_count)
return -ENODEV; return -ENODEV;

View file

@ -4197,6 +4197,9 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
int irq, i, j; int irq, i, j;
int error = -ENODEV; int error = -ENODEV;
if (hba_count >= MAX_CONTROLLERS)
goto out;
if (pci_enable_device(pdev)) if (pci_enable_device(pdev))
goto out; goto out;
pci_set_master(pdev); pci_set_master(pdev);

View file

@ -2031,6 +2031,9 @@ megasas_build_syspd_fusion(struct megasas_instance *instance,
pRAID_Context->timeoutValue = cpu_to_le16(os_timeout_value); pRAID_Context->timeoutValue = cpu_to_le16(os_timeout_value);
pRAID_Context->VirtualDiskTgtId = cpu_to_le16(device_id); pRAID_Context->VirtualDiskTgtId = cpu_to_le16(device_id);
} else { } else {
if (os_timeout_value)
os_timeout_value++;
/* system pd Fast Path */ /* system pd Fast Path */
io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
timeout_limit = (scmd->device->type == TYPE_DISK) ? timeout_limit = (scmd->device->type == TYPE_DISK) ?

View file

@ -58,7 +58,10 @@ static const struct scsi_dh_blist scsi_dh_blist[] = {
{"IBM", "3526", "rdac", }, {"IBM", "3526", "rdac", },
{"IBM", "3542", "rdac", }, {"IBM", "3542", "rdac", },
{"IBM", "3552", "rdac", }, {"IBM", "3552", "rdac", },
{"SGI", "TP9", "rdac", }, {"SGI", "TP9300", "rdac", },
{"SGI", "TP9400", "rdac", },
{"SGI", "TP9500", "rdac", },
{"SGI", "TP9700", "rdac", },
{"SGI", "IS", "rdac", }, {"SGI", "IS", "rdac", },
{"STK", "OPENstorage", "rdac", }, {"STK", "OPENstorage", "rdac", },
{"STK", "FLEXLINE 380", "rdac", }, {"STK", "FLEXLINE 380", "rdac", },

View file

@ -4041,6 +4041,7 @@ static void ufshcd_exception_event_handler(struct work_struct *work)
hba = container_of(work, struct ufs_hba, eeh_work); hba = container_of(work, struct ufs_hba, eeh_work);
pm_runtime_get_sync(hba->dev); pm_runtime_get_sync(hba->dev);
scsi_block_requests(hba->host);
err = ufshcd_get_ee_status(hba, &status); err = ufshcd_get_ee_status(hba, &status);
if (err) { if (err) {
dev_err(hba->dev, "%s: failed to get exception status %d\n", dev_err(hba->dev, "%s: failed to get exception status %d\n",
@ -4054,6 +4055,7 @@ static void ufshcd_exception_event_handler(struct work_struct *work)
ufshcd_bkops_exception_event_handler(hba); ufshcd_bkops_exception_event_handler(hba);
out: out:
scsi_unblock_requests(hba->host);
pm_runtime_put_sync(hba->dev); pm_runtime_put_sync(hba->dev);
return; return;
} }

View file

@ -1299,11 +1299,6 @@ kiblnd_connect_peer(struct kib_peer *peer)
goto failed2; goto failed2;
} }
LASSERT(cmid->device);
CDEBUG(D_NET, "%s: connection bound to %s:%pI4h:%s\n",
libcfs_nid2str(peer->ibp_nid), dev->ibd_ifname,
&dev->ibd_ifip, cmid->device->name);
return; return;
failed2: failed2:
@ -3005,8 +3000,19 @@ kiblnd_cm_callback(struct rdma_cm_id *cmid, struct rdma_cm_event *event)
} else { } else {
rc = rdma_resolve_route( rc = rdma_resolve_route(
cmid, *kiblnd_tunables.kib_timeout * 1000); cmid, *kiblnd_tunables.kib_timeout * 1000);
if (!rc) if (!rc) {
struct kib_net *net = peer->ibp_ni->ni_data;
struct kib_dev *dev = net->ibn_dev;
CDEBUG(D_NET, "%s: connection bound to "\
"%s:%pI4h:%s\n",
libcfs_nid2str(peer->ibp_nid),
dev->ibd_ifname,
&dev->ibd_ifip, cmid->device->name);
return 0; return 0;
}
/* Can't initiate route resolution */ /* Can't initiate route resolution */
CERROR("Can't resolve route for %s: %d\n", CERROR("Can't resolve route for %s: %d\n",
libcfs_nid2str(peer->ibp_nid), rc); libcfs_nid2str(peer->ibp_nid), rc);

View file

@ -1489,8 +1489,10 @@ struct ldlm_lock *ldlm_lock_create(struct ldlm_namespace *ns,
return ERR_CAST(res); return ERR_CAST(res);
lock = ldlm_lock_new(res); lock = ldlm_lock_new(res);
if (!lock) if (!lock) {
ldlm_resource_putref(res);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
lock->l_req_mode = mode; lock->l_req_mode = mode;
lock->l_ast_data = data; lock->l_ast_data = data;
@ -1533,6 +1535,8 @@ out:
return ERR_PTR(rc); return ERR_PTR(rc);
} }
/** /**
* Enqueue (request) a lock. * Enqueue (request) a lock.
* On the client this is called from ldlm_cli_enqueue_fini * On the client this is called from ldlm_cli_enqueue_fini

View file

@ -103,7 +103,11 @@ ll_xattr_set_common(const struct xattr_handler *handler,
__u64 valid; __u64 valid;
int rc; int rc;
if (flags == XATTR_REPLACE) { /* When setxattr() is called with a size of 0 the value is
* unconditionally replaced by "". When removexattr() is
* called we get a NULL value and XATTR_REPLACE for flags.
*/
if (!value && flags == XATTR_REPLACE) {
ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_REMOVEXATTR, 1); ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_REMOVEXATTR, 1);
valid = OBD_MD_FLXATTRRM; valid = OBD_MD_FLXATTRRM;
} else { } else {

View file

@ -598,6 +598,7 @@ static int exynos5433_tmu_initialize(struct platform_device *pdev)
threshold_code = temp_to_code(data, temp); threshold_code = temp_to_code(data, temp);
rising_threshold = readl(data->base + rising_reg_offset); rising_threshold = readl(data->base + rising_reg_offset);
rising_threshold &= ~(0xff << j * 8);
rising_threshold |= (threshold_code << j * 8); rising_threshold |= (threshold_code << j * 8);
writel(rising_threshold, data->base + rising_reg_offset); writel(rising_threshold, data->base + rising_reg_offset);

View file

@ -332,7 +332,6 @@ static void udbg_init_opal_common(void)
udbg_putc = udbg_opal_putc; udbg_putc = udbg_opal_putc;
udbg_getc = udbg_opal_getc; udbg_getc = udbg_opal_getc;
udbg_getc_poll = udbg_opal_getc_poll; udbg_getc_poll = udbg_opal_getc_poll;
tb_ticks_per_usec = 0x200; /* Make udelay not suck */
} }
void __init hvc_opal_init_early(void) void __init hvc_opal_init_early(void)

View file

@ -106,16 +106,19 @@ static void pty_unthrottle(struct tty_struct *tty)
static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
{ {
struct tty_struct *to = tty->link; struct tty_struct *to = tty->link;
unsigned long flags;
if (tty->stopped) if (tty->stopped)
return 0; return 0;
if (c > 0) { if (c > 0) {
spin_lock_irqsave(&to->port->lock, flags);
/* Stuff the data into the input queue of the other end */ /* Stuff the data into the input queue of the other end */
c = tty_insert_flip_string(to->port, buf, c); c = tty_insert_flip_string(to->port, buf, c);
/* And shovel */ /* And shovel */
if (c) if (c)
tty_flip_buffer_push(to->port); tty_flip_buffer_push(to->port);
spin_unlock_irqrestore(&to->port->lock, flags);
} }
return c; return c;
} }

View file

@ -3363,6 +3363,10 @@ static int wait_for_connected(struct usb_device *udev,
while (delay_ms < 2000) { while (delay_ms < 2000) {
if (status || *portstatus & USB_PORT_STAT_CONNECTION) if (status || *portstatus & USB_PORT_STAT_CONNECTION)
break; break;
if (!port_is_power_on(hub, *portstatus)) {
status = -ENODEV;
break;
}
msleep(20); msleep(20);
delay_ms += 20; delay_ms += 20;
status = hub_port_status(hub, *port1, portstatus, portchange); status = hub_port_status(hub, *port1, portstatus, portchange);

View file

@ -2544,34 +2544,29 @@ static void dwc2_hc_init_xfer(struct dwc2_hsotg *hsotg,
#define DWC2_USB_DMA_ALIGN 4 #define DWC2_USB_DMA_ALIGN 4
struct dma_aligned_buffer {
void *kmalloc_ptr;
void *old_xfer_buffer;
u8 data[0];
};
static void dwc2_free_dma_aligned_buffer(struct urb *urb) static void dwc2_free_dma_aligned_buffer(struct urb *urb)
{ {
struct dma_aligned_buffer *temp; void *stored_xfer_buffer;
if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER)) if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER))
return; return;
temp = container_of(urb->transfer_buffer, /* Restore urb->transfer_buffer from the end of the allocated area */
struct dma_aligned_buffer, data); memcpy(&stored_xfer_buffer, urb->transfer_buffer +
urb->transfer_buffer_length, sizeof(urb->transfer_buffer));
if (usb_urb_dir_in(urb)) if (usb_urb_dir_in(urb))
memcpy(temp->old_xfer_buffer, temp->data, memcpy(stored_xfer_buffer, urb->transfer_buffer,
urb->transfer_buffer_length); urb->transfer_buffer_length);
urb->transfer_buffer = temp->old_xfer_buffer; kfree(urb->transfer_buffer);
kfree(temp->kmalloc_ptr); urb->transfer_buffer = stored_xfer_buffer;
urb->transfer_flags &= ~URB_ALIGNED_TEMP_BUFFER; urb->transfer_flags &= ~URB_ALIGNED_TEMP_BUFFER;
} }
static int dwc2_alloc_dma_aligned_buffer(struct urb *urb, gfp_t mem_flags) static int dwc2_alloc_dma_aligned_buffer(struct urb *urb, gfp_t mem_flags)
{ {
struct dma_aligned_buffer *temp, *kmalloc_ptr; void *kmalloc_ptr;
size_t kmalloc_size; size_t kmalloc_size;
if (urb->num_sgs || urb->sg || if (urb->num_sgs || urb->sg ||
@ -2579,22 +2574,29 @@ static int dwc2_alloc_dma_aligned_buffer(struct urb *urb, gfp_t mem_flags)
!((uintptr_t)urb->transfer_buffer & (DWC2_USB_DMA_ALIGN - 1))) !((uintptr_t)urb->transfer_buffer & (DWC2_USB_DMA_ALIGN - 1)))
return 0; return 0;
/* Allocate a buffer with enough padding for alignment */ /*
* Allocate a buffer with enough padding for original transfer_buffer
* pointer. This allocation is guaranteed to be aligned properly for
* DMA
*/
kmalloc_size = urb->transfer_buffer_length + kmalloc_size = urb->transfer_buffer_length +
sizeof(struct dma_aligned_buffer) + DWC2_USB_DMA_ALIGN - 1; sizeof(urb->transfer_buffer);
kmalloc_ptr = kmalloc(kmalloc_size, mem_flags); kmalloc_ptr = kmalloc(kmalloc_size, mem_flags);
if (!kmalloc_ptr) if (!kmalloc_ptr)
return -ENOMEM; return -ENOMEM;
/* Position our struct dma_aligned_buffer such that data is aligned */ /*
temp = PTR_ALIGN(kmalloc_ptr + 1, DWC2_USB_DMA_ALIGN) - 1; * Position value of original urb->transfer_buffer pointer to the end
temp->kmalloc_ptr = kmalloc_ptr; * of allocation for later referencing
temp->old_xfer_buffer = urb->transfer_buffer; */
memcpy(kmalloc_ptr + urb->transfer_buffer_length,
&urb->transfer_buffer, sizeof(urb->transfer_buffer));
if (usb_urb_dir_out(urb)) if (usb_urb_dir_out(urb))
memcpy(temp->data, urb->transfer_buffer, memcpy(kmalloc_ptr, urb->transfer_buffer,
urb->transfer_buffer_length); urb->transfer_buffer_length);
urb->transfer_buffer = temp->data; urb->transfer_buffer = kmalloc_ptr;
urb->transfer_flags |= URB_ALIGNED_TEMP_BUFFER; urb->transfer_flags |= URB_ALIGNED_TEMP_BUFFER;

View file

@ -696,18 +696,23 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
group = vfio_iommu_group_get(dev); group = vfio_iommu_group_get(dev);
if (!group) { if (!group) {
pr_err("VFIO: No IOMMU group for device %s\n", vdev->name); pr_err("VFIO: No IOMMU group for device %s\n", vdev->name);
return -EINVAL; ret = -EINVAL;
goto put_reset;
} }
ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev); ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev);
if (ret) { if (ret)
vfio_iommu_group_put(group, dev); goto put_iommu;
return ret;
}
mutex_init(&vdev->igate); mutex_init(&vdev->igate);
return 0; return 0;
put_iommu:
vfio_iommu_group_put(group, dev);
put_reset:
vfio_platform_put_reset(vdev);
return ret;
} }
EXPORT_SYMBOL_GPL(vfio_platform_probe_common); EXPORT_SYMBOL_GPL(vfio_platform_probe_common);

View file

@ -2236,6 +2236,21 @@ void assert_qgroups_uptodate(struct btrfs_trans_handle *trans)
BUG(); BUG();
} }
/*
* Check if the leaf is the last leaf. Which means all node pointers
* are at their last position.
*/
static bool is_last_leaf(struct btrfs_path *path)
{
int i;
for (i = 1; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) {
if (path->slots[i] != btrfs_header_nritems(path->nodes[i]) - 1)
return false;
}
return true;
}
/* /*
* returns < 0 on error, 0 when more leafs are to be scanned. * returns < 0 on error, 0 when more leafs are to be scanned.
* returns 1 when done. * returns 1 when done.
@ -2249,6 +2264,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
struct ulist *roots = NULL; struct ulist *roots = NULL;
struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem); struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem);
u64 num_bytes; u64 num_bytes;
bool done;
int slot; int slot;
int ret; int ret;
@ -2277,6 +2293,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
mutex_unlock(&fs_info->qgroup_rescan_lock); mutex_unlock(&fs_info->qgroup_rescan_lock);
return ret; return ret;
} }
done = is_last_leaf(path);
btrfs_item_key_to_cpu(path->nodes[0], &found, btrfs_item_key_to_cpu(path->nodes[0], &found,
btrfs_header_nritems(path->nodes[0]) - 1); btrfs_header_nritems(path->nodes[0]) - 1);
@ -2323,6 +2340,8 @@ out:
} }
btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
if (done && !ret)
ret = 1;
return ret; return ret;
} }

View file

@ -2979,8 +2979,11 @@ out_wake_log_root:
mutex_unlock(&log_root_tree->log_mutex); mutex_unlock(&log_root_tree->log_mutex);
/* /*
* The barrier before waitqueue_active is implied by mutex_unlock * The barrier before waitqueue_active is needed so all the updates
* above are seen by the woken threads. It might not be necessary, but
* proving that seems to be hard.
*/ */
smp_mb();
if (waitqueue_active(&log_root_tree->log_commit_wait[index2])) if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
wake_up(&log_root_tree->log_commit_wait[index2]); wake_up(&log_root_tree->log_commit_wait[index2]);
out: out:
@ -2991,8 +2994,11 @@ out:
mutex_unlock(&root->log_mutex); mutex_unlock(&root->log_mutex);
/* /*
* The barrier before waitqueue_active is implied by mutex_unlock * The barrier before waitqueue_active is needed so all the updates
* above are seen by the woken threads. It might not be necessary, but
* proving that seems to be hard.
*/ */
smp_mb();
if (waitqueue_active(&root->log_commit_wait[index1])) if (waitqueue_active(&root->log_commit_wait[index1]))
wake_up(&root->log_commit_wait[index1]); wake_up(&root->log_commit_wait[index1]);
return ret; return ret;

View file

@ -378,6 +378,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
return -EFSCORRUPTED; return -EFSCORRUPTED;
ext4_lock_group(sb, block_group); ext4_lock_group(sb, block_group);
if (buffer_verified(bh))
goto verified;
if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
desc, bh))) { desc, bh))) {
ext4_unlock_group(sb, block_group); ext4_unlock_group(sb, block_group);
@ -400,6 +402,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
set_buffer_verified(bh); set_buffer_verified(bh);
verified:
ext4_unlock_group(sb, block_group); ext4_unlock_group(sb, block_group);
return 0; return 0;
} }

Some files were not shown because too many files have changed in this diff Show more