mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge 6.1.101 into android14-6.1-lts
Changes in 6.1.101
minmax: sanity check constant bounds when clamping
minmax: clamp more efficiently by avoiding extra comparison
minmax: fix header inclusions
minmax: allow min()/max()/clamp() if the arguments have the same signedness.
minmax: allow comparisons of 'int' against 'unsigned char/short'
minmax: relax check to allow comparison between unsigned arguments and signed constants
mm/damon/core: merge regions aggressively when max_nr_regions is unmet
gcc-plugins: Rename last_stmt() for GCC 14+
filelock: Remove locks reliably when fcntl/close race is detected
scsi: core: alua: I/O errors for ALUA state transitions
scsi: qedf: Don't process stag work during unload and recovery
scsi: qedf: Wait for stag work during unload
scsi: qedf: Set qed_slowpath_params to zero before use
efi/libstub: zboot.lds: Discard .discard sections
ACPI: EC: Abort address space access upon error
ACPI: EC: Avoid returning AE_OK on errors in address space handler
tools/power/cpupower: Fix Pstate frequency reporting on AMD Family 1Ah CPUs
wifi: mac80211: mesh: init nonpeer_pm to active by default in mesh sdata
wifi: mac80211: apply mcast rate only if interface is up
wifi: mac80211: handle tasklet frames before stopping
wifi: cfg80211: fix 6 GHz scan request building
wifi: iwlwifi: mvm: d3: fix WoWLAN command version lookup
wifi: iwlwifi: mvm: Handle BIGTK cipher in kek_kck cmd
wifi: iwlwifi: mvm: properly set 6 GHz channel direct probe option
wifi: iwlwifi: mvm: Fix scan abort handling with HW rfkill
wifi: mac80211: fix UBSAN noise in ieee80211_prep_hw_scan()
selftests/openat2: Fix build warnings on ppc64
selftests/futex: pass _GNU_SOURCE without a value to the compiler
of/irq: Factor out parsing of interrupt-map parent phandle+args from of_irq_parse_raw()
Input: silead - Always support 10 fingers
net: ipv6: rpl_iptunnel: block BH in rpl_output() and rpl_input()
ila: block BH in ila_output()
null_blk: fix validation of block size
kconfig: gconf: give a proper initial state to the Save button
kconfig: remove wrong expr_trans_bool()
HID: Ignore battery for ELAN touchscreens 2F2C and 4116
NFSv4: Fix memory leak in nfs4_set_security_label
nfs: propagate readlink errors in nfs_symlink_filler
nfs: don't invalidate dentries on transient errors
cachefiles: add consistency check for copen/cread
cachefiles: Set object to close if ondemand_id < 0 in copen
cachefiles: make on-demand read killable
fs/file: fix the check in find_next_fd()
mei: demote client disconnect warning on suspend to debug
iomap: Fix iomap_adjust_read_range for plen calculation
drm: panel-orientation-quirks: Add quirk for Aya Neo KUN
nvme: avoid double free special payload
nvmet: always initialize cqe.result
wifi: cfg80211: wext: add extra SIOCSIWSCAN data check
KVM: PPC: Book3S HV: Prevent UAF in kvm_spapr_tce_attach_iommu_group()
drm/vmwgfx: Fix missing HYPERVISOR_GUEST dependency
ALSA: hda/realtek: Add more codec ID to no shutup pins list
mips: fix compat_sys_lseek syscall
Input: elantech - fix touchpad state on resume for Lenovo N24
Input: i8042 - add Ayaneo Kun to i8042 quirk table
ASoC: topology: Fix references to freed memory
ASoC: topology: Do not assign fields that are already set
bytcr_rt5640 : inverse jack detect for Archos 101 cesium
ALSA: dmaengine: Synchronize dma channel after drop()
ASoC: ti: davinci-mcasp: Set min period size using FIFO config
ASoC: ti: omap-hdmi: Fix too long driver name
ASoC: SOF: sof-audio: Skip unprepare for in-use widgets on error rollback
can: kvaser_usb: fix return value for hif_usb_send_regout
gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
s390/sclp: Fix sclp_init() cleanup on failure
platform/mellanox: nvsw-sn2201: Add check for platform_device_add_resources
platform/x86: wireless-hotkey: Add support for LG Airplane Button
platform/x86: lg-laptop: Remove LGEX0815 hotkey handling
platform/x86: lg-laptop: Change ACPI device id
platform/x86: lg-laptop: Use ACPI device handle when evaluating WMAB/WMBB
btrfs: qgroup: fix quota root leak after quota disable failure
ibmvnic: Add tx check to prevent skb leak
ALSA: PCM: Allow resume only for suspended streams
ALSA: hda/relatek: Enable Mute LED on HP Laptop 15-gw0xxx
ALSA: dmaengine_pcm: terminate dmaengine before synchronize
ASoC: amd: yc: Fix non-functional mic on ASUS M5602RA
net: usb: qmi_wwan: add Telit FN912 compositions
net: mac802154: Fix racy device stats updates by DEV_STATS_INC() and DEV_STATS_ADD()
powerpc/pseries: Whitelist dtl slub object for copying to userspace
powerpc/eeh: avoid possible crash when edev->pdev changes
scsi: libsas: Fix exp-attached device scan after probe failure scanned in again after probe failed
tee: optee: ffa: Fix missing-field-initializers warning
Bluetooth: hci_core: cancel all works upon hci_unregister_dev()
bluetooth/l2cap: sync sock recv cb and release
erofs: ensure m_llen is reset to 0 if metadata is invalid
drm/amd/display: Account for cursor prefetch BW in DML1 mode support
drm/radeon: check bo_va->bo is non-NULL before using it
fs: better handle deep ancestor chains in is_subdir()
wifi: iwlwifi: properly set WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK
drivers/perf: riscv: Reset the counter to hpmevent mapping while starting cpus
riscv: stacktrace: fix usage of ftrace_graph_ret_addr()
spi: imx: Don't expect DMA for i.MX{25,35,50,51,53} cspi devices
ksmbd: return FILE_DEVICE_DISK instead of super magic
selftests/vDSO: fix clang build errors and warnings
hfsplus: fix uninit-value in copy_name
spi: mux: set ctlr->bits_per_word_mask
cifs: fix noisy message on copy_file_range
ARM: 9324/1: fix get_user() broken with veneer
Bluetooth: L2CAP: Fix deadlock
of/irq: Disable "interrupt-map" parsing for PASEMI Nemo
wifi: cfg80211: wext: set ssids=NULL for passive scans
wifi: mac80211: disable softirqs for queued frame handling
netfs, fscache: export fscache_put_volume() and add fscache_try_get_volume()
cachefiles: fix slab-use-after-free in fscache_withdraw_volume()
cachefiles: fix slab-use-after-free in cachefiles_withdraw_cookie()
Linux 6.1.101
Change-Id: I6526fc29c0cfb314b6d36952d38fb781a82f4aa9
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 1
|
||||
SUBLEVEL = 100
|
||||
SUBLEVEL = 101
|
||||
EXTRAVERSION =
|
||||
NAME = Curry Ramen
|
||||
|
||||
|
||||
@@ -109,16 +109,6 @@ extern int __get_user_64t_1(void *);
|
||||
extern int __get_user_64t_2(void *);
|
||||
extern int __get_user_64t_4(void *);
|
||||
|
||||
#define __GUP_CLOBBER_1 "lr", "cc"
|
||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||
#define __GUP_CLOBBER_2 "ip", "lr", "cc"
|
||||
#else
|
||||
#define __GUP_CLOBBER_2 "lr", "cc"
|
||||
#endif
|
||||
#define __GUP_CLOBBER_4 "lr", "cc"
|
||||
#define __GUP_CLOBBER_32t_8 "lr", "cc"
|
||||
#define __GUP_CLOBBER_8 "lr", "cc"
|
||||
|
||||
#define __get_user_x(__r2, __p, __e, __l, __s) \
|
||||
__asm__ __volatile__ ( \
|
||||
__asmeq("%0", "r0") __asmeq("%1", "r2") \
|
||||
@@ -126,7 +116,7 @@ extern int __get_user_64t_4(void *);
|
||||
"bl __get_user_" #__s \
|
||||
: "=&r" (__e), "=r" (__r2) \
|
||||
: "0" (__p), "r" (__l) \
|
||||
: __GUP_CLOBBER_##__s)
|
||||
: "ip", "lr", "cc")
|
||||
|
||||
/* narrowing a double-word get into a single 32bit word register: */
|
||||
#ifdef __ARMEB__
|
||||
@@ -148,7 +138,7 @@ extern int __get_user_64t_4(void *);
|
||||
"bl __get_user_64t_" #__s \
|
||||
: "=&r" (__e), "=r" (__r2) \
|
||||
: "0" (__p), "r" (__l) \
|
||||
: __GUP_CLOBBER_##__s)
|
||||
: "ip", "lr", "cc")
|
||||
#else
|
||||
#define __get_user_x_64t __get_user_x
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
17 o32 break sys_ni_syscall
|
||||
# 18 was sys_stat
|
||||
18 o32 unused18 sys_ni_syscall
|
||||
19 o32 lseek sys_lseek
|
||||
19 o32 lseek sys_lseek compat_sys_lseek
|
||||
20 o32 getpid sys_getpid
|
||||
21 o32 mount sys_mount
|
||||
22 o32 umount sys_oldumount
|
||||
|
||||
@@ -850,6 +850,7 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
||||
{
|
||||
struct eeh_dev *edev;
|
||||
struct pci_dev *pdev;
|
||||
struct pci_bus *bus = NULL;
|
||||
|
||||
if (pe->type & EEH_PE_PHB)
|
||||
return pe->phb->bus;
|
||||
@@ -860,9 +861,11 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
||||
|
||||
/* Retrieve the parent PCI bus of first (top) PCI device */
|
||||
edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, entry);
|
||||
pci_lock_rescan_remove();
|
||||
pdev = eeh_dev_to_pci_dev(edev);
|
||||
if (pdev)
|
||||
return pdev->bus;
|
||||
bus = pdev->bus;
|
||||
pci_unlock_rescan_remove();
|
||||
|
||||
return NULL;
|
||||
return bus;
|
||||
}
|
||||
|
||||
@@ -129,14 +129,16 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
fdput(f);
|
||||
|
||||
if (!found)
|
||||
if (!found) {
|
||||
fdput(f);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
table_group = iommu_group_get_iommudata(grp);
|
||||
if (WARN_ON(!table_group))
|
||||
if (WARN_ON(!table_group)) {
|
||||
fdput(f);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
|
||||
struct iommu_table *tbltmp = table_group->tables[i];
|
||||
@@ -157,8 +159,10 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!tbl)
|
||||
if (!tbl) {
|
||||
fdput(f);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
|
||||
@@ -169,6 +173,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
/* stit is being destroyed */
|
||||
iommu_tce_table_put(tbl);
|
||||
rcu_read_unlock();
|
||||
fdput(f);
|
||||
return -ENOTTY;
|
||||
}
|
||||
/*
|
||||
@@ -176,6 +181,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
* its KVM reference counter and can return.
|
||||
*/
|
||||
rcu_read_unlock();
|
||||
fdput(f);
|
||||
return 0;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
@@ -183,6 +189,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
stit = kzalloc(sizeof(*stit), GFP_KERNEL);
|
||||
if (!stit) {
|
||||
iommu_tce_table_put(tbl);
|
||||
fdput(f);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -191,6 +198,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
|
||||
|
||||
list_add_rcu(&stit->next, &stt->iommu_tables);
|
||||
|
||||
fdput(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -342,8 +342,8 @@ static int alloc_dispatch_log_kmem_cache(void)
|
||||
{
|
||||
void (*ctor)(void *) = get_dtl_cache_ctor();
|
||||
|
||||
dtl_cache = kmem_cache_create("dtl", DISPATCH_LOG_BYTES,
|
||||
DISPATCH_LOG_BYTES, 0, ctor);
|
||||
dtl_cache = kmem_cache_create_usercopy("dtl", DISPATCH_LOG_BYTES,
|
||||
DISPATCH_LOG_BYTES, 0, 0, DISPATCH_LOG_BYTES, ctor);
|
||||
if (!dtl_cache) {
|
||||
pr_warn("Failed to create dispatch trace log buffer cache\n");
|
||||
pr_warn("Stolen time statistics will be unreliable\n");
|
||||
|
||||
@@ -32,6 +32,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
bool (*fn)(void *, unsigned long), void *arg)
|
||||
{
|
||||
unsigned long fp, sp, pc;
|
||||
int graph_idx = 0;
|
||||
int level = 0;
|
||||
|
||||
if (regs) {
|
||||
@@ -68,7 +69,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
pc = regs->ra;
|
||||
} else {
|
||||
fp = frame->fp;
|
||||
pc = ftrace_graph_ret_addr(current, NULL, frame->ra,
|
||||
pc = ftrace_graph_ret_addr(current, &graph_idx, frame->ra,
|
||||
&frame->ra);
|
||||
if (pc == (unsigned long)ret_from_exception) {
|
||||
if (unlikely(!__kernel_text_address(pc) || !fn(arg, pc)))
|
||||
|
||||
@@ -1314,10 +1314,13 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address,
|
||||
if (ec->busy_polling || bits > 8)
|
||||
acpi_ec_burst_enable(ec);
|
||||
|
||||
for (i = 0; i < bytes; ++i, ++address, ++value)
|
||||
for (i = 0; i < bytes; ++i, ++address, ++value) {
|
||||
result = (function == ACPI_READ) ?
|
||||
acpi_ec_read(ec, address, value) :
|
||||
acpi_ec_write(ec, address, *value);
|
||||
if (result < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ec->busy_polling || bits > 8)
|
||||
acpi_ec_burst_disable(ec);
|
||||
@@ -1329,8 +1332,10 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address,
|
||||
return AE_NOT_FOUND;
|
||||
case -ETIME:
|
||||
return AE_TIME;
|
||||
default:
|
||||
case 0:
|
||||
return AE_OK;
|
||||
default:
|
||||
return AE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1970,8 +1970,8 @@ static int null_validate_conf(struct nullb_device *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev->blocksize = round_down(dev->blocksize, 512);
|
||||
dev->blocksize = clamp_t(unsigned int, dev->blocksize, 512, 4096);
|
||||
if (blk_validate_block_size(dev->blocksize))
|
||||
return -EINVAL;
|
||||
|
||||
if (dev->queue_mode == NULL_Q_MQ && dev->use_per_node_hctx) {
|
||||
if (dev->submit_queues != nr_online_nodes)
|
||||
|
||||
@@ -34,6 +34,7 @@ SECTIONS
|
||||
}
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.discard .discard.*)
|
||||
*(.modinfo .init.modinfo)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -768,6 +768,8 @@ static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
|
||||
int level;
|
||||
|
||||
if (chip->driver_data & PCA_PCAL) {
|
||||
guard(mutex)(&chip->i2c_lock);
|
||||
|
||||
/* Enable latch on interrupt-enabled inputs */
|
||||
pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask);
|
||||
|
||||
|
||||
@@ -3338,6 +3338,9 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
||||
&mode_lib->vba.UrgentBurstFactorLumaPre[k],
|
||||
&mode_lib->vba.UrgentBurstFactorChromaPre[k],
|
||||
&mode_lib->vba.NotUrgentLatencyHidingPre[k]);
|
||||
|
||||
v->cursor_bw_pre[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] /
|
||||
8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * v->VRatioPreY[i][j][k];
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -202,6 +202,12 @@ static const struct dmi_system_id orientation_data[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NEXT"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* AYA NEO KUN */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "KUN"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1600x2560_rightside_up,
|
||||
}, { /* Chuwi HiBook (CWI514) */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
|
||||
|
||||
@@ -657,7 +657,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
|
||||
if (r)
|
||||
goto error_unlock;
|
||||
|
||||
if (bo_va->it.start)
|
||||
if (bo_va->it.start && bo_va->bo)
|
||||
r = radeon_vm_bo_update(rdev, bo_va, bo_va->bo->tbo.resource);
|
||||
|
||||
error_unlock:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
config DRM_VMWGFX
|
||||
tristate "DRM driver for VMware Virtual GPU"
|
||||
depends on DRM && PCI && MMU
|
||||
depends on X86 || ARM64
|
||||
depends on (X86 && HYPERVISOR_GUEST) || ARM64
|
||||
select DRM_TTM
|
||||
select DRM_TTM_HELPER
|
||||
select MAPPING_DIRTY_HELPERS
|
||||
|
||||
@@ -417,6 +417,8 @@
|
||||
#define I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG 0x29DF
|
||||
#define I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN 0x2BC8
|
||||
#define I2C_DEVICE_ID_ASUS_GV301RA_TOUCHSCREEN 0x2C82
|
||||
#define I2C_DEVICE_ID_ASUS_UX3402_TOUCHSCREEN 0x2F2C
|
||||
#define I2C_DEVICE_ID_ASUS_UX6404_TOUCHSCREEN 0x4116
|
||||
#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544
|
||||
#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
|
||||
#define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A
|
||||
|
||||
@@ -374,6 +374,10 @@ static const struct hid_device_id hid_battery_quirks[] = {
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_ASUS_GV301RA_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_ASUS_UX3402_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_ASUS_UX6404_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN),
|
||||
|
||||
@@ -1476,16 +1476,47 @@ static void elantech_disconnect(struct psmouse *psmouse)
|
||||
psmouse->private = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some hw_version 4 models fail to properly activate absolute mode on
|
||||
* resume without going through disable/enable cycle.
|
||||
*/
|
||||
static const struct dmi_system_id elantech_needs_reenable[] = {
|
||||
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
||||
{
|
||||
/* Lenovo N24 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "81AF"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
||||
/*
|
||||
* Put the touchpad back into absolute mode when reconnecting
|
||||
*/
|
||||
static int elantech_reconnect(struct psmouse *psmouse)
|
||||
{
|
||||
int err;
|
||||
|
||||
psmouse_reset(psmouse);
|
||||
|
||||
if (elantech_detect(psmouse, 0))
|
||||
return -1;
|
||||
|
||||
if (dmi_check_system(elantech_needs_reenable)) {
|
||||
err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE);
|
||||
if (err)
|
||||
psmouse_warn(psmouse, "failed to deactivate mouse on %s: %d\n",
|
||||
psmouse->ps2dev.serio->phys, err);
|
||||
|
||||
err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
|
||||
if (err)
|
||||
psmouse_warn(psmouse, "failed to reactivate mouse on %s: %d\n",
|
||||
psmouse->ps2dev.serio->phys, err);
|
||||
}
|
||||
|
||||
if (elantech_set_absolute_mode(psmouse)) {
|
||||
psmouse_err(psmouse,
|
||||
"failed to put touchpad back into absolute mode.\n");
|
||||
|
||||
@@ -76,7 +76,7 @@ static inline void i8042_write_command(int val)
|
||||
#define SERIO_QUIRK_PROBE_DEFER BIT(5)
|
||||
#define SERIO_QUIRK_RESET_ALWAYS BIT(6)
|
||||
#define SERIO_QUIRK_RESET_NEVER BIT(7)
|
||||
#define SERIO_QUIRK_DIECT BIT(8)
|
||||
#define SERIO_QUIRK_DIRECT BIT(8)
|
||||
#define SERIO_QUIRK_DUMBKBD BIT(9)
|
||||
#define SERIO_QUIRK_NOLOOP BIT(10)
|
||||
#define SERIO_QUIRK_NOTIMEOUT BIT(11)
|
||||
@@ -1332,6 +1332,20 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
/*
|
||||
* The Ayaneo Kun is a handheld device where some the buttons
|
||||
* are handled by an AT keyboard. The keyboard is usually
|
||||
* detected as raw, but sometimes, usually after a cold boot,
|
||||
* it is detected as translated. Make sure that the keyboard
|
||||
* is always in raw mode.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "KUN"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_DIRECT)
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -1655,7 +1669,7 @@ static void __init i8042_check_quirks(void)
|
||||
if (quirks & SERIO_QUIRK_RESET_NEVER)
|
||||
i8042_reset = I8042_RESET_NEVER;
|
||||
}
|
||||
if (quirks & SERIO_QUIRK_DIECT)
|
||||
if (quirks & SERIO_QUIRK_DIRECT)
|
||||
i8042_direct = true;
|
||||
if (quirks & SERIO_QUIRK_DUMBKBD)
|
||||
i8042_dumbkbd = true;
|
||||
|
||||
@@ -71,7 +71,6 @@ struct silead_ts_data {
|
||||
struct regulator_bulk_data regulators[2];
|
||||
char fw_name[64];
|
||||
struct touchscreen_properties prop;
|
||||
u32 max_fingers;
|
||||
u32 chip_id;
|
||||
struct input_mt_pos pos[SILEAD_MAX_FINGERS];
|
||||
int slots[SILEAD_MAX_FINGERS];
|
||||
@@ -136,7 +135,7 @@ static int silead_ts_request_input_dev(struct silead_ts_data *data)
|
||||
touchscreen_parse_properties(data->input, true, &data->prop);
|
||||
silead_apply_efi_fw_min_max(data);
|
||||
|
||||
input_mt_init_slots(data->input, data->max_fingers,
|
||||
input_mt_init_slots(data->input, SILEAD_MAX_FINGERS,
|
||||
INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED |
|
||||
INPUT_MT_TRACK);
|
||||
|
||||
@@ -256,10 +255,10 @@ static void silead_ts_read_data(struct i2c_client *client)
|
||||
return;
|
||||
}
|
||||
|
||||
if (buf[0] > data->max_fingers) {
|
||||
if (buf[0] > SILEAD_MAX_FINGERS) {
|
||||
dev_warn(dev, "More touches reported then supported %d > %d\n",
|
||||
buf[0], data->max_fingers);
|
||||
buf[0] = data->max_fingers;
|
||||
buf[0], SILEAD_MAX_FINGERS);
|
||||
buf[0] = SILEAD_MAX_FINGERS;
|
||||
}
|
||||
|
||||
if (silead_ts_handle_pen_data(data, buf))
|
||||
@@ -315,7 +314,6 @@ sync:
|
||||
|
||||
static int silead_ts_init(struct i2c_client *client)
|
||||
{
|
||||
struct silead_ts_data *data = i2c_get_clientdata(client);
|
||||
int error;
|
||||
|
||||
error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET,
|
||||
@@ -325,7 +323,7 @@ static int silead_ts_init(struct i2c_client *client)
|
||||
usleep_range(SILEAD_CMD_SLEEP_MIN, SILEAD_CMD_SLEEP_MAX);
|
||||
|
||||
error = i2c_smbus_write_byte_data(client, SILEAD_REG_TOUCH_NR,
|
||||
data->max_fingers);
|
||||
SILEAD_MAX_FINGERS);
|
||||
if (error)
|
||||
goto i2c_write_err;
|
||||
usleep_range(SILEAD_CMD_SLEEP_MIN, SILEAD_CMD_SLEEP_MAX);
|
||||
@@ -591,13 +589,6 @@ static void silead_ts_read_props(struct i2c_client *client)
|
||||
const char *str;
|
||||
int error;
|
||||
|
||||
error = device_property_read_u32(dev, "silead,max-fingers",
|
||||
&data->max_fingers);
|
||||
if (error) {
|
||||
dev_dbg(dev, "Max fingers read error %d\n", error);
|
||||
data->max_fingers = 5; /* Most devices handle up-to 5 fingers */
|
||||
}
|
||||
|
||||
error = device_property_read_string(dev, "firmware-name", &str);
|
||||
if (!error)
|
||||
snprintf(data->fw_name, sizeof(data->fw_name),
|
||||
|
||||
@@ -327,7 +327,7 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
|
||||
}
|
||||
|
||||
if (!mei_cl_is_connected(cl)) {
|
||||
cl_err(dev, cl, "is not connected");
|
||||
cl_dbg(dev, cl, "is not connected");
|
||||
rets = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
|
||||
}
|
||||
usb_free_urb(urb);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
int kvaser_usb_can_rx_over_error(struct net_device *netdev)
|
||||
|
||||
@@ -2288,6 +2288,18 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
(tx_pool->consumer_index + 1) % tx_pool->num_buffers;
|
||||
|
||||
tx_buff = &tx_pool->tx_buff[bufidx];
|
||||
|
||||
/* Sanity checks on our free map to make sure it points to an index
|
||||
* that is not being occupied by another skb. If skb memory is
|
||||
* not freed then we see congestion control kick in and halt tx.
|
||||
*/
|
||||
if (unlikely(tx_buff->skb)) {
|
||||
dev_warn_ratelimited(dev, "TX free map points to untracked skb (%s %d idx=%d)\n",
|
||||
skb_is_gso(skb) ? "tso_pool" : "tx_pool",
|
||||
queue_num, bufidx);
|
||||
dev_kfree_skb_any(tx_buff->skb);
|
||||
}
|
||||
|
||||
tx_buff->skb = skb;
|
||||
tx_buff->index = bufidx;
|
||||
tx_buff->pool_index = queue_num;
|
||||
|
||||
@@ -1379,6 +1379,8 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1260, 2)}, /* Telit LE910Cx */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1261, 2)}, /* Telit LE910Cx */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1900, 1)}, /* Telit LN940 series */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x3000, 0)}, /* Telit FN912 series */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x3001, 0)}, /* Telit FN912 series */
|
||||
{QMI_FIXED_INTF(0x1c9e, 0x9801, 3)}, /* Telewell TW-3G HSPA+ */
|
||||
{QMI_FIXED_INTF(0x1c9e, 0x9803, 4)}, /* Telewell TW-3G HSPA+ */
|
||||
{QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
|
||||
|
||||
@@ -594,16 +594,25 @@ static void iwl_mvm_wowlan_gtk_type_iter(struct ieee80211_hw *hw,
|
||||
void *_data)
|
||||
{
|
||||
struct wowlan_key_gtk_type_iter *data = _data;
|
||||
__le32 *cipher = NULL;
|
||||
|
||||
if (key->keyidx == 4 || key->keyidx == 5)
|
||||
cipher = &data->kek_kck_cmd->igtk_cipher;
|
||||
if (key->keyidx == 6 || key->keyidx == 7)
|
||||
cipher = &data->kek_kck_cmd->bigtk_cipher;
|
||||
|
||||
switch (key->cipher) {
|
||||
default:
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
data->kek_kck_cmd->igtk_cipher = cpu_to_le32(STA_KEY_FLG_GCMP);
|
||||
if (cipher)
|
||||
*cipher = cpu_to_le32(STA_KEY_FLG_GCMP);
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
data->kek_kck_cmd->igtk_cipher = cpu_to_le32(STA_KEY_FLG_CCM);
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
if (cipher)
|
||||
*cipher = cpu_to_le32(STA_KEY_FLG_CCM);
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
if (!sta)
|
||||
@@ -1934,7 +1943,8 @@ static bool iwl_mvm_setup_connection_keep(struct iwl_mvm *mvm,
|
||||
|
||||
out:
|
||||
if (iwl_fw_lookup_notif_ver(mvm->fw, LONG_GROUP,
|
||||
WOWLAN_GET_STATUSES, 0) < 10) {
|
||||
WOWLAN_GET_STATUSES,
|
||||
IWL_FW_CMD_VER_UNKNOWN) < 10) {
|
||||
mvmvif->seqno_valid = true;
|
||||
/* +0x10 because the set API expects next-to-use, not last-used */
|
||||
mvmvif->seqno = status->non_qos_seq_ctr + 0x10;
|
||||
|
||||
@@ -532,7 +532,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES;
|
||||
|
||||
if (iwl_fw_lookup_cmd_ver(mvm->fw, WOWLAN_KEK_KCK_MATERIAL,
|
||||
IWL_FW_CMD_VER_UNKNOWN) == 3)
|
||||
IWL_FW_CMD_VER_UNKNOWN) >= 3)
|
||||
hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK;
|
||||
|
||||
if (fw_has_api(&mvm->fw->ucode_capa,
|
||||
|
||||
@@ -1707,7 +1707,10 @@ iwl_mvm_umac_scan_fill_6g_chan_list(struct iwl_mvm *mvm,
|
||||
break;
|
||||
}
|
||||
|
||||
if (k == idex_b && idex_b < SCAN_BSSID_MAX_SIZE) {
|
||||
if (k == idex_b && idex_b < SCAN_BSSID_MAX_SIZE &&
|
||||
!WARN_ONCE(!is_valid_ether_addr(scan_6ghz_params[j].bssid),
|
||||
"scan: invalid BSSID at index %u, index_b=%u\n",
|
||||
j, idex_b)) {
|
||||
memcpy(&pp->bssid_array[idex_b++],
|
||||
scan_6ghz_params[j].bssid, ETH_ALEN);
|
||||
}
|
||||
@@ -3054,10 +3057,11 @@ static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type)
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm,
|
||||
WIDE_ID(IWL_ALWAYS_LONG_GROUP, SCAN_ABORT_UMAC),
|
||||
0, sizeof(cmd), &cmd);
|
||||
CMD_SEND_IN_RFKILL, sizeof(cmd), &cmd);
|
||||
if (!ret)
|
||||
mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT;
|
||||
|
||||
IWL_DEBUG_SCAN(mvm, "Scan abort: ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -954,6 +954,7 @@ void nvme_cleanup_cmd(struct request *req)
|
||||
clear_bit_unlock(0, &ctrl->discard_page_busy);
|
||||
else
|
||||
kfree(bvec_virt(&req->special_vec));
|
||||
req->rq_flags &= ~RQF_SPECIAL_PAYLOAD;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvme_cleanup_cmd);
|
||||
|
||||
@@ -944,6 +944,7 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
|
||||
req->metadata_sg_cnt = 0;
|
||||
req->transfer_len = 0;
|
||||
req->metadata_len = 0;
|
||||
req->cqe->result.u64 = 0;
|
||||
req->cqe->status = 0;
|
||||
req->cqe->sq_head = 0;
|
||||
req->ns = NULL;
|
||||
|
||||
@@ -336,7 +336,6 @@ done:
|
||||
pr_debug("%s: ctrl %d qid %d nvme status %x error loc %d\n",
|
||||
__func__, ctrl->cntlid, req->sq->qid,
|
||||
status, req->error_loc);
|
||||
req->cqe->result.u64 = 0;
|
||||
if (req->sq->dhchap_step != NVME_AUTH_DHCHAP_MESSAGE_SUCCESS2 &&
|
||||
req->sq->dhchap_step != NVME_AUTH_DHCHAP_MESSAGE_FAILURE2) {
|
||||
unsigned long auth_expire_secs = ctrl->kato ? ctrl->kato : 120;
|
||||
@@ -528,8 +527,6 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)
|
||||
status = nvmet_copy_to_sgl(req, 0, d, al);
|
||||
kfree(d);
|
||||
done:
|
||||
req->cqe->result.u64 = 0;
|
||||
|
||||
if (req->sq->dhchap_step == NVME_AUTH_DHCHAP_MESSAGE_SUCCESS2)
|
||||
nvmet_auth_sq_free(req->sq);
|
||||
else if (req->sq->dhchap_step == NVME_AUTH_DHCHAP_MESSAGE_FAILURE1) {
|
||||
|
||||
@@ -225,9 +225,6 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req)
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
/* zero out initial completion result, assign values as needed */
|
||||
req->cqe->result.u32 = 0;
|
||||
|
||||
if (c->recfmt != 0) {
|
||||
pr_warn("invalid connect version (%d).\n",
|
||||
le16_to_cpu(c->recfmt));
|
||||
@@ -305,9 +302,6 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
/* zero out initial completion result, assign values as needed */
|
||||
req->cqe->result.u32 = 0;
|
||||
|
||||
if (c->recfmt != 0) {
|
||||
pr_warn("invalid connect version (%d).\n",
|
||||
le16_to_cpu(c->recfmt));
|
||||
|
||||
143
drivers/of/irq.c
143
drivers/of/irq.c
@@ -25,6 +25,8 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "of_private.h"
|
||||
|
||||
/**
|
||||
* irq_of_parse_and_map - Parse and map an interrupt into linux virq space
|
||||
* @dev: Device node of the device whose interrupt is to be mapped
|
||||
@@ -79,7 +81,8 @@ EXPORT_SYMBOL_GPL(of_irq_find_parent);
|
||||
/*
|
||||
* These interrupt controllers abuse interrupt-map for unspeakable
|
||||
* reasons and rely on the core code to *ignore* it (the drivers do
|
||||
* their own parsing of the property).
|
||||
* their own parsing of the property). The PAsemi entry covers a
|
||||
* non-sensical interrupt-map that is better left ignored.
|
||||
*
|
||||
* If you think of adding to the list for something *new*, think
|
||||
* again. There is a high chance that you will be sent back to the
|
||||
@@ -93,9 +96,61 @@ static const char * const of_irq_imap_abusers[] = {
|
||||
"fsl,ls1043a-extirq",
|
||||
"fsl,ls1088a-extirq",
|
||||
"renesas,rza1-irqc",
|
||||
"pasemi,rootbus",
|
||||
NULL,
|
||||
};
|
||||
|
||||
const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len, struct of_phandle_args *out_irq)
|
||||
{
|
||||
u32 intsize, addrsize;
|
||||
struct device_node *np;
|
||||
|
||||
/* Get the interrupt parent */
|
||||
if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
|
||||
np = of_node_get(of_irq_dflt_pic);
|
||||
else
|
||||
np = of_find_node_by_phandle(be32_to_cpup(imap));
|
||||
imap++;
|
||||
|
||||
/* Check if not found */
|
||||
if (!np) {
|
||||
pr_debug(" -> imap parent not found !\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Get #interrupt-cells and #address-cells of new parent */
|
||||
if (of_property_read_u32(np, "#interrupt-cells",
|
||||
&intsize)) {
|
||||
pr_debug(" -> parent lacks #interrupt-cells!\n");
|
||||
of_node_put(np);
|
||||
return NULL;
|
||||
}
|
||||
if (of_property_read_u32(np, "#address-cells",
|
||||
&addrsize))
|
||||
addrsize = 0;
|
||||
|
||||
pr_debug(" -> intsize=%d, addrsize=%d\n",
|
||||
intsize, addrsize);
|
||||
|
||||
/* Check for malformed properties */
|
||||
if (WARN_ON(addrsize + intsize > MAX_PHANDLE_ARGS)
|
||||
|| (len < (addrsize + intsize))) {
|
||||
of_node_put(np);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pr_debug(" -> imaplen=%d\n", len);
|
||||
|
||||
imap += addrsize + intsize;
|
||||
|
||||
out_irq->np = np;
|
||||
for (int i = 0; i < intsize; i++)
|
||||
out_irq->args[i] = be32_to_cpup(imap - intsize + i);
|
||||
out_irq->args_count = intsize;
|
||||
|
||||
return imap;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_irq_parse_raw - Low level interrupt tree parsing
|
||||
* @addr: address specifier (start of "reg" property of the device) in be32 format
|
||||
@@ -112,12 +167,12 @@ static const char * const of_irq_imap_abusers[] = {
|
||||
*/
|
||||
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
{
|
||||
struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
|
||||
struct device_node *ipar, *tnode, *old = NULL;
|
||||
__be32 initial_match_array[MAX_PHANDLE_ARGS];
|
||||
const __be32 *match_array = initial_match_array;
|
||||
const __be32 *tmp, *imap, *imask, dummy_imask[] = { [0 ... MAX_PHANDLE_ARGS] = cpu_to_be32(~0) };
|
||||
u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
|
||||
int imaplen, match, i, rc = -EINVAL;
|
||||
const __be32 *tmp, dummy_imask[] = { [0 ... MAX_PHANDLE_ARGS] = cpu_to_be32(~0) };
|
||||
u32 intsize = 1, addrsize;
|
||||
int i, rc = -EINVAL;
|
||||
|
||||
#ifdef DEBUG
|
||||
of_print_phandle_args("of_irq_parse_raw: ", out_irq);
|
||||
@@ -176,6 +231,9 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
|
||||
/* Now start the actual "proper" walk of the interrupt tree */
|
||||
while (ipar != NULL) {
|
||||
int imaplen, match;
|
||||
const __be32 *imap, *oldimap, *imask;
|
||||
struct device_node *newpar;
|
||||
/*
|
||||
* Now check if cursor is an interrupt-controller and
|
||||
* if it is then we are done, unless there is an
|
||||
@@ -216,7 +274,7 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
|
||||
/* Parse interrupt-map */
|
||||
match = 0;
|
||||
while (imaplen > (addrsize + intsize + 1) && !match) {
|
||||
while (imaplen > (addrsize + intsize + 1)) {
|
||||
/* Compare specifiers */
|
||||
match = 1;
|
||||
for (i = 0; i < (addrsize + intsize); i++, imaplen--)
|
||||
@@ -224,74 +282,31 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
|
||||
pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen);
|
||||
|
||||
/* Get the interrupt parent */
|
||||
if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
|
||||
newpar = of_node_get(of_irq_dflt_pic);
|
||||
else
|
||||
newpar = of_find_node_by_phandle(be32_to_cpup(imap));
|
||||
imap++;
|
||||
--imaplen;
|
||||
|
||||
/* Check if not found */
|
||||
if (newpar == NULL) {
|
||||
pr_debug(" -> imap parent not found !\n");
|
||||
oldimap = imap;
|
||||
imap = of_irq_parse_imap_parent(oldimap, imaplen, out_irq);
|
||||
if (!imap)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!of_device_is_available(newpar))
|
||||
match = 0;
|
||||
|
||||
/* Get #interrupt-cells and #address-cells of new
|
||||
* parent
|
||||
*/
|
||||
if (of_property_read_u32(newpar, "#interrupt-cells",
|
||||
&newintsize)) {
|
||||
pr_debug(" -> parent lacks #interrupt-cells!\n");
|
||||
goto fail;
|
||||
}
|
||||
if (of_property_read_u32(newpar, "#address-cells",
|
||||
&newaddrsize))
|
||||
newaddrsize = 0;
|
||||
|
||||
pr_debug(" -> newintsize=%d, newaddrsize=%d\n",
|
||||
newintsize, newaddrsize);
|
||||
|
||||
/* Check for malformed properties */
|
||||
if (WARN_ON(newaddrsize + newintsize > MAX_PHANDLE_ARGS)
|
||||
|| (imaplen < (newaddrsize + newintsize))) {
|
||||
rc = -EFAULT;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
imap += newaddrsize + newintsize;
|
||||
imaplen -= newaddrsize + newintsize;
|
||||
match &= of_device_is_available(out_irq->np);
|
||||
if (match)
|
||||
break;
|
||||
|
||||
of_node_put(out_irq->np);
|
||||
imaplen -= imap - oldimap;
|
||||
pr_debug(" -> imaplen=%d\n", imaplen);
|
||||
}
|
||||
if (!match) {
|
||||
if (intc) {
|
||||
/*
|
||||
* The PASEMI Nemo is a known offender, so
|
||||
* let's only warn for anyone else.
|
||||
*/
|
||||
WARN(!IS_ENABLED(CONFIG_PPC_PASEMI),
|
||||
"%pOF interrupt-map failed, using interrupt-controller\n",
|
||||
ipar);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!match)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Successfully parsed an interrupt-map translation; copy new
|
||||
* interrupt specifier into the out_irq structure
|
||||
*/
|
||||
match_array = imap - newaddrsize - newintsize;
|
||||
for (i = 0; i < newintsize; i++)
|
||||
out_irq->args[i] = be32_to_cpup(imap - newintsize + i);
|
||||
out_irq->args_count = intsize = newintsize;
|
||||
addrsize = newaddrsize;
|
||||
match_array = oldimap + 1;
|
||||
|
||||
newpar = out_irq->np;
|
||||
intsize = out_irq->args_count;
|
||||
addrsize = (imap - match_array) - intsize;
|
||||
|
||||
if (ipar == newpar) {
|
||||
pr_debug("%pOF interrupt-map entry to self\n", ipar);
|
||||
@@ -300,7 +315,6 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
|
||||
skiplevel:
|
||||
/* Iterate again with new parent */
|
||||
out_irq->np = newpar;
|
||||
pr_debug(" -> new parent: %pOF\n", newpar);
|
||||
of_node_put(ipar);
|
||||
ipar = newpar;
|
||||
@@ -310,7 +324,6 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
|
||||
fail:
|
||||
of_node_put(ipar);
|
||||
of_node_put(newpar);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -151,6 +151,9 @@ extern void __of_sysfs_remove_bin_file(struct device_node *np,
|
||||
extern int of_bus_n_addr_cells(struct device_node *np);
|
||||
extern int of_bus_n_size_cells(struct device_node *np);
|
||||
|
||||
const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len,
|
||||
struct of_phandle_args *out_irq);
|
||||
|
||||
struct bus_dma_region;
|
||||
#if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_HAS_DMA)
|
||||
int of_dma_get_range(struct device_node *np,
|
||||
|
||||
@@ -502,7 +502,7 @@ static inline void pmu_sbi_stop_all(struct riscv_pmu *pmu)
|
||||
* which may include counters that are not enabled yet.
|
||||
*/
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP,
|
||||
0, pmu->cmask, 0, 0, 0, 0);
|
||||
0, pmu->cmask, SBI_PMU_STOP_FLAG_RESET, 0, 0, 0);
|
||||
}
|
||||
|
||||
static inline void pmu_sbi_stop_hw_ctrs(struct riscv_pmu *pmu)
|
||||
|
||||
@@ -1194,6 +1194,7 @@ static int nvsw_sn2201_config_pre_init(struct nvsw_sn2201 *nvsw_sn2201)
|
||||
static int nvsw_sn2201_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct nvsw_sn2201 *nvsw_sn2201;
|
||||
int ret;
|
||||
|
||||
nvsw_sn2201 = devm_kzalloc(&pdev->dev, sizeof(*nvsw_sn2201), GFP_KERNEL);
|
||||
if (!nvsw_sn2201)
|
||||
@@ -1201,8 +1202,10 @@ static int nvsw_sn2201_probe(struct platform_device *pdev)
|
||||
|
||||
nvsw_sn2201->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, nvsw_sn2201);
|
||||
platform_device_add_resources(pdev, nvsw_sn2201_lpc_io_resources,
|
||||
ret = platform_device_add_resources(pdev, nvsw_sn2201_lpc_io_resources,
|
||||
ARRAY_SIZE(nvsw_sn2201_lpc_io_resources));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
nvsw_sn2201->main_mux_deferred_nr = NVSW_SN2201_MAIN_MUX_DEFER_NR;
|
||||
nvsw_sn2201->main_mux_devs = nvsw_sn2201_main_mux_brdinfo;
|
||||
|
||||
@@ -39,8 +39,6 @@ MODULE_LICENSE("GPL");
|
||||
#define WMI_METHOD_WMBB "2B4F501A-BD3C-4394-8DCF-00A7D2BC8210"
|
||||
#define WMI_EVENT_GUID WMI_EVENT_GUID0
|
||||
|
||||
#define WMAB_METHOD "\\XINI.WMAB"
|
||||
#define WMBB_METHOD "\\XINI.WMBB"
|
||||
#define SB_GGOV_METHOD "\\_SB.GGOV"
|
||||
#define GOV_TLED 0x2020008
|
||||
#define WM_GET 1
|
||||
@@ -74,7 +72,7 @@ static u32 inited;
|
||||
|
||||
static int battery_limit_use_wmbb;
|
||||
static struct led_classdev kbd_backlight;
|
||||
static enum led_brightness get_kbd_backlight_level(void);
|
||||
static enum led_brightness get_kbd_backlight_level(struct device *dev);
|
||||
|
||||
static const struct key_entry wmi_keymap[] = {
|
||||
{KE_KEY, 0x70, {KEY_F15} }, /* LG control panel (F1) */
|
||||
@@ -84,7 +82,6 @@ static const struct key_entry wmi_keymap[] = {
|
||||
* this key both sends an event and
|
||||
* changes backlight level.
|
||||
*/
|
||||
{KE_KEY, 0x80, {KEY_RFKILL} },
|
||||
{KE_END, 0}
|
||||
};
|
||||
|
||||
@@ -128,11 +125,10 @@ static int ggov(u32 arg0)
|
||||
return res;
|
||||
}
|
||||
|
||||
static union acpi_object *lg_wmab(u32 method, u32 arg1, u32 arg2)
|
||||
static union acpi_object *lg_wmab(struct device *dev, u32 method, u32 arg1, u32 arg2)
|
||||
{
|
||||
union acpi_object args[3];
|
||||
acpi_status status;
|
||||
acpi_handle handle;
|
||||
struct acpi_object_list arg;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
@@ -143,29 +139,22 @@ static union acpi_object *lg_wmab(u32 method, u32 arg1, u32 arg2)
|
||||
args[2].type = ACPI_TYPE_INTEGER;
|
||||
args[2].integer.value = arg2;
|
||||
|
||||
status = acpi_get_handle(NULL, (acpi_string) WMAB_METHOD, &handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err("Cannot get handle");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arg.count = 3;
|
||||
arg.pointer = args;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, &arg, &buffer);
|
||||
status = acpi_evaluate_object(ACPI_HANDLE(dev), "WMAB", &arg, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_err(handle, "WMAB: call failed.\n");
|
||||
dev_err(dev, "WMAB: call failed.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buffer.pointer;
|
||||
}
|
||||
|
||||
static union acpi_object *lg_wmbb(u32 method_id, u32 arg1, u32 arg2)
|
||||
static union acpi_object *lg_wmbb(struct device *dev, u32 method_id, u32 arg1, u32 arg2)
|
||||
{
|
||||
union acpi_object args[3];
|
||||
acpi_status status;
|
||||
acpi_handle handle;
|
||||
struct acpi_object_list arg;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
u8 buf[32];
|
||||
@@ -181,18 +170,12 @@ static union acpi_object *lg_wmbb(u32 method_id, u32 arg1, u32 arg2)
|
||||
args[2].buffer.length = 32;
|
||||
args[2].buffer.pointer = buf;
|
||||
|
||||
status = acpi_get_handle(NULL, (acpi_string)WMBB_METHOD, &handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err("Cannot get handle");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arg.count = 3;
|
||||
arg.pointer = args;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, &arg, &buffer);
|
||||
status = acpi_evaluate_object(ACPI_HANDLE(dev), "WMBB", &arg, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_err(handle, "WMAB: call failed.\n");
|
||||
dev_err(dev, "WMBB: call failed.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -223,7 +206,7 @@ static void wmi_notify(u32 value, void *context)
|
||||
|
||||
if (eventcode == 0x10000000) {
|
||||
led_classdev_notify_brightness_hw_changed(
|
||||
&kbd_backlight, get_kbd_backlight_level());
|
||||
&kbd_backlight, get_kbd_backlight_level(kbd_backlight.dev->parent));
|
||||
} else {
|
||||
key = sparse_keymap_entry_from_scancode(
|
||||
wmi_input_dev, eventcode);
|
||||
@@ -272,14 +255,7 @@ static void wmi_input_setup(void)
|
||||
|
||||
static void acpi_notify(struct acpi_device *device, u32 event)
|
||||
{
|
||||
struct key_entry *key;
|
||||
|
||||
acpi_handle_debug(device->handle, "notify: %d\n", event);
|
||||
if (inited & INIT_SPARSE_KEYMAP) {
|
||||
key = sparse_keymap_entry_from_scancode(wmi_input_dev, 0x80);
|
||||
if (key && key->type == KE_KEY)
|
||||
sparse_keymap_report_entry(wmi_input_dev, key, 1, true);
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t fan_mode_store(struct device *dev,
|
||||
@@ -295,7 +271,7 @@ static ssize_t fan_mode_store(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = lg_wmab(WM_FAN_MODE, WM_GET, 0);
|
||||
r = lg_wmab(dev, WM_FAN_MODE, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -306,9 +282,9 @@ static ssize_t fan_mode_store(struct device *dev,
|
||||
|
||||
m = r->integer.value;
|
||||
kfree(r);
|
||||
r = lg_wmab(WM_FAN_MODE, WM_SET, (m & 0xffffff0f) | (value << 4));
|
||||
r = lg_wmab(dev, WM_FAN_MODE, WM_SET, (m & 0xffffff0f) | (value << 4));
|
||||
kfree(r);
|
||||
r = lg_wmab(WM_FAN_MODE, WM_SET, (m & 0xfffffff0) | value);
|
||||
r = lg_wmab(dev, WM_FAN_MODE, WM_SET, (m & 0xfffffff0) | value);
|
||||
kfree(r);
|
||||
|
||||
return count;
|
||||
@@ -320,7 +296,7 @@ static ssize_t fan_mode_show(struct device *dev,
|
||||
unsigned int status;
|
||||
union acpi_object *r;
|
||||
|
||||
r = lg_wmab(WM_FAN_MODE, WM_GET, 0);
|
||||
r = lg_wmab(dev, WM_FAN_MODE, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -347,7 +323,7 @@ static ssize_t usb_charge_store(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = lg_wmbb(WMBB_USB_CHARGE, WM_SET, value);
|
||||
r = lg_wmbb(dev, WMBB_USB_CHARGE, WM_SET, value);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -361,7 +337,7 @@ static ssize_t usb_charge_show(struct device *dev,
|
||||
unsigned int status;
|
||||
union acpi_object *r;
|
||||
|
||||
r = lg_wmbb(WMBB_USB_CHARGE, WM_GET, 0);
|
||||
r = lg_wmbb(dev, WMBB_USB_CHARGE, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -389,7 +365,7 @@ static ssize_t reader_mode_store(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = lg_wmab(WM_READER_MODE, WM_SET, value);
|
||||
r = lg_wmab(dev, WM_READER_MODE, WM_SET, value);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -403,7 +379,7 @@ static ssize_t reader_mode_show(struct device *dev,
|
||||
unsigned int status;
|
||||
union acpi_object *r;
|
||||
|
||||
r = lg_wmab(WM_READER_MODE, WM_GET, 0);
|
||||
r = lg_wmab(dev, WM_READER_MODE, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -431,7 +407,7 @@ static ssize_t fn_lock_store(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = lg_wmab(WM_FN_LOCK, WM_SET, value);
|
||||
r = lg_wmab(dev, WM_FN_LOCK, WM_SET, value);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -445,7 +421,7 @@ static ssize_t fn_lock_show(struct device *dev,
|
||||
unsigned int status;
|
||||
union acpi_object *r;
|
||||
|
||||
r = lg_wmab(WM_FN_LOCK, WM_GET, 0);
|
||||
r = lg_wmab(dev, WM_FN_LOCK, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -475,9 +451,9 @@ static ssize_t charge_control_end_threshold_store(struct device *dev,
|
||||
union acpi_object *r;
|
||||
|
||||
if (battery_limit_use_wmbb)
|
||||
r = lg_wmbb(WMBB_BATT_LIMIT, WM_SET, value);
|
||||
r = lg_wmbb(&pf_device->dev, WMBB_BATT_LIMIT, WM_SET, value);
|
||||
else
|
||||
r = lg_wmab(WM_BATT_LIMIT, WM_SET, value);
|
||||
r = lg_wmab(&pf_device->dev, WM_BATT_LIMIT, WM_SET, value);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -496,7 +472,7 @@ static ssize_t charge_control_end_threshold_show(struct device *device,
|
||||
union acpi_object *r;
|
||||
|
||||
if (battery_limit_use_wmbb) {
|
||||
r = lg_wmbb(WMBB_BATT_LIMIT, WM_GET, 0);
|
||||
r = lg_wmbb(&pf_device->dev, WMBB_BATT_LIMIT, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -507,7 +483,7 @@ static ssize_t charge_control_end_threshold_show(struct device *device,
|
||||
|
||||
status = r->buffer.pointer[0x10];
|
||||
} else {
|
||||
r = lg_wmab(WM_BATT_LIMIT, WM_GET, 0);
|
||||
r = lg_wmab(&pf_device->dev, WM_BATT_LIMIT, WM_GET, 0);
|
||||
if (!r)
|
||||
return -EIO;
|
||||
|
||||
@@ -586,7 +562,7 @@ static void tpad_led_set(struct led_classdev *cdev,
|
||||
{
|
||||
union acpi_object *r;
|
||||
|
||||
r = lg_wmab(WM_TLED, WM_SET, brightness > LED_OFF);
|
||||
r = lg_wmab(cdev->dev->parent, WM_TLED, WM_SET, brightness > LED_OFF);
|
||||
kfree(r);
|
||||
}
|
||||
|
||||
@@ -608,16 +584,16 @@ static void kbd_backlight_set(struct led_classdev *cdev,
|
||||
val = 0;
|
||||
if (brightness >= LED_FULL)
|
||||
val = 0x24;
|
||||
r = lg_wmab(WM_KEY_LIGHT, WM_SET, val);
|
||||
r = lg_wmab(cdev->dev->parent, WM_KEY_LIGHT, WM_SET, val);
|
||||
kfree(r);
|
||||
}
|
||||
|
||||
static enum led_brightness get_kbd_backlight_level(void)
|
||||
static enum led_brightness get_kbd_backlight_level(struct device *dev)
|
||||
{
|
||||
union acpi_object *r;
|
||||
int val;
|
||||
|
||||
r = lg_wmab(WM_KEY_LIGHT, WM_GET, 0);
|
||||
r = lg_wmab(dev, WM_KEY_LIGHT, WM_GET, 0);
|
||||
|
||||
if (!r)
|
||||
return LED_OFF;
|
||||
@@ -645,7 +621,7 @@ static enum led_brightness get_kbd_backlight_level(void)
|
||||
|
||||
static enum led_brightness kbd_backlight_get(struct led_classdev *cdev)
|
||||
{
|
||||
return get_kbd_backlight_level();
|
||||
return get_kbd_backlight_level(cdev->dev->parent);
|
||||
}
|
||||
|
||||
static LED_DEVICE(kbd_backlight, 255, LED_BRIGHT_HW_CHANGED);
|
||||
@@ -672,6 +648,11 @@ static struct platform_driver pf_driver = {
|
||||
|
||||
static int acpi_add(struct acpi_device *device)
|
||||
{
|
||||
struct platform_device_info pdev_info = {
|
||||
.fwnode = acpi_fwnode_handle(device),
|
||||
.name = PLATFORM_NAME,
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
};
|
||||
int ret;
|
||||
const char *product;
|
||||
int year = 2017;
|
||||
@@ -683,9 +664,7 @@ static int acpi_add(struct acpi_device *device)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pf_device = platform_device_register_simple(PLATFORM_NAME,
|
||||
PLATFORM_DEVID_NONE,
|
||||
NULL, 0);
|
||||
pf_device = platform_device_register_full(&pdev_info);
|
||||
if (IS_ERR(pf_device)) {
|
||||
ret = PTR_ERR(pf_device);
|
||||
pf_device = NULL;
|
||||
@@ -778,7 +757,7 @@ static int acpi_remove(struct acpi_device *device)
|
||||
}
|
||||
|
||||
static const struct acpi_device_id device_ids[] = {
|
||||
{"LGEX0815", 0},
|
||||
{"LGEX0820", 0},
|
||||
{"", 0}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, device_ids);
|
||||
|
||||
@@ -19,6 +19,7 @@ MODULE_AUTHOR("Alex Hung");
|
||||
MODULE_ALIAS("acpi*:HPQ6001:*");
|
||||
MODULE_ALIAS("acpi*:WSTADEF:*");
|
||||
MODULE_ALIAS("acpi*:AMDI0051:*");
|
||||
MODULE_ALIAS("acpi*:LGEX0815:*");
|
||||
|
||||
static struct input_dev *wl_input_dev;
|
||||
|
||||
@@ -26,6 +27,7 @@ static const struct acpi_device_id wl_ids[] = {
|
||||
{"HPQ6001", 0},
|
||||
{"WSTADEF", 0},
|
||||
{"AMDI0051", 0},
|
||||
{"LGEX0815", 0},
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
|
||||
@@ -1290,6 +1290,7 @@ sclp_init(void)
|
||||
fail_unregister_reboot_notifier:
|
||||
unregister_reboot_notifier(&sclp_reboot_notifier);
|
||||
fail_init_state_uninitialized:
|
||||
list_del(&sclp_state_change_event.list);
|
||||
sclp_init_state = sclp_init_state_uninitialized;
|
||||
free_page((unsigned long) sclp_read_sccb);
|
||||
free_page((unsigned long) sclp_init_sccb);
|
||||
|
||||
@@ -412,28 +412,40 @@ static char print_alua_state(unsigned char state)
|
||||
}
|
||||
}
|
||||
|
||||
static enum scsi_disposition alua_check_sense(struct scsi_device *sdev,
|
||||
struct scsi_sense_hdr *sense_hdr)
|
||||
static void alua_handle_state_transition(struct scsi_device *sdev)
|
||||
{
|
||||
struct alua_dh_data *h = sdev->handler_data;
|
||||
struct alua_port_group *pg;
|
||||
|
||||
rcu_read_lock();
|
||||
pg = rcu_dereference(h->pg);
|
||||
if (pg)
|
||||
pg->state = SCSI_ACCESS_STATE_TRANSITIONING;
|
||||
rcu_read_unlock();
|
||||
alua_check(sdev, false);
|
||||
}
|
||||
|
||||
static enum scsi_disposition alua_check_sense(struct scsi_device *sdev,
|
||||
struct scsi_sense_hdr *sense_hdr)
|
||||
{
|
||||
switch (sense_hdr->sense_key) {
|
||||
case NOT_READY:
|
||||
if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) {
|
||||
/*
|
||||
* LUN Not Accessible - ALUA state transition
|
||||
*/
|
||||
rcu_read_lock();
|
||||
pg = rcu_dereference(h->pg);
|
||||
if (pg)
|
||||
pg->state = SCSI_ACCESS_STATE_TRANSITIONING;
|
||||
rcu_read_unlock();
|
||||
alua_check(sdev, false);
|
||||
alua_handle_state_transition(sdev);
|
||||
return NEEDS_RETRY;
|
||||
}
|
||||
break;
|
||||
case UNIT_ATTENTION:
|
||||
if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) {
|
||||
/*
|
||||
* LUN Not Accessible - ALUA state transition
|
||||
*/
|
||||
alua_handle_state_transition(sdev);
|
||||
return NEEDS_RETRY;
|
||||
}
|
||||
if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) {
|
||||
/*
|
||||
* Power On, Reset, or Bus Device Reset.
|
||||
@@ -500,7 +512,8 @@ static int alua_tur(struct scsi_device *sdev)
|
||||
|
||||
retval = scsi_test_unit_ready(sdev, ALUA_FAILOVER_TIMEOUT * HZ,
|
||||
ALUA_FAILOVER_RETRIES, &sense_hdr);
|
||||
if (sense_hdr.sense_key == NOT_READY &&
|
||||
if ((sense_hdr.sense_key == NOT_READY ||
|
||||
sense_hdr.sense_key == UNIT_ATTENTION) &&
|
||||
sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a)
|
||||
return SCSI_DH_RETRY;
|
||||
else if (retval)
|
||||
|
||||
@@ -119,6 +119,20 @@ static inline void sas_fail_probe(struct domain_device *dev, const char *func, i
|
||||
func, dev->parent ? "exp-attached" :
|
||||
"direct-attached",
|
||||
SAS_ADDR(dev->sas_addr), err);
|
||||
|
||||
/*
|
||||
* If the device probe failed, the expander phy attached address
|
||||
* needs to be reset so that the phy will not be treated as flutter
|
||||
* in the next revalidation
|
||||
*/
|
||||
if (dev->parent && !dev_is_expander(dev->dev_type)) {
|
||||
struct sas_phy *phy = dev->phy;
|
||||
struct domain_device *parent = dev->parent;
|
||||
struct ex_phy *ex_phy = &parent->ex_dev.ex_phy[phy->number];
|
||||
|
||||
memset(ex_phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
|
||||
}
|
||||
|
||||
sas_unregister_dev(dev->port, dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -362,6 +362,7 @@ struct qedf_ctx {
|
||||
#define QEDF_IN_RECOVERY 5
|
||||
#define QEDF_DBG_STOP_IO 6
|
||||
#define QEDF_PROBING 8
|
||||
#define QEDF_STAG_IN_PROGRESS 9
|
||||
unsigned long flags; /* Miscellaneous state flags */
|
||||
int fipvlan_retries;
|
||||
u8 num_queues;
|
||||
|
||||
@@ -318,11 +318,18 @@ static struct fc_seq *qedf_elsct_send(struct fc_lport *lport, u32 did,
|
||||
*/
|
||||
if (resp == fc_lport_flogi_resp) {
|
||||
qedf->flogi_cnt++;
|
||||
qedf->flogi_pending++;
|
||||
|
||||
if (test_bit(QEDF_UNLOADING, &qedf->flags)) {
|
||||
QEDF_ERR(&qedf->dbg_ctx, "Driver unloading\n");
|
||||
qedf->flogi_pending = 0;
|
||||
}
|
||||
|
||||
if (qedf->flogi_pending >= QEDF_FLOGI_RETRY_CNT) {
|
||||
schedule_delayed_work(&qedf->stag_work, 2);
|
||||
return NULL;
|
||||
}
|
||||
qedf->flogi_pending++;
|
||||
|
||||
return fc_elsct_send(lport, did, fp, op, qedf_flogi_resp,
|
||||
arg, timeout);
|
||||
}
|
||||
@@ -911,13 +918,14 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
|
||||
struct qedf_ctx *qedf;
|
||||
struct qed_link_output if_link;
|
||||
|
||||
qedf = lport_priv(lport);
|
||||
|
||||
if (lport->vport) {
|
||||
clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags);
|
||||
printk_ratelimited("Cannot issue host reset on NPIV port.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
qedf = lport_priv(lport);
|
||||
|
||||
qedf->flogi_pending = 0;
|
||||
/* For host reset, essentially do a soft link up/down */
|
||||
atomic_set(&qedf->link_state, QEDF_LINK_DOWN);
|
||||
@@ -937,6 +945,7 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
|
||||
if (!if_link.link_up) {
|
||||
QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC,
|
||||
"Physical link is not up.\n");
|
||||
clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags);
|
||||
return;
|
||||
}
|
||||
/* Flush and wait to make sure link down is processed */
|
||||
@@ -949,6 +958,7 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
|
||||
"Queue link up work.\n");
|
||||
queue_delayed_work(qedf->link_update_wq, &qedf->link_update,
|
||||
0);
|
||||
clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags);
|
||||
}
|
||||
|
||||
/* Reset the host by gracefully logging out and then logging back in */
|
||||
@@ -3467,6 +3477,7 @@ retry_probe:
|
||||
}
|
||||
|
||||
/* Start the Slowpath-process */
|
||||
memset(&slowpath_params, 0, sizeof(struct qed_slowpath_params));
|
||||
slowpath_params.int_mode = QED_INT_MODE_MSIX;
|
||||
slowpath_params.drv_major = QEDF_DRIVER_MAJOR_VER;
|
||||
slowpath_params.drv_minor = QEDF_DRIVER_MINOR_VER;
|
||||
@@ -3725,6 +3736,7 @@ static void __qedf_remove(struct pci_dev *pdev, int mode)
|
||||
{
|
||||
struct qedf_ctx *qedf;
|
||||
int rc;
|
||||
int cnt = 0;
|
||||
|
||||
if (!pdev) {
|
||||
QEDF_ERR(NULL, "pdev is NULL.\n");
|
||||
@@ -3742,6 +3754,17 @@ static void __qedf_remove(struct pci_dev *pdev, int mode)
|
||||
return;
|
||||
}
|
||||
|
||||
stag_in_prog:
|
||||
if (test_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags)) {
|
||||
QEDF_ERR(&qedf->dbg_ctx, "Stag in progress, cnt=%d.\n", cnt);
|
||||
cnt++;
|
||||
|
||||
if (cnt < 5) {
|
||||
msleep(500);
|
||||
goto stag_in_prog;
|
||||
}
|
||||
}
|
||||
|
||||
if (mode != QEDF_MODE_RECOVERY)
|
||||
set_bit(QEDF_UNLOADING, &qedf->flags);
|
||||
|
||||
@@ -4001,6 +4024,24 @@ void qedf_stag_change_work(struct work_struct *work)
|
||||
struct qedf_ctx *qedf =
|
||||
container_of(work, struct qedf_ctx, stag_work.work);
|
||||
|
||||
if (!qedf) {
|
||||
QEDF_ERR(&qedf->dbg_ctx, "qedf is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
if (test_bit(QEDF_IN_RECOVERY, &qedf->flags)) {
|
||||
QEDF_ERR(&qedf->dbg_ctx,
|
||||
"Already is in recovery, hence not calling software context reset.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (test_bit(QEDF_UNLOADING, &qedf->flags)) {
|
||||
QEDF_ERR(&qedf->dbg_ctx, "Driver unloading\n");
|
||||
return;
|
||||
}
|
||||
|
||||
set_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags);
|
||||
|
||||
printk_ratelimited("[%s]:[%s:%d]:%d: Performing software context reset.",
|
||||
dev_name(&qedf->pdev->dev), __func__, __LINE__,
|
||||
qedf->dbg_ctx.host_no);
|
||||
|
||||
@@ -1040,7 +1040,7 @@ static struct spi_imx_devtype_data imx35_cspi_devtype_data = {
|
||||
.rx_available = mx31_rx_available,
|
||||
.reset = mx31_reset,
|
||||
.fifo_size = 8,
|
||||
.has_dmamode = true,
|
||||
.has_dmamode = false,
|
||||
.dynamic_burst = false,
|
||||
.has_slavemode = false,
|
||||
.devtype = IMX35_CSPI,
|
||||
|
||||
@@ -156,6 +156,7 @@ static int spi_mux_probe(struct spi_device *spi)
|
||||
/* supported modes are the same as our parent's */
|
||||
ctlr->mode_bits = spi->controller->mode_bits;
|
||||
ctlr->flags = spi->controller->flags;
|
||||
ctlr->bits_per_word_mask = spi->controller->bits_per_word_mask;
|
||||
ctlr->transfer_one_message = spi_mux_transfer_one_message;
|
||||
ctlr->setup = spi_mux_setup;
|
||||
ctlr->num_chipselect = mux_control_states(priv->mux);
|
||||
|
||||
@@ -657,7 +657,9 @@ static bool optee_ffa_api_is_compatbile(struct ffa_device *ffa_dev,
|
||||
const struct ffa_ops *ops)
|
||||
{
|
||||
const struct ffa_msg_ops *msg_ops = ops->msg_ops;
|
||||
struct ffa_send_direct_data data = { OPTEE_FFA_GET_API_VERSION };
|
||||
struct ffa_send_direct_data data = {
|
||||
.data0 = OPTEE_FFA_GET_API_VERSION,
|
||||
};
|
||||
int rc;
|
||||
|
||||
msg_ops->mode_32bit_set(ffa_dev);
|
||||
@@ -674,7 +676,9 @@ static bool optee_ffa_api_is_compatbile(struct ffa_device *ffa_dev,
|
||||
return false;
|
||||
}
|
||||
|
||||
data = (struct ffa_send_direct_data){ OPTEE_FFA_GET_OS_VERSION };
|
||||
data = (struct ffa_send_direct_data){
|
||||
.data0 = OPTEE_FFA_GET_OS_VERSION,
|
||||
};
|
||||
rc = msg_ops->sync_send_receive(ffa_dev, &data);
|
||||
if (rc) {
|
||||
pr_err("Unexpected error %d\n", rc);
|
||||
@@ -694,7 +698,9 @@ static bool optee_ffa_exchange_caps(struct ffa_device *ffa_dev,
|
||||
u32 *sec_caps,
|
||||
unsigned int *rpc_param_count)
|
||||
{
|
||||
struct ffa_send_direct_data data = { OPTEE_FFA_EXCHANGE_CAPABILITIES };
|
||||
struct ffa_send_direct_data data = {
|
||||
.data0 = OPTEE_FFA_EXCHANGE_CAPABILITIES,
|
||||
};
|
||||
int rc;
|
||||
|
||||
rc = ops->msg_ops->sync_send_receive(ffa_dev, &data);
|
||||
|
||||
@@ -1222,7 +1222,7 @@ out:
|
||||
|
||||
int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
struct btrfs_root *quota_root;
|
||||
struct btrfs_root *quota_root = NULL;
|
||||
struct btrfs_trans_handle *trans = NULL;
|
||||
int ret = 0;
|
||||
|
||||
@@ -1317,9 +1317,9 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(quota_root),
|
||||
quota_root->node, 0, 1);
|
||||
|
||||
btrfs_put_root(quota_root);
|
||||
|
||||
out:
|
||||
btrfs_put_root(quota_root);
|
||||
mutex_unlock(&fs_info->qgroup_ioctl_lock);
|
||||
if (ret && trans)
|
||||
btrfs_end_transaction(trans);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/statfs.h>
|
||||
#include <linux/namei.h>
|
||||
#include <trace/events/fscache.h>
|
||||
#include "internal.h"
|
||||
|
||||
/*
|
||||
@@ -312,19 +313,59 @@ static void cachefiles_withdraw_objects(struct cachefiles_cache *cache)
|
||||
}
|
||||
|
||||
/*
|
||||
* Withdraw volumes.
|
||||
* Withdraw fscache volumes.
|
||||
*/
|
||||
static void cachefiles_withdraw_fscache_volumes(struct cachefiles_cache *cache)
|
||||
{
|
||||
struct list_head *cur;
|
||||
struct cachefiles_volume *volume;
|
||||
struct fscache_volume *vcookie;
|
||||
|
||||
_enter("");
|
||||
retry:
|
||||
spin_lock(&cache->object_list_lock);
|
||||
list_for_each(cur, &cache->volumes) {
|
||||
volume = list_entry(cur, struct cachefiles_volume, cache_link);
|
||||
|
||||
if (atomic_read(&volume->vcookie->n_accesses) == 0)
|
||||
continue;
|
||||
|
||||
vcookie = fscache_try_get_volume(volume->vcookie,
|
||||
fscache_volume_get_withdraw);
|
||||
if (vcookie) {
|
||||
spin_unlock(&cache->object_list_lock);
|
||||
fscache_withdraw_volume(vcookie);
|
||||
fscache_put_volume(vcookie, fscache_volume_put_withdraw);
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
spin_unlock(&cache->object_list_lock);
|
||||
|
||||
_leave("");
|
||||
}
|
||||
|
||||
/*
|
||||
* Withdraw cachefiles volumes.
|
||||
*/
|
||||
static void cachefiles_withdraw_volumes(struct cachefiles_cache *cache)
|
||||
{
|
||||
_enter("");
|
||||
|
||||
for (;;) {
|
||||
struct fscache_volume *vcookie = NULL;
|
||||
struct cachefiles_volume *volume = NULL;
|
||||
|
||||
spin_lock(&cache->object_list_lock);
|
||||
if (!list_empty(&cache->volumes)) {
|
||||
volume = list_first_entry(&cache->volumes,
|
||||
struct cachefiles_volume, cache_link);
|
||||
vcookie = fscache_try_get_volume(volume->vcookie,
|
||||
fscache_volume_get_withdraw);
|
||||
if (!vcookie) {
|
||||
spin_unlock(&cache->object_list_lock);
|
||||
cpu_relax();
|
||||
continue;
|
||||
}
|
||||
list_del_init(&volume->cache_link);
|
||||
}
|
||||
spin_unlock(&cache->object_list_lock);
|
||||
@@ -332,6 +373,7 @@ static void cachefiles_withdraw_volumes(struct cachefiles_cache *cache)
|
||||
break;
|
||||
|
||||
cachefiles_withdraw_volume(volume);
|
||||
fscache_put_volume(vcookie, fscache_volume_put_withdraw);
|
||||
}
|
||||
|
||||
_leave("");
|
||||
@@ -371,6 +413,7 @@ void cachefiles_withdraw_cache(struct cachefiles_cache *cache)
|
||||
pr_info("File cache on %s unregistering\n", fscache->name);
|
||||
|
||||
fscache_withdraw_cache(fscache);
|
||||
cachefiles_withdraw_fscache_volumes(cache);
|
||||
|
||||
/* we now have to destroy all the active objects pertaining to this
|
||||
* cache - which we do by passing them off to thread pool to be
|
||||
|
||||
@@ -97,12 +97,12 @@ static loff_t cachefiles_ondemand_fd_llseek(struct file *filp, loff_t pos,
|
||||
}
|
||||
|
||||
static long cachefiles_ondemand_fd_ioctl(struct file *filp, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
unsigned long id)
|
||||
{
|
||||
struct cachefiles_object *object = filp->private_data;
|
||||
struct cachefiles_cache *cache = object->volume->cache;
|
||||
struct cachefiles_req *req;
|
||||
unsigned long id;
|
||||
XA_STATE(xas, &cache->reqs, id);
|
||||
|
||||
if (ioctl != CACHEFILES_IOC_READ_COMPLETE)
|
||||
return -EINVAL;
|
||||
@@ -110,10 +110,15 @@ static long cachefiles_ondemand_fd_ioctl(struct file *filp, unsigned int ioctl,
|
||||
if (!test_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
id = arg;
|
||||
req = xa_erase(&cache->reqs, id);
|
||||
if (!req)
|
||||
xa_lock(&cache->reqs);
|
||||
req = xas_load(&xas);
|
||||
if (!req || req->msg.opcode != CACHEFILES_OP_READ ||
|
||||
req->object != object) {
|
||||
xa_unlock(&cache->reqs);
|
||||
return -EINVAL;
|
||||
}
|
||||
xas_store(&xas, NULL);
|
||||
xa_unlock(&cache->reqs);
|
||||
|
||||
trace_cachefiles_ondemand_cread(object, id);
|
||||
complete(&req->done);
|
||||
@@ -142,6 +147,7 @@ int cachefiles_ondemand_copen(struct cachefiles_cache *cache, char *args)
|
||||
unsigned long id;
|
||||
long size;
|
||||
int ret;
|
||||
XA_STATE(xas, &cache->reqs, 0);
|
||||
|
||||
if (!test_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags))
|
||||
return -EOPNOTSUPP;
|
||||
@@ -165,10 +171,18 @@ int cachefiles_ondemand_copen(struct cachefiles_cache *cache, char *args)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
req = xa_erase(&cache->reqs, id);
|
||||
if (!req)
|
||||
xa_lock(&cache->reqs);
|
||||
xas.xa_index = id;
|
||||
req = xas_load(&xas);
|
||||
if (!req || req->msg.opcode != CACHEFILES_OP_OPEN ||
|
||||
!req->object->ondemand->ondemand_id) {
|
||||
xa_unlock(&cache->reqs);
|
||||
return -EINVAL;
|
||||
}
|
||||
xas_store(&xas, NULL);
|
||||
xa_unlock(&cache->reqs);
|
||||
|
||||
info = req->object->ondemand;
|
||||
/* fail OPEN request if copen format is invalid */
|
||||
ret = kstrtol(psize, 0, &size);
|
||||
if (ret) {
|
||||
@@ -188,7 +202,6 @@ int cachefiles_ondemand_copen(struct cachefiles_cache *cache, char *args)
|
||||
goto out;
|
||||
}
|
||||
|
||||
info = req->object->ondemand;
|
||||
spin_lock(&info->lock);
|
||||
/*
|
||||
* The anonymous fd was closed before copen ? Fail the request.
|
||||
@@ -228,6 +241,11 @@ int cachefiles_ondemand_copen(struct cachefiles_cache *cache, char *args)
|
||||
wake_up_all(&cache->daemon_pollwq);
|
||||
|
||||
out:
|
||||
spin_lock(&info->lock);
|
||||
/* Need to set object close to avoid reopen status continuing */
|
||||
if (info->ondemand_id == CACHEFILES_ONDEMAND_ID_CLOSED)
|
||||
cachefiles_ondemand_set_object_close(req->object);
|
||||
spin_unlock(&info->lock);
|
||||
complete(&req->done);
|
||||
return ret;
|
||||
}
|
||||
@@ -362,6 +380,20 @@ static struct cachefiles_req *cachefiles_ondemand_select_req(struct xa_state *xa
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline bool cachefiles_ondemand_finish_req(struct cachefiles_req *req,
|
||||
struct xa_state *xas, int err)
|
||||
{
|
||||
if (unlikely(!xas || !req))
|
||||
return false;
|
||||
|
||||
if (xa_cmpxchg(xas->xa, xas->xa_index, req, NULL, 0) != req)
|
||||
return false;
|
||||
|
||||
req->error = err;
|
||||
complete(&req->done);
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
|
||||
char __user *_buffer, size_t buflen)
|
||||
{
|
||||
@@ -425,16 +457,8 @@ ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
|
||||
out:
|
||||
cachefiles_put_object(req->object, cachefiles_obj_put_read_req);
|
||||
/* Remove error request and CLOSE request has no reply */
|
||||
if (ret || msg->opcode == CACHEFILES_OP_CLOSE) {
|
||||
xas_reset(&xas);
|
||||
xas_lock(&xas);
|
||||
if (xas_load(&xas) == req) {
|
||||
req->error = ret;
|
||||
complete(&req->done);
|
||||
xas_store(&xas, NULL);
|
||||
}
|
||||
xas_unlock(&xas);
|
||||
}
|
||||
if (ret || msg->opcode == CACHEFILES_OP_CLOSE)
|
||||
cachefiles_ondemand_finish_req(req, &xas, ret);
|
||||
cachefiles_req_put(req);
|
||||
return ret ? ret : n;
|
||||
}
|
||||
@@ -539,8 +563,18 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object,
|
||||
goto out;
|
||||
|
||||
wake_up_all(&cache->daemon_pollwq);
|
||||
wait_for_completion(&req->done);
|
||||
ret = req->error;
|
||||
wait:
|
||||
ret = wait_for_completion_killable(&req->done);
|
||||
if (!ret) {
|
||||
ret = req->error;
|
||||
} else {
|
||||
ret = -EINTR;
|
||||
if (!cachefiles_ondemand_finish_req(req, &xas, ret)) {
|
||||
/* Someone will complete it soon. */
|
||||
cpu_relax();
|
||||
goto wait;
|
||||
}
|
||||
}
|
||||
cachefiles_req_put(req);
|
||||
return ret;
|
||||
out:
|
||||
|
||||
@@ -133,7 +133,6 @@ void cachefiles_free_volume(struct fscache_volume *vcookie)
|
||||
|
||||
void cachefiles_withdraw_volume(struct cachefiles_volume *volume)
|
||||
{
|
||||
fscache_withdraw_volume(volume->vcookie);
|
||||
cachefiles_set_volume_xattr(volume);
|
||||
__cachefiles_free_volume(volume);
|
||||
}
|
||||
|
||||
31
fs/dcache.c
31
fs/dcache.c
@@ -3209,28 +3209,25 @@ EXPORT_SYMBOL(d_splice_alias);
|
||||
|
||||
bool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
|
||||
{
|
||||
bool result;
|
||||
bool subdir;
|
||||
unsigned seq;
|
||||
|
||||
if (new_dentry == old_dentry)
|
||||
return true;
|
||||
|
||||
do {
|
||||
/* for restarting inner loop in case of seq retry */
|
||||
seq = read_seqbegin(&rename_lock);
|
||||
/*
|
||||
* Need rcu_readlock to protect against the d_parent trashing
|
||||
* due to d_move
|
||||
*/
|
||||
rcu_read_lock();
|
||||
if (d_ancestor(old_dentry, new_dentry))
|
||||
result = true;
|
||||
else
|
||||
result = false;
|
||||
rcu_read_unlock();
|
||||
} while (read_seqretry(&rename_lock, seq));
|
||||
|
||||
return result;
|
||||
/* Access d_parent under rcu as d_move() may change it. */
|
||||
rcu_read_lock();
|
||||
seq = read_seqbegin(&rename_lock);
|
||||
subdir = d_ancestor(old_dentry, new_dentry);
|
||||
/* Try lockless once... */
|
||||
if (read_seqretry(&rename_lock, seq)) {
|
||||
/* ...else acquire lock for progress even on deep chains. */
|
||||
read_seqlock_excl(&rename_lock);
|
||||
subdir = d_ancestor(old_dentry, new_dentry);
|
||||
read_sequnlock_excl(&rename_lock);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return subdir;
|
||||
}
|
||||
EXPORT_SYMBOL(is_subdir);
|
||||
|
||||
|
||||
@@ -756,6 +756,8 @@ int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
|
||||
|
||||
err = z_erofs_do_map_blocks(inode, map, flags);
|
||||
out:
|
||||
if (err)
|
||||
map->m_llen = 0;
|
||||
trace_z_erofs_map_blocks_iter_exit(inode, map, flags, err);
|
||||
|
||||
/* aggressively BUG_ON iff CONFIG_EROFS_FS_DEBUG is on */
|
||||
|
||||
@@ -481,12 +481,12 @@ struct files_struct init_files = {
|
||||
|
||||
static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start)
|
||||
{
|
||||
unsigned int maxfd = fdt->max_fds;
|
||||
unsigned int maxfd = fdt->max_fds; /* always multiple of BITS_PER_LONG */
|
||||
unsigned int maxbit = maxfd / BITS_PER_LONG;
|
||||
unsigned int bitbit = start / BITS_PER_LONG;
|
||||
|
||||
bitbit = find_next_zero_bit(fdt->full_fds_bits, maxbit, bitbit) * BITS_PER_LONG;
|
||||
if (bitbit > maxfd)
|
||||
if (bitbit >= maxfd)
|
||||
return maxfd;
|
||||
if (bitbit > start)
|
||||
start = bitbit;
|
||||
|
||||
@@ -145,8 +145,6 @@ extern const struct seq_operations fscache_volumes_seq_ops;
|
||||
|
||||
struct fscache_volume *fscache_get_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where);
|
||||
void fscache_put_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where);
|
||||
bool fscache_begin_volume_access(struct fscache_volume *volume,
|
||||
struct fscache_cookie *cookie,
|
||||
enum fscache_access_trace why);
|
||||
|
||||
@@ -27,6 +27,19 @@ struct fscache_volume *fscache_get_volume(struct fscache_volume *volume,
|
||||
return volume;
|
||||
}
|
||||
|
||||
struct fscache_volume *fscache_try_get_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where)
|
||||
{
|
||||
int ref;
|
||||
|
||||
if (!__refcount_inc_not_zero(&volume->ref, &ref))
|
||||
return NULL;
|
||||
|
||||
trace_fscache_volume(volume->debug_id, ref + 1, where);
|
||||
return volume;
|
||||
}
|
||||
EXPORT_SYMBOL(fscache_try_get_volume);
|
||||
|
||||
static void fscache_see_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where)
|
||||
{
|
||||
@@ -420,6 +433,7 @@ void fscache_put_volume(struct fscache_volume *volume,
|
||||
fscache_free_volume(volume);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(fscache_put_volume);
|
||||
|
||||
/*
|
||||
* Relinquish a volume representation cookie.
|
||||
|
||||
@@ -699,7 +699,7 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size)
|
||||
return err;
|
||||
}
|
||||
|
||||
strbuf = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
|
||||
strbuf = kzalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
|
||||
XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
|
||||
if (!strbuf) {
|
||||
res = -ENOMEM;
|
||||
|
||||
@@ -97,6 +97,7 @@ static void iomap_adjust_read_range(struct inode *inode, struct folio *folio,
|
||||
unsigned block_size = (1 << block_bits);
|
||||
size_t poff = offset_in_folio(folio, *pos);
|
||||
size_t plen = min_t(loff_t, folio_size(folio) - poff, length);
|
||||
size_t orig_plen = plen;
|
||||
unsigned first = poff >> block_bits;
|
||||
unsigned last = (poff + plen - 1) >> block_bits;
|
||||
|
||||
@@ -133,7 +134,7 @@ static void iomap_adjust_read_range(struct inode *inode, struct folio *folio,
|
||||
* handle both halves separately so that we properly zero data in the
|
||||
* page cache for blocks that are entirely outside of i_size.
|
||||
*/
|
||||
if (orig_pos <= isize && orig_pos + length > isize) {
|
||||
if (orig_pos <= isize && orig_pos + orig_plen > isize) {
|
||||
unsigned end = offset_in_folio(folio, isize - 1) >> block_bits;
|
||||
|
||||
if (first <= end && last > end)
|
||||
|
||||
@@ -2394,8 +2394,9 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
|
||||
error = do_lock_file_wait(filp, cmd, file_lock);
|
||||
|
||||
/*
|
||||
* Attempt to detect a close/fcntl race and recover by releasing the
|
||||
* lock that was just acquired. There is no need to do that when we're
|
||||
* Detect close/fcntl races and recover by zapping all POSIX locks
|
||||
* associated with this file and our files_struct, just like on
|
||||
* filp_flush(). There is no need to do that when we're
|
||||
* unlocking though, or for OFD locks.
|
||||
*/
|
||||
if (!error && file_lock->fl_type != F_UNLCK &&
|
||||
@@ -2410,9 +2411,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
|
||||
f = files_lookup_fd_locked(files, fd);
|
||||
spin_unlock(&files->file_lock);
|
||||
if (f != filp) {
|
||||
file_lock->fl_type = F_UNLCK;
|
||||
error = do_lock_file_wait(filp, cmd, file_lock);
|
||||
WARN_ON_ONCE(error);
|
||||
locks_remove_posix(filp, files);
|
||||
error = -EBADF;
|
||||
}
|
||||
}
|
||||
|
||||
27
fs/nfs/dir.c
27
fs/nfs/dir.c
@@ -1615,7 +1615,16 @@ nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry,
|
||||
switch (error) {
|
||||
case 1:
|
||||
break;
|
||||
case 0:
|
||||
case -ETIMEDOUT:
|
||||
if (inode && (IS_ROOT(dentry) ||
|
||||
NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL))
|
||||
error = 1;
|
||||
break;
|
||||
case -ESTALE:
|
||||
case -ENOENT:
|
||||
error = 0;
|
||||
fallthrough;
|
||||
default:
|
||||
/*
|
||||
* We can't d_drop the root of a disconnected tree:
|
||||
* its d_hash is on the s_anon list and d_drop() would hide
|
||||
@@ -1670,18 +1679,8 @@ static int nfs_lookup_revalidate_dentry(struct inode *dir,
|
||||
|
||||
dir_verifier = nfs_save_change_attribute(dir);
|
||||
ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
|
||||
if (ret < 0) {
|
||||
switch (ret) {
|
||||
case -ESTALE:
|
||||
case -ENOENT:
|
||||
ret = 0;
|
||||
break;
|
||||
case -ETIMEDOUT:
|
||||
if (NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL)
|
||||
ret = 1;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Request help from readdirplus */
|
||||
nfs_lookup_advise_force_readdirplus(dir, flags);
|
||||
@@ -1725,7 +1724,7 @@ nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct inode *inode;
|
||||
int error;
|
||||
int error = 0;
|
||||
|
||||
nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
|
||||
inode = d_inode(dentry);
|
||||
@@ -1770,7 +1769,7 @@ out_valid:
|
||||
out_bad:
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
return nfs_lookup_revalidate_done(dir, dentry, inode, 0);
|
||||
return nfs_lookup_revalidate_done(dir, dentry, inode, error);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -6274,6 +6274,7 @@ nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen)
|
||||
if (status == 0)
|
||||
nfs_setsecurity(inode, fattr);
|
||||
|
||||
nfs_free_fattr(fattr);
|
||||
return status;
|
||||
}
|
||||
#endif /* CONFIG_NFS_V4_SECURITY_LABEL */
|
||||
|
||||
@@ -41,7 +41,7 @@ static int nfs_symlink_filler(struct file *file, struct folio *folio)
|
||||
error:
|
||||
folio_set_error(folio);
|
||||
folio_unlock(folio);
|
||||
return -EIO;
|
||||
return error;
|
||||
}
|
||||
|
||||
static const char *nfs_get_link(struct dentry *dentry,
|
||||
|
||||
@@ -1397,7 +1397,7 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
|
||||
target_tcon = tlink_tcon(smb_file_target->tlink);
|
||||
|
||||
if (src_tcon->ses != target_tcon->ses) {
|
||||
cifs_dbg(VFS, "source and target of copy not on same server\n");
|
||||
cifs_dbg(FYI, "source and target of copy not on same server\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -905,6 +905,40 @@ struct smb2_query_directory_rsp {
|
||||
__u8 Buffer[];
|
||||
} __packed;
|
||||
|
||||
/* DeviceType Flags */
|
||||
#define FILE_DEVICE_CD_ROM 0x00000002
|
||||
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
|
||||
#define FILE_DEVICE_DFS 0x00000006
|
||||
#define FILE_DEVICE_DISK 0x00000007
|
||||
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
|
||||
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
|
||||
#define FILE_DEVICE_NAMED_PIPE 0x00000011
|
||||
#define FILE_DEVICE_NETWORK 0x00000012
|
||||
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
|
||||
#define FILE_DEVICE_NULL 0x00000015
|
||||
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
|
||||
#define FILE_DEVICE_PRINTER 0x00000018
|
||||
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
|
||||
#define FILE_DEVICE_STREAMS 0x0000001e
|
||||
#define FILE_DEVICE_TAPE 0x0000001f
|
||||
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
|
||||
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
|
||||
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
|
||||
|
||||
/* Device Characteristics */
|
||||
#define FILE_REMOVABLE_MEDIA 0x00000001
|
||||
#define FILE_READ_ONLY_DEVICE 0x00000002
|
||||
#define FILE_FLOPPY_DISKETTE 0x00000004
|
||||
#define FILE_WRITE_ONCE_MEDIA 0x00000008
|
||||
#define FILE_REMOTE_DEVICE 0x00000010
|
||||
#define FILE_DEVICE_IS_MOUNTED 0x00000020
|
||||
#define FILE_VIRTUAL_VOLUME 0x00000040
|
||||
#define FILE_DEVICE_SECURE_OPEN 0x00000100
|
||||
#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
|
||||
#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
|
||||
#define FILE_PORTABLE_DEVICE 0x00004000
|
||||
#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
|
||||
|
||||
/*
|
||||
* Maximum number of iovs we need for a set-info request.
|
||||
* The largest one is rename/hardlink
|
||||
|
||||
@@ -5048,8 +5048,13 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
|
||||
|
||||
info = (struct filesystem_device_info *)rsp->Buffer;
|
||||
|
||||
info->DeviceType = cpu_to_le32(stfs.f_type);
|
||||
info->DeviceCharacteristics = cpu_to_le32(0x00000020);
|
||||
info->DeviceType = cpu_to_le32(FILE_DEVICE_DISK);
|
||||
info->DeviceCharacteristics =
|
||||
cpu_to_le32(FILE_DEVICE_IS_MOUNTED);
|
||||
if (!test_tree_conn_flag(work->tcon,
|
||||
KSMBD_TREE_CONN_FLAG_WRITABLE))
|
||||
info->DeviceCharacteristics |=
|
||||
cpu_to_le32(FILE_READ_ONLY_DEVICE);
|
||||
rsp->OutputBufferLength = cpu_to_le32(8);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
enum fscache_cache_trace;
|
||||
enum fscache_cookie_trace;
|
||||
enum fscache_access_trace;
|
||||
enum fscache_volume_trace;
|
||||
|
||||
enum fscache_cache_state {
|
||||
FSCACHE_CACHE_IS_NOT_PRESENT, /* No cache is present for this name */
|
||||
@@ -97,6 +98,11 @@ extern void fscache_withdraw_cookie(struct fscache_cookie *cookie);
|
||||
|
||||
extern void fscache_io_error(struct fscache_cache *cache);
|
||||
|
||||
extern struct fscache_volume *
|
||||
fscache_try_get_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where);
|
||||
extern void fscache_put_volume(struct fscache_volume *volume,
|
||||
enum fscache_volume_trace where);
|
||||
extern void fscache_end_volume_access(struct fscache_volume *volume,
|
||||
struct fscache_cookie *cookie,
|
||||
enum fscache_access_trace why);
|
||||
|
||||
@@ -2,54 +2,93 @@
|
||||
#ifndef _LINUX_MINMAX_H
|
||||
#define _LINUX_MINMAX_H
|
||||
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/const.h>
|
||||
|
||||
/*
|
||||
* min()/max()/clamp() macros must accomplish three things:
|
||||
*
|
||||
* - avoid multiple evaluations of the arguments (so side-effects like
|
||||
* - Avoid multiple evaluations of the arguments (so side-effects like
|
||||
* "x++" happen only once) when non-constant.
|
||||
* - perform strict type-checking (to generate warnings instead of
|
||||
* nasty runtime surprises). See the "unnecessary" pointer comparison
|
||||
* in __typecheck().
|
||||
* - retain result as a constant expressions when called with only
|
||||
* - Retain result as a constant expressions when called with only
|
||||
* constant expressions (to avoid tripping VLA warnings in stack
|
||||
* allocation usage).
|
||||
* - Perform signed v unsigned type-checking (to generate compile
|
||||
* errors instead of nasty runtime surprises).
|
||||
* - Unsigned char/short are always promoted to signed int and can be
|
||||
* compared against signed or unsigned arguments.
|
||||
* - Unsigned arguments can be compared against non-negative signed constants.
|
||||
* - Comparison of a signed argument against an unsigned constant fails
|
||||
* even if the constant is below __INT_MAX__ and could be cast to int.
|
||||
*/
|
||||
#define __typecheck(x, y) \
|
||||
(!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
|
||||
|
||||
#define __no_side_effects(x, y) \
|
||||
(__is_constexpr(x) && __is_constexpr(y))
|
||||
/* is_signed_type() isn't a constexpr for pointer types */
|
||||
#define __is_signed(x) \
|
||||
__builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
|
||||
is_signed_type(typeof(x)), 0)
|
||||
|
||||
#define __safe_cmp(x, y) \
|
||||
(__typecheck(x, y) && __no_side_effects(x, y))
|
||||
/* True for a non-negative signed int constant */
|
||||
#define __is_noneg_int(x) \
|
||||
(__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
|
||||
|
||||
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
|
||||
#define __types_ok(x, y) \
|
||||
(__is_signed(x) == __is_signed(y) || \
|
||||
__is_signed((x) + 0) == __is_signed((y) + 0) || \
|
||||
__is_noneg_int(x) || __is_noneg_int(y))
|
||||
|
||||
#define __cmp_once(x, y, unique_x, unique_y, op) ({ \
|
||||
#define __cmp_op_min <
|
||||
#define __cmp_op_max >
|
||||
|
||||
#define __cmp(op, x, y) ((x) __cmp_op_##op (y) ? (x) : (y))
|
||||
|
||||
#define __cmp_once(op, x, y, unique_x, unique_y) ({ \
|
||||
typeof(x) unique_x = (x); \
|
||||
typeof(y) unique_y = (y); \
|
||||
__cmp(unique_x, unique_y, op); })
|
||||
static_assert(__types_ok(x, y), \
|
||||
#op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
|
||||
__cmp(op, unique_x, unique_y); })
|
||||
|
||||
#define __careful_cmp(x, y, op) \
|
||||
__builtin_choose_expr(__safe_cmp(x, y), \
|
||||
__cmp(x, y, op), \
|
||||
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
|
||||
#define __careful_cmp(op, x, y) \
|
||||
__builtin_choose_expr(__is_constexpr((x) - (y)), \
|
||||
__cmp(op, x, y), \
|
||||
__cmp_once(op, x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y)))
|
||||
|
||||
#define __clamp(val, lo, hi) \
|
||||
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
|
||||
|
||||
#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
|
||||
typeof(val) unique_val = (val); \
|
||||
typeof(lo) unique_lo = (lo); \
|
||||
typeof(hi) unique_hi = (hi); \
|
||||
static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
|
||||
(lo) <= (hi), true), \
|
||||
"clamp() low limit " #lo " greater than high limit " #hi); \
|
||||
static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
|
||||
static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
|
||||
__clamp(unique_val, unique_lo, unique_hi); })
|
||||
|
||||
#define __careful_clamp(val, lo, hi) ({ \
|
||||
__builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
|
||||
__clamp(val, lo, hi), \
|
||||
__clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
|
||||
__UNIQUE_ID(__lo), __UNIQUE_ID(__hi))); })
|
||||
|
||||
/**
|
||||
* min - return minimum of two values of the same or compatible types
|
||||
* @x: first value
|
||||
* @y: second value
|
||||
*/
|
||||
#define min(x, y) __careful_cmp(x, y, <)
|
||||
#define min(x, y) __careful_cmp(min, x, y)
|
||||
|
||||
/**
|
||||
* max - return maximum of two values of the same or compatible types
|
||||
* @x: first value
|
||||
* @y: second value
|
||||
*/
|
||||
#define max(x, y) __careful_cmp(x, y, >)
|
||||
#define max(x, y) __careful_cmp(max, x, y)
|
||||
|
||||
/**
|
||||
* umin - return minimum of two non-negative values
|
||||
@@ -58,7 +97,7 @@
|
||||
* @y: second value
|
||||
*/
|
||||
#define umin(x, y) \
|
||||
__careful_cmp((x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull, <)
|
||||
__careful_cmp(min, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
|
||||
|
||||
/**
|
||||
* umax - return maximum of two non-negative values
|
||||
@@ -66,7 +105,7 @@
|
||||
* @y: second value
|
||||
*/
|
||||
#define umax(x, y) \
|
||||
__careful_cmp((x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull, >)
|
||||
__careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
|
||||
|
||||
/**
|
||||
* min3 - return minimum of three values
|
||||
@@ -103,7 +142,7 @@
|
||||
* This macro does strict typechecking of @lo/@hi to make sure they are of the
|
||||
* same type as @val. See the unnecessary pointer comparisons.
|
||||
*/
|
||||
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
||||
#define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
|
||||
|
||||
/*
|
||||
* ..and if you can't take the strict
|
||||
@@ -118,7 +157,7 @@
|
||||
* @x: first value
|
||||
* @y: second value
|
||||
*/
|
||||
#define min_t(type, x, y) __careful_cmp((type)(x), (type)(y), <)
|
||||
#define min_t(type, x, y) __careful_cmp(min, (type)(x), (type)(y))
|
||||
|
||||
/**
|
||||
* max_t - return maximum of two values, using the specified type
|
||||
@@ -126,7 +165,7 @@
|
||||
* @x: first value
|
||||
* @y: second value
|
||||
*/
|
||||
#define max_t(type, x, y) __careful_cmp((type)(x), (type)(y), >)
|
||||
#define max_t(type, x, y) __careful_cmp(max, (type)(x), (type)(y))
|
||||
|
||||
/**
|
||||
* clamp_t - return a value clamped to a given range using a given type
|
||||
@@ -138,7 +177,7 @@
|
||||
* This macro does no typechecking and uses temporary variables of type
|
||||
* @type to make all the comparisons.
|
||||
*/
|
||||
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
|
||||
#define clamp_t(type, val, lo, hi) __careful_clamp((type)(val), (type)(lo), (type)(hi))
|
||||
|
||||
/**
|
||||
* clamp_val - return a value clamped to a given range using val's type
|
||||
|
||||
@@ -35,6 +35,8 @@ int __hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
int __hci_cmd_sync_status_sk(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
const void *param, u8 event, u32 timeout,
|
||||
struct sock *sk);
|
||||
int hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
const void *param, u32 timeout);
|
||||
|
||||
void hci_cmd_sync_init(struct hci_dev *hdev);
|
||||
void hci_cmd_sync_clear(struct hci_dev *hdev);
|
||||
|
||||
@@ -36,6 +36,7 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream
|
||||
int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
|
||||
struct dma_chan *chan);
|
||||
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
|
||||
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream);
|
||||
|
||||
int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
||||
dma_filter_fn filter_fn, void *filter_data);
|
||||
|
||||
@@ -35,12 +35,14 @@ enum fscache_volume_trace {
|
||||
fscache_volume_get_cookie,
|
||||
fscache_volume_get_create_work,
|
||||
fscache_volume_get_hash_collision,
|
||||
fscache_volume_get_withdraw,
|
||||
fscache_volume_free,
|
||||
fscache_volume_new_acquire,
|
||||
fscache_volume_put_cookie,
|
||||
fscache_volume_put_create_work,
|
||||
fscache_volume_put_hash_collision,
|
||||
fscache_volume_put_relinquish,
|
||||
fscache_volume_put_withdraw,
|
||||
fscache_volume_see_create_work,
|
||||
fscache_volume_see_hash_wake,
|
||||
fscache_volume_wait_create_work,
|
||||
@@ -120,12 +122,14 @@ enum fscache_access_trace {
|
||||
EM(fscache_volume_get_cookie, "GET cook ") \
|
||||
EM(fscache_volume_get_create_work, "GET creat") \
|
||||
EM(fscache_volume_get_hash_collision, "GET hcoll") \
|
||||
EM(fscache_volume_get_withdraw, "GET withd") \
|
||||
EM(fscache_volume_free, "FREE ") \
|
||||
EM(fscache_volume_new_acquire, "NEW acq ") \
|
||||
EM(fscache_volume_put_cookie, "PUT cook ") \
|
||||
EM(fscache_volume_put_create_work, "PUT creat") \
|
||||
EM(fscache_volume_put_hash_collision, "PUT hcoll") \
|
||||
EM(fscache_volume_put_relinquish, "PUT relnq") \
|
||||
EM(fscache_volume_put_withdraw, "PUT withd") \
|
||||
EM(fscache_volume_see_create_work, "SEE creat") \
|
||||
EM(fscache_volume_see_hash_wake, "SEE hwake") \
|
||||
E_(fscache_volume_wait_create_work, "WAIT crea")
|
||||
|
||||
@@ -975,14 +975,31 @@ static void damon_merge_regions_of(struct damon_target *t, unsigned int thres,
|
||||
* access frequencies are similar. This is for minimizing the monitoring
|
||||
* overhead under the dynamically changeable access pattern. If a merge was
|
||||
* unnecessarily made, later 'kdamond_split_regions()' will revert it.
|
||||
*
|
||||
* The total number of regions could be higher than the user-defined limit,
|
||||
* max_nr_regions for some cases. For example, the user can update
|
||||
* max_nr_regions to a number that lower than the current number of regions
|
||||
* while DAMON is running. For such a case, repeat merging until the limit is
|
||||
* met while increasing @threshold up to possible maximum level.
|
||||
*/
|
||||
static void kdamond_merge_regions(struct damon_ctx *c, unsigned int threshold,
|
||||
unsigned long sz_limit)
|
||||
{
|
||||
struct damon_target *t;
|
||||
unsigned int nr_regions;
|
||||
unsigned int max_thres;
|
||||
|
||||
damon_for_each_target(t, c)
|
||||
damon_merge_regions_of(t, threshold, sz_limit);
|
||||
max_thres = c->attrs.aggr_interval /
|
||||
(c->attrs.sample_interval ? c->attrs.sample_interval : 1);
|
||||
do {
|
||||
nr_regions = 0;
|
||||
damon_for_each_target(t, c) {
|
||||
damon_merge_regions_of(t, threshold, sz_limit);
|
||||
nr_regions += damon_nr_regions(t);
|
||||
}
|
||||
threshold = max(1, threshold * 2);
|
||||
} while (nr_regions > c->attrs.max_nr_regions &&
|
||||
threshold / 2 < max_thres);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -63,50 +63,6 @@ DEFINE_MUTEX(hci_cb_list_lock);
|
||||
/* HCI ID Numbering */
|
||||
static DEFINE_IDA(hci_index_ida);
|
||||
|
||||
static int hci_scan_req(struct hci_request *req, unsigned long opt)
|
||||
{
|
||||
__u8 scan = opt;
|
||||
|
||||
BT_DBG("%s %x", req->hdev->name, scan);
|
||||
|
||||
/* Inquiry and Page scans */
|
||||
hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hci_auth_req(struct hci_request *req, unsigned long opt)
|
||||
{
|
||||
__u8 auth = opt;
|
||||
|
||||
BT_DBG("%s %x", req->hdev->name, auth);
|
||||
|
||||
/* Authentication */
|
||||
hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hci_encrypt_req(struct hci_request *req, unsigned long opt)
|
||||
{
|
||||
__u8 encrypt = opt;
|
||||
|
||||
BT_DBG("%s %x", req->hdev->name, encrypt);
|
||||
|
||||
/* Encryption */
|
||||
hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hci_linkpol_req(struct hci_request *req, unsigned long opt)
|
||||
{
|
||||
__le16 policy = cpu_to_le16(opt);
|
||||
|
||||
BT_DBG("%s %x", req->hdev->name, policy);
|
||||
|
||||
/* Default link policy */
|
||||
hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get HCI device by index.
|
||||
* Device is held on return. */
|
||||
struct hci_dev *hci_dev_get(int index)
|
||||
@@ -733,6 +689,7 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
|
||||
{
|
||||
struct hci_dev *hdev;
|
||||
struct hci_dev_req dr;
|
||||
__le16 policy;
|
||||
int err = 0;
|
||||
|
||||
if (copy_from_user(&dr, arg, sizeof(dr)))
|
||||
@@ -764,8 +721,8 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
|
||||
|
||||
switch (cmd) {
|
||||
case HCISETAUTH:
|
||||
err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
|
||||
HCI_INIT_TIMEOUT, NULL);
|
||||
err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_AUTH_ENABLE,
|
||||
1, &dr.dev_opt, HCI_CMD_TIMEOUT);
|
||||
break;
|
||||
|
||||
case HCISETENCRYPT:
|
||||
@@ -776,19 +733,23 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
|
||||
|
||||
if (!test_bit(HCI_AUTH, &hdev->flags)) {
|
||||
/* Auth must be enabled first */
|
||||
err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
|
||||
HCI_INIT_TIMEOUT, NULL);
|
||||
err = __hci_cmd_sync_status(hdev,
|
||||
HCI_OP_WRITE_AUTH_ENABLE,
|
||||
1, &dr.dev_opt,
|
||||
HCI_CMD_TIMEOUT);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
|
||||
HCI_INIT_TIMEOUT, NULL);
|
||||
err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_ENCRYPT_MODE,
|
||||
1, &dr.dev_opt,
|
||||
HCI_CMD_TIMEOUT);
|
||||
break;
|
||||
|
||||
case HCISETSCAN:
|
||||
err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
|
||||
HCI_INIT_TIMEOUT, NULL);
|
||||
err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_SCAN_ENABLE,
|
||||
1, &dr.dev_opt,
|
||||
HCI_CMD_TIMEOUT);
|
||||
|
||||
/* Ensure that the connectable and discoverable states
|
||||
* get correctly modified as this was a non-mgmt change.
|
||||
@@ -798,8 +759,11 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
|
||||
break;
|
||||
|
||||
case HCISETLINKPOL:
|
||||
err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
|
||||
HCI_INIT_TIMEOUT, NULL);
|
||||
policy = cpu_to_le16(dr.dev_opt);
|
||||
|
||||
err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_DEF_LINK_POLICY,
|
||||
2, &policy,
|
||||
HCI_CMD_TIMEOUT);
|
||||
break;
|
||||
|
||||
case HCISETLINKMODE:
|
||||
@@ -2724,7 +2688,11 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
||||
list_del(&hdev->list);
|
||||
write_unlock(&hci_dev_list_lock);
|
||||
|
||||
cancel_work_sync(&hdev->rx_work);
|
||||
cancel_work_sync(&hdev->cmd_work);
|
||||
cancel_work_sync(&hdev->tx_work);
|
||||
cancel_work_sync(&hdev->power_on);
|
||||
cancel_work_sync(&hdev->error_reset);
|
||||
|
||||
hci_cmd_sync_clear(hdev);
|
||||
|
||||
|
||||
@@ -275,6 +275,19 @@ int __hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
}
|
||||
EXPORT_SYMBOL(__hci_cmd_sync_status);
|
||||
|
||||
int hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
const void *param, u32 timeout)
|
||||
{
|
||||
int err;
|
||||
|
||||
hci_req_sync_lock(hdev);
|
||||
err = __hci_cmd_sync_status(hdev, opcode, plen, param, timeout);
|
||||
hci_req_sync_unlock(hdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(hci_cmd_sync_status);
|
||||
|
||||
static void hci_cmd_sync_work(struct work_struct *work)
|
||||
{
|
||||
struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work);
|
||||
|
||||
@@ -7756,6 +7756,8 @@ static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
|
||||
|
||||
BT_DBG("chan %p, len %d", chan, skb->len);
|
||||
|
||||
l2cap_chan_lock(chan);
|
||||
|
||||
if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
|
||||
goto drop;
|
||||
|
||||
@@ -7772,6 +7774,7 @@ static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
|
||||
}
|
||||
|
||||
drop:
|
||||
l2cap_chan_unlock(chan);
|
||||
l2cap_chan_put(chan);
|
||||
free_skb:
|
||||
kfree_skb(skb);
|
||||
|
||||
@@ -1240,6 +1240,10 @@ static void l2cap_sock_kill(struct sock *sk)
|
||||
|
||||
BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
|
||||
|
||||
/* Sock is dead, so set chan data to NULL, avoid other task use invalid
|
||||
* sock pointer.
|
||||
*/
|
||||
l2cap_pi(sk)->chan->data = NULL;
|
||||
/* Kill poor orphan */
|
||||
|
||||
l2cap_chan_put(l2cap_pi(sk)->chan);
|
||||
@@ -1482,12 +1486,17 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
|
||||
|
||||
static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
|
||||
{
|
||||
struct sock *sk = chan->data;
|
||||
struct sock *sk;
|
||||
struct l2cap_pinfo *pi;
|
||||
int err;
|
||||
|
||||
lock_sock(sk);
|
||||
sk = chan->data;
|
||||
if (!sk)
|
||||
return -ENXIO;
|
||||
|
||||
if (l2cap_pi(sk)->rx_busy_skb) {
|
||||
pi = l2cap_pi(sk);
|
||||
lock_sock(sk);
|
||||
if (chan->mode == L2CAP_MODE_ERTM && l2cap_pi(sk)->rx_busy_skb) {
|
||||
err = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,9 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
return orig_dst->lwtstate->orig_output(net, sk, skb);
|
||||
}
|
||||
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&ilwt->dst_cache);
|
||||
local_bh_enable();
|
||||
if (unlikely(!dst)) {
|
||||
struct ipv6hdr *ip6h = ipv6_hdr(skb);
|
||||
struct flowi6 fl6;
|
||||
@@ -86,8 +88,11 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (ilwt->connected)
|
||||
if (ilwt->connected) {
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&ilwt->dst_cache, dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
}
|
||||
}
|
||||
|
||||
skb_dst_set(skb, dst);
|
||||
|
||||
@@ -212,9 +212,9 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
preempt_disable();
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&rlwt->cache);
|
||||
preempt_enable();
|
||||
local_bh_enable();
|
||||
|
||||
if (unlikely(!dst)) {
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
@@ -234,9 +234,9 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
preempt_disable();
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&rlwt->cache, dst, &fl6.saddr);
|
||||
preempt_enable();
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
@@ -268,9 +268,8 @@ static int rpl_input(struct sk_buff *skb)
|
||||
return err;
|
||||
}
|
||||
|
||||
preempt_disable();
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&rlwt->cache);
|
||||
preempt_enable();
|
||||
|
||||
skb_dst_drop(skb);
|
||||
|
||||
@@ -278,14 +277,13 @@ static int rpl_input(struct sk_buff *skb)
|
||||
ip6_route_input(skb);
|
||||
dst = skb_dst(skb);
|
||||
if (!dst->error) {
|
||||
preempt_disable();
|
||||
dst_cache_set_ip6(&rlwt->cache, dst,
|
||||
&ipv6_hdr(skb)->saddr);
|
||||
preempt_enable();
|
||||
}
|
||||
} else {
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
|
||||
@@ -2838,8 +2838,9 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate,
|
||||
sizeof(int) * NUM_NL80211_BANDS);
|
||||
|
||||
ieee80211_link_info_change_notify(sdata, &sdata->deflink,
|
||||
BSS_CHANGED_MCAST_RATE);
|
||||
if (ieee80211_sdata_running(sdata))
|
||||
ieee80211_link_info_change_notify(sdata, &sdata->deflink,
|
||||
BSS_CHANGED_MCAST_RATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1782,6 +1782,8 @@ void ieee80211_link_info_change_notify(struct ieee80211_sub_if_data *sdata,
|
||||
void ieee80211_configure_filter(struct ieee80211_local *local);
|
||||
u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
|
||||
|
||||
void ieee80211_handle_queued_frames(struct ieee80211_local *local);
|
||||
|
||||
u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local);
|
||||
int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
|
||||
u64 *cookie, gfp_t gfp);
|
||||
|
||||
@@ -300,9 +300,9 @@ u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata)
|
||||
BSS_CHANGED_ERP_SLOT;
|
||||
}
|
||||
|
||||
static void ieee80211_tasklet_handler(struct tasklet_struct *t)
|
||||
/* context: requires softirqs disabled */
|
||||
void ieee80211_handle_queued_frames(struct ieee80211_local *local)
|
||||
{
|
||||
struct ieee80211_local *local = from_tasklet(local, t, tasklet);
|
||||
struct sk_buff *skb;
|
||||
|
||||
while ((skb = skb_dequeue(&local->skb_queue)) ||
|
||||
@@ -327,6 +327,13 @@ static void ieee80211_tasklet_handler(struct tasklet_struct *t)
|
||||
}
|
||||
}
|
||||
|
||||
static void ieee80211_tasklet_handler(struct tasklet_struct *t)
|
||||
{
|
||||
struct ieee80211_local *local = from_tasklet(local, t, tasklet);
|
||||
|
||||
ieee80211_handle_queued_frames(local);
|
||||
}
|
||||
|
||||
static void ieee80211_restart_work(struct work_struct *work)
|
||||
{
|
||||
struct ieee80211_local *local =
|
||||
|
||||
@@ -1625,6 +1625,7 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
ifmsh->last_preq = jiffies;
|
||||
ifmsh->next_perr = jiffies;
|
||||
ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
|
||||
ifmsh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
|
||||
/* Allocate all mesh structures when creating the first mesh interface. */
|
||||
if (!mesh_allocated)
|
||||
ieee80211s_init();
|
||||
|
||||
@@ -733,15 +733,21 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
|
||||
local->hw_scan_ies_bufsize *= n_bands;
|
||||
}
|
||||
|
||||
local->hw_scan_req = kmalloc(
|
||||
sizeof(*local->hw_scan_req) +
|
||||
req->n_channels * sizeof(req->channels[0]) +
|
||||
local->hw_scan_ies_bufsize, GFP_KERNEL);
|
||||
local->hw_scan_req = kmalloc(struct_size(local->hw_scan_req,
|
||||
req.channels,
|
||||
req->n_channels) +
|
||||
local->hw_scan_ies_bufsize,
|
||||
GFP_KERNEL);
|
||||
if (!local->hw_scan_req)
|
||||
return -ENOMEM;
|
||||
|
||||
local->hw_scan_req->req.ssids = req->ssids;
|
||||
local->hw_scan_req->req.n_ssids = req->n_ssids;
|
||||
/* None of the channels are actually set
|
||||
* up but let UBSAN know the boundaries.
|
||||
*/
|
||||
local->hw_scan_req->req.n_channels = req->n_channels;
|
||||
|
||||
ies = (u8 *)local->hw_scan_req +
|
||||
sizeof(*local->hw_scan_req) +
|
||||
req->n_channels * sizeof(req->channels[0]);
|
||||
|
||||
@@ -2207,6 +2207,10 @@ u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
void ieee80211_stop_device(struct ieee80211_local *local)
|
||||
{
|
||||
local_bh_disable();
|
||||
ieee80211_handle_queued_frames(local);
|
||||
local_bh_enable();
|
||||
|
||||
ieee80211_led_radio(local, false);
|
||||
ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ void ieee802154_xmit_worker(struct work_struct *work)
|
||||
if (res)
|
||||
goto err_tx;
|
||||
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
DEV_STATS_INC(dev, tx_packets);
|
||||
DEV_STATS_ADD(dev, tx_bytes, skb->len);
|
||||
|
||||
ieee802154_xmit_complete(&local->hw, skb, false);
|
||||
|
||||
@@ -86,8 +86,8 @@ ieee802154_tx(struct ieee802154_local *local, struct sk_buff *skb)
|
||||
goto err_tx;
|
||||
}
|
||||
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += len;
|
||||
DEV_STATS_INC(dev, tx_packets);
|
||||
DEV_STATS_ADD(dev, tx_bytes, len);
|
||||
} else {
|
||||
local->tx_skb = skb;
|
||||
queue_work(local->workqueue, &local->tx_work);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018, 2021-2023 Intel Corporation
|
||||
* Copyright (C) 2018, 2021-2024 Intel Corporation
|
||||
*/
|
||||
#ifndef __CFG80211_RDEV_OPS
|
||||
#define __CFG80211_RDEV_OPS
|
||||
@@ -446,6 +446,10 @@ static inline int rdev_scan(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_scan_request *request)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (WARN_ON_ONCE(!request->n_ssids && request->ssids))
|
||||
return -EINVAL;
|
||||
|
||||
trace_rdev_scan(&rdev->wiphy, request);
|
||||
ret = rdev->ops->scan(&rdev->wiphy, request);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
|
||||
@@ -778,6 +778,7 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
|
||||
LIST_HEAD(coloc_ap_list);
|
||||
bool need_scan_psc = true;
|
||||
const struct ieee80211_sband_iftype_data *iftd;
|
||||
size_t size, offs_ssids, offs_6ghz_params, offs_ies;
|
||||
|
||||
rdev_req->scan_6ghz = true;
|
||||
|
||||
@@ -806,10 +807,15 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
|
||||
spin_unlock_bh(&rdev->bss_lock);
|
||||
}
|
||||
|
||||
request = kzalloc(struct_size(request, channels, n_channels) +
|
||||
sizeof(*request->scan_6ghz_params) * count +
|
||||
sizeof(*request->ssids) * rdev_req->n_ssids,
|
||||
GFP_KERNEL);
|
||||
size = struct_size(request, channels, n_channels);
|
||||
offs_ssids = size;
|
||||
size += sizeof(*request->ssids) * rdev_req->n_ssids;
|
||||
offs_6ghz_params = size;
|
||||
size += sizeof(*request->scan_6ghz_params) * count;
|
||||
offs_ies = size;
|
||||
size += rdev_req->ie_len;
|
||||
|
||||
request = kzalloc(size, GFP_KERNEL);
|
||||
if (!request) {
|
||||
cfg80211_free_coloc_ap_list(&coloc_ap_list);
|
||||
return -ENOMEM;
|
||||
@@ -817,8 +823,26 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
|
||||
|
||||
*request = *rdev_req;
|
||||
request->n_channels = 0;
|
||||
request->scan_6ghz_params =
|
||||
(void *)&request->channels[n_channels];
|
||||
request->n_6ghz_params = 0;
|
||||
if (rdev_req->n_ssids) {
|
||||
/*
|
||||
* Add the ssids from the parent scan request to the new
|
||||
* scan request, so the driver would be able to use them
|
||||
* in its probe requests to discover hidden APs on PSC
|
||||
* channels.
|
||||
*/
|
||||
request->ssids = (void *)request + offs_ssids;
|
||||
memcpy(request->ssids, rdev_req->ssids,
|
||||
sizeof(*request->ssids) * request->n_ssids);
|
||||
}
|
||||
request->scan_6ghz_params = (void *)request + offs_6ghz_params;
|
||||
|
||||
if (rdev_req->ie_len) {
|
||||
void *ie = (void *)request + offs_ies;
|
||||
|
||||
memcpy(ie, rdev_req->ie, rdev_req->ie_len);
|
||||
request->ie = ie;
|
||||
}
|
||||
|
||||
/*
|
||||
* PSC channels should not be scanned in case of direct scan with 1 SSID
|
||||
@@ -906,17 +930,8 @@ skip:
|
||||
|
||||
if (request->n_channels) {
|
||||
struct cfg80211_scan_request *old = rdev->int_scan_req;
|
||||
rdev->int_scan_req = request;
|
||||
|
||||
/*
|
||||
* Add the ssids from the parent scan request to the new scan
|
||||
* request, so the driver would be able to use them in its
|
||||
* probe requests to discover hidden APs on PSC channels.
|
||||
*/
|
||||
request->ssids = (void *)&request->channels[request->n_channels];
|
||||
request->n_ssids = rdev_req->n_ssids;
|
||||
memcpy(request->ssids, rdev_req->ssids, sizeof(*request->ssids) *
|
||||
request->n_ssids);
|
||||
rdev->int_scan_req = request;
|
||||
|
||||
/*
|
||||
* If this scan follows a previous scan, save the scan start
|
||||
@@ -2704,10 +2719,14 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
||||
wiphy = &rdev->wiphy;
|
||||
|
||||
/* Determine number of channels, needed to allocate creq */
|
||||
if (wreq && wreq->num_channels)
|
||||
if (wreq && wreq->num_channels) {
|
||||
/* Passed from userspace so should be checked */
|
||||
if (unlikely(wreq->num_channels > IW_MAX_FREQUENCIES))
|
||||
return -EINVAL;
|
||||
n_channels = wreq->num_channels;
|
||||
else
|
||||
} else {
|
||||
n_channels = ieee80211_get_num_supported_channels(wiphy);
|
||||
}
|
||||
|
||||
creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
|
||||
n_channels * sizeof(void *),
|
||||
@@ -2781,8 +2800,10 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
||||
memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
|
||||
creq->ssids[0].ssid_len = wreq->essid_len;
|
||||
}
|
||||
if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE)
|
||||
if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE) {
|
||||
creq->ssids = NULL;
|
||||
creq->n_ssids = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_NL80211_BANDS; i++)
|
||||
|
||||
@@ -440,4 +440,8 @@ static inline void debug_gimple_stmt(const_gimple s)
|
||||
#define SET_DECL_MODE(decl, mode) DECL_MODE(decl) = (mode)
|
||||
#endif
|
||||
|
||||
#if BUILDING_GCC_VERSION >= 14000
|
||||
#define last_stmt(x) last_nondebug_stmt(x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -396,35 +396,6 @@ static struct expr *expr_eliminate_yn(struct expr *e)
|
||||
return e;
|
||||
}
|
||||
|
||||
/*
|
||||
* bool FOO!=n => FOO
|
||||
*/
|
||||
struct expr *expr_trans_bool(struct expr *e)
|
||||
{
|
||||
if (!e)
|
||||
return NULL;
|
||||
switch (e->type) {
|
||||
case E_AND:
|
||||
case E_OR:
|
||||
case E_NOT:
|
||||
e->left.expr = expr_trans_bool(e->left.expr);
|
||||
e->right.expr = expr_trans_bool(e->right.expr);
|
||||
break;
|
||||
case E_UNEQUAL:
|
||||
// FOO!=n -> FOO
|
||||
if (e->left.sym->type == S_TRISTATE) {
|
||||
if (e->right.sym == &symbol_no) {
|
||||
e->type = E_SYMBOL;
|
||||
e->right.sym = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
/*
|
||||
* e1 || e2 -> ?
|
||||
*/
|
||||
|
||||
@@ -296,7 +296,6 @@ void expr_free(struct expr *e);
|
||||
void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
|
||||
int expr_eq(struct expr *e1, struct expr *e2);
|
||||
tristate expr_calc_value(struct expr *e);
|
||||
struct expr *expr_trans_bool(struct expr *e);
|
||||
struct expr *expr_eliminate_dups(struct expr *e);
|
||||
struct expr *expr_transform(struct expr *e);
|
||||
int expr_contains_symbol(struct expr *dep, struct symbol *sym);
|
||||
|
||||
@@ -1481,7 +1481,6 @@ int main(int ac, char *av[])
|
||||
|
||||
conf_parse(name);
|
||||
fixup_rootmenu(&rootmenu);
|
||||
conf_read(NULL);
|
||||
|
||||
/* Load the interface and connect signals */
|
||||
init_main_window(glade_file);
|
||||
@@ -1489,6 +1488,8 @@ int main(int ac, char *av[])
|
||||
init_left_tree();
|
||||
init_right_tree();
|
||||
|
||||
conf_read(NULL);
|
||||
|
||||
switch (view_mode) {
|
||||
case SINGLE_VIEW:
|
||||
display_tree_part();
|
||||
|
||||
@@ -380,8 +380,6 @@ void menu_finalize(struct menu *parent)
|
||||
dep = expr_transform(dep);
|
||||
dep = expr_alloc_and(expr_copy(basedep), dep);
|
||||
dep = expr_eliminate_dups(dep);
|
||||
if (menu->sym && menu->sym->type != S_TRISTATE)
|
||||
dep = expr_trans_bool(dep);
|
||||
prop->visible.expr = dep;
|
||||
|
||||
/*
|
||||
|
||||
@@ -349,6 +349,16 @@ int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
|
||||
|
||||
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||
|
||||
dmaengine_synchronize(prtd->dma_chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_sync_stop);
|
||||
|
||||
/**
|
||||
* snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
|
||||
* @substream: PCM substream
|
||||
@@ -358,6 +368,12 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
|
||||
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||
struct dma_tx_state state;
|
||||
enum dma_status status;
|
||||
|
||||
status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
|
||||
if (status == DMA_PAUSED)
|
||||
dmaengine_terminate_async(prtd->dma_chan);
|
||||
|
||||
dmaengine_synchronize(prtd->dma_chan);
|
||||
kfree(prtd);
|
||||
@@ -378,6 +394,12 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
|
||||
int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||
struct dma_tx_state state;
|
||||
enum dma_status status;
|
||||
|
||||
status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
|
||||
if (status == DMA_PAUSED)
|
||||
dmaengine_terminate_async(prtd->dma_chan);
|
||||
|
||||
dmaengine_synchronize(prtd->dma_chan);
|
||||
dma_release_channel(prtd->dma_chan);
|
||||
|
||||
@@ -1781,6 +1781,8 @@ static int snd_pcm_pre_resume(struct snd_pcm_substream *substream,
|
||||
snd_pcm_state_t state)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
if (runtime->state != SNDRV_PCM_STATE_SUSPENDED)
|
||||
return -EBADFD;
|
||||
if (!(runtime->info & SNDRV_PCM_INFO_RESUME))
|
||||
return -ENOSYS;
|
||||
runtime->trigger_master = substream;
|
||||
|
||||
@@ -583,10 +583,14 @@ static void alc_shutup_pins(struct hda_codec *codec)
|
||||
switch (codec->core.vendor_id) {
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0256:
|
||||
case 0x10ec0257:
|
||||
case 0x19e58326:
|
||||
case 0x10ec0283:
|
||||
case 0x10ec0285:
|
||||
case 0x10ec0286:
|
||||
case 0x10ec0287:
|
||||
case 0x10ec0288:
|
||||
case 0x10ec0295:
|
||||
case 0x10ec0298:
|
||||
alc_headset_mic_no_shutup(codec);
|
||||
break;
|
||||
@@ -9697,6 +9701,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
|
||||
@@ -283,6 +283,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "M5402RA"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "M5602RA"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
||||
@@ -610,6 +610,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ARCHOS 101 CESIUM"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_JD_NOT_INV |
|
||||
BYT_RT5640_DIFF_MIC |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),
|
||||
|
||||
@@ -318,6 +318,12 @@ static int dmaengine_copy_user(struct snd_soc_component *component,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dmaengine_pcm_sync_stop(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
return snd_dmaengine_pcm_sync_stop(substream);
|
||||
}
|
||||
|
||||
static const struct snd_soc_component_driver dmaengine_pcm_component = {
|
||||
.name = SND_DMAENGINE_PCM_DRV_NAME,
|
||||
.probe_order = SND_SOC_COMP_ORDER_LATE,
|
||||
@@ -327,6 +333,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component = {
|
||||
.trigger = dmaengine_pcm_trigger,
|
||||
.pointer = dmaengine_pcm_pointer,
|
||||
.pcm_construct = dmaengine_pcm_new,
|
||||
.sync_stop = dmaengine_pcm_sync_stop,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
|
||||
@@ -339,6 +346,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
|
||||
.pointer = dmaengine_pcm_pointer,
|
||||
.copy_user = dmaengine_copy_user,
|
||||
.pcm_construct = dmaengine_pcm_new,
|
||||
.sync_stop = dmaengine_pcm_sync_stop,
|
||||
};
|
||||
|
||||
static const char * const dmaengine_pcm_dma_channel_names[] = {
|
||||
|
||||
@@ -1101,15 +1101,28 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
|
||||
break;
|
||||
}
|
||||
|
||||
route->source = elem->source;
|
||||
route->sink = elem->sink;
|
||||
route->source = devm_kmemdup(tplg->dev, elem->source,
|
||||
min(strlen(elem->source),
|
||||
SNDRV_CTL_ELEM_ID_NAME_MAXLEN),
|
||||
GFP_KERNEL);
|
||||
route->sink = devm_kmemdup(tplg->dev, elem->sink,
|
||||
min(strlen(elem->sink), SNDRV_CTL_ELEM_ID_NAME_MAXLEN),
|
||||
GFP_KERNEL);
|
||||
if (!route->source || !route->sink) {
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
/* set to NULL atm for tplg users */
|
||||
route->connected = NULL;
|
||||
if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 0)
|
||||
route->control = NULL;
|
||||
else
|
||||
route->control = elem->control;
|
||||
if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) != 0) {
|
||||
route->control = devm_kmemdup(tplg->dev, elem->control,
|
||||
min(strlen(elem->control),
|
||||
SNDRV_CTL_ELEM_ID_NAME_MAXLEN),
|
||||
GFP_KERNEL);
|
||||
if (!route->control) {
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* add route dobj to dobj_list */
|
||||
route->dobj.type = SND_SOC_DOBJ_GRAPH;
|
||||
|
||||
@@ -328,7 +328,7 @@ sink_prepare:
|
||||
if (ret < 0) {
|
||||
/* unprepare the source widget */
|
||||
if (widget_ops[widget->id].ipc_unprepare &&
|
||||
swidget && swidget->prepared) {
|
||||
swidget && swidget->prepared && swidget->use_count == 0) {
|
||||
widget_ops[widget->id].ipc_unprepare(swidget);
|
||||
swidget->prepared = false;
|
||||
}
|
||||
|
||||
@@ -1472,10 +1472,11 @@ static int davinci_mcasp_hw_rule_min_periodsize(
|
||||
{
|
||||
struct snd_interval *period_size = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
|
||||
u8 numevt = *((u8 *)rule->private);
|
||||
struct snd_interval frames;
|
||||
|
||||
snd_interval_any(&frames);
|
||||
frames.min = 64;
|
||||
frames.min = numevt;
|
||||
frames.integer = 1;
|
||||
|
||||
return snd_interval_refine(period_size, &frames);
|
||||
@@ -1490,6 +1491,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
|
||||
u32 max_channels = 0;
|
||||
int i, dir, ret;
|
||||
int tdm_slots = mcasp->tdm_slots;
|
||||
u8 *numevt;
|
||||
|
||||
/* Do not allow more then one stream per direction */
|
||||
if (mcasp->substreams[substream->stream])
|
||||
@@ -1589,9 +1591,12 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
|
||||
return ret;
|
||||
}
|
||||
|
||||
numevt = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
&mcasp->txnumevt :
|
||||
&mcasp->rxnumevt;
|
||||
snd_pcm_hw_rule_add(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
davinci_mcasp_hw_rule_min_periodsize, NULL,
|
||||
davinci_mcasp_hw_rule_min_periodsize, numevt,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -354,11 +354,7 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev)
|
||||
if (!card)
|
||||
return -ENOMEM;
|
||||
|
||||
card->name = devm_kasprintf(dev, GFP_KERNEL,
|
||||
"HDMI %s", dev_name(ad->dssdev));
|
||||
if (!card->name)
|
||||
return -ENOMEM;
|
||||
|
||||
card->name = "HDMI";
|
||||
card->owner = THIS_MODULE;
|
||||
card->dai_link =
|
||||
devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL);
|
||||
|
||||
@@ -41,6 +41,16 @@ union core_pstate {
|
||||
unsigned res1:31;
|
||||
unsigned en:1;
|
||||
} pstatedef;
|
||||
/* since fam 1Ah: */
|
||||
struct {
|
||||
unsigned fid:12;
|
||||
unsigned res1:2;
|
||||
unsigned vid:8;
|
||||
unsigned iddval:8;
|
||||
unsigned idddiv:2;
|
||||
unsigned res2:31;
|
||||
unsigned en:1;
|
||||
} pstatedef2;
|
||||
unsigned long long val;
|
||||
};
|
||||
|
||||
@@ -48,6 +58,10 @@ static int get_did(union core_pstate pstate)
|
||||
{
|
||||
int t;
|
||||
|
||||
/* Fam 1Ah onward do not use did */
|
||||
if (cpupower_cpu_info.family >= 0x1A)
|
||||
return 0;
|
||||
|
||||
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF)
|
||||
t = pstate.pstatedef.did;
|
||||
else if (cpupower_cpu_info.family == 0x12)
|
||||
@@ -61,12 +75,18 @@ static int get_did(union core_pstate pstate)
|
||||
static int get_cof(union core_pstate pstate)
|
||||
{
|
||||
int t;
|
||||
int fid, did, cof;
|
||||
int fid, did, cof = 0;
|
||||
|
||||
did = get_did(pstate);
|
||||
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF) {
|
||||
fid = pstate.pstatedef.fid;
|
||||
cof = 200 * fid / did;
|
||||
if (cpupower_cpu_info.family >= 0x1A) {
|
||||
fid = pstate.pstatedef2.fid;
|
||||
if (fid > 0x0f)
|
||||
cof = (fid * 5);
|
||||
} else {
|
||||
fid = pstate.pstatedef.fid;
|
||||
cof = 200 * fid / did;
|
||||
}
|
||||
} else {
|
||||
t = 0x10;
|
||||
fid = pstate.pstate.fid;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user