Merge 5.4.259 into android11-5.4-lts

Changes in 5.4.259
	RDMA/cxgb4: Check skb value for failure to allocate
	lib/test_meminit: fix off-by-one error in test_pages()
	pwm: hibvt: Explicitly set .polarity in .get_state()
	HID: logitech-hidpp: Fix kernel crash on receiver USB disconnect
	quota: Fix slow quotaoff
	net: prevent address rewrite in kernel_bind()
	drm: etvnaviv: fix bad backport leading to warning
	drm/msm/dsi: skip the wait for video mode done if not applicable
	ravb: Fix up dma_free_coherent() call in ravb_remove()
	ieee802154: ca8210: Fix a potential UAF in ca8210_probe
	mlxsw: fix mlxsw_sp2_nve_vxlan_learning_set() return type
	xen-netback: use default TX queue size for vifs
	drm/vmwgfx: fix typo of sizeof argument
	ixgbe: fix crash with empty VF macvlan list
	net: nfc: fix races in nfc_llcp_sock_get() and nfc_llcp_sock_get_sn()
	nfc: nci: assert requested protocol is valid
	workqueue: Override implicit ordered attribute in workqueue_apply_unbound_cpumask()
	dmaengine: stm32-mdma: abort resume if no ongoing transfer
	usb: xhci: xhci-ring: Use sysdev for mapping bounce buffer
	net: usb: dm9601: fix uninitialized variable use in dm9601_mdio_read
	usb: dwc3: Soft reset phy on probe for host
	usb: musb: Get the musb_qh poniter after musb_giveback
	usb: musb: Modify the "HWVers" register address
	iio: pressure: bmp280: Fix NULL pointer exception
	iio: pressure: dps310: Adjust Timeout Settings
	iio: pressure: ms5611: ms5611_prom_is_valid false negative bug
	mcb: remove is_added flag from mcb_device struct
	libceph: use kernel_connect()
	ceph: fix incorrect revoked caps assert in ceph_fill_file_size()
	Input: powermate - fix use-after-free in powermate_config_complete
	Input: psmouse - fix fast_reconnect function for PS/2 mode
	Input: xpad - add PXN V900 support
	cgroup: Remove duplicates in cgroup v1 tasks file
	pinctrl: avoid unsafe code pattern in find_pinctrl()
	usb: gadget: udc-xilinx: replace memcpy with memcpy_toio
	usb: gadget: ncm: Handle decoding of multiple NTB's in unwrap call
	x86/cpu: Fix AMD erratum #1485 on Zen4-based CPUs
	dmaengine: mediatek: Fix deadlock caused by synchronize_irq()
	powerpc/8xx: Fix pte_access_permitted() for PAGE_NONE
	powerpc/64e: Fix wrong test in __ptep_test_and_clear_young()
	ravb: Fix use-after-free issue in ravb_tx_timeout_work()
	dev_forward_skb: do not scrub skb mark within the same name space
	Documentation: sysctl: align cells in second content column
	usb: hub: Guard against accesses to uninitialized BOS descriptors
	Bluetooth: hci_event: Ignore NULL link key
	Bluetooth: Reject connection with the device which has same BD_ADDR
	Bluetooth: Fix a refcnt underflow problem for hci_conn
	Bluetooth: vhci: Fix race when opening vhci device
	Bluetooth: hci_event: Fix coding style
	Bluetooth: avoid memcmp() out of bounds warning
	ice: fix over-shifted variable
	nfc: nci: fix possible NULL pointer dereference in send_acknowledge()
	regmap: fix NULL deref on lookup
	KVM: x86: Mask LVTPC when handling a PMI
	netfilter: nft_payload: fix wrong mac header matching
	qed: fix LL2 RX buffer allocation
	xfrm: fix a data-race in xfrm_gen_index()
	xfrm: interface: use DEV_STATS_INC()
	net: ipv4: fix return value check in esp_remove_trailer
	net: ipv6: fix return value check in esp_remove_trailer
	net: rfkill: gpio: prevent value glitch during probe
	tcp: fix excessive TLP and RACK timeouts from HZ rounding
	tcp: tsq: relax tcp_small_queue_check() when rtx queue contains a single skb
	tun: prevent negative ifindex
	ipv4: fib: annotate races around nh->nh_saddr_genid and nh->nh_saddr
	net: usb: smsc95xx: Fix an error code in smsc95xx_reset()
	i40e: prevent crash on probe if hw registers have invalid values
	net/sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner curve
	neighbor: tracing: Move pin6 inside CONFIG_IPV6=y section
	netfilter: nft_set_rbtree: .deactivate fails if element has expired
	net: pktgen: Fix interface flags printing
	resource: Add irqresource_disabled()
	ACPI: Drop acpi_dev_irqresource_disabled()
	ACPI: resources: Add DMI-based legacy IRQ override quirk
	ACPI: resource: Skip IRQ override on Asus Vivobook K3402ZA/K3502ZA
	ACPI: resource: Add ASUS model S5402ZA to quirks
	ACPI: resource: Skip IRQ override on Asus Vivobook S5602ZA
	ACPI: resource: Add Asus ExpertBook B2502 to Asus quirks
	ACPI: resource: Skip IRQ override on Asus Expertbook B2402CBA
	ACPI: resource: Skip IRQ override on ASUS ExpertBook B1502CBA
	ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CBA
	ARM: dts: ti: omap: Fix noisy serial with overrun-throttle-ms for mapphone
	btrfs: return -EUCLEAN for delayed tree ref with a ref count not equals to 1
	btrfs: initialize start_slot in btrfs_log_prealloc_extents
	i2c: mux: Avoid potential false error message in i2c_mux_add_adapter
	overlayfs: set ctime when setting mtime and atime
	gpio: timberdale: Fix potential deadlock on &tgpio->lock
	ata: libata-eh: Fix compilation warning in ata_eh_link_report()
	tracing: relax trace_event_eval_update() execution with cond_resched()
	HID: holtek: fix slab-out-of-bounds Write in holtek_kbd_input_event
	Bluetooth: Avoid redundant authentication
	Bluetooth: hci_core: Fix build warnings
	wifi: mac80211: allow transmitting EAPOL frames with tainted key
	wifi: cfg80211: avoid leaking stack data into trace
	regulator/core: Revert "fix kobject release warning and memory leak in regulator_register()"
	sky2: Make sure there is at least one frag_addr available
	drm: panel-orientation-quirks: Add quirk for One Mix 2S
	btrfs: fix some -Wmaybe-uninitialized warnings in ioctl.c
	HID: multitouch: Add required quirk for Synaptics 0xcd7e device
	Bluetooth: hci_event: Fix using memcmp when comparing keys
	mtd: rawnand: qcom: Unmap the right resource upon probe failure
	mtd: spinand: micron: correct bitmask for ecc status
	mtd: physmap-core: Restore map_rom fallback
	mmc: core: sdio: hold retuning if sdio in 1-bit mode
	mmc: core: Capture correct oemid-bits for eMMC cards
	Revert "pinctrl: avoid unsafe code pattern in find_pinctrl()"
	ACPI: irq: Fix incorrect return value in acpi_register_gsi()
	USB: serial: option: add Telit LE910C4-WWX 0x1035 composition
	USB: serial: option: add entry for Sierra EM9191 with new firmware
	USB: serial: option: add Fibocom to DELL custom modem FM101R-GL
	perf: Disallow mis-matched inherited group reads
	s390/pci: fix iommu bitmap allocation
	gpio: vf610: set value before the direction to avoid a glitch
	ASoC: pxa: fix a memory leak in probe()
	phy: mapphone-mdm6600: Fix runtime disable on probe
	phy: mapphone-mdm6600: Fix runtime PM for remove
	phy: mapphone-mdm6600: Fix pinctrl_pm handling for sleep pins
	Bluetooth: hci_sock: fix slab oob read in create_monitor_event
	Bluetooth: hci_sock: Correctly bounds check and pad HCI_MON_NEW_INDEX name
	xfrm6: fix inet6_dev refcount underflow problem
	Linux 5.4.259

Change-Id: I413388a8527327650b234e3f14fce5ca6137c6c8
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2023-10-26 08:52:11 +00:00
commit 6b5f21afc2
115 changed files with 724 additions and 310 deletions

View File

@ -31,18 +31,18 @@ see only some of them, depending on your kernel's configuration.
Table : Subdirectories in /proc/sys/net Table : Subdirectories in /proc/sys/net
========= =================== = ========== ================== ========= =================== = ========== ===================
Directory Content Directory Content Directory Content Directory Content
========= =================== = ========== ================== ========= =================== = ========== ===================
802 E802 protocol mptcp Multipath TCP 802 E802 protocol mptcp Multipath TCP
appletalk Appletalk protocol netfilter Network Filter appletalk Appletalk protocol netfilter Network Filter
ax25 AX25 netrom NET/ROM ax25 AX25 netrom NET/ROM
bridge Bridging rose X.25 PLP layer bridge Bridging rose X.25 PLP layer
core General parameter tipc TIPC core General parameter tipc TIPC
ethernet Ethernet protocol unix Unix domain sockets ethernet Ethernet protocol unix Unix domain sockets
ipv4 IP version 4 x25 X.25 protocol ipv4 IP version 4 x25 X.25 protocol
ipv6 IP version 6 ipv6 IP version 6
========= =================== = ========== ================== ========= =================== = ========== ===================
1. /proc/sys/net/core - Network core options 1. /proc/sys/net/core - Network core options
============================================ ============================================

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 258 SUBLEVEL = 259
EXTRAVERSION = EXTRAVERSION =
NAME = Kleptomaniac Octopus NAME = Kleptomaniac Octopus

View File

@ -678,6 +678,7 @@
&uart3 { &uart3 {
interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH
&omap4_pmx_core 0x17c>; &omap4_pmx_core 0x17c>;
overrun-throttle-ms = <500>;
}; };
&uart4 { &uart4 {

View File

@ -91,6 +91,13 @@ static inline pte_t pte_wrprotect(pte_t pte)
#define pte_wrprotect pte_wrprotect #define pte_wrprotect pte_wrprotect
static inline int pte_read(pte_t pte)
{
return (pte_val(pte) & _PAGE_RO) != _PAGE_NA;
}
#define pte_read pte_read
static inline int pte_write(pte_t pte) static inline int pte_write(pte_t pte)
{ {
return !(pte_val(pte) & _PAGE_RO); return !(pte_val(pte) & _PAGE_RO);

View File

@ -244,7 +244,7 @@ static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
{ {
unsigned long old; unsigned long old;
if (pte_young(*ptep)) if (!pte_young(*ptep))
return 0; return 0;
old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0); old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0);
return (old & _PAGE_ACCESSED) != 0; return (old & _PAGE_ACCESSED) != 0;

View File

@ -45,7 +45,9 @@ static inline int pte_write(pte_t pte)
return pte_val(pte) & _PAGE_RW; return pte_val(pte) & _PAGE_RW;
} }
#endif #endif
#ifndef pte_read
static inline int pte_read(pte_t pte) { return 1; } static inline int pte_read(pte_t pte) { return 1; }
#endif
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; } static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; } static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }

View File

@ -543,6 +543,17 @@ static void s390_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
s->dma_length = 0; s->dma_length = 0;
} }
} }
static unsigned long *bitmap_vzalloc(size_t bits, gfp_t flags)
{
size_t n = BITS_TO_LONGS(bits);
size_t bytes;
if (unlikely(check_mul_overflow(n, sizeof(unsigned long), &bytes)))
return NULL;
return vzalloc(bytes);
}
int zpci_dma_init_device(struct zpci_dev *zdev) int zpci_dma_init_device(struct zpci_dev *zdev)
{ {
@ -579,13 +590,13 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
zdev->end_dma - zdev->start_dma + 1); zdev->end_dma - zdev->start_dma + 1);
zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1; zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1;
zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT; zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8); zdev->iommu_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
if (!zdev->iommu_bitmap) { if (!zdev->iommu_bitmap) {
rc = -ENOMEM; rc = -ENOMEM;
goto free_dma_table; goto free_dma_table;
} }
if (!s390_iommu_strict) { if (!s390_iommu_strict) {
zdev->lazy_bitmap = vzalloc(zdev->iommu_pages / 8); zdev->lazy_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
if (!zdev->lazy_bitmap) { if (!zdev->lazy_bitmap) {
rc = -ENOMEM; rc = -ENOMEM;
goto free_bitmap; goto free_bitmap;

View File

@ -502,6 +502,10 @@
#define MSR_AMD64_VIRT_SPEC_CTRL 0xc001011f #define MSR_AMD64_VIRT_SPEC_CTRL 0xc001011f
/* Zen4 */
#define MSR_ZEN4_BP_CFG 0xc001102e
#define MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT 5
/* Fam 17h MSRs */ /* Fam 17h MSRs */
#define MSR_F17H_IRPERF 0xc00000e9 #define MSR_F17H_IRPERF 0xc00000e9

View File

@ -75,6 +75,10 @@ static const int amd_zenbleed[] =
AMD_MODEL_RANGE(0x17, 0x90, 0x0, 0x91, 0xf), AMD_MODEL_RANGE(0x17, 0x90, 0x0, 0x91, 0xf),
AMD_MODEL_RANGE(0x17, 0xa0, 0x0, 0xaf, 0xf)); AMD_MODEL_RANGE(0x17, 0xa0, 0x0, 0xaf, 0xf));
static const int amd_erratum_1485[] =
AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x19, 0x10, 0x0, 0x1f, 0xf),
AMD_MODEL_RANGE(0x19, 0x60, 0x0, 0xaf, 0xf));
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum)
{ {
int osvw_id = *erratum++; int osvw_id = *erratum++;
@ -1117,6 +1121,10 @@ static void init_amd(struct cpuinfo_x86 *c)
check_null_seg_clears_base(c); check_null_seg_clears_base(c);
zenbleed_check(c); zenbleed_check(c);
if (!cpu_has(c, X86_FEATURE_HYPERVISOR) &&
cpu_has_amd_erratum(c, amd_erratum_1485))
msr_set_bit(MSR_ZEN4_BP_CFG, MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT);
} }
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32

View File

@ -2244,13 +2244,17 @@ int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type)
{ {
u32 reg = kvm_lapic_get_reg(apic, lvt_type); u32 reg = kvm_lapic_get_reg(apic, lvt_type);
int vector, mode, trig_mode; int vector, mode, trig_mode;
int r;
if (kvm_apic_hw_enabled(apic) && !(reg & APIC_LVT_MASKED)) { if (kvm_apic_hw_enabled(apic) && !(reg & APIC_LVT_MASKED)) {
vector = reg & APIC_VECTOR_MASK; vector = reg & APIC_VECTOR_MASK;
mode = reg & APIC_MODE_MASK; mode = reg & APIC_MODE_MASK;
trig_mode = reg & APIC_LVT_LEVEL_TRIGGER; trig_mode = reg & APIC_LVT_LEVEL_TRIGGER;
return __apic_accept_irq(apic, mode, vector, 1, trig_mode,
NULL); r = __apic_accept_irq(apic, mode, vector, 1, trig_mode, NULL);
if (r && lvt_type == APIC_LVTPC)
kvm_lapic_set_reg(apic, APIC_LVTPC, reg | APIC_LVT_MASKED);
return r;
} }
return 0; return 0;
} }

View File

@ -52,6 +52,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
int polarity) int polarity)
{ {
struct irq_fwspec fwspec; struct irq_fwspec fwspec;
unsigned int irq;
if (WARN_ON(!acpi_gsi_domain_id)) { if (WARN_ON(!acpi_gsi_domain_id)) {
pr_warn("GSI: No registered irqchip, giving up\n"); pr_warn("GSI: No registered irqchip, giving up\n");
@ -63,7 +64,11 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity); fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
fwspec.param_count = 2; fwspec.param_count = 2;
return irq_create_fwspec_mapping(&fwspec); irq = irq_create_fwspec_mapping(&fwspec);
if (!irq)
return -EINVAL;
return irq;
} }
EXPORT_SYMBOL_GPL(acpi_register_gsi); EXPORT_SYMBOL_GPL(acpi_register_gsi);

View File

@ -16,6 +16,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/dmi.h>
#ifdef CONFIG_X86 #ifdef CONFIG_X86
#define valid_IRQ(i) (((i) != 0) && ((i) != 2)) #define valid_IRQ(i) (((i) != 0) && ((i) != 2))
@ -380,21 +381,117 @@ unsigned int acpi_dev_get_irq_type(int triggering, int polarity)
} }
EXPORT_SYMBOL_GPL(acpi_dev_get_irq_type); EXPORT_SYMBOL_GPL(acpi_dev_get_irq_type);
static void acpi_dev_irqresource_disabled(struct resource *res, u32 gsi) static const struct dmi_system_id medion_laptop[] = {
{
.ident = "MEDION P15651",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
DMI_MATCH(DMI_BOARD_NAME, "M15T"),
},
},
{ }
};
static const struct dmi_system_id asus_laptop[] = {
{
.ident = "Asus Vivobook K3402ZA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "K3402ZA"),
},
},
{
.ident = "Asus Vivobook K3502ZA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "K3502ZA"),
},
},
{
.ident = "Asus Vivobook S5402ZA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "S5402ZA"),
},
},
{
.ident = "Asus Vivobook S5602ZA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
},
},
{
.ident = "Asus ExpertBook B1402CBA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "B1402CBA"),
},
},
{
.ident = "Asus ExpertBook B1502CBA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "B1502CBA"),
},
},
{
.ident = "Asus ExpertBook B2402CBA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "B2402CBA"),
},
},
{
.ident = "Asus ExpertBook B2502",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"),
},
},
{ }
};
struct irq_override_cmp {
const struct dmi_system_id *system;
unsigned char irq;
unsigned char triggering;
unsigned char polarity;
unsigned char shareable;
};
static const struct irq_override_cmp skip_override_table[] = {
{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 },
{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 },
};
static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
u8 shareable)
{ {
res->start = gsi; int i;
res->end = gsi;
res->flags = IORESOURCE_IRQ | IORESOURCE_DISABLED | IORESOURCE_UNSET; for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) {
const struct irq_override_cmp *entry = &skip_override_table[i];
if (dmi_check_system(entry->system) &&
entry->irq == gsi &&
entry->triggering == triggering &&
entry->polarity == polarity &&
entry->shareable == shareable)
return false;
}
return true;
} }
static void acpi_dev_get_irqresource(struct resource *res, u32 gsi, static void acpi_dev_get_irqresource(struct resource *res, u32 gsi,
u8 triggering, u8 polarity, u8 shareable, u8 triggering, u8 polarity, u8 shareable,
bool legacy) bool check_override)
{ {
int irq, p, t; int irq, p, t;
if (!valid_IRQ(gsi)) { if (!valid_IRQ(gsi)) {
acpi_dev_irqresource_disabled(res, gsi); irqresource_disabled(res, gsi);
return; return;
} }
@ -408,7 +505,9 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi,
* using extended IRQ descriptors we take the IRQ configuration * using extended IRQ descriptors we take the IRQ configuration
* from _CRS directly. * from _CRS directly.
*/ */
if (legacy && !acpi_get_override_irq(gsi, &t, &p)) { if (check_override &&
acpi_dev_irq_override(gsi, triggering, polarity, shareable) &&
!acpi_get_override_irq(gsi, &t, &p)) {
u8 trig = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; u8 trig = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
u8 pol = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; u8 pol = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
@ -426,7 +525,7 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi,
res->start = irq; res->start = irq;
res->end = irq; res->end = irq;
} else { } else {
acpi_dev_irqresource_disabled(res, gsi); irqresource_disabled(res, gsi);
} }
} }
@ -463,7 +562,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
*/ */
irq = &ares->data.irq; irq = &ares->data.irq;
if (index >= irq->interrupt_count) { if (index >= irq->interrupt_count) {
acpi_dev_irqresource_disabled(res, 0); irqresource_disabled(res, 0);
return false; return false;
} }
acpi_dev_get_irqresource(res, irq->interrupts[index], acpi_dev_get_irqresource(res, irq->interrupts[index],
@ -473,7 +572,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
ext_irq = &ares->data.extended_irq; ext_irq = &ares->data.extended_irq;
if (index >= ext_irq->interrupt_count) { if (index >= ext_irq->interrupt_count) {
acpi_dev_irqresource_disabled(res, 0); irqresource_disabled(res, 0);
return false; return false;
} }
if (is_gsi(ext_irq)) if (is_gsi(ext_irq))
@ -481,7 +580,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
ext_irq->triggering, ext_irq->polarity, ext_irq->triggering, ext_irq->polarity,
ext_irq->shareable, false); ext_irq->shareable, false);
else else
acpi_dev_irqresource_disabled(res, 0); irqresource_disabled(res, 0);
break; break;
default: default:
res->flags = 0; res->flags = 0;

View File

@ -2422,7 +2422,7 @@ static void ata_eh_link_report(struct ata_link *link)
struct ata_eh_context *ehc = &link->eh_context; struct ata_eh_context *ehc = &link->eh_context;
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
const char *frozen, *desc; const char *frozen, *desc;
char tries_buf[6] = ""; char tries_buf[16] = "";
int tag, nr_failed = 0; int tag, nr_failed = 0;
if (ehc->i.flags & ATA_EHI_QUIET) if (ehc->i.flags & ATA_EHI_QUIET)

View File

@ -1363,7 +1363,7 @@ static int dev_get_regmap_match(struct device *dev, void *res, void *data)
/* If the user didn't specify a name match any */ /* If the user didn't specify a name match any */
if (data) if (data)
return !strcmp((*r)->name, data); return (*r)->name && !strcmp((*r)->name, data);
else else
return 1; return 1;
} }

View File

@ -67,7 +67,10 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
struct vhci_data *data = hci_get_drvdata(hdev); struct vhci_data *data = hci_get_drvdata(hdev);
memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
mutex_lock(&data->open_mutex);
skb_queue_tail(&data->readq, skb); skb_queue_tail(&data->readq, skb);
mutex_unlock(&data->open_mutex);
wake_up_interruptible(&data->read_wait); wake_up_interruptible(&data->read_wait);
return 0; return 0;

View File

@ -450,9 +450,8 @@ static int mtk_uart_apdma_device_pause(struct dma_chan *chan)
mtk_uart_apdma_write(c, VFF_EN, VFF_EN_CLR_B); mtk_uart_apdma_write(c, VFF_EN, VFF_EN_CLR_B);
mtk_uart_apdma_write(c, VFF_INT_EN, VFF_INT_EN_CLR_B); mtk_uart_apdma_write(c, VFF_INT_EN, VFF_INT_EN_CLR_B);
synchronize_irq(c->irq);
spin_unlock_irqrestore(&c->vc.lock, flags); spin_unlock_irqrestore(&c->vc.lock, flags);
synchronize_irq(c->irq);
return 0; return 0;
} }

View File

@ -1207,6 +1207,10 @@ static int stm32_mdma_resume(struct dma_chan *c)
unsigned long flags; unsigned long flags;
u32 status, reg; u32 status, reg;
/* Transfer can be terminated */
if (!chan->desc || (stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)) & STM32_MDMA_CCR_EN))
return -EPERM;
hwdesc = chan->desc->node[chan->curr_hwdesc].hwdesc; hwdesc = chan->desc->node[chan->curr_hwdesc].hwdesc;
spin_lock_irqsave(&chan->vchan.lock, flags); spin_lock_irqsave(&chan->vchan.lock, flags);

View File

@ -43,9 +43,10 @@ static int timbgpio_update_bit(struct gpio_chip *gpio, unsigned index,
unsigned offset, bool enabled) unsigned offset, bool enabled)
{ {
struct timbgpio *tgpio = gpiochip_get_data(gpio); struct timbgpio *tgpio = gpiochip_get_data(gpio);
unsigned long flags;
u32 reg; u32 reg;
spin_lock(&tgpio->lock); spin_lock_irqsave(&tgpio->lock, flags);
reg = ioread32(tgpio->membase + offset); reg = ioread32(tgpio->membase + offset);
if (enabled) if (enabled)
@ -54,7 +55,7 @@ static int timbgpio_update_bit(struct gpio_chip *gpio, unsigned index,
reg &= ~(1 << index); reg &= ~(1 << index);
iowrite32(reg, tgpio->membase + offset); iowrite32(reg, tgpio->membase + offset);
spin_unlock(&tgpio->lock); spin_unlock_irqrestore(&tgpio->lock, flags);
return 0; return 0;
} }

View File

@ -127,14 +127,14 @@ static int vf610_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
unsigned long mask = BIT(gpio); unsigned long mask = BIT(gpio);
u32 val; u32 val;
vf610_gpio_set(chip, gpio, value);
if (port->sdata && port->sdata->have_paddr) { if (port->sdata && port->sdata->have_paddr) {
val = vf610_gpio_readl(port->gpio_base + GPIO_PDDR); val = vf610_gpio_readl(port->gpio_base + GPIO_PDDR);
val |= mask; val |= mask;
vf610_gpio_writel(val, port->gpio_base + GPIO_PDDR); vf610_gpio_writel(val, port->gpio_base + GPIO_PDDR);
} }
vf610_gpio_set(chip, gpio, value);
return pinctrl_gpio_direction_output(chip->base + gpio); return pinctrl_gpio_direction_output(chip->base + gpio);
} }

View File

@ -44,6 +44,14 @@ static const struct drm_dmi_panel_orientation_data gpd_micropc = {
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
}; };
static const struct drm_dmi_panel_orientation_data gpd_onemix2s = {
.width = 1200,
.height = 1920,
.bios_dates = (const char * const []){ "05/21/2018", "10/26/2018",
"03/04/2019", NULL },
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
};
static const struct drm_dmi_panel_orientation_data gpd_pocket = { static const struct drm_dmi_panel_orientation_data gpd_pocket = {
.width = 1200, .width = 1200,
.height = 1920, .height = 1920,
@ -329,6 +337,14 @@ static const struct dmi_system_id orientation_data[] = {
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LTH17"), DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LTH17"),
}, },
.driver_data = (void *)&lcd800x1280_rightside_up, .driver_data = (void *)&lcd800x1280_rightside_up,
}, { /* One Mix 2S (generic strings, also match on bios date) */
.matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
},
.driver_data = (void *)&gpd_onemix2s,
}, },
{} {}
}; };

View File

@ -98,7 +98,7 @@ static int etnaviv_gem_prime_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
ret = dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0); ret = dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0);
if (!ret) { if (!ret) {
/* Drop the reference acquired by drm_gem_mmap_obj(). */ /* Drop the reference acquired by drm_gem_mmap_obj(). */
drm_gem_object_put(&etnaviv_obj->base); drm_gem_object_put_unlocked(&etnaviv_obj->base);
} }
return ret; return ret;

View File

@ -1051,9 +1051,21 @@ static void dsi_wait4video_done(struct msm_dsi_host *msm_host)
static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host) static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host)
{ {
u32 data;
if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO)) if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO))
return; return;
data = dsi_read(msm_host, REG_DSI_STATUS0);
/* if video mode engine is not busy, its because
* either timing engine was not turned on or the
* DSI controller has finished transmitting the video
* data already, so no need to wait in those cases
*/
if (!(data & DSI_STATUS0_VIDEO_MODE_ENGINE_BUSY))
return;
if (msm_host->power_on && msm_host->enabled) { if (msm_host->power_on && msm_host->enabled) {
dsi_wait4video_done(msm_host); dsi_wait4video_done(msm_host);
/* delay 4 ms to skip BLLP */ /* delay 4 ms to skip BLLP */

View File

@ -1623,7 +1623,7 @@ static int vmw_cmd_tex_state(struct vmw_private *dev_priv,
{ {
VMW_DECLARE_CMD_VAR(*cmd, SVGA3dCmdSetTextureState); VMW_DECLARE_CMD_VAR(*cmd, SVGA3dCmdSetTextureState);
SVGA3dTextureState *last_state = (SVGA3dTextureState *) SVGA3dTextureState *last_state = (SVGA3dTextureState *)
((unsigned long) header + header->size + sizeof(header)); ((unsigned long) header + header->size + sizeof(*header));
SVGA3dTextureState *cur_state = (SVGA3dTextureState *) SVGA3dTextureState *cur_state = (SVGA3dTextureState *)
((unsigned long) header + sizeof(*cmd)); ((unsigned long) header + sizeof(*cmd));
struct vmw_resource *ctx; struct vmw_resource *ctx;

View File

@ -130,6 +130,10 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type,
return -ENODEV; return -ENODEV;
boot_hid = usb_get_intfdata(boot_interface); boot_hid = usb_get_intfdata(boot_interface);
if (list_empty(&boot_hid->inputs)) {
hid_err(hid, "no inputs found\n");
return -ENODEV;
}
boot_hid_input = list_first_entry(&boot_hid->inputs, boot_hid_input = list_first_entry(&boot_hid->inputs,
struct hid_input, list); struct hid_input, list);

View File

@ -3723,7 +3723,8 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
goto hid_hw_init_fail; goto hid_hw_init_fail;
} }
hidpp_connect_event(hidpp); schedule_work(&hidpp->work);
flush_work(&hidpp->work);
/* Reset the HID node state */ /* Reset the HID node state */
hid_device_io_stop(hdev); hid_device_io_stop(hdev);

View File

@ -2081,6 +2081,10 @@ static const struct hid_device_id mt_devices[] = {
USB_DEVICE_ID_MTP_STM)}, USB_DEVICE_ID_MTP_STM)},
/* Synaptics devices */ /* Synaptics devices */
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_SYNAPTICS, 0xcd7e) },
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_SYNAPTICS, 0xce08) }, USB_VENDOR_ID_SYNAPTICS, 0xce08) },

View File

@ -340,7 +340,7 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
priv->adap.lock_ops = &i2c_parent_lock_ops; priv->adap.lock_ops = &i2c_parent_lock_ops;
/* Sanity check on class */ /* Sanity check on class */
if (i2c_mux_parent_classes(parent) & class) if (i2c_mux_parent_classes(parent) & class & ~I2C_CLASS_DEPRECATED)
dev_err(&parent->dev, dev_err(&parent->dev,
"Segment %d behind mux can't share classes with ancestors\n", "Segment %d behind mux can't share classes with ancestors\n",
chan_id); chan_id);

View File

@ -1113,7 +1113,7 @@ int bmp280_common_probe(struct device *dev,
* however as it happens, the BMP085 shares the chip ID of BMP180 * however as it happens, the BMP085 shares the chip ID of BMP180
* so we look for an IRQ if we have that. * so we look for an IRQ if we have that.
*/ */
if (irq > 0 || (chip_id == BMP180_CHIP_ID)) { if (irq > 0 && (chip_id == BMP180_CHIP_ID)) {
ret = bmp085_fetch_eoc_irq(dev, name, irq, data); ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
if (ret) if (ret)
goto out_disable_vdda; goto out_disable_vdda;

View File

@ -57,8 +57,8 @@
#define DPS310_RESET_MAGIC 0x09 #define DPS310_RESET_MAGIC 0x09
#define DPS310_COEF_BASE 0x10 #define DPS310_COEF_BASE 0x10
/* Make sure sleep time is <= 20ms for usleep_range */ /* Make sure sleep time is <= 30ms for usleep_range */
#define DPS310_POLL_SLEEP_US(t) min(20000, (t) / 8) #define DPS310_POLL_SLEEP_US(t) min(30000, (t) / 8)
/* Silently handle error in rate value here */ /* Silently handle error in rate value here */
#define DPS310_POLL_TIMEOUT_US(rc) ((rc) <= 0 ? 1000000 : 1000000 / (rc)) #define DPS310_POLL_TIMEOUT_US(rc) ((rc) <= 0 ? 1000000 : 1000000 / (rc))
@ -402,8 +402,8 @@ static int dps310_reset_wait(struct dps310_data *data)
if (rc) if (rc)
return rc; return rc;
/* Wait for device chip access: 2.5ms in specification */ /* Wait for device chip access: 15ms in specification */
usleep_range(2500, 12000); usleep_range(15000, 55000);
return 0; return 0;
} }

View File

@ -76,7 +76,7 @@ static bool ms5611_prom_is_valid(u16 *prom, size_t len)
crc = (crc >> 12) & 0x000F; crc = (crc >> 12) & 0x000F;
return crc_orig != 0x0000 && crc == crc_orig; return crc == crc_orig;
} }
static int ms5611_read_prom(struct iio_dev *indio_dev) static int ms5611_read_prom(struct iio_dev *indio_dev)

View File

@ -1965,6 +1965,9 @@ static int send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid)
int win; int win;
skb = get_skb(NULL, sizeof(*req), GFP_KERNEL); skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
if (!skb)
return -ENOMEM;
req = __skb_put_zero(skb, sizeof(*req)); req = __skb_put_zero(skb, sizeof(*req));
req->op_compl = htonl(WR_OP_V(FW_OFLD_CONNECTION_WR)); req->op_compl = htonl(WR_OP_V(FW_OFLD_CONNECTION_WR));
req->len16_pkd = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*req), 16))); req->len16_pkd = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*req), 16)));

View File

@ -252,6 +252,7 @@ static const struct xpad_device {
{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
{ 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 },
{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 }, { 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
@ -446,6 +447,7 @@ static const struct usb_device_id xpad_table[] = {
XPAD_XBOXONE_VENDOR(0x0f0d), /* Hori Controllers */ XPAD_XBOXONE_VENDOR(0x0f0d), /* Hori Controllers */
XPAD_XBOX360_VENDOR(0x1038), /* SteelSeries Controllers */ XPAD_XBOX360_VENDOR(0x1038), /* SteelSeries Controllers */
XPAD_XBOX360_VENDOR(0x11c9), /* Nacon GC100XF */ XPAD_XBOX360_VENDOR(0x11c9), /* Nacon GC100XF */
XPAD_XBOX360_VENDOR(0x11ff), /* PXN V900 */
XPAD_XBOX360_VENDOR(0x1209), /* Ardwiino Controllers */ XPAD_XBOX360_VENDOR(0x1209), /* Ardwiino Controllers */
XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */
XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */

View File

@ -425,6 +425,7 @@ static void powermate_disconnect(struct usb_interface *intf)
pm->requires_update = 0; pm->requires_update = 0;
usb_kill_urb(pm->irq); usb_kill_urb(pm->irq);
input_unregister_device(pm->input); input_unregister_device(pm->input);
usb_kill_urb(pm->config);
usb_free_urb(pm->irq); usb_free_urb(pm->irq);
usb_free_urb(pm->config); usb_free_urb(pm->config);
powermate_free_buffers(interface_to_usbdev(intf), pm); powermate_free_buffers(interface_to_usbdev(intf), pm);

View File

@ -2114,6 +2114,7 @@ static int elantech_setup_ps2(struct psmouse *psmouse,
psmouse->protocol_handler = elantech_process_byte; psmouse->protocol_handler = elantech_process_byte;
psmouse->disconnect = elantech_disconnect; psmouse->disconnect = elantech_disconnect;
psmouse->reconnect = elantech_reconnect; psmouse->reconnect = elantech_reconnect;
psmouse->fast_reconnect = NULL;
psmouse->pktsize = info->hw_version > 1 ? 6 : 4; psmouse->pktsize = info->hw_version > 1 ? 6 : 4;
return 0; return 0;

View File

@ -1617,6 +1617,7 @@ static int synaptics_init_ps2(struct psmouse *psmouse,
psmouse->set_rate = synaptics_set_rate; psmouse->set_rate = synaptics_set_rate;
psmouse->disconnect = synaptics_disconnect; psmouse->disconnect = synaptics_disconnect;
psmouse->reconnect = synaptics_reconnect; psmouse->reconnect = synaptics_reconnect;
psmouse->fast_reconnect = NULL;
psmouse->cleanup = synaptics_reset; psmouse->cleanup = synaptics_reset;
/* Synaptics can usually stay in sync without extra help */ /* Synaptics can usually stay in sync without extra help */
psmouse->resync_time = 0; psmouse->resync_time = 0;

View File

@ -389,17 +389,13 @@ EXPORT_SYMBOL_GPL(mcb_free_dev);
static int __mcb_bus_add_devices(struct device *dev, void *data) static int __mcb_bus_add_devices(struct device *dev, void *data)
{ {
struct mcb_device *mdev = to_mcb_device(dev);
int retval; int retval;
if (mdev->is_added)
return 0;
retval = device_attach(dev); retval = device_attach(dev);
if (retval < 0) if (retval < 0) {
dev_err(dev, "Error adding device (%d)\n", retval); dev_err(dev, "Error adding device (%d)\n", retval);
return retval;
mdev->is_added = true; }
return 0; return 0;
} }

View File

@ -99,8 +99,6 @@ static int chameleon_parse_gdd(struct mcb_bus *bus,
mdev->mem.end = mdev->mem.start + size - 1; mdev->mem.end = mdev->mem.start + size - 1;
mdev->mem.flags = IORESOURCE_MEM; mdev->mem.flags = IORESOURCE_MEM;
mdev->is_added = false;
ret = mcb_device_register(bus, mdev); ret = mcb_device_register(bus, mdev);
if (ret < 0) if (ret < 0)
goto err; goto err;

View File

@ -95,7 +95,7 @@ static int mmc_decode_cid(struct mmc_card *card)
case 3: /* MMC v3.1 - v3.3 */ case 3: /* MMC v3.1 - v3.3 */
case 4: /* MMC v4 */ case 4: /* MMC v4 */
card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); card->cid.oemid = UNSTUFF_BITS(resp, 104, 8);
card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);

View File

@ -1014,8 +1014,14 @@ static int mmc_sdio_resume(struct mmc_host *host)
} }
err = mmc_sdio_reinit_card(host); err = mmc_sdio_reinit_card(host);
} else if (mmc_card_wake_sdio_irq(host)) { } else if (mmc_card_wake_sdio_irq(host)) {
/* We may have switched to 1-bit mode during suspend */ /*
* We may have switched to 1-bit mode during suspend,
* need to hold retuning, because tuning only supprt
* 4-bit mode or 8 bit mode.
*/
mmc_retune_hold_now(host);
err = sdio_enable_4bit_bus(host->card); err = sdio_enable_4bit_bus(host->card);
mmc_retune_release(host);
} }
if (err) if (err)

View File

@ -533,6 +533,17 @@ static int physmap_flash_probe(struct platform_device *dev)
if (info->probe_type) { if (info->probe_type) {
info->mtds[i] = do_map_probe(info->probe_type, info->mtds[i] = do_map_probe(info->probe_type,
&info->maps[i]); &info->maps[i]);
/* Fall back to mapping region as ROM */
if (!info->mtds[i] && IS_ENABLED(CONFIG_MTD_ROM) &&
strcmp(info->probe_type, "map_rom")) {
dev_warn(&dev->dev,
"map_probe() failed for type %s\n",
info->probe_type);
info->mtds[i] = do_map_probe("map_rom",
&info->maps[i]);
}
} else { } else {
int j; int j;

View File

@ -2972,7 +2972,7 @@ static int qcom_nandc_probe(struct platform_device *pdev)
err_aon_clk: err_aon_clk:
clk_disable_unprepare(nandc->core_clk); clk_disable_unprepare(nandc->core_clk);
err_core_clk: err_core_clk:
dma_unmap_resource(dev, res->start, resource_size(res), dma_unmap_resource(dev, nandc->base_dma, resource_size(res),
DMA_BIDIRECTIONAL, 0); DMA_BIDIRECTIONAL, 0);
return ret; return ret;
} }

View File

@ -12,7 +12,7 @@
#define SPINAND_MFR_MICRON 0x2c #define SPINAND_MFR_MICRON 0x2c
#define MICRON_STATUS_ECC_MASK GENMASK(7, 4) #define MICRON_STATUS_ECC_MASK GENMASK(6, 4)
#define MICRON_STATUS_ECC_NO_BITFLIPS (0 << 4) #define MICRON_STATUS_ECC_NO_BITFLIPS (0 << 4)
#define MICRON_STATUS_ECC_1TO3_BITFLIPS (1 << 4) #define MICRON_STATUS_ECC_1TO3_BITFLIPS (1 << 4)
#define MICRON_STATUS_ECC_4TO6_BITFLIPS (3 << 4) #define MICRON_STATUS_ECC_4TO6_BITFLIPS (3 << 4)

View File

@ -1341,7 +1341,7 @@ void i40e_clear_hw(struct i40e_hw *hw)
I40E_PFLAN_QALLOC_FIRSTQ_SHIFT; I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >> j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
I40E_PFLAN_QALLOC_LASTQ_SHIFT; I40E_PFLAN_QALLOC_LASTQ_SHIFT;
if (val & I40E_PFLAN_QALLOC_VALID_MASK) if (val & I40E_PFLAN_QALLOC_VALID_MASK && j >= base_queue)
num_queues = (j - base_queue) + 1; num_queues = (j - base_queue) + 1;
else else
num_queues = 0; num_queues = 0;
@ -1351,7 +1351,7 @@ void i40e_clear_hw(struct i40e_hw *hw)
I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT; I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >> j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
I40E_PF_VT_PFALLOC_LASTVF_SHIFT; I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
if (val & I40E_PF_VT_PFALLOC_VALID_MASK) if (val & I40E_PF_VT_PFALLOC_VALID_MASK && j >= i)
num_vfs = (j - i) + 1; num_vfs = (j - i) + 1;
else else
num_vfs = 0; num_vfs = 0;

View File

@ -1015,8 +1015,7 @@ static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi)
ctxt->info.q_opt_rss = ((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) & ctxt->info.q_opt_rss = ((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) &
ICE_AQ_VSI_Q_OPT_RSS_LUT_M) | ICE_AQ_VSI_Q_OPT_RSS_LUT_M) |
((hash_type << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) & (hash_type & ICE_AQ_VSI_Q_OPT_RSS_HASH_M);
ICE_AQ_VSI_Q_OPT_RSS_HASH_M);
} }
/** /**

View File

@ -28,6 +28,9 @@ static inline void ixgbe_alloc_vf_macvlans(struct ixgbe_adapter *adapter,
struct vf_macvlans *mv_list; struct vf_macvlans *mv_list;
int num_vf_macvlans, i; int num_vf_macvlans, i;
/* Initialize list of VF macvlans */
INIT_LIST_HEAD(&adapter->vf_mvs.l);
num_vf_macvlans = hw->mac.num_rar_entries - num_vf_macvlans = hw->mac.num_rar_entries -
(IXGBE_MAX_PF_MACVLANS + 1 + num_vfs); (IXGBE_MAX_PF_MACVLANS + 1 + num_vfs);
if (!num_vf_macvlans) if (!num_vf_macvlans)
@ -36,8 +39,6 @@ static inline void ixgbe_alloc_vf_macvlans(struct ixgbe_adapter *adapter,
mv_list = kcalloc(num_vf_macvlans, sizeof(struct vf_macvlans), mv_list = kcalloc(num_vf_macvlans, sizeof(struct vf_macvlans),
GFP_KERNEL); GFP_KERNEL);
if (mv_list) { if (mv_list) {
/* Initialize list of VF macvlans */
INIT_LIST_HEAD(&adapter->vf_mvs.l);
for (i = 0; i < num_vf_macvlans; i++) { for (i = 0; i < num_vf_macvlans; i++) {
mv_list[i].vf = -1; mv_list[i].vf = -1;
mv_list[i].free = true; mv_list[i].free = true;

View File

@ -2201,7 +2201,7 @@ struct rx_ring_info {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t data_addr; dma_addr_t data_addr;
DEFINE_DMA_UNMAP_LEN(data_size); DEFINE_DMA_UNMAP_LEN(data_size);
dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT]; dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT ?: 1];
}; };
enum flow_control { enum flow_control {

View File

@ -294,8 +294,8 @@ const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops = {
.fdb_clear_offload = mlxsw_sp_nve_vxlan_clear_offload, .fdb_clear_offload = mlxsw_sp_nve_vxlan_clear_offload,
}; };
static bool mlxsw_sp2_nve_vxlan_learning_set(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp2_nve_vxlan_learning_set(struct mlxsw_sp *mlxsw_sp,
bool learning_en) bool learning_en)
{ {
char tnpc_pl[MLXSW_REG_TNPC_LEN]; char tnpc_pl[MLXSW_REG_TNPC_LEN];

View File

@ -113,7 +113,10 @@ static void qed_ll2b_complete_tx_packet(void *cxt,
static int qed_ll2_alloc_buffer(struct qed_dev *cdev, static int qed_ll2_alloc_buffer(struct qed_dev *cdev,
u8 **data, dma_addr_t *phys_addr) u8 **data, dma_addr_t *phys_addr)
{ {
*data = kmalloc(cdev->ll2->rx_size, GFP_ATOMIC); size_t size = cdev->ll2->rx_size + NET_SKB_PAD +
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
*data = kmalloc(size, GFP_ATOMIC);
if (!(*data)) { if (!(*data)) {
DP_INFO(cdev, "Failed to allocate LL2 buffer data\n"); DP_INFO(cdev, "Failed to allocate LL2 buffer data\n");
return -ENOMEM; return -ENOMEM;
@ -2449,7 +2452,7 @@ static int qed_ll2_start(struct qed_dev *cdev, struct qed_ll2_params *params)
INIT_LIST_HEAD(&cdev->ll2->list); INIT_LIST_HEAD(&cdev->ll2->list);
spin_lock_init(&cdev->ll2->lock); spin_lock_init(&cdev->ll2->lock);
cdev->ll2->rx_size = NET_SKB_PAD + ETH_HLEN + cdev->ll2->rx_size = PRM_DMA_PAD_BYTES_NUM + ETH_HLEN +
L1_CACHE_BYTES + params->mtu; L1_CACHE_BYTES + params->mtu;
/* Allocate memory for LL2. /* Allocate memory for LL2.

View File

@ -1703,6 +1703,8 @@ static int ravb_close(struct net_device *ndev)
of_phy_deregister_fixed_link(np); of_phy_deregister_fixed_link(np);
} }
cancel_work_sync(&priv->work);
if (priv->chip_id != RCAR_GEN2) { if (priv->chip_id != RCAR_GEN2) {
free_irq(priv->tx_irqs[RAVB_NC], ndev); free_irq(priv->tx_irqs[RAVB_NC], ndev);
free_irq(priv->rx_irqs[RAVB_NC], ndev); free_irq(priv->rx_irqs[RAVB_NC], ndev);
@ -2212,14 +2214,14 @@ static int ravb_remove(struct platform_device *pdev)
if (priv->chip_id != RCAR_GEN2) if (priv->chip_id != RCAR_GEN2)
ravb_ptp_stop(ndev); ravb_ptp_stop(ndev);
dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,
priv->desc_bat_dma);
/* Set reset mode */ /* Set reset mode */
ravb_write(ndev, CCC_OPC_RESET, CCC); ravb_write(ndev, CCC_OPC_RESET, CCC);
unregister_netdev(ndev); unregister_netdev(ndev);
netif_napi_del(&priv->napi[RAVB_NC]); netif_napi_del(&priv->napi[RAVB_NC]);
netif_napi_del(&priv->napi[RAVB_BE]); netif_napi_del(&priv->napi[RAVB_BE]);
ravb_mdio_release(priv); ravb_mdio_release(priv);
dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,
priv->desc_bat_dma);
pm_runtime_put_sync(&pdev->dev); pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
free_netdev(ndev); free_netdev(ndev);

View File

@ -2782,7 +2782,6 @@ static int ca8210_register_ext_clock(struct spi_device *spi)
struct device_node *np = spi->dev.of_node; struct device_node *np = spi->dev.of_node;
struct ca8210_priv *priv = spi_get_drvdata(spi); struct ca8210_priv *priv = spi_get_drvdata(spi);
struct ca8210_platform_data *pdata = spi->dev.platform_data; struct ca8210_platform_data *pdata = spi->dev.platform_data;
int ret = 0;
if (!np) if (!np)
return -EFAULT; return -EFAULT;
@ -2799,18 +2798,8 @@ static int ca8210_register_ext_clock(struct spi_device *spi)
dev_crit(&spi->dev, "Failed to register external clk\n"); dev_crit(&spi->dev, "Failed to register external clk\n");
return PTR_ERR(priv->clk); return PTR_ERR(priv->clk);
} }
ret = of_clk_add_provider(np, of_clk_src_simple_get, priv->clk);
if (ret) {
clk_unregister(priv->clk);
dev_crit(
&spi->dev,
"Failed to register external clock as clock provider\n"
);
} else {
dev_info(&spi->dev, "External clock set as clock provider\n");
}
return ret; return of_clk_add_provider(np, of_clk_src_simple_get, priv->clk);
} }
/** /**
@ -2822,8 +2811,8 @@ static void ca8210_unregister_ext_clock(struct spi_device *spi)
{ {
struct ca8210_priv *priv = spi_get_drvdata(spi); struct ca8210_priv *priv = spi_get_drvdata(spi);
if (!priv->clk) if (IS_ERR_OR_NULL(priv->clk))
return return;
of_clk_del_provider(spi->dev.of_node); of_clk_del_provider(spi->dev.of_node);
clk_unregister(priv->clk); clk_unregister(priv->clk);

View File

@ -3134,10 +3134,11 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
struct net *net = sock_net(&tfile->sk); struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun; struct tun_struct *tun;
void __user* argp = (void __user*)arg; void __user* argp = (void __user*)arg;
unsigned int ifindex, carrier; unsigned int carrier;
struct ifreq ifr; struct ifreq ifr;
kuid_t owner; kuid_t owner;
kgid_t group; kgid_t group;
int ifindex;
int sndbuf; int sndbuf;
int vnet_hdr_sz; int vnet_hdr_sz;
int le; int le;
@ -3194,7 +3195,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
ret = -EFAULT; ret = -EFAULT;
if (copy_from_user(&ifindex, argp, sizeof(ifindex))) if (copy_from_user(&ifindex, argp, sizeof(ifindex)))
goto unlock; goto unlock;
ret = -EINVAL;
if (ifindex < 0)
goto unlock;
ret = 0; ret = 0;
tfile->ifindex = ifindex; tfile->ifindex = ifindex;
goto unlock; goto unlock;

View File

@ -221,13 +221,18 @@ static int dm9601_mdio_read(struct net_device *netdev, int phy_id, int loc)
struct usbnet *dev = netdev_priv(netdev); struct usbnet *dev = netdev_priv(netdev);
__le16 res; __le16 res;
int err;
if (phy_id) { if (phy_id) {
netdev_dbg(dev->net, "Only internal phy supported\n"); netdev_dbg(dev->net, "Only internal phy supported\n");
return 0; return 0;
} }
dm_read_shared_word(dev, 1, loc, &res); err = dm_read_shared_word(dev, 1, loc, &res);
if (err < 0) {
netdev_err(dev->net, "MDIO read error: %d\n", err);
return err;
}
netdev_dbg(dev->net, netdev_dbg(dev->net,
"dm9601_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n", "dm9601_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",

View File

@ -1040,7 +1040,7 @@ static int smsc95xx_reset(struct usbnet *dev)
if (timeout >= 100) { if (timeout >= 100) {
netdev_warn(dev->net, "timeout waiting for completion of Lite Reset\n"); netdev_warn(dev->net, "timeout waiting for completion of Lite Reset\n");
return ret; return -ETIMEDOUT;
} }
ret = smsc95xx_write_reg(dev, PM_CTRL, PM_CTL_PHY_RST_); ret = smsc95xx_write_reg(dev, PM_CTRL, PM_CTL_PHY_RST_);

View File

@ -41,7 +41,6 @@
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
#include <xen/balloon.h> #include <xen/balloon.h>
#define XENVIF_QUEUE_LENGTH 32
#define XENVIF_NAPI_WEIGHT 64 #define XENVIF_NAPI_WEIGHT 64
/* Number of bytes allowed on the internal guest Rx queue. */ /* Number of bytes allowed on the internal guest Rx queue. */
@ -526,8 +525,6 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
dev->features = dev->hw_features | NETIF_F_RXCSUM; dev->features = dev->hw_features | NETIF_F_RXCSUM;
dev->ethtool_ops = &xenvif_ethtool_ops; dev->ethtool_ops = &xenvif_ethtool_ops;
dev->tx_queue_len = XENVIF_QUEUE_LENGTH;
dev->min_mtu = ETH_MIN_MTU; dev->min_mtu = ETH_MIN_MTU;
dev->max_mtu = ETH_MAX_MTU - VLAN_ETH_HLEN; dev->max_mtu = ETH_MAX_MTU - VLAN_ETH_HLEN;

View File

@ -122,16 +122,10 @@ static int phy_mdm6600_power_on(struct phy *x)
{ {
struct phy_mdm6600 *ddata = phy_get_drvdata(x); struct phy_mdm6600 *ddata = phy_get_drvdata(x);
struct gpio_desc *enable_gpio = ddata->ctrl_gpios[PHY_MDM6600_ENABLE]; struct gpio_desc *enable_gpio = ddata->ctrl_gpios[PHY_MDM6600_ENABLE];
int error;
if (!ddata->enabled) if (!ddata->enabled)
return -ENODEV; return -ENODEV;
error = pinctrl_pm_select_default_state(ddata->dev);
if (error)
dev_warn(ddata->dev, "%s: error with default_state: %i\n",
__func__, error);
gpiod_set_value_cansleep(enable_gpio, 1); gpiod_set_value_cansleep(enable_gpio, 1);
/* Allow aggressive PM for USB, it's only needed for n_gsm port */ /* Allow aggressive PM for USB, it's only needed for n_gsm port */
@ -160,11 +154,6 @@ static int phy_mdm6600_power_off(struct phy *x)
gpiod_set_value_cansleep(enable_gpio, 0); gpiod_set_value_cansleep(enable_gpio, 0);
error = pinctrl_pm_select_sleep_state(ddata->dev);
if (error)
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
__func__, error);
return 0; return 0;
} }
@ -455,6 +444,7 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
{ {
struct gpio_desc *reset_gpio = struct gpio_desc *reset_gpio =
ddata->ctrl_gpios[PHY_MDM6600_RESET]; ddata->ctrl_gpios[PHY_MDM6600_RESET];
int error;
ddata->enabled = false; ddata->enabled = false;
phy_mdm6600_cmd(ddata, PHY_MDM6600_CMD_BP_SHUTDOWN_REQ); phy_mdm6600_cmd(ddata, PHY_MDM6600_CMD_BP_SHUTDOWN_REQ);
@ -470,6 +460,17 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
} else { } else {
dev_err(ddata->dev, "Timed out powering down\n"); dev_err(ddata->dev, "Timed out powering down\n");
} }
/*
* Keep reset gpio high with padconf internal pull-up resistor to
* prevent modem from waking up during deeper SoC idle states. The
* gpio bank lines can have glitches if not in the always-on wkup
* domain.
*/
error = pinctrl_pm_select_sleep_state(ddata->dev);
if (error)
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
__func__, error);
} }
static void phy_mdm6600_deferred_power_on(struct work_struct *work) static void phy_mdm6600_deferred_power_on(struct work_struct *work)
@ -570,12 +571,6 @@ static int phy_mdm6600_probe(struct platform_device *pdev)
ddata->dev = &pdev->dev; ddata->dev = &pdev->dev;
platform_set_drvdata(pdev, ddata); platform_set_drvdata(pdev, ddata);
/* Active state selected in phy_mdm6600_power_on() */
error = pinctrl_pm_select_sleep_state(ddata->dev);
if (error)
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
__func__, error);
error = phy_mdm6600_init_lines(ddata); error = phy_mdm6600_init_lines(ddata);
if (error) if (error)
return error; return error;
@ -626,10 +621,12 @@ static int phy_mdm6600_probe(struct platform_device *pdev)
pm_runtime_put_autosuspend(ddata->dev); pm_runtime_put_autosuspend(ddata->dev);
cleanup: cleanup:
if (error < 0) if (error < 0) {
phy_mdm6600_device_power_off(ddata); phy_mdm6600_device_power_off(ddata);
pm_runtime_disable(ddata->dev); pm_runtime_disable(ddata->dev);
pm_runtime_dont_use_autosuspend(ddata->dev); pm_runtime_dont_use_autosuspend(ddata->dev);
}
return error; return error;
} }
@ -638,6 +635,7 @@ static int phy_mdm6600_remove(struct platform_device *pdev)
struct phy_mdm6600 *ddata = platform_get_drvdata(pdev); struct phy_mdm6600 *ddata = platform_get_drvdata(pdev);
struct gpio_desc *reset_gpio = ddata->ctrl_gpios[PHY_MDM6600_RESET]; struct gpio_desc *reset_gpio = ddata->ctrl_gpios[PHY_MDM6600_RESET];
pm_runtime_get_noresume(ddata->dev);
pm_runtime_dont_use_autosuspend(ddata->dev); pm_runtime_dont_use_autosuspend(ddata->dev);
pm_runtime_put_sync(ddata->dev); pm_runtime_put_sync(ddata->dev);
pm_runtime_disable(ddata->dev); pm_runtime_disable(ddata->dev);

View File

@ -146,6 +146,7 @@ static void hibvt_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
value = readl(base + PWM_CTRL_ADDR(pwm->hwpwm)); value = readl(base + PWM_CTRL_ADDR(pwm->hwpwm));
state->enabled = (PWM_ENABLE_MASK & value); state->enabled = (PWM_ENABLE_MASK & value);
state->polarity = (PWM_POLARITY_MASK & value) ? PWM_POLARITY_INVERSED : PWM_POLARITY_NORMAL;
} }
static int hibvt_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, static int hibvt_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,

View File

@ -5355,15 +5355,11 @@ regulator_register(const struct regulator_desc *regulator_desc,
mutex_lock(&regulator_list_mutex); mutex_lock(&regulator_list_mutex);
regulator_ena_gpio_free(rdev); regulator_ena_gpio_free(rdev);
mutex_unlock(&regulator_list_mutex); mutex_unlock(&regulator_list_mutex);
put_device(&rdev->dev);
rdev = NULL;
clean: clean:
if (dangling_of_gpiod) if (dangling_of_gpiod)
gpiod_put(config->ena_gpiod); gpiod_put(config->ena_gpiod);
if (rdev && rdev->dev.of_node)
of_node_put(rdev->dev.of_node);
kfree(rdev);
kfree(config); kfree(config);
put_device(&rdev->dev);
rinse: rinse:
if (dangling_cfg_gpiod) if (dangling_cfg_gpiod)
gpiod_put(cfg->ena_gpiod); gpiod_put(cfg->ena_gpiod);

View File

@ -149,6 +149,10 @@ int usb_device_supports_lpm(struct usb_device *udev)
if (udev->quirks & USB_QUIRK_NO_LPM) if (udev->quirks & USB_QUIRK_NO_LPM)
return 0; return 0;
/* Skip if the device BOS descriptor couldn't be read */
if (!udev->bos)
return 0;
/* USB 2.1 (and greater) devices indicate LPM support through /* USB 2.1 (and greater) devices indicate LPM support through
* their USB 2.0 Extended Capabilities BOS descriptor. * their USB 2.0 Extended Capabilities BOS descriptor.
*/ */
@ -325,6 +329,10 @@ static void usb_set_lpm_parameters(struct usb_device *udev)
if (!udev->lpm_capable || udev->speed < USB_SPEED_SUPER) if (!udev->lpm_capable || udev->speed < USB_SPEED_SUPER)
return; return;
/* Skip if the device BOS descriptor couldn't be read */
if (!udev->bos)
return;
hub = usb_hub_to_struct_hub(udev->parent); hub = usb_hub_to_struct_hub(udev->parent);
/* It doesn't take time to transition the roothub into U0, since it /* It doesn't take time to transition the roothub into U0, since it
* doesn't have an upstream link. * doesn't have an upstream link.
@ -2679,7 +2687,8 @@ int usb_authorize_device(struct usb_device *usb_dev)
} }
/* /*
* Return 1 if port speed is SuperSpeedPlus, 0 otherwise * Return 1 if port speed is SuperSpeedPlus, 0 otherwise or if the
* capability couldn't be checked.
* check it from the link protocol field of the current speed ID attribute. * check it from the link protocol field of the current speed ID attribute.
* current speed ID is got from ext port status request. Sublink speed attribute * current speed ID is got from ext port status request. Sublink speed attribute
* table is returned with the hub BOS SSP device capability descriptor * table is returned with the hub BOS SSP device capability descriptor
@ -2689,8 +2698,12 @@ static int port_speed_is_ssp(struct usb_device *hdev, int speed_id)
int ssa_count; int ssa_count;
u32 ss_attr; u32 ss_attr;
int i; int i;
struct usb_ssp_cap_descriptor *ssp_cap = hdev->bos->ssp_cap; struct usb_ssp_cap_descriptor *ssp_cap;
if (!hdev->bos)
return 0;
ssp_cap = hdev->bos->ssp_cap;
if (!ssp_cap) if (!ssp_cap)
return 0; return 0;
@ -4092,8 +4105,15 @@ static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev,
enum usb3_link_state state) enum usb3_link_state state)
{ {
int timeout, ret; int timeout, ret;
__u8 u1_mel = udev->bos->ss_cap->bU1devExitLat; __u8 u1_mel;
__le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat; __le16 u2_mel;
/* Skip if the device BOS descriptor couldn't be read */
if (!udev->bos)
return;
u1_mel = udev->bos->ss_cap->bU1devExitLat;
u2_mel = udev->bos->ss_cap->bU2DevExitLat;
/* If the device says it doesn't have *any* exit latency to come out of /* If the device says it doesn't have *any* exit latency to come out of
* U1 or U2, it's probably lying. Assume it doesn't implement that link * U1 or U2, it's probably lying. Assume it doesn't implement that link

View File

@ -141,7 +141,7 @@ static inline int hub_is_superspeedplus(struct usb_device *hdev)
{ {
return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS && return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS &&
le16_to_cpu(hdev->descriptor.bcdUSB) >= 0x0310 && le16_to_cpu(hdev->descriptor.bcdUSB) >= 0x0310 &&
hdev->bos->ssp_cap); hdev->bos && hdev->bos->ssp_cap);
} }
static inline unsigned hub_power_on_good_delay(struct usb_hub *hub) static inline unsigned hub_power_on_good_delay(struct usb_hub *hub)

View File

@ -250,9 +250,46 @@ int dwc3_core_soft_reset(struct dwc3 *dwc)
* XHCI driver will reset the host block. If dwc3 was configured for * XHCI driver will reset the host block. If dwc3 was configured for
* host-only mode or current role is host, then we can return early. * host-only mode or current role is host, then we can return early.
*/ */
if (dwc->dr_mode == USB_DR_MODE_HOST || dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST) if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST)
return 0; return 0;
/*
* If the dr_mode is host and the dwc->current_dr_role is not the
* corresponding DWC3_GCTL_PRTCAP_HOST, then the dwc3_core_init_mode
* isn't executed yet. Ensure the phy is ready before the controller
* updates the GCTL.PRTCAPDIR or other settings by soft-resetting
* the phy.
*
* Note: GUSB3PIPECTL[n] and GUSB2PHYCFG[n] are port settings where n
* is port index. If this is a multiport host, then we need to reset
* all active ports.
*/
if (dwc->dr_mode == USB_DR_MODE_HOST) {
u32 usb3_port;
u32 usb2_port;
usb3_port = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
usb3_port |= DWC3_GUSB3PIPECTL_PHYSOFTRST;
dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), usb3_port);
usb2_port = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
usb2_port |= DWC3_GUSB2PHYCFG_PHYSOFTRST;
dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), usb2_port);
/* Small delay for phy reset assertion */
usleep_range(1000, 2000);
usb3_port &= ~DWC3_GUSB3PIPECTL_PHYSOFTRST;
dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), usb3_port);
usb2_port &= ~DWC3_GUSB2PHYCFG_PHYSOFTRST;
dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), usb2_port);
/* Wait for clock synchronization */
msleep(50);
return 0;
}
reg = dwc3_readl(dwc->regs, DWC3_DCTL); reg = dwc3_readl(dwc->regs, DWC3_DCTL);
reg |= DWC3_DCTL_CSFTRST; reg |= DWC3_DCTL_CSFTRST;
dwc3_writel(dwc->regs, DWC3_DCTL, reg); dwc3_writel(dwc->regs, DWC3_DCTL, reg);

View File

@ -1180,7 +1180,8 @@ static int ncm_unwrap_ntb(struct gether *port,
struct sk_buff_head *list) struct sk_buff_head *list)
{ {
struct f_ncm *ncm = func_to_ncm(&port->func); struct f_ncm *ncm = func_to_ncm(&port->func);
__le16 *tmp = (void *) skb->data; unsigned char *ntb_ptr = skb->data;
__le16 *tmp;
unsigned index, index2; unsigned index, index2;
int ndp_index; int ndp_index;
unsigned dg_len, dg_len2; unsigned dg_len, dg_len2;
@ -1193,6 +1194,10 @@ static int ncm_unwrap_ntb(struct gether *port,
const struct ndp_parser_opts *opts = ncm->parser_opts; const struct ndp_parser_opts *opts = ncm->parser_opts;
unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0; unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0;
int dgram_counter; int dgram_counter;
int to_process = skb->len;
parse_ntb:
tmp = (__le16 *)ntb_ptr;
/* dwSignature */ /* dwSignature */
if (get_unaligned_le32(tmp) != opts->nth_sign) { if (get_unaligned_le32(tmp) != opts->nth_sign) {
@ -1239,7 +1244,7 @@ static int ncm_unwrap_ntb(struct gether *port,
* walk through NDP * walk through NDP
* dwSignature * dwSignature
*/ */
tmp = (void *)(skb->data + ndp_index); tmp = (__le16 *)(ntb_ptr + ndp_index);
if (get_unaligned_le32(tmp) != ncm->ndp_sign) { if (get_unaligned_le32(tmp) != ncm->ndp_sign) {
INFO(port->func.config->cdev, "Wrong NDP SIGN\n"); INFO(port->func.config->cdev, "Wrong NDP SIGN\n");
goto err; goto err;
@ -1296,11 +1301,11 @@ static int ncm_unwrap_ntb(struct gether *port,
if (ncm->is_crc) { if (ncm->is_crc) {
uint32_t crc, crc2; uint32_t crc, crc2;
crc = get_unaligned_le32(skb->data + crc = get_unaligned_le32(ntb_ptr +
index + dg_len - index + dg_len -
crc_len); crc_len);
crc2 = ~crc32_le(~0, crc2 = ~crc32_le(~0,
skb->data + index, ntb_ptr + index,
dg_len - crc_len); dg_len - crc_len);
if (crc != crc2) { if (crc != crc2) {
INFO(port->func.config->cdev, INFO(port->func.config->cdev,
@ -1327,7 +1332,7 @@ static int ncm_unwrap_ntb(struct gether *port,
dg_len - crc_len); dg_len - crc_len);
if (skb2 == NULL) if (skb2 == NULL)
goto err; goto err;
skb_put_data(skb2, skb->data + index, skb_put_data(skb2, ntb_ptr + index,
dg_len - crc_len); dg_len - crc_len);
skb_queue_tail(list, skb2); skb_queue_tail(list, skb2);
@ -1340,10 +1345,17 @@ static int ncm_unwrap_ntb(struct gether *port,
} while (ndp_len > 2 * (opts->dgram_item_len * 2)); } while (ndp_len > 2 * (opts->dgram_item_len * 2));
} while (ndp_index); } while (ndp_index);
dev_consume_skb_any(skb);
VDBG(port->func.config->cdev, VDBG(port->func.config->cdev,
"Parsed NTB with %d frames\n", dgram_counter); "Parsed NTB with %d frames\n", dgram_counter);
to_process -= block_len;
if (to_process != 0) {
ntb_ptr = (unsigned char *)(ntb_ptr + block_len);
goto parse_ntb;
}
dev_consume_skb_any(skb);
return 0; return 0;
err: err:
skb_queue_purge(list); skb_queue_purge(list);

View File

@ -496,11 +496,13 @@ static int xudc_eptxrx(struct xusb_ep *ep, struct xusb_req *req,
/* Get the Buffer address and copy the transmit data.*/ /* Get the Buffer address and copy the transmit data.*/
eprambase = (u32 __force *)(udc->addr + ep->rambase); eprambase = (u32 __force *)(udc->addr + ep->rambase);
if (ep->is_in) { if (ep->is_in) {
memcpy(eprambase, bufferptr, bytestosend); memcpy_toio((void __iomem *)eprambase, bufferptr,
bytestosend);
udc->write_fn(udc->addr, ep->offset + udc->write_fn(udc->addr, ep->offset +
XUSB_EP_BUF0COUNT_OFFSET, bufferlen); XUSB_EP_BUF0COUNT_OFFSET, bufferlen);
} else { } else {
memcpy(bufferptr, eprambase, bytestosend); memcpy_toio((void __iomem *)bufferptr, eprambase,
bytestosend);
} }
/* /*
* Enable the buffer for transmission. * Enable the buffer for transmission.
@ -514,11 +516,13 @@ static int xudc_eptxrx(struct xusb_ep *ep, struct xusb_req *req,
eprambase = (u32 __force *)(udc->addr + ep->rambase + eprambase = (u32 __force *)(udc->addr + ep->rambase +
ep->ep_usb.maxpacket); ep->ep_usb.maxpacket);
if (ep->is_in) { if (ep->is_in) {
memcpy(eprambase, bufferptr, bytestosend); memcpy_toio((void __iomem *)eprambase, bufferptr,
bytestosend);
udc->write_fn(udc->addr, ep->offset + udc->write_fn(udc->addr, ep->offset +
XUSB_EP_BUF1COUNT_OFFSET, bufferlen); XUSB_EP_BUF1COUNT_OFFSET, bufferlen);
} else { } else {
memcpy(bufferptr, eprambase, bytestosend); memcpy_toio((void __iomem *)bufferptr, eprambase,
bytestosend);
} }
/* /*
* Enable the buffer for transmission. * Enable the buffer for transmission.
@ -1020,7 +1024,7 @@ static int __xudc_ep0_queue(struct xusb_ep *ep0, struct xusb_req *req)
udc->addr); udc->addr);
length = req->usb_req.actual = min_t(u32, length, length = req->usb_req.actual = min_t(u32, length,
EP0_MAX_PACKET); EP0_MAX_PACKET);
memcpy(corebuf, req->usb_req.buf, length); memcpy_toio((void __iomem *)corebuf, req->usb_req.buf, length);
udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, length); udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, length);
udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1);
} else { } else {
@ -1746,7 +1750,7 @@ static void xudc_handle_setup(struct xusb_udc *udc)
/* Load up the chapter 9 command buffer.*/ /* Load up the chapter 9 command buffer.*/
ep0rambase = (u32 __force *) (udc->addr + XUSB_SETUP_PKT_ADDR_OFFSET); ep0rambase = (u32 __force *) (udc->addr + XUSB_SETUP_PKT_ADDR_OFFSET);
memcpy(&setup, ep0rambase, 8); memcpy_toio((void __iomem *)&setup, ep0rambase, 8);
udc->setup = setup; udc->setup = setup;
udc->setup.wValue = cpu_to_le16(setup.wValue); udc->setup.wValue = cpu_to_le16(setup.wValue);
@ -1833,7 +1837,7 @@ static void xudc_ep0_out(struct xusb_udc *udc)
(ep0->rambase << 2)); (ep0->rambase << 2));
buffer = req->usb_req.buf + req->usb_req.actual; buffer = req->usb_req.buf + req->usb_req.actual;
req->usb_req.actual = req->usb_req.actual + bytes_to_rx; req->usb_req.actual = req->usb_req.actual + bytes_to_rx;
memcpy(buffer, ep0rambase, bytes_to_rx); memcpy_toio((void __iomem *)buffer, ep0rambase, bytes_to_rx);
if (req->usb_req.length == req->usb_req.actual) { if (req->usb_req.length == req->usb_req.actual) {
/* Data transfer completed get ready for Status stage */ /* Data transfer completed get ready for Status stage */
@ -1909,7 +1913,7 @@ static void xudc_ep0_in(struct xusb_udc *udc)
(ep0->rambase << 2)); (ep0->rambase << 2));
buffer = req->usb_req.buf + req->usb_req.actual; buffer = req->usb_req.buf + req->usb_req.actual;
req->usb_req.actual = req->usb_req.actual + length; req->usb_req.actual = req->usb_req.actual + length;
memcpy(ep0rambase, buffer, length); memcpy_toio((void __iomem *)ep0rambase, buffer, length);
} }
udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, count); udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, count);
udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1);

View File

@ -714,7 +714,7 @@ static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci, static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,
struct xhci_ring *ring, struct xhci_td *td) struct xhci_ring *ring, struct xhci_td *td)
{ {
struct device *dev = xhci_to_hcd(xhci)->self.controller; struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
struct xhci_segment *seg = td->bounce_seg; struct xhci_segment *seg = td->bounce_seg;
struct urb *urb = td->urb; struct urb *urb = td->urb;
size_t len; size_t len;
@ -3283,7 +3283,7 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred,
static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len, static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
u32 *trb_buff_len, struct xhci_segment *seg) u32 *trb_buff_len, struct xhci_segment *seg)
{ {
struct device *dev = xhci_to_hcd(xhci)->self.controller; struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
unsigned int unalign; unsigned int unalign;
unsigned int max_pkt; unsigned int max_pkt;
u32 new_buff_len; u32 new_buff_len;

View File

@ -39,7 +39,7 @@ static const struct musb_register_map musb_regmap[] = {
{ "IntrUsbE", MUSB_INTRUSBE, 8 }, { "IntrUsbE", MUSB_INTRUSBE, 8 },
{ "DevCtl", MUSB_DEVCTL, 8 }, { "DevCtl", MUSB_DEVCTL, 8 },
{ "VControl", 0x68, 32 }, { "VControl", 0x68, 32 },
{ "HWVers", 0x69, 16 }, { "HWVers", MUSB_HWVERS, 16 },
{ "LinkInfo", MUSB_LINKINFO, 8 }, { "LinkInfo", MUSB_LINKINFO, 8 },
{ "VPLen", MUSB_VPLEN, 8 }, { "VPLen", MUSB_VPLEN, 8 },
{ "HS_EOF1", MUSB_HS_EOF1, 8 }, { "HS_EOF1", MUSB_HS_EOF1, 8 },

View File

@ -321,10 +321,16 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
musb_giveback(musb, urb, status); musb_giveback(musb, urb, status);
qh->is_ready = ready; qh->is_ready = ready;
/*
* musb->lock had been unlocked in musb_giveback, so qh may
* be freed, need to get it again
*/
qh = musb_ep_get_qh(hw_ep, is_in);
/* reclaim resources (and bandwidth) ASAP; deschedule it, and /* reclaim resources (and bandwidth) ASAP; deschedule it, and
* invalidate qh as soon as list_empty(&hep->urb_list) * invalidate qh as soon as list_empty(&hep->urb_list)
*/ */
if (list_empty(&qh->hep->urb_list)) { if (qh && list_empty(&qh->hep->urb_list)) {
struct list_head *head; struct list_head *head;
struct dma_controller *dma = musb->dma_controller; struct dma_controller *dma = musb->dma_controller;
@ -2398,6 +2404,7 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
* and its URB list has emptied, recycle this qh. * and its URB list has emptied, recycle this qh.
*/ */
if (ready && list_empty(&qh->hep->urb_list)) { if (ready && list_empty(&qh->hep->urb_list)) {
musb_ep_set_qh(qh->hw_ep, is_in, NULL);
qh->hep->hcpriv = NULL; qh->hep->hcpriv = NULL;
list_del(&qh->ring); list_del(&qh->ring);
kfree(qh); kfree(qh);

View File

@ -203,6 +203,9 @@ static void option_instat_callback(struct urb *urb);
#define DELL_PRODUCT_5829E_ESIM 0x81e4 #define DELL_PRODUCT_5829E_ESIM 0x81e4
#define DELL_PRODUCT_5829E 0x81e6 #define DELL_PRODUCT_5829E 0x81e6
#define DELL_PRODUCT_FM101R 0x8213
#define DELL_PRODUCT_FM101R_ESIM 0x8215
#define KYOCERA_VENDOR_ID 0x0c88 #define KYOCERA_VENDOR_ID 0x0c88
#define KYOCERA_PRODUCT_KPC650 0x17da #define KYOCERA_PRODUCT_KPC650 0x17da
#define KYOCERA_PRODUCT_KPC680 0x180a #define KYOCERA_PRODUCT_KPC680 0x180a
@ -1108,6 +1111,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = RSVD(0) | RSVD(6) }, .driver_info = RSVD(0) | RSVD(6) },
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM), { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM),
.driver_info = RSVD(0) | RSVD(6) }, .driver_info = RSVD(0) | RSVD(6) },
{ USB_DEVICE_INTERFACE_CLASS(DELL_VENDOR_ID, DELL_PRODUCT_FM101R, 0xff) },
{ USB_DEVICE_INTERFACE_CLASS(DELL_VENDOR_ID, DELL_PRODUCT_FM101R_ESIM, 0xff) },
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
@ -1290,6 +1295,7 @@ static const struct usb_device_id option_ids[] = {
.driver_info = NCTRL(0) | RSVD(3) }, .driver_info = NCTRL(0) | RSVD(3) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */
.driver_info = NCTRL(0) }, .driver_info = NCTRL(0) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1035, 0xff) }, /* Telit LE910C4-WWX (ECM) */
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0),
.driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) }, .driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),
@ -2262,6 +2268,7 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */
{ USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) },
{ } /* Terminating entry */ { } /* Terminating entry */

View File

@ -1681,12 +1681,12 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
parent = ref->parent; parent = ref->parent;
ref_root = ref->root; ref_root = ref->root;
if (node->ref_mod != 1) { if (unlikely(node->ref_mod != 1)) {
btrfs_err(trans->fs_info, btrfs_err(trans->fs_info,
"btree block(%llu) has %d references rather than 1: action %d ref_root %llu parent %llu", "btree block %llu has %d references rather than 1: action %d ref_root %llu parent %llu",
node->bytenr, node->ref_mod, node->action, ref_root, node->bytenr, node->ref_mod, node->action, ref_root,
parent); parent);
return -EIO; return -EUCLEAN;
} }
if (node->action == BTRFS_ADD_DELAYED_REF && insert_reserved) { if (node->action == BTRFS_ADD_DELAYED_REF && insert_reserved) {
BUG_ON(!extent_op || !extent_op->update_flags); BUG_ON(!extent_op || !extent_op->update_flags);

View File

@ -4143,7 +4143,7 @@ static void get_block_group_info(struct list_head *groups_list,
static long btrfs_ioctl_space_info(struct btrfs_fs_info *fs_info, static long btrfs_ioctl_space_info(struct btrfs_fs_info *fs_info,
void __user *arg) void __user *arg)
{ {
struct btrfs_ioctl_space_args space_args; struct btrfs_ioctl_space_args space_args = { 0 };
struct btrfs_ioctl_space_info space; struct btrfs_ioctl_space_info space;
struct btrfs_ioctl_space_info *dest; struct btrfs_ioctl_space_info *dest;
struct btrfs_ioctl_space_info *dest_orig; struct btrfs_ioctl_space_info *dest_orig;
@ -5515,7 +5515,7 @@ static int _btrfs_ioctl_send(struct file *file, void __user *argp, bool compat)
if (compat) { if (compat) {
#if defined(CONFIG_64BIT) && defined(CONFIG_COMPAT) #if defined(CONFIG_64BIT) && defined(CONFIG_COMPAT)
struct btrfs_ioctl_send_args_32 args32; struct btrfs_ioctl_send_args_32 args32 = { 0 };
ret = copy_from_user(&args32, argp, sizeof(args32)); ret = copy_from_user(&args32, argp, sizeof(args32));
if (ret) if (ret)

View File

@ -4283,7 +4283,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans,
struct extent_buffer *leaf; struct extent_buffer *leaf;
int slot; int slot;
int ins_nr = 0; int ins_nr = 0;
int start_slot; int start_slot = 0;
int ret; int ret;
if (!(inode->flags & BTRFS_INODE_PREALLOC)) if (!(inode->flags & BTRFS_INODE_PREALLOC))

View File

@ -619,9 +619,7 @@ int ceph_fill_file_size(struct inode *inode, int issued,
ci->i_truncate_seq = truncate_seq; ci->i_truncate_seq = truncate_seq;
/* the MDS should have revoked these caps */ /* the MDS should have revoked these caps */
WARN_ON_ONCE(issued & (CEPH_CAP_FILE_EXCL | WARN_ON_ONCE(issued & (CEPH_CAP_FILE_RD |
CEPH_CAP_FILE_RD |
CEPH_CAP_FILE_WR |
CEPH_CAP_FILE_LAZYIO)); CEPH_CAP_FILE_LAZYIO));
/* /*
* If we hold relevant caps, or in the case where we're * If we hold relevant caps, or in the case where we're

View File

@ -192,7 +192,7 @@ static int ovl_set_timestamps(struct dentry *upperdentry, struct kstat *stat)
{ {
struct iattr attr = { struct iattr attr = {
.ia_valid = .ia_valid =
ATTR_ATIME | ATTR_MTIME | ATTR_ATIME_SET | ATTR_MTIME_SET, ATTR_ATIME | ATTR_MTIME | ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_CTIME,
.ia_atime = stat->atime, .ia_atime = stat->atime,
.ia_mtime = stat->mtime, .ia_mtime = stat->mtime,
}; };

View File

@ -231,19 +231,18 @@ static void put_quota_format(struct quota_format_type *fmt)
* All dquots are placed to the end of inuse_list when first created, and this * All dquots are placed to the end of inuse_list when first created, and this
* list is used for invalidate operation, which must look at every dquot. * list is used for invalidate operation, which must look at every dquot.
* *
* When the last reference of a dquot will be dropped, the dquot will be * When the last reference of a dquot is dropped, the dquot is added to
* added to releasing_dquots. We'd then queue work item which would call * releasing_dquots. We'll then queue work item which will call
* synchronize_srcu() and after that perform the final cleanup of all the * synchronize_srcu() and after that perform the final cleanup of all the
* dquots on the list. Both releasing_dquots and free_dquots use the * dquots on the list. Each cleaned up dquot is moved to free_dquots list.
* dq_free list_head in the dquot struct. When a dquot is removed from * Both releasing_dquots and free_dquots use the dq_free list_head in the dquot
* releasing_dquots, a reference count is always subtracted, and if * struct.
* dq_count == 0 at that point, the dquot will be added to the free_dquots.
* *
* Unused dquots (dq_count == 0) are added to the free_dquots list when freed, * Unused and cleaned up dquots are in the free_dquots list and this list is
* and this list is searched whenever we need an available dquot. Dquots are * searched whenever we need an available dquot. Dquots are removed from the
* removed from the list as soon as they are used again, and * list as soon as they are used again and dqstats.free_dquots gives the number
* dqstats.free_dquots gives the number of dquots on the list. When * of dquots on the list. When dquot is invalidated it's completely released
* dquot is invalidated it's completely released from memory. * from memory.
* *
* Dirty dquots are added to the dqi_dirty_list of quota_info when mark * Dirty dquots are added to the dqi_dirty_list of quota_info when mark
* dirtied, and this list is searched when writing dirty dquots back to * dirtied, and this list is searched when writing dirty dquots back to
@ -321,6 +320,7 @@ static inline void put_dquot_last(struct dquot *dquot)
static inline void put_releasing_dquots(struct dquot *dquot) static inline void put_releasing_dquots(struct dquot *dquot)
{ {
list_add_tail(&dquot->dq_free, &releasing_dquots); list_add_tail(&dquot->dq_free, &releasing_dquots);
set_bit(DQ_RELEASING_B, &dquot->dq_flags);
} }
static inline void remove_free_dquot(struct dquot *dquot) static inline void remove_free_dquot(struct dquot *dquot)
@ -328,8 +328,10 @@ static inline void remove_free_dquot(struct dquot *dquot)
if (list_empty(&dquot->dq_free)) if (list_empty(&dquot->dq_free))
return; return;
list_del_init(&dquot->dq_free); list_del_init(&dquot->dq_free);
if (!atomic_read(&dquot->dq_count)) if (!test_bit(DQ_RELEASING_B, &dquot->dq_flags))
dqstats_dec(DQST_FREE_DQUOTS); dqstats_dec(DQST_FREE_DQUOTS);
else
clear_bit(DQ_RELEASING_B, &dquot->dq_flags);
} }
static inline void put_inuse(struct dquot *dquot) static inline void put_inuse(struct dquot *dquot)
@ -572,12 +574,6 @@ static void invalidate_dquots(struct super_block *sb, int type)
continue; continue;
/* Wait for dquot users */ /* Wait for dquot users */
if (atomic_read(&dquot->dq_count)) { if (atomic_read(&dquot->dq_count)) {
/* dquot in releasing_dquots, flush and retry */
if (!list_empty(&dquot->dq_free)) {
spin_unlock(&dq_list_lock);
goto restart;
}
atomic_inc(&dquot->dq_count); atomic_inc(&dquot->dq_count);
spin_unlock(&dq_list_lock); spin_unlock(&dq_list_lock);
/* /*
@ -596,6 +592,15 @@ static void invalidate_dquots(struct super_block *sb, int type)
* restart. */ * restart. */
goto restart; goto restart;
} }
/*
* The last user already dropped its reference but dquot didn't
* get fully cleaned up yet. Restart the scan which flushes the
* work cleaning up released dquots.
*/
if (test_bit(DQ_RELEASING_B, &dquot->dq_flags)) {
spin_unlock(&dq_list_lock);
goto restart;
}
/* /*
* Quota now has no users and it has been written on last * Quota now has no users and it has been written on last
* dqput() * dqput()
@ -687,6 +692,13 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
dq_dirty); dq_dirty);
WARN_ON(!dquot_active(dquot)); WARN_ON(!dquot_active(dquot));
/* If the dquot is releasing we should not touch it */
if (test_bit(DQ_RELEASING_B, &dquot->dq_flags)) {
spin_unlock(&dq_list_lock);
flush_delayed_work(&quota_release_work);
spin_lock(&dq_list_lock);
continue;
}
/* Now we have active dquot from which someone is /* Now we have active dquot from which someone is
* holding reference so we can safely just increase * holding reference so we can safely just increase
@ -800,18 +812,18 @@ static void quota_release_workfn(struct work_struct *work)
/* Exchange the list head to avoid livelock. */ /* Exchange the list head to avoid livelock. */
list_replace_init(&releasing_dquots, &rls_head); list_replace_init(&releasing_dquots, &rls_head);
spin_unlock(&dq_list_lock); spin_unlock(&dq_list_lock);
synchronize_srcu(&dquot_srcu);
restart: restart:
synchronize_srcu(&dquot_srcu);
spin_lock(&dq_list_lock); spin_lock(&dq_list_lock);
while (!list_empty(&rls_head)) { while (!list_empty(&rls_head)) {
dquot = list_first_entry(&rls_head, struct dquot, dq_free); dquot = list_first_entry(&rls_head, struct dquot, dq_free);
/* Dquot got used again? */ WARN_ON_ONCE(atomic_read(&dquot->dq_count));
if (atomic_read(&dquot->dq_count) > 1) { /*
remove_free_dquot(dquot); * Note that DQ_RELEASING_B protects us from racing with
atomic_dec(&dquot->dq_count); * invalidate_dquots() calls so we are safe to work with the
continue; * dquot even after we drop dq_list_lock.
} */
if (dquot_dirty(dquot)) { if (dquot_dirty(dquot)) {
spin_unlock(&dq_list_lock); spin_unlock(&dq_list_lock);
/* Commit dquot before releasing */ /* Commit dquot before releasing */
@ -825,7 +837,6 @@ static void quota_release_workfn(struct work_struct *work)
} }
/* Dquot is inactive and clean, now move it to free list */ /* Dquot is inactive and clean, now move it to free list */
remove_free_dquot(dquot); remove_free_dquot(dquot);
atomic_dec(&dquot->dq_count);
put_dquot_last(dquot); put_dquot_last(dquot);
} }
spin_unlock(&dq_list_lock); spin_unlock(&dq_list_lock);
@ -866,6 +877,7 @@ void dqput(struct dquot *dquot)
BUG_ON(!list_empty(&dquot->dq_free)); BUG_ON(!list_empty(&dquot->dq_free));
#endif #endif
put_releasing_dquots(dquot); put_releasing_dquots(dquot);
atomic_dec(&dquot->dq_count);
spin_unlock(&dq_list_lock); spin_unlock(&dq_list_lock);
queue_delayed_work(system_unbound_wq, &quota_release_work, 1); queue_delayed_work(system_unbound_wq, &quota_release_work, 1);
} }
@ -954,7 +966,7 @@ struct dquot *dqget(struct super_block *sb, struct kqid qid)
dqstats_inc(DQST_LOOKUPS); dqstats_inc(DQST_LOOKUPS);
} }
/* Wait for dq_lock - after this we know that either dquot_release() is /* Wait for dq_lock - after this we know that either dquot_release() is
* already finished or it will be canceled due to dq_count > 1 test */ * already finished or it will be canceled due to dq_count > 0 test */
wait_on_dquot(dquot); wait_on_dquot(dquot);
/* Read the dquot / allocate space in quota file */ /* Read the dquot / allocate space in quota file */
if (!dquot_active(dquot)) { if (!dquot_active(dquot)) {

View File

@ -306,6 +306,13 @@ struct resource *devm_request_free_mem_region(struct device *dev,
struct resource *request_free_mem_region(struct resource *base, struct resource *request_free_mem_region(struct resource *base,
unsigned long size, const char *name); unsigned long size, const char *name);
static inline void irqresource_disabled(struct resource *res, u32 irq)
{
res->start = irq;
res->end = irq;
res->flags = IORESOURCE_IRQ | IORESOURCE_DISABLED | IORESOURCE_UNSET;
}
#ifdef CONFIG_IO_STRICT_DEVMEM #ifdef CONFIG_IO_STRICT_DEVMEM
void revoke_devmem(struct resource *res); void revoke_devmem(struct resource *res);
#else #else

View File

@ -63,7 +63,6 @@ static inline struct mcb_bus *to_mcb_bus(struct device *dev)
struct mcb_device { struct mcb_device {
struct device dev; struct device dev;
struct mcb_bus *bus; struct mcb_bus *bus;
bool is_added;
struct mcb_driver *driver; struct mcb_driver *driver;
u16 id; u16 id;
int inst; int inst;

View File

@ -3773,7 +3773,7 @@ static __always_inline int ____dev_forward_skb(struct net_device *dev,
return NET_RX_DROP; return NET_RX_DROP;
} }
skb_scrub_packet(skb, true); skb_scrub_packet(skb, !net_eq(dev_net(dev), dev_net(skb->dev)));
skb->priority = 0; skb->priority = 0;
return 0; return 0;
} }

View File

@ -608,6 +608,7 @@ struct perf_event {
/* The cumulative AND of all event_caps for events in this group. */ /* The cumulative AND of all event_caps for events in this group. */
int group_caps; int group_caps;
unsigned int group_generation;
struct perf_event *group_leader; struct perf_event *group_leader;
struct pmu *pmu; struct pmu *pmu;
void *pmu_private; void *pmu_private;

View File

@ -285,7 +285,9 @@ static inline void dqstats_dec(unsigned int type)
#define DQ_FAKE_B 3 /* no limits only usage */ #define DQ_FAKE_B 3 /* no limits only usage */
#define DQ_READ_B 4 /* dquot was read into memory */ #define DQ_READ_B 4 /* dquot was read into memory */
#define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */
#define DQ_LASTSET_B 6 /* Following 6 bits (see QIF_) are reserved\ #define DQ_RELEASING_B 6 /* dquot is in releasing_dquots list waiting
* to be cleaned up */
#define DQ_LASTSET_B 7 /* Following 6 bits (see QIF_) are reserved\
* for the mask of entries set via SETQUOTA\ * for the mask of entries set via SETQUOTA\
* quotactl. They are set under dq_data_lock\ * quotactl. They are set under dq_data_lock\
* and the quota format handling dquot can\ * and the quota format handling dquot can\

View File

@ -59,7 +59,7 @@ static inline bool dquot_is_busy(struct dquot *dquot)
{ {
if (test_bit(DQ_MOD_B, &dquot->dq_flags)) if (test_bit(DQ_MOD_B, &dquot->dq_flags))
return true; return true;
if (atomic_read(&dquot->dq_count) > 1) if (atomic_read(&dquot->dq_count) > 0)
return true; return true;
return false; return false;
} }

View File

@ -219,7 +219,7 @@ struct hci_dev {
struct list_head list; struct list_head list;
struct mutex lock; struct mutex lock;
char name[8]; const char *name;
unsigned long flags; unsigned long flags;
__u16 id; __u16 id;
__u8 bus; __u8 bus;

View File

@ -54,7 +54,7 @@ struct hci_mon_new_index {
__u8 type; __u8 type;
__u8 bus; __u8 bus;
bdaddr_t bdaddr; bdaddr_t bdaddr;
char name[8]; char name[8] __nonstring;
} __packed; } __packed;
#define HCI_MON_NEW_INDEX_SIZE 16 #define HCI_MON_NEW_INDEX_SIZE 16

View File

@ -49,6 +49,7 @@ struct netns_xfrm {
struct list_head policy_all; struct list_head policy_all;
struct hlist_head *policy_byidx; struct hlist_head *policy_byidx;
unsigned int policy_idx_hmask; unsigned int policy_idx_hmask;
unsigned int idx_generator;
struct hlist_head policy_inexact[XFRM_POLICY_MAX]; struct hlist_head policy_inexact[XFRM_POLICY_MAX];
struct xfrm_policy_hash policy_bydst[XFRM_POLICY_MAX]; struct xfrm_policy_hash policy_bydst[XFRM_POLICY_MAX];
unsigned int policy_count[XFRM_POLICY_MAX * 2]; unsigned int policy_count[XFRM_POLICY_MAX * 2];

View File

@ -138,6 +138,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
#define TCP_RTO_MAX ((unsigned)(120*HZ)) #define TCP_RTO_MAX ((unsigned)(120*HZ))
#define TCP_RTO_MIN ((unsigned)(HZ/5)) #define TCP_RTO_MIN ((unsigned)(HZ/5))
#define TCP_TIMEOUT_MIN (2U) /* Min timeout for TCP timers in jiffies */ #define TCP_TIMEOUT_MIN (2U) /* Min timeout for TCP timers in jiffies */
#define TCP_TIMEOUT_MIN_US (2*USEC_PER_MSEC) /* Min TCP timeout in microsecs */
#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ)) /* RFC6298 2.1 initial RTO value */ #define TCP_TIMEOUT_INIT ((unsigned)(1*HZ)) /* RFC6298 2.1 initial RTO value */
#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ)) /* RFC 1122 initial RTO value, now #define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ)) /* RFC 1122 initial RTO value, now
* used as a fallback RTO for the * used as a fallback RTO for the

View File

@ -39,7 +39,6 @@ TRACE_EVENT(neigh_create,
), ),
TP_fast_assign( TP_fast_assign(
struct in6_addr *pin6;
__be32 *p32; __be32 *p32;
__entry->family = tbl->family; __entry->family = tbl->family;
@ -47,7 +46,6 @@ TRACE_EVENT(neigh_create,
__entry->entries = atomic_read(&tbl->gc_entries); __entry->entries = atomic_read(&tbl->gc_entries);
__entry->created = n != NULL; __entry->created = n != NULL;
__entry->gc_exempt = exempt_from_gc; __entry->gc_exempt = exempt_from_gc;
pin6 = (struct in6_addr *)__entry->primary_key6;
p32 = (__be32 *)__entry->primary_key4; p32 = (__be32 *)__entry->primary_key4;
if (tbl->family == AF_INET) if (tbl->family == AF_INET)
@ -57,6 +55,8 @@ TRACE_EVENT(neigh_create,
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
if (tbl->family == AF_INET6) { if (tbl->family == AF_INET6) {
struct in6_addr *pin6;
pin6 = (struct in6_addr *)__entry->primary_key6; pin6 = (struct in6_addr *)__entry->primary_key6;
*pin6 = *(struct in6_addr *)pkey; *pin6 = *(struct in6_addr *)pkey;
} }

View File

@ -368,10 +368,9 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type,
} }
css_task_iter_end(&it); css_task_iter_end(&it);
length = n; length = n;
/* now sort & (if procs) strip out duplicates */ /* now sort & strip out duplicates (tgids or recycled thread PIDs) */
sort(array, length, sizeof(pid_t), cmppid, NULL); sort(array, length, sizeof(pid_t), cmppid, NULL);
if (type == CGROUP_FILE_PROCS) length = pidlist_uniq(array, length);
length = pidlist_uniq(array, length);
l = cgroup_pidlist_find_create(cgrp, type); l = cgroup_pidlist_find_create(cgrp, type);
if (!l) { if (!l) {

View File

@ -1849,6 +1849,7 @@ static void perf_group_attach(struct perf_event *event)
list_add_tail(&event->sibling_list, &group_leader->sibling_list); list_add_tail(&event->sibling_list, &group_leader->sibling_list);
group_leader->nr_siblings++; group_leader->nr_siblings++;
group_leader->group_generation++;
perf_event__header_size(group_leader); perf_event__header_size(group_leader);
@ -2004,6 +2005,7 @@ static void perf_group_detach(struct perf_event *event)
if (event->group_leader != event) { if (event->group_leader != event) {
list_del_init(&event->sibling_list); list_del_init(&event->sibling_list);
event->group_leader->nr_siblings--; event->group_leader->nr_siblings--;
event->group_leader->group_generation++;
goto out; goto out;
} }
@ -4857,7 +4859,7 @@ static int __perf_read_group_add(struct perf_event *leader,
u64 read_format, u64 *values) u64 read_format, u64 *values)
{ {
struct perf_event_context *ctx = leader->ctx; struct perf_event_context *ctx = leader->ctx;
struct perf_event *sub; struct perf_event *sub, *parent;
unsigned long flags; unsigned long flags;
int n = 1; /* skip @nr */ int n = 1; /* skip @nr */
int ret; int ret;
@ -4867,6 +4869,33 @@ static int __perf_read_group_add(struct perf_event *leader,
return ret; return ret;
raw_spin_lock_irqsave(&ctx->lock, flags); raw_spin_lock_irqsave(&ctx->lock, flags);
/*
* Verify the grouping between the parent and child (inherited)
* events is still in tact.
*
* Specifically:
* - leader->ctx->lock pins leader->sibling_list
* - parent->child_mutex pins parent->child_list
* - parent->ctx->mutex pins parent->sibling_list
*
* Because parent->ctx != leader->ctx (and child_list nests inside
* ctx->mutex), group destruction is not atomic between children, also
* see perf_event_release_kernel(). Additionally, parent can grow the
* group.
*
* Therefore it is possible to have parent and child groups in a
* different configuration and summing over such a beast makes no sense
* what so ever.
*
* Reject this.
*/
parent = leader->parent;
if (parent &&
(parent->group_generation != leader->group_generation ||
parent->nr_siblings != leader->nr_siblings)) {
ret = -ECHILD;
goto unlock;
}
/* /*
* Since we co-schedule groups, {enabled,running} times of siblings * Since we co-schedule groups, {enabled,running} times of siblings
@ -4896,8 +4925,9 @@ static int __perf_read_group_add(struct perf_event *leader,
values[n++] = primary_event_id(sub); values[n++] = primary_event_id(sub);
} }
unlock:
raw_spin_unlock_irqrestore(&ctx->lock, flags); raw_spin_unlock_irqrestore(&ctx->lock, flags);
return 0; return ret;
} }
static int perf_read_group(struct perf_event *event, static int perf_read_group(struct perf_event *event,
@ -4916,10 +4946,6 @@ static int perf_read_group(struct perf_event *event,
values[0] = 1 + leader->nr_siblings; values[0] = 1 + leader->nr_siblings;
/*
* By locking the child_mutex of the leader we effectively
* lock the child list of all siblings.. XXX explain how.
*/
mutex_lock(&leader->child_mutex); mutex_lock(&leader->child_mutex);
ret = __perf_read_group_add(leader, read_format, values); ret = __perf_read_group_add(leader, read_format, values);
@ -12024,6 +12050,7 @@ static int inherit_group(struct perf_event *parent_event,
!perf_get_aux_event(child_ctr, leader)) !perf_get_aux_event(child_ctr, leader))
return -EINVAL; return -EINVAL;
} }
leader->group_generation = parent_event->group_generation;
return 0; return 0;
} }

View File

@ -2236,6 +2236,7 @@ void trace_event_eval_update(struct trace_eval_map **map, int len)
update_event_printk(call, map[i]); update_event_printk(call, map[i]);
} }
} }
cond_resched();
} }
up_write(&trace_event_sem); up_write(&trace_event_sem);
} }

View File

@ -5279,9 +5279,13 @@ static int workqueue_apply_unbound_cpumask(void)
list_for_each_entry(wq, &workqueues, list) { list_for_each_entry(wq, &workqueues, list) {
if (!(wq->flags & WQ_UNBOUND)) if (!(wq->flags & WQ_UNBOUND))
continue; continue;
/* creating multiple pwqs breaks ordering guarantee */ /* creating multiple pwqs breaks ordering guarantee */
if (wq->flags & __WQ_ORDERED) if (!list_empty(&wq->pwqs)) {
continue; if (wq->flags & __WQ_ORDERED_EXPLICIT)
continue;
wq->flags &= ~__WQ_ORDERED;
}
ctx = apply_wqattrs_prepare(wq, wq->unbound_attrs); ctx = apply_wqattrs_prepare(wq, wq->unbound_attrs);
if (!ctx) { if (!ctx) {

View File

@ -1207,6 +1207,15 @@ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
/* Reject outgoing connection to device with same BD ADDR against
* CVE-2020-26555
*/
if (!bacmp(&hdev->bdaddr, dst)) {
bt_dev_dbg(hdev, "Reject connection with same BD_ADDR %pMR\n",
dst);
return ERR_PTR(-ECONNREFUSED);
}
acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst); acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
if (!acl) { if (!acl) {
acl = hci_conn_add(hdev, ACL_LINK, dst, HCI_ROLE_MASTER); acl = hci_conn_add(hdev, ACL_LINK, dst, HCI_ROLE_MASTER);
@ -1382,34 +1391,41 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type,
if (!test_bit(HCI_CONN_AUTH, &conn->flags)) if (!test_bit(HCI_CONN_AUTH, &conn->flags))
goto auth; goto auth;
/* An authenticated FIPS approved combination key has sufficient switch (conn->key_type) {
* security for security level 4. */ case HCI_LK_AUTH_COMBINATION_P256:
if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256 && /* An authenticated FIPS approved combination key has
sec_level == BT_SECURITY_FIPS) * sufficient security for security level 4 or lower.
goto encrypt; */
if (sec_level <= BT_SECURITY_FIPS)
/* An authenticated combination key has sufficient security for goto encrypt;
security level 3. */ break;
if ((conn->key_type == HCI_LK_AUTH_COMBINATION_P192 || case HCI_LK_AUTH_COMBINATION_P192:
conn->key_type == HCI_LK_AUTH_COMBINATION_P256) && /* An authenticated combination key has sufficient security for
sec_level == BT_SECURITY_HIGH) * security level 3 or lower.
goto encrypt; */
if (sec_level <= BT_SECURITY_HIGH)
/* An unauthenticated combination key has sufficient security for goto encrypt;
security level 1 and 2. */ break;
if ((conn->key_type == HCI_LK_UNAUTH_COMBINATION_P192 || case HCI_LK_UNAUTH_COMBINATION_P192:
conn->key_type == HCI_LK_UNAUTH_COMBINATION_P256) && case HCI_LK_UNAUTH_COMBINATION_P256:
(sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW)) /* An unauthenticated combination key has sufficient security
goto encrypt; * for security level 2 or lower.
*/
/* A combination key has always sufficient security for the security if (sec_level <= BT_SECURITY_MEDIUM)
levels 1 or 2. High security level requires the combination key goto encrypt;
is generated using maximum PIN code length (16). break;
For pre 2.1 units. */ case HCI_LK_COMBINATION:
if (conn->key_type == HCI_LK_COMBINATION && /* A combination key has always sufficient security for the
(sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW || * security levels 2 or lower. High security level requires the
conn->pin_length == 16)) * combination key is generated using maximum PIN code length
goto encrypt; * (16). For pre 2.1 units.
*/
if (sec_level <= BT_SECURITY_MEDIUM || conn->pin_length == 16)
goto encrypt;
break;
default:
break;
}
auth: auth:
if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))

View File

@ -3317,7 +3317,11 @@ int hci_register_dev(struct hci_dev *hdev)
if (id < 0) if (id < 0)
return id; return id;
snprintf(hdev->name, sizeof(hdev->name), "hci%d", id); error = dev_set_name(&hdev->dev, "hci%u", id);
if (error)
return error;
hdev->name = dev_name(&hdev->dev);
hdev->id = id; hdev->id = id;
BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
@ -3339,8 +3343,6 @@ int hci_register_dev(struct hci_dev *hdev)
if (!IS_ERR_OR_NULL(bt_debugfs)) if (!IS_ERR_OR_NULL(bt_debugfs))
hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs); hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
dev_set_name(&hdev->dev, "%s", hdev->name);
error = device_add(&hdev->dev); error = device_add(&hdev->dev);
if (error < 0) if (error < 0)
goto err_wqueue; goto err_wqueue;

View File

@ -25,6 +25,8 @@
/* Bluetooth HCI event handling. */ /* Bluetooth HCI event handling. */
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/crypto.h>
#include <crypto/algapi.h>
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
@ -2594,6 +2596,16 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr, BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
ev->link_type); ev->link_type);
/* Reject incoming connection from device with same BD ADDR against
* CVE-2020-26555
*/
if (hdev && !bacmp(&hdev->bdaddr, &ev->bdaddr)) {
bt_dev_dbg(hdev, "Reject connection with same BD_ADDR %pMR\n",
&ev->bdaddr);
hci_reject_conn(hdev, &ev->bdaddr);
return;
}
mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type, mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
&flags); &flags);
@ -3935,6 +3947,15 @@ static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
if (!conn) if (!conn)
goto unlock; goto unlock;
/* Ignore NULL link key against CVE-2020-26555 */
if (!crypto_memneq(ev->link_key, ZERO_KEY, HCI_LINK_KEY_SIZE)) {
bt_dev_dbg(hdev, "Ignore NULL link key (ZERO KEY) for %pMR",
&ev->bdaddr);
hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
hci_conn_drop(conn);
goto unlock;
}
hci_conn_hold(conn); hci_conn_hold(conn);
conn->disc_timeout = HCI_DISCONN_TIMEOUT; conn->disc_timeout = HCI_DISCONN_TIMEOUT;
hci_conn_drop(conn); hci_conn_drop(conn);
@ -4426,8 +4447,8 @@ static u8 bredr_oob_data_present(struct hci_conn *conn)
* available, then do not declare that OOB data is * available, then do not declare that OOB data is
* present. * present.
*/ */
if (!memcmp(data->rand256, ZERO_KEY, 16) || if (!crypto_memneq(data->rand256, ZERO_KEY, 16) ||
!memcmp(data->hash256, ZERO_KEY, 16)) !crypto_memneq(data->hash256, ZERO_KEY, 16))
return 0x00; return 0x00;
return 0x02; return 0x02;
@ -4437,8 +4458,8 @@ static u8 bredr_oob_data_present(struct hci_conn *conn)
* not supported by the hardware, then check that if * not supported by the hardware, then check that if
* P-192 data values are present. * P-192 data values are present.
*/ */
if (!memcmp(data->rand192, ZERO_KEY, 16) || if (!crypto_memneq(data->rand192, ZERO_KEY, 16) ||
!memcmp(data->hash192, ZERO_KEY, 16)) !crypto_memneq(data->hash192, ZERO_KEY, 16))
return 0x00; return 0x00;
return 0x01; return 0x01;
@ -4454,7 +4475,7 @@ static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
hci_dev_lock(hdev); hci_dev_lock(hdev);
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
if (!conn) if (!conn || !hci_conn_ssp_enabled(conn))
goto unlock; goto unlock;
hci_conn_hold(conn); hci_conn_hold(conn);
@ -4689,7 +4710,7 @@ static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
hci_dev_lock(hdev); hci_dev_lock(hdev);
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
if (!conn) if (!conn || !hci_conn_ssp_enabled(conn))
goto unlock; goto unlock;
/* Reset the authentication requirement to unknown */ /* Reset the authentication requirement to unknown */

View File

@ -430,7 +430,8 @@ static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
ni->type = hdev->dev_type; ni->type = hdev->dev_type;
ni->bus = hdev->bus; ni->bus = hdev->bus;
bacpy(&ni->bdaddr, &hdev->bdaddr); bacpy(&ni->bdaddr, &hdev->bdaddr);
memcpy(ni->name, hdev->name, 8); memcpy_and_pad(ni->name, sizeof(ni->name), hdev->name,
strnlen(hdev->name, sizeof(ni->name)), '\0');
opcode = cpu_to_le16(HCI_MON_NEW_INDEX); opcode = cpu_to_le16(HCI_MON_NEW_INDEX);
break; break;

View File

@ -477,8 +477,8 @@ static int ceph_tcp_connect(struct ceph_connection *con)
dout("connect %s\n", ceph_pr_addr(&con->peer_addr)); dout("connect %s\n", ceph_pr_addr(&con->peer_addr));
con_sock_state_connecting(con); con_sock_state_connecting(con);
ret = sock->ops->connect(sock, (struct sockaddr *)&ss, sizeof(ss), ret = kernel_connect(sock, (struct sockaddr *)&ss, sizeof(ss),
O_NONBLOCK); O_NONBLOCK);
if (ret == -EINPROGRESS) { if (ret == -EINPROGRESS) {
dout("connect %s EINPROGRESS sk_state = %u\n", dout("connect %s EINPROGRESS sk_state = %u\n",
ceph_pr_addr(&con->peer_addr), ceph_pr_addr(&con->peer_addr),

View File

@ -645,19 +645,19 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
seq_puts(seq, " Flags: "); seq_puts(seq, " Flags: ");
for (i = 0; i < NR_PKT_FLAGS; i++) { for (i = 0; i < NR_PKT_FLAGS; i++) {
if (i == F_FLOW_SEQ) if (i == FLOW_SEQ_SHIFT)
if (!pkt_dev->cflows) if (!pkt_dev->cflows)
continue; continue;
if (pkt_dev->flags & (1 << i)) if (pkt_dev->flags & (1 << i)) {
seq_printf(seq, "%s ", pkt_flag_names[i]); seq_printf(seq, "%s ", pkt_flag_names[i]);
else if (i == F_FLOW_SEQ)
seq_puts(seq, "FLOW_RND ");
#ifdef CONFIG_XFRM #ifdef CONFIG_XFRM
if (i == F_IPSEC && pkt_dev->spi) if (i == IPSEC_SHIFT && pkt_dev->spi)
seq_printf(seq, "spi:%u", pkt_dev->spi); seq_printf(seq, "spi:%u ", pkt_dev->spi);
#endif #endif
} else if (i == FLOW_SEQ_SHIFT) {
seq_puts(seq, "FLOW_RND ");
}
} }
seq_puts(seq, "\n"); seq_puts(seq, "\n");

View File

@ -567,7 +567,9 @@ static inline int esp_remove_trailer(struct sk_buff *skb)
skb->csum = csum_block_sub(skb->csum, csumdiff, skb->csum = csum_block_sub(skb->csum, csumdiff,
skb->len - trimlen); skb->len - trimlen);
} }
pskb_trim(skb, skb->len - trimlen); ret = pskb_trim(skb, skb->len - trimlen);
if (unlikely(ret))
return ret;
ret = nexthdr[1]; ret = nexthdr[1];

View File

@ -1333,15 +1333,18 @@ __be32 fib_info_update_nhc_saddr(struct net *net, struct fib_nh_common *nhc,
unsigned char scope) unsigned char scope)
{ {
struct fib_nh *nh; struct fib_nh *nh;
__be32 saddr;
if (nhc->nhc_family != AF_INET) if (nhc->nhc_family != AF_INET)
return inet_select_addr(nhc->nhc_dev, 0, scope); return inet_select_addr(nhc->nhc_dev, 0, scope);
nh = container_of(nhc, struct fib_nh, nh_common); nh = container_of(nhc, struct fib_nh, nh_common);
nh->nh_saddr = inet_select_addr(nh->fib_nh_dev, nh->fib_nh_gw4, scope); saddr = inet_select_addr(nh->fib_nh_dev, nh->fib_nh_gw4, scope);
nh->nh_saddr_genid = atomic_read(&net->ipv4.dev_addr_genid);
return nh->nh_saddr; WRITE_ONCE(nh->nh_saddr, saddr);
WRITE_ONCE(nh->nh_saddr_genid, atomic_read(&net->ipv4.dev_addr_genid));
return saddr;
} }
__be32 fib_result_prefsrc(struct net *net, struct fib_result *res) __be32 fib_result_prefsrc(struct net *net, struct fib_result *res)
@ -1355,8 +1358,9 @@ __be32 fib_result_prefsrc(struct net *net, struct fib_result *res)
struct fib_nh *nh; struct fib_nh *nh;
nh = container_of(nhc, struct fib_nh, nh_common); nh = container_of(nhc, struct fib_nh, nh_common);
if (nh->nh_saddr_genid == atomic_read(&net->ipv4.dev_addr_genid)) if (READ_ONCE(nh->nh_saddr_genid) ==
return nh->nh_saddr; atomic_read(&net->ipv4.dev_addr_genid))
return READ_ONCE(nh->nh_saddr);
} }
return fib_info_update_nhc_saddr(net, nhc, res->fi->fib_scope); return fib_info_update_nhc_saddr(net, nhc, res->fi->fib_scope);

View File

@ -2259,6 +2259,18 @@ static bool tcp_pacing_check(struct sock *sk)
return true; return true;
} }
static bool tcp_rtx_queue_empty_or_single_skb(const struct sock *sk)
{
const struct rb_node *node = sk->tcp_rtx_queue.rb_node;
/* No skb in the rtx queue. */
if (!node)
return true;
/* Only one skb in rtx queue. */
return !node->rb_left && !node->rb_right;
}
/* TCP Small Queues : /* TCP Small Queues :
* Control number of packets in qdisc/devices to two packets / or ~1 ms. * Control number of packets in qdisc/devices to two packets / or ~1 ms.
* (These limits are doubled for retransmits) * (These limits are doubled for retransmits)
@ -2296,12 +2308,12 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb,
limit += extra_bytes; limit += extra_bytes;
} }
if (refcount_read(&sk->sk_wmem_alloc) > limit) { if (refcount_read(&sk->sk_wmem_alloc) > limit) {
/* Always send skb if rtx queue is empty. /* Always send skb if rtx queue is empty or has one skb.
* No need to wait for TX completion to call us back, * No need to wait for TX completion to call us back,
* after softirq/tasklet schedule. * after softirq/tasklet schedule.
* This helps when TX completions are delayed too much. * This helps when TX completions are delayed too much.
*/ */
if (tcp_rtx_queue_empty(sk)) if (tcp_rtx_queue_empty_or_single_skb(sk))
return false; return false;
set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags); set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags);
@ -2504,7 +2516,7 @@ bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto)
{ {
struct inet_connection_sock *icsk = inet_csk(sk); struct inet_connection_sock *icsk = inet_csk(sk);
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
u32 timeout, rto_delta_us; u32 timeout, timeout_us, rto_delta_us;
int early_retrans; int early_retrans;
/* Don't do any loss probe on a Fast Open connection before 3WHS /* Don't do any loss probe on a Fast Open connection before 3WHS
@ -2528,11 +2540,12 @@ bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto)
* sample is available then probe after TCP_TIMEOUT_INIT. * sample is available then probe after TCP_TIMEOUT_INIT.
*/ */
if (tp->srtt_us) { if (tp->srtt_us) {
timeout = usecs_to_jiffies(tp->srtt_us >> 2); timeout_us = tp->srtt_us >> 2;
if (tp->packets_out == 1) if (tp->packets_out == 1)
timeout += TCP_RTO_MIN; timeout_us += tcp_rto_min_us(sk);
else else
timeout += TCP_TIMEOUT_MIN; timeout_us += TCP_TIMEOUT_MIN_US;
timeout = usecs_to_jiffies(timeout_us);
} else { } else {
timeout = TCP_TIMEOUT_INIT; timeout = TCP_TIMEOUT_INIT;
} }

View File

@ -123,7 +123,7 @@ bool tcp_rack_mark_lost(struct sock *sk)
tp->rack.advanced = 0; tp->rack.advanced = 0;
tcp_rack_detect_loss(sk, &timeout); tcp_rack_detect_loss(sk, &timeout);
if (timeout) { if (timeout) {
timeout = usecs_to_jiffies(timeout) + TCP_TIMEOUT_MIN; timeout = usecs_to_jiffies(timeout + TCP_TIMEOUT_MIN_US);
inet_csk_reset_xmit_timer(sk, ICSK_TIME_REO_TIMEOUT, inet_csk_reset_xmit_timer(sk, ICSK_TIME_REO_TIMEOUT,
timeout, inet_csk(sk)->icsk_rto); timeout, inet_csk(sk)->icsk_rto);
} }

View File

@ -506,7 +506,9 @@ static inline int esp_remove_trailer(struct sk_buff *skb)
skb->csum = csum_block_sub(skb->csum, csumdiff, skb->csum = csum_block_sub(skb->csum, csumdiff,
skb->len - trimlen); skb->len - trimlen);
} }
pskb_trim(skb, skb->len - trimlen); ret = pskb_trim(skb, skb->len - trimlen);
if (unlikely(ret))
return ret;
ret = nexthdr[1]; ret = nexthdr[1];

View File

@ -120,11 +120,11 @@ static void xfrm6_dst_destroy(struct dst_entry *dst)
{ {
struct xfrm_dst *xdst = (struct xfrm_dst *)dst; struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
if (likely(xdst->u.rt6.rt6i_idev))
in6_dev_put(xdst->u.rt6.rt6i_idev);
dst_destroy_metrics_generic(dst); dst_destroy_metrics_generic(dst);
if (xdst->u.rt6.rt6i_uncached_list) if (xdst->u.rt6.rt6i_uncached_list)
rt6_uncached_list_del(&xdst->u.rt6); rt6_uncached_list_del(&xdst->u.rt6);
if (likely(xdst->u.rt6.rt6i_idev))
in6_dev_put(xdst->u.rt6.rt6i_idev);
xfrm_dst_destroy(xdst); xfrm_dst_destroy(xdst);
} }

View File

@ -651,7 +651,8 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
} }
if (unlikely(tx->key && tx->key->flags & KEY_FLAG_TAINTED && if (unlikely(tx->key && tx->key->flags & KEY_FLAG_TAINTED &&
!ieee80211_is_deauth(hdr->frame_control))) !ieee80211_is_deauth(hdr->frame_control)) &&
tx->skb->protocol != tx->sdata->control_port_protocol)
return TX_DROP; return TX_DROP;
if (!skip_hw && tx->key && if (!skip_hw && tx->key &&

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