This is the 5.10.153 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmNj1woACgkQONu9yGCS
 aT5mQw/+IG2zLoH79zTzQDZF+DYZ+J5WRGVLfx+5mM2j1fGgXWmxADdlzMZTSSAc
 XP1hDxHBYQSnQi/kRPuJOKJbV9TysdOV2SSvwzblq6UE4B7tw3q4YE9calfYPaiF
 AhvMMAEaXGVHAVSgliRqcgnlq5Yj6nrxjr73O3kuyCWvfv6XToCd6LKFJyHdVniw
 kJ7gbkgiOVH/caKyzJxW3uSZ11t4uZ10nu4q+rd3JOLDecPLcPLM28pDTL/znqS0
 ECiPypmIrd10UL+V4aiHsBR9wHEJdZULb/SLLwy85EuUeEhmx4i1ylu5JosY77cQ
 2CkxHIt8nCKxJ3BziMUbutY40VBs/MP74t1kB5Th/3JK8gsw2+JdUJ7b9RXzb60k
 vbFjc3lJugmNsAXqOnibAu/PdoWYi4IC7A2D/gJcWzsEKgVWQptZizJpn5Se3F3+
 OCWdqgOiTZiegK55W3w2xbNqSLkuvAfbx18UEWltHhzS1UT7cqGVxx7qcsFhWGfV
 rG1yzzF1Skx2BcnBf+6yTczOUcOyLrMyyek3tRD00EWn8o1ik9lKARNKd+b7IUW4
 57NUvaGsBp/BRrJobrdx5r7AkTg5AfEWQAM69+vbDUxjKRM02FQlfEycGxcTT2GD
 nUUzJMgobd0GW4HU/2rpmMk67QCnJ9guJxRCpcp7ocGkX0x2WYs=
 =n9Bi
 -----END PGP SIGNATURE-----

Merge 5.10.153 into android12-5.10-lts

Changes in 5.10.153
	can: j1939: transport: j1939_session_skb_drop_old(): spin_unlock_irqrestore() before kfree_skb()
	can: kvaser_usb: Fix possible completions during init_completion
	ALSA: Use del_timer_sync() before freeing timer
	ALSA: au88x0: use explicitly signed char
	ALSA: rme9652: use explicitly signed char
	USB: add RESET_RESUME quirk for NVIDIA Jetson devices in RCM
	usb: dwc3: gadget: Stop processing more requests on IMI
	usb: dwc3: gadget: Don't set IMI for no_interrupt
	usb: bdc: change state when port disconnected
	usb: xhci: add XHCI_SPURIOUS_SUCCESS to ASM1042 despite being a V0.96 controller
	mtd: rawnand: marvell: Use correct logic for nand-keep-config
	xhci: Add quirk to reset host back to default state at shutdown
	xhci: Remove device endpoints from bandwidth list when freeing the device
	tools: iio: iio_utils: fix digit calculation
	iio: light: tsl2583: Fix module unloading
	iio: temperature: ltc2983: allocate iio channels once
	fbdev: smscufx: Fix several use-after-free bugs
	fs/binfmt_elf: Fix memory leak in load_elf_binary()
	exec: Copy oldsighand->action under spin-lock
	mac802154: Fix LQI recording
	scsi: qla2xxx: Use transport-defined speed mask for supported_speeds
	drm/msm/dsi: fix memory corruption with too many bridges
	drm/msm/hdmi: fix memory corruption with too many bridges
	drm/msm/dp: fix IRQ lifetime
	mmc: sdhci_am654: 'select', not 'depends' REGMAP_MMIO
	mmc: core: Fix kernel panic when remove non-standard SDIO card
	counter: microchip-tcb-capture: Handle Signal1 read and Synapse
	kernfs: fix use-after-free in __kernfs_remove
	perf auxtrace: Fix address filter symbol name match for modules
	s390/futex: add missing EX_TABLE entry to __futex_atomic_op()
	s390/pci: add missing EX_TABLE entries to __pcistg_mio_inuser()/__pcilg_mio_inuser()
	Xen/gntdev: don't ignore kernel unmapping error
	xen/gntdev: Prevent leaking grants
	mm/memory: add non-anonymous page check in the copy_present_page()
	mm,hugetlb: take hugetlb_lock before decrementing h->resv_huge_pages
	net: ieee802154: fix error return code in dgram_bind()
	media: v4l2: Fix v4l2_i2c_subdev_set_name function documentation
	drm/msm: Fix return type of mdp4_lvds_connector_mode_valid
	ASoC: qcom: lpass-cpu: mark HDMI TX registers as volatile
	arc: iounmap() arg is volatile
	ASoC: qcom: lpass-cpu: Mark HDMI TX parity register as volatile
	ALSA: ac97: fix possible memory leak in snd_ac97_dev_register()
	perf/x86/intel/lbr: Use setup_clear_cpu_cap() instead of clear_cpu_cap()
	tipc: fix a null-ptr-deref in tipc_topsrv_accept
	net: netsec: fix error handling in netsec_register_mdio()
	net: hinic: fix incorrect assignment issue in hinic_set_interrupt_cfg()
	net: hinic: fix memory leak when reading function table
	net: hinic: fix the issue of CMDQ memory leaks
	net: hinic: fix the issue of double release MBOX callback of VF
	x86/unwind/orc: Fix unreliable stack dump with gcov
	amd-xgbe: fix the SFP compliance codes check for DAC cables
	amd-xgbe: add the bit rate quirk for Molex cables
	atlantic: fix deadlock at aq_nic_stop
	kcm: annotate data-races around kcm->rx_psock
	kcm: annotate data-races around kcm->rx_wait
	net: fix UAF issue in nfqnl_nf_hook_drop() when ops_init() failed
	net: lantiq_etop: don't free skb when returning NETDEV_TX_BUSY
	tcp: minor optimization in tcp_add_backlog()
	tcp: fix a signed-integer-overflow bug in tcp_add_backlog()
	tcp: fix indefinite deferral of RTO with SACK reneging
	can: mscan: mpc5xxx: mpc5xxx_can_probe(): add missing put_clock() in error path
	can: mcp251x: mcp251x_can_probe(): add missing unregister_candev() in error path
	PM: hibernate: Allow hybrid sleep to work with s2idle
	media: vivid: s_fbuf: add more sanity checks
	media: vivid: dev->bitmap_cap wasn't freed in all cases
	media: v4l2-dv-timings: add sanity checks for blanking values
	media: videodev2.h: V4L2_DV_BT_BLANKING_HEIGHT should check 'interlaced'
	media: vivid: set num_in/outputs to 0 if not supported
	ipv6: ensure sane device mtu in tunnels
	i40e: Fix ethtool rx-flow-hash setting for X722
	i40e: Fix VF hang when reset is triggered on another VF
	i40e: Fix flow-type by setting GL_HASH_INSET registers
	net: ksz884x: fix missing pci_disable_device() on error in pcidev_init()
	PM: domains: Fix handling of unavailable/disabled idle states
	net: fec: limit register access on i.MX6UL
	ALSA: aoa: i2sbus: fix possible memory leak in i2sbus_add_dev()
	ALSA: aoa: Fix I2S device accounting
	openvswitch: switch from WARN to pr_warn
	net: ehea: fix possible memory leak in ehea_register_port()
	nh: fix scope used to find saddr when adding non gw nh
	net/mlx5e: Do not increment ESN when updating IPsec ESN state
	net/mlx5: Fix possible use-after-free in async command interface
	net/mlx5: Fix crash during sync firmware reset
	net: enetc: survive memory pressure without crashing
	arm64: Add AMPERE1 to the Spectre-BHB affected list
	scsi: sd: Revert "scsi: sd: Remove a local variable"
	arm64/mm: Fix __enable_mmu() for new TGRAN range values
	arm64/kexec: Test page size support with new TGRAN range values
	can: rcar_canfd: rcar_canfd_handle_global_receive(): fix IRQ storm on global FIFO receive
	serial: core: move RS485 configuration tasks from drivers into core
	serial: Deassert Transmit Enable on probe in driver-specific way
	Linux 5.10.153

Change-Id: I1cbca2c5cbaaab34ccd6e055f13c35d900d4ce25
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2022-11-21 15:47:06 +00:00
commit 673a7341bd
103 changed files with 807 additions and 339 deletions

View file

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 10 PATCHLEVEL = 10
SUBLEVEL = 152 SUBLEVEL = 153
EXTRAVERSION = EXTRAVERSION =
NAME = Dare mighty things NAME = Dare mighty things

View file

@ -32,7 +32,7 @@ static inline void ioport_unmap(void __iomem *addr)
{ {
} }
extern void iounmap(const void __iomem *addr); extern void iounmap(const volatile void __iomem *addr);
/* /*
* io{read,write}{16,32}be() macros * io{read,write}{16,32}be() macros

View file

@ -93,7 +93,7 @@ void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
EXPORT_SYMBOL(ioremap_prot); EXPORT_SYMBOL(ioremap_prot);
void iounmap(const void __iomem *addr) void iounmap(const volatile void __iomem *addr)
{ {
/* weird double cast to handle phys_addr_t > 32 bits */ /* weird double cast to handle phys_addr_t > 32 bits */
if (arc_uncached_addr_space((phys_addr_t)(u32)addr)) if (arc_uncached_addr_space((phys_addr_t)(u32)addr))

View file

@ -662,7 +662,8 @@ static inline bool system_supports_4kb_granule(void)
val = cpuid_feature_extract_unsigned_field(mmfr0, val = cpuid_feature_extract_unsigned_field(mmfr0,
ID_AA64MMFR0_TGRAN4_SHIFT); ID_AA64MMFR0_TGRAN4_SHIFT);
return val == ID_AA64MMFR0_TGRAN4_SUPPORTED; return (val >= ID_AA64MMFR0_TGRAN4_SUPPORTED_MIN) &&
(val <= ID_AA64MMFR0_TGRAN4_SUPPORTED_MAX);
} }
static inline bool system_supports_64kb_granule(void) static inline bool system_supports_64kb_granule(void)
@ -674,7 +675,8 @@ static inline bool system_supports_64kb_granule(void)
val = cpuid_feature_extract_unsigned_field(mmfr0, val = cpuid_feature_extract_unsigned_field(mmfr0,
ID_AA64MMFR0_TGRAN64_SHIFT); ID_AA64MMFR0_TGRAN64_SHIFT);
return val == ID_AA64MMFR0_TGRAN64_SUPPORTED; return (val >= ID_AA64MMFR0_TGRAN64_SUPPORTED_MIN) &&
(val <= ID_AA64MMFR0_TGRAN64_SUPPORTED_MAX);
} }
static inline bool system_supports_16kb_granule(void) static inline bool system_supports_16kb_granule(void)
@ -686,7 +688,8 @@ static inline bool system_supports_16kb_granule(void)
val = cpuid_feature_extract_unsigned_field(mmfr0, val = cpuid_feature_extract_unsigned_field(mmfr0,
ID_AA64MMFR0_TGRAN16_SHIFT); ID_AA64MMFR0_TGRAN16_SHIFT);
return val == ID_AA64MMFR0_TGRAN16_SUPPORTED; return (val >= ID_AA64MMFR0_TGRAN16_SUPPORTED_MIN) &&
(val <= ID_AA64MMFR0_TGRAN16_SUPPORTED_MAX);
} }
static inline bool system_supports_mixed_endian_el0(void) static inline bool system_supports_mixed_endian_el0(void)

View file

@ -60,6 +60,7 @@
#define ARM_CPU_IMP_FUJITSU 0x46 #define ARM_CPU_IMP_FUJITSU 0x46
#define ARM_CPU_IMP_HISI 0x48 #define ARM_CPU_IMP_HISI 0x48
#define ARM_CPU_IMP_APPLE 0x61 #define ARM_CPU_IMP_APPLE 0x61
#define ARM_CPU_IMP_AMPERE 0xC0
#define ARM_CPU_PART_AEM_V8 0xD0F #define ARM_CPU_PART_AEM_V8 0xD0F
#define ARM_CPU_PART_FOUNDATION 0xD00 #define ARM_CPU_PART_FOUNDATION 0xD00
@ -112,6 +113,8 @@
#define APPLE_CPU_PART_M1_ICESTORM 0x022 #define APPLE_CPU_PART_M1_ICESTORM 0x022
#define APPLE_CPU_PART_M1_FIRESTORM 0x023 #define APPLE_CPU_PART_M1_FIRESTORM 0x023
#define AMPERE_CPU_PART_AMPERE1 0xAC3
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53) #define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57) #define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72) #define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
@ -151,6 +154,7 @@
#define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110) #define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110)
#define MIDR_APPLE_M1_ICESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM) #define MIDR_APPLE_M1_ICESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM)
#define MIDR_APPLE_M1_FIRESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM) #define MIDR_APPLE_M1_FIRESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM)
#define MIDR_AMPERE1 MIDR_CPU_MODEL(ARM_CPU_IMP_AMPERE, AMPERE_CPU_PART_AMPERE1)
/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */ /* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
#define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX #define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX

View file

@ -852,15 +852,24 @@
#define ID_AA64MMFR0_ASID_SHIFT 4 #define ID_AA64MMFR0_ASID_SHIFT 4
#define ID_AA64MMFR0_PARANGE_SHIFT 0 #define ID_AA64MMFR0_PARANGE_SHIFT 0
#define ID_AA64MMFR0_TGRAN4_NI 0xf #define ID_AA64MMFR0_TGRAN4_NI 0xf
#define ID_AA64MMFR0_TGRAN4_SUPPORTED 0x0 #define ID_AA64MMFR0_TGRAN4_SUPPORTED_MIN 0x0
#define ID_AA64MMFR0_TGRAN64_NI 0xf #define ID_AA64MMFR0_TGRAN4_SUPPORTED_MAX 0x7
#define ID_AA64MMFR0_TGRAN64_SUPPORTED 0x0 #define ID_AA64MMFR0_TGRAN64_NI 0xf
#define ID_AA64MMFR0_TGRAN16_NI 0x0 #define ID_AA64MMFR0_TGRAN64_SUPPORTED_MIN 0x0
#define ID_AA64MMFR0_TGRAN16_SUPPORTED 0x1 #define ID_AA64MMFR0_TGRAN64_SUPPORTED_MAX 0x7
#define ID_AA64MMFR0_TGRAN16_NI 0x0
#define ID_AA64MMFR0_TGRAN16_SUPPORTED_MIN 0x1
#define ID_AA64MMFR0_TGRAN16_SUPPORTED_MAX 0xf
#define ID_AA64MMFR0_PARANGE_48 0x5 #define ID_AA64MMFR0_PARANGE_48 0x5
#define ID_AA64MMFR0_PARANGE_52 0x6 #define ID_AA64MMFR0_PARANGE_52 0x6
#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_DEFAULT 0x0
#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_NONE 0x1
#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_MIN 0x2
#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_MAX 0x7
#ifdef CONFIG_ARM64_PA_BITS_52 #ifdef CONFIG_ARM64_PA_BITS_52
#define ID_AA64MMFR0_PARANGE_MAX ID_AA64MMFR0_PARANGE_52 #define ID_AA64MMFR0_PARANGE_MAX ID_AA64MMFR0_PARANGE_52
#else #else
@ -1026,14 +1035,17 @@
#define ID_PFR1_PROGMOD_SHIFT 0 #define ID_PFR1_PROGMOD_SHIFT 0
#if defined(CONFIG_ARM64_4K_PAGES) #if defined(CONFIG_ARM64_4K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT #define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN4_SUPPORTED #define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN4_SUPPORTED_MIN
#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX ID_AA64MMFR0_TGRAN4_SUPPORTED_MAX
#elif defined(CONFIG_ARM64_16K_PAGES) #elif defined(CONFIG_ARM64_16K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT #define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN16_SUPPORTED #define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN16_SUPPORTED_MIN
#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX ID_AA64MMFR0_TGRAN16_SUPPORTED_MAX
#elif defined(CONFIG_ARM64_64K_PAGES) #elif defined(CONFIG_ARM64_64K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT #define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN64_SUPPORTED #define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN64_SUPPORTED_MIN
#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX ID_AA64MMFR0_TGRAN64_SUPPORTED_MAX
#endif #endif
#define MVFR2_FPMISC_SHIFT 4 #define MVFR2_FPMISC_SHIFT 4

View file

@ -671,8 +671,10 @@ SYM_FUNC_END(__secondary_too_slow)
SYM_FUNC_START(__enable_mmu) SYM_FUNC_START(__enable_mmu)
mrs x2, ID_AA64MMFR0_EL1 mrs x2, ID_AA64MMFR0_EL1
ubfx x2, x2, #ID_AA64MMFR0_TGRAN_SHIFT, 4 ubfx x2, x2, #ID_AA64MMFR0_TGRAN_SHIFT, 4
cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED_MIN
b.ne __no_granule_support b.lt __no_granule_support
cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED_MAX
b.gt __no_granule_support
update_early_cpu_boot_status 0, x2, x3 update_early_cpu_boot_status 0, x2, x3
adrp x2, idmap_pg_dir adrp x2, idmap_pg_dir
phys_to_ttbr x1, x1 phys_to_ttbr x1, x1

View file

@ -865,6 +865,10 @@ u8 spectre_bhb_loop_affected(int scope)
MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1),
{}, {},
}; };
static const struct midr_range spectre_bhb_k11_list[] = {
MIDR_ALL_VERSIONS(MIDR_AMPERE1),
{},
};
static const struct midr_range spectre_bhb_k8_list[] = { static const struct midr_range spectre_bhb_k8_list[] = {
MIDR_ALL_VERSIONS(MIDR_CORTEX_A72), MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
MIDR_ALL_VERSIONS(MIDR_CORTEX_A57), MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
@ -875,6 +879,8 @@ u8 spectre_bhb_loop_affected(int scope)
k = 32; k = 32;
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k24_list)) else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k24_list))
k = 24; k = 24;
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k11_list))
k = 11;
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k8_list)) else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k8_list))
k = 8; k = 8;

View file

@ -344,16 +344,18 @@ int kvm_set_ipa_limit(void)
} }
switch (cpuid_feature_extract_unsigned_field(mmfr0, tgran_2)) { switch (cpuid_feature_extract_unsigned_field(mmfr0, tgran_2)) {
default: case ID_AA64MMFR0_TGRAN_2_SUPPORTED_NONE:
case 1:
kvm_err("PAGE_SIZE not supported at Stage-2, giving up\n"); kvm_err("PAGE_SIZE not supported at Stage-2, giving up\n");
return -EINVAL; return -EINVAL;
case 0: case ID_AA64MMFR0_TGRAN_2_SUPPORTED_DEFAULT:
kvm_debug("PAGE_SIZE supported at Stage-2 (default)\n"); kvm_debug("PAGE_SIZE supported at Stage-2 (default)\n");
break; break;
case 2: case ID_AA64MMFR0_TGRAN_2_SUPPORTED_MIN ... ID_AA64MMFR0_TGRAN_2_SUPPORTED_MAX:
kvm_debug("PAGE_SIZE supported at Stage-2 (advertised)\n"); kvm_debug("PAGE_SIZE supported at Stage-2 (advertised)\n");
break; break;
default:
kvm_err("Unsupported value for TGRAN_2, giving up\n");
return -EINVAL;
} }
kvm_ipa_limit = id_aa64mmfr0_parange_to_phys_shift(parange); kvm_ipa_limit = id_aa64mmfr0_parange_to_phys_shift(parange);

View file

@ -16,7 +16,8 @@
"3: jl 1b\n" \ "3: jl 1b\n" \
" lhi %0,0\n" \ " lhi %0,0\n" \
"4: sacf 768\n" \ "4: sacf 768\n" \
EX_TABLE(0b,4b) EX_TABLE(2b,4b) EX_TABLE(3b,4b) \ EX_TABLE(0b,4b) EX_TABLE(1b,4b) \
EX_TABLE(2b,4b) EX_TABLE(3b,4b) \
: "=d" (ret), "=&d" (oldval), "=&d" (newval), \ : "=d" (ret), "=&d" (oldval), "=&d" (newval), \
"=m" (*uaddr) \ "=m" (*uaddr) \
: "0" (-EFAULT), "d" (oparg), "a" (uaddr), \ : "0" (-EFAULT), "d" (oparg), "a" (uaddr), \

View file

@ -64,7 +64,7 @@ static inline int __pcistg_mio_inuser(
asm volatile ( asm volatile (
" sacf 256\n" " sacf 256\n"
"0: llgc %[tmp],0(%[src])\n" "0: llgc %[tmp],0(%[src])\n"
" sllg %[val],%[val],8\n" "4: sllg %[val],%[val],8\n"
" aghi %[src],1\n" " aghi %[src],1\n"
" ogr %[val],%[tmp]\n" " ogr %[val],%[tmp]\n"
" brctg %[cnt],0b\n" " brctg %[cnt],0b\n"
@ -72,7 +72,7 @@ static inline int __pcistg_mio_inuser(
"2: ipm %[cc]\n" "2: ipm %[cc]\n"
" srl %[cc],28\n" " srl %[cc],28\n"
"3: sacf 768\n" "3: sacf 768\n"
EX_TABLE(0b, 3b) EX_TABLE(1b, 3b) EX_TABLE(2b, 3b) EX_TABLE(0b, 3b) EX_TABLE(4b, 3b) EX_TABLE(1b, 3b) EX_TABLE(2b, 3b)
: :
[src] "+a" (src), [cnt] "+d" (cnt), [src] "+a" (src), [cnt] "+d" (cnt),
[val] "+d" (val), [tmp] "=d" (tmp), [val] "+d" (val), [tmp] "=d" (tmp),
@ -222,10 +222,10 @@ static inline int __pcilg_mio_inuser(
"2: ahi %[shift],-8\n" "2: ahi %[shift],-8\n"
" srlg %[tmp],%[val],0(%[shift])\n" " srlg %[tmp],%[val],0(%[shift])\n"
"3: stc %[tmp],0(%[dst])\n" "3: stc %[tmp],0(%[dst])\n"
" aghi %[dst],1\n" "5: aghi %[dst],1\n"
" brctg %[cnt],2b\n" " brctg %[cnt],2b\n"
"4: sacf 768\n" "4: sacf 768\n"
EX_TABLE(0b, 4b) EX_TABLE(1b, 4b) EX_TABLE(3b, 4b) EX_TABLE(0b, 4b) EX_TABLE(1b, 4b) EX_TABLE(3b, 4b) EX_TABLE(5b, 4b)
: :
[cc] "+d" (cc), [val] "=d" (val), [len] "+d" (len), [cc] "+d" (cc), [val] "=d" (val), [len] "+d" (len),
[dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp), [dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp),

View file

@ -1847,7 +1847,7 @@ void __init intel_pmu_arch_lbr_init(void)
return; return;
clear_arch_lbr: clear_arch_lbr:
clear_cpu_cap(&boot_cpu_data, X86_FEATURE_ARCH_LBR); setup_clear_cpu_cap(X86_FEATURE_ARCH_LBR);
} }
/** /**

View file

@ -697,7 +697,7 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
/* Otherwise, skip ahead to the user-specified starting frame: */ /* Otherwise, skip ahead to the user-specified starting frame: */
while (!unwind_done(state) && while (!unwind_done(state) &&
(!on_stack(&state->stack_info, first_frame, sizeof(long)) || (!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
state->sp < (unsigned long)first_frame)) state->sp <= (unsigned long)first_frame))
unwind_next_frame(state); unwind_next_frame(state);
return; return;

View file

@ -2857,6 +2857,10 @@ static int genpd_iterate_idle_states(struct device_node *dn,
np = it.node; np = it.node;
if (!of_match_node(idle_state_match, np)) if (!of_match_node(idle_state_match, np))
continue; continue;
if (!of_device_is_available(np))
continue;
if (states) { if (states) {
ret = genpd_parse_state(&states[i], np); ret = genpd_parse_state(&states[i], np);
if (ret) { if (ret) {

View file

@ -29,7 +29,6 @@ struct mchp_tc_data {
int qdec_mode; int qdec_mode;
int num_channels; int num_channels;
int channel[2]; int channel[2];
bool trig_inverted;
}; };
enum mchp_tc_count_function { enum mchp_tc_count_function {
@ -163,7 +162,7 @@ static int mchp_tc_count_signal_read(struct counter_device *counter,
regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], SR), &sr); regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], SR), &sr);
if (priv->trig_inverted) if (signal->id == 1)
sigstatus = (sr & ATMEL_TC_MTIOB); sigstatus = (sr & ATMEL_TC_MTIOB);
else else
sigstatus = (sr & ATMEL_TC_MTIOA); sigstatus = (sr & ATMEL_TC_MTIOA);
@ -181,6 +180,17 @@ static int mchp_tc_count_action_get(struct counter_device *counter,
struct mchp_tc_data *const priv = counter->priv; struct mchp_tc_data *const priv = counter->priv;
u32 cmr; u32 cmr;
if (priv->qdec_mode) {
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
return 0;
}
/* Only TIOA signal is evaluated in non-QDEC mode */
if (synapse->signal->id != 0) {
*action = COUNTER_SYNAPSE_ACTION_NONE;
return 0;
}
regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], CMR), &cmr); regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], CMR), &cmr);
switch (cmr & ATMEL_TC_ETRGEDG) { switch (cmr & ATMEL_TC_ETRGEDG) {
@ -209,8 +219,8 @@ static int mchp_tc_count_action_set(struct counter_device *counter,
struct mchp_tc_data *const priv = counter->priv; struct mchp_tc_data *const priv = counter->priv;
u32 edge = ATMEL_TC_ETRGEDG_NONE; u32 edge = ATMEL_TC_ETRGEDG_NONE;
/* QDEC mode is rising edge only */ /* QDEC mode is rising edge only; only TIOA handled in non-QDEC mode */
if (priv->qdec_mode) if (priv->qdec_mode || synapse->signal->id != 0)
return -EINVAL; return -EINVAL;
switch (action) { switch (action) {

View file

@ -24,7 +24,7 @@ efi_status_t check_platform_features(void)
return EFI_SUCCESS; return EFI_SUCCESS;
tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf; tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf;
if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) { if (tg < ID_AA64MMFR0_TGRAN_SUPPORTED_MIN || tg > ID_AA64MMFR0_TGRAN_SUPPORTED_MAX) {
if (IS_ENABLED(CONFIG_ARM64_64K_PAGES)) if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
efi_err("This 64 KB granular kernel is not supported by your CPU\n"); efi_err("This 64 KB granular kernel is not supported by your CPU\n");
else else

View file

@ -56,8 +56,9 @@ static int mdp4_lvds_connector_get_modes(struct drm_connector *connector)
return ret; return ret;
} }
static int mdp4_lvds_connector_mode_valid(struct drm_connector *connector, static enum drm_mode_status
struct drm_display_mode *mode) mdp4_lvds_connector_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode)
{ {
struct mdp4_lvds_connector *mdp4_lvds_connector = struct mdp4_lvds_connector *mdp4_lvds_connector =
to_mdp4_lvds_connector(connector); to_mdp4_lvds_connector(connector);

View file

@ -1201,7 +1201,7 @@ int dp_display_request_irq(struct msm_dp *dp_display)
return -EINVAL; return -EINVAL;
} }
rc = devm_request_irq(&dp->pdev->dev, dp->irq, rc = devm_request_irq(dp_display->drm_dev->dev, dp->irq,
dp_display_irq_handler, dp_display_irq_handler,
IRQF_TRIGGER_HIGH, "dp_display_isr", dp); IRQF_TRIGGER_HIGH, "dp_display_isr", dp);
if (rc < 0) { if (rc < 0) {

View file

@ -205,6 +205,12 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
return -EINVAL; return -EINVAL;
priv = dev->dev_private; priv = dev->dev_private;
if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) {
DRM_DEV_ERROR(dev->dev, "too many bridges\n");
return -ENOSPC;
}
msm_dsi->dev = dev; msm_dsi->dev = dev;
ret = msm_dsi_host_modeset_init(msm_dsi->host, dev); ret = msm_dsi_host_modeset_init(msm_dsi->host, dev);

View file

@ -293,6 +293,11 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi,
struct platform_device *pdev = hdmi->pdev; struct platform_device *pdev = hdmi->pdev;
int ret; int ret;
if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) {
DRM_DEV_ERROR(dev->dev, "too many bridges\n");
return -ENOSPC;
}
hdmi->dev = dev; hdmi->dev = dev;
hdmi->encoder = encoder; hdmi->encoder = encoder;

View file

@ -856,7 +856,7 @@ static int tsl2583_probe(struct i2c_client *clientp,
TSL2583_POWER_OFF_DELAY_MS); TSL2583_POWER_OFF_DELAY_MS);
pm_runtime_use_autosuspend(&clientp->dev); pm_runtime_use_autosuspend(&clientp->dev);
ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev); ret = iio_device_register(indio_dev);
if (ret) { if (ret) {
dev_err(&clientp->dev, "%s: iio registration failed\n", dev_err(&clientp->dev, "%s: iio registration failed\n",
__func__); __func__);

View file

@ -1376,13 +1376,6 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
return ret; return ret;
} }
st->iio_chan = devm_kzalloc(&st->spi->dev,
st->iio_channels * sizeof(*st->iio_chan),
GFP_KERNEL);
if (!st->iio_chan)
return -ENOMEM;
ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG, ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG,
LTC2983_NOTCH_FREQ_MASK, LTC2983_NOTCH_FREQ_MASK,
LTC2983_NOTCH_FREQ(st->filter_notch_freq)); LTC2983_NOTCH_FREQ(st->filter_notch_freq));
@ -1494,6 +1487,12 @@ static int ltc2983_probe(struct spi_device *spi)
if (ret) if (ret)
return ret; return ret;
st->iio_chan = devm_kzalloc(&spi->dev,
st->iio_channels * sizeof(*st->iio_chan),
GFP_KERNEL);
if (!st->iio_chan)
return -ENOMEM;
ret = ltc2983_setup(st, true); ret = ltc2983_setup(st, true);
if (ret) if (ret)
return ret; return ret;

View file

@ -330,6 +330,28 @@ static int vidioc_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *a
return vivid_vid_out_g_fbuf(file, fh, a); return vivid_vid_out_g_fbuf(file, fh, a);
} }
/*
* Only support the framebuffer of one of the vivid instances.
* Anything else is rejected.
*/
bool vivid_validate_fb(const struct v4l2_framebuffer *a)
{
struct vivid_dev *dev;
int i;
for (i = 0; i < n_devs; i++) {
dev = vivid_devs[i];
if (!dev || !dev->video_pbase)
continue;
if ((unsigned long)a->base == dev->video_pbase &&
a->fmt.width <= dev->display_width &&
a->fmt.height <= dev->display_height &&
a->fmt.bytesperline <= dev->display_byte_stride)
return true;
}
return false;
}
static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *a) static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *a)
{ {
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
@ -850,8 +872,12 @@ static int vivid_detect_feature_set(struct vivid_dev *dev, int inst,
/* how many inputs do we have and of what type? */ /* how many inputs do we have and of what type? */
dev->num_inputs = num_inputs[inst]; dev->num_inputs = num_inputs[inst];
if (dev->num_inputs < 1) if (node_type & 0x20007) {
dev->num_inputs = 1; if (dev->num_inputs < 1)
dev->num_inputs = 1;
} else {
dev->num_inputs = 0;
}
if (dev->num_inputs >= MAX_INPUTS) if (dev->num_inputs >= MAX_INPUTS)
dev->num_inputs = MAX_INPUTS; dev->num_inputs = MAX_INPUTS;
for (i = 0; i < dev->num_inputs; i++) { for (i = 0; i < dev->num_inputs; i++) {
@ -868,8 +894,12 @@ static int vivid_detect_feature_set(struct vivid_dev *dev, int inst,
/* how many outputs do we have and of what type? */ /* how many outputs do we have and of what type? */
dev->num_outputs = num_outputs[inst]; dev->num_outputs = num_outputs[inst];
if (dev->num_outputs < 1) if (node_type & 0x40300) {
dev->num_outputs = 1; if (dev->num_outputs < 1)
dev->num_outputs = 1;
} else {
dev->num_outputs = 0;
}
if (dev->num_outputs >= MAX_OUTPUTS) if (dev->num_outputs >= MAX_OUTPUTS)
dev->num_outputs = MAX_OUTPUTS; dev->num_outputs = MAX_OUTPUTS;
for (i = 0; i < dev->num_outputs; i++) { for (i = 0; i < dev->num_outputs; i++) {

View file

@ -609,4 +609,6 @@ static inline bool vivid_is_hdmi_out(const struct vivid_dev *dev)
return dev->output_type[dev->output] == HDMI; return dev->output_type[dev->output] == HDMI;
} }
bool vivid_validate_fb(const struct v4l2_framebuffer *a);
#endif #endif

View file

@ -452,6 +452,12 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
tpg_reset_source(&dev->tpg, dev->src_rect.width, dev->src_rect.height, dev->field_cap); tpg_reset_source(&dev->tpg, dev->src_rect.width, dev->src_rect.height, dev->field_cap);
dev->crop_cap = dev->src_rect; dev->crop_cap = dev->src_rect;
dev->crop_bounds_cap = dev->src_rect; dev->crop_bounds_cap = dev->src_rect;
if (dev->bitmap_cap &&
(dev->compose_cap.width != dev->crop_cap.width ||
dev->compose_cap.height != dev->crop_cap.height)) {
vfree(dev->bitmap_cap);
dev->bitmap_cap = NULL;
}
dev->compose_cap = dev->crop_cap; dev->compose_cap = dev->crop_cap;
if (V4L2_FIELD_HAS_T_OR_B(dev->field_cap)) if (V4L2_FIELD_HAS_T_OR_B(dev->field_cap))
dev->compose_cap.height /= 2; dev->compose_cap.height /= 2;
@ -909,6 +915,8 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection
struct vivid_dev *dev = video_drvdata(file); struct vivid_dev *dev = video_drvdata(file);
struct v4l2_rect *crop = &dev->crop_cap; struct v4l2_rect *crop = &dev->crop_cap;
struct v4l2_rect *compose = &dev->compose_cap; struct v4l2_rect *compose = &dev->compose_cap;
unsigned orig_compose_w = compose->width;
unsigned orig_compose_h = compose->height;
unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1; unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1;
int ret; int ret;
@ -1025,17 +1033,17 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection
s->r.height /= factor; s->r.height /= factor;
} }
v4l2_rect_map_inside(&s->r, &dev->fmt_cap_rect); v4l2_rect_map_inside(&s->r, &dev->fmt_cap_rect);
if (dev->bitmap_cap && (compose->width != s->r.width ||
compose->height != s->r.height)) {
vfree(dev->bitmap_cap);
dev->bitmap_cap = NULL;
}
*compose = s->r; *compose = s->r;
break; break;
default: default:
return -EINVAL; return -EINVAL;
} }
if (dev->bitmap_cap && (compose->width != orig_compose_w ||
compose->height != orig_compose_h)) {
vfree(dev->bitmap_cap);
dev->bitmap_cap = NULL;
}
tpg_s_crop_compose(&dev->tpg, crop, compose); tpg_s_crop_compose(&dev->tpg, crop, compose);
return 0; return 0;
} }
@ -1276,7 +1284,14 @@ int vivid_vid_cap_s_fbuf(struct file *file, void *fh,
return -EINVAL; return -EINVAL;
if (a->fmt.bytesperline < (a->fmt.width * fmt->bit_depth[0]) / 8) if (a->fmt.bytesperline < (a->fmt.width * fmt->bit_depth[0]) / 8)
return -EINVAL; return -EINVAL;
if (a->fmt.height * a->fmt.bytesperline < a->fmt.sizeimage) if (a->fmt.bytesperline > a->fmt.sizeimage / a->fmt.height)
return -EINVAL;
/*
* Only support the framebuffer of one of the vivid instances.
* Anything else is rejected.
*/
if (!vivid_validate_fb(a))
return -EINVAL; return -EINVAL;
dev->fb_vbase_cap = phys_to_virt((unsigned long)a->base); dev->fb_vbase_cap = phys_to_virt((unsigned long)a->base);

View file

@ -161,6 +161,20 @@ bool v4l2_valid_dv_timings(const struct v4l2_dv_timings *t,
(bt->interlaced && !(caps & V4L2_DV_BT_CAP_INTERLACED)) || (bt->interlaced && !(caps & V4L2_DV_BT_CAP_INTERLACED)) ||
(!bt->interlaced && !(caps & V4L2_DV_BT_CAP_PROGRESSIVE))) (!bt->interlaced && !(caps & V4L2_DV_BT_CAP_PROGRESSIVE)))
return false; return false;
/* sanity checks for the blanking timings */
if (!bt->interlaced &&
(bt->il_vbackporch || bt->il_vsync || bt->il_vfrontporch))
return false;
if (bt->hfrontporch > 2 * bt->width ||
bt->hsync > 1024 || bt->hbackporch > 1024)
return false;
if (bt->vfrontporch > 4096 ||
bt->vsync > 128 || bt->vbackporch > 4096)
return false;
if (bt->interlaced && (bt->il_vfrontporch > 4096 ||
bt->il_vsync > 128 || bt->il_vbackporch > 4096))
return false;
return fnc == NULL || fnc(t, fnc_handle); return fnc == NULL || fnc(t, fnc_handle);
} }
EXPORT_SYMBOL_GPL(v4l2_valid_dv_timings); EXPORT_SYMBOL_GPL(v4l2_valid_dv_timings);

View file

@ -292,7 +292,8 @@ static void sdio_release_func(struct device *dev)
{ {
struct sdio_func *func = dev_to_sdio_func(dev); struct sdio_func *func = dev_to_sdio_func(dev);
sdio_free_func_cis(func); if (!(func->card->quirks & MMC_QUIRK_NONSTD_SDIO))
sdio_free_func_cis(func);
kfree(func->info); kfree(func->info);
kfree(func->tmpbuf); kfree(func->tmpbuf);

View file

@ -1080,9 +1080,10 @@ config MMC_SDHCI_OMAP
config MMC_SDHCI_AM654 config MMC_SDHCI_AM654
tristate "Support for the SDHCI Controller in TI's AM654 SOCs" tristate "Support for the SDHCI Controller in TI's AM654 SOCs"
depends on MMC_SDHCI_PLTFM && OF && REGMAP_MMIO depends on MMC_SDHCI_PLTFM && OF
select MMC_SDHCI_IO_ACCESSORS select MMC_SDHCI_IO_ACCESSORS
select MMC_CQHCI select MMC_CQHCI
select REGMAP_MMIO
help help
This selects the Secure Digital Host Controller Interface (SDHCI) This selects the Secure Digital Host Controller Interface (SDHCI)
support present in TI's AM654 SOCs. The controller supports support present in TI's AM654 SOCs. The controller supports

View file

@ -2672,7 +2672,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
chip->controller = &nfc->controller; chip->controller = &nfc->controller;
nand_set_flash_node(chip, np); nand_set_flash_node(chip, np);
if (!of_property_read_bool(np, "marvell,nand-keep-config")) if (of_property_read_bool(np, "marvell,nand-keep-config"))
chip->options |= NAND_KEEP_TIMINGS; chip->options |= NAND_KEEP_TIMINGS;
mtd = nand_to_mtd(chip); mtd = nand_to_mtd(chip);

View file

@ -325,14 +325,14 @@ static int mpc5xxx_can_probe(struct platform_device *ofdev)
&mscan_clksrc); &mscan_clksrc);
if (!priv->can.clock.freq) { if (!priv->can.clock.freq) {
dev_err(&ofdev->dev, "couldn't get MSCAN clock properties\n"); dev_err(&ofdev->dev, "couldn't get MSCAN clock properties\n");
goto exit_free_mscan; goto exit_put_clock;
} }
err = register_mscandev(dev, mscan_clksrc); err = register_mscandev(dev, mscan_clksrc);
if (err) { if (err) {
dev_err(&ofdev->dev, "registering %s failed (err=%d)\n", dev_err(&ofdev->dev, "registering %s failed (err=%d)\n",
DRV_NAME, err); DRV_NAME, err);
goto exit_free_mscan; goto exit_put_clock;
} }
dev_info(&ofdev->dev, "MSCAN at 0x%p, irq %d, clock %d Hz\n", dev_info(&ofdev->dev, "MSCAN at 0x%p, irq %d, clock %d Hz\n",
@ -340,7 +340,9 @@ static int mpc5xxx_can_probe(struct platform_device *ofdev)
return 0; return 0;
exit_free_mscan: exit_put_clock:
if (data->put_clock)
data->put_clock(ofdev);
free_candev(dev); free_candev(dev);
exit_dispose_irq: exit_dispose_irq:
irq_dispose_mapping(irq); irq_dispose_mapping(irq);

View file

@ -1075,7 +1075,7 @@ static irqreturn_t rcar_canfd_global_interrupt(int irq, void *dev_id)
struct rcar_canfd_global *gpriv = dev_id; struct rcar_canfd_global *gpriv = dev_id;
struct net_device *ndev; struct net_device *ndev;
struct rcar_canfd_channel *priv; struct rcar_canfd_channel *priv;
u32 sts, gerfl; u32 sts, cc, gerfl;
u32 ch, ridx; u32 ch, ridx;
/* Global error interrupts still indicate a condition specific /* Global error interrupts still indicate a condition specific
@ -1093,7 +1093,9 @@ static irqreturn_t rcar_canfd_global_interrupt(int irq, void *dev_id)
/* Handle Rx interrupts */ /* Handle Rx interrupts */
sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(ridx)); sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(ridx));
if (likely(sts & RCANFD_RFSTS_RFIF)) { cc = rcar_canfd_read(priv->base, RCANFD_RFCC(ridx));
if (likely(sts & RCANFD_RFSTS_RFIF &&
cc & RCANFD_RFCC_RFIE)) {
if (napi_schedule_prep(&priv->napi)) { if (napi_schedule_prep(&priv->napi)) {
/* Disable Rx FIFO interrupts */ /* Disable Rx FIFO interrupts */
rcar_canfd_clear_bit(priv->base, rcar_canfd_clear_bit(priv->base,

View file

@ -1419,11 +1419,14 @@ static int mcp251x_can_probe(struct spi_device *spi)
ret = mcp251x_gpio_setup(priv); ret = mcp251x_gpio_setup(priv);
if (ret) if (ret)
goto error_probe; goto out_unregister_candev;
netdev_info(net, "MCP%x successfully initialized.\n", priv->model); netdev_info(net, "MCP%x successfully initialized.\n", priv->model);
return 0; return 0;
out_unregister_candev:
unregister_candev(net);
error_probe: error_probe:
destroy_workqueue(priv->wq); destroy_workqueue(priv->wq);
priv->wq = NULL; priv->wq = NULL;

View file

@ -1845,7 +1845,7 @@ static int kvaser_usb_hydra_start_chip(struct kvaser_usb_net_priv *priv)
{ {
int err; int err;
init_completion(&priv->start_comp); reinit_completion(&priv->start_comp);
err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_START_CHIP_REQ, err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_START_CHIP_REQ,
priv->channel); priv->channel);
@ -1863,7 +1863,7 @@ static int kvaser_usb_hydra_stop_chip(struct kvaser_usb_net_priv *priv)
{ {
int err; int err;
init_completion(&priv->stop_comp); reinit_completion(&priv->stop_comp);
/* Make sure we do not report invalid BUS_OFF from CMD_CHIP_STATE_EVENT /* Make sure we do not report invalid BUS_OFF from CMD_CHIP_STATE_EVENT
* see comment in kvaser_usb_hydra_update_state() * see comment in kvaser_usb_hydra_update_state()

View file

@ -1324,7 +1324,7 @@ static int kvaser_usb_leaf_start_chip(struct kvaser_usb_net_priv *priv)
{ {
int err; int err;
init_completion(&priv->start_comp); reinit_completion(&priv->start_comp);
err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_START_CHIP, err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_START_CHIP,
priv->channel); priv->channel);
@ -1342,7 +1342,7 @@ static int kvaser_usb_leaf_stop_chip(struct kvaser_usb_net_priv *priv)
{ {
int err; int err;
init_completion(&priv->stop_comp); reinit_completion(&priv->stop_comp);
err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP, err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP,
priv->channel); priv->channel);

View file

@ -239,6 +239,7 @@ enum xgbe_sfp_speed {
#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d #define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
#define XGBE_SFP_BASE_BR_10GBE_MIN 0x64 #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68 #define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
#define XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX 0x78
#define XGBE_SFP_BASE_CU_CABLE_LEN 18 #define XGBE_SFP_BASE_CU_CABLE_LEN 18
@ -284,6 +285,8 @@ struct xgbe_sfp_eeprom {
#define XGBE_BEL_FUSE_VENDOR "BEL-FUSE " #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE "
#define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 " #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 "
#define XGBE_MOLEX_VENDOR "Molex Inc. "
struct xgbe_sfp_ascii { struct xgbe_sfp_ascii {
union { union {
char vendor[XGBE_SFP_BASE_VENDOR_NAME_LEN + 1]; char vendor[XGBE_SFP_BASE_VENDOR_NAME_LEN + 1];
@ -834,7 +837,11 @@ static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
break; break;
case XGBE_SFP_SPEED_10000: case XGBE_SFP_SPEED_10000:
min = XGBE_SFP_BASE_BR_10GBE_MIN; min = XGBE_SFP_BASE_BR_10GBE_MIN;
max = XGBE_SFP_BASE_BR_10GBE_MAX; if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
XGBE_MOLEX_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN) == 0)
max = XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX;
else
max = XGBE_SFP_BASE_BR_10GBE_MAX;
break; break;
default: default:
return false; return false;
@ -1151,7 +1158,10 @@ static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
} }
/* Determine the type of SFP */ /* Determine the type of SFP */
if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) if (phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE &&
xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
phy_data->sfp_base = XGBE_SFP_BASE_10000_SR; phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR) else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
phy_data->sfp_base = XGBE_SFP_BASE_10000_LR; phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
@ -1167,9 +1177,6 @@ static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
phy_data->sfp_base = XGBE_SFP_BASE_1000_CX; phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T) else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
phy_data->sfp_base = XGBE_SFP_BASE_1000_T; phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
switch (phy_data->sfp_base) { switch (phy_data->sfp_base) {
case XGBE_SFP_BASE_1000_T: case XGBE_SFP_BASE_1000_T:

View file

@ -1451,26 +1451,57 @@ static void aq_check_txsa_expiration(struct aq_nic_s *nic)
egress_sa_threshold_expired); egress_sa_threshold_expired);
} }
#define AQ_LOCKED_MDO_DEF(mdo) \
static int aq_locked_mdo_##mdo(struct macsec_context *ctx) \
{ \
struct aq_nic_s *nic = netdev_priv(ctx->netdev); \
int ret; \
mutex_lock(&nic->macsec_mutex); \
ret = aq_mdo_##mdo(ctx); \
mutex_unlock(&nic->macsec_mutex); \
return ret; \
}
AQ_LOCKED_MDO_DEF(dev_open)
AQ_LOCKED_MDO_DEF(dev_stop)
AQ_LOCKED_MDO_DEF(add_secy)
AQ_LOCKED_MDO_DEF(upd_secy)
AQ_LOCKED_MDO_DEF(del_secy)
AQ_LOCKED_MDO_DEF(add_rxsc)
AQ_LOCKED_MDO_DEF(upd_rxsc)
AQ_LOCKED_MDO_DEF(del_rxsc)
AQ_LOCKED_MDO_DEF(add_rxsa)
AQ_LOCKED_MDO_DEF(upd_rxsa)
AQ_LOCKED_MDO_DEF(del_rxsa)
AQ_LOCKED_MDO_DEF(add_txsa)
AQ_LOCKED_MDO_DEF(upd_txsa)
AQ_LOCKED_MDO_DEF(del_txsa)
AQ_LOCKED_MDO_DEF(get_dev_stats)
AQ_LOCKED_MDO_DEF(get_tx_sc_stats)
AQ_LOCKED_MDO_DEF(get_tx_sa_stats)
AQ_LOCKED_MDO_DEF(get_rx_sc_stats)
AQ_LOCKED_MDO_DEF(get_rx_sa_stats)
const struct macsec_ops aq_macsec_ops = { const struct macsec_ops aq_macsec_ops = {
.mdo_dev_open = aq_mdo_dev_open, .mdo_dev_open = aq_locked_mdo_dev_open,
.mdo_dev_stop = aq_mdo_dev_stop, .mdo_dev_stop = aq_locked_mdo_dev_stop,
.mdo_add_secy = aq_mdo_add_secy, .mdo_add_secy = aq_locked_mdo_add_secy,
.mdo_upd_secy = aq_mdo_upd_secy, .mdo_upd_secy = aq_locked_mdo_upd_secy,
.mdo_del_secy = aq_mdo_del_secy, .mdo_del_secy = aq_locked_mdo_del_secy,
.mdo_add_rxsc = aq_mdo_add_rxsc, .mdo_add_rxsc = aq_locked_mdo_add_rxsc,
.mdo_upd_rxsc = aq_mdo_upd_rxsc, .mdo_upd_rxsc = aq_locked_mdo_upd_rxsc,
.mdo_del_rxsc = aq_mdo_del_rxsc, .mdo_del_rxsc = aq_locked_mdo_del_rxsc,
.mdo_add_rxsa = aq_mdo_add_rxsa, .mdo_add_rxsa = aq_locked_mdo_add_rxsa,
.mdo_upd_rxsa = aq_mdo_upd_rxsa, .mdo_upd_rxsa = aq_locked_mdo_upd_rxsa,
.mdo_del_rxsa = aq_mdo_del_rxsa, .mdo_del_rxsa = aq_locked_mdo_del_rxsa,
.mdo_add_txsa = aq_mdo_add_txsa, .mdo_add_txsa = aq_locked_mdo_add_txsa,
.mdo_upd_txsa = aq_mdo_upd_txsa, .mdo_upd_txsa = aq_locked_mdo_upd_txsa,
.mdo_del_txsa = aq_mdo_del_txsa, .mdo_del_txsa = aq_locked_mdo_del_txsa,
.mdo_get_dev_stats = aq_mdo_get_dev_stats, .mdo_get_dev_stats = aq_locked_mdo_get_dev_stats,
.mdo_get_tx_sc_stats = aq_mdo_get_tx_sc_stats, .mdo_get_tx_sc_stats = aq_locked_mdo_get_tx_sc_stats,
.mdo_get_tx_sa_stats = aq_mdo_get_tx_sa_stats, .mdo_get_tx_sa_stats = aq_locked_mdo_get_tx_sa_stats,
.mdo_get_rx_sc_stats = aq_mdo_get_rx_sc_stats, .mdo_get_rx_sc_stats = aq_locked_mdo_get_rx_sc_stats,
.mdo_get_rx_sa_stats = aq_mdo_get_rx_sa_stats, .mdo_get_rx_sa_stats = aq_locked_mdo_get_rx_sa_stats,
}; };
int aq_macsec_init(struct aq_nic_s *nic) int aq_macsec_init(struct aq_nic_s *nic)
@ -1492,6 +1523,7 @@ int aq_macsec_init(struct aq_nic_s *nic)
nic->ndev->features |= NETIF_F_HW_MACSEC; nic->ndev->features |= NETIF_F_HW_MACSEC;
nic->ndev->macsec_ops = &aq_macsec_ops; nic->ndev->macsec_ops = &aq_macsec_ops;
mutex_init(&nic->macsec_mutex);
return 0; return 0;
} }
@ -1515,7 +1547,7 @@ int aq_macsec_enable(struct aq_nic_s *nic)
if (!nic->macsec_cfg) if (!nic->macsec_cfg)
return 0; return 0;
rtnl_lock(); mutex_lock(&nic->macsec_mutex);
if (nic->aq_fw_ops->send_macsec_req) { if (nic->aq_fw_ops->send_macsec_req) {
struct macsec_cfg_request cfg = { 0 }; struct macsec_cfg_request cfg = { 0 };
@ -1564,7 +1596,7 @@ int aq_macsec_enable(struct aq_nic_s *nic)
ret = aq_apply_macsec_cfg(nic); ret = aq_apply_macsec_cfg(nic);
unlock: unlock:
rtnl_unlock(); mutex_unlock(&nic->macsec_mutex);
return ret; return ret;
} }
@ -1576,9 +1608,9 @@ void aq_macsec_work(struct aq_nic_s *nic)
if (!netif_carrier_ok(nic->ndev)) if (!netif_carrier_ok(nic->ndev))
return; return;
rtnl_lock(); mutex_lock(&nic->macsec_mutex);
aq_check_txsa_expiration(nic); aq_check_txsa_expiration(nic);
rtnl_unlock(); mutex_unlock(&nic->macsec_mutex);
} }
int aq_macsec_rx_sa_cnt(struct aq_nic_s *nic) int aq_macsec_rx_sa_cnt(struct aq_nic_s *nic)
@ -1589,21 +1621,30 @@ int aq_macsec_rx_sa_cnt(struct aq_nic_s *nic)
if (!cfg) if (!cfg)
return 0; return 0;
mutex_lock(&nic->macsec_mutex);
for (i = 0; i < AQ_MACSEC_MAX_SC; i++) { for (i = 0; i < AQ_MACSEC_MAX_SC; i++) {
if (!test_bit(i, &cfg->rxsc_idx_busy)) if (!test_bit(i, &cfg->rxsc_idx_busy))
continue; continue;
cnt += hweight_long(cfg->aq_rxsc[i].rx_sa_idx_busy); cnt += hweight_long(cfg->aq_rxsc[i].rx_sa_idx_busy);
} }
mutex_unlock(&nic->macsec_mutex);
return cnt; return cnt;
} }
int aq_macsec_tx_sc_cnt(struct aq_nic_s *nic) int aq_macsec_tx_sc_cnt(struct aq_nic_s *nic)
{ {
int cnt;
if (!nic->macsec_cfg) if (!nic->macsec_cfg)
return 0; return 0;
return hweight_long(nic->macsec_cfg->txsc_idx_busy); mutex_lock(&nic->macsec_mutex);
cnt = hweight_long(nic->macsec_cfg->txsc_idx_busy);
mutex_unlock(&nic->macsec_mutex);
return cnt;
} }
int aq_macsec_tx_sa_cnt(struct aq_nic_s *nic) int aq_macsec_tx_sa_cnt(struct aq_nic_s *nic)
@ -1614,12 +1655,15 @@ int aq_macsec_tx_sa_cnt(struct aq_nic_s *nic)
if (!cfg) if (!cfg)
return 0; return 0;
mutex_lock(&nic->macsec_mutex);
for (i = 0; i < AQ_MACSEC_MAX_SC; i++) { for (i = 0; i < AQ_MACSEC_MAX_SC; i++) {
if (!test_bit(i, &cfg->txsc_idx_busy)) if (!test_bit(i, &cfg->txsc_idx_busy))
continue; continue;
cnt += hweight_long(cfg->aq_txsc[i].tx_sa_idx_busy); cnt += hweight_long(cfg->aq_txsc[i].tx_sa_idx_busy);
} }
mutex_unlock(&nic->macsec_mutex);
return cnt; return cnt;
} }
@ -1691,6 +1735,8 @@ u64 *aq_macsec_get_stats(struct aq_nic_s *nic, u64 *data)
if (!cfg) if (!cfg)
return data; return data;
mutex_lock(&nic->macsec_mutex);
aq_macsec_update_stats(nic); aq_macsec_update_stats(nic);
common_stats = &cfg->stats; common_stats = &cfg->stats;
@ -1773,5 +1819,7 @@ u64 *aq_macsec_get_stats(struct aq_nic_s *nic, u64 *data)
data += i; data += i;
mutex_unlock(&nic->macsec_mutex);
return data; return data;
} }

View file

@ -152,6 +152,8 @@ struct aq_nic_s {
struct mutex fwreq_mutex; struct mutex fwreq_mutex;
#if IS_ENABLED(CONFIG_MACSEC) #if IS_ENABLED(CONFIG_MACSEC)
struct aq_macsec_cfg *macsec_cfg; struct aq_macsec_cfg *macsec_cfg;
/* mutex to protect data in macsec_cfg */
struct mutex macsec_mutex;
#endif #endif
/* PTP support */ /* PTP support */
struct aq_ptp_s *aq_ptp; struct aq_ptp_s *aq_ptp;

View file

@ -1241,7 +1241,12 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, ENETC_RXB_DMA_SIZE); enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, ENETC_RXB_DMA_SIZE);
/* Also prepare the consumer index in case page allocation never
* succeeds. In that case, hardware will never advance producer index
* to match consumer index, and will drop all frames.
*/
enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0); enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
enetc_rxbdr_wr(hw, idx, ENETC_RBCIR, 1);
/* enable Rx ints by setting pkt thr to 1 */ /* enable Rx ints by setting pkt thr to 1 */
enetc_rxbdr_wr(hw, idx, ENETC_RBICR0, ENETC_RBICR0_ICEN | 0x1); enetc_rxbdr_wr(hw, idx, ENETC_RBICR0, ENETC_RBICR0_ICEN | 0x1);

View file

@ -2251,6 +2251,31 @@ static u32 fec_enet_register_offset[] = {
IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR, IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR,
IEEE_R_FDXFC, IEEE_R_OCTETS_OK IEEE_R_FDXFC, IEEE_R_OCTETS_OK
}; };
/* for i.MX6ul */
static u32 fec_enet_register_offset_6ul[] = {
FEC_IEVENT, FEC_IMASK, FEC_R_DES_ACTIVE_0, FEC_X_DES_ACTIVE_0,
FEC_ECNTRL, FEC_MII_DATA, FEC_MII_SPEED, FEC_MIB_CTRLSTAT, FEC_R_CNTRL,
FEC_X_CNTRL, FEC_ADDR_LOW, FEC_ADDR_HIGH, FEC_OPD, FEC_TXIC0, FEC_RXIC0,
FEC_HASH_TABLE_HIGH, FEC_HASH_TABLE_LOW, FEC_GRP_HASH_TABLE_HIGH,
FEC_GRP_HASH_TABLE_LOW, FEC_X_WMRK, FEC_R_DES_START_0,
FEC_X_DES_START_0, FEC_R_BUFF_SIZE_0, FEC_R_FIFO_RSFL, FEC_R_FIFO_RSEM,
FEC_R_FIFO_RAEM, FEC_R_FIFO_RAFL, FEC_RACC,
RMON_T_DROP, RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,
RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,
RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,
RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2047,
RMON_T_P_GTE2048, RMON_T_OCTETS,
IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL, IEEE_T_DEF,
IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR, IEEE_T_SQE,
IEEE_T_FDXFC, IEEE_T_OCTETS_OK,
RMON_R_PACKETS, RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN,
RMON_R_UNDERSIZE, RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB,
RMON_R_RESVD_O, RMON_R_P64, RMON_R_P65TO127, RMON_R_P128TO255,
RMON_R_P256TO511, RMON_R_P512TO1023, RMON_R_P1024TO2047,
RMON_R_P_GTE2048, RMON_R_OCTETS,
IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR,
IEEE_R_FDXFC, IEEE_R_OCTETS_OK
};
#else #else
static __u32 fec_enet_register_version = 1; static __u32 fec_enet_register_version = 1;
static u32 fec_enet_register_offset[] = { static u32 fec_enet_register_offset[] = {
@ -2275,7 +2300,24 @@ static void fec_enet_get_regs(struct net_device *ndev,
u32 *buf = (u32 *)regbuf; u32 *buf = (u32 *)regbuf;
u32 i, off; u32 i, off;
int ret; int ret;
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
defined(CONFIG_ARM64) || defined(CONFIG_COMPILE_TEST)
u32 *reg_list;
u32 reg_cnt;
if (!of_machine_is_compatible("fsl,imx6ul")) {
reg_list = fec_enet_register_offset;
reg_cnt = ARRAY_SIZE(fec_enet_register_offset);
} else {
reg_list = fec_enet_register_offset_6ul;
reg_cnt = ARRAY_SIZE(fec_enet_register_offset_6ul);
}
#else
/* coldfire */
static u32 *reg_list = fec_enet_register_offset;
static const u32 reg_cnt = ARRAY_SIZE(fec_enet_register_offset);
#endif
ret = pm_runtime_resume_and_get(dev); ret = pm_runtime_resume_and_get(dev);
if (ret < 0) if (ret < 0)
return; return;
@ -2284,8 +2326,8 @@ static void fec_enet_get_regs(struct net_device *ndev,
memset(buf, 0, regs->len); memset(buf, 0, regs->len);
for (i = 0; i < ARRAY_SIZE(fec_enet_register_offset); i++) { for (i = 0; i < reg_cnt; i++) {
off = fec_enet_register_offset[i]; off = reg_list[i];
if ((off == FEC_R_BOUND || off == FEC_R_FSTART) && if ((off == FEC_R_BOUND || off == FEC_R_FSTART) &&
!(fep->quirks & FEC_QUIRK_HAS_FRREG)) !(fep->quirks & FEC_QUIRK_HAS_FRREG))

View file

@ -85,6 +85,7 @@ static int hinic_dbg_get_func_table(struct hinic_dev *nic_dev, int idx)
struct tag_sml_funcfg_tbl *funcfg_table_elem; struct tag_sml_funcfg_tbl *funcfg_table_elem;
struct hinic_cmd_lt_rd *read_data; struct hinic_cmd_lt_rd *read_data;
u16 out_size = sizeof(*read_data); u16 out_size = sizeof(*read_data);
int ret = ~0;
int err; int err;
read_data = kzalloc(sizeof(*read_data), GFP_KERNEL); read_data = kzalloc(sizeof(*read_data), GFP_KERNEL);
@ -111,20 +112,25 @@ static int hinic_dbg_get_func_table(struct hinic_dev *nic_dev, int idx)
switch (idx) { switch (idx) {
case VALID: case VALID:
return funcfg_table_elem->dw0.bs.valid; ret = funcfg_table_elem->dw0.bs.valid;
break;
case RX_MODE: case RX_MODE:
return funcfg_table_elem->dw0.bs.nic_rx_mode; ret = funcfg_table_elem->dw0.bs.nic_rx_mode;
break;
case MTU: case MTU:
return funcfg_table_elem->dw1.bs.mtu; ret = funcfg_table_elem->dw1.bs.mtu;
break;
case RQ_DEPTH: case RQ_DEPTH:
return funcfg_table_elem->dw13.bs.cfg_rq_depth; ret = funcfg_table_elem->dw13.bs.cfg_rq_depth;
break;
case QUEUE_NUM: case QUEUE_NUM:
return funcfg_table_elem->dw13.bs.cfg_q_num; ret = funcfg_table_elem->dw13.bs.cfg_q_num;
break;
} }
kfree(read_data); kfree(read_data);
return ~0; return ret;
} }
static ssize_t hinic_dbg_cmd_read(struct file *filp, char __user *buffer, size_t count, static ssize_t hinic_dbg_cmd_read(struct file *filp, char __user *buffer, size_t count,

View file

@ -929,7 +929,7 @@ int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif,
err_set_cmdq_depth: err_set_cmdq_depth:
hinic_ceq_unregister_cb(&func_to_io->ceqs, HINIC_CEQ_CMDQ); hinic_ceq_unregister_cb(&func_to_io->ceqs, HINIC_CEQ_CMDQ);
free_cmdq(&cmdqs->cmdq[HINIC_CMDQ_SYNC]);
err_cmdq_ctxt: err_cmdq_ctxt:
hinic_wqs_cmdq_free(&cmdqs->cmdq_pages, cmdqs->saved_wqs, hinic_wqs_cmdq_free(&cmdqs->cmdq_pages, cmdqs->saved_wqs,
HINIC_MAX_CMDQ_TYPES); HINIC_MAX_CMDQ_TYPES);

View file

@ -892,7 +892,7 @@ int hinic_set_interrupt_cfg(struct hinic_hwdev *hwdev,
if (err) if (err)
return -EINVAL; return -EINVAL;
interrupt_info->lli_credit_cnt = temp_info.lli_timer_cnt; interrupt_info->lli_credit_cnt = temp_info.lli_credit_cnt;
interrupt_info->lli_timer_cnt = temp_info.lli_timer_cnt; interrupt_info->lli_timer_cnt = temp_info.lli_timer_cnt;
err = hinic_msg_to_mgmt(&pfhwdev->pf_to_mgmt, HINIC_MOD_COMM, err = hinic_msg_to_mgmt(&pfhwdev->pf_to_mgmt, HINIC_MOD_COMM,

View file

@ -1178,7 +1178,6 @@ int hinic_vf_func_init(struct hinic_hwdev *hwdev)
dev_err(&hwdev->hwif->pdev->dev, dev_err(&hwdev->hwif->pdev->dev,
"Failed to register VF, err: %d, status: 0x%x, out size: 0x%x\n", "Failed to register VF, err: %d, status: 0x%x, out size: 0x%x\n",
err, register_info.status, out_size); err, register_info.status, out_size);
hinic_unregister_vf_mbox_cb(hwdev, HINIC_MOD_L2NIC);
return -EIO; return -EIO;
} }
} else { } else {

View file

@ -2897,6 +2897,7 @@ static struct device *ehea_register_port(struct ehea_port *port,
ret = of_device_register(&port->ofdev); ret = of_device_register(&port->ofdev);
if (ret) { if (ret) {
pr_err("failed to register device. ret=%d\n", ret); pr_err("failed to register device. ret=%d\n", ret);
put_device(&port->ofdev.dev);
goto out; goto out;
} }

View file

@ -3083,10 +3083,17 @@ static int i40e_get_rss_hash_opts(struct i40e_pf *pf, struct ethtool_rxnfc *cmd)
if (cmd->flow_type == TCP_V4_FLOW || if (cmd->flow_type == TCP_V4_FLOW ||
cmd->flow_type == UDP_V4_FLOW) { cmd->flow_type == UDP_V4_FLOW) {
if (i_set & I40E_L3_SRC_MASK) if (hw->mac.type == I40E_MAC_X722) {
cmd->data |= RXH_IP_SRC; if (i_set & I40E_X722_L3_SRC_MASK)
if (i_set & I40E_L3_DST_MASK) cmd->data |= RXH_IP_SRC;
cmd->data |= RXH_IP_DST; if (i_set & I40E_X722_L3_DST_MASK)
cmd->data |= RXH_IP_DST;
} else {
if (i_set & I40E_L3_SRC_MASK)
cmd->data |= RXH_IP_SRC;
if (i_set & I40E_L3_DST_MASK)
cmd->data |= RXH_IP_DST;
}
} else if (cmd->flow_type == TCP_V6_FLOW || } else if (cmd->flow_type == TCP_V6_FLOW ||
cmd->flow_type == UDP_V6_FLOW) { cmd->flow_type == UDP_V6_FLOW) {
if (i_set & I40E_L3_V6_SRC_MASK) if (i_set & I40E_L3_V6_SRC_MASK)
@ -3393,12 +3400,15 @@ static int i40e_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd,
/** /**
* i40e_get_rss_hash_bits - Read RSS Hash bits from register * i40e_get_rss_hash_bits - Read RSS Hash bits from register
* @hw: hw structure
* @nfc: pointer to user request * @nfc: pointer to user request
* @i_setc: bits currently set * @i_setc: bits currently set
* *
* Returns value of bits to be set per user request * Returns value of bits to be set per user request
**/ **/
static u64 i40e_get_rss_hash_bits(struct ethtool_rxnfc *nfc, u64 i_setc) static u64 i40e_get_rss_hash_bits(struct i40e_hw *hw,
struct ethtool_rxnfc *nfc,
u64 i_setc)
{ {
u64 i_set = i_setc; u64 i_set = i_setc;
u64 src_l3 = 0, dst_l3 = 0; u64 src_l3 = 0, dst_l3 = 0;
@ -3417,8 +3427,13 @@ static u64 i40e_get_rss_hash_bits(struct ethtool_rxnfc *nfc, u64 i_setc)
dst_l3 = I40E_L3_V6_DST_MASK; dst_l3 = I40E_L3_V6_DST_MASK;
} else if (nfc->flow_type == TCP_V4_FLOW || } else if (nfc->flow_type == TCP_V4_FLOW ||
nfc->flow_type == UDP_V4_FLOW) { nfc->flow_type == UDP_V4_FLOW) {
src_l3 = I40E_L3_SRC_MASK; if (hw->mac.type == I40E_MAC_X722) {
dst_l3 = I40E_L3_DST_MASK; src_l3 = I40E_X722_L3_SRC_MASK;
dst_l3 = I40E_X722_L3_DST_MASK;
} else {
src_l3 = I40E_L3_SRC_MASK;
dst_l3 = I40E_L3_DST_MASK;
}
} else { } else {
/* Any other flow type are not supported here */ /* Any other flow type are not supported here */
return i_set; return i_set;
@ -3436,6 +3451,7 @@ static u64 i40e_get_rss_hash_bits(struct ethtool_rxnfc *nfc, u64 i_setc)
return i_set; return i_set;
} }
#define FLOW_PCTYPES_SIZE 64
/** /**
* i40e_set_rss_hash_opt - Enable/Disable flow types for RSS hash * i40e_set_rss_hash_opt - Enable/Disable flow types for RSS hash
* @pf: pointer to the physical function struct * @pf: pointer to the physical function struct
@ -3448,9 +3464,11 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
u64 hena = (u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0)) | u64 hena = (u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0)) |
((u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1)) << 32); ((u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1)) << 32);
u8 flow_pctype = 0; DECLARE_BITMAP(flow_pctypes, FLOW_PCTYPES_SIZE);
u64 i_set, i_setc; u64 i_set, i_setc;
bitmap_zero(flow_pctypes, FLOW_PCTYPES_SIZE);
if (pf->flags & I40E_FLAG_MFP_ENABLED) { if (pf->flags & I40E_FLAG_MFP_ENABLED) {
dev_err(&pf->pdev->dev, dev_err(&pf->pdev->dev,
"Change of RSS hash input set is not supported when MFP mode is enabled\n"); "Change of RSS hash input set is not supported when MFP mode is enabled\n");
@ -3466,36 +3484,35 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)
switch (nfc->flow_type) { switch (nfc->flow_type) {
case TCP_V4_FLOW: case TCP_V4_FLOW:
flow_pctype = I40E_FILTER_PCTYPE_NONF_IPV4_TCP; set_bit(I40E_FILTER_PCTYPE_NONF_IPV4_TCP, flow_pctypes);
if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE)
hena |= set_bit(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK,
BIT_ULL(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK); flow_pctypes);
break; break;
case TCP_V6_FLOW: case TCP_V6_FLOW:
flow_pctype = I40E_FILTER_PCTYPE_NONF_IPV6_TCP; set_bit(I40E_FILTER_PCTYPE_NONF_IPV6_TCP, flow_pctypes);
if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE)
hena |= set_bit(I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK,
BIT_ULL(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK); flow_pctypes);
if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE)
hena |=
BIT_ULL(I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
break; break;
case UDP_V4_FLOW: case UDP_V4_FLOW:
flow_pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP; set_bit(I40E_FILTER_PCTYPE_NONF_IPV4_UDP, flow_pctypes);
if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) {
hena |= set_bit(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP,
BIT_ULL(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | flow_pctypes);
BIT_ULL(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP); set_bit(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP,
flow_pctypes);
}
hena |= BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV4); hena |= BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV4);
break; break;
case UDP_V6_FLOW: case UDP_V6_FLOW:
flow_pctype = I40E_FILTER_PCTYPE_NONF_IPV6_UDP; set_bit(I40E_FILTER_PCTYPE_NONF_IPV6_UDP, flow_pctypes);
if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) if (pf->hw_features & I40E_HW_MULTIPLE_TCP_UDP_RSS_PCTYPE) {
hena |= set_bit(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP,
BIT_ULL(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | flow_pctypes);
BIT_ULL(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP); set_bit(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP,
flow_pctypes);
}
hena |= BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6); hena |= BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6);
break; break;
case AH_ESP_V4_FLOW: case AH_ESP_V4_FLOW:
@ -3528,17 +3545,20 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)
return -EINVAL; return -EINVAL;
} }
if (flow_pctype) { if (bitmap_weight(flow_pctypes, FLOW_PCTYPES_SIZE)) {
i_setc = (u64)i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(0, u8 flow_id;
flow_pctype)) |
((u64)i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, for_each_set_bit(flow_id, flow_pctypes, FLOW_PCTYPES_SIZE) {
flow_pctype)) << 32); i_setc = (u64)i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(0, flow_id)) |
i_set = i40e_get_rss_hash_bits(nfc, i_setc); ((u64)i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, flow_id)) << 32);
i40e_write_rx_ctl(hw, I40E_GLQF_HASH_INSET(0, flow_pctype), i_set = i40e_get_rss_hash_bits(&pf->hw, nfc, i_setc);
(u32)i_set);
i40e_write_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, flow_pctype), i40e_write_rx_ctl(hw, I40E_GLQF_HASH_INSET(0, flow_id),
(u32)(i_set >> 32)); (u32)i_set);
hena |= BIT_ULL(flow_pctype); i40e_write_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, flow_id),
(u32)(i_set >> 32));
hena |= BIT_ULL(flow_id);
}
} }
i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (u32)hena); i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (u32)hena);

View file

@ -1404,6 +1404,10 @@ struct i40e_lldp_variables {
#define I40E_PFQF_CTL_0_HASHLUTSIZE_512 0x00010000 #define I40E_PFQF_CTL_0_HASHLUTSIZE_512 0x00010000
/* INPUT SET MASK for RSS, flow director, and flexible payload */ /* INPUT SET MASK for RSS, flow director, and flexible payload */
#define I40E_X722_L3_SRC_SHIFT 49
#define I40E_X722_L3_SRC_MASK (0x3ULL << I40E_X722_L3_SRC_SHIFT)
#define I40E_X722_L3_DST_SHIFT 41
#define I40E_X722_L3_DST_MASK (0x3ULL << I40E_X722_L3_DST_SHIFT)
#define I40E_L3_SRC_SHIFT 47 #define I40E_L3_SRC_SHIFT 47
#define I40E_L3_SRC_MASK (0x3ULL << I40E_L3_SRC_SHIFT) #define I40E_L3_SRC_MASK (0x3ULL << I40E_L3_SRC_SHIFT)
#define I40E_L3_V6_SRC_SHIFT 43 #define I40E_L3_V6_SRC_SHIFT 43

View file

@ -1483,10 +1483,12 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state)) if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state))
return true; return true;
/* If the VFs have been disabled, this means something else is /* Bail out if VFs are disabled. */
* resetting the VF, so we shouldn't continue. if (test_bit(__I40E_VF_DISABLE, pf->state))
*/ return true;
if (test_and_set_bit(__I40E_VF_DISABLE, pf->state))
/* If VF is being reset already we don't need to continue. */
if (test_and_set_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
return true; return true;
i40e_trigger_vf_reset(vf, flr); i40e_trigger_vf_reset(vf, flr);
@ -1523,7 +1525,7 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
i40e_cleanup_reset_vf(vf); i40e_cleanup_reset_vf(vf);
i40e_flush(hw); i40e_flush(hw);
clear_bit(__I40E_VF_DISABLE, pf->state); clear_bit(I40E_VF_STATE_RESETTING, &vf->vf_states);
return true; return true;
} }
@ -1556,8 +1558,12 @@ bool i40e_reset_all_vfs(struct i40e_pf *pf, bool flr)
return false; return false;
/* Begin reset on all VFs at once */ /* Begin reset on all VFs at once */
for (v = 0; v < pf->num_alloc_vfs; v++) for (v = 0; v < pf->num_alloc_vfs; v++) {
i40e_trigger_vf_reset(&pf->vf[v], flr); vf = &pf->vf[v];
/* If VF is being reset no need to trigger reset again */
if (!test_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
i40e_trigger_vf_reset(&pf->vf[v], flr);
}
/* HW requires some time to make sure it can flush the FIFO for a VF /* HW requires some time to make sure it can flush the FIFO for a VF
* when it resets it. Poll the VPGEN_VFRSTAT register for each VF in * when it resets it. Poll the VPGEN_VFRSTAT register for each VF in
@ -1573,9 +1579,11 @@ bool i40e_reset_all_vfs(struct i40e_pf *pf, bool flr)
*/ */
while (v < pf->num_alloc_vfs) { while (v < pf->num_alloc_vfs) {
vf = &pf->vf[v]; vf = &pf->vf[v];
reg = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_id)); if (!test_bit(I40E_VF_STATE_RESETTING, &vf->vf_states)) {
if (!(reg & I40E_VPGEN_VFRSTAT_VFRD_MASK)) reg = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_id));
break; if (!(reg & I40E_VPGEN_VFRSTAT_VFRD_MASK))
break;
}
/* If the current VF has finished resetting, move on /* If the current VF has finished resetting, move on
* to the next VF in sequence. * to the next VF in sequence.
@ -1603,6 +1611,10 @@ bool i40e_reset_all_vfs(struct i40e_pf *pf, bool flr)
if (pf->vf[v].lan_vsi_idx == 0) if (pf->vf[v].lan_vsi_idx == 0)
continue; continue;
/* If VF is reset in another thread just continue */
if (test_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
continue;
i40e_vsi_stop_rings_no_wait(pf->vsi[pf->vf[v].lan_vsi_idx]); i40e_vsi_stop_rings_no_wait(pf->vsi[pf->vf[v].lan_vsi_idx]);
} }
@ -1614,6 +1626,10 @@ bool i40e_reset_all_vfs(struct i40e_pf *pf, bool flr)
if (pf->vf[v].lan_vsi_idx == 0) if (pf->vf[v].lan_vsi_idx == 0)
continue; continue;
/* If VF is reset in another thread just continue */
if (test_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
continue;
i40e_vsi_wait_queues_disabled(pf->vsi[pf->vf[v].lan_vsi_idx]); i40e_vsi_wait_queues_disabled(pf->vsi[pf->vf[v].lan_vsi_idx]);
} }
@ -1623,8 +1639,13 @@ bool i40e_reset_all_vfs(struct i40e_pf *pf, bool flr)
mdelay(50); mdelay(50);
/* Finish the reset on each VF */ /* Finish the reset on each VF */
for (v = 0; v < pf->num_alloc_vfs; v++) for (v = 0; v < pf->num_alloc_vfs; v++) {
/* If VF is reset in another thread just continue */
if (test_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
continue;
i40e_cleanup_reset_vf(&pf->vf[v]); i40e_cleanup_reset_vf(&pf->vf[v]);
}
i40e_flush(hw); i40e_flush(hw);
clear_bit(__I40E_VF_DISABLE, pf->state); clear_bit(__I40E_VF_DISABLE, pf->state);

View file

@ -39,6 +39,7 @@ enum i40e_vf_states {
I40E_VF_STATE_MC_PROMISC, I40E_VF_STATE_MC_PROMISC,
I40E_VF_STATE_UC_PROMISC, I40E_VF_STATE_UC_PROMISC,
I40E_VF_STATE_PRE_ENABLE, I40E_VF_STATE_PRE_ENABLE,
I40E_VF_STATE_RESETTING
}; };
/* VF capabilities */ /* VF capabilities */

View file

@ -466,7 +466,6 @@ ltq_etop_tx(struct sk_buff *skb, struct net_device *dev)
len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len; len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) { if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) {
dev_kfree_skb_any(skb);
netdev_err(dev, "tx ring full\n"); netdev_err(dev, "tx ring full\n");
netif_tx_stop_queue(txq); netif_tx_stop_queue(txq);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;

View file

@ -1853,7 +1853,7 @@ void mlx5_cmd_init_async_ctx(struct mlx5_core_dev *dev,
ctx->dev = dev; ctx->dev = dev;
/* Starts at 1 to avoid doing wake_up if we are not cleaning up */ /* Starts at 1 to avoid doing wake_up if we are not cleaning up */
atomic_set(&ctx->num_inflight, 1); atomic_set(&ctx->num_inflight, 1);
init_waitqueue_head(&ctx->wait); init_completion(&ctx->inflight_done);
} }
EXPORT_SYMBOL(mlx5_cmd_init_async_ctx); EXPORT_SYMBOL(mlx5_cmd_init_async_ctx);
@ -1867,8 +1867,8 @@ EXPORT_SYMBOL(mlx5_cmd_init_async_ctx);
*/ */
void mlx5_cmd_cleanup_async_ctx(struct mlx5_async_ctx *ctx) void mlx5_cmd_cleanup_async_ctx(struct mlx5_async_ctx *ctx)
{ {
atomic_dec(&ctx->num_inflight); if (!atomic_dec_and_test(&ctx->num_inflight))
wait_event(ctx->wait, atomic_read(&ctx->num_inflight) == 0); wait_for_completion(&ctx->inflight_done);
} }
EXPORT_SYMBOL(mlx5_cmd_cleanup_async_ctx); EXPORT_SYMBOL(mlx5_cmd_cleanup_async_ctx);
@ -1879,7 +1879,7 @@ static void mlx5_cmd_exec_cb_handler(int status, void *_work)
work->user_callback(status, work); work->user_callback(status, work);
if (atomic_dec_and_test(&ctx->num_inflight)) if (atomic_dec_and_test(&ctx->num_inflight))
wake_up(&ctx->wait); complete(&ctx->inflight_done);
} }
int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size, int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size,
@ -1895,7 +1895,7 @@ int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size,
ret = cmd_exec(ctx->dev, in, in_size, out, out_size, ret = cmd_exec(ctx->dev, in, in_size, out, out_size,
mlx5_cmd_exec_cb_handler, work, false); mlx5_cmd_exec_cb_handler, work, false);
if (ret && atomic_dec_and_test(&ctx->num_inflight)) if (ret && atomic_dec_and_test(&ctx->num_inflight))
wake_up(&ctx->wait); complete(&ctx->inflight_done);
return ret; return ret;
} }

View file

@ -113,7 +113,6 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry)
struct xfrm_replay_state_esn *replay_esn; struct xfrm_replay_state_esn *replay_esn;
u32 seq_bottom = 0; u32 seq_bottom = 0;
u8 overlap; u8 overlap;
u32 *esn;
if (!(sa_entry->x->props.flags & XFRM_STATE_ESN)) { if (!(sa_entry->x->props.flags & XFRM_STATE_ESN)) {
sa_entry->esn_state.trigger = 0; sa_entry->esn_state.trigger = 0;
@ -128,11 +127,9 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry)
sa_entry->esn_state.esn = xfrm_replay_seqhi(sa_entry->x, sa_entry->esn_state.esn = xfrm_replay_seqhi(sa_entry->x,
htonl(seq_bottom)); htonl(seq_bottom));
esn = &sa_entry->esn_state.esn;
sa_entry->esn_state.trigger = 1; sa_entry->esn_state.trigger = 1;
if (unlikely(overlap && seq_bottom < MLX5E_IPSEC_ESN_SCOPE_MID)) { if (unlikely(overlap && seq_bottom < MLX5E_IPSEC_ESN_SCOPE_MID)) {
++(*esn);
sa_entry->esn_state.overlap = 0; sa_entry->esn_state.overlap = 0;
return true; return true;
} else if (unlikely(!overlap && } else if (unlikely(!overlap &&

View file

@ -122,7 +122,7 @@ void mlx5_mpfs_cleanup(struct mlx5_core_dev *dev)
{ {
struct mlx5_mpfs *mpfs = dev->priv.mpfs; struct mlx5_mpfs *mpfs = dev->priv.mpfs;
if (!MLX5_ESWITCH_MANAGER(dev)) if (!mpfs)
return; return;
WARN_ON(!hlist_empty(mpfs->hash)); WARN_ON(!hlist_empty(mpfs->hash));
@ -137,7 +137,7 @@ int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac)
int err = 0; int err = 0;
u32 index; u32 index;
if (!MLX5_ESWITCH_MANAGER(dev)) if (!mpfs)
return 0; return 0;
mutex_lock(&mpfs->lock); mutex_lock(&mpfs->lock);
@ -185,7 +185,7 @@ int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac)
int err = 0; int err = 0;
u32 index; u32 index;
if (!MLX5_ESWITCH_MANAGER(dev)) if (!mpfs)
return 0; return 0;
mutex_lock(&mpfs->lock); mutex_lock(&mpfs->lock);

View file

@ -6923,7 +6923,7 @@ static int pcidev_init(struct pci_dev *pdev, const struct pci_device_id *id)
char banner[sizeof(version)]; char banner[sizeof(version)];
struct ksz_switch *sw = NULL; struct ksz_switch *sw = NULL;
result = pci_enable_device(pdev); result = pcim_enable_device(pdev);
if (result) if (result)
return result; return result;

View file

@ -1958,11 +1958,13 @@ static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
ret = PTR_ERR(priv->phydev); ret = PTR_ERR(priv->phydev);
dev_err(priv->dev, "get_phy_device err(%d)\n", ret); dev_err(priv->dev, "get_phy_device err(%d)\n", ret);
priv->phydev = NULL; priv->phydev = NULL;
mdiobus_unregister(bus);
return -ENODEV; return -ENODEV;
} }
ret = phy_device_register(priv->phydev); ret = phy_device_register(priv->phydev);
if (ret) { if (ret) {
phy_device_free(priv->phydev);
mdiobus_unregister(bus); mdiobus_unregister(bus);
dev_err(priv->dev, dev_err(priv->dev,
"phy_device_register err(%d)\n", ret); "phy_device_register err(%d)\n", ret);

View file

@ -3262,11 +3262,34 @@ struct fc_function_template qla2xxx_transport_vport_functions = {
.bsg_timeout = qla24xx_bsg_timeout, .bsg_timeout = qla24xx_bsg_timeout,
}; };
static uint
qla2x00_get_host_supported_speeds(scsi_qla_host_t *vha, uint speeds)
{
uint supported_speeds = FC_PORTSPEED_UNKNOWN;
if (speeds & FDMI_PORT_SPEED_64GB)
supported_speeds |= FC_PORTSPEED_64GBIT;
if (speeds & FDMI_PORT_SPEED_32GB)
supported_speeds |= FC_PORTSPEED_32GBIT;
if (speeds & FDMI_PORT_SPEED_16GB)
supported_speeds |= FC_PORTSPEED_16GBIT;
if (speeds & FDMI_PORT_SPEED_8GB)
supported_speeds |= FC_PORTSPEED_8GBIT;
if (speeds & FDMI_PORT_SPEED_4GB)
supported_speeds |= FC_PORTSPEED_4GBIT;
if (speeds & FDMI_PORT_SPEED_2GB)
supported_speeds |= FC_PORTSPEED_2GBIT;
if (speeds & FDMI_PORT_SPEED_1GB)
supported_speeds |= FC_PORTSPEED_1GBIT;
return supported_speeds;
}
void void
qla2x00_init_host_attr(scsi_qla_host_t *vha) qla2x00_init_host_attr(scsi_qla_host_t *vha)
{ {
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
u32 speeds = FC_PORTSPEED_UNKNOWN; u32 speeds = 0, fdmi_speed = 0;
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count; fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@ -3276,7 +3299,8 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
speeds = qla25xx_fdmi_port_speed_capability(ha); fdmi_speed = qla25xx_fdmi_port_speed_capability(ha);
speeds = qla2x00_get_host_supported_speeds(vha, fdmi_speed);
fc_host_supported_speeds(vha->host) = speeds; fc_host_supported_speeds(vha->host) = speeds;
} }

View file

@ -1074,6 +1074,7 @@ static blk_status_t sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
struct bio *bio = rq->bio; struct bio *bio = rq->bio;
u64 lba = sectors_to_logical(sdp, blk_rq_pos(rq)); u64 lba = sectors_to_logical(sdp, blk_rq_pos(rq));
u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq)); u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
unsigned int nr_bytes = blk_rq_bytes(rq);
blk_status_t ret; blk_status_t ret;
if (sdkp->device->no_write_same) if (sdkp->device->no_write_same)
@ -1110,7 +1111,7 @@ static blk_status_t sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
*/ */
rq->__data_len = sdp->sector_size; rq->__data_len = sdp->sector_size;
ret = scsi_alloc_sgtables(cmd); ret = scsi_alloc_sgtables(cmd);
rq->__data_len = blk_rq_bytes(rq); rq->__data_len = nr_bytes;
return ret; return ret;
} }

View file

@ -342,6 +342,9 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
omap8250_update_mdr1(up, priv); omap8250_update_mdr1(up, priv);
up->port.ops->set_mctrl(&up->port, up->port.mctrl); up->port.ops->set_mctrl(&up->port, up->port.mctrl);
if (up->port.rs485.flags & SER_RS485_ENABLED)
serial8250_em485_stop_tx(up);
} }
/* /*

View file

@ -1531,7 +1531,6 @@ static int pci_fintek_init(struct pci_dev *dev)
resource_size_t bar_data[3]; resource_size_t bar_data[3];
u8 config_base; u8 config_base;
struct serial_private *priv = pci_get_drvdata(dev); struct serial_private *priv = pci_get_drvdata(dev);
struct uart_8250_port *port;
if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) || if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
!(pci_resource_flags(dev, 4) & IORESOURCE_IO) || !(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
@ -1578,13 +1577,7 @@ static int pci_fintek_init(struct pci_dev *dev)
pci_write_config_byte(dev, config_base + 0x06, dev->irq); pci_write_config_byte(dev, config_base + 0x06, dev->irq);
if (priv) { if (!priv) {
/* re-apply RS232/485 mode when
* pciserial_resume_ports()
*/
port = serial8250_get_port(priv->line[i]);
pci_fintek_rs485_config(&port->port, NULL);
} else {
/* First init without port data /* First init without port data
* force init to RS232 Mode * force init to RS232 Mode
*/ */

View file

@ -592,7 +592,7 @@ EXPORT_SYMBOL_GPL(serial8250_rpm_put);
static int serial8250_em485_init(struct uart_8250_port *p) static int serial8250_em485_init(struct uart_8250_port *p)
{ {
if (p->em485) if (p->em485)
return 0; goto deassert_rts;
p->em485 = kmalloc(sizeof(struct uart_8250_em485), GFP_ATOMIC); p->em485 = kmalloc(sizeof(struct uart_8250_em485), GFP_ATOMIC);
if (!p->em485) if (!p->em485)
@ -608,7 +608,9 @@ static int serial8250_em485_init(struct uart_8250_port *p)
p->em485->active_timer = NULL; p->em485->active_timer = NULL;
p->em485->tx_stopped = true; p->em485->tx_stopped = true;
p->rs485_stop_tx(p); deassert_rts:
if (p->em485->tx_stopped)
p->rs485_stop_tx(p);
return 0; return 0;
} }
@ -2030,6 +2032,9 @@ EXPORT_SYMBOL_GPL(serial8250_do_set_mctrl);
static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
{ {
if (port->rs485.flags & SER_RS485_ENABLED)
return;
if (port->set_mctrl) if (port->set_mctrl)
port->set_mctrl(port, mctrl); port->set_mctrl(port, mctrl);
else else
@ -3159,9 +3164,6 @@ static void serial8250_config_port(struct uart_port *port, int flags)
if (flags & UART_CONFIG_TYPE) if (flags & UART_CONFIG_TYPE)
autoconfig(up); autoconfig(up);
if (port->rs485.flags & SER_RS485_ENABLED)
port->rs485_config(port, &port->rs485);
/* if access method is AU, it is a 16550 with a quirk */ /* if access method is AU, it is a 16550 with a quirk */
if (port->type == PORT_16550A && port->iotype == UPIO_AU) if (port->type == PORT_16550A && port->iotype == UPIO_AU)
up->bugs |= UART_BUG_NOMSR; up->bugs |= UART_BUG_NOMSR;

View file

@ -2669,10 +2669,6 @@ static int lpuart_probe(struct platform_device *pdev)
if (ret) if (ret)
goto failed_irq_request; goto failed_irq_request;
ret = uart_add_one_port(&lpuart_reg, &sport->port);
if (ret)
goto failed_attach_port;
ret = uart_get_rs485_mode(&sport->port); ret = uart_get_rs485_mode(&sport->port);
if (ret) if (ret)
goto failed_get_rs485; goto failed_get_rs485;
@ -2684,7 +2680,9 @@ static int lpuart_probe(struct platform_device *pdev)
sport->port.rs485.delay_rts_after_send) sport->port.rs485.delay_rts_after_send)
dev_err(&pdev->dev, "driver doesn't support RTS delays\n"); dev_err(&pdev->dev, "driver doesn't support RTS delays\n");
sport->port.rs485_config(&sport->port, &sport->port.rs485); ret = uart_add_one_port(&lpuart_reg, &sport->port);
if (ret)
goto failed_attach_port;
return 0; return 0;

View file

@ -398,8 +398,7 @@ static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2)
{ {
*ucr2 &= ~(UCR2_CTSC | UCR2_CTS); *ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
sport->port.mctrl |= TIOCM_RTS; mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS);
mctrl_gpio_set(sport->gpios, sport->port.mctrl);
} }
/* called with port.lock taken and irqs caller dependent */ /* called with port.lock taken and irqs caller dependent */
@ -408,8 +407,7 @@ static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2)
*ucr2 &= ~UCR2_CTSC; *ucr2 &= ~UCR2_CTSC;
*ucr2 |= UCR2_CTS; *ucr2 |= UCR2_CTS;
sport->port.mctrl &= ~TIOCM_RTS; mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS);
mctrl_gpio_set(sport->gpios, sport->port.mctrl);
} }
static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec) static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec)
@ -2381,8 +2379,6 @@ static int imx_uart_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"low-active RTS not possible when receiver is off, enabling receiver\n"); "low-active RTS not possible when receiver is off, enabling receiver\n");
imx_uart_rs485_config(&sport->port, &sport->port.rs485);
/* Disable interrupts before requesting them */ /* Disable interrupts before requesting them */
ucr1 = imx_uart_readl(sport, UCR1); ucr1 = imx_uart_readl(sport, UCR1);
ucr1 &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN | UCR1_RTSDEN); ucr1 &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN | UCR1_RTSDEN);

View file

@ -42,6 +42,11 @@ static struct lock_class_key port_lock_key;
#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) #define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8)
/*
* Max time with active RTS before/after data is sent.
*/
#define RS485_MAX_RTS_DELAY 100 /* msecs */
static void uart_change_speed(struct tty_struct *tty, struct uart_state *state, static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
struct ktermios *old_termios); struct ktermios *old_termios);
static void uart_wait_until_sent(struct tty_struct *tty, int timeout); static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
@ -144,15 +149,10 @@ uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
unsigned long flags; unsigned long flags;
unsigned int old; unsigned int old;
if (port->rs485.flags & SER_RS485_ENABLED) {
set &= ~TIOCM_RTS;
clear &= ~TIOCM_RTS;
}
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
old = port->mctrl; old = port->mctrl;
port->mctrl = (old & ~clear) | set; port->mctrl = (old & ~clear) | set;
if (old != port->mctrl) if (old != port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED))
port->ops->set_mctrl(port, port->mctrl); port->ops->set_mctrl(port, port->mctrl);
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
} }
@ -1319,8 +1319,41 @@ static int uart_set_rs485_config(struct uart_port *port,
if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
return -EFAULT; return -EFAULT;
/* pick sane settings if the user hasn't */
if (!(rs485.flags & SER_RS485_RTS_ON_SEND) ==
!(rs485.flags & SER_RS485_RTS_AFTER_SEND)) {
dev_warn_ratelimited(port->dev,
"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n",
port->name, port->line);
rs485.flags |= SER_RS485_RTS_ON_SEND;
rs485.flags &= ~SER_RS485_RTS_AFTER_SEND;
}
if (rs485.delay_rts_before_send > RS485_MAX_RTS_DELAY) {
rs485.delay_rts_before_send = RS485_MAX_RTS_DELAY;
dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay before sending clamped to %u ms\n",
port->name, port->line, rs485.delay_rts_before_send);
}
if (rs485.delay_rts_after_send > RS485_MAX_RTS_DELAY) {
rs485.delay_rts_after_send = RS485_MAX_RTS_DELAY;
dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay after sending clamped to %u ms\n",
port->name, port->line, rs485.delay_rts_after_send);
}
/* Return clean padding area to userspace */
memset(rs485.padding, 0, sizeof(rs485.padding));
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
ret = port->rs485_config(port, &rs485); ret = port->rs485_config(port, &rs485);
if (!ret) {
port->rs485 = rs485;
/* Reset RTS and other mctrl lines when disabling RS485 */
if (!(rs485.flags & SER_RS485_ENABLED))
port->ops->set_mctrl(port, port->mctrl);
}
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
if (ret) if (ret)
return ret; return ret;
@ -2290,7 +2323,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
uart_change_pm(state, UART_PM_STATE_ON); uart_change_pm(state, UART_PM_STATE_ON);
spin_lock_irq(&uport->lock); spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, 0); if (!(uport->rs485.flags & SER_RS485_ENABLED))
ops->set_mctrl(uport, 0);
spin_unlock_irq(&uport->lock); spin_unlock_irq(&uport->lock);
if (console_suspend_enabled || !uart_console(uport)) { if (console_suspend_enabled || !uart_console(uport)) {
/* Protected by port mutex for now */ /* Protected by port mutex for now */
@ -2301,7 +2335,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
if (tty) if (tty)
uart_change_speed(tty, state, NULL); uart_change_speed(tty, state, NULL);
spin_lock_irq(&uport->lock); spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, uport->mctrl); if (!(uport->rs485.flags & SER_RS485_ENABLED))
ops->set_mctrl(uport, uport->mctrl);
else
uport->rs485_config(uport, &uport->rs485);
ops->start_tx(uport); ops->start_tx(uport);
spin_unlock_irq(&uport->lock); spin_unlock_irq(&uport->lock);
tty_port_set_initialized(port, 1); tty_port_set_initialized(port, 1);
@ -2399,10 +2436,10 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
*/ */
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
port->mctrl &= TIOCM_DTR; port->mctrl &= TIOCM_DTR;
if (port->rs485.flags & SER_RS485_ENABLED && if (!(port->rs485.flags & SER_RS485_ENABLED))
!(port->rs485.flags & SER_RS485_RTS_AFTER_SEND)) port->ops->set_mctrl(port, port->mctrl);
port->mctrl |= TIOCM_RTS; else
port->ops->set_mctrl(port, port->mctrl); port->rs485_config(port, &port->rs485);
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
/* /*

View file

@ -388,6 +388,15 @@ static const struct usb_device_id usb_quirk_list[] = {
/* Kingston DataTraveler 3.0 */ /* Kingston DataTraveler 3.0 */
{ USB_DEVICE(0x0951, 0x1666), .driver_info = USB_QUIRK_NO_LPM }, { USB_DEVICE(0x0951, 0x1666), .driver_info = USB_QUIRK_NO_LPM },
/* NVIDIA Jetson devices in Force Recovery mode */
{ USB_DEVICE(0x0955, 0x7018), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7019), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7418), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7721), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7c18), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7e19), .driver_info = USB_QUIRK_RESET_RESUME },
{ USB_DEVICE(0x0955, 0x7f21), .driver_info = USB_QUIRK_RESET_RESUME },
/* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */ /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
{ USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF }, { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },

View file

@ -1262,8 +1262,8 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS; trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS;
} }
/* always enable Interrupt on Missed ISOC */ if (!no_interrupt && !chain)
trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
break; break;
case USB_ENDPOINT_XFER_BULK: case USB_ENDPOINT_XFER_BULK:
@ -3177,6 +3177,10 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
if (event->status & DEPEVT_STATUS_SHORT && !chain) if (event->status & DEPEVT_STATUS_SHORT && !chain)
return 1; return 1;
if ((trb->ctrl & DWC3_TRB_CTRL_ISP_IMI) &&
DWC3_TRB_SIZE_TRBSTS(trb->size) == DWC3_TRBSTS_MISSED_ISOC)
return 1;
if ((trb->ctrl & DWC3_TRB_CTRL_IOC) || if ((trb->ctrl & DWC3_TRB_CTRL_IOC) ||
(trb->ctrl & DWC3_TRB_CTRL_LST)) (trb->ctrl & DWC3_TRB_CTRL_LST))
return 1; return 1;

View file

@ -151,6 +151,7 @@ static void bdc_uspc_disconnected(struct bdc *bdc, bool reinit)
bdc->delayed_status = false; bdc->delayed_status = false;
bdc->reinit = reinit; bdc->reinit = reinit;
bdc->test_mode = false; bdc->test_mode = false;
usb_gadget_set_state(&bdc->gadget, USB_STATE_NOTATTACHED);
} }
/* TNotify wkaeup timer */ /* TNotify wkaeup timer */

View file

@ -970,15 +970,19 @@ void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id)
if (dev->eps[i].stream_info) if (dev->eps[i].stream_info)
xhci_free_stream_info(xhci, xhci_free_stream_info(xhci,
dev->eps[i].stream_info); dev->eps[i].stream_info);
/* Endpoints on the TT/root port lists should have been removed /*
* when usb_disable_device() was called for the device. * Endpoints are normally deleted from the bandwidth list when
* We can't drop them anyway, because the udev might have gone * endpoints are dropped, before device is freed.
* away by this point, and we can't tell what speed it was. * If host is dying or being removed then endpoints aren't
* dropped cleanly, so delete the endpoint from list here.
* Only applicable for hosts with software bandwidth checking.
*/ */
if (!list_empty(&dev->eps[i].bw_endpoint_list))
xhci_warn(xhci, "Slot %u endpoint %u " if (!list_empty(&dev->eps[i].bw_endpoint_list)) {
"not removed from BW list!\n", list_del_init(&dev->eps[i].bw_endpoint_list);
slot_id, i); xhci_dbg(xhci, "Slot %u endpoint %u not removed from BW list!\n",
slot_id, i);
}
} }
/* If this is a hub, free the TT(s) from the TT list */ /* If this is a hub, free the TT(s) from the TT list */
xhci_free_tt_info(xhci, dev, slot_id); xhci_free_tt_info(xhci, dev, slot_id);

View file

@ -253,6 +253,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI)) pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI))
xhci->quirks |= XHCI_MISSING_CAS; xhci->quirks |= XHCI_MISSING_CAS;
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI)
xhci->quirks |= XHCI_RESET_TO_DEFAULT;
if (pdev->vendor == PCI_VENDOR_ID_INTEL && if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
(pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_XHCI || (pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_XHCI ||
pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_XHCI ||
@ -302,8 +306,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
} }
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) {
/*
* try to tame the ASMedia 1042 controller which reports 0.96
* but appears to behave more like 1.0
*/
xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
xhci->quirks |= XHCI_BROKEN_STREAMS; xhci->quirks |= XHCI_BROKEN_STREAMS;
}
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) { pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) {
xhci->quirks |= XHCI_TRUST_TX_LENGTH; xhci->quirks |= XHCI_TRUST_TX_LENGTH;

View file

@ -791,9 +791,15 @@ void xhci_shutdown(struct usb_hcd *hcd)
spin_lock_irq(&xhci->lock); spin_lock_irq(&xhci->lock);
xhci_halt(xhci); xhci_halt(xhci);
/* Workaround for spurious wakeups at shutdown with HSW */
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) /*
* Workaround for spurious wakeps at shutdown with HSW, and for boot
* firmware delay in ADL-P PCH if port are left in U3 at shutdown
*/
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP ||
xhci->quirks & XHCI_RESET_TO_DEFAULT)
xhci_reset(xhci, XHCI_RESET_SHORT_USEC); xhci_reset(xhci, XHCI_RESET_SHORT_USEC);
spin_unlock_irq(&xhci->lock); spin_unlock_irq(&xhci->lock);
xhci_cleanup_msix(xhci); xhci_cleanup_msix(xhci);

View file

@ -1907,6 +1907,7 @@ struct xhci_hcd {
#define XHCI_NO_SOFT_RETRY BIT_ULL(40) #define XHCI_NO_SOFT_RETRY BIT_ULL(40)
#define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42) #define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42)
#define XHCI_SUSPEND_RESUME_CLKS BIT_ULL(43) #define XHCI_SUSPEND_RESUME_CLKS BIT_ULL(43)
#define XHCI_RESET_TO_DEFAULT BIT_ULL(44)
unsigned int num_active_eps; unsigned int num_active_eps;
unsigned int limit_active_eps; unsigned int limit_active_eps;

View file

@ -97,7 +97,6 @@ struct ufx_data {
struct kref kref; struct kref kref;
int fb_count; int fb_count;
bool virtualized; /* true when physical usb device not present */ bool virtualized; /* true when physical usb device not present */
struct delayed_work free_framebuffer_work;
atomic_t usb_active; /* 0 = update virtual buffer, but no usb traffic */ atomic_t usb_active; /* 0 = update virtual buffer, but no usb traffic */
atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */ atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
u8 *edid; /* null until we read edid from hw or get from sysfs */ u8 *edid; /* null until we read edid from hw or get from sysfs */
@ -1116,15 +1115,24 @@ static void ufx_free(struct kref *kref)
{ {
struct ufx_data *dev = container_of(kref, struct ufx_data, kref); struct ufx_data *dev = container_of(kref, struct ufx_data, kref);
/* this function will wait for all in-flight urbs to complete */
if (dev->urbs.count > 0)
ufx_free_urb_list(dev);
pr_debug("freeing ufx_data %p", dev);
kfree(dev); kfree(dev);
} }
static void ufx_ops_destory(struct fb_info *info)
{
struct ufx_data *dev = info->par;
int node = info->node;
/* Assume info structure is freed after this point */
framebuffer_release(info);
pr_debug("fb_info for /dev/fb%d has been freed", node);
/* release reference taken by kref_init in probe() */
kref_put(&dev->kref, ufx_free);
}
static void ufx_release_urb_work(struct work_struct *work) static void ufx_release_urb_work(struct work_struct *work)
{ {
struct urb_node *unode = container_of(work, struct urb_node, struct urb_node *unode = container_of(work, struct urb_node,
@ -1133,14 +1141,9 @@ static void ufx_release_urb_work(struct work_struct *work)
up(&unode->dev->urbs.limit_sem); up(&unode->dev->urbs.limit_sem);
} }
static void ufx_free_framebuffer_work(struct work_struct *work) static void ufx_free_framebuffer(struct ufx_data *dev)
{ {
struct ufx_data *dev = container_of(work, struct ufx_data,
free_framebuffer_work.work);
struct fb_info *info = dev->info; struct fb_info *info = dev->info;
int node = info->node;
unregister_framebuffer(info);
if (info->cmap.len != 0) if (info->cmap.len != 0)
fb_dealloc_cmap(&info->cmap); fb_dealloc_cmap(&info->cmap);
@ -1152,11 +1155,6 @@ static void ufx_free_framebuffer_work(struct work_struct *work)
dev->info = NULL; dev->info = NULL;
/* Assume info structure is freed after this point */
framebuffer_release(info);
pr_debug("fb_info for /dev/fb%d has been freed", node);
/* ref taken in probe() as part of registering framebfufer */ /* ref taken in probe() as part of registering framebfufer */
kref_put(&dev->kref, ufx_free); kref_put(&dev->kref, ufx_free);
} }
@ -1168,11 +1166,13 @@ static int ufx_ops_release(struct fb_info *info, int user)
{ {
struct ufx_data *dev = info->par; struct ufx_data *dev = info->par;
mutex_lock(&disconnect_mutex);
dev->fb_count--; dev->fb_count--;
/* We can't free fb_info here - fbmem will touch it when we return */ /* We can't free fb_info here - fbmem will touch it when we return */
if (dev->virtualized && (dev->fb_count == 0)) if (dev->virtualized && (dev->fb_count == 0))
schedule_delayed_work(&dev->free_framebuffer_work, HZ); ufx_free_framebuffer(dev);
if ((dev->fb_count == 0) && (info->fbdefio)) { if ((dev->fb_count == 0) && (info->fbdefio)) {
fb_deferred_io_cleanup(info); fb_deferred_io_cleanup(info);
@ -1185,6 +1185,8 @@ static int ufx_ops_release(struct fb_info *info, int user)
kref_put(&dev->kref, ufx_free); kref_put(&dev->kref, ufx_free);
mutex_unlock(&disconnect_mutex);
return 0; return 0;
} }
@ -1291,6 +1293,7 @@ static const struct fb_ops ufx_ops = {
.fb_blank = ufx_ops_blank, .fb_blank = ufx_ops_blank,
.fb_check_var = ufx_ops_check_var, .fb_check_var = ufx_ops_check_var,
.fb_set_par = ufx_ops_set_par, .fb_set_par = ufx_ops_set_par,
.fb_destroy = ufx_ops_destory,
}; };
/* Assumes &info->lock held by caller /* Assumes &info->lock held by caller
@ -1672,9 +1675,6 @@ static int ufx_usb_probe(struct usb_interface *interface,
goto destroy_modedb; goto destroy_modedb;
} }
INIT_DELAYED_WORK(&dev->free_framebuffer_work,
ufx_free_framebuffer_work);
retval = ufx_reg_read(dev, 0x3000, &id_rev); retval = ufx_reg_read(dev, 0x3000, &id_rev);
check_warn_goto_error(retval, "error %d reading 0x3000 register from device", retval); check_warn_goto_error(retval, "error %d reading 0x3000 register from device", retval);
dev_dbg(dev->gdev, "ID_REV register value 0x%08x", id_rev); dev_dbg(dev->gdev, "ID_REV register value 0x%08x", id_rev);
@ -1747,10 +1747,12 @@ e_nomem:
static void ufx_usb_disconnect(struct usb_interface *interface) static void ufx_usb_disconnect(struct usb_interface *interface)
{ {
struct ufx_data *dev; struct ufx_data *dev;
struct fb_info *info;
mutex_lock(&disconnect_mutex); mutex_lock(&disconnect_mutex);
dev = usb_get_intfdata(interface); dev = usb_get_intfdata(interface);
info = dev->info;
pr_debug("USB disconnect starting\n"); pr_debug("USB disconnect starting\n");
@ -1764,12 +1766,15 @@ static void ufx_usb_disconnect(struct usb_interface *interface)
/* if clients still have us open, will be freed on last close */ /* if clients still have us open, will be freed on last close */
if (dev->fb_count == 0) if (dev->fb_count == 0)
schedule_delayed_work(&dev->free_framebuffer_work, 0); ufx_free_framebuffer(dev);
/* release reference taken by kref_init in probe() */ /* this function will wait for all in-flight urbs to complete */
kref_put(&dev->kref, ufx_free); if (dev->urbs.count > 0)
ufx_free_urb_list(dev);
/* consider ufx_data freed */ pr_debug("freeing ufx_data %p", dev);
unregister_framebuffer(info);
mutex_unlock(&disconnect_mutex); mutex_unlock(&disconnect_mutex);
} }

View file

@ -360,8 +360,7 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map)
for (i = 0; i < map->count; i++) { for (i = 0; i < map->count; i++) {
if (map->map_ops[i].status == GNTST_okay) { if (map->map_ops[i].status == GNTST_okay) {
map->unmap_ops[i].handle = map->map_ops[i].handle; map->unmap_ops[i].handle = map->map_ops[i].handle;
if (!use_ptemod) alloced++;
alloced++;
} else if (!err) } else if (!err)
err = -EINVAL; err = -EINVAL;
@ -370,8 +369,7 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map)
if (use_ptemod) { if (use_ptemod) {
if (map->kmap_ops[i].status == GNTST_okay) { if (map->kmap_ops[i].status == GNTST_okay) {
if (map->map_ops[i].status == GNTST_okay) alloced++;
alloced++;
map->kunmap_ops[i].handle = map->kmap_ops[i].handle; map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
} else if (!err) } else if (!err)
err = -EINVAL; err = -EINVAL;
@ -387,20 +385,42 @@ static void __unmap_grant_pages_done(int result,
unsigned int i; unsigned int i;
struct gntdev_grant_map *map = data->data; struct gntdev_grant_map *map = data->data;
unsigned int offset = data->unmap_ops - map->unmap_ops; unsigned int offset = data->unmap_ops - map->unmap_ops;
int successful_unmaps = 0;
int live_grants;
for (i = 0; i < data->count; i++) { for (i = 0; i < data->count; i++) {
if (map->unmap_ops[offset + i].status == GNTST_okay &&
map->unmap_ops[offset + i].handle != -1)
successful_unmaps++;
WARN_ON(map->unmap_ops[offset+i].status && WARN_ON(map->unmap_ops[offset+i].status &&
map->unmap_ops[offset+i].handle != -1); map->unmap_ops[offset+i].handle != -1);
pr_debug("unmap handle=%d st=%d\n", pr_debug("unmap handle=%d st=%d\n",
map->unmap_ops[offset+i].handle, map->unmap_ops[offset+i].handle,
map->unmap_ops[offset+i].status); map->unmap_ops[offset+i].status);
map->unmap_ops[offset+i].handle = -1; map->unmap_ops[offset+i].handle = -1;
if (use_ptemod) {
if (map->kunmap_ops[offset + i].status == GNTST_okay &&
map->kunmap_ops[offset + i].handle != -1)
successful_unmaps++;
WARN_ON(map->kunmap_ops[offset+i].status &&
map->kunmap_ops[offset+i].handle != -1);
pr_debug("kunmap handle=%u st=%d\n",
map->kunmap_ops[offset+i].handle,
map->kunmap_ops[offset+i].status);
map->kunmap_ops[offset+i].handle = -1;
}
} }
/* /*
* Decrease the live-grant counter. This must happen after the loop to * Decrease the live-grant counter. This must happen after the loop to
* prevent premature reuse of the grants by gnttab_mmap(). * prevent premature reuse of the grants by gnttab_mmap().
*/ */
atomic_sub(data->count, &map->live_grants); live_grants = atomic_sub_return(successful_unmaps, &map->live_grants);
if (WARN_ON(live_grants < 0))
pr_err("%s: live_grants became negative (%d) after unmapping %d pages!\n",
__func__, live_grants, successful_unmaps);
/* Release reference taken by __unmap_grant_pages */ /* Release reference taken by __unmap_grant_pages */
gntdev_put_map(NULL, map); gntdev_put_map(NULL, map);

View file

@ -907,7 +907,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
interp_elf_ex = kmalloc(sizeof(*interp_elf_ex), GFP_KERNEL); interp_elf_ex = kmalloc(sizeof(*interp_elf_ex), GFP_KERNEL);
if (!interp_elf_ex) { if (!interp_elf_ex) {
retval = -ENOMEM; retval = -ENOMEM;
goto out_free_ph; goto out_free_file;
} }
/* Get the exec headers */ /* Get the exec headers */
@ -1328,6 +1328,7 @@ out:
out_free_dentry: out_free_dentry:
kfree(interp_elf_ex); kfree(interp_elf_ex);
kfree(interp_elf_phdata); kfree(interp_elf_phdata);
out_free_file:
allow_write_access(interpreter); allow_write_access(interpreter);
if (interpreter) if (interpreter)
fput(interpreter); fput(interpreter);

View file

@ -1200,11 +1200,11 @@ static int unshare_sighand(struct task_struct *me)
return -ENOMEM; return -ENOMEM;
refcount_set(&newsighand->count, 1); refcount_set(&newsighand->count, 1);
memcpy(newsighand->action, oldsighand->action,
sizeof(newsighand->action));
write_lock_irq(&tasklist_lock); write_lock_irq(&tasklist_lock);
spin_lock(&oldsighand->siglock); spin_lock(&oldsighand->siglock);
memcpy(newsighand->action, oldsighand->action,
sizeof(newsighand->action));
rcu_assign_pointer(me->sighand, newsighand); rcu_assign_pointer(me->sighand, newsighand);
spin_unlock(&oldsighand->siglock); spin_unlock(&oldsighand->siglock);
write_unlock_irq(&tasklist_lock); write_unlock_irq(&tasklist_lock);

View file

@ -1519,8 +1519,11 @@ int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
mutex_lock(&kernfs_mutex); mutex_lock(&kernfs_mutex);
kn = kernfs_find_ns(parent, name, ns); kn = kernfs_find_ns(parent, name, ns);
if (kn) if (kn) {
kernfs_get(kn);
__kernfs_remove(kn); __kernfs_remove(kn);
kernfs_put(kn);
}
mutex_unlock(&kernfs_mutex); mutex_unlock(&kernfs_mutex);

View file

@ -899,7 +899,7 @@ void mlx5_cmd_allowed_opcode(struct mlx5_core_dev *dev, u16 opcode);
struct mlx5_async_ctx { struct mlx5_async_ctx {
struct mlx5_core_dev *dev; struct mlx5_core_dev *dev;
atomic_t num_inflight; atomic_t num_inflight;
struct wait_queue_head wait; struct completion inflight_done;
}; };
struct mlx5_async_work; struct mlx5_async_work;

View file

@ -175,7 +175,8 @@ struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
* *
* @sd: pointer to &struct v4l2_subdev * @sd: pointer to &struct v4l2_subdev
* @client: pointer to struct i2c_client * @client: pointer to struct i2c_client
* @devname: the name of the device; if NULL, the I²C device's name will be used * @devname: the name of the device; if NULL, the I²C device drivers's name
* will be used
* @postfix: sub-device specific string to put right after the I²C device name; * @postfix: sub-device specific string to put right after the I²C device name;
* may be NULL * may be NULL
*/ */

View file

@ -1555,7 +1555,8 @@ struct v4l2_bt_timings {
((bt)->width + V4L2_DV_BT_BLANKING_WIDTH(bt)) ((bt)->width + V4L2_DV_BT_BLANKING_WIDTH(bt))
#define V4L2_DV_BT_BLANKING_HEIGHT(bt) \ #define V4L2_DV_BT_BLANKING_HEIGHT(bt) \
((bt)->vfrontporch + (bt)->vsync + (bt)->vbackporch + \ ((bt)->vfrontporch + (bt)->vsync + (bt)->vbackporch + \
(bt)->il_vfrontporch + (bt)->il_vsync + (bt)->il_vbackporch) ((bt)->interlaced ? \
((bt)->il_vfrontporch + (bt)->il_vsync + (bt)->il_vbackporch) : 0))
#define V4L2_DV_BT_FRAME_HEIGHT(bt) \ #define V4L2_DV_BT_FRAME_HEIGHT(bt) \
((bt)->height + V4L2_DV_BT_BLANKING_HEIGHT(bt)) ((bt)->height + V4L2_DV_BT_BLANKING_HEIGHT(bt))

View file

@ -637,7 +637,7 @@ static void power_down(void)
int error; int error;
if (hibernation_mode == HIBERNATION_SUSPEND) { if (hibernation_mode == HIBERNATION_SUSPEND) {
error = suspend_devices_and_enter(PM_SUSPEND_MEM); error = suspend_devices_and_enter(mem_sleep_current);
if (error) { if (error) {
hibernation_mode = hibernation_ops ? hibernation_mode = hibernation_ops ?
HIBERNATION_PLATFORM : HIBERNATION_PLATFORM :

View file

@ -2388,11 +2388,11 @@ struct page *alloc_huge_page(struct vm_area_struct *vma,
page = alloc_buddy_huge_page_with_mpol(h, vma, addr); page = alloc_buddy_huge_page_with_mpol(h, vma, addr);
if (!page) if (!page)
goto out_uncharge_cgroup; goto out_uncharge_cgroup;
spin_lock(&hugetlb_lock);
if (!avoid_reserve && vma_has_reserves(vma, gbl_chg)) { if (!avoid_reserve && vma_has_reserves(vma, gbl_chg)) {
SetPagePrivate(page); SetPagePrivate(page);
h->resv_huge_pages--; h->resv_huge_pages--;
} }
spin_lock(&hugetlb_lock);
list_add(&page->lru, &h->hugepage_activelist); list_add(&page->lru, &h->hugepage_activelist);
/* Fall through */ /* Fall through */
} }

View file

@ -862,6 +862,17 @@ copy_present_page(struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma
if (likely(!page_maybe_dma_pinned(page))) if (likely(!page_maybe_dma_pinned(page)))
return 1; return 1;
/*
* The vma->anon_vma of the child process may be NULL
* because the entire vma does not contain anonymous pages.
* A BUG will occur when the copy_present_page() passes
* a copy of a non-anonymous page of that vma to the
* page_add_new_anon_rmap() to set up new anonymous rmap.
* Return 1 if the page is not an anonymous page.
*/
if (!PageAnon(page))
return 1;
new_page = *prealloc; new_page = *prealloc;
if (!new_page) if (!new_page)
return -EAGAIN; return -EAGAIN;

View file

@ -338,10 +338,12 @@ static void j1939_session_skb_drop_old(struct j1939_session *session)
__skb_unlink(do_skb, &session->skb_queue); __skb_unlink(do_skb, &session->skb_queue);
/* drop ref taken in j1939_session_skb_queue() */ /* drop ref taken in j1939_session_skb_queue() */
skb_unref(do_skb); skb_unref(do_skb);
spin_unlock_irqrestore(&session->skb_queue.lock, flags);
kfree_skb(do_skb); kfree_skb(do_skb);
} else {
spin_unlock_irqrestore(&session->skb_queue.lock, flags);
} }
spin_unlock_irqrestore(&session->skb_queue.lock, flags);
} }
void j1939_session_skb_queue(struct j1939_session *session, void j1939_session_skb_queue(struct j1939_session *session,

View file

@ -135,6 +135,7 @@ static int net_assign_generic(struct net *net, unsigned int id, void *data)
static int ops_init(const struct pernet_operations *ops, struct net *net) static int ops_init(const struct pernet_operations *ops, struct net *net)
{ {
struct net_generic *ng;
int err = -ENOMEM; int err = -ENOMEM;
void *data = NULL; void *data = NULL;
@ -153,7 +154,13 @@ static int ops_init(const struct pernet_operations *ops, struct net *net)
if (!err) if (!err)
return 0; return 0;
if (ops->id && ops->size) {
cleanup: cleanup:
ng = rcu_dereference_protected(net->gen,
lockdep_is_held(&pernet_ops_rwsem));
ng->ptr[*ops->id] = NULL;
}
kfree(data); kfree(data);
out: out:

View file

@ -503,8 +503,10 @@ static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len)
if (err < 0) if (err < 0)
goto out; goto out;
if (addr->family != AF_IEEE802154) if (addr->family != AF_IEEE802154) {
err = -EINVAL;
goto out; goto out;
}
ieee802154_addr_from_sa(&haddr, &addr->addr); ieee802154_addr_from_sa(&haddr, &addr->addr);
dev = ieee802154_get_dev(sock_net(sk), &haddr); dev = ieee802154_get_dev(sock_net(sk), &haddr);

View file

@ -1325,7 +1325,7 @@ static int nh_create_ipv4(struct net *net, struct nexthop *nh,
if (!err) { if (!err) {
nh->nh_flags = fib_nh->fib_nh_flags; nh->nh_flags = fib_nh->fib_nh_flags;
fib_info_update_nhc_saddr(net, &fib_nh->nh_common, fib_info_update_nhc_saddr(net, &fib_nh->nh_common,
fib_nh->fib_nh_scope); !fib_nh->fib_nh_scope ? 0 : fib_nh->fib_nh_scope - 1);
} else { } else {
fib_nh_release(net, fib_nh); fib_nh_release(net, fib_nh);
} }

View file

@ -2176,7 +2176,8 @@ void tcp_enter_loss(struct sock *sk)
*/ */
static bool tcp_check_sack_reneging(struct sock *sk, int flag) static bool tcp_check_sack_reneging(struct sock *sk, int flag)
{ {
if (flag & FLAG_SACK_RENEGING) { if (flag & FLAG_SACK_RENEGING &&
flag & FLAG_SND_UNA_ADVANCED) {
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
unsigned long delay = max(usecs_to_jiffies(tp->srtt_us >> 4), unsigned long delay = max(usecs_to_jiffies(tp->srtt_us >> 4),
msecs_to_jiffies(10)); msecs_to_jiffies(10));

View file

@ -1770,8 +1770,7 @@ int tcp_v4_early_demux(struct sk_buff *skb)
bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb) bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
{ {
u32 limit = READ_ONCE(sk->sk_rcvbuf) + READ_ONCE(sk->sk_sndbuf); u32 limit, tail_gso_size, tail_gso_segs;
u32 tail_gso_size, tail_gso_segs;
struct skb_shared_info *shinfo; struct skb_shared_info *shinfo;
const struct tcphdr *th; const struct tcphdr *th;
struct tcphdr *thtail; struct tcphdr *thtail;
@ -1874,11 +1873,13 @@ bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
__skb_push(skb, hdrlen); __skb_push(skb, hdrlen);
no_coalesce: no_coalesce:
limit = (u32)READ_ONCE(sk->sk_rcvbuf) + (u32)(READ_ONCE(sk->sk_sndbuf) >> 1);
/* Only socket owner can try to collapse/prune rx queues /* Only socket owner can try to collapse/prune rx queues
* to reduce memory overhead, so add a little headroom here. * to reduce memory overhead, so add a little headroom here.
* Few sockets backlog are possibly concurrently non empty. * Few sockets backlog are possibly concurrently non empty.
*/ */
limit += 64*1024; limit += 64 * 1024;
if (unlikely(sk_add_backlog(sk, skb, limit))) { if (unlikely(sk_add_backlog(sk, skb, limit))) {
bh_unlock_sock(sk); bh_unlock_sock(sk);

View file

@ -1153,14 +1153,16 @@ static void ip6gre_tnl_link_config_route(struct ip6_tnl *t, int set_mtu,
dev->needed_headroom = dst_len; dev->needed_headroom = dst_len;
if (set_mtu) { if (set_mtu) {
dev->mtu = rt->dst.dev->mtu - t_hlen; int mtu = rt->dst.dev->mtu - t_hlen;
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
dev->mtu -= 8;
if (dev->type == ARPHRD_ETHER)
dev->mtu -= ETH_HLEN;
if (dev->mtu < IPV6_MIN_MTU) if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
dev->mtu = IPV6_MIN_MTU; mtu -= 8;
if (dev->type == ARPHRD_ETHER)
mtu -= ETH_HLEN;
if (mtu < IPV6_MIN_MTU)
mtu = IPV6_MIN_MTU;
WRITE_ONCE(dev->mtu, mtu);
} }
} }
ip6_rt_put(rt); ip6_rt_put(rt);

View file

@ -1476,8 +1476,8 @@ static void ip6_tnl_link_config(struct ip6_tnl *t)
struct net_device *tdev = NULL; struct net_device *tdev = NULL;
struct __ip6_tnl_parm *p = &t->parms; struct __ip6_tnl_parm *p = &t->parms;
struct flowi6 *fl6 = &t->fl.u.ip6; struct flowi6 *fl6 = &t->fl.u.ip6;
unsigned int mtu;
int t_hlen; int t_hlen;
int mtu;
memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr)); memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr));
memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr)); memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr));
@ -1524,12 +1524,13 @@ static void ip6_tnl_link_config(struct ip6_tnl *t)
dev->hard_header_len = tdev->hard_header_len + t_hlen; dev->hard_header_len = tdev->hard_header_len + t_hlen;
mtu = min_t(unsigned int, tdev->mtu, IP6_MAX_MTU); mtu = min_t(unsigned int, tdev->mtu, IP6_MAX_MTU);
dev->mtu = mtu - t_hlen; mtu = mtu - t_hlen;
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
dev->mtu -= 8; mtu -= 8;
if (dev->mtu < IPV6_MIN_MTU) if (mtu < IPV6_MIN_MTU)
dev->mtu = IPV6_MIN_MTU; mtu = IPV6_MIN_MTU;
WRITE_ONCE(dev->mtu, mtu);
} }
} }
} }

View file

@ -1123,10 +1123,12 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
if (tdev && !netif_is_l3_master(tdev)) { if (tdev && !netif_is_l3_master(tdev)) {
int t_hlen = tunnel->hlen + sizeof(struct iphdr); int t_hlen = tunnel->hlen + sizeof(struct iphdr);
int mtu;
dev->mtu = tdev->mtu - t_hlen; mtu = tdev->mtu - t_hlen;
if (dev->mtu < IPV6_MIN_MTU) if (mtu < IPV6_MIN_MTU)
dev->mtu = IPV6_MIN_MTU; mtu = IPV6_MIN_MTU;
WRITE_ONCE(dev->mtu, mtu);
} }
} }

View file

@ -161,7 +161,8 @@ static void kcm_rcv_ready(struct kcm_sock *kcm)
/* Buffer limit is okay now, add to ready list */ /* Buffer limit is okay now, add to ready list */
list_add_tail(&kcm->wait_rx_list, list_add_tail(&kcm->wait_rx_list,
&kcm->mux->kcm_rx_waiters); &kcm->mux->kcm_rx_waiters);
kcm->rx_wait = true; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_wait, true);
} }
static void kcm_rfree(struct sk_buff *skb) static void kcm_rfree(struct sk_buff *skb)
@ -177,7 +178,7 @@ static void kcm_rfree(struct sk_buff *skb)
/* For reading rx_wait and rx_psock without holding lock */ /* For reading rx_wait and rx_psock without holding lock */
smp_mb__after_atomic(); smp_mb__after_atomic();
if (!kcm->rx_wait && !kcm->rx_psock && if (!READ_ONCE(kcm->rx_wait) && !READ_ONCE(kcm->rx_psock) &&
sk_rmem_alloc_get(sk) < sk->sk_rcvlowat) { sk_rmem_alloc_get(sk) < sk->sk_rcvlowat) {
spin_lock_bh(&mux->rx_lock); spin_lock_bh(&mux->rx_lock);
kcm_rcv_ready(kcm); kcm_rcv_ready(kcm);
@ -236,7 +237,8 @@ try_again:
if (kcm_queue_rcv_skb(&kcm->sk, skb)) { if (kcm_queue_rcv_skb(&kcm->sk, skb)) {
/* Should mean socket buffer full */ /* Should mean socket buffer full */
list_del(&kcm->wait_rx_list); list_del(&kcm->wait_rx_list);
kcm->rx_wait = false; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_wait, false);
/* Commit rx_wait to read in kcm_free */ /* Commit rx_wait to read in kcm_free */
smp_wmb(); smp_wmb();
@ -279,10 +281,12 @@ static struct kcm_sock *reserve_rx_kcm(struct kcm_psock *psock,
kcm = list_first_entry(&mux->kcm_rx_waiters, kcm = list_first_entry(&mux->kcm_rx_waiters,
struct kcm_sock, wait_rx_list); struct kcm_sock, wait_rx_list);
list_del(&kcm->wait_rx_list); list_del(&kcm->wait_rx_list);
kcm->rx_wait = false; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_wait, false);
psock->rx_kcm = kcm; psock->rx_kcm = kcm;
kcm->rx_psock = psock; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_psock, psock);
spin_unlock_bh(&mux->rx_lock); spin_unlock_bh(&mux->rx_lock);
@ -309,7 +313,8 @@ static void unreserve_rx_kcm(struct kcm_psock *psock,
spin_lock_bh(&mux->rx_lock); spin_lock_bh(&mux->rx_lock);
psock->rx_kcm = NULL; psock->rx_kcm = NULL;
kcm->rx_psock = NULL; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_psock, NULL);
/* Commit kcm->rx_psock before sk_rmem_alloc_get to sync with /* Commit kcm->rx_psock before sk_rmem_alloc_get to sync with
* kcm_rfree * kcm_rfree
@ -1239,7 +1244,8 @@ static void kcm_recv_disable(struct kcm_sock *kcm)
if (!kcm->rx_psock) { if (!kcm->rx_psock) {
if (kcm->rx_wait) { if (kcm->rx_wait) {
list_del(&kcm->wait_rx_list); list_del(&kcm->wait_rx_list);
kcm->rx_wait = false; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_wait, false);
} }
requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue);
@ -1792,7 +1798,8 @@ static void kcm_done(struct kcm_sock *kcm)
if (kcm->rx_wait) { if (kcm->rx_wait) {
list_del(&kcm->wait_rx_list); list_del(&kcm->wait_rx_list);
kcm->rx_wait = false; /* paired with lockless reads in kcm_rfree() */
WRITE_ONCE(kcm->rx_wait, false);
} }
/* Move any pending receive messages to other kcm sockets */ /* Move any pending receive messages to other kcm sockets */
requeue_rx_msgs(mux, &sk->sk_receive_queue); requeue_rx_msgs(mux, &sk->sk_receive_queue);

View file

@ -132,7 +132,7 @@ static int
ieee802154_parse_frame_start(struct sk_buff *skb, struct ieee802154_hdr *hdr) ieee802154_parse_frame_start(struct sk_buff *skb, struct ieee802154_hdr *hdr)
{ {
int hlen; int hlen;
struct ieee802154_mac_cb *cb = mac_cb_init(skb); struct ieee802154_mac_cb *cb = mac_cb(skb);
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
@ -294,8 +294,9 @@ void
ieee802154_rx_irqsafe(struct ieee802154_hw *hw, struct sk_buff *skb, u8 lqi) ieee802154_rx_irqsafe(struct ieee802154_hw *hw, struct sk_buff *skb, u8 lqi)
{ {
struct ieee802154_local *local = hw_to_local(hw); struct ieee802154_local *local = hw_to_local(hw);
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
mac_cb(skb)->lqi = lqi; cb->lqi = lqi;
skb->pkt_type = IEEE802154_RX_MSG; skb->pkt_type = IEEE802154_RX_MSG;
skb_queue_tail(&local->skb_queue, skb); skb_queue_tail(&local->skb_queue, skb);
tasklet_schedule(&local->tasklet); tasklet_schedule(&local->tasklet);

View file

@ -1592,7 +1592,8 @@ static void ovs_dp_reset_user_features(struct sk_buff *skb,
if (IS_ERR(dp)) if (IS_ERR(dp))
return; return;
WARN(dp->user_features, "Dropping previously announced user features\n"); pr_warn("%s: Dropping previously announced user features\n",
ovs_dp_name(dp));
dp->user_features = 0; dp->user_features = 0;
} }

View file

@ -450,12 +450,19 @@ static void tipc_conn_data_ready(struct sock *sk)
static void tipc_topsrv_accept(struct work_struct *work) static void tipc_topsrv_accept(struct work_struct *work)
{ {
struct tipc_topsrv *srv = container_of(work, struct tipc_topsrv, awork); struct tipc_topsrv *srv = container_of(work, struct tipc_topsrv, awork);
struct socket *lsock = srv->listener; struct socket *newsock, *lsock;
struct socket *newsock;
struct tipc_conn *con; struct tipc_conn *con;
struct sock *newsk; struct sock *newsk;
int ret; int ret;
spin_lock_bh(&srv->idr_lock);
if (!srv->listener) {
spin_unlock_bh(&srv->idr_lock);
return;
}
lsock = srv->listener;
spin_unlock_bh(&srv->idr_lock);
while (1) { while (1) {
ret = kernel_accept(lsock, &newsock, O_NONBLOCK); ret = kernel_accept(lsock, &newsock, O_NONBLOCK);
if (ret < 0) if (ret < 0)
@ -489,7 +496,7 @@ static void tipc_topsrv_listener_data_ready(struct sock *sk)
read_lock_bh(&sk->sk_callback_lock); read_lock_bh(&sk->sk_callback_lock);
srv = sk->sk_user_data; srv = sk->sk_user_data;
if (srv->listener) if (srv)
queue_work(srv->rcv_wq, &srv->awork); queue_work(srv->rcv_wq, &srv->awork);
read_unlock_bh(&sk->sk_callback_lock); read_unlock_bh(&sk->sk_callback_lock);
} }
@ -699,8 +706,9 @@ static void tipc_topsrv_stop(struct net *net)
__module_get(lsock->sk->sk_prot_creator->owner); __module_get(lsock->sk->sk_prot_creator->owner);
srv->listener = NULL; srv->listener = NULL;
spin_unlock_bh(&srv->idr_lock); spin_unlock_bh(&srv->idr_lock);
sock_release(lsock);
tipc_topsrv_work_stop(srv); tipc_topsrv_work_stop(srv);
sock_release(lsock);
idr_destroy(&srv->conn_idr); idr_destroy(&srv->conn_idr);
kfree(srv); kfree(srv);
} }

View file

@ -147,6 +147,7 @@ static int i2sbus_get_and_fixup_rsrc(struct device_node *np, int index,
return rc; return rc;
} }
/* Returns 1 if added, 0 for otherwise; don't return a negative value! */
/* FIXME: look at device node refcounting */ /* FIXME: look at device node refcounting */
static int i2sbus_add_dev(struct macio_dev *macio, static int i2sbus_add_dev(struct macio_dev *macio,
struct i2sbus_control *control, struct i2sbus_control *control,
@ -213,7 +214,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
* either as the second one in that case is just a modem. */ * either as the second one in that case is just a modem. */
if (!ok) { if (!ok) {
kfree(dev); kfree(dev);
return -ENODEV; return 0;
} }
mutex_init(&dev->lock); mutex_init(&dev->lock);
@ -302,6 +303,10 @@ static int i2sbus_add_dev(struct macio_dev *macio,
if (soundbus_add_one(&dev->sound)) { if (soundbus_add_one(&dev->sound)) {
printk(KERN_DEBUG "i2sbus: device registration error!\n"); printk(KERN_DEBUG "i2sbus: device registration error!\n");
if (dev->sound.ofdev.dev.kobj.state_initialized) {
soundbus_dev_put(&dev->sound);
return 0;
}
goto err; goto err;
} }

View file

@ -1946,6 +1946,7 @@ static int snd_ac97_dev_register(struct snd_device *device)
snd_ac97_get_short_name(ac97)); snd_ac97_get_short_name(ac97));
if ((err = device_register(&ac97->dev)) < 0) { if ((err = device_register(&ac97->dev)) < 0) {
ac97_err(ac97, "Can't register ac97 bus\n"); ac97_err(ac97, "Can't register ac97 bus\n");
put_device(&ac97->dev);
ac97->dev.bus = NULL; ac97->dev.bus = NULL;
return err; return err;
} }

View file

@ -141,7 +141,7 @@ struct snd_vortex {
#ifndef CHIP_AU8810 #ifndef CHIP_AU8810
stream_t dma_wt[NR_WT]; stream_t dma_wt[NR_WT];
wt_voice_t wt_voice[NR_WT]; /* WT register cache. */ wt_voice_t wt_voice[NR_WT]; /* WT register cache. */
char mixwt[(NR_WT / NR_WTPB) * 6]; /* WT mixin objects */ s8 mixwt[(NR_WT / NR_WTPB) * 6]; /* WT mixin objects */
#endif #endif
/* Global resources */ /* Global resources */
@ -235,8 +235,8 @@ static int vortex_alsafmt_aspfmt(snd_pcm_format_t alsafmt, vortex_t *v);
static void vortex_connect_default(vortex_t * vortex, int en); static void vortex_connect_default(vortex_t * vortex, int en);
static int vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch, static int vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch,
int dir, int type, int subdev); int dir, int type, int subdev);
static char vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, static int vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out,
int restype); int restype);
#ifndef CHIP_AU8810 #ifndef CHIP_AU8810
static int vortex_wt_allocroute(vortex_t * vortex, int dma, int nr_ch); static int vortex_wt_allocroute(vortex_t * vortex, int dma, int nr_ch);
static void vortex_wt_connect(vortex_t * vortex, int en); static void vortex_wt_connect(vortex_t * vortex, int en);

View file

@ -1998,7 +1998,7 @@ static const int resnum[VORTEX_RESOURCE_LAST] =
out: Mean checkout if != 0. Else mean Checkin resource. out: Mean checkout if != 0. Else mean Checkin resource.
restype: Indicates type of resource to be checked in or out. restype: Indicates type of resource to be checked in or out.
*/ */
static char static int
vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype) vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype)
{ {
int i, qty = resnum[restype], resinuse = 0; int i, qty = resnum[restype], resinuse = 0;

View file

@ -436,7 +436,7 @@ struct hdsp_midi {
struct snd_rawmidi *rmidi; struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *input; struct snd_rawmidi_substream *input;
struct snd_rawmidi_substream *output; struct snd_rawmidi_substream *output;
char istimer; /* timer in use */ signed char istimer; /* timer in use */
struct timer_list timer; struct timer_list timer;
spinlock_t lock; spinlock_t lock;
int pending; int pending;
@ -479,7 +479,7 @@ struct hdsp {
pid_t playback_pid; pid_t playback_pid;
int running; int running;
int system_sample_rate; int system_sample_rate;
const char *channel_map; const signed char *channel_map;
int dev; int dev;
int irq; int irq;
unsigned long port; unsigned long port;
@ -501,7 +501,7 @@ struct hdsp {
where the data for that channel can be read/written from/to. where the data for that channel can be read/written from/to.
*/ */
static const char channel_map_df_ss[HDSP_MAX_CHANNELS] = { static const signed char channel_map_df_ss[HDSP_MAX_CHANNELS] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25 18, 19, 20, 21, 22, 23, 24, 25
}; };
@ -516,7 +516,7 @@ static const char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */
-1, -1, -1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1
}; };
static const char channel_map_ds[HDSP_MAX_CHANNELS] = { static const signed char channel_map_ds[HDSP_MAX_CHANNELS] = {
/* ADAT channels are remapped */ /* ADAT channels are remapped */
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
/* channels 12 and 13 are S/PDIF */ /* channels 12 and 13 are S/PDIF */
@ -525,7 +525,7 @@ static const char channel_map_ds[HDSP_MAX_CHANNELS] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
}; };
static const char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = { static const signed char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
/* ADAT channels */ /* ADAT channels */
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
/* SPDIF */ /* SPDIF */
@ -539,7 +539,7 @@ static const char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
-1, -1 -1, -1
}; };
static const char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = { static const signed char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
/* ADAT */ /* ADAT */
1, 3, 5, 7, 1, 3, 5, 7,
/* SPDIF */ /* SPDIF */
@ -553,7 +553,7 @@ static const char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
-1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1
}; };
static const char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = { static const signed char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = {
/* ADAT is disabled in this mode */ /* ADAT is disabled in this mode */
/* SPDIF */ /* SPDIF */
8, 9, 8, 9,
@ -3869,7 +3869,7 @@ static snd_pcm_uframes_t snd_hdsp_hw_pointer(struct snd_pcm_substream *substream
return hdsp_hw_pointer(hdsp); return hdsp_hw_pointer(hdsp);
} }
static char *hdsp_channel_buffer_location(struct hdsp *hdsp, static signed char *hdsp_channel_buffer_location(struct hdsp *hdsp,
int stream, int stream,
int channel) int channel)
@ -3893,7 +3893,7 @@ static int snd_hdsp_playback_copy(struct snd_pcm_substream *substream,
void __user *src, unsigned long count) void __user *src, unsigned long count)
{ {
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES)) if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
return -EINVAL; return -EINVAL;
@ -3911,7 +3911,7 @@ static int snd_hdsp_playback_copy_kernel(struct snd_pcm_substream *substream,
void *src, unsigned long count) void *src, unsigned long count)
{ {
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel); channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
if (snd_BUG_ON(!channel_buf)) if (snd_BUG_ON(!channel_buf))
@ -3925,7 +3925,7 @@ static int snd_hdsp_capture_copy(struct snd_pcm_substream *substream,
void __user *dst, unsigned long count) void __user *dst, unsigned long count)
{ {
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES)) if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
return -EINVAL; return -EINVAL;
@ -3943,7 +3943,7 @@ static int snd_hdsp_capture_copy_kernel(struct snd_pcm_substream *substream,
void *dst, unsigned long count) void *dst, unsigned long count)
{ {
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel); channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
if (snd_BUG_ON(!channel_buf)) if (snd_BUG_ON(!channel_buf))
@ -3957,7 +3957,7 @@ static int snd_hdsp_hw_silence(struct snd_pcm_substream *substream,
unsigned long count) unsigned long count)
{ {
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel); channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
if (snd_BUG_ON(!channel_buf)) if (snd_BUG_ON(!channel_buf))

View file

@ -229,7 +229,7 @@ struct snd_rme9652 {
int last_spdif_sample_rate; /* so that we can catch externally ... */ int last_spdif_sample_rate; /* so that we can catch externally ... */
int last_adat_sample_rate; /* ... induced rate changes */ int last_adat_sample_rate; /* ... induced rate changes */
const char *channel_map; const signed char *channel_map;
struct snd_card *card; struct snd_card *card;
struct snd_pcm *pcm; struct snd_pcm *pcm;
@ -246,12 +246,12 @@ struct snd_rme9652 {
where the data for that channel can be read/written from/to. where the data for that channel can be read/written from/to.
*/ */
static const char channel_map_9652_ss[26] = { static const signed char channel_map_9652_ss[26] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25 18, 19, 20, 21, 22, 23, 24, 25
}; };
static const char channel_map_9636_ss[26] = { static const signed char channel_map_9636_ss[26] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
/* channels 16 and 17 are S/PDIF */ /* channels 16 and 17 are S/PDIF */
24, 25, 24, 25,
@ -259,7 +259,7 @@ static const char channel_map_9636_ss[26] = {
-1, -1, -1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1
}; };
static const char channel_map_9652_ds[26] = { static const signed char channel_map_9652_ds[26] = {
/* ADAT channels are remapped */ /* ADAT channels are remapped */
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
/* channels 12 and 13 are S/PDIF */ /* channels 12 and 13 are S/PDIF */
@ -268,7 +268,7 @@ static const char channel_map_9652_ds[26] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
}; };
static const char channel_map_9636_ds[26] = { static const signed char channel_map_9636_ds[26] = {
/* ADAT channels are remapped */ /* ADAT channels are remapped */
1, 3, 5, 7, 9, 11, 13, 15, 1, 3, 5, 7, 9, 11, 13, 15,
/* channels 8 and 9 are S/PDIF */ /* channels 8 and 9 are S/PDIF */
@ -1841,7 +1841,7 @@ static snd_pcm_uframes_t snd_rme9652_hw_pointer(struct snd_pcm_substream *substr
return rme9652_hw_pointer(rme9652); return rme9652_hw_pointer(rme9652);
} }
static char *rme9652_channel_buffer_location(struct snd_rme9652 *rme9652, static signed char *rme9652_channel_buffer_location(struct snd_rme9652 *rme9652,
int stream, int stream,
int channel) int channel)
@ -1869,7 +1869,7 @@ static int snd_rme9652_playback_copy(struct snd_pcm_substream *substream,
void __user *src, unsigned long count) void __user *src, unsigned long count)
{ {
struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream); struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES)) if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES))
return -EINVAL; return -EINVAL;
@ -1889,7 +1889,7 @@ static int snd_rme9652_playback_copy_kernel(struct snd_pcm_substream *substream,
void *src, unsigned long count) void *src, unsigned long count)
{ {
struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream); struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = rme9652_channel_buffer_location(rme9652, channel_buf = rme9652_channel_buffer_location(rme9652,
substream->pstr->stream, substream->pstr->stream,
@ -1905,7 +1905,7 @@ static int snd_rme9652_capture_copy(struct snd_pcm_substream *substream,
void __user *dst, unsigned long count) void __user *dst, unsigned long count)
{ {
struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream); struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES)) if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES))
return -EINVAL; return -EINVAL;
@ -1925,7 +1925,7 @@ static int snd_rme9652_capture_copy_kernel(struct snd_pcm_substream *substream,
void *dst, unsigned long count) void *dst, unsigned long count)
{ {
struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream); struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = rme9652_channel_buffer_location(rme9652, channel_buf = rme9652_channel_buffer_location(rme9652,
substream->pstr->stream, substream->pstr->stream,
@ -1941,7 +1941,7 @@ static int snd_rme9652_hw_silence(struct snd_pcm_substream *substream,
unsigned long count) unsigned long count)
{ {
struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream); struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
char *channel_buf; signed char *channel_buf;
channel_buf = rme9652_channel_buffer_location (rme9652, channel_buf = rme9652_channel_buffer_location (rme9652,
substream->pstr->stream, substream->pstr->stream,

View file

@ -745,10 +745,20 @@ static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg)
return true; return true;
if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v)) if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
return true; return true;
if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
return true;
if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
return true;
for (i = 0; i < v->hdmi_rdma_channels; ++i) { for (i = 0; i < v->hdmi_rdma_channels; ++i) {
if (reg == LPAIF_HDMI_RDMACURR_REG(v, i)) if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
return true; return true;
if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
return true;
if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
return true;
if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
return true;
} }
return false; return false;
} }

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